• Home
  • Raw
  • Download

Lines Matching +full:ctrl +full:- +full:len

30 static struct a2mp_cmd *__a2mp_build(u8 code, u8 ident, u16 len, void *data)  in __a2mp_build()  argument
35 plen = sizeof(*cmd) + len; in __a2mp_build()
40 cmd->code = code; in __a2mp_build()
41 cmd->ident = ident; in __a2mp_build()
42 cmd->len = cpu_to_le16(len); in __a2mp_build()
44 memcpy(cmd->data, data, len); in __a2mp_build()
49 static void a2mp_send(struct amp_mgr *mgr, u8 code, u8 ident, u16 len, void *data) in a2mp_send() argument
51 struct l2cap_chan *chan = mgr->a2mp_chan; in a2mp_send()
53 u16 total_len = len + sizeof(*cmd); in a2mp_send()
57 cmd = __a2mp_build(code, ident, len, data); in a2mp_send()
75 if (++mgr->ident == 0) in __next_ident()
76 mgr->ident = 1; in __next_ident()
78 return mgr->ident; in __next_ident()
87 if (test_and_clear_bit(state, &mgr->state)) { in amp_mgr_lookup_by_state()
109 if (hdev->dev_type == HCI_AMP) { in __a2mp_add_cl()
110 cl[i].id = hdev->id; in __a2mp_add_cl()
111 cl[i].type = hdev->amp_type; in __a2mp_add_cl()
112 if (test_bit(HCI_UP, &hdev->flags)) in __a2mp_add_cl()
113 cl[i].status = hdev->amp_status; in __a2mp_add_cl()
125 struct a2mp_cmd_rej *rej = (void *) skb->data; in a2mp_command_rej()
127 if (le16_to_cpu(hdr->len) < sizeof(*rej)) in a2mp_command_rej()
128 return -EINVAL; in a2mp_command_rej()
130 BT_DBG("ident %d reason %d", hdr->ident, le16_to_cpu(rej->reason)); in a2mp_command_rej()
140 struct a2mp_discov_req *req = (void *) skb->data; in a2mp_discover_req()
141 u16 len = le16_to_cpu(hdr->len); in a2mp_discover_req() local
147 if (len < sizeof(*req)) in a2mp_discover_req()
148 return -EINVAL; in a2mp_discover_req()
152 ext_feat = le16_to_cpu(req->ext_feat); in a2mp_discover_req()
154 BT_DBG("mtu %d efm 0x%4.4x", le16_to_cpu(req->mtu), ext_feat); in a2mp_discover_req()
158 if (len < sizeof(ext_feat)) in a2mp_discover_req()
159 return -EINVAL; in a2mp_discover_req()
161 ext_feat = get_unaligned_le16(skb->data); in a2mp_discover_req()
163 len -= sizeof(ext_feat); in a2mp_discover_req()
173 if (hdev->dev_type == HCI_AMP) in a2mp_discover_req()
177 len = num_ctrl * sizeof(struct a2mp_cl) + sizeof(*rsp); in a2mp_discover_req()
178 rsp = kmalloc(len, GFP_ATOMIC); in a2mp_discover_req()
181 return -ENOMEM; in a2mp_discover_req()
184 rsp->mtu = cpu_to_le16(L2CAP_A2MP_DEFAULT_MTU); in a2mp_discover_req()
185 rsp->ext_feat = 0; in a2mp_discover_req()
187 __a2mp_add_cl(mgr, rsp->cl); in a2mp_discover_req()
191 a2mp_send(mgr, A2MP_DISCOVER_RSP, hdr->ident, len, rsp); in a2mp_discover_req()
200 struct a2mp_discov_rsp *rsp = (void *) skb->data; in a2mp_discover_rsp()
201 u16 len = le16_to_cpu(hdr->len); in a2mp_discover_rsp() local
206 if (len < sizeof(*rsp)) in a2mp_discover_rsp()
207 return -EINVAL; in a2mp_discover_rsp()
209 len -= sizeof(*rsp); in a2mp_discover_rsp()
212 ext_feat = le16_to_cpu(rsp->ext_feat); in a2mp_discover_rsp()
214 BT_DBG("mtu %d efm 0x%4.4x", le16_to_cpu(rsp->mtu), ext_feat); in a2mp_discover_rsp()
218 if (len < sizeof(ext_feat)) in a2mp_discover_rsp()
219 return -EINVAL; in a2mp_discover_rsp()
221 ext_feat = get_unaligned_le16(skb->data); in a2mp_discover_rsp()
223 len -= sizeof(ext_feat); in a2mp_discover_rsp()
227 cl = (void *) skb->data; in a2mp_discover_rsp()
228 while (len >= sizeof(*cl)) { in a2mp_discover_rsp()
229 BT_DBG("Remote AMP id %d type %d status %d", cl->id, cl->type, in a2mp_discover_rsp()
230 cl->status); in a2mp_discover_rsp()
232 if (cl->id != AMP_ID_BREDR && cl->type != AMP_TYPE_BREDR) { in a2mp_discover_rsp()
239 req.id = cl->id; in a2mp_discover_rsp()
244 len -= sizeof(*cl); in a2mp_discover_rsp()
250 struct l2cap_conn *conn = mgr->l2cap_conn; in a2mp_discover_rsp()
253 mutex_lock(&conn->chan_lock); in a2mp_discover_rsp()
255 list_for_each_entry(chan, &conn->chan_l, list) { in a2mp_discover_rsp()
258 state_to_string(chan->state)); in a2mp_discover_rsp()
260 if (chan->scid == L2CAP_CID_A2MP) in a2mp_discover_rsp()
265 if (chan->state == BT_CONNECT) in a2mp_discover_rsp()
271 mutex_unlock(&conn->chan_lock); in a2mp_discover_rsp()
280 struct a2mp_cl *cl = (void *) skb->data; in a2mp_change_notify()
282 while (skb->len >= sizeof(*cl)) { in a2mp_change_notify()
283 BT_DBG("Controller id %d type %d status %d", cl->id, cl->type, in a2mp_change_notify()
284 cl->status); in a2mp_change_notify()
296 BT_DBG("%s status 0x%2.2x", hdev->name, status); in read_local_amp_info_complete()
304 struct a2mp_info_req *req = (void *) skb->data; in a2mp_getinfo_req()
309 if (le16_to_cpu(hdr->len) < sizeof(*req)) in a2mp_getinfo_req()
310 return -EINVAL; in a2mp_getinfo_req()
312 BT_DBG("id %d", req->id); in a2mp_getinfo_req()
314 hdev = hci_dev_get(req->id); in a2mp_getinfo_req()
315 if (!hdev || hdev->dev_type != HCI_AMP) { in a2mp_getinfo_req()
320 rsp.id = req->id; in a2mp_getinfo_req()
323 a2mp_send(mgr, A2MP_GETINFO_RSP, hdr->ident, sizeof(rsp), in a2mp_getinfo_req()
329 set_bit(READ_LOC_AMP_INFO, &mgr->state); in a2mp_getinfo_req()
347 struct a2mp_info_rsp *rsp = (struct a2mp_info_rsp *) skb->data; in a2mp_getinfo_rsp()
349 struct amp_ctrl *ctrl; in a2mp_getinfo_rsp() local
351 if (le16_to_cpu(hdr->len) < sizeof(*rsp)) in a2mp_getinfo_rsp()
352 return -EINVAL; in a2mp_getinfo_rsp()
354 BT_DBG("id %d status 0x%2.2x", rsp->id, rsp->status); in a2mp_getinfo_rsp()
356 if (rsp->status) in a2mp_getinfo_rsp()
357 return -EINVAL; in a2mp_getinfo_rsp()
359 ctrl = amp_ctrl_add(mgr, rsp->id); in a2mp_getinfo_rsp()
360 if (!ctrl) in a2mp_getinfo_rsp()
361 return -ENOMEM; in a2mp_getinfo_rsp()
365 req.id = rsp->id; in a2mp_getinfo_rsp()
376 struct a2mp_amp_assoc_req *req = (void *) skb->data; in a2mp_getampassoc_req()
380 if (le16_to_cpu(hdr->len) < sizeof(*req)) in a2mp_getampassoc_req()
381 return -EINVAL; in a2mp_getampassoc_req()
383 BT_DBG("id %d", req->id); in a2mp_getampassoc_req()
388 hdev = hci_dev_get(req->id); in a2mp_getampassoc_req()
389 if (!hdev || hdev->amp_type == AMP_TYPE_BREDR || tmp) { in a2mp_getampassoc_req()
391 rsp.id = req->id; in a2mp_getampassoc_req()
402 a2mp_send(mgr, A2MP_GETAMPASSOC_RSP, hdr->ident, sizeof(rsp), in a2mp_getampassoc_req()
421 struct a2mp_amp_assoc_rsp *rsp = (void *) skb->data; in a2mp_getampassoc_rsp()
422 u16 len = le16_to_cpu(hdr->len); in a2mp_getampassoc_rsp() local
424 struct amp_ctrl *ctrl; in a2mp_getampassoc_rsp() local
428 if (len < sizeof(*rsp)) in a2mp_getampassoc_rsp()
429 return -EINVAL; in a2mp_getampassoc_rsp()
431 assoc_len = len - sizeof(*rsp); in a2mp_getampassoc_rsp()
433 BT_DBG("id %d status 0x%2.2x assoc len %zu", rsp->id, rsp->status, in a2mp_getampassoc_rsp()
436 if (rsp->status) in a2mp_getampassoc_rsp()
437 return -EINVAL; in a2mp_getampassoc_rsp()
440 ctrl = amp_ctrl_lookup(mgr, rsp->id); in a2mp_getampassoc_rsp()
441 if (ctrl) { in a2mp_getampassoc_rsp()
444 assoc = kmemdup(rsp->amp_assoc, assoc_len, GFP_KERNEL); in a2mp_getampassoc_rsp()
446 amp_ctrl_put(ctrl); in a2mp_getampassoc_rsp()
447 return -ENOMEM; in a2mp_getampassoc_rsp()
450 ctrl->assoc = assoc; in a2mp_getampassoc_rsp()
451 ctrl->assoc_len = assoc_len; in a2mp_getampassoc_rsp()
452 ctrl->assoc_rem_len = assoc_len; in a2mp_getampassoc_rsp()
453 ctrl->assoc_len_so_far = 0; in a2mp_getampassoc_rsp()
455 amp_ctrl_put(ctrl); in a2mp_getampassoc_rsp()
459 hdev = hci_dev_get(rsp->id); in a2mp_getampassoc_rsp()
461 return -EINVAL; in a2mp_getampassoc_rsp()
463 hcon = phylink_add(hdev, mgr, rsp->id, true); in a2mp_getampassoc_rsp()
467 BT_DBG("Created hcon %p: loc:%d -> rem:%d", hcon, hdev->id, rsp->id); in a2mp_getampassoc_rsp()
469 mgr->bredr_chan->remote_amp_id = rsp->id; in a2mp_getampassoc_rsp()
475 skb_pull(skb, len); in a2mp_getampassoc_rsp()
482 struct a2mp_physlink_req *req = (void *) skb->data; in a2mp_createphyslink_req()
486 struct amp_ctrl *ctrl; in a2mp_createphyslink_req() local
488 if (le16_to_cpu(hdr->len) < sizeof(*req)) in a2mp_createphyslink_req()
489 return -EINVAL; in a2mp_createphyslink_req()
491 BT_DBG("local_id %d, remote_id %d", req->local_id, req->remote_id); in a2mp_createphyslink_req()
495 rsp.local_id = req->remote_id; in a2mp_createphyslink_req()
496 rsp.remote_id = req->local_id; in a2mp_createphyslink_req()
498 hdev = hci_dev_get(req->remote_id); in a2mp_createphyslink_req()
499 if (!hdev || hdev->amp_type == AMP_TYPE_BREDR) { in a2mp_createphyslink_req()
504 ctrl = amp_ctrl_lookup(mgr, rsp.remote_id); in a2mp_createphyslink_req()
505 if (!ctrl) { in a2mp_createphyslink_req()
506 ctrl = amp_ctrl_add(mgr, rsp.remote_id); in a2mp_createphyslink_req()
507 if (ctrl) { in a2mp_createphyslink_req()
508 amp_ctrl_get(ctrl); in a2mp_createphyslink_req()
515 if (ctrl) { in a2mp_createphyslink_req()
516 size_t assoc_len = le16_to_cpu(hdr->len) - sizeof(*req); in a2mp_createphyslink_req()
519 assoc = kmemdup(req->amp_assoc, assoc_len, GFP_KERNEL); in a2mp_createphyslink_req()
521 amp_ctrl_put(ctrl); in a2mp_createphyslink_req()
522 return -ENOMEM; in a2mp_createphyslink_req()
525 ctrl->assoc = assoc; in a2mp_createphyslink_req()
526 ctrl->assoc_len = assoc_len; in a2mp_createphyslink_req()
527 ctrl->assoc_rem_len = assoc_len; in a2mp_createphyslink_req()
528 ctrl->assoc_len_so_far = 0; in a2mp_createphyslink_req()
530 amp_ctrl_put(ctrl); in a2mp_createphyslink_req()
533 hcon = phylink_add(hdev, mgr, req->local_id, false); in a2mp_createphyslink_req()
549 a2mp_send(mgr, A2MP_CREATEPHYSLINK_RSP, hdr->ident, in a2mp_createphyslink_req()
552 set_bit(WRITE_REMOTE_AMP_ASSOC, &mgr->state); in a2mp_createphyslink_req()
553 mgr->ident = hdr->ident; in a2mp_createphyslink_req()
556 skb_pull(skb, le16_to_cpu(hdr->len)); in a2mp_createphyslink_req()
563 struct a2mp_physlink_req *req = (void *) skb->data; in a2mp_discphyslink_req()
568 if (le16_to_cpu(hdr->len) < sizeof(*req)) in a2mp_discphyslink_req()
569 return -EINVAL; in a2mp_discphyslink_req()
571 BT_DBG("local_id %d remote_id %d", req->local_id, req->remote_id); in a2mp_discphyslink_req()
575 rsp.local_id = req->remote_id; in a2mp_discphyslink_req()
576 rsp.remote_id = req->local_id; in a2mp_discphyslink_req()
579 hdev = hci_dev_get(req->remote_id); in a2mp_discphyslink_req()
586 &mgr->l2cap_conn->hcon->dst); in a2mp_discphyslink_req()
599 a2mp_send(mgr, A2MP_DISCONNPHYSLINK_RSP, hdr->ident, sizeof(rsp), &rsp); in a2mp_discphyslink_req()
608 BT_DBG("ident %d code 0x%2.2x", hdr->ident, hdr->code); in a2mp_cmd_rsp()
610 skb_pull(skb, le16_to_cpu(hdr->len)); in a2mp_cmd_rsp()
618 struct amp_mgr *mgr = chan->data; in a2mp_chan_recv_cb()
623 while (skb->len >= sizeof(*hdr)) { in a2mp_chan_recv_cb()
624 u16 len; in a2mp_chan_recv_cb() local
626 hdr = (void *) skb->data; in a2mp_chan_recv_cb()
627 len = le16_to_cpu(hdr->len); in a2mp_chan_recv_cb()
629 BT_DBG("code 0x%2.2x id %d len %u", hdr->code, hdr->ident, len); in a2mp_chan_recv_cb()
633 if (len > skb->len || !hdr->ident) { in a2mp_chan_recv_cb()
634 err = -EINVAL; in a2mp_chan_recv_cb()
638 mgr->ident = hdr->ident; in a2mp_chan_recv_cb()
640 switch (hdr->code) { in a2mp_chan_recv_cb()
688 BT_ERR("Unknown A2MP sig cmd 0x%2.2x", hdr->code); in a2mp_chan_recv_cb()
689 err = -EINVAL; in a2mp_chan_recv_cb()
700 hdr = (void *) skb->data; in a2mp_chan_recv_cb()
702 BT_DBG("Send A2MP Rej: cmd 0x%2.2x err %d", hdr->code, err); in a2mp_chan_recv_cb()
704 a2mp_send(mgr, A2MP_COMMAND_REJ, hdr->ident, sizeof(rej), in a2mp_chan_recv_cb()
725 struct amp_mgr *mgr = chan->data; in a2mp_chan_state_change_cb()
732 chan->state = state; in a2mp_chan_state_change_cb()
744 unsigned long len, int nb) in a2mp_chan_alloc_skb_cb() argument
748 skb = bt_skb_alloc(hdr_len + len, GFP_KERNEL); in a2mp_chan_alloc_skb_cb()
750 return ERR_PTR(-ENOMEM); in a2mp_chan_alloc_skb_cb()
783 chan->chan_type = L2CAP_CHAN_FIXED; in a2mp_chan_open()
784 chan->scid = L2CAP_CID_A2MP; in a2mp_chan_open()
785 chan->dcid = L2CAP_CID_A2MP; in a2mp_chan_open()
786 chan->omtu = L2CAP_A2MP_DEFAULT_MTU; in a2mp_chan_open()
787 chan->imtu = L2CAP_A2MP_DEFAULT_MTU; in a2mp_chan_open()
788 chan->flush_to = L2CAP_DEFAULT_FLUSH_TO; in a2mp_chan_open()
790 chan->ops = &a2mp_chan_ops; in a2mp_chan_open()
793 chan->remote_max_tx = chan->max_tx; in a2mp_chan_open()
794 chan->remote_tx_win = chan->tx_win; in a2mp_chan_open()
796 chan->retrans_timeout = L2CAP_DEFAULT_RETRANS_TO; in a2mp_chan_open()
797 chan->monitor_timeout = L2CAP_DEFAULT_MONITOR_TO; in a2mp_chan_open()
799 skb_queue_head_init(&chan->tx_q); in a2mp_chan_open()
801 chan->mode = L2CAP_MODE_ERTM; in a2mp_chan_open()
809 chan->conf_state = 0; in a2mp_chan_open()
816 chan->remote_mps = chan->omtu; in a2mp_chan_open()
817 chan->mps = chan->omtu; in a2mp_chan_open()
819 chan->state = BT_CONNECTED; in a2mp_chan_open()
827 BT_DBG("mgr %p orig refcnt %d", mgr, kref_read(&mgr->kref)); in amp_mgr_get()
829 kref_get(&mgr->kref); in amp_mgr_get()
841 list_del(&mgr->list); in amp_mgr_destroy()
850 BT_DBG("mgr %p orig refcnt %d", mgr, kref_read(&mgr->kref)); in amp_mgr_put()
852 return kref_put(&mgr->kref, &amp_mgr_destroy); in amp_mgr_put()
866 mgr->l2cap_conn = conn; in amp_mgr_create()
874 mgr->a2mp_chan = chan; in amp_mgr_create()
875 chan->data = mgr; in amp_mgr_create()
877 conn->hcon->amp_mgr = mgr; in amp_mgr_create()
879 kref_init(&mgr->kref); in amp_mgr_create()
881 /* Remote AMP ctrl list initialization */ in amp_mgr_create()
882 INIT_LIST_HEAD(&mgr->amp_ctrls); in amp_mgr_create()
883 mutex_init(&mgr->amp_ctrls_lock); in amp_mgr_create()
886 list_add(&mgr->list, &amp_mgr_list); in amp_mgr_create()
897 if (conn->hcon->type != ACL_LINK) in a2mp_channel_create()
906 BT_DBG("mgr: %p chan %p", mgr, mgr->a2mp_chan); in a2mp_channel_create()
908 return mgr->a2mp_chan; in a2mp_channel_create()
920 BT_DBG("%s mgr %p", hdev->name, mgr); in a2mp_send_getinfo_rsp()
924 rsp.id = hdev->id; in a2mp_send_getinfo_rsp()
927 if (hdev->amp_type != AMP_TYPE_BREDR) { in a2mp_send_getinfo_rsp()
929 rsp.total_bw = cpu_to_le32(hdev->amp_total_bw); in a2mp_send_getinfo_rsp()
930 rsp.max_bw = cpu_to_le32(hdev->amp_max_bw); in a2mp_send_getinfo_rsp()
931 rsp.min_latency = cpu_to_le32(hdev->amp_min_latency); in a2mp_send_getinfo_rsp()
932 rsp.pal_cap = cpu_to_le16(hdev->amp_pal_cap); in a2mp_send_getinfo_rsp()
933 rsp.assoc_size = cpu_to_le16(hdev->amp_assoc_size); in a2mp_send_getinfo_rsp()
936 a2mp_send(mgr, A2MP_GETINFO_RSP, mgr->ident, sizeof(rsp), &rsp); in a2mp_send_getinfo_rsp()
943 struct amp_assoc *loc_assoc = &hdev->loc_assoc; in a2mp_send_getampassoc_rsp()
945 size_t len; in a2mp_send_getampassoc_rsp() local
951 BT_DBG("%s mgr %p", hdev->name, mgr); in a2mp_send_getampassoc_rsp()
953 len = sizeof(struct a2mp_amp_assoc_rsp) + loc_assoc->len; in a2mp_send_getampassoc_rsp()
954 rsp = kzalloc(len, GFP_KERNEL); in a2mp_send_getampassoc_rsp()
960 rsp->id = hdev->id; in a2mp_send_getampassoc_rsp()
963 rsp->status = A2MP_STATUS_INVALID_CTRL_ID; in a2mp_send_getampassoc_rsp()
965 rsp->status = A2MP_STATUS_SUCCESS; in a2mp_send_getampassoc_rsp()
966 memcpy(rsp->amp_assoc, loc_assoc->data, loc_assoc->len); in a2mp_send_getampassoc_rsp()
969 a2mp_send(mgr, A2MP_GETAMPASSOC_RSP, mgr->ident, len, rsp); in a2mp_send_getampassoc_rsp()
977 struct amp_assoc *loc_assoc = &hdev->loc_assoc; in a2mp_send_create_phy_link_req()
980 size_t len; in a2mp_send_create_phy_link_req() local
986 len = sizeof(*req) + loc_assoc->len; in a2mp_send_create_phy_link_req()
988 BT_DBG("%s mgr %p assoc_len %zu", hdev->name, mgr, len); in a2mp_send_create_phy_link_req()
990 req = kzalloc(len, GFP_KERNEL); in a2mp_send_create_phy_link_req()
996 bredr_chan = mgr->bredr_chan; in a2mp_send_create_phy_link_req()
1000 req->local_id = hdev->id; in a2mp_send_create_phy_link_req()
1001 req->remote_id = bredr_chan->remote_amp_id; in a2mp_send_create_phy_link_req()
1002 memcpy(req->amp_assoc, loc_assoc->data, loc_assoc->len); in a2mp_send_create_phy_link_req()
1004 a2mp_send(mgr, A2MP_CREATEPHYSLINK_REQ, __next_ident(mgr), len, req); in a2mp_send_create_phy_link_req()
1027 rsp.remote_id = hs_hcon->remote_id; in a2mp_send_create_phy_link_rsp()
1031 BT_DBG("%s mgr %p hs_hcon %p status %u", hdev->name, mgr, hs_hcon, in a2mp_send_create_phy_link_rsp()
1034 rsp.local_id = hdev->id; in a2mp_send_create_phy_link_rsp()
1035 a2mp_send(mgr, A2MP_CREATEPHYSLINK_RSP, mgr->ident, sizeof(rsp), &rsp); in a2mp_send_create_phy_link_rsp()
1041 struct l2cap_conn *conn = chan->conn; in a2mp_discover_amp()
1042 struct amp_mgr *mgr = conn->hcon->amp_mgr; in a2mp_discover_amp()
1053 mgr->bredr_chan = chan; in a2mp_discover_amp()