iwlwifi: mvm: optionally suppress assert log
authorJohannes Berg <johannes.berg@intel.com>
Sat, 4 Dec 2021 15:49:44 +0000 (17:49 +0200)
committerLuca Coelho <luciano.coelho@intel.com>
Tue, 7 Dec 2021 18:06:51 +0000 (20:06 +0200)
Normally, when we hit an assert, we print out all the
assert data. However, in certain tests, when we trigger
it from debugfs intentionally, that can be useless and
confusing.

Allow writing the string "nolog\n" to the fw_nmi and
fw_restart files suppressing the assert dump as well
as - in the case of fw_restart - the

  iwlwifi 0000:00:00.0: FW error in SYNC CMD REPLY_ERROR

message.

Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Signed-off-by: Luca Coelho <luciano.coelho@intel.com>
Link: https://lore.kernel.org/r/iwlwifi.20211204174546.75e29a2ab68d.Id3064feda2ce7a77c116c6d6e71ce5ff447c6e86@changeid
Signed-off-by: Luca Coelho <luciano.coelho@intel.com>
drivers/net/wireless/intel/iwlwifi/iwl-trans.h
drivers/net/wireless/intel/iwlwifi/mvm/debugfs.c
drivers/net/wireless/intel/iwlwifi/mvm/mvm.h
drivers/net/wireless/intel/iwlwifi/mvm/ops.c
drivers/net/wireless/intel/iwlwifi/queue/tx.c

index 9dea8f9bbcae622a3d3beeee024742bb05a314a6..e7c6e7bc52779282f5be896ba3e4f545cbfce0fa 100644 (file)
@@ -296,6 +296,8 @@ enum iwl_d3_status {
  *     are sent
  * @STATUS_TRANS_IDLE: the trans is idle - general commands are not to be sent
  * @STATUS_TRANS_DEAD: trans is dead - avoid any read/write operation
+ * @STATUS_SUPPRESS_CMD_ERROR_ONCE: suppress "FW error in SYNC CMD" once,
+ *     e.g. for testing
  */
 enum iwl_trans_status {
        STATUS_SYNC_HCMD_ACTIVE,
@@ -308,6 +310,7 @@ enum iwl_trans_status {
        STATUS_TRANS_GOING_IDLE,
        STATUS_TRANS_IDLE,
        STATUS_TRANS_DEAD,
+       STATUS_SUPPRESS_CMD_ERROR_ONCE,
 };
 
 static inline int
index ff66001d507ef659f9c8e55fceeac2fccf0aa0df..f1e9d2c99051ec93a6e1d5ffd70b2a0f6b71bd4b 100644 (file)
@@ -1022,6 +1022,11 @@ static ssize_t iwl_dbgfs_fw_restart_write(struct iwl_mvm *mvm, char *buf,
        if (mvm->fw_restart >= 0)
                mvm->fw_restart++;
 
+       if (count == 6 && !strcmp(buf, "nolog\n")) {
+               set_bit(IWL_MVM_STATUS_SUPPRESS_ERROR_LOG_ONCE, &mvm->status);
+               set_bit(STATUS_SUPPRESS_CMD_ERROR_ONCE, &mvm->trans->status);
+       }
+
        /* take the return value to make compiler happy - it will fail anyway */
        ret = iwl_mvm_send_cmd_pdu(mvm,
                                   WIDE_ID(LONG_GROUP, REPLY_ERROR),
@@ -1038,6 +1043,9 @@ static ssize_t iwl_dbgfs_fw_nmi_write(struct iwl_mvm *mvm, char *buf,
        if (!iwl_mvm_firmware_running(mvm))
                return -EIO;
 
+       if (count == 6 && !strcmp(buf, "nolog\n"))
+               set_bit(IWL_MVM_STATUS_SUPPRESS_ERROR_LOG_ONCE, &mvm->status);
+
        iwl_force_nmi(mvm->trans);
 
        return count;
index f7ff7f2e3928353c170e4767b0ead88f18e25abf..92d6e3dbbb62e6f5530b221786c4e59e50b0e501 100644 (file)
@@ -1137,6 +1137,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_SUPPRESS_ERROR_LOG_ONCE: suppress one error log
+ *     if this is set, when intentionally triggered
  */
 enum iwl_mvm_status {
        IWL_MVM_STATUS_HW_RFKILL,
@@ -1148,6 +1150,7 @@ enum iwl_mvm_status {
        IWL_MVM_STATUS_FIRMWARE_RUNNING,
        IWL_MVM_STATUS_NEED_FLUSH_P2P,
        IWL_MVM_STATUS_IN_D3,
+       IWL_MVM_STATUS_SUPPRESS_ERROR_LOG_ONCE,
 };
 
 struct iwl_mvm_csme_conn_info {
index cc1879e10c6599b4a00e3ae70f28b323e916a2bc..6bb4e4d9d95af9a9a6ce57f46ec48ea9e82d1f50 100644 (file)
@@ -1841,7 +1841,9 @@ static void iwl_mvm_nic_error(struct iwl_op_mode *op_mode, bool sync)
 {
        struct iwl_mvm *mvm = IWL_OP_MODE_GET_MVM(op_mode);
 
-       if (!test_bit(STATUS_TRANS_DEAD, &mvm->trans->status))
+       if (!test_bit(STATUS_TRANS_DEAD, &mvm->trans->status) &&
+           !test_and_clear_bit(IWL_MVM_STATUS_SUPPRESS_ERROR_LOG_ONCE,
+                               &mvm->status))
                iwl_mvm_dump_nic_error_log(mvm);
 
        if (sync) {
index 0f3526b0c5b00977b73e342b0e22df90a46b1a73..0730657d54bf8a17fc609abec267ccc0208ab4d4 100644 (file)
@@ -1753,8 +1753,11 @@ static int iwl_trans_txq_send_hcmd_sync(struct iwl_trans *trans,
        }
 
        if (test_bit(STATUS_FW_ERROR, &trans->status)) {
-               IWL_ERR(trans, "FW error in SYNC CMD %s\n", cmd_str);
-               dump_stack();
+               if (!test_and_clear_bit(STATUS_SUPPRESS_CMD_ERROR_ONCE,
+                                       &trans->status)) {
+                       IWL_ERR(trans, "FW error in SYNC CMD %s\n", cmd_str);
+                       dump_stack();
+               }
                ret = -EIO;
                goto cancel;
        }