diff options
author | Felix Fietkau <nbd@nbd.name> | 2019-02-03 14:41:22 +0100 |
---|---|---|
committer | Felix Fietkau <nbd@nbd.name> | 2019-02-18 19:54:33 +0100 |
commit | ccdaf7b4f22f50dcd1e0af39f3712677195b8351 (patch) | |
tree | 3a5a1722d7f3d5546f0ddd4f4d1c870d58d9b99e /drivers/net/wireless/mediatek/mt76/mt76x02_mac.c | |
parent | c15b7cef2af8ea2dfac61af5f4f2b27aaed8d7e6 (diff) | |
download | linux-stable-ccdaf7b4f22f50dcd1e0af39f3712677195b8351.tar.gz linux-stable-ccdaf7b4f22f50dcd1e0af39f3712677195b8351.tar.bz2 linux-stable-ccdaf7b4f22f50dcd1e0af39f3712677195b8351.zip |
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 <nbd@nbd.name>
Diffstat (limited to 'drivers/net/wireless/mediatek/mt76/mt76x02_mac.c')
-rw-r--r-- | drivers/net/wireless/mediatek/mt76/mt76x02_mac.c | 11 |
1 files changed, 9 insertions, 2 deletions
diff --git a/drivers/net/wireless/mediatek/mt76/mt76x02_mac.c b/drivers/net/wireless/mediatek/mt76/mt76x02_mac.c index aecf514bb89b..462ac030c08a 100644 --- a/drivers/net/wireless/mediatek/mt76/mt76x02_mac.c +++ b/drivers/net/wireless/mediatek/mt76/mt76x02_mac.c @@ -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) { |