ath9k: Use the Beacon TX rate from mac80211
authorJouni Malinen <jouni.malinen@atheros.com>
Tue, 16 Feb 2010 15:56:18 +0000 (17:56 +0200)
committerJohn W. Linville <linville@tuxdriver.com>
Tue, 16 Feb 2010 19:16:24 +0000 (14:16 -0500)
Instead of hardcoding the lowest rate for Beacon frames, use the rate
index specified in the mac80211 TX info in AP mode.

Signed-off-by: Jouni Malinen <jouni.malinen@atheros.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
drivers/net/wireless/ath/ath9k/beacon.c

index d088ebfe63a6c843fe6d193210b2bb4f465ca0dd..42171d043c317f108b2f4b587a64a1f5de94de62 100644 (file)
@@ -62,7 +62,7 @@ int ath_beaconq_config(struct ath_softc *sc)
  *  Beacons are always sent out at the lowest rate, and are not retried.
 */
 static void ath_beacon_setup(struct ath_softc *sc, struct ath_vif *avp,
-                            struct ath_buf *bf)
+                            struct ath_buf *bf, int rateidx)
 {
        struct sk_buff *skb = bf->bf_mpdu;
        struct ath_hw *ah = sc->sc_ah;
@@ -96,9 +96,9 @@ static void ath_beacon_setup(struct ath_softc *sc, struct ath_vif *avp,
        ds->ds_data = bf->bf_buf_addr;
 
        sband = &sc->sbands[common->hw->conf.channel->band];
-       rate = sband->bitrates[0].hw_value;
+       rate = sband->bitrates[rateidx].hw_value;
        if (sc->sc_flags & SC_OP_PREAMBLE_SHORT)
-               rate |= sband->bitrates[0].hw_value_short;
+               rate |= sband->bitrates[rateidx].hw_value_short;
 
        ath9k_hw_set11n_txdesc(ah, ds, skb->len + FCS_LEN,
                               ATH9K_PKT_TYPE_BEACON,
@@ -206,7 +206,7 @@ static struct ath_buf *ath_beacon_generate(struct ieee80211_hw *hw,
                }
        }
 
-       ath_beacon_setup(sc, avp, bf);
+       ath_beacon_setup(sc, avp, bf, info->control.rates[0].idx);
 
        while (skb) {
                ath_tx_cabq(hw, skb);
@@ -237,7 +237,7 @@ static void ath_beacon_start_adhoc(struct ath_softc *sc,
        bf = avp->av_bcbuf;
        skb = bf->bf_mpdu;
 
-       ath_beacon_setup(sc, avp, bf);
+       ath_beacon_setup(sc, avp, bf, 0);
 
        /* NB: caller is known to have already stopped tx dma */
        ath9k_hw_puttxbuf(ah, sc->beacon.beaconq, bf->bf_daddr);