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@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to