/*
 * Copyright (c) 2020 Demant
 *
 * SPDX-License-Identifier: Apache-2.0
 */

#include <zephyr/sys/slist.h>

struct ull_tx_q {
	uint8_t pause_data; /* Data pause state of the tx queue */

	sys_slist_t tx_list; /* Data and control node_tx list */
	sys_slist_t data_list; /* Data node_tx wait list */
};

/* Forward declaration of node_tx */
struct node_tx;

/**
 * @brief Initialize a tx queue.
 *
 * @param ull_tx_q Address of tx queue.
 */
void ull_tx_q_init(struct ull_tx_q *queue);

/**
 * @brief Pause the data path of a tx queue.
 *
 * @param ull_tx_q Address of tx queue.
 */
void ull_tx_q_pause_data(struct ull_tx_q *queue);

/**
 * @brief Resume the data path of a tx queue
 *
 * @param ull_tx_q Address of tx queue.
 */
void ull_tx_q_resume_data(struct ull_tx_q *queue);

/**
 * @brief Enqueue a tx node in the data path of a tx queue
 *
 * @param ull_tx_q Address of tx queue.
 * @param tx Address of tx node to enqueue.
 */
void ull_tx_q_enqueue_data(struct ull_tx_q *queue, struct node_tx *tx);

/**
 * @brief Enqueue a tx node in the control path of a tx queue
 *
 * @param ull_tx_q Address of tx queue.
 * @param tx Address of tx node to enqueue.
 */
void ull_tx_q_enqueue_ctrl(struct ull_tx_q *queue, struct node_tx *tx);

/**
 * @brief Peek head tx node of tx queue.
 *
 * @param ull_tx_q Address of tx queue.
 *
 * @return Head tx node of the tx queue.
 */
struct node_tx *ull_tx_q_peek(struct ull_tx_q *queue);

/**
 * @brief Dequeue a tx node from a tx queue.
 *
 * @param ull_tx_q Address of tx queue.
 *
 * @return Head tx node of the tx queue.
 */
struct node_tx *ull_tx_q_dequeue(struct ull_tx_q *queue);
