/*
 * This file is provided under a CDDLv1 license.  When using or
 * redistributing this file, you may do so under this license.
 * In redistributing this file this license must be included
 * and no other modification of this header file is permitted.
 *
 * CDDL LICENSE SUMMARY
 *
 * Copyright(c) 1999 - 2007 Intel Corporation. All rights reserved.
 *
 * The contents of this file are subject to the terms of Version
 * 1.0 of the Common Development and Distribution License (the "License").
 *
 * You should have received a copy of the License with this software.
 * You can obtain a copy of the License at
 *	http://www.opensolaris.org/os/licensing.
 * See the License for the specific language governing permissions
 * and limitations under the License.
 */

/*
 * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
 * Use is subject to license terms of the CDDLv1.
 */

#ifndef _E1000G_DEBUG_H
#define	_E1000G_DEBUG_H

#pragma ident	"%Z%%M%	%I%	%E% SMI"

#ifdef __cplusplus
extern "C" {
#endif

/*
 * Debug message control
 * Debug Levels:
 *	0x000 - (0)   no messages
 *	0x001 - (1)   Errors
 *	0x002 - (2)   Warnings
 *	0x004 - (4)   Information
 *	0x008 - (8)   Subroutine calls and control flow
 *	0x010 - (16)  I/O Data (verbose!)
 * Variables can be set with entries in the /etc/system file with
 *	"set e1000g:e1000g_debug=<value>"
 *	"set e1000g:e1000g_log_mode=<value>"
 * The /etc/system file is read only once at boot time, if you change
 * it you must reboot for the change to take effect.
 *
 * It turns on diagnostics if DEBUG is defined (DEBUG also
 * enables other debugging code as ASSERT statements...
 */

#ifdef DEBUG
#define	E1000G_DEBUG
#endif

/*
 * By default it will print only to log
 */
#define	E1000G_LOG_DISPLAY	0x1
#define	E1000G_LOG_PRINT	0x2
#define	E1000G_LOG_ALL		0x3

#ifdef E1000G_DEBUG

#define	E1000G_ERRS_LEVEL	0x001	/* (1)	Errors */
#define	E1000G_WARN_LEVEL	0x002	/* (2)	Warnings */
#define	E1000G_INFO_LEVEL	0x004	/* (4)	Information */
#define	E1000G_TRACE_LEVEL	0x008	/* (8)	Subroutine calls */
#define	E1000G_VERBOSE_LEVEL	0x010	/* (16)	I/O Data (verbose!) */

#define	E1000G_DEBUGLOG_0(Adapter, Level, fmt)	\
	if (e1000g_debug) e1000g_log((Adapter), (Level), (fmt))

#define	E1000G_DEBUGLOG_1(Adapter, Level, fmt, d1)	\
	if (e1000g_debug) e1000g_log((Adapter), (Level), (fmt), (d1))

#define	E1000G_DEBUGLOG_2(Adapter, Level, fmt, d1, d2)	\
	if (e1000g_debug) e1000g_log((Adapter), (Level), (fmt), (d1), (d2))

#define	E1000G_DEBUGLOG_3(Adapter, Level, fmt, d1, d2, d3)	\
	if (e1000g_debug) e1000g_log((Adapter), (Level), (fmt), (d1),\
		(d2), (d3))

#define	E1000G_DEBUGLOG_4(Adapter, Level, fmt, d1, d2, d3, d4)	\
	if (e1000g_debug) e1000g_log((Adapter), (Level), (fmt), (d1),\
		(d2), (d3), (d4))

#define	E1000G_DEBUGLOG_5(Adapter, Level, fmt, d1, d2, d3, d4, d5)	\
	if (e1000g_debug) e1000g_log((Adapter), (Level), (fmt), (d1),\
		(d2), (d3), (d4), (d5))

#define	E1000G_DEBUG_STAT_COND(val, cond)	if (cond) (val)++;
#define	E1000G_DEBUG_STAT(val)			(val)++;

#else

#define	E1000G_DEBUGLOG_0(Adapter, Level, fmt)
#define	E1000G_DEBUGLOG_1(Adapter, Level, fmt, d1)
#define	E1000G_DEBUGLOG_2(Adapter, Level, fmt, d1, d2)
#define	E1000G_DEBUGLOG_3(Adapter, Level, fmt, d1, d2, d3)
#define	E1000G_DEBUGLOG_4(Adapter, Level, fmt, d1, d2, d3, d4)
#define	E1000G_DEBUGLOG_5(Adapter, Level, fmt, d1, d2, d3, d4, d5)

#define	E1000G_DEBUG_STAT_COND(val, cond)
#define	E1000G_DEBUG_STAT(val)

#endif	/* E1000G_DEBUG */

#define	NAMELEN		31
#define	BUFSZ		256

#define	E1000G_STAT(val)	(val)++;

void e1000g_log(void *, int, char *, ...);

#ifdef E1000G_DEBUG
void eeprom_dump(void *);
void phy_dump(void *);
void mac_dump(void *);
void pciconfig_dump(void *);
#endif

#ifdef E1000G_DEBUG
extern int e1000g_debug;
#endif
extern int e1000g_log_mode;

#ifdef __cplusplus
}
#endif

#endif	/* _E1000G_DEBUG_H */