diff options
Diffstat (limited to 'drivers/net/ethernet/stmicro/stmmac/dwmac4_lib.c')
| -rw-r--r-- | drivers/net/ethernet/stmicro/stmmac/dwmac4_lib.c | 105 | 
1 files changed, 69 insertions, 36 deletions
diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac4_lib.c b/drivers/net/ethernet/stmicro/stmmac/dwmac4_lib.c index d1c605777985..df41eac54058 100644 --- a/drivers/net/ethernet/stmicro/stmmac/dwmac4_lib.c +++ b/drivers/net/ethernet/stmicro/stmmac/dwmac4_lib.c @@ -11,6 +11,7 @@  #include "common.h"  #include "dwmac4_dma.h"  #include "dwmac4.h" +#include "stmmac.h"  int dwmac4_dma_reset(void __iomem *ioaddr)  { @@ -25,120 +26,151 @@ int dwmac4_dma_reset(void __iomem *ioaddr)  				 10000, 1000000);  } -void dwmac4_set_rx_tail_ptr(void __iomem *ioaddr, u32 tail_ptr, u32 chan) +void dwmac4_set_rx_tail_ptr(struct stmmac_priv *priv, void __iomem *ioaddr, +			    u32 tail_ptr, u32 chan)  { -	writel(tail_ptr, ioaddr + DMA_CHAN_RX_END_ADDR(chan)); +	const struct dwmac4_addrs *dwmac4_addrs = priv->plat->dwmac4_addrs; + +	writel(tail_ptr, ioaddr + DMA_CHAN_RX_END_ADDR(dwmac4_addrs, chan));  } -void dwmac4_set_tx_tail_ptr(void __iomem *ioaddr, u32 tail_ptr, u32 chan) +void dwmac4_set_tx_tail_ptr(struct stmmac_priv *priv, void __iomem *ioaddr, +			    u32 tail_ptr, u32 chan)  { -	writel(tail_ptr, ioaddr + DMA_CHAN_TX_END_ADDR(chan)); +	const struct dwmac4_addrs *dwmac4_addrs = priv->plat->dwmac4_addrs; + +	writel(tail_ptr, ioaddr + DMA_CHAN_TX_END_ADDR(dwmac4_addrs, chan));  } -void dwmac4_dma_start_tx(void __iomem *ioaddr, u32 chan) +void dwmac4_dma_start_tx(struct stmmac_priv *priv, void __iomem *ioaddr, +			 u32 chan)  { -	u32 value = readl(ioaddr + DMA_CHAN_TX_CONTROL(chan)); +	const struct dwmac4_addrs *dwmac4_addrs = priv->plat->dwmac4_addrs; +	u32 value = readl(ioaddr + DMA_CHAN_TX_CONTROL(dwmac4_addrs, chan));  	value |= DMA_CONTROL_ST; -	writel(value, ioaddr + DMA_CHAN_TX_CONTROL(chan)); +	writel(value, ioaddr + DMA_CHAN_TX_CONTROL(dwmac4_addrs, chan));  	value = readl(ioaddr + GMAC_CONFIG);  	value |= GMAC_CONFIG_TE;  	writel(value, ioaddr + GMAC_CONFIG);  } -void dwmac4_dma_stop_tx(void __iomem *ioaddr, u32 chan) +void dwmac4_dma_stop_tx(struct stmmac_priv *priv, void __iomem *ioaddr, +			u32 chan)  { -	u32 value = readl(ioaddr + DMA_CHAN_TX_CONTROL(chan)); +	const struct dwmac4_addrs *dwmac4_addrs = priv->plat->dwmac4_addrs; + +	u32 value = readl(ioaddr + DMA_CHAN_TX_CONTROL(dwmac4_addrs, chan));  	value &= ~DMA_CONTROL_ST; -	writel(value, ioaddr + DMA_CHAN_TX_CONTROL(chan)); +	writel(value, ioaddr + DMA_CHAN_TX_CONTROL(dwmac4_addrs, chan));  } -void dwmac4_dma_start_rx(void __iomem *ioaddr, u32 chan) +void dwmac4_dma_start_rx(struct stmmac_priv *priv, void __iomem *ioaddr, +			 u32 chan)  { -	u32 value = readl(ioaddr + DMA_CHAN_RX_CONTROL(chan)); +	const struct dwmac4_addrs *dwmac4_addrs = priv->plat->dwmac4_addrs; + +	u32 value = readl(ioaddr + DMA_CHAN_RX_CONTROL(dwmac4_addrs, chan));  	value |= DMA_CONTROL_SR; -	writel(value, ioaddr + DMA_CHAN_RX_CONTROL(chan)); +	writel(value, ioaddr + DMA_CHAN_RX_CONTROL(dwmac4_addrs, chan));  	value = readl(ioaddr + GMAC_CONFIG);  	value |= GMAC_CONFIG_RE;  	writel(value, ioaddr + GMAC_CONFIG);  } -void dwmac4_dma_stop_rx(void __iomem *ioaddr, u32 chan) +void dwmac4_dma_stop_rx(struct stmmac_priv *priv, void __iomem *ioaddr, +			u32 chan)  { -	u32 value = readl(ioaddr + DMA_CHAN_RX_CONTROL(chan)); +	const struct dwmac4_addrs *dwmac4_addrs = priv->plat->dwmac4_addrs; +	u32 value = readl(ioaddr + DMA_CHAN_RX_CONTROL(dwmac4_addrs, chan));  	value &= ~DMA_CONTROL_SR; -	writel(value, ioaddr + DMA_CHAN_RX_CONTROL(chan)); +	writel(value, ioaddr + DMA_CHAN_RX_CONTROL(dwmac4_addrs, chan));  } -void dwmac4_set_tx_ring_len(void __iomem *ioaddr, u32 len, u32 chan) +void dwmac4_set_tx_ring_len(struct stmmac_priv *priv, void __iomem *ioaddr, +			    u32 len, u32 chan)  { -	writel(len, ioaddr + DMA_CHAN_TX_RING_LEN(chan)); +	const struct dwmac4_addrs *dwmac4_addrs = priv->plat->dwmac4_addrs; + +	writel(len, ioaddr + DMA_CHAN_TX_RING_LEN(dwmac4_addrs, chan));  } -void dwmac4_set_rx_ring_len(void __iomem *ioaddr, u32 len, u32 chan) +void dwmac4_set_rx_ring_len(struct stmmac_priv *priv, void __iomem *ioaddr, +			    u32 len, u32 chan)  { -	writel(len, ioaddr + DMA_CHAN_RX_RING_LEN(chan)); +	const struct dwmac4_addrs *dwmac4_addrs = priv->plat->dwmac4_addrs; + +	writel(len, ioaddr + DMA_CHAN_RX_RING_LEN(dwmac4_addrs, chan));  } -void dwmac4_enable_dma_irq(void __iomem *ioaddr, u32 chan, bool rx, bool tx) +void dwmac4_enable_dma_irq(struct stmmac_priv *priv, void __iomem *ioaddr, +			   u32 chan, bool rx, bool tx)  { -	u32 value = readl(ioaddr + DMA_CHAN_INTR_ENA(chan)); +	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_DEFAULT_RX;  	if (tx)  		value |= DMA_CHAN_INTR_DEFAULT_TX; -	writel(value, ioaddr + DMA_CHAN_INTR_ENA(chan)); +	writel(value, ioaddr + DMA_CHAN_INTR_ENA(dwmac4_addrs, chan));  } -void dwmac410_enable_dma_irq(void __iomem *ioaddr, u32 chan, bool rx, bool tx) +void dwmac410_enable_dma_irq(struct stmmac_priv *priv, void __iomem *ioaddr, +			     u32 chan, bool rx, bool tx)  { -	u32 value = readl(ioaddr + DMA_CHAN_INTR_ENA(chan)); +	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_DEFAULT_RX_4_10;  	if (tx)  		value |= DMA_CHAN_INTR_DEFAULT_TX_4_10; -	writel(value, ioaddr + DMA_CHAN_INTR_ENA(chan)); +	writel(value, ioaddr + DMA_CHAN_INTR_ENA(dwmac4_addrs, chan));  } -void dwmac4_disable_dma_irq(void __iomem *ioaddr, u32 chan, bool rx, bool tx) +void dwmac4_disable_dma_irq(struct stmmac_priv *priv, void __iomem *ioaddr, +			    u32 chan, bool rx, bool tx)  { -	u32 value = readl(ioaddr + DMA_CHAN_INTR_ENA(chan)); +	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_DEFAULT_RX;  	if (tx)  		value &= ~DMA_CHAN_INTR_DEFAULT_TX; -	writel(value, ioaddr + DMA_CHAN_INTR_ENA(chan)); +	writel(value, ioaddr + DMA_CHAN_INTR_ENA(dwmac4_addrs, chan));  } -void dwmac410_disable_dma_irq(void __iomem *ioaddr, u32 chan, bool rx, bool tx) +void dwmac410_disable_dma_irq(struct stmmac_priv *priv, void __iomem *ioaddr, +			      u32 chan, bool rx, bool tx)  { -	u32 value = readl(ioaddr + DMA_CHAN_INTR_ENA(chan)); +	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_DEFAULT_RX_4_10;  	if (tx)  		value &= ~DMA_CHAN_INTR_DEFAULT_TX_4_10; -	writel(value, ioaddr + DMA_CHAN_INTR_ENA(chan)); +	writel(value, ioaddr + DMA_CHAN_INTR_ENA(dwmac4_addrs, chan));  } -int dwmac4_dma_interrupt(void __iomem *ioaddr, +int dwmac4_dma_interrupt(struct stmmac_priv *priv, void __iomem *ioaddr,  			 struct stmmac_extra_stats *x, u32 chan, u32 dir)  { -	u32 intr_status = readl(ioaddr + DMA_CHAN_STATUS(chan)); -	u32 intr_en = readl(ioaddr + DMA_CHAN_INTR_ENA(chan)); +	const struct dwmac4_addrs *dwmac4_addrs = priv->plat->dwmac4_addrs; +	u32 intr_status = readl(ioaddr + DMA_CHAN_STATUS(dwmac4_addrs, chan)); +	u32 intr_en = readl(ioaddr + DMA_CHAN_INTR_ENA(dwmac4_addrs, chan));  	int ret = 0;  	if (dir == DMA_DIR_RX) @@ -183,7 +215,8 @@ int dwmac4_dma_interrupt(void __iomem *ioaddr,  	if (unlikely(intr_status & DMA_CHAN_STATUS_ERI))  		x->rx_early_irq++; -	writel(intr_status & intr_en, ioaddr + DMA_CHAN_STATUS(chan)); +	writel(intr_status & intr_en, +	       ioaddr + DMA_CHAN_STATUS(dwmac4_addrs, chan));  	return ret;  }  |