From owner-p4-projects@FreeBSD.ORG Thu Jun 18 17:32:13 2009 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id D7CA9106567A; Thu, 18 Jun 2009 17:32:12 +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 940561065676 for ; Thu, 18 Jun 2009 17:32:12 +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 81E6B8FC27 for ; Thu, 18 Jun 2009 17:32:12 +0000 (UTC) (envelope-from hselasky@FreeBSD.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.14.3/8.14.3) with ESMTP id n5IHWCtD057946 for ; Thu, 18 Jun 2009 17:32:12 GMT (envelope-from hselasky@FreeBSD.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.14.3/8.14.3/Submit) id n5IHWC13057944 for perforce@freebsd.org; Thu, 18 Jun 2009 17:32:12 GMT (envelope-from hselasky@FreeBSD.org) Date: Thu, 18 Jun 2009 17:32:12 GMT Message-Id: <200906181732.n5IHWC13057944@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 164675 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: Thu, 18 Jun 2009 17:32:13 -0000 http://perforce.freebsd.org/chv.cgi?CH=164675 Change 164675 by hselasky@hselasky_laptop001 on 2009/06/18 17:32:10 USB CORE (device side mode): - New feature: Add support for devices that handle set and clear stall in hardware. Affected files ... .. //depot/projects/usb/src/sys/dev/usb/controller/at91dci.c#24 edit .. //depot/projects/usb/src/sys/dev/usb/controller/atmegadci.c#34 edit .. //depot/projects/usb/src/sys/dev/usb/controller/avr32dci.c#9 edit .. //depot/projects/usb/src/sys/dev/usb/controller/musb_otg.c#22 edit .. //depot/projects/usb/src/sys/dev/usb/controller/uss820dci.c#24 edit .. //depot/projects/usb/src/sys/dev/usb/usb_controller.h#14 edit .. //depot/projects/usb/src/sys/dev/usb/usb_device.c#40 edit .. //depot/projects/usb/src/sys/dev/usb/usb_transfer.c#155 edit Differences ... ==== //depot/projects/usb/src/sys/dev/usb/controller/at91dci.c#24 (text+ko) ==== @@ -1208,7 +1208,7 @@ static void at91dci_set_stall(struct usb_device *udev, struct usb_xfer *xfer, - struct usb_endpoint *ep) + struct usb_endpoint *ep, uint8_t *did_stall) { struct at91dci_softc *sc; uint32_t csr_val; ==== //depot/projects/usb/src/sys/dev/usb/controller/atmegadci.c#34 (text+ko) ==== @@ -1094,7 +1094,7 @@ static void atmegadci_set_stall(struct usb_device *udev, struct usb_xfer *xfer, - struct usb_endpoint *ep) + struct usb_endpoint *ep, uint8_t *did_stall) { struct atmegadci_softc *sc; uint8_t ep_no; ==== //depot/projects/usb/src/sys/dev/usb/controller/avr32dci.c#9 (text+ko) ==== @@ -1062,7 +1062,7 @@ static void avr32dci_set_stall(struct usb_device *udev, struct usb_xfer *xfer, - struct usb_endpoint *ep) + struct usb_endpoint *ep, uint8_t *did_stall) { struct avr32dci_softc *sc; uint8_t ep_no; ==== //depot/projects/usb/src/sys/dev/usb/controller/musb_otg.c#22 (text+ko) ==== @@ -1454,7 +1454,7 @@ static void musbotg_set_stall(struct usb_device *udev, struct usb_xfer *xfer, - struct usb_endpoint *ep) + struct usb_endpoint *ep, uint8_t *did_stall) { struct musbotg_softc *sc; uint8_t ep_no; ==== //depot/projects/usb/src/sys/dev/usb/controller/uss820dci.c#24 (text+ko) ==== @@ -1184,7 +1184,7 @@ static void uss820dci_set_stall(struct usb_device *udev, struct usb_xfer *xfer, - struct usb_endpoint *ep) + struct usb_endpoint *ep, uint8_t *did_stall) { struct uss820dci_softc *sc; uint8_t ep_no; ==== //depot/projects/usb/src/sys/dev/usb/usb_controller.h#14 (text+ko) ==== @@ -96,7 +96,7 @@ /* USB Device mode only - Mandatory */ void (*get_hw_ep_profile) (struct usb_device *udev, const struct usb_hw_ep_profile **ppf, uint8_t ep_addr); - void (*set_stall) (struct usb_device *udev, struct usb_xfer *xfer, struct usb_endpoint *ep); + void (*set_stall) (struct usb_device *udev, struct usb_xfer *xfer, struct usb_endpoint *ep, uint8_t *did_stall); void (*clear_stall) (struct usb_device *udev, struct usb_endpoint *ep); }; ==== //depot/projects/usb/src/sys/dev/usb/usb_device.c#40 (text+ko) ==== @@ -916,7 +916,7 @@ * complete the USB transfer like in case of a timeout * setting the error code "USB_ERR_STALLED". */ - (udev->bus->methods->set_stall) (udev, xfer, ep); + (udev->bus->methods->set_stall) (udev, xfer, ep, &do_stall); } if (!do_stall) { ep->toggle_next = 0; /* reset data toggle */ ==== //depot/projects/usb/src/sys/dev/usb/usb_transfer.c#155 (text+ko) ==== @@ -2240,29 +2240,37 @@ (type == UE_INTERRUPT)) { struct usb_device *udev; struct usb_xfer_root *info; + uint8_t did_stall; info = xfer->xroot; udev = info->udev; - ep->is_stalled = 1; + did_stall = 1; if (udev->flags.usb_mode == USB_MODE_DEVICE) { (udev->bus->methods->set_stall) ( - udev, NULL, ep); + udev, NULL, ep, &did_stall); } else if (udev->default_xfer[1]) { info = udev->default_xfer[1]->xroot; - if (usb_proc_msignal( + usb_proc_msignal( &info->bus->non_giant_callback_proc, - &udev->cs_msg[0], &udev->cs_msg[1])) { - /* ignore */ - } + &udev->cs_msg[0], &udev->cs_msg[1]); } else { /* should not happen */ DPRINTFN(0, "No stall handler!\n"); } /* - * We get started again when the stall is cleared! + * Check if we should stall. Some USB hardware + * handles set- and clear-stall in hardware. */ - return; + if (did_stall) { + /* + * The transfer will be continued when + * the clear-stall control endpoint + * message is received. + */ + ep->is_stalled = 1; + return; + } } } /* Set or clear stall complete - special case */