@@ -406,22 +406,26 @@ static int mlx4_en_vlan_rx_add_vid(struct net_device *dev,
406
406
mutex_lock (& mdev -> state_lock );
407
407
if (mdev -> device_up && priv -> port_up ) {
408
408
err = mlx4_SET_VLAN_FLTR (mdev -> dev , priv );
409
- if (err )
409
+ if (err ) {
410
410
en_err (priv , "Failed configuring VLAN filter\n" );
411
+ goto out ;
412
+ }
411
413
}
412
- if ( mlx4_register_vlan (mdev -> dev , priv -> port , vid , & idx ))
413
- en_dbg ( HW , priv , "failed adding vlan %d\n" , vid );
414
- mutex_unlock ( & mdev -> state_lock );
414
+ err = mlx4_register_vlan (mdev -> dev , priv -> port , vid , & idx );
415
+ if ( err )
416
+ en_dbg ( HW , priv , "Failed adding vlan %d\n" , vid );
415
417
416
- return 0 ;
418
+ out :
419
+ mutex_unlock (& mdev -> state_lock );
420
+ return err ;
417
421
}
418
422
419
423
static int mlx4_en_vlan_rx_kill_vid (struct net_device * dev ,
420
424
__be16 proto , u16 vid )
421
425
{
422
426
struct mlx4_en_priv * priv = netdev_priv (dev );
423
427
struct mlx4_en_dev * mdev = priv -> mdev ;
424
- int err ;
428
+ int err = 0 ;
425
429
426
430
en_dbg (HW , priv , "Killing VID:%d\n" , vid );
427
431
@@ -438,7 +442,7 @@ static int mlx4_en_vlan_rx_kill_vid(struct net_device *dev,
438
442
}
439
443
mutex_unlock (& mdev -> state_lock );
440
444
441
- return 0 ;
445
+ return err ;
442
446
}
443
447
444
448
static void mlx4_en_u64_to_mac (unsigned char dst_mac [ETH_ALEN + 2 ], u64 src_mac )
@@ -2032,19 +2036,31 @@ int mlx4_en_alloc_resources(struct mlx4_en_priv *priv)
2032
2036
return - ENOMEM ;
2033
2037
}
2034
2038
2039
+ static void mlx4_en_shutdown (struct net_device * dev )
2040
+ {
2041
+ rtnl_lock ();
2042
+ netif_device_detach (dev );
2043
+ mlx4_en_close (dev );
2044
+ rtnl_unlock ();
2045
+ }
2035
2046
2036
2047
void mlx4_en_destroy_netdev (struct net_device * dev )
2037
2048
{
2038
2049
struct mlx4_en_priv * priv = netdev_priv (dev );
2039
2050
struct mlx4_en_dev * mdev = priv -> mdev ;
2051
+ bool shutdown = mdev -> dev -> persist -> interface_state &
2052
+ MLX4_INTERFACE_STATE_SHUTDOWN ;
2040
2053
2041
2054
en_dbg (DRV , priv , "Destroying netdev on port:%d\n" , priv -> port );
2042
2055
2043
2056
/* Unregister device - this will close the port if it was up */
2044
2057
if (priv -> registered ) {
2045
2058
devlink_port_type_clear (mlx4_get_devlink_port (mdev -> dev ,
2046
2059
priv -> port ));
2047
- unregister_netdev (dev );
2060
+ if (shutdown )
2061
+ mlx4_en_shutdown (dev );
2062
+ else
2063
+ unregister_netdev (dev );
2048
2064
}
2049
2065
2050
2066
if (priv -> allocated )
@@ -2069,7 +2085,8 @@ void mlx4_en_destroy_netdev(struct net_device *dev)
2069
2085
kfree (priv -> tx_ring );
2070
2086
kfree (priv -> tx_cq );
2071
2087
2072
- free_netdev (dev );
2088
+ if (!shutdown )
2089
+ free_netdev (dev );
2073
2090
}
2074
2091
2075
2092
static int mlx4_en_change_mtu (struct net_device * dev , int new_mtu )
0 commit comments