From: Johannes Berg <johannes.b...@intel.com>

[ Upstream commit b2ed841ed070ccbe908016537f429a3a8f0221bf ]

Start tracking not just if the firmware is dead or alive,
but also if it's starting.

Signed-off-by: Johannes Berg <johannes.b...@intel.com>
Signed-off-by: Luca Coelho <luciano.coe...@intel.com>
Link: 
https://lore.kernel.org/r/iwlwifi.20201209231352.33e50d40b688.I8bbd41af7aa5e769273a6fc1c06fbf548dd2eb26@changeid
Signed-off-by: Luca Coelho <luciano.coe...@intel.com>
Signed-off-by: Sasha Levin <sas...@kernel.org>
---
 drivers/net/wireless/intel/iwlwifi/iwl-trans.h | 18 +++++++++++++-----
 1 file changed, 13 insertions(+), 5 deletions(-)

diff --git a/drivers/net/wireless/intel/iwlwifi/iwl-trans.h 
b/drivers/net/wireless/intel/iwlwifi/iwl-trans.h
index b31bb56ca6591..cb67b9a4ab088 100644
--- a/drivers/net/wireless/intel/iwlwifi/iwl-trans.h
+++ b/drivers/net/wireless/intel/iwlwifi/iwl-trans.h
@@ -615,12 +615,14 @@ struct iwl_trans_ops {
 /**
  * enum iwl_trans_state - state of the transport layer
  *
- * @IWL_TRANS_NO_FW: no fw has sent an alive response
- * @IWL_TRANS_FW_ALIVE: a fw has sent an alive response
+ * @IWL_TRANS_NO_FW: firmware wasn't started yet, or crashed
+ * @IWL_TRANS_FW_STARTED: FW was started, but not alive yet
+ * @IWL_TRANS_FW_ALIVE: FW has sent an alive response
  */
 enum iwl_trans_state {
-       IWL_TRANS_NO_FW = 0,
-       IWL_TRANS_FW_ALIVE      = 1,
+       IWL_TRANS_NO_FW,
+       IWL_TRANS_FW_STARTED,
+       IWL_TRANS_FW_ALIVE,
 };
 
 /**
@@ -873,12 +875,18 @@ static inline int iwl_trans_start_fw(struct iwl_trans 
*trans,
                                     const struct fw_img *fw,
                                     bool run_in_rfkill)
 {
+       int ret;
+
        might_sleep();
 
        WARN_ON_ONCE(!trans->rx_mpdu_cmd);
 
        clear_bit(STATUS_FW_ERROR, &trans->status);
-       return trans->ops->start_fw(trans, fw, run_in_rfkill);
+       ret = trans->ops->start_fw(trans, fw, run_in_rfkill);
+       if (ret == 0)
+               trans->state = IWL_TRANS_FW_STARTED;
+
+       return ret;
 }
 
 static inline void iwl_trans_stop_device(struct iwl_trans *trans)
-- 
2.27.0

Reply via email to