diff options
author | thompsa <thompsa@FreeBSD.org> | 2010-01-29 02:38:34 +0000 |
---|---|---|
committer | thompsa <thompsa@FreeBSD.org> | 2010-01-29 02:38:34 +0000 |
commit | 38252fbed45c05861eafac4bee6cce077316851a (patch) | |
tree | c6ccd7544622cb73ed30bde1cac3cd9fcb5c9bda | |
parent | 1acaa154c75a4b6135025aacd09eea89832a3b85 (diff) | |
download | FreeBSD-src-38252fbed45c05861eafac4bee6cce077316851a.zip FreeBSD-src-38252fbed45c05861eafac4bee6cce077316851a.tar.gz |
Rework cam error handling to fix Mitsumi floppy drives.
Submitted by: mav
-rw-r--r-- | sys/dev/usb/storage/umass.c | 16 |
1 files changed, 12 insertions, 4 deletions
diff --git a/sys/dev/usb/storage/umass.c b/sys/dev/usb/storage/umass.c index 1e99464..b14bb47 100644 --- a/sys/dev/usb/storage/umass.c +++ b/sys/dev/usb/storage/umass.c @@ -2594,11 +2594,19 @@ umass_cam_cb(struct umass_softc *sc, union ccb *ccb, uint32_t residue, default: /* - * the wire protocol failed and will have recovered - * (hopefully). We return an error to CAM and let CAM retry - * the command if necessary. + * The wire protocol failed and will hopefully have + * recovered. We return an error to CAM and let CAM + * retry the command if necessary. In case of SCSI IO + * commands we ask the CAM layer to check the + * condition first. This is a quick hack to make + * certain devices work. */ - ccb->ccb_h.status = CAM_REQ_CMP_ERR; + if (ccb->ccb_h.func_code == XPT_SCSI_IO) { + ccb->ccb_h.status = CAM_SCSI_STATUS_ERROR; + ccb->csio.scsi_status = SCSI_STATUS_CHECK_COND; + } else { + ccb->ccb_h.status = CAM_REQ_CMP_ERR; + } xpt_done(ccb); break; } |