https://bugzilla.stlinux.com/
*******************************************************************************/
+#include <linux/circ_buf.h>
#include <linux/clk.h>
#include <linux/kernel.h>
#include <linux/interrupt.h>
static inline u32 stmmac_tx_avail(struct stmmac_priv *priv, u32 queue)
{
struct stmmac_tx_queue *tx_q = &priv->dma_conf.tx_queue[queue];
- u32 avail;
- if (tx_q->dirty_tx > tx_q->cur_tx)
- avail = tx_q->dirty_tx - tx_q->cur_tx - 1;
- else
- avail = priv->dma_conf.dma_tx_size - tx_q->cur_tx + tx_q->dirty_tx - 1;
-
- return avail;
+ return CIRC_SPACE(tx_q->cur_tx, tx_q->dirty_tx,
+ priv->dma_conf.dma_tx_size);
}
/**
static inline u32 stmmac_rx_dirty(struct stmmac_priv *priv, u32 queue)
{
struct stmmac_rx_queue *rx_q = &priv->dma_conf.rx_queue[queue];
- u32 dirty;
-
- if (rx_q->dirty_rx <= rx_q->cur_rx)
- dirty = rx_q->cur_rx - rx_q->dirty_rx;
- else
- dirty = priv->dma_conf.dma_rx_size - rx_q->dirty_rx + rx_q->cur_rx;
- return dirty;
+ return CIRC_CNT(rx_q->cur_rx, rx_q->dirty_rx,
+ priv->dma_conf.dma_rx_size);
}
static bool stmmac_eee_tx_busy(struct stmmac_priv *priv)
/* If we only have one entry used, then the first entry is the last
* segment.
*/
- is_last_segment = ((tx_q->cur_tx - first_entry) &
- (priv->dma_conf.dma_tx_size - 1)) == 1;
+ is_last_segment = CIRC_CNT(tx_q->cur_tx, first_entry,
+ priv->dma_conf.dma_tx_size) == 1;
/* Complete the first descriptor before granting the DMA */
stmmac_prepare_tso_tx_desc(priv, first, 1, proto_hdr_len, 0, 1,