That's exactly what I was seeing, the plinks will not get established.
In addition the opmode patch I had to revert changes made for the beacon config, I guess the beacon timers were not initialized properly. I modified beacon.c:

@@ -628,20 +628,25 @@
 {
     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",

and hw.c:


@@ -1734,35 +1734,41 @@

     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;
-    }
-
-    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);
+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,
+              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, 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);

Hope this helps.

--Fabrice



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

Reply via email to