Greg:

This patch fixes the problem recently brought up about transferring data 
into the device descriptor structure.

The usb_get_device_descriptor() routine isn't used outside the core, and
the patch adds a "size" argument, making it a little awkward for general
use.  So I decided to stop exporting it.  If a driver really _needs_ to
read the device descriptor directly from the device, instead of just
taking the value stored in the usb_device structure, it can call
usb_get_descriptor().

This is ready to be applied.

Alan Stern


--- 2.6/drivers/usb/core/usb.h.orig     Wed Jan 21 12:18:38 2004
+++ 2.6/drivers/usb/core/usb.h  Wed Jan 21 12:23:14 2004
@@ -14,3 +14,6 @@
                struct usb_endpoint_descriptor *epd);
 extern void usb_enable_interface (struct usb_device *dev,
                struct usb_interface *intf);
+
+extern int usb_get_device_descriptor(struct usb_device *dev,
+               unsigned int size);
--- 2.6/drivers/usb/core/message.c.orig Wed Jan 21 11:55:42 2004
+++ 2.6/drivers/usb/core/message.c      Wed Jan 21 12:27:33 2004
@@ -546,10 +546,10 @@
  *
  * Gets a USB descriptor.  Convenience functions exist to simplify
  * getting some types of descriptors.  Use
- * usb_get_device_descriptor() for USB_DT_DEVICE,
+ * usb_get_device_descriptor() for USB_DT_DEVICE (not exported),
  * and usb_get_string() or usb_string() for USB_DT_STRING.
- * Configuration descriptors (USB_DT_CONFIG) are part of the device
- * structure, at least for the current configuration.
+ * Device (USB_DT_DEVICE) and configuration descriptors (USB_DT_CONFIG)
+ * are part of the device structure.
  * In addition to a number of USB-standard descriptors, some
  * devices also use class-specific or vendor-specific descriptors.
  *
@@ -626,16 +626,26 @@
  * Returns the number of bytes received on success, or else the status code
  * returned by the underlying usb_control_msg() call.
  */
-int usb_get_device_descriptor(struct usb_device *dev)
+int usb_get_device_descriptor(struct usb_device *dev, unsigned int size)
 {
-       int ret = usb_get_descriptor(dev, USB_DT_DEVICE, 0, &dev->descriptor,
-                                    sizeof(dev->descriptor));
+       struct usb_device_descriptor *desc;
+       int ret;
+
+       if (size > sizeof(*desc))
+               return -EINVAL;
+       desc = kmalloc(sizeof(*desc), GFP_KERNEL);
+       if (!desc)
+               return -ENOMEM;
+
+       ret = usb_get_descriptor(dev, USB_DT_DEVICE, 0, desc, size);
        if (ret >= 0) {
-               le16_to_cpus(&dev->descriptor.bcdUSB);
-               le16_to_cpus(&dev->descriptor.idVendor);
-               le16_to_cpus(&dev->descriptor.idProduct);
-               le16_to_cpus(&dev->descriptor.bcdDevice);
+               le16_to_cpus(&desc->bcdUSB);
+               le16_to_cpus(&desc->idVendor);
+               le16_to_cpus(&desc->idProduct);
+               le16_to_cpus(&desc->bcdDevice);
+               memcpy(&dev->descriptor, desc, size);
        }
+       kfree(desc);
        return ret;
 }
 
@@ -1245,7 +1255,6 @@
 
 // synchronous control message convenience routines
 EXPORT_SYMBOL(usb_get_descriptor);
-EXPORT_SYMBOL(usb_get_device_descriptor);
 EXPORT_SYMBOL(usb_get_status);
 EXPORT_SYMBOL(usb_get_string);
 EXPORT_SYMBOL(usb_string);
--- 2.6/drivers/usb/core/hub.c.orig     Wed Jan 21 12:06:49 2004
+++ 2.6/drivers/usb/core/hub.c  Wed Jan 21 12:16:06 2004
@@ -1041,13 +1041,9 @@
                /* cope with hardware quirkiness:
                 *  - let SET_ADDRESS settle, some device hardware wants it
                 *  - read ep0 maxpacket even for high and low speed,
-                *
-                * FIXME assumes device->descriptor cacheline is dma-coherent
-                * and so does usb_get_device_descriptor
                 */
                wait_ms(10);
-               retval = usb_get_descriptor(dev, USB_DT_DEVICE, 0,
-                               &dev->descriptor, 8);
+               retval = usb_get_device_descriptor(dev, 8);
                if (retval >= 8)
                        break;
                wait_ms(100);
@@ -1069,8 +1065,8 @@
                dev->epmaxpacketout[0] = dev->descriptor.bMaxPacketSize0;
        }
   
-       retval = usb_get_device_descriptor(dev);
-       if (retval < (signed)sizeof(dev->descriptor)) {
+       retval = usb_get_device_descriptor(dev, sizeof(dev->descriptor));
+       if (retval != sizeof(dev->descriptor)) {
                dev_err(&dev->dev, "device descriptor read/%s, error %d\n",
                        "all", retval);
                goto fail;
--- 2.6/drivers/usb/core/hcd.c.orig     Wed Jan 21 12:14:30 2004
+++ 2.6/drivers/usb/core/hcd.c  Wed Jan 21 12:15:18 2004
@@ -751,7 +751,8 @@
        usb_dev->state = USB_STATE_ADDRESS;
 
        usb_dev->epmaxpacketin[0] = usb_dev->epmaxpacketout[0] = 64;
-       retval = usb_get_device_descriptor(usb_dev);
+       retval = usb_get_device_descriptor(usb_dev,
+                       sizeof usb_dev->descriptor);
        if (retval != sizeof usb_dev->descriptor) {
                dev_err (parent_dev, "can't read %s device descriptor %d\n",
                                usb_dev->dev.bus_id, retval);
--- 2.6/include/linux/usb.h.orig        Wed Jan 21 12:16:43 2004
+++ 2.6/include/linux/usb.h     Wed Jan 21 12:18:07 2004
@@ -862,7 +862,6 @@
 /* wrappers around usb_control_msg() for the most common standard requests */
 extern int usb_get_descriptor(struct usb_device *dev, unsigned char desctype,
        unsigned char descindex, void *buf, int size);
-extern int usb_get_device_descriptor(struct usb_device *dev);
 extern int usb_get_status(struct usb_device *dev,
        int type, int target, void *data);
 extern int usb_get_string(struct usb_device *dev,



-------------------------------------------------------
The SF.Net email is sponsored by EclipseCon 2004
Premiere Conference on Open Tools Development and Integration
See the breadth of Eclipse activity. February 3-5 in Anaheim, CA.
http://www.eclipsecon.org/osdn
_______________________________________________
[EMAIL PROTECTED]
To unsubscribe, use the last form field at:
https://lists.sourceforge.net/lists/listinfo/linux-usb-devel

Reply via email to