mt76: measure the time between mt76x02_edcca_check runs
authorFelix Fietkau <nbd@nbd.name>
Sun, 3 Feb 2019 13:41:22 +0000 (14:41 +0100)
committerFelix Fietkau <nbd@nbd.name>
Mon, 18 Feb 2019 18:54:33 +0000 (19:54 +0100)
Based on system load and time needed by other calibration runs, the time
between dev->mac_work runs can vary quite a bit.
Calculate busy time based on the actual time difference in order to avoid
potentially over-estimating busy time, which could lead to unnecessary tx
blocking.

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

index 7e40529..3464b4c 100644 (file)
@@ -117,6 +117,7 @@ struct mt76x02_dev {
        bool ed_monitor;
        u8 ed_trigger;
        u8 ed_silent;
+       ktime_t ed_time;
 };
 
 extern struct ieee80211_rate mt76x02_rates[12];
index aecf514..462ac03 100644 (file)
@@ -922,6 +922,7 @@ void mt76x02_edcca_init(struct mt76x02_dev *dev, bool enable)
 
        /* clear previous CCA timer value */
        mt76_rr(dev, MT_ED_CCA_TIMER);
+       dev->ed_time = ktime_get_boottime();
 }
 EXPORT_SYMBOL_GPL(mt76x02_edcca_init);
 
@@ -929,10 +930,16 @@ EXPORT_SYMBOL_GPL(mt76x02_edcca_init);
 #define MT_EDCCA_BLOCK_TH      2
 static void mt76x02_edcca_check(struct mt76x02_dev *dev)
 {
-       u32 val, busy;
+       ktime_t cur_time;
+       u32 active, val, busy;
 
+       cur_time = ktime_get_boottime();
        val = mt76_rr(dev, MT_ED_CCA_TIMER);
-       busy = (val * 100) / jiffies_to_usecs(MT_MAC_WORK_INTERVAL);
+
+       active = ktime_to_us(ktime_sub(cur_time, dev->ed_time));
+       dev->ed_time = cur_time;
+
+       busy = (val * 100) / active;
        busy = min_t(u32, busy, 100);
 
        if (busy > MT_EDCCA_TH) {