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 9dea8f9..e7c6e7b 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 ff66001..f1e9d2c 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 f7ff7f2..92d6e3d 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 cc1879e..6bb4e4d 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 0f3526b..0730657 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;
        }