Date: Fri, 22 Jan 2010 21:38:05 GMT From: Hans Petter Selasky <hselasky@FreeBSD.org> To: Perforce Change Reviews <perforce@FreeBSD.org> Subject: PERFORCE change 173543 for review Message-ID: <201001222138.o0MLc5Qm021366@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://p4web.freebsd.org/chv.cgi?CH=173543 Change 173543 by hselasky@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; } }
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201001222138.o0MLc5Qm021366>