Commit 1cc298c9 authored by Jérôme Pouiller's avatar Jérôme Pouiller Committed by Greg Kroah-Hartman
Browse files

staging: wfx: add tracepoints for HIF



These tracepoints decode HIF headers and provide more human readable
results.

Signed-off-by: default avatarJérôme Pouiller <jerome.pouiller@silabs.com>
Link: https://lore.kernel.org/r/20190919142527.31797-9-Jerome.Pouiller@silabs.com


Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent b0998f0c
Loading
Loading
Loading
Loading
+5 −0
Original line number Diff line number Diff line
@@ -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);
}

/*
+211 −0
Original line number Diff line number Diff line
@@ -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 */