@@ -4026,6 +4026,7 @@ static void mlxsw_sp_master_bridge_dec(struct mlxsw_sp *mlxsw_sp)
4026
4026
}
4027
4027
4028
4028
static int mlxsw_sp_port_bridge_join (struct mlxsw_sp_port * mlxsw_sp_port ,
4029
+ struct net_device * brport_dev ,
4029
4030
struct net_device * br_dev )
4030
4031
{
4031
4032
struct net_device * dev = mlxsw_sp_port -> dev ;
@@ -4053,7 +4054,9 @@ static int mlxsw_sp_port_bridge_join(struct mlxsw_sp_port *mlxsw_sp_port,
4053
4054
return 0 ;
4054
4055
}
4055
4056
4056
- static void mlxsw_sp_port_bridge_leave (struct mlxsw_sp_port * mlxsw_sp_port )
4057
+ static void mlxsw_sp_port_bridge_leave (struct mlxsw_sp_port * mlxsw_sp_port ,
4058
+ struct net_device * brport_dev ,
4059
+ struct net_device * br_dev )
4057
4060
{
4058
4061
struct net_device * dev = mlxsw_sp_port -> dev ;
4059
4062
@@ -4302,7 +4305,7 @@ static void mlxsw_sp_port_lag_leave(struct mlxsw_sp_port *mlxsw_sp_port,
4302
4305
4303
4306
if (mlxsw_sp_port -> bridged ) {
4304
4307
mlxsw_sp_port_active_vlans_del (mlxsw_sp_port );
4305
- mlxsw_sp_port_bridge_leave (mlxsw_sp_port );
4308
+ mlxsw_sp_port_bridge_leave (mlxsw_sp_port , NULL , NULL );
4306
4309
}
4307
4310
4308
4311
if (lag -> ref_count == 1 )
@@ -4439,7 +4442,8 @@ static void mlxsw_sp_port_ovs_leave(struct mlxsw_sp_port *mlxsw_sp_port)
4439
4442
mlxsw_sp_port_vp_mode_set (mlxsw_sp_port , false);
4440
4443
}
4441
4444
4442
- static int mlxsw_sp_netdevice_port_upper_event (struct net_device * dev ,
4445
+ static int mlxsw_sp_netdevice_port_upper_event (struct net_device * lower_dev ,
4446
+ struct net_device * dev ,
4443
4447
unsigned long event , void * ptr )
4444
4448
{
4445
4449
struct netdev_notifier_changeupper_info * info ;
@@ -4492,9 +4496,12 @@ static int mlxsw_sp_netdevice_port_upper_event(struct net_device *dev,
4492
4496
} else if (netif_is_bridge_master (upper_dev )) {
4493
4497
if (info -> linking )
4494
4498
err = mlxsw_sp_port_bridge_join (mlxsw_sp_port ,
4499
+ lower_dev ,
4495
4500
upper_dev );
4496
4501
else
4497
- mlxsw_sp_port_bridge_leave (mlxsw_sp_port );
4502
+ mlxsw_sp_port_bridge_leave (mlxsw_sp_port ,
4503
+ lower_dev ,
4504
+ upper_dev );
4498
4505
} else if (netif_is_lag_master (upper_dev )) {
4499
4506
if (info -> linking )
4500
4507
err = mlxsw_sp_port_lag_join (mlxsw_sp_port ,
@@ -4541,15 +4548,18 @@ static int mlxsw_sp_netdevice_port_lower_event(struct net_device *dev,
4541
4548
return 0 ;
4542
4549
}
4543
4550
4544
- static int mlxsw_sp_netdevice_port_event (struct net_device * dev ,
4551
+ static int mlxsw_sp_netdevice_port_event (struct net_device * lower_dev ,
4552
+ struct net_device * port_dev ,
4545
4553
unsigned long event , void * ptr )
4546
4554
{
4547
4555
switch (event ) {
4548
4556
case NETDEV_PRECHANGEUPPER :
4549
4557
case NETDEV_CHANGEUPPER :
4550
- return mlxsw_sp_netdevice_port_upper_event (dev , event , ptr );
4558
+ return mlxsw_sp_netdevice_port_upper_event (lower_dev , port_dev ,
4559
+ event , ptr );
4551
4560
case NETDEV_CHANGELOWERSTATE :
4552
- return mlxsw_sp_netdevice_port_lower_event (dev , event , ptr );
4561
+ return mlxsw_sp_netdevice_port_lower_event (port_dev , event ,
4562
+ ptr );
4553
4563
}
4554
4564
4555
4565
return 0 ;
@@ -4564,7 +4574,8 @@ static int mlxsw_sp_netdevice_lag_event(struct net_device *lag_dev,
4564
4574
4565
4575
netdev_for_each_lower_dev (lag_dev , dev , iter ) {
4566
4576
if (mlxsw_sp_port_dev_check (dev )) {
4567
- ret = mlxsw_sp_netdevice_port_event (dev , event , ptr );
4577
+ ret = mlxsw_sp_netdevice_port_event (lag_dev , dev , event ,
4578
+ ptr );
4568
4579
if (ret )
4569
4580
return ret ;
4570
4581
}
@@ -4807,6 +4818,7 @@ mlxsw_sp_port_vlan_vfid_leave(struct mlxsw_sp_port_vlan *mlxsw_sp_port_vlan)
4807
4818
}
4808
4819
4809
4820
static int mlxsw_sp_vport_bridge_join (struct mlxsw_sp_port * mlxsw_sp_vport ,
4821
+ struct net_device * brport_dev ,
4810
4822
struct net_device * br_dev )
4811
4823
{
4812
4824
struct mlxsw_sp_fid * f = mlxsw_sp_vport_fid_get (mlxsw_sp_vport );
@@ -4848,7 +4860,9 @@ static int mlxsw_sp_vport_bridge_join(struct mlxsw_sp_port *mlxsw_sp_vport,
4848
4860
return err ;
4849
4861
}
4850
4862
4851
- static void mlxsw_sp_vport_bridge_leave (struct mlxsw_sp_port * mlxsw_sp_vport )
4863
+ static void mlxsw_sp_vport_bridge_leave (struct mlxsw_sp_port * mlxsw_sp_vport ,
4864
+ struct net_device * brport_dev ,
4865
+ struct net_device * br_dev )
4852
4866
{
4853
4867
u16 vid = mlxsw_sp_vport_vid_get (mlxsw_sp_vport );
4854
4868
struct mlxsw_sp_port_vlan * mlxsw_sp_port_vlan ;
@@ -4885,9 +4899,10 @@ mlxsw_sp_port_master_bridge_check(const struct mlxsw_sp_port *mlxsw_sp_port,
4885
4899
return true;
4886
4900
}
4887
4901
4888
- static int mlxsw_sp_netdevice_vport_event (struct net_device * dev ,
4889
- unsigned long event , void * ptr ,
4890
- u16 vid )
4902
+ static int mlxsw_sp_netdevice_port_vlan_event (struct net_device * vlan_dev ,
4903
+ struct net_device * dev ,
4904
+ unsigned long event , void * ptr ,
4905
+ u16 vid )
4891
4906
{
4892
4907
struct mlxsw_sp_port * mlxsw_sp_port = netdev_priv (dev );
4893
4908
struct netdev_notifier_changeupper_info * info = ptr ;
@@ -4919,9 +4934,12 @@ static int mlxsw_sp_netdevice_vport_event(struct net_device *dev,
4919
4934
if (netif_is_bridge_master (upper_dev )) {
4920
4935
if (info -> linking )
4921
4936
err = mlxsw_sp_vport_bridge_join (mlxsw_sp_vport ,
4937
+ vlan_dev ,
4922
4938
upper_dev );
4923
4939
else
4924
- mlxsw_sp_vport_bridge_leave (mlxsw_sp_vport );
4940
+ mlxsw_sp_vport_bridge_leave (mlxsw_sp_vport ,
4941
+ vlan_dev ,
4942
+ upper_dev );
4925
4943
} else {
4926
4944
err = - EINVAL ;
4927
4945
WARN_ON (1 );
@@ -4932,18 +4950,20 @@ static int mlxsw_sp_netdevice_vport_event(struct net_device *dev,
4932
4950
return err ;
4933
4951
}
4934
4952
4935
- static int mlxsw_sp_netdevice_lag_vport_event (struct net_device * lag_dev ,
4936
- unsigned long event , void * ptr ,
4937
- u16 vid )
4953
+ static int mlxsw_sp_netdevice_lag_port_vlan_event (struct net_device * vlan_dev ,
4954
+ struct net_device * lag_dev ,
4955
+ unsigned long event ,
4956
+ void * ptr , u16 vid )
4938
4957
{
4939
4958
struct net_device * dev ;
4940
4959
struct list_head * iter ;
4941
4960
int ret ;
4942
4961
4943
4962
netdev_for_each_lower_dev (lag_dev , dev , iter ) {
4944
4963
if (mlxsw_sp_port_dev_check (dev )) {
4945
- ret = mlxsw_sp_netdevice_vport_event (dev , event , ptr ,
4946
- vid );
4964
+ ret = mlxsw_sp_netdevice_port_vlan_event (vlan_dev , dev ,
4965
+ event , ptr ,
4966
+ vid );
4947
4967
if (ret )
4948
4968
return ret ;
4949
4969
}
@@ -4959,11 +4979,12 @@ static int mlxsw_sp_netdevice_vlan_event(struct net_device *vlan_dev,
4959
4979
u16 vid = vlan_dev_vlan_id (vlan_dev );
4960
4980
4961
4981
if (mlxsw_sp_port_dev_check (real_dev ))
4962
- return mlxsw_sp_netdevice_vport_event ( real_dev , event , ptr ,
4963
- vid );
4982
+ return mlxsw_sp_netdevice_port_vlan_event ( vlan_dev , real_dev ,
4983
+ event , ptr , vid );
4964
4984
else if (netif_is_lag_master (real_dev ))
4965
- return mlxsw_sp_netdevice_lag_vport_event (real_dev , event , ptr ,
4966
- vid );
4985
+ return mlxsw_sp_netdevice_lag_port_vlan_event (vlan_dev ,
4986
+ real_dev , event ,
4987
+ ptr , vid );
4967
4988
4968
4989
return 0 ;
4969
4990
}
@@ -4988,7 +5009,7 @@ static int mlxsw_sp_netdevice_event(struct notifier_block *unused,
4988
5009
else if (mlxsw_sp_is_vrf_event (event , ptr ))
4989
5010
err = mlxsw_sp_netdevice_vrf_event (dev , event , ptr );
4990
5011
else if (mlxsw_sp_port_dev_check (dev ))
4991
- err = mlxsw_sp_netdevice_port_event (dev , event , ptr );
5012
+ err = mlxsw_sp_netdevice_port_event (dev , dev , event , ptr );
4992
5013
else if (netif_is_lag_master (dev ))
4993
5014
err = mlxsw_sp_netdevice_lag_event (dev , event , ptr );
4994
5015
else if (netif_is_bridge_master (dev ))
0 commit comments