Bluetooth: btusb: Fix regression with fake CSR controllers 0a12:0001

Fake CSR controllers don't seem to handle short-transfer properly which
cause command to time out:

kernel: usb 1-1: new full-speed USB device number 19 using xhci_hcd
kernel: usb 1-1: New USB device found, idVendor=0a12, idProduct=0001, bcdDevice=88.91
kernel: usb 1-1: New USB device strings: Mfr=0, Product=2, SerialNumber=0
kernel: usb 1-1: Product: BT DONGLE10
...
Bluetooth: hci1: Opcode 0x1004 failed: -110
kernel: Bluetooth: hci1: command 0x1004 tx timeout

According to USB Spec 2.0 Section 5.7.3 Interrupt Transfer Packet Size
Constraints a interrupt transfer is considered complete when the size is 0
(ZPL) or < wMaxPacketSize:

'When an interrupt transfer involves more data than can fit in one
data payload of the currently established maximum size, all data
payloads are required to be maximum-sized except for the last data
payload, which will contain the remaining data. An interrupt transfer
is complete when the endpoint does one of the following:

• Has transferred exactly the amount of data expected
• Transfers a packet with a payload size less than wMaxPacketSize or
transfers a zero-length packet'

Link: https://bugzilla.kernel.org/show_bug.cgi?id=219365
Fixes: 7b05933340f4 ("Bluetooth: btusb: Fix not handling ZPL/short-transfer")
Signed-off-by: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>

Changed files
+9 -4
drivers
bluetooth
+9 -4
drivers/bluetooth/btusb.c
··· 1345 1345 if (!urb) 1346 1346 return -ENOMEM; 1347 1347 1348 - /* Use maximum HCI Event size so the USB stack handles 1349 - * ZPL/short-transfer automatically. 1350 - */ 1351 - size = HCI_MAX_EVENT_SIZE; 1348 + if (le16_to_cpu(data->udev->descriptor.idVendor) == 0x0a12 && 1349 + le16_to_cpu(data->udev->descriptor.idProduct) == 0x0001) 1350 + /* Fake CSR devices don't seem to support sort-transter */ 1351 + size = le16_to_cpu(data->intr_ep->wMaxPacketSize); 1352 + else 1353 + /* Use maximum HCI Event size so the USB stack handles 1354 + * ZPL/short-transfer automatically. 1355 + */ 1356 + size = HCI_MAX_EVENT_SIZE; 1352 1357 1353 1358 buf = kmalloc(size, mem_flags); 1354 1359 if (!buf) {