/*
 * QEMU VMWARE VMXNET* paravirtual NICs - debugging facilities
 *
 * Copyright (c) 2012 Ravello Systems LTD (http://ravellosystems.com)
 *
 * Developed by Daynix Computing LTD (http://www.daynix.com)
 *
 * Authors:
 * Dmitry Fleytman <dmitry@daynix.com>
 * Tamir Shomer <tamirs@daynix.com>
 * Yan Vugenfirer <yan@daynix.com>
 *
 * This work is licensed under the terms of the GNU GPL, version 2 or later.
 * See the COPYING file in the top-level directory.
 *
 */

#ifndef QEMU_VMXNET_DEBUG_H
#define QEMU_VMXNET_DEBUG_H

#define VMXNET_DEVICE_NAME "vmxnet3"

#define VMXNET_DEBUG_WARNINGS
#define VMXNET_DEBUG_ERRORS

#undef VMXNET_DEBUG_CB
#undef VMXNET_DEBUG_INTERRUPTS
#undef VMXNET_DEBUG_CONFIG
#undef VMXNET_DEBUG_RINGS
#undef VMXNET_DEBUG_PACKETS
#undef VMXNET_DEBUG_SHMEM_ACCESS

#ifdef VMXNET_DEBUG_CB
#  define VMXNET_DEBUG_CB_ENABLED 1
#else
#  define VMXNET_DEBUG_CB_ENABLED 0
#endif

#ifdef VMXNET_DEBUG_WARNINGS
#  define VMXNET_DEBUG_WARNINGS_ENABLED 1
#else
#  define VMXNET_DEBUG_WARNINGS_ENABLED 0
#endif

#ifdef VMXNET_DEBUG_ERRORS
#  define VMXNET_DEBUG_ERRORS_ENABLED 1
#else
#  define VMXNET_DEBUG_ERRORS_ENABLED 0
#endif

#ifdef VMXNET_DEBUG_CONFIG
#  define VMXNET_DEBUG_CONFIG_ENABLED 1
#else
#  define VMXNET_DEBUG_CONFIG_ENABLED 0
#endif

#ifdef VMXNET_DEBUG_RINGS
#  define VMXNET_DEBUG_RINGS_ENABLED 1
#else
#  define VMXNET_DEBUG_RINGS_ENABLED 0
#endif

#ifdef VMXNET_DEBUG_PACKETS
#  define VMXNET_DEBUG_PACKETS_ENABLED 1
#else
#  define VMXNET_DEBUG_PACKETS_ENABLED 0
#endif

#ifdef VMXNET_DEBUG_INTERRUPTS
#  define VMXNET_DEBUG_INTERRUPTS_ENABLED 1
#else
#  define VMXNET_DEBUG_INTERRUPTS_ENABLED 0
#endif

#ifdef VMXNET_DEBUG_SHMEM_ACCESS
#  define VMXNET_DEBUG_SHMEM_ACCESS_ENABLED 1
#else
#  define VMXNET_DEBUG_SHMEM_ACCESS_ENABLED 0
#endif

#define VMW_SHPRN(fmt, ...)                                                   \
    do {                                                                      \
        if (VMXNET_DEBUG_SHMEM_ACCESS_ENABLED) {                              \
            printf("[%s][SH][%s]: " fmt "\n", VMXNET_DEVICE_NAME, __func__,   \
                ## __VA_ARGS__);                                              \
       }                                                                      \
    } while (0)

#define VMW_CBPRN(fmt, ...)                                                   \
    do {                                                                      \
        if (VMXNET_DEBUG_CB_ENABLED) {                                        \
            printf("[%s][CB][%s]: " fmt "\n", VMXNET_DEVICE_NAME, __func__,   \
                ## __VA_ARGS__);                                              \
        }                                                                     \
    } while (0)

#define VMW_PKPRN(fmt, ...)                                                   \
    do {                                                                      \
        if (VMXNET_DEBUG_PACKETS_ENABLED) {                                   \
            printf("[%s][PK][%s]: " fmt "\n", VMXNET_DEVICE_NAME, __func__,   \
                ## __VA_ARGS__);                                              \
        }                                                                     \
    } while (0)

#define VMW_WRPRN(fmt, ...)                                                   \
    do {                                                                      \
        if (VMXNET_DEBUG_WARNINGS_ENABLED) {                                  \
            printf("[%s][WR][%s]: " fmt "\n", VMXNET_DEVICE_NAME, __func__,   \
                ## __VA_ARGS__);                                              \
        }                                                                     \
    } while (0)

#define VMW_ERPRN(fmt, ...)                                                   \
    do {                                                                      \
        if (VMXNET_DEBUG_ERRORS_ENABLED) {                                    \
            printf("[%s][ER][%s]: " fmt "\n", VMXNET_DEVICE_NAME, __func__,   \
                ## __VA_ARGS__);                                              \
        }                                                                     \
    } while (0)

#define VMW_IRPRN(fmt, ...)                                                   \
    do {                                                                      \
        if (VMXNET_DEBUG_INTERRUPTS_ENABLED) {                                \
            printf("[%s][IR][%s]: " fmt "\n", VMXNET_DEVICE_NAME, __func__,   \
                ## __VA_ARGS__);                                              \
        }                                                                     \
    } while (0)

#define VMW_CFPRN(fmt, ...)                                                   \
    do {                                                                      \
        if (VMXNET_DEBUG_CONFIG_ENABLED) {                                    \
            printf("[%s][CF][%s]: " fmt "\n", VMXNET_DEVICE_NAME, __func__,   \
                ## __VA_ARGS__);                                              \
        }                                                                     \
    } while (0)

#define VMW_RIPRN(fmt, ...)                                                   \
    do {                                                                      \
        if (VMXNET_DEBUG_RINGS_ENABLED) {                                     \
            printf("[%s][RI][%s]: " fmt "\n", VMXNET_DEVICE_NAME, __func__,   \
                ## __VA_ARGS__);                                              \
        }                                                                     \
    } while (0)

#endif /* QEMU_VMXNET_DEBUG_H */
