From owner-p4-projects@FreeBSD.ORG Sun Aug 8 08:56:32 2010 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 8205A106567A; Sun, 8 Aug 2010 08:56:32 +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 256BC1065678 for ; Sun, 8 Aug 2010 08:56:32 +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 12DD88FC24 for ; Sun, 8 Aug 2010 08:56:32 +0000 (UTC) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.14.4/8.14.4) with ESMTP id o788uVrp067151 for ; Sun, 8 Aug 2010 08:56:31 GMT (envelope-from hselasky@FreeBSD.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.14.4/8.14.4/Submit) id o788uV1O067149 for perforce@freebsd.org; Sun, 8 Aug 2010 08:56:31 GMT (envelope-from hselasky@FreeBSD.org) Date: Sun, 8 Aug 2010 08:56:31 GMT Message-Id: <201008080856.o788uV1O067149@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 182067 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: Sun, 08 Aug 2010 08:56:32 -0000 http://p4web.freebsd.org/@@182067?ac=10 Change 182067 by hselasky@hselasky_laptop001 on 2010/08/08 08:55:46 USB core: - extend use of clear stall bus method. Affected files ... .. //depot/projects/usb/src/sys/dev/usb/usb_controller.h#26 edit .. //depot/projects/usb/src/sys/dev/usb/usb_device.c#76 edit .. //depot/projects/usb/src/sys/dev/usb/usb_request.c#41 edit .. //depot/projects/usb/src/sys/dev/usb/usb_transfer.c#183 edit .. //depot/projects/usb/src/sys/dev/usb/usb_transfer.h#17 edit Differences ... ==== //depot/projects/usb/src/sys/dev/usb/usb_controller.h#26 (text+ko) ==== @@ -97,6 +97,9 @@ 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, uint8_t *did_stall); + + /* USB Device mode mandatory. USB Host mode optional. */ + void (*clear_stall) (struct usb_device *udev, struct usb_endpoint *ep); /* Optional transfer polling support */ ==== //depot/projects/usb/src/sys/dev/usb/usb_device.c#76 (text+ko) ==== @@ -928,8 +928,8 @@ /*------------------------------------------------------------------------* * usbd_set_endpoint_stall * - * This function is used to make a BULK or INTERRUPT endpoint - * send STALL tokens. + * This function is used to make a BULK or INTERRUPT endpoint send + * STALL tokens in USB device mode. * * Returns: * 0: Success ==== //depot/projects/usb/src/sys/dev/usb/usb_request.c#41 (text+ko) ==== @@ -245,6 +245,8 @@ ep->is_stalled) { ep->toggle_next = 0; ep->is_stalled = 0; + /* some hardware needs a callback to clear the data toggle */ + usbd_clear_stall_locked(udev, ep); /* start up the current or next transfer, if any */ usb_command_wrapper(&ep->endpoint_q, ep->endpoint_q.curr); ==== //depot/projects/usb/src/sys/dev/usb/usb_transfer.c#183 (text+ko) ==== @@ -2863,12 +2863,34 @@ * data toggle. *------------------------------------------------------------------------*/ void +usbd_clear_stall_locked(struct usb_device *udev, struct usb_endpoint *ep) +{ + USB_BUS_LOCK_ASSERT(udev->bus, MA_OWNED); + + /* check that we have a valid case */ + if ((udev->flags.usb_mode == USB_MODE_HOST) && + (udev->parent_hub != NULL) && + (udev->bus->methods->clear_stall != NULL) && + (ep->methods != NULL)) { + (udev->bus->methods->clear_stall) (udev, ep); + } +} + +/*------------------------------------------------------------------------* + * usbd_clear_data_toggle - factored out code + * + * NOTE: the intention of this function is not to reset the hardware + * data toggle on the USB device side. + *------------------------------------------------------------------------*/ +void usbd_clear_data_toggle(struct usb_device *udev, struct usb_endpoint *ep) { DPRINTFN(5, "udev=%p endpoint=%p\n", udev, ep); USB_BUS_LOCK(udev->bus); ep->toggle_next = 0; + /* some hardware needs a callback to clear the data toggle */ + usbd_clear_stall_locked(udev, ep); USB_BUS_UNLOCK(udev->bus); } ==== //depot/projects/usb/src/sys/dev/usb/usb_transfer.h#17 (text+ko) ==== @@ -125,6 +125,8 @@ struct usb_xfer *xfer); void usbd_transfer_setup_sub(struct usb_setup_params *parm); void usbd_ctrl_transfer_setup(struct usb_device *udev); +void usbd_clear_stall_locked(struct usb_device *udev, + struct usb_endpoint *ep); void usbd_clear_data_toggle(struct usb_device *udev, struct usb_endpoint *ep); usb_callback_t usbd_do_request_callback;