summaryrefslogtreecommitdiffstats
path: root/net/bluetooth
diff options
context:
space:
mode:
authorJohan Hedberg <johan.hedberg@intel.com>2015-10-16 09:07:53 +0200
committerMarcel Holtmann <marcel@holtmann.org>2015-10-16 09:24:41 +0200
commit9ad3e6ffe189a988389d88ce33101668cb2d54c6 (patch)
tree75c46a0442999b52fa71fa94562d7a04fff364e4 /net/bluetooth
parentBluetooth: Fix remove_device behavior for explicit connects (diff)
downloadlinux-9ad3e6ffe189a988389d88ce33101668cb2d54c6.tar.xz
linux-9ad3e6ffe189a988389d88ce33101668cb2d54c6.zip
Bluetooth: Fix conn_params list update in hci_connect_le_scan_cleanup
After clearing the params->explicit_connect variable the parameters may need to be either added back to the right list or potentially left absent from both the le_reports and the le_conns lists. Signed-off-by: Johan Hedberg <johan.hedberg@intel.com> Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
Diffstat (limited to 'net/bluetooth')
-rw-r--r--net/bluetooth/hci_conn.c23
1 files changed, 19 insertions, 4 deletions
diff --git a/net/bluetooth/hci_conn.c b/net/bluetooth/hci_conn.c
index d5c06eeab4a3..fe99025fb649 100644
--- a/net/bluetooth/hci_conn.c
+++ b/net/bluetooth/hci_conn.c
@@ -91,12 +91,27 @@ static void hci_connect_le_scan_cleanup(struct hci_conn *conn)
* autoconnect action, remove them completely. If they are, just unmark
* them as waiting for connection, by clearing explicit_connect field.
*/
- if (params->auto_connect == HCI_AUTO_CONN_EXPLICIT) {
+ params->explicit_connect = false;
+
+ list_del_init(&params->action);
+
+ switch (params->auto_connect) {
+ case HCI_AUTO_CONN_EXPLICIT:
hci_conn_params_del(conn->hdev, bdaddr, bdaddr_type);
- } else {
- params->explicit_connect = false;
- hci_update_background_scan(conn->hdev);
+ /* return instead of break to avoid duplicate scan update */
+ return;
+ case HCI_AUTO_CONN_DIRECT:
+ case HCI_AUTO_CONN_ALWAYS:
+ list_add(&params->action, &conn->hdev->pend_le_conns);
+ break;
+ case HCI_AUTO_CONN_REPORT:
+ list_add(&params->action, &conn->hdev->pend_le_reports);
+ break;
+ default:
+ break;
}
+
+ hci_update_background_scan(conn->hdev);
}
static void hci_conn_cleanup(struct hci_conn *conn)