svn commit: r184941 - head/sys/dev/usb

Nick Hibma n_hibma at FreeBSD.org
Thu Nov 13 13:34:35 PST 2008


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);
 


More information about the svn-src-all mailing list