Module Name: src Committed By: plunky Date: Wed Feb 17 10:52:55 UTC 2016
Modified Files: src/sys/dev/usb: ubt.c Log Message: extend the match function, to match devices from a selection of manufacturers that use modern Broadcom chips, and which represent as a vendor-specific device class. To generate a diff of this commit: cvs rdiff -u -r1.52 -r1.53 src/sys/dev/usb/ubt.c 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/ubt.c diff -u src/sys/dev/usb/ubt.c:1.52 src/sys/dev/usb/ubt.c:1.53 --- src/sys/dev/usb/ubt.c:1.52 Wed Feb 17 00:49:28 2016 +++ src/sys/dev/usb/ubt.c Wed Feb 17 10:52:55 2016 @@ -1,4 +1,4 @@ -/* $NetBSD: ubt.c,v 1.52 2016/02/17 00:49:28 riastradh Exp $ */ +/* $NetBSD: ubt.c,v 1.53 2016/02/17 10:52:55 plunky Exp $ */ /*- * Copyright (c) 2006 Itronix Inc. @@ -67,7 +67,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: ubt.c,v 1.52 2016/02/17 00:49:28 riastradh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: ubt.c,v 1.53 2016/02/17 10:52:55 plunky Exp $"); #include <sys/param.h> #include <sys/device.h> @@ -297,51 +297,167 @@ static int ubt_sysctl_config(SYSCTLFN_PR static void ubt_abortdealloc(struct ubt_softc *); /* - * To match or ignore forcibly, add - * - * { { VendorID, ProductID } , UMATCH_VENDOR_PRODUCT|UMATCH_NONE } - * - * to the ubt_dev list. + * To match or ignore, add details to the ubt_dev list. + * Use value of -1 to indicate a wildcard + * To override another entry, add details earlier */ const struct ubt_devno { - struct usb_devno devno; + int vendor; + int product; + int class; + int subclass; + int proto; int match; } ubt_dev[] = { - { { USB_VENDOR_BROADCOM, USB_PRODUCT_BROADCOM_BCM2033NF }, - UMATCH_NONE }, - { { USB_VENDOR_APPLE, USB_PRODUCT_APPLE_BLUETOOTH_HOST_1 }, - UMATCH_VENDOR_PRODUCT }, - { { USB_VENDOR_APPLE, USB_PRODUCT_APPLE_BLUETOOTH_HOST_2 }, - UMATCH_VENDOR_PRODUCT }, - { { USB_VENDOR_APPLE, USB_PRODUCT_APPLE_BLUETOOTH_HOST_3 }, - UMATCH_VENDOR_PRODUCT }, - { { USB_VENDOR_APPLE, USB_PRODUCT_APPLE_BLUETOOTH_HOST_4 }, - UMATCH_VENDOR_PRODUCT }, - { { USB_VENDOR_APPLE, USB_PRODUCT_APPLE_BLUETOOTH_HOST_5 }, - UMATCH_VENDOR_PRODUCT }, - { { USB_VENDOR_APPLE, USB_PRODUCT_APPLE_BLUETOOTH_HOST_6 }, - UMATCH_VENDOR_PRODUCT }, - { { USB_VENDOR_APPLE, USB_PRODUCT_APPLE_BLUETOOTH_HOST_7 }, - UMATCH_VENDOR_PRODUCT }, + { /* ignore Broadcom 2033 without firmware */ + USB_VENDOR_BROADCOM, + USB_PRODUCT_BROADCOM_BCM2033NF, + -1, + -1, + -1, + UMATCH_NONE + }, + { /* Apple Bluetooth Host Controller MacbookPro 7,1 */ + USB_VENDOR_APPLE, + USB_PRODUCT_APPLE_BLUETOOTH_HOST_1, + -1, + -1, + -1, + UMATCH_VENDOR_PRODUCT + }, + { /* Apple Bluetooth Host Controller iMac 11,1 */ + USB_VENDOR_APPLE, + USB_PRODUCT_APPLE_BLUETOOTH_HOST_2, + -1, + -1, + -1, + UMATCH_VENDOR_PRODUCT + }, + { /* Apple Bluetooth Host Controller MacBookPro 8,2 */ + USB_VENDOR_APPLE, + USB_PRODUCT_APPLE_BLUETOOTH_HOST_3, + -1, + -1, + -1, + UMATCH_VENDOR_PRODUCT + }, + { /* Apple Bluetooth Host Controller MacBookAir 3,1 3,2*/ + USB_VENDOR_APPLE, + USB_PRODUCT_APPLE_BLUETOOTH_HOST_4, + -1, + -1, + -1, + UMATCH_VENDOR_PRODUCT + }, + { /* Apple Bluetooth Host Controller MacBookAir 4,1 */ + USB_VENDOR_APPLE, + USB_PRODUCT_APPLE_BLUETOOTH_HOST_5, + -1, + -1, + -1, + UMATCH_VENDOR_PRODUCT + }, + { /* Apple Bluetooth Host Controller MacMini 5,1 */ + USB_VENDOR_APPLE, + USB_PRODUCT_APPLE_BLUETOOTH_HOST_6, + -1, + -1, + -1, + UMATCH_VENDOR_PRODUCT + }, + { /* Apple Bluetooth Host Controller MacBookAir 6,1 */ + USB_VENDOR_APPLE, + USB_PRODUCT_APPLE_BLUETOOTH_HOST_7, + -1, + -1, + -1, + UMATCH_VENDOR_PRODUCT + }, + { /* Broadcom chips with PatchRAM support */ + USB_VENDOR_BROADCOM, + -1, + UDCLASS_VENDOR, + UDSUBCLASS_RF, + UDPROTO_BLUETOOTH, + UMATCH_VENDOR_DEVCLASS_DEVPROTO + }, + { /* Broadcom based device with PatchRAM support */ + USB_VENDOR_FOXCONN, + -1, + UDCLASS_VENDOR, + UDSUBCLASS_RF, + UDPROTO_BLUETOOTH, + UMATCH_VENDOR_DEVCLASS_DEVPROTO + }, + { /* Broadcom based device with PatchRAM support */ + USB_VENDOR_LITEON, + -1, + UDCLASS_VENDOR, + UDSUBCLASS_RF, + UDPROTO_BLUETOOTH, + UMATCH_VENDOR_DEVCLASS_DEVPROTO + }, + { /* Broadcom based device with PatchRAM support */ + USB_VENDOR_BELKIN, + -1, + UDCLASS_VENDOR, + UDSUBCLASS_RF, + UDPROTO_BLUETOOTH, + UMATCH_VENDOR_DEVCLASS_DEVPROTO + }, + { /* Broadcom based device with PatchRAM support */ + USB_VENDOR_TOSHIBA, + -1, + UDCLASS_VENDOR, + UDSUBCLASS_RF, + UDPROTO_BLUETOOTH, + UMATCH_VENDOR_DEVCLASS_DEVPROTO + }, + { /* Broadcom based device with PatchRAM support */ + USB_VENDOR_ASUSTEK, + -1, + UDCLASS_VENDOR, + UDSUBCLASS_RF, + UDPROTO_BLUETOOTH, + UMATCH_VENDOR_DEVCLASS_DEVPROTO + }, + { /* Generic Bluetooth SIG compliant devices */ + -1, + -1, + UDCLASS_WIRELESS, + UDSUBCLASS_RF, + UDPROTO_BLUETOOTH, + UMATCH_DEVCLASS_DEVSUBCLASS_DEVPROTO + }, }; -#define ubt_lookup(vendor, product) \ - ((const struct ubt_devno *)usb_lookup(ubt_dev, vendor, product)) int ubt_match(device_t parent, cfdata_t match, void *aux) { struct usb_attach_arg *uaa = aux; - const struct ubt_devno *dev; + size_t i; DPRINTFN(50, "ubt_match\n"); - if ((dev = ubt_lookup(uaa->vendor, uaa->product)) != NULL) - return dev->match; + for (i = 0; i < __arraycount(ubt_dev); i++) { + if (ubt_dev[i].vendor != -1 + && ubt_dev[i].vendor != (int)uaa->vendor) + continue; + if (ubt_dev[i].product != -1 + && ubt_dev[i].product != (int)uaa->product) + continue; + if (ubt_dev[i].class != -1 + && ubt_dev[i].class != uaa->class) + continue; + if (ubt_dev[i].subclass != -1 + && ubt_dev[i].subclass != uaa->subclass) + continue; + if (ubt_dev[i].proto != -1 + && ubt_dev[i].proto != uaa->proto) + continue; - if (uaa->class == UDCLASS_WIRELESS - && uaa->subclass == UDSUBCLASS_RF - && uaa->proto == UDPROTO_BLUETOOTH) - return UMATCH_DEVCLASS_DEVSUBCLASS_DEVPROTO; + return ubt_dev[i].match; + } return UMATCH_NONE; }