diff options
author | mav <mav@FreeBSD.org> | 2010-11-08 15:36:15 +0000 |
---|---|---|
committer | mav <mav@FreeBSD.org> | 2010-11-08 15:36:15 +0000 |
commit | 78df14851ad0652c4305a57a5954cdf0a6990360 (patch) | |
tree | 6f37967994205ba1942c971cc4e6ced2627d1bbc /sys/dev/ata | |
parent | 1828dd747851cf18a1b9806d08be3dafcdd76bed (diff) | |
download | FreeBSD-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.c | 9 |
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. */ |