ath9k: implement coverage class support
authorFelix Fietkau <nbd@openwrt.org>
Fri, 15 Jan 2010 01:34:58 +0000 (02:34 +0100)
committerJohn W. Linville <linville@tuxdriver.com>
Fri, 15 Jan 2010 22:03:00 +0000 (17:03 -0500)
Signed-off-by: Felix Fietkau <nbd@openwrt.org>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
drivers/net/wireless/ath/ath9k/hw.c
drivers/net/wireless/ath/ath9k/hw.h
drivers/net/wireless/ath/ath9k/main.c

index e1fd4cc9fae279277840b9bd64554ce41a72b5fe..0b1dd10f1d845837ec82cad4b3fb8adf4fd7f1d9 100644 (file)
@@ -1195,6 +1195,7 @@ void ath9k_hw_init_global_settings(struct ath_hw *ah)
 {
        struct ieee80211_conf *conf = &ath9k_hw_common(ah)->hw->conf;
        int acktimeout;
+       int slottime;
        int sifstime;
 
        ath_print(ath9k_hw_common(ah), ATH_DBG_RESET, "ah->misc_mode 0x%x\n",
@@ -1209,8 +1210,10 @@ void ath9k_hw_init_global_settings(struct ath_hw *ah)
        else
                sifstime = 10;
 
-       acktimeout = ah->slottime + sifstime;
-       ath9k_hw_setslottime(ah, ah->slottime);
+       /* As defined by IEEE 802.11-2007 17.3.8.6 */
+       slottime = ah->slottime + 3 * ah->coverage_class;
+       acktimeout = slottime + sifstime;
+       ath9k_hw_setslottime(ah, slottime);
        ath9k_hw_set_ack_timeout(ah, acktimeout);
        ath9k_hw_set_cts_timeout(ah, acktimeout);
        if (ah->globaltxtimeout != (u32) -1)
index a7ff07537bc4d8d18ad31c25f8209c01e592cb80..ab1f1981d857a2a697375f17bad6527ca4ed64c6 100644 (file)
@@ -551,6 +551,7 @@ struct ath_hw {
        u32 *bank6Temp;
 
        int16_t txpower_indexoffset;
+       int coverage_class;
        u32 beacon_interval;
        u32 slottime;
        u32 globaltxtimeout;
index 580ecca0182c86c65094bab2dc680920454b8860..c0c571c2e8c4ba89247051da4f946beb0b4f1a3d 100644 (file)
@@ -2014,6 +2014,18 @@ static void ath9k_sw_scan_complete(struct ieee80211_hw *hw)
        mutex_unlock(&sc->mutex);
 }
 
+static void ath9k_set_coverage_class(struct ieee80211_hw *hw, u8 coverage_class)
+{
+       struct ath_wiphy *aphy = hw->priv;
+       struct ath_softc *sc = aphy->sc;
+       struct ath_hw *ah = sc->sc_ah;
+
+       mutex_lock(&sc->mutex);
+       ah->coverage_class = coverage_class;
+       ath9k_hw_init_global_settings(ah);
+       mutex_unlock(&sc->mutex);
+}
+
 struct ieee80211_ops ath9k_ops = {
        .tx                 = ath9k_tx,
        .start              = ath9k_start,
@@ -2033,4 +2045,5 @@ struct ieee80211_ops ath9k_ops = {
        .sw_scan_start      = ath9k_sw_scan_start,
        .sw_scan_complete   = ath9k_sw_scan_complete,
        .rfkill_poll        = ath9k_rfkill_poll_state,
+       .set_coverage_class = ath9k_set_coverage_class,
 };