From: Greg Kroah-Hartman Date: Thu, 25 Aug 2022 12:02:22 +0000 (+0200) Subject: 5.19-stable patches X-Git-Tag: v5.10.140~45 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=0a0b878169f6f97dcf307800143773d91a1b0746;p=thirdparty%2Fkernel%2Fstable-queue.git 5.19-stable patches added patches: mt76-mt7921-fix-command-timeout-in-ap-stop-period.patch --- 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 index 00000000000..46c334e7903 --- /dev/null +++ b/queue-5.19/mt76-mt7921-fix-command-timeout-in-ap-stop-period.patch @@ -0,0 +1,153 @@ +From 9d958b60ebc2434f2b7eae83d77849e22d1059eb Mon Sep 17 00:00:00 2001 +From: Deren Wu +Date: Wed, 8 Jun 2022 20:53:26 +0800 +Subject: mt76: mt7921: fix command timeout in AP stop period + +From: Deren Wu + +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 +Signed-off-by: Deren Wu +Signed-off-by: Felix Fietkau +Signed-off-by: Greg Kroah-Hartman +--- + 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); diff --git a/queue-5.19/series b/queue-5.19/series index 4d8278a8c7f..40f36282d5e 100644 --- a/queue-5.19/series +++ b/queue-5.19/series @@ -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