/*
 * Copyright (c) 2005-2011 Atheros Communications Inc.
 * Copyright (c) 2011-2013 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.
 */

#ifndef GARNET_DRIVERS_WLAN_THIRD_PARTY_ATHEROS_ATH10K_DEBUG_H_
#define GARNET_DRIVERS_WLAN_THIRD_PARTY_ATHEROS_ATH10K_DEBUG_H_

#include <stdint.h>

#include <ddk/debug.h>

enum ath10k_debug_mask {
    // clang-format off
    ATH10K_DBG_PCI          = 0x00000001,
    ATH10K_DBG_WMI          = 0x00000002,
    ATH10K_DBG_HTC          = 0x00000004,
    ATH10K_DBG_HTT          = 0x00000008,
    ATH10K_DBG_MAC          = 0x00000010,
    ATH10K_DBG_BOOT         = 0x00000020,
    ATH10K_DBG_PCI_DUMP     = 0x00000040,
    ATH10K_DBG_HTT_DUMP     = 0x00000080,
    ATH10K_DBG_MGMT         = 0x00000100,
    ATH10K_DBG_DATA         = 0x00000200,
    ATH10K_DBG_BMI          = 0x00000400,
    ATH10K_DBG_REGULATORY   = 0x00000800,
    ATH10K_DBG_TESTMODE     = 0x00001000,
    ATH10K_DBG_WMI_PRINT    = 0x00002000,
    ATH10K_DBG_PCI_PS       = 0x00004000,
    ATH10K_DBG_AHB          = 0x00008000,
    ATH10K_DBG_SDIO         = 0x00010000,
    ATH10K_DBG_SDIO_DUMP    = 0x00020000,
    ATH10K_DBG_ANY          = 0xffffffff,
    // clang-format on
};

enum ath10k_pktlog_filter {
    // clang-format off
    ATH10K_PKTLOG_RX         = 0x000000001,
    ATH10K_PKTLOG_TX         = 0x000000002,
    ATH10K_PKTLOG_RCFIND     = 0x000000004,
    ATH10K_PKTLOG_RCUPDATE   = 0x000000008,
    ATH10K_PKTLOG_DBG_PRINT  = 0x000000010,
    ATH10K_PKTLOG_ANY        = 0x00000001f,
    // clang-format on
};

enum ath10k_dbg_aggr_mode {
    ATH10K_DBG_AGGR_MODE_AUTO,
    ATH10K_DBG_AGGR_MODE_MANUAL,
    ATH10K_DBG_AGGR_MODE_MAX,
};

/* FIXME: How to calculate the buffer size sanely? */
#define ATH10K_FW_STATS_BUF_SIZE (1024 * 1024)

extern unsigned int ath10k_debug_mask;

#define ath10k_trace(fmt, ...) zxlogf(TRACE, "ath10k: " fmt, ##__VA_ARGS__)
#define ath10k_info(fmt, ...) zxlogf(INFO, "ath10k: " fmt, ##__VA_ARGS__)
#define ath10k_warn(fmt, ...) zxlogf(WARN, "ath10k: " fmt, ##__VA_ARGS__)
#define ath10k_err(fmt, ...) zxlogf(ERROR, "ath10k: " fmt, ##__VA_ARGS__)

void ath10k_debug_print_hwfw_info(struct ath10k* ar);
void ath10k_debug_print_board_info(struct ath10k* ar);
void ath10k_debug_print_boot_info(struct ath10k* ar);
void ath10k_print_driver_info(struct ath10k* ar);

#ifdef CONFIG_ATH10K_DEBUGFS
int ath10k_debug_start(struct ath10k* ar);
void ath10k_debug_stop(struct ath10k* ar);
int ath10k_debug_create(struct ath10k* ar);
void ath10k_debug_destroy(struct ath10k* ar);
int ath10k_debug_register(struct ath10k* ar);
void ath10k_debug_unregister(struct ath10k* ar);
#if 0   // NEEDS PORTING
void ath10k_debug_fw_stats_process(struct ath10k* ar, struct sk_buff* skb);
void ath10k_debug_tpc_stats_process(struct ath10k* ar,
                                    struct ath10k_tpc_stats* tpc_stats);
#endif  // NEEDS PORTING
struct ath10k_fw_crash_data* ath10k_debug_get_new_fw_crash_data(struct ath10k* ar);

void ath10k_debug_dbglog_add(struct ath10k* ar, uint8_t* buffer, int len);

int ath10k_debug_fw_devcoredump(struct ath10k* ar);

#define ATH10K_DFS_STAT_INC(ar, c) (ar->debug.dfs_stats.c++)

void ath10k_debug_get_et_strings(struct ieee80211_hw* hw, struct ieee80211_vif* vif, uint32_t sset,
                                 uint8_t* data);
int ath10k_debug_get_et_sset_count(struct ieee80211_hw* hw, struct ieee80211_vif* vif, int sset);
void ath10k_debug_get_et_stats(struct ieee80211_hw* hw, struct ieee80211_vif* vif,
                               struct ethtool_stats* stats, uint64_t* data);

static inline uint64_t ath10k_debug_get_fw_dbglog_mask(struct ath10k* ar) {
    return ar->debug.fw_dbglog_mask;
}

static inline uint32_t ath10k_debug_get_fw_dbglog_level(struct ath10k* ar) {
    return ar->debug.fw_dbglog_level;
}

#else

static inline int ath10k_debug_start(struct ath10k* ar) {
    return 0;
}

static inline void ath10k_debug_stop(struct ath10k* ar) {}

static inline int ath10k_debug_create(struct ath10k* ar) {
    return 0;
}

static inline void ath10k_debug_destroy(struct ath10k* ar) {}

static inline int ath10k_debug_register(struct ath10k* ar) {
    return 0;
}

static inline void ath10k_debug_unregister(struct ath10k* ar) {}

#if 0   // NEEDS PORTING
static inline void ath10k_debug_fw_stats_process(struct ath10k* ar,
        struct sk_buff* skb) {
}

static inline void ath10k_debug_tpc_stats_process(struct ath10k* ar,
        struct ath10k_tpc_stats* tpc_stats) {
    kfree(tpc_stats);
}
#endif  // NEEDS PORTING

static inline void ath10k_debug_dbglog_add(struct ath10k* ar, uint8_t* buffer, int len) {}

static inline struct ath10k_fw_crash_data* ath10k_debug_get_new_fw_crash_data(struct ath10k* ar) {
    return NULL;
}

static inline uint64_t ath10k_debug_get_fw_dbglog_mask(struct ath10k* ar) {
    return 0;
}

static inline uint32_t ath10k_debug_get_fw_dbglog_level(struct ath10k* ar) {
    return 0;
}

static inline int ath10k_debug_fw_devcoredump(struct ath10k* ar) {
    return 0;
}

#define ATH10K_DFS_STAT_INC(ar, c) \
    do {                           \
    } while (0)

#define ath10k_debug_get_et_strings NULL
#define ath10k_debug_get_et_sset_count NULL
#define ath10k_debug_get_et_stats NULL

#endif /* CONFIG_ATH10K_DEBUGFS */
#ifdef CONFIG_MAC80211_DEBUGFS
void ath10k_sta_add_debugfs(struct ieee80211_hw* hw, struct ieee80211_vif* vif,
                            struct ieee80211_sta* sta, struct dentry* dir);
void ath10k_sta_update_rx_duration(struct ath10k* ar, struct ath10k_fw_stats* stats);
void ath10k_sta_statistics(struct ieee80211_hw* hw, struct ieee80211_vif* vif,
                           struct ieee80211_sta* sta, struct station_info* sinfo);
#else
#if 0   // NEEDS PORTING
static inline
void ath10k_sta_update_rx_duration(struct ath10k* ar,
                                   struct ath10k_fw_stats* stats) {
}
#endif  // NEEDS PORTING
#endif  /* CONFIG_MAC80211_DEBUGFS */

#ifdef CONFIG_ATH10K_DEBUG
__printf(3, 4) void ath10k_dbg(struct ath10k* ar, enum ath10k_debug_mask mask, const char* fmt,
                               ...);
void ath10k_dbg_dump(struct ath10k* ar, enum ath10k_debug_mask mask, const char* msg,
                     const char* prefix, const void* buf, size_t len);
#else  /* CONFIG_ATH10K_DEBUG */

static inline int ath10k_dbg(struct ath10k* ar, enum ath10k_debug_mask dbg_mask, const char* fmt,
                             ...) {
    return 0;
}

static inline void ath10k_dbg_dump(struct ath10k* ar, enum ath10k_debug_mask mask, const char* msg,
                                   const char* prefix, const void* buf, size_t len) {}
#endif /* CONFIG_ATH10K_DEBUG */

#endif  // GARNET_DRIVERS_WLAN_THIRD_PARTY_ATHEROS_ATH10K_DEBUG_H_
