Skip to content

Commit 395eba7

Browse files
grygoriySdavem330
authored andcommitted
net: ethernet: ti: ale: ensure vlan/mdb deleted when no members
The recently updated ALE APIs cpsw_ale_del_mcast() and cpsw_ale_del_vlan_modify() have an issue and will not delete ALE entry even if VLAN/mcast group has no more members. Hence fix it here and delete ALE entry if !port_mask. The issue affected only new cpsw switchdev driver. Fixes: e85c143 ("net: ethernet: ti: ale: modify vlan/mdb api for switchdev") Signed-off-by: Grygorii Strashko <[email protected]> Acked-by: Ilias Apalodimas <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent 5f9fc33 commit 395eba7

File tree

1 file changed

+9
-3
lines changed

1 file changed

+9
-3
lines changed

drivers/net/ethernet/ti/cpsw_ale.c

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -384,7 +384,7 @@ int cpsw_ale_del_mcast(struct cpsw_ale *ale, const u8 *addr, int port_mask,
384384
int flags, u16 vid)
385385
{
386386
u32 ale_entry[ALE_ENTRY_WORDS] = {0, 0, 0};
387-
int mcast_members;
387+
int mcast_members = 0;
388388
int idx;
389389

390390
idx = cpsw_ale_match_addr(ale, addr, (flags & ALE_VLAN) ? vid : 0);
@@ -397,11 +397,13 @@ int cpsw_ale_del_mcast(struct cpsw_ale *ale, const u8 *addr, int port_mask,
397397
mcast_members = cpsw_ale_get_port_mask(ale_entry,
398398
ale->port_mask_bits);
399399
mcast_members &= ~port_mask;
400+
}
401+
402+
if (mcast_members)
400403
cpsw_ale_set_port_mask(ale_entry, mcast_members,
401404
ale->port_mask_bits);
402-
} else {
405+
else
403406
cpsw_ale_set_entry_type(ale_entry, ALE_TYPE_FREE);
404-
}
405407

406408
cpsw_ale_write(ale, idx, ale_entry);
407409
return 0;
@@ -478,6 +480,10 @@ static void cpsw_ale_del_vlan_modify(struct cpsw_ale *ale, u32 *ale_entry,
478480
members = cpsw_ale_get_vlan_member_list(ale_entry,
479481
ale->vlan_field_bits);
480482
members &= ~port_mask;
483+
if (!members) {
484+
cpsw_ale_set_entry_type(ale_entry, ALE_TYPE_FREE);
485+
return;
486+
}
481487

482488
untag = cpsw_ale_get_vlan_untag_force(ale_entry,
483489
ale->vlan_field_bits);

0 commit comments

Comments
 (0)