Skip to content

Commit 4952520

Browse files
committed
drivers: bluetooth: hci_nxp_setup: support for bt disable and reinit
- added flag in nxp setup driver to perform HCI controller firmware- load and configuration only once. This avoid loading/setting-up controller fw on successive bt_init() after bt_disable() call. Signed-off-by: Nirav Agrawal <[email protected]>
1 parent 237701e commit 4952520

File tree

2 files changed

+21
-9
lines changed

2 files changed

+21
-9
lines changed

drivers/bluetooth/hci/h4.c

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
/*
44
* Copyright (c) 2015-2016 Intel Corporation
5+
* Copyright 2025 NXP
56
*
67
* SPDX-License-Identifier: Apache-2.0
78
*/
@@ -256,8 +257,10 @@ static void rx_thread(void *p1, void *p2, void *p3)
256257
do {
257258
uart_irq_rx_enable(cfg->uart);
258259

259-
LOG_DBG("Calling bt_recv(%p)", buf);
260-
h4->recv(dev, buf);
260+
if (h4->recv != NULL) {
261+
LOG_DBG("Calling bt_recv(%p)", buf);
262+
h4->recv(dev, buf);
263+
}
261264

262265
/* Give other threads a chance to run if the ISR
263266
* is receiving data so fast that rx.fifo never

drivers/bluetooth/hci/hci_nxp_setup.c

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -194,6 +194,7 @@ struct nxp_ctlr_fw_upload_state {
194194
bool is_error_case;
195195
bool is_cmd7_req;
196196
bool is_entry_point_req;
197+
bool is_setup_done;
197198

198199
uint8_t last_5bytes_buffer[6];
199200
};
@@ -1171,11 +1172,15 @@ static int bt_nxp_ctlr_init(void)
11711172

11721173
int bt_hci_transport_setup(const struct device *dev)
11731174
{
1175+
int ret = 0;
11741176
if (dev != uart_dev) {
11751177
return -EINVAL;
11761178
}
11771179

1178-
return bt_nxp_ctlr_init();
1180+
if (!fw_upload.is_setup_done) {
1181+
ret = bt_nxp_ctlr_init();
1182+
}
1183+
return ret;
11791184
}
11801185

11811186
#define BT_HCI_VSC_BAUDRATE_UPDATE_LENGTH 4
@@ -1228,19 +1233,23 @@ int bt_h4_vnd_setup(const struct device *dev)
12281233
return 0;
12291234
}
12301235

1231-
err = bt_hci_baudrate_update(dev, operation_speed);
1232-
if (err) {
1233-
return err;
1234-
}
1236+
if (!fw_upload.is_setup_done) {
1237+
err = bt_hci_baudrate_update(dev, operation_speed);
1238+
if (err) {
1239+
return err;
1240+
}
12351241

1236-
/* BT waiting time after controller bandrate updated */
1237-
(void)k_msleep(CONFIG_BT_H4_NXP_CTLR_WAIT_TIME_AFTER_BAUDRATE_UPDATE);
1242+
/* BT waiting time after controller bandrate updated */
1243+
(void)k_msleep(CONFIG_BT_H4_NXP_CTLR_WAIT_TIME_AFTER_BAUDRATE_UPDATE);
1244+
}
12381245

12391246
err = fw_upload_uart_reconfig(operation_speed, flowcontrol_of_hci);
12401247
if (err) {
12411248
LOG_ERR("Fail to update uart bandrate");
12421249
return err;
12431250
}
12441251

1252+
fw_upload.is_setup_done = true;
1253+
12451254
return 0;
12461255
}

0 commit comments

Comments
 (0)