sata_promise: ASIC PRD table bug workaround, take 2
authorMikael Pettersson <mikpe@it.uu.se>
Tue, 30 Oct 2007 13:20:49 +0000 (14:20 +0100)
committerJeff Garzik <jeff@garzik.org>
Tue, 30 Oct 2007 13:27:57 +0000 (09:27 -0400)
commitb9ccd4a90bbb964506f01b4bdcff4f50f8d5d334
treec8517b78c7de68fa3e4a66f3de069130b2c9b8fa
parent3529a233421fc43fa7bfdf7a4317daf28348a23d
sata_promise: ASIC PRD table bug workaround, take 2

Second-generation Promise SATA controllers have an ASIC bug
which can trigger if the last PRD entry is larger than 164 bytes,
resulting in intermittent errors and possible data corruption.

Work around this by replacing calls to ata_qc_prep() with a
private version that fills the PRD, checks the size of the
last entry, and if necessary splits it to avoid the bug.
Also reduce sg_tablesize by 1 to accommodate the new entry.

Tested on the second-generation SATA300 TX4 and SATA300 TX2plus,
and the first-generation PDC20378.

Thanks to Alexander Sabourenkov for verifying the bug by
studying the vendor driver, and for writing the initial patch
upon which this one is based.

Signed-off-by: Mikael Pettersson <mikpe@it.uu.se>
--
Changes since previous version:
* use new PDC_MAX_PRD constant to initialise sg_tablesize

 drivers/ata/sata_promise.c |   87 ++++++++++++++++++++++++++++++++++++++++++---
 1 files changed, 83 insertions(+), 4 deletions(-)
Signed-off-by: Jeff Garzik <jeff@garzik.org>
drivers/ata/sata_promise.c