|
@@ -1605,27 +1605,27 @@ static inline void hci_disconn_complete_evt(struct hci_dev *hdev, struct sk_buff
|
|
|
|
|
|
BT_DBG("%s status %d", hdev->name, ev->status);
|
|
|
|
|
|
- if (ev->status) {
|
|
|
- hci_dev_lock(hdev);
|
|
|
- mgmt_disconnect_failed(hdev);
|
|
|
- hci_dev_unlock(hdev);
|
|
|
- return;
|
|
|
- }
|
|
|
-
|
|
|
hci_dev_lock(hdev);
|
|
|
|
|
|
conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
|
|
|
if (!conn)
|
|
|
goto unlock;
|
|
|
|
|
|
- conn->state = BT_CLOSED;
|
|
|
+ if (ev->status == 0)
|
|
|
+ conn->state = BT_CLOSED;
|
|
|
|
|
|
- if (conn->type == ACL_LINK || conn->type == LE_LINK)
|
|
|
- mgmt_disconnected(hdev, &conn->dst, conn->type,
|
|
|
+ if (conn->type == ACL_LINK || conn->type == LE_LINK) {
|
|
|
+ if (ev->status != 0)
|
|
|
+ mgmt_disconnect_failed(hdev, &conn->dst, ev->status);
|
|
|
+ else
|
|
|
+ mgmt_disconnected(hdev, &conn->dst, conn->type,
|
|
|
conn->dst_type);
|
|
|
+ }
|
|
|
|
|
|
- hci_proto_disconn_cfm(conn, ev->reason);
|
|
|
- hci_conn_del(conn);
|
|
|
+ if (ev->status == 0) {
|
|
|
+ hci_proto_disconn_cfm(conn, ev->reason);
|
|
|
+ hci_conn_del(conn);
|
|
|
+ }
|
|
|
|
|
|
unlock:
|
|
|
hci_dev_unlock(hdev);
|
|
@@ -2098,7 +2098,7 @@ static inline void hci_cmd_status_evt(struct hci_dev *hdev, struct sk_buff *skb)
|
|
|
|
|
|
case HCI_OP_DISCONNECT:
|
|
|
if (ev->status != 0)
|
|
|
- mgmt_disconnect_failed(hdev);
|
|
|
+ mgmt_disconnect_failed(hdev, NULL, ev->status);
|
|
|
break;
|
|
|
|
|
|
case HCI_OP_LE_CREATE_CONN:
|