ath9k: Maintain rate table choice after association
authorSujith <Sujith.Manoharan@atheros.com>
Sun, 7 Dec 2008 16:12:10 +0000 (21:42 +0530)
committerJohn W. Linville <linville@tuxdriver.com>
Fri, 12 Dec 2008 18:48:24 +0000 (13:48 -0500)
A scan run after association would change sc_curmode which is
used to get the current rate table. This patch fixes it
by removing sc_curmode and setting the rate table in usage in cur_rate_table
on association.

Signed-off-by: Sujith <Sujith.Manoharan@atheros.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
drivers/net/wireless/ath9k/beacon.c
drivers/net/wireless/ath9k/core.h
drivers/net/wireless/ath9k/main.c
drivers/net/wireless/ath9k/rc.c
drivers/net/wireless/ath9k/recv.c
drivers/net/wireless/ath9k/xmit.c

index d8742230e6241252c5c050c0baee629a4ac5220a..9e5c0c0446b6cdc8986a2480adc1a8b76d82521e 100644 (file)
@@ -106,7 +106,7 @@ static void ath_beacon_setup(struct ath_softc *sc,
         * XXX everything at min xmit rate
         */
        rix = 0;
-       rt = sc->hw_rate_table[sc->sc_curmode];
+       rt = sc->cur_rate_table;
        rate = rt->info[rix].ratecode;
        if (sc->sc_flags & SC_OP_PREAMBLE_SHORT)
                rate |= rt->info[rix].short_preamble;
index 726d0a38d24031c2ee13677128f3fc063f0cd155..23844e02eff1edb0d80e76de8cc7b250f5cf7409 100644 (file)
@@ -646,7 +646,6 @@ struct ath_softc {
        u8 sc_tx_chainmask;
        u8 sc_rx_chainmask;
        enum ath9k_int sc_imask;
-       enum wireless_mode sc_curmode;
        enum PROT_MODE sc_protmode;
 
        u8 sc_nbcnvaps;
index 26c47577e183b909c9ad766da03f5d4b8d288017..ade92d518d5259817bf441bef4894d9b535db2ec 100644 (file)
@@ -60,7 +60,8 @@ static void bus_read_cachesize(struct ath_softc *sc, int *csz)
 
 static void ath_setcurmode(struct ath_softc *sc, enum wireless_mode mode)
 {
-       sc->sc_curmode = mode;
+       if (!sc->sc_curaid)
+               sc->cur_rate_table = sc->hw_rate_table[mode];
        /*
         * All protection frames are transmited at 2Mb/s for
         * 11g, otherwise at 1Mb/s.
index 8eec66756c75f23e824f19171e8778f2cf0bdbf3..0ae5988e0b65215e587e9df543508a6149bf81dc 100644 (file)
@@ -874,9 +874,8 @@ static void ath_rc_ratefind(struct ath_softc *sc,
         * So, set fourth rate in series to be same as third one for
         * above conditions.
         */
-       if ((sc->sc_curmode == ATH9K_MODE_11NG_HT20) ||
-           (sc->sc_curmode == ATH9K_MODE_11NG_HT40PLUS) ||
-           (sc->sc_curmode == ATH9K_MODE_11NG_HT40MINUS)) {
+       if ((sc->hw->conf.channel->band == IEEE80211_BAND_2GHZ) &&
+           (sc->hw->conf.ht.enabled)) {
                u8 dot11rate = rate_table->info[rix].dot11rate;
                u8 phy = rate_table->info[rix].phy;
                if (i == 4 &&
@@ -1354,8 +1353,8 @@ static void ath_rc_init(struct ath_softc *sc,
                                                   sta->ht_cap.ht_supported,
                                                   is_cw_40);
        } else if (sc->sc_ah->ah_opmode == NL80211_IFTYPE_AP) {
-               /* sc_curmode would be set on init through config() */
-               rate_table = sc->hw_rate_table[sc->sc_curmode];
+               /* cur_rate_table would be set on init through config() */
+               rate_table = sc->cur_rate_table;
        }
 
        if (!rate_table) {
index 7a455468823b8d24145b8c2d8de12f62a474414c..b182ef570f88062cc975b4b6dea44b06e3bf2ce8 100644 (file)
@@ -148,7 +148,7 @@ static int ath_rx_prepare(struct sk_buff *skb, struct ath_desc *ds,
                          struct ieee80211_rx_status *rx_status, bool *decrypt_error,
                          struct ath_softc *sc)
 {
-       struct ath_rate_table *rate_table = sc->hw_rate_table[sc->sc_curmode];
+       struct ath_rate_table *rate_table = sc->cur_rate_table;
        struct ieee80211_hdr *hdr;
        int ratekbps, rix;
        u8 ratecode;
index 9de27c681b86f9135e10fc5e3572e8e0f819f753..353b7ed1c8a46d630560fb9d3015696a0d1d63a0 100644 (file)
@@ -493,7 +493,7 @@ static void ath_tx_update_baw(struct ath_softc *sc, struct ath_atx_tid *tid,
 static u32 ath_pkt_duration(struct ath_softc *sc, u8 rix, struct ath_buf *bf,
                            int width, int half_gi, bool shortPreamble)
 {
-       struct ath_rate_table *rate_table = sc->hw_rate_table[sc->sc_curmode];
+       struct ath_rate_table *rate_table = sc->cur_rate_table;
        u32 nbits, nsymbits, duration, nsymbols;
        u8 rc;
        int streams, pktlen;
@@ -557,7 +557,7 @@ static void ath_buf_set_rate(struct ath_softc *sc, struct ath_buf *bf)
        }
 
        /* get the cix for the lowest valid rix */
-       rt = sc->hw_rate_table[sc->sc_curmode];
+       rt = sc->cur_rate_table;
        for (i = 3; i >= 0; i--) {
                if (rates[i].count && (rates[i].idx >= 0)) {
                        rix = rates[i].idx;
@@ -1240,7 +1240,7 @@ static u32 ath_lookup_rate(struct ath_softc *sc,
                           struct ath_buf *bf,
                           struct ath_atx_tid *tid)
 {
-       struct ath_rate_table *rate_table = sc->hw_rate_table[sc->sc_curmode];
+       struct ath_rate_table *rate_table = sc->cur_rate_table;
        struct sk_buff *skb;
        struct ieee80211_tx_info *tx_info;
        struct ieee80211_tx_rate *rates;
@@ -1308,7 +1308,7 @@ static int ath_compute_num_delims(struct ath_softc *sc,
                                  struct ath_buf *bf,
                                  u16 frmlen)
 {
-       struct ath_rate_table *rt = sc->hw_rate_table[sc->sc_curmode];
+       struct ath_rate_table *rt = sc->cur_rate_table;
        struct sk_buff *skb = bf->bf_mpdu;
        struct ieee80211_tx_info *tx_info = IEEE80211_SKB_CB(skb);
        u32 nsymbits, nsymbols, mpdudensity;