mod_timer(&ifsta->timer, jiffies + IEEE80211_AUTH_TIMEOUT);
 }
 
+/*
+ * The disassoc 'reason' argument can be either our own reason
+ * if self disconnected or a reason code from the AP.
+ */
 static void ieee80211_set_disassoc(struct ieee80211_sub_if_data *sdata,
                                   struct ieee80211_if_sta *ifsta, bool deauth,
                                   bool self_disconnected, u16 reason)
 
        ieee80211_sta_send_apinfo(sdata, ifsta);
 
-       if (self_disconnected)
+       if (self_disconnected || reason == WLAN_REASON_DISASSOC_STA_HAS_LEFT)
                ifsta->state = IEEE80211_STA_MLME_DISABLED;
 
        sta_info_unlink(&sta);
                                      IEEE80211_RETRY_AUTH_INTERVAL);
        }
 
-       ieee80211_set_disassoc(sdata, ifsta, false, false, 0);
+       ieee80211_set_disassoc(sdata, ifsta, false, false, reason_code);
 }