mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-08-31 12:52:29 -04:00
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:
committed by
Paolo Abeni
parent
0199ff706d
commit
06840a2363
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user