@@ -565,34 +565,38 @@ static void mlx4_en_put_qp(struct mlx4_en_priv *priv)
565565 struct mlx4_en_dev * mdev = priv -> mdev ;
566566 struct mlx4_dev * dev = mdev -> dev ;
567567 int qpn = priv -> base_qpn ;
568- u64 mac = mlx4_en_mac_to_u64 (priv -> dev -> dev_addr );
569-
570- en_dbg (DRV , priv , "Registering MAC: %pM for deleting\n" ,
571- priv -> dev -> dev_addr );
572- mlx4_unregister_mac (dev , priv -> port , mac );
568+ u64 mac ;
573569
574- if (dev -> caps .steering_mode != MLX4_STEERING_MODE_A0 ) {
570+ if (dev -> caps .steering_mode == MLX4_STEERING_MODE_A0 ) {
571+ mac = mlx4_en_mac_to_u64 (priv -> dev -> dev_addr );
572+ en_dbg (DRV , priv , "Registering MAC: %pM for deleting\n" ,
573+ priv -> dev -> dev_addr );
574+ mlx4_unregister_mac (dev , priv -> port , mac );
575+ } else {
575576 struct mlx4_mac_entry * entry ;
576577 struct hlist_node * tmp ;
577578 struct hlist_head * bucket ;
578- unsigned int mac_hash ;
579+ unsigned int i ;
579580
580- mac_hash = priv -> dev -> dev_addr [MLX4_EN_MAC_HASH_IDX ];
581- bucket = & priv -> mac_hash [mac_hash ];
582- hlist_for_each_entry_safe (entry , tmp , bucket , hlist ) {
583- if (ether_addr_equal_64bits (entry -> mac ,
584- priv -> dev -> dev_addr )) {
585- en_dbg (DRV , priv , "Releasing qp: port %d, MAC %pM, qpn %d\n" ,
586- priv -> port , priv -> dev -> dev_addr , qpn );
581+ for (i = 0 ; i < MLX4_EN_MAC_HASH_SIZE ; ++ i ) {
582+ bucket = & priv -> mac_hash [i ];
583+ hlist_for_each_entry_safe (entry , tmp , bucket , hlist ) {
584+ mac = mlx4_en_mac_to_u64 (entry -> mac );
585+ en_dbg (DRV , priv , "Registering MAC: %pM for deleting\n" ,
586+ entry -> mac );
587587 mlx4_en_uc_steer_release (priv , entry -> mac ,
588588 qpn , entry -> reg_id );
589- mlx4_qp_release_range (dev , qpn , 1 );
590589
590+ mlx4_unregister_mac (dev , priv -> port , mac );
591591 hlist_del_rcu (& entry -> hlist );
592592 kfree_rcu (entry , rcu );
593- break ;
594593 }
595594 }
595+
596+ en_dbg (DRV , priv , "Releasing qp: port %d, qpn %d\n" ,
597+ priv -> port , qpn );
598+ mlx4_qp_release_range (dev , qpn , 1 );
599+ priv -> flags &= ~MLX4_EN_FLAG_FORCE_PROMISC ;
596600 }
597601}
598602
@@ -650,28 +654,10 @@ u64 mlx4_en_mac_to_u64(u8 *addr)
650654 return mac ;
651655}
652656
653- static int mlx4_en_set_mac (struct net_device * dev , void * addr )
654- {
655- struct mlx4_en_priv * priv = netdev_priv (dev );
656- struct mlx4_en_dev * mdev = priv -> mdev ;
657- struct sockaddr * saddr = addr ;
658-
659- if (!is_valid_ether_addr (saddr -> sa_data ))
660- return - EADDRNOTAVAIL ;
661-
662- memcpy (dev -> dev_addr , saddr -> sa_data , ETH_ALEN );
663- queue_work (mdev -> workqueue , & priv -> mac_task );
664- return 0 ;
665- }
666-
667- static void mlx4_en_do_set_mac (struct work_struct * work )
657+ static int mlx4_en_do_set_mac (struct mlx4_en_priv * priv )
668658{
669- struct mlx4_en_priv * priv = container_of (work , struct mlx4_en_priv ,
670- mac_task );
671- struct mlx4_en_dev * mdev = priv -> mdev ;
672659 int err = 0 ;
673660
674- mutex_lock (& mdev -> state_lock );
675661 if (priv -> port_up ) {
676662 /* Remove old MAC and insert the new one */
677663 err = mlx4_en_replace_mac (priv , priv -> base_qpn ,
@@ -683,7 +669,26 @@ static void mlx4_en_do_set_mac(struct work_struct *work)
683669 } else
684670 en_dbg (HW , priv , "Port is down while registering mac, exiting...\n" );
685671
672+ return err ;
673+ }
674+
675+ static int mlx4_en_set_mac (struct net_device * dev , void * addr )
676+ {
677+ struct mlx4_en_priv * priv = netdev_priv (dev );
678+ struct mlx4_en_dev * mdev = priv -> mdev ;
679+ struct sockaddr * saddr = addr ;
680+ int err ;
681+
682+ if (!is_valid_ether_addr (saddr -> sa_data ))
683+ return - EADDRNOTAVAIL ;
684+
685+ memcpy (dev -> dev_addr , saddr -> sa_data , ETH_ALEN );
686+
687+ mutex_lock (& mdev -> state_lock );
688+ err = mlx4_en_do_set_mac (priv );
686689 mutex_unlock (& mdev -> state_lock );
690+
691+ return err ;
687692}
688693
689694static void mlx4_en_clear_list (struct net_device * dev )
@@ -1348,7 +1353,7 @@ static void mlx4_en_do_get_stats(struct work_struct *work)
13481353 queue_delayed_work (mdev -> workqueue , & priv -> stats_task , STATS_DELAY );
13491354 }
13501355 if (mdev -> mac_removed [MLX4_MAX_PORTS + 1 - priv -> port ]) {
1351- queue_work ( mdev -> workqueue , & priv -> mac_task );
1356+ mlx4_en_do_set_mac ( priv );
13521357 mdev -> mac_removed [MLX4_MAX_PORTS + 1 - priv -> port ] = 0 ;
13531358 }
13541359 mutex_unlock (& mdev -> state_lock );
@@ -1828,9 +1833,11 @@ int mlx4_en_alloc_resources(struct mlx4_en_priv *priv)
18281833 }
18291834
18301835#ifdef CONFIG_RFS_ACCEL
1831- priv -> dev -> rx_cpu_rmap = alloc_irq_cpu_rmap (priv -> mdev -> dev -> caps .comp_pool );
1832- if (!priv -> dev -> rx_cpu_rmap )
1833- goto err ;
1836+ if (priv -> mdev -> dev -> caps .comp_pool ) {
1837+ priv -> dev -> rx_cpu_rmap = alloc_irq_cpu_rmap (priv -> mdev -> dev -> caps .comp_pool );
1838+ if (!priv -> dev -> rx_cpu_rmap )
1839+ goto err ;
1840+ }
18341841#endif
18351842
18361843 return 0 ;
@@ -2078,7 +2085,6 @@ int mlx4_en_init_netdev(struct mlx4_en_dev *mdev, int port,
20782085 priv -> msg_enable = MLX4_EN_MSG_LEVEL ;
20792086 spin_lock_init (& priv -> stats_lock );
20802087 INIT_WORK (& priv -> rx_mode_task , mlx4_en_do_set_rx_mode );
2081- INIT_WORK (& priv -> mac_task , mlx4_en_do_set_mac );
20822088 INIT_WORK (& priv -> watchdog_task , mlx4_en_restart );
20832089 INIT_WORK (& priv -> linkstate_task , mlx4_en_linkstate );
20842090 INIT_DELAYED_WORK (& priv -> stats_task , mlx4_en_do_get_stats );
0 commit comments