From owner-p4-projects@FreeBSD.ORG Fri Jan 22 21:38:05 2010 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id D13AB1065692; Fri, 22 Jan 2010 21:38:05 +0000 (UTC) Delivered-To: perforce@FreeBSD.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 7D303106566B for ; Fri, 22 Jan 2010 21:38:05 +0000 (UTC) (envelope-from hselasky@FreeBSD.org) Received: from repoman.freebsd.org (repoman.freebsd.org [IPv6:2001:4f8:fff6::29]) by mx1.freebsd.org (Postfix) with ESMTP id 6A2628FC23 for ; Fri, 22 Jan 2010 21:38:05 +0000 (UTC) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.14.3/8.14.3) with ESMTP id o0MLc5iC021368 for ; Fri, 22 Jan 2010 21:38:05 GMT (envelope-from hselasky@FreeBSD.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.14.3/8.14.3/Submit) id o0MLc5Qm021366 for perforce@freebsd.org; Fri, 22 Jan 2010 21:38:05 GMT (envelope-from hselasky@FreeBSD.org) Date: Fri, 22 Jan 2010 21:38:05 GMT Message-Id: <201001222138.o0MLc5Qm021366@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to hselasky@FreeBSD.org using -f From: Hans Petter Selasky To: Perforce Change Reviews Precedence: bulk Cc: Subject: PERFORCE change 173543 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 22 Jan 2010 21:38:06 -0000 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; } }