497 lines
16 KiB
C
497 lines
16 KiB
C
|
/* SPDX-License-Identifier: GPL-2.0-only */
|
||
|
/*
|
||
|
* Tracepoints definitions.
|
||
|
*
|
||
|
* Copyright (c) 2018-2020, Silicon Laboratories, Inc.
|
||
|
*/
|
||
|
|
||
|
#undef TRACE_SYSTEM
|
||
|
#define TRACE_SYSTEM wfx
|
||
|
|
||
|
#if !defined(_WFX_TRACE_H) || defined(TRACE_HEADER_MULTI_READ)
|
||
|
#define _WFX_TRACE_H
|
||
|
|
||
|
#include <linux/tracepoint.h>
|
||
|
#include <net/mac80211.h>
|
||
|
|
||
|
#include "bus.h"
|
||
|
#include "hif_api_cmd.h"
|
||
|
#include "hif_api_mib.h"
|
||
|
|
||
|
/* The hell below need some explanations. For each symbolic number, we need to define it with
|
||
|
* TRACE_DEFINE_ENUM() and in a list for __print_symbolic.
|
||
|
*
|
||
|
* 1. Define a new macro that call TRACE_DEFINE_ENUM():
|
||
|
*
|
||
|
* #define xxx_name(sym) TRACE_DEFINE_ENUM(sym);
|
||
|
*
|
||
|
* 2. Define list of all symbols:
|
||
|
*
|
||
|
* #define list_names \
|
||
|
* ... \
|
||
|
* xxx_name(XXX) \
|
||
|
* ...
|
||
|
*
|
||
|
* 3. Instantiate that list_names:
|
||
|
*
|
||
|
* list_names
|
||
|
*
|
||
|
* 4. Redefine xxx_name() as an entry of array for __print_symbolic()
|
||
|
*
|
||
|
* #undef xxx_name
|
||
|
* #define xxx_name(msg) { msg, #msg },
|
||
|
*
|
||
|
* 5. list_name can now nearly be used with __print_symbolic() but, __print_symbolic() dislike
|
||
|
* last comma of list. So we define a new list with a dummy element:
|
||
|
*
|
||
|
* #define list_for_print_symbolic list_names { -1, NULL }
|
||
|
*/
|
||
|
|
||
|
#define _hif_msg_list \
|
||
|
hif_cnf_name(ADD_KEY) \
|
||
|
hif_cnf_name(BEACON_TRANSMIT) \
|
||
|
hif_cnf_name(EDCA_QUEUE_PARAMS) \
|
||
|
hif_cnf_name(JOIN) \
|
||
|
hif_cnf_name(MAP_LINK) \
|
||
|
hif_cnf_name(READ_MIB) \
|
||
|
hif_cnf_name(REMOVE_KEY) \
|
||
|
hif_cnf_name(RESET) \
|
||
|
hif_cnf_name(SET_BSS_PARAMS) \
|
||
|
hif_cnf_name(SET_PM_MODE) \
|
||
|
hif_cnf_name(START) \
|
||
|
hif_cnf_name(START_SCAN) \
|
||
|
hif_cnf_name(STOP_SCAN) \
|
||
|
hif_cnf_name(TX) \
|
||
|
hif_cnf_name(MULTI_TRANSMIT) \
|
||
|
hif_cnf_name(UPDATE_IE) \
|
||
|
hif_cnf_name(WRITE_MIB) \
|
||
|
hif_cnf_name(CONFIGURATION) \
|
||
|
hif_cnf_name(CONTROL_GPIO) \
|
||
|
hif_cnf_name(PREVENT_ROLLBACK) \
|
||
|
hif_cnf_name(SET_SL_MAC_KEY) \
|
||
|
hif_cnf_name(SL_CONFIGURE) \
|
||
|
hif_cnf_name(SL_EXCHANGE_PUB_KEYS) \
|
||
|
hif_cnf_name(SHUT_DOWN) \
|
||
|
hif_ind_name(EVENT) \
|
||
|
hif_ind_name(JOIN_COMPLETE) \
|
||
|
hif_ind_name(RX) \
|
||
|
hif_ind_name(SCAN_CMPL) \
|
||
|
hif_ind_name(SET_PM_MODE_CMPL) \
|
||
|
hif_ind_name(SUSPEND_RESUME_TX) \
|
||
|
hif_ind_name(SL_EXCHANGE_PUB_KEYS) \
|
||
|
hif_ind_name(ERROR) \
|
||
|
hif_ind_name(EXCEPTION) \
|
||
|
hif_ind_name(GENERIC) \
|
||
|
hif_ind_name(WAKEUP) \
|
||
|
hif_ind_name(STARTUP)
|
||
|
|
||
|
#define hif_msg_list_enum _hif_msg_list
|
||
|
|
||
|
#undef hif_cnf_name
|
||
|
#undef hif_ind_name
|
||
|
#define hif_cnf_name(msg) TRACE_DEFINE_ENUM(HIF_CNF_ID_##msg);
|
||
|
#define hif_ind_name(msg) TRACE_DEFINE_ENUM(HIF_IND_ID_##msg);
|
||
|
hif_msg_list_enum
|
||
|
#undef hif_cnf_name
|
||
|
#undef hif_ind_name
|
||
|
#define hif_cnf_name(msg) { HIF_CNF_ID_##msg, #msg },
|
||
|
#define hif_ind_name(msg) { HIF_IND_ID_##msg, #msg },
|
||
|
#define hif_msg_list hif_msg_list_enum { -1, NULL }
|
||
|
|
||
|
#define _hif_mib_list \
|
||
|
hif_mib_name(ARP_IP_ADDRESSES_TABLE) \
|
||
|
hif_mib_name(ARP_KEEP_ALIVE_PERIOD) \
|
||
|
hif_mib_name(BEACON_FILTER_ENABLE) \
|
||
|
hif_mib_name(BEACON_FILTER_TABLE) \
|
||
|
hif_mib_name(BEACON_STATS) \
|
||
|
hif_mib_name(BEACON_WAKEUP_PERIOD) \
|
||
|
hif_mib_name(BLOCK_ACK_POLICY) \
|
||
|
hif_mib_name(CCA_CONFIG) \
|
||
|
hif_mib_name(CONFIG_DATA_FILTER) \
|
||
|
hif_mib_name(COUNTERS_TABLE) \
|
||
|
hif_mib_name(CURRENT_TX_POWER_LEVEL) \
|
||
|
hif_mib_name(DOT11_MAC_ADDRESS) \
|
||
|
hif_mib_name(DOT11_MAX_RECEIVE_LIFETIME) \
|
||
|
hif_mib_name(DOT11_MAX_TRANSMIT_MSDU_LIFETIME) \
|
||
|
hif_mib_name(DOT11_RTS_THRESHOLD) \
|
||
|
hif_mib_name(DOT11_WEP_DEFAULT_KEY_ID) \
|
||
|
hif_mib_name(ETHERTYPE_DATAFRAME_CONDITION) \
|
||
|
hif_mib_name(EXTENDED_COUNTERS_TABLE) \
|
||
|
hif_mib_name(GL_BLOCK_ACK_INFO) \
|
||
|
hif_mib_name(GL_OPERATIONAL_POWER_MODE) \
|
||
|
hif_mib_name(GL_SET_MULTI_MSG) \
|
||
|
hif_mib_name(GRP_SEQ_COUNTER) \
|
||
|
hif_mib_name(INACTIVITY_TIMER) \
|
||
|
hif_mib_name(INTERFACE_PROTECTION) \
|
||
|
hif_mib_name(IPV4_ADDR_DATAFRAME_CONDITION) \
|
||
|
hif_mib_name(IPV6_ADDR_DATAFRAME_CONDITION) \
|
||
|
hif_mib_name(KEEP_ALIVE_PERIOD) \
|
||
|
hif_mib_name(MAC_ADDR_DATAFRAME_CONDITION) \
|
||
|
hif_mib_name(MAGIC_DATAFRAME_CONDITION) \
|
||
|
hif_mib_name(MAX_TX_POWER_LEVEL) \
|
||
|
hif_mib_name(NON_ERP_PROTECTION) \
|
||
|
hif_mib_name(NS_IP_ADDRESSES_TABLE) \
|
||
|
hif_mib_name(OVERRIDE_INTERNAL_TX_RATE) \
|
||
|
hif_mib_name(PORT_DATAFRAME_CONDITION) \
|
||
|
hif_mib_name(PROTECTED_MGMT_POLICY) \
|
||
|
hif_mib_name(RCPI_RSSI_THRESHOLD) \
|
||
|
hif_mib_name(RX_FILTER) \
|
||
|
hif_mib_name(SET_ASSOCIATION_MODE) \
|
||
|
hif_mib_name(SET_DATA_FILTERING) \
|
||
|
hif_mib_name(SET_HT_PROTECTION) \
|
||
|
hif_mib_name(SET_TX_RATE_RETRY_POLICY) \
|
||
|
hif_mib_name(SET_UAPSD_INFORMATION) \
|
||
|
hif_mib_name(SLOT_TIME) \
|
||
|
hif_mib_name(STATISTICS_TABLE) \
|
||
|
hif_mib_name(TEMPLATE_FRAME) \
|
||
|
hif_mib_name(TSF_COUNTER) \
|
||
|
hif_mib_name(UC_MC_BC_DATAFRAME_CONDITION)
|
||
|
|
||
|
#define hif_mib_list_enum _hif_mib_list
|
||
|
|
||
|
#undef hif_mib_name
|
||
|
#define hif_mib_name(mib) TRACE_DEFINE_ENUM(HIF_MIB_ID_##mib);
|
||
|
hif_mib_list_enum
|
||
|
#undef hif_mib_name
|
||
|
#define hif_mib_name(mib) { HIF_MIB_ID_##mib, #mib },
|
||
|
#define hif_mib_list hif_mib_list_enum { -1, NULL }
|
||
|
|
||
|
DECLARE_EVENT_CLASS(hif_data,
|
||
|
TP_PROTO(const struct wfx_hif_msg *hif, int tx_fill_level, bool is_recv),
|
||
|
TP_ARGS(hif, tx_fill_level, is_recv),
|
||
|
TP_STRUCT__entry(
|
||
|
__field(int, tx_fill_level)
|
||
|
__field(int, msg_id)
|
||
|
__field(const char *, msg_type)
|
||
|
__field(int, msg_len)
|
||
|
__field(int, buf_len)
|
||
|
__field(int, if_id)
|
||
|
__field(int, mib)
|
||
|
__array(u8, buf, 128)
|
||
|
),
|
||
|
TP_fast_assign(
|
||
|
int header_len;
|
||
|
|
||
|
__entry->tx_fill_level = tx_fill_level;
|
||
|
__entry->msg_len = le16_to_cpu(hif->len);
|
||
|
__entry->msg_id = hif->id;
|
||
|
__entry->if_id = hif->interface;
|
||
|
if (is_recv)
|
||
|
__entry->msg_type = __entry->msg_id & 0x80 ? "IND" : "CNF";
|
||
|
else
|
||
|
__entry->msg_type = "REQ";
|
||
|
if (!is_recv &&
|
||
|
(__entry->msg_id == HIF_REQ_ID_READ_MIB ||
|
||
|
__entry->msg_id == HIF_REQ_ID_WRITE_MIB)) {
|
||
|
__entry->mib = le16_to_cpup((__le16 *)hif->body);
|
||
|
header_len = 4;
|
||
|
} else {
|
||
|
__entry->mib = -1;
|
||
|
header_len = 0;
|
||
|
}
|
||
|
__entry->buf_len = min_t(int, __entry->msg_len, sizeof(__entry->buf))
|
||
|
- sizeof(struct wfx_hif_msg) - header_len;
|
||
|
memcpy(__entry->buf, hif->body + header_len, __entry->buf_len);
|
||
|
),
|
||
|
TP_printk("%d:%d:%s_%s%s%s: %s%s (%d bytes)",
|
||
|
__entry->tx_fill_level,
|
||
|
__entry->if_id,
|
||
|
__entry->msg_type,
|
||
|
__print_symbolic(__entry->msg_id, hif_msg_list),
|
||
|
__entry->mib != -1 ? "/" : "",
|
||
|
__entry->mib != -1 ? __print_symbolic(__entry->mib, hif_mib_list) : "",
|
||
|
__print_hex(__entry->buf, __entry->buf_len),
|
||
|
__entry->msg_len > sizeof(__entry->buf) ? " ..." : "",
|
||
|
__entry->msg_len
|
||
|
)
|
||
|
);
|
||
|
DEFINE_EVENT(hif_data, hif_send,
|
||
|
TP_PROTO(const struct wfx_hif_msg *hif, int tx_fill_level, bool is_recv),
|
||
|
TP_ARGS(hif, tx_fill_level, is_recv));
|
||
|
#define _trace_hif_send(hif, tx_fill_level)\
|
||
|
trace_hif_send(hif, tx_fill_level, false)
|
||
|
DEFINE_EVENT(hif_data, hif_recv,
|
||
|
TP_PROTO(const struct wfx_hif_msg *hif, int tx_fill_level, bool is_recv),
|
||
|
TP_ARGS(hif, tx_fill_level, is_recv));
|
||
|
#define _trace_hif_recv(hif, tx_fill_level)\
|
||
|
trace_hif_recv(hif, tx_fill_level, true)
|
||
|
|
||
|
#define wfx_reg_list_enum \
|
||
|
wfx_reg_name(WFX_REG_CONFIG, "CONFIG") \
|
||
|
wfx_reg_name(WFX_REG_CONTROL, "CONTROL") \
|
||
|
wfx_reg_name(WFX_REG_IN_OUT_QUEUE, "QUEUE") \
|
||
|
wfx_reg_name(WFX_REG_AHB_DPORT, "AHB") \
|
||
|
wfx_reg_name(WFX_REG_BASE_ADDR, "BASE_ADDR") \
|
||
|
wfx_reg_name(WFX_REG_SRAM_DPORT, "SRAM") \
|
||
|
wfx_reg_name(WFX_REG_SET_GEN_R_W, "SET_GEN_R_W") \
|
||
|
wfx_reg_name(WFX_REG_FRAME_OUT, "FRAME_OUT")
|
||
|
|
||
|
#undef wfx_reg_name
|
||
|
#define wfx_reg_name(sym, name) TRACE_DEFINE_ENUM(sym);
|
||
|
wfx_reg_list_enum
|
||
|
#undef wfx_reg_name
|
||
|
#define wfx_reg_name(sym, name) { sym, name },
|
||
|
#define wfx_reg_list wfx_reg_list_enum { -1, NULL }
|
||
|
|
||
|
DECLARE_EVENT_CLASS(io_data,
|
||
|
TP_PROTO(int reg, int addr, const void *io_buf, size_t len),
|
||
|
TP_ARGS(reg, addr, io_buf, len),
|
||
|
TP_STRUCT__entry(
|
||
|
__field(int, reg)
|
||
|
__field(int, addr)
|
||
|
__field(int, msg_len)
|
||
|
__field(int, buf_len)
|
||
|
__array(u8, buf, 32)
|
||
|
__array(u8, addr_str, 10)
|
||
|
),
|
||
|
TP_fast_assign(
|
||
|
__entry->reg = reg;
|
||
|
__entry->addr = addr;
|
||
|
__entry->msg_len = len;
|
||
|
__entry->buf_len = min_t(int, sizeof(__entry->buf), __entry->msg_len);
|
||
|
memcpy(__entry->buf, io_buf, __entry->buf_len);
|
||
|
if (addr >= 0)
|
||
|
snprintf(__entry->addr_str, 10, "/%08x", addr);
|
||
|
else
|
||
|
__entry->addr_str[0] = 0;
|
||
|
),
|
||
|
TP_printk("%s%s: %s%s (%d bytes)",
|
||
|
__print_symbolic(__entry->reg, wfx_reg_list),
|
||
|
__entry->addr_str,
|
||
|
__print_hex(__entry->buf, __entry->buf_len),
|
||
|
__entry->msg_len > sizeof(__entry->buf) ? " ..." : "",
|
||
|
__entry->msg_len
|
||
|
)
|
||
|
);
|
||
|
DEFINE_EVENT(io_data, io_write,
|
||
|
TP_PROTO(int reg, int addr, const void *io_buf, size_t len),
|
||
|
TP_ARGS(reg, addr, io_buf, len));
|
||
|
#define _trace_io_ind_write(reg, addr, io_buf, len)\
|
||
|
trace_io_write(reg, addr, io_buf, len)
|
||
|
#define _trace_io_write(reg, io_buf, len) trace_io_write(reg, -1, io_buf, len)
|
||
|
DEFINE_EVENT(io_data, io_read,
|
||
|
TP_PROTO(int reg, int addr, const void *io_buf, size_t len),
|
||
|
TP_ARGS(reg, addr, io_buf, len));
|
||
|
#define _trace_io_ind_read(reg, addr, io_buf, len)\
|
||
|
trace_io_read(reg, addr, io_buf, len)
|
||
|
#define _trace_io_read(reg, io_buf, len) trace_io_read(reg, -1, io_buf, len)
|
||
|
|
||
|
DECLARE_EVENT_CLASS(io_data32,
|
||
|
TP_PROTO(int reg, int addr, u32 val),
|
||
|
TP_ARGS(reg, addr, val),
|
||
|
TP_STRUCT__entry(
|
||
|
__field(int, reg)
|
||
|
__field(int, addr)
|
||
|
__field(int, val)
|
||
|
__array(u8, addr_str, 10)
|
||
|
),
|
||
|
TP_fast_assign(
|
||
|
__entry->reg = reg;
|
||
|
__entry->addr = addr;
|
||
|
__entry->val = val;
|
||
|
if (addr >= 0)
|
||
|
snprintf(__entry->addr_str, 10, "/%08x", addr);
|
||
|
else
|
||
|
__entry->addr_str[0] = 0;
|
||
|
),
|
||
|
TP_printk("%s%s: %08x",
|
||
|
__print_symbolic(__entry->reg, wfx_reg_list),
|
||
|
__entry->addr_str,
|
||
|
__entry->val
|
||
|
)
|
||
|
);
|
||
|
DEFINE_EVENT(io_data32, io_write32,
|
||
|
TP_PROTO(int reg, int addr, u32 val),
|
||
|
TP_ARGS(reg, addr, val));
|
||
|
#define _trace_io_ind_write32(reg, addr, val) trace_io_write32(reg, addr, val)
|
||
|
#define _trace_io_write32(reg, val) trace_io_write32(reg, -1, val)
|
||
|
DEFINE_EVENT(io_data32, io_read32,
|
||
|
TP_PROTO(int reg, int addr, u32 val),
|
||
|
TP_ARGS(reg, addr, val));
|
||
|
#define _trace_io_ind_read32(reg, addr, val) trace_io_read32(reg, addr, val)
|
||
|
#define _trace_io_read32(reg, val) trace_io_read32(reg, -1, val)
|
||
|
|
||
|
DECLARE_EVENT_CLASS(piggyback,
|
||
|
TP_PROTO(u32 val, bool ignored),
|
||
|
TP_ARGS(val, ignored),
|
||
|
TP_STRUCT__entry(
|
||
|
__field(int, val)
|
||
|
__field(bool, ignored)
|
||
|
),
|
||
|
TP_fast_assign(
|
||
|
__entry->val = val;
|
||
|
__entry->ignored = ignored;
|
||
|
),
|
||
|
TP_printk("CONTROL: %08x%s",
|
||
|
__entry->val,
|
||
|
__entry->ignored ? " (ignored)" : ""
|
||
|
)
|
||
|
);
|
||
|
DEFINE_EVENT(piggyback, piggyback,
|
||
|
TP_PROTO(u32 val, bool ignored),
|
||
|
TP_ARGS(val, ignored));
|
||
|
#define _trace_piggyback(val, ignored) trace_piggyback(val, ignored)
|
||
|
|
||
|
TRACE_EVENT(bh_stats,
|
||
|
TP_PROTO(int ind, int req, int cnf, int busy, bool release),
|
||
|
TP_ARGS(ind, req, cnf, busy, release),
|
||
|
TP_STRUCT__entry(
|
||
|
__field(int, ind)
|
||
|
__field(int, req)
|
||
|
__field(int, cnf)
|
||
|
__field(int, busy)
|
||
|
__field(bool, release)
|
||
|
),
|
||
|
TP_fast_assign(
|
||
|
__entry->ind = ind;
|
||
|
__entry->req = req;
|
||
|
__entry->cnf = cnf;
|
||
|
__entry->busy = busy;
|
||
|
__entry->release = release;
|
||
|
),
|
||
|
TP_printk("IND/REQ/CNF:%3d/%3d/%3d, REQ in progress:%3d, WUP: %s",
|
||
|
__entry->ind,
|
||
|
__entry->req,
|
||
|
__entry->cnf,
|
||
|
__entry->busy,
|
||
|
__entry->release ? "release" : "keep"
|
||
|
)
|
||
|
);
|
||
|
#define _trace_bh_stats(ind, req, cnf, busy, release)\
|
||
|
trace_bh_stats(ind, req, cnf, busy, release)
|
||
|
|
||
|
TRACE_EVENT(tx_stats,
|
||
|
TP_PROTO(const struct wfx_hif_cnf_tx *tx_cnf, const struct sk_buff *skb,
|
||
|
int delay),
|
||
|
TP_ARGS(tx_cnf, skb, delay),
|
||
|
TP_STRUCT__entry(
|
||
|
__field(int, pkt_id)
|
||
|
__field(int, delay_media)
|
||
|
__field(int, delay_queue)
|
||
|
__field(int, delay_fw)
|
||
|
__field(int, ack_failures)
|
||
|
__field(int, flags)
|
||
|
__array(int, rate, 4)
|
||
|
__array(int, tx_count, 4)
|
||
|
),
|
||
|
TP_fast_assign(
|
||
|
/* Keep sync with wfx_rates definition in main.c */
|
||
|
static const int hw_rate[] = { 0, 1, 2, 3, 6, 7, 8, 9, 10, 11, 12, 13 };
|
||
|
const struct ieee80211_tx_info *tx_info =
|
||
|
(const struct ieee80211_tx_info *)skb->cb;
|
||
|
const struct ieee80211_tx_rate *rates = tx_info->driver_rates;
|
||
|
int i;
|
||
|
|
||
|
__entry->pkt_id = tx_cnf->packet_id;
|
||
|
__entry->delay_media = le32_to_cpu(tx_cnf->media_delay);
|
||
|
__entry->delay_queue = le32_to_cpu(tx_cnf->tx_queue_delay);
|
||
|
__entry->delay_fw = delay;
|
||
|
__entry->ack_failures = tx_cnf->ack_failures;
|
||
|
if (!tx_cnf->status || __entry->ack_failures)
|
||
|
__entry->ack_failures += 1;
|
||
|
|
||
|
for (i = 0; i < IEEE80211_NUM_ACS; i++) {
|
||
|
if (rates[0].flags & IEEE80211_TX_RC_MCS)
|
||
|
__entry->rate[i] = rates[i].idx;
|
||
|
else
|
||
|
__entry->rate[i] = hw_rate[rates[i].idx];
|
||
|
__entry->tx_count[i] = rates[i].count;
|
||
|
}
|
||
|
__entry->flags = 0;
|
||
|
if (rates[0].flags & IEEE80211_TX_RC_MCS)
|
||
|
__entry->flags |= 0x01;
|
||
|
if (rates[0].flags & IEEE80211_TX_RC_SHORT_GI)
|
||
|
__entry->flags |= 0x02;
|
||
|
if (rates[0].flags & IEEE80211_TX_RC_GREEN_FIELD)
|
||
|
__entry->flags |= 0x04;
|
||
|
if (rates[0].flags & IEEE80211_TX_RC_USE_RTS_CTS)
|
||
|
__entry->flags |= 0x08;
|
||
|
if (tx_info->flags & IEEE80211_TX_CTL_SEND_AFTER_DTIM)
|
||
|
__entry->flags |= 0x10;
|
||
|
if (tx_cnf->status)
|
||
|
__entry->flags |= 0x20;
|
||
|
if (tx_cnf->status == HIF_STATUS_TX_FAIL_REQUEUE)
|
||
|
__entry->flags |= 0x40;
|
||
|
),
|
||
|
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",
|
||
|
__entry->pkt_id,
|
||
|
__print_flags(__entry->flags, NULL,
|
||
|
{ 0x01, "M" }, { 0x02, "S" }, { 0x04, "G" }, { 0x08, "R" },
|
||
|
{ 0x10, "D" }, { 0x20, "F" }, { 0x40, "Q" }),
|
||
|
__entry->rate[0],
|
||
|
__entry->tx_count[0],
|
||
|
__entry->rate[1],
|
||
|
__entry->tx_count[1],
|
||
|
__entry->rate[2],
|
||
|
__entry->tx_count[2],
|
||
|
__entry->rate[3],
|
||
|
__entry->tx_count[3],
|
||
|
__entry->ack_failures,
|
||
|
__entry->delay_media,
|
||
|
__entry->delay_queue,
|
||
|
__entry->delay_fw
|
||
|
)
|
||
|
);
|
||
|
#define _trace_tx_stats(tx_cnf, skb, delay) trace_tx_stats(tx_cnf, skb, delay)
|
||
|
|
||
|
TRACE_EVENT(queues_stats,
|
||
|
TP_PROTO(struct wfx_dev *wdev, const struct wfx_queue *elected_queue),
|
||
|
TP_ARGS(wdev, elected_queue),
|
||
|
TP_STRUCT__entry(
|
||
|
__field(int, vif_id)
|
||
|
__field(int, queue_id)
|
||
|
__array(int, hw, IEEE80211_NUM_ACS * 2)
|
||
|
__array(int, drv, IEEE80211_NUM_ACS * 2)
|
||
|
__array(int, cab, IEEE80211_NUM_ACS * 2)
|
||
|
),
|
||
|
TP_fast_assign(
|
||
|
const struct wfx_queue *queue;
|
||
|
struct wfx_vif *wvif;
|
||
|
int i, j;
|
||
|
|
||
|
for (j = 0; j < IEEE80211_NUM_ACS * 2; j++) {
|
||
|
__entry->hw[j] = -1;
|
||
|
__entry->drv[j] = -1;
|
||
|
__entry->cab[j] = -1;
|
||
|
}
|
||
|
__entry->vif_id = -1;
|
||
|
__entry->queue_id = -1;
|
||
|
wvif = NULL;
|
||
|
while ((wvif = wvif_iterate(wdev, wvif)) != NULL) {
|
||
|
for (i = 0; i < IEEE80211_NUM_ACS; i++) {
|
||
|
j = wvif->id * IEEE80211_NUM_ACS + i;
|
||
|
WARN_ON(j >= IEEE80211_NUM_ACS * 2);
|
||
|
queue = &wvif->tx_queue[i];
|
||
|
__entry->hw[j] = atomic_read(&queue->pending_frames);
|
||
|
__entry->drv[j] = skb_queue_len(&queue->normal);
|
||
|
__entry->cab[j] = skb_queue_len(&queue->cab);
|
||
|
if (queue == elected_queue) {
|
||
|
__entry->vif_id = wvif->id;
|
||
|
__entry->queue_id = i;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
),
|
||
|
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 ]",
|
||
|
__entry->vif_id, __entry->queue_id,
|
||
|
__entry->hw[0], __entry->drv[0], __entry->cab[0],
|
||
|
__entry->hw[1], __entry->drv[1], __entry->cab[1],
|
||
|
__entry->hw[2], __entry->drv[2], __entry->cab[2],
|
||
|
__entry->hw[3], __entry->drv[3], __entry->cab[3],
|
||
|
__entry->hw[4], __entry->drv[4], __entry->cab[4],
|
||
|
__entry->hw[5], __entry->drv[5], __entry->cab[5],
|
||
|
__entry->hw[6], __entry->drv[6], __entry->cab[6],
|
||
|
__entry->hw[7], __entry->drv[7], __entry->cab[7]
|
||
|
)
|
||
|
);
|
||
|
|
||
|
#endif
|
||
|
|
||
|
/* This part must be outside protection */
|
||
|
#undef TRACE_INCLUDE_PATH
|
||
|
#define TRACE_INCLUDE_PATH .
|
||
|
#undef TRACE_INCLUDE_FILE
|
||
|
#define TRACE_INCLUDE_FILE traces
|
||
|
|
||
|
#include <trace/define_trace.h>
|