forked from Minki/linux
ath9k: Maintain rate table choice after association
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>
This commit is contained in:
parent
40990ec01f
commit
3706de6f58
@ -106,7 +106,7 @@ static void ath_beacon_setup(struct ath_softc *sc,
|
|||||||
* XXX everything at min xmit rate
|
* XXX everything at min xmit rate
|
||||||
*/
|
*/
|
||||||
rix = 0;
|
rix = 0;
|
||||||
rt = sc->hw_rate_table[sc->sc_curmode];
|
rt = sc->cur_rate_table;
|
||||||
rate = rt->info[rix].ratecode;
|
rate = rt->info[rix].ratecode;
|
||||||
if (sc->sc_flags & SC_OP_PREAMBLE_SHORT)
|
if (sc->sc_flags & SC_OP_PREAMBLE_SHORT)
|
||||||
rate |= rt->info[rix].short_preamble;
|
rate |= rt->info[rix].short_preamble;
|
||||||
|
@ -646,7 +646,6 @@ struct ath_softc {
|
|||||||
u8 sc_tx_chainmask;
|
u8 sc_tx_chainmask;
|
||||||
u8 sc_rx_chainmask;
|
u8 sc_rx_chainmask;
|
||||||
enum ath9k_int sc_imask;
|
enum ath9k_int sc_imask;
|
||||||
enum wireless_mode sc_curmode;
|
|
||||||
enum PROT_MODE sc_protmode;
|
enum PROT_MODE sc_protmode;
|
||||||
|
|
||||||
u8 sc_nbcnvaps;
|
u8 sc_nbcnvaps;
|
||||||
|
@ -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)
|
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
|
* All protection frames are transmited at 2Mb/s for
|
||||||
* 11g, otherwise at 1Mb/s.
|
* 11g, otherwise at 1Mb/s.
|
||||||
|
@ -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
|
* So, set fourth rate in series to be same as third one for
|
||||||
* above conditions.
|
* above conditions.
|
||||||
*/
|
*/
|
||||||
if ((sc->sc_curmode == ATH9K_MODE_11NG_HT20) ||
|
if ((sc->hw->conf.channel->band == IEEE80211_BAND_2GHZ) &&
|
||||||
(sc->sc_curmode == ATH9K_MODE_11NG_HT40PLUS) ||
|
(sc->hw->conf.ht.enabled)) {
|
||||||
(sc->sc_curmode == ATH9K_MODE_11NG_HT40MINUS)) {
|
|
||||||
u8 dot11rate = rate_table->info[rix].dot11rate;
|
u8 dot11rate = rate_table->info[rix].dot11rate;
|
||||||
u8 phy = rate_table->info[rix].phy;
|
u8 phy = rate_table->info[rix].phy;
|
||||||
if (i == 4 &&
|
if (i == 4 &&
|
||||||
@ -1354,8 +1353,8 @@ static void ath_rc_init(struct ath_softc *sc,
|
|||||||
sta->ht_cap.ht_supported,
|
sta->ht_cap.ht_supported,
|
||||||
is_cw_40);
|
is_cw_40);
|
||||||
} else if (sc->sc_ah->ah_opmode == NL80211_IFTYPE_AP) {
|
} else if (sc->sc_ah->ah_opmode == NL80211_IFTYPE_AP) {
|
||||||
/* sc_curmode would be set on init through config() */
|
/* cur_rate_table would be set on init through config() */
|
||||||
rate_table = sc->hw_rate_table[sc->sc_curmode];
|
rate_table = sc->cur_rate_table;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!rate_table) {
|
if (!rate_table) {
|
||||||
|
@ -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 ieee80211_rx_status *rx_status, bool *decrypt_error,
|
||||||
struct ath_softc *sc)
|
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;
|
struct ieee80211_hdr *hdr;
|
||||||
int ratekbps, rix;
|
int ratekbps, rix;
|
||||||
u8 ratecode;
|
u8 ratecode;
|
||||||
|
@ -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,
|
static u32 ath_pkt_duration(struct ath_softc *sc, u8 rix, struct ath_buf *bf,
|
||||||
int width, int half_gi, bool shortPreamble)
|
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;
|
u32 nbits, nsymbits, duration, nsymbols;
|
||||||
u8 rc;
|
u8 rc;
|
||||||
int streams, pktlen;
|
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 */
|
/* 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--) {
|
for (i = 3; i >= 0; i--) {
|
||||||
if (rates[i].count && (rates[i].idx >= 0)) {
|
if (rates[i].count && (rates[i].idx >= 0)) {
|
||||||
rix = rates[i].idx;
|
rix = rates[i].idx;
|
||||||
@ -1240,7 +1240,7 @@ static u32 ath_lookup_rate(struct ath_softc *sc,
|
|||||||
struct ath_buf *bf,
|
struct ath_buf *bf,
|
||||||
struct ath_atx_tid *tid)
|
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 sk_buff *skb;
|
||||||
struct ieee80211_tx_info *tx_info;
|
struct ieee80211_tx_info *tx_info;
|
||||||
struct ieee80211_tx_rate *rates;
|
struct ieee80211_tx_rate *rates;
|
||||||
@ -1308,7 +1308,7 @@ static int ath_compute_num_delims(struct ath_softc *sc,
|
|||||||
struct ath_buf *bf,
|
struct ath_buf *bf,
|
||||||
u16 frmlen)
|
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 sk_buff *skb = bf->bf_mpdu;
|
||||||
struct ieee80211_tx_info *tx_info = IEEE80211_SKB_CB(skb);
|
struct ieee80211_tx_info *tx_info = IEEE80211_SKB_CB(skb);
|
||||||
u32 nsymbits, nsymbols, mpdudensity;
|
u32 nsymbits, nsymbols, mpdudensity;
|
||||||
|
Loading…
Reference in New Issue
Block a user