From e301f2349a191c845b6bd2d487e64591ac2ed64d Mon Sep 17 00:00:00 2001 From: Felix Fietkau Date: Sun, 3 Feb 2019 14:41:22 +0100 Subject: [PATCH] mt76: measure the time between mt76x02_edcca_check runs 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 --- mt76x02.h | 1 + mt76x02_mac.c | 11 +++++++++-- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/mt76x02.h b/mt76x02.h index 7e405297..3464b4ca 100644 --- a/mt76x02.h +++ b/mt76x02.h @@ -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]; diff --git a/mt76x02_mac.c b/mt76x02_mac.c index 8da7b8c5..68df3ed6 100644 --- a/mt76x02_mac.c +++ b/mt76x02_mac.c @@ -923,6 +923,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); @@ -930,10 +931,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) {