On Tue, Mar 30, Greg KH wrote:

> On Tue, Mar 30, 2004 at 08:15:52PM +0200, Olaf Hering wrote:
> > 
> > No. make it static. Always.
> 
> How about adding a patch that does this to your tree and see if any of
> your users's devices break?  If such a patch lives successfully in a
> distro patch for a release cycle or two, I'd be willing to add it to the
> main kernel tree.
> 
> Sound good?

This one seems to work good enough.
Do you see any obvious technical problems with it?


diff -purNX /kernel_exclude.txt 
linux-2.6.5-rc3-olh-usb.orig/drivers/usb/core/driverfs.c 
linux-2.6.5-rc3-olh-usb/drivers/usb/core/driverfs.c
--- linux-2.6.5-rc3-olh-usb.orig/drivers/usb/core/driverfs.c    2004-03-31 
11:17:44.000000000 +0000
+++ linux-2.6.5-rc3-olh-usb/drivers/usb/core/driverfs.c 2004-03-31 15:59:32.000000000 
+0000
@@ -70,7 +70,9 @@ static ssize_t  show_##name(struct devic
        int len;                                                        \
                                                                        \
        udev = to_usb_device (dev);                                     \
-       len = usb_string(udev, udev->descriptor.field, buf, PAGE_SIZE); \
+       if (!udev->field)                                               \
+               return 0;                                               \
+       len = snprintf(buf, 256, "%s", udev->field);                    \
        if (len < 0)                                                    \
                return 0;                                               \
        buf[len] = '\n';                                                \
@@ -79,9 +81,9 @@ static ssize_t  show_##name(struct devic
 }                                                                      \
 static DEVICE_ATTR(name, S_IRUGO, show_##name, NULL);
 
-usb_string_attr(product, iProduct);
-usb_string_attr(manufacturer, iManufacturer);
-usb_string_attr(serial, iSerialNumber);
+usb_string_attr(product, static_product); /* iProduct); */
+usb_string_attr(manufacturer, static_vendor); /* iManufacturer); */
+usb_string_attr(serial, static_serial); /* iSerialNumber); */
 
 static ssize_t
 show_speed (struct device *dev, char *buf)
diff -purNX /kernel_exclude.txt linux-2.6.5-rc3-olh-usb.orig/drivers/usb/core/usb.c 
linux-2.6.5-rc3-olh-usb/drivers/usb/core/usb.c
--- linux-2.6.5-rc3-olh-usb.orig/drivers/usb/core/usb.c 2004-03-31 11:17:44.000000000 
+0000
+++ linux-2.6.5-rc3-olh-usb/drivers/usb/core/usb.c      2004-03-31 15:30:00.000000000 
+0000
@@ -992,6 +992,12 @@ void usb_disconnect(struct usb_device **
                clear_bit(dev->devnum, dev->bus->devmap.devicemap);
                usbfs_remove_device(dev);
        }
+       if (dev->static_vendor)
+               kfree(dev->static_vendor);
+       if (dev->static_product)
+               kfree(dev->static_product);
+       if (dev->static_serial)
+               kfree(dev->static_serial);
        up(&dev->serialize);
        device_unregister(&dev->dev);
 }
@@ -1057,6 +1063,20 @@ static inline void usb_show_string(struc
        kfree(buf);
 }
 
+static void usb_add_static_info(struct usb_device *dev, char *id, int index, char 
**info)
+{
+       char *buf;
+       if (!index)
+               return;
+       if (!(buf = kmalloc(256, GFP_KERNEL)))
+               return;
+       if (usb_string(dev, index, buf, 256) > 0) {
+               *info = buf;
+               dev_printk(KERN_INFO, &dev->dev, "%s: %s\n", id, buf);
+       }
+       return;
+}
+
 /*
  * By the time we get here, we chose a new device address
  * and is in the default state. We need to identify the thing and
@@ -1155,14 +1175,12 @@ int usb_new_device(struct usb_device *de
        dev_dbg(&dev->dev, "new device strings: Mfr=%d, Product=%d, SerialNumber=%d\n",
                dev->descriptor.iManufacturer, dev->descriptor.iProduct, 
dev->descriptor.iSerialNumber);
 
-#ifdef DEBUG
        if (dev->descriptor.iProduct)
-               usb_show_string(dev, "Product", dev->descriptor.iProduct);
+               usb_add_static_info(dev, "Product", dev->descriptor.iProduct, 
&dev->static_vendor);
        if (dev->descriptor.iManufacturer)
-               usb_show_string(dev, "Manufacturer", dev->descriptor.iManufacturer);
+               usb_add_static_info(dev, "Manufacturer", 
dev->descriptor.iManufacturer, &dev->static_product);
        if (dev->descriptor.iSerialNumber)
-               usb_show_string(dev, "SerialNumber", dev->descriptor.iSerialNumber);
-#endif
+               usb_add_static_info(dev, "SerialNumber", 
dev->descriptor.iSerialNumber, &dev->static_serial);
 
        /* put device-specific files into sysfs */
        err = device_add (&dev->dev);
diff -purNX /kernel_exclude.txt linux-2.6.5-rc3-olh-usb.orig/include/linux/usb.h 
linux-2.6.5-rc3-olh-usb/include/linux/usb.h
--- linux-2.6.5-rc3-olh-usb.orig/include/linux/usb.h    2004-03-31 11:17:45.000000000 
+0000
+++ linux-2.6.5-rc3-olh-usb/include/linux/usb.h 2004-03-31 14:47:39.000000000 +0000
@@ -301,6 +301,9 @@ struct usb_device {
 
        int maxchild;                   /* Number of ports if hub */
        struct usb_device *children[USB_MAXCHILDREN];
+       char *static_vendor;
+       char *static_product;
+       char *static_serial;
 };
 #define        to_usb_device(d) container_of(d, struct usb_device, dev)
 

-- 
USB is for mice, FireWire is for men!

sUse lINUX ag, nÃRNBERG


-------------------------------------------------------
This SF.Net email is sponsored by: IBM Linux Tutorials
Free Linux tutorial presented by Daniel Robbins, President and CEO of
GenToo technologies. Learn everything from fundamentals to system
administration.http://ads.osdn.com/?ad_id70&alloc_id638&op=click
_______________________________________________
[EMAIL PROTECTED]
To unsubscribe, use the last form field at:
https://lists.sourceforge.net/lists/listinfo/linux-usb-devel

Reply via email to