|
@@ -2548,6 +2548,32 @@ static void ahci_p5wdh_workaround(struct ata_host *host)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+static bool ahci_broken_system_poweroff(struct pci_dev *pdev)
|
|
|
+{
|
|
|
+ static const struct dmi_system_id broken_systems[] = {
|
|
|
+ {
|
|
|
+ .ident = "HP Compaq nx6310",
|
|
|
+ .matches = {
|
|
|
+ DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"),
|
|
|
+ DMI_MATCH(DMI_PRODUCT_NAME, "HP Compaq nx6310"),
|
|
|
+ },
|
|
|
+ /* PCI slot number of the controller */
|
|
|
+ .driver_data = (void *)0x1FUL,
|
|
|
+ },
|
|
|
+
|
|
|
+ { } /* terminate list */
|
|
|
+ };
|
|
|
+ const struct dmi_system_id *dmi = dmi_first_match(broken_systems);
|
|
|
+
|
|
|
+ if (dmi) {
|
|
|
+ unsigned long slot = (unsigned long)dmi->driver_data;
|
|
|
+ /* apply the quirk only to on-board controllers */
|
|
|
+ return slot == PCI_SLOT(pdev->devfn);
|
|
|
+ }
|
|
|
+
|
|
|
+ return false;
|
|
|
+}
|
|
|
+
|
|
|
static int ahci_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
|
|
|
{
|
|
|
static int printed_version;
|
|
@@ -2647,6 +2673,12 @@ static int ahci_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ if (ahci_broken_system_poweroff(pdev)) {
|
|
|
+ pi.flags |= ATA_FLAG_NO_POWEROFF_SPINDOWN;
|
|
|
+ dev_info(&pdev->dev,
|
|
|
+ "quirky BIOS, skipping spindown on poweroff\n");
|
|
|
+ }
|
|
|
+
|
|
|
/* CAP.NP sometimes indicate the index of the last enabled
|
|
|
* port, at other times, that of the last possible port, so
|
|
|
* determining the maximum port number requires looking at
|