The changes were previously submitted to the list by Fabrice.  I just
reformatted the patch so it can be applied with git.

Signed-off-by: Fabrice Deyber <fabricedey...@agilemesh.com>
Tested-by: Yeoh Chun Yeow <yeohchuny...@gmail.com>
---
 drivers/net/wireless/ath/ath9k/beacon.c |   29 +++++++++------
 drivers/net/wireless/ath/ath9k/hw.c     |   59 +++++++++++++++++--------------
 2 files changed, 49 insertions(+), 39 deletions(-)

diff --git a/drivers/net/wireless/ath/ath9k/beacon.c 
b/drivers/net/wireless/ath/ath9k/beacon.c
index 22cd241..42f5573 100644
--- a/drivers/net/wireless/ath/ath9k/beacon.c
+++ b/drivers/net/wireless/ath/ath9k/beacon.c
@@ -628,20 +628,25 @@ 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;
+       u64 tsf;
+       u32 tsftu, intval, nexttbtt;
 
-       tsf = ath9k_hw_gettsf32(ah) + TU_TO_USEC(FUDGE);
-       intval = TU_TO_USEC(conf->beacon_interval & ATH9K_BEACON_PERIOD);
+       intval = 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 + roundup(delta, intval);
-       }
+
+       /* Pull nexttbtt forward to reflect the current TSF */
+
+       nexttbtt = TSF_TO_TU(sc->beacon.bc_tstamp >> 32, sc->beacon.bc_tstamp);
+       if (nexttbtt == 0)
+                               nexttbtt = intval;
+       else if (intval)
+                               nexttbtt = roundup(nexttbtt, intval);
+
+       tsf = ath9k_hw_gettsf64(ah);
+       tsftu = TSF_TO_TU((u32)(tsf>>32), (u32)tsf) + FUDGE;
+       do {
+               nexttbtt += intval;
+       } while (nexttbtt < tsftu);
 
        ath_dbg(common, ATH_DBG_BEACON,
                "IBSS nexttbtt %u intval %u (%u)\n",
diff --git a/drivers/net/wireless/ath/ath9k/hw.c 
b/drivers/net/wireless/ath/ath9k/hw.c
index 58f3d42..8218c31 100644
--- a/drivers/net/wireless/ath/ath9k/hw.c
+++ b/drivers/net/wireless/ath/ath9k/hw.c
@@ -1735,35 +1735,40 @@ void ath9k_hw_beaconinit(struct ath_hw *ah, u32 
next_beacon, u32 beacon_period)
        ENABLE_REGWRITE_BUFFER(ah);
 
        switch (ah->opmode) {
-       case NL80211_IFTYPE_ADHOC:
-       case NL80211_IFTYPE_MESH_POINT:
-               REG_SET_BIT(ah, AR_TXCFG,
-                           AR_TXCFG_ADHOC_BEACON_ATIM_TX_POLICY);
-               REG_WRITE(ah, AR_NEXT_NDP_TIMER, next_beacon +
-                         TU_TO_USEC(ah->atim_window ? ah->atim_window : 1));
-               flags |= AR_NDP_TIMER_EN;
-       case NL80211_IFTYPE_AP:
-               REG_WRITE(ah, AR_NEXT_TBTT_TIMER, next_beacon);
-               REG_WRITE(ah, AR_NEXT_DMA_BEACON_ALERT, next_beacon -
-                         TU_TO_USEC(ah->config.dma_beacon_response_time));
-               REG_WRITE(ah, AR_NEXT_SWBA, next_beacon -
-                         TU_TO_USEC(ah->config.sw_beacon_response_time));
-               flags |=
-                       AR_TBTT_TIMER_EN | AR_DBA_TIMER_EN | AR_SWBA_TIMER_EN;
-               break;
-       default:
-               ath_dbg(ath9k_hw_common(ah), ATH_DBG_BEACON,
-                       "%s: unsupported opmode: %d\n",
-                       __func__, ah->opmode);
-               return;
-               break;
+               case NL80211_IFTYPE_ADHOC:
+               case NL80211_IFTYPE_MESH_POINT:
+                       REG_SET_BIT(ah, AR_TXCFG,
+                                       AR_TXCFG_ADHOC_BEACON_ATIM_TX_POLICY);
+                       REG_WRITE(ah, AR_NEXT_NDP_TIMER,
+                                       TU_TO_USEC(next_beacon +
+                                               (ah->atim_window ? ah->
+                                                atim_window : 1)));
+                       flags |= AR_NDP_TIMER_EN;
+               case NL80211_IFTYPE_AP:
+                       REG_WRITE(ah, AR_NEXT_TBTT_TIMER, 
TU_TO_USEC(next_beacon));
+                       REG_WRITE(ah, AR_NEXT_DMA_BEACON_ALERT,
+                                       TU_TO_USEC(next_beacon -
+                                               ah->config.
+                                               dma_beacon_response_time));
+                       REG_WRITE(ah, AR_NEXT_SWBA,
+                                       TU_TO_USEC(next_beacon -
+                                               ah->config.
+                                               sw_beacon_response_time));
+                       flags |=
+                               AR_TBTT_TIMER_EN | AR_DBA_TIMER_EN | 
AR_SWBA_TIMER_EN;
+                       break;
+               default:
+                       ath_dbg(ath9k_hw_common(ah), ATH_DBG_BEACON,
+                                       "%s: unsupported opmode: %d\n",
+                                       __func__, ah->opmode);
+                       return;
+                       break;
        }
 
-       REG_WRITE(ah, AR_BEACON_PERIOD, beacon_period);
-       REG_WRITE(ah, AR_DMA_BEACON_PERIOD, beacon_period);
-       REG_WRITE(ah, AR_SWBA_PERIOD, beacon_period);
-       REG_WRITE(ah, AR_NDP_PERIOD, beacon_period);
-
+       REG_WRITE(ah, AR_BEACON_PERIOD, TU_TO_USEC(beacon_period));
+       REG_WRITE(ah, AR_DMA_BEACON_PERIOD, TU_TO_USEC(beacon_period));
+       REG_WRITE(ah, AR_SWBA_PERIOD, TU_TO_USEC(beacon_period));
+       REG_WRITE(ah, AR_NDP_PERIOD, TU_TO_USEC(beacon_period));
        REGWRITE_BUFFER_FLUSH(ah);
 
        REG_SET_BIT(ah, AR_TIMER_MODE, flags);
-- 
1.7.1

_______________________________________________
Devel mailing list
Devel@lists.open80211s.org
http://open80211s.com/mailman/listinfo/devel

Reply via email to