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
This commit is contained in:
Alexander Motin 2011-04-11 08:23:27 +00:00
parent 6b3664c018
commit 669d9046a9

View File

@ -1849,9 +1849,23 @@ umass_t_cbi_command_callback(struct usb_xfer *xfer, usb_error_t error)
break; break;
default: /* Error */ default: /* Error */
umass_tr_error(xfer, error); /*
/* skip reset */ * STALL on the control pipe can be result of the command error.
sc->sc_last_xfer_index = UMASS_T_CBI_COMMAND; * 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; break;
} }
} }
@ -2605,17 +2619,9 @@ umass_cam_cb(struct umass_softc *sc, union ccb *ccb, uint32_t residue,
/* /*
* The wire protocol failed and will hopefully have * The wire protocol failed and will hopefully have
* recovered. We return an error to CAM and let CAM * recovered. We return an error to CAM and let CAM
* retry the command if necessary. In case of SCSI IO * retry the command if necessary.
* commands we ask the CAM layer to check the
* condition first. This is a quick hack to make
* certain devices work.
*/ */
if (ccb->ccb_h.func_code == XPT_SCSI_IO) { ccb->ccb_h.status = CAM_REQ_CMP_ERR;
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); xpt_done(ccb);
break; break;
} }