ath6k: break stats gathering code into separate method.
PATCH v2 1/2 ath6k: break stats gathering code into separate method.
From: Ben Greear <[email protected]>
This will allow us to call it from elsewhere when implementing ethtool stats.
---
v2: Make ethtool ops static per kbuild test robot suggestion.
drivers/net/wireless/ath/ath6kl/debug.c | 55 +++++++++++++++++++-------------- drivers/net/wireless/ath/ath6kl/debug.h | 2 ++ 2 files changed, 34 insertions(+), 23 deletions(-)
drivers/net/wireless/ath/ath6kl/debug.c +32 -23
@@ -98,6 +98,33 @@ void ath6kl_warn(const char *fmt, ...) }EXPORT_SYMBOL (ath6kl_warn); +int ath6k_read_tgt_stats (struct ath6kl *ar,struct ath6kl_vif *vif) +{ +long left; + +if (down_interruptible (&ar->sem)) +return -EBUSY ; + +set_bit (STATS_UPDATE_PEND , &vif->flags); + +if (ath6kl_wmi_get_stats_cmd (ar->wmi,0 )) { +up (&ar->sem); +return -EIO ; + } + + left =wait_event_interruptible_timeout (ar->event_wq, + !test_bit (STATS_UPDATE_PEND , + &vif->flags),WMI_TIMEOUT ); + +up (&ar->sem); + +if (left <=0 ) +return -ETIMEDOUT ; + +return 0 ; +} +EXPORT_SYMBOL (ath6k_read_tgt_stats); +#ifdef CONFIG_ATH6KL_DEBUG void ath6kl_dbg (enum ATH6K_DEBUG_MASK mask,const char *fmt, ...)
@@ -544,42 +571,24 @@ static ssize_t read_file_tgt_stats(struct file *file, char __user *user_buf,char *buf;unsigned int len =0 , buf_len =1500 ;int i; -long left;ssize_t ret_cnt; +int rv; vif =ath6kl_vif_first (ar);if (!vif)return -EIO ; - tgt_stats = &vif->target_stats; - buf =kzalloc (buf_len,GFP_KERNEL );if (!buf)return -ENOMEM ; -if (down_interruptible (&ar->sem)) { + rv =ath6k_read_tgt_stats (ar, vif); +if (rv <0 ) {kfree (buf); -return -EBUSY ; +return rv; } -set_bit (STATS_UPDATE_PEND , &vif->flags); - -if (ath6kl_wmi_get_stats_cmd (ar->wmi,0 )) { -up (&ar->sem); -kfree (buf); -return -EIO ; - } - - left =wait_event_interruptible_timeout (ar->event_wq, - !test_bit (STATS_UPDATE_PEND , - &vif->flags),WMI_TIMEOUT ); - -up (&ar->sem); - -if (left <=0 ) { -kfree (buf); -return -ETIMEDOUT ; - } + tgt_stats = &vif->target_stats; len +=scnprintf (buf + len, buf_len - len,"\n" ); len += scnprintf(buf + len, buf_len - len, "%25s\n",
drivers/net/wireless/ath/ath6kl/debug.h +2 -0
@@ -59,6 +59,8 @@ enum ath6kl_war { ATH6KL_WAR_INVALID_RATE, }; +int ath6k_read_tgt_stats (struct ath6kl *ar,struct ath6kl_vif *vif); +#ifdef CONFIG_ATH6KL_DEBUG void ath6kl_dbg (enum ATH6K_DEBUG_MASK mask,const char *fmt, ...);
Signature · 1 line
2.4.3
PATCH v2 2/2 ath6k: implement ethtool stats.
From: Ben Greear <[email protected]>
This supports a way to get target stats through normal ethtool stats API.
For instance:
# ethtool -S wlan1
NIC statistics:
tx_pkts_nic: 353
tx_bytes_nic: 25142
rx_pkts_nic: 6
rx_bytes_nic: 996
d_tx_ucast_pkts: 89
d_tx_bcast_pkts: 264
d_tx_ucast_bytes: 3020
d_tx_bcast_bytes: 22122
...--- drivers/net/wireless/ath/ath6kl/cfg80211.c | 123 +++++++++++++++++++++++++++++ 1 file changed, 123 insertions(+)
drivers/net/wireless/ath/ath6kl/cfg80211.c +123 -0
@@ -3645,6 +3645,127 @@ void ath6kl_cfg80211_vif_cleanup(struct ath6kl_vif *vif) ar->num_vif--; } +static const char ath6k_gstrings_sta_stats[][ETH_GSTRING_LEN ] = { +/* Common stats names used by many drivers. */ +"tx_pkts_nic" ,"tx_bytes_nic" ,"rx_pkts_nic" ,"rx_bytes_nic" , + +/* TX stats. */ +"d_tx_ucast_pkts" ,"d_tx_bcast_pkts" , +"d_tx_ucast_bytes" ,"d_tx_bcast_bytes" , +"d_tx_rts_ok" ,"d_tx_error" ,"d_tx_fail" , +"d_tx_retry" ,"d_tx_multi_retry" ,"d_tx_rts_fail" , +"d_tx_tkip_counter_measures" , + +/* RX Stats. */ +"d_rx_ucast_pkts" ,"d_rx_ucast_rate" ,"d_rx_bcast_pkts" , +"d_rx_ucast_bytes" ,"d_rx_bcast_bytes" ,"d_rx_frag_pkt" , +"d_rx_error" ,"d_rx_crc_err" ,"d_rx_keycache_miss" , +"d_rx_decrypt_crc_err" ,"d_rx_duplicate_frames" , +"d_rx_mic_err" ,"d_rx_tkip_format_err" ,"d_rx_ccmp_format_err" , +"d_rx_ccmp_replay_err" , + +/* Misc stats. */ +"d_beacon_miss" ,"d_num_connects" ,"d_num_disconnects" , +"d_beacon_avg_rssi" ,"d_arp_received" ,"d_arp_matched" , +"d_arp_replied" +}; + +#define ATH6K_STATS_LEN ARRAY_SIZE(ath6k_gstrings_sta_stats) + +static int ath6k_get_sset_count (struct net_device *dev,int sset) +{ +int rv =0 ; + +if (sset ==ETH_SS_STATS ) + rv +=ATH6K_STATS_LEN ; + +if (rv ==0 ) +return -EOPNOTSUPP ; +return rv; +} + +static void ath6k_get_stats (struct net_device *dev, +struct ethtool_stats *stats, +u64 *data) +{ +struct ath6kl_vif *vif =netdev_priv (dev); +struct ath6kl *ar = vif->ar; +int i =0 ; +struct target_stats *tgt_stats; + +memset (data,0 ,sizeof (u64) *ATH6K_STATS_LEN ); + +ath6k_read_tgt_stats (ar, vif); + + tgt_stats = &vif->target_stats; + + data[i++] = tgt_stats->tx_ucast_pkt + tgt_stats->tx_bcast_pkt; + data[i++] = tgt_stats->tx_ucast_byte + tgt_stats->tx_bcast_byte; + data[i++] = tgt_stats->rx_ucast_pkt + tgt_stats->rx_bcast_pkt; + data[i++] = tgt_stats->rx_ucast_byte + tgt_stats->rx_bcast_byte; + + data[i++] = tgt_stats->tx_ucast_pkt; + data[i++] = tgt_stats->tx_bcast_pkt; + data[i++] = tgt_stats->tx_ucast_byte; + data[i++] = tgt_stats->tx_bcast_byte; + data[i++] = tgt_stats->tx_rts_success_cnt; + data[i++] = tgt_stats->tx_err; + data[i++] = tgt_stats->tx_fail_cnt; + data[i++] = tgt_stats->tx_retry_cnt; + data[i++] = tgt_stats->tx_mult_retry_cnt; + data[i++] = tgt_stats->tx_rts_fail_cnt; + data[i++] = tgt_stats->tkip_cnter_measures_invoked; + + data[i++] = tgt_stats->rx_ucast_pkt; + data[i++] = tgt_stats->rx_ucast_rate; + data[i++] = tgt_stats->rx_bcast_pkt; + data[i++] = tgt_stats->rx_ucast_byte; + data[i++] = tgt_stats->rx_bcast_byte; + data[i++] = tgt_stats->rx_frgment_pkt; + data[i++] = tgt_stats->rx_err; + data[i++] = tgt_stats->rx_crc_err; + data[i++] = tgt_stats->rx_key_cache_miss; + data[i++] = tgt_stats->rx_decrypt_err; + data[i++] = tgt_stats->rx_dupl_frame; + data[i++] = tgt_stats->tkip_local_mic_fail; + data[i++] = tgt_stats->tkip_fmt_err; + data[i++] = tgt_stats->ccmp_fmt_err; + data[i++] = tgt_stats->ccmp_replays; + + data[i++] = tgt_stats->cs_bmiss_cnt; + data[i++] = tgt_stats->cs_connect_cnt; + data[i++] = tgt_stats->cs_discon_cnt; + data[i++] = tgt_stats->cs_ave_beacon_rssi; + data[i++] = tgt_stats->arp_received; + data[i++] = tgt_stats->arp_matched; + data[i++] = tgt_stats->arp_replied; + +if (i !=ATH6K_STATS_LEN ) { +WARN_ON_ONCE (1 ); +ath6kl_err ("ethtool stats error, i: %d STATS_LEN: %d\n" , + i, (int )ATH6K_STATS_LEN ); + } +} + +/* These stats are per NIC, not really per vdev, so we just ignore dev. */ +static void ath6k_get_strings (struct net_device *dev,u32 sset,u8 *data) +{ +int sz_sta_stats =0 ; + +if (sset ==ETH_SS_STATS ) { + sz_sta_stats =sizeof (ath6k_gstrings_sta_stats); +memcpy (data, ath6k_gstrings_sta_stats, sz_sta_stats); + } +} + +static const struct ethtool_ops ath6k_ethtool_ops = { + .get_drvinfo = cfg80211_get_drvinfo, + .get_link = ethtool_op_get_link, + .get_strings = ath6k_get_strings, + .get_ethtool_stats = ath6k_get_stats, + .get_sset_count = ath6k_get_sset_count, +}; + struct wireless_dev *ath6kl_interface_add(struct ath6kl *ar, const char *name, unsigned char name_assign_type, enum nl80211_iftype type,
@@ -3690,6 +3811,8 @@ struct wireless_dev *ath6kl_interface_add(struct ath6kl *ar, const char *name,if (ath6kl_cfg80211_vif_init (vif)) goto err; +netdev_set_default_ethtool_ops (ndev, &ath6k_ethtool_ops); +if (register_netdevice (ndev)) goto err;
Signature · 1 line
2.4.3
Quoted 6 lines · [email protected] writes:
From: Ben Greear <[email protected]>
This will allow us to call it from elsewhere when implementing ethtool stats.
Signed-off-by Ben Greear <[email protected]>
I'll do s/ath6k/ath6kl/ (manually) for both patches.
Signature · 1 line
Kalle Valo
Quoted 10 lines · Kalle Valo
Quoted 6 lines · [email protected] writes:
From: Ben Greear <[email protected]>
This will allow us to call it from elsewhere when implementing ethtool stats.
Signed-off-by Ben Greear <[email protected]>I'll do s/ath6k/ath6kl/ (manually) for both patches.
Thank you for fixing & applying the patches.
Signature · 2 lines
Ben Greear <[email protected]> Candela Technologies Inc http://www.candelatech.com
Quoted 6 lines · [email protected] writes:
From: Ben Greear <[email protected]>
This will allow us to call it from elsewhere when implementing ethtool stats.
Signed-off-by Ben Greear <[email protected]>
Both patches applied, thanks.
Signature · 1 line
Kalle Valo