diff options
Diffstat (limited to 'net/bluetooth/hci_core.c')
-rw-r--r-- | net/bluetooth/hci_core.c | 345 |
1 files changed, 306 insertions, 39 deletions
diff --git a/net/bluetooth/hci_core.c b/net/bluetooth/hci_core.c index 9c4541bc488a..b372fb8bcdcf 100644 --- a/net/bluetooth/hci_core.c +++ b/net/bluetooth/hci_core.c | |||
@@ -41,6 +41,7 @@ | |||
41 | #include <linux/interrupt.h> | 41 | #include <linux/interrupt.h> |
42 | #include <linux/notifier.h> | 42 | #include <linux/notifier.h> |
43 | #include <linux/rfkill.h> | 43 | #include <linux/rfkill.h> |
44 | #include <linux/timer.h> | ||
44 | #include <net/sock.h> | 45 | #include <net/sock.h> |
45 | 46 | ||
46 | #include <asm/system.h> | 47 | #include <asm/system.h> |
@@ -50,6 +51,8 @@ | |||
50 | #include <net/bluetooth/bluetooth.h> | 51 | #include <net/bluetooth/bluetooth.h> |
51 | #include <net/bluetooth/hci_core.h> | 52 | #include <net/bluetooth/hci_core.h> |
52 | 53 | ||
54 | #define AUTO_OFF_TIMEOUT 2000 | ||
55 | |||
53 | static void hci_cmd_task(unsigned long arg); | 56 | static void hci_cmd_task(unsigned long arg); |
54 | static void hci_rx_task(unsigned long arg); | 57 | static void hci_rx_task(unsigned long arg); |
55 | static void hci_tx_task(unsigned long arg); | 58 | static void hci_tx_task(unsigned long arg); |
@@ -95,11 +98,10 @@ void hci_req_complete(struct hci_dev *hdev, __u16 cmd, int result) | |||
95 | { | 98 | { |
96 | BT_DBG("%s command 0x%04x result 0x%2.2x", hdev->name, cmd, result); | 99 | BT_DBG("%s command 0x%04x result 0x%2.2x", hdev->name, cmd, result); |
97 | 100 | ||
98 | /* If the request has set req_last_cmd (typical for multi-HCI | 101 | /* If this is the init phase check if the completed command matches |
99 | * command requests) check if the completed command matches | 102 | * the last init command, and if not just return. |
100 | * this, and if not just return. Single HCI command requests | 103 | */ |
101 | * typically leave req_last_cmd as 0 */ | 104 | if (test_bit(HCI_INIT, &hdev->flags) && hdev->init_last_cmd != cmd) |
102 | if (hdev->req_last_cmd && cmd != hdev->req_last_cmd) | ||
103 | return; | 105 | return; |
104 | 106 | ||
105 | if (hdev->req_status == HCI_REQ_PEND) { | 107 | if (hdev->req_status == HCI_REQ_PEND) { |
@@ -122,7 +124,7 @@ static void hci_req_cancel(struct hci_dev *hdev, int err) | |||
122 | 124 | ||
123 | /* Execute request and wait for completion. */ | 125 | /* Execute request and wait for completion. */ |
124 | static int __hci_request(struct hci_dev *hdev, void (*req)(struct hci_dev *hdev, unsigned long opt), | 126 | static int __hci_request(struct hci_dev *hdev, void (*req)(struct hci_dev *hdev, unsigned long opt), |
125 | unsigned long opt, __u32 timeout) | 127 | unsigned long opt, __u32 timeout) |
126 | { | 128 | { |
127 | DECLARE_WAITQUEUE(wait, current); | 129 | DECLARE_WAITQUEUE(wait, current); |
128 | int err = 0; | 130 | int err = 0; |
@@ -156,7 +158,7 @@ static int __hci_request(struct hci_dev *hdev, void (*req)(struct hci_dev *hdev, | |||
156 | break; | 158 | break; |
157 | } | 159 | } |
158 | 160 | ||
159 | hdev->req_last_cmd = hdev->req_status = hdev->req_result = 0; | 161 | hdev->req_status = hdev->req_result = 0; |
160 | 162 | ||
161 | BT_DBG("%s end: err %d", hdev->name, err); | 163 | BT_DBG("%s end: err %d", hdev->name, err); |
162 | 164 | ||
@@ -164,7 +166,7 @@ static int __hci_request(struct hci_dev *hdev, void (*req)(struct hci_dev *hdev, | |||
164 | } | 166 | } |
165 | 167 | ||
166 | static inline int hci_request(struct hci_dev *hdev, void (*req)(struct hci_dev *hdev, unsigned long opt), | 168 | static inline int hci_request(struct hci_dev *hdev, void (*req)(struct hci_dev *hdev, unsigned long opt), |
167 | unsigned long opt, __u32 timeout) | 169 | unsigned long opt, __u32 timeout) |
168 | { | 170 | { |
169 | int ret; | 171 | int ret; |
170 | 172 | ||
@@ -189,6 +191,7 @@ static void hci_reset_req(struct hci_dev *hdev, unsigned long opt) | |||
189 | 191 | ||
190 | static void hci_init_req(struct hci_dev *hdev, unsigned long opt) | 192 | static void hci_init_req(struct hci_dev *hdev, unsigned long opt) |
191 | { | 193 | { |
194 | struct hci_cp_delete_stored_link_key cp; | ||
192 | struct sk_buff *skb; | 195 | struct sk_buff *skb; |
193 | __le16 param; | 196 | __le16 param; |
194 | __u8 flt_type; | 197 | __u8 flt_type; |
@@ -252,15 +255,21 @@ static void hci_init_req(struct hci_dev *hdev, unsigned long opt) | |||
252 | flt_type = HCI_FLT_CLEAR_ALL; | 255 | flt_type = HCI_FLT_CLEAR_ALL; |
253 | hci_send_cmd(hdev, HCI_OP_SET_EVENT_FLT, 1, &flt_type); | 256 | hci_send_cmd(hdev, HCI_OP_SET_EVENT_FLT, 1, &flt_type); |
254 | 257 | ||
255 | /* Page timeout ~20 secs */ | ||
256 | param = cpu_to_le16(0x8000); | ||
257 | hci_send_cmd(hdev, HCI_OP_WRITE_PG_TIMEOUT, 2, ¶m); | ||
258 | |||
259 | /* Connection accept timeout ~20 secs */ | 258 | /* Connection accept timeout ~20 secs */ |
260 | param = cpu_to_le16(0x7d00); | 259 | param = cpu_to_le16(0x7d00); |
261 | hci_send_cmd(hdev, HCI_OP_WRITE_CA_TIMEOUT, 2, ¶m); | 260 | hci_send_cmd(hdev, HCI_OP_WRITE_CA_TIMEOUT, 2, ¶m); |
262 | 261 | ||
263 | hdev->req_last_cmd = HCI_OP_WRITE_CA_TIMEOUT; | 262 | bacpy(&cp.bdaddr, BDADDR_ANY); |
263 | cp.delete_all = 1; | ||
264 | hci_send_cmd(hdev, HCI_OP_DELETE_STORED_LINK_KEY, sizeof(cp), &cp); | ||
265 | } | ||
266 | |||
267 | static void hci_le_init_req(struct hci_dev *hdev, unsigned long opt) | ||
268 | { | ||
269 | BT_DBG("%s", hdev->name); | ||
270 | |||
271 | /* Read LE buffer size */ | ||
272 | hci_send_cmd(hdev, HCI_OP_LE_READ_BUFFER_SIZE, 0, NULL); | ||
264 | } | 273 | } |
265 | 274 | ||
266 | static void hci_scan_req(struct hci_dev *hdev, unsigned long opt) | 275 | static void hci_scan_req(struct hci_dev *hdev, unsigned long opt) |
@@ -429,7 +438,8 @@ int hci_inquiry(void __user *arg) | |||
429 | if (copy_from_user(&ir, ptr, sizeof(ir))) | 438 | if (copy_from_user(&ir, ptr, sizeof(ir))) |
430 | return -EFAULT; | 439 | return -EFAULT; |
431 | 440 | ||
432 | if (!(hdev = hci_dev_get(ir.dev_id))) | 441 | hdev = hci_dev_get(ir.dev_id); |
442 | if (!hdev) | ||
433 | return -ENODEV; | 443 | return -ENODEV; |
434 | 444 | ||
435 | hci_dev_lock_bh(hdev); | 445 | hci_dev_lock_bh(hdev); |
@@ -455,7 +465,7 @@ int hci_inquiry(void __user *arg) | |||
455 | /* cache_dump can't sleep. Therefore we allocate temp buffer and then | 465 | /* cache_dump can't sleep. Therefore we allocate temp buffer and then |
456 | * copy it to the user space. | 466 | * copy it to the user space. |
457 | */ | 467 | */ |
458 | buf = kmalloc(sizeof(struct inquiry_info) *max_rsp, GFP_KERNEL); | 468 | buf = kmalloc(sizeof(struct inquiry_info) * max_rsp, GFP_KERNEL); |
459 | if (!buf) { | 469 | if (!buf) { |
460 | err = -ENOMEM; | 470 | err = -ENOMEM; |
461 | goto done; | 471 | goto done; |
@@ -489,7 +499,8 @@ int hci_dev_open(__u16 dev) | |||
489 | struct hci_dev *hdev; | 499 | struct hci_dev *hdev; |
490 | int ret = 0; | 500 | int ret = 0; |
491 | 501 | ||
492 | if (!(hdev = hci_dev_get(dev))) | 502 | hdev = hci_dev_get(dev); |
503 | if (!hdev) | ||
493 | return -ENODEV; | 504 | return -ENODEV; |
494 | 505 | ||
495 | BT_DBG("%s %p", hdev->name, hdev); | 506 | BT_DBG("%s %p", hdev->name, hdev); |
@@ -521,11 +532,15 @@ int hci_dev_open(__u16 dev) | |||
521 | if (!test_bit(HCI_RAW, &hdev->flags)) { | 532 | if (!test_bit(HCI_RAW, &hdev->flags)) { |
522 | atomic_set(&hdev->cmd_cnt, 1); | 533 | atomic_set(&hdev->cmd_cnt, 1); |
523 | set_bit(HCI_INIT, &hdev->flags); | 534 | set_bit(HCI_INIT, &hdev->flags); |
535 | hdev->init_last_cmd = 0; | ||
524 | 536 | ||
525 | //__hci_request(hdev, hci_reset_req, 0, HZ); | ||
526 | ret = __hci_request(hdev, hci_init_req, 0, | 537 | ret = __hci_request(hdev, hci_init_req, 0, |
527 | msecs_to_jiffies(HCI_INIT_TIMEOUT)); | 538 | msecs_to_jiffies(HCI_INIT_TIMEOUT)); |
528 | 539 | ||
540 | if (lmp_le_capable(hdev)) | ||
541 | ret = __hci_request(hdev, hci_le_init_req, 0, | ||
542 | msecs_to_jiffies(HCI_INIT_TIMEOUT)); | ||
543 | |||
529 | clear_bit(HCI_INIT, &hdev->flags); | 544 | clear_bit(HCI_INIT, &hdev->flags); |
530 | } | 545 | } |
531 | 546 | ||
@@ -533,6 +548,8 @@ int hci_dev_open(__u16 dev) | |||
533 | hci_dev_hold(hdev); | 548 | hci_dev_hold(hdev); |
534 | set_bit(HCI_UP, &hdev->flags); | 549 | set_bit(HCI_UP, &hdev->flags); |
535 | hci_notify(hdev, HCI_DEV_UP); | 550 | hci_notify(hdev, HCI_DEV_UP); |
551 | if (!test_bit(HCI_SETUP, &hdev->flags)) | ||
552 | mgmt_powered(hdev->id, 1); | ||
536 | } else { | 553 | } else { |
537 | /* Init failed, cleanup */ | 554 | /* Init failed, cleanup */ |
538 | tasklet_kill(&hdev->rx_task); | 555 | tasklet_kill(&hdev->rx_task); |
@@ -606,6 +623,7 @@ static int hci_dev_do_close(struct hci_dev *hdev) | |||
606 | 623 | ||
607 | /* Drop last sent command */ | 624 | /* Drop last sent command */ |
608 | if (hdev->sent_cmd) { | 625 | if (hdev->sent_cmd) { |
626 | del_timer_sync(&hdev->cmd_timer); | ||
609 | kfree_skb(hdev->sent_cmd); | 627 | kfree_skb(hdev->sent_cmd); |
610 | hdev->sent_cmd = NULL; | 628 | hdev->sent_cmd = NULL; |
611 | } | 629 | } |
@@ -614,6 +632,8 @@ static int hci_dev_do_close(struct hci_dev *hdev) | |||
614 | * and no tasks are scheduled. */ | 632 | * and no tasks are scheduled. */ |
615 | hdev->close(hdev); | 633 | hdev->close(hdev); |
616 | 634 | ||
635 | mgmt_powered(hdev->id, 0); | ||
636 | |||
617 | /* Clear flags */ | 637 | /* Clear flags */ |
618 | hdev->flags = 0; | 638 | hdev->flags = 0; |
619 | 639 | ||
@@ -664,7 +684,7 @@ int hci_dev_reset(__u16 dev) | |||
664 | hdev->flush(hdev); | 684 | hdev->flush(hdev); |
665 | 685 | ||
666 | atomic_set(&hdev->cmd_cnt, 1); | 686 | atomic_set(&hdev->cmd_cnt, 1); |
667 | hdev->acl_cnt = 0; hdev->sco_cnt = 0; | 687 | hdev->acl_cnt = 0; hdev->sco_cnt = 0; hdev->le_cnt = 0; |
668 | 688 | ||
669 | if (!test_bit(HCI_RAW, &hdev->flags)) | 689 | if (!test_bit(HCI_RAW, &hdev->flags)) |
670 | ret = __hci_request(hdev, hci_reset_req, 0, | 690 | ret = __hci_request(hdev, hci_reset_req, 0, |
@@ -793,9 +813,17 @@ int hci_get_dev_list(void __user *arg) | |||
793 | read_lock_bh(&hci_dev_list_lock); | 813 | read_lock_bh(&hci_dev_list_lock); |
794 | list_for_each(p, &hci_dev_list) { | 814 | list_for_each(p, &hci_dev_list) { |
795 | struct hci_dev *hdev; | 815 | struct hci_dev *hdev; |
816 | |||
796 | hdev = list_entry(p, struct hci_dev, list); | 817 | hdev = list_entry(p, struct hci_dev, list); |
818 | |||
819 | hci_del_off_timer(hdev); | ||
820 | |||
821 | if (!test_bit(HCI_MGMT, &hdev->flags)) | ||
822 | set_bit(HCI_PAIRABLE, &hdev->flags); | ||
823 | |||
797 | (dr + n)->dev_id = hdev->id; | 824 | (dr + n)->dev_id = hdev->id; |
798 | (dr + n)->dev_opt = hdev->flags; | 825 | (dr + n)->dev_opt = hdev->flags; |
826 | |||
799 | if (++n >= dev_num) | 827 | if (++n >= dev_num) |
800 | break; | 828 | break; |
801 | } | 829 | } |
@@ -823,6 +851,11 @@ int hci_get_dev_info(void __user *arg) | |||
823 | if (!hdev) | 851 | if (!hdev) |
824 | return -ENODEV; | 852 | return -ENODEV; |
825 | 853 | ||
854 | hci_del_off_timer(hdev); | ||
855 | |||
856 | if (!test_bit(HCI_MGMT, &hdev->flags)) | ||
857 | set_bit(HCI_PAIRABLE, &hdev->flags); | ||
858 | |||
826 | strcpy(di.name, hdev->name); | 859 | strcpy(di.name, hdev->name); |
827 | di.bdaddr = hdev->bdaddr; | 860 | di.bdaddr = hdev->bdaddr; |
828 | di.type = (hdev->bus & 0x0f) | (hdev->dev_type << 4); | 861 | di.type = (hdev->bus & 0x0f) | (hdev->dev_type << 4); |
@@ -891,6 +924,159 @@ void hci_free_dev(struct hci_dev *hdev) | |||
891 | } | 924 | } |
892 | EXPORT_SYMBOL(hci_free_dev); | 925 | EXPORT_SYMBOL(hci_free_dev); |
893 | 926 | ||
927 | static void hci_power_on(struct work_struct *work) | ||
928 | { | ||
929 | struct hci_dev *hdev = container_of(work, struct hci_dev, power_on); | ||
930 | |||
931 | BT_DBG("%s", hdev->name); | ||
932 | |||
933 | if (hci_dev_open(hdev->id) < 0) | ||
934 | return; | ||
935 | |||
936 | if (test_bit(HCI_AUTO_OFF, &hdev->flags)) | ||
937 | mod_timer(&hdev->off_timer, | ||
938 | jiffies + msecs_to_jiffies(AUTO_OFF_TIMEOUT)); | ||
939 | |||
940 | if (test_and_clear_bit(HCI_SETUP, &hdev->flags)) | ||
941 | mgmt_index_added(hdev->id); | ||
942 | } | ||
943 | |||
944 | static void hci_power_off(struct work_struct *work) | ||
945 | { | ||
946 | struct hci_dev *hdev = container_of(work, struct hci_dev, power_off); | ||
947 | |||
948 | BT_DBG("%s", hdev->name); | ||
949 | |||
950 | hci_dev_close(hdev->id); | ||
951 | } | ||
952 | |||
953 | static void hci_auto_off(unsigned long data) | ||
954 | { | ||
955 | struct hci_dev *hdev = (struct hci_dev *) data; | ||
956 | |||
957 | BT_DBG("%s", hdev->name); | ||
958 | |||
959 | clear_bit(HCI_AUTO_OFF, &hdev->flags); | ||
960 | |||
961 | queue_work(hdev->workqueue, &hdev->power_off); | ||
962 | } | ||
963 | |||
964 | void hci_del_off_timer(struct hci_dev *hdev) | ||
965 | { | ||
966 | BT_DBG("%s", hdev->name); | ||
967 | |||
968 | clear_bit(HCI_AUTO_OFF, &hdev->flags); | ||
969 | del_timer(&hdev->off_timer); | ||
970 | } | ||
971 | |||
972 | int hci_uuids_clear(struct hci_dev *hdev) | ||
973 | { | ||
974 | struct list_head *p, *n; | ||
975 | |||
976 | list_for_each_safe(p, n, &hdev->uuids) { | ||
977 | struct bt_uuid *uuid; | ||
978 | |||
979 | uuid = list_entry(p, struct bt_uuid, list); | ||
980 | |||
981 | list_del(p); | ||
982 | kfree(uuid); | ||
983 | } | ||
984 | |||
985 | return 0; | ||
986 | } | ||
987 | |||
988 | int hci_link_keys_clear(struct hci_dev *hdev) | ||
989 | { | ||
990 | struct list_head *p, *n; | ||
991 | |||
992 | list_for_each_safe(p, n, &hdev->link_keys) { | ||
993 | struct link_key *key; | ||
994 | |||
995 | key = list_entry(p, struct link_key, list); | ||
996 | |||
997 | list_del(p); | ||
998 | kfree(key); | ||
999 | } | ||
1000 | |||
1001 | return 0; | ||
1002 | } | ||
1003 | |||
1004 | struct link_key *hci_find_link_key(struct hci_dev *hdev, bdaddr_t *bdaddr) | ||
1005 | { | ||
1006 | struct list_head *p; | ||
1007 | |||
1008 | list_for_each(p, &hdev->link_keys) { | ||
1009 | struct link_key *k; | ||
1010 | |||
1011 | k = list_entry(p, struct link_key, list); | ||
1012 | |||
1013 | if (bacmp(bdaddr, &k->bdaddr) == 0) | ||
1014 | return k; | ||
1015 | } | ||
1016 | |||
1017 | return NULL; | ||
1018 | } | ||
1019 | |||
1020 | int hci_add_link_key(struct hci_dev *hdev, int new_key, bdaddr_t *bdaddr, | ||
1021 | u8 *val, u8 type, u8 pin_len) | ||
1022 | { | ||
1023 | struct link_key *key, *old_key; | ||
1024 | u8 old_key_type; | ||
1025 | |||
1026 | old_key = hci_find_link_key(hdev, bdaddr); | ||
1027 | if (old_key) { | ||
1028 | old_key_type = old_key->type; | ||
1029 | key = old_key; | ||
1030 | } else { | ||
1031 | old_key_type = 0xff; | ||
1032 | key = kzalloc(sizeof(*key), GFP_ATOMIC); | ||
1033 | if (!key) | ||
1034 | return -ENOMEM; | ||
1035 | list_add(&key->list, &hdev->link_keys); | ||
1036 | } | ||
1037 | |||
1038 | BT_DBG("%s key for %s type %u", hdev->name, batostr(bdaddr), type); | ||
1039 | |||
1040 | bacpy(&key->bdaddr, bdaddr); | ||
1041 | memcpy(key->val, val, 16); | ||
1042 | key->type = type; | ||
1043 | key->pin_len = pin_len; | ||
1044 | |||
1045 | if (new_key) | ||
1046 | mgmt_new_key(hdev->id, key, old_key_type); | ||
1047 | |||
1048 | if (type == 0x06) | ||
1049 | key->type = old_key_type; | ||
1050 | |||
1051 | return 0; | ||
1052 | } | ||
1053 | |||
1054 | int hci_remove_link_key(struct hci_dev *hdev, bdaddr_t *bdaddr) | ||
1055 | { | ||
1056 | struct link_key *key; | ||
1057 | |||
1058 | key = hci_find_link_key(hdev, bdaddr); | ||
1059 | if (!key) | ||
1060 | return -ENOENT; | ||
1061 | |||
1062 | BT_DBG("%s removing %s", hdev->name, batostr(bdaddr)); | ||
1063 | |||
1064 | list_del(&key->list); | ||
1065 | kfree(key); | ||
1066 | |||
1067 | return 0; | ||
1068 | } | ||
1069 | |||
1070 | /* HCI command timer function */ | ||
1071 | static void hci_cmd_timer(unsigned long arg) | ||
1072 | { | ||
1073 | struct hci_dev *hdev = (void *) arg; | ||
1074 | |||
1075 | BT_ERR("%s command tx timeout", hdev->name); | ||
1076 | atomic_set(&hdev->cmd_cnt, 1); | ||
1077 | tasklet_schedule(&hdev->cmd_task); | ||
1078 | } | ||
1079 | |||
894 | /* Register HCI device */ | 1080 | /* Register HCI device */ |
895 | int hci_register_dev(struct hci_dev *hdev) | 1081 | int hci_register_dev(struct hci_dev *hdev) |
896 | { | 1082 | { |
@@ -923,6 +1109,7 @@ int hci_register_dev(struct hci_dev *hdev) | |||
923 | hdev->pkt_type = (HCI_DM1 | HCI_DH1 | HCI_HV1); | 1109 | hdev->pkt_type = (HCI_DM1 | HCI_DH1 | HCI_HV1); |
924 | hdev->esco_type = (ESCO_HV1); | 1110 | hdev->esco_type = (ESCO_HV1); |
925 | hdev->link_mode = (HCI_LM_ACCEPT); | 1111 | hdev->link_mode = (HCI_LM_ACCEPT); |
1112 | hdev->io_capability = 0x03; /* No Input No Output */ | ||
926 | 1113 | ||
927 | hdev->idle_timeout = 0; | 1114 | hdev->idle_timeout = 0; |
928 | hdev->sniff_max_interval = 800; | 1115 | hdev->sniff_max_interval = 800; |
@@ -936,6 +1123,8 @@ int hci_register_dev(struct hci_dev *hdev) | |||
936 | skb_queue_head_init(&hdev->cmd_q); | 1123 | skb_queue_head_init(&hdev->cmd_q); |
937 | skb_queue_head_init(&hdev->raw_q); | 1124 | skb_queue_head_init(&hdev->raw_q); |
938 | 1125 | ||
1126 | setup_timer(&hdev->cmd_timer, hci_cmd_timer, (unsigned long) hdev); | ||
1127 | |||
939 | for (i = 0; i < NUM_REASSEMBLY; i++) | 1128 | for (i = 0; i < NUM_REASSEMBLY; i++) |
940 | hdev->reassembly[i] = NULL; | 1129 | hdev->reassembly[i] = NULL; |
941 | 1130 | ||
@@ -948,6 +1137,14 @@ int hci_register_dev(struct hci_dev *hdev) | |||
948 | 1137 | ||
949 | INIT_LIST_HEAD(&hdev->blacklist); | 1138 | INIT_LIST_HEAD(&hdev->blacklist); |
950 | 1139 | ||
1140 | INIT_LIST_HEAD(&hdev->uuids); | ||
1141 | |||
1142 | INIT_LIST_HEAD(&hdev->link_keys); | ||
1143 | |||
1144 | INIT_WORK(&hdev->power_on, hci_power_on); | ||
1145 | INIT_WORK(&hdev->power_off, hci_power_off); | ||
1146 | setup_timer(&hdev->off_timer, hci_auto_off, (unsigned long) hdev); | ||
1147 | |||
951 | memset(&hdev->stat, 0, sizeof(struct hci_dev_stats)); | 1148 | memset(&hdev->stat, 0, sizeof(struct hci_dev_stats)); |
952 | 1149 | ||
953 | atomic_set(&hdev->promisc, 0); | 1150 | atomic_set(&hdev->promisc, 0); |
@@ -969,7 +1166,10 @@ int hci_register_dev(struct hci_dev *hdev) | |||
969 | } | 1166 | } |
970 | } | 1167 | } |
971 | 1168 | ||
972 | mgmt_index_added(hdev->id); | 1169 | set_bit(HCI_AUTO_OFF, &hdev->flags); |
1170 | set_bit(HCI_SETUP, &hdev->flags); | ||
1171 | queue_work(hdev->workqueue, &hdev->power_on); | ||
1172 | |||
973 | hci_notify(hdev, HCI_DEV_REG); | 1173 | hci_notify(hdev, HCI_DEV_REG); |
974 | 1174 | ||
975 | return id; | 1175 | return id; |
@@ -999,7 +1199,10 @@ int hci_unregister_dev(struct hci_dev *hdev) | |||
999 | for (i = 0; i < NUM_REASSEMBLY; i++) | 1199 | for (i = 0; i < NUM_REASSEMBLY; i++) |
1000 | kfree_skb(hdev->reassembly[i]); | 1200 | kfree_skb(hdev->reassembly[i]); |
1001 | 1201 | ||
1002 | mgmt_index_removed(hdev->id); | 1202 | if (!test_bit(HCI_INIT, &hdev->flags) && |
1203 | !test_bit(HCI_SETUP, &hdev->flags)) | ||
1204 | mgmt_index_removed(hdev->id); | ||
1205 | |||
1003 | hci_notify(hdev, HCI_DEV_UNREG); | 1206 | hci_notify(hdev, HCI_DEV_UNREG); |
1004 | 1207 | ||
1005 | if (hdev->rfkill) { | 1208 | if (hdev->rfkill) { |
@@ -1009,10 +1212,14 @@ int hci_unregister_dev(struct hci_dev *hdev) | |||
1009 | 1212 | ||
1010 | hci_unregister_sysfs(hdev); | 1213 | hci_unregister_sysfs(hdev); |
1011 | 1214 | ||
1215 | hci_del_off_timer(hdev); | ||
1216 | |||
1012 | destroy_workqueue(hdev->workqueue); | 1217 | destroy_workqueue(hdev->workqueue); |
1013 | 1218 | ||
1014 | hci_dev_lock_bh(hdev); | 1219 | hci_dev_lock_bh(hdev); |
1015 | hci_blacklist_clear(hdev); | 1220 | hci_blacklist_clear(hdev); |
1221 | hci_uuids_clear(hdev); | ||
1222 | hci_link_keys_clear(hdev); | ||
1016 | hci_dev_unlock_bh(hdev); | 1223 | hci_dev_unlock_bh(hdev); |
1017 | 1224 | ||
1018 | __hci_dev_put(hdev); | 1225 | __hci_dev_put(hdev); |
@@ -1313,7 +1520,7 @@ static int hci_send_frame(struct sk_buff *skb) | |||
1313 | /* Time stamp */ | 1520 | /* Time stamp */ |
1314 | __net_timestamp(skb); | 1521 | __net_timestamp(skb); |
1315 | 1522 | ||
1316 | hci_send_to_sock(hdev, skb); | 1523 | hci_send_to_sock(hdev, skb, NULL); |
1317 | } | 1524 | } |
1318 | 1525 | ||
1319 | /* Get rid of skb owner, prior to sending to the driver. */ | 1526 | /* Get rid of skb owner, prior to sending to the driver. */ |
@@ -1349,6 +1556,9 @@ int hci_send_cmd(struct hci_dev *hdev, __u16 opcode, __u32 plen, void *param) | |||
1349 | bt_cb(skb)->pkt_type = HCI_COMMAND_PKT; | 1556 | bt_cb(skb)->pkt_type = HCI_COMMAND_PKT; |
1350 | skb->dev = (void *) hdev; | 1557 | skb->dev = (void *) hdev; |
1351 | 1558 | ||
1559 | if (test_bit(HCI_INIT, &hdev->flags)) | ||
1560 | hdev->init_last_cmd = opcode; | ||
1561 | |||
1352 | skb_queue_tail(&hdev->cmd_q, skb); | 1562 | skb_queue_tail(&hdev->cmd_q, skb); |
1353 | tasklet_schedule(&hdev->cmd_task); | 1563 | tasklet_schedule(&hdev->cmd_task); |
1354 | 1564 | ||
@@ -1395,7 +1605,7 @@ void hci_send_acl(struct hci_conn *conn, struct sk_buff *skb, __u16 flags) | |||
1395 | 1605 | ||
1396 | skb->dev = (void *) hdev; | 1606 | skb->dev = (void *) hdev; |
1397 | bt_cb(skb)->pkt_type = HCI_ACLDATA_PKT; | 1607 | bt_cb(skb)->pkt_type = HCI_ACLDATA_PKT; |
1398 | hci_add_acl_hdr(skb, conn->handle, flags | ACL_START); | 1608 | hci_add_acl_hdr(skb, conn->handle, flags); |
1399 | 1609 | ||
1400 | list = skb_shinfo(skb)->frag_list; | 1610 | list = skb_shinfo(skb)->frag_list; |
1401 | if (!list) { | 1611 | if (!list) { |
@@ -1413,12 +1623,15 @@ void hci_send_acl(struct hci_conn *conn, struct sk_buff *skb, __u16 flags) | |||
1413 | spin_lock_bh(&conn->data_q.lock); | 1623 | spin_lock_bh(&conn->data_q.lock); |
1414 | 1624 | ||
1415 | __skb_queue_tail(&conn->data_q, skb); | 1625 | __skb_queue_tail(&conn->data_q, skb); |
1626 | |||
1627 | flags &= ~ACL_START; | ||
1628 | flags |= ACL_CONT; | ||
1416 | do { | 1629 | do { |
1417 | skb = list; list = list->next; | 1630 | skb = list; list = list->next; |
1418 | 1631 | ||
1419 | skb->dev = (void *) hdev; | 1632 | skb->dev = (void *) hdev; |
1420 | bt_cb(skb)->pkt_type = HCI_ACLDATA_PKT; | 1633 | bt_cb(skb)->pkt_type = HCI_ACLDATA_PKT; |
1421 | hci_add_acl_hdr(skb, conn->handle, flags | ACL_CONT); | 1634 | hci_add_acl_hdr(skb, conn->handle, flags); |
1422 | 1635 | ||
1423 | BT_DBG("%s frag %p len %d", hdev->name, skb, skb->len); | 1636 | BT_DBG("%s frag %p len %d", hdev->name, skb, skb->len); |
1424 | 1637 | ||
@@ -1486,8 +1699,25 @@ static inline struct hci_conn *hci_low_sent(struct hci_dev *hdev, __u8 type, int | |||
1486 | } | 1699 | } |
1487 | 1700 | ||
1488 | if (conn) { | 1701 | if (conn) { |
1489 | int cnt = (type == ACL_LINK ? hdev->acl_cnt : hdev->sco_cnt); | 1702 | int cnt, q; |
1490 | int q = cnt / num; | 1703 | |
1704 | switch (conn->type) { | ||
1705 | case ACL_LINK: | ||
1706 | cnt = hdev->acl_cnt; | ||
1707 | break; | ||
1708 | case SCO_LINK: | ||
1709 | case ESCO_LINK: | ||
1710 | cnt = hdev->sco_cnt; | ||
1711 | break; | ||
1712 | case LE_LINK: | ||
1713 | cnt = hdev->le_mtu ? hdev->le_cnt : hdev->acl_cnt; | ||
1714 | break; | ||
1715 | default: | ||
1716 | cnt = 0; | ||
1717 | BT_ERR("Unknown link type"); | ||
1718 | } | ||
1719 | |||
1720 | q = cnt / num; | ||
1491 | *quote = q ? q : 1; | 1721 | *quote = q ? q : 1; |
1492 | } else | 1722 | } else |
1493 | *quote = 0; | 1723 | *quote = 0; |
@@ -1496,19 +1726,19 @@ static inline struct hci_conn *hci_low_sent(struct hci_dev *hdev, __u8 type, int | |||
1496 | return conn; | 1726 | return conn; |
1497 | } | 1727 | } |
1498 | 1728 | ||
1499 | static inline void hci_acl_tx_to(struct hci_dev *hdev) | 1729 | static inline void hci_link_tx_to(struct hci_dev *hdev, __u8 type) |
1500 | { | 1730 | { |
1501 | struct hci_conn_hash *h = &hdev->conn_hash; | 1731 | struct hci_conn_hash *h = &hdev->conn_hash; |
1502 | struct list_head *p; | 1732 | struct list_head *p; |
1503 | struct hci_conn *c; | 1733 | struct hci_conn *c; |
1504 | 1734 | ||
1505 | BT_ERR("%s ACL tx timeout", hdev->name); | 1735 | BT_ERR("%s link tx timeout", hdev->name); |
1506 | 1736 | ||
1507 | /* Kill stalled connections */ | 1737 | /* Kill stalled connections */ |
1508 | list_for_each(p, &h->list) { | 1738 | list_for_each(p, &h->list) { |
1509 | c = list_entry(p, struct hci_conn, list); | 1739 | c = list_entry(p, struct hci_conn, list); |
1510 | if (c->type == ACL_LINK && c->sent) { | 1740 | if (c->type == type && c->sent) { |
1511 | BT_ERR("%s killing stalled ACL connection %s", | 1741 | BT_ERR("%s killing stalled connection %s", |
1512 | hdev->name, batostr(&c->dst)); | 1742 | hdev->name, batostr(&c->dst)); |
1513 | hci_acl_disconn(c, 0x13); | 1743 | hci_acl_disconn(c, 0x13); |
1514 | } | 1744 | } |
@@ -1527,7 +1757,7 @@ static inline void hci_sched_acl(struct hci_dev *hdev) | |||
1527 | /* ACL tx timeout must be longer than maximum | 1757 | /* ACL tx timeout must be longer than maximum |
1528 | * link supervision timeout (40.9 seconds) */ | 1758 | * link supervision timeout (40.9 seconds) */ |
1529 | if (!hdev->acl_cnt && time_after(jiffies, hdev->acl_last_tx + HZ * 45)) | 1759 | if (!hdev->acl_cnt && time_after(jiffies, hdev->acl_last_tx + HZ * 45)) |
1530 | hci_acl_tx_to(hdev); | 1760 | hci_link_tx_to(hdev, ACL_LINK); |
1531 | } | 1761 | } |
1532 | 1762 | ||
1533 | while (hdev->acl_cnt && (conn = hci_low_sent(hdev, ACL_LINK, "e))) { | 1763 | while (hdev->acl_cnt && (conn = hci_low_sent(hdev, ACL_LINK, "e))) { |
@@ -1586,6 +1816,40 @@ static inline void hci_sched_esco(struct hci_dev *hdev) | |||
1586 | } | 1816 | } |
1587 | } | 1817 | } |
1588 | 1818 | ||
1819 | static inline void hci_sched_le(struct hci_dev *hdev) | ||
1820 | { | ||
1821 | struct hci_conn *conn; | ||
1822 | struct sk_buff *skb; | ||
1823 | int quote, cnt; | ||
1824 | |||
1825 | BT_DBG("%s", hdev->name); | ||
1826 | |||
1827 | if (!test_bit(HCI_RAW, &hdev->flags)) { | ||
1828 | /* LE tx timeout must be longer than maximum | ||
1829 | * link supervision timeout (40.9 seconds) */ | ||
1830 | if (!hdev->le_cnt && hdev->le_pkts && | ||
1831 | time_after(jiffies, hdev->le_last_tx + HZ * 45)) | ||
1832 | hci_link_tx_to(hdev, LE_LINK); | ||
1833 | } | ||
1834 | |||
1835 | cnt = hdev->le_pkts ? hdev->le_cnt : hdev->acl_cnt; | ||
1836 | while (cnt && (conn = hci_low_sent(hdev, LE_LINK, "e))) { | ||
1837 | while (quote-- && (skb = skb_dequeue(&conn->data_q))) { | ||
1838 | BT_DBG("skb %p len %d", skb, skb->len); | ||
1839 | |||
1840 | hci_send_frame(skb); | ||
1841 | hdev->le_last_tx = jiffies; | ||
1842 | |||
1843 | cnt--; | ||
1844 | conn->sent++; | ||
1845 | } | ||
1846 | } | ||
1847 | if (hdev->le_pkts) | ||
1848 | hdev->le_cnt = cnt; | ||
1849 | else | ||
1850 | hdev->acl_cnt = cnt; | ||
1851 | } | ||
1852 | |||
1589 | static void hci_tx_task(unsigned long arg) | 1853 | static void hci_tx_task(unsigned long arg) |
1590 | { | 1854 | { |
1591 | struct hci_dev *hdev = (struct hci_dev *) arg; | 1855 | struct hci_dev *hdev = (struct hci_dev *) arg; |
@@ -1593,7 +1857,8 @@ static void hci_tx_task(unsigned long arg) | |||
1593 | 1857 | ||
1594 | read_lock(&hci_task_lock); | 1858 | read_lock(&hci_task_lock); |
1595 | 1859 | ||
1596 | BT_DBG("%s acl %d sco %d", hdev->name, hdev->acl_cnt, hdev->sco_cnt); | 1860 | BT_DBG("%s acl %d sco %d le %d", hdev->name, hdev->acl_cnt, |
1861 | hdev->sco_cnt, hdev->le_cnt); | ||
1597 | 1862 | ||
1598 | /* Schedule queues and send stuff to HCI driver */ | 1863 | /* Schedule queues and send stuff to HCI driver */ |
1599 | 1864 | ||
@@ -1603,6 +1868,8 @@ static void hci_tx_task(unsigned long arg) | |||
1603 | 1868 | ||
1604 | hci_sched_esco(hdev); | 1869 | hci_sched_esco(hdev); |
1605 | 1870 | ||
1871 | hci_sched_le(hdev); | ||
1872 | |||
1606 | /* Send next queued raw (unknown type) packet */ | 1873 | /* Send next queued raw (unknown type) packet */ |
1607 | while ((skb = skb_dequeue(&hdev->raw_q))) | 1874 | while ((skb = skb_dequeue(&hdev->raw_q))) |
1608 | hci_send_frame(skb); | 1875 | hci_send_frame(skb); |
@@ -1700,7 +1967,7 @@ static void hci_rx_task(unsigned long arg) | |||
1700 | while ((skb = skb_dequeue(&hdev->rx_q))) { | 1967 | while ((skb = skb_dequeue(&hdev->rx_q))) { |
1701 | if (atomic_read(&hdev->promisc)) { | 1968 | if (atomic_read(&hdev->promisc)) { |
1702 | /* Send copy to the sockets */ | 1969 | /* Send copy to the sockets */ |
1703 | hci_send_to_sock(hdev, skb); | 1970 | hci_send_to_sock(hdev, skb, NULL); |
1704 | } | 1971 | } |
1705 | 1972 | ||
1706 | if (test_bit(HCI_RAW, &hdev->flags)) { | 1973 | if (test_bit(HCI_RAW, &hdev->flags)) { |
@@ -1750,20 +2017,20 @@ static void hci_cmd_task(unsigned long arg) | |||
1750 | 2017 | ||
1751 | BT_DBG("%s cmd %d", hdev->name, atomic_read(&hdev->cmd_cnt)); | 2018 | BT_DBG("%s cmd %d", hdev->name, atomic_read(&hdev->cmd_cnt)); |
1752 | 2019 | ||
1753 | if (!atomic_read(&hdev->cmd_cnt) && time_after(jiffies, hdev->cmd_last_tx + HZ)) { | ||
1754 | BT_ERR("%s command tx timeout", hdev->name); | ||
1755 | atomic_set(&hdev->cmd_cnt, 1); | ||
1756 | } | ||
1757 | |||
1758 | /* Send queued commands */ | 2020 | /* Send queued commands */ |
1759 | if (atomic_read(&hdev->cmd_cnt) && (skb = skb_dequeue(&hdev->cmd_q))) { | 2021 | if (atomic_read(&hdev->cmd_cnt)) { |
2022 | skb = skb_dequeue(&hdev->cmd_q); | ||
2023 | if (!skb) | ||
2024 | return; | ||
2025 | |||
1760 | kfree_skb(hdev->sent_cmd); | 2026 | kfree_skb(hdev->sent_cmd); |
1761 | 2027 | ||
1762 | hdev->sent_cmd = skb_clone(skb, GFP_ATOMIC); | 2028 | hdev->sent_cmd = skb_clone(skb, GFP_ATOMIC); |
1763 | if (hdev->sent_cmd) { | 2029 | if (hdev->sent_cmd) { |
1764 | atomic_dec(&hdev->cmd_cnt); | 2030 | atomic_dec(&hdev->cmd_cnt); |
1765 | hci_send_frame(skb); | 2031 | hci_send_frame(skb); |
1766 | hdev->cmd_last_tx = jiffies; | 2032 | mod_timer(&hdev->cmd_timer, |
2033 | jiffies + msecs_to_jiffies(HCI_CMD_TIMEOUT)); | ||
1767 | } else { | 2034 | } else { |
1768 | skb_queue_head(&hdev->cmd_q, skb); | 2035 | skb_queue_head(&hdev->cmd_q, skb); |
1769 | tasklet_schedule(&hdev->cmd_task); | 2036 | tasklet_schedule(&hdev->cmd_task); |