This is an automated email from the ASF dual-hosted git repository. xiaoxiang pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/nuttx.git
commit dfbeba353675e07bea148a21347573aad7572925 Author: duqunbo <[email protected]> AuthorDate: Wed Mar 6 21:53:47 2024 +0800 filter redundant hci reset commands due to dual Bluetooth protocol stacks Signed-off-by: duqunbo <[email protected]> --- drivers/wireless/bluetooth/bt_bridge.c | 50 ++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git a/drivers/wireless/bluetooth/bt_bridge.c b/drivers/wireless/bluetooth/bt_bridge.c index b4790e3f0b..6d11a6c0fc 100644 --- a/drivers/wireless/bluetooth/bt_bridge.c +++ b/drivers/wireless/bluetooth/bt_bridge.c @@ -44,6 +44,9 @@ #define BT_FILTER_TYPE_BLE 1 #define BT_FILTER_TYPE_COUNT 2 +#define BT_FILTER_CMD_RESET 0 +#define BT_FILTER_CMD_COUNT 1 + /**************************************************************************** * Private Types ****************************************************************************/ @@ -70,6 +73,7 @@ struct bt_bridge_s FAR struct snoop_s *snoop; #endif /* CONFIG_BLUETOOTH_BRIDGE_BTSNOOP */ atomic_uint refs; + bool dispatched[BT_FILTER_CMD_COUNT]; }; /**************************************************************************** @@ -427,6 +431,45 @@ static int bt_bridge_open(FAR struct bt_driver_s *drv) return OK; } +static int bt_bridge_send_reset_response(FAR struct bt_driver_s *driver) +{ + uint8_t reset_response[6]; + + reset_response[0] = BT_HCI_EVT_CMD_COMPLETE; + reset_response[1] = 0x04; + reset_response[2] = 0x01; + reset_response[3] = BT_HCI_OP_RESET & 0xff; + reset_response[4] = (BT_HCI_OP_RESET >> 8) & 0xff; + reset_response[5] = BT_HCI_SUCCESS; + + return bt_netdev_receive(driver, BT_EVT, reset_response, + sizeof(reset_response)); +} + +static bool bt_bridge_filter_command(FAR struct bt_bridge_s *bridge, + FAR struct bt_driver_s *driver, + FAR uint8_t *data) +{ + uint16_t opcode = BT_LE162HOST(((uint16_t *)data)[0]); + + switch (opcode) + { + case BT_HCI_OP_RESET: + if (bridge->dispatched[BT_FILTER_CMD_RESET]) + { + bt_bridge_send_reset_response(driver); + return true; + } + + bridge->dispatched[BT_FILTER_CMD_RESET] = true; + break; + default: + break; + } + + return false; +} + static int bt_bridge_send(FAR struct bt_driver_s *drv, enum bt_buf_type_e type, FAR void *data, size_t len) @@ -438,6 +481,13 @@ static int bt_bridge_send(FAR struct bt_driver_s *drv, irqstate_t flags; flags = enter_critical_section(); + + if (bt_bridge_filter_command(bridge, drv, data)) + { + leave_critical_section(flags); + return len; + } + if (bt_filter_can_send(&device->filter, type, data, len)) { leave_critical_section(flags);
