staging: wilc1000: remove conditional lock in wilc_wfi_deinit_mon_interface()
authorAjay Singh <ajay.kathat@microchip.com>
Sat, 2 Feb 2019 19:16:56 +0000 (19:16 +0000)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 4 Feb 2019 11:38:40 +0000 (12:38 +0100)
wilc_wfi_deinit_mon_interface() calls unregister_netdev() which
requires the rtnl lock again. Now move wilc_wfi_deinit_mon_interface()
out of wilc_mac_close(). Also remove explicit call to wilc_mac_close()
because unregister_netdev() takes care of calling wilc_mac_close().

Signed-off-by: Ajay Singh <ajay.kathat@microchip.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/staging/wilc1000/linux_mon.c
drivers/staging/wilc1000/linux_wlan.c

index ed068348a2a5a5cdbdbeeb862305c94e57443a29..32d0c81bcf26b1fea41995fa365161fb9fa7a62c 100644 (file)
@@ -253,19 +253,10 @@ struct net_device *wilc_wfi_init_mon_interface(struct wilc *wl,
 
 void wilc_wfi_deinit_mon_interface(struct wilc *wl)
 {
-       bool rollback_lock = false;
-
-       if (wl->monitor_dev) {
-               if (rtnl_is_locked()) {
-                       rtnl_unlock();
-                       rollback_lock = true;
-               }
-               unregister_netdev(wl->monitor_dev);
+       if (!wl->monitor_dev)
+               return;
 
-               if (rollback_lock) {
-                       rtnl_lock();
-                       rollback_lock = false;
-               }
-               wl->monitor_dev = NULL;
-       }
+       unregister_netdev(wl->monitor_dev);
+       free_netdev(wl->monitor_dev);
+       wl->monitor_dev = NULL;
 }
index 1362d8f3cbc9bde1564c59cf027a28297107b74d..b0249d264e4b949af18f2c173739b0ec792006ac 100644 (file)
@@ -920,7 +920,6 @@ static int wilc_mac_close(struct net_device *ndev)
                netdev_dbg(ndev, "Deinitializing wilc1000\n");
                wl->close = 1;
                wilc_wlan_deinitialize(ndev);
-               wilc_wfi_deinit_mon_interface(wl);
        }
 
        vif->mac_opened = 0;
@@ -1006,19 +1005,15 @@ void wilc_netdev_cleanup(struct wilc *wilc)
                wilc->firmware = NULL;
        }
 
-       if (wilc->vif[0]->ndev || wilc->vif[1]->ndev) {
-               for (i = 0; i < WILC_NUM_CONCURRENT_IFC; i++)
-                       if (wilc->vif[i]->ndev)
-                               if (wilc->vif[i]->mac_opened)
-                                       wilc_mac_close(wilc->vif[i]->ndev);
-
-               for (i = 0; i < WILC_NUM_CONCURRENT_IFC; i++) {
+       for (i = 0; i < WILC_NUM_CONCURRENT_IFC; i++) {
+               if (wilc->vif[i] && wilc->vif[i]->ndev) {
                        unregister_netdev(wilc->vif[i]->ndev);
                        wilc_free_wiphy(wilc->vif[i]->ndev);
                        free_netdev(wilc->vif[i]->ndev);
                }
        }
 
+       wilc_wfi_deinit_mon_interface(wilc);
        flush_workqueue(wilc->hif_workqueue);
        destroy_workqueue(wilc->hif_workqueue);
        wilc_wlan_cfg_deinit(wilc);