diff options
Diffstat (limited to 'net/bluetooth/hci_conn.c')
-rw-r--r-- | net/bluetooth/hci_conn.c | 39 |
1 files changed, 34 insertions, 5 deletions
diff --git a/net/bluetooth/hci_conn.c b/net/bluetooth/hci_conn.c index 797a30bec6fd..9483320f6dad 100644 --- a/net/bluetooth/hci_conn.c +++ b/net/bluetooth/hci_conn.c | |||
@@ -78,9 +78,9 @@ void hci_acl_connect(struct hci_conn *conn) | |||
78 | 78 | ||
79 | cp.pkt_type = cpu_to_le16(hdev->pkt_type & ACL_PTYPE_MASK); | 79 | cp.pkt_type = cpu_to_le16(hdev->pkt_type & ACL_PTYPE_MASK); |
80 | if (lmp_rswitch_capable(hdev) && !(hdev->link_mode & HCI_LM_MASTER)) | 80 | if (lmp_rswitch_capable(hdev) && !(hdev->link_mode & HCI_LM_MASTER)) |
81 | cp.role_switch = 0x01; | 81 | cp.role_switch = 0x01; |
82 | else | 82 | else |
83 | cp.role_switch = 0x00; | 83 | cp.role_switch = 0x00; |
84 | 84 | ||
85 | hci_send_cmd(hdev, HCI_OP_CREATE_CONN, sizeof(cp), &cp); | 85 | hci_send_cmd(hdev, HCI_OP_CREATE_CONN, sizeof(cp), &cp); |
86 | } | 86 | } |
@@ -127,6 +127,28 @@ void hci_add_sco(struct hci_conn *conn, __u16 handle) | |||
127 | hci_send_cmd(hdev, HCI_OP_ADD_SCO, sizeof(cp), &cp); | 127 | hci_send_cmd(hdev, HCI_OP_ADD_SCO, sizeof(cp), &cp); |
128 | } | 128 | } |
129 | 129 | ||
130 | void hci_setup_sync(struct hci_conn *conn, __u16 handle) | ||
131 | { | ||
132 | struct hci_dev *hdev = conn->hdev; | ||
133 | struct hci_cp_setup_sync_conn cp; | ||
134 | |||
135 | BT_DBG("%p", conn); | ||
136 | |||
137 | conn->state = BT_CONNECT; | ||
138 | conn->out = 1; | ||
139 | |||
140 | cp.handle = cpu_to_le16(handle); | ||
141 | cp.pkt_type = cpu_to_le16(hdev->esco_type); | ||
142 | |||
143 | cp.tx_bandwidth = cpu_to_le32(0x00001f40); | ||
144 | cp.rx_bandwidth = cpu_to_le32(0x00001f40); | ||
145 | cp.max_latency = cpu_to_le16(0xffff); | ||
146 | cp.voice_setting = cpu_to_le16(hdev->voice_setting); | ||
147 | cp.retrans_effort = 0xff; | ||
148 | |||
149 | hci_send_cmd(hdev, HCI_OP_SETUP_SYNC_CONN, sizeof(cp), &cp); | ||
150 | } | ||
151 | |||
130 | static void hci_conn_timeout(unsigned long arg) | 152 | static void hci_conn_timeout(unsigned long arg) |
131 | { | 153 | { |
132 | struct hci_conn *conn = (void *) arg; | 154 | struct hci_conn *conn = (void *) arg; |
@@ -141,7 +163,10 @@ static void hci_conn_timeout(unsigned long arg) | |||
141 | 163 | ||
142 | switch (conn->state) { | 164 | switch (conn->state) { |
143 | case BT_CONNECT: | 165 | case BT_CONNECT: |
144 | hci_acl_connect_cancel(conn); | 166 | if (conn->type == ACL_LINK) |
167 | hci_acl_connect_cancel(conn); | ||
168 | else | ||
169 | hci_acl_disconn(conn, 0x13); | ||
145 | break; | 170 | break; |
146 | case BT_CONNECTED: | 171 | case BT_CONNECTED: |
147 | hci_acl_disconn(conn, 0x13); | 172 | hci_acl_disconn(conn, 0x13); |
@@ -328,8 +353,12 @@ struct hci_conn *hci_connect(struct hci_dev *hdev, int type, bdaddr_t *dst) | |||
328 | hci_conn_hold(sco); | 353 | hci_conn_hold(sco); |
329 | 354 | ||
330 | if (acl->state == BT_CONNECTED && | 355 | if (acl->state == BT_CONNECTED && |
331 | (sco->state == BT_OPEN || sco->state == BT_CLOSED)) | 356 | (sco->state == BT_OPEN || sco->state == BT_CLOSED)) { |
332 | hci_add_sco(sco, acl->handle); | 357 | if (lmp_esco_capable(hdev)) |
358 | hci_setup_sync(sco, acl->handle); | ||
359 | else | ||
360 | hci_add_sco(sco, acl->handle); | ||
361 | } | ||
333 | 362 | ||
334 | return sco; | 363 | return sco; |
335 | } | 364 | } |