@@ -510,6 +510,39 @@ void b53_imp_vlan_setup(struct dsa_switch *ds, int cpu_port)
510
510
}
511
511
EXPORT_SYMBOL (b53_imp_vlan_setup );
512
512
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
+
513
546
int b53_enable_port (struct dsa_switch * ds , int port , struct phy_device * phy )
514
547
{
515
548
struct b53_device * dev = ds -> priv ;
@@ -522,7 +555,8 @@ int b53_enable_port(struct dsa_switch *ds, int port, struct phy_device *phy)
522
555
523
556
cpu_port = dsa_to_port (ds , port )-> cpu_dp -> index ;
524
557
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);
526
560
527
561
if (dev -> ops -> irq_enable )
528
562
ret = dev -> ops -> irq_enable (dev , port );
@@ -655,7 +689,8 @@ static void b53_enable_cpu_port(struct b53_device *dev, int port)
655
689
656
690
b53_brcm_hdr_setup (dev -> ds , port );
657
691
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);
659
694
}
660
695
661
696
static void b53_enable_mib (struct b53_device * dev )
@@ -1916,37 +1951,37 @@ void b53_br_fast_age(struct dsa_switch *ds, int port)
1916
1951
}
1917
1952
EXPORT_SYMBOL (b53_br_fast_age );
1918
1953
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 )
1921
1957
{
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 ;
1931
1960
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
+ }
1938
1963
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 ));
1945
1974
1946
1975
return 0 ;
1976
+ }
1947
1977
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 ;
1948
1984
}
1949
- EXPORT_SYMBOL (b53_br_egress_floods );
1950
1985
1951
1986
static bool b53_possible_cpu_port (struct dsa_switch * ds , int port )
1952
1987
{
@@ -2187,9 +2222,11 @@ static const struct dsa_switch_ops b53_switch_ops = {
2187
2222
.set_mac_eee = b53_set_mac_eee ,
2188
2223
.port_bridge_join = b53_br_join ,
2189
2224
.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 ,
2190
2228
.port_stp_state_set = b53_br_set_stp_state ,
2191
2229
.port_fast_age = b53_br_fast_age ,
2192
- .port_egress_floods = b53_br_egress_floods ,
2193
2230
.port_vlan_filtering = b53_vlan_filtering ,
2194
2231
.port_vlan_add = b53_vlan_add ,
2195
2232
.port_vlan_del = b53_vlan_del ,
0 commit comments