summaryrefslogtreecommitdiffstats
path: root/sys/dev/ata
diff options
context:
space:
mode:
authormav <mav@FreeBSD.org>2010-11-08 15:36:15 +0000
committermav <mav@FreeBSD.org>2010-11-08 15:36:15 +0000
commit78df14851ad0652c4305a57a5954cdf0a6990360 (patch)
tree6f37967994205ba1942c971cc4e6ced2627d1bbc /sys/dev/ata
parent1828dd747851cf18a1b9806d08be3dafcdd76bed (diff)
downloadFreeBSD-src-78df14851ad0652c4305a57a5954cdf0a6990360.zip
FreeBSD-src-78df14851ad0652c4305a57a5954cdf0a6990360.tar.gz
Teach ahci(4), siis(4) and ATA_CAM ata(4) wrapper report to CAM residual
I/O length on underruns, that often happens for some SCSI commands.
Diffstat (limited to 'sys/dev/ata')
-rw-r--r--sys/dev/ata/ata-all.c9
1 files changed, 9 insertions, 0 deletions
diff --git a/sys/dev/ata/ata-all.c b/sys/dev/ata/ata-all.c
index f40dcc2..c7fe9ba 100644
--- a/sys/dev/ata/ata-all.c
+++ b/sys/dev/ata/ata-all.c
@@ -1517,6 +1517,15 @@ ata_cam_end_transaction(device_t dev, struct ata_request *request)
res->sector_count = request->u.ata.count;
res->sector_count_exp = request->u.ata.count >> 8;
}
+ if ((ccb->ccb_h.flags & CAM_DIR_MASK) != CAM_DIR_NONE) {
+ if (ccb->ccb_h.func_code == XPT_ATA_IO) {
+ ccb->ataio.resid =
+ ccb->ataio.dxfer_len - request->donecount;
+ } else {
+ ccb->csio.resid =
+ ccb->csio.dxfer_len - request->donecount;
+ }
+ }
ata_free_request(request);
xpt_done(ccb);
/* Do error recovery if needed. */
OpenPOWER on IntegriCloud