Commit a2d450e3 authored by Anjaneyulu's avatar Anjaneyulu Committed by Johannes Berg
Browse files

wifi: iwlwifi: mvm: debugfs for fw system stats

parent b6e3d1ba
Loading
Loading
Loading
Loading
+104 −0
Original line number Diff line number Diff line
@@ -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);