|
@@ -3306,6 +3306,19 @@ static void hci_le_conn_complete_evt(struct hci_dev *hdev, struct sk_buff *skb)
|
|
|
|
|
|
hci_dev_lock(hdev);
|
|
|
|
|
|
+ if (ev->status) {
|
|
|
+ conn = hci_conn_hash_lookup_state(hdev, LE_LINK, BT_CONNECT);
|
|
|
+ if (!conn)
|
|
|
+ goto unlock;
|
|
|
+
|
|
|
+ mgmt_connect_failed(hdev, &conn->dst, conn->type,
|
|
|
+ conn->dst_type, ev->status);
|
|
|
+ hci_proto_connect_cfm(conn, ev->status);
|
|
|
+ conn->state = BT_CLOSED;
|
|
|
+ hci_conn_del(conn);
|
|
|
+ goto unlock;
|
|
|
+ }
|
|
|
+
|
|
|
conn = hci_conn_hash_lookup_ba(hdev, LE_LINK, &ev->bdaddr);
|
|
|
if (!conn) {
|
|
|
conn = hci_conn_add(hdev, LE_LINK, &ev->bdaddr);
|
|
@@ -3318,15 +3331,6 @@ static void hci_le_conn_complete_evt(struct hci_dev *hdev, struct sk_buff *skb)
|
|
|
conn->dst_type = ev->bdaddr_type;
|
|
|
}
|
|
|
|
|
|
- if (ev->status) {
|
|
|
- mgmt_connect_failed(hdev, &ev->bdaddr, conn->type,
|
|
|
- conn->dst_type, ev->status);
|
|
|
- hci_proto_connect_cfm(conn, ev->status);
|
|
|
- conn->state = BT_CLOSED;
|
|
|
- hci_conn_del(conn);
|
|
|
- goto unlock;
|
|
|
- }
|
|
|
-
|
|
|
if (!test_and_set_bit(HCI_CONN_MGMT_CONNECTED, &conn->flags))
|
|
|
mgmt_device_connected(hdev, &ev->bdaddr, conn->type,
|
|
|
conn->dst_type, 0, NULL, 0, NULL);
|