aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChun-Yeow Yeoh <yeohchunyeow@gmail.com>2014-03-07 03:19:30 -0500
committerKalle Valo <kvalo@qca.qualcomm.com>2014-03-11 06:18:39 -0400
commit44d6fa90a8fddee49b5749cadbd0add22b1f5559 (patch)
treeaf1ba6a3c4dbcf5cb816008ac560feba95b22a8e
parent70dd77b4c50da518b57b8b9b125a8c9aabe9bc1a (diff)
ath10k: allow the supported rate change by reassociate peer
IBSS mode requires the changing of supported rate. Do this by reassociate the peer. The investigation shows that if move from legacy to HT, the rate control won't work after changing the supported rate. But once changing the supported rate to HT, user can assign the TxRate in HT mode. Signed-off-by: Chun-Yeow Yeoh <yeohchunyeow@gmail.com> Signed-off-by: Kalle Valo <kvalo@qca.qualcomm.com>
-rw-r--r--drivers/net/wireless/ath/ath10k/mac.c24
-rw-r--r--drivers/net/wireless/ath/ath10k/wmi.c5
2 files changed, 16 insertions, 13 deletions
diff --git a/drivers/net/wireless/ath/ath10k/mac.c b/drivers/net/wireless/ath/ath10k/mac.c
index 511a2f81e7af..9ad1869fc5d3 100644
--- a/drivers/net/wireless/ath/ath10k/mac.c
+++ b/drivers/net/wireless/ath/ath10k/mac.c
@@ -1524,7 +1524,7 @@ static void ath10k_bss_disassoc(struct ieee80211_hw *hw,
1524} 1524}
1525 1525
1526static int ath10k_station_assoc(struct ath10k *ar, struct ath10k_vif *arvif, 1526static int ath10k_station_assoc(struct ath10k *ar, struct ath10k_vif *arvif,
1527 struct ieee80211_sta *sta) 1527 struct ieee80211_sta *sta, bool reassoc)
1528{ 1528{
1529 struct wmi_peer_assoc_complete_arg peer_arg; 1529 struct wmi_peer_assoc_complete_arg peer_arg;
1530 int ret = 0; 1530 int ret = 0;
@@ -1538,6 +1538,7 @@ static int ath10k_station_assoc(struct ath10k *ar, struct ath10k_vif *arvif,
1538 return ret; 1538 return ret;
1539 } 1539 }
1540 1540
1541 peer_arg.peer_reassoc = reassoc;
1541 ret = ath10k_wmi_peer_assoc(ar, &peer_arg); 1542 ret = ath10k_wmi_peer_assoc(ar, &peer_arg);
1542 if (ret) { 1543 if (ret) {
1543 ath10k_warn("Peer assoc failed for STA %pM vdev %i: %d\n", 1544 ath10k_warn("Peer assoc failed for STA %pM vdev %i: %d\n",
@@ -3195,6 +3196,16 @@ static void ath10k_sta_rc_update_wk(struct work_struct *wk)
3195 sta->addr, smps, err); 3196 sta->addr, smps, err);
3196 } 3197 }
3197 3198
3199 if (changed & IEEE80211_RC_SUPP_RATES_CHANGED) {
3200 ath10k_dbg(ATH10K_DBG_MAC, "mac update sta %pM supp rates\n",
3201 sta->addr);
3202
3203 err = ath10k_station_assoc(ar, arvif, sta, true);
3204 if (err)
3205 ath10k_warn("Failed to reassociate station: %pM\n",
3206 sta->addr);
3207 }
3208
3198 mutex_unlock(&ar->conf_mutex); 3209 mutex_unlock(&ar->conf_mutex);
3199} 3210}
3200 3211
@@ -3275,7 +3286,7 @@ static int ath10k_sta_state(struct ieee80211_hw *hw,
3275 ath10k_dbg(ATH10K_DBG_MAC, "mac sta %pM associated\n", 3286 ath10k_dbg(ATH10K_DBG_MAC, "mac sta %pM associated\n",
3276 sta->addr); 3287 sta->addr);
3277 3288
3278 ret = ath10k_station_assoc(ar, arvif, sta); 3289 ret = ath10k_station_assoc(ar, arvif, sta, false);
3279 if (ret) 3290 if (ret)
3280 ath10k_warn("Failed to associate station %pM for vdev %i: %i\n", 3291 ath10k_warn("Failed to associate station %pM for vdev %i: %i\n",
3281 sta->addr, arvif->vdev_id, ret); 3292 sta->addr, arvif->vdev_id, ret);
@@ -4108,15 +4119,6 @@ static void ath10k_sta_rc_update(struct ieee80211_hw *hw,
4108 arsta->smps = smps; 4119 arsta->smps = smps;
4109 } 4120 }
4110 4121
4111 if (changed & IEEE80211_RC_SUPP_RATES_CHANGED) {
4112 /* FIXME: Not implemented. Probably the only way to do it would
4113 * be to re-assoc the peer. */
4114 changed &= ~IEEE80211_RC_SUPP_RATES_CHANGED;
4115 ath10k_dbg(ATH10K_DBG_MAC,
4116 "mac sta rc update for %pM: changing supported rates not implemented\n",
4117 sta->addr);
4118 }
4119
4120 arsta->changed |= changed; 4122 arsta->changed |= changed;
4121 4123
4122 spin_unlock_bh(&ar->data_lock); 4124 spin_unlock_bh(&ar->data_lock);
diff --git a/drivers/net/wireless/ath/ath10k/wmi.c b/drivers/net/wireless/ath/ath10k/wmi.c
index cb1f7b5bcf4c..d61bdf6db458 100644
--- a/drivers/net/wireless/ath/ath10k/wmi.c
+++ b/drivers/net/wireless/ath/ath10k/wmi.c
@@ -3456,8 +3456,9 @@ int ath10k_wmi_peer_assoc(struct ath10k *ar,
3456 __cpu_to_le32(arg->peer_vht_rates.tx_mcs_set); 3456 __cpu_to_le32(arg->peer_vht_rates.tx_mcs_set);
3457 3457
3458 ath10k_dbg(ATH10K_DBG_WMI, 3458 ath10k_dbg(ATH10K_DBG_WMI,
3459 "wmi peer assoc vdev %d addr %pM\n", 3459 "wmi peer assoc vdev %d addr %pM (%s)\n",
3460 arg->vdev_id, arg->addr); 3460 arg->vdev_id, arg->addr,
3461 arg->peer_reassoc ? "reassociate" : "new");
3461 return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->peer_assoc_cmdid); 3462 return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->peer_assoc_cmdid);
3462} 3463}
3463 3464