aboutsummaryrefslogtreecommitdiff
path: root/drivers/ata/ata_piix.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/ata/ata_piix.c')
-rw-r--r--drivers/ata/ata_piix.c12
1 files changed, 11 insertions, 1 deletions
diff --git a/drivers/ata/ata_piix.c b/drivers/ata/ata_piix.c
index 6f6e7718b05..bfaa44ecfca 100644
--- a/drivers/ata/ata_piix.c
+++ b/drivers/ata/ata_piix.c
@@ -341,11 +341,12 @@ static struct ata_port_operations piix_sata_ops = {
};
static struct ata_port_operations piix_pata_ops = {
- .inherits = &piix_sata_ops,
+ .inherits = &ata_bmdma32_port_ops,
.cable_detect = ata_cable_40wire,
.set_piomode = piix_set_piomode,
.set_dmamode = piix_set_dmamode,
.prereset = piix_pata_prereset,
+ .sff_irq_check = piix_irq_check,
};
static struct ata_port_operations piix_vmw_ops = {
@@ -1587,6 +1588,15 @@ static int __devinit piix_init_one(struct pci_dev *pdev,
"on poweroff and hibernation\n");
}
+ /*
+ * Sandybridge chipset H61/P67/H67 have broken 32 mode up to now
+ * see https://bugzilla.kernel.org/show_bug.cgi?id=40592
+ */
+ if (pdev->vendor == PCI_VENDOR_ID_INTEL && pdev->device == 0x1c00)
+ piix_sata_ops.inherits = &ata_bmdma_port_ops;
+ else
+ piix_sata_ops.inherits = &ata_bmdma32_port_ops;
+
port_info[0] = piix_port_info[ent->driver_data];
port_info[1] = piix_port_info[ent->driver_data];