|
@@ -785,9 +785,13 @@ static void hci_cs_sniff_mode(struct hci_dev *hdev, __u8 status)
|
|
|
hci_dev_lock(hdev);
|
|
|
|
|
|
conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(cp->handle));
|
|
|
- if (conn)
|
|
|
+ if (conn) {
|
|
|
clear_bit(HCI_CONN_MODE_CHANGE_PEND, &conn->pend);
|
|
|
|
|
|
+ if (test_and_clear_bit(HCI_CONN_SCO_SETUP_PEND, &conn->pend))
|
|
|
+ hci_sco_setup(conn, status);
|
|
|
+ }
|
|
|
+
|
|
|
hci_dev_unlock(hdev);
|
|
|
}
|
|
|
|
|
@@ -808,9 +812,13 @@ static void hci_cs_exit_sniff_mode(struct hci_dev *hdev, __u8 status)
|
|
|
hci_dev_lock(hdev);
|
|
|
|
|
|
conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(cp->handle));
|
|
|
- if (conn)
|
|
|
+ if (conn) {
|
|
|
clear_bit(HCI_CONN_MODE_CHANGE_PEND, &conn->pend);
|
|
|
|
|
|
+ if (test_and_clear_bit(HCI_CONN_SCO_SETUP_PEND, &conn->pend))
|
|
|
+ hci_sco_setup(conn, status);
|
|
|
+ }
|
|
|
+
|
|
|
hci_dev_unlock(hdev);
|
|
|
}
|
|
|
|
|
@@ -915,20 +923,8 @@ static inline void hci_conn_complete_evt(struct hci_dev *hdev, struct sk_buff *s
|
|
|
} else
|
|
|
conn->state = BT_CLOSED;
|
|
|
|
|
|
- if (conn->type == ACL_LINK) {
|
|
|
- struct hci_conn *sco = conn->link;
|
|
|
- if (sco) {
|
|
|
- if (!ev->status) {
|
|
|
- if (lmp_esco_capable(hdev))
|
|
|
- hci_setup_sync(sco, conn->handle);
|
|
|
- else
|
|
|
- hci_add_sco(sco, conn->handle);
|
|
|
- } else {
|
|
|
- hci_proto_connect_cfm(sco, ev->status);
|
|
|
- hci_conn_del(sco);
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
+ if (conn->type == ACL_LINK)
|
|
|
+ hci_sco_setup(conn, ev->status);
|
|
|
|
|
|
if (ev->status) {
|
|
|
hci_proto_connect_cfm(conn, ev->status);
|
|
@@ -1481,6 +1477,9 @@ static inline void hci_mode_change_evt(struct hci_dev *hdev, struct sk_buff *skb
|
|
|
else
|
|
|
conn->power_save = 0;
|
|
|
}
|
|
|
+
|
|
|
+ if (test_and_clear_bit(HCI_CONN_SCO_SETUP_PEND, &conn->pend))
|
|
|
+ hci_sco_setup(conn, ev->status);
|
|
|
}
|
|
|
|
|
|
hci_dev_unlock(hdev);
|