usb/150401: commit references a PR
dfilter service
dfilter at FreeBSD.ORG
Mon Apr 18 11:30:15 UTC 2011
The following reply was made to PR usb/150401; it has been noted by GNATS.
From: dfilter at FreeBSD.ORG (dfilter service)
To: bug-followup at FreeBSD.org
Cc:
Subject: Re: usb/150401: commit references a PR
Date: Mon, 18 Apr 2011 11:25:28 +0000 (UTC)
Author: mav
Date: Mon Apr 18 11:25:13 2011
New Revision: 220771
URL: http://svn.freebsd.org/changeset/base/220771
Log:
Rework change made at r203146. Instead of reporting all wire errors as
SCSI status errors to CAM (that was wrong, as it too often turned retriable
wire errors into non-retriable REQUEST SENSE errors), do it only for STALL
errors on control pipe of the CBI devices. STALL on control pipe is just
a one of the ways to report error for CBI devices.
PR: usb/150401, usb/154593.
Reviewed by: hselasky
Modified:
stable/8/sys/dev/usb/storage/umass.c
Directory Properties:
stable/8/sys/ (props changed)
stable/8/sys/amd64/include/xen/ (props changed)
stable/8/sys/cddl/contrib/opensolaris/ (props changed)
stable/8/sys/contrib/dev/acpica/ (props changed)
stable/8/sys/contrib/pf/ (props changed)
Modified: stable/8/sys/dev/usb/storage/umass.c
==============================================================================
--- stable/8/sys/dev/usb/storage/umass.c Mon Apr 18 10:25:54 2011 (r220770)
+++ stable/8/sys/dev/usb/storage/umass.c Mon Apr 18 11:25:13 2011 (r220771)
@@ -1850,9 +1850,23 @@ umass_t_cbi_command_callback(struct usb_
break;
default: /* Error */
- umass_tr_error(xfer, error);
- /* skip reset */
- sc->sc_last_xfer_index = UMASS_T_CBI_COMMAND;
+ /*
+ * STALL on the control pipe can be result of the command error.
+ * Attempt to clear this STALL same as for bulk pipe also
+ * results in command completion interrupt, but ASC/ASCQ there
+ * look like not always valid, so don't bother about it.
+ */
+ if ((error == USB_ERR_STALLED) ||
+ (sc->sc_transfer.callback == &umass_cam_cb)) {
+ sc->sc_transfer.ccb = NULL;
+ (sc->sc_transfer.callback)
+ (sc, ccb, sc->sc_transfer.data_len,
+ STATUS_CMD_UNKNOWN);
+ } else {
+ umass_tr_error(xfer, error);
+ /* skip reset */
+ sc->sc_last_xfer_index = UMASS_T_CBI_COMMAND;
+ }
break;
}
}
@@ -2606,17 +2620,9 @@ umass_cam_cb(struct umass_softc *sc, uni
/*
* 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.
+ * retry the command if necessary.
*/
- 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;
- }
+ ccb->ccb_h.status = CAM_REQ_CMP_ERR;
xpt_done(ccb);
break;
}
_______________________________________________
svn-src-all at freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscribe at freebsd.org"
More information about the freebsd-usb
mailing list