From owner-svn-src-all@FreeBSD.ORG Thu Nov 13 21:34:35 2008 Return-Path: Delivered-To: svn-src-all@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 64419106567E; Thu, 13 Nov 2008 21:34:35 +0000 (UTC) (envelope-from n_hibma@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 4DE8A8FC13; Thu, 13 Nov 2008 21:34:35 +0000 (UTC) (envelope-from n_hibma@FreeBSD.org) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id mADLYZWR069526; Thu, 13 Nov 2008 21:34:35 GMT (envelope-from n_hibma@svn.freebsd.org) Received: (from n_hibma@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id mADLYZls069521; Thu, 13 Nov 2008 21:34:35 GMT (envelope-from n_hibma@svn.freebsd.org) Message-Id: <200811132134.mADLYZls069521@svn.freebsd.org> From: Nick Hibma Date: Thu, 13 Nov 2008 21:34:35 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org X-SVN-Group: head MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r184941 - head/sys/dev/usb X-BeenThere: svn-src-all@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the entire src tree \(except for " user" and " projects" \)" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 13 Nov 2008 21:34:35 -0000 Author: n_hibma Date: Thu Nov 13 21:34:34 2008 New Revision: 184941 URL: http://svn.freebsd.org/changeset/base/184941 Log: Add a reset device command to ugen.c. This is needed to make some devices work that require a firmware upload and a USB reset afterwards. Modified: head/sys/dev/usb/ugen.c head/sys/dev/usb/usb.h head/sys/dev/usb/usb_subr.c head/sys/dev/usb/usbdi.c head/sys/dev/usb/usbdi.h Modified: head/sys/dev/usb/ugen.c ============================================================================== --- head/sys/dev/usb/ugen.c Thu Nov 13 21:11:34 2008 (r184940) +++ head/sys/dev/usb/ugen.c Thu Nov 13 21:34:34 2008 (r184941) @@ -1059,8 +1059,8 @@ ugen_isoc_rintr(usbd_xfer_handle xfer, u sce->cur += count; if(sce->cur >= sce->limit) sce->cur = sce->ibuf + (sce->limit - sce->cur); - DPRINTFN(5, ("ugen_isoc_rintr: throwing away %d bytes\n", - count)); + DPRINTF(("ugen_isoc_rintr: throwing away %d bytes\n", + count)); } isize = UGETW(sce->edesc->wMaxPacketSize); @@ -1427,7 +1427,6 @@ ugen_do_ioctl(struct ugen_softc *sc, int struct iovec iov; struct uio uio; void *ptr = 0; - usbd_status err; int error = 0; if (!(flag & FWRITE)) @@ -1485,6 +1484,11 @@ ugen_do_ioctl(struct ugen_softc *sc, int usbd_fill_deviceinfo(sc->sc_udev, (struct usb_device_info *)addr, 1); break; + case USB_RESET_DEVICE: + err = usbd_reset_device(sc->sc_udev); + if (err) + return EIO; + break; default: return (EINVAL); } Modified: head/sys/dev/usb/usb.h ============================================================================== --- head/sys/dev/usb/usb.h Thu Nov 13 21:11:34 2008 (r184940) +++ head/sys/dev/usb/usb.h Thu Nov 13 21:34:34 2008 (r184941) @@ -699,6 +699,7 @@ struct usb_event { #define USB_GET_DEVICEINFO _IOR ('U', 112, struct usb_device_info) #define USB_SET_SHORT_XFER _IOW ('U', 113, int) #define USB_SET_TIMEOUT _IOW ('U', 114, int) +#define USB_RESET_DEVICE _IO ('U', 115) /* Modem device */ #define USB_GET_CM_OVER_DATA _IOR ('U', 130, int) Modified: head/sys/dev/usb/usb_subr.c ============================================================================== --- head/sys/dev/usb/usb_subr.c Thu Nov 13 21:11:34 2008 (r184940) +++ head/sys/dev/usb/usb_subr.c Thu Nov 13 21:34:34 2008 (r184941) @@ -322,16 +322,10 @@ usbd_delay_ms(usbd_device_handle dev, u_ usbd_status usbd_reset_port(usbd_device_handle dev, int port, usb_port_status_t *ps) { - usb_device_request_t req; usbd_status err; int n; - req.bmRequestType = UT_WRITE_CLASS_OTHER; - req.bRequest = UR_SET_FEATURE; - USETW(req.wValue, UHF_PORT_RESET); - USETW(req.wIndex, port); - USETW(req.wLength, 0); - err = usbd_do_request(dev, &req, 0); + err = usbd_set_port_feature(dev, port, UHF_PORT_RESET); DPRINTFN(1,("usbd_reset_port: port %d reset done, error=%s\n", port, usbd_errstr(err))); if (err) Modified: head/sys/dev/usb/usbdi.c ============================================================================== --- head/sys/dev/usb/usbdi.c Thu Nov 13 21:11:34 2008 (r184940) +++ head/sys/dev/usb/usbdi.c Thu Nov 13 21:34:34 2008 (r184941) @@ -1235,6 +1235,15 @@ usbd_set_polling(usbd_device_handle dev, dev->bus->methods->soft_intr(dev->bus); } +usbd_status +usbd_reset_device(usbd_device_handle dev) +{ + usbd_device_handle parent = dev->myhub; + struct usbd_port *up = dev->powersrc; + + return usbd_reset_port(parent, up->portno, &up->status); +} + usb_endpoint_descriptor_t * usbd_get_endpoint_descriptor(usbd_interface_handle iface, u_int8_t address) Modified: head/sys/dev/usb/usbdi.h ============================================================================== --- head/sys/dev/usb/usbdi.h Thu Nov 13 21:11:34 2008 (r184940) +++ head/sys/dev/usb/usbdi.h Thu Nov 13 21:34:34 2008 (r184941) @@ -160,6 +160,7 @@ usb_endpoint_descriptor_t *usbd_find_ede void usbd_dopoll(usbd_interface_handle); void usbd_set_polling(usbd_device_handle, int); +usbd_status usbd_reset_device(usbd_device_handle); const char *usbd_errstr(usbd_status);