diff options
-rw-r--r-- | rules.d/81-net-bridge.rules | 16 | ||||
-rw-r--r-- | rules.d/meson.build | 1 | ||||
-rw-r--r-- | src/network/networkd-setlink.c | 20 |
3 files changed, 37 insertions, 0 deletions
diff --git a/rules.d/81-net-bridge.rules b/rules.d/81-net-bridge.rules new file mode 100644 index 0000000000..defb31fe31 --- /dev/null +++ b/rules.d/81-net-bridge.rules @@ -0,0 +1,16 @@ +# do not edit this file, it will be overwritten on update + +ACTION=="remove", GOTO="net_bridge_end" +SUBSYSTEM!="net", GOTO="net_bridge_end" + +# Some devices require the port to be up before joining the bridge. +# In such cases, set ID_NET_BRING_UP_BEFORE_JOINING_BRIDGE to "1". + +# Texas Instruments Ethernet device with switchdev mode: +# https://docs.kernel.org/networking/device_drivers/ethernet/ti/am65_nuss_cpsw_switchdev.html#enabling-switch +ENV{ID_NET_DRIVER}=="am65-cpsw-nuss", SUBSYSTEMS=="platform", DRIVERS=="am65-cpsw-nuss", \ + PROGRAM="/usr/sbin/devlink dev param show platform/%b name switch_mode", \ + RESULT=="*cmode runtime value true*", \ + ENV{ID_NET_BRING_UP_BEFORE_JOINING_BRIDGE}="1" + +LABEL="net_bridge_end" diff --git a/rules.d/meson.build b/rules.d/meson.build index 3040fae8a4..61165fd86f 100644 --- a/rules.d/meson.build +++ b/rules.d/meson.build @@ -29,6 +29,7 @@ rules = [ '75-probe_mtd.rules', '78-sound-card.rules', '80-net-setup-link.rules', + '81-net-bridge.rules', '81-net-dhcp.rules', '90-iocost.rules', )], diff --git a/src/network/networkd-setlink.c b/src/network/networkd-setlink.c index 8ef523dfdc..467fadb3ea 100644 --- a/src/network/networkd-setlink.c +++ b/src/network/networkd-setlink.c @@ -6,6 +6,7 @@ #include <linux/if_bridge.h> #include <linux/ipv6.h> +#include "device-private.h" #include "missing_network.h" #include "netif-util.h" #include "netlink-util.h" @@ -581,6 +582,25 @@ static int link_is_ready_to_set_link(Link *link, Request *req) { return r; } + if (link->network->bridge && !FLAGS_SET(link->flags, IFF_UP) && link->dev) { + /* Some devices require the port to be up before joining the bridge. + * + * E.g. Texas Instruments SoC Ethernet running in switch mode: + * https://docs.kernel.org/networking/device_drivers/ethernet/ti/am65_nuss_cpsw_switchdev.html#enabling-switch + * > Port’s netdev devices have to be in UP before joining to the bridge to avoid + * > overwriting of bridge configuration as CPSW switch driver completely reloads its + * > configuration when first port changes its state to UP. */ + + r = device_get_property_bool(link->dev, "ID_NET_BRING_UP_BEFORE_JOINING_BRIDGE"); + if (r < 0 && r != -ENOENT) + log_link_warning_errno(link, r, "Failed to get or parse ID_NET_BRING_UP_BEFORE_JOINING_BRIDGE property, ignoring: %m"); + else if (r > 0) { + r = link_up_now(link); + if (r < 0) + return r; + } + } + req->userdata = UINT32_TO_PTR(m); break; } |