usb/150401: commit references a PR

dfilter service dfilter at FreeBSD.ORG
Mon Apr 11 08: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, 11 Apr 2011 08:23:41 +0000 (UTC)

 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;
  	}
 _______________________________________________
 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