diff options
| -rw-r--r-- | drivers/ata/sata_via.c | 18 |
1 files changed, 16 insertions, 2 deletions
diff --git a/drivers/ata/sata_via.c b/drivers/ata/sata_via.c index 0ecd0f6aa2c0..4730c42a5ee5 100644 --- a/drivers/ata/sata_via.c +++ b/drivers/ata/sata_via.c | |||
| @@ -578,10 +578,24 @@ static void svia_configure(struct pci_dev *pdev) | |||
| 578 | 578 | ||
| 579 | /* | 579 | /* |
| 580 | * vt6421 has problems talking to some drives. The following | 580 | * vt6421 has problems talking to some drives. The following |
| 581 | * is the magic fix from Joseph Chan <JosephChan@via.com.tw>. | 581 | * is the fix from Joseph Chan <JosephChan@via.com.tw>. |
| 582 | * Please add proper documentation if possible. | 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. | ||
| 583 | * | 596 | * |
| 584 | * https://bugzilla.kernel.org/show_bug.cgi?id=15173 | 597 | * https://bugzilla.kernel.org/show_bug.cgi?id=15173 |
| 598 | * http://article.gmane.org/gmane.linux.ide/46352 | ||
| 585 | */ | 599 | */ |
| 586 | if (pdev->device == 0x3249) { | 600 | if (pdev->device == 0x3249) { |
| 587 | pci_read_config_byte(pdev, 0x52, &tmp8); | 601 | pci_read_config_byte(pdev, 0x52, &tmp8); |
