summaryrefslogtreecommitdiffstats
path: root/sys/dev/usb/usb_device.c
diff options
context:
space:
mode:
authorthompsa <thompsa@FreeBSD.org>2009-05-27 23:12:02 +0000
committerthompsa <thompsa@FreeBSD.org>2009-05-27 23:12:02 +0000
commit3d7b880e84dc48c67cf00008f1aa19d467a8db25 (patch)
treeda082b95f7477c8e0170f750e6f5ed5911f4334d /sys/dev/usb/usb_device.c
parent536e43cd2e41db560ffc1ca7aebeb0307ac3b66f (diff)
downloadFreeBSD-src-3d7b880e84dc48c67cf00008f1aa19d467a8db25.zip
FreeBSD-src-3d7b880e84dc48c67cf00008f1aa19d467a8db25.tar.gz
Allocate the usb serial, manufacturer and product strings rather than use char
arrays in the usb_device struct. This also eliminates USB_HAVE_STRINGS.
Diffstat (limited to 'sys/dev/usb/usb_device.c')
-rw-r--r--sys/dev/usb/usb_device.c140
1 files changed, 45 insertions, 95 deletions
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 :
OpenPOWER on IntegriCloud