From 3d7b880e84dc48c67cf00008f1aa19d467a8db25 Mon Sep 17 00:00:00 2001 From: thompsa Date: Wed, 27 May 2009 23:12:02 +0000 Subject: Allocate the usb serial, manufacturer and product strings rather than use char arrays in the usb_device struct. This also eliminates USB_HAVE_STRINGS. --- sys/dev/usb/usb_core.h | 8 --- sys/dev/usb/usb_device.c | 140 +++++++++++++++------------------------------- sys/dev/usb/usb_device.h | 8 +-- sys/dev/usb/usb_generic.c | 11 +--- sys/dev/usb/usb_hub.c | 4 -- sys/dev/usb/usb_util.c | 4 -- 6 files changed, 51 insertions(+), 124 deletions(-) (limited to 'sys/dev/usb') diff --git a/sys/dev/usb/usb_core.h b/sys/dev/usb/usb_core.h index 5c4fde8..8a7e021 100644 --- a/sys/dev/usb/usb_core.h +++ b/sys/dev/usb/usb_core.h @@ -57,14 +57,6 @@ #endif /* - * The following macro defines if the code shall support any forms of - * ASCII strings. - */ -#ifndef USB_HAVE_STRINGS -#define USB_HAVE_STRINGS 1 -#endif - -/* * The following macro defines if the code shall support BUS-DMA. */ #ifndef USB_HAVE_BUSDMA diff --git a/sys/dev/usb/usb_device.c b/sys/dev/usb/usb_device.c index c1dde23..d201a65 100644 --- a/sys/dev/usb/usb_device.c +++ b/sys/dev/usb/usb_device.c @@ -71,9 +71,7 @@ static void usb2_suspend_resume_sub(struct usb2_device *, device_t, uint8_t); static void usb2_clear_stall_proc(struct usb2_proc_msg *_pm); usb2_error_t usb2_config_parse(struct usb2_device *, uint8_t, uint8_t); -#if USB_HAVE_STRINGS -static void usb2_check_strings(struct usb2_device *); -#endif +static void usb2_set_device_strings(struct usb2_device *); #if USB_HAVE_UGEN static void usb2_notify_addq(const char *type, struct usb2_device *); static void usb2_fifo_free_wrap(struct usb2_device *, uint8_t, uint8_t); @@ -1676,32 +1674,8 @@ usb2_alloc_device(device_t parent_dev, struct usb2_bus *bus, /* assume 100mA bus powered for now. Changed when configured. */ udev->power = USB_MIN_POWER; - -#if USB_HAVE_STRINGS - /* get serial number string */ - err = usb2_req_get_string_any - (udev, NULL, (char *)scratch_ptr, - scratch_size, udev->ddesc.iSerialNumber); - - strlcpy(udev->serial, (char *)scratch_ptr, sizeof(udev->serial)); - - /* get manufacturer string */ - err = usb2_req_get_string_any - (udev, NULL, (char *)scratch_ptr, - scratch_size, udev->ddesc.iManufacturer); - - strlcpy(udev->manufacturer, (char *)scratch_ptr, sizeof(udev->manufacturer)); - - /* get product string */ - err = usb2_req_get_string_any - (udev, NULL, (char *)scratch_ptr, - scratch_size, udev->ddesc.iProduct); - - strlcpy(udev->product, (char *)scratch_ptr, sizeof(udev->product)); - - /* finish up all the strings */ - usb2_check_strings(udev); -#endif + /* fetch the vendor and product strings from the device */ + usb2_set_device_strings(udev); if (udev->flags.usb_mode == USB_MODE_HOST) { uint8_t config_index; @@ -2113,11 +2087,7 @@ usb2_devinfo(struct usb2_device *udev, char *dst_ptr, uint16_t dst_len) if (udd->bDeviceClass != 0xFF) { snprintf(dst_ptr, dst_len, "%s %s, class %d/%d, rev %x.%02x/" "%x.%02x, addr %d", -#if USB_HAVE_STRINGS udev->manufacturer, udev->product, -#else - "-", "-", -#endif udd->bDeviceClass, udd->bDeviceSubClass, (bcdUSB >> 8), bcdUSB & 0xFF, (bcdDevice >> 8), bcdDevice & 0xFF, @@ -2125,18 +2095,13 @@ usb2_devinfo(struct usb2_device *udev, char *dst_ptr, uint16_t dst_len) } else { snprintf(dst_ptr, dst_len, "%s %s, rev %x.%02x/" "%x.%02x, addr %d", -#if USB_HAVE_STRINGS udev->manufacturer, udev->product, -#else - "-", "-", -#endif (bcdUSB >> 8), bcdUSB & 0xFF, (bcdDevice >> 8), bcdDevice & 0xFF, udev->address); } } -#if USB_HAVE_STRINGS #if USB_VERBOSE /* * Descriptions of of known vendors and devices ("products"). @@ -2155,85 +2120,74 @@ struct usb_knowndev { #include "usbdevs_data.h" #endif /* USB_VERBOSE */ -/*------------------------------------------------------------------------* - * usb2_check_strings - * - * This function checks the manufacturer and product strings and will - * fill in defaults for missing strings. - *------------------------------------------------------------------------*/ static void -usb2_check_strings(struct usb2_device *udev) +usb2_set_device_strings(struct usb2_device *udev) { struct usb2_device_descriptor *udd = &udev->ddesc; - const char *vendor; - const char *product; - #if USB_VERBOSE const struct usb_knowndev *kdp; - #endif + char temp[64]; uint16_t vendor_id; uint16_t product_id; - usb2_trim_spaces(udev->manufacturer); - usb2_trim_spaces(udev->product); + vendor_id = UGETW(udd->idVendor); + product_id = UGETW(udd->idProduct); - if (udev->manufacturer[0]) { - vendor = udev->manufacturer; - } else { - vendor = NULL; - } + /* get serial number string */ + bzero(temp, sizeof(temp)); + usb2_req_get_string_any(udev, NULL, temp, sizeof(temp), + udev->ddesc.iSerialNumber); + udev->serial = strdup(temp, M_USB); - if (udev->product[0]) { - product = udev->product; - } else { - product = NULL; - } + /* get manufacturer string */ + bzero(temp, sizeof(temp)); + usb2_req_get_string_any(udev, NULL, temp, sizeof(temp), + udev->ddesc.iManufacturer); + usb2_trim_spaces(temp); + if (temp[0] != '\0') + udev->manufacturer = strdup(temp, M_USB); - vendor_id = UGETW(udd->idVendor); - product_id = UGETW(udd->idProduct); + /* get product string */ + bzero(temp, sizeof(temp)); + usb2_req_get_string_any(udev, NULL, temp, sizeof(temp), + udev->ddesc.iProduct); + usb2_trim_spaces(temp); + if (temp[0] != '\0') + udev->product = strdup(temp, M_USB); #if USB_VERBOSE - if (vendor == NULL || product == NULL) { - - for (kdp = usb_knowndevs; - kdp->vendorname != NULL; - kdp++) { + if (udev->manufacturer == NULL || udev->product == NULL) { + for (kdp = usb_knowndevs; kdp->vendorname != NULL; kdp++) { if (kdp->vendor == vendor_id && (kdp->product == product_id || (kdp->flags & USB_KNOWNDEV_NOPROD) != 0)) break; } if (kdp->vendorname != NULL) { - if (vendor == NULL) - vendor = kdp->vendorname; - if (product == NULL) - product = (kdp->flags & USB_KNOWNDEV_NOPROD) == 0 ? - kdp->productname : NULL; + /* XXX should use pointer to knowndevs string */ + if (udev->manufacturer == NULL) { + udev->manufacturer = strdup(kdp->vendorname, + M_USB); + } + if (udev->product == NULL && + (kdp->flags & USB_KNOWNDEV_NOPROD) == 0) { + udev->product = strdup(kdp->productname, + M_USB); + } } } #endif - if (vendor && *vendor) { - if (udev->manufacturer != vendor) { - strlcpy(udev->manufacturer, vendor, - sizeof(udev->manufacturer)); - } - } else { - snprintf(udev->manufacturer, - sizeof(udev->manufacturer), "vendor 0x%04x", vendor_id); + /* Provide default strings if none were found */ + if (udev->manufacturer == NULL) { + snprintf(temp, sizeof(temp), "vendor 0x%04x", vendor_id); + udev->manufacturer = strdup(temp, M_USB); } - - if (product && *product) { - if (udev->product != product) { - strlcpy(udev->product, product, - sizeof(udev->product)); - } - } else { - snprintf(udev->product, - sizeof(udev->product), "product 0x%04x", product_id); + if (udev->product == NULL) { + snprintf(temp, sizeof(temp), "product 0x%04x", product_id); + udev->product = strdup(temp, M_USB); } } -#endif /* * Returns: @@ -2367,11 +2321,7 @@ usb2_notify_addq(const char *type, struct usb2_device *udev) UGETW(udev->ddesc.idProduct), udev->ddesc.bDeviceClass, udev->ddesc.bDeviceSubClass, -#if USB_HAVE_STRINGS udev->serial, -#else - "", -#endif udev->port_no, udev->parent_hub != NULL ? udev->parent_hub->ugen_name : diff --git a/sys/dev/usb/usb_device.h b/sys/dev/usb/usb_device.h index d262d3e..6477571 100644 --- a/sys/dev/usb/usb_device.h +++ b/sys/dev/usb/usb_device.h @@ -174,11 +174,9 @@ struct usb2_device { struct usb2_endpoint_descriptor default_ep_desc; /* for pipe 0 */ struct usb2_device_descriptor ddesc; /* device descriptor */ -#if USB_HAVE_STRINGS - char serial[64]; /* serial number */ - char manufacturer[64]; /* manufacturer string */ - char product[64]; /* product string */ -#endif + char *serial; /* serial number */ + char *manufacturer; /* manufacturer string */ + char *product; /* product string */ }; /* globals */ diff --git a/sys/dev/usb/usb_generic.c b/sys/dev/usb/usb_generic.c index 02aba15..a572113 100644 --- a/sys/dev/usb/usb_generic.c +++ b/sys/dev/usb/usb_generic.c @@ -801,14 +801,9 @@ usb2_gen_fill_deviceinfo(struct usb2_fifo *f, struct usb2_device_info *di) di->udi_bus = device_get_unit(udev->bus->bdev); di->udi_addr = udev->address; di->udi_index = udev->device_index; -#if USB_HAVE_STRINGS - strlcpy(di->udi_serial, udev->serial, - sizeof(di->udi_serial)); - strlcpy(di->udi_vendor, udev->manufacturer, - sizeof(di->udi_vendor)); - strlcpy(di->udi_product, udev->product, - sizeof(di->udi_product)); -#endif + strlcpy(di->udi_serial, udev->serial, sizeof(di->udi_serial)); + strlcpy(di->udi_vendor, udev->manufacturer, sizeof(di->udi_vendor)); + strlcpy(di->udi_product, udev->product, sizeof(di->udi_product)); usb2_printBCD(di->udi_release, sizeof(di->udi_release), UGETW(udev->ddesc.bcdDevice)); di->udi_vendorNo = UGETW(udev->ddesc.idVendor); diff --git a/sys/dev/usb/usb_hub.c b/sys/dev/usb/usb_hub.c index 31d84a4..e4cfc83 100644 --- a/sys/dev/usb/usb_hub.c +++ b/sys/dev/usb/usb_hub.c @@ -1006,11 +1006,7 @@ uhub_child_pnpinfo_string(device_t parent, device_t child, UGETW(res.udev->ddesc.idProduct), res.udev->ddesc.bDeviceClass, res.udev->ddesc.bDeviceSubClass, -#if USB_HAVE_STRINGS res.udev->serial, -#else - "", -#endif iface->idesc->bInterfaceClass, iface->idesc->bInterfaceSubClass); } else { diff --git a/sys/dev/usb/usb_util.c b/sys/dev/usb/usb_util.c index 5eba73c..d4dc2ab 100644 --- a/sys/dev/usb/usb_util.c +++ b/sys/dev/usb/usb_util.c @@ -78,7 +78,6 @@ device_delete_all_children(device_t dev) void device_set_usb2_desc(device_t dev) { -#if USB_HAVE_STRINGS struct usb2_attach_arg *uaa; struct usb2_device *udev; struct usb2_interface *iface; @@ -121,7 +120,6 @@ device_set_usb2_desc(device_t dev) device_set_desc_copy(dev, temp_p); device_printf(dev, "<%s> on %s\n", temp_p, device_get_nameunit(udev->bus->bdev)); -#endif } /*------------------------------------------------------------------------* @@ -181,7 +179,6 @@ usb2_printBCD(char *p, uint16_t p_len, uint16_t bcd) * This function removes spaces at the beginning and the end of the string * pointed to by the "p" argument. *------------------------------------------------------------------------*/ -#if USB_HAVE_STRINGS void usb2_trim_spaces(char *p) { @@ -198,7 +195,6 @@ usb2_trim_spaces(char *p) e = p; *e = 0; /* kill trailing spaces */ } -#endif /*------------------------------------------------------------------------* * usb2_make_str_desc - convert an ASCII string into a UNICODE string -- cgit v1.1