]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
5.19-stable patches
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 25 Aug 2022 12:02:22 +0000 (14:02 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 25 Aug 2022 12:02:22 +0000 (14:02 +0200)
added patches:
mt76-mt7921-fix-command-timeout-in-ap-stop-period.patch

queue-5.19/mt76-mt7921-fix-command-timeout-in-ap-stop-period.patch [new file with mode: 0644]
queue-5.19/series

diff --git a/queue-5.19/mt76-mt7921-fix-command-timeout-in-ap-stop-period.patch b/queue-5.19/mt76-mt7921-fix-command-timeout-in-ap-stop-period.patch
new file mode 100644 (file)
index 0000000..46c334e
--- /dev/null
@@ -0,0 +1,153 @@
+From 9d958b60ebc2434f2b7eae83d77849e22d1059eb Mon Sep 17 00:00:00 2001
+From: Deren Wu <deren.wu@mediatek.com>
+Date: Wed, 8 Jun 2022 20:53:26 +0800
+Subject: mt76: mt7921: fix command timeout in AP stop period
+
+From: Deren Wu <deren.wu@mediatek.com>
+
+commit 9d958b60ebc2434f2b7eae83d77849e22d1059eb upstream.
+
+Due to AP stop improperly, mt7921 driver would face random command timeout
+by chip fw problem. Migrate AP start/stop process to .start_ap/.stop_ap and
+congiure BSS network settings in both hooks.
+
+The new flow is shown below.
+* AP start
+    .start_ap()
+      configure BSS network resource
+      set BSS to connected state
+    .bss_info_changed()
+      enable fw beacon offload
+
+* AP stop
+    .bss_info_changed()
+      disable fw beacon offload (skip this command)
+    .stop_ap()
+      set BSS to disconnected state (beacon offload disabled automatically)
+      destroy BSS network resource
+
+Fixes: 116c69603b01 ("mt76: mt7921: Add AP mode support")
+Signed-off-by: Sean Wang <sean.wang@mediatek.com>
+Signed-off-by: Deren Wu <deren.wu@mediatek.com>
+Signed-off-by: Felix Fietkau <nbd@nbd.name>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ drivers/net/wireless/mediatek/mt76/mt76_connac_mcu.c |    2 
+ drivers/net/wireless/mediatek/mt76/mt7921/main.c     |   47 +++++++++++++++----
+ drivers/net/wireless/mediatek/mt76/mt7921/mcu.c      |    5 --
+ drivers/net/wireless/mediatek/mt76/mt7921/mt7921.h   |    2 
+ 4 files changed, 43 insertions(+), 13 deletions(-)
+
+--- a/drivers/net/wireless/mediatek/mt76/mt76_connac_mcu.c
++++ b/drivers/net/wireless/mediatek/mt76/mt76_connac_mcu.c
+@@ -1403,6 +1403,8 @@ int mt76_connac_mcu_uni_add_bss(struct m
+               else
+                       conn_type = CONNECTION_INFRA_AP;
+               basic_req.basic.conn_type = cpu_to_le32(conn_type);
++              /* Fully active/deactivate BSS network in AP mode only */
++              basic_req.basic.active = enable;
+               break;
+       case NL80211_IFTYPE_STATION:
+               if (vif->p2p)
+--- a/drivers/net/wireless/mediatek/mt76/mt7921/main.c
++++ b/drivers/net/wireless/mediatek/mt76/mt7921/main.c
+@@ -653,15 +653,6 @@ static void mt7921_bss_info_changed(stru
+               }
+       }
+-      if (changed & BSS_CHANGED_BEACON_ENABLED && info->enable_beacon) {
+-              struct mt7921_vif *mvif = (struct mt7921_vif *)vif->drv_priv;
+-
+-              mt76_connac_mcu_uni_add_bss(phy->mt76, vif, &mvif->sta.wcid,
+-                                          true);
+-              mt7921_mcu_sta_update(dev, NULL, vif, true,
+-                                    MT76_STA_INFO_STATE_NONE);
+-      }
+-
+       if (changed & (BSS_CHANGED_BEACON |
+                      BSS_CHANGED_BEACON_ENABLED))
+               mt7921_mcu_uni_add_beacon_offload(dev, hw, vif,
+@@ -1500,6 +1491,42 @@ mt7921_channel_switch_beacon(struct ieee
+       mt7921_mutex_release(dev);
+ }
++static int
++mt7921_start_ap(struct ieee80211_hw *hw, struct ieee80211_vif *vif)
++{
++      struct mt7921_vif *mvif = (struct mt7921_vif *)vif->drv_priv;
++      struct mt7921_phy *phy = mt7921_hw_phy(hw);
++      struct mt7921_dev *dev = mt7921_hw_dev(hw);
++      int err;
++
++      err = mt76_connac_mcu_uni_add_bss(phy->mt76, vif, &mvif->sta.wcid,
++                                        true);
++      if (err)
++              return err;
++
++      err = mt7921_mcu_set_bss_pm(dev, vif, true);
++      if (err)
++              return err;
++
++      return mt7921_mcu_sta_update(dev, NULL, vif, true,
++                                   MT76_STA_INFO_STATE_NONE);
++}
++
++static void
++mt7921_stop_ap(struct ieee80211_hw *hw, struct ieee80211_vif *vif)
++{
++      struct mt7921_vif *mvif = (struct mt7921_vif *)vif->drv_priv;
++      struct mt7921_phy *phy = mt7921_hw_phy(hw);
++      struct mt7921_dev *dev = mt7921_hw_dev(hw);
++      int err;
++
++      err = mt7921_mcu_set_bss_pm(dev, vif, false);
++      if (err)
++              return;
++
++      mt76_connac_mcu_uni_add_bss(phy->mt76, vif, &mvif->sta.wcid, false);
++}
++
+ const struct ieee80211_ops mt7921_ops = {
+       .tx = mt7921_tx,
+       .start = mt7921_start,
+@@ -1510,6 +1537,8 @@ const struct ieee80211_ops mt7921_ops =
+       .conf_tx = mt7921_conf_tx,
+       .configure_filter = mt7921_configure_filter,
+       .bss_info_changed = mt7921_bss_info_changed,
++      .start_ap = mt7921_start_ap,
++      .stop_ap = mt7921_stop_ap,
+       .sta_state = mt7921_sta_state,
+       .sta_pre_rcu_remove = mt76_sta_pre_rcu_remove,
+       .set_key = mt7921_set_key,
+--- a/drivers/net/wireless/mediatek/mt76/mt7921/mcu.c
++++ b/drivers/net/wireless/mediatek/mt76/mt7921/mcu.c
+@@ -1020,7 +1020,7 @@ mt7921_mcu_uni_bss_bcnft(struct mt7921_d
+                                &bcnft_req, sizeof(bcnft_req), true);
+ }
+-static int
++int
+ mt7921_mcu_set_bss_pm(struct mt7921_dev *dev, struct ieee80211_vif *vif,
+                     bool enable)
+ {
+@@ -1049,9 +1049,6 @@ mt7921_mcu_set_bss_pm(struct mt7921_dev
+       };
+       int err;
+-      if (vif->type != NL80211_IFTYPE_STATION)
+-              return 0;
+-
+       err = mt76_mcu_send_msg(&dev->mt76, MCU_CE_CMD(SET_BSS_ABORT),
+                               &req_hdr, sizeof(req_hdr), false);
+       if (err < 0 || !enable)
+--- a/drivers/net/wireless/mediatek/mt76/mt7921/mt7921.h
++++ b/drivers/net/wireless/mediatek/mt76/mt7921/mt7921.h
+@@ -280,6 +280,8 @@ int mt7921_wpdma_reset(struct mt7921_dev
+ int mt7921_wpdma_reinit_cond(struct mt7921_dev *dev);
+ void mt7921_dma_cleanup(struct mt7921_dev *dev);
+ int mt7921_run_firmware(struct mt7921_dev *dev);
++int mt7921_mcu_set_bss_pm(struct mt7921_dev *dev, struct ieee80211_vif *vif,
++                        bool enable);
+ int mt7921_mcu_sta_update(struct mt7921_dev *dev, struct ieee80211_sta *sta,
+                         struct ieee80211_vif *vif, bool enable,
+                         enum mt76_sta_info_state state);
index 4d8278a8c7f9930dfb4e53311c99f987a6cfeb0b..40f36282d5e89870fc873cdd1702b20d2c9e1af4 100644 (file)
@@ -8,3 +8,4 @@ kernel-sys_ni-add-compat-entry-for-fadvise64_64.patch
 kprobes-don-t-call-disarm_kprobe-for-disabled-kprobes.patch
 mm-uffd-reset-write-protection-when-unregister-with-wp-mode.patch
 mm-hugetlb-support-write-faults-in-shared-mappings.patch
+mt76-mt7921-fix-command-timeout-in-ap-stop-period.patch