wifi: iwlwifi: mvm: debugfs for fw system stats
authorAnjaneyulu <pagadala.yesu.anjaneyulu@intel.com>
Sun, 22 Oct 2023 14:55:48 +0000 (17:55 +0300)
committerJohannes Berg <johannes.berg@intel.com>
Mon, 23 Oct 2023 10:49:29 +0000 (12:49 +0200)
Add debgufs handler for fw system statistics command.

Signed-off-by: Anjaneyulu <pagadala.yesu.anjaneyulu@intel.com>
Signed-off-by: Gregory Greenman <gregory.greenman@intel.com>
Link: https://lore.kernel.org/r/20231022173519.e77efee7cd85.I99f370f26f94f73e06aec2a8eaf21ebcc82f60a9@changeid
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
drivers/net/wireless/intel/iwlwifi/mvm/debugfs.c

index 2c93b5a442c436a54e4ce52471cb14fef044351e..329c545f65fde880e56e76249ee70157f22a142d 100644 (file)
@@ -1005,6 +1005,13 @@ static ssize_t iwl_dbgfs_fw_rx_stats_read(struct file *file,
        char *buf;
        int ret;
        size_t bufsz;
+       u8 cmd_ver = iwl_fw_lookup_cmd_ver(mvm->fw,
+                                          WIDE_ID(SYSTEM_GROUP,
+                                                  SYSTEM_STATISTICS_CMD),
+                                          IWL_FW_CMD_VER_UNKNOWN);
+
+       if (cmd_ver != IWL_FW_CMD_VER_UNKNOWN)
+               return -EOPNOTSUPP;
 
        if (iwl_mvm_has_new_rx_stats_api(mvm))
                bufsz = ((sizeof(struct mvm_statistics_rx) /
@@ -1184,6 +1191,101 @@ static ssize_t iwl_dbgfs_fw_rx_stats_read(struct file *file,
 }
 #undef PRINT_STAT_LE32
 
+static ssize_t iwl_dbgfs_fw_system_stats_read(struct file *file,
+                                             char __user *user_buf,
+                                             size_t count, loff_t *ppos)
+{
+       char *buff, *pos, *endpos;
+       int ret;
+       size_t bufsz;
+       int i;
+       struct iwl_mvm_vif *mvmvif;
+       struct ieee80211_vif *vif;
+       struct iwl_mvm *mvm = file->private_data;
+       u8 cmd_ver = iwl_fw_lookup_cmd_ver(mvm->fw,
+                                          WIDE_ID(SYSTEM_GROUP,
+                                                  SYSTEM_STATISTICS_CMD),
+                                          IWL_FW_CMD_VER_UNKNOWN);
+
+       /* in case of a wrong cmd version, allocate buffer only for error msg */
+       bufsz = (cmd_ver == 1) ? 4096 : 64;
+
+       buff = kzalloc(bufsz, GFP_KERNEL);
+       if (!buff)
+               return -ENOMEM;
+
+       pos = buff;
+       endpos = pos + bufsz;
+
+       if (cmd_ver != 1) {
+               pos += scnprintf(pos, endpos - pos,
+                                "System stats not supported:%d\n", cmd_ver);
+               goto send_out;
+       }
+
+       mutex_lock(&mvm->mutex);
+       if (iwl_mvm_firmware_running(mvm))
+               iwl_mvm_request_statistics(mvm, false);
+
+       for (i = 0; i < NUM_MAC_INDEX_DRIVER; i++) {
+               vif = iwl_mvm_rcu_dereference_vif_id(mvm, i, false);
+               if (!vif)
+                       continue;
+
+               if (vif->type == NL80211_IFTYPE_STATION)
+                       break;
+       }
+
+       if (i == NUM_MAC_INDEX_DRIVER || !vif) {
+               pos += scnprintf(pos, endpos - pos, "vif is NULL\n");
+               goto release_send_out;
+       }
+
+       mvmvif = iwl_mvm_vif_from_mac80211(vif);
+       if (!mvmvif) {
+               pos += scnprintf(pos, endpos - pos, "mvmvif is NULL\n");
+               goto release_send_out;
+       }
+
+       for_each_mvm_vif_valid_link(mvmvif, i) {
+               struct iwl_mvm_vif_link_info *link_info = mvmvif->link[i];
+
+               pos += scnprintf(pos, endpos - pos,
+                                "link_id %d", i);
+               pos += scnprintf(pos, endpos - pos,
+                                " num_beacons %d",
+                                link_info->beacon_stats.num_beacons);
+               pos += scnprintf(pos, endpos - pos,
+                                " accu_num_beacons %d",
+                                link_info->beacon_stats.accu_num_beacons);
+               pos += scnprintf(pos, endpos - pos,
+                                " avg_signal %d\n",
+                                link_info->beacon_stats.avg_signal);
+       }
+
+       pos += scnprintf(pos, endpos - pos,
+                        "radio_stats.rx_time %lld\n",
+                        mvm->radio_stats.rx_time);
+       pos += scnprintf(pos, endpos - pos,
+                        "radio_stats.tx_time %lld\n",
+                        mvm->radio_stats.tx_time);
+       pos += scnprintf(pos, endpos - pos,
+                        "accu_radio_stats.rx_time %lld\n",
+                        mvm->accu_radio_stats.rx_time);
+       pos += scnprintf(pos, endpos - pos,
+                        "accu_radio_stats.tx_time %lld\n",
+                        mvm->accu_radio_stats.tx_time);
+
+release_send_out:
+       mutex_unlock(&mvm->mutex);
+
+send_out:
+       ret = simple_read_from_buffer(user_buf, count, ppos, buff, pos - buff);
+       kfree(buff);
+
+       return ret;
+}
+
 static ssize_t iwl_dbgfs_frame_stats_read(struct iwl_mvm *mvm,
                                          char __user *user_buf, size_t count,
                                          loff_t *ppos,
@@ -2053,6 +2155,7 @@ MVM_DEBUGFS_READ_FILE_OPS(bt_cmd);
 MVM_DEBUGFS_READ_WRITE_FILE_OPS(disable_power_off, 64);
 MVM_DEBUGFS_READ_FILE_OPS(fw_rx_stats);
 MVM_DEBUGFS_READ_FILE_OPS(drv_rx_stats);
+MVM_DEBUGFS_READ_FILE_OPS(fw_system_stats);
 MVM_DEBUGFS_READ_FILE_OPS(fw_ver);
 MVM_DEBUGFS_READ_FILE_OPS(phy_integration_ver);
 MVM_DEBUGFS_READ_FILE_OPS(tas_get_status);
@@ -2260,6 +2363,7 @@ void iwl_mvm_dbgfs_register(struct iwl_mvm *mvm)
        MVM_DEBUGFS_ADD_FILE(fw_ver, mvm->debugfs_dir, 0400);
        MVM_DEBUGFS_ADD_FILE(fw_rx_stats, mvm->debugfs_dir, 0400);
        MVM_DEBUGFS_ADD_FILE(drv_rx_stats, mvm->debugfs_dir, 0400);
+       MVM_DEBUGFS_ADD_FILE(fw_system_stats, mvm->debugfs_dir, 0400);
        MVM_DEBUGFS_ADD_FILE(fw_restart, mvm->debugfs_dir, 0200);
        MVM_DEBUGFS_ADD_FILE(fw_nmi, mvm->debugfs_dir, 0200);
        MVM_DEBUGFS_ADD_FILE(bt_tx_prio, mvm->debugfs_dir, 0200);