Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ccdaf7b4 authored by Felix Fietkau's avatar Felix Fietkau
Browse files

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: default avatarFelix Fietkau <nbd@nbd.name>
parent c15b7cef
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -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];
+9 −2
Original line number Diff line number Diff line
@@ -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) {