diff options
author | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2007-10-22 22:22:33 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2007-10-22 22:22:33 -0400 |
commit | f09cc910fe3af7e63298105bc0482653eb534c3c (patch) | |
tree | a09dca8a3d033352edff6cb1d911f3cd0e980f1f /net | |
parent | 8b0eaccab4584ace24d233214bfee3cb50e49a60 (diff) | |
parent | ea2c47b42f12dadbad9d879fb6df102b9003ab82 (diff) |
Merge branch 'master' of master.kernel.org:/pub/scm/linux/kernel/git/davem/net-2.6
* 'master' of master.kernel.org:/pub/scm/linux/kernel/git/davem/net-2.6: (30 commits)
[IPSEC] IPV6: Fix to add tunnel mode SA correctly.
[NET]: Cut off the queue_mapping field from sk_buff
[NET]: Hide the queue_mapping field inside netif_subqueue_stopped
[NET]: Make and use skb_get_queue_mapping
[NET]: Use the skb_set_queue_mapping where appropriate
[INET]: Use MODULE_ALIAS_NET_PF_PROTO_TYPE where possible.
[INET]: Let inet_diag and friends autoload
[NIU]: Cleanup PAGE_SIZE checks a bit
[NET]: Fix SKB_WITH_OVERHEAD calculation
[ATM]: Fix clip module reload crash.
[TG3]: Update version to 3.85
[TG3]: PCI command adjustment
[TG3]: Add management FW version to ethtool report
[TG3]: Add 5723 support
[Bluetooth] Convert RFCOMM to use kthread API
[Bluetooth] Add constant for Bluetooth socket options level
[Bluetooth] Add support for handling simple eSCO links
[Bluetooth] Add address and channel attribute to RFCOMM TTY device
[Bluetooth] Fix wrong argument in debug code of HIDP
[Bluetooth] Add generic driver for Bluetooth USB devices
...
Diffstat (limited to 'net')
-rw-r--r-- | net/bluetooth/hci_conn.c | 82 | ||||
-rw-r--r-- | net/bluetooth/hci_core.c | 70 | ||||
-rw-r--r-- | net/bluetooth/hci_event.c | 1651 | ||||
-rw-r--r-- | net/bluetooth/hci_sock.c | 2 | ||||
-rw-r--r-- | net/bluetooth/hci_sysfs.c | 37 | ||||
-rw-r--r-- | net/bluetooth/hidp/core.c | 2 | ||||
-rw-r--r-- | net/bluetooth/l2cap.c | 306 | ||||
-rw-r--r-- | net/bluetooth/rfcomm/core.c | 60 | ||||
-rw-r--r-- | net/bluetooth/rfcomm/tty.c | 25 | ||||
-rw-r--r-- | net/bluetooth/sco.c | 12 | ||||
-rw-r--r-- | net/core/dev.c | 6 | ||||
-rw-r--r-- | net/core/neighbour.c | 3 | ||||
-rw-r--r-- | net/core/netpoll.c | 4 | ||||
-rw-r--r-- | net/core/pktgen.c | 12 | ||||
-rw-r--r-- | net/dccp/diag.c | 1 | ||||
-rw-r--r-- | net/dccp/ipv4.c | 4 | ||||
-rw-r--r-- | net/dccp/ipv6.c | 4 | ||||
-rw-r--r-- | net/ipv4/inet_diag.c | 7 | ||||
-rw-r--r-- | net/ipv4/tcp_diag.c | 1 | ||||
-rw-r--r-- | net/ipv6/ah6.c | 1 | ||||
-rw-r--r-- | net/ipv6/esp6.c | 1 | ||||
-rw-r--r-- | net/sched/sch_teql.c | 6 |
22 files changed, 1363 insertions, 934 deletions
diff --git a/net/bluetooth/hci_conn.c b/net/bluetooth/hci_conn.c index 5fdfc9a67d39..9483320f6dad 100644 --- a/net/bluetooth/hci_conn.c +++ b/net/bluetooth/hci_conn.c | |||
@@ -78,11 +78,11 @@ 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, OGF_LINK_CTL, OCF_CREATE_CONN, sizeof(cp), &cp); | 85 | hci_send_cmd(hdev, HCI_OP_CREATE_CONN, sizeof(cp), &cp); |
86 | } | 86 | } |
87 | 87 | ||
88 | static void hci_acl_connect_cancel(struct hci_conn *conn) | 88 | static void hci_acl_connect_cancel(struct hci_conn *conn) |
@@ -95,8 +95,7 @@ static void hci_acl_connect_cancel(struct hci_conn *conn) | |||
95 | return; | 95 | return; |
96 | 96 | ||
97 | bacpy(&cp.bdaddr, &conn->dst); | 97 | bacpy(&cp.bdaddr, &conn->dst); |
98 | hci_send_cmd(conn->hdev, OGF_LINK_CTL, | 98 | hci_send_cmd(conn->hdev, HCI_OP_CREATE_CONN_CANCEL, sizeof(cp), &cp); |
99 | OCF_CREATE_CONN_CANCEL, sizeof(cp), &cp); | ||
100 | } | 99 | } |
101 | 100 | ||
102 | void hci_acl_disconn(struct hci_conn *conn, __u8 reason) | 101 | void hci_acl_disconn(struct hci_conn *conn, __u8 reason) |
@@ -109,8 +108,7 @@ void hci_acl_disconn(struct hci_conn *conn, __u8 reason) | |||
109 | 108 | ||
110 | cp.handle = cpu_to_le16(conn->handle); | 109 | cp.handle = cpu_to_le16(conn->handle); |
111 | cp.reason = reason; | 110 | cp.reason = reason; |
112 | hci_send_cmd(conn->hdev, OGF_LINK_CTL, | 111 | hci_send_cmd(conn->hdev, HCI_OP_DISCONNECT, sizeof(cp), &cp); |
113 | OCF_DISCONNECT, sizeof(cp), &cp); | ||
114 | } | 112 | } |
115 | 113 | ||
116 | void hci_add_sco(struct hci_conn *conn, __u16 handle) | 114 | void hci_add_sco(struct hci_conn *conn, __u16 handle) |
@@ -126,7 +124,29 @@ void hci_add_sco(struct hci_conn *conn, __u16 handle) | |||
126 | cp.handle = cpu_to_le16(handle); | 124 | cp.handle = cpu_to_le16(handle); |
127 | cp.pkt_type = cpu_to_le16(hdev->pkt_type & SCO_PTYPE_MASK); | 125 | cp.pkt_type = cpu_to_le16(hdev->pkt_type & SCO_PTYPE_MASK); |
128 | 126 | ||
129 | hci_send_cmd(hdev, OGF_LINK_CTL, OCF_ADD_SCO, sizeof(cp), &cp); | 127 | hci_send_cmd(hdev, HCI_OP_ADD_SCO, sizeof(cp), &cp); |
128 | } | ||
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); | ||
130 | } | 150 | } |
131 | 151 | ||
132 | static void hci_conn_timeout(unsigned long arg) | 152 | static void hci_conn_timeout(unsigned long arg) |
@@ -143,7 +163,10 @@ static void hci_conn_timeout(unsigned long arg) | |||
143 | 163 | ||
144 | switch (conn->state) { | 164 | switch (conn->state) { |
145 | case BT_CONNECT: | 165 | case BT_CONNECT: |
146 | 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); | ||
147 | break; | 170 | break; |
148 | case BT_CONNECTED: | 171 | case BT_CONNECTED: |
149 | hci_acl_disconn(conn, 0x13); | 172 | hci_acl_disconn(conn, 0x13); |
@@ -330,8 +353,12 @@ struct hci_conn *hci_connect(struct hci_dev *hdev, int type, bdaddr_t *dst) | |||
330 | hci_conn_hold(sco); | 353 | hci_conn_hold(sco); |
331 | 354 | ||
332 | if (acl->state == BT_CONNECTED && | 355 | if (acl->state == BT_CONNECTED && |
333 | (sco->state == BT_OPEN || sco->state == BT_CLOSED)) | 356 | (sco->state == BT_OPEN || sco->state == BT_CLOSED)) { |
334 | 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 | } | ||
335 | 362 | ||
336 | return sco; | 363 | return sco; |
337 | } | 364 | } |
@@ -348,7 +375,7 @@ int hci_conn_auth(struct hci_conn *conn) | |||
348 | if (!test_and_set_bit(HCI_CONN_AUTH_PEND, &conn->pend)) { | 375 | if (!test_and_set_bit(HCI_CONN_AUTH_PEND, &conn->pend)) { |
349 | struct hci_cp_auth_requested cp; | 376 | struct hci_cp_auth_requested cp; |
350 | cp.handle = cpu_to_le16(conn->handle); | 377 | cp.handle = cpu_to_le16(conn->handle); |
351 | hci_send_cmd(conn->hdev, OGF_LINK_CTL, OCF_AUTH_REQUESTED, sizeof(cp), &cp); | 378 | hci_send_cmd(conn->hdev, HCI_OP_AUTH_REQUESTED, sizeof(cp), &cp); |
352 | } | 379 | } |
353 | return 0; | 380 | return 0; |
354 | } | 381 | } |
@@ -369,7 +396,7 @@ int hci_conn_encrypt(struct hci_conn *conn) | |||
369 | struct hci_cp_set_conn_encrypt cp; | 396 | struct hci_cp_set_conn_encrypt cp; |
370 | cp.handle = cpu_to_le16(conn->handle); | 397 | cp.handle = cpu_to_le16(conn->handle); |
371 | cp.encrypt = 1; | 398 | cp.encrypt = 1; |
372 | hci_send_cmd(conn->hdev, OGF_LINK_CTL, OCF_SET_CONN_ENCRYPT, sizeof(cp), &cp); | 399 | hci_send_cmd(conn->hdev, HCI_OP_SET_CONN_ENCRYPT, sizeof(cp), &cp); |
373 | } | 400 | } |
374 | return 0; | 401 | return 0; |
375 | } | 402 | } |
@@ -383,7 +410,7 @@ int hci_conn_change_link_key(struct hci_conn *conn) | |||
383 | if (!test_and_set_bit(HCI_CONN_AUTH_PEND, &conn->pend)) { | 410 | if (!test_and_set_bit(HCI_CONN_AUTH_PEND, &conn->pend)) { |
384 | struct hci_cp_change_conn_link_key cp; | 411 | struct hci_cp_change_conn_link_key cp; |
385 | cp.handle = cpu_to_le16(conn->handle); | 412 | cp.handle = cpu_to_le16(conn->handle); |
386 | hci_send_cmd(conn->hdev, OGF_LINK_CTL, OCF_CHANGE_CONN_LINK_KEY, sizeof(cp), &cp); | 413 | hci_send_cmd(conn->hdev, HCI_OP_CHANGE_CONN_LINK_KEY, sizeof(cp), &cp); |
387 | } | 414 | } |
388 | return 0; | 415 | return 0; |
389 | } | 416 | } |
@@ -401,7 +428,7 @@ int hci_conn_switch_role(struct hci_conn *conn, uint8_t role) | |||
401 | struct hci_cp_switch_role cp; | 428 | struct hci_cp_switch_role cp; |
402 | bacpy(&cp.bdaddr, &conn->dst); | 429 | bacpy(&cp.bdaddr, &conn->dst); |
403 | cp.role = role; | 430 | cp.role = role; |
404 | hci_send_cmd(conn->hdev, OGF_LINK_POLICY, OCF_SWITCH_ROLE, sizeof(cp), &cp); | 431 | hci_send_cmd(conn->hdev, HCI_OP_SWITCH_ROLE, sizeof(cp), &cp); |
405 | } | 432 | } |
406 | return 0; | 433 | return 0; |
407 | } | 434 | } |
@@ -423,8 +450,7 @@ void hci_conn_enter_active_mode(struct hci_conn *conn) | |||
423 | if (!test_and_set_bit(HCI_CONN_MODE_CHANGE_PEND, &conn->pend)) { | 450 | if (!test_and_set_bit(HCI_CONN_MODE_CHANGE_PEND, &conn->pend)) { |
424 | struct hci_cp_exit_sniff_mode cp; | 451 | struct hci_cp_exit_sniff_mode cp; |
425 | cp.handle = cpu_to_le16(conn->handle); | 452 | cp.handle = cpu_to_le16(conn->handle); |
426 | hci_send_cmd(hdev, OGF_LINK_POLICY, | 453 | hci_send_cmd(hdev, HCI_OP_EXIT_SNIFF_MODE, sizeof(cp), &cp); |
427 | OCF_EXIT_SNIFF_MODE, sizeof(cp), &cp); | ||
428 | } | 454 | } |
429 | 455 | ||
430 | timer: | 456 | timer: |
@@ -455,8 +481,7 @@ void hci_conn_enter_sniff_mode(struct hci_conn *conn) | |||
455 | cp.max_latency = cpu_to_le16(0); | 481 | cp.max_latency = cpu_to_le16(0); |
456 | cp.min_remote_timeout = cpu_to_le16(0); | 482 | cp.min_remote_timeout = cpu_to_le16(0); |
457 | cp.min_local_timeout = cpu_to_le16(0); | 483 | cp.min_local_timeout = cpu_to_le16(0); |
458 | hci_send_cmd(hdev, OGF_LINK_POLICY, | 484 | hci_send_cmd(hdev, HCI_OP_SNIFF_SUBRATE, sizeof(cp), &cp); |
459 | OCF_SNIFF_SUBRATE, sizeof(cp), &cp); | ||
460 | } | 485 | } |
461 | 486 | ||
462 | if (!test_and_set_bit(HCI_CONN_MODE_CHANGE_PEND, &conn->pend)) { | 487 | if (!test_and_set_bit(HCI_CONN_MODE_CHANGE_PEND, &conn->pend)) { |
@@ -466,8 +491,7 @@ void hci_conn_enter_sniff_mode(struct hci_conn *conn) | |||
466 | cp.min_interval = cpu_to_le16(hdev->sniff_min_interval); | 491 | cp.min_interval = cpu_to_le16(hdev->sniff_min_interval); |
467 | cp.attempt = cpu_to_le16(4); | 492 | cp.attempt = cpu_to_le16(4); |
468 | cp.timeout = cpu_to_le16(1); | 493 | cp.timeout = cpu_to_le16(1); |
469 | hci_send_cmd(hdev, OGF_LINK_POLICY, | 494 | hci_send_cmd(hdev, HCI_OP_SNIFF_MODE, sizeof(cp), &cp); |
470 | OCF_SNIFF_MODE, sizeof(cp), &cp); | ||
471 | } | 495 | } |
472 | } | 496 | } |
473 | 497 | ||
@@ -493,6 +517,22 @@ void hci_conn_hash_flush(struct hci_dev *hdev) | |||
493 | } | 517 | } |
494 | } | 518 | } |
495 | 519 | ||
520 | /* Check pending connect attempts */ | ||
521 | void hci_conn_check_pending(struct hci_dev *hdev) | ||
522 | { | ||
523 | struct hci_conn *conn; | ||
524 | |||
525 | BT_DBG("hdev %s", hdev->name); | ||
526 | |||
527 | hci_dev_lock(hdev); | ||
528 | |||
529 | conn = hci_conn_hash_lookup_state(hdev, ACL_LINK, BT_CONNECT2); | ||
530 | if (conn) | ||
531 | hci_acl_connect(conn); | ||
532 | |||
533 | hci_dev_unlock(hdev); | ||
534 | } | ||
535 | |||
496 | int hci_get_conn_list(void __user *arg) | 536 | int hci_get_conn_list(void __user *arg) |
497 | { | 537 | { |
498 | struct hci_conn_list_req req, *cl; | 538 | struct hci_conn_list_req req, *cl; |
diff --git a/net/bluetooth/hci_core.c b/net/bluetooth/hci_core.c index 18e3afc964df..372b0d3b75a8 100644 --- a/net/bluetooth/hci_core.c +++ b/net/bluetooth/hci_core.c | |||
@@ -176,7 +176,7 @@ static void hci_reset_req(struct hci_dev *hdev, unsigned long opt) | |||
176 | BT_DBG("%s %ld", hdev->name, opt); | 176 | BT_DBG("%s %ld", hdev->name, opt); |
177 | 177 | ||
178 | /* Reset device */ | 178 | /* Reset device */ |
179 | hci_send_cmd(hdev, OGF_HOST_CTL, OCF_RESET, 0, NULL); | 179 | hci_send_cmd(hdev, HCI_OP_RESET, 0, NULL); |
180 | } | 180 | } |
181 | 181 | ||
182 | static void hci_init_req(struct hci_dev *hdev, unsigned long opt) | 182 | static void hci_init_req(struct hci_dev *hdev, unsigned long opt) |
@@ -202,16 +202,16 @@ static void hci_init_req(struct hci_dev *hdev, unsigned long opt) | |||
202 | 202 | ||
203 | /* Reset */ | 203 | /* Reset */ |
204 | if (test_bit(HCI_QUIRK_RESET_ON_INIT, &hdev->quirks)) | 204 | if (test_bit(HCI_QUIRK_RESET_ON_INIT, &hdev->quirks)) |
205 | hci_send_cmd(hdev, OGF_HOST_CTL, OCF_RESET, 0, NULL); | 205 | hci_send_cmd(hdev, HCI_OP_RESET, 0, NULL); |
206 | 206 | ||
207 | /* Read Local Supported Features */ | 207 | /* Read Local Supported Features */ |
208 | hci_send_cmd(hdev, OGF_INFO_PARAM, OCF_READ_LOCAL_FEATURES, 0, NULL); | 208 | hci_send_cmd(hdev, HCI_OP_READ_LOCAL_FEATURES, 0, NULL); |
209 | 209 | ||
210 | /* Read Local Version */ | 210 | /* Read Local Version */ |
211 | hci_send_cmd(hdev, OGF_INFO_PARAM, OCF_READ_LOCAL_VERSION, 0, NULL); | 211 | hci_send_cmd(hdev, HCI_OP_READ_LOCAL_VERSION, 0, NULL); |
212 | 212 | ||
213 | /* Read Buffer Size (ACL mtu, max pkt, etc.) */ | 213 | /* Read Buffer Size (ACL mtu, max pkt, etc.) */ |
214 | hci_send_cmd(hdev, OGF_INFO_PARAM, OCF_READ_BUFFER_SIZE, 0, NULL); | 214 | hci_send_cmd(hdev, HCI_OP_READ_BUFFER_SIZE, 0, NULL); |
215 | 215 | ||
216 | #if 0 | 216 | #if 0 |
217 | /* Host buffer size */ | 217 | /* Host buffer size */ |
@@ -221,29 +221,35 @@ static void hci_init_req(struct hci_dev *hdev, unsigned long opt) | |||
221 | cp.sco_mtu = HCI_MAX_SCO_SIZE; | 221 | cp.sco_mtu = HCI_MAX_SCO_SIZE; |
222 | cp.acl_max_pkt = cpu_to_le16(0xffff); | 222 | cp.acl_max_pkt = cpu_to_le16(0xffff); |
223 | cp.sco_max_pkt = cpu_to_le16(0xffff); | 223 | cp.sco_max_pkt = cpu_to_le16(0xffff); |
224 | hci_send_cmd(hdev, OGF_HOST_CTL, OCF_HOST_BUFFER_SIZE, sizeof(cp), &cp); | 224 | hci_send_cmd(hdev, HCI_OP_HOST_BUFFER_SIZE, sizeof(cp), &cp); |
225 | } | 225 | } |
226 | #endif | 226 | #endif |
227 | 227 | ||
228 | /* Read BD Address */ | 228 | /* Read BD Address */ |
229 | hci_send_cmd(hdev, OGF_INFO_PARAM, OCF_READ_BD_ADDR, 0, NULL); | 229 | hci_send_cmd(hdev, HCI_OP_READ_BD_ADDR, 0, NULL); |
230 | |||
231 | /* Read Class of Device */ | ||
232 | hci_send_cmd(hdev, HCI_OP_READ_CLASS_OF_DEV, 0, NULL); | ||
233 | |||
234 | /* Read Local Name */ | ||
235 | hci_send_cmd(hdev, HCI_OP_READ_LOCAL_NAME, 0, NULL); | ||
230 | 236 | ||
231 | /* Read Voice Setting */ | 237 | /* Read Voice Setting */ |
232 | hci_send_cmd(hdev, OGF_HOST_CTL, OCF_READ_VOICE_SETTING, 0, NULL); | 238 | hci_send_cmd(hdev, HCI_OP_READ_VOICE_SETTING, 0, NULL); |
233 | 239 | ||
234 | /* Optional initialization */ | 240 | /* Optional initialization */ |
235 | 241 | ||
236 | /* Clear Event Filters */ | 242 | /* Clear Event Filters */ |
237 | flt_type = HCI_FLT_CLEAR_ALL; | 243 | flt_type = HCI_FLT_CLEAR_ALL; |
238 | hci_send_cmd(hdev, OGF_HOST_CTL, OCF_SET_EVENT_FLT, 1, &flt_type); | 244 | hci_send_cmd(hdev, HCI_OP_SET_EVENT_FLT, 1, &flt_type); |
239 | 245 | ||
240 | /* Page timeout ~20 secs */ | 246 | /* Page timeout ~20 secs */ |
241 | param = cpu_to_le16(0x8000); | 247 | param = cpu_to_le16(0x8000); |
242 | hci_send_cmd(hdev, OGF_HOST_CTL, OCF_WRITE_PG_TIMEOUT, 2, ¶m); | 248 | hci_send_cmd(hdev, HCI_OP_WRITE_PG_TIMEOUT, 2, ¶m); |
243 | 249 | ||
244 | /* Connection accept timeout ~20 secs */ | 250 | /* Connection accept timeout ~20 secs */ |
245 | param = cpu_to_le16(0x7d00); | 251 | param = cpu_to_le16(0x7d00); |
246 | hci_send_cmd(hdev, OGF_HOST_CTL, OCF_WRITE_CA_TIMEOUT, 2, ¶m); | 252 | hci_send_cmd(hdev, HCI_OP_WRITE_CA_TIMEOUT, 2, ¶m); |
247 | } | 253 | } |
248 | 254 | ||
249 | static void hci_scan_req(struct hci_dev *hdev, unsigned long opt) | 255 | static void hci_scan_req(struct hci_dev *hdev, unsigned long opt) |
@@ -253,7 +259,7 @@ static void hci_scan_req(struct hci_dev *hdev, unsigned long opt) | |||
253 | BT_DBG("%s %x", hdev->name, scan); | 259 | BT_DBG("%s %x", hdev->name, scan); |
254 | 260 | ||
255 | /* Inquiry and Page scans */ | 261 | /* Inquiry and Page scans */ |
256 | hci_send_cmd(hdev, OGF_HOST_CTL, OCF_WRITE_SCAN_ENABLE, 1, &scan); | 262 | hci_send_cmd(hdev, HCI_OP_WRITE_SCAN_ENABLE, 1, &scan); |
257 | } | 263 | } |
258 | 264 | ||
259 | static void hci_auth_req(struct hci_dev *hdev, unsigned long opt) | 265 | static void hci_auth_req(struct hci_dev *hdev, unsigned long opt) |
@@ -263,7 +269,7 @@ static void hci_auth_req(struct hci_dev *hdev, unsigned long opt) | |||
263 | BT_DBG("%s %x", hdev->name, auth); | 269 | BT_DBG("%s %x", hdev->name, auth); |
264 | 270 | ||
265 | /* Authentication */ | 271 | /* Authentication */ |
266 | hci_send_cmd(hdev, OGF_HOST_CTL, OCF_WRITE_AUTH_ENABLE, 1, &auth); | 272 | hci_send_cmd(hdev, HCI_OP_WRITE_AUTH_ENABLE, 1, &auth); |
267 | } | 273 | } |
268 | 274 | ||
269 | static void hci_encrypt_req(struct hci_dev *hdev, unsigned long opt) | 275 | static void hci_encrypt_req(struct hci_dev *hdev, unsigned long opt) |
@@ -273,7 +279,7 @@ static void hci_encrypt_req(struct hci_dev *hdev, unsigned long opt) | |||
273 | BT_DBG("%s %x", hdev->name, encrypt); | 279 | BT_DBG("%s %x", hdev->name, encrypt); |
274 | 280 | ||
275 | /* Authentication */ | 281 | /* Authentication */ |
276 | hci_send_cmd(hdev, OGF_HOST_CTL, OCF_WRITE_ENCRYPT_MODE, 1, &encrypt); | 282 | hci_send_cmd(hdev, HCI_OP_WRITE_ENCRYPT_MODE, 1, &encrypt); |
277 | } | 283 | } |
278 | 284 | ||
279 | /* Get HCI device by index. | 285 | /* Get HCI device by index. |
@@ -384,7 +390,7 @@ static void hci_inq_req(struct hci_dev *hdev, unsigned long opt) | |||
384 | memcpy(&cp.lap, &ir->lap, 3); | 390 | memcpy(&cp.lap, &ir->lap, 3); |
385 | cp.length = ir->length; | 391 | cp.length = ir->length; |
386 | cp.num_rsp = ir->num_rsp; | 392 | cp.num_rsp = ir->num_rsp; |
387 | hci_send_cmd(hdev, OGF_LINK_CTL, OCF_INQUIRY, sizeof(cp), &cp); | 393 | hci_send_cmd(hdev, HCI_OP_INQUIRY, sizeof(cp), &cp); |
388 | } | 394 | } |
389 | 395 | ||
390 | int hci_inquiry(void __user *arg) | 396 | int hci_inquiry(void __user *arg) |
@@ -1111,13 +1117,13 @@ static int hci_send_frame(struct sk_buff *skb) | |||
1111 | } | 1117 | } |
1112 | 1118 | ||
1113 | /* Send HCI command */ | 1119 | /* Send HCI command */ |
1114 | int hci_send_cmd(struct hci_dev *hdev, __u16 ogf, __u16 ocf, __u32 plen, void *param) | 1120 | int hci_send_cmd(struct hci_dev *hdev, __u16 opcode, __u32 plen, void *param) |
1115 | { | 1121 | { |
1116 | int len = HCI_COMMAND_HDR_SIZE + plen; | 1122 | int len = HCI_COMMAND_HDR_SIZE + plen; |
1117 | struct hci_command_hdr *hdr; | 1123 | struct hci_command_hdr *hdr; |
1118 | struct sk_buff *skb; | 1124 | struct sk_buff *skb; |
1119 | 1125 | ||
1120 | BT_DBG("%s ogf 0x%x ocf 0x%x plen %d", hdev->name, ogf, ocf, plen); | 1126 | BT_DBG("%s opcode 0x%x plen %d", hdev->name, opcode, plen); |
1121 | 1127 | ||
1122 | skb = bt_skb_alloc(len, GFP_ATOMIC); | 1128 | skb = bt_skb_alloc(len, GFP_ATOMIC); |
1123 | if (!skb) { | 1129 | if (!skb) { |
@@ -1126,7 +1132,7 @@ int hci_send_cmd(struct hci_dev *hdev, __u16 ogf, __u16 ocf, __u32 plen, void *p | |||
1126 | } | 1132 | } |
1127 | 1133 | ||
1128 | hdr = (struct hci_command_hdr *) skb_put(skb, HCI_COMMAND_HDR_SIZE); | 1134 | hdr = (struct hci_command_hdr *) skb_put(skb, HCI_COMMAND_HDR_SIZE); |
1129 | hdr->opcode = cpu_to_le16(hci_opcode_pack(ogf, ocf)); | 1135 | hdr->opcode = cpu_to_le16(opcode); |
1130 | hdr->plen = plen; | 1136 | hdr->plen = plen; |
1131 | 1137 | ||
1132 | if (plen) | 1138 | if (plen) |
@@ -1143,7 +1149,7 @@ int hci_send_cmd(struct hci_dev *hdev, __u16 ogf, __u16 ocf, __u32 plen, void *p | |||
1143 | } | 1149 | } |
1144 | 1150 | ||
1145 | /* Get data from the previously sent command */ | 1151 | /* Get data from the previously sent command */ |
1146 | void *hci_sent_cmd_data(struct hci_dev *hdev, __u16 ogf, __u16 ocf) | 1152 | void *hci_sent_cmd_data(struct hci_dev *hdev, __u16 opcode) |
1147 | { | 1153 | { |
1148 | struct hci_command_hdr *hdr; | 1154 | struct hci_command_hdr *hdr; |
1149 | 1155 | ||
@@ -1152,10 +1158,10 @@ void *hci_sent_cmd_data(struct hci_dev *hdev, __u16 ogf, __u16 ocf) | |||
1152 | 1158 | ||
1153 | hdr = (void *) hdev->sent_cmd->data; | 1159 | hdr = (void *) hdev->sent_cmd->data; |
1154 | 1160 | ||
1155 | if (hdr->opcode != cpu_to_le16(hci_opcode_pack(ogf, ocf))) | 1161 | if (hdr->opcode != cpu_to_le16(opcode)) |
1156 | return NULL; | 1162 | return NULL; |
1157 | 1163 | ||
1158 | BT_DBG("%s ogf 0x%x ocf 0x%x", hdev->name, ogf, ocf); | 1164 | BT_DBG("%s opcode 0x%x", hdev->name, opcode); |
1159 | 1165 | ||
1160 | return hdev->sent_cmd->data + HCI_COMMAND_HDR_SIZE; | 1166 | return hdev->sent_cmd->data + HCI_COMMAND_HDR_SIZE; |
1161 | } | 1167 | } |
@@ -1355,6 +1361,26 @@ static inline void hci_sched_sco(struct hci_dev *hdev) | |||
1355 | } | 1361 | } |
1356 | } | 1362 | } |
1357 | 1363 | ||
1364 | static inline void hci_sched_esco(struct hci_dev *hdev) | ||
1365 | { | ||
1366 | struct hci_conn *conn; | ||
1367 | struct sk_buff *skb; | ||
1368 | int quote; | ||
1369 | |||
1370 | BT_DBG("%s", hdev->name); | ||
1371 | |||
1372 | while (hdev->sco_cnt && (conn = hci_low_sent(hdev, ESCO_LINK, "e))) { | ||
1373 | while (quote-- && (skb = skb_dequeue(&conn->data_q))) { | ||
1374 | BT_DBG("skb %p len %d", skb, skb->len); | ||
1375 | hci_send_frame(skb); | ||
1376 | |||
1377 | conn->sent++; | ||
1378 | if (conn->sent == ~0) | ||
1379 | conn->sent = 0; | ||
1380 | } | ||
1381 | } | ||
1382 | } | ||
1383 | |||
1358 | static void hci_tx_task(unsigned long arg) | 1384 | static void hci_tx_task(unsigned long arg) |
1359 | { | 1385 | { |
1360 | struct hci_dev *hdev = (struct hci_dev *) arg; | 1386 | struct hci_dev *hdev = (struct hci_dev *) arg; |
@@ -1370,6 +1396,8 @@ static void hci_tx_task(unsigned long arg) | |||
1370 | 1396 | ||
1371 | hci_sched_sco(hdev); | 1397 | hci_sched_sco(hdev); |
1372 | 1398 | ||
1399 | hci_sched_esco(hdev); | ||
1400 | |||
1373 | /* Send next queued raw (unknown type) packet */ | 1401 | /* Send next queued raw (unknown type) packet */ |
1374 | while ((skb = skb_dequeue(&hdev->raw_q))) | 1402 | while ((skb = skb_dequeue(&hdev->raw_q))) |
1375 | hci_send_frame(skb); | 1403 | hci_send_frame(skb); |
diff --git a/net/bluetooth/hci_event.c b/net/bluetooth/hci_event.c index 4baea1e38652..46df2e403df8 100644 --- a/net/bluetooth/hci_event.c +++ b/net/bluetooth/hci_event.c | |||
@@ -52,234 +52,273 @@ | |||
52 | 52 | ||
53 | /* Handle HCI Event packets */ | 53 | /* Handle HCI Event packets */ |
54 | 54 | ||
55 | /* Command Complete OGF LINK_CTL */ | 55 | static void hci_cc_inquiry_cancel(struct hci_dev *hdev, struct sk_buff *skb) |
56 | static void hci_cc_link_ctl(struct hci_dev *hdev, __u16 ocf, struct sk_buff *skb) | ||
57 | { | 56 | { |
58 | __u8 status; | 57 | __u8 status = *((__u8 *) skb->data); |
59 | struct hci_conn *pend; | ||
60 | 58 | ||
61 | BT_DBG("%s ocf 0x%x", hdev->name, ocf); | 59 | BT_DBG("%s status 0x%x", hdev->name, status); |
62 | 60 | ||
63 | switch (ocf) { | 61 | if (status) |
64 | case OCF_INQUIRY_CANCEL: | 62 | return; |
65 | case OCF_EXIT_PERIODIC_INQ: | ||
66 | status = *((__u8 *) skb->data); | ||
67 | 63 | ||
68 | if (status) { | 64 | clear_bit(HCI_INQUIRY, &hdev->flags); |
69 | BT_DBG("%s Inquiry cancel error: status 0x%x", hdev->name, status); | ||
70 | } else { | ||
71 | clear_bit(HCI_INQUIRY, &hdev->flags); | ||
72 | hci_req_complete(hdev, status); | ||
73 | } | ||
74 | 65 | ||
75 | hci_dev_lock(hdev); | 66 | hci_req_complete(hdev, status); |
76 | 67 | ||
77 | pend = hci_conn_hash_lookup_state(hdev, ACL_LINK, BT_CONNECT2); | 68 | hci_conn_check_pending(hdev); |
78 | if (pend) | 69 | } |
79 | hci_acl_connect(pend); | ||
80 | 70 | ||
81 | hci_dev_unlock(hdev); | 71 | static void hci_cc_exit_periodic_inq(struct hci_dev *hdev, struct sk_buff *skb) |
72 | { | ||
73 | __u8 status = *((__u8 *) skb->data); | ||
82 | 74 | ||
83 | break; | 75 | BT_DBG("%s status 0x%x", hdev->name, status); |
84 | 76 | ||
85 | default: | 77 | if (status) |
86 | BT_DBG("%s Command complete: ogf LINK_CTL ocf %x", hdev->name, ocf); | 78 | return; |
87 | break; | 79 | |
80 | clear_bit(HCI_INQUIRY, &hdev->flags); | ||
81 | |||
82 | hci_conn_check_pending(hdev); | ||
83 | } | ||
84 | |||
85 | static void hci_cc_remote_name_req_cancel(struct hci_dev *hdev, struct sk_buff *skb) | ||
86 | { | ||
87 | BT_DBG("%s", hdev->name); | ||
88 | } | ||
89 | |||
90 | static void hci_cc_role_discovery(struct hci_dev *hdev, struct sk_buff *skb) | ||
91 | { | ||
92 | struct hci_rp_role_discovery *rp = (void *) skb->data; | ||
93 | struct hci_conn *conn; | ||
94 | |||
95 | BT_DBG("%s status 0x%x", hdev->name, rp->status); | ||
96 | |||
97 | if (rp->status) | ||
98 | return; | ||
99 | |||
100 | hci_dev_lock(hdev); | ||
101 | |||
102 | conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(rp->handle)); | ||
103 | if (conn) { | ||
104 | if (rp->role) | ||
105 | conn->link_mode &= ~HCI_LM_MASTER; | ||
106 | else | ||
107 | conn->link_mode |= HCI_LM_MASTER; | ||
88 | } | 108 | } |
109 | |||
110 | hci_dev_unlock(hdev); | ||
89 | } | 111 | } |
90 | 112 | ||
91 | /* Command Complete OGF LINK_POLICY */ | 113 | static void hci_cc_write_link_policy(struct hci_dev *hdev, struct sk_buff *skb) |
92 | static void hci_cc_link_policy(struct hci_dev *hdev, __u16 ocf, struct sk_buff *skb) | ||
93 | { | 114 | { |
115 | struct hci_rp_write_link_policy *rp = (void *) skb->data; | ||
94 | struct hci_conn *conn; | 116 | struct hci_conn *conn; |
95 | struct hci_rp_role_discovery *rd; | ||
96 | struct hci_rp_write_link_policy *lp; | ||
97 | void *sent; | 117 | void *sent; |
98 | 118 | ||
99 | BT_DBG("%s ocf 0x%x", hdev->name, ocf); | 119 | BT_DBG("%s status 0x%x", hdev->name, rp->status); |
100 | 120 | ||
101 | switch (ocf) { | 121 | if (rp->status) |
102 | case OCF_ROLE_DISCOVERY: | 122 | return; |
103 | rd = (void *) skb->data; | ||
104 | 123 | ||
105 | if (rd->status) | 124 | sent = hci_sent_cmd_data(hdev, HCI_OP_WRITE_LINK_POLICY); |
106 | break; | 125 | if (!sent) |
126 | return; | ||
107 | 127 | ||
108 | hci_dev_lock(hdev); | 128 | hci_dev_lock(hdev); |
109 | 129 | ||
110 | conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(rd->handle)); | 130 | conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(rp->handle)); |
111 | if (conn) { | 131 | if (conn) { |
112 | if (rd->role) | 132 | __le16 policy = get_unaligned((__le16 *) (sent + 2)); |
113 | conn->link_mode &= ~HCI_LM_MASTER; | 133 | conn->link_policy = __le16_to_cpu(policy); |
114 | else | 134 | } |
115 | conn->link_mode |= HCI_LM_MASTER; | ||
116 | } | ||
117 | 135 | ||
118 | hci_dev_unlock(hdev); | 136 | hci_dev_unlock(hdev); |
119 | break; | 137 | } |
120 | 138 | ||
121 | case OCF_WRITE_LINK_POLICY: | 139 | static void hci_cc_reset(struct hci_dev *hdev, struct sk_buff *skb) |
122 | sent = hci_sent_cmd_data(hdev, OGF_LINK_POLICY, OCF_WRITE_LINK_POLICY); | 140 | { |
123 | if (!sent) | 141 | __u8 status = *((__u8 *) skb->data); |
124 | break; | ||
125 | 142 | ||
126 | lp = (struct hci_rp_write_link_policy *) skb->data; | 143 | BT_DBG("%s status 0x%x", hdev->name, status); |
127 | 144 | ||
128 | if (lp->status) | 145 | hci_req_complete(hdev, status); |
129 | break; | 146 | } |
130 | 147 | ||
131 | hci_dev_lock(hdev); | 148 | static void hci_cc_write_local_name(struct hci_dev *hdev, struct sk_buff *skb) |
149 | { | ||
150 | __u8 status = *((__u8 *) skb->data); | ||
151 | void *sent; | ||
132 | 152 | ||
133 | conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(lp->handle)); | 153 | BT_DBG("%s status 0x%x", hdev->name, status); |
134 | if (conn) { | ||
135 | __le16 policy = get_unaligned((__le16 *) (sent + 2)); | ||
136 | conn->link_policy = __le16_to_cpu(policy); | ||
137 | } | ||
138 | 154 | ||
139 | hci_dev_unlock(hdev); | 155 | sent = hci_sent_cmd_data(hdev, HCI_OP_WRITE_LOCAL_NAME); |
140 | break; | 156 | if (!sent) |
157 | return; | ||
141 | 158 | ||
142 | default: | 159 | if (!status) |
143 | BT_DBG("%s: Command complete: ogf LINK_POLICY ocf %x", | 160 | memcpy(hdev->dev_name, sent, 248); |
144 | hdev->name, ocf); | 161 | } |
145 | break; | 162 | |
163 | static void hci_cc_read_local_name(struct hci_dev *hdev, struct sk_buff *skb) | ||
164 | { | ||
165 | struct hci_rp_read_local_name *rp = (void *) skb->data; | ||
166 | |||
167 | BT_DBG("%s status 0x%x", hdev->name, rp->status); | ||
168 | |||
169 | if (rp->status) | ||
170 | return; | ||
171 | |||
172 | memcpy(hdev->dev_name, rp->name, 248); | ||
173 | } | ||
174 | |||
175 | static void hci_cc_write_auth_enable(struct hci_dev *hdev, struct sk_buff *skb) | ||
176 | { | ||
177 | __u8 status = *((__u8 *) skb->data); | ||
178 | void *sent; | ||
179 | |||
180 | BT_DBG("%s status 0x%x", hdev->name, status); | ||
181 | |||
182 | sent = hci_sent_cmd_data(hdev, HCI_OP_WRITE_AUTH_ENABLE); | ||
183 | if (!sent) | ||
184 | return; | ||
185 | |||
186 | if (!status) { | ||
187 | __u8 param = *((__u8 *) sent); | ||
188 | |||
189 | if (param == AUTH_ENABLED) | ||
190 | set_bit(HCI_AUTH, &hdev->flags); | ||
191 | else | ||
192 | clear_bit(HCI_AUTH, &hdev->flags); | ||
146 | } | 193 | } |
194 | |||
195 | hci_req_complete(hdev, status); | ||
147 | } | 196 | } |
148 | 197 | ||
149 | /* Command Complete OGF HOST_CTL */ | 198 | static void hci_cc_write_encrypt_mode(struct hci_dev *hdev, struct sk_buff *skb) |
150 | static void hci_cc_host_ctl(struct hci_dev *hdev, __u16 ocf, struct sk_buff *skb) | ||
151 | { | 199 | { |
152 | __u8 status, param; | 200 | __u8 status = *((__u8 *) skb->data); |
153 | __u16 setting; | ||
154 | struct hci_rp_read_voice_setting *vs; | ||
155 | void *sent; | 201 | void *sent; |
156 | 202 | ||
157 | BT_DBG("%s ocf 0x%x", hdev->name, ocf); | 203 | BT_DBG("%s status 0x%x", hdev->name, status); |
158 | 204 | ||
159 | switch (ocf) { | 205 | sent = hci_sent_cmd_data(hdev, HCI_OP_WRITE_ENCRYPT_MODE); |
160 | case OCF_RESET: | 206 | if (!sent) |
161 | status = *((__u8 *) skb->data); | 207 | return; |
162 | hci_req_complete(hdev, status); | ||
163 | break; | ||
164 | 208 | ||
165 | case OCF_SET_EVENT_FLT: | 209 | if (!status) { |
166 | status = *((__u8 *) skb->data); | 210 | __u8 param = *((__u8 *) sent); |
167 | if (status) { | ||
168 | BT_DBG("%s SET_EVENT_FLT failed %d", hdev->name, status); | ||
169 | } else { | ||
170 | BT_DBG("%s SET_EVENT_FLT succeseful", hdev->name); | ||
171 | } | ||
172 | break; | ||
173 | 211 | ||
174 | case OCF_WRITE_AUTH_ENABLE: | 212 | if (param) |
175 | sent = hci_sent_cmd_data(hdev, OGF_HOST_CTL, OCF_WRITE_AUTH_ENABLE); | 213 | set_bit(HCI_ENCRYPT, &hdev->flags); |
176 | if (!sent) | 214 | else |
177 | break; | 215 | clear_bit(HCI_ENCRYPT, &hdev->flags); |
216 | } | ||
178 | 217 | ||
179 | status = *((__u8 *) skb->data); | 218 | hci_req_complete(hdev, status); |
180 | param = *((__u8 *) sent); | 219 | } |
181 | 220 | ||
182 | if (!status) { | 221 | static void hci_cc_write_scan_enable(struct hci_dev *hdev, struct sk_buff *skb) |
183 | if (param == AUTH_ENABLED) | 222 | { |
184 | set_bit(HCI_AUTH, &hdev->flags); | 223 | __u8 status = *((__u8 *) skb->data); |
185 | else | 224 | void *sent; |
186 | clear_bit(HCI_AUTH, &hdev->flags); | ||
187 | } | ||
188 | hci_req_complete(hdev, status); | ||
189 | break; | ||
190 | 225 | ||
191 | case OCF_WRITE_ENCRYPT_MODE: | 226 | BT_DBG("%s status 0x%x", hdev->name, status); |
192 | sent = hci_sent_cmd_data(hdev, OGF_HOST_CTL, OCF_WRITE_ENCRYPT_MODE); | ||
193 | if (!sent) | ||
194 | break; | ||
195 | 227 | ||
196 | status = *((__u8 *) skb->data); | 228 | sent = hci_sent_cmd_data(hdev, HCI_OP_WRITE_SCAN_ENABLE); |
197 | param = *((__u8 *) sent); | 229 | if (!sent) |
230 | return; | ||
198 | 231 | ||
199 | if (!status) { | 232 | if (!status) { |
200 | if (param) | 233 | __u8 param = *((__u8 *) sent); |
201 | set_bit(HCI_ENCRYPT, &hdev->flags); | ||
202 | else | ||
203 | clear_bit(HCI_ENCRYPT, &hdev->flags); | ||
204 | } | ||
205 | hci_req_complete(hdev, status); | ||
206 | break; | ||
207 | 234 | ||
208 | case OCF_WRITE_CA_TIMEOUT: | 235 | clear_bit(HCI_PSCAN, &hdev->flags); |
209 | status = *((__u8 *) skb->data); | 236 | clear_bit(HCI_ISCAN, &hdev->flags); |
210 | if (status) { | ||
211 | BT_DBG("%s OCF_WRITE_CA_TIMEOUT failed %d", hdev->name, status); | ||
212 | } else { | ||
213 | BT_DBG("%s OCF_WRITE_CA_TIMEOUT succeseful", hdev->name); | ||
214 | } | ||
215 | break; | ||
216 | 237 | ||
217 | case OCF_WRITE_PG_TIMEOUT: | 238 | if (param & SCAN_INQUIRY) |
218 | status = *((__u8 *) skb->data); | 239 | set_bit(HCI_ISCAN, &hdev->flags); |
219 | if (status) { | ||
220 | BT_DBG("%s OCF_WRITE_PG_TIMEOUT failed %d", hdev->name, status); | ||
221 | } else { | ||
222 | BT_DBG("%s: OCF_WRITE_PG_TIMEOUT succeseful", hdev->name); | ||
223 | } | ||
224 | break; | ||
225 | 240 | ||
226 | case OCF_WRITE_SCAN_ENABLE: | 241 | if (param & SCAN_PAGE) |
227 | sent = hci_sent_cmd_data(hdev, OGF_HOST_CTL, OCF_WRITE_SCAN_ENABLE); | 242 | set_bit(HCI_PSCAN, &hdev->flags); |
228 | if (!sent) | 243 | } |
229 | break; | ||
230 | 244 | ||
231 | status = *((__u8 *) skb->data); | 245 | hci_req_complete(hdev, status); |
232 | param = *((__u8 *) sent); | 246 | } |
233 | 247 | ||
234 | BT_DBG("param 0x%x", param); | 248 | static void hci_cc_read_class_of_dev(struct hci_dev *hdev, struct sk_buff *skb) |
249 | { | ||
250 | struct hci_rp_read_class_of_dev *rp = (void *) skb->data; | ||
235 | 251 | ||
236 | if (!status) { | 252 | BT_DBG("%s status 0x%x", hdev->name, rp->status); |
237 | clear_bit(HCI_PSCAN, &hdev->flags); | ||
238 | clear_bit(HCI_ISCAN, &hdev->flags); | ||
239 | if (param & SCAN_INQUIRY) | ||
240 | set_bit(HCI_ISCAN, &hdev->flags); | ||
241 | 253 | ||
242 | if (param & SCAN_PAGE) | 254 | if (rp->status) |
243 | set_bit(HCI_PSCAN, &hdev->flags); | 255 | return; |
244 | } | ||
245 | hci_req_complete(hdev, status); | ||
246 | break; | ||
247 | 256 | ||
248 | case OCF_READ_VOICE_SETTING: | 257 | memcpy(hdev->dev_class, rp->dev_class, 3); |
249 | vs = (struct hci_rp_read_voice_setting *) skb->data; | ||
250 | 258 | ||
251 | if (vs->status) { | 259 | BT_DBG("%s class 0x%.2x%.2x%.2x", hdev->name, |
252 | BT_DBG("%s READ_VOICE_SETTING failed %d", hdev->name, vs->status); | 260 | hdev->dev_class[2], hdev->dev_class[1], hdev->dev_class[0]); |
253 | break; | 261 | } |
254 | } | ||
255 | 262 | ||
256 | setting = __le16_to_cpu(vs->voice_setting); | 263 | static void hci_cc_write_class_of_dev(struct hci_dev *hdev, struct sk_buff *skb) |
264 | { | ||
265 | __u8 status = *((__u8 *) skb->data); | ||
266 | void *sent; | ||
257 | 267 | ||
258 | if (hdev->voice_setting != setting ) { | 268 | BT_DBG("%s status 0x%x", hdev->name, status); |
259 | hdev->voice_setting = setting; | ||
260 | 269 | ||
261 | BT_DBG("%s: voice setting 0x%04x", hdev->name, setting); | 270 | sent = hci_sent_cmd_data(hdev, HCI_OP_WRITE_CLASS_OF_DEV); |
271 | if (!sent) | ||
272 | return; | ||
262 | 273 | ||
263 | if (hdev->notify) { | 274 | if (!status) |
264 | tasklet_disable(&hdev->tx_task); | 275 | memcpy(hdev->dev_class, sent, 3); |
265 | hdev->notify(hdev, HCI_NOTIFY_VOICE_SETTING); | 276 | } |
266 | tasklet_enable(&hdev->tx_task); | ||
267 | } | ||
268 | } | ||
269 | break; | ||
270 | 277 | ||
271 | case OCF_WRITE_VOICE_SETTING: | 278 | static void hci_cc_read_voice_setting(struct hci_dev *hdev, struct sk_buff *skb) |
272 | sent = hci_sent_cmd_data(hdev, OGF_HOST_CTL, OCF_WRITE_VOICE_SETTING); | 279 | { |
273 | if (!sent) | 280 | struct hci_rp_read_voice_setting *rp = (void *) skb->data; |
274 | break; | 281 | __u16 setting; |
282 | |||
283 | BT_DBG("%s status 0x%x", hdev->name, rp->status); | ||
284 | |||
285 | if (rp->status) | ||
286 | return; | ||
287 | |||
288 | setting = __le16_to_cpu(rp->voice_setting); | ||
289 | |||
290 | if (hdev->voice_setting == setting ) | ||
291 | return; | ||
292 | |||
293 | hdev->voice_setting = setting; | ||
275 | 294 | ||
276 | status = *((__u8 *) skb->data); | 295 | BT_DBG("%s voice setting 0x%04x", hdev->name, setting); |
277 | setting = __le16_to_cpu(get_unaligned((__le16 *) sent)); | ||
278 | 296 | ||
279 | if (!status && hdev->voice_setting != setting) { | 297 | if (hdev->notify) { |
298 | tasklet_disable(&hdev->tx_task); | ||
299 | hdev->notify(hdev, HCI_NOTIFY_VOICE_SETTING); | ||
300 | tasklet_enable(&hdev->tx_task); | ||
301 | } | ||
302 | } | ||
303 | |||
304 | static void hci_cc_write_voice_setting(struct hci_dev *hdev, struct sk_buff *skb) | ||
305 | { | ||
306 | __u8 status = *((__u8 *) skb->data); | ||
307 | void *sent; | ||
308 | |||
309 | BT_DBG("%s status 0x%x", hdev->name, status); | ||
310 | |||
311 | sent = hci_sent_cmd_data(hdev, HCI_OP_WRITE_VOICE_SETTING); | ||
312 | if (!sent) | ||
313 | return; | ||
314 | |||
315 | if (!status) { | ||
316 | __u16 setting = __le16_to_cpu(get_unaligned((__le16 *) sent)); | ||
317 | |||
318 | if (hdev->voice_setting != setting) { | ||
280 | hdev->voice_setting = setting; | 319 | hdev->voice_setting = setting; |
281 | 320 | ||
282 | BT_DBG("%s: voice setting 0x%04x", hdev->name, setting); | 321 | BT_DBG("%s voice setting 0x%04x", hdev->name, setting); |
283 | 322 | ||
284 | if (hdev->notify) { | 323 | if (hdev->notify) { |
285 | tasklet_disable(&hdev->tx_task); | 324 | tasklet_disable(&hdev->tx_task); |
@@ -287,143 +326,153 @@ static void hci_cc_host_ctl(struct hci_dev *hdev, __u16 ocf, struct sk_buff *skb | |||
287 | tasklet_enable(&hdev->tx_task); | 326 | tasklet_enable(&hdev->tx_task); |
288 | } | 327 | } |
289 | } | 328 | } |
290 | hci_req_complete(hdev, status); | ||
291 | break; | ||
292 | |||
293 | case OCF_HOST_BUFFER_SIZE: | ||
294 | status = *((__u8 *) skb->data); | ||
295 | if (status) { | ||
296 | BT_DBG("%s OCF_BUFFER_SIZE failed %d", hdev->name, status); | ||
297 | hci_req_complete(hdev, status); | ||
298 | } | ||
299 | break; | ||
300 | |||
301 | default: | ||
302 | BT_DBG("%s Command complete: ogf HOST_CTL ocf %x", hdev->name, ocf); | ||
303 | break; | ||
304 | } | 329 | } |
305 | } | 330 | } |
306 | 331 | ||
307 | /* Command Complete OGF INFO_PARAM */ | 332 | static void hci_cc_host_buffer_size(struct hci_dev *hdev, struct sk_buff *skb) |
308 | static void hci_cc_info_param(struct hci_dev *hdev, __u16 ocf, struct sk_buff *skb) | ||
309 | { | 333 | { |
310 | struct hci_rp_read_loc_version *lv; | 334 | __u8 status = *((__u8 *) skb->data); |
311 | struct hci_rp_read_local_features *lf; | ||
312 | struct hci_rp_read_buffer_size *bs; | ||
313 | struct hci_rp_read_bd_addr *ba; | ||
314 | 335 | ||
315 | BT_DBG("%s ocf 0x%x", hdev->name, ocf); | 336 | BT_DBG("%s status 0x%x", hdev->name, status); |
316 | 337 | ||
317 | switch (ocf) { | 338 | hci_req_complete(hdev, status); |
318 | case OCF_READ_LOCAL_VERSION: | 339 | } |
319 | lv = (struct hci_rp_read_loc_version *) skb->data; | ||
320 | 340 | ||
321 | if (lv->status) { | 341 | static void hci_cc_read_local_version(struct hci_dev *hdev, struct sk_buff *skb) |
322 | BT_DBG("%s READ_LOCAL_VERSION failed %d", hdev->name, lf->status); | 342 | { |
323 | break; | 343 | struct hci_rp_read_local_version *rp = (void *) skb->data; |
324 | } | ||
325 | 344 | ||
326 | hdev->hci_ver = lv->hci_ver; | 345 | BT_DBG("%s status 0x%x", hdev->name, rp->status); |
327 | hdev->hci_rev = btohs(lv->hci_rev); | ||
328 | hdev->manufacturer = btohs(lv->manufacturer); | ||
329 | 346 | ||
330 | BT_DBG("%s: manufacturer %d hci_ver %d hci_rev %d", hdev->name, | 347 | if (rp->status) |
331 | hdev->manufacturer, hdev->hci_ver, hdev->hci_rev); | 348 | return; |
332 | 349 | ||
333 | break; | 350 | hdev->hci_ver = rp->hci_ver; |
351 | hdev->hci_rev = btohs(rp->hci_rev); | ||
352 | hdev->manufacturer = btohs(rp->manufacturer); | ||
334 | 353 | ||
335 | case OCF_READ_LOCAL_FEATURES: | 354 | BT_DBG("%s manufacturer %d hci ver %d:%d", hdev->name, |
336 | lf = (struct hci_rp_read_local_features *) skb->data; | 355 | hdev->manufacturer, |
356 | hdev->hci_ver, hdev->hci_rev); | ||
357 | } | ||
337 | 358 | ||
338 | if (lf->status) { | 359 | static void hci_cc_read_local_commands(struct hci_dev *hdev, struct sk_buff *skb) |
339 | BT_DBG("%s READ_LOCAL_FEATURES failed %d", hdev->name, lf->status); | 360 | { |
340 | break; | 361 | struct hci_rp_read_local_commands *rp = (void *) skb->data; |
341 | } | ||
342 | 362 | ||
343 | memcpy(hdev->features, lf->features, sizeof(hdev->features)); | 363 | BT_DBG("%s status 0x%x", hdev->name, rp->status); |
344 | 364 | ||
345 | /* Adjust default settings according to features | 365 | if (rp->status) |
346 | * supported by device. */ | 366 | return; |
347 | if (hdev->features[0] & LMP_3SLOT) | ||
348 | hdev->pkt_type |= (HCI_DM3 | HCI_DH3); | ||
349 | 367 | ||
350 | if (hdev->features[0] & LMP_5SLOT) | 368 | memcpy(hdev->commands, rp->commands, sizeof(hdev->commands)); |
351 | hdev->pkt_type |= (HCI_DM5 | HCI_DH5); | 369 | } |
352 | 370 | ||
353 | if (hdev->features[1] & LMP_HV2) { | 371 | static void hci_cc_read_local_features(struct hci_dev *hdev, struct sk_buff *skb) |
354 | hdev->pkt_type |= (HCI_HV2); | 372 | { |
355 | hdev->esco_type |= (ESCO_HV2); | 373 | struct hci_rp_read_local_features *rp = (void *) skb->data; |
356 | } | ||
357 | 374 | ||
358 | if (hdev->features[1] & LMP_HV3) { | 375 | BT_DBG("%s status 0x%x", hdev->name, rp->status); |
359 | hdev->pkt_type |= (HCI_HV3); | ||
360 | hdev->esco_type |= (ESCO_HV3); | ||
361 | } | ||
362 | 376 | ||
363 | if (hdev->features[3] & LMP_ESCO) | 377 | if (rp->status) |
364 | hdev->esco_type |= (ESCO_EV3); | 378 | return; |
365 | 379 | ||
366 | if (hdev->features[4] & LMP_EV4) | 380 | memcpy(hdev->features, rp->features, 8); |
367 | hdev->esco_type |= (ESCO_EV4); | ||
368 | 381 | ||
369 | if (hdev->features[4] & LMP_EV5) | 382 | /* Adjust default settings according to features |
370 | hdev->esco_type |= (ESCO_EV5); | 383 | * supported by device. */ |
371 | 384 | ||
372 | BT_DBG("%s: features 0x%x 0x%x 0x%x", hdev->name, | 385 | if (hdev->features[0] & LMP_3SLOT) |
373 | lf->features[0], lf->features[1], lf->features[2]); | 386 | hdev->pkt_type |= (HCI_DM3 | HCI_DH3); |
374 | 387 | ||
375 | break; | 388 | if (hdev->features[0] & LMP_5SLOT) |
389 | hdev->pkt_type |= (HCI_DM5 | HCI_DH5); | ||
376 | 390 | ||
377 | case OCF_READ_BUFFER_SIZE: | 391 | if (hdev->features[1] & LMP_HV2) { |
378 | bs = (struct hci_rp_read_buffer_size *) skb->data; | 392 | hdev->pkt_type |= (HCI_HV2); |
393 | hdev->esco_type |= (ESCO_HV2); | ||
394 | } | ||
379 | 395 | ||
380 | if (bs->status) { | 396 | if (hdev->features[1] & LMP_HV3) { |
381 | BT_DBG("%s READ_BUFFER_SIZE failed %d", hdev->name, bs->status); | 397 | hdev->pkt_type |= (HCI_HV3); |
382 | hci_req_complete(hdev, bs->status); | 398 | hdev->esco_type |= (ESCO_HV3); |
383 | break; | 399 | } |
384 | } | ||
385 | 400 | ||
386 | hdev->acl_mtu = __le16_to_cpu(bs->acl_mtu); | 401 | if (hdev->features[3] & LMP_ESCO) |
387 | hdev->sco_mtu = bs->sco_mtu; | 402 | hdev->esco_type |= (ESCO_EV3); |
388 | hdev->acl_pkts = __le16_to_cpu(bs->acl_max_pkt); | ||
389 | hdev->sco_pkts = __le16_to_cpu(bs->sco_max_pkt); | ||
390 | 403 | ||
391 | if (test_bit(HCI_QUIRK_FIXUP_BUFFER_SIZE, &hdev->quirks)) { | 404 | if (hdev->features[4] & LMP_EV4) |
392 | hdev->sco_mtu = 64; | 405 | hdev->esco_type |= (ESCO_EV4); |
393 | hdev->sco_pkts = 8; | ||
394 | } | ||
395 | 406 | ||
396 | hdev->acl_cnt = hdev->acl_pkts; | 407 | if (hdev->features[4] & LMP_EV5) |
397 | hdev->sco_cnt = hdev->sco_pkts; | 408 | hdev->esco_type |= (ESCO_EV5); |
398 | 409 | ||
399 | BT_DBG("%s mtu: acl %d, sco %d max_pkt: acl %d, sco %d", hdev->name, | 410 | BT_DBG("%s features 0x%.2x%.2x%.2x%.2x%.2x%.2x%.2x%.2x", hdev->name, |
400 | hdev->acl_mtu, hdev->sco_mtu, hdev->acl_pkts, hdev->sco_pkts); | 411 | hdev->features[0], hdev->features[1], |
401 | break; | 412 | hdev->features[2], hdev->features[3], |
413 | hdev->features[4], hdev->features[5], | ||
414 | hdev->features[6], hdev->features[7]); | ||
415 | } | ||
402 | 416 | ||
403 | case OCF_READ_BD_ADDR: | 417 | static void hci_cc_read_buffer_size(struct hci_dev *hdev, struct sk_buff *skb) |
404 | ba = (struct hci_rp_read_bd_addr *) skb->data; | 418 | { |
419 | struct hci_rp_read_buffer_size *rp = (void *) skb->data; | ||
405 | 420 | ||
406 | if (!ba->status) { | 421 | BT_DBG("%s status 0x%x", hdev->name, rp->status); |
407 | bacpy(&hdev->bdaddr, &ba->bdaddr); | ||
408 | } else { | ||
409 | BT_DBG("%s: READ_BD_ADDR failed %d", hdev->name, ba->status); | ||
410 | } | ||
411 | 422 | ||
412 | hci_req_complete(hdev, ba->status); | 423 | if (rp->status) |
413 | break; | 424 | return; |
414 | 425 | ||
415 | default: | 426 | hdev->acl_mtu = __le16_to_cpu(rp->acl_mtu); |
416 | BT_DBG("%s Command complete: ogf INFO_PARAM ocf %x", hdev->name, ocf); | 427 | hdev->sco_mtu = rp->sco_mtu; |
417 | break; | 428 | hdev->acl_pkts = __le16_to_cpu(rp->acl_max_pkt); |
429 | hdev->sco_pkts = __le16_to_cpu(rp->sco_max_pkt); | ||
430 | |||
431 | if (test_bit(HCI_QUIRK_FIXUP_BUFFER_SIZE, &hdev->quirks)) { | ||
432 | hdev->sco_mtu = 64; | ||
433 | hdev->sco_pkts = 8; | ||
418 | } | 434 | } |
435 | |||
436 | hdev->acl_cnt = hdev->acl_pkts; | ||
437 | hdev->sco_cnt = hdev->sco_pkts; | ||
438 | |||
439 | BT_DBG("%s acl mtu %d:%d sco mtu %d:%d", hdev->name, | ||
440 | hdev->acl_mtu, hdev->acl_pkts, | ||
441 | hdev->sco_mtu, hdev->sco_pkts); | ||
442 | } | ||
443 | |||
444 | static void hci_cc_read_bd_addr(struct hci_dev *hdev, struct sk_buff *skb) | ||
445 | { | ||
446 | struct hci_rp_read_bd_addr *rp = (void *) skb->data; | ||
447 | |||
448 | BT_DBG("%s status 0x%x", hdev->name, rp->status); | ||
449 | |||
450 | if (!rp->status) | ||
451 | bacpy(&hdev->bdaddr, &rp->bdaddr); | ||
452 | |||
453 | hci_req_complete(hdev, rp->status); | ||
454 | } | ||
455 | |||
456 | static inline void hci_cs_inquiry(struct hci_dev *hdev, __u8 status) | ||
457 | { | ||
458 | BT_DBG("%s status 0x%x", hdev->name, status); | ||
459 | |||
460 | if (status) { | ||
461 | hci_req_complete(hdev, status); | ||
462 | |||
463 | hci_conn_check_pending(hdev); | ||
464 | } else | ||
465 | set_bit(HCI_INQUIRY, &hdev->flags); | ||
419 | } | 466 | } |
420 | 467 | ||
421 | /* Command Status OGF LINK_CTL */ | ||
422 | static inline void hci_cs_create_conn(struct hci_dev *hdev, __u8 status) | 468 | static inline void hci_cs_create_conn(struct hci_dev *hdev, __u8 status) |
423 | { | 469 | { |
470 | struct hci_cp_create_conn *cp; | ||
424 | struct hci_conn *conn; | 471 | struct hci_conn *conn; |
425 | struct hci_cp_create_conn *cp = hci_sent_cmd_data(hdev, OGF_LINK_CTL, OCF_CREATE_CONN); | ||
426 | 472 | ||
473 | BT_DBG("%s status 0x%x", hdev->name, status); | ||
474 | |||
475 | cp = hci_sent_cmd_data(hdev, HCI_OP_CREATE_CONN); | ||
427 | if (!cp) | 476 | if (!cp) |
428 | return; | 477 | return; |
429 | 478 | ||
@@ -431,8 +480,7 @@ static inline void hci_cs_create_conn(struct hci_dev *hdev, __u8 status) | |||
431 | 480 | ||
432 | conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &cp->bdaddr); | 481 | conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &cp->bdaddr); |
433 | 482 | ||
434 | BT_DBG("%s status 0x%x bdaddr %s conn %p", hdev->name, | 483 | BT_DBG("%s bdaddr %s conn %p", hdev->name, batostr(&cp->bdaddr), conn); |
435 | status, batostr(&cp->bdaddr), conn); | ||
436 | 484 | ||
437 | if (status) { | 485 | if (status) { |
438 | if (conn && conn->state == BT_CONNECT) { | 486 | if (conn && conn->state == BT_CONNECT) { |
@@ -457,234 +505,138 @@ static inline void hci_cs_create_conn(struct hci_dev *hdev, __u8 status) | |||
457 | hci_dev_unlock(hdev); | 505 | hci_dev_unlock(hdev); |
458 | } | 506 | } |
459 | 507 | ||
460 | static void hci_cs_link_ctl(struct hci_dev *hdev, __u16 ocf, __u8 status) | 508 | static void hci_cs_add_sco(struct hci_dev *hdev, __u8 status) |
461 | { | 509 | { |
462 | BT_DBG("%s ocf 0x%x", hdev->name, ocf); | 510 | struct hci_cp_add_sco *cp; |
511 | struct hci_conn *acl, *sco; | ||
512 | __u16 handle; | ||
463 | 513 | ||
464 | switch (ocf) { | 514 | BT_DBG("%s status 0x%x", hdev->name, status); |
465 | case OCF_CREATE_CONN: | ||
466 | hci_cs_create_conn(hdev, status); | ||
467 | break; | ||
468 | |||
469 | case OCF_ADD_SCO: | ||
470 | if (status) { | ||
471 | struct hci_conn *acl, *sco; | ||
472 | struct hci_cp_add_sco *cp = hci_sent_cmd_data(hdev, OGF_LINK_CTL, OCF_ADD_SCO); | ||
473 | __u16 handle; | ||
474 | |||
475 | if (!cp) | ||
476 | break; | ||
477 | 515 | ||
478 | handle = __le16_to_cpu(cp->handle); | 516 | if (!status) |
479 | 517 | return; | |
480 | BT_DBG("%s Add SCO error: handle %d status 0x%x", hdev->name, handle, status); | ||
481 | 518 | ||
482 | hci_dev_lock(hdev); | 519 | cp = hci_sent_cmd_data(hdev, HCI_OP_ADD_SCO); |
520 | if (!cp) | ||
521 | return; | ||
483 | 522 | ||
484 | acl = hci_conn_hash_lookup_handle(hdev, handle); | 523 | handle = __le16_to_cpu(cp->handle); |
485 | if (acl && (sco = acl->link)) { | ||
486 | sco->state = BT_CLOSED; | ||
487 | 524 | ||
488 | hci_proto_connect_cfm(sco, status); | 525 | BT_DBG("%s handle %d", hdev->name, handle); |
489 | hci_conn_del(sco); | ||
490 | } | ||
491 | 526 | ||
492 | hci_dev_unlock(hdev); | 527 | hci_dev_lock(hdev); |
493 | } | ||
494 | break; | ||
495 | 528 | ||
496 | case OCF_INQUIRY: | 529 | acl = hci_conn_hash_lookup_handle(hdev, handle); |
497 | if (status) { | 530 | if (acl && (sco = acl->link)) { |
498 | BT_DBG("%s Inquiry error: status 0x%x", hdev->name, status); | 531 | sco->state = BT_CLOSED; |
499 | hci_req_complete(hdev, status); | ||
500 | } else { | ||
501 | set_bit(HCI_INQUIRY, &hdev->flags); | ||
502 | } | ||
503 | break; | ||
504 | 532 | ||
505 | default: | 533 | hci_proto_connect_cfm(sco, status); |
506 | BT_DBG("%s Command status: ogf LINK_CTL ocf %x status %d", | 534 | hci_conn_del(sco); |
507 | hdev->name, ocf, status); | ||
508 | break; | ||
509 | } | 535 | } |
536 | |||
537 | hci_dev_unlock(hdev); | ||
510 | } | 538 | } |
511 | 539 | ||
512 | /* Command Status OGF LINK_POLICY */ | 540 | static void hci_cs_remote_name_req(struct hci_dev *hdev, __u8 status) |
513 | static void hci_cs_link_policy(struct hci_dev *hdev, __u16 ocf, __u8 status) | ||
514 | { | 541 | { |
515 | BT_DBG("%s ocf 0x%x", hdev->name, ocf); | 542 | BT_DBG("%s status 0x%x", hdev->name, status); |
516 | 543 | } | |
517 | switch (ocf) { | ||
518 | case OCF_SNIFF_MODE: | ||
519 | if (status) { | ||
520 | struct hci_conn *conn; | ||
521 | struct hci_cp_sniff_mode *cp = hci_sent_cmd_data(hdev, OGF_LINK_POLICY, OCF_SNIFF_MODE); | ||
522 | 544 | ||
523 | if (!cp) | 545 | static void hci_cs_setup_sync_conn(struct hci_dev *hdev, __u8 status) |
524 | break; | 546 | { |
547 | struct hci_cp_setup_sync_conn *cp; | ||
548 | struct hci_conn *acl, *sco; | ||
549 | __u16 handle; | ||
525 | 550 | ||
526 | hci_dev_lock(hdev); | 551 | BT_DBG("%s status 0x%x", hdev->name, status); |
527 | 552 | ||
528 | conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(cp->handle)); | 553 | if (!status) |
529 | if (conn) { | 554 | return; |
530 | clear_bit(HCI_CONN_MODE_CHANGE_PEND, &conn->pend); | ||
531 | } | ||
532 | |||
533 | hci_dev_unlock(hdev); | ||
534 | } | ||
535 | break; | ||
536 | 555 | ||
537 | case OCF_EXIT_SNIFF_MODE: | 556 | cp = hci_sent_cmd_data(hdev, HCI_OP_SETUP_SYNC_CONN); |
538 | if (status) { | 557 | if (!cp) |
539 | struct hci_conn *conn; | 558 | return; |
540 | struct hci_cp_exit_sniff_mode *cp = hci_sent_cmd_data(hdev, OGF_LINK_POLICY, OCF_EXIT_SNIFF_MODE); | ||
541 | 559 | ||
542 | if (!cp) | 560 | handle = __le16_to_cpu(cp->handle); |
543 | break; | ||
544 | 561 | ||
545 | hci_dev_lock(hdev); | 562 | BT_DBG("%s handle %d", hdev->name, handle); |
546 | 563 | ||
547 | conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(cp->handle)); | 564 | hci_dev_lock(hdev); |
548 | if (conn) { | ||
549 | clear_bit(HCI_CONN_MODE_CHANGE_PEND, &conn->pend); | ||
550 | } | ||
551 | 565 | ||
552 | hci_dev_unlock(hdev); | 566 | acl = hci_conn_hash_lookup_handle(hdev, handle); |
553 | } | 567 | if (acl && (sco = acl->link)) { |
554 | break; | 568 | sco->state = BT_CLOSED; |
555 | 569 | ||
556 | default: | 570 | hci_proto_connect_cfm(sco, status); |
557 | BT_DBG("%s Command status: ogf LINK_POLICY ocf %x", hdev->name, ocf); | 571 | hci_conn_del(sco); |
558 | break; | ||
559 | } | 572 | } |
560 | } | ||
561 | 573 | ||
562 | /* Command Status OGF HOST_CTL */ | 574 | hci_dev_unlock(hdev); |
563 | static void hci_cs_host_ctl(struct hci_dev *hdev, __u16 ocf, __u8 status) | ||
564 | { | ||
565 | BT_DBG("%s ocf 0x%x", hdev->name, ocf); | ||
566 | |||
567 | switch (ocf) { | ||
568 | default: | ||
569 | BT_DBG("%s Command status: ogf HOST_CTL ocf %x", hdev->name, ocf); | ||
570 | break; | ||
571 | } | ||
572 | } | 575 | } |
573 | 576 | ||
574 | /* Command Status OGF INFO_PARAM */ | 577 | static void hci_cs_sniff_mode(struct hci_dev *hdev, __u8 status) |
575 | static void hci_cs_info_param(struct hci_dev *hdev, __u16 ocf, __u8 status) | ||
576 | { | 578 | { |
577 | BT_DBG("%s: hci_cs_info_param: ocf 0x%x", hdev->name, ocf); | 579 | struct hci_cp_sniff_mode *cp; |
578 | 580 | struct hci_conn *conn; | |
579 | switch (ocf) { | ||
580 | default: | ||
581 | BT_DBG("%s Command status: ogf INFO_PARAM ocf %x", hdev->name, ocf); | ||
582 | break; | ||
583 | } | ||
584 | } | ||
585 | 581 | ||
586 | /* Inquiry Complete */ | 582 | BT_DBG("%s status 0x%x", hdev->name, status); |
587 | static inline void hci_inquiry_complete_evt(struct hci_dev *hdev, struct sk_buff *skb) | ||
588 | { | ||
589 | __u8 status = *((__u8 *) skb->data); | ||
590 | struct hci_conn *pend; | ||
591 | 583 | ||
592 | BT_DBG("%s status %d", hdev->name, status); | 584 | if (!status) |
585 | return; | ||
593 | 586 | ||
594 | clear_bit(HCI_INQUIRY, &hdev->flags); | 587 | cp = hci_sent_cmd_data(hdev, HCI_OP_SNIFF_MODE); |
595 | hci_req_complete(hdev, status); | 588 | if (!cp) |
589 | return; | ||
596 | 590 | ||
597 | hci_dev_lock(hdev); | 591 | hci_dev_lock(hdev); |
598 | 592 | ||
599 | pend = hci_conn_hash_lookup_state(hdev, ACL_LINK, BT_CONNECT2); | 593 | conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(cp->handle)); |
600 | if (pend) | 594 | if (conn) |
601 | hci_acl_connect(pend); | 595 | clear_bit(HCI_CONN_MODE_CHANGE_PEND, &conn->pend); |
602 | 596 | ||
603 | hci_dev_unlock(hdev); | 597 | hci_dev_unlock(hdev); |
604 | } | 598 | } |
605 | 599 | ||
606 | /* Inquiry Result */ | 600 | static void hci_cs_exit_sniff_mode(struct hci_dev *hdev, __u8 status) |
607 | static inline void hci_inquiry_result_evt(struct hci_dev *hdev, struct sk_buff *skb) | ||
608 | { | 601 | { |
609 | struct inquiry_data data; | 602 | struct hci_cp_exit_sniff_mode *cp; |
610 | struct inquiry_info *info = (struct inquiry_info *) (skb->data + 1); | 603 | struct hci_conn *conn; |
611 | int num_rsp = *((__u8 *) skb->data); | ||
612 | 604 | ||
613 | BT_DBG("%s num_rsp %d", hdev->name, num_rsp); | 605 | BT_DBG("%s status 0x%x", hdev->name, status); |
614 | 606 | ||
615 | if (!num_rsp) | 607 | if (!status) |
608 | return; | ||
609 | |||
610 | cp = hci_sent_cmd_data(hdev, HCI_OP_EXIT_SNIFF_MODE); | ||
611 | if (!cp) | ||
616 | return; | 612 | return; |
617 | 613 | ||
618 | hci_dev_lock(hdev); | 614 | hci_dev_lock(hdev); |
619 | 615 | ||
620 | for (; num_rsp; num_rsp--) { | 616 | conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(cp->handle)); |
621 | bacpy(&data.bdaddr, &info->bdaddr); | 617 | if (conn) |
622 | data.pscan_rep_mode = info->pscan_rep_mode; | 618 | clear_bit(HCI_CONN_MODE_CHANGE_PEND, &conn->pend); |
623 | data.pscan_period_mode = info->pscan_period_mode; | ||
624 | data.pscan_mode = info->pscan_mode; | ||
625 | memcpy(data.dev_class, info->dev_class, 3); | ||
626 | data.clock_offset = info->clock_offset; | ||
627 | data.rssi = 0x00; | ||
628 | info++; | ||
629 | hci_inquiry_cache_update(hdev, &data); | ||
630 | } | ||
631 | 619 | ||
632 | hci_dev_unlock(hdev); | 620 | hci_dev_unlock(hdev); |
633 | } | 621 | } |
634 | 622 | ||
635 | /* Inquiry Result With RSSI */ | 623 | static inline void hci_inquiry_complete_evt(struct hci_dev *hdev, struct sk_buff *skb) |
636 | static inline void hci_inquiry_result_with_rssi_evt(struct hci_dev *hdev, struct sk_buff *skb) | ||
637 | { | 624 | { |
638 | struct inquiry_data data; | 625 | __u8 status = *((__u8 *) skb->data); |
639 | int num_rsp = *((__u8 *) skb->data); | ||
640 | |||
641 | BT_DBG("%s num_rsp %d", hdev->name, num_rsp); | ||
642 | |||
643 | if (!num_rsp) | ||
644 | return; | ||
645 | |||
646 | hci_dev_lock(hdev); | ||
647 | 626 | ||
648 | if ((skb->len - 1) / num_rsp != sizeof(struct inquiry_info_with_rssi)) { | 627 | BT_DBG("%s status %d", hdev->name, status); |
649 | struct inquiry_info_with_rssi_and_pscan_mode *info = | ||
650 | (struct inquiry_info_with_rssi_and_pscan_mode *) (skb->data + 1); | ||
651 | 628 | ||
652 | for (; num_rsp; num_rsp--) { | 629 | clear_bit(HCI_INQUIRY, &hdev->flags); |
653 | bacpy(&data.bdaddr, &info->bdaddr); | ||
654 | data.pscan_rep_mode = info->pscan_rep_mode; | ||
655 | data.pscan_period_mode = info->pscan_period_mode; | ||
656 | data.pscan_mode = info->pscan_mode; | ||
657 | memcpy(data.dev_class, info->dev_class, 3); | ||
658 | data.clock_offset = info->clock_offset; | ||
659 | data.rssi = info->rssi; | ||
660 | info++; | ||
661 | hci_inquiry_cache_update(hdev, &data); | ||
662 | } | ||
663 | } else { | ||
664 | struct inquiry_info_with_rssi *info = | ||
665 | (struct inquiry_info_with_rssi *) (skb->data + 1); | ||
666 | 630 | ||
667 | for (; num_rsp; num_rsp--) { | 631 | hci_req_complete(hdev, status); |
668 | bacpy(&data.bdaddr, &info->bdaddr); | ||
669 | data.pscan_rep_mode = info->pscan_rep_mode; | ||
670 | data.pscan_period_mode = info->pscan_period_mode; | ||
671 | data.pscan_mode = 0x00; | ||
672 | memcpy(data.dev_class, info->dev_class, 3); | ||
673 | data.clock_offset = info->clock_offset; | ||
674 | data.rssi = info->rssi; | ||
675 | info++; | ||
676 | hci_inquiry_cache_update(hdev, &data); | ||
677 | } | ||
678 | } | ||
679 | 632 | ||
680 | hci_dev_unlock(hdev); | 633 | hci_conn_check_pending(hdev); |
681 | } | 634 | } |
682 | 635 | ||
683 | /* Extended Inquiry Result */ | 636 | static inline void hci_inquiry_result_evt(struct hci_dev *hdev, struct sk_buff *skb) |
684 | static inline void hci_extended_inquiry_result_evt(struct hci_dev *hdev, struct sk_buff *skb) | ||
685 | { | 637 | { |
686 | struct inquiry_data data; | 638 | struct inquiry_data data; |
687 | struct extended_inquiry_info *info = (struct extended_inquiry_info *) (skb->data + 1); | 639 | struct inquiry_info *info = (void *) (skb->data + 1); |
688 | int num_rsp = *((__u8 *) skb->data); | 640 | int num_rsp = *((__u8 *) skb->data); |
689 | 641 | ||
690 | BT_DBG("%s num_rsp %d", hdev->name, num_rsp); | 642 | BT_DBG("%s num_rsp %d", hdev->name, num_rsp); |
@@ -696,12 +648,12 @@ static inline void hci_extended_inquiry_result_evt(struct hci_dev *hdev, struct | |||
696 | 648 | ||
697 | for (; num_rsp; num_rsp--) { | 649 | for (; num_rsp; num_rsp--) { |
698 | bacpy(&data.bdaddr, &info->bdaddr); | 650 | bacpy(&data.bdaddr, &info->bdaddr); |
699 | data.pscan_rep_mode = info->pscan_rep_mode; | 651 | data.pscan_rep_mode = info->pscan_rep_mode; |
700 | data.pscan_period_mode = info->pscan_period_mode; | 652 | data.pscan_period_mode = info->pscan_period_mode; |
701 | data.pscan_mode = 0x00; | 653 | data.pscan_mode = info->pscan_mode; |
702 | memcpy(data.dev_class, info->dev_class, 3); | 654 | memcpy(data.dev_class, info->dev_class, 3); |
703 | data.clock_offset = info->clock_offset; | 655 | data.clock_offset = info->clock_offset; |
704 | data.rssi = info->rssi; | 656 | data.rssi = 0x00; |
705 | info++; | 657 | info++; |
706 | hci_inquiry_cache_update(hdev, &data); | 658 | hci_inquiry_cache_update(hdev, &data); |
707 | } | 659 | } |
@@ -709,70 +661,18 @@ static inline void hci_extended_inquiry_result_evt(struct hci_dev *hdev, struct | |||
709 | hci_dev_unlock(hdev); | 661 | hci_dev_unlock(hdev); |
710 | } | 662 | } |
711 | 663 | ||
712 | /* Connect Request */ | ||
713 | static inline void hci_conn_request_evt(struct hci_dev *hdev, struct sk_buff *skb) | ||
714 | { | ||
715 | struct hci_ev_conn_request *ev = (struct hci_ev_conn_request *) skb->data; | ||
716 | int mask = hdev->link_mode; | ||
717 | |||
718 | BT_DBG("%s Connection request: %s type 0x%x", hdev->name, | ||
719 | batostr(&ev->bdaddr), ev->link_type); | ||
720 | |||
721 | mask |= hci_proto_connect_ind(hdev, &ev->bdaddr, ev->link_type); | ||
722 | |||
723 | if (mask & HCI_LM_ACCEPT) { | ||
724 | /* Connection accepted */ | ||
725 | struct hci_conn *conn; | ||
726 | struct hci_cp_accept_conn_req cp; | ||
727 | |||
728 | hci_dev_lock(hdev); | ||
729 | conn = hci_conn_hash_lookup_ba(hdev, ev->link_type, &ev->bdaddr); | ||
730 | if (!conn) { | ||
731 | if (!(conn = hci_conn_add(hdev, ev->link_type, &ev->bdaddr))) { | ||
732 | BT_ERR("No memmory for new connection"); | ||
733 | hci_dev_unlock(hdev); | ||
734 | return; | ||
735 | } | ||
736 | } | ||
737 | memcpy(conn->dev_class, ev->dev_class, 3); | ||
738 | conn->state = BT_CONNECT; | ||
739 | hci_dev_unlock(hdev); | ||
740 | |||
741 | bacpy(&cp.bdaddr, &ev->bdaddr); | ||
742 | |||
743 | if (lmp_rswitch_capable(hdev) && (mask & HCI_LM_MASTER)) | ||
744 | cp.role = 0x00; /* Become master */ | ||
745 | else | ||
746 | cp.role = 0x01; /* Remain slave */ | ||
747 | |||
748 | hci_send_cmd(hdev, OGF_LINK_CTL, | ||
749 | OCF_ACCEPT_CONN_REQ, sizeof(cp), &cp); | ||
750 | } else { | ||
751 | /* Connection rejected */ | ||
752 | struct hci_cp_reject_conn_req cp; | ||
753 | |||
754 | bacpy(&cp.bdaddr, &ev->bdaddr); | ||
755 | cp.reason = 0x0f; | ||
756 | hci_send_cmd(hdev, OGF_LINK_CTL, | ||
757 | OCF_REJECT_CONN_REQ, sizeof(cp), &cp); | ||
758 | } | ||
759 | } | ||
760 | |||
761 | /* Connect Complete */ | ||
762 | static inline void hci_conn_complete_evt(struct hci_dev *hdev, struct sk_buff *skb) | 664 | static inline void hci_conn_complete_evt(struct hci_dev *hdev, struct sk_buff *skb) |
763 | { | 665 | { |
764 | struct hci_ev_conn_complete *ev = (struct hci_ev_conn_complete *) skb->data; | 666 | struct hci_ev_conn_complete *ev = (void *) skb->data; |
765 | struct hci_conn *conn, *pend; | 667 | struct hci_conn *conn; |
766 | 668 | ||
767 | BT_DBG("%s", hdev->name); | 669 | BT_DBG("%s", hdev->name); |
768 | 670 | ||
769 | hci_dev_lock(hdev); | 671 | hci_dev_lock(hdev); |
770 | 672 | ||
771 | conn = hci_conn_hash_lookup_ba(hdev, ev->link_type, &ev->bdaddr); | 673 | conn = hci_conn_hash_lookup_ba(hdev, ev->link_type, &ev->bdaddr); |
772 | if (!conn) { | 674 | if (!conn) |
773 | hci_dev_unlock(hdev); | 675 | goto unlock; |
774 | return; | ||
775 | } | ||
776 | 676 | ||
777 | if (!ev->status) { | 677 | if (!ev->status) { |
778 | conn->handle = __le16_to_cpu(ev->handle); | 678 | conn->handle = __le16_to_cpu(ev->handle); |
@@ -788,8 +688,7 @@ static inline void hci_conn_complete_evt(struct hci_dev *hdev, struct sk_buff *s | |||
788 | if (conn->type == ACL_LINK) { | 688 | if (conn->type == ACL_LINK) { |
789 | struct hci_cp_read_remote_features cp; | 689 | struct hci_cp_read_remote_features cp; |
790 | cp.handle = ev->handle; | 690 | cp.handle = ev->handle; |
791 | hci_send_cmd(hdev, OGF_LINK_CTL, | 691 | hci_send_cmd(hdev, HCI_OP_READ_REMOTE_FEATURES, sizeof(cp), &cp); |
792 | OCF_READ_REMOTE_FEATURES, sizeof(cp), &cp); | ||
793 | } | 692 | } |
794 | 693 | ||
795 | /* Set link policy */ | 694 | /* Set link policy */ |
@@ -797,8 +696,7 @@ static inline void hci_conn_complete_evt(struct hci_dev *hdev, struct sk_buff *s | |||
797 | struct hci_cp_write_link_policy cp; | 696 | struct hci_cp_write_link_policy cp; |
798 | cp.handle = ev->handle; | 697 | cp.handle = ev->handle; |
799 | cp.policy = cpu_to_le16(hdev->link_policy); | 698 | cp.policy = cpu_to_le16(hdev->link_policy); |
800 | hci_send_cmd(hdev, OGF_LINK_POLICY, | 699 | hci_send_cmd(hdev, HCI_OP_WRITE_LINK_POLICY, sizeof(cp), &cp); |
801 | OCF_WRITE_LINK_POLICY, sizeof(cp), &cp); | ||
802 | } | 700 | } |
803 | 701 | ||
804 | /* Set packet type for incoming connection */ | 702 | /* Set packet type for incoming connection */ |
@@ -809,8 +707,7 @@ static inline void hci_conn_complete_evt(struct hci_dev *hdev, struct sk_buff *s | |||
809 | cpu_to_le16(hdev->pkt_type & ACL_PTYPE_MASK): | 707 | cpu_to_le16(hdev->pkt_type & ACL_PTYPE_MASK): |
810 | cpu_to_le16(hdev->pkt_type & SCO_PTYPE_MASK); | 708 | cpu_to_le16(hdev->pkt_type & SCO_PTYPE_MASK); |
811 | 709 | ||
812 | hci_send_cmd(hdev, OGF_LINK_CTL, | 710 | hci_send_cmd(hdev, HCI_OP_CHANGE_CONN_PTYPE, sizeof(cp), &cp); |
813 | OCF_CHANGE_CONN_PTYPE, sizeof(cp), &cp); | ||
814 | } else { | 711 | } else { |
815 | /* Update disconnect timer */ | 712 | /* Update disconnect timer */ |
816 | hci_conn_hold(conn); | 713 | hci_conn_hold(conn); |
@@ -822,9 +719,12 @@ static inline void hci_conn_complete_evt(struct hci_dev *hdev, struct sk_buff *s | |||
822 | if (conn->type == ACL_LINK) { | 719 | if (conn->type == ACL_LINK) { |
823 | struct hci_conn *sco = conn->link; | 720 | struct hci_conn *sco = conn->link; |
824 | if (sco) { | 721 | if (sco) { |
825 | if (!ev->status) | 722 | if (!ev->status) { |
826 | hci_add_sco(sco, conn->handle); | 723 | if (lmp_esco_capable(hdev)) |
827 | else { | 724 | hci_setup_sync(sco, conn->handle); |
725 | else | ||
726 | hci_add_sco(sco, conn->handle); | ||
727 | } else { | ||
828 | hci_proto_connect_cfm(sco, ev->status); | 728 | hci_proto_connect_cfm(sco, ev->status); |
829 | hci_conn_del(sco); | 729 | hci_conn_del(sco); |
830 | } | 730 | } |
@@ -835,136 +735,104 @@ static inline void hci_conn_complete_evt(struct hci_dev *hdev, struct sk_buff *s | |||
835 | if (ev->status) | 735 | if (ev->status) |
836 | hci_conn_del(conn); | 736 | hci_conn_del(conn); |
837 | 737 | ||
838 | pend = hci_conn_hash_lookup_state(hdev, ACL_LINK, BT_CONNECT2); | 738 | unlock: |
839 | if (pend) | ||
840 | hci_acl_connect(pend); | ||
841 | |||
842 | hci_dev_unlock(hdev); | 739 | hci_dev_unlock(hdev); |
843 | } | ||
844 | |||
845 | /* Disconnect Complete */ | ||
846 | static inline void hci_disconn_complete_evt(struct hci_dev *hdev, struct sk_buff *skb) | ||
847 | { | ||
848 | struct hci_ev_disconn_complete *ev = (struct hci_ev_disconn_complete *) skb->data; | ||
849 | struct hci_conn *conn; | ||
850 | |||
851 | BT_DBG("%s status %d", hdev->name, ev->status); | ||
852 | |||
853 | if (ev->status) | ||
854 | return; | ||
855 | 740 | ||
856 | hci_dev_lock(hdev); | 741 | hci_conn_check_pending(hdev); |
857 | |||
858 | conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle)); | ||
859 | if (conn) { | ||
860 | conn->state = BT_CLOSED; | ||
861 | hci_proto_disconn_ind(conn, ev->reason); | ||
862 | hci_conn_del(conn); | ||
863 | } | ||
864 | |||
865 | hci_dev_unlock(hdev); | ||
866 | } | 742 | } |
867 | 743 | ||
868 | /* Number of completed packets */ | 744 | static inline void hci_conn_request_evt(struct hci_dev *hdev, struct sk_buff *skb) |
869 | static inline void hci_num_comp_pkts_evt(struct hci_dev *hdev, struct sk_buff *skb) | ||
870 | { | 745 | { |
871 | struct hci_ev_num_comp_pkts *ev = (struct hci_ev_num_comp_pkts *) skb->data; | 746 | struct hci_ev_conn_request *ev = (void *) skb->data; |
872 | __le16 *ptr; | 747 | int mask = hdev->link_mode; |
873 | int i; | ||
874 | |||
875 | skb_pull(skb, sizeof(*ev)); | ||
876 | |||
877 | BT_DBG("%s num_hndl %d", hdev->name, ev->num_hndl); | ||
878 | 748 | ||
879 | if (skb->len < ev->num_hndl * 4) { | 749 | BT_DBG("%s bdaddr %s type 0x%x", hdev->name, |
880 | BT_DBG("%s bad parameters", hdev->name); | 750 | batostr(&ev->bdaddr), ev->link_type); |
881 | return; | ||
882 | } | ||
883 | 751 | ||
884 | tasklet_disable(&hdev->tx_task); | 752 | mask |= hci_proto_connect_ind(hdev, &ev->bdaddr, ev->link_type); |
885 | 753 | ||
886 | for (i = 0, ptr = (__le16 *) skb->data; i < ev->num_hndl; i++) { | 754 | if (mask & HCI_LM_ACCEPT) { |
755 | /* Connection accepted */ | ||
887 | struct hci_conn *conn; | 756 | struct hci_conn *conn; |
888 | __u16 handle, count; | ||
889 | |||
890 | handle = __le16_to_cpu(get_unaligned(ptr++)); | ||
891 | count = __le16_to_cpu(get_unaligned(ptr++)); | ||
892 | 757 | ||
893 | conn = hci_conn_hash_lookup_handle(hdev, handle); | 758 | hci_dev_lock(hdev); |
894 | if (conn) { | ||
895 | conn->sent -= count; | ||
896 | 759 | ||
897 | if (conn->type == ACL_LINK) { | 760 | conn = hci_conn_hash_lookup_ba(hdev, ev->link_type, &ev->bdaddr); |
898 | if ((hdev->acl_cnt += count) > hdev->acl_pkts) | 761 | if (!conn) { |
899 | hdev->acl_cnt = hdev->acl_pkts; | 762 | if (!(conn = hci_conn_add(hdev, ev->link_type, &ev->bdaddr))) { |
900 | } else { | 763 | BT_ERR("No memmory for new connection"); |
901 | if ((hdev->sco_cnt += count) > hdev->sco_pkts) | 764 | hci_dev_unlock(hdev); |
902 | hdev->sco_cnt = hdev->sco_pkts; | 765 | return; |
903 | } | 766 | } |
904 | } | 767 | } |
905 | } | ||
906 | hci_sched_tx(hdev); | ||
907 | 768 | ||
908 | tasklet_enable(&hdev->tx_task); | 769 | memcpy(conn->dev_class, ev->dev_class, 3); |
909 | } | 770 | conn->state = BT_CONNECT; |
910 | 771 | ||
911 | /* Role Change */ | 772 | hci_dev_unlock(hdev); |
912 | static inline void hci_role_change_evt(struct hci_dev *hdev, struct sk_buff *skb) | ||
913 | { | ||
914 | struct hci_ev_role_change *ev = (struct hci_ev_role_change *) skb->data; | ||
915 | struct hci_conn *conn; | ||
916 | 773 | ||
917 | BT_DBG("%s status %d", hdev->name, ev->status); | 774 | if (ev->link_type == ACL_LINK || !lmp_esco_capable(hdev)) { |
775 | struct hci_cp_accept_conn_req cp; | ||
918 | 776 | ||
919 | hci_dev_lock(hdev); | 777 | bacpy(&cp.bdaddr, &ev->bdaddr); |
920 | 778 | ||
921 | conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr); | 779 | if (lmp_rswitch_capable(hdev) && (mask & HCI_LM_MASTER)) |
922 | if (conn) { | 780 | cp.role = 0x00; /* Become master */ |
923 | if (!ev->status) { | ||
924 | if (ev->role) | ||
925 | conn->link_mode &= ~HCI_LM_MASTER; | ||
926 | else | 781 | else |
927 | conn->link_mode |= HCI_LM_MASTER; | 782 | cp.role = 0x01; /* Remain slave */ |
928 | } | ||
929 | 783 | ||
930 | clear_bit(HCI_CONN_RSWITCH_PEND, &conn->pend); | 784 | hci_send_cmd(hdev, HCI_OP_ACCEPT_CONN_REQ, |
785 | sizeof(cp), &cp); | ||
786 | } else { | ||
787 | struct hci_cp_accept_sync_conn_req cp; | ||
931 | 788 | ||
932 | hci_role_switch_cfm(conn, ev->status, ev->role); | 789 | bacpy(&cp.bdaddr, &ev->bdaddr); |
933 | } | 790 | cp.pkt_type = cpu_to_le16(hdev->esco_type); |
934 | 791 | ||
935 | hci_dev_unlock(hdev); | 792 | cp.tx_bandwidth = cpu_to_le32(0x00001f40); |
793 | cp.rx_bandwidth = cpu_to_le32(0x00001f40); | ||
794 | cp.max_latency = cpu_to_le16(0xffff); | ||
795 | cp.content_format = cpu_to_le16(hdev->voice_setting); | ||
796 | cp.retrans_effort = 0xff; | ||
797 | |||
798 | hci_send_cmd(hdev, HCI_OP_ACCEPT_SYNC_CONN_REQ, | ||
799 | sizeof(cp), &cp); | ||
800 | } | ||
801 | } else { | ||
802 | /* Connection rejected */ | ||
803 | struct hci_cp_reject_conn_req cp; | ||
804 | |||
805 | bacpy(&cp.bdaddr, &ev->bdaddr); | ||
806 | cp.reason = 0x0f; | ||
807 | hci_send_cmd(hdev, HCI_OP_REJECT_CONN_REQ, sizeof(cp), &cp); | ||
808 | } | ||
936 | } | 809 | } |
937 | 810 | ||
938 | /* Mode Change */ | 811 | static inline void hci_disconn_complete_evt(struct hci_dev *hdev, struct sk_buff *skb) |
939 | static inline void hci_mode_change_evt(struct hci_dev *hdev, struct sk_buff *skb) | ||
940 | { | 812 | { |
941 | struct hci_ev_mode_change *ev = (struct hci_ev_mode_change *) skb->data; | 813 | struct hci_ev_disconn_complete *ev = (void *) skb->data; |
942 | struct hci_conn *conn; | 814 | struct hci_conn *conn; |
943 | 815 | ||
944 | BT_DBG("%s status %d", hdev->name, ev->status); | 816 | BT_DBG("%s status %d", hdev->name, ev->status); |
945 | 817 | ||
818 | if (ev->status) | ||
819 | return; | ||
820 | |||
946 | hci_dev_lock(hdev); | 821 | hci_dev_lock(hdev); |
947 | 822 | ||
948 | conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle)); | 823 | conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle)); |
949 | if (conn) { | 824 | if (conn) { |
950 | conn->mode = ev->mode; | 825 | conn->state = BT_CLOSED; |
951 | conn->interval = __le16_to_cpu(ev->interval); | 826 | hci_proto_disconn_ind(conn, ev->reason); |
952 | 827 | hci_conn_del(conn); | |
953 | if (!test_and_clear_bit(HCI_CONN_MODE_CHANGE_PEND, &conn->pend)) { | ||
954 | if (conn->mode == HCI_CM_ACTIVE) | ||
955 | conn->power_save = 1; | ||
956 | else | ||
957 | conn->power_save = 0; | ||
958 | } | ||
959 | } | 828 | } |
960 | 829 | ||
961 | hci_dev_unlock(hdev); | 830 | hci_dev_unlock(hdev); |
962 | } | 831 | } |
963 | 832 | ||
964 | /* Authentication Complete */ | ||
965 | static inline void hci_auth_complete_evt(struct hci_dev *hdev, struct sk_buff *skb) | 833 | static inline void hci_auth_complete_evt(struct hci_dev *hdev, struct sk_buff *skb) |
966 | { | 834 | { |
967 | struct hci_ev_auth_complete *ev = (struct hci_ev_auth_complete *) skb->data; | 835 | struct hci_ev_auth_complete *ev = (void *) skb->data; |
968 | struct hci_conn *conn; | 836 | struct hci_conn *conn; |
969 | 837 | ||
970 | BT_DBG("%s status %d", hdev->name, ev->status); | 838 | BT_DBG("%s status %d", hdev->name, ev->status); |
@@ -985,8 +853,8 @@ static inline void hci_auth_complete_evt(struct hci_dev *hdev, struct sk_buff *s | |||
985 | struct hci_cp_set_conn_encrypt cp; | 853 | struct hci_cp_set_conn_encrypt cp; |
986 | cp.handle = cpu_to_le16(conn->handle); | 854 | cp.handle = cpu_to_le16(conn->handle); |
987 | cp.encrypt = 1; | 855 | cp.encrypt = 1; |
988 | hci_send_cmd(conn->hdev, OGF_LINK_CTL, | 856 | hci_send_cmd(conn->hdev, |
989 | OCF_SET_CONN_ENCRYPT, sizeof(cp), &cp); | 857 | HCI_OP_SET_CONN_ENCRYPT, sizeof(cp), &cp); |
990 | } else { | 858 | } else { |
991 | clear_bit(HCI_CONN_ENCRYPT_PEND, &conn->pend); | 859 | clear_bit(HCI_CONN_ENCRYPT_PEND, &conn->pend); |
992 | hci_encrypt_cfm(conn, ev->status, 0x00); | 860 | hci_encrypt_cfm(conn, ev->status, 0x00); |
@@ -997,10 +865,16 @@ static inline void hci_auth_complete_evt(struct hci_dev *hdev, struct sk_buff *s | |||
997 | hci_dev_unlock(hdev); | 865 | hci_dev_unlock(hdev); |
998 | } | 866 | } |
999 | 867 | ||
1000 | /* Encryption Change */ | 868 | static inline void hci_remote_name_evt(struct hci_dev *hdev, struct sk_buff *skb) |
869 | { | ||
870 | BT_DBG("%s", hdev->name); | ||
871 | |||
872 | hci_conn_check_pending(hdev); | ||
873 | } | ||
874 | |||
1001 | static inline void hci_encrypt_change_evt(struct hci_dev *hdev, struct sk_buff *skb) | 875 | static inline void hci_encrypt_change_evt(struct hci_dev *hdev, struct sk_buff *skb) |
1002 | { | 876 | { |
1003 | struct hci_ev_encrypt_change *ev = (struct hci_ev_encrypt_change *) skb->data; | 877 | struct hci_ev_encrypt_change *ev = (void *) skb->data; |
1004 | struct hci_conn *conn; | 878 | struct hci_conn *conn; |
1005 | 879 | ||
1006 | BT_DBG("%s status %d", hdev->name, ev->status); | 880 | BT_DBG("%s status %d", hdev->name, ev->status); |
@@ -1024,10 +898,9 @@ static inline void hci_encrypt_change_evt(struct hci_dev *hdev, struct sk_buff * | |||
1024 | hci_dev_unlock(hdev); | 898 | hci_dev_unlock(hdev); |
1025 | } | 899 | } |
1026 | 900 | ||
1027 | /* Change Connection Link Key Complete */ | 901 | static inline void hci_change_link_key_complete_evt(struct hci_dev *hdev, struct sk_buff *skb) |
1028 | static inline void hci_change_conn_link_key_complete_evt(struct hci_dev *hdev, struct sk_buff *skb) | ||
1029 | { | 902 | { |
1030 | struct hci_ev_change_conn_link_key_complete *ev = (struct hci_ev_change_conn_link_key_complete *) skb->data; | 903 | struct hci_ev_change_link_key_complete *ev = (void *) skb->data; |
1031 | struct hci_conn *conn; | 904 | struct hci_conn *conn; |
1032 | 905 | ||
1033 | BT_DBG("%s status %d", hdev->name, ev->status); | 906 | BT_DBG("%s status %d", hdev->name, ev->status); |
@@ -1047,25 +920,263 @@ static inline void hci_change_conn_link_key_complete_evt(struct hci_dev *hdev, s | |||
1047 | hci_dev_unlock(hdev); | 920 | hci_dev_unlock(hdev); |
1048 | } | 921 | } |
1049 | 922 | ||
1050 | /* Pin Code Request*/ | 923 | static inline void hci_remote_features_evt(struct hci_dev *hdev, struct sk_buff *skb) |
1051 | static inline void hci_pin_code_request_evt(struct hci_dev *hdev, struct sk_buff *skb) | ||
1052 | { | 924 | { |
925 | struct hci_ev_remote_features *ev = (void *) skb->data; | ||
926 | struct hci_conn *conn; | ||
927 | |||
928 | BT_DBG("%s status %d", hdev->name, ev->status); | ||
929 | |||
930 | if (ev->status) | ||
931 | return; | ||
932 | |||
933 | hci_dev_lock(hdev); | ||
934 | |||
935 | conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle)); | ||
936 | if (conn) | ||
937 | memcpy(conn->features, ev->features, 8); | ||
938 | |||
939 | hci_dev_unlock(hdev); | ||
1053 | } | 940 | } |
1054 | 941 | ||
1055 | /* Link Key Request */ | 942 | static inline void hci_remote_version_evt(struct hci_dev *hdev, struct sk_buff *skb) |
1056 | static inline void hci_link_key_request_evt(struct hci_dev *hdev, struct sk_buff *skb) | ||
1057 | { | 943 | { |
944 | BT_DBG("%s", hdev->name); | ||
1058 | } | 945 | } |
1059 | 946 | ||
1060 | /* Link Key Notification */ | 947 | static inline void hci_qos_setup_complete_evt(struct hci_dev *hdev, struct sk_buff *skb) |
1061 | static inline void hci_link_key_notify_evt(struct hci_dev *hdev, struct sk_buff *skb) | ||
1062 | { | 948 | { |
949 | BT_DBG("%s", hdev->name); | ||
1063 | } | 950 | } |
1064 | 951 | ||
1065 | /* Remote Features */ | 952 | static inline void hci_cmd_complete_evt(struct hci_dev *hdev, struct sk_buff *skb) |
1066 | static inline void hci_remote_features_evt(struct hci_dev *hdev, struct sk_buff *skb) | ||
1067 | { | 953 | { |
1068 | struct hci_ev_remote_features *ev = (struct hci_ev_remote_features *) skb->data; | 954 | struct hci_ev_cmd_complete *ev = (void *) skb->data; |
955 | __u16 opcode; | ||
956 | |||
957 | skb_pull(skb, sizeof(*ev)); | ||
958 | |||
959 | opcode = __le16_to_cpu(ev->opcode); | ||
960 | |||
961 | switch (opcode) { | ||
962 | case HCI_OP_INQUIRY_CANCEL: | ||
963 | hci_cc_inquiry_cancel(hdev, skb); | ||
964 | break; | ||
965 | |||
966 | case HCI_OP_EXIT_PERIODIC_INQ: | ||
967 | hci_cc_exit_periodic_inq(hdev, skb); | ||
968 | break; | ||
969 | |||
970 | case HCI_OP_REMOTE_NAME_REQ_CANCEL: | ||
971 | hci_cc_remote_name_req_cancel(hdev, skb); | ||
972 | break; | ||
973 | |||
974 | case HCI_OP_ROLE_DISCOVERY: | ||
975 | hci_cc_role_discovery(hdev, skb); | ||
976 | break; | ||
977 | |||
978 | case HCI_OP_WRITE_LINK_POLICY: | ||
979 | hci_cc_write_link_policy(hdev, skb); | ||
980 | break; | ||
981 | |||
982 | case HCI_OP_RESET: | ||
983 | hci_cc_reset(hdev, skb); | ||
984 | break; | ||
985 | |||
986 | case HCI_OP_WRITE_LOCAL_NAME: | ||
987 | hci_cc_write_local_name(hdev, skb); | ||
988 | break; | ||
989 | |||
990 | case HCI_OP_READ_LOCAL_NAME: | ||
991 | hci_cc_read_local_name(hdev, skb); | ||
992 | break; | ||
993 | |||
994 | case HCI_OP_WRITE_AUTH_ENABLE: | ||
995 | hci_cc_write_auth_enable(hdev, skb); | ||
996 | break; | ||
997 | |||
998 | case HCI_OP_WRITE_ENCRYPT_MODE: | ||
999 | hci_cc_write_encrypt_mode(hdev, skb); | ||
1000 | break; | ||
1001 | |||
1002 | case HCI_OP_WRITE_SCAN_ENABLE: | ||
1003 | hci_cc_write_scan_enable(hdev, skb); | ||
1004 | break; | ||
1005 | |||
1006 | case HCI_OP_READ_CLASS_OF_DEV: | ||
1007 | hci_cc_read_class_of_dev(hdev, skb); | ||
1008 | break; | ||
1009 | |||
1010 | case HCI_OP_WRITE_CLASS_OF_DEV: | ||
1011 | hci_cc_write_class_of_dev(hdev, skb); | ||
1012 | break; | ||
1013 | |||
1014 | case HCI_OP_READ_VOICE_SETTING: | ||
1015 | hci_cc_read_voice_setting(hdev, skb); | ||
1016 | break; | ||
1017 | |||
1018 | case HCI_OP_WRITE_VOICE_SETTING: | ||
1019 | hci_cc_write_voice_setting(hdev, skb); | ||
1020 | break; | ||
1021 | |||
1022 | case HCI_OP_HOST_BUFFER_SIZE: | ||
1023 | hci_cc_host_buffer_size(hdev, skb); | ||
1024 | break; | ||
1025 | |||
1026 | case HCI_OP_READ_LOCAL_VERSION: | ||
1027 | hci_cc_read_local_version(hdev, skb); | ||
1028 | break; | ||
1029 | |||
1030 | case HCI_OP_READ_LOCAL_COMMANDS: | ||
1031 | hci_cc_read_local_commands(hdev, skb); | ||
1032 | break; | ||
1033 | |||
1034 | case HCI_OP_READ_LOCAL_FEATURES: | ||
1035 | hci_cc_read_local_features(hdev, skb); | ||
1036 | break; | ||
1037 | |||
1038 | case HCI_OP_READ_BUFFER_SIZE: | ||
1039 | hci_cc_read_buffer_size(hdev, skb); | ||
1040 | break; | ||
1041 | |||
1042 | case HCI_OP_READ_BD_ADDR: | ||
1043 | hci_cc_read_bd_addr(hdev, skb); | ||
1044 | break; | ||
1045 | |||
1046 | default: | ||
1047 | BT_DBG("%s opcode 0x%x", hdev->name, opcode); | ||
1048 | break; | ||
1049 | } | ||
1050 | |||
1051 | if (ev->ncmd) { | ||
1052 | atomic_set(&hdev->cmd_cnt, 1); | ||
1053 | if (!skb_queue_empty(&hdev->cmd_q)) | ||
1054 | hci_sched_cmd(hdev); | ||
1055 | } | ||
1056 | } | ||
1057 | |||
1058 | static inline void hci_cmd_status_evt(struct hci_dev *hdev, struct sk_buff *skb) | ||
1059 | { | ||
1060 | struct hci_ev_cmd_status *ev = (void *) skb->data; | ||
1061 | __u16 opcode; | ||
1062 | |||
1063 | skb_pull(skb, sizeof(*ev)); | ||
1064 | |||
1065 | opcode = __le16_to_cpu(ev->opcode); | ||
1066 | |||
1067 | switch (opcode) { | ||
1068 | case HCI_OP_INQUIRY: | ||
1069 | hci_cs_inquiry(hdev, ev->status); | ||
1070 | break; | ||
1071 | |||
1072 | case HCI_OP_CREATE_CONN: | ||
1073 | hci_cs_create_conn(hdev, ev->status); | ||
1074 | break; | ||
1075 | |||
1076 | case HCI_OP_ADD_SCO: | ||
1077 | hci_cs_add_sco(hdev, ev->status); | ||
1078 | break; | ||
1079 | |||
1080 | case HCI_OP_REMOTE_NAME_REQ: | ||
1081 | hci_cs_remote_name_req(hdev, ev->status); | ||
1082 | break; | ||
1083 | |||
1084 | case HCI_OP_SETUP_SYNC_CONN: | ||
1085 | hci_cs_setup_sync_conn(hdev, ev->status); | ||
1086 | break; | ||
1087 | |||
1088 | case HCI_OP_SNIFF_MODE: | ||
1089 | hci_cs_sniff_mode(hdev, ev->status); | ||
1090 | break; | ||
1091 | |||
1092 | case HCI_OP_EXIT_SNIFF_MODE: | ||
1093 | hci_cs_exit_sniff_mode(hdev, ev->status); | ||
1094 | break; | ||
1095 | |||
1096 | default: | ||
1097 | BT_DBG("%s opcode 0x%x", hdev->name, opcode); | ||
1098 | break; | ||
1099 | } | ||
1100 | |||
1101 | if (ev->ncmd) { | ||
1102 | atomic_set(&hdev->cmd_cnt, 1); | ||
1103 | if (!skb_queue_empty(&hdev->cmd_q)) | ||
1104 | hci_sched_cmd(hdev); | ||
1105 | } | ||
1106 | } | ||
1107 | |||
1108 | static inline void hci_role_change_evt(struct hci_dev *hdev, struct sk_buff *skb) | ||
1109 | { | ||
1110 | struct hci_ev_role_change *ev = (void *) skb->data; | ||
1111 | struct hci_conn *conn; | ||
1112 | |||
1113 | BT_DBG("%s status %d", hdev->name, ev->status); | ||
1114 | |||
1115 | hci_dev_lock(hdev); | ||
1116 | |||
1117 | conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr); | ||
1118 | if (conn) { | ||
1119 | if (!ev->status) { | ||
1120 | if (ev->role) | ||
1121 | conn->link_mode &= ~HCI_LM_MASTER; | ||
1122 | else | ||
1123 | conn->link_mode |= HCI_LM_MASTER; | ||
1124 | } | ||
1125 | |||
1126 | clear_bit(HCI_CONN_RSWITCH_PEND, &conn->pend); | ||
1127 | |||
1128 | hci_role_switch_cfm(conn, ev->status, ev->role); | ||
1129 | } | ||
1130 | |||
1131 | hci_dev_unlock(hdev); | ||
1132 | } | ||
1133 | |||
1134 | static inline void hci_num_comp_pkts_evt(struct hci_dev *hdev, struct sk_buff *skb) | ||
1135 | { | ||
1136 | struct hci_ev_num_comp_pkts *ev = (void *) skb->data; | ||
1137 | __le16 *ptr; | ||
1138 | int i; | ||
1139 | |||
1140 | skb_pull(skb, sizeof(*ev)); | ||
1141 | |||
1142 | BT_DBG("%s num_hndl %d", hdev->name, ev->num_hndl); | ||
1143 | |||
1144 | if (skb->len < ev->num_hndl * 4) { | ||
1145 | BT_DBG("%s bad parameters", hdev->name); | ||
1146 | return; | ||
1147 | } | ||
1148 | |||
1149 | tasklet_disable(&hdev->tx_task); | ||
1150 | |||
1151 | for (i = 0, ptr = (__le16 *) skb->data; i < ev->num_hndl; i++) { | ||
1152 | struct hci_conn *conn; | ||
1153 | __u16 handle, count; | ||
1154 | |||
1155 | handle = __le16_to_cpu(get_unaligned(ptr++)); | ||
1156 | count = __le16_to_cpu(get_unaligned(ptr++)); | ||
1157 | |||
1158 | conn = hci_conn_hash_lookup_handle(hdev, handle); | ||
1159 | if (conn) { | ||
1160 | conn->sent -= count; | ||
1161 | |||
1162 | if (conn->type == ACL_LINK) { | ||
1163 | if ((hdev->acl_cnt += count) > hdev->acl_pkts) | ||
1164 | hdev->acl_cnt = hdev->acl_pkts; | ||
1165 | } else { | ||
1166 | if ((hdev->sco_cnt += count) > hdev->sco_pkts) | ||
1167 | hdev->sco_cnt = hdev->sco_pkts; | ||
1168 | } | ||
1169 | } | ||
1170 | } | ||
1171 | |||
1172 | hci_sched_tx(hdev); | ||
1173 | |||
1174 | tasklet_enable(&hdev->tx_task); | ||
1175 | } | ||
1176 | |||
1177 | static inline void hci_mode_change_evt(struct hci_dev *hdev, struct sk_buff *skb) | ||
1178 | { | ||
1179 | struct hci_ev_mode_change *ev = (void *) skb->data; | ||
1069 | struct hci_conn *conn; | 1180 | struct hci_conn *conn; |
1070 | 1181 | ||
1071 | BT_DBG("%s status %d", hdev->name, ev->status); | 1182 | BT_DBG("%s status %d", hdev->name, ev->status); |
@@ -1073,17 +1184,39 @@ static inline void hci_remote_features_evt(struct hci_dev *hdev, struct sk_buff | |||
1073 | hci_dev_lock(hdev); | 1184 | hci_dev_lock(hdev); |
1074 | 1185 | ||
1075 | conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle)); | 1186 | conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle)); |
1076 | if (conn && !ev->status) { | 1187 | if (conn) { |
1077 | memcpy(conn->features, ev->features, sizeof(conn->features)); | 1188 | conn->mode = ev->mode; |
1189 | conn->interval = __le16_to_cpu(ev->interval); | ||
1190 | |||
1191 | if (!test_and_clear_bit(HCI_CONN_MODE_CHANGE_PEND, &conn->pend)) { | ||
1192 | if (conn->mode == HCI_CM_ACTIVE) | ||
1193 | conn->power_save = 1; | ||
1194 | else | ||
1195 | conn->power_save = 0; | ||
1196 | } | ||
1078 | } | 1197 | } |
1079 | 1198 | ||
1080 | hci_dev_unlock(hdev); | 1199 | hci_dev_unlock(hdev); |
1081 | } | 1200 | } |
1082 | 1201 | ||
1083 | /* Clock Offset */ | 1202 | static inline void hci_pin_code_request_evt(struct hci_dev *hdev, struct sk_buff *skb) |
1203 | { | ||
1204 | BT_DBG("%s", hdev->name); | ||
1205 | } | ||
1206 | |||
1207 | static inline void hci_link_key_request_evt(struct hci_dev *hdev, struct sk_buff *skb) | ||
1208 | { | ||
1209 | BT_DBG("%s", hdev->name); | ||
1210 | } | ||
1211 | |||
1212 | static inline void hci_link_key_notify_evt(struct hci_dev *hdev, struct sk_buff *skb) | ||
1213 | { | ||
1214 | BT_DBG("%s", hdev->name); | ||
1215 | } | ||
1216 | |||
1084 | static inline void hci_clock_offset_evt(struct hci_dev *hdev, struct sk_buff *skb) | 1217 | static inline void hci_clock_offset_evt(struct hci_dev *hdev, struct sk_buff *skb) |
1085 | { | 1218 | { |
1086 | struct hci_ev_clock_offset *ev = (struct hci_ev_clock_offset *) skb->data; | 1219 | struct hci_ev_clock_offset *ev = (void *) skb->data; |
1087 | struct hci_conn *conn; | 1220 | struct hci_conn *conn; |
1088 | 1221 | ||
1089 | BT_DBG("%s status %d", hdev->name, ev->status); | 1222 | BT_DBG("%s status %d", hdev->name, ev->status); |
@@ -1103,10 +1236,9 @@ static inline void hci_clock_offset_evt(struct hci_dev *hdev, struct sk_buff *sk | |||
1103 | hci_dev_unlock(hdev); | 1236 | hci_dev_unlock(hdev); |
1104 | } | 1237 | } |
1105 | 1238 | ||
1106 | /* Page Scan Repetition Mode */ | ||
1107 | static inline void hci_pscan_rep_mode_evt(struct hci_dev *hdev, struct sk_buff *skb) | 1239 | static inline void hci_pscan_rep_mode_evt(struct hci_dev *hdev, struct sk_buff *skb) |
1108 | { | 1240 | { |
1109 | struct hci_ev_pscan_rep_mode *ev = (struct hci_ev_pscan_rep_mode *) skb->data; | 1241 | struct hci_ev_pscan_rep_mode *ev = (void *) skb->data; |
1110 | struct inquiry_entry *ie; | 1242 | struct inquiry_entry *ie; |
1111 | 1243 | ||
1112 | BT_DBG("%s", hdev->name); | 1244 | BT_DBG("%s", hdev->name); |
@@ -1121,10 +1253,91 @@ static inline void hci_pscan_rep_mode_evt(struct hci_dev *hdev, struct sk_buff * | |||
1121 | hci_dev_unlock(hdev); | 1253 | hci_dev_unlock(hdev); |
1122 | } | 1254 | } |
1123 | 1255 | ||
1124 | /* Sniff Subrate */ | 1256 | static inline void hci_inquiry_result_with_rssi_evt(struct hci_dev *hdev, struct sk_buff *skb) |
1257 | { | ||
1258 | struct inquiry_data data; | ||
1259 | int num_rsp = *((__u8 *) skb->data); | ||
1260 | |||
1261 | BT_DBG("%s num_rsp %d", hdev->name, num_rsp); | ||
1262 | |||
1263 | if (!num_rsp) | ||
1264 | return; | ||
1265 | |||
1266 | hci_dev_lock(hdev); | ||
1267 | |||
1268 | if ((skb->len - 1) / num_rsp != sizeof(struct inquiry_info_with_rssi)) { | ||
1269 | struct inquiry_info_with_rssi_and_pscan_mode *info = (void *) (skb->data + 1); | ||
1270 | |||
1271 | for (; num_rsp; num_rsp--) { | ||
1272 | bacpy(&data.bdaddr, &info->bdaddr); | ||
1273 | data.pscan_rep_mode = info->pscan_rep_mode; | ||
1274 | data.pscan_period_mode = info->pscan_period_mode; | ||
1275 | data.pscan_mode = info->pscan_mode; | ||
1276 | memcpy(data.dev_class, info->dev_class, 3); | ||
1277 | data.clock_offset = info->clock_offset; | ||
1278 | data.rssi = info->rssi; | ||
1279 | info++; | ||
1280 | hci_inquiry_cache_update(hdev, &data); | ||
1281 | } | ||
1282 | } else { | ||
1283 | struct inquiry_info_with_rssi *info = (void *) (skb->data + 1); | ||
1284 | |||
1285 | for (; num_rsp; num_rsp--) { | ||
1286 | bacpy(&data.bdaddr, &info->bdaddr); | ||
1287 | data.pscan_rep_mode = info->pscan_rep_mode; | ||
1288 | data.pscan_period_mode = info->pscan_period_mode; | ||
1289 | data.pscan_mode = 0x00; | ||
1290 | memcpy(data.dev_class, info->dev_class, 3); | ||
1291 | data.clock_offset = info->clock_offset; | ||
1292 | data.rssi = info->rssi; | ||
1293 | info++; | ||
1294 | hci_inquiry_cache_update(hdev, &data); | ||
1295 | } | ||
1296 | } | ||
1297 | |||
1298 | hci_dev_unlock(hdev); | ||
1299 | } | ||
1300 | |||
1301 | static inline void hci_remote_ext_features_evt(struct hci_dev *hdev, struct sk_buff *skb) | ||
1302 | { | ||
1303 | BT_DBG("%s", hdev->name); | ||
1304 | } | ||
1305 | |||
1306 | static inline void hci_sync_conn_complete_evt(struct hci_dev *hdev, struct sk_buff *skb) | ||
1307 | { | ||
1308 | struct hci_ev_sync_conn_complete *ev = (void *) skb->data; | ||
1309 | struct hci_conn *conn; | ||
1310 | |||
1311 | BT_DBG("%s status %d", hdev->name, ev->status); | ||
1312 | |||
1313 | hci_dev_lock(hdev); | ||
1314 | |||
1315 | conn = hci_conn_hash_lookup_ba(hdev, ev->link_type, &ev->bdaddr); | ||
1316 | if (!conn) | ||
1317 | goto unlock; | ||
1318 | |||
1319 | if (!ev->status) { | ||
1320 | conn->handle = __le16_to_cpu(ev->handle); | ||
1321 | conn->state = BT_CONNECTED; | ||
1322 | } else | ||
1323 | conn->state = BT_CLOSED; | ||
1324 | |||
1325 | hci_proto_connect_cfm(conn, ev->status); | ||
1326 | if (ev->status) | ||
1327 | hci_conn_del(conn); | ||
1328 | |||
1329 | unlock: | ||
1330 | hci_dev_unlock(hdev); | ||
1331 | } | ||
1332 | |||
1333 | static inline void hci_sync_conn_changed_evt(struct hci_dev *hdev, struct sk_buff *skb) | ||
1334 | { | ||
1335 | BT_DBG("%s", hdev->name); | ||
1336 | } | ||
1337 | |||
1125 | static inline void hci_sniff_subrate_evt(struct hci_dev *hdev, struct sk_buff *skb) | 1338 | static inline void hci_sniff_subrate_evt(struct hci_dev *hdev, struct sk_buff *skb) |
1126 | { | 1339 | { |
1127 | struct hci_ev_sniff_subrate *ev = (struct hci_ev_sniff_subrate *) skb->data; | 1340 | struct hci_ev_sniff_subrate *ev = (void *) skb->data; |
1128 | struct hci_conn *conn; | 1341 | struct hci_conn *conn; |
1129 | 1342 | ||
1130 | BT_DBG("%s status %d", hdev->name, ev->status); | 1343 | BT_DBG("%s status %d", hdev->name, ev->status); |
@@ -1138,22 +1351,42 @@ static inline void hci_sniff_subrate_evt(struct hci_dev *hdev, struct sk_buff *s | |||
1138 | hci_dev_unlock(hdev); | 1351 | hci_dev_unlock(hdev); |
1139 | } | 1352 | } |
1140 | 1353 | ||
1141 | void hci_event_packet(struct hci_dev *hdev, struct sk_buff *skb) | 1354 | static inline void hci_extended_inquiry_result_evt(struct hci_dev *hdev, struct sk_buff *skb) |
1142 | { | 1355 | { |
1143 | struct hci_event_hdr *hdr = (struct hci_event_hdr *) skb->data; | 1356 | struct inquiry_data data; |
1144 | struct hci_ev_cmd_complete *ec; | 1357 | struct extended_inquiry_info *info = (void *) (skb->data + 1); |
1145 | struct hci_ev_cmd_status *cs; | 1358 | int num_rsp = *((__u8 *) skb->data); |
1146 | u16 opcode, ocf, ogf; | ||
1147 | 1359 | ||
1148 | skb_pull(skb, HCI_EVENT_HDR_SIZE); | 1360 | BT_DBG("%s num_rsp %d", hdev->name, num_rsp); |
1149 | 1361 | ||
1150 | BT_DBG("%s evt 0x%x", hdev->name, hdr->evt); | 1362 | if (!num_rsp) |
1363 | return; | ||
1151 | 1364 | ||
1152 | switch (hdr->evt) { | 1365 | hci_dev_lock(hdev); |
1153 | case HCI_EV_NUM_COMP_PKTS: | 1366 | |
1154 | hci_num_comp_pkts_evt(hdev, skb); | 1367 | for (; num_rsp; num_rsp--) { |
1155 | break; | 1368 | bacpy(&data.bdaddr, &info->bdaddr); |
1369 | data.pscan_rep_mode = info->pscan_rep_mode; | ||
1370 | data.pscan_period_mode = info->pscan_period_mode; | ||
1371 | data.pscan_mode = 0x00; | ||
1372 | memcpy(data.dev_class, info->dev_class, 3); | ||
1373 | data.clock_offset = info->clock_offset; | ||
1374 | data.rssi = info->rssi; | ||
1375 | info++; | ||
1376 | hci_inquiry_cache_update(hdev, &data); | ||
1377 | } | ||
1156 | 1378 | ||
1379 | hci_dev_unlock(hdev); | ||
1380 | } | ||
1381 | |||
1382 | void hci_event_packet(struct hci_dev *hdev, struct sk_buff *skb) | ||
1383 | { | ||
1384 | struct hci_event_hdr *hdr = (void *) skb->data; | ||
1385 | __u8 event = hdr->evt; | ||
1386 | |||
1387 | skb_pull(skb, HCI_EVENT_HDR_SIZE); | ||
1388 | |||
1389 | switch (event) { | ||
1157 | case HCI_EV_INQUIRY_COMPLETE: | 1390 | case HCI_EV_INQUIRY_COMPLETE: |
1158 | hci_inquiry_complete_evt(hdev, skb); | 1391 | hci_inquiry_complete_evt(hdev, skb); |
1159 | break; | 1392 | break; |
@@ -1162,44 +1395,64 @@ void hci_event_packet(struct hci_dev *hdev, struct sk_buff *skb) | |||
1162 | hci_inquiry_result_evt(hdev, skb); | 1395 | hci_inquiry_result_evt(hdev, skb); |
1163 | break; | 1396 | break; |
1164 | 1397 | ||
1165 | case HCI_EV_INQUIRY_RESULT_WITH_RSSI: | 1398 | case HCI_EV_CONN_COMPLETE: |
1166 | hci_inquiry_result_with_rssi_evt(hdev, skb); | 1399 | hci_conn_complete_evt(hdev, skb); |
1167 | break; | ||
1168 | |||
1169 | case HCI_EV_EXTENDED_INQUIRY_RESULT: | ||
1170 | hci_extended_inquiry_result_evt(hdev, skb); | ||
1171 | break; | 1400 | break; |
1172 | 1401 | ||
1173 | case HCI_EV_CONN_REQUEST: | 1402 | case HCI_EV_CONN_REQUEST: |
1174 | hci_conn_request_evt(hdev, skb); | 1403 | hci_conn_request_evt(hdev, skb); |
1175 | break; | 1404 | break; |
1176 | 1405 | ||
1177 | case HCI_EV_CONN_COMPLETE: | ||
1178 | hci_conn_complete_evt(hdev, skb); | ||
1179 | break; | ||
1180 | |||
1181 | case HCI_EV_DISCONN_COMPLETE: | 1406 | case HCI_EV_DISCONN_COMPLETE: |
1182 | hci_disconn_complete_evt(hdev, skb); | 1407 | hci_disconn_complete_evt(hdev, skb); |
1183 | break; | 1408 | break; |
1184 | 1409 | ||
1185 | case HCI_EV_ROLE_CHANGE: | ||
1186 | hci_role_change_evt(hdev, skb); | ||
1187 | break; | ||
1188 | |||
1189 | case HCI_EV_MODE_CHANGE: | ||
1190 | hci_mode_change_evt(hdev, skb); | ||
1191 | break; | ||
1192 | |||
1193 | case HCI_EV_AUTH_COMPLETE: | 1410 | case HCI_EV_AUTH_COMPLETE: |
1194 | hci_auth_complete_evt(hdev, skb); | 1411 | hci_auth_complete_evt(hdev, skb); |
1195 | break; | 1412 | break; |
1196 | 1413 | ||
1414 | case HCI_EV_REMOTE_NAME: | ||
1415 | hci_remote_name_evt(hdev, skb); | ||
1416 | break; | ||
1417 | |||
1197 | case HCI_EV_ENCRYPT_CHANGE: | 1418 | case HCI_EV_ENCRYPT_CHANGE: |
1198 | hci_encrypt_change_evt(hdev, skb); | 1419 | hci_encrypt_change_evt(hdev, skb); |
1199 | break; | 1420 | break; |
1200 | 1421 | ||
1201 | case HCI_EV_CHANGE_CONN_LINK_KEY_COMPLETE: | 1422 | case HCI_EV_CHANGE_LINK_KEY_COMPLETE: |
1202 | hci_change_conn_link_key_complete_evt(hdev, skb); | 1423 | hci_change_link_key_complete_evt(hdev, skb); |
1424 | break; | ||
1425 | |||
1426 | case HCI_EV_REMOTE_FEATURES: | ||
1427 | hci_remote_features_evt(hdev, skb); | ||
1428 | break; | ||
1429 | |||
1430 | case HCI_EV_REMOTE_VERSION: | ||
1431 | hci_remote_version_evt(hdev, skb); | ||
1432 | break; | ||
1433 | |||
1434 | case HCI_EV_QOS_SETUP_COMPLETE: | ||
1435 | hci_qos_setup_complete_evt(hdev, skb); | ||
1436 | break; | ||
1437 | |||
1438 | case HCI_EV_CMD_COMPLETE: | ||
1439 | hci_cmd_complete_evt(hdev, skb); | ||
1440 | break; | ||
1441 | |||
1442 | case HCI_EV_CMD_STATUS: | ||
1443 | hci_cmd_status_evt(hdev, skb); | ||
1444 | break; | ||
1445 | |||
1446 | case HCI_EV_ROLE_CHANGE: | ||
1447 | hci_role_change_evt(hdev, skb); | ||
1448 | break; | ||
1449 | |||
1450 | case HCI_EV_NUM_COMP_PKTS: | ||
1451 | hci_num_comp_pkts_evt(hdev, skb); | ||
1452 | break; | ||
1453 | |||
1454 | case HCI_EV_MODE_CHANGE: | ||
1455 | hci_mode_change_evt(hdev, skb); | ||
1203 | break; | 1456 | break; |
1204 | 1457 | ||
1205 | case HCI_EV_PIN_CODE_REQ: | 1458 | case HCI_EV_PIN_CODE_REQ: |
@@ -1214,10 +1467,6 @@ void hci_event_packet(struct hci_dev *hdev, struct sk_buff *skb) | |||
1214 | hci_link_key_notify_evt(hdev, skb); | 1467 | hci_link_key_notify_evt(hdev, skb); |
1215 | break; | 1468 | break; |
1216 | 1469 | ||
1217 | case HCI_EV_REMOTE_FEATURES: | ||
1218 | hci_remote_features_evt(hdev, skb); | ||
1219 | break; | ||
1220 | |||
1221 | case HCI_EV_CLOCK_OFFSET: | 1470 | case HCI_EV_CLOCK_OFFSET: |
1222 | hci_clock_offset_evt(hdev, skb); | 1471 | hci_clock_offset_evt(hdev, skb); |
1223 | break; | 1472 | break; |
@@ -1226,82 +1475,32 @@ void hci_event_packet(struct hci_dev *hdev, struct sk_buff *skb) | |||
1226 | hci_pscan_rep_mode_evt(hdev, skb); | 1475 | hci_pscan_rep_mode_evt(hdev, skb); |
1227 | break; | 1476 | break; |
1228 | 1477 | ||
1229 | case HCI_EV_SNIFF_SUBRATE: | 1478 | case HCI_EV_INQUIRY_RESULT_WITH_RSSI: |
1230 | hci_sniff_subrate_evt(hdev, skb); | 1479 | hci_inquiry_result_with_rssi_evt(hdev, skb); |
1231 | break; | 1480 | break; |
1232 | 1481 | ||
1233 | case HCI_EV_CMD_STATUS: | 1482 | case HCI_EV_REMOTE_EXT_FEATURES: |
1234 | cs = (struct hci_ev_cmd_status *) skb->data; | 1483 | hci_remote_ext_features_evt(hdev, skb); |
1235 | skb_pull(skb, sizeof(cs)); | ||
1236 | |||
1237 | opcode = __le16_to_cpu(cs->opcode); | ||
1238 | ogf = hci_opcode_ogf(opcode); | ||
1239 | ocf = hci_opcode_ocf(opcode); | ||
1240 | |||
1241 | switch (ogf) { | ||
1242 | case OGF_INFO_PARAM: | ||
1243 | hci_cs_info_param(hdev, ocf, cs->status); | ||
1244 | break; | ||
1245 | |||
1246 | case OGF_HOST_CTL: | ||
1247 | hci_cs_host_ctl(hdev, ocf, cs->status); | ||
1248 | break; | ||
1249 | |||
1250 | case OGF_LINK_CTL: | ||
1251 | hci_cs_link_ctl(hdev, ocf, cs->status); | ||
1252 | break; | ||
1253 | |||
1254 | case OGF_LINK_POLICY: | ||
1255 | hci_cs_link_policy(hdev, ocf, cs->status); | ||
1256 | break; | ||
1257 | |||
1258 | default: | ||
1259 | BT_DBG("%s Command Status OGF %x", hdev->name, ogf); | ||
1260 | break; | ||
1261 | } | ||
1262 | |||
1263 | if (cs->ncmd) { | ||
1264 | atomic_set(&hdev->cmd_cnt, 1); | ||
1265 | if (!skb_queue_empty(&hdev->cmd_q)) | ||
1266 | hci_sched_cmd(hdev); | ||
1267 | } | ||
1268 | break; | 1484 | break; |
1269 | 1485 | ||
1270 | case HCI_EV_CMD_COMPLETE: | 1486 | case HCI_EV_SYNC_CONN_COMPLETE: |
1271 | ec = (struct hci_ev_cmd_complete *) skb->data; | 1487 | hci_sync_conn_complete_evt(hdev, skb); |
1272 | skb_pull(skb, sizeof(*ec)); | 1488 | break; |
1273 | |||
1274 | opcode = __le16_to_cpu(ec->opcode); | ||
1275 | ogf = hci_opcode_ogf(opcode); | ||
1276 | ocf = hci_opcode_ocf(opcode); | ||
1277 | |||
1278 | switch (ogf) { | ||
1279 | case OGF_INFO_PARAM: | ||
1280 | hci_cc_info_param(hdev, ocf, skb); | ||
1281 | break; | ||
1282 | |||
1283 | case OGF_HOST_CTL: | ||
1284 | hci_cc_host_ctl(hdev, ocf, skb); | ||
1285 | break; | ||
1286 | 1489 | ||
1287 | case OGF_LINK_CTL: | 1490 | case HCI_EV_SYNC_CONN_CHANGED: |
1288 | hci_cc_link_ctl(hdev, ocf, skb); | 1491 | hci_sync_conn_changed_evt(hdev, skb); |
1289 | break; | 1492 | break; |
1290 | 1493 | ||
1291 | case OGF_LINK_POLICY: | 1494 | case HCI_EV_SNIFF_SUBRATE: |
1292 | hci_cc_link_policy(hdev, ocf, skb); | 1495 | hci_sniff_subrate_evt(hdev, skb); |
1293 | break; | 1496 | break; |
1294 | 1497 | ||
1295 | default: | 1498 | case HCI_EV_EXTENDED_INQUIRY_RESULT: |
1296 | BT_DBG("%s Command Completed OGF %x", hdev->name, ogf); | 1499 | hci_extended_inquiry_result_evt(hdev, skb); |
1297 | break; | 1500 | break; |
1298 | } | ||
1299 | 1501 | ||
1300 | if (ec->ncmd) { | 1502 | default: |
1301 | atomic_set(&hdev->cmd_cnt, 1); | 1503 | BT_DBG("%s event 0x%x", hdev->name, event); |
1302 | if (!skb_queue_empty(&hdev->cmd_q)) | ||
1303 | hci_sched_cmd(hdev); | ||
1304 | } | ||
1305 | break; | 1504 | break; |
1306 | } | 1505 | } |
1307 | 1506 | ||
diff --git a/net/bluetooth/hci_sock.c b/net/bluetooth/hci_sock.c index 43dd6373bff9..8825102c517c 100644 --- a/net/bluetooth/hci_sock.c +++ b/net/bluetooth/hci_sock.c | |||
@@ -451,7 +451,7 @@ static int hci_sock_sendmsg(struct kiocb *iocb, struct socket *sock, | |||
451 | goto drop; | 451 | goto drop; |
452 | } | 452 | } |
453 | 453 | ||
454 | if (test_bit(HCI_RAW, &hdev->flags) || (ogf == OGF_VENDOR_CMD)) { | 454 | if (test_bit(HCI_RAW, &hdev->flags) || (ogf == 0x3f)) { |
455 | skb_queue_tail(&hdev->raw_q, skb); | 455 | skb_queue_tail(&hdev->raw_q, skb); |
456 | hci_sched_tx(hdev); | 456 | hci_sched_tx(hdev); |
457 | } else { | 457 | } else { |
diff --git a/net/bluetooth/hci_sysfs.c b/net/bluetooth/hci_sysfs.c index 25835403d659..cef1e3e1881c 100644 --- a/net/bluetooth/hci_sysfs.c +++ b/net/bluetooth/hci_sysfs.c | |||
@@ -41,6 +41,26 @@ static ssize_t show_type(struct device *dev, struct device_attribute *attr, char | |||
41 | return sprintf(buf, "%s\n", typetostr(hdev->type)); | 41 | return sprintf(buf, "%s\n", typetostr(hdev->type)); |
42 | } | 42 | } |
43 | 43 | ||
44 | static ssize_t show_name(struct device *dev, struct device_attribute *attr, char *buf) | ||
45 | { | ||
46 | struct hci_dev *hdev = dev_get_drvdata(dev); | ||
47 | char name[249]; | ||
48 | int i; | ||
49 | |||
50 | for (i = 0; i < 248; i++) | ||
51 | name[i] = hdev->dev_name[i]; | ||
52 | |||
53 | name[248] = '\0'; | ||
54 | return sprintf(buf, "%s\n", name); | ||
55 | } | ||
56 | |||
57 | static ssize_t show_class(struct device *dev, struct device_attribute *attr, char *buf) | ||
58 | { | ||
59 | struct hci_dev *hdev = dev_get_drvdata(dev); | ||
60 | return sprintf(buf, "0x%.2x%.2x%.2x\n", | ||
61 | hdev->dev_class[2], hdev->dev_class[1], hdev->dev_class[0]); | ||
62 | } | ||
63 | |||
44 | static ssize_t show_address(struct device *dev, struct device_attribute *attr, char *buf) | 64 | static ssize_t show_address(struct device *dev, struct device_attribute *attr, char *buf) |
45 | { | 65 | { |
46 | struct hci_dev *hdev = dev_get_drvdata(dev); | 66 | struct hci_dev *hdev = dev_get_drvdata(dev); |
@@ -49,6 +69,17 @@ static ssize_t show_address(struct device *dev, struct device_attribute *attr, c | |||
49 | return sprintf(buf, "%s\n", batostr(&bdaddr)); | 69 | return sprintf(buf, "%s\n", batostr(&bdaddr)); |
50 | } | 70 | } |
51 | 71 | ||
72 | static ssize_t show_features(struct device *dev, struct device_attribute *attr, char *buf) | ||
73 | { | ||
74 | struct hci_dev *hdev = dev_get_drvdata(dev); | ||
75 | |||
76 | return sprintf(buf, "0x%02x%02x%02x%02x%02x%02x%02x%02x\n", | ||
77 | hdev->features[0], hdev->features[1], | ||
78 | hdev->features[2], hdev->features[3], | ||
79 | hdev->features[4], hdev->features[5], | ||
80 | hdev->features[6], hdev->features[7]); | ||
81 | } | ||
82 | |||
52 | static ssize_t show_manufacturer(struct device *dev, struct device_attribute *attr, char *buf) | 83 | static ssize_t show_manufacturer(struct device *dev, struct device_attribute *attr, char *buf) |
53 | { | 84 | { |
54 | struct hci_dev *hdev = dev_get_drvdata(dev); | 85 | struct hci_dev *hdev = dev_get_drvdata(dev); |
@@ -170,7 +201,10 @@ static ssize_t store_sniff_min_interval(struct device *dev, struct device_attrib | |||
170 | } | 201 | } |
171 | 202 | ||
172 | static DEVICE_ATTR(type, S_IRUGO, show_type, NULL); | 203 | static DEVICE_ATTR(type, S_IRUGO, show_type, NULL); |
204 | static DEVICE_ATTR(name, S_IRUGO, show_name, NULL); | ||
205 | static DEVICE_ATTR(class, S_IRUGO, show_class, NULL); | ||
173 | static DEVICE_ATTR(address, S_IRUGO, show_address, NULL); | 206 | static DEVICE_ATTR(address, S_IRUGO, show_address, NULL); |
207 | static DEVICE_ATTR(features, S_IRUGO, show_features, NULL); | ||
174 | static DEVICE_ATTR(manufacturer, S_IRUGO, show_manufacturer, NULL); | 208 | static DEVICE_ATTR(manufacturer, S_IRUGO, show_manufacturer, NULL); |
175 | static DEVICE_ATTR(hci_version, S_IRUGO, show_hci_version, NULL); | 209 | static DEVICE_ATTR(hci_version, S_IRUGO, show_hci_version, NULL); |
176 | static DEVICE_ATTR(hci_revision, S_IRUGO, show_hci_revision, NULL); | 210 | static DEVICE_ATTR(hci_revision, S_IRUGO, show_hci_revision, NULL); |
@@ -185,7 +219,10 @@ static DEVICE_ATTR(sniff_min_interval, S_IRUGO | S_IWUSR, | |||
185 | 219 | ||
186 | static struct device_attribute *bt_attrs[] = { | 220 | static struct device_attribute *bt_attrs[] = { |
187 | &dev_attr_type, | 221 | &dev_attr_type, |
222 | &dev_attr_name, | ||
223 | &dev_attr_class, | ||
188 | &dev_attr_address, | 224 | &dev_attr_address, |
225 | &dev_attr_features, | ||
189 | &dev_attr_manufacturer, | 226 | &dev_attr_manufacturer, |
190 | &dev_attr_hci_version, | 227 | &dev_attr_hci_version, |
191 | &dev_attr_hci_revision, | 228 | &dev_attr_hci_revision, |
diff --git a/net/bluetooth/hidp/core.c b/net/bluetooth/hidp/core.c index 66c736953cfe..4bbacddeb49d 100644 --- a/net/bluetooth/hidp/core.c +++ b/net/bluetooth/hidp/core.c | |||
@@ -247,7 +247,7 @@ static inline int hidp_queue_report(struct hidp_session *session, unsigned char | |||
247 | { | 247 | { |
248 | struct sk_buff *skb; | 248 | struct sk_buff *skb; |
249 | 249 | ||
250 | BT_DBG("session %p hid %p data %p size %d", session, device, data, size); | 250 | BT_DBG("session %p hid %p data %p size %d", session, session->hid, data, size); |
251 | 251 | ||
252 | if (!(skb = alloc_skb(size + 1, GFP_ATOMIC))) { | 252 | if (!(skb = alloc_skb(size + 1, GFP_ATOMIC))) { |
253 | BT_ERR("Can't allocate memory for new frame"); | 253 | BT_ERR("Can't allocate memory for new frame"); |
diff --git a/net/bluetooth/l2cap.c b/net/bluetooth/l2cap.c index 36ef27b625db..6fbbae78b304 100644 --- a/net/bluetooth/l2cap.c +++ b/net/bluetooth/l2cap.c | |||
@@ -55,7 +55,9 @@ | |||
55 | #define BT_DBG(D...) | 55 | #define BT_DBG(D...) |
56 | #endif | 56 | #endif |
57 | 57 | ||
58 | #define VERSION "2.8" | 58 | #define VERSION "2.9" |
59 | |||
60 | static u32 l2cap_feat_mask = 0x0000; | ||
59 | 61 | ||
60 | static const struct proto_ops l2cap_sock_ops; | 62 | static const struct proto_ops l2cap_sock_ops; |
61 | 63 | ||
@@ -258,7 +260,119 @@ static void l2cap_chan_del(struct sock *sk, int err) | |||
258 | sk->sk_state_change(sk); | 260 | sk->sk_state_change(sk); |
259 | } | 261 | } |
260 | 262 | ||
263 | static inline u8 l2cap_get_ident(struct l2cap_conn *conn) | ||
264 | { | ||
265 | u8 id; | ||
266 | |||
267 | /* Get next available identificator. | ||
268 | * 1 - 128 are used by kernel. | ||
269 | * 129 - 199 are reserved. | ||
270 | * 200 - 254 are used by utilities like l2ping, etc. | ||
271 | */ | ||
272 | |||
273 | spin_lock_bh(&conn->lock); | ||
274 | |||
275 | if (++conn->tx_ident > 128) | ||
276 | conn->tx_ident = 1; | ||
277 | |||
278 | id = conn->tx_ident; | ||
279 | |||
280 | spin_unlock_bh(&conn->lock); | ||
281 | |||
282 | return id; | ||
283 | } | ||
284 | |||
285 | static inline int l2cap_send_cmd(struct l2cap_conn *conn, u8 ident, u8 code, u16 len, void *data) | ||
286 | { | ||
287 | struct sk_buff *skb = l2cap_build_cmd(conn, code, ident, len, data); | ||
288 | |||
289 | BT_DBG("code 0x%2.2x", code); | ||
290 | |||
291 | if (!skb) | ||
292 | return -ENOMEM; | ||
293 | |||
294 | return hci_send_acl(conn->hcon, skb, 0); | ||
295 | } | ||
296 | |||
261 | /* ---- L2CAP connections ---- */ | 297 | /* ---- L2CAP connections ---- */ |
298 | static void l2cap_conn_start(struct l2cap_conn *conn) | ||
299 | { | ||
300 | struct l2cap_chan_list *l = &conn->chan_list; | ||
301 | struct sock *sk; | ||
302 | |||
303 | BT_DBG("conn %p", conn); | ||
304 | |||
305 | read_lock(&l->lock); | ||
306 | |||
307 | for (sk = l->head; sk; sk = l2cap_pi(sk)->next_c) { | ||
308 | bh_lock_sock(sk); | ||
309 | |||
310 | if (sk->sk_type != SOCK_SEQPACKET) { | ||
311 | l2cap_sock_clear_timer(sk); | ||
312 | sk->sk_state = BT_CONNECTED; | ||
313 | sk->sk_state_change(sk); | ||
314 | } else if (sk->sk_state == BT_CONNECT) { | ||
315 | struct l2cap_conn_req req; | ||
316 | l2cap_pi(sk)->ident = l2cap_get_ident(conn); | ||
317 | req.scid = cpu_to_le16(l2cap_pi(sk)->scid); | ||
318 | req.psm = l2cap_pi(sk)->psm; | ||
319 | l2cap_send_cmd(conn, l2cap_pi(sk)->ident, | ||
320 | L2CAP_CONN_REQ, sizeof(req), &req); | ||
321 | } | ||
322 | |||
323 | bh_unlock_sock(sk); | ||
324 | } | ||
325 | |||
326 | read_unlock(&l->lock); | ||
327 | } | ||
328 | |||
329 | static void l2cap_conn_ready(struct l2cap_conn *conn) | ||
330 | { | ||
331 | BT_DBG("conn %p", conn); | ||
332 | |||
333 | if (conn->chan_list.head || !hlist_empty(&l2cap_sk_list.head)) { | ||
334 | struct l2cap_info_req req; | ||
335 | |||
336 | req.type = cpu_to_le16(L2CAP_IT_FEAT_MASK); | ||
337 | |||
338 | conn->info_state |= L2CAP_INFO_FEAT_MASK_REQ_SENT; | ||
339 | conn->info_ident = l2cap_get_ident(conn); | ||
340 | |||
341 | mod_timer(&conn->info_timer, | ||
342 | jiffies + msecs_to_jiffies(L2CAP_INFO_TIMEOUT)); | ||
343 | |||
344 | l2cap_send_cmd(conn, conn->info_ident, | ||
345 | L2CAP_INFO_REQ, sizeof(req), &req); | ||
346 | } | ||
347 | } | ||
348 | |||
349 | /* Notify sockets that we cannot guaranty reliability anymore */ | ||
350 | static void l2cap_conn_unreliable(struct l2cap_conn *conn, int err) | ||
351 | { | ||
352 | struct l2cap_chan_list *l = &conn->chan_list; | ||
353 | struct sock *sk; | ||
354 | |||
355 | BT_DBG("conn %p", conn); | ||
356 | |||
357 | read_lock(&l->lock); | ||
358 | |||
359 | for (sk = l->head; sk; sk = l2cap_pi(sk)->next_c) { | ||
360 | if (l2cap_pi(sk)->link_mode & L2CAP_LM_RELIABLE) | ||
361 | sk->sk_err = err; | ||
362 | } | ||
363 | |||
364 | read_unlock(&l->lock); | ||
365 | } | ||
366 | |||
367 | static void l2cap_info_timeout(unsigned long arg) | ||
368 | { | ||
369 | struct l2cap_conn *conn = (void *) arg; | ||
370 | |||
371 | conn->info_ident = 0; | ||
372 | |||
373 | l2cap_conn_start(conn); | ||
374 | } | ||
375 | |||
262 | static struct l2cap_conn *l2cap_conn_add(struct hci_conn *hcon, u8 status) | 376 | static struct l2cap_conn *l2cap_conn_add(struct hci_conn *hcon, u8 status) |
263 | { | 377 | { |
264 | struct l2cap_conn *conn = hcon->l2cap_data; | 378 | struct l2cap_conn *conn = hcon->l2cap_data; |
@@ -279,6 +393,12 @@ static struct l2cap_conn *l2cap_conn_add(struct hci_conn *hcon, u8 status) | |||
279 | conn->src = &hcon->hdev->bdaddr; | 393 | conn->src = &hcon->hdev->bdaddr; |
280 | conn->dst = &hcon->dst; | 394 | conn->dst = &hcon->dst; |
281 | 395 | ||
396 | conn->feat_mask = 0; | ||
397 | |||
398 | init_timer(&conn->info_timer); | ||
399 | conn->info_timer.function = l2cap_info_timeout; | ||
400 | conn->info_timer.data = (unsigned long) conn; | ||
401 | |||
282 | spin_lock_init(&conn->lock); | 402 | spin_lock_init(&conn->lock); |
283 | rwlock_init(&conn->chan_list.lock); | 403 | rwlock_init(&conn->chan_list.lock); |
284 | 404 | ||
@@ -318,40 +438,6 @@ static inline void l2cap_chan_add(struct l2cap_conn *conn, struct sock *sk, stru | |||
318 | write_unlock_bh(&l->lock); | 438 | write_unlock_bh(&l->lock); |
319 | } | 439 | } |
320 | 440 | ||
321 | static inline u8 l2cap_get_ident(struct l2cap_conn *conn) | ||
322 | { | ||
323 | u8 id; | ||
324 | |||
325 | /* Get next available identificator. | ||
326 | * 1 - 128 are used by kernel. | ||
327 | * 129 - 199 are reserved. | ||
328 | * 200 - 254 are used by utilities like l2ping, etc. | ||
329 | */ | ||
330 | |||
331 | spin_lock_bh(&conn->lock); | ||
332 | |||
333 | if (++conn->tx_ident > 128) | ||
334 | conn->tx_ident = 1; | ||
335 | |||
336 | id = conn->tx_ident; | ||
337 | |||
338 | spin_unlock_bh(&conn->lock); | ||
339 | |||
340 | return id; | ||
341 | } | ||
342 | |||
343 | static inline int l2cap_send_cmd(struct l2cap_conn *conn, u8 ident, u8 code, u16 len, void *data) | ||
344 | { | ||
345 | struct sk_buff *skb = l2cap_build_cmd(conn, code, ident, len, data); | ||
346 | |||
347 | BT_DBG("code 0x%2.2x", code); | ||
348 | |||
349 | if (!skb) | ||
350 | return -ENOMEM; | ||
351 | |||
352 | return hci_send_acl(conn->hcon, skb, 0); | ||
353 | } | ||
354 | |||
355 | /* ---- Socket interface ---- */ | 441 | /* ---- Socket interface ---- */ |
356 | static struct sock *__l2cap_get_sock_by_addr(__le16 psm, bdaddr_t *src) | 442 | static struct sock *__l2cap_get_sock_by_addr(__le16 psm, bdaddr_t *src) |
357 | { | 443 | { |
@@ -508,7 +594,6 @@ static void l2cap_sock_init(struct sock *sk, struct sock *parent) | |||
508 | 594 | ||
509 | /* Default config options */ | 595 | /* Default config options */ |
510 | pi->conf_len = 0; | 596 | pi->conf_len = 0; |
511 | pi->conf_mtu = L2CAP_DEFAULT_MTU; | ||
512 | pi->flush_to = L2CAP_DEFAULT_FLUSH_TO; | 597 | pi->flush_to = L2CAP_DEFAULT_FLUSH_TO; |
513 | } | 598 | } |
514 | 599 | ||
@@ -530,7 +615,7 @@ static struct sock *l2cap_sock_alloc(struct net *net, struct socket *sock, int p | |||
530 | INIT_LIST_HEAD(&bt_sk(sk)->accept_q); | 615 | INIT_LIST_HEAD(&bt_sk(sk)->accept_q); |
531 | 616 | ||
532 | sk->sk_destruct = l2cap_sock_destruct; | 617 | sk->sk_destruct = l2cap_sock_destruct; |
533 | sk->sk_sndtimeo = L2CAP_CONN_TIMEOUT; | 618 | sk->sk_sndtimeo = msecs_to_jiffies(L2CAP_CONN_TIMEOUT); |
534 | 619 | ||
535 | sock_reset_flag(sk, SOCK_ZAPPED); | 620 | sock_reset_flag(sk, SOCK_ZAPPED); |
536 | 621 | ||
@@ -650,6 +735,11 @@ static int l2cap_do_connect(struct sock *sk) | |||
650 | l2cap_sock_set_timer(sk, sk->sk_sndtimeo); | 735 | l2cap_sock_set_timer(sk, sk->sk_sndtimeo); |
651 | 736 | ||
652 | if (hcon->state == BT_CONNECTED) { | 737 | if (hcon->state == BT_CONNECTED) { |
738 | if (!(conn->info_state & L2CAP_INFO_FEAT_MASK_REQ_SENT)) { | ||
739 | l2cap_conn_ready(conn); | ||
740 | goto done; | ||
741 | } | ||
742 | |||
653 | if (sk->sk_type == SOCK_SEQPACKET) { | 743 | if (sk->sk_type == SOCK_SEQPACKET) { |
654 | struct l2cap_conn_req req; | 744 | struct l2cap_conn_req req; |
655 | l2cap_pi(sk)->ident = l2cap_get_ident(conn); | 745 | l2cap_pi(sk)->ident = l2cap_get_ident(conn); |
@@ -958,7 +1048,7 @@ static int l2cap_sock_setsockopt(struct socket *sock, int level, int optname, ch | |||
958 | opts.imtu = l2cap_pi(sk)->imtu; | 1048 | opts.imtu = l2cap_pi(sk)->imtu; |
959 | opts.omtu = l2cap_pi(sk)->omtu; | 1049 | opts.omtu = l2cap_pi(sk)->omtu; |
960 | opts.flush_to = l2cap_pi(sk)->flush_to; | 1050 | opts.flush_to = l2cap_pi(sk)->flush_to; |
961 | opts.mode = 0x00; | 1051 | opts.mode = L2CAP_MODE_BASIC; |
962 | 1052 | ||
963 | len = min_t(unsigned int, sizeof(opts), optlen); | 1053 | len = min_t(unsigned int, sizeof(opts), optlen); |
964 | if (copy_from_user((char *) &opts, optval, len)) { | 1054 | if (copy_from_user((char *) &opts, optval, len)) { |
@@ -1007,7 +1097,7 @@ static int l2cap_sock_getsockopt(struct socket *sock, int level, int optname, ch | |||
1007 | opts.imtu = l2cap_pi(sk)->imtu; | 1097 | opts.imtu = l2cap_pi(sk)->imtu; |
1008 | opts.omtu = l2cap_pi(sk)->omtu; | 1098 | opts.omtu = l2cap_pi(sk)->omtu; |
1009 | opts.flush_to = l2cap_pi(sk)->flush_to; | 1099 | opts.flush_to = l2cap_pi(sk)->flush_to; |
1010 | opts.mode = 0x00; | 1100 | opts.mode = L2CAP_MODE_BASIC; |
1011 | 1101 | ||
1012 | len = min_t(unsigned int, len, sizeof(opts)); | 1102 | len = min_t(unsigned int, len, sizeof(opts)); |
1013 | if (copy_to_user(optval, (char *) &opts, len)) | 1103 | if (copy_to_user(optval, (char *) &opts, len)) |
@@ -1084,52 +1174,6 @@ static int l2cap_sock_release(struct socket *sock) | |||
1084 | return err; | 1174 | return err; |
1085 | } | 1175 | } |
1086 | 1176 | ||
1087 | static void l2cap_conn_ready(struct l2cap_conn *conn) | ||
1088 | { | ||
1089 | struct l2cap_chan_list *l = &conn->chan_list; | ||
1090 | struct sock *sk; | ||
1091 | |||
1092 | BT_DBG("conn %p", conn); | ||
1093 | |||
1094 | read_lock(&l->lock); | ||
1095 | |||
1096 | for (sk = l->head; sk; sk = l2cap_pi(sk)->next_c) { | ||
1097 | bh_lock_sock(sk); | ||
1098 | |||
1099 | if (sk->sk_type != SOCK_SEQPACKET) { | ||
1100 | l2cap_sock_clear_timer(sk); | ||
1101 | sk->sk_state = BT_CONNECTED; | ||
1102 | sk->sk_state_change(sk); | ||
1103 | } else if (sk->sk_state == BT_CONNECT) { | ||
1104 | struct l2cap_conn_req req; | ||
1105 | l2cap_pi(sk)->ident = l2cap_get_ident(conn); | ||
1106 | req.scid = cpu_to_le16(l2cap_pi(sk)->scid); | ||
1107 | req.psm = l2cap_pi(sk)->psm; | ||
1108 | l2cap_send_cmd(conn, l2cap_pi(sk)->ident, L2CAP_CONN_REQ, sizeof(req), &req); | ||
1109 | } | ||
1110 | |||
1111 | bh_unlock_sock(sk); | ||
1112 | } | ||
1113 | |||
1114 | read_unlock(&l->lock); | ||
1115 | } | ||
1116 | |||
1117 | /* Notify sockets that we cannot guaranty reliability anymore */ | ||
1118 | static void l2cap_conn_unreliable(struct l2cap_conn *conn, int err) | ||
1119 | { | ||
1120 | struct l2cap_chan_list *l = &conn->chan_list; | ||
1121 | struct sock *sk; | ||
1122 | |||
1123 | BT_DBG("conn %p", conn); | ||
1124 | |||
1125 | read_lock(&l->lock); | ||
1126 | for (sk = l->head; sk; sk = l2cap_pi(sk)->next_c) { | ||
1127 | if (l2cap_pi(sk)->link_mode & L2CAP_LM_RELIABLE) | ||
1128 | sk->sk_err = err; | ||
1129 | } | ||
1130 | read_unlock(&l->lock); | ||
1131 | } | ||
1132 | |||
1133 | static void l2cap_chan_ready(struct sock *sk) | 1177 | static void l2cap_chan_ready(struct sock *sk) |
1134 | { | 1178 | { |
1135 | struct sock *parent = bt_sk(sk)->parent; | 1179 | struct sock *parent = bt_sk(sk)->parent; |
@@ -1256,11 +1300,11 @@ static inline int l2cap_get_conf_opt(void **ptr, int *type, int *olen, unsigned | |||
1256 | break; | 1300 | break; |
1257 | 1301 | ||
1258 | case 2: | 1302 | case 2: |
1259 | *val = __le16_to_cpu(*((__le16 *)opt->val)); | 1303 | *val = __le16_to_cpu(*((__le16 *) opt->val)); |
1260 | break; | 1304 | break; |
1261 | 1305 | ||
1262 | case 4: | 1306 | case 4: |
1263 | *val = __le32_to_cpu(*((__le32 *)opt->val)); | 1307 | *val = __le32_to_cpu(*((__le32 *) opt->val)); |
1264 | break; | 1308 | break; |
1265 | 1309 | ||
1266 | default: | 1310 | default: |
@@ -1332,6 +1376,8 @@ static int l2cap_parse_conf_req(struct sock *sk, void *data) | |||
1332 | int len = pi->conf_len; | 1376 | int len = pi->conf_len; |
1333 | int type, hint, olen; | 1377 | int type, hint, olen; |
1334 | unsigned long val; | 1378 | unsigned long val; |
1379 | struct l2cap_conf_rfc rfc = { .mode = L2CAP_MODE_BASIC }; | ||
1380 | u16 mtu = L2CAP_DEFAULT_MTU; | ||
1335 | u16 result = L2CAP_CONF_SUCCESS; | 1381 | u16 result = L2CAP_CONF_SUCCESS; |
1336 | 1382 | ||
1337 | BT_DBG("sk %p", sk); | 1383 | BT_DBG("sk %p", sk); |
@@ -1344,7 +1390,7 @@ static int l2cap_parse_conf_req(struct sock *sk, void *data) | |||
1344 | 1390 | ||
1345 | switch (type) { | 1391 | switch (type) { |
1346 | case L2CAP_CONF_MTU: | 1392 | case L2CAP_CONF_MTU: |
1347 | pi->conf_mtu = val; | 1393 | mtu = val; |
1348 | break; | 1394 | break; |
1349 | 1395 | ||
1350 | case L2CAP_CONF_FLUSH_TO: | 1396 | case L2CAP_CONF_FLUSH_TO: |
@@ -1354,6 +1400,11 @@ static int l2cap_parse_conf_req(struct sock *sk, void *data) | |||
1354 | case L2CAP_CONF_QOS: | 1400 | case L2CAP_CONF_QOS: |
1355 | break; | 1401 | break; |
1356 | 1402 | ||
1403 | case L2CAP_CONF_RFC: | ||
1404 | if (olen == sizeof(rfc)) | ||
1405 | memcpy(&rfc, (void *) val, olen); | ||
1406 | break; | ||
1407 | |||
1357 | default: | 1408 | default: |
1358 | if (hint) | 1409 | if (hint) |
1359 | break; | 1410 | break; |
@@ -1368,12 +1419,24 @@ static int l2cap_parse_conf_req(struct sock *sk, void *data) | |||
1368 | /* Configure output options and let the other side know | 1419 | /* Configure output options and let the other side know |
1369 | * which ones we don't like. */ | 1420 | * which ones we don't like. */ |
1370 | 1421 | ||
1371 | if (pi->conf_mtu < pi->omtu) | 1422 | if (rfc.mode == L2CAP_MODE_BASIC) { |
1423 | if (mtu < pi->omtu) | ||
1424 | result = L2CAP_CONF_UNACCEPT; | ||
1425 | else { | ||
1426 | pi->omtu = mtu; | ||
1427 | pi->conf_state |= L2CAP_CONF_OUTPUT_DONE; | ||
1428 | } | ||
1429 | |||
1430 | l2cap_add_conf_opt(&ptr, L2CAP_CONF_MTU, 2, pi->omtu); | ||
1431 | } else { | ||
1372 | result = L2CAP_CONF_UNACCEPT; | 1432 | result = L2CAP_CONF_UNACCEPT; |
1373 | else | ||
1374 | pi->omtu = pi->conf_mtu; | ||
1375 | 1433 | ||
1376 | l2cap_add_conf_opt(&ptr, L2CAP_CONF_MTU, 2, pi->omtu); | 1434 | memset(&rfc, 0, sizeof(rfc)); |
1435 | rfc.mode = L2CAP_MODE_BASIC; | ||
1436 | |||
1437 | l2cap_add_conf_opt(&ptr, L2CAP_CONF_RFC, | ||
1438 | sizeof(rfc), (unsigned long) &rfc); | ||
1439 | } | ||
1377 | } | 1440 | } |
1378 | 1441 | ||
1379 | rsp->scid = cpu_to_le16(pi->dcid); | 1442 | rsp->scid = cpu_to_le16(pi->dcid); |
@@ -1397,6 +1460,23 @@ static int l2cap_build_conf_rsp(struct sock *sk, void *data, u16 result, u16 fla | |||
1397 | return ptr - data; | 1460 | return ptr - data; |
1398 | } | 1461 | } |
1399 | 1462 | ||
1463 | static inline int l2cap_command_rej(struct l2cap_conn *conn, struct l2cap_cmd_hdr *cmd, u8 *data) | ||
1464 | { | ||
1465 | struct l2cap_cmd_rej *rej = (struct l2cap_cmd_rej *) data; | ||
1466 | |||
1467 | if (rej->reason != 0x0000) | ||
1468 | return 0; | ||
1469 | |||
1470 | if ((conn->info_state & L2CAP_INFO_FEAT_MASK_REQ_SENT) && | ||
1471 | cmd->ident == conn->info_ident) { | ||
1472 | conn->info_ident = 0; | ||
1473 | del_timer(&conn->info_timer); | ||
1474 | l2cap_conn_start(conn); | ||
1475 | } | ||
1476 | |||
1477 | return 0; | ||
1478 | } | ||
1479 | |||
1400 | static inline int l2cap_connect_req(struct l2cap_conn *conn, struct l2cap_cmd_hdr *cmd, u8 *data) | 1480 | static inline int l2cap_connect_req(struct l2cap_conn *conn, struct l2cap_cmd_hdr *cmd, u8 *data) |
1401 | { | 1481 | { |
1402 | struct l2cap_chan_list *list = &conn->chan_list; | 1482 | struct l2cap_chan_list *list = &conn->chan_list; |
@@ -1577,16 +1657,19 @@ static inline int l2cap_config_req(struct l2cap_conn *conn, struct l2cap_cmd_hdr | |||
1577 | 1657 | ||
1578 | l2cap_send_cmd(conn, cmd->ident, L2CAP_CONF_RSP, len, rsp); | 1658 | l2cap_send_cmd(conn, cmd->ident, L2CAP_CONF_RSP, len, rsp); |
1579 | 1659 | ||
1580 | /* Output config done. */ | ||
1581 | l2cap_pi(sk)->conf_state |= L2CAP_CONF_OUTPUT_DONE; | ||
1582 | |||
1583 | /* Reset config buffer. */ | 1660 | /* Reset config buffer. */ |
1584 | l2cap_pi(sk)->conf_len = 0; | 1661 | l2cap_pi(sk)->conf_len = 0; |
1585 | 1662 | ||
1663 | if (!(l2cap_pi(sk)->conf_state & L2CAP_CONF_OUTPUT_DONE)) | ||
1664 | goto unlock; | ||
1665 | |||
1586 | if (l2cap_pi(sk)->conf_state & L2CAP_CONF_INPUT_DONE) { | 1666 | if (l2cap_pi(sk)->conf_state & L2CAP_CONF_INPUT_DONE) { |
1587 | sk->sk_state = BT_CONNECTED; | 1667 | sk->sk_state = BT_CONNECTED; |
1588 | l2cap_chan_ready(sk); | 1668 | l2cap_chan_ready(sk); |
1589 | } else if (!(l2cap_pi(sk)->conf_state & L2CAP_CONF_REQ_SENT)) { | 1669 | goto unlock; |
1670 | } | ||
1671 | |||
1672 | if (!(l2cap_pi(sk)->conf_state & L2CAP_CONF_REQ_SENT)) { | ||
1590 | u8 req[64]; | 1673 | u8 req[64]; |
1591 | l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_CONF_REQ, | 1674 | l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_CONF_REQ, |
1592 | l2cap_build_conf_req(sk, req), req); | 1675 | l2cap_build_conf_req(sk, req), req); |
@@ -1646,7 +1729,6 @@ static inline int l2cap_config_rsp(struct l2cap_conn *conn, struct l2cap_cmd_hdr | |||
1646 | if (flags & 0x01) | 1729 | if (flags & 0x01) |
1647 | goto done; | 1730 | goto done; |
1648 | 1731 | ||
1649 | /* Input config done */ | ||
1650 | l2cap_pi(sk)->conf_state |= L2CAP_CONF_INPUT_DONE; | 1732 | l2cap_pi(sk)->conf_state |= L2CAP_CONF_INPUT_DONE; |
1651 | 1733 | ||
1652 | if (l2cap_pi(sk)->conf_state & L2CAP_CONF_OUTPUT_DONE) { | 1734 | if (l2cap_pi(sk)->conf_state & L2CAP_CONF_OUTPUT_DONE) { |
@@ -1711,16 +1793,27 @@ static inline int l2cap_disconnect_rsp(struct l2cap_conn *conn, struct l2cap_cmd | |||
1711 | static inline int l2cap_information_req(struct l2cap_conn *conn, struct l2cap_cmd_hdr *cmd, u8 *data) | 1793 | static inline int l2cap_information_req(struct l2cap_conn *conn, struct l2cap_cmd_hdr *cmd, u8 *data) |
1712 | { | 1794 | { |
1713 | struct l2cap_info_req *req = (struct l2cap_info_req *) data; | 1795 | struct l2cap_info_req *req = (struct l2cap_info_req *) data; |
1714 | struct l2cap_info_rsp rsp; | ||
1715 | u16 type; | 1796 | u16 type; |
1716 | 1797 | ||
1717 | type = __le16_to_cpu(req->type); | 1798 | type = __le16_to_cpu(req->type); |
1718 | 1799 | ||
1719 | BT_DBG("type 0x%4.4x", type); | 1800 | BT_DBG("type 0x%4.4x", type); |
1720 | 1801 | ||
1721 | rsp.type = cpu_to_le16(type); | 1802 | if (type == L2CAP_IT_FEAT_MASK) { |
1722 | rsp.result = cpu_to_le16(L2CAP_IR_NOTSUPP); | 1803 | u8 buf[8]; |
1723 | l2cap_send_cmd(conn, cmd->ident, L2CAP_INFO_RSP, sizeof(rsp), &rsp); | 1804 | struct l2cap_info_rsp *rsp = (struct l2cap_info_rsp *) buf; |
1805 | rsp->type = cpu_to_le16(L2CAP_IT_FEAT_MASK); | ||
1806 | rsp->result = cpu_to_le16(L2CAP_IR_SUCCESS); | ||
1807 | put_unaligned(cpu_to_le32(l2cap_feat_mask), (__le32 *) rsp->data); | ||
1808 | l2cap_send_cmd(conn, cmd->ident, | ||
1809 | L2CAP_INFO_RSP, sizeof(buf), buf); | ||
1810 | } else { | ||
1811 | struct l2cap_info_rsp rsp; | ||
1812 | rsp.type = cpu_to_le16(type); | ||
1813 | rsp.result = cpu_to_le16(L2CAP_IR_NOTSUPP); | ||
1814 | l2cap_send_cmd(conn, cmd->ident, | ||
1815 | L2CAP_INFO_RSP, sizeof(rsp), &rsp); | ||
1816 | } | ||
1724 | 1817 | ||
1725 | return 0; | 1818 | return 0; |
1726 | } | 1819 | } |
@@ -1735,6 +1828,15 @@ static inline int l2cap_information_rsp(struct l2cap_conn *conn, struct l2cap_cm | |||
1735 | 1828 | ||
1736 | BT_DBG("type 0x%4.4x result 0x%2.2x", type, result); | 1829 | BT_DBG("type 0x%4.4x result 0x%2.2x", type, result); |
1737 | 1830 | ||
1831 | conn->info_ident = 0; | ||
1832 | |||
1833 | del_timer(&conn->info_timer); | ||
1834 | |||
1835 | if (type == L2CAP_IT_FEAT_MASK) | ||
1836 | conn->feat_mask = __le32_to_cpu(get_unaligned((__le32 *) rsp->data)); | ||
1837 | |||
1838 | l2cap_conn_start(conn); | ||
1839 | |||
1738 | return 0; | 1840 | return 0; |
1739 | } | 1841 | } |
1740 | 1842 | ||
@@ -1764,7 +1866,7 @@ static inline void l2cap_sig_channel(struct l2cap_conn *conn, struct sk_buff *sk | |||
1764 | 1866 | ||
1765 | switch (cmd.code) { | 1867 | switch (cmd.code) { |
1766 | case L2CAP_COMMAND_REJ: | 1868 | case L2CAP_COMMAND_REJ: |
1767 | /* FIXME: We should process this */ | 1869 | l2cap_command_rej(conn, &cmd, data); |
1768 | break; | 1870 | break; |
1769 | 1871 | ||
1770 | case L2CAP_CONN_REQ: | 1872 | case L2CAP_CONN_REQ: |
diff --git a/net/bluetooth/rfcomm/core.c b/net/bluetooth/rfcomm/core.c index bb7220770f2c..e7ac6ba7ecab 100644 --- a/net/bluetooth/rfcomm/core.c +++ b/net/bluetooth/rfcomm/core.c | |||
@@ -33,11 +33,11 @@ | |||
33 | #include <linux/sched.h> | 33 | #include <linux/sched.h> |
34 | #include <linux/signal.h> | 34 | #include <linux/signal.h> |
35 | #include <linux/init.h> | 35 | #include <linux/init.h> |
36 | #include <linux/freezer.h> | ||
37 | #include <linux/wait.h> | 36 | #include <linux/wait.h> |
38 | #include <linux/device.h> | 37 | #include <linux/device.h> |
39 | #include <linux/net.h> | 38 | #include <linux/net.h> |
40 | #include <linux/mutex.h> | 39 | #include <linux/mutex.h> |
40 | #include <linux/kthread.h> | ||
41 | 41 | ||
42 | #include <net/sock.h> | 42 | #include <net/sock.h> |
43 | #include <asm/uaccess.h> | 43 | #include <asm/uaccess.h> |
@@ -68,7 +68,6 @@ static DEFINE_MUTEX(rfcomm_mutex); | |||
68 | static unsigned long rfcomm_event; | 68 | static unsigned long rfcomm_event; |
69 | 69 | ||
70 | static LIST_HEAD(session_list); | 70 | static LIST_HEAD(session_list); |
71 | static atomic_t terminate, running; | ||
72 | 71 | ||
73 | static int rfcomm_send_frame(struct rfcomm_session *s, u8 *data, int len); | 72 | static int rfcomm_send_frame(struct rfcomm_session *s, u8 *data, int len); |
74 | static int rfcomm_send_sabm(struct rfcomm_session *s, u8 dlci); | 73 | static int rfcomm_send_sabm(struct rfcomm_session *s, u8 dlci); |
@@ -1850,26 +1849,6 @@ static inline void rfcomm_process_sessions(void) | |||
1850 | rfcomm_unlock(); | 1849 | rfcomm_unlock(); |
1851 | } | 1850 | } |
1852 | 1851 | ||
1853 | static void rfcomm_worker(void) | ||
1854 | { | ||
1855 | BT_DBG(""); | ||
1856 | |||
1857 | while (!atomic_read(&terminate)) { | ||
1858 | set_current_state(TASK_INTERRUPTIBLE); | ||
1859 | if (!test_bit(RFCOMM_SCHED_WAKEUP, &rfcomm_event)) { | ||
1860 | /* No pending events. Let's sleep. | ||
1861 | * Incoming connections and data will wake us up. */ | ||
1862 | schedule(); | ||
1863 | } | ||
1864 | set_current_state(TASK_RUNNING); | ||
1865 | |||
1866 | /* Process stuff */ | ||
1867 | clear_bit(RFCOMM_SCHED_WAKEUP, &rfcomm_event); | ||
1868 | rfcomm_process_sessions(); | ||
1869 | } | ||
1870 | return; | ||
1871 | } | ||
1872 | |||
1873 | static int rfcomm_add_listener(bdaddr_t *ba) | 1852 | static int rfcomm_add_listener(bdaddr_t *ba) |
1874 | { | 1853 | { |
1875 | struct sockaddr_l2 addr; | 1854 | struct sockaddr_l2 addr; |
@@ -1935,22 +1914,28 @@ static void rfcomm_kill_listener(void) | |||
1935 | 1914 | ||
1936 | static int rfcomm_run(void *unused) | 1915 | static int rfcomm_run(void *unused) |
1937 | { | 1916 | { |
1938 | rfcomm_thread = current; | 1917 | BT_DBG(""); |
1939 | |||
1940 | atomic_inc(&running); | ||
1941 | 1918 | ||
1942 | daemonize("krfcommd"); | ||
1943 | set_user_nice(current, -10); | 1919 | set_user_nice(current, -10); |
1944 | 1920 | ||
1945 | BT_DBG(""); | ||
1946 | |||
1947 | rfcomm_add_listener(BDADDR_ANY); | 1921 | rfcomm_add_listener(BDADDR_ANY); |
1948 | 1922 | ||
1949 | rfcomm_worker(); | 1923 | while (!kthread_should_stop()) { |
1924 | set_current_state(TASK_INTERRUPTIBLE); | ||
1925 | if (!test_bit(RFCOMM_SCHED_WAKEUP, &rfcomm_event)) { | ||
1926 | /* No pending events. Let's sleep. | ||
1927 | * Incoming connections and data will wake us up. */ | ||
1928 | schedule(); | ||
1929 | } | ||
1930 | set_current_state(TASK_RUNNING); | ||
1931 | |||
1932 | /* Process stuff */ | ||
1933 | clear_bit(RFCOMM_SCHED_WAKEUP, &rfcomm_event); | ||
1934 | rfcomm_process_sessions(); | ||
1935 | } | ||
1950 | 1936 | ||
1951 | rfcomm_kill_listener(); | 1937 | rfcomm_kill_listener(); |
1952 | 1938 | ||
1953 | atomic_dec(&running); | ||
1954 | return 0; | 1939 | return 0; |
1955 | } | 1940 | } |
1956 | 1941 | ||
@@ -2059,7 +2044,11 @@ static int __init rfcomm_init(void) | |||
2059 | 2044 | ||
2060 | hci_register_cb(&rfcomm_cb); | 2045 | hci_register_cb(&rfcomm_cb); |
2061 | 2046 | ||
2062 | kernel_thread(rfcomm_run, NULL, CLONE_KERNEL); | 2047 | rfcomm_thread = kthread_run(rfcomm_run, NULL, "krfcommd"); |
2048 | if (IS_ERR(rfcomm_thread)) { | ||
2049 | hci_unregister_cb(&rfcomm_cb); | ||
2050 | return PTR_ERR(rfcomm_thread); | ||
2051 | } | ||
2063 | 2052 | ||
2064 | if (class_create_file(bt_class, &class_attr_rfcomm_dlc) < 0) | 2053 | if (class_create_file(bt_class, &class_attr_rfcomm_dlc) < 0) |
2065 | BT_ERR("Failed to create RFCOMM info file"); | 2054 | BT_ERR("Failed to create RFCOMM info file"); |
@@ -2081,14 +2070,7 @@ static void __exit rfcomm_exit(void) | |||
2081 | 2070 | ||
2082 | hci_unregister_cb(&rfcomm_cb); | 2071 | hci_unregister_cb(&rfcomm_cb); |
2083 | 2072 | ||
2084 | /* Terminate working thread. | 2073 | kthread_stop(rfcomm_thread); |
2085 | * ie. Set terminate flag and wake it up */ | ||
2086 | atomic_inc(&terminate); | ||
2087 | rfcomm_schedule(RFCOMM_SCHED_STATE); | ||
2088 | |||
2089 | /* Wait until thread is running */ | ||
2090 | while (atomic_read(&running)) | ||
2091 | schedule(); | ||
2092 | 2074 | ||
2093 | #ifdef CONFIG_BT_RFCOMM_TTY | 2075 | #ifdef CONFIG_BT_RFCOMM_TTY |
2094 | rfcomm_cleanup_ttys(); | 2076 | rfcomm_cleanup_ttys(); |
diff --git a/net/bluetooth/rfcomm/tty.c b/net/bluetooth/rfcomm/tty.c index 22a832098d44..e447651a2dbe 100644 --- a/net/bluetooth/rfcomm/tty.c +++ b/net/bluetooth/rfcomm/tty.c | |||
@@ -189,6 +189,23 @@ static struct device *rfcomm_get_device(struct rfcomm_dev *dev) | |||
189 | return conn ? &conn->dev : NULL; | 189 | return conn ? &conn->dev : NULL; |
190 | } | 190 | } |
191 | 191 | ||
192 | static ssize_t show_address(struct device *tty_dev, struct device_attribute *attr, char *buf) | ||
193 | { | ||
194 | struct rfcomm_dev *dev = dev_get_drvdata(tty_dev); | ||
195 | bdaddr_t bdaddr; | ||
196 | baswap(&bdaddr, &dev->dst); | ||
197 | return sprintf(buf, "%s\n", batostr(&bdaddr)); | ||
198 | } | ||
199 | |||
200 | static ssize_t show_channel(struct device *tty_dev, struct device_attribute *attr, char *buf) | ||
201 | { | ||
202 | struct rfcomm_dev *dev = dev_get_drvdata(tty_dev); | ||
203 | return sprintf(buf, "%d\n", dev->channel); | ||
204 | } | ||
205 | |||
206 | static DEVICE_ATTR(address, S_IRUGO, show_address, NULL); | ||
207 | static DEVICE_ATTR(channel, S_IRUGO, show_channel, NULL); | ||
208 | |||
192 | static int rfcomm_dev_add(struct rfcomm_dev_req *req, struct rfcomm_dlc *dlc) | 209 | static int rfcomm_dev_add(struct rfcomm_dev_req *req, struct rfcomm_dlc *dlc) |
193 | { | 210 | { |
194 | struct rfcomm_dev *dev; | 211 | struct rfcomm_dev *dev; |
@@ -281,6 +298,14 @@ out: | |||
281 | return err; | 298 | return err; |
282 | } | 299 | } |
283 | 300 | ||
301 | dev_set_drvdata(dev->tty_dev, dev); | ||
302 | |||
303 | if (device_create_file(dev->tty_dev, &dev_attr_address) < 0) | ||
304 | BT_ERR("Failed to create address attribute"); | ||
305 | |||
306 | if (device_create_file(dev->tty_dev, &dev_attr_channel) < 0) | ||
307 | BT_ERR("Failed to create channel attribute"); | ||
308 | |||
284 | return dev->id; | 309 | return dev->id; |
285 | } | 310 | } |
286 | 311 | ||
diff --git a/net/bluetooth/sco.c b/net/bluetooth/sco.c index 65b6fb1c4154..82d0dfdfa7e2 100644 --- a/net/bluetooth/sco.c +++ b/net/bluetooth/sco.c | |||
@@ -189,7 +189,7 @@ static int sco_connect(struct sock *sk) | |||
189 | struct sco_conn *conn; | 189 | struct sco_conn *conn; |
190 | struct hci_conn *hcon; | 190 | struct hci_conn *hcon; |
191 | struct hci_dev *hdev; | 191 | struct hci_dev *hdev; |
192 | int err = 0; | 192 | int err, type; |
193 | 193 | ||
194 | BT_DBG("%s -> %s", batostr(src), batostr(dst)); | 194 | BT_DBG("%s -> %s", batostr(src), batostr(dst)); |
195 | 195 | ||
@@ -200,7 +200,9 @@ static int sco_connect(struct sock *sk) | |||
200 | 200 | ||
201 | err = -ENOMEM; | 201 | err = -ENOMEM; |
202 | 202 | ||
203 | hcon = hci_connect(hdev, SCO_LINK, dst); | 203 | type = lmp_esco_capable(hdev) ? ESCO_LINK : SCO_LINK; |
204 | |||
205 | hcon = hci_connect(hdev, type, dst); | ||
204 | if (!hcon) | 206 | if (!hcon) |
205 | goto done; | 207 | goto done; |
206 | 208 | ||
@@ -224,6 +226,7 @@ static int sco_connect(struct sock *sk) | |||
224 | sk->sk_state = BT_CONNECT; | 226 | sk->sk_state = BT_CONNECT; |
225 | sco_sock_set_timer(sk, sk->sk_sndtimeo); | 227 | sco_sock_set_timer(sk, sk->sk_sndtimeo); |
226 | } | 228 | } |
229 | |||
227 | done: | 230 | done: |
228 | hci_dev_unlock_bh(hdev); | 231 | hci_dev_unlock_bh(hdev); |
229 | hci_dev_put(hdev); | 232 | hci_dev_put(hdev); |
@@ -846,7 +849,7 @@ static int sco_connect_cfm(struct hci_conn *hcon, __u8 status) | |||
846 | { | 849 | { |
847 | BT_DBG("hcon %p bdaddr %s status %d", hcon, batostr(&hcon->dst), status); | 850 | BT_DBG("hcon %p bdaddr %s status %d", hcon, batostr(&hcon->dst), status); |
848 | 851 | ||
849 | if (hcon->type != SCO_LINK) | 852 | if (hcon->type != SCO_LINK && hcon->type != ESCO_LINK) |
850 | return 0; | 853 | return 0; |
851 | 854 | ||
852 | if (!status) { | 855 | if (!status) { |
@@ -865,10 +868,11 @@ static int sco_disconn_ind(struct hci_conn *hcon, __u8 reason) | |||
865 | { | 868 | { |
866 | BT_DBG("hcon %p reason %d", hcon, reason); | 869 | BT_DBG("hcon %p reason %d", hcon, reason); |
867 | 870 | ||
868 | if (hcon->type != SCO_LINK) | 871 | if (hcon->type != SCO_LINK && hcon->type != ESCO_LINK) |
869 | return 0; | 872 | return 0; |
870 | 873 | ||
871 | sco_conn_del(hcon, bt_err(reason)); | 874 | sco_conn_del(hcon, bt_err(reason)); |
875 | |||
872 | return 0; | 876 | return 0; |
873 | } | 877 | } |
874 | 878 | ||
diff --git a/net/core/dev.c b/net/core/dev.c index 38b03da5c1ca..872658927e47 100644 --- a/net/core/dev.c +++ b/net/core/dev.c | |||
@@ -1553,7 +1553,7 @@ gso: | |||
1553 | return rc; | 1553 | return rc; |
1554 | } | 1554 | } |
1555 | if (unlikely((netif_queue_stopped(dev) || | 1555 | if (unlikely((netif_queue_stopped(dev) || |
1556 | netif_subqueue_stopped(dev, skb->queue_mapping)) && | 1556 | netif_subqueue_stopped(dev, skb)) && |
1557 | skb->next)) | 1557 | skb->next)) |
1558 | return NETDEV_TX_BUSY; | 1558 | return NETDEV_TX_BUSY; |
1559 | } while (skb->next); | 1559 | } while (skb->next); |
@@ -1661,7 +1661,7 @@ gso: | |||
1661 | q = dev->qdisc; | 1661 | q = dev->qdisc; |
1662 | if (q->enqueue) { | 1662 | if (q->enqueue) { |
1663 | /* reset queue_mapping to zero */ | 1663 | /* reset queue_mapping to zero */ |
1664 | skb->queue_mapping = 0; | 1664 | skb_set_queue_mapping(skb, 0); |
1665 | rc = q->enqueue(skb, q); | 1665 | rc = q->enqueue(skb, q); |
1666 | qdisc_run(dev); | 1666 | qdisc_run(dev); |
1667 | spin_unlock(&dev->queue_lock); | 1667 | spin_unlock(&dev->queue_lock); |
@@ -1692,7 +1692,7 @@ gso: | |||
1692 | HARD_TX_LOCK(dev, cpu); | 1692 | HARD_TX_LOCK(dev, cpu); |
1693 | 1693 | ||
1694 | if (!netif_queue_stopped(dev) && | 1694 | if (!netif_queue_stopped(dev) && |
1695 | !netif_subqueue_stopped(dev, skb->queue_mapping)) { | 1695 | !netif_subqueue_stopped(dev, skb)) { |
1696 | rc = 0; | 1696 | rc = 0; |
1697 | if (!dev_hard_start_xmit(skb, dev)) { | 1697 | if (!dev_hard_start_xmit(skb, dev)) { |
1698 | HARD_TX_UNLOCK(dev); | 1698 | HARD_TX_UNLOCK(dev); |
diff --git a/net/core/neighbour.c b/net/core/neighbour.c index 67ba9914e52e..05979e356963 100644 --- a/net/core/neighbour.c +++ b/net/core/neighbour.c | |||
@@ -1438,6 +1438,9 @@ int neigh_table_clear(struct neigh_table *tbl) | |||
1438 | free_percpu(tbl->stats); | 1438 | free_percpu(tbl->stats); |
1439 | tbl->stats = NULL; | 1439 | tbl->stats = NULL; |
1440 | 1440 | ||
1441 | kmem_cache_destroy(tbl->kmem_cachep); | ||
1442 | tbl->kmem_cachep = NULL; | ||
1443 | |||
1441 | return 0; | 1444 | return 0; |
1442 | } | 1445 | } |
1443 | 1446 | ||
diff --git a/net/core/netpoll.c b/net/core/netpoll.c index 95daba624967..bf8d18f1b013 100644 --- a/net/core/netpoll.c +++ b/net/core/netpoll.c | |||
@@ -67,7 +67,7 @@ static void queue_process(struct work_struct *work) | |||
67 | local_irq_save(flags); | 67 | local_irq_save(flags); |
68 | netif_tx_lock(dev); | 68 | netif_tx_lock(dev); |
69 | if ((netif_queue_stopped(dev) || | 69 | if ((netif_queue_stopped(dev) || |
70 | netif_subqueue_stopped(dev, skb->queue_mapping)) || | 70 | netif_subqueue_stopped(dev, skb)) || |
71 | dev->hard_start_xmit(skb, dev) != NETDEV_TX_OK) { | 71 | dev->hard_start_xmit(skb, dev) != NETDEV_TX_OK) { |
72 | skb_queue_head(&npinfo->txq, skb); | 72 | skb_queue_head(&npinfo->txq, skb); |
73 | netif_tx_unlock(dev); | 73 | netif_tx_unlock(dev); |
@@ -269,7 +269,7 @@ static void netpoll_send_skb(struct netpoll *np, struct sk_buff *skb) | |||
269 | tries > 0; --tries) { | 269 | tries > 0; --tries) { |
270 | if (netif_tx_trylock(dev)) { | 270 | if (netif_tx_trylock(dev)) { |
271 | if (!netif_queue_stopped(dev) && | 271 | if (!netif_queue_stopped(dev) && |
272 | !netif_subqueue_stopped(dev, skb->queue_mapping)) | 272 | !netif_subqueue_stopped(dev, skb)) |
273 | status = dev->hard_start_xmit(skb, dev); | 273 | status = dev->hard_start_xmit(skb, dev); |
274 | netif_tx_unlock(dev); | 274 | netif_tx_unlock(dev); |
275 | 275 | ||
diff --git a/net/core/pktgen.c b/net/core/pktgen.c index c4719edb55c0..de33f36947e9 100644 --- a/net/core/pktgen.c +++ b/net/core/pktgen.c | |||
@@ -2603,8 +2603,7 @@ static struct sk_buff *fill_packet_ipv4(struct net_device *odev, | |||
2603 | skb->network_header = skb->tail; | 2603 | skb->network_header = skb->tail; |
2604 | skb->transport_header = skb->network_header + sizeof(struct iphdr); | 2604 | skb->transport_header = skb->network_header + sizeof(struct iphdr); |
2605 | skb_put(skb, sizeof(struct iphdr) + sizeof(struct udphdr)); | 2605 | skb_put(skb, sizeof(struct iphdr) + sizeof(struct udphdr)); |
2606 | skb->queue_mapping = pkt_dev->cur_queue_map; | 2606 | skb_set_queue_mapping(skb, pkt_dev->cur_queue_map); |
2607 | |||
2608 | iph = ip_hdr(skb); | 2607 | iph = ip_hdr(skb); |
2609 | udph = udp_hdr(skb); | 2608 | udph = udp_hdr(skb); |
2610 | 2609 | ||
@@ -2941,8 +2940,7 @@ static struct sk_buff *fill_packet_ipv6(struct net_device *odev, | |||
2941 | skb->network_header = skb->tail; | 2940 | skb->network_header = skb->tail; |
2942 | skb->transport_header = skb->network_header + sizeof(struct ipv6hdr); | 2941 | skb->transport_header = skb->network_header + sizeof(struct ipv6hdr); |
2943 | skb_put(skb, sizeof(struct ipv6hdr) + sizeof(struct udphdr)); | 2942 | skb_put(skb, sizeof(struct ipv6hdr) + sizeof(struct udphdr)); |
2944 | skb->queue_mapping = pkt_dev->cur_queue_map; | 2943 | skb_set_queue_mapping(skb, pkt_dev->cur_queue_map); |
2945 | |||
2946 | iph = ipv6_hdr(skb); | 2944 | iph = ipv6_hdr(skb); |
2947 | udph = udp_hdr(skb); | 2945 | udph = udp_hdr(skb); |
2948 | 2946 | ||
@@ -3385,7 +3383,7 @@ static __inline__ void pktgen_xmit(struct pktgen_dev *pkt_dev) | |||
3385 | 3383 | ||
3386 | if ((netif_queue_stopped(odev) || | 3384 | if ((netif_queue_stopped(odev) || |
3387 | (pkt_dev->skb && | 3385 | (pkt_dev->skb && |
3388 | netif_subqueue_stopped(odev, pkt_dev->skb->queue_mapping))) || | 3386 | netif_subqueue_stopped(odev, pkt_dev->skb))) || |
3389 | need_resched()) { | 3387 | need_resched()) { |
3390 | idle_start = getCurUs(); | 3388 | idle_start = getCurUs(); |
3391 | 3389 | ||
@@ -3402,7 +3400,7 @@ static __inline__ void pktgen_xmit(struct pktgen_dev *pkt_dev) | |||
3402 | pkt_dev->idle_acc += getCurUs() - idle_start; | 3400 | pkt_dev->idle_acc += getCurUs() - idle_start; |
3403 | 3401 | ||
3404 | if (netif_queue_stopped(odev) || | 3402 | if (netif_queue_stopped(odev) || |
3405 | netif_subqueue_stopped(odev, pkt_dev->skb->queue_mapping)) { | 3403 | netif_subqueue_stopped(odev, pkt_dev->skb)) { |
3406 | pkt_dev->next_tx_us = getCurUs(); /* TODO */ | 3404 | pkt_dev->next_tx_us = getCurUs(); /* TODO */ |
3407 | pkt_dev->next_tx_ns = 0; | 3405 | pkt_dev->next_tx_ns = 0; |
3408 | goto out; /* Try the next interface */ | 3406 | goto out; /* Try the next interface */ |
@@ -3431,7 +3429,7 @@ static __inline__ void pktgen_xmit(struct pktgen_dev *pkt_dev) | |||
3431 | 3429 | ||
3432 | netif_tx_lock_bh(odev); | 3430 | netif_tx_lock_bh(odev); |
3433 | if (!netif_queue_stopped(odev) && | 3431 | if (!netif_queue_stopped(odev) && |
3434 | !netif_subqueue_stopped(odev, pkt_dev->skb->queue_mapping)) { | 3432 | !netif_subqueue_stopped(odev, pkt_dev->skb)) { |
3435 | 3433 | ||
3436 | atomic_inc(&(pkt_dev->skb->users)); | 3434 | atomic_inc(&(pkt_dev->skb->users)); |
3437 | retry_now: | 3435 | retry_now: |
diff --git a/net/dccp/diag.c b/net/dccp/diag.c index 0f3745585a94..d8a3509b26f6 100644 --- a/net/dccp/diag.c +++ b/net/dccp/diag.c | |||
@@ -68,3 +68,4 @@ module_exit(dccp_diag_fini); | |||
68 | MODULE_LICENSE("GPL"); | 68 | MODULE_LICENSE("GPL"); |
69 | MODULE_AUTHOR("Arnaldo Carvalho de Melo <acme@mandriva.com>"); | 69 | MODULE_AUTHOR("Arnaldo Carvalho de Melo <acme@mandriva.com>"); |
70 | MODULE_DESCRIPTION("DCCP inet_diag handler"); | 70 | MODULE_DESCRIPTION("DCCP inet_diag handler"); |
71 | MODULE_ALIAS_NET_PF_PROTO_TYPE(PF_NETLINK, NETLINK_INET_DIAG, DCCPDIAG_GETSOCK); | ||
diff --git a/net/dccp/ipv4.c b/net/dccp/ipv4.c index 44f6e17e105f..222549ab274a 100644 --- a/net/dccp/ipv4.c +++ b/net/dccp/ipv4.c | |||
@@ -1037,8 +1037,8 @@ module_exit(dccp_v4_exit); | |||
1037 | * values directly, Also cover the case where the protocol is not specified, | 1037 | * values directly, Also cover the case where the protocol is not specified, |
1038 | * i.e. net-pf-PF_INET-proto-0-type-SOCK_DCCP | 1038 | * i.e. net-pf-PF_INET-proto-0-type-SOCK_DCCP |
1039 | */ | 1039 | */ |
1040 | MODULE_ALIAS("net-pf-" __stringify(PF_INET) "-proto-33-type-6"); | 1040 | MODULE_ALIAS_NET_PF_PROTO_TYPE(PF_INET, 33, 6); |
1041 | MODULE_ALIAS("net-pf-" __stringify(PF_INET) "-proto-0-type-6"); | 1041 | MODULE_ALIAS_NET_PF_PROTO_TYPE(PF_INET, 0, 6); |
1042 | MODULE_LICENSE("GPL"); | 1042 | MODULE_LICENSE("GPL"); |
1043 | MODULE_AUTHOR("Arnaldo Carvalho de Melo <acme@mandriva.com>"); | 1043 | MODULE_AUTHOR("Arnaldo Carvalho de Melo <acme@mandriva.com>"); |
1044 | MODULE_DESCRIPTION("DCCP - Datagram Congestion Controlled Protocol"); | 1044 | MODULE_DESCRIPTION("DCCP - Datagram Congestion Controlled Protocol"); |
diff --git a/net/dccp/ipv6.c b/net/dccp/ipv6.c index cac53548c2d8..bbadd6681b83 100644 --- a/net/dccp/ipv6.c +++ b/net/dccp/ipv6.c | |||
@@ -1219,8 +1219,8 @@ module_exit(dccp_v6_exit); | |||
1219 | * values directly, Also cover the case where the protocol is not specified, | 1219 | * values directly, Also cover the case where the protocol is not specified, |
1220 | * i.e. net-pf-PF_INET6-proto-0-type-SOCK_DCCP | 1220 | * i.e. net-pf-PF_INET6-proto-0-type-SOCK_DCCP |
1221 | */ | 1221 | */ |
1222 | MODULE_ALIAS("net-pf-" __stringify(PF_INET6) "-proto-33-type-6"); | 1222 | MODULE_ALIAS_NET_PF_PROTO_TYPE(PF_INET6, 33, 6); |
1223 | MODULE_ALIAS("net-pf-" __stringify(PF_INET6) "-proto-0-type-6"); | 1223 | MODULE_ALIAS_NET_PF_PROTO_TYPE(PF_INET6, 0, 6); |
1224 | MODULE_LICENSE("GPL"); | 1224 | MODULE_LICENSE("GPL"); |
1225 | MODULE_AUTHOR("Arnaldo Carvalho de Melo <acme@mandriva.com>"); | 1225 | MODULE_AUTHOR("Arnaldo Carvalho de Melo <acme@mandriva.com>"); |
1226 | MODULE_DESCRIPTION("DCCPv6 - Datagram Congestion Controlled Protocol"); | 1226 | MODULE_DESCRIPTION("DCCPv6 - Datagram Congestion Controlled Protocol"); |
diff --git a/net/ipv4/inet_diag.c b/net/ipv4/inet_diag.c index 7eb83ebed2ec..dc429b6b0ba6 100644 --- a/net/ipv4/inet_diag.c +++ b/net/ipv4/inet_diag.c | |||
@@ -815,6 +815,12 @@ static int inet_diag_rcv_msg(struct sk_buff *skb, struct nlmsghdr *nlh) | |||
815 | nlmsg_len(nlh) < hdrlen) | 815 | nlmsg_len(nlh) < hdrlen) |
816 | return -EINVAL; | 816 | return -EINVAL; |
817 | 817 | ||
818 | #ifdef CONFIG_KMOD | ||
819 | if (inet_diag_table[nlh->nlmsg_type] == NULL) | ||
820 | request_module("net-pf-%d-proto-%d-type-%d", PF_NETLINK, | ||
821 | NETLINK_INET_DIAG, nlh->nlmsg_type); | ||
822 | #endif | ||
823 | |||
818 | if (inet_diag_table[nlh->nlmsg_type] == NULL) | 824 | if (inet_diag_table[nlh->nlmsg_type] == NULL) |
819 | return -ENOENT; | 825 | return -ENOENT; |
820 | 826 | ||
@@ -914,3 +920,4 @@ static void __exit inet_diag_exit(void) | |||
914 | module_init(inet_diag_init); | 920 | module_init(inet_diag_init); |
915 | module_exit(inet_diag_exit); | 921 | module_exit(inet_diag_exit); |
916 | MODULE_LICENSE("GPL"); | 922 | MODULE_LICENSE("GPL"); |
923 | MODULE_ALIAS_NET_PF_PROTO(PF_NETLINK, NETLINK_INET_DIAG); | ||
diff --git a/net/ipv4/tcp_diag.c b/net/ipv4/tcp_diag.c index 3904d2158a92..2fbcc7d1b1a0 100644 --- a/net/ipv4/tcp_diag.c +++ b/net/ipv4/tcp_diag.c | |||
@@ -56,3 +56,4 @@ static void __exit tcp_diag_exit(void) | |||
56 | module_init(tcp_diag_init); | 56 | module_init(tcp_diag_init); |
57 | module_exit(tcp_diag_exit); | 57 | module_exit(tcp_diag_exit); |
58 | MODULE_LICENSE("GPL"); | 58 | MODULE_LICENSE("GPL"); |
59 | MODULE_ALIAS_NET_PF_PROTO_TYPE(PF_NETLINK, NETLINK_INET_DIAG, TCPDIAG_GETSOCK); | ||
diff --git a/net/ipv6/ah6.c b/net/ipv6/ah6.c index 67cd06613a25..66a9139d46e9 100644 --- a/net/ipv6/ah6.c +++ b/net/ipv6/ah6.c | |||
@@ -483,6 +483,7 @@ static int ah6_init_state(struct xfrm_state *x) | |||
483 | break; | 483 | break; |
484 | case XFRM_MODE_TUNNEL: | 484 | case XFRM_MODE_TUNNEL: |
485 | x->props.header_len += sizeof(struct ipv6hdr); | 485 | x->props.header_len += sizeof(struct ipv6hdr); |
486 | break; | ||
486 | default: | 487 | default: |
487 | goto error; | 488 | goto error; |
488 | } | 489 | } |
diff --git a/net/ipv6/esp6.c b/net/ipv6/esp6.c index b0715432e454..72a659806cad 100644 --- a/net/ipv6/esp6.c +++ b/net/ipv6/esp6.c | |||
@@ -360,6 +360,7 @@ static int esp6_init_state(struct xfrm_state *x) | |||
360 | break; | 360 | break; |
361 | case XFRM_MODE_TUNNEL: | 361 | case XFRM_MODE_TUNNEL: |
362 | x->props.header_len += sizeof(struct ipv6hdr); | 362 | x->props.header_len += sizeof(struct ipv6hdr); |
363 | break; | ||
363 | default: | 364 | default: |
364 | goto error; | 365 | goto error; |
365 | } | 366 | } |
diff --git a/net/sched/sch_teql.c b/net/sched/sch_teql.c index be57cf317a7f..421281d9dd1d 100644 --- a/net/sched/sch_teql.c +++ b/net/sched/sch_teql.c | |||
@@ -266,7 +266,7 @@ static int teql_master_xmit(struct sk_buff *skb, struct net_device *dev) | |||
266 | int busy; | 266 | int busy; |
267 | int nores; | 267 | int nores; |
268 | int len = skb->len; | 268 | int len = skb->len; |
269 | int subq = skb->queue_mapping; | 269 | int subq = skb_get_queue_mapping(skb); |
270 | struct sk_buff *skb_res = NULL; | 270 | struct sk_buff *skb_res = NULL; |
271 | 271 | ||
272 | start = master->slaves; | 272 | start = master->slaves; |
@@ -284,7 +284,7 @@ restart: | |||
284 | if (slave->qdisc_sleeping != q) | 284 | if (slave->qdisc_sleeping != q) |
285 | continue; | 285 | continue; |
286 | if (netif_queue_stopped(slave) || | 286 | if (netif_queue_stopped(slave) || |
287 | netif_subqueue_stopped(slave, subq) || | 287 | __netif_subqueue_stopped(slave, subq) || |
288 | !netif_running(slave)) { | 288 | !netif_running(slave)) { |
289 | busy = 1; | 289 | busy = 1; |
290 | continue; | 290 | continue; |
@@ -294,7 +294,7 @@ restart: | |||
294 | case 0: | 294 | case 0: |
295 | if (netif_tx_trylock(slave)) { | 295 | if (netif_tx_trylock(slave)) { |
296 | if (!netif_queue_stopped(slave) && | 296 | if (!netif_queue_stopped(slave) && |
297 | !netif_subqueue_stopped(slave, subq) && | 297 | !__netif_subqueue_stopped(slave, subq) && |
298 | slave->hard_start_xmit(skb, slave) == 0) { | 298 | slave->hard_start_xmit(skb, slave) == 0) { |
299 | netif_tx_unlock(slave); | 299 | netif_tx_unlock(slave); |
300 | master->slaves = NEXT_SLAVE(q); | 300 | master->slaves = NEXT_SLAVE(q); |