Linux Audio

Check our new training course

Loading...
Note: File does not exist in v3.1.
  1/* SPDX-License-Identifier: BSD-3-Clause-Clear */
  2/*
  3 * Copyright (c) 2018-2019 The Linux Foundation. All rights reserved.
  4 */
  5
  6#ifndef _ATH11K_DEBUG_H_
  7#define _ATH11K_DEBUG_H_
  8
  9#include "hal_tx.h"
 10#include "trace.h"
 11
 12#define ATH11K_TX_POWER_MAX_VAL	70
 13#define ATH11K_TX_POWER_MIN_VAL	0
 14
 15enum ath11k_debug_mask {
 16	ATH11K_DBG_AHB		= 0x00000001,
 17	ATH11K_DBG_WMI		= 0x00000002,
 18	ATH11K_DBG_HTC		= 0x00000004,
 19	ATH11K_DBG_DP_HTT	= 0x00000008,
 20	ATH11K_DBG_MAC		= 0x00000010,
 21	ATH11K_DBG_BOOT		= 0x00000020,
 22	ATH11K_DBG_QMI		= 0x00000040,
 23	ATH11K_DBG_DATA		= 0x00000080,
 24	ATH11K_DBG_MGMT		= 0x00000100,
 25	ATH11K_DBG_REG		= 0x00000200,
 26	ATH11K_DBG_TESTMODE	= 0x00000400,
 27	ATH11k_DBG_HAL		= 0x00000800,
 28	ATH11K_DBG_ANY		= 0xffffffff,
 29};
 30
 31/* htt_dbg_ext_stats_type */
 32enum ath11k_dbg_htt_ext_stats_type {
 33	ATH11K_DBG_HTT_EXT_STATS_RESET                      =  0,
 34	ATH11K_DBG_HTT_EXT_STATS_PDEV_TX                    =  1,
 35	ATH11K_DBG_HTT_EXT_STATS_PDEV_RX                    =  2,
 36	ATH11K_DBG_HTT_EXT_STATS_PDEV_TX_HWQ                =  3,
 37	ATH11K_DBG_HTT_EXT_STATS_PDEV_TX_SCHED              =  4,
 38	ATH11K_DBG_HTT_EXT_STATS_PDEV_ERROR                 =  5,
 39	ATH11K_DBG_HTT_EXT_STATS_PDEV_TQM                   =  6,
 40	ATH11K_DBG_HTT_EXT_STATS_TQM_CMDQ                   =  7,
 41	ATH11K_DBG_HTT_EXT_STATS_TX_DE_INFO                 =  8,
 42	ATH11K_DBG_HTT_EXT_STATS_PDEV_TX_RATE               =  9,
 43	ATH11K_DBG_HTT_EXT_STATS_PDEV_RX_RATE               =  10,
 44	ATH11K_DBG_HTT_EXT_STATS_PEER_INFO                  =  11,
 45	ATH11K_DBG_HTT_EXT_STATS_TX_SELFGEN_INFO            =  12,
 46	ATH11K_DBG_HTT_EXT_STATS_TX_MU_HWQ                  =  13,
 47	ATH11K_DBG_HTT_EXT_STATS_RING_IF_INFO               =  14,
 48	ATH11K_DBG_HTT_EXT_STATS_SRNG_INFO                  =  15,
 49	ATH11K_DBG_HTT_EXT_STATS_SFM_INFO                   =  16,
 50	ATH11K_DBG_HTT_EXT_STATS_PDEV_TX_MU                 =  17,
 51	ATH11K_DBG_HTT_EXT_STATS_ACTIVE_PEERS_LIST          =  18,
 52	ATH11K_DBG_HTT_EXT_STATS_PDEV_CCA_STATS             =  19,
 53	ATH11K_DBG_HTT_EXT_STATS_TWT_SESSIONS               =  20,
 54	ATH11K_DBG_HTT_EXT_STATS_REO_RESOURCE_STATS         =  21,
 55	ATH11K_DBG_HTT_EXT_STATS_TX_SOUNDING_INFO           =  22,
 56	ATH11K_DBG_HTT_EXT_STATS_PDEV_OBSS_PD_STATS	    =  23,
 57	ATH11K_DBG_HTT_EXT_STATS_RING_BACKPRESSURE_STATS    =  24,
 58
 59	/* keep this last */
 60	ATH11K_DBG_HTT_NUM_EXT_STATS,
 61};
 62
 63struct debug_htt_stats_req {
 64	bool done;
 65	u8 pdev_id;
 66	u8 type;
 67	u8 peer_addr[ETH_ALEN];
 68	struct completion cmpln;
 69	u32 buf_len;
 70	u8 buf[];
 71};
 72
 73struct ath_pktlog_hdr {
 74	u16 flags;
 75	u16 missed_cnt;
 76	u16 log_type;
 77	u16 size;
 78	u32 timestamp;
 79	u32 type_specific_data;
 80	u8 payload[];
 81};
 82
 83#define ATH11K_HTT_PEER_STATS_RESET BIT(16)
 84
 85#define ATH11K_HTT_STATS_BUF_SIZE (1024 * 512)
 86#define ATH11K_FW_STATS_BUF_SIZE (1024 * 1024)
 87
 88enum ath11k_pktlog_filter {
 89	ATH11K_PKTLOG_RX		= 0x000000001,
 90	ATH11K_PKTLOG_TX		= 0x000000002,
 91	ATH11K_PKTLOG_RCFIND		= 0x000000004,
 92	ATH11K_PKTLOG_RCUPDATE		= 0x000000008,
 93	ATH11K_PKTLOG_EVENT_SMART_ANT	= 0x000000020,
 94	ATH11K_PKTLOG_EVENT_SW		= 0x000000040,
 95	ATH11K_PKTLOG_ANY		= 0x00000006f,
 96};
 97
 98enum ath11k_pktlog_mode {
 99	ATH11K_PKTLOG_MODE_LITE = 1,
100	ATH11K_PKTLOG_MODE_FULL = 2,
101};
102
103enum ath11k_pktlog_enum {
104	ATH11K_PKTLOG_TYPE_TX_CTRL      = 1,
105	ATH11K_PKTLOG_TYPE_TX_STAT      = 2,
106	ATH11K_PKTLOG_TYPE_TX_MSDU_ID   = 3,
107	ATH11K_PKTLOG_TYPE_RX_STAT      = 5,
108	ATH11K_PKTLOG_TYPE_RC_FIND      = 6,
109	ATH11K_PKTLOG_TYPE_RC_UPDATE    = 7,
110	ATH11K_PKTLOG_TYPE_TX_VIRT_ADDR = 8,
111	ATH11K_PKTLOG_TYPE_RX_CBF       = 10,
112	ATH11K_PKTLOG_TYPE_RX_STATBUF   = 22,
113	ATH11K_PKTLOG_TYPE_PPDU_STATS   = 23,
114	ATH11K_PKTLOG_TYPE_LITE_RX      = 24,
115};
116
117enum ath11k_dbg_aggr_mode {
118	ATH11K_DBG_AGGR_MODE_AUTO,
119	ATH11K_DBG_AGGR_MODE_MANUAL,
120	ATH11K_DBG_AGGR_MODE_MAX,
121};
122
123__printf(2, 3) void ath11k_info(struct ath11k_base *ab, const char *fmt, ...);
124__printf(2, 3) void ath11k_err(struct ath11k_base *ab, const char *fmt, ...);
125__printf(2, 3) void ath11k_warn(struct ath11k_base *ab, const char *fmt, ...);
126
127extern unsigned int ath11k_debug_mask;
128
129#ifdef CONFIG_ATH11K_DEBUG
130__printf(3, 4) void __ath11k_dbg(struct ath11k_base *ab,
131				 enum ath11k_debug_mask mask,
132				 const char *fmt, ...);
133void ath11k_dbg_dump(struct ath11k_base *ab,
134		     enum ath11k_debug_mask mask,
135		     const char *msg, const char *prefix,
136		     const void *buf, size_t len);
137#else /* CONFIG_ATH11K_DEBUG */
138static inline int __ath11k_dbg(struct ath11k_base *ab,
139			       enum ath11k_debug_mask dbg_mask,
140			       const char *fmt, ...)
141{
142	return 0;
143}
144
145static inline void ath11k_dbg_dump(struct ath11k_base *ab,
146				   enum ath11k_debug_mask mask,
147				   const char *msg, const char *prefix,
148				   const void *buf, size_t len)
149{
150}
151#endif /* CONFIG_ATH11K_DEBUG */
152
153#ifdef CONFIG_ATH11K_DEBUGFS
154int ath11k_debug_soc_create(struct ath11k_base *ab);
155void ath11k_debug_soc_destroy(struct ath11k_base *ab);
156int ath11k_debug_pdev_create(struct ath11k_base *ab);
157void ath11k_debug_pdev_destroy(struct ath11k_base *ab);
158int ath11k_debug_register(struct ath11k *ar);
159void ath11k_debug_unregister(struct ath11k *ar);
160void ath11k_dbg_htt_ext_stats_handler(struct ath11k_base *ab,
161				      struct sk_buff *skb);
162void ath11k_debug_fw_stats_process(struct ath11k_base *ab, struct sk_buff *skb);
163
164void ath11k_debug_fw_stats_init(struct ath11k *ar);
165int ath11k_dbg_htt_stats_req(struct ath11k *ar);
166
167static inline bool ath11k_debug_is_pktlog_lite_mode_enabled(struct ath11k *ar)
168{
169	return (ar->debug.pktlog_mode == ATH11K_PKTLOG_MODE_LITE);
170}
171
172static inline bool ath11k_debug_is_pktlog_rx_stats_enabled(struct ath11k *ar)
173{
174	return (!ar->debug.pktlog_peer_valid && ar->debug.pktlog_mode);
175}
176
177static inline bool ath11k_debug_is_pktlog_peer_valid(struct ath11k *ar, u8 *addr)
178{
179	return (ar->debug.pktlog_peer_valid && ar->debug.pktlog_mode &&
180		ether_addr_equal(addr, ar->debug.pktlog_peer_addr));
181}
182
183static inline int ath11k_debug_is_extd_tx_stats_enabled(struct ath11k *ar)
184{
185	return ar->debug.extd_tx_stats;
186}
187
188static inline int ath11k_debug_is_extd_rx_stats_enabled(struct ath11k *ar)
189{
190	return ar->debug.extd_rx_stats;
191}
192
193static inline int ath11k_debug_rx_filter(struct ath11k *ar)
194{
195	return ar->debug.rx_filter;
196}
197
198void ath11k_sta_add_debugfs(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
199			    struct ieee80211_sta *sta, struct dentry *dir);
200void
201ath11k_accumulate_per_peer_tx_stats(struct ath11k_sta *arsta,
202				    struct ath11k_per_peer_tx_stats *peer_stats,
203				    u8 legacy_rate_idx);
204void ath11k_update_per_peer_stats_from_txcompl(struct ath11k *ar,
205					       struct sk_buff *msdu,
206					       struct hal_tx_status *ts);
207#else
208static inline int ath11k_debug_soc_create(struct ath11k_base *ab)
209{
210	return 0;
211}
212
213static inline void ath11k_debug_soc_destroy(struct ath11k_base *ab)
214{
215}
216
217static inline int ath11k_debug_pdev_create(struct ath11k_base *ab)
218{
219	return 0;
220}
221
222static inline void ath11k_debug_pdev_destroy(struct ath11k_base *ab)
223{
224}
225
226static inline int ath11k_debug_register(struct ath11k *ar)
227{
228	return 0;
229}
230
231static inline void ath11k_debug_unregister(struct ath11k *ar)
232{
233}
234
235static inline void ath11k_dbg_htt_ext_stats_handler(struct ath11k_base *ab,
236						    struct sk_buff *skb)
237{
238}
239
240static inline void ath11k_debug_fw_stats_process(struct ath11k_base *ab,
241						 struct sk_buff *skb)
242{
243}
244
245static inline void ath11k_debug_fw_stats_init(struct ath11k *ar)
246{
247}
248
249static inline int ath11k_debug_is_extd_tx_stats_enabled(struct ath11k *ar)
250{
251	return 0;
252}
253
254static inline int ath11k_debug_is_extd_rx_stats_enabled(struct ath11k *ar)
255{
256	return 0;
257}
258
259static inline int ath11k_dbg_htt_stats_req(struct ath11k *ar)
260{
261	return 0;
262}
263
264static inline bool ath11k_debug_is_pktlog_lite_mode_enabled(struct ath11k *ar)
265{
266	return false;
267}
268
269static inline bool ath11k_debug_is_pktlog_rx_stats_enabled(struct ath11k *ar)
270{
271	return false;
272}
273
274static inline bool ath11k_debug_is_pktlog_peer_valid(struct ath11k *ar, u8 *addr)
275{
276	return false;
277}
278
279static inline int ath11k_debug_rx_filter(struct ath11k *ar)
280{
281	return 0;
282}
283
284static inline void
285ath11k_accumulate_per_peer_tx_stats(struct ath11k_sta *arsta,
286				    struct ath11k_per_peer_tx_stats *peer_stats,
287				    u8 legacy_rate_idx)
288{
289}
290
291static inline void
292ath11k_update_per_peer_stats_from_txcompl(struct ath11k *ar,
293					  struct sk_buff *msdu,
294					  struct hal_tx_status *ts)
295{
296}
297
298#endif /* CONFIG_MAC80211_DEBUGFS*/
299
300#define ath11k_dbg(ar, dbg_mask, fmt, ...)			\
301do {								\
302	if (ath11k_debug_mask & dbg_mask)			\
303		__ath11k_dbg(ar, dbg_mask, fmt, ##__VA_ARGS__);	\
304} while (0)
305
306#endif /* _ATH11K_DEBUG_H_ */