0001
0002
0003
0004
0005
0006
0007
0008 #undef TRACE_SYSTEM
0009 #define TRACE_SYSTEM wfx
0010
0011 #if !defined(_WFX_TRACE_H) || defined(TRACE_HEADER_MULTI_READ)
0012 #define _WFX_TRACE_H
0013
0014 #include <linux/tracepoint.h>
0015 #include <net/mac80211.h>
0016
0017 #include "bus.h"
0018 #include "hif_api_cmd.h"
0019 #include "hif_api_mib.h"
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037
0038
0039
0040
0041
0042
0043
0044
0045
0046
0047
0048
0049
0050 #define _hif_msg_list \
0051 hif_cnf_name(ADD_KEY) \
0052 hif_cnf_name(BEACON_TRANSMIT) \
0053 hif_cnf_name(EDCA_QUEUE_PARAMS) \
0054 hif_cnf_name(JOIN) \
0055 hif_cnf_name(MAP_LINK) \
0056 hif_cnf_name(READ_MIB) \
0057 hif_cnf_name(REMOVE_KEY) \
0058 hif_cnf_name(RESET) \
0059 hif_cnf_name(SET_BSS_PARAMS) \
0060 hif_cnf_name(SET_PM_MODE) \
0061 hif_cnf_name(START) \
0062 hif_cnf_name(START_SCAN) \
0063 hif_cnf_name(STOP_SCAN) \
0064 hif_cnf_name(TX) \
0065 hif_cnf_name(MULTI_TRANSMIT) \
0066 hif_cnf_name(UPDATE_IE) \
0067 hif_cnf_name(WRITE_MIB) \
0068 hif_cnf_name(CONFIGURATION) \
0069 hif_cnf_name(CONTROL_GPIO) \
0070 hif_cnf_name(PREVENT_ROLLBACK) \
0071 hif_cnf_name(SET_SL_MAC_KEY) \
0072 hif_cnf_name(SL_CONFIGURE) \
0073 hif_cnf_name(SL_EXCHANGE_PUB_KEYS) \
0074 hif_cnf_name(SHUT_DOWN) \
0075 hif_ind_name(EVENT) \
0076 hif_ind_name(JOIN_COMPLETE) \
0077 hif_ind_name(RX) \
0078 hif_ind_name(SCAN_CMPL) \
0079 hif_ind_name(SET_PM_MODE_CMPL) \
0080 hif_ind_name(SUSPEND_RESUME_TX) \
0081 hif_ind_name(SL_EXCHANGE_PUB_KEYS) \
0082 hif_ind_name(ERROR) \
0083 hif_ind_name(EXCEPTION) \
0084 hif_ind_name(GENERIC) \
0085 hif_ind_name(WAKEUP) \
0086 hif_ind_name(STARTUP)
0087
0088 #define hif_msg_list_enum _hif_msg_list
0089
0090 #undef hif_cnf_name
0091 #undef hif_ind_name
0092 #define hif_cnf_name(msg) TRACE_DEFINE_ENUM(HIF_CNF_ID_##msg);
0093 #define hif_ind_name(msg) TRACE_DEFINE_ENUM(HIF_IND_ID_##msg);
0094 hif_msg_list_enum
0095 #undef hif_cnf_name
0096 #undef hif_ind_name
0097 #define hif_cnf_name(msg) { HIF_CNF_ID_##msg, #msg },
0098 #define hif_ind_name(msg) { HIF_IND_ID_##msg, #msg },
0099 #define hif_msg_list hif_msg_list_enum { -1, NULL }
0100
0101 #define _hif_mib_list \
0102 hif_mib_name(ARP_IP_ADDRESSES_TABLE) \
0103 hif_mib_name(ARP_KEEP_ALIVE_PERIOD) \
0104 hif_mib_name(BEACON_FILTER_ENABLE) \
0105 hif_mib_name(BEACON_FILTER_TABLE) \
0106 hif_mib_name(BEACON_STATS) \
0107 hif_mib_name(BEACON_WAKEUP_PERIOD) \
0108 hif_mib_name(BLOCK_ACK_POLICY) \
0109 hif_mib_name(CCA_CONFIG) \
0110 hif_mib_name(CONFIG_DATA_FILTER) \
0111 hif_mib_name(COUNTERS_TABLE) \
0112 hif_mib_name(CURRENT_TX_POWER_LEVEL) \
0113 hif_mib_name(DOT11_MAC_ADDRESS) \
0114 hif_mib_name(DOT11_MAX_RECEIVE_LIFETIME) \
0115 hif_mib_name(DOT11_MAX_TRANSMIT_MSDU_LIFETIME) \
0116 hif_mib_name(DOT11_RTS_THRESHOLD) \
0117 hif_mib_name(DOT11_WEP_DEFAULT_KEY_ID) \
0118 hif_mib_name(ETHERTYPE_DATAFRAME_CONDITION) \
0119 hif_mib_name(EXTENDED_COUNTERS_TABLE) \
0120 hif_mib_name(GL_BLOCK_ACK_INFO) \
0121 hif_mib_name(GL_OPERATIONAL_POWER_MODE) \
0122 hif_mib_name(GL_SET_MULTI_MSG) \
0123 hif_mib_name(GRP_SEQ_COUNTER) \
0124 hif_mib_name(INACTIVITY_TIMER) \
0125 hif_mib_name(INTERFACE_PROTECTION) \
0126 hif_mib_name(IPV4_ADDR_DATAFRAME_CONDITION) \
0127 hif_mib_name(IPV6_ADDR_DATAFRAME_CONDITION) \
0128 hif_mib_name(KEEP_ALIVE_PERIOD) \
0129 hif_mib_name(MAC_ADDR_DATAFRAME_CONDITION) \
0130 hif_mib_name(MAGIC_DATAFRAME_CONDITION) \
0131 hif_mib_name(MAX_TX_POWER_LEVEL) \
0132 hif_mib_name(NON_ERP_PROTECTION) \
0133 hif_mib_name(NS_IP_ADDRESSES_TABLE) \
0134 hif_mib_name(OVERRIDE_INTERNAL_TX_RATE) \
0135 hif_mib_name(PORT_DATAFRAME_CONDITION) \
0136 hif_mib_name(PROTECTED_MGMT_POLICY) \
0137 hif_mib_name(RCPI_RSSI_THRESHOLD) \
0138 hif_mib_name(RX_FILTER) \
0139 hif_mib_name(SET_ASSOCIATION_MODE) \
0140 hif_mib_name(SET_DATA_FILTERING) \
0141 hif_mib_name(SET_HT_PROTECTION) \
0142 hif_mib_name(SET_TX_RATE_RETRY_POLICY) \
0143 hif_mib_name(SET_UAPSD_INFORMATION) \
0144 hif_mib_name(SLOT_TIME) \
0145 hif_mib_name(STATISTICS_TABLE) \
0146 hif_mib_name(TEMPLATE_FRAME) \
0147 hif_mib_name(TSF_COUNTER) \
0148 hif_mib_name(UC_MC_BC_DATAFRAME_CONDITION)
0149
0150 #define hif_mib_list_enum _hif_mib_list
0151
0152 #undef hif_mib_name
0153 #define hif_mib_name(mib) TRACE_DEFINE_ENUM(HIF_MIB_ID_##mib);
0154 hif_mib_list_enum
0155 #undef hif_mib_name
0156 #define hif_mib_name(mib) { HIF_MIB_ID_##mib, #mib },
0157 #define hif_mib_list hif_mib_list_enum { -1, NULL }
0158
0159 DECLARE_EVENT_CLASS(hif_data,
0160 TP_PROTO(const struct wfx_hif_msg *hif, int tx_fill_level, bool is_recv),
0161 TP_ARGS(hif, tx_fill_level, is_recv),
0162 TP_STRUCT__entry(
0163 __field(int, tx_fill_level)
0164 __field(int, msg_id)
0165 __field(const char *, msg_type)
0166 __field(int, msg_len)
0167 __field(int, buf_len)
0168 __field(int, if_id)
0169 __field(int, mib)
0170 __array(u8, buf, 128)
0171 ),
0172 TP_fast_assign(
0173 int header_len;
0174
0175 __entry->tx_fill_level = tx_fill_level;
0176 __entry->msg_len = le16_to_cpu(hif->len);
0177 __entry->msg_id = hif->id;
0178 __entry->if_id = hif->interface;
0179 if (is_recv)
0180 __entry->msg_type = __entry->msg_id & 0x80 ? "IND" : "CNF";
0181 else
0182 __entry->msg_type = "REQ";
0183 if (!is_recv &&
0184 (__entry->msg_id == HIF_REQ_ID_READ_MIB ||
0185 __entry->msg_id == HIF_REQ_ID_WRITE_MIB)) {
0186 __entry->mib = le16_to_cpup((__le16 *)hif->body);
0187 header_len = 4;
0188 } else {
0189 __entry->mib = -1;
0190 header_len = 0;
0191 }
0192 __entry->buf_len = min_t(int, __entry->msg_len, sizeof(__entry->buf))
0193 - sizeof(struct wfx_hif_msg) - header_len;
0194 memcpy(__entry->buf, hif->body + header_len, __entry->buf_len);
0195 ),
0196 TP_printk("%d:%d:%s_%s%s%s: %s%s (%d bytes)",
0197 __entry->tx_fill_level,
0198 __entry->if_id,
0199 __entry->msg_type,
0200 __print_symbolic(__entry->msg_id, hif_msg_list),
0201 __entry->mib != -1 ? "/" : "",
0202 __entry->mib != -1 ? __print_symbolic(__entry->mib, hif_mib_list) : "",
0203 __print_hex(__entry->buf, __entry->buf_len),
0204 __entry->msg_len > sizeof(__entry->buf) ? " ..." : "",
0205 __entry->msg_len
0206 )
0207 );
0208 DEFINE_EVENT(hif_data, hif_send,
0209 TP_PROTO(const struct wfx_hif_msg *hif, int tx_fill_level, bool is_recv),
0210 TP_ARGS(hif, tx_fill_level, is_recv));
0211 #define _trace_hif_send(hif, tx_fill_level)\
0212 trace_hif_send(hif, tx_fill_level, false)
0213 DEFINE_EVENT(hif_data, hif_recv,
0214 TP_PROTO(const struct wfx_hif_msg *hif, int tx_fill_level, bool is_recv),
0215 TP_ARGS(hif, tx_fill_level, is_recv));
0216 #define _trace_hif_recv(hif, tx_fill_level)\
0217 trace_hif_recv(hif, tx_fill_level, true)
0218
0219 #define wfx_reg_list_enum \
0220 wfx_reg_name(WFX_REG_CONFIG, "CONFIG") \
0221 wfx_reg_name(WFX_REG_CONTROL, "CONTROL") \
0222 wfx_reg_name(WFX_REG_IN_OUT_QUEUE, "QUEUE") \
0223 wfx_reg_name(WFX_REG_AHB_DPORT, "AHB") \
0224 wfx_reg_name(WFX_REG_BASE_ADDR, "BASE_ADDR") \
0225 wfx_reg_name(WFX_REG_SRAM_DPORT, "SRAM") \
0226 wfx_reg_name(WFX_REG_SET_GEN_R_W, "SET_GEN_R_W") \
0227 wfx_reg_name(WFX_REG_FRAME_OUT, "FRAME_OUT")
0228
0229 #undef wfx_reg_name
0230 #define wfx_reg_name(sym, name) TRACE_DEFINE_ENUM(sym);
0231 wfx_reg_list_enum
0232 #undef wfx_reg_name
0233 #define wfx_reg_name(sym, name) { sym, name },
0234 #define wfx_reg_list wfx_reg_list_enum { -1, NULL }
0235
0236 DECLARE_EVENT_CLASS(io_data,
0237 TP_PROTO(int reg, int addr, const void *io_buf, size_t len),
0238 TP_ARGS(reg, addr, io_buf, len),
0239 TP_STRUCT__entry(
0240 __field(int, reg)
0241 __field(int, addr)
0242 __field(int, msg_len)
0243 __field(int, buf_len)
0244 __array(u8, buf, 32)
0245 __array(u8, addr_str, 10)
0246 ),
0247 TP_fast_assign(
0248 __entry->reg = reg;
0249 __entry->addr = addr;
0250 __entry->msg_len = len;
0251 __entry->buf_len = min_t(int, sizeof(__entry->buf), __entry->msg_len);
0252 memcpy(__entry->buf, io_buf, __entry->buf_len);
0253 if (addr >= 0)
0254 snprintf(__entry->addr_str, 10, "/%08x", addr);
0255 else
0256 __entry->addr_str[0] = 0;
0257 ),
0258 TP_printk("%s%s: %s%s (%d bytes)",
0259 __print_symbolic(__entry->reg, wfx_reg_list),
0260 __entry->addr_str,
0261 __print_hex(__entry->buf, __entry->buf_len),
0262 __entry->msg_len > sizeof(__entry->buf) ? " ..." : "",
0263 __entry->msg_len
0264 )
0265 );
0266 DEFINE_EVENT(io_data, io_write,
0267 TP_PROTO(int reg, int addr, const void *io_buf, size_t len),
0268 TP_ARGS(reg, addr, io_buf, len));
0269 #define _trace_io_ind_write(reg, addr, io_buf, len)\
0270 trace_io_write(reg, addr, io_buf, len)
0271 #define _trace_io_write(reg, io_buf, len) trace_io_write(reg, -1, io_buf, len)
0272 DEFINE_EVENT(io_data, io_read,
0273 TP_PROTO(int reg, int addr, const void *io_buf, size_t len),
0274 TP_ARGS(reg, addr, io_buf, len));
0275 #define _trace_io_ind_read(reg, addr, io_buf, len)\
0276 trace_io_read(reg, addr, io_buf, len)
0277 #define _trace_io_read(reg, io_buf, len) trace_io_read(reg, -1, io_buf, len)
0278
0279 DECLARE_EVENT_CLASS(io_data32,
0280 TP_PROTO(int reg, int addr, u32 val),
0281 TP_ARGS(reg, addr, val),
0282 TP_STRUCT__entry(
0283 __field(int, reg)
0284 __field(int, addr)
0285 __field(int, val)
0286 __array(u8, addr_str, 10)
0287 ),
0288 TP_fast_assign(
0289 __entry->reg = reg;
0290 __entry->addr = addr;
0291 __entry->val = val;
0292 if (addr >= 0)
0293 snprintf(__entry->addr_str, 10, "/%08x", addr);
0294 else
0295 __entry->addr_str[0] = 0;
0296 ),
0297 TP_printk("%s%s: %08x",
0298 __print_symbolic(__entry->reg, wfx_reg_list),
0299 __entry->addr_str,
0300 __entry->val
0301 )
0302 );
0303 DEFINE_EVENT(io_data32, io_write32,
0304 TP_PROTO(int reg, int addr, u32 val),
0305 TP_ARGS(reg, addr, val));
0306 #define _trace_io_ind_write32(reg, addr, val) trace_io_write32(reg, addr, val)
0307 #define _trace_io_write32(reg, val) trace_io_write32(reg, -1, val)
0308 DEFINE_EVENT(io_data32, io_read32,
0309 TP_PROTO(int reg, int addr, u32 val),
0310 TP_ARGS(reg, addr, val));
0311 #define _trace_io_ind_read32(reg, addr, val) trace_io_read32(reg, addr, val)
0312 #define _trace_io_read32(reg, val) trace_io_read32(reg, -1, val)
0313
0314 DECLARE_EVENT_CLASS(piggyback,
0315 TP_PROTO(u32 val, bool ignored),
0316 TP_ARGS(val, ignored),
0317 TP_STRUCT__entry(
0318 __field(int, val)
0319 __field(bool, ignored)
0320 ),
0321 TP_fast_assign(
0322 __entry->val = val;
0323 __entry->ignored = ignored;
0324 ),
0325 TP_printk("CONTROL: %08x%s",
0326 __entry->val,
0327 __entry->ignored ? " (ignored)" : ""
0328 )
0329 );
0330 DEFINE_EVENT(piggyback, piggyback,
0331 TP_PROTO(u32 val, bool ignored),
0332 TP_ARGS(val, ignored));
0333 #define _trace_piggyback(val, ignored) trace_piggyback(val, ignored)
0334
0335 TRACE_EVENT(bh_stats,
0336 TP_PROTO(int ind, int req, int cnf, int busy, bool release),
0337 TP_ARGS(ind, req, cnf, busy, release),
0338 TP_STRUCT__entry(
0339 __field(int, ind)
0340 __field(int, req)
0341 __field(int, cnf)
0342 __field(int, busy)
0343 __field(bool, release)
0344 ),
0345 TP_fast_assign(
0346 __entry->ind = ind;
0347 __entry->req = req;
0348 __entry->cnf = cnf;
0349 __entry->busy = busy;
0350 __entry->release = release;
0351 ),
0352 TP_printk("IND/REQ/CNF:%3d/%3d/%3d, REQ in progress:%3d, WUP: %s",
0353 __entry->ind,
0354 __entry->req,
0355 __entry->cnf,
0356 __entry->busy,
0357 __entry->release ? "release" : "keep"
0358 )
0359 );
0360 #define _trace_bh_stats(ind, req, cnf, busy, release)\
0361 trace_bh_stats(ind, req, cnf, busy, release)
0362
0363 TRACE_EVENT(tx_stats,
0364 TP_PROTO(const struct wfx_hif_cnf_tx *tx_cnf, const struct sk_buff *skb,
0365 int delay),
0366 TP_ARGS(tx_cnf, skb, delay),
0367 TP_STRUCT__entry(
0368 __field(int, pkt_id)
0369 __field(int, delay_media)
0370 __field(int, delay_queue)
0371 __field(int, delay_fw)
0372 __field(int, ack_failures)
0373 __field(int, flags)
0374 __array(int, rate, 4)
0375 __array(int, tx_count, 4)
0376 ),
0377 TP_fast_assign(
0378
0379 static const int hw_rate[] = { 0, 1, 2, 3, 6, 7, 8, 9, 10, 11, 12, 13 };
0380 const struct ieee80211_tx_info *tx_info =
0381 (const struct ieee80211_tx_info *)skb->cb;
0382 const struct ieee80211_tx_rate *rates = tx_info->driver_rates;
0383 int i;
0384
0385 __entry->pkt_id = tx_cnf->packet_id;
0386 __entry->delay_media = le32_to_cpu(tx_cnf->media_delay);
0387 __entry->delay_queue = le32_to_cpu(tx_cnf->tx_queue_delay);
0388 __entry->delay_fw = delay;
0389 __entry->ack_failures = tx_cnf->ack_failures;
0390 if (!tx_cnf->status || __entry->ack_failures)
0391 __entry->ack_failures += 1;
0392
0393 for (i = 0; i < IEEE80211_NUM_ACS; i++) {
0394 if (rates[0].flags & IEEE80211_TX_RC_MCS)
0395 __entry->rate[i] = rates[i].idx;
0396 else
0397 __entry->rate[i] = hw_rate[rates[i].idx];
0398 __entry->tx_count[i] = rates[i].count;
0399 }
0400 __entry->flags = 0;
0401 if (rates[0].flags & IEEE80211_TX_RC_MCS)
0402 __entry->flags |= 0x01;
0403 if (rates[0].flags & IEEE80211_TX_RC_SHORT_GI)
0404 __entry->flags |= 0x02;
0405 if (rates[0].flags & IEEE80211_TX_RC_GREEN_FIELD)
0406 __entry->flags |= 0x04;
0407 if (rates[0].flags & IEEE80211_TX_RC_USE_RTS_CTS)
0408 __entry->flags |= 0x08;
0409 if (tx_info->flags & IEEE80211_TX_CTL_SEND_AFTER_DTIM)
0410 __entry->flags |= 0x10;
0411 if (tx_cnf->status)
0412 __entry->flags |= 0x20;
0413 if (tx_cnf->status == HIF_STATUS_TX_FAIL_REQUEUE)
0414 __entry->flags |= 0x40;
0415 ),
0416 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",
0417 __entry->pkt_id,
0418 __print_flags(__entry->flags, NULL,
0419 { 0x01, "M" }, { 0x02, "S" }, { 0x04, "G" }, { 0x08, "R" },
0420 { 0x10, "D" }, { 0x20, "F" }, { 0x40, "Q" }),
0421 __entry->rate[0],
0422 __entry->tx_count[0],
0423 __entry->rate[1],
0424 __entry->tx_count[1],
0425 __entry->rate[2],
0426 __entry->tx_count[2],
0427 __entry->rate[3],
0428 __entry->tx_count[3],
0429 __entry->ack_failures,
0430 __entry->delay_media,
0431 __entry->delay_queue,
0432 __entry->delay_fw
0433 )
0434 );
0435 #define _trace_tx_stats(tx_cnf, skb, delay) trace_tx_stats(tx_cnf, skb, delay)
0436
0437 TRACE_EVENT(queues_stats,
0438 TP_PROTO(struct wfx_dev *wdev, const struct wfx_queue *elected_queue),
0439 TP_ARGS(wdev, elected_queue),
0440 TP_STRUCT__entry(
0441 __field(int, vif_id)
0442 __field(int, queue_id)
0443 __array(int, hw, IEEE80211_NUM_ACS * 2)
0444 __array(int, drv, IEEE80211_NUM_ACS * 2)
0445 __array(int, cab, IEEE80211_NUM_ACS * 2)
0446 ),
0447 TP_fast_assign(
0448 const struct wfx_queue *queue;
0449 struct wfx_vif *wvif;
0450 int i, j;
0451
0452 for (j = 0; j < IEEE80211_NUM_ACS * 2; j++) {
0453 __entry->hw[j] = -1;
0454 __entry->drv[j] = -1;
0455 __entry->cab[j] = -1;
0456 }
0457 __entry->vif_id = -1;
0458 __entry->queue_id = -1;
0459 wvif = NULL;
0460 while ((wvif = wvif_iterate(wdev, wvif)) != NULL) {
0461 for (i = 0; i < IEEE80211_NUM_ACS; i++) {
0462 j = wvif->id * IEEE80211_NUM_ACS + i;
0463 WARN_ON(j >= IEEE80211_NUM_ACS * 2);
0464 queue = &wvif->tx_queue[i];
0465 __entry->hw[j] = atomic_read(&queue->pending_frames);
0466 __entry->drv[j] = skb_queue_len(&queue->normal);
0467 __entry->cab[j] = skb_queue_len(&queue->cab);
0468 if (queue == elected_queue) {
0469 __entry->vif_id = wvif->id;
0470 __entry->queue_id = i;
0471 }
0472 }
0473 }
0474 ),
0475 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 ]",
0476 __entry->vif_id, __entry->queue_id,
0477 __entry->hw[0], __entry->drv[0], __entry->cab[0],
0478 __entry->hw[1], __entry->drv[1], __entry->cab[1],
0479 __entry->hw[2], __entry->drv[2], __entry->cab[2],
0480 __entry->hw[3], __entry->drv[3], __entry->cab[3],
0481 __entry->hw[4], __entry->drv[4], __entry->cab[4],
0482 __entry->hw[5], __entry->drv[5], __entry->cab[5],
0483 __entry->hw[6], __entry->drv[6], __entry->cab[6],
0484 __entry->hw[7], __entry->drv[7], __entry->cab[7]
0485 )
0486 );
0487
0488 #endif
0489
0490
0491 #undef TRACE_INCLUDE_PATH
0492 #define TRACE_INCLUDE_PATH .
0493 #undef TRACE_INCLUDE_FILE
0494 #define TRACE_INCLUDE_FILE traces
0495
0496 #include <trace/define_trace.h>