diff options
Diffstat (limited to 'drivers/ata/ata_piix.c')
-rw-r--r-- | drivers/ata/ata_piix.c | 37 |
1 files changed, 32 insertions, 5 deletions
diff --git a/drivers/ata/ata_piix.c b/drivers/ata/ata_piix.c index 43107e9415da..cc431d6bc97f 100644 --- a/drivers/ata/ata_piix.c +++ b/drivers/ata/ata_piix.c | |||
@@ -113,6 +113,8 @@ enum { | |||
113 | PIIX_PATA_FLAGS = ATA_FLAG_SLAVE_POSS, | 113 | PIIX_PATA_FLAGS = ATA_FLAG_SLAVE_POSS, |
114 | PIIX_SATA_FLAGS = ATA_FLAG_SATA | PIIX_FLAG_CHECKINTR, | 114 | PIIX_SATA_FLAGS = ATA_FLAG_SATA | PIIX_FLAG_CHECKINTR, |
115 | 115 | ||
116 | PIIX_FLAG_PIO16 = (1 << 30), /*support 16bit PIO only*/ | ||
117 | |||
116 | PIIX_80C_PRI = (1 << 5) | (1 << 4), | 118 | PIIX_80C_PRI = (1 << 5) | (1 << 4), |
117 | PIIX_80C_SEC = (1 << 7) | (1 << 6), | 119 | PIIX_80C_SEC = (1 << 7) | (1 << 6), |
118 | 120 | ||
@@ -147,6 +149,7 @@ enum piix_controller_ids { | |||
147 | ich8m_apple_sata, /* locks up on second port enable */ | 149 | ich8m_apple_sata, /* locks up on second port enable */ |
148 | tolapai_sata, | 150 | tolapai_sata, |
149 | piix_pata_vmw, /* PIIX4 for VMware, spurious DMA_ERR */ | 151 | piix_pata_vmw, /* PIIX4 for VMware, spurious DMA_ERR */ |
152 | ich8_sata_snb, | ||
150 | }; | 153 | }; |
151 | 154 | ||
152 | struct piix_map_db { | 155 | struct piix_map_db { |
@@ -177,6 +180,7 @@ static int piix_sidpr_scr_write(struct ata_link *link, | |||
177 | static int piix_sidpr_set_lpm(struct ata_link *link, enum ata_lpm_policy policy, | 180 | static int piix_sidpr_set_lpm(struct ata_link *link, enum ata_lpm_policy policy, |
178 | unsigned hints); | 181 | unsigned hints); |
179 | static bool piix_irq_check(struct ata_port *ap); | 182 | static bool piix_irq_check(struct ata_port *ap); |
183 | static int piix_port_start(struct ata_port *ap); | ||
180 | #ifdef CONFIG_PM | 184 | #ifdef CONFIG_PM |
181 | static int piix_pci_device_suspend(struct pci_dev *pdev, pm_message_t mesg); | 185 | static int piix_pci_device_suspend(struct pci_dev *pdev, pm_message_t mesg); |
182 | static int piix_pci_device_resume(struct pci_dev *pdev); | 186 | static int piix_pci_device_resume(struct pci_dev *pdev); |
@@ -298,21 +302,21 @@ static const struct pci_device_id piix_pci_tbl[] = { | |||
298 | /* SATA Controller IDE (PCH) */ | 302 | /* SATA Controller IDE (PCH) */ |
299 | { 0x8086, 0x3b2e, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_sata }, | 303 | { 0x8086, 0x3b2e, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_sata }, |
300 | /* SATA Controller IDE (CPT) */ | 304 | /* SATA Controller IDE (CPT) */ |
301 | { 0x8086, 0x1c00, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_sata }, | 305 | { 0x8086, 0x1c00, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_sata_snb }, |
302 | /* SATA Controller IDE (CPT) */ | 306 | /* SATA Controller IDE (CPT) */ |
303 | { 0x8086, 0x1c01, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_sata }, | 307 | { 0x8086, 0x1c01, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_sata_snb }, |
304 | /* SATA Controller IDE (CPT) */ | 308 | /* SATA Controller IDE (CPT) */ |
305 | { 0x8086, 0x1c08, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_2port_sata }, | 309 | { 0x8086, 0x1c08, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_2port_sata }, |
306 | /* SATA Controller IDE (CPT) */ | 310 | /* SATA Controller IDE (CPT) */ |
307 | { 0x8086, 0x1c09, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_2port_sata }, | 311 | { 0x8086, 0x1c09, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_2port_sata }, |
308 | /* SATA Controller IDE (PBG) */ | 312 | /* SATA Controller IDE (PBG) */ |
309 | { 0x8086, 0x1d00, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_sata }, | 313 | { 0x8086, 0x1d00, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_sata_snb }, |
310 | /* SATA Controller IDE (PBG) */ | 314 | /* SATA Controller IDE (PBG) */ |
311 | { 0x8086, 0x1d08, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_2port_sata }, | 315 | { 0x8086, 0x1d08, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_2port_sata }, |
312 | /* SATA Controller IDE (Panther Point) */ | 316 | /* SATA Controller IDE (Panther Point) */ |
313 | { 0x8086, 0x1e00, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_sata }, | 317 | { 0x8086, 0x1e00, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_sata_snb }, |
314 | /* SATA Controller IDE (Panther Point) */ | 318 | /* SATA Controller IDE (Panther Point) */ |
315 | { 0x8086, 0x1e01, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_sata }, | 319 | { 0x8086, 0x1e01, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_sata_snb }, |
316 | /* SATA Controller IDE (Panther Point) */ | 320 | /* SATA Controller IDE (Panther Point) */ |
317 | { 0x8086, 0x1e08, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_2port_sata }, | 321 | { 0x8086, 0x1e08, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_2port_sata }, |
318 | /* SATA Controller IDE (Panther Point) */ | 322 | /* SATA Controller IDE (Panther Point) */ |
@@ -338,6 +342,7 @@ static struct scsi_host_template piix_sht = { | |||
338 | static struct ata_port_operations piix_sata_ops = { | 342 | static struct ata_port_operations piix_sata_ops = { |
339 | .inherits = &ata_bmdma32_port_ops, | 343 | .inherits = &ata_bmdma32_port_ops, |
340 | .sff_irq_check = piix_irq_check, | 344 | .sff_irq_check = piix_irq_check, |
345 | .port_start = piix_port_start, | ||
341 | }; | 346 | }; |
342 | 347 | ||
343 | static struct ata_port_operations piix_pata_ops = { | 348 | static struct ata_port_operations piix_pata_ops = { |
@@ -478,6 +483,7 @@ static const struct piix_map_db *piix_map_db_table[] = { | |||
478 | [ich8_2port_sata] = &ich8_2port_map_db, | 483 | [ich8_2port_sata] = &ich8_2port_map_db, |
479 | [ich8m_apple_sata] = &ich8m_apple_map_db, | 484 | [ich8m_apple_sata] = &ich8m_apple_map_db, |
480 | [tolapai_sata] = &tolapai_map_db, | 485 | [tolapai_sata] = &tolapai_map_db, |
486 | [ich8_sata_snb] = &ich8_map_db, | ||
481 | }; | 487 | }; |
482 | 488 | ||
483 | static struct ata_port_info piix_port_info[] = { | 489 | static struct ata_port_info piix_port_info[] = { |
@@ -606,6 +612,19 @@ static struct ata_port_info piix_port_info[] = { | |||
606 | .port_ops = &piix_vmw_ops, | 612 | .port_ops = &piix_vmw_ops, |
607 | }, | 613 | }, |
608 | 614 | ||
615 | /* | ||
616 | * some Sandybridge chipsets have broken 32 mode up to now, | ||
617 | * see https://bugzilla.kernel.org/show_bug.cgi?id=40592 | ||
618 | */ | ||
619 | [ich8_sata_snb] = | ||
620 | { | ||
621 | .flags = PIIX_SATA_FLAGS | PIIX_FLAG_SIDPR | PIIX_FLAG_PIO16, | ||
622 | .pio_mask = ATA_PIO4, | ||
623 | .mwdma_mask = ATA_MWDMA2, | ||
624 | .udma_mask = ATA_UDMA6, | ||
625 | .port_ops = &piix_sata_ops, | ||
626 | }, | ||
627 | |||
609 | }; | 628 | }; |
610 | 629 | ||
611 | static struct pci_bits piix_enable_bits[] = { | 630 | static struct pci_bits piix_enable_bits[] = { |
@@ -649,6 +668,14 @@ static const struct ich_laptop ich_laptop[] = { | |||
649 | { 0, } | 668 | { 0, } |
650 | }; | 669 | }; |
651 | 670 | ||
671 | static int piix_port_start(struct ata_port *ap) | ||
672 | { | ||
673 | if (!(ap->flags & PIIX_FLAG_PIO16)) | ||
674 | ap->pflags |= ATA_PFLAG_PIO32 | ATA_PFLAG_PIO32CHANGE; | ||
675 | |||
676 | return ata_bmdma_port_start(ap); | ||
677 | } | ||
678 | |||
652 | /** | 679 | /** |
653 | * ich_pata_cable_detect - Probe host controller cable detect info | 680 | * ich_pata_cable_detect - Probe host controller cable detect info |
654 | * @ap: Port for which cable detect info is desired | 681 | * @ap: Port for which cable detect info is desired |