diff options
Diffstat (limited to 'drivers/ata/sata_via.c')
-rw-r--r-- | drivers/ata/sata_via.c | 27 |
1 files changed, 27 insertions, 0 deletions
diff --git a/drivers/ata/sata_via.c b/drivers/ata/sata_via.c index 101d8c219caf..4730c42a5ee5 100644 --- a/drivers/ata/sata_via.c +++ b/drivers/ata/sata_via.c | |||
@@ -575,6 +575,33 @@ static void svia_configure(struct pci_dev *pdev) | |||
575 | tmp8 |= NATIVE_MODE_ALL; | 575 | tmp8 |= NATIVE_MODE_ALL; |
576 | pci_write_config_byte(pdev, SATA_NATIVE_MODE, tmp8); | 576 | pci_write_config_byte(pdev, SATA_NATIVE_MODE, tmp8); |
577 | } | 577 | } |
578 | |||
579 | /* | ||
580 | * vt6421 has problems talking to some drives. The following | ||
581 | * is the fix from Joseph Chan <JosephChan@via.com.tw>. | ||
582 | * | ||
583 | * When host issues HOLD, device may send up to 20DW of data | ||
584 | * before acknowledging it with HOLDA and the host should be | ||
585 | * able to buffer them in FIFO. Unfortunately, some WD drives | ||
586 | * send upto 40DW before acknowledging HOLD and, in the | ||
587 | * default configuration, this ends up overflowing vt6421's | ||
588 | * FIFO, making the controller abort the transaction with | ||
589 | * R_ERR. | ||
590 | * | ||
591 | * Rx52[2] is the internal 128DW FIFO Flow control watermark | ||
592 | * adjusting mechanism enable bit and the default value 0 | ||
593 | * means host will issue HOLD to device when the left FIFO | ||
594 | * size goes below 32DW. Setting it to 1 makes the watermark | ||
595 | * 64DW. | ||
596 | * | ||
597 | * https://bugzilla.kernel.org/show_bug.cgi?id=15173 | ||
598 | * http://article.gmane.org/gmane.linux.ide/46352 | ||
599 | */ | ||
600 | if (pdev->device == 0x3249) { | ||
601 | pci_read_config_byte(pdev, 0x52, &tmp8); | ||
602 | tmp8 |= 1 << 2; | ||
603 | pci_write_config_byte(pdev, 0x52, tmp8); | ||
604 | } | ||
578 | } | 605 | } |
579 | 606 | ||
580 | static int svia_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) | 607 | static int svia_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) |