From e5a1c0bbe477bb52eff64f4255ff8fb79ddac0db Mon Sep 17 00:00:00 2001 From: Axel Le Bourhis Date: Fri, 21 Feb 2025 10:52:15 +0100 Subject: [PATCH] drivers: bluetooth: hci_nxp: fix unexpected command complete event As the previous version of the MCXW71 BLE Controller wasn't sending a command complete event after setting the BD address, we used a workaround to directly send the HCI command without using zephyr's API. Now, on the latest version of MCXW72 and MCXW71, this issue is fixed, so we need to use `bt_hci_cmd_send_sync` to properly expect the command complete event. Signed-off-by: Axel Le Bourhis --- drivers/bluetooth/hci/hci_nxp.c | 26 ++++++++++++-------------- 1 file changed, 12 insertions(+), 14 deletions(-) diff --git a/drivers/bluetooth/hci/hci_nxp.c b/drivers/bluetooth/hci/hci_nxp.c index 240924baf77..e66affeb933 100644 --- a/drivers/bluetooth/hci/hci_nxp.c +++ b/drivers/bluetooth/hci/hci_nxp.c @@ -79,7 +79,8 @@ LOG_MODULE_REGISTER(bt_driver); /* Private functions */ /* -------------------------------------------------------------------------- */ -#if defined(CONFIG_HCI_NXP_ENABLE_AUTO_SLEEP) || defined(CONFIG_HCI_NXP_SET_CAL_DATA) +#if defined(CONFIG_HCI_NXP_ENABLE_AUTO_SLEEP) || defined(CONFIG_HCI_NXP_SET_CAL_DATA) ||\ + defined(CONFIG_BT_HCI_SET_PUBLIC_ADDR) static int nxp_bt_send_vs_command(uint16_t opcode, const uint8_t *params, uint8_t params_len) { if (IS_ENABLED(CONFIG_BT_HCI_HOST)) { @@ -101,7 +102,7 @@ static int nxp_bt_send_vs_command(uint16_t opcode, const uint8_t *params, uint8_ return 0; } } -#endif /* CONFIG_HCI_NXP_ENABLE_AUTO_SLEEP || CONFIG_HCI_NXP_SET_CAL_DATA */ +#endif #if defined(CONFIG_HCI_NXP_ENABLE_AUTO_SLEEP) static int nxp_bt_enable_controller_autosleep(void) @@ -170,7 +171,10 @@ static int bt_nxp_set_mac_address(const bt_addr_t *public_addr) uint8_t addrOUI[BD_ADDR_OUI_PART_SIZE] = {BD_ADDR_OUI}; uint8_t uid[16] = {0}; uint8_t uuidLen; - uint8_t hciBuffer[12]; + uint8_t params[HCI_CMD_BT_HOST_SET_MAC_ADDR_PARAM_LENGTH] = { + BT_USER_BD, + 0x06U + }; /* If no public address is provided by the user, use a unique address made * from the device's UID (unique ID) @@ -190,18 +194,12 @@ static int bt_nxp_set_mac_address(const bt_addr_t *public_addr) bt_addr_copy((bt_addr_t *)bleDeviceAddress, public_addr); } - hciBuffer[0] = BT_HCI_H4_CMD; - memcpy((void *)&hciBuffer[1], (const void *)&opcode, 2U); - /* Set HCI parameter length */ - hciBuffer[3] = HCI_CMD_BT_HOST_SET_MAC_ADDR_PARAM_LENGTH; - /* Set command parameter ID */ - hciBuffer[4] = BT_USER_BD; - /* Set command parameter length */ - hciBuffer[5] = (uint8_t)6U; - memcpy(hciBuffer + 6U, (const void *)bleDeviceAddress, - BD_ADDR_UUID_PART_SIZE + BD_ADDR_OUI_PART_SIZE); + memcpy(¶ms[2], (const void *)bleDeviceAddress, + BD_ADDR_UUID_PART_SIZE + BD_ADDR_OUI_PART_SIZE); + /* Send the command */ - return PLATFORM_SendHciMessage(hciBuffer, 12U); + return nxp_bt_send_vs_command(opcode, params, + HCI_CMD_BT_HOST_SET_MAC_ADDR_PARAM_LENGTH); } #endif /* CONFIG_BT_HCI_SET_PUBLIC_ADDR */