xref: /openbmc/linux/drivers/net/wireless/silabs/wfx/traces.h (revision 4f2c0a4acffbec01079c28f839422e64ddeff004)
1*4a5fb1bbSJérôme Pouiller /* SPDX-License-Identifier: GPL-2.0-only */
2*4a5fb1bbSJérôme Pouiller /*
3*4a5fb1bbSJérôme Pouiller  * Tracepoints definitions.
4*4a5fb1bbSJérôme Pouiller  *
5*4a5fb1bbSJérôme Pouiller  * Copyright (c) 2018-2020, Silicon Laboratories, Inc.
6*4a5fb1bbSJérôme Pouiller  */
7*4a5fb1bbSJérôme Pouiller 
8*4a5fb1bbSJérôme Pouiller #undef TRACE_SYSTEM
9*4a5fb1bbSJérôme Pouiller #define TRACE_SYSTEM wfx
10*4a5fb1bbSJérôme Pouiller 
11*4a5fb1bbSJérôme Pouiller #if !defined(_WFX_TRACE_H) || defined(TRACE_HEADER_MULTI_READ)
12*4a5fb1bbSJérôme Pouiller #define _WFX_TRACE_H
13*4a5fb1bbSJérôme Pouiller 
14*4a5fb1bbSJérôme Pouiller #include <linux/tracepoint.h>
15*4a5fb1bbSJérôme Pouiller #include <net/mac80211.h>
16*4a5fb1bbSJérôme Pouiller 
17*4a5fb1bbSJérôme Pouiller #include "bus.h"
18*4a5fb1bbSJérôme Pouiller #include "hif_api_cmd.h"
19*4a5fb1bbSJérôme Pouiller #include "hif_api_mib.h"
20*4a5fb1bbSJérôme Pouiller 
21*4a5fb1bbSJérôme Pouiller /* The hell below need some explanations. For each symbolic number, we need to define it with
22*4a5fb1bbSJérôme Pouiller  * TRACE_DEFINE_ENUM() and in a list for __print_symbolic.
23*4a5fb1bbSJérôme Pouiller  *
24*4a5fb1bbSJérôme Pouiller  *   1. Define a new macro that call TRACE_DEFINE_ENUM():
25*4a5fb1bbSJérôme Pouiller  *
26*4a5fb1bbSJérôme Pouiller  *          #define xxx_name(sym) TRACE_DEFINE_ENUM(sym);
27*4a5fb1bbSJérôme Pouiller  *
28*4a5fb1bbSJérôme Pouiller  *   2. Define list of all symbols:
29*4a5fb1bbSJérôme Pouiller  *
30*4a5fb1bbSJérôme Pouiller  *          #define list_names     \
31*4a5fb1bbSJérôme Pouiller  *             ...                 \
32*4a5fb1bbSJérôme Pouiller  *             xxx_name(XXX)       \
33*4a5fb1bbSJérôme Pouiller  *             ...
34*4a5fb1bbSJérôme Pouiller  *
35*4a5fb1bbSJérôme Pouiller  *   3. Instantiate that list_names:
36*4a5fb1bbSJérôme Pouiller  *
37*4a5fb1bbSJérôme Pouiller  *          list_names
38*4a5fb1bbSJérôme Pouiller  *
39*4a5fb1bbSJérôme Pouiller  *   4. Redefine xxx_name() as an entry of array for __print_symbolic()
40*4a5fb1bbSJérôme Pouiller  *
41*4a5fb1bbSJérôme Pouiller  *          #undef xxx_name
42*4a5fb1bbSJérôme Pouiller  *          #define xxx_name(msg) { msg, #msg },
43*4a5fb1bbSJérôme Pouiller  *
44*4a5fb1bbSJérôme Pouiller  *   5. list_name can now nearly be used with __print_symbolic() but, __print_symbolic() dislike
45*4a5fb1bbSJérôme Pouiller  *      last comma of list. So we define a new list with a dummy element:
46*4a5fb1bbSJérôme Pouiller  *
47*4a5fb1bbSJérôme Pouiller  *          #define list_for_print_symbolic list_names { -1, NULL }
48*4a5fb1bbSJérôme Pouiller  */
49*4a5fb1bbSJérôme Pouiller 
50*4a5fb1bbSJérôme Pouiller #define _hif_msg_list                       \
51*4a5fb1bbSJérôme Pouiller 	hif_cnf_name(ADD_KEY)               \
52*4a5fb1bbSJérôme Pouiller 	hif_cnf_name(BEACON_TRANSMIT)       \
53*4a5fb1bbSJérôme Pouiller 	hif_cnf_name(EDCA_QUEUE_PARAMS)     \
54*4a5fb1bbSJérôme Pouiller 	hif_cnf_name(JOIN)                  \
55*4a5fb1bbSJérôme Pouiller 	hif_cnf_name(MAP_LINK)              \
56*4a5fb1bbSJérôme Pouiller 	hif_cnf_name(READ_MIB)              \
57*4a5fb1bbSJérôme Pouiller 	hif_cnf_name(REMOVE_KEY)            \
58*4a5fb1bbSJérôme Pouiller 	hif_cnf_name(RESET)                 \
59*4a5fb1bbSJérôme Pouiller 	hif_cnf_name(SET_BSS_PARAMS)        \
60*4a5fb1bbSJérôme Pouiller 	hif_cnf_name(SET_PM_MODE)           \
61*4a5fb1bbSJérôme Pouiller 	hif_cnf_name(START)                 \
62*4a5fb1bbSJérôme Pouiller 	hif_cnf_name(START_SCAN)            \
63*4a5fb1bbSJérôme Pouiller 	hif_cnf_name(STOP_SCAN)             \
64*4a5fb1bbSJérôme Pouiller 	hif_cnf_name(TX)                    \
65*4a5fb1bbSJérôme Pouiller 	hif_cnf_name(MULTI_TRANSMIT)        \
66*4a5fb1bbSJérôme Pouiller 	hif_cnf_name(UPDATE_IE)             \
67*4a5fb1bbSJérôme Pouiller 	hif_cnf_name(WRITE_MIB)             \
68*4a5fb1bbSJérôme Pouiller 	hif_cnf_name(CONFIGURATION)         \
69*4a5fb1bbSJérôme Pouiller 	hif_cnf_name(CONTROL_GPIO)          \
70*4a5fb1bbSJérôme Pouiller 	hif_cnf_name(PREVENT_ROLLBACK)      \
71*4a5fb1bbSJérôme Pouiller 	hif_cnf_name(SET_SL_MAC_KEY)        \
72*4a5fb1bbSJérôme Pouiller 	hif_cnf_name(SL_CONFIGURE)          \
73*4a5fb1bbSJérôme Pouiller 	hif_cnf_name(SL_EXCHANGE_PUB_KEYS)  \
74*4a5fb1bbSJérôme Pouiller 	hif_cnf_name(SHUT_DOWN)             \
75*4a5fb1bbSJérôme Pouiller 	hif_ind_name(EVENT)                 \
76*4a5fb1bbSJérôme Pouiller 	hif_ind_name(JOIN_COMPLETE)         \
77*4a5fb1bbSJérôme Pouiller 	hif_ind_name(RX)                    \
78*4a5fb1bbSJérôme Pouiller 	hif_ind_name(SCAN_CMPL)             \
79*4a5fb1bbSJérôme Pouiller 	hif_ind_name(SET_PM_MODE_CMPL)      \
80*4a5fb1bbSJérôme Pouiller 	hif_ind_name(SUSPEND_RESUME_TX)     \
81*4a5fb1bbSJérôme Pouiller 	hif_ind_name(SL_EXCHANGE_PUB_KEYS)  \
82*4a5fb1bbSJérôme Pouiller 	hif_ind_name(ERROR)                 \
83*4a5fb1bbSJérôme Pouiller 	hif_ind_name(EXCEPTION)             \
84*4a5fb1bbSJérôme Pouiller 	hif_ind_name(GENERIC)               \
85*4a5fb1bbSJérôme Pouiller 	hif_ind_name(WAKEUP)                \
86*4a5fb1bbSJérôme Pouiller 	hif_ind_name(STARTUP)
87*4a5fb1bbSJérôme Pouiller 
88*4a5fb1bbSJérôme Pouiller #define hif_msg_list_enum _hif_msg_list
89*4a5fb1bbSJérôme Pouiller 
90*4a5fb1bbSJérôme Pouiller #undef hif_cnf_name
91*4a5fb1bbSJérôme Pouiller #undef hif_ind_name
92*4a5fb1bbSJérôme Pouiller #define hif_cnf_name(msg) TRACE_DEFINE_ENUM(HIF_CNF_ID_##msg);
93*4a5fb1bbSJérôme Pouiller #define hif_ind_name(msg) TRACE_DEFINE_ENUM(HIF_IND_ID_##msg);
94*4a5fb1bbSJérôme Pouiller hif_msg_list_enum
95*4a5fb1bbSJérôme Pouiller #undef hif_cnf_name
96*4a5fb1bbSJérôme Pouiller #undef hif_ind_name
97*4a5fb1bbSJérôme Pouiller #define hif_cnf_name(msg) { HIF_CNF_ID_##msg, #msg },
98*4a5fb1bbSJérôme Pouiller #define hif_ind_name(msg) { HIF_IND_ID_##msg, #msg },
99*4a5fb1bbSJérôme Pouiller #define hif_msg_list hif_msg_list_enum { -1, NULL }
100*4a5fb1bbSJérôme Pouiller 
101*4a5fb1bbSJérôme Pouiller #define _hif_mib_list                                \
102*4a5fb1bbSJérôme Pouiller 	hif_mib_name(ARP_IP_ADDRESSES_TABLE)         \
103*4a5fb1bbSJérôme Pouiller 	hif_mib_name(ARP_KEEP_ALIVE_PERIOD)          \
104*4a5fb1bbSJérôme Pouiller 	hif_mib_name(BEACON_FILTER_ENABLE)           \
105*4a5fb1bbSJérôme Pouiller 	hif_mib_name(BEACON_FILTER_TABLE)            \
106*4a5fb1bbSJérôme Pouiller 	hif_mib_name(BEACON_STATS)                   \
107*4a5fb1bbSJérôme Pouiller 	hif_mib_name(BEACON_WAKEUP_PERIOD)           \
108*4a5fb1bbSJérôme Pouiller 	hif_mib_name(BLOCK_ACK_POLICY)               \
109*4a5fb1bbSJérôme Pouiller 	hif_mib_name(CCA_CONFIG)                     \
110*4a5fb1bbSJérôme Pouiller 	hif_mib_name(CONFIG_DATA_FILTER)             \
111*4a5fb1bbSJérôme Pouiller 	hif_mib_name(COUNTERS_TABLE)                 \
112*4a5fb1bbSJérôme Pouiller 	hif_mib_name(CURRENT_TX_POWER_LEVEL)         \
113*4a5fb1bbSJérôme Pouiller 	hif_mib_name(DOT11_MAC_ADDRESS)              \
114*4a5fb1bbSJérôme Pouiller 	hif_mib_name(DOT11_MAX_RECEIVE_LIFETIME)     \
115*4a5fb1bbSJérôme Pouiller 	hif_mib_name(DOT11_MAX_TRANSMIT_MSDU_LIFETIME) \
116*4a5fb1bbSJérôme Pouiller 	hif_mib_name(DOT11_RTS_THRESHOLD)            \
117*4a5fb1bbSJérôme Pouiller 	hif_mib_name(DOT11_WEP_DEFAULT_KEY_ID)       \
118*4a5fb1bbSJérôme Pouiller 	hif_mib_name(ETHERTYPE_DATAFRAME_CONDITION)  \
119*4a5fb1bbSJérôme Pouiller 	hif_mib_name(EXTENDED_COUNTERS_TABLE)        \
120*4a5fb1bbSJérôme Pouiller 	hif_mib_name(GL_BLOCK_ACK_INFO)              \
121*4a5fb1bbSJérôme Pouiller 	hif_mib_name(GL_OPERATIONAL_POWER_MODE)      \
122*4a5fb1bbSJérôme Pouiller 	hif_mib_name(GL_SET_MULTI_MSG)               \
123*4a5fb1bbSJérôme Pouiller 	hif_mib_name(GRP_SEQ_COUNTER)                \
124*4a5fb1bbSJérôme Pouiller 	hif_mib_name(INACTIVITY_TIMER)               \
125*4a5fb1bbSJérôme Pouiller 	hif_mib_name(INTERFACE_PROTECTION)           \
126*4a5fb1bbSJérôme Pouiller 	hif_mib_name(IPV4_ADDR_DATAFRAME_CONDITION)  \
127*4a5fb1bbSJérôme Pouiller 	hif_mib_name(IPV6_ADDR_DATAFRAME_CONDITION)  \
128*4a5fb1bbSJérôme Pouiller 	hif_mib_name(KEEP_ALIVE_PERIOD)              \
129*4a5fb1bbSJérôme Pouiller 	hif_mib_name(MAC_ADDR_DATAFRAME_CONDITION)   \
130*4a5fb1bbSJérôme Pouiller 	hif_mib_name(MAGIC_DATAFRAME_CONDITION)      \
131*4a5fb1bbSJérôme Pouiller 	hif_mib_name(MAX_TX_POWER_LEVEL)             \
132*4a5fb1bbSJérôme Pouiller 	hif_mib_name(NON_ERP_PROTECTION)             \
133*4a5fb1bbSJérôme Pouiller 	hif_mib_name(NS_IP_ADDRESSES_TABLE)          \
134*4a5fb1bbSJérôme Pouiller 	hif_mib_name(OVERRIDE_INTERNAL_TX_RATE)      \
135*4a5fb1bbSJérôme Pouiller 	hif_mib_name(PORT_DATAFRAME_CONDITION)       \
136*4a5fb1bbSJérôme Pouiller 	hif_mib_name(PROTECTED_MGMT_POLICY)          \
137*4a5fb1bbSJérôme Pouiller 	hif_mib_name(RCPI_RSSI_THRESHOLD)            \
138*4a5fb1bbSJérôme Pouiller 	hif_mib_name(RX_FILTER)                      \
139*4a5fb1bbSJérôme Pouiller 	hif_mib_name(SET_ASSOCIATION_MODE)           \
140*4a5fb1bbSJérôme Pouiller 	hif_mib_name(SET_DATA_FILTERING)             \
141*4a5fb1bbSJérôme Pouiller 	hif_mib_name(SET_HT_PROTECTION)              \
142*4a5fb1bbSJérôme Pouiller 	hif_mib_name(SET_TX_RATE_RETRY_POLICY)       \
143*4a5fb1bbSJérôme Pouiller 	hif_mib_name(SET_UAPSD_INFORMATION)          \
144*4a5fb1bbSJérôme Pouiller 	hif_mib_name(SLOT_TIME)                      \
145*4a5fb1bbSJérôme Pouiller 	hif_mib_name(STATISTICS_TABLE)               \
146*4a5fb1bbSJérôme Pouiller 	hif_mib_name(TEMPLATE_FRAME)                 \
147*4a5fb1bbSJérôme Pouiller 	hif_mib_name(TSF_COUNTER)                    \
148*4a5fb1bbSJérôme Pouiller 	hif_mib_name(UC_MC_BC_DATAFRAME_CONDITION)
149*4a5fb1bbSJérôme Pouiller 
150*4a5fb1bbSJérôme Pouiller #define hif_mib_list_enum _hif_mib_list
151*4a5fb1bbSJérôme Pouiller 
152*4a5fb1bbSJérôme Pouiller #undef hif_mib_name
153*4a5fb1bbSJérôme Pouiller #define hif_mib_name(mib) TRACE_DEFINE_ENUM(HIF_MIB_ID_##mib);
154*4a5fb1bbSJérôme Pouiller hif_mib_list_enum
155*4a5fb1bbSJérôme Pouiller #undef hif_mib_name
156*4a5fb1bbSJérôme Pouiller #define hif_mib_name(mib) { HIF_MIB_ID_##mib, #mib },
157*4a5fb1bbSJérôme Pouiller #define hif_mib_list hif_mib_list_enum { -1, NULL }
158*4a5fb1bbSJérôme Pouiller 
159*4a5fb1bbSJérôme Pouiller DECLARE_EVENT_CLASS(hif_data,
160*4a5fb1bbSJérôme Pouiller 	TP_PROTO(const struct wfx_hif_msg *hif, int tx_fill_level, bool is_recv),
161*4a5fb1bbSJérôme Pouiller 	TP_ARGS(hif, tx_fill_level, is_recv),
162*4a5fb1bbSJérôme Pouiller 	TP_STRUCT__entry(
163*4a5fb1bbSJérôme Pouiller 		__field(int, tx_fill_level)
164*4a5fb1bbSJérôme Pouiller 		__field(int, msg_id)
165*4a5fb1bbSJérôme Pouiller 		__field(const char *, msg_type)
166*4a5fb1bbSJérôme Pouiller 		__field(int, msg_len)
167*4a5fb1bbSJérôme Pouiller 		__field(int, buf_len)
168*4a5fb1bbSJérôme Pouiller 		__field(int, if_id)
169*4a5fb1bbSJérôme Pouiller 		__field(int, mib)
170*4a5fb1bbSJérôme Pouiller 		__array(u8, buf, 128)
171*4a5fb1bbSJérôme Pouiller 	),
172*4a5fb1bbSJérôme Pouiller 	TP_fast_assign(
173*4a5fb1bbSJérôme Pouiller 		int header_len;
174*4a5fb1bbSJérôme Pouiller 
175*4a5fb1bbSJérôme Pouiller 		__entry->tx_fill_level = tx_fill_level;
176*4a5fb1bbSJérôme Pouiller 		__entry->msg_len = le16_to_cpu(hif->len);
177*4a5fb1bbSJérôme Pouiller 		__entry->msg_id = hif->id;
178*4a5fb1bbSJérôme Pouiller 		__entry->if_id = hif->interface;
179*4a5fb1bbSJérôme Pouiller 		if (is_recv)
180*4a5fb1bbSJérôme Pouiller 			__entry->msg_type = __entry->msg_id & 0x80 ? "IND" : "CNF";
181*4a5fb1bbSJérôme Pouiller 		else
182*4a5fb1bbSJérôme Pouiller 			__entry->msg_type = "REQ";
183*4a5fb1bbSJérôme Pouiller 		if (!is_recv &&
184*4a5fb1bbSJérôme Pouiller 		    (__entry->msg_id == HIF_REQ_ID_READ_MIB ||
185*4a5fb1bbSJérôme Pouiller 		     __entry->msg_id == HIF_REQ_ID_WRITE_MIB)) {
186*4a5fb1bbSJérôme Pouiller 			__entry->mib = le16_to_cpup((__le16 *)hif->body);
187*4a5fb1bbSJérôme Pouiller 			header_len = 4;
188*4a5fb1bbSJérôme Pouiller 		} else {
189*4a5fb1bbSJérôme Pouiller 			__entry->mib = -1;
190*4a5fb1bbSJérôme Pouiller 			header_len = 0;
191*4a5fb1bbSJérôme Pouiller 		}
192*4a5fb1bbSJérôme Pouiller 		__entry->buf_len = min_t(int, __entry->msg_len, sizeof(__entry->buf))
193*4a5fb1bbSJérôme Pouiller 				   - sizeof(struct wfx_hif_msg) - header_len;
194*4a5fb1bbSJérôme Pouiller 		memcpy(__entry->buf, hif->body + header_len, __entry->buf_len);
195*4a5fb1bbSJérôme Pouiller 	),
196*4a5fb1bbSJérôme Pouiller 	TP_printk("%d:%d:%s_%s%s%s: %s%s (%d bytes)",
197*4a5fb1bbSJérôme Pouiller 		__entry->tx_fill_level,
198*4a5fb1bbSJérôme Pouiller 		__entry->if_id,
199*4a5fb1bbSJérôme Pouiller 		__entry->msg_type,
200*4a5fb1bbSJérôme Pouiller 		__print_symbolic(__entry->msg_id, hif_msg_list),
201*4a5fb1bbSJérôme Pouiller 		__entry->mib != -1 ? "/" : "",
202*4a5fb1bbSJérôme Pouiller 		__entry->mib != -1 ? __print_symbolic(__entry->mib, hif_mib_list) : "",
203*4a5fb1bbSJérôme Pouiller 		__print_hex(__entry->buf, __entry->buf_len),
204*4a5fb1bbSJérôme Pouiller 		__entry->msg_len > sizeof(__entry->buf) ? " ..." : "",
205*4a5fb1bbSJérôme Pouiller 		__entry->msg_len
206*4a5fb1bbSJérôme Pouiller 	)
207*4a5fb1bbSJérôme Pouiller );
208*4a5fb1bbSJérôme Pouiller DEFINE_EVENT(hif_data, hif_send,
209*4a5fb1bbSJérôme Pouiller 	TP_PROTO(const struct wfx_hif_msg *hif, int tx_fill_level, bool is_recv),
210*4a5fb1bbSJérôme Pouiller 	TP_ARGS(hif, tx_fill_level, is_recv));
211*4a5fb1bbSJérôme Pouiller #define _trace_hif_send(hif, tx_fill_level)\
212*4a5fb1bbSJérôme Pouiller 	trace_hif_send(hif, tx_fill_level, false)
213*4a5fb1bbSJérôme Pouiller DEFINE_EVENT(hif_data, hif_recv,
214*4a5fb1bbSJérôme Pouiller 	TP_PROTO(const struct wfx_hif_msg *hif, int tx_fill_level, bool is_recv),
215*4a5fb1bbSJérôme Pouiller 	TP_ARGS(hif, tx_fill_level, is_recv));
216*4a5fb1bbSJérôme Pouiller #define _trace_hif_recv(hif, tx_fill_level)\
217*4a5fb1bbSJérôme Pouiller 	trace_hif_recv(hif, tx_fill_level, true)
218*4a5fb1bbSJérôme Pouiller 
219*4a5fb1bbSJérôme Pouiller #define wfx_reg_list_enum                                 \
220*4a5fb1bbSJérôme Pouiller 	wfx_reg_name(WFX_REG_CONFIG,       "CONFIG")      \
221*4a5fb1bbSJérôme Pouiller 	wfx_reg_name(WFX_REG_CONTROL,      "CONTROL")     \
222*4a5fb1bbSJérôme Pouiller 	wfx_reg_name(WFX_REG_IN_OUT_QUEUE, "QUEUE")       \
223*4a5fb1bbSJérôme Pouiller 	wfx_reg_name(WFX_REG_AHB_DPORT,    "AHB")         \
224*4a5fb1bbSJérôme Pouiller 	wfx_reg_name(WFX_REG_BASE_ADDR,    "BASE_ADDR")   \
225*4a5fb1bbSJérôme Pouiller 	wfx_reg_name(WFX_REG_SRAM_DPORT,   "SRAM")        \
226*4a5fb1bbSJérôme Pouiller 	wfx_reg_name(WFX_REG_SET_GEN_R_W,  "SET_GEN_R_W") \
227*4a5fb1bbSJérôme Pouiller 	wfx_reg_name(WFX_REG_FRAME_OUT,    "FRAME_OUT")
228*4a5fb1bbSJérôme Pouiller 
229*4a5fb1bbSJérôme Pouiller #undef wfx_reg_name
230*4a5fb1bbSJérôme Pouiller #define wfx_reg_name(sym, name) TRACE_DEFINE_ENUM(sym);
231*4a5fb1bbSJérôme Pouiller wfx_reg_list_enum
232*4a5fb1bbSJérôme Pouiller #undef wfx_reg_name
233*4a5fb1bbSJérôme Pouiller #define wfx_reg_name(sym, name) { sym, name },
234*4a5fb1bbSJérôme Pouiller #define wfx_reg_list wfx_reg_list_enum { -1, NULL }
235*4a5fb1bbSJérôme Pouiller 
236*4a5fb1bbSJérôme Pouiller DECLARE_EVENT_CLASS(io_data,
237*4a5fb1bbSJérôme Pouiller 	TP_PROTO(int reg, int addr, const void *io_buf, size_t len),
238*4a5fb1bbSJérôme Pouiller 	TP_ARGS(reg, addr, io_buf, len),
239*4a5fb1bbSJérôme Pouiller 	TP_STRUCT__entry(
240*4a5fb1bbSJérôme Pouiller 		__field(int, reg)
241*4a5fb1bbSJérôme Pouiller 		__field(int, addr)
242*4a5fb1bbSJérôme Pouiller 		__field(int, msg_len)
243*4a5fb1bbSJérôme Pouiller 		__field(int, buf_len)
244*4a5fb1bbSJérôme Pouiller 		__array(u8, buf, 32)
245*4a5fb1bbSJérôme Pouiller 		__array(u8, addr_str, 10)
246*4a5fb1bbSJérôme Pouiller 	),
247*4a5fb1bbSJérôme Pouiller 	TP_fast_assign(
248*4a5fb1bbSJérôme Pouiller 		__entry->reg = reg;
249*4a5fb1bbSJérôme Pouiller 		__entry->addr = addr;
250*4a5fb1bbSJérôme Pouiller 		__entry->msg_len = len;
251*4a5fb1bbSJérôme Pouiller 		__entry->buf_len = min_t(int, sizeof(__entry->buf), __entry->msg_len);
252*4a5fb1bbSJérôme Pouiller 		memcpy(__entry->buf, io_buf, __entry->buf_len);
253*4a5fb1bbSJérôme Pouiller 		if (addr >= 0)
254*4a5fb1bbSJérôme Pouiller 			snprintf(__entry->addr_str, 10, "/%08x", addr);
255*4a5fb1bbSJérôme Pouiller 		else
256*4a5fb1bbSJérôme Pouiller 			__entry->addr_str[0] = 0;
257*4a5fb1bbSJérôme Pouiller 	),
258*4a5fb1bbSJérôme Pouiller 	TP_printk("%s%s: %s%s (%d bytes)",
259*4a5fb1bbSJérôme Pouiller 		__print_symbolic(__entry->reg, wfx_reg_list),
260*4a5fb1bbSJérôme Pouiller 		__entry->addr_str,
261*4a5fb1bbSJérôme Pouiller 		__print_hex(__entry->buf, __entry->buf_len),
262*4a5fb1bbSJérôme Pouiller 		__entry->msg_len > sizeof(__entry->buf) ? " ..." : "",
263*4a5fb1bbSJérôme Pouiller 		__entry->msg_len
264*4a5fb1bbSJérôme Pouiller 	)
265*4a5fb1bbSJérôme Pouiller );
266*4a5fb1bbSJérôme Pouiller DEFINE_EVENT(io_data, io_write,
267*4a5fb1bbSJérôme Pouiller 	TP_PROTO(int reg, int addr, const void *io_buf, size_t len),
268*4a5fb1bbSJérôme Pouiller 	TP_ARGS(reg, addr, io_buf, len));
269*4a5fb1bbSJérôme Pouiller #define _trace_io_ind_write(reg, addr, io_buf, len)\
270*4a5fb1bbSJérôme Pouiller 	trace_io_write(reg, addr, io_buf, len)
271*4a5fb1bbSJérôme Pouiller #define _trace_io_write(reg, io_buf, len) trace_io_write(reg, -1, io_buf, len)
272*4a5fb1bbSJérôme Pouiller DEFINE_EVENT(io_data, io_read,
273*4a5fb1bbSJérôme Pouiller 	TP_PROTO(int reg, int addr, const void *io_buf, size_t len),
274*4a5fb1bbSJérôme Pouiller 	TP_ARGS(reg, addr, io_buf, len));
275*4a5fb1bbSJérôme Pouiller #define _trace_io_ind_read(reg, addr, io_buf, len)\
276*4a5fb1bbSJérôme Pouiller 	trace_io_read(reg, addr, io_buf, len)
277*4a5fb1bbSJérôme Pouiller #define _trace_io_read(reg, io_buf, len) trace_io_read(reg, -1, io_buf, len)
278*4a5fb1bbSJérôme Pouiller 
279*4a5fb1bbSJérôme Pouiller DECLARE_EVENT_CLASS(io_data32,
280*4a5fb1bbSJérôme Pouiller 	TP_PROTO(int reg, int addr, u32 val),
281*4a5fb1bbSJérôme Pouiller 	TP_ARGS(reg, addr, val),
282*4a5fb1bbSJérôme Pouiller 	TP_STRUCT__entry(
283*4a5fb1bbSJérôme Pouiller 		__field(int, reg)
284*4a5fb1bbSJérôme Pouiller 		__field(int, addr)
285*4a5fb1bbSJérôme Pouiller 		__field(int, val)
286*4a5fb1bbSJérôme Pouiller 		__array(u8, addr_str, 10)
287*4a5fb1bbSJérôme Pouiller 	),
288*4a5fb1bbSJérôme Pouiller 	TP_fast_assign(
289*4a5fb1bbSJérôme Pouiller 		__entry->reg = reg;
290*4a5fb1bbSJérôme Pouiller 		__entry->addr = addr;
291*4a5fb1bbSJérôme Pouiller 		__entry->val = val;
292*4a5fb1bbSJérôme Pouiller 		if (addr >= 0)
293*4a5fb1bbSJérôme Pouiller 			snprintf(__entry->addr_str, 10, "/%08x", addr);
294*4a5fb1bbSJérôme Pouiller 		else
295*4a5fb1bbSJérôme Pouiller 			__entry->addr_str[0] = 0;
296*4a5fb1bbSJérôme Pouiller 	),
297*4a5fb1bbSJérôme Pouiller 	TP_printk("%s%s: %08x",
298*4a5fb1bbSJérôme Pouiller 		__print_symbolic(__entry->reg, wfx_reg_list),
299*4a5fb1bbSJérôme Pouiller 		__entry->addr_str,
300*4a5fb1bbSJérôme Pouiller 		__entry->val
301*4a5fb1bbSJérôme Pouiller 	)
302*4a5fb1bbSJérôme Pouiller );
303*4a5fb1bbSJérôme Pouiller DEFINE_EVENT(io_data32, io_write32,
304*4a5fb1bbSJérôme Pouiller 	TP_PROTO(int reg, int addr, u32 val),
305*4a5fb1bbSJérôme Pouiller 	TP_ARGS(reg, addr, val));
306*4a5fb1bbSJérôme Pouiller #define _trace_io_ind_write32(reg, addr, val) trace_io_write32(reg, addr, val)
307*4a5fb1bbSJérôme Pouiller #define _trace_io_write32(reg, val) trace_io_write32(reg, -1, val)
308*4a5fb1bbSJérôme Pouiller DEFINE_EVENT(io_data32, io_read32,
309*4a5fb1bbSJérôme Pouiller 	TP_PROTO(int reg, int addr, u32 val),
310*4a5fb1bbSJérôme Pouiller 	TP_ARGS(reg, addr, val));
311*4a5fb1bbSJérôme Pouiller #define _trace_io_ind_read32(reg, addr, val) trace_io_read32(reg, addr, val)
312*4a5fb1bbSJérôme Pouiller #define _trace_io_read32(reg, val) trace_io_read32(reg, -1, val)
313*4a5fb1bbSJérôme Pouiller 
314*4a5fb1bbSJérôme Pouiller DECLARE_EVENT_CLASS(piggyback,
315*4a5fb1bbSJérôme Pouiller 	TP_PROTO(u32 val, bool ignored),
316*4a5fb1bbSJérôme Pouiller 	TP_ARGS(val, ignored),
317*4a5fb1bbSJérôme Pouiller 	TP_STRUCT__entry(
318*4a5fb1bbSJérôme Pouiller 		__field(int, val)
319*4a5fb1bbSJérôme Pouiller 		__field(bool, ignored)
320*4a5fb1bbSJérôme Pouiller 	),
321*4a5fb1bbSJérôme Pouiller 	TP_fast_assign(
322*4a5fb1bbSJérôme Pouiller 		__entry->val = val;
323*4a5fb1bbSJérôme Pouiller 		__entry->ignored = ignored;
324*4a5fb1bbSJérôme Pouiller 	),
325*4a5fb1bbSJérôme Pouiller 	TP_printk("CONTROL: %08x%s",
326*4a5fb1bbSJérôme Pouiller 		__entry->val,
327*4a5fb1bbSJérôme Pouiller 		__entry->ignored ? " (ignored)" : ""
328*4a5fb1bbSJérôme Pouiller 	)
329*4a5fb1bbSJérôme Pouiller );
330*4a5fb1bbSJérôme Pouiller DEFINE_EVENT(piggyback, piggyback,
331*4a5fb1bbSJérôme Pouiller 	TP_PROTO(u32 val, bool ignored),
332*4a5fb1bbSJérôme Pouiller 	TP_ARGS(val, ignored));
333*4a5fb1bbSJérôme Pouiller #define _trace_piggyback(val, ignored) trace_piggyback(val, ignored)
334*4a5fb1bbSJérôme Pouiller 
335*4a5fb1bbSJérôme Pouiller TRACE_EVENT(bh_stats,
336*4a5fb1bbSJérôme Pouiller 	TP_PROTO(int ind, int req, int cnf, int busy, bool release),
337*4a5fb1bbSJérôme Pouiller 	TP_ARGS(ind, req, cnf, busy, release),
338*4a5fb1bbSJérôme Pouiller 	TP_STRUCT__entry(
339*4a5fb1bbSJérôme Pouiller 		__field(int, ind)
340*4a5fb1bbSJérôme Pouiller 		__field(int, req)
341*4a5fb1bbSJérôme Pouiller 		__field(int, cnf)
342*4a5fb1bbSJérôme Pouiller 		__field(int, busy)
343*4a5fb1bbSJérôme Pouiller 		__field(bool, release)
344*4a5fb1bbSJérôme Pouiller 	),
345*4a5fb1bbSJérôme Pouiller 	TP_fast_assign(
346*4a5fb1bbSJérôme Pouiller 		__entry->ind = ind;
347*4a5fb1bbSJérôme Pouiller 		__entry->req = req;
348*4a5fb1bbSJérôme Pouiller 		__entry->cnf = cnf;
349*4a5fb1bbSJérôme Pouiller 		__entry->busy = busy;
350*4a5fb1bbSJérôme Pouiller 		__entry->release = release;
351*4a5fb1bbSJérôme Pouiller 	),
352*4a5fb1bbSJérôme Pouiller 	TP_printk("IND/REQ/CNF:%3d/%3d/%3d, REQ in progress:%3d, WUP: %s",
353*4a5fb1bbSJérôme Pouiller 		__entry->ind,
354*4a5fb1bbSJérôme Pouiller 		__entry->req,
355*4a5fb1bbSJérôme Pouiller 		__entry->cnf,
356*4a5fb1bbSJérôme Pouiller 		__entry->busy,
357*4a5fb1bbSJérôme Pouiller 		__entry->release ? "release" : "keep"
358*4a5fb1bbSJérôme Pouiller 	)
359*4a5fb1bbSJérôme Pouiller );
360*4a5fb1bbSJérôme Pouiller #define _trace_bh_stats(ind, req, cnf, busy, release)\
361*4a5fb1bbSJérôme Pouiller 	trace_bh_stats(ind, req, cnf, busy, release)
362*4a5fb1bbSJérôme Pouiller 
363*4a5fb1bbSJérôme Pouiller TRACE_EVENT(tx_stats,
364*4a5fb1bbSJérôme Pouiller 	TP_PROTO(const struct wfx_hif_cnf_tx *tx_cnf, const struct sk_buff *skb,
365*4a5fb1bbSJérôme Pouiller 		 int delay),
366*4a5fb1bbSJérôme Pouiller 	TP_ARGS(tx_cnf, skb, delay),
367*4a5fb1bbSJérôme Pouiller 	TP_STRUCT__entry(
368*4a5fb1bbSJérôme Pouiller 		__field(int, pkt_id)
369*4a5fb1bbSJérôme Pouiller 		__field(int, delay_media)
370*4a5fb1bbSJérôme Pouiller 		__field(int, delay_queue)
371*4a5fb1bbSJérôme Pouiller 		__field(int, delay_fw)
372*4a5fb1bbSJérôme Pouiller 		__field(int, ack_failures)
373*4a5fb1bbSJérôme Pouiller 		__field(int, flags)
374*4a5fb1bbSJérôme Pouiller 		__array(int, rate, 4)
375*4a5fb1bbSJérôme Pouiller 		__array(int, tx_count, 4)
376*4a5fb1bbSJérôme Pouiller 	),
377*4a5fb1bbSJérôme Pouiller 	TP_fast_assign(
378*4a5fb1bbSJérôme Pouiller 		/* Keep sync with wfx_rates definition in main.c */
379*4a5fb1bbSJérôme Pouiller 		static const int hw_rate[] = { 0, 1, 2, 3, 6, 7, 8, 9, 10, 11, 12, 13 };
380*4a5fb1bbSJérôme Pouiller 		const struct ieee80211_tx_info *tx_info =
381*4a5fb1bbSJérôme Pouiller 			(const struct ieee80211_tx_info *)skb->cb;
382*4a5fb1bbSJérôme Pouiller 		const struct ieee80211_tx_rate *rates = tx_info->driver_rates;
383*4a5fb1bbSJérôme Pouiller 		int i;
384*4a5fb1bbSJérôme Pouiller 
385*4a5fb1bbSJérôme Pouiller 		__entry->pkt_id = tx_cnf->packet_id;
386*4a5fb1bbSJérôme Pouiller 		__entry->delay_media = le32_to_cpu(tx_cnf->media_delay);
387*4a5fb1bbSJérôme Pouiller 		__entry->delay_queue = le32_to_cpu(tx_cnf->tx_queue_delay);
388*4a5fb1bbSJérôme Pouiller 		__entry->delay_fw = delay;
389*4a5fb1bbSJérôme Pouiller 		__entry->ack_failures = tx_cnf->ack_failures;
390*4a5fb1bbSJérôme Pouiller 		if (!tx_cnf->status || __entry->ack_failures)
391*4a5fb1bbSJérôme Pouiller 			__entry->ack_failures += 1;
392*4a5fb1bbSJérôme Pouiller 
393*4a5fb1bbSJérôme Pouiller 		for (i = 0; i < IEEE80211_NUM_ACS; i++) {
394*4a5fb1bbSJérôme Pouiller 			if (rates[0].flags & IEEE80211_TX_RC_MCS)
395*4a5fb1bbSJérôme Pouiller 				__entry->rate[i] = rates[i].idx;
396*4a5fb1bbSJérôme Pouiller 			else
397*4a5fb1bbSJérôme Pouiller 				__entry->rate[i] = hw_rate[rates[i].idx];
398*4a5fb1bbSJérôme Pouiller 			__entry->tx_count[i] = rates[i].count;
399*4a5fb1bbSJérôme Pouiller 		}
400*4a5fb1bbSJérôme Pouiller 		__entry->flags = 0;
401*4a5fb1bbSJérôme Pouiller 		if (rates[0].flags & IEEE80211_TX_RC_MCS)
402*4a5fb1bbSJérôme Pouiller 			__entry->flags |= 0x01;
403*4a5fb1bbSJérôme Pouiller 		if (rates[0].flags & IEEE80211_TX_RC_SHORT_GI)
404*4a5fb1bbSJérôme Pouiller 			__entry->flags |= 0x02;
405*4a5fb1bbSJérôme Pouiller 		if (rates[0].flags & IEEE80211_TX_RC_GREEN_FIELD)
406*4a5fb1bbSJérôme Pouiller 			__entry->flags |= 0x04;
407*4a5fb1bbSJérôme Pouiller 		if (rates[0].flags & IEEE80211_TX_RC_USE_RTS_CTS)
408*4a5fb1bbSJérôme Pouiller 			__entry->flags |= 0x08;
409*4a5fb1bbSJérôme Pouiller 		if (tx_info->flags & IEEE80211_TX_CTL_SEND_AFTER_DTIM)
410*4a5fb1bbSJérôme Pouiller 			__entry->flags |= 0x10;
411*4a5fb1bbSJérôme Pouiller 		if (tx_cnf->status)
412*4a5fb1bbSJérôme Pouiller 			__entry->flags |= 0x20;
413*4a5fb1bbSJérôme Pouiller 		if (tx_cnf->status == HIF_STATUS_TX_FAIL_REQUEUE)
414*4a5fb1bbSJérôme Pouiller 			__entry->flags |= 0x40;
415*4a5fb1bbSJérôme Pouiller 	),
416*4a5fb1bbSJérôme Pouiller 	TP_printk("packet ID: %08x, rate policy: %s %d|%d %d|%d %d|%d %d|%d -> %d attempt, Delays media/queue/total: %4dus/%4dus/%4dus",
417*4a5fb1bbSJérôme Pouiller 		__entry->pkt_id,
418*4a5fb1bbSJérôme Pouiller 		__print_flags(__entry->flags, NULL,
419*4a5fb1bbSJérôme Pouiller 			{ 0x01, "M" }, { 0x02, "S" }, { 0x04, "G" }, { 0x08, "R" },
420*4a5fb1bbSJérôme Pouiller 			{ 0x10, "D" }, { 0x20, "F" }, { 0x40, "Q" }),
421*4a5fb1bbSJérôme Pouiller 		__entry->rate[0],
422*4a5fb1bbSJérôme Pouiller 		__entry->tx_count[0],
423*4a5fb1bbSJérôme Pouiller 		__entry->rate[1],
424*4a5fb1bbSJérôme Pouiller 		__entry->tx_count[1],
425*4a5fb1bbSJérôme Pouiller 		__entry->rate[2],
426*4a5fb1bbSJérôme Pouiller 		__entry->tx_count[2],
427*4a5fb1bbSJérôme Pouiller 		__entry->rate[3],
428*4a5fb1bbSJérôme Pouiller 		__entry->tx_count[3],
429*4a5fb1bbSJérôme Pouiller 		__entry->ack_failures,
430*4a5fb1bbSJérôme Pouiller 		__entry->delay_media,
431*4a5fb1bbSJérôme Pouiller 		__entry->delay_queue,
432*4a5fb1bbSJérôme Pouiller 		__entry->delay_fw
433*4a5fb1bbSJérôme Pouiller 	)
434*4a5fb1bbSJérôme Pouiller );
435*4a5fb1bbSJérôme Pouiller #define _trace_tx_stats(tx_cnf, skb, delay) trace_tx_stats(tx_cnf, skb, delay)
436*4a5fb1bbSJérôme Pouiller 
437*4a5fb1bbSJérôme Pouiller TRACE_EVENT(queues_stats,
438*4a5fb1bbSJérôme Pouiller 	TP_PROTO(struct wfx_dev *wdev, const struct wfx_queue *elected_queue),
439*4a5fb1bbSJérôme Pouiller 	TP_ARGS(wdev, elected_queue),
440*4a5fb1bbSJérôme Pouiller 	TP_STRUCT__entry(
441*4a5fb1bbSJérôme Pouiller 		__field(int, vif_id)
442*4a5fb1bbSJérôme Pouiller 		__field(int, queue_id)
443*4a5fb1bbSJérôme Pouiller 		__array(int, hw, IEEE80211_NUM_ACS * 2)
444*4a5fb1bbSJérôme Pouiller 		__array(int, drv, IEEE80211_NUM_ACS * 2)
445*4a5fb1bbSJérôme Pouiller 		__array(int, cab, IEEE80211_NUM_ACS * 2)
446*4a5fb1bbSJérôme Pouiller 	),
447*4a5fb1bbSJérôme Pouiller 	TP_fast_assign(
448*4a5fb1bbSJérôme Pouiller 		const struct wfx_queue *queue;
449*4a5fb1bbSJérôme Pouiller 		struct wfx_vif *wvif;
450*4a5fb1bbSJérôme Pouiller 		int i, j;
451*4a5fb1bbSJérôme Pouiller 
452*4a5fb1bbSJérôme Pouiller 		for (j = 0; j < IEEE80211_NUM_ACS * 2; j++) {
453*4a5fb1bbSJérôme Pouiller 			__entry->hw[j] = -1;
454*4a5fb1bbSJérôme Pouiller 			__entry->drv[j] = -1;
455*4a5fb1bbSJérôme Pouiller 			__entry->cab[j] = -1;
456*4a5fb1bbSJérôme Pouiller 		}
457*4a5fb1bbSJérôme Pouiller 		__entry->vif_id = -1;
458*4a5fb1bbSJérôme Pouiller 		__entry->queue_id = -1;
459*4a5fb1bbSJérôme Pouiller 		wvif = NULL;
460*4a5fb1bbSJérôme Pouiller 		while ((wvif = wvif_iterate(wdev, wvif)) != NULL) {
461*4a5fb1bbSJérôme Pouiller 			for (i = 0; i < IEEE80211_NUM_ACS; i++) {
462*4a5fb1bbSJérôme Pouiller 				j = wvif->id * IEEE80211_NUM_ACS + i;
463*4a5fb1bbSJérôme Pouiller 				WARN_ON(j >= IEEE80211_NUM_ACS * 2);
464*4a5fb1bbSJérôme Pouiller 				queue = &wvif->tx_queue[i];
465*4a5fb1bbSJérôme Pouiller 				__entry->hw[j] = atomic_read(&queue->pending_frames);
466*4a5fb1bbSJérôme Pouiller 				__entry->drv[j] = skb_queue_len(&queue->normal);
467*4a5fb1bbSJérôme Pouiller 				__entry->cab[j] = skb_queue_len(&queue->cab);
468*4a5fb1bbSJérôme Pouiller 				if (queue == elected_queue) {
469*4a5fb1bbSJérôme Pouiller 					__entry->vif_id = wvif->id;
470*4a5fb1bbSJérôme Pouiller 					__entry->queue_id = i;
471*4a5fb1bbSJérôme Pouiller 				}
472*4a5fb1bbSJérôme Pouiller 			}
473*4a5fb1bbSJérôme Pouiller 		}
474*4a5fb1bbSJérôme Pouiller 	),
475*4a5fb1bbSJérôme Pouiller 	TP_printk("got skb from %d/%d, pend. hw/norm/cab: [ %d/%d/%d %d/%d/%d %d/%d/%d %d/%d/%d ] [ %d/%d/%d %d/%d/%d %d/%d/%d %d/%d/%d ]",
476*4a5fb1bbSJérôme Pouiller 		__entry->vif_id, __entry->queue_id,
477*4a5fb1bbSJérôme Pouiller 		__entry->hw[0], __entry->drv[0], __entry->cab[0],
478*4a5fb1bbSJérôme Pouiller 		__entry->hw[1], __entry->drv[1], __entry->cab[1],
479*4a5fb1bbSJérôme Pouiller 		__entry->hw[2], __entry->drv[2], __entry->cab[2],
480*4a5fb1bbSJérôme Pouiller 		__entry->hw[3], __entry->drv[3], __entry->cab[3],
481*4a5fb1bbSJérôme Pouiller 		__entry->hw[4], __entry->drv[4], __entry->cab[4],
482*4a5fb1bbSJérôme Pouiller 		__entry->hw[5], __entry->drv[5], __entry->cab[5],
483*4a5fb1bbSJérôme Pouiller 		__entry->hw[6], __entry->drv[6], __entry->cab[6],
484*4a5fb1bbSJérôme Pouiller 		__entry->hw[7], __entry->drv[7], __entry->cab[7]
485*4a5fb1bbSJérôme Pouiller 	)
486*4a5fb1bbSJérôme Pouiller );
487*4a5fb1bbSJérôme Pouiller 
488*4a5fb1bbSJérôme Pouiller #endif
489*4a5fb1bbSJérôme Pouiller 
490*4a5fb1bbSJérôme Pouiller /* This part must be outside protection */
491*4a5fb1bbSJérôme Pouiller #undef TRACE_INCLUDE_PATH
492*4a5fb1bbSJérôme Pouiller #define TRACE_INCLUDE_PATH .
493*4a5fb1bbSJérôme Pouiller #undef TRACE_INCLUDE_FILE
494*4a5fb1bbSJérôme Pouiller #define TRACE_INCLUDE_FILE traces
495*4a5fb1bbSJérôme Pouiller 
496*4a5fb1bbSJérôme Pouiller #include <trace/define_trace.h>
497