From: Ben Greear <greearb@candelatech.com>
To: ath9k-devel@venema.h4ckr.net
Cc: linux-wireless@vger.kernel.org
Subject: Re: [PATCH v2] ath9k: Support ethtool getstats api.
Date: Mon, 04 Jun 2012 14:49:50 -0700 [thread overview]
Message-ID: <4FCD2D7E.8050409@candelatech.com> (raw)
In-Reply-To: <1337121205-24539-1-git-send-email-greearb@candelatech.com>
On 05/15/2012 03:33 PM, greearb@candelatech.com wrote:
> From: Ben Greear<greearb@candelatech.com>
>
> This returns many of the values that formerly could
> only be obtained from debugfs. This should be an
> improvement when trying to access these counters
> programatically. Currently this support is only
> enabled when DEBUGFS is enabled because otherwise
> these stats are not accumulated.
I notice this patch is still not in wireless-testing. Is it DOA,
or just didn't have time to get it merged in time?
Thanks,
Ben
>
> Signed-off-by: Ben Greear<greearb@candelatech.com>
> ---
> v2: Change BUG_ON to WARN_ON per suggestion.
>
> :100644 100644 dfa78e8... c25af9a... M drivers/net/wireless/ath/ath9k/main.c
> drivers/net/wireless/ath/ath9k/main.c | 134 +++++++++++++++++++++++++++++++++
> 1 files changed, 134 insertions(+), 0 deletions(-)
>
> diff --git a/drivers/net/wireless/ath/ath9k/main.c b/drivers/net/wireless/ath/ath9k/main.c
> index dfa78e8..c25af9a 100644
> --- a/drivers/net/wireless/ath/ath9k/main.c
> +++ b/drivers/net/wireless/ath/ath9k/main.c
> @@ -2388,6 +2388,134 @@ static int ath9k_get_antenna(struct ieee80211_hw *hw, u32 *tx_ant, u32 *rx_ant)
> return 0;
> }
>
> +#ifdef CONFIG_ATH9K_DEBUGFS
> +
> +/* Ethtool support for get-stats */
> +
> +#define AMKSTR(nm) #nm "_BE", #nm "_BK", #nm "_VI", #nm "_VO"
> +static const char ath9k_gstrings_stats[][ETH_GSTRING_LEN] = {
> + "tx_pkts_nic",
> + "tx_bytes_nic",
> + "rx_pkts_nic",
> + "rx_bytes_nic",
> + AMKSTR(d_tx_pkts),
> + AMKSTR(d_tx_bytes),
> + AMKSTR(d_tx_mpdus_queued),
> + AMKSTR(d_tx_mpdus_completed),
> + AMKSTR(d_tx_mpdu_xretries),
> + AMKSTR(d_tx_aggregates),
> + AMKSTR(d_tx_ampdus_queued_hw),
> + AMKSTR(d_tx_ampdus_queued_sw),
> + AMKSTR(d_tx_ampdus_completed),
> + AMKSTR(d_tx_ampdu_retries),
> + AMKSTR(d_tx_ampdu_xretries),
> + AMKSTR(d_tx_fifo_underrun),
> + AMKSTR(d_tx_op_exceeded),
> + AMKSTR(d_tx_timer_expiry),
> + AMKSTR(d_tx_desc_cfg_err),
> + AMKSTR(d_tx_data_underrun),
> + AMKSTR(d_tx_delim_underrun),
> +
> + "d_rx_decrypt_crc_err",
> + "d_rx_phy_err",
> + "d_rx_mic_err",
> + "d_rx_pre_delim_crc_err",
> + "d_rx_post_delim_crc_err",
> + "d_rx_decrypt_busy_err",
> +
> + "d_rx_phyerr_radar",
> + "d_rx_phyerr_ofdm_timing",
> + "d_rx_phyerr_cck_timing",
> +
> +};
> +#define ATH9K_SSTATS_LEN ARRAY_SIZE(ath9k_gstrings_stats)
> +
> +static void ath9k_get_et_strings(struct ieee80211_hw *hw,
> + struct ieee80211_vif *vif,
> + u32 sset, u8 *data)
> +{
> + if (sset == ETH_SS_STATS)
> + memcpy(data, *ath9k_gstrings_stats,
> + sizeof(ath9k_gstrings_stats));
> +}
> +
> +static int ath9k_get_et_sset_count(struct ieee80211_hw *hw,
> + struct ieee80211_vif *vif, int sset)
> +{
> + if (sset == ETH_SS_STATS)
> + return ATH9K_SSTATS_LEN;
> + return 0;
> +}
> +
> +#define PR_QNUM(_n) (sc->tx.txq_map[_n]->axq_qnum)
> +#define AWDATA(elem) \
> + do { \
> + data[i++] = sc->debug.stats.txstats[PR_QNUM(WME_AC_BE)].elem; \
> + data[i++] = sc->debug.stats.txstats[PR_QNUM(WME_AC_BK)].elem; \
> + data[i++] = sc->debug.stats.txstats[PR_QNUM(WME_AC_VI)].elem; \
> + data[i++] = sc->debug.stats.txstats[PR_QNUM(WME_AC_VO)].elem; \
> + } while (0)
> +
> +#define AWDATA_RX(elem) \
> + do { \
> + data[i++] = sc->debug.stats.rxstats.elem; \
> + } while (0)
> +
> +static void ath9k_get_et_stats(struct ieee80211_hw *hw,
> + struct ieee80211_vif *vif,
> + struct ethtool_stats *stats, u64 *data)
> +{
> + struct ath_softc *sc = hw->priv;
> + int i = 0;
> +
> + data[i++] = (sc->debug.stats.txstats[PR_QNUM(WME_AC_BE)].tx_pkts_all +
> + sc->debug.stats.txstats[PR_QNUM(WME_AC_BK)].tx_pkts_all +
> + sc->debug.stats.txstats[PR_QNUM(WME_AC_VI)].tx_pkts_all +
> + sc->debug.stats.txstats[PR_QNUM(WME_AC_VO)].tx_pkts_all);
> + data[i++] = (sc->debug.stats.txstats[PR_QNUM(WME_AC_BE)].tx_bytes_all +
> + sc->debug.stats.txstats[PR_QNUM(WME_AC_BK)].tx_bytes_all +
> + sc->debug.stats.txstats[PR_QNUM(WME_AC_VI)].tx_bytes_all +
> + sc->debug.stats.txstats[PR_QNUM(WME_AC_VO)].tx_bytes_all);
> + AWDATA_RX(rx_pkts_all);
> + AWDATA_RX(rx_bytes_all);
> +
> + AWDATA(tx_pkts_all);
> + AWDATA(tx_bytes_all);
> + AWDATA(queued);
> + AWDATA(completed);
> + AWDATA(xretries);
> + AWDATA(a_aggr);
> + AWDATA(a_queued_hw);
> + AWDATA(a_queued_sw);
> + AWDATA(a_completed);
> + AWDATA(a_retries);
> + AWDATA(a_xretries);
> + AWDATA(fifo_underrun);
> + AWDATA(xtxop);
> + AWDATA(timer_exp);
> + AWDATA(desc_cfg_err);
> + AWDATA(data_underrun);
> + AWDATA(delim_underrun);
> +
> + AWDATA_RX(decrypt_crc_err);
> + AWDATA_RX(phy_err);
> + AWDATA_RX(mic_err);
> + AWDATA_RX(pre_delim_crc_err);
> + AWDATA_RX(post_delim_crc_err);
> + AWDATA_RX(decrypt_busy_err);
> +
> + AWDATA_RX(phy_err_stats[ATH9K_PHYERR_RADAR]);
> + AWDATA_RX(phy_err_stats[ATH9K_PHYERR_OFDM_TIMING]);
> + AWDATA_RX(phy_err_stats[ATH9K_PHYERR_CCK_TIMING]);
> +
> + WARN_ON(i != ATH9K_SSTATS_LEN);
> +}
> +
> +/* End of ethtool get-stats functions */
> +
> +#endif
> +
> +
> struct ieee80211_ops ath9k_ops = {
> .tx = ath9k_tx,
> .start = ath9k_start,
> @@ -2416,4 +2544,10 @@ struct ieee80211_ops ath9k_ops = {
> .get_stats = ath9k_get_stats,
> .set_antenna = ath9k_set_antenna,
> .get_antenna = ath9k_get_antenna,
> +
> +#ifdef CONFIG_ATH9K_DEBUGFS
> + .get_et_sset_count = ath9k_get_et_sset_count,
> + .get_et_stats = ath9k_get_et_stats,
> + .get_et_strings = ath9k_get_et_strings,
> +#endif
> };
--
Ben Greear <greearb@candelatech.com>
Candela Technologies Inc http://www.candelatech.com
prev parent reply other threads:[~2012-06-04 21:49 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-05-15 22:33 [PATCH v2] ath9k: Support ethtool getstats api greearb
2012-05-16 6:12 ` Holger Schurig
2012-05-16 13:31 ` Ben Greear
2012-06-04 21:49 ` Ben Greear [this message]
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=4FCD2D7E.8050409@candelatech.com \
--to=greearb@candelatech.com \
--cc=ath9k-devel@venema.h4ckr.net \
--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).