net: stmmac: rx and tx ring length prepared for multiple queues
authorJoao Pinto <Joao.Pinto@synopsys.com>
Wed, 15 Mar 2017 11:04:51 +0000 (11:04 +0000)
committerDavid S. Miller <davem@davemloft.net>
Wed, 15 Mar 2017 21:44:32 +0000 (14:44 -0700)
This patch prepares tx and rx ring length configuration for multiple queues.

Signed-off-by: Joao Pinto <jpinto@synopsys.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/stmicro/stmmac/common.h
drivers/net/ethernet/stmicro/stmmac/dwmac4_dma.h
drivers/net/ethernet/stmicro/stmmac/dwmac4_lib.c
drivers/net/ethernet/stmicro/stmmac/stmmac_main.c

index 5fa23b1..bef1fc6 100644 (file)
@@ -444,8 +444,8 @@ struct stmmac_dma_ops {
                               struct dma_features *dma_cap);
        /* Program the HW RX Watchdog */
        void (*rx_watchdog)(void __iomem *ioaddr, u32 riwt, u32 number_chan);
-       void (*set_tx_ring_len)(void __iomem *ioaddr, u32 len);
-       void (*set_rx_ring_len)(void __iomem *ioaddr, u32 len);
+       void (*set_tx_ring_len)(void __iomem *ioaddr, u32 len, u32 chan);
+       void (*set_rx_ring_len)(void __iomem *ioaddr, u32 len, u32 chan);
        void (*set_rx_tail_ptr)(void __iomem *ioaddr, u32 tail_ptr, u32 chan);
        void (*set_tx_tail_ptr)(void __iomem *ioaddr, u32 tail_ptr, u32 chan);
        void (*enable_tso)(void __iomem *ioaddr, bool en, u32 chan);
index 946dc14..8474bf9 100644 (file)
@@ -194,8 +194,8 @@ void dwmac4_dma_start_rx(void __iomem *ioaddr, u32 chan);
 void dwmac4_dma_stop_rx(void __iomem *ioaddr, u32 chan);
 int dwmac4_dma_interrupt(void __iomem *ioaddr,
                         struct stmmac_extra_stats *x, u32 chan);
-void dwmac4_set_rx_ring_len(void __iomem *ioaddr, u32 len);
-void dwmac4_set_tx_ring_len(void __iomem *ioaddr, u32 len);
+void dwmac4_set_rx_ring_len(void __iomem *ioaddr, u32 len, u32 chan);
+void dwmac4_set_tx_ring_len(void __iomem *ioaddr, u32 len, u32 chan);
 void dwmac4_set_rx_tail_ptr(void __iomem *ioaddr, u32 tail_ptr, u32 chan);
 void dwmac4_set_tx_tail_ptr(void __iomem *ioaddr, u32 tail_ptr, u32 chan);
 
index fcd8ec8..da54c0b 100644 (file)
@@ -94,14 +94,14 @@ void dwmac4_dma_stop_rx(void __iomem *ioaddr, u32 chan)
        writel(value, ioaddr + GMAC_CONFIG);
 }
 
-void dwmac4_set_tx_ring_len(void __iomem *ioaddr, u32 len)
+void dwmac4_set_tx_ring_len(void __iomem *ioaddr, u32 len, u32 chan)
 {
-       writel(len, ioaddr + DMA_CHAN_TX_RING_LEN(STMMAC_CHAN0));
+       writel(len, ioaddr + DMA_CHAN_TX_RING_LEN(chan));
 }
 
-void dwmac4_set_rx_ring_len(void __iomem *ioaddr, u32 len)
+void dwmac4_set_rx_ring_len(void __iomem *ioaddr, u32 len, u32 chan)
 {
-       writel(len, ioaddr + DMA_CHAN_RX_RING_LEN(STMMAC_CHAN0));
+       writel(len, ioaddr + DMA_CHAN_RX_RING_LEN(chan));
 }
 
 void dwmac4_enable_dma_irq(void __iomem *ioaddr, u32 chan)
index 00d0f5e..26695d9 100644 (file)
@@ -1802,6 +1802,27 @@ static void stmmac_init_tx_coalesce(struct stmmac_priv *priv)
        add_timer(&priv->txtimer);
 }
 
+static void stmmac_set_rings_length(struct stmmac_priv *priv)
+{
+       u32 rx_channels_count = priv->plat->rx_queues_to_use;
+       u32 tx_channels_count = priv->plat->tx_queues_to_use;
+       u32 chan;
+
+       /* set TX ring length */
+       if (priv->hw->dma->set_tx_ring_len) {
+               for (chan = 0; chan < tx_channels_count; chan++)
+                       priv->hw->dma->set_tx_ring_len(priv->ioaddr,
+                                                      (DMA_TX_SIZE - 1), chan);
+       }
+
+       /* set RX ring length */
+       if (priv->hw->dma->set_rx_ring_len) {
+               for (chan = 0; chan < rx_channels_count; chan++)
+                       priv->hw->dma->set_rx_ring_len(priv->ioaddr,
+                                                      (DMA_RX_SIZE - 1), chan);
+       }
+}
+
 /**
  *  stmmac_set_tx_queue_weight - Set TX queue weight
  *  @priv: driver private structure
@@ -1995,14 +2016,9 @@ static int stmmac_hw_setup(struct net_device *dev, bool init_ptp)
        if (priv->hw->pcs && priv->hw->mac->pcs_ctrl_ane)
                priv->hw->mac->pcs_ctrl_ane(priv->hw, 1, priv->hw->ps, 0);
 
-       /*  set TX ring length */
-       if (priv->hw->dma->set_tx_ring_len)
-               priv->hw->dma->set_tx_ring_len(priv->ioaddr,
-                                              (DMA_TX_SIZE - 1));
-       /*  set RX ring length */
-       if (priv->hw->dma->set_rx_ring_len)
-               priv->hw->dma->set_rx_ring_len(priv->ioaddr,
-                                              (DMA_RX_SIZE - 1));
+       /* set TX and RX rings length */
+       stmmac_set_rings_length(priv);
+
        /* Enable TSO */
        if (priv->tso)
                priv->hw->dma->enable_tso(priv->ioaddr, 1, STMMAC_CHAN0);