zephyr/subsys/bluetooth/controller/ll_sw/ull_tx_queue.c
Thomas Ebert Hansen 79092c3cf4 Bluetooth: controller: Rework TX data pause
Change LLCP TX data pause into using mask to allow for pausing from
multiple different sources - but only once per source
(the underlying TX queue still just has an integer counter).

Signed-off-by: Erik Brockhoff <erbr@oticon.com>
Signed-off-by: Thomas Ebert Hansen <thoh@oticon.com>
2022-04-04 15:34:09 +02:00

71 lines
1.4 KiB
C

/*
* Copyright (c) 2020 Demant
*
* SPDX-License-Identifier: Apache-2.0
*/
#include "ull_tx_queue.h"
void ull_tx_q_init(struct ull_tx_q *queue)
{
queue->pause_data = 0U;
sys_slist_init(&queue->tx_list);
sys_slist_init(&queue->data_list);
}
void ull_tx_q_pause_data(struct ull_tx_q *queue)
{
queue->pause_data++;
}
void ull_tx_q_resume_data(struct ull_tx_q *queue)
{
if (queue->pause_data > 0) {
queue->pause_data--;
}
/* move all paused data to the tail of tx list, only if not empty and no longer paused */
if (!queue->pause_data && !sys_slist_is_empty(&queue->data_list)) {
sys_slist_merge_slist(&queue->tx_list, &queue->data_list);
}
}
void ull_tx_q_enqueue_data(struct ull_tx_q *queue, struct node_tx *tx)
{
sys_slist_t *list;
if (queue->pause_data) {
/* enqueue data pdu into paused data wait list */
list = &queue->data_list;
} else {
/* enqueue data pdu into tx list */
list = &queue->tx_list;
}
sys_slist_append(list, (sys_snode_t *)tx);
}
void ull_tx_q_enqueue_ctrl(struct ull_tx_q *queue, struct node_tx *tx)
{
/* enqueue ctrl pdu into tx list */
sys_slist_append(&queue->tx_list, (sys_snode_t *)tx);
}
struct node_tx *ull_tx_q_peek(struct ull_tx_q *queue)
{
struct node_tx *tx;
tx = (struct node_tx *)sys_slist_peek_head(&queue->tx_list);
return tx;
}
struct node_tx *ull_tx_q_dequeue(struct ull_tx_q *queue)
{
struct node_tx *tx;
tx = (struct node_tx *)sys_slist_get(&queue->tx_list);
return tx;
}