/*
 * Copyright (c) 2014 Qualcomm Atheros, Inc.
 *
 * Permission to use, copy, modify, and/or distribute this software for any
 * purpose with or without fee is hereby granted, provided that the above
 * copyright notice and this permission notice appear in all copies.
 *
 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 */

#if !defined(_TRACE_H) || defined(TRACE_HEADER_MULTI_READ)
#define _TRACE_H

#include <linux/tracepoint.h>
#include "ath.h"

#undef TRACE_SYSTEM
#define TRACE_SYSTEM ath

#if !defined(CONFIG_ATH_TRACEPOINTS)

#undef TRACE_EVENT
#define TRACE_EVENT(name, proto, ...) \
  static inline void trace_##name(proto) {}

#endif /* CONFIG_ATH_TRACEPOINTS */

// clang-format off
TRACE_EVENT(ath_log,

            TP_PROTO(struct wiphy* wiphy,
                     struct va_format* vaf),

            TP_ARGS(wiphy, vaf),

            TP_STRUCT__entry(
                __string(device, wiphy_name(wiphy))
                __string(driver, KBUILD_MODNAME)
                __dynamic_array(char, msg, ATH_DBG_MAX_LEN)
            ),

            TP_fast_assign(
                __assign_str(device, wiphy_name(wiphy));
                __assign_str(driver, KBUILD_MODNAME);
                WARN_ON_ONCE(vsnprintf(__get_dynamic_array(msg),
                                       ATH_DBG_MAX_LEN,
                                       vaf->fmt,
                                       *vaf->va) >= ATH_DBG_MAX_LEN);
            ),

            TP_printk(
                "%s %s %s",
                __get_str(driver),
                __get_str(device),
                __get_str(msg)
            )
           );
// clang-format on

#endif /* _TRACE_H || TRACE_HEADER_MULTI_READ */

#undef TRACE_INCLUDE_PATH
#define TRACE_INCLUDE_PATH .
#undef TRACE_INCLUDE_FILE
#define TRACE_INCLUDE_FILE trace

/* This part must be outside protection */
#include <trace/define_trace.h>
