diff options
Diffstat (limited to 'drivers/ata/ahci.c')
-rw-r--r-- | drivers/ata/ahci.c | 32 |
1 files changed, 32 insertions, 0 deletions
diff --git a/drivers/ata/ahci.c b/drivers/ata/ahci.c index 96039671e3b9..77bba4c083cb 100644 --- a/drivers/ata/ahci.c +++ b/drivers/ata/ahci.c | |||
@@ -2548,6 +2548,32 @@ static void ahci_p5wdh_workaround(struct ata_host *host) | |||
2548 | } | 2548 | } |
2549 | } | 2549 | } |
2550 | 2550 | ||
2551 | static bool ahci_broken_system_poweroff(struct pci_dev *pdev) | ||
2552 | { | ||
2553 | static const struct dmi_system_id broken_systems[] = { | ||
2554 | { | ||
2555 | .ident = "HP Compaq nx6310", | ||
2556 | .matches = { | ||
2557 | DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"), | ||
2558 | DMI_MATCH(DMI_PRODUCT_NAME, "HP Compaq nx6310"), | ||
2559 | }, | ||
2560 | /* PCI slot number of the controller */ | ||
2561 | .driver_data = (void *)0x1FUL, | ||
2562 | }, | ||
2563 | |||
2564 | { } /* terminate list */ | ||
2565 | }; | ||
2566 | const struct dmi_system_id *dmi = dmi_first_match(broken_systems); | ||
2567 | |||
2568 | if (dmi) { | ||
2569 | unsigned long slot = (unsigned long)dmi->driver_data; | ||
2570 | /* apply the quirk only to on-board controllers */ | ||
2571 | return slot == PCI_SLOT(pdev->devfn); | ||
2572 | } | ||
2573 | |||
2574 | return false; | ||
2575 | } | ||
2576 | |||
2551 | static int ahci_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) | 2577 | static int ahci_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) |
2552 | { | 2578 | { |
2553 | static int printed_version; | 2579 | static int printed_version; |
@@ -2647,6 +2673,12 @@ static int ahci_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) | |||
2647 | } | 2673 | } |
2648 | } | 2674 | } |
2649 | 2675 | ||
2676 | if (ahci_broken_system_poweroff(pdev)) { | ||
2677 | pi.flags |= ATA_FLAG_NO_POWEROFF_SPINDOWN; | ||
2678 | dev_info(&pdev->dev, | ||
2679 | "quirky BIOS, skipping spindown on poweroff\n"); | ||
2680 | } | ||
2681 | |||
2650 | /* CAP.NP sometimes indicate the index of the last enabled | 2682 | /* CAP.NP sometimes indicate the index of the last enabled |
2651 | * port, at other times, that of the last possible port, so | 2683 | * port, at other times, that of the last possible port, so |
2652 | * determining the maximum port number requires looking at | 2684 | * determining the maximum port number requires looking at |