diff options
-rw-r--r-- | drivers/net/wireless/ath/ath9k/hif_usb.c | 8 | ||||
-rw-r--r-- | drivers/net/wireless/ath/ath9k/htc.h | 14 | ||||
-rw-r--r-- | drivers/net/wireless/ath/ath9k/htc_drv_debug.c | 81 | ||||
-rw-r--r-- | drivers/net/wireless/ath/ath9k/htc_drv_main.c | 6 |
4 files changed, 108 insertions, 1 deletions
diff --git a/drivers/net/wireless/ath/ath9k/hif_usb.c b/drivers/net/wireless/ath/ath9k/hif_usb.c index f5dda84176c3..9e582e14da74 100644 --- a/drivers/net/wireless/ath/ath9k/hif_usb.c +++ b/drivers/net/wireless/ath/ath9k/hif_usb.c | |||
@@ -234,10 +234,15 @@ static inline void ath9k_skb_queue_complete(struct hif_device_usb *hif_dev, | |||
234 | struct sk_buff *skb; | 234 | struct sk_buff *skb; |
235 | 235 | ||
236 | while ((skb = __skb_dequeue(queue)) != NULL) { | 236 | while ((skb = __skb_dequeue(queue)) != NULL) { |
237 | #ifdef CONFIG_ATH9K_HTC_DEBUGFS | ||
238 | int ln = skb->len; | ||
239 | #endif | ||
237 | ath9k_htc_txcompletion_cb(hif_dev->htc_handle, | 240 | ath9k_htc_txcompletion_cb(hif_dev->htc_handle, |
238 | skb, txok); | 241 | skb, txok); |
239 | if (txok) | 242 | if (txok) { |
240 | TX_STAT_INC(skb_success); | 243 | TX_STAT_INC(skb_success); |
244 | TX_STAT_ADD(skb_success_bytes, ln); | ||
245 | } | ||
241 | else | 246 | else |
242 | TX_STAT_INC(skb_failed); | 247 | TX_STAT_INC(skb_failed); |
243 | } | 248 | } |
@@ -620,6 +625,7 @@ static void ath9k_hif_usb_rx_stream(struct hif_device_usb *hif_dev, | |||
620 | 625 | ||
621 | err: | 626 | err: |
622 | for (i = 0; i < pool_index; i++) { | 627 | for (i = 0; i < pool_index; i++) { |
628 | RX_STAT_ADD(skb_completed_bytes, skb_pool[i]->len); | ||
623 | ath9k_htc_rx_msg(hif_dev->htc_handle, skb_pool[i], | 629 | ath9k_htc_rx_msg(hif_dev->htc_handle, skb_pool[i], |
624 | skb_pool[i]->len, USB_WLAN_RX_PIPE); | 630 | skb_pool[i]->len, USB_WLAN_RX_PIPE); |
625 | RX_STAT_INC(skb_completed); | 631 | RX_STAT_INC(skb_completed); |
diff --git a/drivers/net/wireless/ath/ath9k/htc.h b/drivers/net/wireless/ath/ath9k/htc.h index 6bd556d203ae..055d7c25e090 100644 --- a/drivers/net/wireless/ath/ath9k/htc.h +++ b/drivers/net/wireless/ath/ath9k/htc.h | |||
@@ -324,7 +324,9 @@ static inline struct ath9k_htc_tx_ctl *HTC_SKB_CB(struct sk_buff *skb) | |||
324 | #ifdef CONFIG_ATH9K_HTC_DEBUGFS | 324 | #ifdef CONFIG_ATH9K_HTC_DEBUGFS |
325 | 325 | ||
326 | #define TX_STAT_INC(c) (hif_dev->htc_handle->drv_priv->debug.tx_stats.c++) | 326 | #define TX_STAT_INC(c) (hif_dev->htc_handle->drv_priv->debug.tx_stats.c++) |
327 | #define TX_STAT_ADD(c, a) (hif_dev->htc_handle->drv_priv->debug.tx_stats.c += a) | ||
327 | #define RX_STAT_INC(c) (hif_dev->htc_handle->drv_priv->debug.rx_stats.c++) | 328 | #define RX_STAT_INC(c) (hif_dev->htc_handle->drv_priv->debug.rx_stats.c++) |
329 | #define RX_STAT_ADD(c, a) (hif_dev->htc_handle->drv_priv->debug.rx_stats.c += a) | ||
328 | #define CAB_STAT_INC priv->debug.tx_stats.cab_queued++ | 330 | #define CAB_STAT_INC priv->debug.tx_stats.cab_queued++ |
329 | 331 | ||
330 | #define TX_QSTAT_INC(q) (priv->debug.tx_stats.queue_stats[q]++) | 332 | #define TX_QSTAT_INC(q) (priv->debug.tx_stats.queue_stats[q]++) |
@@ -337,6 +339,7 @@ struct ath_tx_stats { | |||
337 | u32 buf_completed; | 339 | u32 buf_completed; |
338 | u32 skb_queued; | 340 | u32 skb_queued; |
339 | u32 skb_success; | 341 | u32 skb_success; |
342 | u32 skb_success_bytes; | ||
340 | u32 skb_failed; | 343 | u32 skb_failed; |
341 | u32 cab_queued; | 344 | u32 cab_queued; |
342 | u32 queue_stats[IEEE80211_NUM_ACS]; | 345 | u32 queue_stats[IEEE80211_NUM_ACS]; |
@@ -345,6 +348,7 @@ struct ath_tx_stats { | |||
345 | struct ath_rx_stats { | 348 | struct ath_rx_stats { |
346 | u32 skb_allocated; | 349 | u32 skb_allocated; |
347 | u32 skb_completed; | 350 | u32 skb_completed; |
351 | u32 skb_completed_bytes; | ||
348 | u32 skb_dropped; | 352 | u32 skb_dropped; |
349 | u32 err_crc; | 353 | u32 err_crc; |
350 | u32 err_decrypt_crc; | 354 | u32 err_decrypt_crc; |
@@ -362,10 +366,20 @@ struct ath9k_debug { | |||
362 | struct ath_rx_stats rx_stats; | 366 | struct ath_rx_stats rx_stats; |
363 | }; | 367 | }; |
364 | 368 | ||
369 | void ath9k_htc_get_et_strings(struct ieee80211_hw *hw, | ||
370 | struct ieee80211_vif *vif, | ||
371 | u32 sset, u8 *data); | ||
372 | int ath9k_htc_get_et_sset_count(struct ieee80211_hw *hw, | ||
373 | struct ieee80211_vif *vif, int sset); | ||
374 | void ath9k_htc_get_et_stats(struct ieee80211_hw *hw, | ||
375 | struct ieee80211_vif *vif, | ||
376 | struct ethtool_stats *stats, u64 *data); | ||
365 | #else | 377 | #else |
366 | 378 | ||
367 | #define TX_STAT_INC(c) do { } while (0) | 379 | #define TX_STAT_INC(c) do { } while (0) |
380 | #define TX_STAT_ADD(c, a) do { } while (0) | ||
368 | #define RX_STAT_INC(c) do { } while (0) | 381 | #define RX_STAT_INC(c) do { } while (0) |
382 | #define RX_STAT_ADD(c, a) do { } while (0) | ||
369 | #define CAB_STAT_INC do { } while (0) | 383 | #define CAB_STAT_INC do { } while (0) |
370 | 384 | ||
371 | #define TX_QSTAT_INC(c) do { } while (0) | 385 | #define TX_QSTAT_INC(c) do { } while (0) |
diff --git a/drivers/net/wireless/ath/ath9k/htc_drv_debug.c b/drivers/net/wireless/ath/ath9k/htc_drv_debug.c index 632d13da43e2..7416d58a122c 100644 --- a/drivers/net/wireless/ath/ath9k/htc_drv_debug.c +++ b/drivers/net/wireless/ath/ath9k/htc_drv_debug.c | |||
@@ -902,6 +902,87 @@ static const struct file_operations fops_modal_eeprom = { | |||
902 | .llseek = default_llseek, | 902 | .llseek = default_llseek, |
903 | }; | 903 | }; |
904 | 904 | ||
905 | |||
906 | /* Ethtool support for get-stats */ | ||
907 | #define AMKSTR(nm) #nm "_BE", #nm "_BK", #nm "_VI", #nm "_VO" | ||
908 | static const char ath9k_htc_gstrings_stats[][ETH_GSTRING_LEN] = { | ||
909 | "tx_pkts_nic", | ||
910 | "tx_bytes_nic", | ||
911 | "rx_pkts_nic", | ||
912 | "rx_bytes_nic", | ||
913 | |||
914 | AMKSTR(d_tx_pkts), | ||
915 | |||
916 | "d_rx_crc_err", | ||
917 | "d_rx_decrypt_crc_err", | ||
918 | "d_rx_phy_err", | ||
919 | "d_rx_mic_err", | ||
920 | "d_rx_pre_delim_crc_err", | ||
921 | "d_rx_post_delim_crc_err", | ||
922 | "d_rx_decrypt_busy_err", | ||
923 | |||
924 | "d_rx_phyerr_radar", | ||
925 | "d_rx_phyerr_ofdm_timing", | ||
926 | "d_rx_phyerr_cck_timing", | ||
927 | |||
928 | }; | ||
929 | #define ATH9K_HTC_SSTATS_LEN ARRAY_SIZE(ath9k_htc_gstrings_stats) | ||
930 | |||
931 | void ath9k_htc_get_et_strings(struct ieee80211_hw *hw, | ||
932 | struct ieee80211_vif *vif, | ||
933 | u32 sset, u8 *data) | ||
934 | { | ||
935 | if (sset == ETH_SS_STATS) | ||
936 | memcpy(data, *ath9k_htc_gstrings_stats, | ||
937 | sizeof(ath9k_htc_gstrings_stats)); | ||
938 | } | ||
939 | |||
940 | int ath9k_htc_get_et_sset_count(struct ieee80211_hw *hw, | ||
941 | struct ieee80211_vif *vif, int sset) | ||
942 | { | ||
943 | if (sset == ETH_SS_STATS) | ||
944 | return ATH9K_HTC_SSTATS_LEN; | ||
945 | return 0; | ||
946 | } | ||
947 | |||
948 | #define STXBASE priv->debug.tx_stats | ||
949 | #define SRXBASE priv->debug.rx_stats | ||
950 | #define ASTXQ(a) \ | ||
951 | data[i++] = STXBASE.a[IEEE80211_AC_BE]; \ | ||
952 | data[i++] = STXBASE.a[IEEE80211_AC_BK]; \ | ||
953 | data[i++] = STXBASE.a[IEEE80211_AC_VI]; \ | ||
954 | data[i++] = STXBASE.a[IEEE80211_AC_VO] | ||
955 | |||
956 | void ath9k_htc_get_et_stats(struct ieee80211_hw *hw, | ||
957 | struct ieee80211_vif *vif, | ||
958 | struct ethtool_stats *stats, u64 *data) | ||
959 | { | ||
960 | struct ath9k_htc_priv *priv = hw->priv; | ||
961 | int i = 0; | ||
962 | |||
963 | data[i++] = STXBASE.skb_success; | ||
964 | data[i++] = STXBASE.skb_success_bytes; | ||
965 | data[i++] = SRXBASE.skb_completed; | ||
966 | data[i++] = SRXBASE.skb_completed_bytes; | ||
967 | |||
968 | ASTXQ(queue_stats); | ||
969 | |||
970 | data[i++] = SRXBASE.err_crc; | ||
971 | data[i++] = SRXBASE.err_decrypt_crc; | ||
972 | data[i++] = SRXBASE.err_phy; | ||
973 | data[i++] = SRXBASE.err_mic; | ||
974 | data[i++] = SRXBASE.err_pre_delim; | ||
975 | data[i++] = SRXBASE.err_post_delim; | ||
976 | data[i++] = SRXBASE.err_decrypt_busy; | ||
977 | |||
978 | data[i++] = SRXBASE.err_phy_stats[ATH9K_PHYERR_RADAR]; | ||
979 | data[i++] = SRXBASE.err_phy_stats[ATH9K_PHYERR_OFDM_TIMING]; | ||
980 | data[i++] = SRXBASE.err_phy_stats[ATH9K_PHYERR_CCK_TIMING]; | ||
981 | |||
982 | WARN_ON(i != ATH9K_HTC_SSTATS_LEN); | ||
983 | } | ||
984 | |||
985 | |||
905 | int ath9k_htc_init_debug(struct ath_hw *ah) | 986 | int ath9k_htc_init_debug(struct ath_hw *ah) |
906 | { | 987 | { |
907 | struct ath_common *common = ath9k_hw_common(ah); | 988 | struct ath_common *common = ath9k_hw_common(ah); |
diff --git a/drivers/net/wireless/ath/ath9k/htc_drv_main.c b/drivers/net/wireless/ath/ath9k/htc_drv_main.c index ef68857f9363..be6baf7f6510 100644 --- a/drivers/net/wireless/ath/ath9k/htc_drv_main.c +++ b/drivers/net/wireless/ath/ath9k/htc_drv_main.c | |||
@@ -1837,4 +1837,10 @@ struct ieee80211_ops ath9k_htc_ops = { | |||
1837 | .set_bitrate_mask = ath9k_htc_set_bitrate_mask, | 1837 | .set_bitrate_mask = ath9k_htc_set_bitrate_mask, |
1838 | .get_stats = ath9k_htc_get_stats, | 1838 | .get_stats = ath9k_htc_get_stats, |
1839 | .get_antenna = ath9k_htc_get_antenna, | 1839 | .get_antenna = ath9k_htc_get_antenna, |
1840 | |||
1841 | #ifdef CONFIG_ATH9K_HTC_DEBUGFS | ||
1842 | .get_et_sset_count = ath9k_htc_get_et_sset_count, | ||
1843 | .get_et_stats = ath9k_htc_get_et_stats, | ||
1844 | .get_et_strings = ath9k_htc_get_et_strings, | ||
1845 | #endif | ||
1840 | }; | 1846 | }; |