Bluetooth: Add framework for Microsoft vendor extension
Subsystems (2)
Marcel Holtmann
maintainerPATCH 4/10 Bluetooth: Add framework for Microsoft vendor extension
From: Miao-chen Chou <[email protected]>
Micrsoft defined a set for HCI vendor extensions. Check the following link for details:
This provides the basic framework to enable the extension and read its supported features. Drivers still have to declare support for this extension before it can be utilized by the host stack.
Signed-off-by Miao-chen Chou <[email protected]>
Signed-off-by Marcel Holtmann <[email protected]>
--- include/net/bluetooth/hci_core.h | 13 +++ net/bluetooth/Kconfig | 7 ++ net/bluetooth/Makefile | 1 + net/bluetooth/hci_core.c | 5 ++ net/bluetooth/hci_event.c | 5 ++ net/bluetooth/msft.c | 141 +++++++++++++++++++++++++++++++ net/bluetooth/msft.h | 18 ++++ 7 files changed, 190 insertions(+) create mode 100644 net/bluetooth/msft.c create mode 100644 net/bluetooth/msft.h
include/net/bluetooth/hci_core.h +13 -0
@@ -484,6 +484,11 @@ struct hci_dev {struct led_trigger *power_led;#endif +#if IS_ENABLED (CONFIG_BT_MSFTEXT ) +__u16 msft_opcode; +void *msft_data; +#endif +int (*open)(struct hci_dev *hdev);int (*close)(struct hci_dev *hdev);int (*flush)(struct hci_dev *hdev);
@@ -1116,6 +1121,14 @@ int hci_recv_frame(struct hci_dev *hdev, struct sk_buff *skb);int hci_recv_diag (struct hci_dev *hdev,struct sk_buff *skb); __printf(2, 3) void hci_set_hw_info(struct hci_dev *hdev, const char *fmt, ...); __printf(2, 3) void hci_set_fw_info(struct hci_dev *hdev, const char *fmt, ...); + +static inline void hci_set_msft_opcode (struct hci_dev *hdev,__u16 opcode) +{ +#if IS_ENABLED (CONFIG_BT_MSFTEXT ) + hdev->msft_opcode = opcode; +#endif +} +int hci_dev_open (__u16 dev);int hci_dev_close (__u16 dev);int hci_dev_do_close (struct hci_dev *hdev);
net/bluetooth/Kconfig +7 -0
@@ -93,6 +93,13 @@ config BT_LEDS This option selects a few LED triggers for different Bluetooth events. +config BT_MSFTEXT + bool "Enable Microsoft extensions" + depends on BT + help + This options enables support for the Microsoft defined HCI + vendor extensions. + config BT_DEBUGFS bool "Export Bluetooth internals in debugfs" depends on BT && DEBUG_FS
net/bluetooth/Makefile +1 -0
@@ -19,5 +19,6 @@ bluetooth-y := af_bluetooth.o hci_core.o hci_conn.o hci_event.o mgmt.o \ bluetooth-$(CONFIG_BT_BREDR) += sco.o bluetooth-$(CONFIG_BT_HS) += a2mp.o amp.o bluetooth-$(CONFIG_BT_LEDS) += leds.o +bluetooth-$(CONFIG_BT_MSFTEXT) += msft.o bluetooth-$(CONFIG_BT_DEBUGFS) += hci_debugfs.o bluetooth-$(CONFIG_BT_SELFTEST) += selftest.o
net/bluetooth/hci_core.c +5 -0
@@ -44,6 +44,7 @@#include "hci_debugfs.h" #include "smp.h" #include "leds.h" +#include "msft.h" static void hci_rx_work (struct work_struct *work);static void hci_cmd_work (struct work_struct *work);
@@ -1563,6 +1564,8 @@ static int hci_dev_do_open(struct hci_dev *hdev) hci_dev_test_flag(hdev, HCI_VENDOR_DIAG) && hdev->set_diag) ret = hdev->set_diag (hdev, true); +msft_do_open (hdev); +clear_bit (HCI_INIT , &hdev->flags);if (!ret) {
@@ -1758,6 +1761,8 @@ int hci_dev_do_close(struct hci_dev *hdev)hci_sock_dev_event (hdev,HCI_DEV_DOWN ); +msft_do_close (hdev); +if (hdev->flush) hdev->flush (hdev);
net/bluetooth/hci_event.c +5 -0
@@ -35,6 +35,7 @@#include "a2mp.h" #include "amp.h" #include "smp.h" +#include "msft.h" #define ZERO_KEY "\x00\x00\x00\x00\x00\x00\x00\x00" \ "\x00\x00\x00\x00\x00\x00\x00\x00"
@@ -6166,6 +6167,10 @@ void hci_event_packet(struct hci_dev *hdev, struct sk_buff *skb)hci_num_comp_blocks_evt (hdev, skb);break ; +case HCI_EV_VENDOR : +msft_vendor_evt (hdev, skb); +break ; +default :BT_DBG ("%s event 0x%2.2x" , hdev->name, event);break ;
net/bluetooth/msft.c new file +141 -0
141 lines not on this page · raw message
net/bluetooth/msft.h new file +18 -0
@@ -0,0 +1,18 @@ +// SPDX-License-Identifier: GPL-2.0-only +/* +* Copyright (C) 2020 Google Corporation +*/ + +#if IS_ENABLED (CONFIG_BT_MSFTEXT ) + +void msft_do_open (struct hci_dev *hdev); +void msft_do_close (struct hci_dev *hdev); +void msft_vendor_evt (struct hci_dev *hdev,struct sk_buff *skb); + +#else + +static inline void msft_do_open (struct hci_dev *hdev) {} +static inline void msft_do_close (struct hci_dev *hdev) {} +static inline void msft_vendor_evt (struct hci_dev *hdev,struct sk_buff *skb) {} + +#endif
Signature · 1 line
2.25.1