summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorthompsa <thompsa@FreeBSD.org>2010-01-29 02:38:34 +0000
committerthompsa <thompsa@FreeBSD.org>2010-01-29 02:38:34 +0000
commit38252fbed45c05861eafac4bee6cce077316851a (patch)
treec6ccd7544622cb73ed30bde1cac3cd9fcb5c9bda
parent1acaa154c75a4b6135025aacd09eea89832a3b85 (diff)
downloadFreeBSD-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.c16
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;
}
OpenPOWER on IntegriCloud