net: mvpp2: set the Rx FIFO size depending on the port speeds for PPv2.2
authorAntoine Tenart <antoine.tenart@free-electrons.com>
Mon, 30 Oct 2017 10:23:28 +0000 (11:23 +0100)
committerDavid S. Miller <davem@davemloft.net>
Wed, 1 Nov 2017 03:28:32 +0000 (12:28 +0900)
The Rx FIFO size was set to the same value for all ports. This patch
sets it depending on the maximum speed a given port can handle. This is
only working for PPv2.2.

Signed-off-by: Antoine Tenart <antoine.tenart@free-electrons.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/marvell/mvpp2.c

index 794a3b6..2b0ae35 100644 (file)
 #define MVPP2_TX_DESC_ALIGN            (MVPP2_DESC_ALIGNED_SIZE - 1)
 
 /* RX FIFO constants */
-#define MVPP2_RX_FIFO_PORT_DATA_SIZE   0x2000
-#define MVPP2_RX_FIFO_PORT_ATTR_SIZE   0x80
-#define MVPP2_RX_FIFO_PORT_MIN_PKT     0x80
+#define MVPP2_RX_FIFO_PORT_DATA_SIZE_32KB      0x8000
+#define MVPP2_RX_FIFO_PORT_DATA_SIZE_8KB       0x2000
+#define MVPP2_RX_FIFO_PORT_DATA_SIZE_4KB       0x1000
+#define MVPP2_RX_FIFO_PORT_ATTR_SIZE_32KB      0x200
+#define MVPP2_RX_FIFO_PORT_ATTR_SIZE_8KB       0x80
+#define MVPP2_RX_FIFO_PORT_ATTR_SIZE_4KB       0x40
+#define MVPP2_RX_FIFO_PORT_MIN_PKT             0x80
 
 /* RX buffer constants */
 #define MVPP2_SKB_SHINFO_SIZE \
@@ -7764,9 +7768,42 @@ static void mvpp2_rx_fifo_init(struct mvpp2 *priv)
 
        for (port = 0; port < MVPP2_MAX_PORTS; port++) {
                mvpp2_write(priv, MVPP2_RX_DATA_FIFO_SIZE_REG(port),
-                           MVPP2_RX_FIFO_PORT_DATA_SIZE);
+                           MVPP2_RX_FIFO_PORT_DATA_SIZE_4KB);
                mvpp2_write(priv, MVPP2_RX_ATTR_FIFO_SIZE_REG(port),
-                           MVPP2_RX_FIFO_PORT_ATTR_SIZE);
+                           MVPP2_RX_FIFO_PORT_ATTR_SIZE_4KB);
+       }
+
+       mvpp2_write(priv, MVPP2_RX_MIN_PKT_SIZE_REG,
+                   MVPP2_RX_FIFO_PORT_MIN_PKT);
+       mvpp2_write(priv, MVPP2_RX_FIFO_INIT_REG, 0x1);
+}
+
+static void mvpp22_rx_fifo_init(struct mvpp2 *priv)
+{
+       int port;
+
+       /* The FIFO size parameters are set depending on the maximum speed a
+        * given port can handle:
+        * - Port 0: 10Gbps
+        * - Port 1: 2.5Gbps
+        * - Ports 2 and 3: 1Gbps
+        */
+
+       mvpp2_write(priv, MVPP2_RX_DATA_FIFO_SIZE_REG(0),
+                   MVPP2_RX_FIFO_PORT_DATA_SIZE_32KB);
+       mvpp2_write(priv, MVPP2_RX_ATTR_FIFO_SIZE_REG(0),
+                   MVPP2_RX_FIFO_PORT_ATTR_SIZE_32KB);
+
+       mvpp2_write(priv, MVPP2_RX_DATA_FIFO_SIZE_REG(1),
+                   MVPP2_RX_FIFO_PORT_DATA_SIZE_8KB);
+       mvpp2_write(priv, MVPP2_RX_ATTR_FIFO_SIZE_REG(1),
+                   MVPP2_RX_FIFO_PORT_ATTR_SIZE_8KB);
+
+       for (port = 2; port < MVPP2_MAX_PORTS; port++) {
+               mvpp2_write(priv, MVPP2_RX_DATA_FIFO_SIZE_REG(port),
+                           MVPP2_RX_FIFO_PORT_DATA_SIZE_4KB);
+               mvpp2_write(priv, MVPP2_RX_ATTR_FIFO_SIZE_REG(port),
+                           MVPP2_RX_FIFO_PORT_ATTR_SIZE_4KB);
        }
 
        mvpp2_write(priv, MVPP2_RX_MIN_PKT_SIZE_REG,
@@ -7870,7 +7907,10 @@ static int mvpp2_init(struct platform_device *pdev, struct mvpp2 *priv)
        }
 
        /* Rx Fifo Init */
-       mvpp2_rx_fifo_init(priv);
+       if (priv->hw_version == MVPP21)
+               mvpp2_rx_fifo_init(priv);
+       else
+               mvpp22_rx_fifo_init(priv);
 
        if (priv->hw_version == MVPP21)
                writel(MVPP2_EXT_GLOBAL_CTRL_DEFAULT,