|
@@ -66,6 +66,7 @@ static struct usb_driver btusb_driver;
|
|
|
#define BTUSB_BCM2045 0x40000
|
|
|
#define BTUSB_IFNUM_2 0x80000
|
|
|
#define BTUSB_CW6622 0x100000
|
|
|
+#define BTUSB_BCM_NO_PRODID 0x200000
|
|
|
|
|
|
static const struct usb_device_id btusb_table[] = {
|
|
|
/* Generic Bluetooth USB device */
|
|
@@ -170,6 +171,10 @@ static const struct usb_device_id btusb_table[] = {
|
|
|
{ USB_VENDOR_AND_INTERFACE_INFO(0x0930, 0xff, 0x01, 0x01),
|
|
|
.driver_info = BTUSB_BCM_PATCHRAM },
|
|
|
|
|
|
+ /* Broadcom devices with missing product id */
|
|
|
+ { USB_DEVICE_AND_INTERFACE_INFO(0x0000, 0x0000, 0xff, 0x01, 0x01),
|
|
|
+ .driver_info = BTUSB_BCM_PATCHRAM | BTUSB_BCM_NO_PRODID },
|
|
|
+
|
|
|
/* Intel Bluetooth USB Bootloader (RAM module) */
|
|
|
{ USB_DEVICE(0x8087, 0x0a5a),
|
|
|
.driver_info = BTUSB_INTEL_BOOT | BTUSB_BROKEN_ISOC },
|
|
@@ -2899,6 +2904,19 @@ static int btusb_probe(struct usb_interface *intf,
|
|
|
if (id->driver_info == BTUSB_IGNORE)
|
|
|
return -ENODEV;
|
|
|
|
|
|
+ if (id->driver_info & BTUSB_BCM_NO_PRODID) {
|
|
|
+ struct usb_device *udev = interface_to_usbdev(intf);
|
|
|
+
|
|
|
+ /* For the broken Broadcom devices that show 0000:0000
|
|
|
+ * as USB vendor and product information, check that the
|
|
|
+ * manufacturer string identifies them as Broadcom based
|
|
|
+ * devices.
|
|
|
+ */
|
|
|
+ if (!udev->manufacturer ||
|
|
|
+ strcmp(udev->manufacturer, "Broadcom Corp"))
|
|
|
+ return -ENODEV;
|
|
|
+ }
|
|
|
+
|
|
|
if (id->driver_info & BTUSB_ATH3012) {
|
|
|
struct usb_device *udev = interface_to_usbdev(intf);
|
|
|
|