wifi: iwlwifi: mvm: add start mac ctdp sum calculation debugfs handler
authoriallouch <itai.allouche@intel.com>
Wed, 4 Oct 2023 09:36:29 +0000 (12:36 +0300)
committerJohannes Berg <johannes.berg@intel.com>
Mon, 23 Oct 2023 10:21:48 +0000 (12:21 +0200)
mac_ctdp_sum contains the power consumption, appears in power save
report, and is used for debugging and collection of statistics.

Add a debugfs handler to start this calculation, iff ctdp
command is supported in the firmware.

While on it, add an option to force start/stop this calculation,
which is safe from the firmware API side.

Signed-off-by: iallouch <itai.allouche@intel.com>
Signed-off-by: Nitsan Bar <nitsan.bar@intel.com>
Signed-off-by: Gregory Greenman <gregory.greenman@intel.com>
Link: https://lore.kernel.org/r/20231004123422.024d75df9e03.I69fdc826f2931a6e1435b450f0602ea060704697@changeid
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
drivers/net/wireless/intel/iwlwifi/mvm/debugfs.c

index cf27f106d4d56a0064dcb7e9d26cbdbf0b60b1fc..2c93b5a442c436a54e4ce52471cb14fef044351e 100644 (file)
@@ -50,8 +50,18 @@ static ssize_t iwl_dbgfs_stop_ctdp_write(struct iwl_mvm *mvm, char *buf,
                                         size_t count, loff_t *ppos)
 {
        int ret;
+       bool force;
 
-       if (!iwl_mvm_is_ctdp_supported(mvm))
+       if (!kstrtobool(buf, &force))
+               IWL_DEBUG_INFO(mvm,
+                              "force start is %d [0=disabled, 1=enabled]\n",
+                              force);
+
+       /* we allow skipping cap support check and force stop ctdp
+        * statistics collection and with guerantee that it is
+        * safe to use.
+        */
+       if (!force && !iwl_mvm_is_ctdp_supported(mvm))
                return -EOPNOTSUPP;
 
        if (!iwl_mvm_firmware_running(mvm) ||
@@ -65,6 +75,36 @@ static ssize_t iwl_dbgfs_stop_ctdp_write(struct iwl_mvm *mvm, char *buf,
        return ret ?: count;
 }
 
+static ssize_t iwl_dbgfs_start_ctdp_write(struct iwl_mvm *mvm,
+                                         char *buf, size_t count,
+                                         loff_t *ppos)
+{
+       int ret;
+       bool force;
+
+       if (!kstrtobool(buf, &force))
+               IWL_DEBUG_INFO(mvm,
+                              "force start is %d [0=disabled, 1=enabled]\n",
+                              force);
+
+       /* we allow skipping cap support check and force enable ctdp
+        * for statistics collection and with guerantee that it is
+        * safe to use.
+        */
+       if (!force && !iwl_mvm_is_ctdp_supported(mvm))
+               return -EOPNOTSUPP;
+
+       if (!iwl_mvm_firmware_running(mvm) ||
+           mvm->fwrt.cur_fw_img != IWL_UCODE_REGULAR)
+               return -EIO;
+
+       mutex_lock(&mvm->mutex);
+       ret = iwl_mvm_ctdp_command(mvm, CTDP_CMD_OPERATION_START, 0);
+       mutex_unlock(&mvm->mutex);
+
+       return ret ?: count;
+}
+
 static ssize_t iwl_dbgfs_force_ctkill_write(struct iwl_mvm *mvm, char *buf,
                                            size_t count, loff_t *ppos)
 {
@@ -1998,6 +2038,7 @@ MVM_DEBUGFS_READ_WRITE_FILE_OPS(prph_reg, 64);
 /* Device wide debugfs entries */
 MVM_DEBUGFS_READ_FILE_OPS(ctdp_budget);
 MVM_DEBUGFS_WRITE_FILE_OPS(stop_ctdp, 8);
+MVM_DEBUGFS_WRITE_FILE_OPS(start_ctdp, 8);
 MVM_DEBUGFS_WRITE_FILE_OPS(force_ctkill, 8);
 MVM_DEBUGFS_WRITE_FILE_OPS(tx_flush, 16);
 MVM_DEBUGFS_WRITE_FILE_OPS(sta_drain, 8);
@@ -2210,6 +2251,7 @@ void iwl_mvm_dbgfs_register(struct iwl_mvm *mvm)
        MVM_DEBUGFS_ADD_FILE(nic_temp, mvm->debugfs_dir, 0400);
        MVM_DEBUGFS_ADD_FILE(ctdp_budget, mvm->debugfs_dir, 0400);
        MVM_DEBUGFS_ADD_FILE(stop_ctdp, mvm->debugfs_dir, 0200);
+       MVM_DEBUGFS_ADD_FILE(start_ctdp, mvm->debugfs_dir, 0200);
        MVM_DEBUGFS_ADD_FILE(force_ctkill, mvm->debugfs_dir, 0200);
        MVM_DEBUGFS_ADD_FILE(stations, mvm->debugfs_dir, 0400);
        MVM_DEBUGFS_ADD_FILE(bt_notif, mvm->debugfs_dir, 0400);