sdata->u.sta.state = IEEE80211_STA_MLME_DISABLED;
                memset(sdata->u.sta.bssid, 0, ETH_ALEN);
                del_timer_sync(&sdata->u.sta.timer);
+               /*
+                * If the timer fired while we waited for it, it will have
+                * requeued the work. Now the work will be running again
+                * but will not rearm the timer again because it checks
+                * whether the interface is running, which, at this point,
+                * it no longer is.
+                */
+               cancel_work_sync(&sdata->u.sta.work);
                /*
                 * When we get here, the interface is marked down.
                 * Call synchronize_rcu() to wait for the RX path
 
 void ieee80211_stop_mesh(struct ieee80211_sub_if_data *sdata)
 {
        del_timer_sync(&sdata->u.mesh.housekeeping_timer);
+       /*
+        * If the timer fired while we waited for it, it will have
+        * requeued the work. Now the work will be running again
+        * but will not rearm the timer again because it checks
+        * whether the interface is running, which, at this point,
+        * it no longer is.
+        */
+       cancel_work_sync(&sdata->u.mesh.work);
+
        /*
         * When we get here, the interface is marked down.
         * Call synchronize_rcu() to wait for the RX path