OSDN Git Service

Bluetooth: During le_conn_timeout disable EXT_ADV
authorSathish Narsimman <nsathish41@gmail.com>
Mon, 24 Feb 2020 05:23:40 +0000 (10:53 +0530)
committerMarcel Holtmann <marcel@holtmann.org>
Fri, 28 Feb 2020 07:40:06 +0000 (08:40 +0100)
Disabling LE_LEGACY_ADV when LE_EXT_ADV is enabled causes 'command
disallowed . This patch fixes that issue and disables EXT_ADV if
enabled.

Signed-off-by: Sathish Narsimman <sathish.narasimman@intel.com>
Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
net/bluetooth/hci_conn.c

index 2731f0a..e245bc1 100644 (file)
@@ -467,6 +467,23 @@ static void hci_conn_auto_accept(struct work_struct *work)
                     &conn->dst);
 }
 
+static void le_disable_advertising(struct hci_dev *hdev)
+{
+       if (ext_adv_capable(hdev)) {
+               struct hci_cp_le_set_ext_adv_enable cp;
+
+               cp.enable = 0x00;
+               cp.num_of_sets = 0x00;
+
+               hci_send_cmd(hdev, HCI_OP_LE_SET_EXT_ADV_ENABLE, sizeof(cp),
+                            &cp);
+       } else {
+               u8 enable = 0x00;
+               hci_send_cmd(hdev, HCI_OP_LE_SET_ADV_ENABLE, sizeof(enable),
+                            &enable);
+       }
+}
+
 static void le_conn_timeout(struct work_struct *work)
 {
        struct hci_conn *conn = container_of(work, struct hci_conn,
@@ -481,9 +498,8 @@ static void le_conn_timeout(struct work_struct *work)
         * (which doesn't have a timeout of its own).
         */
        if (conn->role == HCI_ROLE_SLAVE) {
-               u8 enable = 0x00;
-               hci_send_cmd(hdev, HCI_OP_LE_SET_ADV_ENABLE, sizeof(enable),
-                            &enable);
+               /* Disable LE Advertising */
+               le_disable_advertising(hdev);
                hci_le_conn_failed(conn, HCI_ERROR_ADVERTISING_TIMEOUT);
                return;
        }