|
@@ -1008,15 +1008,23 @@ static int hci_explicit_conn_params_set(struct hci_request *req,
|
|
if (is_connected(hdev, addr, addr_type))
|
|
if (is_connected(hdev, addr, addr_type))
|
|
return -EISCONN;
|
|
return -EISCONN;
|
|
|
|
|
|
- params = hci_conn_params_add(hdev, addr, addr_type);
|
|
|
|
- if (!params)
|
|
|
|
- return -EIO;
|
|
|
|
|
|
+ params = hci_conn_params_lookup(hdev, addr, addr_type);
|
|
|
|
+ if (!params) {
|
|
|
|
+ params = hci_conn_params_add(hdev, addr, addr_type);
|
|
|
|
+ if (!params)
|
|
|
|
+ return -ENOMEM;
|
|
|
|
+
|
|
|
|
+ /* If we created new params, mark them to be deleted in
|
|
|
|
+ * hci_connect_le_scan_cleanup. It's different case than
|
|
|
|
+ * existing disabled params, those will stay after cleanup.
|
|
|
|
+ */
|
|
|
|
+ params->auto_connect = HCI_AUTO_CONN_EXPLICIT;
|
|
|
|
+ }
|
|
|
|
|
|
- /* If we created new params, or existing params were marked as disabled,
|
|
|
|
- * mark them to be used just once to connect.
|
|
|
|
- */
|
|
|
|
|
|
+ /* We're trying to connect, so make sure params are at pend_le_conns */
|
|
if (params->auto_connect == HCI_AUTO_CONN_DISABLED ||
|
|
if (params->auto_connect == HCI_AUTO_CONN_DISABLED ||
|
|
- params->auto_connect == HCI_AUTO_CONN_REPORT) {
|
|
|
|
|
|
+ params->auto_connect == HCI_AUTO_CONN_REPORT ||
|
|
|
|
+ params->auto_connect == HCI_AUTO_CONN_EXPLICIT) {
|
|
list_del_init(¶ms->action);
|
|
list_del_init(¶ms->action);
|
|
list_add(¶ms->action, &hdev->pend_le_conns);
|
|
list_add(¶ms->action, &hdev->pend_le_conns);
|
|
}
|
|
}
|