svn commit: r220535 - head/sys/dev/usb/storage

Alexander Motin mav at FreeBSD.org
Mon Apr 11 08:23:27 UTC 2011


Author: mav
Date: Mon Apr 11 08:23:27 2011
New Revision: 220535
URL: http://svn.freebsd.org/changeset/base/220535

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
  MFC after:	1 week

Modified:
  head/sys/dev/usb/storage/umass.c

Modified: head/sys/dev/usb/storage/umass.c
==============================================================================
--- head/sys/dev/usb/storage/umass.c	Mon Apr 11 06:53:45 2011	(r220534)
+++ head/sys/dev/usb/storage/umass.c	Mon Apr 11 08:23:27 2011	(r220535)
@@ -1849,9 +1849,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;
 	}
 }
@@ -2605,17 +2619,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;
 	}


More information about the svn-src-head mailing list