diff options
Diffstat (limited to 'drivers')
-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 a6a736a7dbf2..9e2feb6ce241 100644 --- a/drivers/ata/ahci.c +++ b/drivers/ata/ahci.c | |||
@@ -2831,6 +2831,14 @@ static bool ahci_broken_suspend(struct pci_dev *pdev) | |||
2831 | * On HP dv[4-6] and HDX18 with earlier BIOSen, link | 2831 | * On HP dv[4-6] and HDX18 with earlier BIOSen, link |
2832 | * to the harddisk doesn't become online after | 2832 | * to the harddisk doesn't become online after |
2833 | * resuming from STR. Warn and fail suspend. | 2833 | * resuming from STR. Warn and fail suspend. |
2834 | * | ||
2835 | * http://bugzilla.kernel.org/show_bug.cgi?id=12276 | ||
2836 | * | ||
2837 | * Use dates instead of versions to match as HP is | ||
2838 | * apparently recycling both product and version | ||
2839 | * strings. | ||
2840 | * | ||
2841 | * http://bugzilla.kernel.org/show_bug.cgi?id=15462 | ||
2834 | */ | 2842 | */ |
2835 | { | 2843 | { |
2836 | .ident = "dv4", | 2844 | .ident = "dv4", |
@@ -2839,7 +2847,7 @@ static bool ahci_broken_suspend(struct pci_dev *pdev) | |||
2839 | DMI_MATCH(DMI_PRODUCT_NAME, | 2847 | DMI_MATCH(DMI_PRODUCT_NAME, |
2840 | "HP Pavilion dv4 Notebook PC"), | 2848 | "HP Pavilion dv4 Notebook PC"), |
2841 | }, | 2849 | }, |
2842 | .driver_data = "F.30", /* cutoff BIOS version */ | 2850 | .driver_data = "20090105", /* F.30 */ |
2843 | }, | 2851 | }, |
2844 | { | 2852 | { |
2845 | .ident = "dv5", | 2853 | .ident = "dv5", |
@@ -2848,7 +2856,7 @@ static bool ahci_broken_suspend(struct pci_dev *pdev) | |||
2848 | DMI_MATCH(DMI_PRODUCT_NAME, | 2856 | DMI_MATCH(DMI_PRODUCT_NAME, |
2849 | "HP Pavilion dv5 Notebook PC"), | 2857 | "HP Pavilion dv5 Notebook PC"), |
2850 | }, | 2858 | }, |
2851 | .driver_data = "F.16", /* cutoff BIOS version */ | 2859 | .driver_data = "20090506", /* F.16 */ |
2852 | }, | 2860 | }, |
2853 | { | 2861 | { |
2854 | .ident = "dv6", | 2862 | .ident = "dv6", |
@@ -2857,7 +2865,7 @@ static bool ahci_broken_suspend(struct pci_dev *pdev) | |||
2857 | DMI_MATCH(DMI_PRODUCT_NAME, | 2865 | DMI_MATCH(DMI_PRODUCT_NAME, |
2858 | "HP Pavilion dv6 Notebook PC"), | 2866 | "HP Pavilion dv6 Notebook PC"), |
2859 | }, | 2867 | }, |
2860 | .driver_data = "F.21", /* cutoff BIOS version */ | 2868 | .driver_data = "20090423", /* F.21 */ |
2861 | }, | 2869 | }, |
2862 | { | 2870 | { |
2863 | .ident = "HDX18", | 2871 | .ident = "HDX18", |
@@ -2866,7 +2874,7 @@ static bool ahci_broken_suspend(struct pci_dev *pdev) | |||
2866 | DMI_MATCH(DMI_PRODUCT_NAME, | 2874 | DMI_MATCH(DMI_PRODUCT_NAME, |
2867 | "HP HDX18 Notebook PC"), | 2875 | "HP HDX18 Notebook PC"), |
2868 | }, | 2876 | }, |
2869 | .driver_data = "F.23", /* cutoff BIOS version */ | 2877 | .driver_data = "20090430", /* F.23 */ |
2870 | }, | 2878 | }, |
2871 | /* | 2879 | /* |
2872 | * Acer eMachines G725 has the same problem. BIOS | 2880 | * Acer eMachines G725 has the same problem. BIOS |
@@ -2874,6 +2882,8 @@ static bool ahci_broken_suspend(struct pci_dev *pdev) | |||
2874 | * work. Inbetween, there are V1.06, V2.06 and V3.03 | 2882 | * work. Inbetween, there are V1.06, V2.06 and V3.03 |
2875 | * that we don't have much idea about. For now, | 2883 | * that we don't have much idea about. For now, |
2876 | * blacklist anything older than V3.04. | 2884 | * blacklist anything older than V3.04. |
2885 | * | ||
2886 | * http://bugzilla.kernel.org/show_bug.cgi?id=15104 | ||
2877 | */ | 2887 | */ |
2878 | { | 2888 | { |
2879 | .ident = "G725", | 2889 | .ident = "G725", |
@@ -2881,19 +2891,21 @@ static bool ahci_broken_suspend(struct pci_dev *pdev) | |||
2881 | DMI_MATCH(DMI_SYS_VENDOR, "eMachines"), | 2891 | DMI_MATCH(DMI_SYS_VENDOR, "eMachines"), |
2882 | DMI_MATCH(DMI_PRODUCT_NAME, "eMachines G725"), | 2892 | DMI_MATCH(DMI_PRODUCT_NAME, "eMachines G725"), |
2883 | }, | 2893 | }, |
2884 | .driver_data = "V3.04", /* cutoff BIOS version */ | 2894 | .driver_data = "20091216", /* V3.04 */ |
2885 | }, | 2895 | }, |
2886 | { } /* terminate list */ | 2896 | { } /* terminate list */ |
2887 | }; | 2897 | }; |
2888 | const struct dmi_system_id *dmi = dmi_first_match(sysids); | 2898 | const struct dmi_system_id *dmi = dmi_first_match(sysids); |
2889 | const char *ver; | 2899 | int year, month, date; |
2900 | char buf[9]; | ||
2890 | 2901 | ||
2891 | if (!dmi || pdev->bus->number || pdev->devfn != PCI_DEVFN(0x1f, 2)) | 2902 | if (!dmi || pdev->bus->number || pdev->devfn != PCI_DEVFN(0x1f, 2)) |
2892 | return false; | 2903 | return false; |
2893 | 2904 | ||
2894 | ver = dmi_get_system_info(DMI_BIOS_VERSION); | 2905 | dmi_get_date(DMI_BIOS_DATE, &year, &month, &date); |
2906 | snprintf(buf, sizeof(buf), "%04d%02d%02d", year, month, date); | ||
2895 | 2907 | ||
2896 | return !ver || strcmp(ver, dmi->driver_data) < 0; | 2908 | return strcmp(buf, dmi->driver_data) < 0; |
2897 | } | 2909 | } |
2898 | 2910 | ||
2899 | static bool ahci_broken_online(struct pci_dev *pdev) | 2911 | static bool ahci_broken_online(struct pci_dev *pdev) |