Module Name: src
Committed By: skrll
Date: Sat Jun 6 15:26:15 UTC 2015
Modified Files:
src/sys/dev/usb [nick-nhusb]: usb_subr.c usbdivar.h
Log Message:
Read Binary Object Store descriptor and store to ud_bdesc.
>From t-hash
To generate a diff of this commit:
cvs rdiff -u -r1.198.2.14 -r1.198.2.15 src/sys/dev/usb/usb_subr.c
cvs rdiff -u -r1.109.2.16 -r1.109.2.17 src/sys/dev/usb/usbdivar.h
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/dev/usb/usb_subr.c
diff -u src/sys/dev/usb/usb_subr.c:1.198.2.14 src/sys/dev/usb/usb_subr.c:1.198.2.15
--- src/sys/dev/usb/usb_subr.c:1.198.2.14 Sat Jun 6 15:21:57 2015
+++ src/sys/dev/usb/usb_subr.c Sat Jun 6 15:26:15 2015
@@ -1,4 +1,4 @@
-/* $NetBSD: usb_subr.c,v 1.198.2.14 2015/06/06 15:21:57 skrll Exp $ */
+/* $NetBSD: usb_subr.c,v 1.198.2.15 2015/06/06 15:26:15 skrll Exp $ */
/* $FreeBSD: src/sys/dev/usb/usb_subr.c,v 1.18 1999/11/17 22:33:47 n_hibma Exp $ */
/*
@@ -32,7 +32,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: usb_subr.c,v 1.198.2.14 2015/06/06 15:21:57 skrll Exp $");
+__KERNEL_RCSID(0, "$NetBSD: usb_subr.c,v 1.198.2.15 2015/06/06 15:26:15 skrll Exp $");
#ifdef _KERNEL_OPT
#include "opt_compat_netbsd.h"
@@ -529,6 +529,7 @@ usbd_status
usbd_set_config_index(struct usbd_device *dev, int index, int msg)
{
usb_config_descriptor_t cd, *cdp;
+ usb_bos_descriptor_t bd, *bdp = NULL;
usbd_status err;
int i, ifcidx, nifc, len, selfpowered, power;
@@ -552,8 +553,12 @@ usbd_set_config_index(struct usbd_device
usbd_free_iface_data(dev, ifcidx);
kmem_free(dev->ud_ifaces, nifc * sizeof(struct usbd_interface));
kmem_free(dev->ud_cdesc, UGETW(dev->ud_cdesc->wTotalLength));
+ if (dev->ud_bdesc != NULL)
+ kmem_free(dev->ud_bdesc,
+ UGETW(dev->ud_bdesc->wTotalLength));
dev->ud_ifaces = NULL;
dev->ud_cdesc = NULL;
+ dev->ud_bdesc = NULL;
dev->ud_config = USB_UNCONFIG_NO;
}
@@ -596,6 +601,41 @@ usbd_set_config_index(struct usbd_device
goto bad;
}
+ if (USB_IS_SS(dev->ud_speed)) {
+ int blen;
+
+ /* get short bos desc */
+ err = usbd_get_bos_desc(dev, index, &bd);
+ if (err) {
+ DPRINTF("get_bos_desc=%d", err, 0, 0, 0);
+ goto bad;
+ }
+ blen = UGETW(bd.wTotalLength);
+ bdp = kmem_alloc(blen, KM_SLEEP);
+ if (bdp == NULL) {
+ err = USBD_NOMEM;
+ goto bad;
+ }
+
+ /* Get the full desc */
+ for (i = 0; i < 3; i++) {
+ err = usbd_get_desc(dev, UDESC_BOS, index, blen, bdp);
+ if (!err)
+ break;
+ usbd_delay_ms(dev, 200);
+ }
+ if (err) {
+ DPRINTF("get_bos_desc=%d", err, 0, 0, 0);
+ goto bad;
+ }
+ if (bdp->bDescriptorType != UDESC_BOS) {
+ DPRINTF("bad desc %d", bdp->bDescriptorType, 0, 0, 0);
+ err = USBD_INVAL;
+ goto bad;
+ }
+ }
+ dev->ud_bdesc = bdp;
+
/*
* Figure out if the device is self or bus powered.
*/
@@ -687,6 +727,10 @@ usbd_set_config_index(struct usbd_device
bad:
kmem_free(cdp, len);
+ if (bdp != NULL) {
+ kmem_free(bdp, UGETW(bdp->wTotalLength));
+ dev->ud_bdesc = NULL;
+ }
return err;
}
@@ -1533,6 +1577,8 @@ usb_free_device(struct usbd_device *dev)
}
if (dev->ud_cdesc != NULL)
kmem_free(dev->ud_cdesc, UGETW(dev->ud_cdesc->wTotalLength));
+ if (dev->ud_bdesc != NULL)
+ kmem_free(dev->ud_bdesc, UGETW(dev->ud_bdesc->wTotalLength));
if (dev->ud_subdevlen > 0) {
kmem_free(dev->ud_subdevs,
dev->ud_subdevlen * sizeof(device_t));
Index: src/sys/dev/usb/usbdivar.h
diff -u src/sys/dev/usb/usbdivar.h:1.109.2.16 src/sys/dev/usb/usbdivar.h:1.109.2.17
--- src/sys/dev/usb/usbdivar.h:1.109.2.16 Thu Mar 19 17:26:43 2015
+++ src/sys/dev/usb/usbdivar.h Sat Jun 6 15:26:15 2015
@@ -1,4 +1,4 @@
-/* $NetBSD: usbdivar.h,v 1.109.2.16 2015/03/19 17:26:43 skrll Exp $ */
+/* $NetBSD: usbdivar.h,v 1.109.2.17 2015/06/06 15:26:15 skrll Exp $ */
/*
* Copyright (c) 1998, 2012 The NetBSD Foundation, Inc.
@@ -195,6 +195,7 @@ struct usbd_device {
struct usbd_interface *ud_ifaces; /* array of all interfaces */
usb_device_descriptor_t ud_ddesc; /* device descriptor */
usb_config_descriptor_t *ud_cdesc; /* full config descr */
+ usb_bos_descriptor_t *ud_bdesc; /* full BOS descr */
const struct usbd_quirks *ud_quirks;/* device quirks, always set */
struct usbd_hub *ud_hub; /* only if this is a hub */
int ud_subdevlen; /* array length of following */