/*
 * 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;
}
