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
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
From 3a858388746ad5cbea5a215147f341a066579211 Mon Sep 17 00:00:00 2001
From: Maxime Chevallier <maxime.chevallier@bootlin.com>
Date: Mon, 26 Mar 2018 15:34:22 +0200
Subject: [PATCH 39/46] net: mvpp2: Make mvpp2_prs_hw_read a parser entry init
 function
 
The mvpp2_prs_hw_read function uses the 'index' field of the struct
mvpp2_prs_entry to initialize the rest of the fields. This makes it
unclear from a caller's perspective, who needs to manipulate a struct
that is not entirely initialized.
 
This commit makes it an init function for prs_entry, by passing it the
index as a parameter. The function now zeroes the entry, and sets the
index field before doing all other init from HW.
 
The function is renamed 'mvpp2_prs_init_from_hw' to make that clear.
 
Signed-off-by: Maxime Chevallier <maxime.chevallier@bootlin.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
(cherry picked from commit 47e0e14eb1a688c0868385e02db263093d2df6db)
Signed-off-by: Marcin Wojtas <mw@semihalf.com>
---
 drivers/net/ethernet/marvell/mvpp2.c | 48 ++++++++++++++----------------------
 1 file changed, 19 insertions(+), 29 deletions(-)
 
diff --git a/drivers/net/ethernet/marvell/mvpp2.c b/drivers/net/ethernet/marvell/mvpp2.c
index f8bc3d4..f51dcb3 100644
--- a/drivers/net/ethernet/marvell/mvpp2.c
+++ b/drivers/net/ethernet/marvell/mvpp2.c
@@ -1582,14 +1582,18 @@ static int mvpp2_prs_hw_write(struct mvpp2 *priv, struct mvpp2_prs_entry *pe)
     return 0;
 }
 
-/* Read tcam entry from hw */
-static int mvpp2_prs_hw_read(struct mvpp2 *priv, struct mvpp2_prs_entry *pe)
+/* Initialize tcam entry from hw */
+static int mvpp2_prs_init_from_hw(struct mvpp2 *priv,
+                  struct mvpp2_prs_entry *pe, int tid)
 {
     int i;
 
     if (pe->index > MVPP2_PRS_TCAM_SRAM_SIZE - 1)
         return -EINVAL;
 
+    memset(pe, 0, sizeof(*pe));
+    pe->index = tid;
+
     /* Write tcam index - indirect access */
     mvpp2_write(priv, MVPP2_PRS_TCAM_IDX_REG, pe->index);
 
@@ -1931,8 +1935,7 @@ static struct mvpp2_prs_entry *mvpp2_prs_flow_find(struct mvpp2 *priv, int flow)
             priv->prs_shadow[tid].lu != MVPP2_PRS_LU_FLOWS)
             continue;
 
-        pe->index = tid;
-        mvpp2_prs_hw_read(priv, pe);
+        mvpp2_prs_init_from_hw(priv, pe, tid);
         bits = mvpp2_prs_sram_ai_get(pe);
 
         /* Sram store classification lookup ID in AI bits [5:0] */
@@ -1971,8 +1974,7 @@ static void mvpp2_prs_mac_drop_all_set(struct mvpp2 *priv, int port, bool add)
 
     if (priv->prs_shadow[MVPP2_PE_DROP_ALL].valid) {
         /* Entry exist - update port only */
-        pe.index = MVPP2_PE_DROP_ALL;
-        mvpp2_prs_hw_read(priv, &pe);
+        mvpp2_prs_init_from_hw(priv, &pe, MVPP2_PE_DROP_ALL);
     } else {
         /* Entry doesn't exist - create new */
         memset(&pe, 0, sizeof(pe));
@@ -2020,8 +2022,7 @@ static void mvpp2_prs_mac_promisc_set(struct mvpp2 *priv, int port,
 
     /* promiscuous mode - Accept unknown unicast or multicast packets */
     if (priv->prs_shadow[tid].valid) {
-        pe.index = tid;
-        mvpp2_prs_hw_read(priv, &pe);
+        mvpp2_prs_init_from_hw(priv, &pe, tid);
     } else {
         memset(&pe, 0, sizeof(pe));
         mvpp2_prs_tcam_lu_set(&pe, MVPP2_PRS_LU_MAC);
@@ -2071,8 +2072,7 @@ static void mvpp2_prs_dsa_tag_set(struct mvpp2 *priv, int port, bool add,
 
     if (priv->prs_shadow[tid].valid) {
         /* Entry exist - update port only */
-        pe.index = tid;
-        mvpp2_prs_hw_read(priv, &pe);
+        mvpp2_prs_init_from_hw(priv, &pe, tid);
     } else {
         /* Entry doesn't exist - create new */
         memset(&pe, 0, sizeof(pe));
@@ -2140,8 +2140,7 @@ static void mvpp2_prs_dsa_tag_ethertype_set(struct mvpp2 *priv, int port,
 
     if (priv->prs_shadow[tid].valid) {
         /* Entry exist - update port only */
-        pe.index = tid;
-        mvpp2_prs_hw_read(priv, &pe);
+        mvpp2_prs_init_from_hw(priv, &pe, tid);
     } else {
         /* Entry doesn't exist - create new */
         memset(&pe, 0, sizeof(pe));
@@ -2210,9 +2209,7 @@ static struct mvpp2_prs_entry *mvpp2_prs_vlan_find(struct mvpp2 *priv,
             priv->prs_shadow[tid].lu != MVPP2_PRS_LU_VLAN)
             continue;
 
-        pe->index = tid;
-
-        mvpp2_prs_hw_read(priv, pe);
+        mvpp2_prs_init_from_hw(priv, pe, tid);
         match = mvpp2_prs_tcam_data_cmp(pe, 0, swab16(tpid));
         if (!match)
             continue;
@@ -2268,8 +2265,7 @@ static int mvpp2_prs_vlan_add(struct mvpp2 *priv, unsigned short tpid, int ai,
                 priv->prs_shadow[tid_aux].lu != MVPP2_PRS_LU_VLAN)
                 continue;
 
-            pe->index = tid_aux;
-            mvpp2_prs_hw_read(priv, pe);
+            mvpp2_prs_init_from_hw(priv, pe, tid_aux);
             ri_bits = mvpp2_prs_sram_ri_get(pe);
             if ((ri_bits & MVPP2_PRS_RI_VLAN_MASK) ==
                 MVPP2_PRS_RI_VLAN_DOUBLE)
@@ -2351,8 +2347,7 @@ static struct mvpp2_prs_entry *mvpp2_prs_double_vlan_find(struct mvpp2 *priv,
             priv->prs_shadow[tid].lu != MVPP2_PRS_LU_VLAN)
             continue;
 
-        pe->index = tid;
-        mvpp2_prs_hw_read(priv, pe);
+        mvpp2_prs_init_from_hw(priv, pe, tid);
 
         match = mvpp2_prs_tcam_data_cmp(pe, 0, swab16(tpid1))
             && mvpp2_prs_tcam_data_cmp(pe, 4, swab16(tpid2));
@@ -2406,8 +2401,7 @@ static int mvpp2_prs_double_vlan_add(struct mvpp2 *priv, unsigned short tpid1,
                 priv->prs_shadow[tid_aux].lu != MVPP2_PRS_LU_VLAN)
                 continue;
 
-            pe->index = tid_aux;
-            mvpp2_prs_hw_read(priv, pe);
+            mvpp2_prs_init_from_hw(priv, pe, tid_aux);
             ri_bits = mvpp2_prs_sram_ri_get(pe);
             ri_bits &= MVPP2_PRS_RI_VLAN_MASK;
             if (ri_bits == MVPP2_PRS_RI_VLAN_SINGLE ||
@@ -3513,9 +3507,7 @@ static int mvpp2_prs_vid_range_find(struct mvpp2 *priv, int pmap, u16 vid,
             priv->prs_shadow[tid].lu != MVPP2_PRS_LU_VID)
             continue;
 
-        pe.index = tid;
-
-        mvpp2_prs_hw_read(priv, &pe);
+        mvpp2_prs_init_from_hw(priv, &pe, tid);
         mvpp2_prs_tcam_data_byte_get(&pe, 2, &byte[0], &enable[0]);
         mvpp2_prs_tcam_data_byte_get(&pe, 3, &byte[1], &enable[1]);
 
@@ -3569,7 +3561,7 @@ static int mvpp2_prs_vid_entry_add(struct mvpp2_port *port, u16 vid)
         /* Mask all ports */
         mvpp2_prs_tcam_port_map_set(&pe, 0);
     } else {
-        mvpp2_prs_hw_read(priv, &pe);
+        mvpp2_prs_init_from_hw(priv, &pe, tid);
     }
 
     /* Enable the current port */
@@ -3793,8 +3785,7 @@ mvpp2_prs_mac_da_range_find(struct mvpp2 *priv, int pmap, const u8 *da,
             (priv->prs_shadow[tid].udf != udf_type))
             continue;
 
-        pe->index = tid;
-        mvpp2_prs_hw_read(priv, pe);
+        mvpp2_prs_init_from_hw(priv, pe, tid);
         entry_pmap = mvpp2_prs_tcam_port_map_get(pe);
 
         if (mvpp2_prs_mac_range_equals(pe, da, mask) &&
@@ -3935,8 +3926,7 @@ static void mvpp2_prs_mac_del_all(struct mvpp2_port *port)
             (priv->prs_shadow[tid].udf != MVPP2_PRS_UDF_MAC_DEF))
             continue;
 
-        pe.index = tid;
-        mvpp2_prs_hw_read(priv, &pe);
+        mvpp2_prs_init_from_hw(priv, &pe, tid);
 
         pmap = mvpp2_prs_tcam_port_map_get(&pe);
 
-- 
2.7.4