iwlwifi: mvm: update station when marked associated
In managed mode, the HT/VHT capabilities aren't set when the station is initially added, so update the station when it is marked associated. In AP/GO mode, the station will typically be added with full capabilities today, but an upcoming change in hostapd may mean a similar scenario as for managed mode, therefore do the update unconditionally. Reviewed-by: Emmanuel Grumbach <emmanuel.grumbach@intel.com> Signed-off-by: Johannes Berg <johannes.berg@intel.com>
This commit is contained in:
parent
ffdf968d87
commit
7a4539736e
4 changed files with 26 additions and 9 deletions
|
@ -490,7 +490,7 @@ static int iwl_mvm_d3_reprogram(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
|
||||||
return -EIO;
|
return -EIO;
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = iwl_mvm_sta_add_to_fw(mvm, ap_sta);
|
ret = iwl_mvm_sta_send_to_fw(mvm, ap_sta, false);
|
||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
rcu_assign_pointer(mvm->fw_id_to_mac_id[mvmvif->ap_sta_id], ap_sta);
|
rcu_assign_pointer(mvm->fw_id_to_mac_id[mvmvif->ap_sta_id], ap_sta);
|
||||||
|
|
|
@ -926,8 +926,10 @@ static int iwl_mvm_mac_sta_state(struct ieee80211_hw *hw,
|
||||||
ret = 0;
|
ret = 0;
|
||||||
} else if (old_state == IEEE80211_STA_AUTH &&
|
} else if (old_state == IEEE80211_STA_AUTH &&
|
||||||
new_state == IEEE80211_STA_ASSOC) {
|
new_state == IEEE80211_STA_ASSOC) {
|
||||||
iwl_mvm_rs_rate_init(mvm, sta, mvmvif->phy_ctxt->channel->band);
|
ret = iwl_mvm_update_sta(mvm, vif, sta);
|
||||||
ret = 0;
|
if (ret == 0)
|
||||||
|
iwl_mvm_rs_rate_init(mvm, sta,
|
||||||
|
mvmvif->phy_ctxt->channel->band);
|
||||||
} else if (old_state == IEEE80211_STA_ASSOC &&
|
} else if (old_state == IEEE80211_STA_ASSOC &&
|
||||||
new_state == IEEE80211_STA_AUTHORIZED) {
|
new_state == IEEE80211_STA_AUTHORIZED) {
|
||||||
ret = 0;
|
ret = 0;
|
||||||
|
|
|
@ -81,8 +81,9 @@ static int iwl_mvm_find_free_sta_id(struct iwl_mvm *mvm)
|
||||||
return IWL_MVM_STATION_COUNT;
|
return IWL_MVM_STATION_COUNT;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* add a NEW station to fw */
|
/* send station add/update command to firmware */
|
||||||
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)
|
||||||
{
|
{
|
||||||
struct iwl_mvm_sta *mvm_sta = (void *)sta->drv_priv;
|
struct iwl_mvm_sta *mvm_sta = (void *)sta->drv_priv;
|
||||||
struct iwl_mvm_add_sta_cmd add_sta_cmd;
|
struct iwl_mvm_add_sta_cmd add_sta_cmd;
|
||||||
|
@ -94,8 +95,11 @@ int iwl_mvm_sta_add_to_fw(struct iwl_mvm *mvm, struct ieee80211_sta *sta)
|
||||||
|
|
||||||
add_sta_cmd.sta_id = mvm_sta->sta_id;
|
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.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);
|
if (!update) {
|
||||||
memcpy(&add_sta_cmd.addr, sta->addr, ETH_ALEN);
|
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_FAT_EN_MSK ? */
|
||||||
/* STA_FLG_MIMO_EN_MSK ? */
|
/* STA_FLG_MIMO_EN_MSK ? */
|
||||||
|
@ -181,7 +185,7 @@ int iwl_mvm_add_sta(struct iwl_mvm *mvm,
|
||||||
/* for HW restart - need to reset the seq_number etc... */
|
/* for HW restart - need to reset the seq_number etc... */
|
||||||
memset(mvm_sta->tid_data, 0, sizeof(mvm_sta->tid_data));
|
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)
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
|
@ -195,6 +199,13 @@ int iwl_mvm_add_sta(struct iwl_mvm *mvm,
|
||||||
return 0;
|
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,
|
int iwl_mvm_drain_sta(struct iwl_mvm *mvm, struct iwl_mvm_sta *mvmsta,
|
||||||
bool drain)
|
bool drain)
|
||||||
{
|
{
|
||||||
|
|
|
@ -309,10 +309,14 @@ struct iwl_mvm_int_sta {
|
||||||
u32 tfd_queue_msk;
|
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,
|
int iwl_mvm_add_sta(struct iwl_mvm *mvm,
|
||||||
struct ieee80211_vif *vif,
|
struct ieee80211_vif *vif,
|
||||||
struct ieee80211_sta *sta);
|
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,
|
int iwl_mvm_rm_sta(struct iwl_mvm *mvm,
|
||||||
struct ieee80211_vif *vif,
|
struct ieee80211_vif *vif,
|
||||||
struct ieee80211_sta *sta);
|
struct ieee80211_sta *sta);
|
||||||
|
|
Loading…
Add table
Reference in a new issue