Bluetooth: btusb: Add workaround for Broadcom devices without product id
The GPD Pocket is shipping with a BCM2045 USB HCI with its vendor and product information set to 0000:0000 and also has its interface class set to 255 (Vendor Specific Class). Luckily it does advertise usable manufacturer and product strings. T: Bus=01 Lev=01 Prnt=01 Port=02 Cnt=02 Dev#= 3 Spd=12 MxCh= 0 D: Ver= 2.00 Cls=ff(vend.) Sub=01 Prot=01 MxPS=64 #Cfgs= 1 P: Vendor=0000 ProdID=0000 Rev= 1.12 S: Manufacturer=Broadcom Corp S: Product=BCM2045A0 S: SerialNumber=AC83F30677CB C:* #Ifs= 4 Cfg#= 1 Atr=80 MxPwr=100mA I:* If#= 0 Alt= 0 #EPs= 3 Cls=ff(vend.) Sub=01 Prot=01 Driver=btusb E: Ad=81(I) Atr=03(Int.) MxPS= 16 Ivl=1ms E: Ad=82(I) Atr=02(Bulk) MxPS= 64 Ivl=0ms E: Ad=02(O) Atr=02(Bulk) MxPS= 64 Ivl=0ms I:* If#= 1 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=01 Prot=01 Driver=btusb E: Ad=83(I) Atr=01(Isoc) MxPS= 0 Ivl=1ms E: Ad=03(O) Atr=01(Isoc) MxPS= 0 Ivl=1ms I: If#= 1 Alt= 1 #EPs= 2 Cls=ff(vend.) Sub=01 Prot=01 Driver=btusb E: Ad=83(I) Atr=01(Isoc) MxPS= 9 Ivl=1ms E: Ad=03(O) Atr=01(Isoc) MxPS= 9 Ivl=1ms I: If#= 1 Alt= 2 #EPs= 2 Cls=ff(vend.) Sub=01 Prot=01 Driver=btusb E: Ad=83(I) Atr=01(Isoc) MxPS= 17 Ivl=1ms E: Ad=03(O) Atr=01(Isoc) MxPS= 17 Ivl=1ms I: If#= 1 Alt= 3 #EPs= 2 Cls=ff(vend.) Sub=01 Prot=01 Driver=btusb E: Ad=83(I) Atr=01(Isoc) MxPS= 25 Ivl=1ms E: Ad=03(O) Atr=01(Isoc) MxPS= 25 Ivl=1ms I: If#= 1 Alt= 4 #EPs= 2 Cls=ff(vend.) Sub=01 Prot=01 Driver=btusb E: Ad=83(I) Atr=01(Isoc) MxPS= 33 Ivl=1ms E: Ad=03(O) Atr=01(Isoc) MxPS= 33 Ivl=1ms I: If#= 1 Alt= 5 #EPs= 2 Cls=ff(vend.) Sub=01 Prot=01 Driver=btusb E: Ad=83(I) Atr=01(Isoc) MxPS= 49 Ivl=1ms E: Ad=03(O) Atr=01(Isoc) MxPS= 49 Ivl=1ms I:* If#= 2 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=ff Prot=ff Driver=(none) E: Ad=84(I) Atr=02(Bulk) MxPS= 32 Ivl=0ms E: Ad=04(O) Atr=02(Bulk) MxPS= 32 Ivl=0ms I:* If#= 3 Alt= 0 #EPs= 0 Cls=fe(app. ) Sub=01 Prot=01 Driver=(none) Reported-by: Christopher Williamson <home@chrisaw.com> Signed-off-by: Hans de Goede <hdegoede@redhat.com> Signed-off-by: Marcel Holtmann <marcel@holtmann.org> Signed-off-by: Johan Hedberg <johan.hedberg@intel.com>
This commit is contained in:
Родитель
3dfe55d9ca
Коммит
9834e586fa
|
@ -66,6 +66,7 @@ static struct usb_driver btusb_driver;
|
||||||
#define BTUSB_BCM2045 0x40000
|
#define BTUSB_BCM2045 0x40000
|
||||||
#define BTUSB_IFNUM_2 0x80000
|
#define BTUSB_IFNUM_2 0x80000
|
||||||
#define BTUSB_CW6622 0x100000
|
#define BTUSB_CW6622 0x100000
|
||||||
|
#define BTUSB_BCM_NO_PRODID 0x200000
|
||||||
|
|
||||||
static const struct usb_device_id btusb_table[] = {
|
static const struct usb_device_id btusb_table[] = {
|
||||||
/* Generic Bluetooth USB device */
|
/* 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),
|
{ USB_VENDOR_AND_INTERFACE_INFO(0x0930, 0xff, 0x01, 0x01),
|
||||||
.driver_info = BTUSB_BCM_PATCHRAM },
|
.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) */
|
/* Intel Bluetooth USB Bootloader (RAM module) */
|
||||||
{ USB_DEVICE(0x8087, 0x0a5a),
|
{ USB_DEVICE(0x8087, 0x0a5a),
|
||||||
.driver_info = BTUSB_INTEL_BOOT | BTUSB_BROKEN_ISOC },
|
.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)
|
if (id->driver_info == BTUSB_IGNORE)
|
||||||
return -ENODEV;
|
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) {
|
if (id->driver_info & BTUSB_ATH3012) {
|
||||||
struct usb_device *udev = interface_to_usbdev(intf);
|
struct usb_device *udev = interface_to_usbdev(intf);
|
||||||
|
|
||||||
|
|
Загрузка…
Ссылка в новой задаче