Re: [PATCH v1] Bluetooth: btusb: Add Qualcomm Bluetooth SoC WCN6855 support

From: Rocky Liao
Date: Fri Sep 25 2020 - 05:02:02 EST


Hi Marcel,

在 2020-09-14 21:25,Marcel Holtmann 写道:
Hi Rocky,

This patch add support for WCN6855 i.e. patch and nvm download
support.
Signed-off-by: Rocky Liao <rjliao@xxxxxxxxxxxxxx>
---
drivers/bluetooth/btusb.c | 42 +++++++++++++++++++++++++++++++++++----
1 file changed, 38 insertions(+), 4 deletions(-)
diff --git a/drivers/bluetooth/btusb.c b/drivers/bluetooth/btusb.c
index fe80588c7bd3..e51e754ca9b8 100644
--- a/drivers/bluetooth/btusb.c
+++ b/drivers/bluetooth/btusb.c
@@ -59,6 +59,7 @@ static struct usb_driver btusb_driver;
#define BTUSB_MEDIATEK 0x200000
#define BTUSB_WIDEBAND_SPEECH 0x400000
#define BTUSB_VALID_LE_STATES 0x800000
+#define BTUSB_QCA_WCN6855 0x1000000
static const struct usb_device_id btusb_table[] = {
/* Generic Bluetooth USB device */
@@ -273,6 +274,10 @@ static const struct usb_device_id blacklist_table[] = {
{ USB_DEVICE(0x13d3, 0x3496), .driver_info = BTUSB_QCA_ROME },
{ USB_DEVICE(0x13d3, 0x3501), .driver_info = BTUSB_QCA_ROME },
+ /* QCA WCN6855 chipset */
+ { USB_DEVICE(0x0cf3, 0xe600), .driver_info = BTUSB_QCA_WCN6855 |
+ BTUSB_WIDEBAND_SPEECH },
+
/* Broadcom BCM2035 */
{ USB_DEVICE(0x0a5c, 0x2009), .driver_info = BTUSB_BCM92035 },
{ USB_DEVICE(0x0a5c, 0x200a), .driver_info = BTUSB_WRONG_SCO_MTU },
@@ -3391,6 +3396,26 @@ static int btusb_set_bdaddr_ath3012(struct hci_dev *hdev,
return 0;
}
+static int btusb_set_bdaddr_wcn6855(struct hci_dev *hdev,
+ const bdaddr_t *bdaddr)
+{
+ struct sk_buff *skb;
+ u8 buf[6];
+ long ret;
+
+ memcpy(buf, bdaddr, sizeof(bdaddr_t));
+
+ skb = __hci_cmd_sync(hdev, 0xfc14, sizeof(buf), buf, HCI_INIT_TIMEOUT);
+ if (IS_ERR(skb)) {
+ ret = PTR_ERR(skb);
+ bt_dev_err(hdev, "Change address command failed (%ld)", ret);
+ return ret;
+ }
+ kfree_skb(skb);
+
+ return 0;
+}
What is wrong with using qca_set_bdaddr() function.
WCN6855 is using different VSC to set the bt addr

int qca_set_bdaddr(struct hci_dev *hdev, const bdaddr_t *bdaddr)

{

struct sk_buff *skb;

int err;



skb = __hci_cmd_sync_ev(hdev, EDL_WRITE_BD_ADDR_OPCODE, 6,
bdaddr,
HCI_EV_VENDOR, HCI_INIT_TIMEOUT);

if (IS_ERR(skb)) {

err = PTR_ERR(skb);

bt_dev_err(hdev, "QCA Change address cmd failed (%d)",
err);
return err;

}



kfree_skb(skb);



return 0;

}

EXPORT_SYMBOL_GPL(qca_set_bdaddr);

I see that the other command is using HCI_EV_VENDOR, but is that on
purpose or an accident? Might want to confirm with the btmon trace.


You are right this is an accident, this command for WCN6855 have command complete event return. I will modify this in next patch update. Below is the btmon log:

Bluetooth monitor ver 5.48
= Note: Linux version 5.8.0-rc6-hsp-upstream+ (x86_64) 0.729933
= Note: Bluetooth subsystem version 2.22 0.729934
= New Index: 00:00:00:00:5A:AD (Primary,USB,hci1) [hci1] 0.729935
= Open Index: 00:00:00:00:5A:AD [hci1] 0.729935
= Index Info: 00:00:00:00:5A:AD (Qualcomm) [hci1] 0.729935
= New Index: 00:00:00:00:00:00 (Primary,UART,hci0) [hci0] 0.729936
@ MGMT Open: bluetoothd (privileged) version 1.18 {0x0002} 0.729936
@ MGMT Open: bluetoothd (privileged) version 1.18 {0x0001} 0.729936
@ MGMT Open: btmon (privileged) version 1.18 {0x0003} 0.729945
@ RAW Open: hcitool (privileged) version 2.22 {0x0004} 122.556176
@ RAW Close: hcitool {0x0004} 122.556200
@ RAW Open: hcitool (privileged) version 2.22 {0x0004} 122.556219
@ RAW Close: hcitool {0x0004} 122.556223
@ RAW Open: hcitool (privileged) version 2.22 {0x0004} [hci1] 122.556242
< HCI Command: Vendor (0x3f|0x0014) plen 6 #1 [hci1] 122.556643
01 02 03 04 05 06 ......
HCI Event: Command Complete (0x0e) plen 4 #2 [hci1] 122.675312
Vendor (0x3f|0x0014) ncmd 1
Status: Success (0x00)
@ RAW Close: hcitool {0x0004} [hci1] 122.675545
@ RAW Open: hcitool (privileged) version 2.22 {0x0004} 124.528658
@ RAW Close: hcitool {0x0004} 124.528683
@ RAW Open: hcitool (privileged) version 2.22 {0x0004} 124.528703
@ RAW Close: hcitool {0x0004} 124.528708
@ RAW Open: hcitool (privileged) version 2.22 {0x0004} [hci1] 124.528760
< HCI Command: Read BD ADDR (0x04|0x0009) plen 0 #3 [hci1] 124.529024
HCI Event: Command Complete (0x0e) plen 10 #4 [hci1] 124.530311
Read BD ADDR (0x04|0x0009) ncmd 1
Status: Success (0x00)
Address: 01:02:03:04:05:06 (OUI 01-02-03)
@ RAW Close: hcitool {0x0004} [hci1] 124.530509



Regards

Marcel