/*
 *
 Copyright (c) Eicon Networks, 2002.
 *
 This source file is supplied for the use with
 Eicon Networks range of DIVA Server Adapters.
 *
 Eicon File Revision :    2.1
 *
 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, or (at your option)
 any later version.
 *
 This program is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY OF ANY KIND WHATSOEVER INCLUDING ANY
 implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 See the GNU General Public License for more details.
 *
 You should have received a copy of the GNU General Public License
 along with this program; if not, write to the Free Software
 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 *
 */

#include "debuglib.h"

#ifdef DIVA_NO_DEBUGLIB
static DIVA_DI_PRINTF dprintf;
#else /* DIVA_NO_DEBUGLIB */

_DbgHandle_ myDriverDebugHandle = { 0 /*!Registered*/, DBG_HANDLE_VERSION };
DIVA_DI_PRINTF dprintf = no_printf;
/*****************************************************************************/
#define DBG_FUNC(name)							\
	void								\
	myDbgPrint_##name(char *format, ...)				\
	{ va_list ap;							\
		if (myDriverDebugHandle.dbg_prt)			\
		{ va_start(ap, format);				\
			(myDriverDebugHandle.dbg_prt)			\
				(myDriverDebugHandle.id, DLI_##name, format, ap); \
			va_end(ap);					\
		} }
DBG_FUNC(LOG)
DBG_FUNC(FTL)
DBG_FUNC(ERR)
DBG_FUNC(TRC)
DBG_FUNC(MXLOG)
DBG_FUNC(FTL_MXLOG)
void
myDbgPrint_EVL(long msgID, ...)
{ va_list ap;
	if (myDriverDebugHandle.dbg_ev)
	{ va_start(ap, msgID);
		(myDriverDebugHandle.dbg_ev)
			(myDriverDebugHandle.id, (unsigned long)msgID, ap);
		va_end(ap);
	} }
DBG_FUNC(REG)
DBG_FUNC(MEM)
DBG_FUNC(SPL)
DBG_FUNC(IRP)
DBG_FUNC(TIM)
DBG_FUNC(BLK)
DBG_FUNC(TAPI)
DBG_FUNC(NDIS)
DBG_FUNC(CONN)
DBG_FUNC(STAT)
DBG_FUNC(SEND)
DBG_FUNC(RECV)
DBG_FUNC(PRV0)
DBG_FUNC(PRV1)
DBG_FUNC(PRV2)
DBG_FUNC(PRV3)
/*****************************************************************************/
int
DbgRegister(char *drvName, char *drvTag, unsigned long dbgMask)
{
	int len;
/*
 * deregister (if already registered) and zero out myDriverDebugHandle
 */
	DbgDeregister();
/*
 * initialize the debug handle
 */
	myDriverDebugHandle.Version = DBG_HANDLE_VERSION;
	myDriverDebugHandle.id  = -1;
	myDriverDebugHandle.dbgMask = dbgMask | (DL_EVL | DL_FTL | DL_LOG);
	len = strlen(drvName);
	memcpy(myDriverDebugHandle.drvName, drvName,
	       (len < sizeof(myDriverDebugHandle.drvName)) ?
	       len : sizeof(myDriverDebugHandle.drvName) - 1);
	len = strlen(drvTag);
	memcpy(myDriverDebugHandle.drvTag, drvTag,
	       (len < sizeof(myDriverDebugHandle.drvTag)) ?
	       len : sizeof(myDriverDebugHandle.drvTag) - 1);
/*
 * Try to register debugging via old (and only) interface
 */
	dprintf("\000\377", &myDriverDebugHandle);
	if (myDriverDebugHandle.dbg_prt)
	{
		return (1);
	}
/*
 * Check if we registered with an old maint driver (see debuglib.h)
 */
	if (myDriverDebugHandle.dbg_end != NULL
	     /* location of 'dbg_prt' in _OldDbgHandle_ struct */
	     && (myDriverDebugHandle.regTime.LowPart ||
		 myDriverDebugHandle.regTime.HighPart))
		/* same location as in _OldDbgHandle_ struct */
	{
		dprintf("%s: Cannot log to old maint driver !", drvName);
		myDriverDebugHandle.dbg_end =
			((_OldDbgHandle_ *)&myDriverDebugHandle)->dbg_end;
		DbgDeregister();
	}
	return (0);
}
/*****************************************************************************/
void
DbgSetLevel(unsigned long dbgMask)
{
	myDriverDebugHandle.dbgMask = dbgMask | (DL_EVL | DL_FTL | DL_LOG);
}
/*****************************************************************************/
void
DbgDeregister(void)
{
	if (myDriverDebugHandle.dbg_end)
	{
		(myDriverDebugHandle.dbg_end)(&myDriverDebugHandle);
	}
	memset(&myDriverDebugHandle, 0, sizeof(myDriverDebugHandle));
}
void xdi_dbg_xlog(char *x, ...) {
	va_list ap;
	va_start(ap, x);
	if (myDriverDebugHandle.dbg_end &&
	    (myDriverDebugHandle.dbg_irq || myDriverDebugHandle.dbg_old) &&
	    (myDriverDebugHandle.dbgMask & DL_STAT)) {
		if (myDriverDebugHandle.dbg_irq) {
			(*(myDriverDebugHandle.dbg_irq))(myDriverDebugHandle.id,
							 (x[0] != 0) ? DLI_TRC : DLI_XLOG, x, ap);
		} else {
			(*(myDriverDebugHandle.dbg_old))(myDriverDebugHandle.id, x, ap);
		}
	}
	va_end(ap);
}
/*****************************************************************************/
#endif /* DIVA_NO_DEBUGLIB */