PERFORCE change 173543 for review
Hans Petter Selasky
hselasky at FreeBSD.org
Fri Jan 22 21:38:06 UTC 2010
http://p4web.freebsd.org/chv.cgi?CH=173543
Change 173543 by hselasky at hselasky_laptop001 on 2010/01/22 21:37:32
USB storage:
- make CBI mode more fault tolerant.
- patch by HPS.
Affected files ...
.. //depot/projects/usb/src/sys/dev/usb/storage/umass.c#45 edit
Differences ...
==== //depot/projects/usb/src/sys/dev/usb/storage/umass.c#45 (text+ko) ====
@@ -673,7 +673,7 @@
.type = UE_INTERRUPT,
.endpoint = UE_ADDR_ANY,
.direction = UE_DIR_IN,
- .flags = {.short_xfer_ok = 1,},
+ .flags = {.short_xfer_ok = 1,.no_pipe_ok = 1,},
.bufsize = sizeof(umass_cbi_sbl_t),
.callback = &umass_t_cbi_status_callback,
.timeout = 5000, /* ms */
@@ -986,9 +986,7 @@
err = usbd_transfer_setup(uaa->device,
&uaa->info.bIfaceIndex, sc->sc_xfer, umass_cbi_config,
- (sc->sc_proto & UMASS_PROTO_CBI_I) ?
- UMASS_T_CBI_MAX : (UMASS_T_CBI_MAX - 2), sc,
- &sc->sc_mtx);
+ UMASS_T_CBI_MAX, sc, &sc->sc_mtx);
/* skip reset first time */
sc->sc_last_xfer_index = UMASS_T_CBI_COMMAND;
@@ -1678,7 +1676,7 @@
switch (USB_GET_STATE(xfer)) {
case USB_ST_TRANSFERRED:
umass_transfer_start(sc, UMASS_T_CBI_RESET2);
- return;
+ break;
case USB_ST_SETUP:
/*
@@ -1725,11 +1723,14 @@
usbd_xfer_set_frame_len(xfer, 1, sizeof(buf));
usbd_xfer_set_frames(xfer, 2);
usbd_transfer_submit(xfer);
- return;
+ break;
default: /* Error */
- umass_tr_error(xfer, error);
- return;
+ if (error == USB_ERR_CANCELLED)
+ umass_tr_error(xfer, error);
+ else
+ umass_transfer_start(sc, UMASS_T_CBI_RESET2);
+ break;
}
}
@@ -1774,17 +1775,17 @@
} else {
umass_transfer_start(sc, next_xfer);
}
- return;
+ break;
case USB_ST_SETUP:
if (usbd_clear_stall_callback(xfer, sc->sc_xfer[stall_xfer])) {
goto tr_transferred; /* should not happen */
}
- return;
+ break;
default: /* Error */
umass_tr_error(xfer, error);
- return;
+ break;
}
}
@@ -1807,7 +1808,7 @@
(sc, (sc->sc_transfer.dir == DIR_IN) ?
UMASS_T_CBI_DATA_READ : UMASS_T_CBI_DATA_WRITE);
}
- return;
+ break;
case USB_ST_SETUP:
@@ -1846,12 +1847,13 @@
usbd_transfer_submit(xfer);
}
- return;
+ break;
default: /* Error */
umass_tr_error(xfer, error);
- return;
-
+ /* skip reset */
+ sc->sc_last_xfer_index = UMASS_T_CBI_COMMAND;
+ break;
}
}
@@ -1887,7 +1889,7 @@
if (sc->sc_transfer.data_rem == 0) {
umass_cbi_start_status(sc);
- return;
+ break;
}
if (max_bulk > sc->sc_transfer.data_rem) {
max_bulk = sc->sc_transfer.data_rem;
@@ -1901,7 +1903,7 @@
usbd_xfer_set_frame_len(xfer, 0, max_bulk);
#endif
usbd_transfer_submit(xfer);
- return;
+ break;
default: /* Error */
if ((error == USB_ERR_CANCELLED) ||
@@ -1910,7 +1912,7 @@
} else {
umass_transfer_start(sc, UMASS_T_CBI_DATA_RD_CS);
}
- return;
+ break;
}
}
@@ -1950,7 +1952,7 @@
if (sc->sc_transfer.data_rem == 0) {
umass_cbi_start_status(sc);
- return;
+ break;
}
if (max_bulk > sc->sc_transfer.data_rem) {
max_bulk = sc->sc_transfer.data_rem;
@@ -1967,7 +1969,7 @@
#endif
usbd_transfer_submit(xfer);
- return;
+ break;
default: /* Error */
if ((error == USB_ERR_CANCELLED) ||
@@ -1976,7 +1978,7 @@
} else {
umass_transfer_start(sc, UMASS_T_CBI_DATA_WR_CS);
}
- return;
+ break;
}
}
@@ -2037,7 +2039,7 @@
(sc->sc_transfer.callback)
(sc, ccb, residue, status);
- return;
+ break;
} else {
@@ -2062,7 +2064,7 @@
(sc->sc_transfer.callback)
(sc, ccb, residue, status);
- return;
+ break;
}
}
@@ -2072,13 +2074,13 @@
tr_setup:
usbd_xfer_set_frame_len(xfer, 0, usbd_xfer_max_len(xfer));
usbd_transfer_submit(xfer);
- return;
+ break;
default: /* Error */
DPRINTF(sc, UDMASS_CBI, "Failed to read CSW: %s\n",
usbd_errstr(error));
umass_tr_error(xfer, error);
- return;
+ break;
}
}
More information about the p4-projects
mailing list