diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c index 01d8f8a..5725f5c 100644 --- a/drivers/pci/quirks.c +++ b/drivers/pci/quirks.c @@ -877,6 +877,44 @@ static void __devinit quirk_sb600_sata(struct pci_dev *pdev) DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_ATI, PCI_DEVICE_ID_ATI_IXP600_SATA, quirk_sb600_sata); DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_ATI, PCI_DEVICE_ID_ATI_IXP700_SATA, quirk_sb600_sata); +static void __devinit quirk_ahci_sata(struct pci_dev *pdev) +{ + int ret; + + ret = pcim_iomap_regions(pdev, 1 << 5, "AHCI quirk"); + + if (ret) { + printk (KERN_INFO "AHCI BAR not set - leaving\n"); + return; + } + + pcim_iounmap_regions(pdev, 1 << 5); + + /* Set PCI_CLASS_STORAGE_SATA */ + if ((pdev->class >> 8) == PCI_CLASS_STORAGE_IDE) { + pci_write_config_byte(pdev, PCI_CLASS_PROG, 0x01); + pci_write_config_byte(pdev, PCI_CLASS_DEVICE, 0x06); + } + pdev->class = PCI_CLASS_STORAGE_SATA_AHCI; + printk (KERN_INFO "Quirked PIIX device to AHCI mode\n"); +} + +DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x2651, quirk_ahci_sata); +DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x2652, quirk_ahci_sata); +DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x2653, quirk_ahci_sata); +DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x2680, quirk_ahci_sata); +DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x27c0, quirk_ahci_sata); +DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x27c4, quirk_ahci_sata); +DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x2820, quirk_ahci_sata); +DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x2825, quirk_ahci_sata); +DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x2828, quirk_ahci_sata); +DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x2920, quirk_ahci_sata); +DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x2921, quirk_ahci_sata); +DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x2926, quirk_ahci_sata); +DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x2928, quirk_ahci_sata); +DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x292d, quirk_ahci_sata); +DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x292e, quirk_ahci_sata); + /* * Serverworks CSB5 IDE does not fully support native mode */