df43105cb8233828bef396d500b391731c5c580a
[openwrt/staging/yousong.git] / package / kernel / mac80211 / patches / 312-ath9k-Correct-TSF-adjustment-to-align-the-beacon-tim.patch
1 From: Benjamin Berg <benjamin.berg@open-mesh.com>
2 Date: Mon, 4 Jul 2016 14:37:20 +0200
3 Subject: [PATCH] ath9k: Correct TSF adjustment to align the beacon time
4 correctly
5
6 Beacons were not send out at (timestamp % beacon_time == 0) for interfaces
7 other than the primary one. To send out beacons with the correct timestamp
8 according to 10.1.3.2 of the 802.11 standard the tsf_adjustment has to be
9 set to the negative time difference instead of positive. This way the
10 later beacons get corrected to have a lower (and similar) timestamp with
11 regard to the beacon from slot 0.
12
13 I am not aware about any issues that have been caused by this.
14
15 Signed-off-by: Benjamin Berg <benjamin.berg@open-mesh.com>
16 ---
17
18 --- a/drivers/net/wireless/ath/ath9k/beacon.c
19 +++ b/drivers/net/wireless/ath/ath9k/beacon.c
20 @@ -279,17 +279,21 @@ static void ath9k_set_tsfadjust(struct a
21 struct ath_common *common = ath9k_hw_common(sc->sc_ah);
22 struct ath_vif *avp = (void *)vif->drv_priv;
23 struct ath_beacon_config *cur_conf = &avp->chanctx->beacon;
24 - u32 tsfadjust;
25 + s64 tsfadjust;
26
27 if (avp->av_bslot == 0)
28 return;
29
30 + /* tsf_adjust is added to the TSF value. We send out the beacon late,
31 + * so need to adjust the TSF starting point to be later in time (i.e.
32 + * the theoretical first beacon has a TSF of 0 after correction).
33 + */
34 tsfadjust = cur_conf->beacon_interval * avp->av_bslot;
35 - tsfadjust = TU_TO_USEC(tsfadjust) / ATH_BCBUF;
36 + tsfadjust = -TU_TO_USEC(tsfadjust) / ATH_BCBUF;
37 avp->tsf_adjust = cpu_to_le64(tsfadjust);
38
39 - ath_dbg(common, CONFIG, "tsfadjust is: %llu for bslot: %d\n",
40 - (unsigned long long)tsfadjust, avp->av_bslot);
41 + ath_dbg(common, CONFIG, "tsfadjust is: %lld for bslot: %d\n",
42 + (signed long long)tsfadjust, avp->av_bslot);
43 }
44
45 bool ath9k_csa_is_finished(struct ath_softc *sc, struct ieee80211_vif *vif)