Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

net: dsa: b53: implement port isolation support

Implement port isolation support via the Protected Ports register.

Protected ports can only communicate with unprotected ports, but not
with each other, matching the expected behaviour of isolated ports.

Tested on BCM963268BU.

Signed-off-by: Jonas Gorski <jonas.gorski@gmail.com>
Reviewed-by: Florian Fainelli <florian.fainelli@broadcom.com>
Reviewed-by: Vladimir Oltean <olteanv@gmail.com>
Link: https://patch.msgid.link/20251013152834.100169-1-jonas.gorski@gmail.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>

authored by

Jonas Gorski and committed by
Jakub Kicinski
bdec4271 e0aa1152

+28 -1
+24 -1
drivers/net/dsa/b53/b53_common.c
··· 632 632 b53_write16(dev, B53_CTRL_PAGE, B53_DIS_LEARNING, reg); 633 633 } 634 634 635 + static void b53_port_set_isolated(struct b53_device *dev, int port, 636 + bool isolated) 637 + { 638 + u8 offset; 639 + u16 reg; 640 + 641 + if (is5325(dev)) 642 + offset = B53_PROTECTED_PORT_SEL_25; 643 + else 644 + offset = B53_PROTECTED_PORT_SEL; 645 + 646 + b53_read16(dev, B53_CTRL_PAGE, offset, &reg); 647 + if (isolated) 648 + reg |= BIT(port); 649 + else 650 + reg &= ~BIT(port); 651 + b53_write16(dev, B53_CTRL_PAGE, offset, reg); 652 + } 653 + 635 654 static void b53_eee_enable_set(struct dsa_switch *ds, int port, bool enable) 636 655 { 637 656 struct b53_device *dev = ds->priv; ··· 671 652 b53_port_set_ucast_flood(dev, port, true); 672 653 b53_port_set_mcast_flood(dev, port, true); 673 654 b53_port_set_learning(dev, port, false); 655 + b53_port_set_isolated(dev, port, false); 674 656 675 657 /* Force all traffic to go to the CPU port to prevent the ASIC from 676 658 * trying to forward to bridged ports on matching FDB entries, then ··· 2338 2318 struct netlink_ext_ack *extack) 2339 2319 { 2340 2320 struct b53_device *dev = ds->priv; 2341 - unsigned long mask = (BR_FLOOD | BR_MCAST_FLOOD); 2321 + unsigned long mask = (BR_FLOOD | BR_MCAST_FLOOD | BR_ISOLATED); 2342 2322 2343 2323 if (!is5325(dev)) 2344 2324 mask |= BR_LEARNING; ··· 2363 2343 if (flags.mask & BR_LEARNING) 2364 2344 b53_port_set_learning(ds->priv, port, 2365 2345 !!(flags.val & BR_LEARNING)); 2346 + if (flags.mask & BR_ISOLATED) 2347 + b53_port_set_isolated(ds->priv, port, 2348 + !!(flags.val & BR_ISOLATED)); 2366 2349 2367 2350 return 0; 2368 2351 }
+4
drivers/net/dsa/b53/b53_regs.h
··· 120 120 #define B53_SWITCH_CTRL 0x22 121 121 #define B53_MII_DUMB_FWDG_EN BIT(6) 122 122 123 + /* Protected Port Selection (16 bit) */ 124 + #define B53_PROTECTED_PORT_SEL 0x24 125 + #define B53_PROTECTED_PORT_SEL_25 0x26 126 + 123 127 /* (16 bit) */ 124 128 #define B53_UC_FLOOD_MASK 0x32 125 129 #define B53_MC_FLOOD_MASK 0x34