|
@@ -1387,6 +1387,32 @@ static void piix_iocfg_bit18_quirk(struct ata_host *host)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+static bool piix_broken_system_poweroff(struct pci_dev *pdev)
|
|
|
|
+{
|
|
|
|
+ static const struct dmi_system_id broken_systems[] = {
|
|
|
|
+ {
|
|
|
|
+ .ident = "HP Compaq 2510p",
|
|
|
|
+ .matches = {
|
|
|
|
+ DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"),
|
|
|
|
+ DMI_MATCH(DMI_PRODUCT_NAME, "HP Compaq 2510p"),
|
|
|
|
+ },
|
|
|
|
+ /* 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;
|
|
|
|
+}
|
|
|
|
+
|
|
/**
|
|
/**
|
|
* piix_init_one - Register PIIX ATA PCI device with kernel services
|
|
* piix_init_one - Register PIIX ATA PCI device with kernel services
|
|
* @pdev: PCI device to register
|
|
* @pdev: PCI device to register
|
|
@@ -1422,6 +1448,14 @@ static int __devinit piix_init_one(struct pci_dev *pdev,
|
|
if (!in_module_init)
|
|
if (!in_module_init)
|
|
return -ENODEV;
|
|
return -ENODEV;
|
|
|
|
|
|
|
|
+ if (piix_broken_system_poweroff(pdev)) {
|
|
|
|
+ piix_port_info[ent->driver_data].flags |=
|
|
|
|
+ ATA_FLAG_NO_POWEROFF_SPINDOWN |
|
|
|
|
+ ATA_FLAG_NO_HIBERNATE_SPINDOWN;
|
|
|
|
+ dev_info(&pdev->dev, "quirky BIOS, skipping spindown "
|
|
|
|
+ "on poweroff and hibernation\n");
|
|
|
|
+ }
|
|
|
|
+
|
|
port_info[0] = piix_port_info[ent->driver_data];
|
|
port_info[0] = piix_port_info[ent->driver_data];
|
|
port_info[1] = piix_port_info[ent->driver_data];
|
|
port_info[1] = piix_port_info[ent->driver_data];
|
|
|
|
|