diff options
Diffstat (limited to 'net/bluetooth/hci_core.c')
-rw-r--r-- | net/bluetooth/hci_core.c | 245 |
1 files changed, 165 insertions, 80 deletions
diff --git a/net/bluetooth/hci_core.c b/net/bluetooth/hci_core.c index 8de421d28cb5..6a2d0387475c 100644 --- a/net/bluetooth/hci_core.c +++ b/net/bluetooth/hci_core.c | |||
@@ -178,48 +178,13 @@ static void hci_reset_req(struct hci_dev *hdev, unsigned long opt) | |||
178 | 178 | ||
179 | static void bredr_init(struct hci_dev *hdev) | 179 | static void bredr_init(struct hci_dev *hdev) |
180 | { | 180 | { |
181 | struct hci_cp_delete_stored_link_key cp; | ||
182 | __le16 param; | ||
183 | __u8 flt_type; | ||
184 | |||
185 | hdev->flow_ctl_mode = HCI_FLOW_CTL_MODE_PACKET_BASED; | 181 | hdev->flow_ctl_mode = HCI_FLOW_CTL_MODE_PACKET_BASED; |
186 | 182 | ||
187 | /* Mandatory initialization */ | ||
188 | |||
189 | /* Read Local Supported Features */ | 183 | /* Read Local Supported Features */ |
190 | hci_send_cmd(hdev, HCI_OP_READ_LOCAL_FEATURES, 0, NULL); | 184 | hci_send_cmd(hdev, HCI_OP_READ_LOCAL_FEATURES, 0, NULL); |
191 | 185 | ||
192 | /* Read Local Version */ | 186 | /* Read Local Version */ |
193 | hci_send_cmd(hdev, HCI_OP_READ_LOCAL_VERSION, 0, NULL); | 187 | hci_send_cmd(hdev, HCI_OP_READ_LOCAL_VERSION, 0, NULL); |
194 | |||
195 | /* Read Buffer Size (ACL mtu, max pkt, etc.) */ | ||
196 | hci_send_cmd(hdev, HCI_OP_READ_BUFFER_SIZE, 0, NULL); | ||
197 | |||
198 | /* Read BD Address */ | ||
199 | hci_send_cmd(hdev, HCI_OP_READ_BD_ADDR, 0, NULL); | ||
200 | |||
201 | /* Read Class of Device */ | ||
202 | hci_send_cmd(hdev, HCI_OP_READ_CLASS_OF_DEV, 0, NULL); | ||
203 | |||
204 | /* Read Local Name */ | ||
205 | hci_send_cmd(hdev, HCI_OP_READ_LOCAL_NAME, 0, NULL); | ||
206 | |||
207 | /* Read Voice Setting */ | ||
208 | hci_send_cmd(hdev, HCI_OP_READ_VOICE_SETTING, 0, NULL); | ||
209 | |||
210 | /* Optional initialization */ | ||
211 | |||
212 | /* Clear Event Filters */ | ||
213 | flt_type = HCI_FLT_CLEAR_ALL; | ||
214 | hci_send_cmd(hdev, HCI_OP_SET_EVENT_FLT, 1, &flt_type); | ||
215 | |||
216 | /* Connection accept timeout ~20 secs */ | ||
217 | param = __constant_cpu_to_le16(0x7d00); | ||
218 | hci_send_cmd(hdev, HCI_OP_WRITE_CA_TIMEOUT, 2, ¶m); | ||
219 | |||
220 | bacpy(&cp.bdaddr, BDADDR_ANY); | ||
221 | cp.delete_all = 1; | ||
222 | hci_send_cmd(hdev, HCI_OP_DELETE_STORED_LINK_KEY, sizeof(cp), &cp); | ||
223 | } | 188 | } |
224 | 189 | ||
225 | static void amp_init(struct hci_dev *hdev) | 190 | static void amp_init(struct hci_dev *hdev) |
@@ -273,14 +238,6 @@ static void hci_init_req(struct hci_dev *hdev, unsigned long opt) | |||
273 | } | 238 | } |
274 | } | 239 | } |
275 | 240 | ||
276 | static void hci_le_init_req(struct hci_dev *hdev, unsigned long opt) | ||
277 | { | ||
278 | BT_DBG("%s", hdev->name); | ||
279 | |||
280 | /* Read LE buffer size */ | ||
281 | hci_send_cmd(hdev, HCI_OP_LE_READ_BUFFER_SIZE, 0, NULL); | ||
282 | } | ||
283 | |||
284 | static void hci_scan_req(struct hci_dev *hdev, unsigned long opt) | 241 | static void hci_scan_req(struct hci_dev *hdev, unsigned long opt) |
285 | { | 242 | { |
286 | __u8 scan = opt; | 243 | __u8 scan = opt; |
@@ -405,7 +362,7 @@ struct inquiry_entry *hci_inquiry_cache_lookup(struct hci_dev *hdev, | |||
405 | struct discovery_state *cache = &hdev->discovery; | 362 | struct discovery_state *cache = &hdev->discovery; |
406 | struct inquiry_entry *e; | 363 | struct inquiry_entry *e; |
407 | 364 | ||
408 | BT_DBG("cache %p, %s", cache, batostr(bdaddr)); | 365 | BT_DBG("cache %p, %pMR", cache, bdaddr); |
409 | 366 | ||
410 | list_for_each_entry(e, &cache->all, all) { | 367 | list_for_each_entry(e, &cache->all, all) { |
411 | if (!bacmp(&e->data.bdaddr, bdaddr)) | 368 | if (!bacmp(&e->data.bdaddr, bdaddr)) |
@@ -421,7 +378,7 @@ struct inquiry_entry *hci_inquiry_cache_lookup_unknown(struct hci_dev *hdev, | |||
421 | struct discovery_state *cache = &hdev->discovery; | 378 | struct discovery_state *cache = &hdev->discovery; |
422 | struct inquiry_entry *e; | 379 | struct inquiry_entry *e; |
423 | 380 | ||
424 | BT_DBG("cache %p, %s", cache, batostr(bdaddr)); | 381 | BT_DBG("cache %p, %pMR", cache, bdaddr); |
425 | 382 | ||
426 | list_for_each_entry(e, &cache->unknown, list) { | 383 | list_for_each_entry(e, &cache->unknown, list) { |
427 | if (!bacmp(&e->data.bdaddr, bdaddr)) | 384 | if (!bacmp(&e->data.bdaddr, bdaddr)) |
@@ -438,7 +395,7 @@ struct inquiry_entry *hci_inquiry_cache_lookup_resolve(struct hci_dev *hdev, | |||
438 | struct discovery_state *cache = &hdev->discovery; | 395 | struct discovery_state *cache = &hdev->discovery; |
439 | struct inquiry_entry *e; | 396 | struct inquiry_entry *e; |
440 | 397 | ||
441 | BT_DBG("cache %p bdaddr %s state %d", cache, batostr(bdaddr), state); | 398 | BT_DBG("cache %p bdaddr %pMR state %d", cache, bdaddr, state); |
442 | 399 | ||
443 | list_for_each_entry(e, &cache->resolve, list) { | 400 | list_for_each_entry(e, &cache->resolve, list) { |
444 | if (!bacmp(bdaddr, BDADDR_ANY) && e->name_state == state) | 401 | if (!bacmp(bdaddr, BDADDR_ANY) && e->name_state == state) |
@@ -475,7 +432,9 @@ bool hci_inquiry_cache_update(struct hci_dev *hdev, struct inquiry_data *data, | |||
475 | struct discovery_state *cache = &hdev->discovery; | 432 | struct discovery_state *cache = &hdev->discovery; |
476 | struct inquiry_entry *ie; | 433 | struct inquiry_entry *ie; |
477 | 434 | ||
478 | BT_DBG("cache %p, %s", cache, batostr(&data->bdaddr)); | 435 | BT_DBG("cache %p, %pMR", cache, &data->bdaddr); |
436 | |||
437 | hci_remove_remote_oob_data(hdev, &data->bdaddr); | ||
479 | 438 | ||
480 | if (ssp) | 439 | if (ssp) |
481 | *ssp = data->ssp_mode; | 440 | *ssp = data->ssp_mode; |
@@ -637,6 +596,99 @@ done: | |||
637 | return err; | 596 | return err; |
638 | } | 597 | } |
639 | 598 | ||
599 | static u8 create_ad(struct hci_dev *hdev, u8 *ptr) | ||
600 | { | ||
601 | u8 ad_len = 0, flags = 0; | ||
602 | size_t name_len; | ||
603 | |||
604 | if (test_bit(HCI_LE_PERIPHERAL, &hdev->dev_flags)) | ||
605 | flags |= LE_AD_GENERAL; | ||
606 | |||
607 | if (!lmp_bredr_capable(hdev)) | ||
608 | flags |= LE_AD_NO_BREDR; | ||
609 | |||
610 | if (lmp_le_br_capable(hdev)) | ||
611 | flags |= LE_AD_SIM_LE_BREDR_CTRL; | ||
612 | |||
613 | if (lmp_host_le_br_capable(hdev)) | ||
614 | flags |= LE_AD_SIM_LE_BREDR_HOST; | ||
615 | |||
616 | if (flags) { | ||
617 | BT_DBG("adv flags 0x%02x", flags); | ||
618 | |||
619 | ptr[0] = 2; | ||
620 | ptr[1] = EIR_FLAGS; | ||
621 | ptr[2] = flags; | ||
622 | |||
623 | ad_len += 3; | ||
624 | ptr += 3; | ||
625 | } | ||
626 | |||
627 | if (hdev->adv_tx_power != HCI_TX_POWER_INVALID) { | ||
628 | ptr[0] = 2; | ||
629 | ptr[1] = EIR_TX_POWER; | ||
630 | ptr[2] = (u8) hdev->adv_tx_power; | ||
631 | |||
632 | ad_len += 3; | ||
633 | ptr += 3; | ||
634 | } | ||
635 | |||
636 | name_len = strlen(hdev->dev_name); | ||
637 | if (name_len > 0) { | ||
638 | size_t max_len = HCI_MAX_AD_LENGTH - ad_len - 2; | ||
639 | |||
640 | if (name_len > max_len) { | ||
641 | name_len = max_len; | ||
642 | ptr[1] = EIR_NAME_SHORT; | ||
643 | } else | ||
644 | ptr[1] = EIR_NAME_COMPLETE; | ||
645 | |||
646 | ptr[0] = name_len + 1; | ||
647 | |||
648 | memcpy(ptr + 2, hdev->dev_name, name_len); | ||
649 | |||
650 | ad_len += (name_len + 2); | ||
651 | ptr += (name_len + 2); | ||
652 | } | ||
653 | |||
654 | return ad_len; | ||
655 | } | ||
656 | |||
657 | int hci_update_ad(struct hci_dev *hdev) | ||
658 | { | ||
659 | struct hci_cp_le_set_adv_data cp; | ||
660 | u8 len; | ||
661 | int err; | ||
662 | |||
663 | hci_dev_lock(hdev); | ||
664 | |||
665 | if (!lmp_le_capable(hdev)) { | ||
666 | err = -EINVAL; | ||
667 | goto unlock; | ||
668 | } | ||
669 | |||
670 | memset(&cp, 0, sizeof(cp)); | ||
671 | |||
672 | len = create_ad(hdev, cp.data); | ||
673 | |||
674 | if (hdev->adv_data_len == len && | ||
675 | memcmp(cp.data, hdev->adv_data, len) == 0) { | ||
676 | err = 0; | ||
677 | goto unlock; | ||
678 | } | ||
679 | |||
680 | memcpy(hdev->adv_data, cp.data, sizeof(cp.data)); | ||
681 | hdev->adv_data_len = len; | ||
682 | |||
683 | cp.length = len; | ||
684 | err = hci_send_cmd(hdev, HCI_OP_LE_SET_ADV_DATA, sizeof(cp), &cp); | ||
685 | |||
686 | unlock: | ||
687 | hci_dev_unlock(hdev); | ||
688 | |||
689 | return err; | ||
690 | } | ||
691 | |||
640 | /* ---- HCI ioctl helpers ---- */ | 692 | /* ---- HCI ioctl helpers ---- */ |
641 | 693 | ||
642 | int hci_dev_open(__u16 dev) | 694 | int hci_dev_open(__u16 dev) |
@@ -687,10 +739,6 @@ int hci_dev_open(__u16 dev) | |||
687 | 739 | ||
688 | ret = __hci_request(hdev, hci_init_req, 0, HCI_INIT_TIMEOUT); | 740 | ret = __hci_request(hdev, hci_init_req, 0, HCI_INIT_TIMEOUT); |
689 | 741 | ||
690 | if (lmp_host_le_capable(hdev)) | ||
691 | ret = __hci_request(hdev, hci_le_init_req, 0, | ||
692 | HCI_INIT_TIMEOUT); | ||
693 | |||
694 | clear_bit(HCI_INIT, &hdev->flags); | 742 | clear_bit(HCI_INIT, &hdev->flags); |
695 | } | 743 | } |
696 | 744 | ||
@@ -698,6 +746,7 @@ int hci_dev_open(__u16 dev) | |||
698 | hci_dev_hold(hdev); | 746 | hci_dev_hold(hdev); |
699 | set_bit(HCI_UP, &hdev->flags); | 747 | set_bit(HCI_UP, &hdev->flags); |
700 | hci_notify(hdev, HCI_DEV_UP); | 748 | hci_notify(hdev, HCI_DEV_UP); |
749 | hci_update_ad(hdev); | ||
701 | if (!test_bit(HCI_SETUP, &hdev->dev_flags) && | 750 | if (!test_bit(HCI_SETUP, &hdev->dev_flags) && |
702 | mgmt_valid_hdev(hdev)) { | 751 | mgmt_valid_hdev(hdev)) { |
703 | hci_dev_lock(hdev); | 752 | hci_dev_lock(hdev); |
@@ -812,6 +861,9 @@ static int hci_dev_do_close(struct hci_dev *hdev) | |||
812 | /* Clear flags */ | 861 | /* Clear flags */ |
813 | hdev->flags = 0; | 862 | hdev->flags = 0; |
814 | 863 | ||
864 | /* Controller radio is available but is currently powered down */ | ||
865 | hdev->amp_status = 0; | ||
866 | |||
815 | memset(hdev->eir, 0, sizeof(hdev->eir)); | 867 | memset(hdev->eir, 0, sizeof(hdev->eir)); |
816 | memset(hdev->dev_class, 0, sizeof(hdev->dev_class)); | 868 | memset(hdev->dev_class, 0, sizeof(hdev->dev_class)); |
817 | 869 | ||
@@ -1039,10 +1091,17 @@ int hci_get_dev_info(void __user *arg) | |||
1039 | di.type = (hdev->bus & 0x0f) | (hdev->dev_type << 4); | 1091 | di.type = (hdev->bus & 0x0f) | (hdev->dev_type << 4); |
1040 | di.flags = hdev->flags; | 1092 | di.flags = hdev->flags; |
1041 | di.pkt_type = hdev->pkt_type; | 1093 | di.pkt_type = hdev->pkt_type; |
1042 | di.acl_mtu = hdev->acl_mtu; | 1094 | if (lmp_bredr_capable(hdev)) { |
1043 | di.acl_pkts = hdev->acl_pkts; | 1095 | di.acl_mtu = hdev->acl_mtu; |
1044 | di.sco_mtu = hdev->sco_mtu; | 1096 | di.acl_pkts = hdev->acl_pkts; |
1045 | di.sco_pkts = hdev->sco_pkts; | 1097 | di.sco_mtu = hdev->sco_mtu; |
1098 | di.sco_pkts = hdev->sco_pkts; | ||
1099 | } else { | ||
1100 | di.acl_mtu = hdev->le_mtu; | ||
1101 | di.acl_pkts = hdev->le_pkts; | ||
1102 | di.sco_mtu = 0; | ||
1103 | di.sco_pkts = 0; | ||
1104 | } | ||
1046 | di.link_policy = hdev->link_policy; | 1105 | di.link_policy = hdev->link_policy; |
1047 | di.link_mode = hdev->link_mode; | 1106 | di.link_mode = hdev->link_mode; |
1048 | 1107 | ||
@@ -1259,7 +1318,7 @@ int hci_add_link_key(struct hci_dev *hdev, struct hci_conn *conn, int new_key, | |||
1259 | list_add(&key->list, &hdev->link_keys); | 1318 | list_add(&key->list, &hdev->link_keys); |
1260 | } | 1319 | } |
1261 | 1320 | ||
1262 | BT_DBG("%s key for %s type %u", hdev->name, batostr(bdaddr), type); | 1321 | BT_DBG("%s key for %pMR type %u", hdev->name, bdaddr, type); |
1263 | 1322 | ||
1264 | /* Some buggy controller combinations generate a changed | 1323 | /* Some buggy controller combinations generate a changed |
1265 | * combination key for legacy pairing even when there's no | 1324 | * combination key for legacy pairing even when there's no |
@@ -1338,7 +1397,7 @@ int hci_remove_link_key(struct hci_dev *hdev, bdaddr_t *bdaddr) | |||
1338 | if (!key) | 1397 | if (!key) |
1339 | return -ENOENT; | 1398 | return -ENOENT; |
1340 | 1399 | ||
1341 | BT_DBG("%s removing %s", hdev->name, batostr(bdaddr)); | 1400 | BT_DBG("%s removing %pMR", hdev->name, bdaddr); |
1342 | 1401 | ||
1343 | list_del(&key->list); | 1402 | list_del(&key->list); |
1344 | kfree(key); | 1403 | kfree(key); |
@@ -1354,7 +1413,7 @@ int hci_remove_ltk(struct hci_dev *hdev, bdaddr_t *bdaddr) | |||
1354 | if (bacmp(bdaddr, &k->bdaddr)) | 1413 | if (bacmp(bdaddr, &k->bdaddr)) |
1355 | continue; | 1414 | continue; |
1356 | 1415 | ||
1357 | BT_DBG("%s removing %s", hdev->name, batostr(bdaddr)); | 1416 | BT_DBG("%s removing %pMR", hdev->name, bdaddr); |
1358 | 1417 | ||
1359 | list_del(&k->list); | 1418 | list_del(&k->list); |
1360 | kfree(k); | 1419 | kfree(k); |
@@ -1401,7 +1460,7 @@ int hci_remove_remote_oob_data(struct hci_dev *hdev, bdaddr_t *bdaddr) | |||
1401 | if (!data) | 1460 | if (!data) |
1402 | return -ENOENT; | 1461 | return -ENOENT; |
1403 | 1462 | ||
1404 | BT_DBG("%s removing %s", hdev->name, batostr(bdaddr)); | 1463 | BT_DBG("%s removing %pMR", hdev->name, bdaddr); |
1405 | 1464 | ||
1406 | list_del(&data->list); | 1465 | list_del(&data->list); |
1407 | kfree(data); | 1466 | kfree(data); |
@@ -1440,7 +1499,7 @@ int hci_add_remote_oob_data(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 *hash, | |||
1440 | memcpy(data->hash, hash, sizeof(data->hash)); | 1499 | memcpy(data->hash, hash, sizeof(data->hash)); |
1441 | memcpy(data->randomizer, randomizer, sizeof(data->randomizer)); | 1500 | memcpy(data->randomizer, randomizer, sizeof(data->randomizer)); |
1442 | 1501 | ||
1443 | BT_DBG("%s for %s", hdev->name, batostr(bdaddr)); | 1502 | BT_DBG("%s for %pMR", hdev->name, bdaddr); |
1444 | 1503 | ||
1445 | return 0; | 1504 | return 0; |
1446 | } | 1505 | } |
@@ -1617,6 +1676,9 @@ int hci_le_scan(struct hci_dev *hdev, u8 type, u16 interval, u16 window, | |||
1617 | 1676 | ||
1618 | BT_DBG("%s", hdev->name); | 1677 | BT_DBG("%s", hdev->name); |
1619 | 1678 | ||
1679 | if (test_bit(HCI_LE_PERIPHERAL, &hdev->dev_flags)) | ||
1680 | return -ENOTSUPP; | ||
1681 | |||
1620 | if (work_busy(&hdev->le_scan)) | 1682 | if (work_busy(&hdev->le_scan)) |
1621 | return -EINPROGRESS; | 1683 | return -EINPROGRESS; |
1622 | 1684 | ||
@@ -1643,6 +1705,8 @@ struct hci_dev *hci_alloc_dev(void) | |||
1643 | hdev->esco_type = (ESCO_HV1); | 1705 | hdev->esco_type = (ESCO_HV1); |
1644 | hdev->link_mode = (HCI_LM_ACCEPT); | 1706 | hdev->link_mode = (HCI_LM_ACCEPT); |
1645 | hdev->io_capability = 0x03; /* No Input No Output */ | 1707 | hdev->io_capability = 0x03; /* No Input No Output */ |
1708 | hdev->inq_tx_power = HCI_TX_POWER_INVALID; | ||
1709 | hdev->adv_tx_power = HCI_TX_POWER_INVALID; | ||
1646 | 1710 | ||
1647 | hdev->sniff_max_interval = 800; | 1711 | hdev->sniff_max_interval = 800; |
1648 | hdev->sniff_min_interval = 80; | 1712 | hdev->sniff_min_interval = 80; |
@@ -1754,11 +1818,11 @@ int hci_register_dev(struct hci_dev *hdev) | |||
1754 | if (hdev->dev_type != HCI_AMP) | 1818 | if (hdev->dev_type != HCI_AMP) |
1755 | set_bit(HCI_AUTO_OFF, &hdev->dev_flags); | 1819 | set_bit(HCI_AUTO_OFF, &hdev->dev_flags); |
1756 | 1820 | ||
1757 | schedule_work(&hdev->power_on); | ||
1758 | |||
1759 | hci_notify(hdev, HCI_DEV_REG); | 1821 | hci_notify(hdev, HCI_DEV_REG); |
1760 | hci_dev_hold(hdev); | 1822 | hci_dev_hold(hdev); |
1761 | 1823 | ||
1824 | schedule_work(&hdev->power_on); | ||
1825 | |||
1762 | return id; | 1826 | return id; |
1763 | 1827 | ||
1764 | err_wqueue: | 1828 | err_wqueue: |
@@ -1793,6 +1857,8 @@ void hci_unregister_dev(struct hci_dev *hdev) | |||
1793 | for (i = 0; i < NUM_REASSEMBLY; i++) | 1857 | for (i = 0; i < NUM_REASSEMBLY; i++) |
1794 | kfree_skb(hdev->reassembly[i]); | 1858 | kfree_skb(hdev->reassembly[i]); |
1795 | 1859 | ||
1860 | cancel_work_sync(&hdev->power_on); | ||
1861 | |||
1796 | if (!test_bit(HCI_INIT, &hdev->flags) && | 1862 | if (!test_bit(HCI_INIT, &hdev->flags) && |
1797 | !test_bit(HCI_SETUP, &hdev->dev_flags)) { | 1863 | !test_bit(HCI_SETUP, &hdev->dev_flags)) { |
1798 | hci_dev_lock(hdev); | 1864 | hci_dev_lock(hdev); |
@@ -2153,9 +2219,10 @@ static void hci_add_acl_hdr(struct sk_buff *skb, __u16 handle, __u16 flags) | |||
2153 | hdr->dlen = cpu_to_le16(len); | 2219 | hdr->dlen = cpu_to_le16(len); |
2154 | } | 2220 | } |
2155 | 2221 | ||
2156 | static void hci_queue_acl(struct hci_conn *conn, struct sk_buff_head *queue, | 2222 | static void hci_queue_acl(struct hci_chan *chan, struct sk_buff_head *queue, |
2157 | struct sk_buff *skb, __u16 flags) | 2223 | struct sk_buff *skb, __u16 flags) |
2158 | { | 2224 | { |
2225 | struct hci_conn *conn = chan->conn; | ||
2159 | struct hci_dev *hdev = conn->hdev; | 2226 | struct hci_dev *hdev = conn->hdev; |
2160 | struct sk_buff *list; | 2227 | struct sk_buff *list; |
2161 | 2228 | ||
@@ -2163,7 +2230,18 @@ static void hci_queue_acl(struct hci_conn *conn, struct sk_buff_head *queue, | |||
2163 | skb->data_len = 0; | 2230 | skb->data_len = 0; |
2164 | 2231 | ||
2165 | bt_cb(skb)->pkt_type = HCI_ACLDATA_PKT; | 2232 | bt_cb(skb)->pkt_type = HCI_ACLDATA_PKT; |
2166 | hci_add_acl_hdr(skb, conn->handle, flags); | 2233 | |
2234 | switch (hdev->dev_type) { | ||
2235 | case HCI_BREDR: | ||
2236 | hci_add_acl_hdr(skb, conn->handle, flags); | ||
2237 | break; | ||
2238 | case HCI_AMP: | ||
2239 | hci_add_acl_hdr(skb, chan->handle, flags); | ||
2240 | break; | ||
2241 | default: | ||
2242 | BT_ERR("%s unknown dev_type %d", hdev->name, hdev->dev_type); | ||
2243 | return; | ||
2244 | } | ||
2167 | 2245 | ||
2168 | list = skb_shinfo(skb)->frag_list; | 2246 | list = skb_shinfo(skb)->frag_list; |
2169 | if (!list) { | 2247 | if (!list) { |
@@ -2202,14 +2280,13 @@ static void hci_queue_acl(struct hci_conn *conn, struct sk_buff_head *queue, | |||
2202 | 2280 | ||
2203 | void hci_send_acl(struct hci_chan *chan, struct sk_buff *skb, __u16 flags) | 2281 | void hci_send_acl(struct hci_chan *chan, struct sk_buff *skb, __u16 flags) |
2204 | { | 2282 | { |
2205 | struct hci_conn *conn = chan->conn; | 2283 | struct hci_dev *hdev = chan->conn->hdev; |
2206 | struct hci_dev *hdev = conn->hdev; | ||
2207 | 2284 | ||
2208 | BT_DBG("%s chan %p flags 0x%4.4x", hdev->name, chan, flags); | 2285 | BT_DBG("%s chan %p flags 0x%4.4x", hdev->name, chan, flags); |
2209 | 2286 | ||
2210 | skb->dev = (void *) hdev; | 2287 | skb->dev = (void *) hdev; |
2211 | 2288 | ||
2212 | hci_queue_acl(conn, &chan->data_q, skb, flags); | 2289 | hci_queue_acl(chan, &chan->data_q, skb, flags); |
2213 | 2290 | ||
2214 | queue_work(hdev->workqueue, &hdev->tx_work); | 2291 | queue_work(hdev->workqueue, &hdev->tx_work); |
2215 | } | 2292 | } |
@@ -2311,8 +2388,8 @@ static void hci_link_tx_to(struct hci_dev *hdev, __u8 type) | |||
2311 | /* Kill stalled connections */ | 2388 | /* Kill stalled connections */ |
2312 | list_for_each_entry_rcu(c, &h->list, list) { | 2389 | list_for_each_entry_rcu(c, &h->list, list) { |
2313 | if (c->type == type && c->sent) { | 2390 | if (c->type == type && c->sent) { |
2314 | BT_ERR("%s killing stalled connection %s", | 2391 | BT_ERR("%s killing stalled connection %pMR", |
2315 | hdev->name, batostr(&c->dst)); | 2392 | hdev->name, &c->dst); |
2316 | hci_acl_disconn(c, HCI_ERROR_REMOTE_USER_TERM); | 2393 | hci_acl_disconn(c, HCI_ERROR_REMOTE_USER_TERM); |
2317 | } | 2394 | } |
2318 | } | 2395 | } |
@@ -2381,6 +2458,9 @@ static struct hci_chan *hci_chan_sent(struct hci_dev *hdev, __u8 type, | |||
2381 | case ACL_LINK: | 2458 | case ACL_LINK: |
2382 | cnt = hdev->acl_cnt; | 2459 | cnt = hdev->acl_cnt; |
2383 | break; | 2460 | break; |
2461 | case AMP_LINK: | ||
2462 | cnt = hdev->block_cnt; | ||
2463 | break; | ||
2384 | case SCO_LINK: | 2464 | case SCO_LINK: |
2385 | case ESCO_LINK: | 2465 | case ESCO_LINK: |
2386 | cnt = hdev->sco_cnt; | 2466 | cnt = hdev->sco_cnt; |
@@ -2510,11 +2590,19 @@ static void hci_sched_acl_blk(struct hci_dev *hdev) | |||
2510 | struct hci_chan *chan; | 2590 | struct hci_chan *chan; |
2511 | struct sk_buff *skb; | 2591 | struct sk_buff *skb; |
2512 | int quote; | 2592 | int quote; |
2593 | u8 type; | ||
2513 | 2594 | ||
2514 | __check_timeout(hdev, cnt); | 2595 | __check_timeout(hdev, cnt); |
2515 | 2596 | ||
2597 | BT_DBG("%s", hdev->name); | ||
2598 | |||
2599 | if (hdev->dev_type == HCI_AMP) | ||
2600 | type = AMP_LINK; | ||
2601 | else | ||
2602 | type = ACL_LINK; | ||
2603 | |||
2516 | while (hdev->block_cnt > 0 && | 2604 | while (hdev->block_cnt > 0 && |
2517 | (chan = hci_chan_sent(hdev, ACL_LINK, "e))) { | 2605 | (chan = hci_chan_sent(hdev, type, "e))) { |
2518 | u32 priority = (skb_peek(&chan->data_q))->priority; | 2606 | u32 priority = (skb_peek(&chan->data_q))->priority; |
2519 | while (quote > 0 && (skb = skb_peek(&chan->data_q))) { | 2607 | while (quote > 0 && (skb = skb_peek(&chan->data_q))) { |
2520 | int blocks; | 2608 | int blocks; |
@@ -2547,14 +2635,19 @@ static void hci_sched_acl_blk(struct hci_dev *hdev) | |||
2547 | } | 2635 | } |
2548 | 2636 | ||
2549 | if (cnt != hdev->block_cnt) | 2637 | if (cnt != hdev->block_cnt) |
2550 | hci_prio_recalculate(hdev, ACL_LINK); | 2638 | hci_prio_recalculate(hdev, type); |
2551 | } | 2639 | } |
2552 | 2640 | ||
2553 | static void hci_sched_acl(struct hci_dev *hdev) | 2641 | static void hci_sched_acl(struct hci_dev *hdev) |
2554 | { | 2642 | { |
2555 | BT_DBG("%s", hdev->name); | 2643 | BT_DBG("%s", hdev->name); |
2556 | 2644 | ||
2557 | if (!hci_conn_num(hdev, ACL_LINK)) | 2645 | /* No ACL link over BR/EDR controller */ |
2646 | if (!hci_conn_num(hdev, ACL_LINK) && hdev->dev_type == HCI_BREDR) | ||
2647 | return; | ||
2648 | |||
2649 | /* No AMP link over AMP controller */ | ||
2650 | if (!hci_conn_num(hdev, AMP_LINK) && hdev->dev_type == HCI_AMP) | ||
2558 | return; | 2651 | return; |
2559 | 2652 | ||
2560 | switch (hdev->flow_ctl_mode) { | 2653 | switch (hdev->flow_ctl_mode) { |
@@ -2717,14 +2810,6 @@ static void hci_acldata_packet(struct hci_dev *hdev, struct sk_buff *skb) | |||
2717 | if (conn) { | 2810 | if (conn) { |
2718 | hci_conn_enter_active_mode(conn, BT_POWER_FORCE_ACTIVE_OFF); | 2811 | hci_conn_enter_active_mode(conn, BT_POWER_FORCE_ACTIVE_OFF); |
2719 | 2812 | ||
2720 | hci_dev_lock(hdev); | ||
2721 | if (test_bit(HCI_MGMT, &hdev->dev_flags) && | ||
2722 | !test_and_set_bit(HCI_CONN_MGMT_CONNECTED, &conn->flags)) | ||
2723 | mgmt_device_connected(hdev, &conn->dst, conn->type, | ||
2724 | conn->dst_type, 0, NULL, 0, | ||
2725 | conn->dev_class); | ||
2726 | hci_dev_unlock(hdev); | ||
2727 | |||
2728 | /* Send to upper protocol */ | 2813 | /* Send to upper protocol */ |
2729 | l2cap_recv_acldata(conn, skb, flags); | 2814 | l2cap_recv_acldata(conn, skb, flags); |
2730 | return; | 2815 | return; |