[PATCH v3 09/13] Bluetooth: Handle MSFT avdtp open event
From: Kiran K <hidden>
Date: 2021-11-15 06:44:16
Subsystem:
bluetooth subsystem, the rest · Maintainers:
Marcel Holtmann, Luiz Augusto von Dentz, Linus Torvalds
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 <redacted> Reviewed-by: Chethan T N <redacted> Reviewed-by: Srivatsa Ravishankar <redacted> --- 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