ath9k_htc: Update HT configuration properly
authorSujith <Sujith.Manoharan@atheros.com>
Mon, 17 May 2010 06:31:18 +0000 (12:01 +0530)
committerJohn W. Linville <linville@tuxdriver.com>
Wed, 2 Jun 2010 20:13:16 +0000 (16:13 -0400)
Use BSS_CHANGED_HT to handle HT parameter changes.
The rate information on the target has to be updated
to handle changes in HT configuration.

Signed-off-by: Sujith <Sujith.Manoharan@atheros.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
drivers/net/wireless/ath/ath9k/htc_drv_main.c

index fe5debf0b7d72cbdc57578cf63b57772f02f9012..80feeb3a6bf0633d1915e319128e8ccaa482d20c 100644 (file)
@@ -409,6 +409,33 @@ static void ath9k_htc_init_rate(struct ath9k_htc_priv *priv,
                          sta->addr, be32_to_cpu(trate.capflags));
 }
 
+static void ath9k_htc_update_rate(struct ath9k_htc_priv *priv,
+                                 struct ieee80211_vif *vif,
+                                 struct ieee80211_bss_conf *bss_conf)
+{
+       struct ath_common *common = ath9k_hw_common(priv->ah);
+       struct ath9k_htc_target_rate trate;
+       struct ieee80211_sta *sta;
+       int ret;
+
+       memset(&trate, 0, sizeof(struct ath9k_htc_target_rate));
+
+       rcu_read_lock();
+       sta = ieee80211_find_sta(vif, bss_conf->bssid);
+       if (!sta) {
+               rcu_read_unlock();
+               return;
+       }
+       ath9k_htc_setup_rate(priv, sta, &trate);
+       rcu_read_unlock();
+
+       ret = ath9k_htc_send_rate_cmd(priv, &trate);
+       if (!ret)
+               ath_print(common, ATH_DBG_CONFIG,
+                         "Updated target sta: %pM, rate caps: 0x%X\n",
+                         bss_conf->bssid, be32_to_cpu(trate.capflags));
+}
+
 static int ath9k_htc_aggr_oper(struct ath9k_htc_priv *priv,
                               struct ieee80211_vif *vif,
                               u8 *sta_addr, u8 tid, bool oper)
@@ -1595,6 +1622,9 @@ static void ath9k_htc_bss_info_changed(struct ieee80211_hw *hw,
                ath9k_hw_init_global_settings(ah);
        }
 
+       if (changed & BSS_CHANGED_HT)
+               ath9k_htc_update_rate(priv, vif, bss_conf);
+
        ath9k_htc_ps_restore(priv);
        mutex_unlock(&priv->mutex);
 }