diff --git a/drivers/bluetooth/hci/ipm_stm32wb.c b/drivers/bluetooth/hci/ipm_stm32wb.c index bae45b4d743..75d7a56a2a9 100644 --- a/drivers/bluetooth/hci/ipm_stm32wb.c +++ b/drivers/bluetooth/hci/ipm_stm32wb.c @@ -44,6 +44,8 @@ static void sysevt_received(void *pdata); #define HCI_SCO 0x03 #define HCI_EVT 0x04 +#define STM32WB_C2_LOCK_TIMEOUT K_MSEC(500) + static K_SEM_DEFINE(c2_started, 0, 1); static K_SEM_DEFINE(ble_sys_wait_cmd_rsp, 0, 1); static K_SEM_DEFINE(acl_data_ack, 1, 1); @@ -490,31 +492,13 @@ static int bt_ipm_open(void) { int err; - /* Start RX thread */ - k_thread_create(&ipm_rx_thread_data, ipm_rx_stack, - K_KERNEL_STACK_SIZEOF(ipm_rx_stack), - (k_thread_entry_t)bt_ipm_rx_thread, NULL, NULL, NULL, - K_PRIO_COOP(CONFIG_BT_DRIVER_RX_HIGH_PRIO), - 0, K_NO_WAIT); - - /* Take BLE out of reset */ - ipcc_reset(); - - transport_init(); - - /* Device will let us know when it's ready */ - k_sem_take(&c2_started, K_FOREVER); - BT_DBG("C2 unlocked"); - - stm32wb_start_ble(); - - BT_DBG("IPM Channel Open Completed"); - err = bt_ipm_ble_init(); if (err) { return err; } + BT_DBG("IPM Channel Open Completed"); + return 0; } @@ -533,6 +517,27 @@ static int _bt_ipm_init(const struct device *unused) bt_hci_driver_register(&drv); start_ble_rf(); + + /* Start RX thread */ + k_thread_create(&ipm_rx_thread_data, ipm_rx_stack, + K_KERNEL_STACK_SIZEOF(ipm_rx_stack), + (k_thread_entry_t)bt_ipm_rx_thread, NULL, NULL, NULL, + K_PRIO_COOP(CONFIG_BT_DRIVER_RX_HIGH_PRIO), + 0, K_NO_WAIT); + + /* Take BLE out of reset */ + ipcc_reset(); + + transport_init(); + + /* Device will let us know when it's ready */ + if (k_sem_take(&c2_started, STM32WB_C2_LOCK_TIMEOUT)) { + return -ETIMEDOUT; + } + BT_DBG("C2 unlocked"); + + stm32wb_start_ble(); + return 0; }