From owner-p4-projects@FreeBSD.ORG Mon Dec 24 22:24:01 2007 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id C163116A41A; Mon, 24 Dec 2007 22:24:00 +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 5A2D216A418 for ; Mon, 24 Dec 2007 22:24:00 +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 442C513C45B for ; Mon, 24 Dec 2007 22:24:00 +0000 (UTC) (envelope-from hselasky@FreeBSD.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.14.1/8.14.1) with ESMTP id lBOMO02k037802 for ; Mon, 24 Dec 2007 22:24:00 GMT (envelope-from hselasky@FreeBSD.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.14.1/8.14.1/Submit) id lBOMO0tN037799 for perforce@freebsd.org; Mon, 24 Dec 2007 22:24:00 GMT (envelope-from hselasky@FreeBSD.org) Date: Mon, 24 Dec 2007 22:24:00 GMT Message-Id: <200712242224.lBOMO0tN037799@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 Cc: Subject: PERFORCE change 131546 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 24 Dec 2007 22:24:01 -0000 http://perforce.freebsd.org/chv.cgi?CH=131546 Change 131546 by hselasky@hselasky_laptop001 on 2007/12/24 22:23:44 Bugfixes related to USB device side mode. Affected files ... .. //depot/projects/usb/src/sys/dev/usb/usb_transfer.c#84 edit Differences ... ==== //depot/projects/usb/src/sys/dev/usb/usb_transfer.c#84 (text+ko) ==== @@ -1389,12 +1389,8 @@ { uint32_t len; - /* - * USB control endpoints are not just straight forward ... - * Check for STALL: - */ - if (xfer->flags.stall_pipe && - (xfer->flags_int.usb_mode == USB_MODE_DEVICE)) { + /* Check for control endpoint stall */ + if (xfer->flags.stall_pipe) { /* no longer active */ xfer->flags_int.control_act = 0; } @@ -1464,9 +1460,23 @@ /* check if there is a length mismatch */ if (len > xfer->flags_int.control_rem) { + PRINTFN(-1, ("Length greater than remaining length!\n")); goto error; } - xfer->flags_int.control_rem -= len; + /* check if we are doing a short transfer */ + + if (xfer->flags.force_short_xfer) { + xfer->flags_int.control_rem = 0; + } else { + if ((len != xfer->max_data_length) && + (len != xfer->flags_int.control_rem) && + (xfer->nframes != 1)) { + PRINTFN(-1, ("Short control transfer without " + "force_short_xfer set!\n")); + goto error; + } + xfer->flags_int.control_rem -= len; + } /* the status part is executed when "control_act" is 0 */ @@ -1524,9 +1534,8 @@ uint32_t x; PRINTFN(0, ("xfer=%p, pipe=%p, nframes=%d, dir=%s\n", - xfer, xfer->pipe, xfer->nframes, - ((xfer->endpoint & (UE_DIR_IN | UE_DIR_OUT)) == - UE_DIR_IN) ? "in" : "out")); + xfer, xfer->pipe, xfer->nframes, USBD_GET_DATA_ISREAD(xfer) ? + "read" : "write")); #ifdef USB_DEBUG if (usbdebug > 0) { @@ -2511,10 +2520,11 @@ if (xfer->flags.stall_pipe && (xfer->flags_int.usb_mode == USB_MODE_DEVICE)) { /* - * We can not stall ISOCHRONOUS endpoints ! - */ + * Only stall BULK and INTERRUPT endpoints. + */ type = (xfer->pipe->edesc->bmAttributes & UE_XFERTYPE); - if (type != UE_ISOCHRONOUS) { + if ((type == UE_BULK) || + (type == UE_INTERRUPT)) { xfer->pipe->is_stalled = 1; (xfer->udev->bus->methods->set_stall) ( xfer->udev, NULL, xfer->pipe); @@ -3053,15 +3063,16 @@ usbd_copy_out(xfer->frbuffers + 0, 0, &req, sizeof(req)); - /* get the remainder of the control transfer */ + if (xfer->flags_int.control_rem == 0xFFFF) { + /* first time - not initialised */ + rem = UGETW(req.wLength); + off = 0; + } else { + /* not first time - initialised */ + rem = xfer->flags_int.control_rem; + off = UGETW(req.wLength) - rem; + } - rem = (xfer->flags_int.control_rem == 0xFFFF) ? 0 : - xfer->flags_int.control_rem; - - /* compute the current offset */ - - off = UGETW(req.wLength) - rem; - /* set some defaults */ max_len = 0; @@ -3271,10 +3282,10 @@ tr_handle_set_interface: if (state == ST_DATA) { goto tr_bad_context; - } else if ((state == ST_CONTEXT_START) && - usbd_handle_set_alt_setting( - xfer, wValue, wIndex)) { - goto tr_stalled; + } else if (state == ST_CONTEXT_START) { + if (usbd_handle_set_alt_setting(xfer, wIndex - 1, wValue)) { + goto tr_stalled; + } } goto tr_valid; @@ -3329,6 +3340,7 @@ xfer->flags.manual_status = 0; xfer->frlengths[1] = 0; } + xfer->flags.stall_pipe = 0; /* do not stall pipe */ return (0); /* success */ tr_stalled: