Move deinitialization of lock during the module remove and the
initialization of lock wilc_cfg80211_init(). This to ensure locks are
available during module load and gets free during unload.
Signed-off-by: Ajay Singh <ajay.kathat@microchip.com>
Link: https://lore.kernel.org/r/20190926151436.27819-2-ajay.kathat@microchip.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
        return -1;
 }
 
-static void wlan_deinit_locks(struct net_device *dev)
-{
-       struct wilc_vif *vif = netdev_priv(dev);
-       struct wilc *wilc = vif->wilc;
-
-       mutex_destroy(&wilc->hif_cs);
-       mutex_destroy(&wilc->rxq_cs);
-       mutex_destroy(&wilc->cfg_cmd_lock);
-       mutex_destroy(&wilc->txq_add_to_head_cs);
-       mutex_destroy(&wilc->vif_mutex);
-}
-
 static void wlan_deinitialize_threads(struct net_device *dev)
 {
        struct wilc_vif *vif = netdev_priv(dev);
 
                wilc_wlan_stop(wl, vif);
                wilc_wlan_cleanup(dev);
-               wlan_deinit_locks(dev);
 
                wl->initialized = false;
 
        flush_workqueue(wilc->hif_workqueue);
        destroy_workqueue(wilc->hif_workqueue);
        wilc_wlan_cfg_deinit(wilc);
+       wlan_deinit_locks(wilc);
        kfree(wilc->bus_data);
        wiphy_unregister(wilc->wiphy);
        wiphy_free(wilc->wiphy);
 
        init_completion(&wl->txq_thread_started);
 }
 
+void wlan_deinit_locks(struct wilc *wilc)
+{
+       mutex_destroy(&wilc->hif_cs);
+       mutex_destroy(&wilc->rxq_cs);
+       mutex_destroy(&wilc->cfg_cmd_lock);
+       mutex_destroy(&wilc->txq_add_to_head_cs);
+       mutex_destroy(&wilc->vif_mutex);
+}
+
 int wilc_cfg80211_init(struct wilc **wilc, struct device *dev, int io_type,
                       const struct wilc_hif_func *ops)
 {
        if (!wl)
                return -EINVAL;
 
+       wlan_init_locks(wl);
+
        ret = wilc_wlan_cfg_init(wl);
        if (ret)
                goto free_wl;
                goto free_hq;
        }
 
-       wlan_init_locks(wl);
-
        return 0;
 
 free_hq:
        wilc_wlan_cfg_deinit(wl);
 
 free_wl:
+       wlan_deinit_locks(wl);
        wiphy_unregister(wl->wiphy);
        wiphy_free(wl->wiphy);
        return ret;
 
 void wilc_mgmt_frame_register(struct wiphy *wiphy, struct wireless_dev *wdev,
                              u16 frame_type, bool reg);
 struct wilc_vif *wilc_get_interface(struct wilc *wl);
+void wlan_deinit_locks(struct wilc *wilc);
 #endif