|
@@ -1333,6 +1333,34 @@ static int ath9k_htc_sta_remove(struct ieee80211_hw *hw,
|
|
|
return ret;
|
|
|
}
|
|
|
|
|
|
+static void ath9k_htc_sta_rc_update(struct ieee80211_hw *hw,
|
|
|
+ struct ieee80211_vif *vif,
|
|
|
+ struct ieee80211_sta *sta, u32 changed)
|
|
|
+{
|
|
|
+ struct ath9k_htc_priv *priv = hw->priv;
|
|
|
+ struct ath_common *common = ath9k_hw_common(priv->ah);
|
|
|
+ struct ath9k_htc_target_rate trate;
|
|
|
+
|
|
|
+ mutex_lock(&priv->mutex);
|
|
|
+ ath9k_htc_ps_wakeup(priv);
|
|
|
+
|
|
|
+ if (changed & IEEE80211_RC_SUPP_RATES_CHANGED) {
|
|
|
+ memset(&trate, 0, sizeof(struct ath9k_htc_target_rate));
|
|
|
+ ath9k_htc_setup_rate(priv, sta, &trate);
|
|
|
+ if (!ath9k_htc_send_rate_cmd(priv, &trate))
|
|
|
+ ath_dbg(common, CONFIG,
|
|
|
+ "Supported rates for sta: %pM updated, rate caps: 0x%X\n",
|
|
|
+ sta->addr, be32_to_cpu(trate.capflags));
|
|
|
+ else
|
|
|
+ ath_dbg(common, CONFIG,
|
|
|
+ "Unable to update supported rates for sta: %pM\n",
|
|
|
+ sta->addr);
|
|
|
+ }
|
|
|
+
|
|
|
+ ath9k_htc_ps_restore(priv);
|
|
|
+ mutex_unlock(&priv->mutex);
|
|
|
+}
|
|
|
+
|
|
|
static int ath9k_htc_conf_tx(struct ieee80211_hw *hw,
|
|
|
struct ieee80211_vif *vif, u16 queue,
|
|
|
const struct ieee80211_tx_queue_params *params)
|
|
@@ -1760,6 +1788,7 @@ struct ieee80211_ops ath9k_htc_ops = {
|
|
|
.sta_add = ath9k_htc_sta_add,
|
|
|
.sta_remove = ath9k_htc_sta_remove,
|
|
|
.conf_tx = ath9k_htc_conf_tx,
|
|
|
+ .sta_rc_update = ath9k_htc_sta_rc_update,
|
|
|
.bss_info_changed = ath9k_htc_bss_info_changed,
|
|
|
.set_key = ath9k_htc_set_key,
|
|
|
.get_tsf = ath9k_htc_get_tsf,
|