Commit 06fee3d5 authored by Ajay Singh's avatar Ajay Singh Committed by Greg Kroah-Hartman
Browse files

staging: wilc1000: remove conditional lock in wilc_wfi_deinit_mon_interface()



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: default avatarAjay Singh <ajay.kathat@microchip.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 58871300
Loading
Loading
Loading
Loading
+5 −14
Original line number Diff line number Diff line
@@ -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)
		return;

	if (wl->monitor_dev) {
		if (rtnl_is_locked()) {
			rtnl_unlock();
			rollback_lock = true;
		}
	unregister_netdev(wl->monitor_dev);

		if (rollback_lock) {
			rtnl_lock();
			rollback_lock = false;
		}
	free_netdev(wl->monitor_dev);
	wl->monitor_dev = NULL;
}
}
+3 −8
Original line number Diff line number Diff line
@@ -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++) {
		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);