From: Tobias Waldekranz <tobias@waldekranz.com> To: davem@davemloft.net, kuba@kernel.org Cc: andrew@lunn.ch, vivien.didelot@gmail.com, f.fainelli@gmail.com, olteanv@gmail.com, roopa@nvidia.com, nikolay@nvidia.com, jiri@resnulli.us, idosch@idosch.org, stephen@networkplumber.org, netdev@vger.kernel.org, bridge@lists.linux-foundation.org Subject: [RFC net-next 7/9] net: dsa: mv88e6xxx: Allocate a virtual DSA port for each bridge Date: Mon, 26 Apr 2021 19:04:09 +0200 [thread overview] Message-ID: <20210426170411.1789186-8-tobias@waldekranz.com> (raw) In-Reply-To: <20210426170411.1789186-1-tobias@waldekranz.com> In the near future we want to offload transmission of both unicasts and multicasts from a bridge by sending a single FORWARD and use the switches' config to determine the destination(s). Much in the same way as we have already relied on them to do between user ports in the past. As isolation between bridges must still be maintained, we need to pass an identifier in the DSA tag that the switches can use to determine the set of physical ports that make up a particular flooding domain. Therefore: allocate a DSA device/port tuple that is not used by any physical device to each bridge we are offloading. We can then in upcoming changes use this tuple to setup cross-chip port based VLANs to restrict the set of valid egress ports to only contain the ports that are offloading the same bridge. Signed-off-by: Tobias Waldekranz <tobias@waldekranz.com> --- drivers/net/dsa/mv88e6xxx/Makefile | 1 + drivers/net/dsa/mv88e6xxx/chip.c | 11 +++ drivers/net/dsa/mv88e6xxx/dst.c | 127 +++++++++++++++++++++++++++++ drivers/net/dsa/mv88e6xxx/dst.h | 12 +++ include/net/dsa.h | 5 ++ 5 files changed, 156 insertions(+) create mode 100644 drivers/net/dsa/mv88e6xxx/dst.c create mode 100644 drivers/net/dsa/mv88e6xxx/dst.h diff --git a/drivers/net/dsa/mv88e6xxx/Makefile b/drivers/net/dsa/mv88e6xxx/Makefile index c8eca2b6f959..20e00695b28d 100644 --- a/drivers/net/dsa/mv88e6xxx/Makefile +++ b/drivers/net/dsa/mv88e6xxx/Makefile @@ -2,6 +2,7 @@ obj-$(CONFIG_NET_DSA_MV88E6XXX) += mv88e6xxx.o mv88e6xxx-objs := chip.o mv88e6xxx-objs += devlink.o +mv88e6xxx-objs += dst.o mv88e6xxx-objs += global1.o mv88e6xxx-objs += global1_atu.o mv88e6xxx-objs += global1_vtu.o diff --git a/drivers/net/dsa/mv88e6xxx/chip.c b/drivers/net/dsa/mv88e6xxx/chip.c index eca285aaf72f..06ef654472b7 100644 --- a/drivers/net/dsa/mv88e6xxx/chip.c +++ b/drivers/net/dsa/mv88e6xxx/chip.c @@ -33,6 +33,7 @@ #include "chip.h" #include "devlink.h" +#include "dst.h" #include "global1.h" #include "global2.h" #include "hwtstamp.h" @@ -2371,6 +2372,10 @@ static int mv88e6xxx_port_bridge_join(struct dsa_switch *ds, int port, struct mv88e6xxx_chip *chip = ds->priv; int err; + err = mv88e6xxx_dst_bridge_join(ds->dst, br); + if (err) + return err; + mv88e6xxx_reg_lock(chip); err = mv88e6xxx_bridge_map(chip, br); mv88e6xxx_reg_unlock(chip); @@ -2388,6 +2393,8 @@ static void mv88e6xxx_port_bridge_leave(struct dsa_switch *ds, int port, mv88e6xxx_port_vlan_map(chip, port)) dev_err(ds->dev, "failed to remap in-chip Port VLAN\n"); mv88e6xxx_reg_unlock(chip); + + mv88e6xxx_dst_bridge_leave(ds->dst, br); } static int mv88e6xxx_crosschip_bridge_join(struct dsa_switch *ds, @@ -3027,6 +3034,10 @@ static int mv88e6xxx_setup(struct dsa_switch *ds) mv88e6xxx_reg_lock(chip); + err = mv88e6xxx_dst_add_chip(chip); + if (err) + goto unlock; + if (chip->info->ops->setup_errata) { err = chip->info->ops->setup_errata(chip); if (err) diff --git a/drivers/net/dsa/mv88e6xxx/dst.c b/drivers/net/dsa/mv88e6xxx/dst.c new file mode 100644 index 000000000000..399a818063bf --- /dev/null +++ b/drivers/net/dsa/mv88e6xxx/dst.c @@ -0,0 +1,127 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * mv88e6xxx global DSA switch tree state + */ + +#include <linux/bitmap.h> +#include <linux/dsa/mv88e6xxx.h> +#include <linux/list.h> +#include <linux/module.h> +#include <linux/netdevice.h> +#include <net/dsa.h> + +#include "chip.h" +#include "dst.h" +#include "global2.h" + +struct mv88e6xxx_br { + struct list_head list; + + struct net_device *brdev; + u8 dev; + u8 port; +}; + +struct mv88e6xxx_dst { + struct list_head bridges; + + DECLARE_BITMAP(busy_ports, MV88E6XXX_MAX_PVT_ENTRIES); + +#define DEV_PORT_TO_BIT(_dev, _port) \ + ((_dev) * MV88E6XXX_MAX_PVT_PORTS + (_port)) +#define DEV_FROM_BIT(_bit) ((_bit) / MV88E6XXX_MAX_PVT_PORTS) +#define PORT_FROM_BIT(_bit) ((_bit) % (MV88E6XXX_MAX_PVT_PORTS)) +}; + +int mv88e6xxx_dst_bridge_join(struct dsa_switch_tree *dst, + struct net_device *brdev) +{ + struct mv88e6xxx_dst *mvdst = dst->priv; + struct mv88e6xxx_br *mvbr; + unsigned int bit; + + list_for_each_entry(mvbr, &mvdst->bridges, list) { + if (mvbr->brdev == brdev) + return 0; + } + + bit = find_first_zero_bit(mvdst->busy_ports, + MV88E6XXX_MAX_PVT_ENTRIES); + + if (bit >= MV88E6XXX_MAX_PVT_ENTRIES) { + pr_err("Unable to allocate virtual port for %s in DSA tree %d\n", + netdev_name(brdev), dst->index); + return -ENOSPC; + } + + mvbr = kzalloc(sizeof(*mvbr), GFP_KERNEL); + if (!mvbr) + return -ENOMEM; + + mvbr->brdev = brdev; + mvbr->dev = DEV_FROM_BIT(bit); + mvbr->port = PORT_FROM_BIT(bit); + + INIT_LIST_HEAD(&mvbr->list); + list_add_tail(&mvbr->list, &mvdst->bridges); + set_bit(bit, mvdst->busy_ports); + return 0; +} + +void mv88e6xxx_dst_bridge_leave(struct dsa_switch_tree *dst, + struct net_device *brdev) +{ + struct mv88e6xxx_dst *mvdst = dst->priv; + struct mv88e6xxx_br *mvbr; + struct dsa_port *dp; + + list_for_each_entry(dp, &dst->ports, list) { + if (dp->bridge_dev == brdev) + return; + } + + list_for_each_entry(mvbr, &mvdst->bridges, list) { + if (mvbr->brdev == brdev) { + clear_bit(DEV_PORT_TO_BIT(mvbr->dev, mvbr->port), + mvdst->busy_ports); + list_del(&mvbr->list); + kfree(mvbr); + return; + } + } +} + +static struct mv88e6xxx_dst *mv88e6xxx_dst_get(struct dsa_switch_tree *dst) +{ + struct mv88e6xxx_dst *mvdst; + + if (dst->priv) + return dst->priv; + + mvdst = kzalloc(sizeof(*mvdst), GFP_KERNEL); + if (!mvdst) + return ERR_PTR(-ENOMEM); + + INIT_LIST_HEAD(&mvdst->bridges); + + bitmap_set(mvdst->busy_ports, + DEV_PORT_TO_BIT(MV88E6XXX_G2_PVT_ADDR_DEV_TRUNK, 0), + MV88E6XXX_MAX_PVT_PORTS); + + dst->priv = mvdst; + return mvdst; +} + +int mv88e6xxx_dst_add_chip(struct mv88e6xxx_chip *chip) +{ + struct dsa_switch_tree *dst = chip->ds->dst; + struct mv88e6xxx_dst *mvdst; + + mvdst = mv88e6xxx_dst_get(dst); + if (IS_ERR(mvdst)) + return PTR_ERR(mvdst); + + bitmap_set(mvdst->busy_ports, DEV_PORT_TO_BIT(chip->ds->index, 0), + MV88E6XXX_MAX_PVT_PORTS); + return 0; +} diff --git a/drivers/net/dsa/mv88e6xxx/dst.h b/drivers/net/dsa/mv88e6xxx/dst.h new file mode 100644 index 000000000000..3845a19192ef --- /dev/null +++ b/drivers/net/dsa/mv88e6xxx/dst.h @@ -0,0 +1,12 @@ +/* SPDX-License-Identifier: GPL-2.0 */ + +#ifndef _MV88E6XXX_DST_H +#define _MV88E6XXX_DST_H + +int mv88e6xxx_dst_bridge_join(struct dsa_switch_tree *dst, + struct net_device *brdev); +void mv88e6xxx_dst_bridge_leave(struct dsa_switch_tree *dst, + struct net_device *brdev); +int mv88e6xxx_dst_add_chip(struct mv88e6xxx_chip *chip); + +#endif /* _MV88E6XXX_DST_H */ diff --git a/include/net/dsa.h b/include/net/dsa.h index 77d4df819299..c01e74d6e134 100644 --- a/include/net/dsa.h +++ b/include/net/dsa.h @@ -172,6 +172,11 @@ struct dsa_switch_tree { */ struct net_device **lags; unsigned int lags_len; + + /* Give the switch driver somewhere to hang its tree-wide + * private data structure. + */ + void *priv; }; #define dsa_lags_foreach_id(_id, _dst) \ -- 2.25.1
WARNING: multiple messages have this Message-ID (diff)
From: Tobias Waldekranz <tobias@waldekranz.com> To: davem@davemloft.net, kuba@kernel.org Cc: andrew@lunn.ch, f.fainelli@gmail.com, jiri@resnulli.us, netdev@vger.kernel.org, bridge@lists.linux-foundation.org, idosch@idosch.org, nikolay@nvidia.com, roopa@nvidia.com, olteanv@gmail.com, vivien.didelot@gmail.com Subject: [Bridge] [RFC net-next 7/9] net: dsa: mv88e6xxx: Allocate a virtual DSA port for each bridge Date: Mon, 26 Apr 2021 19:04:09 +0200 [thread overview] Message-ID: <20210426170411.1789186-8-tobias@waldekranz.com> (raw) In-Reply-To: <20210426170411.1789186-1-tobias@waldekranz.com> In the near future we want to offload transmission of both unicasts and multicasts from a bridge by sending a single FORWARD and use the switches' config to determine the destination(s). Much in the same way as we have already relied on them to do between user ports in the past. As isolation between bridges must still be maintained, we need to pass an identifier in the DSA tag that the switches can use to determine the set of physical ports that make up a particular flooding domain. Therefore: allocate a DSA device/port tuple that is not used by any physical device to each bridge we are offloading. We can then in upcoming changes use this tuple to setup cross-chip port based VLANs to restrict the set of valid egress ports to only contain the ports that are offloading the same bridge. Signed-off-by: Tobias Waldekranz <tobias@waldekranz.com> --- drivers/net/dsa/mv88e6xxx/Makefile | 1 + drivers/net/dsa/mv88e6xxx/chip.c | 11 +++ drivers/net/dsa/mv88e6xxx/dst.c | 127 +++++++++++++++++++++++++++++ drivers/net/dsa/mv88e6xxx/dst.h | 12 +++ include/net/dsa.h | 5 ++ 5 files changed, 156 insertions(+) create mode 100644 drivers/net/dsa/mv88e6xxx/dst.c create mode 100644 drivers/net/dsa/mv88e6xxx/dst.h diff --git a/drivers/net/dsa/mv88e6xxx/Makefile b/drivers/net/dsa/mv88e6xxx/Makefile index c8eca2b6f959..20e00695b28d 100644 --- a/drivers/net/dsa/mv88e6xxx/Makefile +++ b/drivers/net/dsa/mv88e6xxx/Makefile @@ -2,6 +2,7 @@ obj-$(CONFIG_NET_DSA_MV88E6XXX) += mv88e6xxx.o mv88e6xxx-objs := chip.o mv88e6xxx-objs += devlink.o +mv88e6xxx-objs += dst.o mv88e6xxx-objs += global1.o mv88e6xxx-objs += global1_atu.o mv88e6xxx-objs += global1_vtu.o diff --git a/drivers/net/dsa/mv88e6xxx/chip.c b/drivers/net/dsa/mv88e6xxx/chip.c index eca285aaf72f..06ef654472b7 100644 --- a/drivers/net/dsa/mv88e6xxx/chip.c +++ b/drivers/net/dsa/mv88e6xxx/chip.c @@ -33,6 +33,7 @@ #include "chip.h" #include "devlink.h" +#include "dst.h" #include "global1.h" #include "global2.h" #include "hwtstamp.h" @@ -2371,6 +2372,10 @@ static int mv88e6xxx_port_bridge_join(struct dsa_switch *ds, int port, struct mv88e6xxx_chip *chip = ds->priv; int err; + err = mv88e6xxx_dst_bridge_join(ds->dst, br); + if (err) + return err; + mv88e6xxx_reg_lock(chip); err = mv88e6xxx_bridge_map(chip, br); mv88e6xxx_reg_unlock(chip); @@ -2388,6 +2393,8 @@ static void mv88e6xxx_port_bridge_leave(struct dsa_switch *ds, int port, mv88e6xxx_port_vlan_map(chip, port)) dev_err(ds->dev, "failed to remap in-chip Port VLAN\n"); mv88e6xxx_reg_unlock(chip); + + mv88e6xxx_dst_bridge_leave(ds->dst, br); } static int mv88e6xxx_crosschip_bridge_join(struct dsa_switch *ds, @@ -3027,6 +3034,10 @@ static int mv88e6xxx_setup(struct dsa_switch *ds) mv88e6xxx_reg_lock(chip); + err = mv88e6xxx_dst_add_chip(chip); + if (err) + goto unlock; + if (chip->info->ops->setup_errata) { err = chip->info->ops->setup_errata(chip); if (err) diff --git a/drivers/net/dsa/mv88e6xxx/dst.c b/drivers/net/dsa/mv88e6xxx/dst.c new file mode 100644 index 000000000000..399a818063bf --- /dev/null +++ b/drivers/net/dsa/mv88e6xxx/dst.c @@ -0,0 +1,127 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * mv88e6xxx global DSA switch tree state + */ + +#include <linux/bitmap.h> +#include <linux/dsa/mv88e6xxx.h> +#include <linux/list.h> +#include <linux/module.h> +#include <linux/netdevice.h> +#include <net/dsa.h> + +#include "chip.h" +#include "dst.h" +#include "global2.h" + +struct mv88e6xxx_br { + struct list_head list; + + struct net_device *brdev; + u8 dev; + u8 port; +}; + +struct mv88e6xxx_dst { + struct list_head bridges; + + DECLARE_BITMAP(busy_ports, MV88E6XXX_MAX_PVT_ENTRIES); + +#define DEV_PORT_TO_BIT(_dev, _port) \ + ((_dev) * MV88E6XXX_MAX_PVT_PORTS + (_port)) +#define DEV_FROM_BIT(_bit) ((_bit) / MV88E6XXX_MAX_PVT_PORTS) +#define PORT_FROM_BIT(_bit) ((_bit) % (MV88E6XXX_MAX_PVT_PORTS)) +}; + +int mv88e6xxx_dst_bridge_join(struct dsa_switch_tree *dst, + struct net_device *brdev) +{ + struct mv88e6xxx_dst *mvdst = dst->priv; + struct mv88e6xxx_br *mvbr; + unsigned int bit; + + list_for_each_entry(mvbr, &mvdst->bridges, list) { + if (mvbr->brdev == brdev) + return 0; + } + + bit = find_first_zero_bit(mvdst->busy_ports, + MV88E6XXX_MAX_PVT_ENTRIES); + + if (bit >= MV88E6XXX_MAX_PVT_ENTRIES) { + pr_err("Unable to allocate virtual port for %s in DSA tree %d\n", + netdev_name(brdev), dst->index); + return -ENOSPC; + } + + mvbr = kzalloc(sizeof(*mvbr), GFP_KERNEL); + if (!mvbr) + return -ENOMEM; + + mvbr->brdev = brdev; + mvbr->dev = DEV_FROM_BIT(bit); + mvbr->port = PORT_FROM_BIT(bit); + + INIT_LIST_HEAD(&mvbr->list); + list_add_tail(&mvbr->list, &mvdst->bridges); + set_bit(bit, mvdst->busy_ports); + return 0; +} + +void mv88e6xxx_dst_bridge_leave(struct dsa_switch_tree *dst, + struct net_device *brdev) +{ + struct mv88e6xxx_dst *mvdst = dst->priv; + struct mv88e6xxx_br *mvbr; + struct dsa_port *dp; + + list_for_each_entry(dp, &dst->ports, list) { + if (dp->bridge_dev == brdev) + return; + } + + list_for_each_entry(mvbr, &mvdst->bridges, list) { + if (mvbr->brdev == brdev) { + clear_bit(DEV_PORT_TO_BIT(mvbr->dev, mvbr->port), + mvdst->busy_ports); + list_del(&mvbr->list); + kfree(mvbr); + return; + } + } +} + +static struct mv88e6xxx_dst *mv88e6xxx_dst_get(struct dsa_switch_tree *dst) +{ + struct mv88e6xxx_dst *mvdst; + + if (dst->priv) + return dst->priv; + + mvdst = kzalloc(sizeof(*mvdst), GFP_KERNEL); + if (!mvdst) + return ERR_PTR(-ENOMEM); + + INIT_LIST_HEAD(&mvdst->bridges); + + bitmap_set(mvdst->busy_ports, + DEV_PORT_TO_BIT(MV88E6XXX_G2_PVT_ADDR_DEV_TRUNK, 0), + MV88E6XXX_MAX_PVT_PORTS); + + dst->priv = mvdst; + return mvdst; +} + +int mv88e6xxx_dst_add_chip(struct mv88e6xxx_chip *chip) +{ + struct dsa_switch_tree *dst = chip->ds->dst; + struct mv88e6xxx_dst *mvdst; + + mvdst = mv88e6xxx_dst_get(dst); + if (IS_ERR(mvdst)) + return PTR_ERR(mvdst); + + bitmap_set(mvdst->busy_ports, DEV_PORT_TO_BIT(chip->ds->index, 0), + MV88E6XXX_MAX_PVT_PORTS); + return 0; +} diff --git a/drivers/net/dsa/mv88e6xxx/dst.h b/drivers/net/dsa/mv88e6xxx/dst.h new file mode 100644 index 000000000000..3845a19192ef --- /dev/null +++ b/drivers/net/dsa/mv88e6xxx/dst.h @@ -0,0 +1,12 @@ +/* SPDX-License-Identifier: GPL-2.0 */ + +#ifndef _MV88E6XXX_DST_H +#define _MV88E6XXX_DST_H + +int mv88e6xxx_dst_bridge_join(struct dsa_switch_tree *dst, + struct net_device *brdev); +void mv88e6xxx_dst_bridge_leave(struct dsa_switch_tree *dst, + struct net_device *brdev); +int mv88e6xxx_dst_add_chip(struct mv88e6xxx_chip *chip); + +#endif /* _MV88E6XXX_DST_H */ diff --git a/include/net/dsa.h b/include/net/dsa.h index 77d4df819299..c01e74d6e134 100644 --- a/include/net/dsa.h +++ b/include/net/dsa.h @@ -172,6 +172,11 @@ struct dsa_switch_tree { */ struct net_device **lags; unsigned int lags_len; + + /* Give the switch driver somewhere to hang its tree-wide + * private data structure. + */ + void *priv; }; #define dsa_lags_foreach_id(_id, _dst) \ -- 2.25.1
next prev parent reply other threads:[~2021-04-26 17:05 UTC|newest] Thread overview: 85+ messages / expand[flat|nested] mbox.gz Atom feed top 2021-04-26 17:04 [RFC net-next 0/9] net: bridge: Forward offloading Tobias Waldekranz 2021-04-26 17:04 ` [Bridge] " Tobias Waldekranz 2021-04-26 17:04 ` [RFC net-next 1/9] net: dfwd: Constrain existing users to macvlan subordinates Tobias Waldekranz 2021-04-26 17:04 ` [Bridge] " Tobias Waldekranz 2021-04-26 17:04 ` [RFC net-next 2/9] net: bridge: Disambiguate offload_fwd_mark Tobias Waldekranz 2021-04-26 17:04 ` [Bridge] " Tobias Waldekranz 2021-05-02 15:00 ` Ido Schimmel 2021-05-02 15:00 ` [Bridge] " Ido Schimmel 2021-05-03 8:49 ` Tobias Waldekranz 2021-05-03 8:49 ` [Bridge] " Tobias Waldekranz 2021-05-05 7:39 ` Ido Schimmel 2021-05-05 7:39 ` [Bridge] " Ido Schimmel 2021-04-26 17:04 ` [RFC net-next 3/9] net: bridge: switchdev: Recycle unused hwdoms Tobias Waldekranz 2021-04-26 17:04 ` [Bridge] " Tobias Waldekranz 2021-04-27 10:42 ` Nikolay Aleksandrov 2021-04-27 10:42 ` [Bridge] " Nikolay Aleksandrov 2021-04-26 17:04 ` [RFC net-next 4/9] net: bridge: switchdev: Forward offloading Tobias Waldekranz 2021-04-26 17:04 ` [Bridge] " Tobias Waldekranz 2021-04-27 10:35 ` Nikolay Aleksandrov 2021-04-27 10:35 ` [Bridge] " Nikolay Aleksandrov 2021-04-28 22:47 ` Tobias Waldekranz 2021-04-28 22:47 ` [Bridge] " Tobias Waldekranz 2021-04-29 9:16 ` Nikolay Aleksandrov 2021-04-29 9:16 ` [Bridge] " Nikolay Aleksandrov 2021-04-29 14:55 ` Tobias Waldekranz 2021-04-29 14:55 ` [Bridge] " Tobias Waldekranz 2021-05-02 15:04 ` Ido Schimmel 2021-05-02 15:04 ` [Bridge] " Ido Schimmel 2021-05-03 8:53 ` Tobias Waldekranz 2021-05-03 8:53 ` [Bridge] " Tobias Waldekranz 2021-05-06 11:01 ` Vladimir Oltean 2021-05-06 11:01 ` [Bridge] " Vladimir Oltean 2021-04-26 17:04 ` [RFC net-next 5/9] net: dsa: Track port PVIDs Tobias Waldekranz 2021-04-26 17:04 ` [Bridge] " Tobias Waldekranz 2021-04-26 19:40 ` Vladimir Oltean 2021-04-26 19:40 ` [Bridge] " Vladimir Oltean 2021-04-26 20:05 ` Tobias Waldekranz 2021-04-26 20:05 ` [Bridge] " Tobias Waldekranz 2021-04-26 20:28 ` Vladimir Oltean 2021-04-26 20:28 ` [Bridge] " Vladimir Oltean 2021-04-27 9:12 ` Tobias Waldekranz 2021-04-27 9:12 ` [Bridge] " Tobias Waldekranz 2021-04-27 9:27 ` Vladimir Oltean 2021-04-27 9:27 ` [Bridge] " Vladimir Oltean 2021-04-27 10:07 ` Vladimir Oltean 2021-04-27 10:07 ` [Bridge] " Vladimir Oltean 2021-04-28 23:10 ` Tobias Waldekranz 2021-04-28 23:10 ` [Bridge] " Tobias Waldekranz 2021-04-26 17:04 ` [RFC net-next 6/9] net: dsa: Forward offloading Tobias Waldekranz 2021-04-26 17:04 ` [Bridge] " Tobias Waldekranz 2021-04-27 10:17 ` Vladimir Oltean 2021-04-27 10:17 ` [Bridge] " Vladimir Oltean 2021-05-04 14:44 ` Tobias Waldekranz 2021-05-04 14:44 ` [Bridge] " Tobias Waldekranz 2021-05-04 15:21 ` Vladimir Oltean 2021-05-04 15:21 ` [Bridge] " Vladimir Oltean 2021-05-04 20:07 ` Tobias Waldekranz 2021-05-04 20:07 ` [Bridge] " Tobias Waldekranz 2021-05-04 20:33 ` Andrew Lunn 2021-05-04 20:33 ` [Bridge] " Andrew Lunn 2021-05-04 21:24 ` Tobias Waldekranz 2021-05-04 21:24 ` [Bridge] " Tobias Waldekranz 2021-05-04 20:58 ` Vladimir Oltean 2021-05-04 20:58 ` [Bridge] " Vladimir Oltean 2021-05-04 22:12 ` Tobias Waldekranz 2021-05-04 22:12 ` [Bridge] " Tobias Waldekranz 2021-05-04 23:04 ` Vladimir Oltean 2021-05-04 23:04 ` [Bridge] " Vladimir Oltean 2021-05-05 9:01 ` Tobias Waldekranz 2021-05-05 9:01 ` [Bridge] " Tobias Waldekranz 2021-05-05 16:12 ` Vladimir Oltean 2021-05-05 16:12 ` [Bridge] " Vladimir Oltean 2021-04-26 17:04 ` Tobias Waldekranz [this message] 2021-04-26 17:04 ` [Bridge] [RFC net-next 7/9] net: dsa: mv88e6xxx: Allocate a virtual DSA port for each bridge Tobias Waldekranz 2021-04-26 17:04 ` [RFC net-next 8/9] net: dsa: mv88e6xxx: Map virtual bridge port in PVT Tobias Waldekranz 2021-04-26 17:04 ` [Bridge] " Tobias Waldekranz 2021-04-26 17:04 ` [RFC net-next 9/9] net: dsa: mv88e6xxx: Forward offloading Tobias Waldekranz 2021-04-26 17:04 ` [Bridge] " Tobias Waldekranz 2021-04-27 1:31 ` kernel test robot 2021-05-02 14:58 ` [RFC net-next 0/9] net: bridge: " Ido Schimmel 2021-05-02 14:58 ` [Bridge] " Ido Schimmel 2021-05-03 9:44 ` Tobias Waldekranz 2021-05-03 9:44 ` [Bridge] " Tobias Waldekranz 2021-05-06 10:59 ` Vladimir Oltean 2021-05-06 10:59 ` [Bridge] " Vladimir Oltean
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=20210426170411.1789186-8-tobias@waldekranz.com \ --to=tobias@waldekranz.com \ --cc=andrew@lunn.ch \ --cc=bridge@lists.linux-foundation.org \ --cc=davem@davemloft.net \ --cc=f.fainelli@gmail.com \ --cc=idosch@idosch.org \ --cc=jiri@resnulli.us \ --cc=kuba@kernel.org \ --cc=netdev@vger.kernel.org \ --cc=nikolay@nvidia.com \ --cc=olteanv@gmail.com \ --cc=roopa@nvidia.com \ --cc=stephen@networkplumber.org \ --cc=vivien.didelot@gmail.com \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.