diff options
Diffstat (limited to 'drivers/net/wireless/ath/ath9k/beacon.c')
-rw-r--r-- | drivers/net/wireless/ath/ath9k/beacon.c | 24 |
1 files changed, 14 insertions, 10 deletions
diff --git a/drivers/net/wireless/ath/ath9k/beacon.c b/drivers/net/wireless/ath/ath9k/beacon.c index b10c884f2933..1660ef17aaf5 100644 --- a/drivers/net/wireless/ath/ath9k/beacon.c +++ b/drivers/net/wireless/ath/ath9k/beacon.c | |||
@@ -23,11 +23,12 @@ | |||
23 | * the operating mode of the station (AP or AdHoc). Parameters are AIFS | 23 | * the operating mode of the station (AP or AdHoc). Parameters are AIFS |
24 | * settings and channel width min/max | 24 | * settings and channel width min/max |
25 | */ | 25 | */ |
26 | static int ath_beaconq_config(struct ath_softc *sc) | 26 | int ath_beaconq_config(struct ath_softc *sc) |
27 | { | 27 | { |
28 | struct ath_hw *ah = sc->sc_ah; | 28 | struct ath_hw *ah = sc->sc_ah; |
29 | struct ath_common *common = ath9k_hw_common(ah); | 29 | struct ath_common *common = ath9k_hw_common(ah); |
30 | struct ath9k_tx_queue_info qi; | 30 | struct ath9k_tx_queue_info qi, qi_be; |
31 | int qnum; | ||
31 | 32 | ||
32 | ath9k_hw_get_txq_props(ah, sc->beacon.beaconq, &qi); | 33 | ath9k_hw_get_txq_props(ah, sc->beacon.beaconq, &qi); |
33 | if (sc->sc_ah->opmode == NL80211_IFTYPE_AP) { | 34 | if (sc->sc_ah->opmode == NL80211_IFTYPE_AP) { |
@@ -37,9 +38,12 @@ static int ath_beaconq_config(struct ath_softc *sc) | |||
37 | qi.tqi_cwmax = 0; | 38 | qi.tqi_cwmax = 0; |
38 | } else { | 39 | } else { |
39 | /* Adhoc mode; important thing is to use 2x cwmin. */ | 40 | /* Adhoc mode; important thing is to use 2x cwmin. */ |
40 | qi.tqi_aifs = sc->beacon.beacon_qi.tqi_aifs; | 41 | qnum = ath_tx_get_qnum(sc, ATH9K_TX_QUEUE_DATA, |
41 | qi.tqi_cwmin = 2*sc->beacon.beacon_qi.tqi_cwmin; | 42 | ATH9K_WME_AC_BE); |
42 | qi.tqi_cwmax = sc->beacon.beacon_qi.tqi_cwmax; | 43 | ath9k_hw_get_txq_props(ah, qnum, &qi_be); |
44 | qi.tqi_aifs = qi_be.tqi_aifs; | ||
45 | qi.tqi_cwmin = 4*qi_be.tqi_cwmin; | ||
46 | qi.tqi_cwmax = qi_be.tqi_cwmax; | ||
43 | } | 47 | } |
44 | 48 | ||
45 | if (!ath9k_hw_set_txq_props(ah, sc->beacon.beaconq, &qi)) { | 49 | if (!ath9k_hw_set_txq_props(ah, sc->beacon.beaconq, &qi)) { |
@@ -65,9 +69,9 @@ static void ath_beacon_setup(struct ath_softc *sc, struct ath_vif *avp, | |||
65 | struct ath_common *common = ath9k_hw_common(ah); | 69 | struct ath_common *common = ath9k_hw_common(ah); |
66 | struct ath_desc *ds; | 70 | struct ath_desc *ds; |
67 | struct ath9k_11n_rate_series series[4]; | 71 | struct ath9k_11n_rate_series series[4]; |
68 | const struct ath_rate_table *rt; | ||
69 | int flags, antenna, ctsrate = 0, ctsduration = 0; | 72 | int flags, antenna, ctsrate = 0, ctsduration = 0; |
70 | u8 rate; | 73 | struct ieee80211_supported_band *sband; |
74 | u8 rate = 0; | ||
71 | 75 | ||
72 | ds = bf->bf_desc; | 76 | ds = bf->bf_desc; |
73 | flags = ATH9K_TXDESC_NOACK; | 77 | flags = ATH9K_TXDESC_NOACK; |
@@ -91,10 +95,10 @@ static void ath_beacon_setup(struct ath_softc *sc, struct ath_vif *avp, | |||
91 | 95 | ||
92 | ds->ds_data = bf->bf_buf_addr; | 96 | ds->ds_data = bf->bf_buf_addr; |
93 | 97 | ||
94 | rt = sc->cur_rate_table; | 98 | sband = &sc->sbands[common->hw->conf.channel->band]; |
95 | rate = rt->info[0].ratecode; | 99 | rate = sband->bitrates[0].hw_value; |
96 | if (sc->sc_flags & SC_OP_PREAMBLE_SHORT) | 100 | if (sc->sc_flags & SC_OP_PREAMBLE_SHORT) |
97 | rate |= rt->info[0].short_preamble; | 101 | rate |= sband->bitrates[0].hw_value_short; |
98 | 102 | ||
99 | ath9k_hw_set11n_txdesc(ah, ds, skb->len + FCS_LEN, | 103 | ath9k_hw_set11n_txdesc(ah, ds, skb->len + FCS_LEN, |
100 | ATH9K_PKT_TYPE_BEACON, | 104 | ATH9K_PKT_TYPE_BEACON, |