diff options
Diffstat (limited to 'drivers/net/wireless/ath/ath9k/beacon.c')
| -rw-r--r-- | drivers/net/wireless/ath/ath9k/beacon.c | 30 | 
1 files changed, 15 insertions, 15 deletions
diff --git a/drivers/net/wireless/ath/ath9k/beacon.c b/drivers/net/wireless/ath/ath9k/beacon.c index d4d8ceced89..0d13ff74a68 100644 --- a/drivers/net/wireless/ath/ath9k/beacon.c +++ b/drivers/net/wireless/ath/ath9k/beacon.c @@ -14,6 +14,7 @@   * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.   */ +#include <linux/dma-mapping.h>  #include "ath9k.h"  #define FUDGE 2 @@ -360,6 +361,7 @@ void ath_beacon_tasklet(unsigned long data)  	struct ath_common *common = ath9k_hw_common(ah);  	struct ath_buf *bf = NULL;  	struct ieee80211_vif *vif; +	struct ath_tx_status ts;  	int slot;  	u32 bfaddr, bc = 0; @@ -384,7 +386,9 @@ void ath_beacon_tasklet(unsigned long data)  			ath_dbg(common, ATH_DBG_BSTUCK,  				"beacon is officially stuck\n");  			sc->sc_flags |= SC_OP_TSF_RESET; +			spin_lock(&sc->sc_pcu_lock);  			ath_reset(sc, true); +			spin_unlock(&sc->sc_pcu_lock);  		}  		return; @@ -464,6 +468,11 @@ void ath_beacon_tasklet(unsigned long data)  		ath9k_hw_txstart(ah, sc->beacon.beaconq);  		sc->beacon.ast_be_xmit += bc;     /* XXX per-vif? */ +		if (ah->caps.hw_caps & ATH9K_HW_CAP_EDMA) { +			spin_lock_bh(&sc->sc_pcu_lock); +			ath9k_hw_txprocdesc(ah, bf->bf_desc, (void *)&ts); +			spin_unlock_bh(&sc->sc_pcu_lock); +		}  	}  } @@ -496,7 +505,7 @@ static void ath_beacon_config_ap(struct ath_softc *sc,  	u32 nexttbtt, intval;  	/* NB: the beacon interval is kept internally in TU's */ -	intval = TU_TO_USEC(conf->beacon_interval & ATH9K_BEACON_PERIOD); +	intval = TU_TO_USEC(conf->beacon_interval);  	intval /= ATH_BCBUF;    /* for staggered beacons */  	nexttbtt = intval; @@ -543,7 +552,7 @@ static void ath_beacon_config_sta(struct ath_softc *sc,  	}  	memset(&bs, 0, sizeof(bs)); -	intval = conf->beacon_interval & ATH9K_BEACON_PERIOD; +	intval = conf->beacon_interval;  	/*  	 * Setup dtim and cfp parameters according to @@ -652,22 +661,13 @@ static void ath_beacon_config_adhoc(struct ath_softc *sc,  {  	struct ath_hw *ah = sc->sc_ah;  	struct ath_common *common = ath9k_hw_common(ah); -	u32 tsf, delta, intval, nexttbtt; +	u32 tsf, intval, nexttbtt;  	ath9k_reset_beacon_status(sc); -	tsf = ath9k_hw_gettsf32(ah) + TU_TO_USEC(FUDGE); -	intval = TU_TO_USEC(conf->beacon_interval & ATH9K_BEACON_PERIOD); - -	if (!sc->beacon.bc_tstamp) -		nexttbtt = tsf + intval; -	else { -		if (tsf > sc->beacon.bc_tstamp) -			delta = (tsf - sc->beacon.bc_tstamp); -		else -			delta = (tsf + 1 + (~0U - sc->beacon.bc_tstamp)); -		nexttbtt = tsf + intval - (delta % intval); -	} +	intval = TU_TO_USEC(conf->beacon_interval); +	tsf = roundup(ath9k_hw_gettsf32(ah) + TU_TO_USEC(FUDGE), intval); +	nexttbtt = tsf + intval;  	ath_dbg(common, ATH_DBG_BEACON,  		"IBSS nexttbtt %u intval %u (%u)\n",  |