diff mbox series

[net-next,2/2] net: sparx5: Refactor mdb handling according to feedback

Message ID 20220324113853.576803-3-casper.casan@gmail.com (mailing list archive)
State Accepted
Commit ad238fc6de7d1adece5167df09464912c098b021
Delegated to: Netdev Maintainers
Headers show
Series net: sparx5: Refactor based on feedback on | expand

Checks

Context Check Description
netdev/tree_selection success Clearly marked for net-next
netdev/fixes_present success Fixes tag not required for -next series
netdev/subject_prefix success Link
netdev/cover_letter success Series has a cover letter
netdev/patch_count success Link
netdev/header_inline success No static functions without inline keyword in header files
netdev/build_32bit success Errors and warnings before: 0 this patch: 0
netdev/cc_maintainers warning 4 maintainers not CCed: vladimir.oltean@nxp.com bjarni.jonasson@microchip.com horatiu.vultur@microchip.com linux-arm-kernel@lists.infradead.org
netdev/build_clang success Errors and warnings before: 0 this patch: 0
netdev/module_param success Was 0 now: 0
netdev/verify_signedoff success Signed-off-by tag matches author and committer
netdev/verify_fixes success No Fixes tag
netdev/build_allmodconfig_warn success Errors and warnings before: 0 this patch: 0
netdev/checkpatch success total: 0 errors, 0 warnings, 0 checks, 108 lines checked
netdev/kdoc success Errors and warnings before: 0 this patch: 0
netdev/source_inline success Was 0 now: 0

Commit Message

Casper Andersson March 24, 2022, 11:38 a.m. UTC
- Remove mact_lookup and use new mact_find instead.
- Make pgid_read_mask function.
- Set PGID arbiter to start searching at PGID_BASE + 8.

This is according to feedback on previous patch.
https://lore.kernel.org/netdev/20220322081823.wqbx7vud4q7qtjuq@wse-c0155/T/#t

Signed-off-by: Casper Andersson <casper.casan@gmail.com>
---
 .../microchip/sparx5/sparx5_mactable.c        | 19 ++++---------------
 .../ethernet/microchip/sparx5/sparx5_main.h   |  3 ++-
 .../ethernet/microchip/sparx5/sparx5_pgid.c   |  3 +++
 .../microchip/sparx5/sparx5_switchdev.c       | 18 ++++++++----------
 .../ethernet/microchip/sparx5/sparx5_vlan.c   |  7 +++++++
 5 files changed, 24 insertions(+), 26 deletions(-)

Comments

Steen Hegelund March 24, 2022, 2:31 p.m. UTC | #1
On Thu, 2022-03-24 at 12:38 +0100, Casper Andersson wrote:
> EXTERNAL EMAIL: Do not click links or open attachments unless you know the content is safe
> 
> - Remove mact_lookup and use new mact_find instead.
> - Make pgid_read_mask function.
> - Set PGID arbiter to start searching at PGID_BASE + 8.
> 
> This is according to feedback on previous patch.
> https://lore.kernel.org/netdev/20220322081823.wqbx7vud4q7qtjuq@wse-c0155/T/#t
> 
> Signed-off-by: Casper Andersson <casper.casan@gmail.com>
> ---
>  .../microchip/sparx5/sparx5_mactable.c        | 19 ++++---------------
>  .../ethernet/microchip/sparx5/sparx5_main.h   |  3 ++-
>  .../ethernet/microchip/sparx5/sparx5_pgid.c   |  3 +++
>  .../microchip/sparx5/sparx5_switchdev.c       | 18 ++++++++----------
>  .../ethernet/microchip/sparx5/sparx5_vlan.c   |  7 +++++++
>  5 files changed, 24 insertions(+), 26 deletions(-)
> 
> diff --git a/drivers/net/ethernet/microchip/sparx5/sparx5_mactable.c
> b/drivers/net/ethernet/microchip/sparx5/sparx5_mactable.c
> index 35abb3d0ce19..a5837dbe0c7e 100644
> --- a/drivers/net/ethernet/microchip/sparx5/sparx5_mactable.c
> +++ b/drivers/net/ethernet/microchip/sparx5/sparx5_mactable.c
> @@ -212,19 +212,7 @@ bool sparx5_mact_find(struct sparx5 *sparx5,
> 
>         mutex_unlock(&sparx5->lock);
> 
> -       return ret == 0;
> -}
> -
> -static int sparx5_mact_lookup(struct sparx5 *sparx5,
> -                             const unsigned char mac[ETH_ALEN],
> -                             u16 vid)
> -{
> -       u32 pcfg2;
> -
> -       if (sparx5_mact_find(sparx5, mac, vid, &pcfg2))
> -               return 1;
> -
> -       return 0;
> +       return ret;
>  }
> 
>  int sparx5_mact_forget(struct sparx5 *sparx5,
> @@ -305,9 +293,10 @@ int sparx5_add_mact_entry(struct sparx5 *sparx5,
>  {
>         struct sparx5_mact_entry *mact_entry;
>         int ret;
> +       u32 cfg2;
> 
> -       ret = sparx5_mact_lookup(sparx5, addr, vid);
> -       if (ret)
> +       ret = sparx5_mact_find(sparx5, addr, vid, &cfg2);
> +       if (!ret)
>                 return 0;
> 
>         /* In case the entry already exists, don't add it again to SW,
> diff --git a/drivers/net/ethernet/microchip/sparx5/sparx5_main.h
> b/drivers/net/ethernet/microchip/sparx5/sparx5_main.h
> index 8e77d7ee8e68..b197129044b5 100644
> --- a/drivers/net/ethernet/microchip/sparx5/sparx5_main.h
> +++ b/drivers/net/ethernet/microchip/sparx5/sparx5_main.h
> @@ -65,10 +65,10 @@ enum sparx5_vlan_port_type {
>  #define PGID_IPV6_MC_CTRL      (PGID_BASE + 5)
>  #define PGID_BCAST            (PGID_BASE + 6)
>  #define PGID_CPU              (PGID_BASE + 7)
> +#define PGID_MCAST_START       (PGID_BASE + 8)
> 
>  #define PGID_TABLE_SIZE               3290
> 
> -#define PGID_MCAST_START 65
>  #define IFH_LEN                9 /* 36 bytes */
>  #define NULL_VID               0
>  #define SPX5_MACT_PULL_DELAY   (2 * HZ)
> @@ -325,6 +325,7 @@ void sparx5_mact_init(struct sparx5 *sparx5);
> 
>  /* sparx5_vlan.c */
>  void sparx5_pgid_update_mask(struct sparx5_port *port, int pgid, bool enable);
> +void sparx5_pgid_read_mask(struct sparx5 *sparx5, int pgid, u32 portmask[3]);
>  void sparx5_update_fwd(struct sparx5 *sparx5);
>  void sparx5_vlan_init(struct sparx5 *sparx5);
>  void sparx5_vlan_port_setup(struct sparx5 *sparx5, int portno);
> diff --git a/drivers/net/ethernet/microchip/sparx5/sparx5_pgid.c
> b/drivers/net/ethernet/microchip/sparx5/sparx5_pgid.c
> index 851a559269e1..af8b435009f4 100644
> --- a/drivers/net/ethernet/microchip/sparx5/sparx5_pgid.c
> +++ b/drivers/net/ethernet/microchip/sparx5/sparx5_pgid.c
> @@ -19,6 +19,9 @@ int sparx5_pgid_alloc_mcast(struct sparx5 *spx5, u16 *idx)
>  {
>         int i;
> 
> +       /* The multicast area starts at index 65, but the first 7
> +        * are reserved for flood masks and CPU. Start alloc after that.
> +        */
>         for (i = PGID_MCAST_START; i < PGID_TABLE_SIZE; i++) {
>                 if (spx5->pgid_map[i] == SPX5_PGID_FREE) {
>                         spx5->pgid_map[i] = SPX5_PGID_MULTICAST;
> diff --git a/drivers/net/ethernet/microchip/sparx5/sparx5_switchdev.c
> b/drivers/net/ethernet/microchip/sparx5/sparx5_switchdev.c
> index 2d8e0b81c839..5389fffc694a 100644
> --- a/drivers/net/ethernet/microchip/sparx5/sparx5_switchdev.c
> +++ b/drivers/net/ethernet/microchip/sparx5/sparx5_switchdev.c
> @@ -406,11 +406,11 @@ static int sparx5_handle_port_mdb_add(struct net_device *dev,
> 
>         res = sparx5_mact_find(spx5, v->addr, vid, &mact_entry);
> 
> -       if (res) {
> +       if (res == 0) {
>                 pgid_idx = LRN_MAC_ACCESS_CFG_2_MAC_ENTRY_ADDR_GET(mact_entry);
> 
> -               /* MC_IDX has an offset of 65 in the PGID table. */
> -               pgid_idx += PGID_MCAST_START;
> +               /* MC_IDX starts after the port masks in the PGID table */
> +               pgid_idx += SPX5_PORTS;
>                 sparx5_pgid_update_mask(port, pgid_idx, true);
>         } else {
>                 err = sparx5_pgid_alloc_mcast(spx5, &pgid_idx);
> @@ -468,17 +468,15 @@ static int sparx5_handle_port_mdb_del(struct net_device *dev,
> 
>         res = sparx5_mact_find(spx5, v->addr, vid, &mact_entry);
> 
> -       if (res) {
> +       if (res == 0) {
>                 pgid_idx = LRN_MAC_ACCESS_CFG_2_MAC_ENTRY_ADDR_GET(mact_entry);
> 
> -               /* MC_IDX has an offset of 65 in the PGID table. */
> -               pgid_idx += PGID_MCAST_START;
> +               /* MC_IDX starts after the port masks in the PGID table */
> +               pgid_idx += SPX5_PORTS;
>                 sparx5_pgid_update_mask(port, pgid_idx, false);
> 
> -               pgid_entry[0] = spx5_rd(spx5, ANA_AC_PGID_CFG(pgid_idx));
> -               pgid_entry[1] = spx5_rd(spx5, ANA_AC_PGID_CFG1(pgid_idx));
> -               pgid_entry[2] = spx5_rd(spx5, ANA_AC_PGID_CFG2(pgid_idx));
> -               if (pgid_entry[0] == 0 && pgid_entry[1] == 0 && pgid_entry[2] == 0) {
> +               sparx5_pgid_read_mask(spx5, pgid_idx, pgid_entry);
> +               if (bitmap_empty((unsigned long *)pgid_entry, SPX5_PORTS)) {
>                         /* No ports are in MC group. Remove entry */
>                         err = sparx5_mdb_del_entry(dev, spx5, v->addr, vid, pgid_idx);
>                         if (err)
> diff --git a/drivers/net/ethernet/microchip/sparx5/sparx5_vlan.c
> b/drivers/net/ethernet/microchip/sparx5/sparx5_vlan.c
> index 8e56ffa1c4f7..37e4ac965849 100644
> --- a/drivers/net/ethernet/microchip/sparx5/sparx5_vlan.c
> +++ b/drivers/net/ethernet/microchip/sparx5/sparx5_vlan.c
> @@ -138,6 +138,13 @@ void sparx5_pgid_update_mask(struct sparx5_port *port, int pgid, bool enable)
>         }
>  }
> 
> +void sparx5_pgid_read_mask(struct sparx5 *spx5, int pgid, u32 portmask[3])
> +{
> +       portmask[0] = spx5_rd(spx5, ANA_AC_PGID_CFG(pgid));
> +       portmask[1] = spx5_rd(spx5, ANA_AC_PGID_CFG1(pgid));
> +       portmask[2] = spx5_rd(spx5, ANA_AC_PGID_CFG2(pgid));
> +}
> +
>  void sparx5_update_fwd(struct sparx5 *sparx5)
>  {
>         DECLARE_BITMAP(workmask, SPX5_PORTS);
> --
> 2.30.2
> 

Reviewed-by: Steen Hegelund <Steen.Hegelund@microchip.com>
diff mbox series

Patch

diff --git a/drivers/net/ethernet/microchip/sparx5/sparx5_mactable.c b/drivers/net/ethernet/microchip/sparx5/sparx5_mactable.c
index 35abb3d0ce19..a5837dbe0c7e 100644
--- a/drivers/net/ethernet/microchip/sparx5/sparx5_mactable.c
+++ b/drivers/net/ethernet/microchip/sparx5/sparx5_mactable.c
@@ -212,19 +212,7 @@  bool sparx5_mact_find(struct sparx5 *sparx5,
 
 	mutex_unlock(&sparx5->lock);
 
-	return ret == 0;
-}
-
-static int sparx5_mact_lookup(struct sparx5 *sparx5,
-			      const unsigned char mac[ETH_ALEN],
-			      u16 vid)
-{
-	u32 pcfg2;
-
-	if (sparx5_mact_find(sparx5, mac, vid, &pcfg2))
-		return 1;
-
-	return 0;
+	return ret;
 }
 
 int sparx5_mact_forget(struct sparx5 *sparx5,
@@ -305,9 +293,10 @@  int sparx5_add_mact_entry(struct sparx5 *sparx5,
 {
 	struct sparx5_mact_entry *mact_entry;
 	int ret;
+	u32 cfg2;
 
-	ret = sparx5_mact_lookup(sparx5, addr, vid);
-	if (ret)
+	ret = sparx5_mact_find(sparx5, addr, vid, &cfg2);
+	if (!ret)
 		return 0;
 
 	/* In case the entry already exists, don't add it again to SW,
diff --git a/drivers/net/ethernet/microchip/sparx5/sparx5_main.h b/drivers/net/ethernet/microchip/sparx5/sparx5_main.h
index 8e77d7ee8e68..b197129044b5 100644
--- a/drivers/net/ethernet/microchip/sparx5/sparx5_main.h
+++ b/drivers/net/ethernet/microchip/sparx5/sparx5_main.h
@@ -65,10 +65,10 @@  enum sparx5_vlan_port_type {
 #define PGID_IPV6_MC_CTRL      (PGID_BASE + 5)
 #define PGID_BCAST	       (PGID_BASE + 6)
 #define PGID_CPU	       (PGID_BASE + 7)
+#define PGID_MCAST_START       (PGID_BASE + 8)
 
 #define PGID_TABLE_SIZE	       3290
 
-#define PGID_MCAST_START 65
 #define IFH_LEN                9 /* 36 bytes */
 #define NULL_VID               0
 #define SPX5_MACT_PULL_DELAY   (2 * HZ)
@@ -325,6 +325,7 @@  void sparx5_mact_init(struct sparx5 *sparx5);
 
 /* sparx5_vlan.c */
 void sparx5_pgid_update_mask(struct sparx5_port *port, int pgid, bool enable);
+void sparx5_pgid_read_mask(struct sparx5 *sparx5, int pgid, u32 portmask[3]);
 void sparx5_update_fwd(struct sparx5 *sparx5);
 void sparx5_vlan_init(struct sparx5 *sparx5);
 void sparx5_vlan_port_setup(struct sparx5 *sparx5, int portno);
diff --git a/drivers/net/ethernet/microchip/sparx5/sparx5_pgid.c b/drivers/net/ethernet/microchip/sparx5/sparx5_pgid.c
index 851a559269e1..af8b435009f4 100644
--- a/drivers/net/ethernet/microchip/sparx5/sparx5_pgid.c
+++ b/drivers/net/ethernet/microchip/sparx5/sparx5_pgid.c
@@ -19,6 +19,9 @@  int sparx5_pgid_alloc_mcast(struct sparx5 *spx5, u16 *idx)
 {
 	int i;
 
+	/* The multicast area starts at index 65, but the first 7
+	 * are reserved for flood masks and CPU. Start alloc after that.
+	 */
 	for (i = PGID_MCAST_START; i < PGID_TABLE_SIZE; i++) {
 		if (spx5->pgid_map[i] == SPX5_PGID_FREE) {
 			spx5->pgid_map[i] = SPX5_PGID_MULTICAST;
diff --git a/drivers/net/ethernet/microchip/sparx5/sparx5_switchdev.c b/drivers/net/ethernet/microchip/sparx5/sparx5_switchdev.c
index 2d8e0b81c839..5389fffc694a 100644
--- a/drivers/net/ethernet/microchip/sparx5/sparx5_switchdev.c
+++ b/drivers/net/ethernet/microchip/sparx5/sparx5_switchdev.c
@@ -406,11 +406,11 @@  static int sparx5_handle_port_mdb_add(struct net_device *dev,
 
 	res = sparx5_mact_find(spx5, v->addr, vid, &mact_entry);
 
-	if (res) {
+	if (res == 0) {
 		pgid_idx = LRN_MAC_ACCESS_CFG_2_MAC_ENTRY_ADDR_GET(mact_entry);
 
-		/* MC_IDX has an offset of 65 in the PGID table. */
-		pgid_idx += PGID_MCAST_START;
+		/* MC_IDX starts after the port masks in the PGID table */
+		pgid_idx += SPX5_PORTS;
 		sparx5_pgid_update_mask(port, pgid_idx, true);
 	} else {
 		err = sparx5_pgid_alloc_mcast(spx5, &pgid_idx);
@@ -468,17 +468,15 @@  static int sparx5_handle_port_mdb_del(struct net_device *dev,
 
 	res = sparx5_mact_find(spx5, v->addr, vid, &mact_entry);
 
-	if (res) {
+	if (res == 0) {
 		pgid_idx = LRN_MAC_ACCESS_CFG_2_MAC_ENTRY_ADDR_GET(mact_entry);
 
-		/* MC_IDX has an offset of 65 in the PGID table. */
-		pgid_idx += PGID_MCAST_START;
+		/* MC_IDX starts after the port masks in the PGID table */
+		pgid_idx += SPX5_PORTS;
 		sparx5_pgid_update_mask(port, pgid_idx, false);
 
-		pgid_entry[0] = spx5_rd(spx5, ANA_AC_PGID_CFG(pgid_idx));
-		pgid_entry[1] = spx5_rd(spx5, ANA_AC_PGID_CFG1(pgid_idx));
-		pgid_entry[2] = spx5_rd(spx5, ANA_AC_PGID_CFG2(pgid_idx));
-		if (pgid_entry[0] == 0 && pgid_entry[1] == 0 && pgid_entry[2] == 0) {
+		sparx5_pgid_read_mask(spx5, pgid_idx, pgid_entry);
+		if (bitmap_empty((unsigned long *)pgid_entry, SPX5_PORTS)) {
 			/* No ports are in MC group. Remove entry */
 			err = sparx5_mdb_del_entry(dev, spx5, v->addr, vid, pgid_idx);
 			if (err)
diff --git a/drivers/net/ethernet/microchip/sparx5/sparx5_vlan.c b/drivers/net/ethernet/microchip/sparx5/sparx5_vlan.c
index 8e56ffa1c4f7..37e4ac965849 100644
--- a/drivers/net/ethernet/microchip/sparx5/sparx5_vlan.c
+++ b/drivers/net/ethernet/microchip/sparx5/sparx5_vlan.c
@@ -138,6 +138,13 @@  void sparx5_pgid_update_mask(struct sparx5_port *port, int pgid, bool enable)
 	}
 }
 
+void sparx5_pgid_read_mask(struct sparx5 *spx5, int pgid, u32 portmask[3])
+{
+	portmask[0] = spx5_rd(spx5, ANA_AC_PGID_CFG(pgid));
+	portmask[1] = spx5_rd(spx5, ANA_AC_PGID_CFG1(pgid));
+	portmask[2] = spx5_rd(spx5, ANA_AC_PGID_CFG2(pgid));
+}
+
 void sparx5_update_fwd(struct sparx5 *sparx5)
 {
 	DECLARE_BITMAP(workmask, SPX5_PORTS);