@@ -4026,6 +4026,7 @@ static void mlxsw_sp_master_bridge_dec(struct mlxsw_sp *mlxsw_sp)
40264026}
40274027
40284028static int mlxsw_sp_port_bridge_join (struct mlxsw_sp_port * mlxsw_sp_port ,
4029+ struct net_device * brport_dev ,
40294030 struct net_device * br_dev )
40304031{
40314032 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,
40534054 return 0 ;
40544055}
40554056
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 )
40574060{
40584061 struct net_device * dev = mlxsw_sp_port -> dev ;
40594062
@@ -4302,7 +4305,7 @@ static void mlxsw_sp_port_lag_leave(struct mlxsw_sp_port *mlxsw_sp_port,
43024305
43034306 if (mlxsw_sp_port -> bridged ) {
43044307 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 );
43064309 }
43074310
43084311 if (lag -> ref_count == 1 )
@@ -4439,7 +4442,8 @@ static void mlxsw_sp_port_ovs_leave(struct mlxsw_sp_port *mlxsw_sp_port)
44394442 mlxsw_sp_port_vp_mode_set (mlxsw_sp_port , false);
44404443}
44414444
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 ,
44434447 unsigned long event , void * ptr )
44444448{
44454449 struct netdev_notifier_changeupper_info * info ;
@@ -4492,9 +4496,12 @@ static int mlxsw_sp_netdevice_port_upper_event(struct net_device *dev,
44924496 } else if (netif_is_bridge_master (upper_dev )) {
44934497 if (info -> linking )
44944498 err = mlxsw_sp_port_bridge_join (mlxsw_sp_port ,
4499+ lower_dev ,
44954500 upper_dev );
44964501 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 );
44984505 } else if (netif_is_lag_master (upper_dev )) {
44994506 if (info -> linking )
45004507 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,
45414548 return 0 ;
45424549}
45434550
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 ,
45454553 unsigned long event , void * ptr )
45464554{
45474555 switch (event ) {
45484556 case NETDEV_PRECHANGEUPPER :
45494557 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 );
45514560 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 );
45534563 }
45544564
45554565 return 0 ;
@@ -4564,7 +4574,8 @@ static int mlxsw_sp_netdevice_lag_event(struct net_device *lag_dev,
45644574
45654575 netdev_for_each_lower_dev (lag_dev , dev , iter ) {
45664576 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 );
45684579 if (ret )
45694580 return ret ;
45704581 }
@@ -4807,6 +4818,7 @@ mlxsw_sp_port_vlan_vfid_leave(struct mlxsw_sp_port_vlan *mlxsw_sp_port_vlan)
48074818}
48084819
48094820static int mlxsw_sp_vport_bridge_join (struct mlxsw_sp_port * mlxsw_sp_vport ,
4821+ struct net_device * brport_dev ,
48104822 struct net_device * br_dev )
48114823{
48124824 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,
48484860 return err ;
48494861}
48504862
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 )
48524866{
48534867 u16 vid = mlxsw_sp_vport_vid_get (mlxsw_sp_vport );
48544868 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,
48854899 return true;
48864900}
48874901
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 )
48914906{
48924907 struct mlxsw_sp_port * mlxsw_sp_port = netdev_priv (dev );
48934908 struct netdev_notifier_changeupper_info * info = ptr ;
@@ -4919,9 +4934,12 @@ static int mlxsw_sp_netdevice_vport_event(struct net_device *dev,
49194934 if (netif_is_bridge_master (upper_dev )) {
49204935 if (info -> linking )
49214936 err = mlxsw_sp_vport_bridge_join (mlxsw_sp_vport ,
4937+ vlan_dev ,
49224938 upper_dev );
49234939 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 );
49254943 } else {
49264944 err = - EINVAL ;
49274945 WARN_ON (1 );
@@ -4932,18 +4950,20 @@ static int mlxsw_sp_netdevice_vport_event(struct net_device *dev,
49324950 return err ;
49334951}
49344952
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 )
49384957{
49394958 struct net_device * dev ;
49404959 struct list_head * iter ;
49414960 int ret ;
49424961
49434962 netdev_for_each_lower_dev (lag_dev , dev , iter ) {
49444963 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 );
49474967 if (ret )
49484968 return ret ;
49494969 }
@@ -4959,11 +4979,12 @@ static int mlxsw_sp_netdevice_vlan_event(struct net_device *vlan_dev,
49594979 u16 vid = vlan_dev_vlan_id (vlan_dev );
49604980
49614981 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 );
49644984 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 );
49674988
49684989 return 0 ;
49694990}
@@ -4988,7 +5009,7 @@ static int mlxsw_sp_netdevice_event(struct notifier_block *unused,
49885009 else if (mlxsw_sp_is_vrf_event (event , ptr ))
49895010 err = mlxsw_sp_netdevice_vrf_event (dev , event , ptr );
49905011 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 );
49925013 else if (netif_is_lag_master (dev ))
49935014 err = mlxsw_sp_netdevice_lag_event (dev , event , ptr );
49945015 else if (netif_is_bridge_master (dev ))
0 commit comments