mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-13 14:24:11 +08:00
Merge branch 'net-mvpp2-prs-Fixes-for-VID-filtering'
Maxime Chevallier says: ==================== net: mvpp2: prs: Fixes for VID filtering This series fixes some issues with VID filtering offload, mainly due to the wrong ranges being used in the TCAM header parser. The first patch fixes a bug where removing a VLAN from a port's whitelist would also remove it from other port's, if they are on the same PPv2 instance. The second patch makes so that we don't invalidate the wrong TCAM entries when clearing the whole whitelist. ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
commit
b8003cef2e
@ -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)
|
||||
@ -2026,8 +2025,10 @@ void mvpp2_prs_vid_remove_all(struct mvpp2_port *port)
|
||||
|
||||
for (tid = MVPP2_PRS_VID_PORT_FIRST(port->id);
|
||||
tid <= MVPP2_PRS_VID_PORT_LAST(port->id); tid++) {
|
||||
if (priv->prs_shadow[tid].valid)
|
||||
mvpp2_prs_vid_entry_remove(port, tid);
|
||||
if (priv->prs_shadow[tid].valid) {
|
||||
mvpp2_prs_hw_inv(priv, tid);
|
||||
priv->prs_shadow[tid].valid = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user