Eine aufbereitete Darstellung der Quelle

 
     
 
 
Anforderungen  |   Konzepte  |   Entwurf  |   Entwicklung  |   Qualitätssicherung  |   Lebenszyklus  |   Steuerung
 
 
 
 

Benutzer

Impressum traces.h

  Sprache: 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(intsizeof(__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[] = { 0123678910111213 };
  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>

Messung V0.5 in Prozent
C=96 H=93 G=94

¤ Die Informationen auf dieser Webseite wurden nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit, noch Qualität der bereit gestellten Informationen zugesichert.0.15Bemerkung:  (vorverarbeitet am  2026-06-07) ¤

*Bot Zugriff






Wurzel

Suchen

PVS Prover

Isabelle Prover

NIST Cobol Testsuite

Cephes Mathematical Library

Vienna Development Method

Haftungshinweis

Die Informationen auf dieser Webseite wurden nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit, noch Qualität der bereit gestellten Informationen zugesichert.

Bemerkung:

Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.






                                                                                                                                                                                                                                                                                                                                                                                                     


Neuigkeiten

     Aktuelles
     Motto des Tages

Open Source Software

     Quellcodebibliothek
     Eigene Quellcodes
     Fremde Quellcodes
     Suchen

Jenseits des Üblichen ....
    

Besucherstatistik

Besucherstatistik

Statistik
#Sources=277311
#Domains=752002