]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/blob - releases/4.19.54/net-mvpp2-prs-fix-parser-range-for-vid-filtering.patch
Linux 4.19.54
[thirdparty/kernel/stable-queue.git] / releases / 4.19.54 / net-mvpp2-prs-fix-parser-range-for-vid-filtering.patch
1 From foo@baz Wed 19 Jun 2019 02:34:37 PM CEST
2 From: Maxime Chevallier <maxime.chevallier@bootlin.com>
3 Date: Tue, 11 Jun 2019 11:51:42 +0200
4 Subject: net: mvpp2: prs: Fix parser range for VID filtering
5
6 From: Maxime Chevallier <maxime.chevallier@bootlin.com>
7
8 [ Upstream commit 46b0090a6636cf34c0e856f15dd03e15ba4cdda6 ]
9
10 VID filtering is implemented in the Header Parser, with one range of 11
11 vids being assigned for each no-loopback port.
12
13 Make sure we use the per-port range when looking for existing entries in
14 the Parser.
15
16 Since we used a global range instead of a per-port one, this causes VIDs
17 to be removed from the whitelist from all ports of the same PPv2
18 instance.
19
20 Fixes: 56beda3db602 ("net: mvpp2: Add hardware offloading for VLAN filtering")
21 Suggested-by: Yuri Chipchev <yuric@marvell.com>
22 Signed-off-by: Maxime Chevallier <maxime.chevallier@bootlin.com>
23 Signed-off-by: David S. Miller <davem@davemloft.net>
24 Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
25 ---
26 drivers/net/ethernet/marvell/mvpp2/mvpp2_prs.c | 17 ++++++++---------
27 1 file changed, 8 insertions(+), 9 deletions(-)
28
29 --- a/drivers/net/ethernet/marvell/mvpp2/mvpp2_prs.c
30 +++ b/drivers/net/ethernet/marvell/mvpp2/mvpp2_prs.c
31 @@ -1905,8 +1905,7 @@ static int mvpp2_prs_ip6_init(struct mvp
32 }
33
34 /* Find tcam entry with matched pair <vid,port> */
35 -static int mvpp2_prs_vid_range_find(struct mvpp2 *priv, int pmap, u16 vid,
36 - u16 mask)
37 +static int mvpp2_prs_vid_range_find(struct mvpp2_port *port, u16 vid, u16 mask)
38 {
39 unsigned char byte[2], enable[2];
40 struct mvpp2_prs_entry pe;
41 @@ -1914,13 +1913,13 @@ static int mvpp2_prs_vid_range_find(stru
42 int tid;
43
44 /* Go through the all entries with MVPP2_PRS_LU_VID */
45 - for (tid = MVPP2_PE_VID_FILT_RANGE_START;
46 - tid <= MVPP2_PE_VID_FILT_RANGE_END; tid++) {
47 - if (!priv->prs_shadow[tid].valid ||
48 - priv->prs_shadow[tid].lu != MVPP2_PRS_LU_VID)
49 + for (tid = MVPP2_PRS_VID_PORT_FIRST(port->id);
50 + tid <= MVPP2_PRS_VID_PORT_LAST(port->id); tid++) {
51 + if (!port->priv->prs_shadow[tid].valid ||
52 + port->priv->prs_shadow[tid].lu != MVPP2_PRS_LU_VID)
53 continue;
54
55 - mvpp2_prs_init_from_hw(priv, &pe, tid);
56 + mvpp2_prs_init_from_hw(port->priv, &pe, tid);
57
58 mvpp2_prs_tcam_data_byte_get(&pe, 2, &byte[0], &enable[0]);
59 mvpp2_prs_tcam_data_byte_get(&pe, 3, &byte[1], &enable[1]);
60 @@ -1950,7 +1949,7 @@ int mvpp2_prs_vid_entry_add(struct mvpp2
61 memset(&pe, 0, sizeof(pe));
62
63 /* Scan TCAM and see if entry with this <vid,port> already exist */
64 - tid = mvpp2_prs_vid_range_find(priv, (1 << port->id), vid, mask);
65 + tid = mvpp2_prs_vid_range_find(port, vid, mask);
66
67 reg_val = mvpp2_read(priv, MVPP2_MH_REG(port->id));
68 if (reg_val & MVPP2_DSA_EXTENDED)
69 @@ -2008,7 +2007,7 @@ void mvpp2_prs_vid_entry_remove(struct m
70 int tid;
71
72 /* Scan TCAM and see if entry with this <vid,port> already exist */
73 - tid = mvpp2_prs_vid_range_find(priv, (1 << port->id), vid, 0xfff);
74 + tid = mvpp2_prs_vid_range_find(port, vid, 0xfff);
75
76 /* No such entry */
77 if (tid < 0)