dpaa2-switch: add dpaa2_switch_port_to_bridge_port() helper

In preparation for adding offloading support for upper bond devices we
have to let the switchdev framework know if a specific bridge port is
offloaded or not, even if that brport is an upper device.

For this to happen, create the dpaa2_switch_port_to_bridge_port function
which will determine the bridge port corresponding to a particular DPAA2
switch interface and use it in the switchdev_bridge_port_offload call.

Signed-off-by: Ioana Ciornei <ioana.ciornei@nxp.com>
Link: https://patch.msgid.link/20260629112309.154328-7-ioana.ciornei@nxp.com
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
This commit is contained in:
Ioana Ciornei
2026-06-29 14:23:02 +03:00
committed by Paolo Abeni
parent 0199ff706d
commit 06840a2363

View File

@@ -2017,6 +2017,15 @@ static int dpaa2_switch_port_attr_set_event(struct net_device *netdev,
return notifier_from_errno(err);
}
static struct net_device *
dpaa2_switch_port_to_bridge_port(struct ethsw_port_priv *port_priv)
{
if (!port_priv->fdb->bridge_dev)
return NULL;
return port_priv->netdev;
}
static int dpaa2_switch_port_bridge_join(struct net_device *netdev,
struct net_device *upper_dev,
struct netlink_ext_ack *extack)
@@ -2024,6 +2033,7 @@ static int dpaa2_switch_port_bridge_join(struct net_device *netdev,
struct ethsw_port_priv *port_priv = netdev_priv(netdev);
struct dpaa2_switch_fdb *old_fdb = port_priv->fdb;
struct ethsw_core *ethsw = port_priv->ethsw_data;
struct net_device *brport_dev;
bool learn_ena;
int err;
@@ -2035,7 +2045,8 @@ static int dpaa2_switch_port_bridge_join(struct net_device *netdev,
dpaa2_switch_port_set_fdb(port_priv, upper_dev, true);
/* Inherit the initial bridge port learning state */
learn_ena = br_port_flag_is_set(netdev, BR_LEARNING);
brport_dev = dpaa2_switch_port_to_bridge_port(port_priv);
learn_ena = br_port_flag_is_set(brport_dev, BR_LEARNING);
err = dpaa2_switch_port_set_learning(port_priv, learn_ena);
port_priv->learn_ena = learn_ena;
@@ -2049,7 +2060,8 @@ static int dpaa2_switch_port_bridge_join(struct net_device *netdev,
if (err)
goto err_egress_flood;
err = switchdev_bridge_port_offload(netdev, netdev, NULL,
brport_dev = dpaa2_switch_port_to_bridge_port(port_priv);
err = switchdev_bridge_port_offload(brport_dev, netdev, NULL,
NULL, NULL, false, extack);
if (err)
goto err_switchdev_offload;
@@ -2086,8 +2098,13 @@ static void dpaa2_switch_port_pre_bridge_leave(struct net_device *netdev)
{
struct ethsw_port_priv *port_priv = netdev_priv(netdev);
struct ethsw_core *ethsw = port_priv->ethsw_data;
struct net_device *brport_dev;
switchdev_bridge_port_unoffload(netdev, NULL, NULL, NULL);
brport_dev = dpaa2_switch_port_to_bridge_port(port_priv);
if (!brport_dev)
return;
switchdev_bridge_port_unoffload(brport_dev, NULL, NULL, NULL);
/* Make sure that any FDB add/del operations are completed before the
* bridge layout changes