Hi Rocky,

>>> This patch add support for WCN6855 i.e. patch and nvm download
>>> support.
>>> Signed-off-by: Rocky Liao <[email protected]>
>>> ---
>>> 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.

Regards

Marcel

Reply via email to