Commit 60c653e2 authored by Maxime Chevallier's avatar Maxime Chevallier Committed by Greg Kroah-Hartman

net: mvpp2: prs: Fix parser range for VID filtering

[ Upstream commit 46b0090a ]

VID filtering is implemented in the Header Parser, with one range of 11
vids being assigned for each no-loopback port.

Make sure we use the per-port range when looking for existing entries in
the Parser.

Since we used a global range instead of a per-port one, this causes VIDs
to be removed from the whitelist from all ports of the same PPv2
instance.

Fixes: 56beda3d ("net: mvpp2: Add hardware offloading for VLAN filtering")
Suggested-by: default avatarYuri Chipchev <yuric@marvell.com>
Signed-off-by: default avatarMaxime Chevallier <maxime.chevallier@bootlin.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent af1c05e6
...@@ -1905,8 +1905,7 @@ static int mvpp2_prs_ip6_init(struct mvpp2 *priv) ...@@ -1905,8 +1905,7 @@ static int mvpp2_prs_ip6_init(struct mvpp2 *priv)
} }
/* Find tcam entry with matched pair <vid,port> */ /* Find tcam entry with matched pair <vid,port> */
static int mvpp2_prs_vid_range_find(struct mvpp2 *priv, int pmap, u16 vid, static int mvpp2_prs_vid_range_find(struct mvpp2_port *port, u16 vid, u16 mask)
u16 mask)
{ {
unsigned char byte[2], enable[2]; unsigned char byte[2], enable[2];
struct mvpp2_prs_entry pe; struct mvpp2_prs_entry pe;
...@@ -1914,13 +1913,13 @@ static int mvpp2_prs_vid_range_find(struct mvpp2 *priv, int pmap, u16 vid, ...@@ -1914,13 +1913,13 @@ static int mvpp2_prs_vid_range_find(struct mvpp2 *priv, int pmap, u16 vid,
int tid; int tid;
/* Go through the all entries with MVPP2_PRS_LU_VID */ /* Go through the all entries with MVPP2_PRS_LU_VID */
for (tid = MVPP2_PE_VID_FILT_RANGE_START; for (tid = MVPP2_PRS_VID_PORT_FIRST(port->id);
tid <= MVPP2_PE_VID_FILT_RANGE_END; tid++) { tid <= MVPP2_PRS_VID_PORT_LAST(port->id); tid++) {
if (!priv->prs_shadow[tid].valid || if (!port->priv->prs_shadow[tid].valid ||
priv->prs_shadow[tid].lu != MVPP2_PRS_LU_VID) port->priv->prs_shadow[tid].lu != MVPP2_PRS_LU_VID)
continue; continue;
mvpp2_prs_init_from_hw(priv, &pe, tid); mvpp2_prs_init_from_hw(port->priv, &pe, tid);
mvpp2_prs_tcam_data_byte_get(&pe, 2, &byte[0], &enable[0]); mvpp2_prs_tcam_data_byte_get(&pe, 2, &byte[0], &enable[0]);
mvpp2_prs_tcam_data_byte_get(&pe, 3, &byte[1], &enable[1]); mvpp2_prs_tcam_data_byte_get(&pe, 3, &byte[1], &enable[1]);
...@@ -1950,7 +1949,7 @@ int mvpp2_prs_vid_entry_add(struct mvpp2_port *port, u16 vid) ...@@ -1950,7 +1949,7 @@ int mvpp2_prs_vid_entry_add(struct mvpp2_port *port, u16 vid)
memset(&pe, 0, sizeof(pe)); memset(&pe, 0, sizeof(pe));
/* Scan TCAM and see if entry with this <vid,port> already exist */ /* Scan TCAM and see if entry with this <vid,port> already exist */
tid = mvpp2_prs_vid_range_find(priv, (1 << port->id), vid, mask); tid = mvpp2_prs_vid_range_find(port, vid, mask);
reg_val = mvpp2_read(priv, MVPP2_MH_REG(port->id)); reg_val = mvpp2_read(priv, MVPP2_MH_REG(port->id));
if (reg_val & MVPP2_DSA_EXTENDED) if (reg_val & MVPP2_DSA_EXTENDED)
...@@ -2008,7 +2007,7 @@ void mvpp2_prs_vid_entry_remove(struct mvpp2_port *port, u16 vid) ...@@ -2008,7 +2007,7 @@ void mvpp2_prs_vid_entry_remove(struct mvpp2_port *port, u16 vid)
int tid; int tid;
/* Scan TCAM and see if entry with this <vid,port> already exist */ /* Scan TCAM and see if entry with this <vid,port> already exist */
tid = mvpp2_prs_vid_range_find(priv, (1 << port->id), vid, 0xfff); tid = mvpp2_prs_vid_range_find(port, vid, 0xfff);
/* No such entry */ /* No such entry */
if (tid < 0) if (tid < 0)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment