| From 615fa2bf42b12776d01445f009f766d3c35dabf7 Mon Sep 17 00:00:00 2001 |
| From: "fancy.liu" <fancy.liu@mediatek.com> |
| Date: Tue, 14 Nov 2023 10:13:24 +0800 |
| Subject: [PATCH 015/116] mtk: wifi: mt76: mt7996: ACS channel time too long on |
| duty channel |
| |
| Step and issue: |
| 1. Set channel to 36 in hostapd config; |
| 2. Bootup; |
| 3. Enable ACS through UCI command and reload; |
| 4. Check hostapd log, channel 36 channel_time is much longer than other channels. |
| |
| Root cause: |
| The reset chan_stat condition missed duty channel. |
| |
| Solution: |
| When scan start, need to reset chan_stat in each channel switch. |
| |
| CR-Id: WCNCR00351054 |
| Signed-off-by: fancy.liu <fancy.liu@mediatek.com> |
| |
| Issue: |
| There's a chance that the channel time for duty channel is zero in ACS |
| scan. |
| |
| Root cause: |
| The chan_stat may be reset when restore to duty channel. |
| Mac80211 will notify to hostapd when scan done and then restore to duty |
| channel. |
| And mt76 will clear scan flag after restore done. |
| If hostapd get the chan_stat before channel_restore, will get the |
| correct channel time; |
| If hostapd get the chan_stat after channel_restore, will get zero |
| channel time; |
| |
| Solution: |
| When channel switch, will check the mac80211 scan state but not the mt76 scan flag. |
| Mac80211 scan state will be set in scanning, and will be reset after |
| scan done and before restore to duty channel. |
| |
| CR-Id: WCNCR00357653 |
| Signed-off-by: fancy.liu <fancy.liu@mediatek.com> |
| --- |
| mac80211.c | 3 ++- |
| 1 file changed, 2 insertions(+), 1 deletion(-) |
| |
| diff --git a/mac80211.c b/mac80211.c |
| index 64307b967..993e155b9 100644 |
| --- a/mac80211.c |
| +++ b/mac80211.c |
| @@ -927,6 +927,7 @@ void mt76_set_channel(struct mt76_phy *phy) |
| struct cfg80211_chan_def *chandef = &hw->conf.chandef; |
| bool offchannel = hw->conf.flags & IEEE80211_CONF_OFFCHANNEL; |
| int timeout = HZ / 5; |
| + unsigned long was_scanning = ieee80211_get_scanning(hw); |
| |
| wait_event_timeout(dev->tx_wait, !mt76_has_tx_pending(phy), timeout); |
| mt76_update_survey(phy); |
| @@ -941,7 +942,7 @@ void mt76_set_channel(struct mt76_phy *phy) |
| if (!offchannel) |
| phy->main_chan = chandef->chan; |
| |
| - if (chandef->chan != phy->main_chan) |
| + if (chandef->chan != phy->main_chan || was_scanning) |
| memset(phy->chan_state, 0, sizeof(*phy->chan_state)); |
| } |
| EXPORT_SYMBOL_GPL(mt76_set_channel); |
| -- |
| 2.39.2 |
| |