|
|
|
@ -33,6 +33,7 @@ |
|
|
|
|
#define VERSION "0.1" |
|
|
|
|
|
|
|
|
|
#define BDADDR_BCM20702A0 (&(bdaddr_t) {{0x00, 0xa0, 0x02, 0x70, 0x20, 0x00}}) |
|
|
|
|
#define BDADDR_BCM4324B3 (&(bdaddr_t) {{0x00, 0x00, 0x00, 0xb3, 0x24, 0x43}}) |
|
|
|
|
|
|
|
|
|
int btbcm_check_bdaddr(struct hci_dev *hdev) |
|
|
|
|
{ |
|
|
|
@ -56,10 +57,18 @@ int btbcm_check_bdaddr(struct hci_dev *hdev) |
|
|
|
|
|
|
|
|
|
bda = (struct hci_rp_read_bd_addr *)skb->data; |
|
|
|
|
|
|
|
|
|
/* The address 00:20:70:02:A0:00 indicates a BCM20702A0 controller
|
|
|
|
|
/* Check if the address indicates a controller with either an
|
|
|
|
|
* invalid or default address. In both cases the device needs |
|
|
|
|
* to be marked as not having a valid address. |
|
|
|
|
* |
|
|
|
|
* The address 00:20:70:02:A0:00 indicates a BCM20702A0 controller |
|
|
|
|
* with no configured address. |
|
|
|
|
* |
|
|
|
|
* The address 43:24:B3:00:00:00 indicates a BCM4324B3 controller |
|
|
|
|
* with waiting for configuration state. |
|
|
|
|
*/ |
|
|
|
|
if (!bacmp(&bda->bdaddr, BDADDR_BCM20702A0)) { |
|
|
|
|
if (!bacmp(&bda->bdaddr, BDADDR_BCM20702A0) || |
|
|
|
|
!bacmp(&bda->bdaddr, BDADDR_BCM4324B3)) { |
|
|
|
|
BT_INFO("%s: BCM: Using default device address (%pMR)", |
|
|
|
|
hdev->name, &bda->bdaddr); |
|
|
|
|
set_bit(HCI_QUIRK_INVALID_BDADDR, &hdev->quirks); |
|
|
|
@ -233,6 +242,7 @@ static const struct { |
|
|
|
|
const char *name; |
|
|
|
|
} bcm_uart_subver_table[] = { |
|
|
|
|
{ 0x410e, "BCM43341B0" }, /* 002.001.014 */ |
|
|
|
|
{ 0x4406, "BCM4324B3" }, /* 002.004.006 */ |
|
|
|
|
{ } |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
@ -288,6 +298,7 @@ int btbcm_setup_patchram(struct hci_dev *hdev) |
|
|
|
|
|
|
|
|
|
switch ((rev & 0xf000) >> 12) { |
|
|
|
|
case 0: |
|
|
|
|
case 3: |
|
|
|
|
for (i = 0; bcm_uart_subver_table[i].name; i++) { |
|
|
|
|
if (subver == bcm_uart_subver_table[i].subver) { |
|
|
|
|
hw_name = bcm_uart_subver_table[i].name; |
|
|
|
|