Bluetooth: hci_uart: Make use of CONFIG_BT_HCI_RAW_H4

This selects CONFIG_BT_HCI_RAW_H4 which indicates to hci_raw to handle
H:4 header automatically.

Signed-off-by: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
This commit is contained in:
Luiz Augusto von Dentz 2020-04-07 14:53:36 -07:00 committed by Johan Hedberg
commit c66bb21a35
2 changed files with 18 additions and 35 deletions

View file

@ -5,3 +5,5 @@ CONFIG_SERIAL=y
CONFIG_UART_INTERRUPT_DRIVEN=y CONFIG_UART_INTERRUPT_DRIVEN=y
CONFIG_BT=y CONFIG_BT=y
CONFIG_BT_HCI_RAW=y CONFIG_BT_HCI_RAW=y
CONFIG_BT_HCI_RAW_H4=y
CONFIG_BT_HCI_RAW_H4_ENABLE=y

View file

@ -82,44 +82,32 @@ static size_t h4_discard(struct device *uart, size_t len)
return uart_fifo_read(uart, buf, MIN(len, sizeof(buf))); return uart_fifo_read(uart, buf, MIN(len, sizeof(buf)));
} }
static struct net_buf *h4_cmd_recv(int *remaining) static void h4_cmd_recv(struct net_buf *buf, int *remaining)
{ {
struct bt_hci_cmd_hdr hdr; struct bt_hci_cmd_hdr hdr;
struct net_buf *buf;
/* We can ignore the return value since we pass len == min */ /* We can ignore the return value since we pass len == min */
h4_read(hci_uart_dev, (void *)&hdr, sizeof(hdr), sizeof(hdr)); h4_read(hci_uart_dev, (void *)&hdr, sizeof(hdr), sizeof(hdr));
*remaining = hdr.param_len; *remaining = hdr.param_len;
buf = bt_buf_get_tx(BT_BUF_CMD, K_NO_WAIT, &hdr, sizeof(hdr)); net_buf_add_mem(buf, &hdr, sizeof(hdr));
if (!buf) {
LOG_ERR("No available command buffers!");
}
LOG_DBG("len %u", hdr.param_len); LOG_DBG("len %u", hdr.param_len);
return buf;
} }
static struct net_buf *h4_acl_recv(int *remaining) static void h4_acl_recv(struct net_buf *buf, int *remaining)
{ {
struct bt_hci_acl_hdr hdr; struct bt_hci_acl_hdr hdr;
struct net_buf *buf;
/* We can ignore the return value since we pass len == min */ /* We can ignore the return value since we pass len == min */
h4_read(hci_uart_dev, (void *)&hdr, sizeof(hdr), sizeof(hdr)); h4_read(hci_uart_dev, (void *)&hdr, sizeof(hdr), sizeof(hdr));
buf = bt_buf_get_tx(BT_BUF_ACL_OUT, K_NO_WAIT, &hdr, sizeof(hdr)); net_buf_add_mem(buf, &hdr, sizeof(hdr));
if (!buf) {
LOG_ERR("No available ACL buffers!");
}
*remaining = sys_le16_to_cpu(hdr.len); *remaining = sys_le16_to_cpu(hdr.len);
LOG_DBG("len %u", *remaining); LOG_DBG("len %u", *remaining);
return buf;
} }
static void bt_uart_isr(struct device *unused) static void bt_uart_isr(struct device *unused)
@ -154,12 +142,18 @@ static void bt_uart_isr(struct device *unused)
continue; continue;
} }
switch (type) { buf = bt_buf_get_tx(BT_BUF_H4, K_NO_WAIT, &type,
case H4_CMD: sizeof(type));
buf = h4_cmd_recv(&remaining); if (!buf) {
return;
}
switch (bt_buf_get_type(buf)) {
case BT_BUF_CMD:
h4_cmd_recv(buf, &remaining);
break; break;
case H4_ACL: case BT_BUF_ACL_OUT:
buf = h4_acl_recv(&remaining); h4_acl_recv(buf, &remaining);
break; break;
default: default:
LOG_ERR("Unknown H4 type %u", type); LOG_ERR("Unknown H4 type %u", type);
@ -168,7 +162,7 @@ static void bt_uart_isr(struct device *unused)
LOG_DBG("need to get %u bytes", remaining); LOG_DBG("need to get %u bytes", remaining);
if (buf && remaining > net_buf_tailroom(buf)) { if (remaining > net_buf_tailroom(buf)) {
LOG_ERR("Not enough space in buffer"); LOG_ERR("Not enough space in buffer");
net_buf_unref(buf); net_buf_unref(buf);
buf = NULL; buf = NULL;
@ -226,19 +220,6 @@ static int h4_send(struct net_buf *buf)
LOG_DBG("buf %p type %u len %u", buf, bt_buf_get_type(buf), LOG_DBG("buf %p type %u len %u", buf, bt_buf_get_type(buf),
buf->len); buf->len);
switch (bt_buf_get_type(buf)) {
case BT_BUF_ACL_IN:
uart_poll_out(hci_uart_dev, H4_ACL);
break;
case BT_BUF_EVT:
uart_poll_out(hci_uart_dev, H4_EVT);
break;
default:
LOG_ERR("Unknown type %u", bt_buf_get_type(buf));
net_buf_unref(buf);
return -EINVAL;
}
while (buf->len) { while (buf->len) {
uart_poll_out(hci_uart_dev, net_buf_pull_u8(buf)); uart_poll_out(hci_uart_dev, net_buf_pull_u8(buf));
} }