diff options
| -rw-r--r-- | drivers/ata/ahci.c | 28 |
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 | ||
| 3105 | static bool ahci_broken_online(struct pci_dev *pdev) | 3117 | static bool ahci_broken_online(struct pci_dev *pdev) |
