Controller responds with CCE event for MSFT avdtp open command. On success MSFT avdtp open event contains avdtp handle which needs to sent in start/suspend/close avdtp commands. Signed-off-by: Kiran K <kiran.k@xxxxxxxxx> Reviewed-by: Chethan T N <chethan.tumkur.narayan@xxxxxxxxx> Reviewed-by: Srivatsa Ravishankar <ravishankar.srivatsa@xxxxxxxxx> --- include/net/bluetooth/hci.h | 7 +++++ net/bluetooth/hci_event.c | 53 +++++++++++++++++++++++++++++++++++++ 2 files changed, 60 insertions(+) diff --git a/include/net/bluetooth/hci.h b/include/net/bluetooth/hci.h index a7dad0125c10..dc863d055056 100644 --- a/include/net/bluetooth/hci.h +++ b/include/net/bluetooth/hci.h @@ -2025,6 +2025,13 @@ struct msft_cp_avdtp_open { __le16 omtu; } __packed; +struct msft_rp_avdtp_open { + __u8 status; + __u8 sub_opcode; + __le16 avdtp_handle; + __u8 audio_intf_param_cnt; +} __packed; + /* ---- HCI Events ---- */ #define HCI_EV_INQUIRY_COMPLETE 0x01 diff --git a/net/bluetooth/hci_event.c b/net/bluetooth/hci_event.c index d4b75a6cfeee..b7ef4e8dae6c 100644 --- a/net/bluetooth/hci_event.c +++ b/net/bluetooth/hci_event.c @@ -1445,6 +1445,55 @@ static void hci_cc_le_set_ext_scan_param(struct hci_dev *hdev, hci_dev_unlock(hdev); } +static void hci_cc_msft_avdtp_open(struct hci_dev *hdev, struct sk_buff *skb) +{ + struct msft_rp_avdtp_open *rp; + struct msft_cp_avdtp_open *sent; + struct hci_conn *hconn; + + if (skb->len < sizeof(*rp)) + return; + + rp = (void *)skb->data; + + sent = hci_sent_cmd_data(hdev, HCI_MSFT_AVDTP_CMD); + + hconn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(sent->handle)); + + if (!hconn) + return; + + /* wake up the task waiting on avdtp handle */ +} + +static void hci_cc_msft_avdtp_cmd(struct hci_dev *hdev, struct sk_buff *skb) +{ + void *sent; + __u8 status; + + if (skb->len < 2) + return; + + status = skb->data[0]; + + bt_dev_dbg(hdev, "status 0x%2.2x", status); + + sent = hci_sent_cmd_data(hdev, HCI_MSFT_AVDTP_CMD); + if (!sent) + return; + + switch (skb->data[1]) { + case HCI_MSFT_AVDTP_OPEN: + hci_cc_msft_avdtp_open(hdev, skb); + break; + + default: + bt_dev_err(hdev, "Invalid MSFT sub opcode 0x%2.2x", + skb->data[1]); + break; + } +} + static bool has_pending_adv_report(struct hci_dev *hdev) { struct discovery_state *d = &hdev->discovery; @@ -3812,6 +3861,10 @@ static void hci_cmd_complete_evt(struct hci_dev *hdev, struct sk_buff *skb, hci_cc_le_read_transmit_power(hdev, skb); break; + case HCI_MSFT_AVDTP_CMD: + hci_cc_msft_avdtp_cmd(hdev, skb); + break; + default: BT_DBG("%s opcode 0x%4.4x", hdev->name, *opcode); break; -- 2.17.1