mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-10-06 08:46:46 +00:00
staging: wfx: add tracepoints for HIF
These tracepoints decode HIF headers and provide more human readable results. Signed-off-by: Jérôme Pouiller <jerome.pouiller@silabs.com> Link: https://lore.kernel.org/r/20190919142527.31797-9-Jerome.Pouiller@silabs.com Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
b0998f0c04
commit
1cc298c915
2 changed files with 216 additions and 0 deletions
|
@ -11,6 +11,7 @@
|
|||
#include "bh.h"
|
||||
#include "wfx.h"
|
||||
#include "hwio.h"
|
||||
#include "traces.h"
|
||||
#include "hif_api_cmd.h"
|
||||
|
||||
static void device_wakeup(struct wfx_dev *wdev)
|
||||
|
@ -67,6 +68,7 @@ static int rx_helper(struct wfx_dev *wdev, size_t read_len, int *is_cnf)
|
|||
goto err;
|
||||
|
||||
piggyback = le16_to_cpup((u16 *) (skb->data + alloc_len - 2));
|
||||
_trace_piggyback(piggyback, false);
|
||||
|
||||
hif = (struct hif_msg *) skb->data;
|
||||
WARN(hif->encrypted & 0x1, "unsupported encryption type");
|
||||
|
@ -95,6 +97,7 @@ static int rx_helper(struct wfx_dev *wdev, size_t read_len, int *is_cnf)
|
|||
if (!wdev->hif.tx_buffers_used)
|
||||
wake_up(&wdev->hif.tx_buffers_empty);
|
||||
}
|
||||
_trace_hif_recv(hif, wdev->hif.tx_buffers_used);
|
||||
|
||||
if (hif->id != HIF_IND_ID_EXCEPTION && hif->id != HIF_IND_ID_ERROR) {
|
||||
if (hif->seqnum != wdev->hif.rx_seqnum)
|
||||
|
@ -171,6 +174,7 @@ static void tx_helper(struct wfx_dev *wdev, struct hif_msg *hif)
|
|||
goto end;
|
||||
|
||||
wdev->hif.tx_buffers_used++;
|
||||
_trace_hif_send(hif, wdev->hif.tx_buffers_used);
|
||||
end:
|
||||
if (is_encrypted)
|
||||
kfree(data);
|
||||
|
@ -234,6 +238,7 @@ static void bh_work(struct work_struct *work)
|
|||
device_release(wdev);
|
||||
release_chip = true;
|
||||
}
|
||||
_trace_bh_stats(stats_ind, stats_req, stats_cnf, wdev->hif.tx_buffers_used, release_chip);
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
@ -14,6 +14,8 @@
|
|||
#include <linux/tracepoint.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.
|
||||
|
@ -45,6 +47,167 @@
|
|||
* #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_WAKEUP_PERIOD) \
|
||||
hif_mib_name(BLOCK_ACK_POLICY) \
|
||||
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(GL_BLOCK_ACK_INFO) \
|
||||
hif_mib_name(GL_OPERATIONAL_POWER_MODE) \
|
||||
hif_mib_name(GL_SET_MULTI_MSG) \
|
||||
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(NON_ERP_PROTECTION) \
|
||||
hif_mib_name(NS_IP_ADDRESSES_TABLE) \
|
||||
hif_mib_name(OVERRIDE_INTERNAL_TX_RATE) \
|
||||
hif_mib_name(PROTECTED_MGMT_POLICY) \
|
||||
hif_mib_name(RX_FILTER) \
|
||||
hif_mib_name(RCPI_RSSI_THRESHOLD) \
|
||||
hif_mib_name(SET_ASSOCIATION_MODE) \
|
||||
hif_mib_name(SET_DATA_FILTERING) \
|
||||
hif_mib_name(ETHERTYPE_DATAFRAME_CONDITION) \
|
||||
hif_mib_name(SET_HT_PROTECTION) \
|
||||
hif_mib_name(MAGIC_DATAFRAME_CONDITION) \
|
||||
hif_mib_name(SET_TX_RATE_RETRY_POLICY) \
|
||||
hif_mib_name(SET_UAPSD_INFORMATION) \
|
||||
hif_mib_name(PORT_DATAFRAME_CONDITION) \
|
||||
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(struct 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 = 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((u16 *) 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 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,
|
||||
__print_symbolic(__entry->msg_id, hif_msg_list),
|
||||
__entry->msg_type,
|
||||
__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(struct 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(struct 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") \
|
||||
|
@ -138,6 +301,54 @@ DEFINE_EVENT(io_data32, io_read32,
|
|||
#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)
|
||||
|
||||
#endif
|
||||
|
||||
/* This part must be outside protection */
|
||||
|
|
Loading…
Reference in a new issue