diff options
author | Sujith <Sujith.Manoharan@atheros.com> | 2008-12-07 11:11:37 -0500 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2008-12-12 13:48:23 -0500 |
commit | 40990ec01fcca0b86a19c13a5d3deb77da1913a7 (patch) | |
tree | 95dd971d3680b1c836e0bab8483833c965041448 /drivers/net/wireless/ath9k | |
parent | 6b3aa6ab787fe545c58554b7ce5c94de53526b83 (diff) |
ath9k: Fix bug in rate table management
The proper rate table wouldn't be used if a disassoc
happens and a new attempt is made to associate using
wpa_supplicant. This patch fixes it by storing the rate
table to be used on association.
Signed-off-by: Sujith <Sujith.Manoharan@atheros.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers/net/wireless/ath9k')
-rw-r--r-- | drivers/net/wireless/ath9k/core.h | 1 | ||||
-rw-r--r-- | drivers/net/wireless/ath9k/rc.c | 9 |
2 files changed, 6 insertions, 4 deletions
diff --git a/drivers/net/wireless/ath9k/core.h b/drivers/net/wireless/ath9k/core.h index ca8ed7dcd7bc..726d0a38d240 100644 --- a/drivers/net/wireless/ath9k/core.h +++ b/drivers/net/wireless/ath9k/core.h | |||
@@ -702,6 +702,7 @@ struct ath_softc { | |||
702 | /* Rate */ | 702 | /* Rate */ |
703 | struct ieee80211_rate rates[IEEE80211_NUM_BANDS][ATH_RATE_MAX]; | 703 | struct ieee80211_rate rates[IEEE80211_NUM_BANDS][ATH_RATE_MAX]; |
704 | struct ath_rate_table *hw_rate_table[ATH9K_MODE_MAX]; | 704 | struct ath_rate_table *hw_rate_table[ATH9K_MODE_MAX]; |
705 | struct ath_rate_table *cur_rate_table; | ||
705 | u8 sc_protrix; | 706 | u8 sc_protrix; |
706 | 707 | ||
707 | /* Channel, Band */ | 708 | /* Channel, Band */ |
diff --git a/drivers/net/wireless/ath9k/rc.c b/drivers/net/wireless/ath9k/rc.c index 76acd2b75fcd..8eec66756c75 100644 --- a/drivers/net/wireless/ath9k/rc.c +++ b/drivers/net/wireless/ath9k/rc.c | |||
@@ -817,7 +817,7 @@ static void ath_rc_ratefind(struct ath_softc *sc, | |||
817 | struct ath_rate_table *rate_table; | 817 | struct ath_rate_table *rate_table; |
818 | struct ieee80211_tx_rate *rates = tx_info->control.rates; | 818 | struct ieee80211_tx_rate *rates = tx_info->control.rates; |
819 | 819 | ||
820 | rate_table = sc->hw_rate_table[sc->sc_curmode]; | 820 | rate_table = sc->cur_rate_table; |
821 | rix = ath_rc_ratefind_ht(sc, ath_rc_priv, rate_table, 1, | 821 | rix = ath_rc_ratefind_ht(sc, ath_rc_priv, rate_table, 1, |
822 | is_probe, is_retry); | 822 | is_probe, is_retry); |
823 | nrix = rix; | 823 | nrix = rix; |
@@ -877,7 +877,7 @@ static void ath_rc_ratefind(struct ath_softc *sc, | |||
877 | if ((sc->sc_curmode == ATH9K_MODE_11NG_HT20) || | 877 | if ((sc->sc_curmode == ATH9K_MODE_11NG_HT20) || |
878 | (sc->sc_curmode == ATH9K_MODE_11NG_HT40PLUS) || | 878 | (sc->sc_curmode == ATH9K_MODE_11NG_HT40PLUS) || |
879 | (sc->sc_curmode == ATH9K_MODE_11NG_HT40MINUS)) { | 879 | (sc->sc_curmode == ATH9K_MODE_11NG_HT40MINUS)) { |
880 | u8 dot11rate = rate_table->info[rix].dot11rate; | 880 | u8 dot11rate = rate_table->info[rix].dot11rate; |
881 | u8 phy = rate_table->info[rix].phy; | 881 | u8 phy = rate_table->info[rix].phy; |
882 | if (i == 4 && | 882 | if (i == 4 && |
883 | ((dot11rate == 2 && phy == WLAN_RC_PHY_HT_40_SS) || | 883 | ((dot11rate == 2 && phy == WLAN_RC_PHY_HT_40_SS) || |
@@ -1094,7 +1094,7 @@ static void ath_rc_update_ht(struct ath_softc *sc, | |||
1094 | int rate; | 1094 | int rate; |
1095 | u8 last_per; | 1095 | u8 last_per; |
1096 | bool state_change = false; | 1096 | bool state_change = false; |
1097 | struct ath_rate_table *rate_table = sc->hw_rate_table[sc->sc_curmode]; | 1097 | struct ath_rate_table *rate_table = sc->cur_rate_table; |
1098 | int size = ath_rc_priv->rate_table_size; | 1098 | int size = ath_rc_priv->rate_table_size; |
1099 | 1099 | ||
1100 | if ((tx_rate < 0) || (tx_rate > rate_table->rate_cnt)) | 1100 | if ((tx_rate < 0) || (tx_rate > rate_table->rate_cnt)) |
@@ -1254,7 +1254,7 @@ static void ath_rc_tx_status(struct ath_softc *sc, | |||
1254 | u8 flags; | 1254 | u8 flags; |
1255 | u32 i = 0, rix; | 1255 | u32 i = 0, rix; |
1256 | 1256 | ||
1257 | rate_table = sc->hw_rate_table[sc->sc_curmode]; | 1257 | rate_table = sc->cur_rate_table; |
1258 | 1258 | ||
1259 | /* | 1259 | /* |
1260 | * If the first rate is not the final index, there | 1260 | * If the first rate is not the final index, there |
@@ -1432,6 +1432,7 @@ static void ath_rc_init(struct ath_softc *sc, | |||
1432 | ath_rc_priv->max_valid_rate = k; | 1432 | ath_rc_priv->max_valid_rate = k; |
1433 | ath_rc_sort_validrates(rate_table, ath_rc_priv); | 1433 | ath_rc_sort_validrates(rate_table, ath_rc_priv); |
1434 | ath_rc_priv->rate_max_phy = ath_rc_priv->valid_rate_index[k-4]; | 1434 | ath_rc_priv->rate_max_phy = ath_rc_priv->valid_rate_index[k-4]; |
1435 | sc->cur_rate_table = rate_table; | ||
1435 | } | 1436 | } |
1436 | 1437 | ||
1437 | /* Rate Control callbacks */ | 1438 | /* Rate Control callbacks */ |