PERFORCE change 153027 for review

Hans Petter Selasky hselasky at FreeBSD.org
Sun Nov 16 03:34:59 PST 2008


http://perforce.freebsd.org/chv.cgi?CH=153027

Change 153027 by hselasky at hselasky_laptop001 on 2008/11/16 11:34:16

	
	Improve USB re-enumeration code.

Affected files ...

.. //depot/projects/usb/src/sys/dev/usb2/core/usb2_request.c#23 edit

Differences ...

==== //depot/projects/usb/src/sys/dev/usb2/core/usb2_request.c#23 (text+ko) ====

@@ -1325,16 +1325,17 @@
 usb2_error_t
 usb2_req_re_enumerate(struct usb2_device *udev, struct mtx *mtx)
 {
-	struct usb2_device_descriptor ddesc;
 	struct usb2_device *parent_hub;
 	usb2_error_t err;
 	uint8_t old_addr;
 
+	if (udev->flags.usb2_mode != USB_MODE_HOST) {
+		return (USB_ERR_INVAL);
+	}
 	old_addr = udev->address;
 	parent_hub = udev->parent_hub;
 	if (parent_hub == NULL) {
-		err = USB_ERR_INVAL;
-		goto done;
+		return (USB_ERR_INVAL);
 	}
 	err = usb2_req_reset_port(parent_hub, mtx, udev->port_no);
 	if (err) {
@@ -1347,6 +1348,9 @@
 	 */
 	udev->address = USB_START_ADDR;
 
+	/* reset "bMaxPacketSize" */
+	udev->ddesc.bMaxPacketSize = USB_MAX_IPACKET;
+
 	/*
 	 * Restore device address:
 	 */
@@ -1364,7 +1368,15 @@
 	usb2_pause_mtx(mtx, USB_SET_ADDRESS_SETTLE);
 
 	/* get the device descriptor */
-	err = usb2_req_get_device_desc(udev, mtx, &ddesc);
+	err = usb2_req_get_desc(udev, mtx, &udev->ddesc,
+	    USB_MAX_IPACKET, USB_MAX_IPACKET, 0, UDESC_DEVICE, 0, 0);
+	if (err) {
+		DPRINTFN(0, "getting device descriptor "
+		    "at addr %d failed!\n", udev->address);
+		goto done;
+	}
+	/* get the full device descriptor */
+	err = usb2_req_get_device_desc(udev, mtx, &udev->ddesc);
 	if (err) {
 		DPRINTFN(0, "addr=%d, getting device "
 		    "descriptor failed!\n", old_addr);


More information about the p4-projects mailing list