Bluetooth: Refactor bt_dev struct

Groups LE stack specific values.

Change-Id: Ia947d25c105f518287293b4f870466daa416385c
Signed-off-by: Arkadiusz Lichwa <arkadiusz.lichwa@tieto.com>
This commit is contained in:
Arkadiusz Lichwa 2015-11-03 11:19:19 +01:00 committed by Anas Nashif
commit 99bd06deaa
3 changed files with 36 additions and 30 deletions

View file

@ -327,7 +327,7 @@ void bt_conn_send(struct bt_conn *conn, struct net_buf *buf)
nano_fifo_init(&frags);
len = min(remaining, bt_dev.le_mtu);
len = min(remaining, bt_dev.le.mtu);
hdr = net_buf_push(buf, sizeof(*hdr));
hdr->handle = sys_cpu_to_le16(bt_acl_handle_pack(conn->handle,
@ -343,7 +343,7 @@ void bt_conn_send(struct bt_conn *conn, struct net_buf *buf)
while (remaining) {
buf = bt_l2cap_create_pdu(conn);
len = min(remaining, bt_dev.le_mtu);
len = min(remaining, bt_dev.le.mtu);
/* Copy from original buffer */
memcpy(net_buf_add(buf, len), ptr, len);
@ -375,18 +375,18 @@ static void conn_tx_fiber(int arg1, int arg2)
/* Wait until the controller can accept ACL packets */
BT_DBG("calling sem_take_wait\n");
nano_fiber_sem_take_wait(&bt_dev.le_pkts_sem);
nano_fiber_sem_take_wait(&bt_dev.le.pkts_sem);
/* check for disconnection */
if (conn->state != BT_CONN_CONNECTED) {
nano_fiber_sem_give(&bt_dev.le_pkts_sem);
nano_fiber_sem_give(&bt_dev.le.pkts_sem);
break;
}
/* Get next ACL packet for connection */
buf = nano_fifo_get_wait(&conn->tx_queue);
if (conn->state != BT_CONN_CONNECTED) {
nano_fiber_sem_give(&bt_dev.le_pkts_sem);
nano_fiber_sem_give(&bt_dev.le.pkts_sem);
net_buf_unref(buf);
break;
}
@ -395,7 +395,7 @@ static void conn_tx_fiber(int arg1, int arg2)
err = bt_dev.drv->send(BT_ACL_OUT, buf);
if (err) {
BT_ERR("Unable to send to driver (err %d)\n", err);
nano_fiber_sem_give(&bt_dev.le_pkts_sem);
nano_fiber_sem_give(&bt_dev.le.pkts_sem);
} else {
conn->pending_pkts++;
}
@ -413,7 +413,7 @@ static void conn_tx_fiber(int arg1, int arg2)
/* Return any unacknowledged packets */
if (conn->pending_pkts) {
while (conn->pending_pkts--) {
nano_fiber_sem_give(&bt_dev.le_pkts_sem);
nano_fiber_sem_give(&bt_dev.le.pkts_sem);
}
}

View file

@ -376,7 +376,7 @@ static void hci_num_completed_packets(struct net_buf *buf)
bt_conn_unref(conn);
while (count--) {
nano_fiber_sem_give(&bt_dev.le_pkts_sem);
nano_fiber_sem_give(&bt_dev.le.pkts_sem);
}
}
}
@ -481,12 +481,12 @@ static int update_conn_params(struct bt_conn *conn)
}
if ((conn->role == BT_HCI_ROLE_SLAVE) &&
!(bt_dev.le_features[0] & BT_HCI_LE_CONN_PARAM_REQ_PROC)) {
!(bt_dev.le.features[0] & BT_HCI_LE_CONN_PARAM_REQ_PROC)) {
return bt_l2cap_update_conn_param(conn);
}
if ((conn->le_features[0] & BT_HCI_LE_CONN_PARAM_REQ_PROC) &&
(bt_dev.le_features[0] & BT_HCI_LE_CONN_PARAM_REQ_PROC)) {
(bt_dev.le.features[0] & BT_HCI_LE_CONN_PARAM_REQ_PROC)) {
return bt_conn_le_conn_update(conn, LE_CONN_MIN_INTERVAL,
LE_CONN_MAX_INTERVAL,
LE_CONN_LATENCY, LE_CONN_TIMEOUT);
@ -561,7 +561,7 @@ static void le_conn_complete(struct net_buf *buf)
bt_conn_set_state(conn, BT_CONN_CONNECTED);
if ((evt->role == BT_HCI_ROLE_MASTER) ||
(bt_dev.le_features[0] & BT_HCI_LE_SLAVE_FEATURES)) {
(bt_dev.le.features[0] & BT_HCI_LE_SLAVE_FEATURES)) {
err = hci_le_read_remote_features(conn);
if (!err) {
goto done;
@ -1320,7 +1320,7 @@ static void read_le_features_complete(struct net_buf *buf)
BT_DBG("status %u\n", rp->status);
memcpy(bt_dev.le_features, rp->features, sizeof(bt_dev.le_features));
memcpy(bt_dev.le.features, rp->features, sizeof(bt_dev.le.features));
}
static void read_buffer_size_complete(struct net_buf *buf)
@ -1330,12 +1330,12 @@ static void read_buffer_size_complete(struct net_buf *buf)
BT_DBG("status %u\n", rp->status);
/* If LE-side has buffers we can ignore the BR/EDR values */
if (bt_dev.le_mtu) {
if (bt_dev.le.mtu) {
return;
}
bt_dev.le_mtu = sys_le16_to_cpu(rp->acl_max_len);
bt_dev.le_pkts = sys_le16_to_cpu(rp->acl_max_num);
bt_dev.le.mtu = sys_le16_to_cpu(rp->acl_max_len);
bt_dev.le.pkts = sys_le16_to_cpu(rp->acl_max_num);
}
static void le_read_buffer_size_complete(struct net_buf *buf)
@ -1344,8 +1344,8 @@ static void le_read_buffer_size_complete(struct net_buf *buf)
BT_DBG("status %u\n", rp->status);
bt_dev.le_mtu = sys_le16_to_cpu(rp->le_max_len);
bt_dev.le_pkts = rp->le_max_num;
bt_dev.le.mtu = sys_le16_to_cpu(rp->le_max_len);
bt_dev.le.pkts = rp->le_max_num;
}
static int common_init(void)
@ -1455,7 +1455,7 @@ static int br_init(void)
}
/* Use BR/EDR buffer size if LE reports zero buffers */
if (!bt_dev.le_mtu) {
if (!bt_dev.le.mtu) {
err = bt_hci_cmd_send_sync(BT_HCI_OP_READ_BUFFER_SIZE, NULL,
&rsp);
if (err) {
@ -1494,7 +1494,7 @@ static int set_event_mask(void)
#endif /* CONFIG_BLUETOOTH_CONN */
#if defined(CONFIG_BLUETOOTH_SMP)
if (bt_dev.le_features[0] & BT_HCI_LE_ENCRYPTION) {
if (bt_dev.le.features[0] & BT_HCI_LE_ENCRYPTION) {
ev->events[0] |= 0x80; /* Encryption Change */
ev->events[5] |= 0x80; /* Encryption Key Refresh Complete */
}
@ -1529,14 +1529,14 @@ static int hci_init(void)
BT_DBG("HCI ver %u rev %u, manufacturer %u\n", bt_dev.hci_version,
bt_dev.hci_revision, bt_dev.manufacturer);
BT_DBG("ACL buffers: pkts %u mtu %u\n", bt_dev.le_pkts, bt_dev.le_mtu);
BT_DBG("ACL buffers: pkts %u mtu %u\n", bt_dev.le.pkts, bt_dev.le.mtu);
/* Initialize & prime the semaphore for counting controller-side
* available ACL packet buffers.
*/
nano_sem_init(&bt_dev.le_pkts_sem);
for (i = 0; i < bt_dev.le_pkts; i++) {
nano_sem_give(&bt_dev.le_pkts_sem);
nano_sem_init(&bt_dev.le.pkts_sem);
for (i = 0; i < bt_dev.le.pkts; i++) {
nano_sem_give(&bt_dev.le.pkts_sem);
}
return 0;

View file

@ -46,6 +46,16 @@ enum {
BT_DEV_SCAN_FILTER_DUP,
};
struct bt_dev_le {
/* LE features */
uint8_t features[8];
/* Controller buffer information */
uint8_t pkts;
uint16_t mtu;
struct nano_sem pkts_sem;
};
/* State tracking for the local Bluetooth controller */
struct bt_dev {
/* Local Bluetooth Device Address */
@ -59,15 +69,11 @@ struct bt_dev {
/* BR/EDR features page 0 */
uint8_t features[8];
/* LE features */
uint8_t le_features[8];
/* Current state of controller activity */
atomic_t flags[1];
/* Controller buffer information */
uint8_t le_pkts;
uint16_t le_mtu;
struct nano_sem le_pkts_sem;
/* LE controller specific features */
struct bt_dev_le le;
/* Number of commands controller can accept */
uint8_t ncmd;