Johnny Hughes
2019-02-04 c1f36c28393a7bb126cbf436cd6a4077a5b5c313
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
From d6bbef303a701b0bfb0cd293de227436cc084f2e Mon Sep 17 00:00:00 2001
From: Antoine Tenart <antoine.tenart@free-electrons.com>
Date: Mon, 30 Oct 2017 11:23:28 +0100
Subject: [PATCH 02/46] net: mvpp2: set the Rx FIFO size depending on the port
 speeds for PPv2.2
 
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>
(cherry picked from commit 2d1d7df8a3652697da7f7929791d555e6c5981c2)
Signed-off-by: Marcin Wojtas <mw@semihalf.com>
---
 drivers/net/ethernet/marvell/mvpp2.c | 52 +++++++++++++++++++++++++++++++-----
 1 file changed, 46 insertions(+), 6 deletions(-)
 
diff --git a/drivers/net/ethernet/marvell/mvpp2.c b/drivers/net/ethernet/marvell/mvpp2.c
index c0f7a41..80aa7f7 100644
--- a/drivers/net/ethernet/marvell/mvpp2.c
+++ b/drivers/net/ethernet/marvell/mvpp2.c
@@ -504,9 +504,13 @@
 #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 \
@@ -7768,9 +7772,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,
@@ -7874,7 +7911,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,
-- 
2.7.4