diff --git a/net/bluetooth/Kconfig b/net/bluetooth/Kconfig index d494d8e7375..31bab9b31cd 100644 --- a/net/bluetooth/Kconfig +++ b/net/bluetooth/Kconfig @@ -55,24 +55,41 @@ config BLUETOOTH_DEBUG_HCI_CORE This option enables debug support for Bluetooth HCI core. -config BLUETOOTH_HCI_COUNT - int "Number of HCI buffers" - default 8 +config BLUETOOTH_HCI_CMD_COUNT + int "Number of HCI command buffers" + default 2 range 2 64 help - Number of buffers available for HCI commands and events. + Number of buffers available for HCI commands. -config BLUETOOTH_HCI_SIZE - int "Size of HCI buffers" +config BLUETOOTH_HCI_CMD_SIZE + int "Size of HCI command buffers" default 72 range 72 260 help - Maximum size of each HCI buffer. + Maximum size of each HCI command buffer. + +config BLUETOOTH_HCI_EVT_COUNT + int "Number of HCI event buffers" + default 6 + range 2 64 + help + Number of buffers available for HCI events. This number should + ideally be at least as large as BLUETOOTH_ACL_OUT_COUNT to make + sure we've got enough buffers to handle bursts of Number of + Completed Packets HCI events. + +config BLUETOOTH_HCI_EVT_SIZE + int "Size of HCI event buffers" + default 72 + range 72 260 + help + Maximum size of each HCI event buffer. if BLUETOOTH_CONN config BLUETOOTH_ACL_IN_COUNT int "Number of incoming ACL data buffers" - default 7 + default 5 range 1 16 help Number of buffers available for incoming ACL data. @@ -88,7 +105,7 @@ config BLUETOOTH_ACL_IN_SIZE config BLUETOOTH_ACL_OUT_COUNT int "Number of incoming ACL data buffers" - default 7 + default 5 range 1 16 help Number of buffers available for incoming ACL data. diff --git a/net/bluetooth/hci_core.c b/net/bluetooth/hci_core.c index 50ea26238ff..514000f5ee4 100644 --- a/net/bluetooth/hci_core.c +++ b/net/bluetooth/hci_core.c @@ -74,12 +74,17 @@ struct bt_acl_data { #define bt_hci(buf) ((struct bt_hci_data *)net_buf_user_data(buf)) #define bt_acl(buf) ((struct bt_acl_data *)net_buf_user_data(buf)) -/* Available (free) buffers queues */ -static struct nano_fifo avail_hci; -static NET_BUF_POOL(hci_pool, CONFIG_BLUETOOTH_HCI_COUNT, - CONFIG_BLUETOOTH_HCI_SIZE, &avail_hci, NULL, +/* HCI command buffers */ +static struct nano_fifo avail_hci_cmd; +static NET_BUF_POOL(hci_cmd_pool, CONFIG_BLUETOOTH_HCI_CMD_COUNT, + CONFIG_BLUETOOTH_HCI_CMD_SIZE, &avail_hci_cmd, NULL, sizeof(struct bt_hci_data)); +/* HCI event buffers */ +static struct nano_fifo avail_hci_evt; +static NET_BUF_POOL(hci_evt_pool, CONFIG_BLUETOOTH_HCI_EVT_COUNT, + CONFIG_BLUETOOTH_HCI_EVT_SIZE, &avail_hci_evt, NULL, 0); + #if defined(CONFIG_BLUETOOTH_CONN) static void report_completed_packet(struct net_buf *buf) { @@ -116,7 +121,7 @@ static NET_BUF_POOL(acl_in_pool, CONFIG_BLUETOOTH_ACL_IN_COUNT, /* Incoming buffer type lookup helper */ static enum bt_buf_type bt_type(struct net_buf *buf) { - if (buf->free == &avail_hci) { + if (buf->free == &avail_hci_evt) { return BT_EVT; } else { return BT_ACL_IN; @@ -158,7 +163,7 @@ struct net_buf *bt_hci_cmd_create(uint16_t opcode, uint8_t param_len) BT_DBG("opcode %x param_len %u\n", opcode, param_len); - buf = net_buf_get(&avail_hci, bt_dev.drv->send_reserve); + buf = net_buf_get(&avail_hci_cmd, bt_dev.drv->send_reserve); if (!buf) { BT_ERR("Cannot get free buffer\n"); return NULL; @@ -1595,7 +1600,8 @@ int bt_enable(bt_ready_cb_t cb) } /* Initialize the buffer pools */ - net_buf_pool_init(hci_pool); + net_buf_pool_init(hci_cmd_pool); + net_buf_pool_init(hci_evt_pool); #if defined(CONFIG_BLUETOOTH_CONN) net_buf_pool_init(acl_in_pool); #endif /* CONFIG_BLUETOOTH_CONN */ @@ -1782,7 +1788,7 @@ int bt_stop_scanning(void) struct net_buf *bt_buf_get_evt(void) { - return net_buf_get(&avail_hci, bt_dev.drv->recv_reserve); + return net_buf_get(&avail_hci_evt, bt_dev.drv->recv_reserve); } struct net_buf *bt_buf_get_acl(void)