0001
0002 #if !defined(_ATH6KL_TRACE_H) || defined(TRACE_HEADER_MULTI_READ)
0003
0004 #include <net/cfg80211.h>
0005 #include <linux/skbuff.h>
0006 #include <linux/tracepoint.h>
0007 #include "wmi.h"
0008 #include "hif.h"
0009
0010 #if !defined(_ATH6KL_TRACE_H)
0011 static inline unsigned int ath6kl_get_wmi_id(void *buf, size_t buf_len)
0012 {
0013 struct wmi_cmd_hdr *hdr = buf;
0014
0015 if (buf_len < sizeof(*hdr))
0016 return 0;
0017
0018 return le16_to_cpu(hdr->cmd_id);
0019 }
0020 #endif
0021
0022 #define _ATH6KL_TRACE_H
0023
0024
0025 #if !defined(CONFIG_ATH6KL_TRACING)
0026 #undef TRACE_EVENT
0027 #define TRACE_EVENT(name, proto, ...) \
0028 static inline void trace_ ## name(proto) {}
0029 #undef DECLARE_EVENT_CLASS
0030 #define DECLARE_EVENT_CLASS(...)
0031 #undef DEFINE_EVENT
0032 #define DEFINE_EVENT(evt_class, name, proto, ...) \
0033 static inline void trace_ ## name(proto) {}
0034 #endif
0035
0036 #undef TRACE_SYSTEM
0037 #define TRACE_SYSTEM ath6kl
0038
0039 TRACE_EVENT(ath6kl_wmi_cmd,
0040 TP_PROTO(void *buf, size_t buf_len),
0041
0042 TP_ARGS(buf, buf_len),
0043
0044 TP_STRUCT__entry(
0045 __field(unsigned int, id)
0046 __field(size_t, buf_len)
0047 __dynamic_array(u8, buf, buf_len)
0048 ),
0049
0050 TP_fast_assign(
0051 __entry->id = ath6kl_get_wmi_id(buf, buf_len);
0052 __entry->buf_len = buf_len;
0053 memcpy(__get_dynamic_array(buf), buf, buf_len);
0054 ),
0055
0056 TP_printk(
0057 "id %d len %zd",
0058 __entry->id, __entry->buf_len
0059 )
0060 );
0061
0062 TRACE_EVENT(ath6kl_wmi_event,
0063 TP_PROTO(void *buf, size_t buf_len),
0064
0065 TP_ARGS(buf, buf_len),
0066
0067 TP_STRUCT__entry(
0068 __field(unsigned int, id)
0069 __field(size_t, buf_len)
0070 __dynamic_array(u8, buf, buf_len)
0071 ),
0072
0073 TP_fast_assign(
0074 __entry->id = ath6kl_get_wmi_id(buf, buf_len);
0075 __entry->buf_len = buf_len;
0076 memcpy(__get_dynamic_array(buf), buf, buf_len);
0077 ),
0078
0079 TP_printk(
0080 "id %d len %zd",
0081 __entry->id, __entry->buf_len
0082 )
0083 );
0084
0085 TRACE_EVENT(ath6kl_sdio,
0086 TP_PROTO(unsigned int addr, int flags,
0087 void *buf, size_t buf_len),
0088
0089 TP_ARGS(addr, flags, buf, buf_len),
0090
0091 TP_STRUCT__entry(
0092 __field(unsigned int, tx)
0093 __field(unsigned int, addr)
0094 __field(int, flags)
0095 __field(size_t, buf_len)
0096 __dynamic_array(u8, buf, buf_len)
0097 ),
0098
0099 TP_fast_assign(
0100 __entry->addr = addr;
0101 __entry->flags = flags;
0102 __entry->buf_len = buf_len;
0103 memcpy(__get_dynamic_array(buf), buf, buf_len);
0104
0105 if (flags & HIF_WRITE)
0106 __entry->tx = 1;
0107 else
0108 __entry->tx = 0;
0109 ),
0110
0111 TP_printk(
0112 "%s addr 0x%x flags 0x%x len %zd\n",
0113 __entry->tx ? "tx" : "rx",
0114 __entry->addr,
0115 __entry->flags,
0116 __entry->buf_len
0117 )
0118 );
0119
0120 TRACE_EVENT(ath6kl_sdio_scat,
0121 TP_PROTO(unsigned int addr, int flags, unsigned int total_len,
0122 unsigned int entries, struct hif_scatter_item *list),
0123
0124 TP_ARGS(addr, flags, total_len, entries, list),
0125
0126 TP_STRUCT__entry(
0127 __field(unsigned int, tx)
0128 __field(unsigned int, addr)
0129 __field(int, flags)
0130 __field(unsigned int, entries)
0131 __field(size_t, total_len)
0132 __dynamic_array(unsigned int, len_array, entries)
0133 __dynamic_array(u8, data, total_len)
0134 ),
0135
0136 TP_fast_assign(
0137 unsigned int *len_array;
0138 int i, offset = 0;
0139 size_t len;
0140
0141 __entry->addr = addr;
0142 __entry->flags = flags;
0143 __entry->entries = entries;
0144 __entry->total_len = total_len;
0145
0146 if (flags & HIF_WRITE)
0147 __entry->tx = 1;
0148 else
0149 __entry->tx = 0;
0150
0151 len_array = __get_dynamic_array(len_array);
0152
0153 for (i = 0; i < entries; i++) {
0154 len = list[i].len;
0155
0156 memcpy((u8 *) __get_dynamic_array(data) + offset,
0157 list[i].buf, len);
0158
0159 len_array[i] = len;
0160 offset += len;
0161 }
0162 ),
0163
0164 TP_printk(
0165 "%s addr 0x%x flags 0x%x entries %d total_len %zd\n",
0166 __entry->tx ? "tx" : "rx",
0167 __entry->addr,
0168 __entry->flags,
0169 __entry->entries,
0170 __entry->total_len
0171 )
0172 );
0173
0174 TRACE_EVENT(ath6kl_sdio_irq,
0175 TP_PROTO(void *buf, size_t buf_len),
0176
0177 TP_ARGS(buf, buf_len),
0178
0179 TP_STRUCT__entry(
0180 __field(size_t, buf_len)
0181 __dynamic_array(u8, buf, buf_len)
0182 ),
0183
0184 TP_fast_assign(
0185 __entry->buf_len = buf_len;
0186 memcpy(__get_dynamic_array(buf), buf, buf_len);
0187 ),
0188
0189 TP_printk(
0190 "irq len %zd\n", __entry->buf_len
0191 )
0192 );
0193
0194 TRACE_EVENT(ath6kl_htc_rx,
0195 TP_PROTO(int status, int endpoint, void *buf,
0196 size_t buf_len),
0197
0198 TP_ARGS(status, endpoint, buf, buf_len),
0199
0200 TP_STRUCT__entry(
0201 __field(int, status)
0202 __field(int, endpoint)
0203 __field(size_t, buf_len)
0204 __dynamic_array(u8, buf, buf_len)
0205 ),
0206
0207 TP_fast_assign(
0208 __entry->status = status;
0209 __entry->endpoint = endpoint;
0210 __entry->buf_len = buf_len;
0211 memcpy(__get_dynamic_array(buf), buf, buf_len);
0212 ),
0213
0214 TP_printk(
0215 "status %d endpoint %d len %zd\n",
0216 __entry->status,
0217 __entry->endpoint,
0218 __entry->buf_len
0219 )
0220 );
0221
0222 TRACE_EVENT(ath6kl_htc_tx,
0223 TP_PROTO(int status, int endpoint, void *buf,
0224 size_t buf_len),
0225
0226 TP_ARGS(status, endpoint, buf, buf_len),
0227
0228 TP_STRUCT__entry(
0229 __field(int, status)
0230 __field(int, endpoint)
0231 __field(size_t, buf_len)
0232 __dynamic_array(u8, buf, buf_len)
0233 ),
0234
0235 TP_fast_assign(
0236 __entry->status = status;
0237 __entry->endpoint = endpoint;
0238 __entry->buf_len = buf_len;
0239 memcpy(__get_dynamic_array(buf), buf, buf_len);
0240 ),
0241
0242 TP_printk(
0243 "status %d endpoint %d len %zd\n",
0244 __entry->status,
0245 __entry->endpoint,
0246 __entry->buf_len
0247 )
0248 );
0249
0250 #define ATH6KL_MSG_MAX 200
0251
0252 DECLARE_EVENT_CLASS(ath6kl_log_event,
0253 TP_PROTO(struct va_format *vaf),
0254 TP_ARGS(vaf),
0255 TP_STRUCT__entry(
0256 __vstring(msg, vaf->fmt, vaf->va)
0257 ),
0258 TP_fast_assign(
0259 __assign_vstr(msg, vaf->fmt, vaf->va);
0260 ),
0261 TP_printk("%s", __get_str(msg))
0262 );
0263
0264 DEFINE_EVENT(ath6kl_log_event, ath6kl_log_err,
0265 TP_PROTO(struct va_format *vaf),
0266 TP_ARGS(vaf)
0267 );
0268
0269 DEFINE_EVENT(ath6kl_log_event, ath6kl_log_warn,
0270 TP_PROTO(struct va_format *vaf),
0271 TP_ARGS(vaf)
0272 );
0273
0274 DEFINE_EVENT(ath6kl_log_event, ath6kl_log_info,
0275 TP_PROTO(struct va_format *vaf),
0276 TP_ARGS(vaf)
0277 );
0278
0279 TRACE_EVENT(ath6kl_log_dbg,
0280 TP_PROTO(unsigned int level, struct va_format *vaf),
0281 TP_ARGS(level, vaf),
0282 TP_STRUCT__entry(
0283 __field(unsigned int, level)
0284 __vstring(msg, vaf->fmt, vaf->va)
0285 ),
0286 TP_fast_assign(
0287 __entry->level = level;
0288 __assign_vstr(msg, vaf->fmt, vaf->va);
0289 ),
0290 TP_printk("%s", __get_str(msg))
0291 );
0292
0293 TRACE_EVENT(ath6kl_log_dbg_dump,
0294 TP_PROTO(const char *msg, const char *prefix,
0295 const void *buf, size_t buf_len),
0296
0297 TP_ARGS(msg, prefix, buf, buf_len),
0298
0299 TP_STRUCT__entry(
0300 __string(msg, msg)
0301 __string(prefix, prefix)
0302 __field(size_t, buf_len)
0303 __dynamic_array(u8, buf, buf_len)
0304 ),
0305
0306 TP_fast_assign(
0307 __assign_str(msg, msg);
0308 __assign_str(prefix, prefix);
0309 __entry->buf_len = buf_len;
0310 memcpy(__get_dynamic_array(buf), buf, buf_len);
0311 ),
0312
0313 TP_printk(
0314 "%s/%s\n", __get_str(prefix), __get_str(msg)
0315 )
0316 );
0317
0318 #endif
0319
0320
0321 #undef TRACE_INCLUDE_PATH
0322 #define TRACE_INCLUDE_PATH .
0323 #undef TRACE_INCLUDE_FILE
0324 #define TRACE_INCLUDE_FILE trace
0325
0326
0327 #include <trace/define_trace.h>