diff options
| author | Tejun Heo <htejun@gmail.com> | 2008-01-07 05:38:53 -0500 |
|---|---|---|
| committer | Jeff Garzik <jeff@garzik.org> | 2008-01-14 21:11:01 -0500 |
| commit | 25f98131a292f4c81e4619bdf48f00a991386f73 (patch) | |
| tree | 1d44c22d18fcfd33fdd73c48647af118063a5649 | |
| parent | 031f2dcd7075e218e74dd7f942ad015cf82dffab (diff) | |
ata_piix: ignore ATA_DMA_ERR on vmware ich4
VMware ich4 emulation incorrectly sets DMA_ERR on TF error. Ignore
it.
Signed-off-by: Tejun Heo <htejun@gmail.com>
Signed-off-by: Jeff Garzik <jeff@garzik.org>
| -rw-r--r-- | drivers/ata/ata_piix.c | 51 |
1 files changed, 51 insertions, 0 deletions
diff --git a/drivers/ata/ata_piix.c b/drivers/ata/ata_piix.c index bb62a588f489..b406b39b878e 100644 --- a/drivers/ata/ata_piix.c +++ b/drivers/ata/ata_piix.c | |||
| @@ -132,6 +132,7 @@ enum { | |||
| 132 | ich8_2port_sata, | 132 | ich8_2port_sata, |
| 133 | ich8m_apple_sata_ahci, /* locks up on second port enable */ | 133 | ich8m_apple_sata_ahci, /* locks up on second port enable */ |
| 134 | tolapai_sata_ahci, | 134 | tolapai_sata_ahci, |
| 135 | piix_pata_vmw, /* PIIX4 for VMware, spurious DMA_ERR */ | ||
| 135 | 136 | ||
| 136 | /* constants for mapping table */ | 137 | /* constants for mapping table */ |
| 137 | P0 = 0, /* port 0 */ | 138 | P0 = 0, /* port 0 */ |
| @@ -165,6 +166,7 @@ static void piix_set_piomode(struct ata_port *ap, struct ata_device *adev); | |||
| 165 | static void piix_set_dmamode(struct ata_port *ap, struct ata_device *adev); | 166 | static void piix_set_dmamode(struct ata_port *ap, struct ata_device *adev); |
| 166 | static void ich_set_dmamode(struct ata_port *ap, struct ata_device *adev); | 167 | static void ich_set_dmamode(struct ata_port *ap, struct ata_device *adev); |
| 167 | static int ich_pata_cable_detect(struct ata_port *ap); | 168 | static int ich_pata_cable_detect(struct ata_port *ap); |
| 169 | static u8 piix_vmw_bmdma_status(struct ata_port *ap); | ||
| 168 | #ifdef CONFIG_PM | 170 | #ifdef CONFIG_PM |
| 169 | static int piix_pci_device_suspend(struct pci_dev *pdev, pm_message_t mesg); | 171 | static int piix_pci_device_suspend(struct pci_dev *pdev, pm_message_t mesg); |
| 170 | static int piix_pci_device_resume(struct pci_dev *pdev); | 172 | static int piix_pci_device_resume(struct pci_dev *pdev); |
| @@ -175,6 +177,8 @@ static unsigned int in_module_init = 1; | |||
| 175 | static const struct pci_device_id piix_pci_tbl[] = { | 177 | static const struct pci_device_id piix_pci_tbl[] = { |
| 176 | /* Intel PIIX3 for the 430HX etc */ | 178 | /* Intel PIIX3 for the 430HX etc */ |
| 177 | { 0x8086, 0x7010, PCI_ANY_ID, PCI_ANY_ID, 0, 0, piix_pata_mwdma }, | 179 | { 0x8086, 0x7010, PCI_ANY_ID, PCI_ANY_ID, 0, 0, piix_pata_mwdma }, |
| 180 | /* VMware ICH4 */ | ||
| 181 | { 0x8086, 0x7111, 0x15ad, 0x1976, 0, 0, piix_pata_vmw }, | ||
| 178 | /* Intel PIIX4 for the 430TX/440BX/MX chipset: UDMA 33 */ | 182 | /* Intel PIIX4 for the 430TX/440BX/MX chipset: UDMA 33 */ |
| 179 | /* Also PIIX4E (fn3 rev 2) and PIIX4M (fn3 rev 3) */ | 183 | /* Also PIIX4E (fn3 rev 2) and PIIX4M (fn3 rev 3) */ |
| 180 | { 0x8086, 0x7111, PCI_ANY_ID, PCI_ANY_ID, 0, 0, piix_pata_33 }, | 184 | { 0x8086, 0x7111, PCI_ANY_ID, PCI_ANY_ID, 0, 0, piix_pata_33 }, |
| @@ -383,6 +387,38 @@ static const struct ata_port_operations piix_sata_ops = { | |||
| 383 | .port_start = ata_port_start, | 387 | .port_start = ata_port_start, |
| 384 | }; | 388 | }; |
| 385 | 389 | ||
| 390 | static const struct ata_port_operations piix_vmw_ops = { | ||
| 391 | .set_piomode = piix_set_piomode, | ||
| 392 | .set_dmamode = piix_set_dmamode, | ||
| 393 | .mode_filter = ata_pci_default_filter, | ||
| 394 | |||
| 395 | .tf_load = ata_tf_load, | ||
| 396 | .tf_read = ata_tf_read, | ||
| 397 | .check_status = ata_check_status, | ||
| 398 | .exec_command = ata_exec_command, | ||
| 399 | .dev_select = ata_std_dev_select, | ||
| 400 | |||
| 401 | .bmdma_setup = ata_bmdma_setup, | ||
| 402 | .bmdma_start = ata_bmdma_start, | ||
| 403 | .bmdma_stop = ata_bmdma_stop, | ||
| 404 | .bmdma_status = piix_vmw_bmdma_status, | ||
| 405 | .qc_prep = ata_qc_prep, | ||
| 406 | .qc_issue = ata_qc_issue_prot, | ||
| 407 | .data_xfer = ata_data_xfer, | ||
| 408 | |||
| 409 | .freeze = ata_bmdma_freeze, | ||
| 410 | .thaw = ata_bmdma_thaw, | ||
| 411 | .error_handler = piix_pata_error_handler, | ||
| 412 | .post_internal_cmd = ata_bmdma_post_internal_cmd, | ||
| 413 | .cable_detect = ata_cable_40wire, | ||
| 414 | |||
| 415 | .irq_handler = ata_interrupt, | ||
| 416 | .irq_clear = ata_bmdma_irq_clear, | ||
| 417 | .irq_on = ata_irq_on, | ||
| 418 | |||
| 419 | .port_start = ata_port_start, | ||
| 420 | }; | ||
| 421 | |||
| 386 | static const struct piix_map_db ich5_map_db = { | 422 | static const struct piix_map_db ich5_map_db = { |
| 387 | .mask = 0x7, | 423 | .mask = 0x7, |
| 388 | .port_enable = 0x3, | 424 | .port_enable = 0x3, |
| @@ -623,6 +659,16 @@ static struct ata_port_info piix_port_info[] = { | |||
| 623 | .port_ops = &piix_sata_ops, | 659 | .port_ops = &piix_sata_ops, |
| 624 | }, | 660 | }, |
| 625 | 661 | ||
| 662 | [piix_pata_vmw] = | ||
| 663 | { | ||
| 664 | .sht = &piix_sht, | ||
| 665 | .flags = PIIX_PATA_FLAGS, | ||
| 666 | .pio_mask = 0x1f, /* pio0-4 */ | ||
| 667 | .mwdma_mask = 0x06, /* mwdma1-2 ?? CHECK 0 should be ok but slow */ | ||
| 668 | .udma_mask = ATA_UDMA_MASK_40C, | ||
| 669 | .port_ops = &piix_vmw_ops, | ||
| 670 | }, | ||
| 671 | |||
| 626 | }; | 672 | }; |
| 627 | 673 | ||
| 628 | static struct pci_bits piix_enable_bits[] = { | 674 | static struct pci_bits piix_enable_bits[] = { |
| @@ -1135,6 +1181,11 @@ static int piix_pci_device_resume(struct pci_dev *pdev) | |||
| 1135 | } | 1181 | } |
| 1136 | #endif | 1182 | #endif |
| 1137 | 1183 | ||
| 1184 | static u8 piix_vmw_bmdma_status(struct ata_port *ap) | ||
| 1185 | { | ||
| 1186 | return ata_bmdma_status(ap) & ~ATA_DMA_ERR; | ||
| 1187 | } | ||
| 1188 | |||
| 1138 | #define AHCI_PCI_BAR 5 | 1189 | #define AHCI_PCI_BAR 5 |
| 1139 | #define AHCI_GLOBAL_CTL 0x04 | 1190 | #define AHCI_GLOBAL_CTL 0x04 |
| 1140 | #define AHCI_ENABLE (1 << 31) | 1191 | #define AHCI_ENABLE (1 << 31) |
