summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIoana Ciornei <ioana.ciornei@nxp.com>2021-03-22 22:58:55 +0200
committerDavid S. Miller <davem@davemloft.net>2021-03-22 16:37:44 -0700
commitf054e3e217e40ed343a0cea8c68cc053d40f81bd (patch)
tree65a6b9f985e67d62767394513c20f7a074457716
parentc7e856c85981722013cbdfa8f5324c2ad8c803f4 (diff)
dpaa2-switch: refactor the egress flooding domain setup
Extract the code that determines the list of egress flood interfaces for a specific flood type into a new function - dpaa2_switch_fdb_get_flood_cfg(). This will help us to not duplicate code when the broadcast and unknown ucast/mcast flooding domains will be individually configurable. Signed-off-by: Ioana Ciornei <ioana.ciornei@nxp.com> Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--drivers/net/ethernet/freescale/dpaa2/dpaa2-switch.c38
1 files changed, 25 insertions, 13 deletions
diff --git a/drivers/net/ethernet/freescale/dpaa2/dpaa2-switch.c b/drivers/net/ethernet/freescale/dpaa2/dpaa2-switch.c
index 5254eae5c86a..2db9cd78201d 100644
--- a/drivers/net/ethernet/freescale/dpaa2/dpaa2-switch.c
+++ b/drivers/net/ethernet/freescale/dpaa2/dpaa2-switch.c
@@ -110,28 +110,41 @@ static u16 dpaa2_switch_port_set_fdb(struct ethsw_port_priv *port_priv,
return 0;
}
-static int dpaa2_switch_fdb_set_egress_flood(struct ethsw_core *ethsw, u16 fdb_id)
+static void dpaa2_switch_fdb_get_flood_cfg(struct ethsw_core *ethsw, u16 fdb_id,
+ enum dpsw_flood_type type,
+ struct dpsw_egress_flood_cfg *cfg)
{
- struct dpsw_egress_flood_cfg flood_cfg;
int i = 0, j;
- int err;
+
+ memset(cfg, 0, sizeof(*cfg));
/* Add all the DPAA2 switch ports found in the same bridging domain to
* the egress flooding domain
*/
- for (j = 0; j < ethsw->sw_attr.num_ifs; j++)
- if (ethsw->ports[j] && ethsw->ports[j]->fdb->fdb_id == fdb_id)
- flood_cfg.if_id[i++] = ethsw->ports[j]->idx;
+ for (j = 0; j < ethsw->sw_attr.num_ifs; j++) {
+ if (!ethsw->ports[j])
+ continue;
+ if (ethsw->ports[j]->fdb->fdb_id != fdb_id)
+ continue;
+
+ cfg->if_id[i++] = ethsw->ports[j]->idx;
+ }
/* Add the CTRL interface to the egress flooding domain */
- flood_cfg.if_id[i++] = ethsw->sw_attr.num_ifs;
+ cfg->if_id[i++] = ethsw->sw_attr.num_ifs;
+
+ cfg->fdb_id = fdb_id;
+ cfg->flood_type = type;
+ cfg->num_ifs = i;
+}
- /* Use the FDB of the first dpaa2 switch port added to the bridge */
- flood_cfg.fdb_id = fdb_id;
+static int dpaa2_switch_fdb_set_egress_flood(struct ethsw_core *ethsw, u16 fdb_id)
+{
+ struct dpsw_egress_flood_cfg flood_cfg;
+ int err;
/* Setup broadcast flooding domain */
- flood_cfg.flood_type = DPSW_BROADCAST;
- flood_cfg.num_ifs = i;
+ dpaa2_switch_fdb_get_flood_cfg(ethsw, fdb_id, DPSW_BROADCAST, &flood_cfg);
err = dpsw_set_egress_flood(ethsw->mc_io, 0, ethsw->dpsw_handle,
&flood_cfg);
if (err) {
@@ -140,8 +153,7 @@ static int dpaa2_switch_fdb_set_egress_flood(struct ethsw_core *ethsw, u16 fdb_i
}
/* Setup unknown flooding domain */
- flood_cfg.flood_type = DPSW_FLOODING;
- flood_cfg.num_ifs = i;
+ dpaa2_switch_fdb_get_flood_cfg(ethsw, fdb_id, DPSW_FLOODING, &flood_cfg);
err = dpsw_set_egress_flood(ethsw->mc_io, 0, ethsw->dpsw_handle,
&flood_cfg);
if (err) {