Commit 9deb3431 authored by Tejun Heo's avatar Tejun Heo Committed by Jeff Garzik

ahci: use BIOS date in broken_suspend list

HP is recycling both DMI_PRODUCT_NAME and DMI_BIOS_VERSION making
ahci_broken_suspend() trigger for later products which are not
affected by the original problems.  Match BIOS date instead of version
and add references to bko's so that full information can be found
easier later.

This fixes http://bugzilla.kernel.org/show_bug.cgi?id=15462Signed-off-by: default avatarTejun Heo <tj@kernel.org>
Reported-by: tigerfishdaisy@gmail.com
Signed-off-by: default avatarJeff Garzik <jgarzik@redhat.com>
parent 603037c3
...@@ -3037,6 +3037,14 @@ static bool ahci_broken_suspend(struct pci_dev *pdev) ...@@ -3037,6 +3037,14 @@ static bool ahci_broken_suspend(struct pci_dev *pdev)
* On HP dv[4-6] and HDX18 with earlier BIOSen, link * On HP dv[4-6] and HDX18 with earlier BIOSen, link
* to the harddisk doesn't become online after * to the harddisk doesn't become online after
* resuming from STR. Warn and fail suspend. * resuming from STR. Warn and fail suspend.
*
* http://bugzilla.kernel.org/show_bug.cgi?id=12276
*
* Use dates instead of versions to match as HP is
* apparently recycling both product and version
* strings.
*
* http://bugzilla.kernel.org/show_bug.cgi?id=15462
*/ */
{ {
.ident = "dv4", .ident = "dv4",
...@@ -3045,7 +3053,7 @@ static bool ahci_broken_suspend(struct pci_dev *pdev) ...@@ -3045,7 +3053,7 @@ static bool ahci_broken_suspend(struct pci_dev *pdev)
DMI_MATCH(DMI_PRODUCT_NAME, DMI_MATCH(DMI_PRODUCT_NAME,
"HP Pavilion dv4 Notebook PC"), "HP Pavilion dv4 Notebook PC"),
}, },
.driver_data = "F.30", /* cutoff BIOS version */ .driver_data = "20090105", /* F.30 */
}, },
{ {
.ident = "dv5", .ident = "dv5",
...@@ -3054,7 +3062,7 @@ static bool ahci_broken_suspend(struct pci_dev *pdev) ...@@ -3054,7 +3062,7 @@ static bool ahci_broken_suspend(struct pci_dev *pdev)
DMI_MATCH(DMI_PRODUCT_NAME, DMI_MATCH(DMI_PRODUCT_NAME,
"HP Pavilion dv5 Notebook PC"), "HP Pavilion dv5 Notebook PC"),
}, },
.driver_data = "F.16", /* cutoff BIOS version */ .driver_data = "20090506", /* F.16 */
}, },
{ {
.ident = "dv6", .ident = "dv6",
...@@ -3063,7 +3071,7 @@ static bool ahci_broken_suspend(struct pci_dev *pdev) ...@@ -3063,7 +3071,7 @@ static bool ahci_broken_suspend(struct pci_dev *pdev)
DMI_MATCH(DMI_PRODUCT_NAME, DMI_MATCH(DMI_PRODUCT_NAME,
"HP Pavilion dv6 Notebook PC"), "HP Pavilion dv6 Notebook PC"),
}, },
.driver_data = "F.21", /* cutoff BIOS version */ .driver_data = "20090423", /* F.21 */
}, },
{ {
.ident = "HDX18", .ident = "HDX18",
...@@ -3072,7 +3080,7 @@ static bool ahci_broken_suspend(struct pci_dev *pdev) ...@@ -3072,7 +3080,7 @@ static bool ahci_broken_suspend(struct pci_dev *pdev)
DMI_MATCH(DMI_PRODUCT_NAME, DMI_MATCH(DMI_PRODUCT_NAME,
"HP HDX18 Notebook PC"), "HP HDX18 Notebook PC"),
}, },
.driver_data = "F.23", /* cutoff BIOS version */ .driver_data = "20090430", /* F.23 */
}, },
/* /*
* Acer eMachines G725 has the same problem. BIOS * Acer eMachines G725 has the same problem. BIOS
...@@ -3080,6 +3088,8 @@ static bool ahci_broken_suspend(struct pci_dev *pdev) ...@@ -3080,6 +3088,8 @@ static bool ahci_broken_suspend(struct pci_dev *pdev)
* work. Inbetween, there are V1.06, V2.06 and V3.03 * work. Inbetween, there are V1.06, V2.06 and V3.03
* that we don't have much idea about. For now, * that we don't have much idea about. For now,
* blacklist anything older than V3.04. * blacklist anything older than V3.04.
*
* http://bugzilla.kernel.org/show_bug.cgi?id=15104
*/ */
{ {
.ident = "G725", .ident = "G725",
...@@ -3087,19 +3097,21 @@ static bool ahci_broken_suspend(struct pci_dev *pdev) ...@@ -3087,19 +3097,21 @@ static bool ahci_broken_suspend(struct pci_dev *pdev)
DMI_MATCH(DMI_SYS_VENDOR, "eMachines"), DMI_MATCH(DMI_SYS_VENDOR, "eMachines"),
DMI_MATCH(DMI_PRODUCT_NAME, "eMachines G725"), DMI_MATCH(DMI_PRODUCT_NAME, "eMachines G725"),
}, },
.driver_data = "V3.04", /* cutoff BIOS version */ .driver_data = "20091216", /* V3.04 */
}, },
{ } /* terminate list */ { } /* terminate list */
}; };
const struct dmi_system_id *dmi = dmi_first_match(sysids); const struct dmi_system_id *dmi = dmi_first_match(sysids);
const char *ver; int year, month, date;
char buf[9];
if (!dmi || pdev->bus->number || pdev->devfn != PCI_DEVFN(0x1f, 2)) if (!dmi || pdev->bus->number || pdev->devfn != PCI_DEVFN(0x1f, 2))
return false; return false;
ver = dmi_get_system_info(DMI_BIOS_VERSION); dmi_get_date(DMI_BIOS_DATE, &year, &month, &date);
snprintf(buf, sizeof(buf), "%04d%02d%02d", year, month, date);
return !ver || strcmp(ver, dmi->driver_data) < 0; return strcmp(buf, dmi->driver_data) < 0;
} }
static bool ahci_broken_online(struct pci_dev *pdev) static bool ahci_broken_online(struct pci_dev *pdev)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment