ath5k: fix slot time handling
authorFelix Fietkau <nbd@openwrt.org>
Sat, 9 Apr 2011 21:10:21 +0000 (23:10 +0200)
committerJohn W. Linville <linville@tuxdriver.com>
Tue, 12 Apr 2011 20:59:09 +0000 (16:59 -0400)
Set the slot time based on the mac80211 short slot vs long slot setting
instead of just forcing long slot for all CCK-enabled channels.
This slightly improves 802.11g mode performance in in my tests.

Signed-off-by: Felix Fietkau <nbd@openwrt.org>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
drivers/net/wireless/ath/ath5k/ath5k.h
drivers/net/wireless/ath/ath5k/mac80211-ops.c
drivers/net/wireless/ath/ath5k/pcu.c

index a49aeac378cd6a653d75db1c17b0f1a26aac49e7..4bb381cae08d5ccf9df9e3ef598a5ac28d4ae6e4 100644 (file)
@@ -1057,6 +1057,7 @@ struct ath5k_hw {
        u8                      ah_coverage_class;
        bool                    ah_ack_bitrate_high;
        u8                      ah_bwmode;
+       bool                    ah_short_slot;
 
        /* Antenna Control */
        u32                     ah_ant_ctl[AR5K_EEPROM_N_MODES][AR5K_ANT_MAX];
index 9be29b728b1cffe2fdc5d9bf0977fe14e77fc562..807bd6440169b916435e554b9a00793811f84310 100644 (file)
@@ -282,6 +282,15 @@ ath5k_bss_info_changed(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
        if (changes & BSS_CHANGED_BEACON_INT)
                sc->bintval = bss_conf->beacon_int;
 
+       if (changes & BSS_CHANGED_ERP_SLOT) {
+               int slot_time;
+
+               ah->ah_short_slot = bss_conf->use_short_slot;
+               slot_time = ath5k_hw_get_default_slottime(ah) +
+                           3 * ah->ah_coverage_class;
+               ath5k_hw_set_ifs_intervals(ah, slot_time);
+       }
+
        if (changes & BSS_CHANGED_ASSOC) {
                avf->assoc = bss_conf->assoc;
                if (bss_conf->assoc)
index e342e470fb058b8dd765603d376586ce626ebdcd..71b60b7c617eaaaa32ed0032befa035191f4e7c5 100644 (file)
@@ -151,9 +151,9 @@ unsigned int ath5k_hw_get_default_slottime(struct ath5k_hw *ah)
                slot_time = AR5K_INIT_SLOT_TIME_QUARTER_RATE;
                break;
        case AR5K_BWMODE_DEFAULT:
-               slot_time = AR5K_INIT_SLOT_TIME_DEFAULT;
        default:
-               if (channel->hw_value & CHANNEL_CCK)
+               slot_time = AR5K_INIT_SLOT_TIME_DEFAULT;
+               if ((channel->hw_value & CHANNEL_CCK) && !ah->ah_short_slot)
                        slot_time = AR5K_INIT_SLOT_TIME_B;
                break;
        }