ath9k_htc: Fix TBTT calculation for IBSS mode
authorSujith Manoharan <Sujith.Manoharan@atheros.com>
Mon, 21 Feb 2011 02:20:01 +0000 (07:50 +0530)
committerJohn W. Linville <linville@tuxdriver.com>
Wed, 23 Feb 2011 21:25:28 +0000 (16:25 -0500)
The target beacon transmission time has to be synced with the HW
TSF when configuring beacon timers in Adhoc mode. Failing to do this
would cause erroneous beacon transmission, for example, on completion
of a scan run to check for IBSS merges.

Signed-off-by: Sujith Manoharan <Sujith.Manoharan@atheros.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
drivers/net/wireless/ath/ath9k/htc_drv_beacon.c

index e897a56695b27e3d0bc415181ae29cbbd01c0345..007b99fc50c8b8c22b72ab65180e0e1aa039dea5 100644 (file)
@@ -188,20 +188,31 @@ static void ath9k_htc_beacon_config_adhoc(struct ath9k_htc_priv *priv,
 {
        struct ath_common *common = ath9k_hw_common(priv->ah);
        enum ath9k_int imask = 0;
-       u32 nexttbtt, intval;
+       u32 nexttbtt, intval, tsftu;
        __be32 htc_imask = 0;
        int ret;
        u8 cmd_rsp;
+       u64 tsf;
 
        intval = bss_conf->beacon_interval & ATH9K_BEACON_PERIOD;
        nexttbtt = intval;
+
+       /*
+        * Pull nexttbtt forward to reflect the current TSF.
+        */
+       tsf = ath9k_hw_gettsf64(priv->ah);
+       tsftu = TSF_TO_TU(tsf >> 32, tsf) + FUDGE;
+       do {
+               nexttbtt += intval;
+       } while (nexttbtt < tsftu);
+
        intval |= ATH9K_BEACON_ENA;
        if (priv->op_flags & OP_ENABLE_BEACON)
                imask |= ATH9K_INT_SWBA;
 
-       ath_dbg(common, ATH_DBG_BEACON,
-               "IBSS Beacon config, intval: %d, imask: 0x%x\n",
-               bss_conf->beacon_interval, imask);
+       ath_dbg(common, ATH_DBG_CONFIG,
+               "IBSS Beacon config, intval: %d, nexttbtt: %u, imask: 0x%x\n",
+               bss_conf->beacon_interval, nexttbtt, imask);
 
        WMI_CMD(WMI_DISABLE_INTR_CMDID);
        ath9k_hw_beaconinit(priv->ah, nexttbtt, intval);