forked from Minki/linux
net: mvpp2: prs: Fix parser range for VID filtering
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: 56beda3db6
("net: mvpp2: Add hardware offloading for VLAN filtering")
Suggested-by: Yuri Chipchev <yuric@marvell.com>
Signed-off-by: Maxime Chevallier <maxime.chevallier@bootlin.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
1d63f0e327
commit
46b0090a66
@ -1905,8 +1905,7 @@ static int mvpp2_prs_ip6_init(struct mvpp2 *priv)
|
||||
}
|
||||
|
||||
/* Find tcam entry with matched pair <vid,port> */
|
||||
static int mvpp2_prs_vid_range_find(struct mvpp2 *priv, int pmap, u16 vid,
|
||||
u16 mask)
|
||||
static int mvpp2_prs_vid_range_find(struct mvpp2_port *port, u16 vid, u16 mask)
|
||||
{
|
||||
unsigned char byte[2], enable[2];
|
||||
struct mvpp2_prs_entry pe;
|
||||
@ -1914,13 +1913,13 @@ static int mvpp2_prs_vid_range_find(struct mvpp2 *priv, int pmap, u16 vid,
|
||||
int tid;
|
||||
|
||||
/* Go through the all entries with MVPP2_PRS_LU_VID */
|
||||
for (tid = MVPP2_PE_VID_FILT_RANGE_START;
|
||||
tid <= MVPP2_PE_VID_FILT_RANGE_END; tid++) {
|
||||
if (!priv->prs_shadow[tid].valid ||
|
||||
priv->prs_shadow[tid].lu != MVPP2_PRS_LU_VID)
|
||||
for (tid = MVPP2_PRS_VID_PORT_FIRST(port->id);
|
||||
tid <= MVPP2_PRS_VID_PORT_LAST(port->id); tid++) {
|
||||
if (!port->priv->prs_shadow[tid].valid ||
|
||||
port->priv->prs_shadow[tid].lu != MVPP2_PRS_LU_VID)
|
||||
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, 3, &byte[1], &enable[1]);
|
||||
@ -1950,7 +1949,7 @@ int mvpp2_prs_vid_entry_add(struct mvpp2_port *port, u16 vid)
|
||||
memset(&pe, 0, sizeof(pe));
|
||||
|
||||
/* 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));
|
||||
if (reg_val & MVPP2_DSA_EXTENDED)
|
||||
@ -2008,7 +2007,7 @@ void mvpp2_prs_vid_entry_remove(struct mvpp2_port *port, u16 vid)
|
||||
int tid;
|
||||
|
||||
/* 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 */
|
||||
if (tid < 0)
|
||||
|
Loading…
Reference in New Issue
Block a user