Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 5 Apr 2009 18:19:30 +0000 (UTC)
From:      Andrew Thompson <thompsa@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r190728 - head/sys/dev/usb/bluetooth
Message-ID:  <200904051819.n35IJU43027637@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: thompsa
Date: Sun Apr  5 18:19:30 2009
New Revision: 190728
URL: http://svn.freebsd.org/changeset/base/190728

Log:
  MFp4 //depot/projects/usb@159863
  
  Speed up the endpoint descriptor search
  
  Submitted by:	Hans Petter Selasky

Modified:
  head/sys/dev/usb/bluetooth/ng_ubt.c

Modified: head/sys/dev/usb/bluetooth/ng_ubt.c
==============================================================================
--- head/sys/dev/usb/bluetooth/ng_ubt.c	Sun Apr  5 18:19:19 2009	(r190727)
+++ head/sys/dev/usb/bluetooth/ng_ubt.c	Sun Apr  5 18:19:30 2009	(r190728)
@@ -426,6 +426,7 @@ ubt_attach(device_t dev)
 	struct usb2_attach_arg		*uaa = device_get_ivars(dev);
 	struct ubt_softc		*sc = device_get_softc(dev);
 	struct usb2_endpoint_descriptor	*ed;
+	struct usb2_interface_descriptor *id;
 	uint16_t			wMaxPacketSize;
 	uint8_t				alt_index, i, j;
 	uint8_t				iface_index[2] = { 0, 1 };
@@ -496,31 +497,34 @@ ubt_attach(device_t dev)
 	alt_index = 0;
 	i = 0;
 	j = 0;
+	ed = NULL;
 
-	/* Search through all the descriptors looking for bidir mode */
-	while (1) {
-		uint16_t temp;
-
-		ed = usb2_find_edesc(usb2_get_config_descriptor(uaa->device),
-				1, i, j);
-		if (ed == NULL) {
-			if (j != 0) {
-				/* next interface */
-				j = 0;
-				i ++;
-				continue;
+	/* 
+	 * Search through all the descriptors looking for the largest
+	 * packet size:
+	 */
+	while ((ed = (struct usb2_endpoint_descriptor *)usb2_desc_foreach(
+	    usb2_get_config_descriptor(uaa->device), 
+	    (struct usb2_descriptor *)ed))) {
+
+		if ((ed->bDescriptorType == UDESC_INTERFACE) &&
+		    (ed->bLength >= sizeof(*id))) {
+			id = (struct usb2_interface_descriptor *)ed;
+			i = id->bInterfaceNumber;
+			j = id->bAlternateSetting;
+		}
+
+		if ((ed->bDescriptorType == UDESC_ENDPOINT) &&
+		    (ed->bLength >= sizeof(*ed)) &&
+		    (i == 1)) {
+			uint16_t temp;
+
+			temp = UGETW(ed->wMaxPacketSize);
+			if (temp > wMaxPacketSize) {
+				wMaxPacketSize = temp;
+				alt_index = j;
 			}
-
-			break;	/* end of interfaces */
 		}
-
-		temp = UGETW(ed->wMaxPacketSize);
-		if (temp > wMaxPacketSize) {
-			wMaxPacketSize = temp;
-			alt_index = i;
-		}
-
-		j ++;
 	}
 
 	/* Set alt configuration on interface #1 only if we found it */



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200904051819.n35IJU43027637>