mt76: mt76x02: fix beacon timer drift adjustment
authorFelix Fietkau <nbd@nbd.name>
Sun, 24 Feb 2019 10:24:43 +0000 (11:24 +0100)
committerFelix Fietkau <nbd@nbd.name>
Tue, 26 Feb 2019 09:28:18 +0000 (10:28 +0100)
Check the count before incrementing it to match vendor code behavior.
This defers the adjustment by one more tick, which should improve accuracy

Signed-off-by: Felix Fietkau <nbd@nbd.name>
drivers/net/wireless/mediatek/mt76/mt76x02_mmio.c

index 374bc9d91f12f5561c13c44b0f9e31757d8f9d20..f0198eea2bb82b1cfa09dd48a35c4a9d11e10c5e 100644 (file)
@@ -79,24 +79,24 @@ mt76x02_resync_beacon_timer(struct mt76x02_dev *dev)
         * Beacon timer drifts by 1us every tick, the timer is configured
         * in 1/16 TU (64us) units.
         */
-       if (dev->tbtt_count < 62)
+       if (dev->tbtt_count < 63)
                return;
 
-       if (dev->tbtt_count >= 64) {
-               dev->tbtt_count = 0;
-               return;
-       }
-
        /*
         * The updated beacon interval takes effect after two TBTT, because
         * at this point the original interval has already been loaded into
         * the next TBTT_TIMER value
         */
-       if (dev->tbtt_count == 62)
+       if (dev->tbtt_count == 63)
                timer_val -= 1;
 
        mt76_rmw_field(dev, MT_BEACON_TIME_CFG,
                       MT_BEACON_TIME_CFG_INTVAL, timer_val);
+
+       if (dev->tbtt_count >= 64) {
+               dev->tbtt_count = 0;
+               return;
+       }
 }
 
 static void mt76x02_pre_tbtt_tasklet(unsigned long arg)