/* uniklog.h
 *
 * Copyright (C) 2010 - 2013 UNISYS CORPORATION
 * All rights reserved.
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or (at
 * your option) any later version.
 *
 * This program is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
 * NON INFRINGEMENT.  See the GNU General Public License for more
 * details.
 */

/* This module contains macros to aid developers in logging messages.
 *
 * This module is affected by the DEBUG compiletime option.
 *
 */
#ifndef __UNIKLOG_H__
#define __UNIKLOG_H__

#include <linux/printk.h>

/*
 * # DBGINF
 *
 * \brief Log debug informational message - log a LOG_INFO message only
 *        if DEBUG compiletime option enabled
 *
 * \param devname the device name of the device reporting this message, or
 *                NULL if this message is NOT device-related.
 * \param fmt printf()-style format string containing the message to log.
 * \param args Optional arguments to be formatted and inserted into the
 *             format string.
 * \return nothing
 *
 * Log a message at the LOG_INFO level, but only if DEBUG is enabled.  If
 * DEBUG is disabled, this expands to a no-op.
 */

/*
 * # DBGVER
 *
 * \brief Log debug verbose message - log a LOG_DEBUG message only if
 *        DEBUG compiletime option enabled
 *
 * \param devname the device name of the device reporting this message, or
 *                NULL if this message is NOT device-related.
 * \param fmt printf()-style format string containing the message to log.
 * \param args Optional arguments to be formatted and inserted into the
 *             format string.
 * \return nothing
 *
 * Log a message at the LOG_DEBUG level, but only if DEBUG is enabled.  If
 * DEBUG is disabled, this expands to a no-op.  Note also that LOG_DEBUG
 * messages can be enabled/disabled at runtime as well.
 */
#define DBGINFDEV(devname, fmt, args...)        do { } while (0)
#define DBGVERDEV(devname, fmt, args...)        do { } while (0)
#define DBGINF(fmt, args...)                    do { } while (0)
#define DBGVER(fmt, args...)                    do { } while (0)

/*
 * # LOGINF
 *
 * \brief Log informational message - logs a message at the LOG_INFO level
 *
 * \param devname the device name of the device reporting this message, or
 *                NULL if this message is NOT device-related.
 * \param fmt printf()-style format string containing the message to log.
 * \param args Optional arguments to be formatted and inserted into the
 *             format string.
 * \return nothing
 *
 * Logs the specified message at the LOG_INFO level.
 */

#define LOGINF(fmt, args...) pr_info(fmt, ## args)
#define LOGINFDEV(devname, fmt, args...) \
	pr_info("%s " fmt, devname, ## args)
#define LOGINFDEVX(devno, fmt, args...) \
	pr_info("dev%d " fmt, devno, ## args)
#define LOGINFNAME(vnic, fmt, args...)				\
	do {								\
		if (vnic != NULL) {					\
			pr_info("%s " fmt, vnic->name, ## args);	\
		} else {						\
			pr_info(fmt, ## args);				\
		}							\
	} while (0)

/*
 * # LOGVER
 *
 * \brief Log verbose message - logs a message at the LOG_DEBUG level,
 *        which can be disabled at runtime
 *
 * \param devname the device name of the device reporting this message, or
 *                NULL if this message is NOT device-related.
 * \param fmt printf()-style format string containing the message to log.
 * \param args Optional arguments to be formatted and inserted into the format
 * \param string.
 * \return nothing
 *
 * Logs the specified message at the LOG_DEBUG level.  Note also that
 * LOG_DEBUG messages can be enabled/disabled at runtime as well.
 */
#define LOGVER(fmt, args...) pr_debug(fmt, ## args)
#define LOGVERDEV(devname, fmt, args...) \
	pr_debug("%s " fmt, devname, ## args)
#define LOGVERNAME(vnic, fmt, args...)					\
	do {								\
		if (vnic != NULL) {					\
			pr_debug("%s " fmt, vnic->name, ## args);	\
		} else {						\
			pr_debug(fmt, ## args);				\
		}							\
	} while (0)

/*
 * # LOGERR
 *
 * \brief Log error message - logs a message at the LOG_ERR level,
 *        including source line number information
 *
 * \param devname the device name of the device reporting this message, or
 *                NULL if this message is NOT device-related.
 * \param fmt printf()-style format string containing the message to log.
 * \param args Optional arguments to be formatted and inserted into the format
 * \param string.
 * \return nothing
 *
 * Logs the specified error message at the LOG_ERR level.  It will also
 * include the file, line number, and function name of where the error
 * originated in the log message.
 */
#define LOGERR(fmt, args...) pr_err(fmt, ## args)
#define LOGERRDEV(devname, fmt, args...) \
	pr_err("%s " fmt, devname, ## args)
#define LOGERRDEVX(devno, fmt, args...) \
	pr_err("dev%d " fmt, devno, ## args)
#define LOGERRNAME(vnic, fmt, args...)				\
	do {								\
		if (vnic != NULL) {					\
			pr_err("%s " fmt, vnic->name, ## args);	\
		} else {						\
			pr_err(fmt, ## args);				\
		}							\
	} while (0)
#define LOGORDUMPERR(seqfile, fmt, args...) do {		\
		if (seqfile) {					\
			seq_printf(seqfile, fmt, ## args);	\
		} else {					\
			LOGERR(fmt, ## args);			\
		}						\
	} while (0)

/*
 * # LOGWRN
 *
 * \brief Log warning message - Logs a message at the LOG_WARNING level,
 *        including source line number information
 *
 * \param devname the device name of the device reporting this message, or
 *                NULL if this message is NOT device-related.
 * \param fmt printf()-style format string containing the message to log.
 * \param args Optional arguments to be formatted and inserted into the format
 * \param string.
 * \return nothing
 *
 * Logs the specified error message at the LOG_WARNING level.  It will also
 * include the file, line number, and function name of where the error
 * originated in the log message.
 */
#define LOGWRN(fmt, args...) pr_warn(fmt, ## args)
#define LOGWRNDEV(devname, fmt, args...) \
	pr_warn("%s " fmt, devname, ## args)
#define LOGWRNNAME(vnic, fmt, args...) \
	do {								\
		if (vnic != NULL) {					\
			pr_warn("%s " fmt, vnic->name, ## args);	\
		} else {						\
			pr_warn(fmt, ## args);				\
		}							\
	} while (0)

#endif /* __UNIKLOG_H__ */