ret = 0;
        } else if (old_state == IEEE80211_STA_AUTH &&
                   new_state == IEEE80211_STA_ASSOC) {
-               iwl_mvm_rs_rate_init(mvm, sta, mvmvif->phy_ctxt->channel->band);
-               ret = 0;
+               ret = iwl_mvm_update_sta(mvm, vif, sta);
+               if (ret == 0)
+                       iwl_mvm_rs_rate_init(mvm, sta,
+                                            mvmvif->phy_ctxt->channel->band);
        } else if (old_state == IEEE80211_STA_ASSOC &&
                   new_state == IEEE80211_STA_AUTHORIZED) {
                ret = 0;
 
        return IWL_MVM_STATION_COUNT;
 }
 
-/* add a NEW station to fw */
-int iwl_mvm_sta_add_to_fw(struct iwl_mvm *mvm, struct ieee80211_sta *sta)
+/* send station add/update command to firmware */
+int iwl_mvm_sta_send_to_fw(struct iwl_mvm *mvm, struct ieee80211_sta *sta,
+                          bool update)
 {
        struct iwl_mvm_sta *mvm_sta = (void *)sta->drv_priv;
        struct iwl_mvm_add_sta_cmd add_sta_cmd;
 
        add_sta_cmd.sta_id = mvm_sta->sta_id;
        add_sta_cmd.mac_id_n_color = cpu_to_le32(mvm_sta->mac_id_n_color);
-       add_sta_cmd.tfd_queue_msk = cpu_to_le32(mvm_sta->tfd_queue_msk);
-       memcpy(&add_sta_cmd.addr, sta->addr, ETH_ALEN);
+       if (!update) {
+               add_sta_cmd.tfd_queue_msk = cpu_to_le32(mvm_sta->tfd_queue_msk);
+               memcpy(&add_sta_cmd.addr, sta->addr, ETH_ALEN);
+       }
+       add_sta_cmd.add_modify = update ? 1 : 0;
 
        /* STA_FLG_FAT_EN_MSK ? */
        /* STA_FLG_MIMO_EN_MSK ? */
        /* for HW restart - need to reset the seq_number etc... */
        memset(mvm_sta->tid_data, 0, sizeof(mvm_sta->tid_data));
 
-       ret = iwl_mvm_sta_add_to_fw(mvm, sta);
+       ret = iwl_mvm_sta_send_to_fw(mvm, sta, false);
        if (ret)
                return ret;
 
        return 0;
 }
 
+int iwl_mvm_update_sta(struct iwl_mvm *mvm,
+                      struct ieee80211_vif *vif,
+                      struct ieee80211_sta *sta)
+{
+       return iwl_mvm_sta_send_to_fw(mvm, sta, true);
+}
+
 int iwl_mvm_drain_sta(struct iwl_mvm *mvm, struct iwl_mvm_sta *mvmsta,
                      bool drain)
 {
 
        u32 tfd_queue_msk;
 };
 
-int iwl_mvm_sta_add_to_fw(struct iwl_mvm *mvm, struct ieee80211_sta *sta);
+int iwl_mvm_sta_send_to_fw(struct iwl_mvm *mvm, struct ieee80211_sta *sta,
+                          bool update);
 int iwl_mvm_add_sta(struct iwl_mvm *mvm,
                    struct ieee80211_vif *vif,
                    struct ieee80211_sta *sta);
+int iwl_mvm_update_sta(struct iwl_mvm *mvm,
+                      struct ieee80211_vif *vif,
+                      struct ieee80211_sta *sta);
 int iwl_mvm_rm_sta(struct iwl_mvm *mvm,
                   struct ieee80211_vif *vif,
                   struct ieee80211_sta *sta);