You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mynewt.apache.org by cc...@apache.org on 2015/12/18 21:23:23 UTC
[1/3] incubator-mynewt-larva git commit: Replace ble_hs rx and tx tpq
with mqueue.
Repository: incubator-mynewt-larva
Updated Branches:
refs/heads/master aa8482eba -> ecb584ed0
Replace ble_hs rx and tx tpq with mqueue.
Project: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/commit/7f94b343
Tree: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/tree/7f94b343
Diff: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/diff/7f94b343
Branch: refs/heads/master
Commit: 7f94b34354dd48bd1bf9f68393dfe812db2500bc
Parents: aa8482e
Author: Christopher Collins <cc...@gmail.com>
Authored: Fri Dec 18 11:12:10 2015 -0800
Committer: Christopher Collins <cc...@gmail.com>
Committed: Fri Dec 18 11:12:10 2015 -0800
----------------------------------------------------------------------
net/nimble/host/src/ble_hs.c | 109 +++++++++------------------------
net/nimble/host/src/ble_hs_priv.h | 2 -
2 files changed, 29 insertions(+), 82 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/blob/7f94b343/net/nimble/host/src/ble_hs.c
----------------------------------------------------------------------
diff --git a/net/nimble/host/src/ble_hs.c b/net/nimble/host/src/ble_hs.c
index cfac981..c7473d0 100644
--- a/net/nimble/host/src/ble_hs.c
+++ b/net/nimble/host/src/ble_hs.c
@@ -60,8 +60,6 @@ static os_membuf_t g_hci_cmd_buf[OS_MEMPOOL_SIZE(HCI_CMD_BUFS,
#define BLE_HS_MBUF_MEMPOOL_SIZE \
OS_MEMPOOL_SIZE(BLE_HS_NUM_MBUFS, BLE_HS_MBUF_MEMBLOCK_SIZE)
-#define BLE_HS_PKT_MAX BLE_HS_NUM_MBUFS
-
struct os_mempool g_hci_os_event_pool;
static os_membuf_t g_hci_os_event_buf[OS_MEMPOOL_SIZE(HCI_NUM_OS_EVENTS,
HCI_OS_EVENT_BUF_SIZE)];
@@ -75,46 +73,30 @@ struct os_eventq ble_hs_evq;
static struct os_event ble_hs_kick_hci_ev;
static struct os_event ble_hs_kick_gatt_ev;
-struct ble_hs_pkt {
- struct tpq_elem bhp_tpq_elem;
- struct os_mbuf *bhp_om;
-};
-static void *ble_hs_pkt_mem;
-static struct os_mempool ble_hs_pkt_pool;
-
-static struct tpq ble_hs_rx_q;
-static struct tpq ble_hs_tx_q;
+static struct os_mqueue ble_hs_rx_q;
+static struct os_mqueue ble_hs_tx_q;
void
ble_hs_process_tx_data_queue(void)
{
- struct ble_hs_pkt *pkt;
- struct tpq_elem *tpq_elem;
-
- while ((tpq_elem = tpq_get(&ble_hs_tx_q)) != NULL) {
- pkt = (void *)tpq_elem;
+ struct os_mbuf *om;
+ while ((om = os_mqueue_get(&ble_hs_tx_q)) != NULL) {
#ifdef PHONY_TRANSPORT
- ble_hs_test_pkt_txed(pkt->bhp_om);
+ ble_hs_test_pkt_txed(om);
#else
- ble_hci_transport_host_acl_data_send(pkt->bhp_om);
+ ble_hci_transport_host_acl_data_send(om);
#endif
-
- os_memblock_put(&ble_hs_pkt_pool, pkt);
}
}
static void
ble_hs_process_rx_data_queue(void)
{
- struct ble_hs_pkt *pkt;
- struct tpq_elem *tpq_elem;
-
- while ((tpq_elem = tpq_get(&ble_hs_rx_q)) != NULL) {
- pkt = (void *)tpq_elem;
- host_hci_data_rx(pkt->bhp_om);
+ struct os_mbuf *om;
- os_memblock_put(&ble_hs_pkt_pool, pkt);
+ while ((om = os_mqueue_get(&ble_hs_rx_q)) != NULL) {
+ host_hci_data_rx(om);
}
}
@@ -142,12 +124,9 @@ ble_hs_task_handler(void *arg)
host_hci_os_event_proc(ev);
break;
- case BLE_HS_RX_DATA_EVENT:
- ble_hs_process_rx_data_queue();
- break;
-
- case BLE_HS_TX_DATA_EVENT:
+ case OS_EVENT_T_MQUEUE_DATA:
ble_hs_process_tx_data_queue();
+ ble_hs_process_rx_data_queue();
break;
case BLE_HS_KICK_HCI_EVENT:
@@ -177,34 +156,26 @@ ble_hs_task_handler(void *arg)
int
ble_hs_rx_data(struct os_mbuf *om)
{
- struct ble_hs_pkt *pkt;
+ int rc;
- pkt = os_memblock_get(&ble_hs_pkt_pool);
- if (pkt == NULL) {
- os_mbuf_free_chain(om);
- return BLE_HS_ENOMEM;
+ rc = os_mqueue_put(&ble_hs_rx_q, &ble_hs_evq, om);
+ if (rc != 0) {
+ return BLE_HS_EOS;
}
- pkt->bhp_om = om;
- tpq_put(&ble_hs_evq, &ble_hs_rx_q, &pkt->bhp_tpq_elem);
-
return 0;
}
int
ble_hs_tx_data(struct os_mbuf *om)
{
- struct ble_hs_pkt *pkt;
+ int rc;
- pkt = os_memblock_get(&ble_hs_pkt_pool);
- if (pkt == NULL) {
- os_mbuf_free_chain(om);
- return BLE_HS_ENOMEM;
+ rc = os_mqueue_put(&ble_hs_tx_q, &ble_hs_evq, om);
+ if (rc != 0) {
+ return BLE_HS_EOS;
}
- pkt->bhp_om = om;
- tpq_put(&ble_hs_evq, &ble_hs_tx_q, &pkt->bhp_tpq_elem);
-
return 0;
}
@@ -226,13 +197,6 @@ ble_hs_kick_gatt(void)
os_eventq_put(&ble_hs_evq, &ble_hs_kick_gatt_ev);
}
-static void
-ble_hs_free_mem(void)
-{
- free(ble_hs_pkt_mem);
- ble_hs_pkt_mem = NULL;
-}
-
/**
* Initializes the host portion of the BLE stack.
*/
@@ -241,8 +205,6 @@ ble_hs_init(uint8_t prio)
{
int rc;
- ble_hs_free_mem();
-
ble_hs_cfg_init();
/* Create memory pool of command buffers */
@@ -266,53 +228,44 @@ ble_hs_init(uint8_t prio)
BLE_HS_MBUF_MEMBLOCK_SIZE,
ble_hs_mbuf_mem, "ble_hs_mbuf_pool");
if (rc != 0) {
- rc = BLE_HS_EOS;
- goto err;
+ return BLE_HS_EOS;
}
rc = os_mbuf_pool_init(&ble_hs_mbuf_pool, &ble_hs_mbuf_mempool,
BLE_HS_MBUF_MEMBLOCK_SIZE, BLE_HS_NUM_MBUFS);
if (rc != 0) {
- rc = BLE_HS_EOS;
- goto err;
- }
-
- rc = ble_hs_misc_malloc_mempool(&ble_hs_pkt_mem, &ble_hs_pkt_pool,
- BLE_HS_PKT_MAX, sizeof (struct ble_hs_pkt),
- "ble_hs_pkt_pool");
- if (rc != 0) {
- goto err;
+ return BLE_HS_EOS;
}
rc = ble_hs_conn_init();
if (rc != 0) {
- goto err;
+ return rc;
}
rc = ble_l2cap_init();
if (rc != 0) {
- goto err;
+ return rc;
}
rc = ble_att_svr_init();
if (rc != 0) {
- goto err;
+ return rc;
}
rc = ble_gap_conn_init();
if (rc != 0) {
- goto err;
+ return rc;
}
ble_hci_ack_init();
rc = ble_hci_sched_init();
if (rc != 0) {
- goto err;
+ return rc;
}
rc = ble_gatt_init();
if (rc != 0) {
- goto err;
+ return rc;
}
ble_hs_kick_hci_ev.ev_queued = 0;
@@ -326,12 +279,8 @@ ble_hs_init(uint8_t prio)
os_task_init(&ble_hs_task, "ble_hs", ble_hs_task_handler, NULL, prio,
OS_WAIT_FOREVER, ble_hs_stack, BLE_HS_STACK_SIZE);
- tpq_init(&ble_hs_rx_q, BLE_HS_RX_DATA_EVENT, NULL);
- tpq_init(&ble_hs_tx_q, BLE_HS_TX_DATA_EVENT, NULL);
+ os_mqueue_init(&ble_hs_rx_q, NULL);
+ os_mqueue_init(&ble_hs_tx_q, NULL);
return 0;
-
-err:
- ble_hs_free_mem();
- return rc;
}
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/blob/7f94b343/net/nimble/host/src/ble_hs_priv.h
----------------------------------------------------------------------
diff --git a/net/nimble/host/src/ble_hs_priv.h b/net/nimble/host/src/ble_hs_priv.h
index 4c36e0d..80b5997 100644
--- a/net/nimble/host/src/ble_hs_priv.h
+++ b/net/nimble/host/src/ble_hs_priv.h
@@ -25,8 +25,6 @@ struct os_mempool;
#define BLE_HOST_HCI_EVENT_CTLR_EVENT (OS_EVENT_T_PERUSER + 0)
#define BLE_HS_KICK_HCI_EVENT (OS_EVENT_T_PERUSER + 1)
#define BLE_HS_KICK_GATT_EVENT (OS_EVENT_T_PERUSER + 2)
-#define BLE_HS_RX_DATA_EVENT (OS_EVENT_T_PERUSER + 3)
-#define BLE_HS_TX_DATA_EVENT (OS_EVENT_T_PERUSER + 4)
extern struct os_mbuf_pool ble_hs_mbuf_pool;
extern struct os_eventq ble_hs_evq;
[2/3] incubator-mynewt-larva git commit: Fix startup sequence.
Posted by cc...@apache.org.
Fix startup sequence.
Project: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/commit/3171a5ca
Tree: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/tree/3171a5ca
Diff: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/diff/3171a5ca
Branch: refs/heads/master
Commit: 3171a5ca72898a18c36c21a755ac769aa3fe68c6
Parents: 7f94b34
Author: Christopher Collins <cc...@gmail.com>
Authored: Fri Dec 18 11:42:27 2015 -0800
Committer: Christopher Collins <cc...@gmail.com>
Committed: Fri Dec 18 11:42:27 2015 -0800
----------------------------------------------------------------------
net/nimble/host/include/host/host_hci.h | 1 +
net/nimble/host/src/ble_hs_startup.c | 145 ++++++++++++++++++-----
net/nimble/host/src/host_hci_cmd.c | 16 +++
net/nimble/host/src/test/ble_hs_test_util.c | 7 +-
4 files changed, 139 insertions(+), 30 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/blob/3171a5ca/net/nimble/host/include/host/host_hci.h
----------------------------------------------------------------------
diff --git a/net/nimble/host/include/host/host_hci.h b/net/nimble/host/include/host/host_hci.h
index 518803a..0ee00f8 100644
--- a/net/nimble/host/include/host/host_hci.h
+++ b/net/nimble/host/include/host/host_hci.h
@@ -43,6 +43,7 @@ int host_hci_cmd_le_clear_whitelist(void);
int host_hci_cmd_le_read_whitelist(void);
int host_hci_cmd_le_add_to_whitelist(uint8_t *addr, uint8_t addr_type);
int host_hci_cmd_le_rmv_from_whitelist(uint8_t *addr, uint8_t addr_type);
+int host_hci_cmd_reset(void);
int host_hci_set_buf_size(uint16_t pktlen, uint8_t max_pkts);
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/blob/3171a5ca/net/nimble/host/src/ble_hs_startup.c
----------------------------------------------------------------------
diff --git a/net/nimble/host/src/ble_hs_startup.c b/net/nimble/host/src/ble_hs_startup.c
index 49b6e80..d0e071d 100644
--- a/net/nimble/host/src/ble_hs_startup.c
+++ b/net/nimble/host/src/ble_hs_startup.c
@@ -23,12 +23,14 @@
#include "ble_hs_startup.h"
#define BLE_HS_STARTUP_STATE_IDLE 0
-#define BLE_HS_STARTUP_STATE_READ_BUF_SIZE 1
-#define BLE_HS_STARTUP_STATE_READ_BUF_SIZE_ACKED 2
+#define BLE_HS_STARTUP_STATE_RESET 1
+#define BLE_HS_STARTUP_STATE_RESET_ACKED 2
#define BLE_HS_STARTUP_STATE_SET_EVENT_MASK 3
#define BLE_HS_STARTUP_STATE_SET_EVENT_MASK_ACKED 4
-#define BLE_HS_STARTUP_STATE_SET_LE_EVENT_MASK 5
-#define BLE_HS_STARTUP_STATE_SET_LE_EVENT_MASK_ACKED 6
+#define BLE_HS_STARTUP_STATE_LE_SET_EVENT_MASK 5
+#define BLE_HS_STARTUP_STATE_LE_SET_EVENT_MASK_ACKED 6
+#define BLE_HS_STARTUP_STATE_LE_READ_BUF_SIZE 7
+#define BLE_HS_STARTUP_STATE_LE_READ_BUF_SIZE_ACKED 8
static uint8_t ble_hs_startup_state;
@@ -40,31 +42,50 @@ ble_hs_startup_failure(int status)
}
static void
-ble_hs_startup_set_event_mask_ack(struct ble_hci_ack *ack, void *arg)
+ble_hs_startup_read_buf_size_ack(struct ble_hci_ack *ack, void *arg)
{
- assert(ble_hs_startup_state == BLE_HS_STARTUP_STATE_SET_EVENT_MASK);
+ uint16_t pktlen;
+ uint8_t max_pkts;
+ int rc;
+
+ assert(ble_hs_startup_state ==
+ BLE_HS_STARTUP_STATE_LE_READ_BUF_SIZE_ACKED - 1);
if (ack->bha_status != 0) {
ble_hs_startup_failure(ack->bha_status);
return;
}
- ble_hs_startup_state = BLE_HS_STARTUP_STATE_SET_EVENT_MASK_ACKED;
+ if (ack->bha_params_len != BLE_HCI_RD_BUF_SIZE_RSPLEN + 1) {
+ ble_hs_startup_failure(BLE_HS_EBADDATA);
+ return;
+ }
- /* XXX: Send LE Set event mask. */
+ pktlen = le16toh(ack->bha_params + 1);
+ max_pkts = ack->bha_params[3];
+
+ rc = host_hci_set_buf_size(pktlen, max_pkts);
+ if (rc != 0) {
+ ble_hs_startup_failure(rc);
+ return;
+ }
+
+ ble_hs_startup_state = BLE_HS_STARTUP_STATE_LE_READ_BUF_SIZE_ACKED;
+
+ /* XXX: Send read buffer size. */
}
static int
-ble_hs_startup_set_event_mask_tx(void *arg)
+ble_hs_startup_le_read_buf_size_tx(void *arg)
{
int rc;
- assert(ble_hs_startup_state == BLE_HS_STARTUP_STATE_READ_BUF_SIZE_ACKED);
+ assert(ble_hs_startup_state == BLE_HS_STARTUP_STATE_LE_READ_BUF_SIZE - 1);
- ble_hs_startup_state = BLE_HS_STARTUP_STATE_SET_EVENT_MASK;
- ble_hci_ack_set_callback(ble_hs_startup_set_event_mask_ack, NULL);
+ ble_hs_startup_state = BLE_HS_STARTUP_STATE_LE_READ_BUF_SIZE;
+ ble_hci_ack_set_callback(ble_hs_startup_read_buf_size_ack, NULL);
- rc = host_hci_cmd_set_event_mask(0x20001fffffffffff);
+ rc = host_hci_cmd_le_read_buffer_size();
if (rc != 0) {
return rc;
}
@@ -73,34 +94,99 @@ ble_hs_startup_set_event_mask_tx(void *arg)
}
static void
-ble_hs_startup_read_buf_size_ack(struct ble_hci_ack *ack, void *arg)
+ble_hs_startup_le_set_event_mask_ack(struct ble_hci_ack *ack, void *arg)
{
- uint16_t pktlen;
- uint8_t max_pkts;
int rc;
- assert(ble_hs_startup_state == BLE_HS_STARTUP_STATE_READ_BUF_SIZE);
+ assert(ble_hs_startup_state ==
+ BLE_HS_STARTUP_STATE_LE_SET_EVENT_MASK_ACKED - 1);
if (ack->bha_status != 0) {
ble_hs_startup_failure(ack->bha_status);
return;
}
- if (ack->bha_params_len != BLE_HCI_RD_BUF_SIZE_RSPLEN + 1) {
- ble_hs_startup_failure(BLE_HS_EBADDATA);
+ ble_hs_startup_state = BLE_HS_STARTUP_STATE_LE_SET_EVENT_MASK_ACKED;
+
+ /* XXX: Send LE Set event mask. */
+ rc = ble_hci_sched_enqueue(ble_hs_startup_le_read_buf_size_tx, NULL);
+ if (rc != 0) {
+ ble_hs_startup_failure(rc);
return;
}
+}
- pktlen = le16toh(ack->bha_params + 1);
- max_pkts = ack->bha_params[3];
+static int
+ble_hs_startup_le_set_event_mask_tx(void *arg)
+{
+ int rc;
- rc = host_hci_set_buf_size(pktlen, max_pkts);
+ assert(ble_hs_startup_state == BLE_HS_STARTUP_STATE_LE_SET_EVENT_MASK - 1);
+
+ ble_hs_startup_state = BLE_HS_STARTUP_STATE_LE_SET_EVENT_MASK;
+ ble_hci_ack_set_callback(ble_hs_startup_le_set_event_mask_ack, NULL);
+
+ rc = host_hci_cmd_le_set_event_mask(0x000000000000001f);
+ if (rc != 0) {
+ return rc;
+ }
+
+ return 0;
+}
+
+static void
+ble_hs_startup_set_event_mask_ack(struct ble_hci_ack *ack, void *arg)
+{
+ int rc;
+
+ assert(ble_hs_startup_state ==
+ BLE_HS_STARTUP_STATE_SET_EVENT_MASK_ACKED - 1);
+
+ if (ack->bha_status != 0) {
+ ble_hs_startup_failure(ack->bha_status);
+ return;
+ }
+
+ ble_hs_startup_state = BLE_HS_STARTUP_STATE_SET_EVENT_MASK_ACKED;
+
+ rc = ble_hci_sched_enqueue(ble_hs_startup_le_set_event_mask_tx, NULL);
if (rc != 0) {
ble_hs_startup_failure(rc);
return;
}
+}
+
+static int
+ble_hs_startup_set_event_mask_tx(void *arg)
+{
+ int rc;
+
+ assert(ble_hs_startup_state == BLE_HS_STARTUP_STATE_SET_EVENT_MASK - 1);
+
+ ble_hs_startup_state = BLE_HS_STARTUP_STATE_SET_EVENT_MASK;
+ ble_hci_ack_set_callback(ble_hs_startup_set_event_mask_ack, NULL);
+
+ rc = host_hci_cmd_set_event_mask(0x20001fffffffffff);
+ if (rc != 0) {
+ return rc;
+ }
+
+ return 0;
+}
+
+static void
+ble_hs_startup_reset_ack(struct ble_hci_ack *ack, void *arg)
+{
+ int rc;
+
+ assert(ble_hs_startup_state == BLE_HS_STARTUP_STATE_RESET_ACKED - 1);
+
+ if (ack->bha_status != 0) {
+ ble_hs_startup_failure(ack->bha_status);
+ return;
+ }
- ble_hs_startup_state = BLE_HS_STARTUP_STATE_READ_BUF_SIZE_ACKED;
+ ble_hs_startup_state = BLE_HS_STARTUP_STATE_RESET_ACKED;
rc = ble_hci_sched_enqueue(ble_hs_startup_set_event_mask_tx, NULL);
if (rc != 0) {
@@ -109,17 +195,18 @@ ble_hs_startup_read_buf_size_ack(struct ble_hci_ack *ack, void *arg)
}
}
+
static int
-ble_hs_startup_read_buf_size_tx(void *arg)
+ble_hs_startup_reset_tx(void *arg)
{
int rc;
- assert(ble_hs_startup_state == BLE_HS_STARTUP_STATE_IDLE);
+ assert(ble_hs_startup_state == BLE_HS_STARTUP_STATE_RESET - 1);
- ble_hs_startup_state = BLE_HS_STARTUP_STATE_READ_BUF_SIZE;
- ble_hci_ack_set_callback(ble_hs_startup_read_buf_size_ack, NULL);
+ ble_hs_startup_state = BLE_HS_STARTUP_STATE_RESET;
+ ble_hci_ack_set_callback(ble_hs_startup_reset_ack, NULL);
- rc = host_hci_cmd_le_read_buffer_size();
+ rc = host_hci_cmd_reset();
if (rc != 0) {
return rc;
}
@@ -134,7 +221,7 @@ ble_hs_startup_go(void)
ble_hs_startup_state = BLE_HS_STARTUP_STATE_IDLE;
- rc = ble_hci_sched_enqueue(ble_hs_startup_read_buf_size_tx, NULL);
+ rc = ble_hci_sched_enqueue(ble_hs_startup_reset_tx, NULL);
if (rc != 0) {
ble_hs_startup_failure(rc);
return rc;
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/blob/3171a5ca/net/nimble/host/src/host_hci_cmd.c
----------------------------------------------------------------------
diff --git a/net/nimble/host/src/host_hci_cmd.c b/net/nimble/host/src/host_hci_cmd.c
index 5f164ff..4b7fb94 100644
--- a/net/nimble/host/src/host_hci_cmd.c
+++ b/net/nimble/host/src/host_hci_cmd.c
@@ -32,6 +32,7 @@ static int
host_hci_cmd_transport(uint8_t *cmdbuf)
{
#ifdef ARCH_sim
+ os_memblock_put(&g_hci_cmd_pool, cmdbuf);
return 0;
#else
return ble_hci_transport_host_cmd_send(cmdbuf);
@@ -479,3 +480,18 @@ host_hci_cmd_le_rmv_from_whitelist(uint8_t *addr, uint8_t addr_type)
BLE_HCI_OCF_LE_RMV_WHITE_LIST);
return rc;
}
+
+/**
+ * Reset the controller and link manager.
+ *
+ * @return int
+ */
+int
+host_hci_cmd_reset(void)
+{
+ int rc;
+
+ rc = host_hci_cmd_send(BLE_HCI_OGF_CTLR_BASEBAND, BLE_HCI_OCF_CB_RESET, 0,
+ NULL);
+ return rc;
+}
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/blob/3171a5ca/net/nimble/host/src/test/ble_hs_test_util.c
----------------------------------------------------------------------
diff --git a/net/nimble/host/src/test/ble_hs_test_util.c b/net/nimble/host/src/test/ble_hs_test_util.c
index b7518bd..7887dcb 100644
--- a/net/nimble/host/src/test/ble_hs_test_util.c
+++ b/net/nimble/host/src/test/ble_hs_test_util.c
@@ -182,10 +182,15 @@ ble_hs_test_util_rx_startup_acks(void)
/* Receive acknowledgements for the startup sequence. We sent the
* corresponding requests when the host task was started.
*/
- ble_hs_test_util_rx_hci_buf_size_ack(0xffff);
+ ble_hs_test_util_rx_ack(
+ (BLE_HCI_OGF_CTLR_BASEBAND << 10) | BLE_HCI_OCF_CB_RESET, 0);
ble_hs_test_util_rx_ack(
(BLE_HCI_OGF_CTLR_BASEBAND << 10) | BLE_HCI_OCF_CB_SET_EVENT_MASK,
0);
+ ble_hs_test_util_rx_ack(
+ (BLE_HCI_OGF_LE << 10) | BLE_HCI_OCF_LE_SET_EVENT_MASK,
+ 0);
+ ble_hs_test_util_rx_hci_buf_size_ack(0xffff);
}
void
[3/3] incubator-mynewt-larva git commit: Reduce startup code with
generic HCI ack fn.
Posted by cc...@apache.org.
Reduce startup code with generic HCI ack fn.
Project: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/commit/ecb584ed
Tree: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/tree/ecb584ed
Diff: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/diff/ecb584ed
Branch: refs/heads/master
Commit: ecb584ed0a82d06583c0827a253b1ac24c065aa0
Parents: 3171a5c
Author: Christopher Collins <cc...@gmail.com>
Authored: Fri Dec 18 12:22:35 2015 -0800
Committer: Christopher Collins <cc...@gmail.com>
Committed: Fri Dec 18 12:22:35 2015 -0800
----------------------------------------------------------------------
net/nimble/host/src/ble_hs_startup.c | 176 ++++++++++++------------------
1 file changed, 71 insertions(+), 105 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/blob/ecb584ed/net/nimble/host/src/ble_hs_startup.c
----------------------------------------------------------------------
diff --git a/net/nimble/host/src/ble_hs_startup.c b/net/nimble/host/src/ble_hs_startup.c
index d0e071d..9f6a20a 100644
--- a/net/nimble/host/src/ble_hs_startup.c
+++ b/net/nimble/host/src/ble_hs_startup.c
@@ -24,16 +24,28 @@
#define BLE_HS_STARTUP_STATE_IDLE 0
#define BLE_HS_STARTUP_STATE_RESET 1
-#define BLE_HS_STARTUP_STATE_RESET_ACKED 2
-#define BLE_HS_STARTUP_STATE_SET_EVENT_MASK 3
-#define BLE_HS_STARTUP_STATE_SET_EVENT_MASK_ACKED 4
-#define BLE_HS_STARTUP_STATE_LE_SET_EVENT_MASK 5
-#define BLE_HS_STARTUP_STATE_LE_SET_EVENT_MASK_ACKED 6
-#define BLE_HS_STARTUP_STATE_LE_READ_BUF_SIZE 7
-#define BLE_HS_STARTUP_STATE_LE_READ_BUF_SIZE_ACKED 8
+#define BLE_HS_STARTUP_STATE_SET_EVMASK 2
+#define BLE_HS_STARTUP_STATE_LE_SET_EVMASK 3
+#define BLE_HS_STARTUP_STATE_LE_READ_BUF_SZ 4
+#define BLE_HS_STARTUP_STATE_MAX 5
static uint8_t ble_hs_startup_state;
+static int ble_hs_startup_reset_tx(void *arg);
+static int ble_hs_startup_set_evmask_tx(void *arg);
+static int ble_hs_startup_le_set_evmask_tx(void *arg);
+static int ble_hs_startup_le_read_buf_sz_tx(void *arg);
+
+static ble_hci_sched_tx_fn * const
+ ble_hs_startup_dispatch[BLE_HS_STARTUP_STATE_MAX] = {
+
+ [BLE_HS_STARTUP_STATE_IDLE] = NULL,
+ [BLE_HS_STARTUP_STATE_RESET] = ble_hs_startup_reset_tx,
+ [BLE_HS_STARTUP_STATE_SET_EVMASK] = ble_hs_startup_set_evmask_tx,
+ [BLE_HS_STARTUP_STATE_LE_SET_EVMASK] = ble_hs_startup_le_set_evmask_tx,
+ [BLE_HS_STARTUP_STATE_LE_READ_BUF_SZ] = ble_hs_startup_le_read_buf_sz_tx,
+};
+
static void
ble_hs_startup_failure(int status)
{
@@ -41,6 +53,42 @@ ble_hs_startup_failure(int status)
/* XXX: Signal failure. */
}
+static int
+ble_hs_startup_enqueue_tx(void)
+{
+ ble_hci_sched_tx_fn *tx_fn;
+ int rc;
+
+ if (ble_hs_startup_state == BLE_HS_STARTUP_STATE_MAX) {
+ return 0;
+ }
+
+ tx_fn = ble_hs_startup_dispatch[ble_hs_startup_state];
+ assert(tx_fn != NULL);
+
+ rc = ble_hci_sched_enqueue(tx_fn, NULL);
+ if (rc != 0) {
+ ble_hs_startup_failure(rc);
+ return rc;
+ }
+
+ return 0;
+}
+
+static void
+ble_hs_startup_gen_ack(struct ble_hci_ack *ack, void *arg)
+{
+ assert(ble_hs_startup_state < BLE_HS_STARTUP_STATE_MAX);
+
+ if (ack->bha_status != 0) {
+ ble_hs_startup_failure(ack->bha_status);
+ return;
+ }
+
+ ble_hs_startup_state++;
+ ble_hs_startup_enqueue_tx();
+}
+
static void
ble_hs_startup_read_buf_size_ack(struct ble_hci_ack *ack, void *arg)
{
@@ -48,8 +96,7 @@ ble_hs_startup_read_buf_size_ack(struct ble_hci_ack *ack, void *arg)
uint8_t max_pkts;
int rc;
- assert(ble_hs_startup_state ==
- BLE_HS_STARTUP_STATE_LE_READ_BUF_SIZE_ACKED - 1);
+ assert(ble_hs_startup_state == BLE_HS_STARTUP_STATE_LE_READ_BUF_SZ);
if (ack->bha_status != 0) {
ble_hs_startup_failure(ack->bha_status);
@@ -70,21 +117,18 @@ ble_hs_startup_read_buf_size_ack(struct ble_hci_ack *ack, void *arg)
return;
}
- ble_hs_startup_state = BLE_HS_STARTUP_STATE_LE_READ_BUF_SIZE_ACKED;
-
- /* XXX: Send read buffer size. */
+ ble_hs_startup_state++;
+ ble_hs_startup_enqueue_tx();
}
static int
-ble_hs_startup_le_read_buf_size_tx(void *arg)
+ble_hs_startup_le_read_buf_sz_tx(void *arg)
{
int rc;
- assert(ble_hs_startup_state == BLE_HS_STARTUP_STATE_LE_READ_BUF_SIZE - 1);
+ assert(ble_hs_startup_state == BLE_HS_STARTUP_STATE_LE_READ_BUF_SZ);
- ble_hs_startup_state = BLE_HS_STARTUP_STATE_LE_READ_BUF_SIZE;
ble_hci_ack_set_callback(ble_hs_startup_read_buf_size_ack, NULL);
-
rc = host_hci_cmd_le_read_buffer_size();
if (rc != 0) {
return rc;
@@ -93,39 +137,14 @@ ble_hs_startup_le_read_buf_size_tx(void *arg)
return 0;
}
-static void
-ble_hs_startup_le_set_event_mask_ack(struct ble_hci_ack *ack, void *arg)
-{
- int rc;
-
- assert(ble_hs_startup_state ==
- BLE_HS_STARTUP_STATE_LE_SET_EVENT_MASK_ACKED - 1);
-
- if (ack->bha_status != 0) {
- ble_hs_startup_failure(ack->bha_status);
- return;
- }
-
- ble_hs_startup_state = BLE_HS_STARTUP_STATE_LE_SET_EVENT_MASK_ACKED;
-
- /* XXX: Send LE Set event mask. */
- rc = ble_hci_sched_enqueue(ble_hs_startup_le_read_buf_size_tx, NULL);
- if (rc != 0) {
- ble_hs_startup_failure(rc);
- return;
- }
-}
-
static int
-ble_hs_startup_le_set_event_mask_tx(void *arg)
+ble_hs_startup_le_set_evmask_tx(void *arg)
{
int rc;
- assert(ble_hs_startup_state == BLE_HS_STARTUP_STATE_LE_SET_EVENT_MASK - 1);
-
- ble_hs_startup_state = BLE_HS_STARTUP_STATE_LE_SET_EVENT_MASK;
- ble_hci_ack_set_callback(ble_hs_startup_le_set_event_mask_ack, NULL);
+ assert(ble_hs_startup_state == BLE_HS_STARTUP_STATE_LE_SET_EVMASK);
+ ble_hci_ack_set_callback(ble_hs_startup_gen_ack, NULL);
rc = host_hci_cmd_le_set_event_mask(0x000000000000001f);
if (rc != 0) {
return rc;
@@ -134,38 +153,14 @@ ble_hs_startup_le_set_event_mask_tx(void *arg)
return 0;
}
-static void
-ble_hs_startup_set_event_mask_ack(struct ble_hci_ack *ack, void *arg)
-{
- int rc;
-
- assert(ble_hs_startup_state ==
- BLE_HS_STARTUP_STATE_SET_EVENT_MASK_ACKED - 1);
-
- if (ack->bha_status != 0) {
- ble_hs_startup_failure(ack->bha_status);
- return;
- }
-
- ble_hs_startup_state = BLE_HS_STARTUP_STATE_SET_EVENT_MASK_ACKED;
-
- rc = ble_hci_sched_enqueue(ble_hs_startup_le_set_event_mask_tx, NULL);
- if (rc != 0) {
- ble_hs_startup_failure(rc);
- return;
- }
-}
-
static int
-ble_hs_startup_set_event_mask_tx(void *arg)
+ble_hs_startup_set_evmask_tx(void *arg)
{
int rc;
- assert(ble_hs_startup_state == BLE_HS_STARTUP_STATE_SET_EVENT_MASK - 1);
-
- ble_hs_startup_state = BLE_HS_STARTUP_STATE_SET_EVENT_MASK;
- ble_hci_ack_set_callback(ble_hs_startup_set_event_mask_ack, NULL);
+ assert(ble_hs_startup_state == BLE_HS_STARTUP_STATE_SET_EVMASK);
+ ble_hci_ack_set_callback(ble_hs_startup_gen_ack, NULL);
rc = host_hci_cmd_set_event_mask(0x20001fffffffffff);
if (rc != 0) {
return rc;
@@ -174,38 +169,14 @@ ble_hs_startup_set_event_mask_tx(void *arg)
return 0;
}
-static void
-ble_hs_startup_reset_ack(struct ble_hci_ack *ack, void *arg)
-{
- int rc;
-
- assert(ble_hs_startup_state == BLE_HS_STARTUP_STATE_RESET_ACKED - 1);
-
- if (ack->bha_status != 0) {
- ble_hs_startup_failure(ack->bha_status);
- return;
- }
-
- ble_hs_startup_state = BLE_HS_STARTUP_STATE_RESET_ACKED;
-
- rc = ble_hci_sched_enqueue(ble_hs_startup_set_event_mask_tx, NULL);
- if (rc != 0) {
- ble_hs_startup_failure(rc);
- return;
- }
-}
-
-
static int
ble_hs_startup_reset_tx(void *arg)
{
int rc;
- assert(ble_hs_startup_state == BLE_HS_STARTUP_STATE_RESET - 1);
-
- ble_hs_startup_state = BLE_HS_STARTUP_STATE_RESET;
- ble_hci_ack_set_callback(ble_hs_startup_reset_ack, NULL);
+ assert(ble_hs_startup_state == BLE_HS_STARTUP_STATE_RESET);
+ ble_hci_ack_set_callback(ble_hs_startup_gen_ack, NULL);
rc = host_hci_cmd_reset();
if (rc != 0) {
return rc;
@@ -219,13 +190,8 @@ ble_hs_startup_go(void)
{
int rc;
- ble_hs_startup_state = BLE_HS_STARTUP_STATE_IDLE;
-
- rc = ble_hci_sched_enqueue(ble_hs_startup_reset_tx, NULL);
- if (rc != 0) {
- ble_hs_startup_failure(rc);
- return rc;
- }
+ ble_hs_startup_state = BLE_HS_STARTUP_STATE_RESET;
- return 0;
+ rc = ble_hs_startup_enqueue_tx();
+ return rc;
}