FAILED: patch "[PATCH] iwlwifi: mvm: retry init flow if failed" failed to apply to 5.4-stable tree
Subsystems (2)
[email protected]
maintainerThe patch below does not apply to the 5.4-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From 5283dd677e52af9db6fe6ad11b2f12220d519d0c Mon Sep 17 00:00:00 2001
From: Mordechay Goodstein <[email protected]>
Date: Wed, 10 Nov 2021 15:01:59 +0200
Subject: [PATCH] iwlwifi: mvm: retry init flow if failed
In some very rare cases the init flow may fail. In many cases, this is recoverable, so we can retry. Implement a loop to retry two more times after the first attempt failed.
This can happen in two different situations, namely during probe and during mac80211 start. For the first case, a simple loop is enough. For the second case, we need to add a flag to prevent mac80211 from trying to restart it as well, leaving full control with the driver.
drivers/net/wireless/intel/iwlwifi/iwl-drv.c +15 -7
@@ -1313,23 +1313,31 @@ _iwl_op_mode_start(struct iwl_drv *drv, struct iwlwifi_opmode_table *op)const struct iwl_op_mode_ops *ops = op->ops;struct dentry *dbgfs_dir =NULL ;struct iwl_op_mode *op_mode =NULL ; +int retry, max_retry = !!iwlwifi_mod_params.fw_restart *IWL_MAX_INIT_RETRY ; + +for (retry =0 ; retry <= max_retry; retry++) {#ifdef CONFIG_IWLWIFI_DEBUGFS - drv->dbgfs_op_mode =debugfs_create_dir (op->name, - drv->dbgfs_drv); - dbgfs_dir = drv->dbgfs_op_mode; + drv->dbgfs_op_mode =debugfs_create_dir (op->name, + drv->dbgfs_drv); + dbgfs_dir = drv->dbgfs_op_mode;#endif - op_mode = ops->start (drv->trans, drv->trans->cfg, &drv->fw, dbgfs_dir); + op_mode = ops->start (drv->trans, drv->trans->cfg, + &drv->fw, dbgfs_dir); + +if (op_mode) +return op_mode; + +IWL_ERR (drv,"retry init count %d\n" , retry);#ifdef CONFIG_IWLWIFI_DEBUGFS -if (!op_mode) {debugfs_remove_recursive (drv->dbgfs_op_mode); drv->dbgfs_op_mode =NULL ; - }#endif + } -return op_mode; +return NULL ; }static void _iwl_op_mode_stop (struct iwl_drv *drv)
drivers/net/wireless/intel/iwlwifi/iwl-drv.h +3 -0
@@ -89,4 +89,7 @@ void iwl_drv_stop(struct iwl_drv *drv);#define IWL_EXPORT_SYMBOL (sym)#endif +/* max retry for init flow */ +#define IWL_MAX_INIT_RETRY 2 +#endif /* __iwl_drv_h__ */
drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c +23 -1
@@ -16,6 +16,7 @@#include <net/ieee80211_radiotap.h> #include <net/tcp.h> +#include "iwl-drv.h" #include "iwl-op-mode.h" #include "iwl-io.h" #include "mvm.h"
@@ -1117,9 +1118,30 @@ static int iwl_mvm_mac_start(struct ieee80211_hw *hw) {struct iwl_mvm *mvm =IWL_MAC80211_GET_MVM (hw);int ret; +int retry, max_retry =0 ;mutex_lock (&mvm->mutex); - ret =__iwl_mvm_mac_start (mvm); + +/* we are starting the mac not in error flow, and restart is enabled */ +if (!test_bit (IWL_MVM_STATUS_HW_RESTART_REQUESTED , &mvm->status) && + iwlwifi_mod_params.fw_restart) { + max_retry =IWL_MAX_INIT_RETRY ; +/* +* This will prevent mac80211 recovery flows to trigger during +* init failures +*/ +set_bit (IWL_MVM_STATUS_STARTING , &mvm->status); + } + +for (retry =0 ; retry <= max_retry; retry++) { + ret =__iwl_mvm_mac_start (mvm); +if (!ret) +break ; + +IWL_ERR (mvm,"mac start retry %d\n" , retry); + } +clear_bit (IWL_MVM_STATUS_STARTING , &mvm->status); +mutex_unlock (&mvm->mutex);return ret;
drivers/net/wireless/intel/iwlwifi/mvm/mvm.h +3 -0
@@ -1123,6 +1123,8 @@ struct iwl_mvm {* @IWL_MVM_STATUS_FIRMWARE_RUNNING: firmware is running * @IWL_MVM_STATUS_NEED_FLUSH_P2P: need to flush P2P bcast STA * @IWL_MVM_STATUS_IN_D3: in D3 (or at least about to go into it) +* @IWL_MVM_STATUS_STARTING: starting mac, +* used to disable restart flow while in STARTING state */ enum iwl_mvm_status {IWL_MVM_STATUS_HW_RFKILL ,
@@ -1134,6 +1136,7 @@ enum iwl_mvm_status {IWL_MVM_STATUS_FIRMWARE_RUNNING ,IWL_MVM_STATUS_NEED_FLUSH_P2P ,IWL_MVM_STATUS_IN_D3 , + IWL_MVM_STATUS_STARTING, };/* Keep track of completed init configuration */
drivers/net/wireless/intel/iwlwifi/mvm/ops.c +3 -0
@@ -1600,6 +1600,9 @@ void iwl_mvm_nic_restart(struct iwl_mvm *mvm, bool fw_error)*/ if (!mvm->fw_restart && fw_error) {iwl_fw_error_collect (&mvm->fwrt, false); + }else if (test_bit (IWL_MVM_STATUS_STARTING , + &mvm->status)) { +IWL_ERR (mvm,"Starting mac, retry will be triggered anyway\n" ); }else if (test_bit (IWL_MVM_STATUS_IN_HW_RESTART , &mvm->status)) {struct iwl_mvm_reprobe *reprobe;
PATCH 1/1 iwlwifi: mvm: retry init flow if failed
From: Mordechay Goodstein <[email protected]>
commit 5283dd677e52af9db6fe6ad11b2f12220d519d0c upstream.
In some very rare cases the init flow may fail. In many cases, this is recoverable, so we can retry. Implement a loop to retry two more times after the first attempt failed.
This can happen in two different situations, namely during probe and during mac80211 start. For the first case, a simple loop is enough. For the second case, we need to add a flag to prevent mac80211 from trying to restart it as well, leaving full control with the driver.
--- drivers/net/wireless/intel/iwlwifi/iwl-drv.c | 22 +++++++++++------ drivers/net/wireless/intel/iwlwifi/iwl-drv.h | 3 +++ .../net/wireless/intel/iwlwifi/mvm/mac80211.c | 24 ++++++++++++++++++- drivers/net/wireless/intel/iwlwifi/mvm/mvm.h | 3 +++ drivers/net/wireless/intel/iwlwifi/mvm/ops.c | 3 +++ 5 files changed, 47 insertions(+), 8 deletions(-)
drivers/net/wireless/intel/iwlwifi/iwl-drv.c +15 -7
@@ -1303,23 +1303,31 @@ _iwl_op_mode_start(struct iwl_drv *drv, struct iwlwifi_opmode_table *op)const struct iwl_op_mode_ops *ops = op->ops;struct dentry *dbgfs_dir =NULL ;struct iwl_op_mode *op_mode =NULL ; +int retry, max_retry = !!iwlwifi_mod_params.fw_restart *IWL_MAX_INIT_RETRY ; + +for (retry =0 ; retry <= max_retry; retry++) {#ifdef CONFIG_IWLWIFI_DEBUGFS - drv->dbgfs_op_mode =debugfs_create_dir (op->name, - drv->dbgfs_drv); - dbgfs_dir = drv->dbgfs_op_mode; + drv->dbgfs_op_mode =debugfs_create_dir (op->name, + drv->dbgfs_drv); + dbgfs_dir = drv->dbgfs_op_mode;#endif - op_mode = ops->start (drv->trans, drv->trans->cfg, &drv->fw, dbgfs_dir); + op_mode = ops->start (drv->trans, drv->trans->cfg, + &drv->fw, dbgfs_dir); + +if (op_mode) +return op_mode; + +IWL_ERR (drv,"retry init count %d\n" , retry);#ifdef CONFIG_IWLWIFI_DEBUGFS -if (!op_mode) {debugfs_remove_recursive (drv->dbgfs_op_mode); drv->dbgfs_op_mode =NULL ; - }#endif + } -return op_mode; +return NULL ; }static void _iwl_op_mode_stop (struct iwl_drv *drv)
drivers/net/wireless/intel/iwlwifi/iwl-drv.h +3 -0
@@ -144,4 +144,7 @@ void iwl_drv_stop(struct iwl_drv *drv);#define IWL_EXPORT_SYMBOL (sym)#endif +/* max retry for init flow */ +#define IWL_MAX_INIT_RETRY 2 +#endif /* __iwl_drv_h__ */
drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c +23 -1
@@ -71,6 +71,7 @@#include <net/ieee80211_radiotap.h> #include <net/tcp.h> +#include "iwl-drv.h" #include "iwl-op-mode.h" #include "iwl-io.h" #include "mvm.h"
@@ -1163,9 +1164,30 @@ static int iwl_mvm_mac_start(struct ieee80211_hw *hw) {struct iwl_mvm *mvm =IWL_MAC80211_GET_MVM (hw);int ret; +int retry, max_retry =0 ;mutex_lock (&mvm->mutex); - ret =__iwl_mvm_mac_start (mvm); + +/* we are starting the mac not in error flow, and restart is enabled */ +if (!test_bit (IWL_MVM_STATUS_HW_RESTART_REQUESTED , &mvm->status) && + iwlwifi_mod_params.fw_restart) { + max_retry =IWL_MAX_INIT_RETRY ; +/* +* This will prevent mac80211 recovery flows to trigger during +* init failures +*/ +set_bit (IWL_MVM_STATUS_STARTING , &mvm->status); + } + +for (retry =0 ; retry <= max_retry; retry++) { + ret =__iwl_mvm_mac_start (mvm); +if (!ret) +break ; + +IWL_ERR (mvm,"mac start retry %d\n" , retry); + } +clear_bit (IWL_MVM_STATUS_STARTING , &mvm->status); +mutex_unlock (&mvm->mutex);return ret;
drivers/net/wireless/intel/iwlwifi/mvm/mvm.h +3 -0
@@ -1162,6 +1162,8 @@ struct iwl_mvm {* @IWL_MVM_STATUS_FIRMWARE_RUNNING: firmware is running * @IWL_MVM_STATUS_NEED_FLUSH_P2P: need to flush P2P bcast STA * @IWL_MVM_STATUS_IN_D3: in D3 (or at least about to go into it) +* @IWL_MVM_STATUS_STARTING: starting mac, +* used to disable restart flow while in STARTING state */ enum iwl_mvm_status {IWL_MVM_STATUS_HW_RFKILL ,
@@ -1173,6 +1175,7 @@ enum iwl_mvm_status {IWL_MVM_STATUS_FIRMWARE_RUNNING ,IWL_MVM_STATUS_NEED_FLUSH_P2P ,IWL_MVM_STATUS_IN_D3 , + IWL_MVM_STATUS_STARTING, };/* Keep track of completed init configuration */
drivers/net/wireless/intel/iwlwifi/mvm/ops.c +3 -0
@@ -1295,6 +1295,9 @@ void iwl_mvm_nic_restart(struct iwl_mvm *mvm, bool fw_error)*/ if (!mvm->fw_restart && fw_error) {iwl_fw_error_collect (&mvm->fwrt); + }else if (test_bit (IWL_MVM_STATUS_STARTING , + &mvm->status)) { +IWL_ERR (mvm,"Starting mac, retry will be triggered anyway\n" ); }else if (test_bit (IWL_MVM_STATUS_IN_HW_RESTART , &mvm->status)) {struct iwl_mvm_reprobe *reprobe;
Signature · 1 line
2.33.1
Greg KH
maintainerRe: [PATCH 5.10] iwlwifi: mvm: retry init flow if failed
Quoted 18 lines · Luca Coelho
From: Mordechay Goodstein <[email protected]>
commit
5283dd677e52af9db6fe6ad11b2f12220d519d0cupstream.In some very rare cases the init flow may fail. In many cases, this is recoverable, so we can retry. Implement a loop to retry two more times after the first attempt failed.
This can happen in two different situations, namely during probe and during mac80211 start. For the first case, a simple loop is enough. For the second case, we need to add a flag to prevent mac80211 from trying to restart it as well, leaving full control with the driver.
Quoted 7 lines
--- drivers/net/wireless/intel/iwlwifi/iwl-drv.c | 22 +++++++++++------ drivers/net/wireless/intel/iwlwifi/iwl-drv.h | 3 +++ .../net/wireless/intel/iwlwifi/mvm/mac80211.c | 24 ++++++++++++++++++- drivers/net/wireless/intel/iwlwifi/mvm/mvm.h | 3 +++ drivers/net/wireless/intel/iwlwifi/mvm/ops.c | 3 +++ 5 files changed, 47 insertions(+), 8 deletions(-)
Both backports now queued up, thanks.
greg k-h
PATCH 1/1 iwlwifi: mvm: retry init flow if failed
In reply to [email protected]From: Mordechay Goodstein <[email protected]>
commit 5283dd677e52af9db6fe6ad11b2f12220d519d0c upstream.
In some very rare cases the init flow may fail. In many cases, this is recoverable, so we can retry. Implement a loop to retry two more times after the first attempt failed.
This can happen in two different situations, namely during probe and during mac80211 start. For the first case, a simple loop is enough. For the second case, we need to add a flag to prevent mac80211 from trying to restart it as well, leaving full control with the driver.
--- drivers/net/wireless/intel/iwlwifi/iwl-drv.c | 22 +++++++++++------ drivers/net/wireless/intel/iwlwifi/iwl-drv.h | 3 +++ .../net/wireless/intel/iwlwifi/mvm/mac80211.c | 24 ++++++++++++++++++- drivers/net/wireless/intel/iwlwifi/mvm/mvm.h | 3 +++ drivers/net/wireless/intel/iwlwifi/mvm/ops.c | 3 +++ 5 files changed, 47 insertions(+), 8 deletions(-)
drivers/net/wireless/intel/iwlwifi/iwl-drv.c +15 -7
@@ -1276,23 +1276,31 @@ _iwl_op_mode_start(struct iwl_drv *drv, struct iwlwifi_opmode_table *op)const struct iwl_op_mode_ops *ops = op->ops;struct dentry *dbgfs_dir =NULL ;struct iwl_op_mode *op_mode =NULL ; +int retry, max_retry = !!iwlwifi_mod_params.fw_restart *IWL_MAX_INIT_RETRY ; + +for (retry =0 ; retry <= max_retry; retry++) {#ifdef CONFIG_IWLWIFI_DEBUGFS - drv->dbgfs_op_mode =debugfs_create_dir (op->name, - drv->dbgfs_drv); - dbgfs_dir = drv->dbgfs_op_mode; + drv->dbgfs_op_mode =debugfs_create_dir (op->name, + drv->dbgfs_drv); + dbgfs_dir = drv->dbgfs_op_mode;#endif - op_mode = ops->start (drv->trans, drv->trans->cfg, &drv->fw, dbgfs_dir); + op_mode = ops->start (drv->trans, drv->trans->cfg, + &drv->fw, dbgfs_dir); + +if (op_mode) +return op_mode; + +IWL_ERR (drv,"retry init count %d\n" , retry);#ifdef CONFIG_IWLWIFI_DEBUGFS -if (!op_mode) {debugfs_remove_recursive (drv->dbgfs_op_mode); drv->dbgfs_op_mode =NULL ; - }#endif + } -return op_mode; +return NULL ; }static void _iwl_op_mode_stop (struct iwl_drv *drv)
drivers/net/wireless/intel/iwlwifi/iwl-drv.h +3 -0
@@ -145,4 +145,7 @@ void iwl_drv_stop(struct iwl_drv *drv);#define IWL_EXPORT_SYMBOL (sym)#endif +/* max retry for init flow */ +#define IWL_MAX_INIT_RETRY 2 +#endif /* __iwl_drv_h__ */
drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c +23 -1
@@ -71,6 +71,7 @@#include <net/ieee80211_radiotap.h> #include <net/tcp.h> +#include "iwl-drv.h" #include "iwl-op-mode.h" #include "iwl-io.h" #include "mvm.h"
@@ -1129,9 +1130,30 @@ static int iwl_mvm_mac_start(struct ieee80211_hw *hw) {struct iwl_mvm *mvm =IWL_MAC80211_GET_MVM (hw);int ret; +int retry, max_retry =0 ;mutex_lock (&mvm->mutex); - ret =__iwl_mvm_mac_start (mvm); + +/* we are starting the mac not in error flow, and restart is enabled */ +if (!test_bit (IWL_MVM_STATUS_HW_RESTART_REQUESTED , &mvm->status) && + iwlwifi_mod_params.fw_restart) { + max_retry =IWL_MAX_INIT_RETRY ; +/* +* This will prevent mac80211 recovery flows to trigger during +* init failures +*/ +set_bit (IWL_MVM_STATUS_STARTING , &mvm->status); + } + +for (retry =0 ; retry <= max_retry; retry++) { + ret =__iwl_mvm_mac_start (mvm); +if (!ret) +break ; + +IWL_ERR (mvm,"mac start retry %d\n" , retry); + } +clear_bit (IWL_MVM_STATUS_STARTING , &mvm->status); +mutex_unlock (&mvm->mutex);return ret;
drivers/net/wireless/intel/iwlwifi/mvm/mvm.h +3 -0
@@ -1167,6 +1167,8 @@ struct iwl_mvm {* @IWL_MVM_STATUS_ROC_AUX_RUNNING: AUX remain-on-channel is running * @IWL_MVM_STATUS_FIRMWARE_RUNNING: firmware is running * @IWL_MVM_STATUS_NEED_FLUSH_P2P: need to flush P2P bcast STA +* @IWL_MVM_STATUS_STARTING: starting mac, +* used to disable restart flow while in STARTING state */ enum iwl_mvm_status {IWL_MVM_STATUS_HW_RFKILL ,
@@ -1177,6 +1179,7 @@ enum iwl_mvm_status {IWL_MVM_STATUS_ROC_AUX_RUNNING ,IWL_MVM_STATUS_FIRMWARE_RUNNING ,IWL_MVM_STATUS_NEED_FLUSH_P2P , + IWL_MVM_STATUS_STARTING, };/* Keep track of completed init configuration */
drivers/net/wireless/intel/iwlwifi/mvm/ops.c +3 -0
@@ -1288,6 +1288,9 @@ void iwl_mvm_nic_restart(struct iwl_mvm *mvm, bool fw_error)*/ if (!mvm->fw_restart && fw_error) {iwl_fw_error_collect (&mvm->fwrt); + }else if (test_bit (IWL_MVM_STATUS_STARTING , + &mvm->status)) { +IWL_ERR (mvm,"Starting mac, retry will be triggered anyway\n" ); }else if (test_bit (IWL_MVM_STATUS_IN_HW_RESTART , &mvm->status)) {struct iwl_mvm_reprobe *reprobe;
Signature · 1 line
2.33.1