? sys/dev/usb/cscope.out Index: sys/dev/usb/usb.c =================================================================== RCS file: /cvsroot/src/sys/dev/usb/usb.c,v retrieving revision 1.160 diff -u -p -r1.160 usb.c --- sys/dev/usb/usb.c 29 Oct 2015 00:15:48 -0000 1.160 +++ sys/dev/usb/usb.c 5 Jan 2016 09:43:07 -0000 @@ -947,7 +947,7 @@ usbd_add_dev_event(int type, usbd_device { struct usb_event *ue = usb_alloc_event(); - usbd_fill_deviceinfo(udev, &ue->u.ue_device, USB_EVENT_IS_ATTACH(type)); + usbd_fill_deviceinfo(udev, &ue->u.ue_device, false); usb_add_event(type, ue); } Index: sys/dev/usb/usb_subr.c =================================================================== RCS file: /cvsroot/src/sys/dev/usb/usb_subr.c,v retrieving revision 1.206 diff -u -p -r1.206 usb_subr.c --- sys/dev/usb/usb_subr.c 10 Dec 2015 09:19:42 -0000 1.206 +++ sys/dev/usb/usb_subr.c 5 Jan 2016 09:43:08 -0000 @@ -170,6 +170,41 @@ usbd_trim_spaces(char *p) *e = '\0'; /* kill trailing spaces */ } +static void +usbd_get_device_string(struct usbd_device *ud, uByte index, char **buf) +{ + char *b = kmem_alloc(USB_MAX_ENCODED_STRING_LEN, KM_SLEEP); + if (b) { + usbd_status err = usbd_get_string0(ud, index, b, true); + if (err != USBD_NORMAL_COMPLETION) { + kmem_free(b, USB_MAX_ENCODED_STRING_LEN); + b = NULL; + } else { + usbd_trim_spaces(b); + } + } + *buf = b; +} + +void +usbd_get_device_strings(struct usbd_device *ud) +{ + usb_device_descriptor_t *udd = &ud->ddesc; + + usbd_get_device_string(ud, udd->iManufacturer, &ud->ud_vendor); + usbd_get_device_string(ud, udd->iProduct, &ud->ud_product); + usbd_get_device_string(ud, udd->iSerialNumber, &ud->ud_serial); + + if (ud->ud_vendor == NULL) { + /* Create one with "vendor 0x%04x", UGETW(udd->idVendor) */ + } + if (ud->ud_product == NULL) { + /* Create one with "product 0x%04x", UGETW(udd->idProduct) */ + } + +} + + Static void usbd_devinfo_vp(usbd_device_handle dev, char *v, size_t vl, char *p, size_t pl, int usedev, int useencoded) @@ -793,19 +828,10 @@ usbd_attach_roothub(device_t parent, usb static void usbd_serialnumber(device_t dv, usbd_device_handle dev) { - usb_device_descriptor_t *dd = &dev->ddesc; - char *serialnumber; - - serialnumber = malloc(USB_MAX_ENCODED_STRING_LEN, M_USB, M_NOWAIT); - if (serialnumber == NULL) - return; - serialnumber[0] = '\0'; - (void)usbd_get_string(dev, dd->iSerialNumber, serialnumber); - if (serialnumber[0]) { + if (dev->ud_serial) { prop_dictionary_set_cstring(device_properties(dv), - "serialnumber", serialnumber); + "serialnumber", dev->ud_serial); } - free(serialnumber, M_USB); } static usbd_status @@ -1281,6 +1307,8 @@ usbd_new_device(device_t parent, usbd_bu DPRINTF("new dev (addr %d), dev=%p, parent=%p", addr, dev, parent, 0); + usbd_get_device_strings(dev); + usbd_add_dev_event(USB_EVENT_DEVICE_ATTACH, dev); if (port == 0) { /* root hub */ @@ -1341,6 +1369,7 @@ usbd_print(void *aux, const char *pnp) if (!uaa->usegeneric) return (QUIET); devinfo = malloc(USB_DEVINFO, M_TEMP, M_WAITOK); + /* XXXNH */ usbd_devinfo(uaa->device, 1, devinfo, USB_DEVINFO); aprint_normal("%s, %s", devinfo, pnp); free(devinfo, M_TEMP); @@ -1398,14 +1427,31 @@ usbd_fill_deviceinfo(usbd_device_handle di->udi_bus = device_unit(dev->bus->usbctl); di->udi_addr = dev->address; di->udi_cookie = dev->cookie; - usbd_devinfo_vp(dev, di->udi_vendor, sizeof(di->udi_vendor), - di->udi_product, sizeof(di->udi_product), usedev, 1); - usbd_printBCD(di->udi_release, sizeof(di->udi_release), - UGETW(dev->ddesc.bcdDevice)); - di->udi_serial[0] = 0; - if (usedev) + if (usedev) { + usbd_devinfo_vp(dev, di->udi_vendor, sizeof(di->udi_vendor), + di->udi_product, sizeof(di->udi_product), true, 1); + (void)usbd_get_string(dev, dev->ddesc.iSerialNumber, di->udi_serial); + } else { + di->udi_vendor[0] = 0; + di->udi_product[0] = 0; + di->udi_serial[0] = 0; + if (dev->ud_vendor) { + strlcpy(di->udi_vendor, dev->ud_vendor, + sizeof(di->udi_vendor)); + } + if (dev->ud_product) { + strlcpy(di->udi_product, dev->ud_product, + sizeof(di->udi_product)); + } + if (dev->ud_serial) { + strlcpy(di->udi_serial, dev->ud_serial, + sizeof(di->udi_serial)); + } + } + usbd_printBCD(di->udi_release, sizeof(di->udi_release), + UGETW(dev->ddesc.bcdDevice)); di->udi_vendorNo = UGETW(dev->ddesc.idVendor); di->udi_productNo = UGETW(dev->ddesc.idProduct); di->udi_releaseNo = UGETW(dev->ddesc.bcdDevice); @@ -1546,6 +1592,15 @@ usb_free_device(usbd_device_handle dev) free(dev->subdevs, M_USB); dev->subdevlen = 0; } + if (dev->ud_vendor) { + kmem_free(dev->ud_vendor, USB_MAX_ENCODED_STRING_LEN); + } + if (dev->ud_product) { + kmem_free(dev->ud_product, USB_MAX_ENCODED_STRING_LEN); + } + if (dev->ud_serial) { + kmem_free(dev->ud_serial, USB_MAX_ENCODED_STRING_LEN); + } free(dev, M_USB); } Index: sys/dev/usb/usbdivar.h =================================================================== RCS file: /cvsroot/src/sys/dev/usb/usbdivar.h,v retrieving revision 1.110 diff -u -p -r1.110 usbdivar.h --- sys/dev/usb/usbdivar.h 23 Aug 2015 11:12:01 -0000 1.110 +++ sys/dev/usb/usbdivar.h 5 Jan 2016 09:43:08 -0000 @@ -197,6 +197,10 @@ struct usbd_device { device_t *subdevs; /* sub-devices */ int nifaces_claimed; /* number of ifaces in use */ void *hci_private; + + char *ud_serial; /* serial number, can be NULL */ + char *ud_vendor; /* vendor string, can be NULL */ + char *ud_product; /* product string can be NULL */ }; struct usbd_interface { @@ -286,6 +290,7 @@ void usbd_dump_pipe(usbd_pipe_handle pip /* Routines from usb_subr.c */ int usbctlprint(void *, const char *); +void usbd_get_device_strings(struct usbd_device *); void usb_delay_ms_locked(usbd_bus_handle, u_int, kmutex_t *); void usb_delay_ms(usbd_bus_handle, u_int); void usbd_delay_ms_locked(usbd_device_handle, u_int, kmutex_t *); Index: sys/dev/usb/xhci.c =================================================================== RCS file: /cvsroot/src/sys/dev/usb/xhci.c,v retrieving revision 1.32 diff -u -p -r1.32 xhci.c --- sys/dev/usb/xhci.c 10 Dec 2015 17:07:07 -0000 1.32 +++ sys/dev/usb/xhci.c 5 Jan 2016 09:43:13 -0000 @@ -1614,6 +1614,8 @@ xhci_new_device(device_t parent, usbd_bu dd->bMaxPacketSize, dd->bLength, dd->bNumConfigurations, dev->speed); + usbd_get_device_strings(dev); + usbd_add_dev_event(USB_EVENT_DEVICE_ATTACH, dev); if ((depth == 0) && (port == 0)) {