2019-10-02 12:29:15

by Szymon Janc

[permalink] [raw]
Subject: [PATCH] Bluetooth: Workaround hd directed advertising bug in Broadcom controllers

It appears that some Broadcom controllers (eg BCM20702A0) reject LE Set
Advertising Parameters command if advertising intervals provided are not
within range for undirected and low duty directed advertising.

Workaround this bug by populating min and max intervals with 'valid'
values.

< HCI Command: LE Set Advertising Parameters (0x08|0x0006) plen 15 #75 [hci0] 29.155775
Min advertising interval: 0.000 msec (0x0000)
Max advertising interval: 0.000 msec (0x0000)
Type: Connectable directed - ADV_DIRECT_IND (high duty cycle) (0x01)
Own address type: Public (0x00)
Direct address type: Random (0x01)
Direct address: E2:F0:7B:9F:DC:F4 (Static)
Channel map: 37, 38, 39 (0x07)
Filter policy: Allow Scan Request from Any, Allow Connect Request from Any (0x00)
> HCI Event: Command Complete (0x0e) plen 4 #76 [hci0] 29.156745
LE Set Advertising Parameters (0x08|0x0006) ncmd 1
Status: Invalid HCI Command Parameters (0x12)

Signed-off-by: Szymon Janc <[email protected]>
Tested-by: Sören Beye <[email protected]>
---
net/bluetooth/hci_conn.c | 8 ++++++++
1 file changed, 8 insertions(+)

diff --git a/net/bluetooth/hci_conn.c b/net/bluetooth/hci_conn.c
index ad5b0ac1f9ce..7ff92dd4c53c 100644
--- a/net/bluetooth/hci_conn.c
+++ b/net/bluetooth/hci_conn.c
@@ -934,6 +934,14 @@ static void hci_req_directed_advertising(struct hci_request *req,
return;

memset(&cp, 0, sizeof(cp));
+
+ /* Some controllers might reject command if intervals are not
+ * within range for undirected advertising.
+ * BCM20702A0 is known to be affected by this.
+ */
+ cp.min_interval = cpu_to_le16(0x0020);
+ cp.max_interval = cpu_to_le16(0x0020);
+
cp.type = LE_ADV_DIRECT_IND;
cp.own_address_type = own_addr_type;
cp.direct_addr_type = conn->dst_type;
--
2.21.0


2019-10-17 12:53:15

by Marcel Holtmann

[permalink] [raw]
Subject: Re: [PATCH] Bluetooth: Workaround hd directed advertising bug in Broadcom controllers

Hi Szymon,

> It appears that some Broadcom controllers (eg BCM20702A0) reject LE Set
> Advertising Parameters command if advertising intervals provided are not
> within range for undirected and low duty directed advertising.
>
> Workaround this bug by populating min and max intervals with 'valid'
> values.
>
> < HCI Command: LE Set Advertising Parameters (0x08|0x0006) plen 15 #75 [hci0] 29.155775
> Min advertising interval: 0.000 msec (0x0000)
> Max advertising interval: 0.000 msec (0x0000)
> Type: Connectable directed - ADV_DIRECT_IND (high duty cycle) (0x01)
> Own address type: Public (0x00)
> Direct address type: Random (0x01)
> Direct address: E2:F0:7B:9F:DC:F4 (Static)
> Channel map: 37, 38, 39 (0x07)
> Filter policy: Allow Scan Request from Any, Allow Connect Request from Any (0x00)
>> HCI Event: Command Complete (0x0e) plen 4 #76 [hci0] 29.156745
> LE Set Advertising Parameters (0x08|0x0006) ncmd 1
> Status: Invalid HCI Command Parameters (0x12)
>
> Signed-off-by: Szymon Janc <[email protected]>
> Tested-by: Sören Beye <[email protected]>
> ---
> net/bluetooth/hci_conn.c | 8 ++++++++
> 1 file changed, 8 insertions(+)

patch has been applied to bluetooth-next tree.

Regards

Marcel