Skip to content

Commit 4098ced

Browse files
committed
Merge branch 'brport-flags'
Vladimir Oltean says: ==================== Cleanup in brport flags switchdev offload for DSA The initial goal of this series was to have better support for standalone ports mode on the DSA drivers like ocelot/felix and sja1105. This turned out to require some API adjustments in both directions: to the information presented to and by the switchdev notifier, and to the API presented to the switch drivers by the DSA layer. ==================== Signed-off-by: David S. Miller <[email protected]>
2 parents b0aae0b + 4d94235 commit 4098ced

File tree

29 files changed

+889
-331
lines changed

29 files changed

+889
-331
lines changed

drivers/net/dsa/b53/b53_common.c

Lines changed: 64 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -510,6 +510,39 @@ void b53_imp_vlan_setup(struct dsa_switch *ds, int cpu_port)
510510
}
511511
EXPORT_SYMBOL(b53_imp_vlan_setup);
512512

513+
static void b53_port_set_ucast_flood(struct b53_device *dev, int port,
514+
bool unicast)
515+
{
516+
u16 uc;
517+
518+
b53_read16(dev, B53_CTRL_PAGE, B53_UC_FLOOD_MASK, &uc);
519+
if (unicast)
520+
uc |= BIT(port);
521+
else
522+
uc &= ~BIT(port);
523+
b53_write16(dev, B53_CTRL_PAGE, B53_UC_FLOOD_MASK, uc);
524+
}
525+
526+
static void b53_port_set_mcast_flood(struct b53_device *dev, int port,
527+
bool multicast)
528+
{
529+
u16 mc;
530+
531+
b53_read16(dev, B53_CTRL_PAGE, B53_MC_FLOOD_MASK, &mc);
532+
if (multicast)
533+
mc |= BIT(port);
534+
else
535+
mc &= ~BIT(port);
536+
b53_write16(dev, B53_CTRL_PAGE, B53_MC_FLOOD_MASK, mc);
537+
538+
b53_read16(dev, B53_CTRL_PAGE, B53_IPMC_FLOOD_MASK, &mc);
539+
if (multicast)
540+
mc |= BIT(port);
541+
else
542+
mc &= ~BIT(port);
543+
b53_write16(dev, B53_CTRL_PAGE, B53_IPMC_FLOOD_MASK, mc);
544+
}
545+
513546
int b53_enable_port(struct dsa_switch *ds, int port, struct phy_device *phy)
514547
{
515548
struct b53_device *dev = ds->priv;
@@ -522,7 +555,8 @@ int b53_enable_port(struct dsa_switch *ds, int port, struct phy_device *phy)
522555

523556
cpu_port = dsa_to_port(ds, port)->cpu_dp->index;
524557

525-
b53_br_egress_floods(ds, port, true, true);
558+
b53_port_set_ucast_flood(dev, port, true);
559+
b53_port_set_mcast_flood(dev, port, true);
526560

527561
if (dev->ops->irq_enable)
528562
ret = dev->ops->irq_enable(dev, port);
@@ -655,7 +689,8 @@ static void b53_enable_cpu_port(struct b53_device *dev, int port)
655689

656690
b53_brcm_hdr_setup(dev->ds, port);
657691

658-
b53_br_egress_floods(dev->ds, port, true, true);
692+
b53_port_set_ucast_flood(dev, port, true);
693+
b53_port_set_mcast_flood(dev, port, true);
659694
}
660695

661696
static void b53_enable_mib(struct b53_device *dev)
@@ -1916,37 +1951,37 @@ void b53_br_fast_age(struct dsa_switch *ds, int port)
19161951
}
19171952
EXPORT_SYMBOL(b53_br_fast_age);
19181953

1919-
int b53_br_egress_floods(struct dsa_switch *ds, int port,
1920-
bool unicast, bool multicast)
1954+
static int b53_br_flags_pre(struct dsa_switch *ds, int port,
1955+
struct switchdev_brport_flags flags,
1956+
struct netlink_ext_ack *extack)
19211957
{
1922-
struct b53_device *dev = ds->priv;
1923-
u16 uc, mc;
1924-
1925-
b53_read16(dev, B53_CTRL_PAGE, B53_UC_FLOOD_MASK, &uc);
1926-
if (unicast)
1927-
uc |= BIT(port);
1928-
else
1929-
uc &= ~BIT(port);
1930-
b53_write16(dev, B53_CTRL_PAGE, B53_UC_FLOOD_MASK, uc);
1958+
if (flags.mask & ~(BR_FLOOD | BR_MCAST_FLOOD))
1959+
return -EINVAL;
19311960

1932-
b53_read16(dev, B53_CTRL_PAGE, B53_MC_FLOOD_MASK, &mc);
1933-
if (multicast)
1934-
mc |= BIT(port);
1935-
else
1936-
mc &= ~BIT(port);
1937-
b53_write16(dev, B53_CTRL_PAGE, B53_MC_FLOOD_MASK, mc);
1961+
return 0;
1962+
}
19381963

1939-
b53_read16(dev, B53_CTRL_PAGE, B53_IPMC_FLOOD_MASK, &mc);
1940-
if (multicast)
1941-
mc |= BIT(port);
1942-
else
1943-
mc &= ~BIT(port);
1944-
b53_write16(dev, B53_CTRL_PAGE, B53_IPMC_FLOOD_MASK, mc);
1964+
static int b53_br_flags(struct dsa_switch *ds, int port,
1965+
struct switchdev_brport_flags flags,
1966+
struct netlink_ext_ack *extack)
1967+
{
1968+
if (flags.mask & BR_FLOOD)
1969+
b53_port_set_ucast_flood(ds->priv, port,
1970+
!!(flags.val & BR_FLOOD));
1971+
if (flags.mask & BR_MCAST_FLOOD)
1972+
b53_port_set_mcast_flood(ds->priv, port,
1973+
!!(flags.val & BR_MCAST_FLOOD));
19451974

19461975
return 0;
1976+
}
19471977

1978+
static int b53_set_mrouter(struct dsa_switch *ds, int port, bool mrouter,
1979+
struct netlink_ext_ack *extack)
1980+
{
1981+
b53_port_set_mcast_flood(ds->priv, port, mrouter);
1982+
1983+
return 0;
19481984
}
1949-
EXPORT_SYMBOL(b53_br_egress_floods);
19501985

19511986
static bool b53_possible_cpu_port(struct dsa_switch *ds, int port)
19521987
{
@@ -2187,9 +2222,11 @@ static const struct dsa_switch_ops b53_switch_ops = {
21872222
.set_mac_eee = b53_set_mac_eee,
21882223
.port_bridge_join = b53_br_join,
21892224
.port_bridge_leave = b53_br_leave,
2225+
.port_pre_bridge_flags = b53_br_flags_pre,
2226+
.port_bridge_flags = b53_br_flags,
2227+
.port_set_mrouter = b53_set_mrouter,
21902228
.port_stp_state_set = b53_br_set_stp_state,
21912229
.port_fast_age = b53_br_fast_age,
2192-
.port_egress_floods = b53_br_egress_floods,
21932230
.port_vlan_filtering = b53_vlan_filtering,
21942231
.port_vlan_add = b53_vlan_add,
21952232
.port_vlan_del = b53_vlan_del,

drivers/net/dsa/b53/b53_priv.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -326,8 +326,6 @@ int b53_br_join(struct dsa_switch *ds, int port, struct net_device *bridge);
326326
void b53_br_leave(struct dsa_switch *ds, int port, struct net_device *bridge);
327327
void b53_br_set_stp_state(struct dsa_switch *ds, int port, u8 state);
328328
void b53_br_fast_age(struct dsa_switch *ds, int port);
329-
int b53_br_egress_floods(struct dsa_switch *ds, int port,
330-
bool unicast, bool multicast);
331329
int b53_setup_devlink_resources(struct dsa_switch *ds);
332330
void b53_port_event(struct dsa_switch *ds, int port);
333331
void b53_phylink_validate(struct dsa_switch *ds, int port,

0 commit comments

Comments
 (0)