Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 22 Mar 2009 06:37:14 +0000 (UTC)
From:      Nick Hibma <n_hibma@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-7@freebsd.org
Subject:   svn commit: r190251 - stable/7/sys/dev/usb
Message-ID:  <200903220637.n2M6bEfW059785@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: n_hibma
Date: Sun Mar 22 06:37:14 2009
New Revision: 190251
URL: http://svn.freebsd.org/changeset/base/190251

Log:
  MFC 184941:
  
     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:
  stable/7/sys/dev/usb/ugen.c
  stable/7/sys/dev/usb/usb.h
  stable/7/sys/dev/usb/usb_subr.c
  stable/7/sys/dev/usb/usbdi.c
  stable/7/sys/dev/usb/usbdi.h

Modified: stable/7/sys/dev/usb/ugen.c
==============================================================================
--- stable/7/sys/dev/usb/ugen.c	Sun Mar 22 06:31:59 2009	(r190250)
+++ stable/7/sys/dev/usb/ugen.c	Sun Mar 22 06:37:14 2009	(r190251)
@@ -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: stable/7/sys/dev/usb/usb.h
==============================================================================
--- stable/7/sys/dev/usb/usb.h	Sun Mar 22 06:31:59 2009	(r190250)
+++ stable/7/sys/dev/usb/usb.h	Sun Mar 22 06:37:14 2009	(r190251)
@@ -697,6 +697,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: stable/7/sys/dev/usb/usb_subr.c
==============================================================================
--- stable/7/sys/dev/usb/usb_subr.c	Sun Mar 22 06:31:59 2009	(r190250)
+++ stable/7/sys/dev/usb/usb_subr.c	Sun Mar 22 06:37:14 2009	(r190251)
@@ -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)
@@ -685,11 +679,11 @@ usbd_set_config_index(usbd_device_handle
 		DPRINTF(("power exceeded %d %d\n", power,dev->powersrc->power));
 		/* XXX print nicer message. */
 		if (msg)
-			printf("%s: device addr %d (config %d) exceeds power "
-				 "budget, %d mA > %d mA\n",
-			       device_get_nameunit(dev->bus->bdev), dev->address,
-			       cdp->bConfigurationValue,
-			       power, dev->powersrc->power);
+			device_printf(dev->bus->bdev,
+				      "device addr %d (config %d) exceeds "
+				      "power budget, %d mA > %d mA\n",
+				      dev->address, cdp->bConfigurationValue,
+				      power, dev->powersrc->power);
 		err = USBD_NO_POWER;
 		goto bad;
 	}
@@ -1023,8 +1017,7 @@ usbd_new_device(device_t parent, usbd_bu
 		 bus, port, depth, speed));
 	addr = usbd_getnewaddr(bus);
 	if (addr < 0) {
-		printf("%s: No free USB addresses, new device ignored.\n",
-		       device_get_nameunit(bus->bdev));
+		device_printf(bus->bdev, "No free USB addresses\n");
 		return (USBD_NO_ADDR);
 	}
 
@@ -1370,11 +1363,14 @@ usb_disconnect_port(struct usbd_port *up
 	if (dev->subdevs != NULL) {
 		DPRINTFN(3,("usb_disconnect_port: disconnect subdevs\n"));
 		for (i = 0; dev->subdevs[i]; i++) {
-			printf("%s: at %s", device_get_nameunit(dev->subdevs[i]),
-			       hubname);
-			if (up->portno != 0)
-				printf(" port %d", up->portno);
-			printf(" (addr %d) disconnected\n", dev->address);
+			if (!device_is_quiet(dev->subdevs[i])) {
+				device_printf(dev->subdevs[i],
+						  "at %s", hubname);
+				if (up->portno != 0)
+					printf(" port %d", up->portno);
+				printf(" (addr %d) disconnected\n", dev->address);
+			}
+
 			struct usb_attach_arg *uaap =
 			    device_get_ivars(dev->subdevs[i]);
 			device_detach(dev->subdevs[i]);

Modified: stable/7/sys/dev/usb/usbdi.c
==============================================================================
--- stable/7/sys/dev/usb/usbdi.c	Sun Mar 22 06:31:59 2009	(r190250)
+++ stable/7/sys/dev/usb/usbdi.c	Sun Mar 22 06:37:14 2009	(r190251)
@@ -1230,6 +1230,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: stable/7/sys/dev/usb/usbdi.h
==============================================================================
--- stable/7/sys/dev/usb/usbdi.h	Sun Mar 22 06:31:59 2009	(r190250)
+++ stable/7/sys/dev/usb/usbdi.h	Sun Mar 22 06:37:14 2009	(r190251)
@@ -158,6 +158,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);
 



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200903220637.n2M6bEfW059785>