Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Bluetooth: AMP: Process Logical Link complete evt

After receiving HCI Logical Link Complete event finish EFS
configuration by sending L2CAP Conf Response with success code.

Signed-off-by: Andrei Emeltchenko <andrei.emeltchenko@intel.com>
Acked-by: Marcel Holtmann <marcel@holtmann.org>
Signed-off-by: Gustavo Padovan <gustavo.padovan@collabora.co.uk>

authored by

Andrei Emeltchenko and committed by
Gustavo Padovan
27695fb4 d5e91192

+46 -2
+2
include/net/bluetooth/l2cap.h
··· 810 810 void l2cap_chan_del(struct l2cap_chan *chan, int err); 811 811 void l2cap_send_conn_req(struct l2cap_chan *chan); 812 812 void l2cap_move_start(struct l2cap_chan *chan); 813 + void l2cap_logical_cfm(struct l2cap_chan *chan, struct hci_chan *hchan, 814 + u8 status); 813 815 814 816 #endif /* __L2CAP_H */
+42
net/bluetooth/hci_event.c
··· 3695 3695 } 3696 3696 } 3697 3697 3698 + static void hci_loglink_complete_evt(struct hci_dev *hdev, struct sk_buff *skb) 3699 + { 3700 + struct hci_ev_logical_link_complete *ev = (void *) skb->data; 3701 + struct hci_conn *hcon; 3702 + struct hci_chan *hchan; 3703 + struct amp_mgr *mgr; 3704 + 3705 + BT_DBG("%s log_handle 0x%4.4x phy_handle 0x%2.2x status 0x%2.2x", 3706 + hdev->name, le16_to_cpu(ev->handle), ev->phy_handle, 3707 + ev->status); 3708 + 3709 + hcon = hci_conn_hash_lookup_handle(hdev, ev->phy_handle); 3710 + if (!hcon) 3711 + return; 3712 + 3713 + /* Create AMP hchan */ 3714 + hchan = hci_chan_create(hcon); 3715 + if (!hchan) 3716 + return; 3717 + 3718 + hchan->handle = le16_to_cpu(ev->handle); 3719 + 3720 + BT_DBG("hcon %p mgr %p hchan %p", hcon, hcon->amp_mgr, hchan); 3721 + 3722 + mgr = hcon->amp_mgr; 3723 + if (mgr && mgr->bredr_chan) { 3724 + struct l2cap_chan *bredr_chan = mgr->bredr_chan; 3725 + 3726 + l2cap_chan_lock(bredr_chan); 3727 + 3728 + bredr_chan->conn->mtu = hdev->block_mtu; 3729 + l2cap_logical_cfm(bredr_chan, hchan, 0); 3730 + hci_conn_hold(hcon); 3731 + 3732 + l2cap_chan_unlock(bredr_chan); 3733 + } 3734 + } 3735 + 3698 3736 static void hci_le_conn_complete_evt(struct hci_dev *hdev, struct sk_buff *skb) 3699 3737 { 3700 3738 struct hci_ev_le_conn_complete *ev = (void *) skb->data; ··· 4062 4024 4063 4025 case HCI_EV_PHY_LINK_COMPLETE: 4064 4026 hci_phy_link_complete_evt(hdev, skb); 4027 + break; 4028 + 4029 + case HCI_EV_LOGICAL_LINK_COMPLETE: 4030 + hci_loglink_complete_evt(hdev, skb); 4065 4031 break; 4066 4032 4067 4033 case HCI_EV_NUM_COMP_BLOCKS:
+2 -2
net/bluetooth/l2cap_core.c
··· 4428 4428 } 4429 4429 4430 4430 /* Call with chan locked */ 4431 - static void l2cap_logical_cfm(struct l2cap_chan *chan, struct hci_chan *hchan, 4432 - u8 status) 4431 + void l2cap_logical_cfm(struct l2cap_chan *chan, struct hci_chan *hchan, 4432 + u8 status) 4433 4433 { 4434 4434 BT_DBG("chan %p, hchan %p, status %d", chan, hchan, status); 4435 4435