blob: 6bcf893dbdfb9909126eb2d2dd5b9a8b11b9795d [file] [log] [blame]
developer9237f442024-06-14 17:13:04 +08001From d2d45d00e7644e62f366203a17924f0e2025853a Mon Sep 17 00:00:00 2001
developer66e89bc2024-04-23 14:50:01 +08002From: "fancy.liu" <fancy.liu@mediatek.com>
3Date: Tue, 14 Nov 2023 10:13:24 +0800
developer9237f442024-06-14 17:13:04 +08004Subject: [PATCH 014/116] mtk: wifi: mt76: mt7996: ACS channel time too long on
developer66e89bc2024-04-23 14:50:01 +08005 duty channel
6
7Step and issue:
81. Set channel to 36 in hostapd config;
92. Bootup;
103. Enable ACS through UCI command and reload;
114. Check hostapd log, channel 36 channel_time is much longer than other channels.
12
13Root cause:
14The reset chan_stat condition missed duty channel.
15
16Solution:
17When scan start, need to reset chan_stat in each channel switch.
18
developer66e89bc2024-04-23 14:50:01 +080019Signed-off-by: fancy.liu <fancy.liu@mediatek.com>
20
21Issue:
22There's a chance that the channel time for duty channel is zero in ACS
23scan.
24
25Root cause:
26The chan_stat may be reset when restore to duty channel.
27Mac80211 will notify to hostapd when scan done and then restore to duty
28channel.
29And mt76 will clear scan flag after restore done.
30If hostapd get the chan_stat before channel_restore, will get the
31correct channel time;
32If hostapd get the chan_stat after channel_restore, will get zero
33channel time;
34
35Solution:
36When channel switch, will check the mac80211 scan state but not the mt76 scan flag.
37Mac80211 scan state will be set in scanning, and will be reset after
38scan done and before restore to duty channel.
39
developer66e89bc2024-04-23 14:50:01 +080040Signed-off-by: fancy.liu <fancy.liu@mediatek.com>
41---
42 mac80211.c | 3 ++-
43 1 file changed, 2 insertions(+), 1 deletion(-)
44
45diff --git a/mac80211.c b/mac80211.c
developer9237f442024-06-14 17:13:04 +080046index e4675bf..d291caa 100644
developer66e89bc2024-04-23 14:50:01 +080047--- a/mac80211.c
48+++ b/mac80211.c
developer9237f442024-06-14 17:13:04 +080049@@ -928,6 +928,7 @@ void mt76_set_channel(struct mt76_phy *phy)
developer66e89bc2024-04-23 14:50:01 +080050 struct cfg80211_chan_def *chandef = &hw->conf.chandef;
51 bool offchannel = hw->conf.flags & IEEE80211_CONF_OFFCHANNEL;
52 int timeout = HZ / 5;
53+ unsigned long was_scanning = ieee80211_get_scanning(hw);
54
55 wait_event_timeout(dev->tx_wait, !mt76_has_tx_pending(phy), timeout);
56 mt76_update_survey(phy);
developer9237f442024-06-14 17:13:04 +080057@@ -942,7 +943,7 @@ void mt76_set_channel(struct mt76_phy *phy)
developer66e89bc2024-04-23 14:50:01 +080058 if (!offchannel)
59 phy->main_chan = chandef->chan;
60
61- if (chandef->chan != phy->main_chan)
62+ if (chandef->chan != phy->main_chan || was_scanning)
63 memset(phy->chan_state, 0, sizeof(*phy->chan_state));
64 }
65 EXPORT_SYMBOL_GPL(mt76_set_channel);
66--
developer9237f442024-06-14 17:13:04 +0800672.18.0
developer66e89bc2024-04-23 14:50:01 +080068