net: stmmac: flow_ctrl functions adapted to mtl
authorJoao Pinto <Joao.Pinto@synopsys.com>
Fri, 10 Mar 2017 18:24:56 +0000 (18:24 +0000)
committerDavid S. Miller <davem@davemloft.net>
Mon, 13 Mar 2017 06:41:03 +0000 (23:41 -0700)
This patch adapts flow_ctrl function to prepare it 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/dwmac1000_core.c
drivers/net/ethernet/stmicro/stmmac/dwmac100_core.c
drivers/net/ethernet/stmicro/stmmac/dwmac4_core.c
drivers/net/ethernet/stmicro/stmmac/stmmac_ethtool.c
drivers/net/ethernet/stmicro/stmmac/stmmac_main.c

index 7d23e3dc7797686cfa57b092b9798ac2f24485c0..7a175e9893d1fa388dbc8a30ccc646d84a138295 100644 (file)
@@ -476,7 +476,7 @@ struct stmmac_ops {
        void (*set_filter)(struct mac_device_info *hw, struct net_device *dev);
        /* Flow control setting */
        void (*flow_ctrl)(struct mac_device_info *hw, unsigned int duplex,
-                         unsigned int fc, unsigned int pause_time);
+                         unsigned int fc, unsigned int pause_time, u32 tx_cnt);
        /* Set power management mode (e.g. magic frame) */
        void (*pmt)(struct mac_device_info *hw, unsigned long mode);
        /* Set/Get Unicast MAC addresses */
index 19b9b308709953cc9327961d3eb3bea527848bb7..3a95ad9357e37f493e629491aad4775b974b159a 100644 (file)
@@ -216,7 +216,8 @@ static void dwmac1000_set_filter(struct mac_device_info *hw,
 
 
 static void dwmac1000_flow_ctrl(struct mac_device_info *hw, unsigned int duplex,
-                               unsigned int fc, unsigned int pause_time)
+                               unsigned int fc, unsigned int pause_time,
+                               u32 tx_cnt)
 {
        void __iomem *ioaddr = hw->pcsr;
        /* Set flow such that DZPQ in Mac Register 6 is 0,
index e370ccec6176671d1717d24d88917b88f69b1bd2..524135e6dd89afd959e5f77842899fcbbe7cd55b 100644 (file)
@@ -131,7 +131,8 @@ static void dwmac100_set_filter(struct mac_device_info *hw,
 }
 
 static void dwmac100_flow_ctrl(struct mac_device_info *hw, unsigned int duplex,
-                              unsigned int fc, unsigned int pause_time)
+                              unsigned int fc, unsigned int pause_time,
+                              u32 tx_cnt)
 {
        void __iomem *ioaddr = hw->pcsr;
        unsigned int flow = MAC_FLOW_CTRL_ENABLE;
index e9b153f75538970060871288bff38b885f4938a3..3069defb7eb1530192dc348f01f4885d303ea121 100644 (file)
@@ -336,11 +336,12 @@ static void dwmac4_set_filter(struct mac_device_info *hw,
 }
 
 static void dwmac4_flow_ctrl(struct mac_device_info *hw, unsigned int duplex,
-                            unsigned int fc, unsigned int pause_time)
+                            unsigned int fc, unsigned int pause_time,
+                            u32 tx_cnt)
 {
        void __iomem *ioaddr = hw->pcsr;
-       u32 channel = STMMAC_CHAN0;     /* FIXME */
        unsigned int flow = 0;
+       u32 queue = 0;
 
        pr_debug("GMAC Flow-Control:\n");
        if (fc & FLOW_RX) {
@@ -350,13 +351,18 @@ static void dwmac4_flow_ctrl(struct mac_device_info *hw, unsigned int duplex,
        }
        if (fc & FLOW_TX) {
                pr_debug("\tTransmit Flow-Control ON\n");
-               flow |= GMAC_TX_FLOW_CTRL_TFE;
-               writel(flow, ioaddr + GMAC_QX_TX_FLOW_CTRL(channel));
 
-               if (duplex) {
+               if (duplex)
                        pr_debug("\tduplex mode: PAUSE %d\n", pause_time);
-                       flow |= (pause_time << GMAC_TX_FLOW_CTRL_PT_SHIFT);
-                       writel(flow, ioaddr + GMAC_QX_TX_FLOW_CTRL(channel));
+
+               for (queue = 0; queue < tx_cnt; queue++) {
+                       flow |= GMAC_TX_FLOW_CTRL_TFE;
+
+                       if (duplex)
+                               flow |=
+                               (pause_time << GMAC_TX_FLOW_CTRL_PT_SHIFT);
+
+                       writel(flow, ioaddr + GMAC_QX_TX_FLOW_CTRL(queue));
                }
        }
 }
index 85d64114e159e6d76a03fe5cca839fb246a6e0e6..4a5dc896044ff2c4edaafe5e7c17305d79c26a5f 100644 (file)
@@ -481,6 +481,7 @@ stmmac_set_pauseparam(struct net_device *netdev,
                      struct ethtool_pauseparam *pause)
 {
        struct stmmac_priv *priv = netdev_priv(netdev);
+       u32 tx_cnt = priv->plat->tx_queues_to_use;
        struct phy_device *phy = netdev->phydev;
        int new_pause = FLOW_OFF;
 
@@ -511,7 +512,7 @@ stmmac_set_pauseparam(struct net_device *netdev,
        }
 
        priv->hw->mac->flow_ctrl(priv->hw, phy->duplex, priv->flow_ctrl,
-                                priv->pause);
+                                priv->pause, tx_cnt);
        return 0;
 }
 
index e1d5fe7f54a9097e7d7d84b12f2cc3f7888de469..f453fc5a2eda4c129f05da7c0d7981323977ac72 100644 (file)
@@ -672,6 +672,19 @@ static void stmmac_release_ptp(struct stmmac_priv *priv)
        stmmac_ptp_unregister(priv);
 }
 
+/**
+ *  stmmac_mac_flow_ctrl - Configure flow control in all queues
+ *  @priv: driver private structure
+ *  Description: It is used for configuring the flow control in all queues
+ */
+static void stmmac_mac_flow_ctrl(struct stmmac_priv *priv, u32 duplex)
+{
+       u32 tx_cnt = priv->plat->tx_queues_to_use;
+
+       priv->hw->mac->flow_ctrl(priv->hw, duplex, priv->flow_ctrl,
+                                priv->pause, tx_cnt);
+}
+
 /**
  * stmmac_adjust_link - adjusts the link parameters
  * @dev: net device structure
@@ -687,7 +700,6 @@ static void stmmac_adjust_link(struct net_device *dev)
        struct phy_device *phydev = dev->phydev;
        unsigned long flags;
        int new_state = 0;
-       unsigned int fc = priv->flow_ctrl, pause_time = priv->pause;
 
        if (!phydev)
                return;
@@ -709,8 +721,7 @@ static void stmmac_adjust_link(struct net_device *dev)
                }
                /* Flow Control operation */
                if (phydev->pause)
-                       priv->hw->mac->flow_ctrl(priv->hw, phydev->duplex,
-                                                fc, pause_time);
+                       stmmac_mac_flow_ctrl(priv, phydev->duplex);
 
                if (phydev->speed != priv->speed) {
                        new_state = 1;