@@ -347,13 +347,13 @@ static void sun8i_dwmac_dump_mac_regs(struct mac_device_info *hw,
static void sun8i_dwmac_enable_dma_irq(struct stmmac_priv *priv,
void __iomem *ioaddr, u32 chan,
- bool rx, bool tx)
+ u32 flags)
{
u32 value = readl(ioaddr + EMAC_INT_EN);
- if (rx)
+ if (flags & STMMAC_DMA_IRQ_RX)
value |= EMAC_RX_INT;
- if (tx)
+ if (flags & STMMAC_DMA_IRQ_TX)
value |= EMAC_TX_INT;
writel(value, ioaddr + EMAC_INT_EN);
@@ -361,13 +361,13 @@ static void sun8i_dwmac_enable_dma_irq(struct stmmac_priv *priv,
static void sun8i_dwmac_disable_dma_irq(struct stmmac_priv *priv,
void __iomem *ioaddr, u32 chan,
- bool rx, bool tx)
+ u32 flags)
{
u32 value = readl(ioaddr + EMAC_INT_EN);
- if (rx)
+ if (flags & STMMAC_DMA_IRQ_RX)
value &= ~EMAC_RX_INT;
- if (tx)
+ if (flags & STMMAC_DMA_IRQ_TX)
value &= ~EMAC_TX_INT;
writel(value, ioaddr + EMAC_INT_EN);
@@ -175,9 +175,9 @@ static inline u32 dma_chanx_base_addr(const struct dwmac4_addrs *addrs,
int dwmac4_dma_reset(void __iomem *ioaddr);
void dwmac4_enable_dma_irq(struct stmmac_priv *priv, void __iomem *ioaddr,
- u32 chan, bool rx, bool tx);
+ u32 chan, u32 group);
void dwmac4_disable_dma_irq(struct stmmac_priv *priv, void __iomem *ioaddr,
- u32 chan, bool rx, bool tx);
+ u32 chan, u32 group);
void dwmac4_dma_start_tx(struct stmmac_priv *priv, void __iomem *ioaddr,
u32 chan);
void dwmac4_dma_stop_tx(struct stmmac_priv *priv, void __iomem *ioaddr,
@@ -109,30 +109,39 @@ void dwmac4_set_rx_ring_len(struct stmmac_priv *priv, void __iomem *ioaddr,
writel(len, ioaddr + DMA_CHAN_RX_RING_LEN(dwmac4_addrs, chan));
}
+static u32 dwmac4_enable_dma_mask(u32 group)
+{
+ u32 mask = 0;
+
+ if (group & STMMAC_DMA_IRQ_RX)
+ mask |= DMA_CHAN_INTR_ENA_RIE;
+ if (group & STMMAC_DMA_IRQ_TX)
+ mask |= DMA_CHAN_INTR_ENA_TIE;
+ if (group & STMMAC_DMA_IRQ_OTHER)
+ mask |= DMA_CHAN_INTR_DEFAULT_MASK &
+ ~(DMA_CHAN_INTR_ENA_RIE | DMA_CHAN_INTR_ENA_TIE);
+
+ return mask;
+}
+
void dwmac4_enable_dma_irq(struct stmmac_priv *priv, void __iomem *ioaddr,
- u32 chan, bool rx, bool tx)
+ u32 chan, u32 group)
{
const struct dwmac4_addrs *dwmac4_addrs = priv->plat->dwmac4_addrs;
u32 value = readl(ioaddr + DMA_CHAN_INTR_ENA(dwmac4_addrs, chan));
- if (rx)
- value |= DMA_CHAN_INTR_ENA_RIE;
- if (tx)
- value |= DMA_CHAN_INTR_ENA_TIE;
+ value |= dwmac4_enable_dma_mask(group);
writel(value, ioaddr + DMA_CHAN_INTR_ENA(dwmac4_addrs, chan));
}
void dwmac4_disable_dma_irq(struct stmmac_priv *priv, void __iomem *ioaddr,
- u32 chan, bool rx, bool tx)
+ u32 chan, u32 group)
{
const struct dwmac4_addrs *dwmac4_addrs = priv->plat->dwmac4_addrs;
u32 value = readl(ioaddr + DMA_CHAN_INTR_ENA(dwmac4_addrs, chan));
- if (rx)
- value &= ~DMA_CHAN_INTR_ENA_RIE;
- if (tx)
- value &= ~DMA_CHAN_INTR_ENA_TIE;
+ value &= ~dwmac4_enable_dma_mask(group);
writel(value, ioaddr + DMA_CHAN_INTR_ENA(dwmac4_addrs, chan));
}
@@ -145,9 +145,9 @@ static inline u32 dma_chan_base_addr(u32 base, u32 chan)
void dwmac_enable_dma_transmission(void __iomem *ioaddr, u32 chan);
void dwmac_enable_dma_reception(void __iomem *ioaddr, u32 chan);
void dwmac_enable_dma_irq(struct stmmac_priv *priv, void __iomem *ioaddr,
- u32 chan, bool rx, bool tx);
+ u32 chan, u32 group);
void dwmac_disable_dma_irq(struct stmmac_priv *priv, void __iomem *ioaddr,
- u32 chan, bool rx, bool tx);
+ u32 chan, u32 group);
void dwmac_dma_start_tx(struct stmmac_priv *priv, void __iomem *ioaddr,
u32 chan);
void dwmac_dma_stop_tx(struct stmmac_priv *priv, void __iomem *ioaddr,
@@ -38,28 +38,37 @@ void dwmac_enable_dma_reception(void __iomem *ioaddr, u32 chan)
writel(1, ioaddr + DMA_CHAN_RCV_POLL_DEMAND(chan));
}
+static u32 dwmac_enable_dma_mask(u32 group)
+{
+ u32 mask = 0;
+
+ if (group & STMMAC_DMA_IRQ_RX)
+ mask |= DMA_INTR_DEFAULT_RX;
+ if (group & STMMAC_DMA_IRQ_TX)
+ mask |= DMA_INTR_DEFAULT_TX;
+ if (group & STMMAC_DMA_IRQ_OTHER)
+ mask |= DMA_INTR_DEFAULT_MASK &
+ ~(DMA_INTR_DEFAULT_RX | DMA_INTR_DEFAULT_TX);
+
+ return mask;
+}
+
void dwmac_enable_dma_irq(struct stmmac_priv *priv, void __iomem *ioaddr,
- u32 chan, bool rx, bool tx)
+ u32 chan, u32 group)
{
u32 value = readl(ioaddr + DMA_CHAN_INTR_ENA(chan));
- if (rx)
- value |= DMA_INTR_DEFAULT_RX;
- if (tx)
- value |= DMA_INTR_DEFAULT_TX;
+ value |= dwmac_enable_dma_mask(group);
writel(value, ioaddr + DMA_CHAN_INTR_ENA(chan));
}
void dwmac_disable_dma_irq(struct stmmac_priv *priv, void __iomem *ioaddr,
- u32 chan, bool rx, bool tx)
+ u32 chan, u32 group)
{
u32 value = readl(ioaddr + DMA_CHAN_INTR_ENA(chan));
- if (rx)
- value &= ~DMA_INTR_DEFAULT_RX;
- if (tx)
- value &= ~DMA_INTR_DEFAULT_TX;
+ value &= ~dwmac_enable_dma_mask(group);
writel(value, ioaddr + DMA_CHAN_INTR_ENA(chan));
}
@@ -228,30 +228,39 @@ static void dwxgmac2_dma_tx_mode(struct stmmac_priv *priv, void __iomem *ioaddr,
writel(value, ioaddr + XGMAC_MTL_TXQ_OPMODE(channel));
}
+static u32 dwxgmac2_enable_dma_mask(u32 group)
+{
+ u32 mask = 0;
+
+ if (group & STMMAC_DMA_IRQ_RX)
+ mask |= XGMAC_DMA_INT_DEFAULT_RX;
+ if (group & STMMAC_DMA_IRQ_TX)
+ mask |= XGMAC_DMA_INT_DEFAULT_TX;
+ if (group & STMMAC_DMA_IRQ_OTHER)
+ mask |= XGMAC_DMA_INT_DEFAULT_EN &
+ ~(XGMAC_DMA_INT_DEFAULT_RX | XGMAC_DMA_INT_DEFAULT_TX);
+
+ return mask;
+}
+
static void dwxgmac2_enable_dma_irq(struct stmmac_priv *priv,
void __iomem *ioaddr, u32 chan,
- bool rx, bool tx)
+ u32 group)
{
u32 value = readl(ioaddr + XGMAC_DMA_CH_INT_EN(chan));
- if (rx)
- value |= XGMAC_DMA_INT_DEFAULT_RX;
- if (tx)
- value |= XGMAC_DMA_INT_DEFAULT_TX;
+ value |= dwxgmac2_enable_dma_mask(group);
writel(value, ioaddr + XGMAC_DMA_CH_INT_EN(chan));
}
static void dwxgmac2_disable_dma_irq(struct stmmac_priv *priv,
void __iomem *ioaddr, u32 chan,
- bool rx, bool tx)
+ u32 group)
{
u32 value = readl(ioaddr + XGMAC_DMA_CH_INT_EN(chan));
- if (rx)
- value &= ~XGMAC_DMA_INT_DEFAULT_RX;
- if (tx)
- value &= ~XGMAC_DMA_INT_DEFAULT_TX;
+ value &= ~dwxgmac2_enable_dma_mask(group);
writel(value, ioaddr + XGMAC_DMA_CH_INT_EN(chan));
}
@@ -163,6 +163,12 @@ struct stmmac_desc_ops {
struct stmmac_dma_cfg;
struct dma_features;
+#define STMMAC_DMA_IRQ_RX BIT(0)
+#define STMMAC_DMA_IRQ_TX BIT(1)
+#define STMMAC_DMA_IRQ_OTHER BIT(2)
+#define STMMAC_DMA_IRQ_TXRX (STMMAC_DMA_IRQ_TX | STMMAC_DMA_IRQ_RX)
+#define STMMAC_DMA_IRQ_ALL (STMMAC_DMA_IRQ_TXRX | STMMAC_DMA_IRQ_OTHER)
+
/* Specific DMA helpers */
struct stmmac_dma_ops {
/* DMA core initialization */
@@ -194,9 +200,9 @@ struct stmmac_dma_ops {
void (*enable_dma_transmission)(void __iomem *ioaddr, u32 chan);
void (*enable_dma_reception)(void __iomem *ioaddr, u32 chan);
void (*enable_dma_irq)(struct stmmac_priv *priv, void __iomem *ioaddr,
- u32 chan, bool rx, bool tx);
+ u32 chan, u32 group);
void (*disable_dma_irq)(struct stmmac_priv *priv, void __iomem *ioaddr,
- u32 chan, bool rx, bool tx);
+ u32 chan, u32 group);
void (*start_tx)(struct stmmac_priv *priv, void __iomem *ioaddr,
u32 chan);
void (*stop_tx)(struct stmmac_priv *priv, void __iomem *ioaddr,
@@ -2515,7 +2515,7 @@ static void stmmac_enable_all_dma_irq(struct stmmac_priv *priv)
unsigned long flags;
spin_lock_irqsave(&ch->lock, flags);
- stmmac_enable_dma_irq(priv, priv->ioaddr, chan, 1, 1);
+ stmmac_enable_dma_irq(priv, priv->ioaddr, chan, STMMAC_DMA_IRQ_ALL);
spin_unlock_irqrestore(&ch->lock, flags);
}
}
@@ -3088,7 +3088,7 @@ static int stmmac_napi_check(struct stmmac_priv *priv, u32 chan, u32 dir)
if ((status & handle_rx) && (chan < priv->plat->rx_queues_to_use)) {
if (napi_schedule_prep(rx_napi)) {
spin_lock_irqsave(&ch->lock, flags);
- stmmac_disable_dma_irq(priv, priv->ioaddr, chan, 1, 0);
+ stmmac_disable_dma_irq(priv, priv->ioaddr, chan, STMMAC_DMA_IRQ_RX);
spin_unlock_irqrestore(&ch->lock, flags);
__napi_schedule(rx_napi);
}
@@ -3097,7 +3097,7 @@ static int stmmac_napi_check(struct stmmac_priv *priv, u32 chan, u32 dir)
if ((status & handle_tx) && (chan < priv->plat->tx_queues_to_use)) {
if (napi_schedule_prep(tx_napi)) {
spin_lock_irqsave(&ch->lock, flags);
- stmmac_disable_dma_irq(priv, priv->ioaddr, chan, 0, 1);
+ stmmac_disable_dma_irq(priv, priv->ioaddr, chan, STMMAC_DMA_IRQ_TX);
spin_unlock_irqrestore(&ch->lock, flags);
__napi_schedule(tx_napi);
}
@@ -3291,7 +3291,7 @@ static int stmmac_init_dma_engine(struct stmmac_priv *priv)
/* DMA CSR Channel configuration */
for (chan = 0; chan < dma_csr_ch; chan++) {
stmmac_init_chan(priv, priv->ioaddr, priv->plat->dma_cfg, chan);
- stmmac_disable_dma_irq(priv, priv->ioaddr, chan, 1, 1);
+ stmmac_disable_dma_irq(priv, priv->ioaddr, chan, STMMAC_DMA_IRQ_TXRX);
}
/* DMA RX Channel Configuration */
@@ -3365,7 +3365,7 @@ static enum hrtimer_restart stmmac_tx_timer(struct hrtimer *t)
unsigned long flags;
spin_lock_irqsave(&ch->lock, flags);
- stmmac_disable_dma_irq(priv, priv->ioaddr, ch->index, 0, 1);
+ stmmac_disable_dma_irq(priv, priv->ioaddr, ch->index, STMMAC_DMA_IRQ_TX);
spin_unlock_irqrestore(&ch->lock, flags);
__napi_schedule(napi);
}
@@ -6013,7 +6013,7 @@ static int stmmac_napi_poll_rx(struct napi_struct *napi, int budget)
unsigned long flags;
spin_lock_irqsave(&ch->lock, flags);
- stmmac_enable_dma_irq(priv, priv->ioaddr, chan, 1, 0);
+ stmmac_enable_dma_irq(priv, priv->ioaddr, chan, STMMAC_DMA_IRQ_RX);
spin_unlock_irqrestore(&ch->lock, flags);
}
@@ -6042,7 +6042,7 @@ static int stmmac_napi_poll_tx(struct napi_struct *napi, int budget)
unsigned long flags;
spin_lock_irqsave(&ch->lock, flags);
- stmmac_enable_dma_irq(priv, priv->ioaddr, chan, 0, 1);
+ stmmac_enable_dma_irq(priv, priv->ioaddr, chan, STMMAC_DMA_IRQ_TX);
spin_unlock_irqrestore(&ch->lock, flags);
}
@@ -6095,7 +6095,7 @@ static int stmmac_napi_poll_rxtx(struct napi_struct *napi, int budget)
/* Both RX and TX work done are complete,
* so enable both RX & TX IRQs.
*/
- stmmac_enable_dma_irq(priv, priv->ioaddr, chan, 1, 1);
+ stmmac_enable_dma_irq(priv, priv->ioaddr, chan, STMMAC_DMA_IRQ_TXRX);
spin_unlock_irqrestore(&ch->lock, flags);
}
@@ -7032,7 +7032,7 @@ void stmmac_disable_rx_queue(struct stmmac_priv *priv, u32 queue)
unsigned long flags;
spin_lock_irqsave(&ch->lock, flags);
- stmmac_disable_dma_irq(priv, priv->ioaddr, queue, 1, 0);
+ stmmac_disable_dma_irq(priv, priv->ioaddr, queue, STMMAC_DMA_IRQ_RX);
spin_unlock_irqrestore(&ch->lock, flags);
stmmac_stop_rx_dma(priv, queue);
@@ -7072,7 +7072,7 @@ void stmmac_enable_rx_queue(struct stmmac_priv *priv, u32 queue)
stmmac_start_rx_dma(priv, queue);
spin_lock_irqsave(&ch->lock, flags);
- stmmac_enable_dma_irq(priv, priv->ioaddr, queue, 1, 0);
+ stmmac_enable_dma_irq(priv, priv->ioaddr, queue, STMMAC_DMA_IRQ_RX);
spin_unlock_irqrestore(&ch->lock, flags);
}
@@ -7082,7 +7082,7 @@ void stmmac_disable_tx_queue(struct stmmac_priv *priv, u32 queue)
unsigned long flags;
spin_lock_irqsave(&ch->lock, flags);
- stmmac_disable_dma_irq(priv, priv->ioaddr, queue, 0, 1);
+ stmmac_disable_dma_irq(priv, priv->ioaddr, queue, STMMAC_DMA_IRQ_TX);
spin_unlock_irqrestore(&ch->lock, flags);
stmmac_stop_tx_dma(priv, queue);
@@ -7123,7 +7123,7 @@ void stmmac_enable_tx_queue(struct stmmac_priv *priv, u32 queue)
stmmac_start_tx_dma(priv, queue);
spin_lock_irqsave(&ch->lock, flags);
- stmmac_enable_dma_irq(priv, priv->ioaddr, queue, 0, 1);
+ stmmac_enable_dma_irq(priv, priv->ioaddr, queue, STMMAC_DMA_IRQ_TX);
spin_unlock_irqrestore(&ch->lock, flags);
}
@@ -7191,7 +7191,7 @@ int stmmac_xdp_open(struct net_device *dev)
/* DMA CSR Channel configuration */
for (chan = 0; chan < dma_csr_ch; chan++) {
stmmac_init_chan(priv, priv->ioaddr, priv->plat->dma_cfg, chan);
- stmmac_disable_dma_irq(priv, priv->ioaddr, chan, 1, 1);
+ stmmac_disable_dma_irq(priv, priv->ioaddr, chan, STMMAC_DMA_IRQ_TXRX);
}
/* Adjust Split header */