linux-wireless.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Emmanuel Grumbach <egrumbach@gmail.com>
To: linux-wireless@vger.kernel.org
Cc: Eyal Shapira <eyal@wizery.com>,
	Eyal Shapira <eyalx.shapira@intel.com>,
	Emmanuel Grumbach <emmanuel.grumbach@intel.com>
Subject: [PATCH 24/47] iwlwifi: mvm: add per rate tx stats
Date: Sun, 13 Apr 2014 22:19:39 +0300	[thread overview]
Message-ID: <1397416802-32403-24-git-send-email-egrumbach@gmail.com> (raw)
In-Reply-To: <534AE330.2020805@gmail.com>

From: Eyal Shapira <eyal@wizery.com>

Collect accumulated stats of tx attempts and successes
per rate and column for debugging purposes.
These stats can be read via debugfs file drv_tx_stats
and can also be reset by writing to this file.

Signed-off-by: Eyal Shapira <eyalx.shapira@intel.com>
Signed-off-by: Emmanuel Grumbach <emmanuel.grumbach@intel.com>
---
 drivers/net/wireless/iwlwifi/mvm/rs.c | 105 ++++++++++++++++++++++++++++++++--
 drivers/net/wireless/iwlwifi/mvm/rs.h |  10 ++++
 2 files changed, 111 insertions(+), 4 deletions(-)

diff --git a/drivers/net/wireless/iwlwifi/mvm/rs.c b/drivers/net/wireless/iwlwifi/mvm/rs.c
index 50fd460..7a332cb 100644
--- a/drivers/net/wireless/iwlwifi/mvm/rs.c
+++ b/drivers/net/wireless/iwlwifi/mvm/rs.c
@@ -641,7 +641,8 @@ static int _rs_collect_tx_data(struct iwl_scale_tbl_info *tbl,
 	return 0;
 }
 
-static int rs_collect_tx_data(struct iwl_scale_tbl_info *tbl,
+static int rs_collect_tx_data(struct iwl_lq_sta *lq_sta,
+			      struct iwl_scale_tbl_info *tbl,
 			      int scale_index, int attempts, int successes,
 			      u8 reduced_txp)
 {
@@ -651,6 +652,11 @@ static int rs_collect_tx_data(struct iwl_scale_tbl_info *tbl,
 	if (scale_index < 0 || scale_index >= IWL_RATE_COUNT)
 		return -EINVAL;
 
+	if (tbl->column != RS_COLUMN_INVALID) {
+		lq_sta->tx_stats[tbl->column][scale_index].total += attempts;
+		lq_sta->tx_stats[tbl->column][scale_index].success += successes;
+	}
+
 	/* Select window for current tx bit rate */
 	window = &(tbl->win[scale_index]);
 
@@ -1119,7 +1125,7 @@ static void rs_tx_status(void *mvm_r, struct ieee80211_supported_band *sband,
 	if (info->flags & IEEE80211_TX_STAT_AMPDU) {
 		ucode_rate = le32_to_cpu(table->rs_table[0]);
 		rs_rate_from_ucode_rate(ucode_rate, info->band, &rate);
-		rs_collect_tx_data(curr_tbl, rate.index,
+		rs_collect_tx_data(lq_sta, curr_tbl, rate.index,
 				   info->status.ampdu_len,
 				   info->status.ampdu_ack_len,
 				   reduced_txp);
@@ -1155,7 +1161,7 @@ static void rs_tx_status(void *mvm_r, struct ieee80211_supported_band *sband,
 			else
 				continue;
 
-			rs_collect_tx_data(tmp_tbl, rate.index, 1,
+			rs_collect_tx_data(lq_sta, tmp_tbl, rate.index, 1,
 					   i < retries ? 0 : legacy_success,
 					   reduced_txp);
 		}
@@ -2928,7 +2934,6 @@ static ssize_t rs_sta_dbgfs_scale_table_write(struct file *file,
 	size_t buf_size;
 	u32 parsed_rate;
 
-
 	mvm = lq_sta->drv;
 	memset(buf, 0, sizeof(buf));
 	buf_size = min(count, sizeof(buf) -  1);
@@ -3074,6 +3079,94 @@ static const struct file_operations rs_sta_dbgfs_stats_table_ops = {
 	.llseek = default_llseek,
 };
 
+static ssize_t rs_sta_dbgfs_drv_tx_stats_read(struct file *file,
+					      char __user *user_buf,
+					      size_t count, loff_t *ppos)
+{
+	static const char * const column_name[] = {
+		[RS_COLUMN_LEGACY_ANT_A] = "LEGACY_ANT_A",
+		[RS_COLUMN_LEGACY_ANT_B] = "LEGACY_ANT_B",
+		[RS_COLUMN_SISO_ANT_A] = "SISO_ANT_A",
+		[RS_COLUMN_SISO_ANT_B] = "SISO_ANT_B",
+		[RS_COLUMN_SISO_ANT_A_SGI] = "SISO_ANT_A_SGI",
+		[RS_COLUMN_SISO_ANT_B_SGI] = "SISO_ANT_B_SGI",
+		[RS_COLUMN_MIMO2] = "MIMO2",
+		[RS_COLUMN_MIMO2_SGI] = "MIMO2_SGI",
+	};
+
+	static const char * const rate_name[] = {
+		[IWL_RATE_1M_INDEX] = "1M",
+		[IWL_RATE_2M_INDEX] = "2M",
+		[IWL_RATE_5M_INDEX] = "5.5M",
+		[IWL_RATE_11M_INDEX] = "11M",
+		[IWL_RATE_6M_INDEX] = "6M|MCS0",
+		[IWL_RATE_9M_INDEX] = "9M",
+		[IWL_RATE_12M_INDEX] = "12M|MCS1",
+		[IWL_RATE_18M_INDEX] = "18M|MCS2",
+		[IWL_RATE_24M_INDEX] = "24M|MCS3",
+		[IWL_RATE_36M_INDEX] = "36M|MCS4",
+		[IWL_RATE_48M_INDEX] = "48M|MCS5",
+		[IWL_RATE_54M_INDEX] = "54M|MCS6",
+		[IWL_RATE_MCS_7_INDEX] = "MCS7",
+		[IWL_RATE_MCS_8_INDEX] = "MCS8",
+		[IWL_RATE_MCS_9_INDEX] = "MCS9",
+	};
+
+	char *buff, *pos, *endpos;
+	int col, rate;
+	ssize_t ret;
+	struct iwl_lq_sta *lq_sta = file->private_data;
+	struct rs_rate_stats *stats;
+	static const size_t bufsz = 1024;
+
+	buff = kmalloc(bufsz, GFP_KERNEL);
+	if (!buff)
+		return -ENOMEM;
+
+	pos = buff;
+	endpos = pos + bufsz;
+
+	pos += scnprintf(pos, endpos - pos, "COLUMN,");
+	for (rate = 0; rate < IWL_RATE_COUNT; rate++)
+		pos += scnprintf(pos, endpos - pos, "%s,", rate_name[rate]);
+	pos += scnprintf(pos, endpos - pos, "\n");
+
+	for (col = 0; col < RS_COLUMN_COUNT; col++) {
+		pos += scnprintf(pos, endpos - pos,
+				 "%s,", column_name[col]);
+
+		for (rate = 0; rate < IWL_RATE_COUNT; rate++) {
+			stats = &(lq_sta->tx_stats[col][rate]);
+			pos += scnprintf(pos, endpos - pos,
+					 "%llu/%llu,",
+					 stats->success,
+					 stats->total);
+		}
+		pos += scnprintf(pos, endpos - pos, "\n");
+	}
+
+	ret = simple_read_from_buffer(user_buf, count, ppos, buff, pos - buff);
+	kfree(buff);
+	return ret;
+}
+
+static ssize_t rs_sta_dbgfs_drv_tx_stats_write(struct file *file,
+					       const char __user *user_buf,
+					       size_t count, loff_t *ppos)
+{
+	struct iwl_lq_sta *lq_sta = file->private_data;
+	memset(lq_sta->tx_stats, 0, sizeof(lq_sta->tx_stats));
+
+	return count;
+}
+
+static const struct file_operations rs_sta_dbgfs_drv_tx_stats_ops = {
+	.read = rs_sta_dbgfs_drv_tx_stats_read,
+	.write = rs_sta_dbgfs_drv_tx_stats_write,
+	.open = simple_open,
+	.llseek = default_llseek,
+};
+
 static void rs_add_debugfs(void *mvm, void *mvm_sta, struct dentry *dir)
 {
 	struct iwl_lq_sta *lq_sta = mvm_sta;
@@ -3083,6 +3176,9 @@ static void rs_add_debugfs(void *mvm, void *mvm_sta, struct dentry *dir)
 	lq_sta->rs_sta_dbgfs_stats_table_file =
 		debugfs_create_file("rate_stats_table", S_IRUSR, dir,
 				    lq_sta, &rs_sta_dbgfs_stats_table_ops);
+	lq_sta->rs_sta_dbgfs_drv_tx_stats_file =
+		debugfs_create_file("drv_tx_stats", S_IRUSR | S_IWUSR, dir,
+				    lq_sta, &rs_sta_dbgfs_drv_tx_stats_ops);
 	lq_sta->rs_sta_dbgfs_tx_agg_tid_en_file =
 		debugfs_create_u8("tx_agg_tid_enable", S_IRUSR | S_IWUSR, dir,
 				  &lq_sta->tx_agg_tid_en);
@@ -3096,6 +3192,7 @@ static void rs_remove_debugfs(void *mvm, void *mvm_sta)
 	struct iwl_lq_sta *lq_sta = mvm_sta;
 	debugfs_remove(lq_sta->rs_sta_dbgfs_scale_table_file);
 	debugfs_remove(lq_sta->rs_sta_dbgfs_stats_table_file);
+	debugfs_remove(lq_sta->rs_sta_dbgfs_drv_tx_stats_file);
 	debugfs_remove(lq_sta->rs_sta_dbgfs_tx_agg_tid_en_file);
 	debugfs_remove(lq_sta->rs_sta_dbgfs_reduced_txp_file);
 }
diff --git a/drivers/net/wireless/iwlwifi/mvm/rs.h b/drivers/net/wireless/iwlwifi/mvm/rs.h
index fcc056d..958c99d 100644
--- a/drivers/net/wireless/iwlwifi/mvm/rs.h
+++ b/drivers/net/wireless/iwlwifi/mvm/rs.h
@@ -272,9 +272,16 @@ enum rs_column {
 	RS_COLUMN_MIMO2_SGI,
 
 	RS_COLUMN_LAST = RS_COLUMN_MIMO2_SGI,
+	RS_COLUMN_COUNT = RS_COLUMN_LAST + 1,
 	RS_COLUMN_INVALID,
 };
 
+/* Packet stats per rate */
+struct rs_rate_stats {
+	u64 success;
+	u64 total;
+};
+
 /**
  * struct iwl_scale_tbl_info -- tx params and success history for all rates
  *
@@ -322,6 +329,8 @@ struct iwl_lq_sta {
 	bool is_vht;
 	enum ieee80211_band band;
 
+	struct rs_rate_stats tx_stats[RS_COLUMN_COUNT][IWL_RATE_COUNT];
+
 	/* The following are bitmaps of rates; IWL_RATE_6M_MASK, etc. */
 	u16 active_legacy_rate;
 	u16 active_siso_rate;
@@ -335,6 +344,7 @@ struct iwl_lq_sta {
 #ifdef CONFIG_MAC80211_DEBUGFS
 	struct dentry *rs_sta_dbgfs_scale_table_file;
 	struct dentry *rs_sta_dbgfs_stats_table_file;
+	struct dentry *rs_sta_dbgfs_drv_tx_stats_file;
 	struct dentry *rs_sta_dbgfs_tx_agg_tid_en_file;
 	struct dentry *rs_sta_dbgfs_reduced_txp_file;
 	u32 dbg_fixed_rate;
-- 
1.8.3.2


  parent reply	other threads:[~2014-04-13 19:20 UTC|newest]

Thread overview: 50+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-04-13 19:19 pull request: iwlwifi 2014-04-13 Emmanuel Grumbach
2014-04-13 19:19 ` [PATCH 01/47] iwlwifi: mvm: Handle power management constraints for additional use-cases Emmanuel Grumbach
2014-04-13 19:19 ` [PATCH 02/47] iwlwifi: mvm: fix the number of channels in family 8000 Emmanuel Grumbach
2014-04-13 19:19 ` [PATCH 03/47] iwlwifi: pcie: don't leave the new NICs awake for commands Emmanuel Grumbach
2014-04-13 19:19 ` [PATCH 04/47] iwlwifi: mvm: add lq_cmd/tx_resp reduced_tpc field Emmanuel Grumbach
2014-04-13 19:19 ` [PATCH 05/47] iwlwifi: mvm: add ATPC implementation Emmanuel Grumbach
2014-04-13 19:19 ` [PATCH 06/47] iwlwifi: mvm: add debugfs file for fixed reduced tx power Emmanuel Grumbach
2014-04-13 19:19 ` [PATCH 07/47] iwlwifi: pcie: implement GRO without NAPI Emmanuel Grumbach
2014-04-13 19:19 ` [PATCH 08/47] iwlwifi: pcie: clarify RX queue need_update handling and locking Emmanuel Grumbach
2014-04-13 19:19 ` [PATCH 09/47] iwlwifi: pcie: use bool for TX queue where appropriate Emmanuel Grumbach
2014-04-13 19:19 ` [PATCH 10/47] iwlwifi: pcie: fix TX queue locking Emmanuel Grumbach
2014-04-13 19:19 ` [PATCH 11/47] iwlwifi: pcie: clarify TX queue need_update handling Emmanuel Grumbach
2014-04-13 19:19 ` [PATCH 12/47] iwlwifi: pcie: unify iwl_rx_replenish and iwl_rx_replenish_now Emmanuel Grumbach
2014-04-13 19:19 ` [PATCH 13/47] iwlwifi: move CPU1_CPU2_SEPARATOR_SECTION to iwl-fw.h Emmanuel Grumbach
2014-04-13 19:19 ` [PATCH 14/47] iwlwifi: mvm: remove redundant empty line Emmanuel Grumbach
2014-04-13 19:19 ` [PATCH 15/47] iwlwifi: mvm: propagate the beamforming status from firmware Emmanuel Grumbach
2014-04-13 19:19 ` [PATCH 16/47] iwlwifi: mvm: don't set AP STA to EINVAL Emmanuel Grumbach
2014-04-13 19:19 ` [PATCH 17/47] iwlwifi: allow to wait for a subset of the queues Emmanuel Grumbach
2014-04-13 19:19 ` [PATCH 18/47] iwlwifi: pcie: WARN upon traffic while flushing TX queues Emmanuel Grumbach
2014-04-13 19:19 ` [PATCH 19/47] iwlwifi: mvm: dump Rx FIFO when the firmware asserts Emmanuel Grumbach
2014-04-13 19:19 ` [PATCH 20/47] iwlwifi: mvm: Fix warning message when exit thermal throttling Emmanuel Grumbach
2014-04-13 19:19 ` [PATCH 21/47] iwlwifi: mvm: Fix tx-backoff when NIC " Emmanuel Grumbach
2014-04-13 19:19 ` [PATCH 22/47] iwlwifi: mvm: don't enable bcast filtering on P2P client Emmanuel Grumbach
2014-04-13 19:19 ` [PATCH 23/47] iwlwifi: mvm: Use RCU_INIT_POINTER(x, NULL) Emmanuel Grumbach
2014-04-13 19:19 ` Emmanuel Grumbach [this message]
2014-04-13 19:19 ` [PATCH 25/47] iwlwifi: mvm: replace BUG_ON by WARN_ON in scan.c Emmanuel Grumbach
2014-04-13 19:19 ` [PATCH 26/47] iwlwifi: mvm: deprecate -7 firmware Emmanuel Grumbach
2014-04-13 19:19 ` [PATCH 27/47] iwlwifi: mvm: Change scan fragmentation condition Emmanuel Grumbach
2014-04-13 19:19 ` [PATCH 28/47] iwlwifi: mvm: Fix scan parameters units Emmanuel Grumbach
2014-04-13 19:19 ` [PATCH 29/47] iwlwifi: remove IWL_UCODE_TLV_FLAGS_NEWBT_COEX TLV flag Emmanuel Grumbach
2014-04-13 19:19 ` [PATCH 30/47] iwlwifi: remove IWL_UCODE_TLV_FLAGS_PM_CMD_SUPPORT flag Emmanuel Grumbach
2014-04-13 19:19 ` [PATCH 31/47] iwlwifi: remove IWL_UCODE_TLV_FLAGS_RX_ENERGY_API flag Emmanuel Grumbach
2014-04-13 19:19 ` [PATCH 32/47] iwlwifi: remove IWL_UCODE_TLV_FLAGS_TIME_EVENT_API_V2 flag Emmanuel Grumbach
2014-04-13 19:19 ` [PATCH 33/47] iwlwifi: remove IWL_UCODE_TLV_FLAGS_BF_UPDATED flag Emmanuel Grumbach
2014-04-13 19:19 ` [PATCH 34/47] iwlwifi: remove IWL_UCODE_TLV_FLAGS_D3_CONTINUITY_API flag Emmanuel Grumbach
2014-04-13 19:19 ` [PATCH 35/47] iwlwifi: remove IWL_UCODE_TLV_FLAGS_SCHED_SCAN flag Emmanuel Grumbach
2014-04-13 19:19 ` [PATCH 36/47] iwlwifi: remove IWL_UCODE_TLV_FLAGS_UAPSD_SUPPORT flag Emmanuel Grumbach
2014-04-13 19:19 ` [PATCH 37/47] iwlwifi: remove IWL_UCODE_TLV_FLAGS_STA_KEY_CMD flag Emmanuel Grumbach
2014-04-13 19:19 ` [PATCH 38/47] iwlwifi: remove IWL_UCODE_TLV_FLAGS_DEVICE_PS_CMD flag Emmanuel Grumbach
2014-04-13 19:19 ` [PATCH 39/47] iwlwifi: mvm: BT Coex - don't use comma operator Emmanuel Grumbach
2014-04-13 19:19 ` [PATCH 40/47] iwlwifi: mvm: BT Coex - minor API change Emmanuel Grumbach
2014-04-13 19:19 ` [PATCH 41/47] iwlwifi: mvm: BT Coex - send priority tables from iwl_send_bt_init_conf Emmanuel Grumbach
2014-04-13 19:19 ` [PATCH 42/47] iwlwifi: mvm: Add support for Energy based scan (EBS) Emmanuel Grumbach
2014-04-13 19:19 ` [PATCH 43/47] iwlwifi: 7000: bump firmware API version to 9 Emmanuel Grumbach
2014-04-13 19:19 ` [PATCH 44/47] iwlwifi: mvm: don't use d3 fw if d0i3 is used Emmanuel Grumbach
2014-04-13 19:20 ` [PATCH 45/47] iwlwifi: mvm: replace leading spaces by tabs Emmanuel Grumbach
2014-04-13 19:20 ` [PATCH 46/47] iwlwifi: mvm: Re-factor enabling uAPSD logic Emmanuel Grumbach
2014-04-13 19:20 ` [PATCH 47/47] iwlwifi: don't disable SCD chain extension on newer devices Emmanuel Grumbach
2014-04-13 19:25 ` pull request: iwlwifi 2014-04-13 Emmanuel Grumbach
2014-04-22 20:07   ` John W. Linville

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1397416802-32403-24-git-send-email-egrumbach@gmail.com \
    --to=egrumbach@gmail.com \
    --cc=emmanuel.grumbach@intel.com \
    --cc=eyal@wizery.com \
    --cc=eyalx.shapira@intel.com \
    --cc=linux-wireless@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).