summaryrefslogtreecommitdiffstats
path: root/sys
diff options
context:
space:
mode:
authorimp <imp@FreeBSD.org>2007-06-30 02:50:57 +0000
committerimp <imp@FreeBSD.org>2007-06-30 02:50:57 +0000
commit665642a3f2aeadb5d5bd42bab15d52f405ec6b1c (patch)
treef709cbda5957315b4a4f3ca4d4d2c07cab3fe82b /sys
parent010e282dd38a102482b840cb76715844f132b62e (diff)
downloadFreeBSD-src-665642a3f2aeadb5d5bd42bab15d52f405ec6b1c.zip
FreeBSD-src-665642a3f2aeadb5d5bd42bab15d52f405ec6b1c.tar.gz
Expand the transform API to allow transports to return 'success' for
the command. Make UFI devices return 'success' when asked to do a SYNC_CACHE. There's no support for write caching in the UFI spec, so this is the most appropriate action to undertake. Reviewed by: scottl Approved by: re@ (blanket)
Diffstat (limited to 'sys')
-rw-r--r--sys/dev/usb/umass.c25
1 files changed, 20 insertions, 5 deletions
diff --git a/sys/dev/usb/umass.c b/sys/dev/usb/umass.c
index b138308..23b9728 100644
--- a/sys/dev/usb/umass.c
+++ b/sys/dev/usb/umass.c
@@ -2330,7 +2330,7 @@ umass_cam_rescan(void *addr)
if (ccb == NULL)
return;
if (xpt_create_path(&path, xpt_periph, cam_sim_path(sc->umass_sim),
- CAM_TARGET_WILDCARD, CAM_LUN_WILDCARD)
+ device_get_unit(sc->sc_dev), CAM_LUN_WILDCARD)
!= CAM_REQ_CMP) {
free(ccb, M_USBDEV);
return;
@@ -2533,7 +2533,8 @@ umass_cam_action(struct cam_sim *sim, union ccb *ccb)
* buffer (see umass_scsi_transform).
*/
- if (sc->transform(sc, cmd, cmdlen, &rcmd, &rcmdlen)) {
+ switch (sc->transform(sc, cmd, cmdlen, &rcmd, &rcmdlen)) {
+ case 1:
/*
* Handle EVPD inquiry for broken devices first
* NO_INQUIRY also implies NO_INQUIRY_EVPD
@@ -2573,9 +2574,15 @@ umass_cam_action(struct cam_sim *sim, union ccb *ccb)
csio->data_ptr,
csio->dxfer_len, dir, ccb->ccb_h.timeout,
umass_cam_cb, (void *) ccb);
- } else {
+ break;
+ case 0:
ccb->ccb_h.status = CAM_REQ_INVALID;
xpt_done(ccb);
+ break;
+ case 2:
+ ccb->ccb_h.status = CAM_REQ_CMP;
+ xpt_done(ccb);
+ break;
}
break;
@@ -2764,7 +2771,7 @@ umass_cam_cb(struct umass_softc *sc, void *priv, int residue, int status)
if (sc->transform(sc,
(unsigned char *) &sc->cam_scsi_sense,
sizeof(sc->cam_scsi_sense),
- &rcmd, &rcmdlen)) {
+ &rcmd, &rcmdlen) == 1) {
if ((sc->quirks & FORCE_SHORT_INQUIRY) && (rcmd[0] == INQUIRY)) {
csio->sense_len = SHORT_INQUIRY_LENGTH;
}
@@ -2874,7 +2881,7 @@ umass_cam_sense_cb(struct umass_softc *sc, void *priv, int residue, int status)
(unsigned char *)
&sc->cam_scsi_test_unit_ready,
sizeof(sc->cam_scsi_test_unit_ready),
- &rcmd, &rcmdlen)) {
+ &rcmd, &rcmdlen) == 1) {
sc->transfer(sc, ccb->ccb_h.target_lun,
rcmd, rcmdlen,
NULL, 0, DIR_NONE, ccb->ccb_h.timeout,
@@ -3071,6 +3078,14 @@ umass_ufi_transform(struct umass_softc *sc, unsigned char *cmd, int cmdlen,
memcpy(*rcmd, cmd, cmdlen);
return 1;
+ /*
+ * SYNCHRONIZE_CACHE isn't supported by UFI, nor should it be
+ * required for UFI devices, so it is appropriate to fake
+ * success.
+ */
+ case SYNCHRONIZE_CACHE:
+ return 2;
+
default:
printf("%s: Unsupported UFI command 0x%02x\n",
device_get_nameunit(sc->sc_dev), cmd[0]);
OpenPOWER on IntegriCloud