18c2ecf20Sopenharmony_ci/* 28c2ecf20Sopenharmony_ci * Copyright (c) 2008-2011 Atheros Communications Inc. 38c2ecf20Sopenharmony_ci * 48c2ecf20Sopenharmony_ci * Permission to use, copy, modify, and/or distribute this software for any 58c2ecf20Sopenharmony_ci * purpose with or without fee is hereby granted, provided that the above 68c2ecf20Sopenharmony_ci * copyright notice and this permission notice appear in all copies. 78c2ecf20Sopenharmony_ci * 88c2ecf20Sopenharmony_ci * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 98c2ecf20Sopenharmony_ci * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 108c2ecf20Sopenharmony_ci * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 118c2ecf20Sopenharmony_ci * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 128c2ecf20Sopenharmony_ci * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 138c2ecf20Sopenharmony_ci * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 148c2ecf20Sopenharmony_ci * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 158c2ecf20Sopenharmony_ci */ 168c2ecf20Sopenharmony_ci 178c2ecf20Sopenharmony_ci#ifndef DEBUG_H 188c2ecf20Sopenharmony_ci#define DEBUG_H 198c2ecf20Sopenharmony_ci 208c2ecf20Sopenharmony_ci#include "hw.h" 218c2ecf20Sopenharmony_ci#include "dfs_debug.h" 228c2ecf20Sopenharmony_ci 238c2ecf20Sopenharmony_cistruct ath_txq; 248c2ecf20Sopenharmony_cistruct ath_buf; 258c2ecf20Sopenharmony_cistruct fft_sample_tlv; 268c2ecf20Sopenharmony_ci 278c2ecf20Sopenharmony_ci#ifdef CONFIG_ATH9K_DEBUGFS 288c2ecf20Sopenharmony_ci#define TX_STAT_INC(sc, q, c) do { (sc)->debug.stats.txstats[q].c++; } while (0) 298c2ecf20Sopenharmony_ci#define RX_STAT_INC(sc, c) do { (sc)->debug.stats.rxstats.c++; } while (0) 308c2ecf20Sopenharmony_ci#define RESET_STAT_INC(sc, type) do { (sc)->debug.stats.reset[type]++; } while (0) 318c2ecf20Sopenharmony_ci#define ANT_STAT_INC(sc, i, c) do { (sc)->debug.stats.ant_stats[i].c++; } while (0) 328c2ecf20Sopenharmony_ci#define ANT_LNA_INC(sc, i, c) do { (sc)->debug.stats.ant_stats[i].lna_recv_cnt[c]++; } while (0) 338c2ecf20Sopenharmony_ci#else 348c2ecf20Sopenharmony_ci#define TX_STAT_INC(sc, q, c) do { (void)(sc); } while (0) 358c2ecf20Sopenharmony_ci#define RX_STAT_INC(sc, c) do { (void)(sc); } while (0) 368c2ecf20Sopenharmony_ci#define RESET_STAT_INC(sc, type) do { (void)(sc); } while (0) 378c2ecf20Sopenharmony_ci#define ANT_STAT_INC(sc, i, c) do { (void)(sc); } while (0) 388c2ecf20Sopenharmony_ci#define ANT_LNA_INC(sc, i, c) do { (void)(sc); } while (0) 398c2ecf20Sopenharmony_ci#endif 408c2ecf20Sopenharmony_ci 418c2ecf20Sopenharmony_cienum ath_reset_type { 428c2ecf20Sopenharmony_ci RESET_TYPE_BB_HANG, 438c2ecf20Sopenharmony_ci RESET_TYPE_BB_WATCHDOG, 448c2ecf20Sopenharmony_ci RESET_TYPE_FATAL_INT, 458c2ecf20Sopenharmony_ci RESET_TYPE_TX_ERROR, 468c2ecf20Sopenharmony_ci RESET_TYPE_TX_GTT, 478c2ecf20Sopenharmony_ci RESET_TYPE_TX_HANG, 488c2ecf20Sopenharmony_ci RESET_TYPE_PLL_HANG, 498c2ecf20Sopenharmony_ci RESET_TYPE_MAC_HANG, 508c2ecf20Sopenharmony_ci RESET_TYPE_BEACON_STUCK, 518c2ecf20Sopenharmony_ci RESET_TYPE_MCI, 528c2ecf20Sopenharmony_ci RESET_TYPE_CALIBRATION, 538c2ecf20Sopenharmony_ci RESET_TX_DMA_ERROR, 548c2ecf20Sopenharmony_ci RESET_RX_DMA_ERROR, 558c2ecf20Sopenharmony_ci __RESET_TYPE_MAX 568c2ecf20Sopenharmony_ci}; 578c2ecf20Sopenharmony_ci 588c2ecf20Sopenharmony_ci#ifdef CONFIG_ATH9K_DEBUGFS 598c2ecf20Sopenharmony_ci 608c2ecf20Sopenharmony_ci/** 618c2ecf20Sopenharmony_ci * struct ath_interrupt_stats - Contains statistics about interrupts 628c2ecf20Sopenharmony_ci * @total: Total no. of interrupts generated so far 638c2ecf20Sopenharmony_ci * @rxok: RX with no errors 648c2ecf20Sopenharmony_ci * @rxlp: RX with low priority RX 658c2ecf20Sopenharmony_ci * @rxhp: RX with high priority, uapsd only 668c2ecf20Sopenharmony_ci * @rxeol: RX with no more RXDESC available 678c2ecf20Sopenharmony_ci * @rxorn: RX FIFO overrun 688c2ecf20Sopenharmony_ci * @txok: TX completed at the requested rate 698c2ecf20Sopenharmony_ci * @txurn: TX FIFO underrun 708c2ecf20Sopenharmony_ci * @mib: MIB regs reaching its threshold 718c2ecf20Sopenharmony_ci * @rxphyerr: RX with phy errors 728c2ecf20Sopenharmony_ci * @rx_keycache_miss: RX with key cache misses 738c2ecf20Sopenharmony_ci * @swba: Software Beacon Alert 748c2ecf20Sopenharmony_ci * @bmiss: Beacon Miss 758c2ecf20Sopenharmony_ci * @bnr: Beacon Not Ready 768c2ecf20Sopenharmony_ci * @cst: Carrier Sense TImeout 778c2ecf20Sopenharmony_ci * @gtt: Global TX Timeout 788c2ecf20Sopenharmony_ci * @tim: RX beacon TIM occurrence 798c2ecf20Sopenharmony_ci * @cabend: RX End of CAB traffic 808c2ecf20Sopenharmony_ci * @dtimsync: DTIM sync lossage 818c2ecf20Sopenharmony_ci * @dtim: RX Beacon with DTIM 828c2ecf20Sopenharmony_ci * @bb_watchdog: Baseband watchdog 838c2ecf20Sopenharmony_ci * @tsfoor: TSF out of range, indicates that the corrected TSF received 848c2ecf20Sopenharmony_ci * from a beacon differs from the PCU's internal TSF by more than a 858c2ecf20Sopenharmony_ci * (programmable) threshold 868c2ecf20Sopenharmony_ci * @local_timeout: Internal bus timeout. 878c2ecf20Sopenharmony_ci * @mci: MCI interrupt, specific to MCI based BTCOEX chipsets 888c2ecf20Sopenharmony_ci * @gen_timer: Generic hardware timer interrupt 898c2ecf20Sopenharmony_ci */ 908c2ecf20Sopenharmony_cistruct ath_interrupt_stats { 918c2ecf20Sopenharmony_ci u32 total; 928c2ecf20Sopenharmony_ci u32 rxok; 938c2ecf20Sopenharmony_ci u32 rxlp; 948c2ecf20Sopenharmony_ci u32 rxhp; 958c2ecf20Sopenharmony_ci u32 rxeol; 968c2ecf20Sopenharmony_ci u32 rxorn; 978c2ecf20Sopenharmony_ci u32 txok; 988c2ecf20Sopenharmony_ci u32 txeol; 998c2ecf20Sopenharmony_ci u32 txurn; 1008c2ecf20Sopenharmony_ci u32 mib; 1018c2ecf20Sopenharmony_ci u32 rxphyerr; 1028c2ecf20Sopenharmony_ci u32 rx_keycache_miss; 1038c2ecf20Sopenharmony_ci u32 swba; 1048c2ecf20Sopenharmony_ci u32 bmiss; 1058c2ecf20Sopenharmony_ci u32 bnr; 1068c2ecf20Sopenharmony_ci u32 cst; 1078c2ecf20Sopenharmony_ci u32 gtt; 1088c2ecf20Sopenharmony_ci u32 tim; 1098c2ecf20Sopenharmony_ci u32 cabend; 1108c2ecf20Sopenharmony_ci u32 dtimsync; 1118c2ecf20Sopenharmony_ci u32 dtim; 1128c2ecf20Sopenharmony_ci u32 bb_watchdog; 1138c2ecf20Sopenharmony_ci u32 tsfoor; 1148c2ecf20Sopenharmony_ci u32 mci; 1158c2ecf20Sopenharmony_ci u32 gen_timer; 1168c2ecf20Sopenharmony_ci 1178c2ecf20Sopenharmony_ci /* Sync-cause stats */ 1188c2ecf20Sopenharmony_ci u32 sync_cause_all; 1198c2ecf20Sopenharmony_ci u32 sync_rtc_irq; 1208c2ecf20Sopenharmony_ci u32 sync_mac_irq; 1218c2ecf20Sopenharmony_ci u32 eeprom_illegal_access; 1228c2ecf20Sopenharmony_ci u32 apb_timeout; 1238c2ecf20Sopenharmony_ci u32 pci_mode_conflict; 1248c2ecf20Sopenharmony_ci u32 host1_fatal; 1258c2ecf20Sopenharmony_ci u32 host1_perr; 1268c2ecf20Sopenharmony_ci u32 trcv_fifo_perr; 1278c2ecf20Sopenharmony_ci u32 radm_cpl_ep; 1288c2ecf20Sopenharmony_ci u32 radm_cpl_dllp_abort; 1298c2ecf20Sopenharmony_ci u32 radm_cpl_tlp_abort; 1308c2ecf20Sopenharmony_ci u32 radm_cpl_ecrc_err; 1318c2ecf20Sopenharmony_ci u32 radm_cpl_timeout; 1328c2ecf20Sopenharmony_ci u32 local_timeout; 1338c2ecf20Sopenharmony_ci u32 pm_access; 1348c2ecf20Sopenharmony_ci u32 mac_awake; 1358c2ecf20Sopenharmony_ci u32 mac_asleep; 1368c2ecf20Sopenharmony_ci u32 mac_sleep_access; 1378c2ecf20Sopenharmony_ci}; 1388c2ecf20Sopenharmony_ci 1398c2ecf20Sopenharmony_ci 1408c2ecf20Sopenharmony_ci/** 1418c2ecf20Sopenharmony_ci * struct ath_tx_stats - Statistics about TX 1428c2ecf20Sopenharmony_ci * @tx_pkts_all: No. of total frames transmitted, including ones that 1438c2ecf20Sopenharmony_ci may have had errors. 1448c2ecf20Sopenharmony_ci * @tx_bytes_all: No. of total bytes transmitted, including ones that 1458c2ecf20Sopenharmony_ci may have had errors. 1468c2ecf20Sopenharmony_ci * @queued: Total MPDUs (non-aggr) queued 1478c2ecf20Sopenharmony_ci * @completed: Total MPDUs (non-aggr) completed 1488c2ecf20Sopenharmony_ci * @a_aggr: Total no. of aggregates queued 1498c2ecf20Sopenharmony_ci * @a_queued_hw: Total AMPDUs queued to hardware 1508c2ecf20Sopenharmony_ci * @a_completed: Total AMPDUs completed 1518c2ecf20Sopenharmony_ci * @a_retries: No. of AMPDUs retried (SW) 1528c2ecf20Sopenharmony_ci * @a_xretries: No. of AMPDUs dropped due to xretries 1538c2ecf20Sopenharmony_ci * @txerr_filtered: No. of frames with TXERR_FILT flag set. 1548c2ecf20Sopenharmony_ci * @fifo_underrun: FIFO underrun occurrences 1558c2ecf20Sopenharmony_ci Valid only for: 1568c2ecf20Sopenharmony_ci - non-aggregate condition. 1578c2ecf20Sopenharmony_ci - first packet of aggregate. 1588c2ecf20Sopenharmony_ci * @xtxop: No. of frames filtered because of TXOP limit 1598c2ecf20Sopenharmony_ci * @timer_exp: Transmit timer expiry 1608c2ecf20Sopenharmony_ci * @desc_cfg_err: Descriptor configuration errors 1618c2ecf20Sopenharmony_ci * @data_urn: TX data underrun errors 1628c2ecf20Sopenharmony_ci * @delim_urn: TX delimiter underrun errors 1638c2ecf20Sopenharmony_ci * @puttxbuf: Number of times hardware was given txbuf to write. 1648c2ecf20Sopenharmony_ci * @txstart: Number of times hardware was told to start tx. 1658c2ecf20Sopenharmony_ci * @txprocdesc: Number of times tx descriptor was processed 1668c2ecf20Sopenharmony_ci * @txfailed: Out-of-memory or other errors in xmit path. 1678c2ecf20Sopenharmony_ci */ 1688c2ecf20Sopenharmony_cistruct ath_tx_stats { 1698c2ecf20Sopenharmony_ci u32 tx_pkts_all; 1708c2ecf20Sopenharmony_ci u32 tx_bytes_all; 1718c2ecf20Sopenharmony_ci u32 queued; 1728c2ecf20Sopenharmony_ci u32 completed; 1738c2ecf20Sopenharmony_ci u32 xretries; 1748c2ecf20Sopenharmony_ci u32 a_aggr; 1758c2ecf20Sopenharmony_ci u32 a_queued_hw; 1768c2ecf20Sopenharmony_ci u32 a_completed; 1778c2ecf20Sopenharmony_ci u32 a_retries; 1788c2ecf20Sopenharmony_ci u32 a_xretries; 1798c2ecf20Sopenharmony_ci u32 txerr_filtered; 1808c2ecf20Sopenharmony_ci u32 fifo_underrun; 1818c2ecf20Sopenharmony_ci u32 xtxop; 1828c2ecf20Sopenharmony_ci u32 timer_exp; 1838c2ecf20Sopenharmony_ci u32 desc_cfg_err; 1848c2ecf20Sopenharmony_ci u32 data_underrun; 1858c2ecf20Sopenharmony_ci u32 delim_underrun; 1868c2ecf20Sopenharmony_ci u32 puttxbuf; 1878c2ecf20Sopenharmony_ci u32 txstart; 1888c2ecf20Sopenharmony_ci u32 txprocdesc; 1898c2ecf20Sopenharmony_ci u32 txfailed; 1908c2ecf20Sopenharmony_ci}; 1918c2ecf20Sopenharmony_ci 1928c2ecf20Sopenharmony_ci/* 1938c2ecf20Sopenharmony_ci * Various utility macros to print TX/Queue counters. 1948c2ecf20Sopenharmony_ci */ 1958c2ecf20Sopenharmony_ci#define PR_QNUM(_n) sc->tx.txq_map[_n]->axq_qnum 1968c2ecf20Sopenharmony_ci#define TXSTATS sc->debug.stats.txstats 1978c2ecf20Sopenharmony_ci#define PR(str, elem) \ 1988c2ecf20Sopenharmony_ci do { \ 1998c2ecf20Sopenharmony_ci seq_printf(file, "%s%13u%11u%10u%10u\n", str, \ 2008c2ecf20Sopenharmony_ci TXSTATS[PR_QNUM(IEEE80211_AC_BE)].elem,\ 2018c2ecf20Sopenharmony_ci TXSTATS[PR_QNUM(IEEE80211_AC_BK)].elem,\ 2028c2ecf20Sopenharmony_ci TXSTATS[PR_QNUM(IEEE80211_AC_VI)].elem,\ 2038c2ecf20Sopenharmony_ci TXSTATS[PR_QNUM(IEEE80211_AC_VO)].elem); \ 2048c2ecf20Sopenharmony_ci } while(0) 2058c2ecf20Sopenharmony_ci 2068c2ecf20Sopenharmony_cistruct ath_rx_rate_stats { 2078c2ecf20Sopenharmony_ci struct { 2088c2ecf20Sopenharmony_ci u32 ht20_cnt; 2098c2ecf20Sopenharmony_ci u32 ht40_cnt; 2108c2ecf20Sopenharmony_ci u32 sgi_cnt; 2118c2ecf20Sopenharmony_ci u32 lgi_cnt; 2128c2ecf20Sopenharmony_ci } ht_stats[24]; 2138c2ecf20Sopenharmony_ci 2148c2ecf20Sopenharmony_ci struct { 2158c2ecf20Sopenharmony_ci u32 ofdm_cnt; 2168c2ecf20Sopenharmony_ci } ofdm_stats[8]; 2178c2ecf20Sopenharmony_ci 2188c2ecf20Sopenharmony_ci struct { 2198c2ecf20Sopenharmony_ci u32 cck_lp_cnt; 2208c2ecf20Sopenharmony_ci u32 cck_sp_cnt; 2218c2ecf20Sopenharmony_ci } cck_stats[4]; 2228c2ecf20Sopenharmony_ci}; 2238c2ecf20Sopenharmony_ci 2248c2ecf20Sopenharmony_cistruct ath_airtime_stats { 2258c2ecf20Sopenharmony_ci u32 rx_airtime; 2268c2ecf20Sopenharmony_ci u32 tx_airtime; 2278c2ecf20Sopenharmony_ci}; 2288c2ecf20Sopenharmony_ci 2298c2ecf20Sopenharmony_ci#define ANT_MAIN 0 2308c2ecf20Sopenharmony_ci#define ANT_ALT 1 2318c2ecf20Sopenharmony_ci 2328c2ecf20Sopenharmony_cistruct ath_antenna_stats { 2338c2ecf20Sopenharmony_ci u32 recv_cnt; 2348c2ecf20Sopenharmony_ci u32 rssi_avg; 2358c2ecf20Sopenharmony_ci u32 lna_recv_cnt[4]; 2368c2ecf20Sopenharmony_ci u32 lna_attempt_cnt[4]; 2378c2ecf20Sopenharmony_ci}; 2388c2ecf20Sopenharmony_ci 2398c2ecf20Sopenharmony_cistruct ath_stats { 2408c2ecf20Sopenharmony_ci struct ath_interrupt_stats istats; 2418c2ecf20Sopenharmony_ci struct ath_tx_stats txstats[ATH9K_NUM_TX_QUEUES]; 2428c2ecf20Sopenharmony_ci struct ath_rx_stats rxstats; 2438c2ecf20Sopenharmony_ci struct ath_dfs_stats dfs_stats; 2448c2ecf20Sopenharmony_ci struct ath_antenna_stats ant_stats[2]; 2458c2ecf20Sopenharmony_ci u32 reset[__RESET_TYPE_MAX]; 2468c2ecf20Sopenharmony_ci}; 2478c2ecf20Sopenharmony_ci 2488c2ecf20Sopenharmony_cistruct ath9k_debug { 2498c2ecf20Sopenharmony_ci struct dentry *debugfs_phy; 2508c2ecf20Sopenharmony_ci u32 regidx; 2518c2ecf20Sopenharmony_ci struct ath_stats stats; 2528c2ecf20Sopenharmony_ci}; 2538c2ecf20Sopenharmony_ci 2548c2ecf20Sopenharmony_ciint ath9k_init_debug(struct ath_hw *ah); 2558c2ecf20Sopenharmony_civoid ath9k_deinit_debug(struct ath_softc *sc); 2568c2ecf20Sopenharmony_ci 2578c2ecf20Sopenharmony_civoid ath_debug_stat_interrupt(struct ath_softc *sc, enum ath9k_int status); 2588c2ecf20Sopenharmony_civoid ath_debug_stat_tx(struct ath_softc *sc, struct ath_buf *bf, 2598c2ecf20Sopenharmony_ci struct ath_tx_status *ts, struct ath_txq *txq, 2608c2ecf20Sopenharmony_ci unsigned int flags); 2618c2ecf20Sopenharmony_civoid ath_debug_stat_rx(struct ath_softc *sc, struct ath_rx_status *rs); 2628c2ecf20Sopenharmony_ciint ath9k_get_et_sset_count(struct ieee80211_hw *hw, 2638c2ecf20Sopenharmony_ci struct ieee80211_vif *vif, int sset); 2648c2ecf20Sopenharmony_civoid ath9k_get_et_stats(struct ieee80211_hw *hw, 2658c2ecf20Sopenharmony_ci struct ieee80211_vif *vif, 2668c2ecf20Sopenharmony_ci struct ethtool_stats *stats, u64 *data); 2678c2ecf20Sopenharmony_civoid ath9k_get_et_strings(struct ieee80211_hw *hw, 2688c2ecf20Sopenharmony_ci struct ieee80211_vif *vif, 2698c2ecf20Sopenharmony_ci u32 sset, u8 *data); 2708c2ecf20Sopenharmony_civoid ath9k_sta_add_debugfs(struct ieee80211_hw *hw, 2718c2ecf20Sopenharmony_ci struct ieee80211_vif *vif, 2728c2ecf20Sopenharmony_ci struct ieee80211_sta *sta, 2738c2ecf20Sopenharmony_ci struct dentry *dir); 2748c2ecf20Sopenharmony_civoid ath9k_debug_stat_ant(struct ath_softc *sc, 2758c2ecf20Sopenharmony_ci struct ath_hw_antcomb_conf *div_ant_conf, 2768c2ecf20Sopenharmony_ci int main_rssi_avg, int alt_rssi_avg); 2778c2ecf20Sopenharmony_civoid ath9k_debug_sync_cause(struct ath_softc *sc, u32 sync_cause); 2788c2ecf20Sopenharmony_ci 2798c2ecf20Sopenharmony_ci#else 2808c2ecf20Sopenharmony_ci 2818c2ecf20Sopenharmony_cistatic inline int ath9k_init_debug(struct ath_hw *ah) 2828c2ecf20Sopenharmony_ci{ 2838c2ecf20Sopenharmony_ci return 0; 2848c2ecf20Sopenharmony_ci} 2858c2ecf20Sopenharmony_ci 2868c2ecf20Sopenharmony_cistatic inline void ath9k_deinit_debug(struct ath_softc *sc) 2878c2ecf20Sopenharmony_ci{ 2888c2ecf20Sopenharmony_ci} 2898c2ecf20Sopenharmony_cistatic inline void ath_debug_stat_interrupt(struct ath_softc *sc, 2908c2ecf20Sopenharmony_ci enum ath9k_int status) 2918c2ecf20Sopenharmony_ci{ 2928c2ecf20Sopenharmony_ci} 2938c2ecf20Sopenharmony_cistatic inline void ath_debug_stat_tx(struct ath_softc *sc, 2948c2ecf20Sopenharmony_ci struct ath_buf *bf, 2958c2ecf20Sopenharmony_ci struct ath_tx_status *ts, 2968c2ecf20Sopenharmony_ci struct ath_txq *txq, 2978c2ecf20Sopenharmony_ci unsigned int flags) 2988c2ecf20Sopenharmony_ci{ 2998c2ecf20Sopenharmony_ci} 3008c2ecf20Sopenharmony_cistatic inline void ath_debug_stat_rx(struct ath_softc *sc, 3018c2ecf20Sopenharmony_ci struct ath_rx_status *rs) 3028c2ecf20Sopenharmony_ci{ 3038c2ecf20Sopenharmony_ci} 3048c2ecf20Sopenharmony_cistatic inline void ath9k_debug_stat_ant(struct ath_softc *sc, 3058c2ecf20Sopenharmony_ci struct ath_hw_antcomb_conf *div_ant_conf, 3068c2ecf20Sopenharmony_ci int main_rssi_avg, int alt_rssi_avg) 3078c2ecf20Sopenharmony_ci{ 3088c2ecf20Sopenharmony_ci 3098c2ecf20Sopenharmony_ci} 3108c2ecf20Sopenharmony_ci 3118c2ecf20Sopenharmony_cistatic inline void 3128c2ecf20Sopenharmony_ciath9k_debug_sync_cause(struct ath_softc *sc, u32 sync_cause) 3138c2ecf20Sopenharmony_ci{ 3148c2ecf20Sopenharmony_ci} 3158c2ecf20Sopenharmony_ci 3168c2ecf20Sopenharmony_ci#endif /* CONFIG_ATH9K_DEBUGFS */ 3178c2ecf20Sopenharmony_ci 3188c2ecf20Sopenharmony_ci#ifdef CONFIG_ATH9K_STATION_STATISTICS 3198c2ecf20Sopenharmony_civoid ath_debug_rate_stats(struct ath_softc *sc, 3208c2ecf20Sopenharmony_ci struct ath_rx_status *rs, 3218c2ecf20Sopenharmony_ci struct sk_buff *skb); 3228c2ecf20Sopenharmony_ci#else 3238c2ecf20Sopenharmony_cistatic inline void ath_debug_rate_stats(struct ath_softc *sc, 3248c2ecf20Sopenharmony_ci struct ath_rx_status *rs, 3258c2ecf20Sopenharmony_ci struct sk_buff *skb) 3268c2ecf20Sopenharmony_ci{ 3278c2ecf20Sopenharmony_ci} 3288c2ecf20Sopenharmony_ci#endif /* CONFIG_ATH9K_STATION_STATISTICS */ 3298c2ecf20Sopenharmony_ci 3308c2ecf20Sopenharmony_ci#endif /* DEBUG_H */ 331