diff --git a/subsys/bluetooth/controller/ll_sw/ull.c b/subsys/bluetooth/controller/ll_sw/ull.c index c516f17fc2f..98ff58e1d7b 100644 --- a/subsys/bluetooth/controller/ll_sw/ull.c +++ b/subsys/bluetooth/controller/ll_sw/ull.c @@ -818,16 +818,29 @@ 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; - LL_ASSERT(!conn->lll.link_tx_free); - link = memq_deinit(&conn->lll.memq_tx.head, - &conn->lll.memq_tx.tail); + /* 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(link); - conn->lll.link_tx_free = link; + 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 d3b8454cdf6..cc5369093e7 100644 --- a/subsys/bluetooth/controller/ll_sw/ull_conn.c +++ b/subsys/bluetooth/controller/ll_sw/ull_conn.c @@ -1713,9 +1713,6 @@ 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) @@ -1743,9 +1740,6 @@ 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) {