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