Subject: Re: Belkin Bluetooth vs aue vs ubt
To: Greg Troxel <gdt@ir.bbn.com>
From: Stephen Borrill <netbsd@precedence.co.uk>
List: tech-kern
Date: 03/07/2007 19:28:30
On Wed, 7 Mar 2007, Greg Troxel wrote:
[aue attaches to a ubt device]
> > Shall I look at adding a quirk for this device in if_aue.c that will
> > check the product class before attaching?
>
> That sounds sensible.   It seems highly buggy of belkin to reuse the
> product id.

How about this patch?

Index: dev/usb/if_aue.c
===================================================================
RCS file: /cvsroot/src/sys/dev/usb/if_aue.c,v
retrieving revision 1.100
diff -u -r1.100 if_aue.c
--- dev/usb/if_aue.c	4 Mar 2007 06:02:47 -0000	1.100
+++ dev/usb/if_aue.c	7 Mar 2007 19:20:04 -0000
@@ -165,6 +165,7 @@
  #define LSYS	0x0001		/* use Linksys reset */
  #define PNA	0x0002		/* has Home PNA */
  #define PII	0x0004		/* Pegasus II chip */
+#define UBT	0x0008		/* May be a Bluetooth ubt(4) device */
  };

  Static const struct aue_type aue_devs[] = {
@@ -187,7 +188,7 @@
   {{ USB_VENDOR_ADMTEK,		USB_PRODUCT_ADMTEK_PEGASUSII_2},  PII },
   {{ USB_VENDOR_ADMTEK,		USB_PRODUCT_ADMTEK_PEGASUSII_3},  PII },
   {{ USB_VENDOR_AEI,		USB_PRODUCT_AEI_USBTOLAN},	  PII },
- {{ USB_VENDOR_BELKIN,		USB_PRODUCT_BELKIN_USB2LAN},	  PII },
+ {{ USB_VENDOR_BELKIN,		USB_PRODUCT_BELKIN_USB2LAN},	  PII|UBT },
   {{ USB_VENDOR_BILLIONTON,	USB_PRODUCT_BILLIONTON_USB100},	  0 },
   {{ USB_VENDOR_BILLIONTON,	USB_PRODUCT_BILLIONTON_USBLP100}, PNA },
   {{ USB_VENDOR_BILLIONTON,	USB_PRODUCT_BILLIONTON_USBEL100}, 0 },
@@ -712,12 +713,25 @@
  USB_MATCH(aue)
  {
  	USB_MATCH_START(aue, uaa);
+	const struct aue_type *type;

  	if (uaa->iface != NULL)
  		return (UMATCH_NONE);

-	return (aue_lookup(uaa->vendor, uaa->product) != NULL ?
-		UMATCH_VENDOR_PRODUCT : UMATCH_NONE);
+	type = aue_lookup(uaa->vendor, uaa->product);
+	if (type == NULL)
+		return (UMATCH_NONE);
+ 
+	if (type->aue_flags & UBT) {
+		usb_device_descriptor_t *dd;
+		dd = usbd_get_device_descriptor(uaa->device);
+		if (dd != NULL
+		    && dd->bDeviceClass == UDCLASS_WIRELESS
+		    && dd->bDeviceSubClass == UDSUBCLASS_RF
+		    && dd->bDeviceProtocol == UDPROTO_BLUETOOTH)
+			return (UMATCH_NONE);
+	}
+	return (UMATCH_VENDOR_PRODUCT);
  }

  /*

-- 
Stephen