summaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/mediatek/mt76/mt76x02_mac.c
diff options
context:
space:
mode:
authorFelix Fietkau2019-02-03 14:41:22 +0100
committerFelix Fietkau2019-02-18 19:54:33 +0100
commitccdaf7b4f22f50dcd1e0af39f3712677195b8351 (patch)
tree3a5a1722d7f3d5546f0ddd4f4d1c870d58d9b99e /drivers/net/wireless/mediatek/mt76/mt76x02_mac.c
parentmt76: clear CCA timer stats in mt76x02_edcca_init (diff)
downloadkernel-qcow2-linux-ccdaf7b4f22f50dcd1e0af39f3712677195b8351.tar.gz
kernel-qcow2-linux-ccdaf7b4f22f50dcd1e0af39f3712677195b8351.tar.xz
kernel-qcow2-linux-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.c11
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) {