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 */

Reply via email to