diff --git a/subsys/bluetooth/controller/ll_sw/ull.c b/subsys/bluetooth/controller/ll_sw/ull.c index 335c4667c85..7feffc7845c 100644 --- a/subsys/bluetooth/controller/ll_sw/ull.c +++ b/subsys/bluetooth/controller/ll_sw/ull.c @@ -828,29 +828,16 @@ void ll_rx_mem_release(void **node_rx) case NODE_RX_TYPE_TERMINATE: { struct ll_conn *conn; - struct lll_conn *lll; memq_link_t *link; - /* Get the connection context */ conn = ll_conn_get(rx_free->handle); - lll = &conn->lll; - /* Invalidate the connection context */ - lll->handle = 0xFFFF; - - /* Demux and flush Tx PDUs that remain enqueued in - * thread context - */ - ull_conn_tx_demux(UINT8_MAX); - - /* De-initialize tx memq and release the used link */ - LL_ASSERT(!lll->link_tx_free); - link = memq_deinit(&lll->memq_tx.head, - &lll->memq_tx.tail); + LL_ASSERT(!conn->lll.link_tx_free); + link = memq_deinit(&conn->lll.memq_tx.head, + &conn->lll.memq_tx.tail); LL_ASSERT(link); - lll->link_tx_free = link; + conn->lll.link_tx_free = link; - /* Release the connection context to free pool */ ll_conn_release(conn); } break; diff --git a/subsys/bluetooth/controller/ll_sw/ull_conn.c b/subsys/bluetooth/controller/ll_sw/ull_conn.c index 76b206dcbb1..d2ad79a85e9 100644 --- a/subsys/bluetooth/controller/ll_sw/ull_conn.c +++ b/subsys/bluetooth/controller/ll_sw/ull_conn.c @@ -1713,6 +1713,9 @@ static void conn_cleanup(struct ll_conn *conn, u8_t reason) ticker_op_stop_cb, (void *)lll); LL_ASSERT((ticker_status == TICKER_STATUS_SUCCESS) || (ticker_status == TICKER_STATUS_BUSY)); + + /* Demux and flush Tx PDUs that remain enqueued in thread context */ + ull_conn_tx_demux(UINT8_MAX); } static void tx_ull_flush(struct ll_conn *conn) @@ -1740,6 +1743,9 @@ static void tx_lll_flush(void *param) lll_conn_flush(lll); + /* Invalidate the connection context */ + lll->handle = 0xFFFF; + link = memq_dequeue(lll->memq_tx.tail, &lll->memq_tx.head, (void **)&tx); while (link) {