list_for_each_entry(event, &list, link) {
                switch (event->evt.event_id) {
                case HIF_EVENT_IND_BSSLOST:
-                       cancel_work_sync(&wvif->unjoin_work);
                        mutex_lock(&wvif->scan_lock);
                        wfx_cqm_bssloss_sm(wvif, 1, 0, 0);
                        mutex_unlock(&wvif->scan_lock);
                        break;
                case HIF_EVENT_IND_BSSREGAINED:
                        wfx_cqm_bssloss_sm(wvif, 0, 0, 0);
-                       cancel_work_sync(&wvif->unjoin_work);
                        break;
                case HIF_EVENT_IND_RCPI_RSSI:
                        wfx_event_report_rssi(wvif,
        mutex_unlock(&wvif->wdev->conf_mutex);
 }
 
+// Call it with wdev->conf_mutex locked
 static void wfx_do_unjoin(struct wfx_vif *wvif)
 {
-       mutex_lock(&wvif->wdev->conf_mutex);
-
        if (!wvif->state)
-               goto done;
+               return;
 
        if (wvif->state == WFX_STATE_AP)
-               goto done;
+               return;
 
        cancel_work_sync(&wvif->update_filtering_work);
        wvif->state = WFX_STATE_PASSIVE;
 
        /* Unjoin is a reset. */
-       wfx_tx_flush(wvif->wdev);
+       wfx_tx_lock_flush(wvif->wdev);
        hif_keep_alive_period(wvif, 0);
        hif_reset(wvif, false);
        wfx_tx_policy_init(wvif);
        wvif->disable_beacon_filter = false;
        wfx_update_filtering(wvif);
        memset(&wvif->bss_params, 0, sizeof(wvif->bss_params));
-
-done:
-       mutex_unlock(&wvif->wdev->conf_mutex);
+       wfx_tx_unlock(wvif->wdev);
 }
 
 static void wfx_set_mfp(struct wfx_vif *wvif,
        int ssidlen = 0;
 
        wfx_tx_lock_flush(wvif->wdev);
+       mutex_lock(&wvif->wdev->conf_mutex);
 
        if (wvif->state)
                wfx_do_unjoin(wvif);
                               conf->bssid, NULL, 0,
                               IEEE80211_BSS_TYPE_ANY, IEEE80211_PRIVACY_ANY);
        if (!bss && !conf->ibss_joined) {
+               mutex_unlock(&wvif->wdev->conf_mutex);
                wfx_tx_unlock(wvif->wdev);
                return;
        }
 
-       mutex_lock(&wvif->wdev->conf_mutex);
-
        /* Sanity check beacon interval */
        if (!wvif->beacon_int)
                wvif->beacon_int = 1;
        if (ret) {
                ieee80211_connection_loss(wvif->vif);
                wvif->join_complete_status = -1;
-               /* Tx lock still held, unjoin will clear it. */
-               if (!schedule_work(&wvif->unjoin_work))
-                       wfx_tx_unlock(wvif->wdev);
+               wfx_do_unjoin(wvif);
        } else {
                wvif->join_complete_status = 0;
                if (wvif->vif->type == NL80211_IFTYPE_ADHOC)
                        wvif->state = WFX_STATE_IBSS;
                else
                        wvif->state = WFX_STATE_PRE_STA;
-               wfx_tx_unlock(wvif->wdev);
 
                /* Upload keys */
                wfx_upload_keys(wvif);
                 * receives at least one
                 */
                wvif->disable_beacon_filter = true;
+               wfx_update_filtering(wvif);
        }
-       wfx_update_filtering(wvif);
-
-       mutex_unlock(&wvif->wdev->conf_mutex);
-}
-
-static void wfx_unjoin_work(struct work_struct *work)
-{
-       struct wfx_vif *wvif = container_of(work, struct wfx_vif, unjoin_work);
-
-       wfx_do_unjoin(wvif);
        wfx_tx_unlock(wvif->wdev);
+       mutex_unlock(&wvif->wdev->conf_mutex);
 }
 
 int wfx_sta_add(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
                hif_dual_cts_protection(wvif, false);
 
        wfx_cqm_bssloss_sm(wvif, 0, 0, 0);
-       cancel_work_sync(&wvif->unjoin_work);
 
        wvif->bss_params.beacon_lost_count = 20;
        wvif->bss_params.aid = info->aid;
 
        if (changed & BSS_CHANGED_ASSOC && !info->assoc &&
            (wvif->state == WFX_STATE_STA || wvif->state == WFX_STATE_IBSS)) {
-               /* Shedule unjoin work */
-               wfx_tx_lock(wdev);
-               if (!schedule_work(&wvif->unjoin_work))
-                       wfx_tx_unlock(wdev);
+               wfx_do_unjoin(wvif);
        } else {
                if (changed & BSS_CHANGED_BEACON_INT) {
                        if (info->ibss_joined)
        complete(&wvif->set_pm_mode_complete);
        INIT_WORK(&wvif->update_filtering_work, wfx_update_filtering_work);
        INIT_WORK(&wvif->bss_params_work, wfx_bss_params_work);
-       INIT_WORK(&wvif->unjoin_work, wfx_unjoin_work);
        INIT_WORK(&wvif->tx_policy_upload_work, wfx_tx_policy_upload_work);
 
        mutex_init(&wvif->scan_lock);
        case WFX_STATE_PRE_STA:
        case WFX_STATE_STA:
        case WFX_STATE_IBSS:
-               wfx_tx_lock_flush(wdev);
-               if (!schedule_work(&wvif->unjoin_work))
-                       wfx_tx_unlock(wdev);
+               wfx_do_unjoin(wvif);
                break;
        case WFX_STATE_AP:
                /* reset.link_id = 0; */
        hif_set_macaddr(wvif, NULL);
 
        wfx_cqm_bssloss_sm(wvif, 0, 0, 0);
-       cancel_work_sync(&wvif->unjoin_work);
        wfx_free_event_queue(wvif);
 
        wdev->vif[wvif->id] = NULL;