diff options
Diffstat (limited to 'drivers/usb/usb.c')
-rw-r--r-- | drivers/usb/usb.c | 47 |
1 files changed, 24 insertions, 23 deletions
diff --git a/drivers/usb/usb.c b/drivers/usb/usb.c index 213f69036..32d6e519e 100644 --- a/drivers/usb/usb.c +++ b/drivers/usb/usb.c @@ -1595,17 +1595,34 @@ int usb_string(struct usb_device *dev, int index, char *buf, size_t size) tbuf = kmalloc(256, GFP_KERNEL); if (!tbuf) return -ENOMEM; + + /* get langid for strings if it's not yet known */ + if (!dev->have_langid) { + err = usb_get_string(dev, 0, 0, tbuf, 4); + if (err < 0) { + err("error getting string descriptor 0 (error=%d)", err); + goto errout; + } else if (tbuf[0] < 4) { + err("string descriptor 0 too short"); + err = -EINVAL; + goto errout; + } else { + dev->have_langid = -1; + dev->string_langid = tbuf[2] | (tbuf[3]<< 8); + /* always use the first langid listed */ + info("USB device number %d default language ID 0x%x", + dev->devnum, dev->string_langid); + } + } + /* - * is this two step process necessary? can't we just - * ask for a maximum length string and then take the length - * that was returned? + * Just ask for a maximum length string and then take the length + * that was returned. */ - err = usb_get_string(dev, dev->string_langid, index, tbuf, 4); - if (err < 0) - goto errout; - err = usb_get_string(dev, dev->string_langid, index, tbuf, tbuf[0]); + err = usb_get_string(dev, dev->string_langid, index, tbuf, 255); if (err < 0) goto errout; + info("actual string desc. length = %d", err); size--; /* leave room for trailing NULL char in output buffer */ for (idx = 0, u = 2; u < err; u += 2) { @@ -1633,7 +1650,6 @@ int usb_string(struct usb_device *dev, int index, char *buf, size_t size) */ int usb_new_device(struct usb_device *dev) { - unsigned char *buf; int addr, err; int tmp; @@ -1709,21 +1725,6 @@ int usb_new_device(struct usb_device *dev) err("failed to set default configuration"); return -1; } - /* get langid for strings */ - buf = kmalloc(256, GFP_KERNEL); - if (!buf) { - err("out of memory\n"); - } else { - err = usb_get_string(dev, 0, 0, buf, 4); - if (err < 0) { - err("error getting string descriptor 0 (error=%d)\n", err); - } else if (buf[0] < 4) { - err("string descriptpr 0 too short\n"); - } else - dev->string_langid = buf[2] | (buf[3]<< 8); - kfree(buf); - info("USB device number %d default language ID 0x%x", dev->devnum, dev->string_langid); - } if (dev->descriptor.iManufacturer) usb_show_string(dev, "Manufacturer", dev->descriptor.iManufacturer); |