aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/ata/ahci.c28
1 files changed, 20 insertions, 8 deletions
diff --git a/drivers/ata/ahci.c b/drivers/ata/ahci.c
index 9e5b121fb0cb..e7e2c7a147f1 100644
--- a/drivers/ata/ahci.c
+++ b/drivers/ata/ahci.c
@@ -3037,6 +3037,14 @@ static bool ahci_broken_suspend(struct pci_dev *pdev)
3037 * On HP dv[4-6] and HDX18 with earlier BIOSen, link 3037 * On HP dv[4-6] and HDX18 with earlier BIOSen, link
3038 * to the harddisk doesn't become online after 3038 * to the harddisk doesn't become online after
3039 * resuming from STR. Warn and fail suspend. 3039 * resuming from STR. Warn and fail suspend.
3040 *
3041 * http://bugzilla.kernel.org/show_bug.cgi?id=12276
3042 *
3043 * Use dates instead of versions to match as HP is
3044 * apparently recycling both product and version
3045 * strings.
3046 *
3047 * http://bugzilla.kernel.org/show_bug.cgi?id=15462
3040 */ 3048 */
3041 { 3049 {
3042 .ident = "dv4", 3050 .ident = "dv4",
@@ -3045,7 +3053,7 @@ static bool ahci_broken_suspend(struct pci_dev *pdev)
3045 DMI_MATCH(DMI_PRODUCT_NAME, 3053 DMI_MATCH(DMI_PRODUCT_NAME,
3046 "HP Pavilion dv4 Notebook PC"), 3054 "HP Pavilion dv4 Notebook PC"),
3047 }, 3055 },
3048 .driver_data = "F.30", /* cutoff BIOS version */ 3056 .driver_data = "20090105", /* F.30 */
3049 }, 3057 },
3050 { 3058 {
3051 .ident = "dv5", 3059 .ident = "dv5",
@@ -3054,7 +3062,7 @@ static bool ahci_broken_suspend(struct pci_dev *pdev)
3054 DMI_MATCH(DMI_PRODUCT_NAME, 3062 DMI_MATCH(DMI_PRODUCT_NAME,
3055 "HP Pavilion dv5 Notebook PC"), 3063 "HP Pavilion dv5 Notebook PC"),
3056 }, 3064 },
3057 .driver_data = "F.16", /* cutoff BIOS version */ 3065 .driver_data = "20090506", /* F.16 */
3058 }, 3066 },
3059 { 3067 {
3060 .ident = "dv6", 3068 .ident = "dv6",
@@ -3063,7 +3071,7 @@ static bool ahci_broken_suspend(struct pci_dev *pdev)
3063 DMI_MATCH(DMI_PRODUCT_NAME, 3071 DMI_MATCH(DMI_PRODUCT_NAME,
3064 "HP Pavilion dv6 Notebook PC"), 3072 "HP Pavilion dv6 Notebook PC"),
3065 }, 3073 },
3066 .driver_data = "F.21", /* cutoff BIOS version */ 3074 .driver_data = "20090423", /* F.21 */
3067 }, 3075 },
3068 { 3076 {
3069 .ident = "HDX18", 3077 .ident = "HDX18",
@@ -3072,7 +3080,7 @@ static bool ahci_broken_suspend(struct pci_dev *pdev)
3072 DMI_MATCH(DMI_PRODUCT_NAME, 3080 DMI_MATCH(DMI_PRODUCT_NAME,
3073 "HP HDX18 Notebook PC"), 3081 "HP HDX18 Notebook PC"),
3074 }, 3082 },
3075 .driver_data = "F.23", /* cutoff BIOS version */ 3083 .driver_data = "20090430", /* F.23 */
3076 }, 3084 },
3077 /* 3085 /*
3078 * Acer eMachines G725 has the same problem. BIOS 3086 * Acer eMachines G725 has the same problem. BIOS
@@ -3080,6 +3088,8 @@ static bool ahci_broken_suspend(struct pci_dev *pdev)
3080 * work. Inbetween, there are V1.06, V2.06 and V3.03 3088 * work. Inbetween, there are V1.06, V2.06 and V3.03
3081 * that we don't have much idea about. For now, 3089 * that we don't have much idea about. For now,
3082 * blacklist anything older than V3.04. 3090 * blacklist anything older than V3.04.
3091 *
3092 * http://bugzilla.kernel.org/show_bug.cgi?id=15104
3083 */ 3093 */
3084 { 3094 {
3085 .ident = "G725", 3095 .ident = "G725",
@@ -3087,19 +3097,21 @@ static bool ahci_broken_suspend(struct pci_dev *pdev)
3087 DMI_MATCH(DMI_SYS_VENDOR, "eMachines"), 3097 DMI_MATCH(DMI_SYS_VENDOR, "eMachines"),
3088 DMI_MATCH(DMI_PRODUCT_NAME, "eMachines G725"), 3098 DMI_MATCH(DMI_PRODUCT_NAME, "eMachines G725"),
3089 }, 3099 },
3090 .driver_data = "V3.04", /* cutoff BIOS version */ 3100 .driver_data = "20091216", /* V3.04 */
3091 }, 3101 },
3092 { } /* terminate list */ 3102 { } /* terminate list */
3093 }; 3103 };
3094 const struct dmi_system_id *dmi = dmi_first_match(sysids); 3104 const struct dmi_system_id *dmi = dmi_first_match(sysids);
3095 const char *ver; 3105 int year, month, date;
3106 char buf[9];
3096 3107
3097 if (!dmi || pdev->bus->number || pdev->devfn != PCI_DEVFN(0x1f, 2)) 3108 if (!dmi || pdev->bus->number || pdev->devfn != PCI_DEVFN(0x1f, 2))
3098 return false; 3109 return false;
3099 3110
3100 ver = dmi_get_system_info(DMI_BIOS_VERSION); 3111 dmi_get_date(DMI_BIOS_DATE, &year, &month, &date);
3112 snprintf(buf, sizeof(buf), "%04d%02d%02d", year, month, date);
3101 3113
3102 return !ver || strcmp(ver, dmi->driver_data) < 0; 3114 return strcmp(buf, dmi->driver_data) < 0;
3103} 3115}
3104 3116
3105static bool ahci_broken_online(struct pci_dev *pdev) 3117static bool ahci_broken_online(struct pci_dev *pdev)