* [PATCH v2] net: ethernet: ti: ale: ensure vlan/mdb deleted when no members
@ 2019-11-29 17:58 ` Grygorii Strashko
0 siblings, 0 replies; 4+ messages in thread
From: Grygorii Strashko @ 2019-11-29 17:58 UTC (permalink / raw)
To: netdev, David S . Miller
Cc: Ilias Apalodimas, Andrew Lunn, Sekhar Nori, Ivan Khoronzhuk,
linux-kernel, linux-omap, Grygorii Strashko
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: e85c14370783 ("net: ethernet: ti: ale: modify vlan/mdb api for switchdev")
Signed-off-by: Grygorii Strashko <grygorii.strashko@ti.com>
---
drivers/net/ethernet/ti/cpsw_ale.c | 12 +++++++++---
1 file changed, 9 insertions(+), 3 deletions(-)
diff --git a/drivers/net/ethernet/ti/cpsw_ale.c b/drivers/net/ethernet/ti/cpsw_ale.c
index 929f3d3354e3..ecdbde539eb7 100644
--- a/drivers/net/ethernet/ti/cpsw_ale.c
+++ b/drivers/net/ethernet/ti/cpsw_ale.c
@@ -384,7 +384,7 @@ int cpsw_ale_del_mcast(struct cpsw_ale *ale, const u8 *addr, int port_mask,
int flags, u16 vid)
{
u32 ale_entry[ALE_ENTRY_WORDS] = {0, 0, 0};
- int mcast_members;
+ int mcast_members = 0;
int idx;
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,
mcast_members = cpsw_ale_get_port_mask(ale_entry,
ale->port_mask_bits);
mcast_members &= ~port_mask;
+ }
+
+ if (mcast_members)
cpsw_ale_set_port_mask(ale_entry, mcast_members,
ale->port_mask_bits);
- } else {
+ else
cpsw_ale_set_entry_type(ale_entry, ALE_TYPE_FREE);
- }
cpsw_ale_write(ale, idx, ale_entry);
return 0;
@@ -478,6 +480,10 @@ static void cpsw_ale_del_vlan_modify(struct cpsw_ale *ale, u32 *ale_entry,
members = cpsw_ale_get_vlan_member_list(ale_entry,
ale->vlan_field_bits);
members &= ~port_mask;
+ if (!members) {
+ cpsw_ale_set_entry_type(ale_entry, ALE_TYPE_FREE);
+ return;
+ }
untag = cpsw_ale_get_vlan_untag_force(ale_entry,
ale->vlan_field_bits);
--
2.17.1
^ permalink raw reply related [flat|nested] 4+ messages in thread
* [PATCH v2] net: ethernet: ti: ale: ensure vlan/mdb deleted when no members
@ 2019-11-29 17:58 ` Grygorii Strashko
0 siblings, 0 replies; 4+ messages in thread
From: Grygorii Strashko @ 2019-11-29 17:58 UTC (permalink / raw)
To: netdev, David S . Miller
Cc: Ilias Apalodimas, Andrew Lunn, Sekhar Nori, Ivan Khoronzhuk,
linux-kernel, linux-omap, Grygorii Strashko
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: e85c14370783 ("net: ethernet: ti: ale: modify vlan/mdb api for switchdev")
Signed-off-by: Grygorii Strashko <grygorii.strashko@ti.com>
---
drivers/net/ethernet/ti/cpsw_ale.c | 12 +++++++++---
1 file changed, 9 insertions(+), 3 deletions(-)
diff --git a/drivers/net/ethernet/ti/cpsw_ale.c b/drivers/net/ethernet/ti/cpsw_ale.c
index 929f3d3354e3..ecdbde539eb7 100644
--- a/drivers/net/ethernet/ti/cpsw_ale.c
+++ b/drivers/net/ethernet/ti/cpsw_ale.c
@@ -384,7 +384,7 @@ int cpsw_ale_del_mcast(struct cpsw_ale *ale, const u8 *addr, int port_mask,
int flags, u16 vid)
{
u32 ale_entry[ALE_ENTRY_WORDS] = {0, 0, 0};
- int mcast_members;
+ int mcast_members = 0;
int idx;
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,
mcast_members = cpsw_ale_get_port_mask(ale_entry,
ale->port_mask_bits);
mcast_members &= ~port_mask;
+ }
+
+ if (mcast_members)
cpsw_ale_set_port_mask(ale_entry, mcast_members,
ale->port_mask_bits);
- } else {
+ else
cpsw_ale_set_entry_type(ale_entry, ALE_TYPE_FREE);
- }
cpsw_ale_write(ale, idx, ale_entry);
return 0;
@@ -478,6 +480,10 @@ static void cpsw_ale_del_vlan_modify(struct cpsw_ale *ale, u32 *ale_entry,
members = cpsw_ale_get_vlan_member_list(ale_entry,
ale->vlan_field_bits);
members &= ~port_mask;
+ if (!members) {
+ cpsw_ale_set_entry_type(ale_entry, ALE_TYPE_FREE);
+ return;
+ }
untag = cpsw_ale_get_vlan_untag_force(ale_entry,
ale->vlan_field_bits);
--
2.17.1
^ permalink raw reply related [flat|nested] 4+ messages in thread
* Re: [PATCH v2] net: ethernet: ti: ale: ensure vlan/mdb deleted when no members
2019-11-29 17:58 ` Grygorii Strashko
(?)
@ 2019-11-30 11:28 ` Ilias Apalodimas
-1 siblings, 0 replies; 4+ messages in thread
From: Ilias Apalodimas @ 2019-11-30 11:28 UTC (permalink / raw)
To: Grygorii Strashko
Cc: netdev, David S . Miller, Andrew Lunn, Sekhar Nori,
Ivan Khoronzhuk, linux-kernel, linux-omap
On Fri, Nov 29, 2019 at 07:58:09PM +0200, Grygorii Strashko wrote:
> 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: e85c14370783 ("net: ethernet: ti: ale: modify vlan/mdb api for switchdev")
> Signed-off-by: Grygorii Strashko <grygorii.strashko@ti.com>
> ---
> drivers/net/ethernet/ti/cpsw_ale.c | 12 +++++++++---
> 1 file changed, 9 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/net/ethernet/ti/cpsw_ale.c b/drivers/net/ethernet/ti/cpsw_ale.c
> index 929f3d3354e3..ecdbde539eb7 100644
> --- a/drivers/net/ethernet/ti/cpsw_ale.c
> +++ b/drivers/net/ethernet/ti/cpsw_ale.c
> @@ -384,7 +384,7 @@ int cpsw_ale_del_mcast(struct cpsw_ale *ale, const u8 *addr, int port_mask,
> int flags, u16 vid)
> {
> u32 ale_entry[ALE_ENTRY_WORDS] = {0, 0, 0};
> - int mcast_members;
> + int mcast_members = 0;
> int idx;
>
> 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,
> mcast_members = cpsw_ale_get_port_mask(ale_entry,
> ale->port_mask_bits);
> mcast_members &= ~port_mask;
> + }
> +
> + if (mcast_members)
> cpsw_ale_set_port_mask(ale_entry, mcast_members,
> ale->port_mask_bits);
> - } else {
> + else
> cpsw_ale_set_entry_type(ale_entry, ALE_TYPE_FREE);
> - }
>
> cpsw_ale_write(ale, idx, ale_entry);
> return 0;
> @@ -478,6 +480,10 @@ static void cpsw_ale_del_vlan_modify(struct cpsw_ale *ale, u32 *ale_entry,
> members = cpsw_ale_get_vlan_member_list(ale_entry,
> ale->vlan_field_bits);
> members &= ~port_mask;
> + if (!members) {
> + cpsw_ale_set_entry_type(ale_entry, ALE_TYPE_FREE);
> + return;
> + }
>
> untag = cpsw_ale_get_vlan_untag_force(ale_entry,
> ale->vlan_field_bits);
> --
> 2.17.1
>
Acked-by: Ilias Apalodimas <ilias.apalodimas@linaro.org>
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH v2] net: ethernet: ti: ale: ensure vlan/mdb deleted when no members
2019-11-29 17:58 ` Grygorii Strashko
(?)
(?)
@ 2019-11-30 17:46 ` David Miller
-1 siblings, 0 replies; 4+ messages in thread
From: David Miller @ 2019-11-30 17:46 UTC (permalink / raw)
To: grygorii.strashko
Cc: netdev, ilias.apalodimas, andrew, nsekhar, ivan.khoronzhuk,
linux-kernel, linux-omap
From: Grygorii Strashko <grygorii.strashko@ti.com>
Date: Fri, 29 Nov 2019 19:58:09 +0200
> 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: e85c14370783 ("net: ethernet: ti: ale: modify vlan/mdb api for switchdev")
> Signed-off-by: Grygorii Strashko <grygorii.strashko@ti.com>
Applied.
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2019-11-30 17:46 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-11-29 17:58 [PATCH v2] net: ethernet: ti: ale: ensure vlan/mdb deleted when no members Grygorii Strashko
2019-11-29 17:58 ` Grygorii Strashko
2019-11-30 11:28 ` Ilias Apalodimas
2019-11-30 17:46 ` David Miller
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.