Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 23 Oct 2008 16:06:38 GMT
From:      Hans Petter Selasky <hselasky@FreeBSD.org>
To:        Perforce Change Reviews <perforce@FreeBSD.org>
Subject:   PERFORCE change 151812 for review
Message-ID:  <200810231606.m9NG6ck3036060@repoman.freebsd.org>

next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=151812

Change 151812 by hselasky@hselasky_laptop001 on 2008/10/23 16:06:30

	
	Some fixes for LibUSB v0.1.12 compat layer.

Affected files ...

.. //depot/projects/usb/src/lib/libusb20/libusb20.c#4 edit
.. //depot/projects/usb/src/lib/libusb20/libusb20_compat01.c#2 edit

Differences ...

==== //depot/projects/usb/src/lib/libusb20/libusb20.c#4 (text+ko) ====

@@ -661,7 +661,12 @@
 	 * We need to read the USB string in two steps else some USB
 	 * devices will complain.
 	 */
-	req.wValue = (256 * LIBUSB20_DT_STRING) | index;
+	req.bmRequestType =
+	    LIBUSB20_REQUEST_TYPE_STANDARD |
+	    LIBUSB20_RECIPIENT_DEVICE |
+	    LIBUSB20_ENDPOINT_IN;
+	req.bRequest = LIBUSB20_REQUEST_GET_DESCRIPTOR;
+	req.wValue = (LIBUSB20_DT_STRING << 8) | index;
 	req.wIndex = langid;
 	req.wLength = 4;		/* bytes */
 
@@ -702,10 +707,16 @@
 
 	/* the following code derives from the FreeBSD USB kernel */
 
-	if (len < 1) {
+	if ((len < 1) || (ptr == NULL)) {
 		/* too short buffer */
 		return (LIBUSB20_ERROR_INVALID_PARAM);
 	}
+	/*
+	 * Make sure that there is sensible contents in the buffer in case
+	 * of an error:
+	 */
+	*(uint8_t *)ptr = 0;
+
 	error = libusb20_dev_req_string_sync(pdev,
 	    0, 0, temp, sizeof(temp));
 	if (error < 0)

==== //depot/projects/usb/src/lib/libusb20/libusb20_compat01.c#2 (text+ko) ====

@@ -213,7 +213,7 @@
 	if (err)
 		return (-1);
 
-	return (0);
+	return (strlen(buf));
 }
 
 int
@@ -340,11 +340,12 @@
 		bifc->bDescriptorType = aifc->desc.bDescriptorType;
 		bifc->bInterfaceNumber = aifc->desc.bInterfaceNumber;
 		bifc->bAlternateSetting = aifc->desc.bAlternateSetting;
-		bifc->bNumEndpoints = aifc->desc.bNumEndpoints;
+		bifc->bNumEndpoints = aifc->num_endpoints;
 		bifc->bInterfaceClass = aifc->desc.bInterfaceClass;
 		bifc->bInterfaceSubClass = aifc->desc.bInterfaceSubClass;
 		bifc->bInterfaceProtocol = aifc->desc.bInterfaceProtocol;
 		bifc->iInterface = aifc->desc.iInterface;
+		bifc->endpoint = ps->b.currep;
 	}
 	for (x = 0; x != aifc->num_endpoints; x++) {
 		ps->a.currep = aifc->endpoints + x;
@@ -365,13 +366,14 @@
 
 	aifc = ps->a.currifc;
 	bifc = ps->b.currifcw++;
-	usb_parse_iface_sub(ps);
 
 	if (ps->preparse == 0) {
 		/* initialise interface wrapper */
 		bifc->altsetting = ps->b.currifc;
 		bifc->num_altsetting = aifc->num_altsetting + 1;
 	}
+	usb_parse_iface_sub(ps);
+
 	for (x = 0; x != aifc->num_altsetting; x++) {
 		ps->a.currifc = aifc->altsetting + x;
 		usb_parse_iface_sub(ps);
@@ -780,6 +782,7 @@
 	struct usb_device *udev;
 	struct LIBUSB20_DEVICE_DESC_DECODED *ddesc;
 	struct libusb20_backend *pold;
+	int err;
 
 	/* cleanup after last device search */
 
@@ -852,6 +855,12 @@
 		udev->dev = pdev;
 		pdev->priv01Data = udev;
 
+		err = libusb20_dev_open(pdev, 0);
+		if (err == 0) {
+			/* XXX get all config descriptors by default */
+			usb_fetch_and_parse_descriptors((void *)pdev);
+			libusb20_dev_close(pdev);
+		}
 		LIST_ADD(usb_global_bus.devices, udev);
 	}
 



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