11da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include "platform.h"
21da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include "pc.h"
31da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include "di_defs.h"
41da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include "debug_if.h"
51da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include "divasync.h"
61da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include "kst_ifc.h"
71da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include "maintidi.h"
81da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include "man_defs.h"
91da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  LOCALS
121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  */
131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define DBG_MAGIC (0x47114711L)
141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void DI_register (void *arg);
161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void DI_deregister (pDbgHandle hDbg);
171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void DI_format (int do_lock, word id, int type, char *format, va_list argument_list);
181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void DI_format_locked   (word id, int type, char *format, va_list argument_list);
191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void DI_format_old (word id, char *format, va_list ap) { }
201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void DiProcessEventLog (unsigned short id, unsigned long msgID, va_list ap) { }
211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void single_p (byte * P, word * PLength, byte Id);
221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void diva_maint_xdi_cb (ENTITY* e);
231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic word SuperTraceCreateReadReq (byte* P, const char* path);
241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int diva_mnt_cmp_nmbr (const char* nmbr);
251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void diva_free_dma_descriptor (IDI_CALL request, int nr);
261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int diva_get_dma_descriptor (IDI_CALL request, dword *dma_magic);
271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsvoid diva_mnt_internal_dprintf (dword drv_id, dword type, char* p, ...);
281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic dword MaxDumpSize = 256 ;
301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic dword MaxXlogSize = 2 + 128 ;
311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic char  TraceFilter[DIVA_MAX_SELECTIVE_FILTER_LENGTH+1];
321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int TraceFilterIdent   = -1;
331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int TraceFilterChannel = -1;
341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldstypedef struct _diva_maint_client {
361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  dword       sec;
371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  dword       usec;
381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  pDbgHandle  hDbg;
391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  char        drvName[128];
401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  dword       dbgMask;
411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  dword       last_dbgMask;
421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  IDI_CALL    request;
431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  _DbgHandle_ Dbg;
441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  int         logical;
451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  int         channels;
461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  diva_strace_library_interface_t* pIdiLib;
471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  BUFFERS     XData;
481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  char        xbuffer[2048+512];
491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  byte*       pmem;
501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  int         request_pending;
511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  int         dma_handle;
521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} diva_maint_client_t;
531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic diva_maint_client_t clients[MAX_DESCRIPTORS];
541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void diva_change_management_debug_mask (diva_maint_client_t* pC, dword old_mask);
561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void diva_maint_error (void* user_context,
581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds                              diva_strace_library_interface_t* hLib,
591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds                              int Adapter,
601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds                              int error,
611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds                              const char* file,
621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds                              int line);
631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void diva_maint_state_change_notify (void* user_context,
641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds                                            diva_strace_library_interface_t* hLib,
651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds                                            int Adapter,
661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds                                            diva_trace_line_state_t* channel,
671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds                                            int notify_subject);
681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void diva_maint_trace_notify (void* user_context,
691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds                                     diva_strace_library_interface_t* hLib,
701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds                                     int Adapter,
711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds                                     void* xlog_buffer,
721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds                                     int length);
731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldstypedef struct MSG_QUEUE {
771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	dword	Size;		/* total size of queue (constant)	*/
781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	byte	*Base;		/* lowest address (constant)		*/
791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	byte	*High;		/* Base + Size (constant)		*/
801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	byte	*Head;		/* first message in queue (if any)	*/
811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	byte	*Tail;		/* first free position			*/
821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	byte	*Wrap;		/* current wraparound position 		*/
831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	dword	Count;		/* current no of bytes in queue		*/
841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} MSG_QUEUE;
851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldstypedef struct MSG_HEAD {
871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	volatile dword	Size;		/* size of data following MSG_HEAD	*/
881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define	MSG_INCOMPLETE	0x8000	/* ored to Size until queueCompleteMsg 	*/
891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} MSG_HEAD;
901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define queueCompleteMsg(p) do{ ((MSG_HEAD *)p - 1)->Size &= ~MSG_INCOMPLETE; }while(0)
921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define queueCount(q)	((q)->Count)
931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define MSG_NEED(size) \
941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	( (sizeof(MSG_HEAD) + size + sizeof(dword) - 1) & ~(sizeof(dword) - 1) )
951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void queueInit (MSG_QUEUE *Q, byte *Buffer, dword sizeBuffer) {
971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	Q->Size = sizeBuffer;
981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	Q->Base = Q->Head = Q->Tail = Buffer;
991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	Q->High = Buffer + sizeBuffer;
1001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	Q->Wrap = NULL;
1011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	Q->Count= 0;
1021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
1031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic byte *queueAllocMsg (MSG_QUEUE *Q, word size) {
1051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Allocate 'size' bytes at tail of queue which will be filled later
1061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds   * directly with callers own message header info and/or message.
1071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds   * An 'alloced' message is marked incomplete by oring the 'Size' field
1081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds   * with MSG_INCOMPLETE.
1091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds   * This must be reset via queueCompleteMsg() after the message is filled.
1101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds   * As long as a message is marked incomplete queuePeekMsg() will return
1111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds   * a 'queue empty' condition when it reaches such a message.  */
1121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	MSG_HEAD *Msg;
1141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	word need = MSG_NEED(size);
1151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (Q->Tail == Q->Head) {
1171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (Q->Wrap || need > Q->Size) {
1181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			return NULL; /* full */
1191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
1201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		goto alloc; /* empty */
1211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
1221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (Q->Tail > Q->Head) {
1241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (Q->Tail + need <= Q->High) goto alloc; /* append */
1251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (Q->Base + need > Q->Head) {
1261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			return NULL; /* too much */
1271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
1281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		/* wraparound the queue (but not the message) */
1291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		Q->Wrap = Q->Tail;
1301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		Q->Tail = Q->Base;
1311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		goto alloc;
1321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
1331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (Q->Tail + need > Q->Head) {
1351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return NULL; /* too much */
1361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
1371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsalloc:
1391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	Msg = (MSG_HEAD *)Q->Tail;
1401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	Msg->Size = size | MSG_INCOMPLETE;
1421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	Q->Tail	 += need;
1441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	Q->Count += size;
1451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return ((byte*)(Msg + 1));
1491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
1501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void queueFreeMsg (MSG_QUEUE *Q) {
1521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Free the message at head of queue */
1531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	word size = ((MSG_HEAD *)Q->Head)->Size & ~MSG_INCOMPLETE;
1551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	Q->Head  += MSG_NEED(size);
1571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	Q->Count -= size;
1581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (Q->Wrap) {
1601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (Q->Head >= Q->Wrap) {
1611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			Q->Head = Q->Base;
1621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			Q->Wrap = NULL;
1631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
1641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	} else if (Q->Head >= Q->Tail) {
1651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		Q->Head = Q->Tail = Q->Base;
1661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
1671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
1681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic byte *queuePeekMsg (MSG_QUEUE *Q, word *size) {
1701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Show the first valid message in queue BUT DON'T free the message.
1711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds   * After looking on the message contents it can be freed queueFreeMsg()
1721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds   * or simply remain in message queue.  */
1731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	MSG_HEAD *Msg = (MSG_HEAD *)Q->Head;
1751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (((byte *)Msg == Q->Tail && !Q->Wrap) ||
1771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	    (Msg->Size & MSG_INCOMPLETE)) {
1781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return NULL;
1791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	} else {
1801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		*size = Msg->Size;
1811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return ((byte *)(Msg + 1));
1821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
1831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
1841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
1861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  Message queue header
1871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  */
1881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic MSG_QUEUE*          dbg_queue;
1891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic byte*               dbg_base;
1901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int                 external_dbg_queue;
1911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic diva_os_spin_lock_t dbg_q_lock;
1921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic diva_os_spin_lock_t dbg_adapter_lock;
1931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int                 dbg_q_busy;
1941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic volatile dword      dbg_sequence;
1951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic dword               start_sec;
1961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic dword               start_usec;
1971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
1991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	INTERFACE:
2001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    Initialize run time queue structures.
2011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    base:    base of the message queue
2021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    length:  length of the message queue
2031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    do_init: perfor queue reset
2041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    return:  zero on success, -1 on error
2061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  */
2071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsint diva_maint_init (byte* base, unsigned long length, int do_init) {
2081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  if (dbg_queue || (!base) || (length < (4096*4))) {
2091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    return (-1);
2101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  }
2111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  TraceFilter[0]     =  0;
2131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  TraceFilterIdent   = -1;
2141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  TraceFilterChannel = -1;
2151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  dbg_base = base;
2171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  diva_os_get_time (&start_sec, &start_usec);
2191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  *(dword*)base  = (dword)DBG_MAGIC; /* Store Magic */
2211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  base   += sizeof(dword);
2221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  length -= sizeof(dword);
2231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  *(dword*)base = 2048; /* Extension Field Length */
2251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  base   += sizeof(dword);
2261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  length -= sizeof(dword);
2271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  strcpy (base, "KERNEL MODE BUFFER\n");
2291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  base   += 2048;
2301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  length -= 2048;
2311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  *(dword*)base = 0; /* Terminate extension */
2331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  base   += sizeof(dword);
2341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  length -= sizeof(dword);
2351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  *(void**)base  =  (void*)(base+sizeof(void*)); /* Store Base  */
2371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  base   += sizeof(void*);
2381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  length -= sizeof(void*);
2391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  dbg_queue = (MSG_QUEUE*)base;
2411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  queueInit (dbg_queue, base + sizeof(MSG_QUEUE), length - sizeof(MSG_QUEUE) - 512);
2421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  external_dbg_queue = 0;
2431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  if (!do_init) {
2451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    external_dbg_queue = 1; /* memory was located on the external device */
2461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  }
2471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (diva_os_initialize_spin_lock (&dbg_q_lock, "dbg_init")) {
2501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    dbg_queue = NULL;
2511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    dbg_base = NULL;
2521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    external_dbg_queue = 0;
2531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return (-1);
2541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  }
2551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (diva_os_initialize_spin_lock (&dbg_adapter_lock, "dbg_init")) {
2571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    diva_os_destroy_spin_lock(&dbg_q_lock, "dbg_init");
2581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    dbg_queue = NULL;
2591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    dbg_base = NULL;
2601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    external_dbg_queue = 0;
2611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return (-1);
2621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  }
2631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  return (0);
2651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
2661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
2681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  INTERFACE:
2691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    Finit at unload time
2701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    return address of internal queue or zero if queue
2711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    was external
2721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  */
2731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsvoid* diva_maint_finit (void) {
2741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  void* ret = (void*)dbg_base;
2751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  int i;
2761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  dbg_queue = NULL;
2781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  dbg_base  = NULL;
2791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  if (ret) {
2811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    diva_os_destroy_spin_lock(&dbg_q_lock, "dbg_finit");
2821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    diva_os_destroy_spin_lock(&dbg_adapter_lock, "dbg_finit");
2831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  }
2841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  if (external_dbg_queue) {
2861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    ret = NULL;
2871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  }
2881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  external_dbg_queue = 0;
2891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
290f85aaeba458fda1de199a73566c641516e9a935dAhmed S. Darwish  for (i = 1; i < ARRAY_SIZE(clients); i++) {
2911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    if (clients[i].pmem) {
2921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      diva_os_free (0, clients[i].pmem);
2931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    }
2941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  }
2951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  return (ret);
2971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
2981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
3001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  INTERFACE:
3011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    Return amount of messages in debug queue
3021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  */
3031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsdword diva_dbg_q_length (void) {
3041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return (dbg_queue ? queueCount(dbg_queue)	: 0);
3051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
3061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
3081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  INTERFACE:
3091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    Lock message queue and return the pointer to the first
3101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    entry.
3111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  */
3121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsdiva_dbg_entry_head_t* diva_maint_get_message (word* size,
3131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds                                               diva_os_spin_lock_magic_t* old_irql) {
3141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  diva_dbg_entry_head_t*     pmsg = NULL;
3151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  diva_os_enter_spin_lock (&dbg_q_lock, old_irql, "read");
3171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  if (dbg_q_busy) {
3181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    diva_os_leave_spin_lock (&dbg_q_lock, old_irql, "read_busy");
3191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    return NULL;
3201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  }
3211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  dbg_q_busy = 1;
3221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  if (!(pmsg = (diva_dbg_entry_head_t*)queuePeekMsg (dbg_queue, size))) {
3241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    dbg_q_busy = 0;
3251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    diva_os_leave_spin_lock (&dbg_q_lock, old_irql, "read_empty");
3261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  }
3271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  return (pmsg);
3291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
3301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
3321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  INTERFACE:
3331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    acknowledge last message and unlock queue
3341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  */
3351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsvoid diva_maint_ack_message (int do_release,
3361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds                             diva_os_spin_lock_magic_t* old_irql) {
3371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!dbg_q_busy) {
3381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return;
3391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
3401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (do_release) {
3411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		queueFreeMsg (dbg_queue);
3421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
3431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	dbg_q_busy = 0;
3441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  diva_os_leave_spin_lock (&dbg_q_lock, old_irql, "read_ack");
3451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
3461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
3491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  INTERFACE:
3501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    PRT COMP function used to register
3511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    with MAINT adapter or log in compatibility
3521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    mode in case older driver version is connected too
3531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  */
3541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsvoid diva_maint_prtComp (char *format, ...) {
3551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  void    *hDbg;
3561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  va_list ap;
3571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  if (!format)
3591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    return;
3601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  va_start(ap, format);
3621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  /*
3641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    register to new log driver functions
3651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds   */
3661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  if ((format[0] == 0) && ((unsigned char)format[1] == 255)) {
3671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    hDbg = va_arg(ap, void *); /* ptr to DbgHandle */
3681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    DI_register (hDbg);
3691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  }
3701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  va_end (ap);
3721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
3731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void DI_register (void *arg) {
3751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  diva_os_spin_lock_magic_t old_irql;
3761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  dword sec, usec;
3771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  pDbgHandle  	hDbg ;
3781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  int id, free_id = -1, best_id = 0;
3791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  diva_os_get_time (&sec, &usec);
3811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	hDbg = (pDbgHandle)arg ;
3831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  /*
3841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    Check for bad args, specially for the old obsolete debug handle
3851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    */
3861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  if ((hDbg == NULL) ||
3871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      ((hDbg->id == 0) && (((_OldDbgHandle_ *)hDbg)->id == -1)) ||
3881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      (hDbg->Registered != 0)) {
3891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return ;
3901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  }
3911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  diva_os_enter_spin_lock (&dbg_q_lock, &old_irql, "register");
3931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
394f85aaeba458fda1de199a73566c641516e9a935dAhmed S. Darwish  for (id = 1; id < ARRAY_SIZE(clients); id++) {
3951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    if (clients[id].hDbg == hDbg) {
3961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      /*
3971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        driver already registered
3981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        */
3991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      diva_os_leave_spin_lock (&dbg_q_lock, &old_irql, "register");
4001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      return;
4011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    }
4021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    if (clients[id].hDbg) { /* slot is busy */
4031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      continue;
4041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    }
4051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    free_id = id;
4061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    if (!strcmp (clients[id].drvName, hDbg->drvName)) {
4071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      /*
4081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        This driver was already registered with this name
4091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        and slot is still free - reuse it
4101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        */
4111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      best_id = 1;
4121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      break;
4131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    }
4141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    if (!clients[id].hDbg) { /* slot is busy */
4151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      break;
4161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    }
4171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  }
4181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
4191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  if (free_id != -1) {
4201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    diva_dbg_entry_head_t* pmsg = NULL;
4211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    int len;
4221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    char tmp[256];
4231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    word size;
4241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
4251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    /*
4261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      Register new driver with id == free_id
4271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      */
4281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    clients[free_id].hDbg = hDbg;
4291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    clients[free_id].sec  = sec;
4301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    clients[free_id].usec = usec;
4311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    strcpy (clients[free_id].drvName, hDbg->drvName);
4321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
4331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    clients[free_id].dbgMask = hDbg->dbgMask;
4341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    if (best_id) {
4351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      hDbg->dbgMask |= clients[free_id].last_dbgMask;
4361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    } else {
4371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      clients[free_id].last_dbgMask = 0;
4381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    }
4391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
4401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    hDbg->Registered = DBG_HANDLE_REG_NEW ;
4411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    hDbg->id         = (byte)free_id;
4421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    hDbg->dbg_end    = DI_deregister;
4431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    hDbg->dbg_prt    = DI_format_locked;
4441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    hDbg->dbg_ev     = DiProcessEventLog;
4451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    hDbg->dbg_irq    = DI_format_locked;
4461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    if (hDbg->Version > 0) {
4471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      hDbg->dbg_old  = DI_format_old;
4481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    }
4491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    hDbg->next       = (pDbgHandle)DBG_MAGIC;
4501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
4511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    /*
4521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      Log driver register, MAINT driver ID is '0'
4531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      */
4541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    len = sprintf (tmp, "DIMAINT - drv # %d = '%s' registered",
4551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds                   free_id, hDbg->drvName);
4561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
4571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    while (!(pmsg = (diva_dbg_entry_head_t*)queueAllocMsg (dbg_queue,
4581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds                                        (word)(len+1+sizeof(*pmsg))))) {
4591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      if ((pmsg = (diva_dbg_entry_head_t*)queuePeekMsg (dbg_queue, &size))) {
4601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        queueFreeMsg (dbg_queue);
4611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      } else {
4621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        break;
4631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      }
4641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    }
4651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
4661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    if (pmsg) {
4671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      pmsg->sequence    = dbg_sequence++;
4681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      pmsg->time_sec    = sec;
4691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      pmsg->time_usec   = usec;
4701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      pmsg->facility    = MSG_TYPE_STRING;
4711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      pmsg->dli         = DLI_REG;
4721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      pmsg->drv_id      = 0; /* id 0 - DIMAINT */
4731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      pmsg->di_cpu      = 0;
4741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      pmsg->data_length = len+1;
4751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
4761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      memcpy (&pmsg[1], tmp, len+1);
4771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		  queueCompleteMsg (pmsg);
4781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      diva_maint_wakeup_read();
4791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    }
4801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  }
4811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
4821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  diva_os_leave_spin_lock (&dbg_q_lock, &old_irql, "register");
4831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
4841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
4851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void DI_deregister (pDbgHandle hDbg) {
4861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  diva_os_spin_lock_magic_t old_irql, old_irql1;
4871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  dword sec, usec;
4881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  int i;
4891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  word size;
4901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  byte* pmem = NULL;
4911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
4921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  diva_os_get_time (&sec, &usec);
4931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
4941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  diva_os_enter_spin_lock (&dbg_adapter_lock, &old_irql1, "read");
4951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  diva_os_enter_spin_lock (&dbg_q_lock, &old_irql, "read");
4961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
497f85aaeba458fda1de199a73566c641516e9a935dAhmed S. Darwish  for (i = 1; i < ARRAY_SIZE(clients); i++) {
4981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    if (clients[i].hDbg == hDbg) {
4991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      diva_dbg_entry_head_t* pmsg;
5001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      char tmp[256];
5011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      int len;
5021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
5031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      clients[i].hDbg = NULL;
5041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
5051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      hDbg->id       = -1;
5061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      hDbg->dbgMask  = 0;
5071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      hDbg->dbg_end  = NULL;
5081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      hDbg->dbg_prt  = NULL;
5091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      hDbg->dbg_irq  = NULL;
5101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      if (hDbg->Version > 0)
5111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        hDbg->dbg_old = NULL;
5121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      hDbg->Registered = 0;
5131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      hDbg->next     = NULL;
5141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
5151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      if (clients[i].pIdiLib) {
5161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        (*(clients[i].pIdiLib->DivaSTraceLibraryFinit))(clients[i].pIdiLib->hLib);
5171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        clients[i].pIdiLib = NULL;
5181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
5191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        pmem = clients[i].pmem;
5201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        clients[i].pmem = NULL;
5211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      }
5221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
5231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      /*
5241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        Log driver register, MAINT driver ID is '0'
5251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        */
5261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      len = sprintf (tmp, "DIMAINT - drv # %d = '%s' de-registered",
5271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds                     i, hDbg->drvName);
5281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
5291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      while (!(pmsg = (diva_dbg_entry_head_t*)queueAllocMsg (dbg_queue,
5301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds                                        (word)(len+1+sizeof(*pmsg))))) {
5311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        if ((pmsg = (diva_dbg_entry_head_t*)queuePeekMsg (dbg_queue, &size))) {
5321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds          queueFreeMsg (dbg_queue);
5331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        } else {
5341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds          break;
5351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        }
5361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      }
5371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
5381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      if (pmsg) {
5391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        pmsg->sequence    = dbg_sequence++;
5401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        pmsg->time_sec    = sec;
5411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        pmsg->time_usec   = usec;
5421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        pmsg->facility    = MSG_TYPE_STRING;
5431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        pmsg->dli         = DLI_REG;
5441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        pmsg->drv_id      = 0; /* id 0 - DIMAINT */
5451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        pmsg->di_cpu      = 0;
5461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        pmsg->data_length = len+1;
5471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
5481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        memcpy (&pmsg[1], tmp, len+1);
5491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  		  queueCompleteMsg (pmsg);
5501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        diva_maint_wakeup_read();
5511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      }
5521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
5531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      break;
5541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    }
5551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  }
5561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
5571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  diva_os_leave_spin_lock (&dbg_q_lock, &old_irql, "read_ack");
5581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  diva_os_leave_spin_lock (&dbg_adapter_lock, &old_irql1, "read_ack");
5591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
5601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  if (pmem) {
5611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    diva_os_free (0, pmem);
5621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  }
5631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
5641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
5651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void DI_format_locked (unsigned short id,
5661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds                       int type,
5671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds                       char *format,
5681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds                       va_list argument_list) {
5691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  DI_format (1, id, type, format, argument_list);
5701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
5711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
5721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void DI_format (int do_lock,
5731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds                       unsigned short id,
5741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds                       int type,
5751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds                       char *format,
5761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds                       va_list ap) {
5771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  diva_os_spin_lock_magic_t old_irql;
5781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  dword sec, usec;
5791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  diva_dbg_entry_head_t* pmsg = NULL;
5801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  dword length;
5811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  word size;
5821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  static char fmtBuf[MSG_FRAME_MAX_SIZE+sizeof(*pmsg)+1];
5831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  char          *data;
5841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  unsigned short code;
5851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
5861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  if (diva_os_in_irq()) {
5871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    dbg_sequence++;
5881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    return;
5891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  }
5901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
5911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if ((!format) ||
5921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			((TraceFilter[0] != 0) && ((TraceFilterIdent < 0) || (TraceFilterChannel < 0)))) {
5931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return;
5941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
5951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
5961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
5971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
5981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  diva_os_get_time (&sec, &usec);
5991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
6001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  if (do_lock) {
6011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    diva_os_enter_spin_lock (&dbg_q_lock, &old_irql, "format");
6021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  }
6031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
6041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  switch (type) {
6051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  case DLI_MXLOG :
6061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  case DLI_BLK :
6071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  case DLI_SEND:
6081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  case DLI_RECV:
6091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    if (!(length = va_arg(ap, unsigned long))) {
6101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      break;
6111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    }
6121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    if (length > MaxDumpSize) {
6131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      length = MaxDumpSize;
6141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    }
6151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    while (!(pmsg = (diva_dbg_entry_head_t*)queueAllocMsg (dbg_queue,
6161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds                                (word)length+sizeof(*pmsg)))) {
6171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      if ((pmsg = (diva_dbg_entry_head_t*)queuePeekMsg (dbg_queue, &size))) {
6181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        queueFreeMsg (dbg_queue);
6191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      } else {
6201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        break;
6211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      }
6221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    }
6231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    if (pmsg) {
6241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      memcpy (&pmsg[1], format, length);
6251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      pmsg->sequence    = dbg_sequence++;
6261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      pmsg->time_sec    = sec;
6271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      pmsg->time_usec   = usec;
6281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      pmsg->facility    = MSG_TYPE_BINARY ;
6291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      pmsg->dli         = type; /* DLI_XXX */
6301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      pmsg->drv_id      = id;   /* driver MAINT id */
6311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      pmsg->di_cpu      = 0;
6321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      pmsg->data_length = length;
6331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      queueCompleteMsg (pmsg);
6341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    }
6351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
6361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
6371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  case DLI_XLOG: {
6381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    byte* p;
6391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    data    = va_arg(ap, char*);
6401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    code    = (unsigned short)va_arg(ap, unsigned int);
6411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    length	= (unsigned long) va_arg(ap, unsigned int);
6421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
6431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    if (length > MaxXlogSize)
6441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      length = MaxXlogSize;
6451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
6461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    while (!(pmsg = (diva_dbg_entry_head_t*)queueAllocMsg (dbg_queue,
6471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds                                  (word)length+sizeof(*pmsg)+2))) {
6481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      if ((pmsg = (diva_dbg_entry_head_t*)queuePeekMsg (dbg_queue, &size))) {
6491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        queueFreeMsg (dbg_queue);
6501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      } else {
6511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        break;
6521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      }
6531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    }
6541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    if (pmsg) {
6551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      p = (byte*)&pmsg[1];
6561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      p[0] = (char)(code) ;
6571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      p[1] = (char)(code >> 8) ;
6581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      if (data && length) {
6591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        memcpy (&p[2], &data[0], length) ;
6601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      }
6611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      length += 2 ;
6621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
6631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      pmsg->sequence    = dbg_sequence++;
6641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      pmsg->time_sec    = sec;
6651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      pmsg->time_usec   = usec;
6661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      pmsg->facility    = MSG_TYPE_BINARY ;
6671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      pmsg->dli         = type; /* DLI_XXX */
6681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      pmsg->drv_id      = id;   /* driver MAINT id */
6691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      pmsg->di_cpu      = 0;
6701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      pmsg->data_length = length;
6711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      queueCompleteMsg (pmsg);
6721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    }
6731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  } break;
6741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
6751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  case DLI_LOG :
6761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  case DLI_FTL :
6771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  case DLI_ERR :
6781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  case DLI_TRC :
6791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  case DLI_REG :
6801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  case DLI_MEM :
6811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  case DLI_SPL :
6821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  case DLI_IRP :
6831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  case DLI_TIM :
6841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  case DLI_TAPI:
6851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  case DLI_NDIS:
6861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  case DLI_CONN:
6871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  case DLI_STAT:
6881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  case DLI_PRV0:
6891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  case DLI_PRV1:
6901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  case DLI_PRV2:
6911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  case DLI_PRV3:
6921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    if ((length = (unsigned long)vsprintf (&fmtBuf[0], format, ap)) > 0) {
6931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      length += (sizeof(*pmsg)+1);
6941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
6951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      while (!(pmsg = (diva_dbg_entry_head_t*)queueAllocMsg (dbg_queue,
6961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds                                                          (word)length))) {
6971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        if ((pmsg = (diva_dbg_entry_head_t*)queuePeekMsg (dbg_queue, &size))) {
6981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds          queueFreeMsg (dbg_queue);
6991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        } else {
7001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds          break;
7011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        }
7021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      }
7031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
7041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      pmsg->sequence    = dbg_sequence++;
7051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      pmsg->time_sec    = sec;
7061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      pmsg->time_usec   = usec;
7071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      pmsg->facility    = MSG_TYPE_STRING;
7081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      pmsg->dli         = type; /* DLI_XXX */
7091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      pmsg->drv_id      = id;   /* driver MAINT id */
7101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      pmsg->di_cpu      = 0;
7111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      pmsg->data_length = length - sizeof(*pmsg);
7121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
7131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      memcpy (&pmsg[1], fmtBuf, pmsg->data_length);
7141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		  queueCompleteMsg (pmsg);
7151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    }
7161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    break;
7171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
7181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  } /* switch type */
7191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
7201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
7211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  if (queueCount(dbg_queue)) {
7221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    diva_maint_wakeup_read();
7231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  }
7241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
7251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  if (do_lock) {
7261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    diva_os_leave_spin_lock (&dbg_q_lock, &old_irql, "format");
7271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  }
7281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
7291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
7301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
7311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  Write driver ID and driver revision to callers buffer
7321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  */
7331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsint diva_get_driver_info (dword id, byte* data, int data_length) {
7341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  diva_os_spin_lock_magic_t old_irql;
7351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  byte* p = data;
7361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  int to_copy;
7371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
7381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  if (!data || !id || (data_length < 17) ||
739f85aaeba458fda1de199a73566c641516e9a935dAhmed S. Darwish      (id >= ARRAY_SIZE(clients))) {
7401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    return (-1);
7411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  }
7421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
7431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  diva_os_enter_spin_lock (&dbg_q_lock, &old_irql, "driver info");
7441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
7451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  if (clients[id].hDbg) {
7461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    *p++ = 1;
7471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    *p++ = (byte)clients[id].sec; /* save seconds */
7481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    *p++ = (byte)(clients[id].sec >>  8);
7491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    *p++ = (byte)(clients[id].sec >> 16);
7501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    *p++ = (byte)(clients[id].sec >> 24);
7511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
7521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    *p++ = (byte)(clients[id].usec/1000); /* save mseconds */
7531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    *p++ = (byte)((clients[id].usec/1000) >>  8);
7541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    *p++ = (byte)((clients[id].usec/1000) >> 16);
7551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    *p++ = (byte)((clients[id].usec/1000) >> 24);
7561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
7571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    data_length -= 9;
7581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
759e2de257cf15d0508d29fa8a54a0dad78de4e75ebAmol Lad    if ((to_copy = min(strlen(clients[id].drvName), (size_t)(data_length-1)))) {
7601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      memcpy (p, clients[id].drvName, to_copy);
7611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      p += to_copy;
7621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      data_length -= to_copy;
7631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      if ((data_length >= 4) && clients[id].hDbg->drvTag[0]) {
7641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        *p++ = '(';
7651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        data_length -= 1;
766e2de257cf15d0508d29fa8a54a0dad78de4e75ebAmol Lad        if ((to_copy = min(strlen(clients[id].hDbg->drvTag), (size_t)(data_length-2)))) {
7671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds          memcpy (p, clients[id].hDbg->drvTag, to_copy);
7681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds          p += to_copy;
7691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds          data_length -= to_copy;
7701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds          if (data_length >= 2) {
7711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds            *p++ = ')';
7721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds            data_length--;
7731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds          }
7741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        }
7751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      }
7761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    }
7771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  }
7781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  *p++ = 0;
7791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
7801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  diva_os_leave_spin_lock (&dbg_q_lock, &old_irql, "driver info");
7811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
7821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  return (p - data);
7831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
7841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
7851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsint diva_get_driver_dbg_mask (dword id, byte* data) {
7861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  diva_os_spin_lock_magic_t old_irql;
7871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  int ret = -1;
7881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
789f85aaeba458fda1de199a73566c641516e9a935dAhmed S. Darwish  if (!data || !id || (id >= ARRAY_SIZE(clients))) {
7901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    return (-1);
7911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  }
7921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  diva_os_enter_spin_lock (&dbg_q_lock, &old_irql, "driver info");
7931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
7941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  if (clients[id].hDbg) {
7951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    ret = 4;
7961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    *data++= (byte)(clients[id].hDbg->dbgMask);
7971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    *data++= (byte)(clients[id].hDbg->dbgMask >>  8);
7981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    *data++= (byte)(clients[id].hDbg->dbgMask >> 16);
7991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    *data++= (byte)(clients[id].hDbg->dbgMask >> 24);
8001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  }
8011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
8021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  diva_os_leave_spin_lock (&dbg_q_lock, &old_irql, "driver info");
8031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
8041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  return (ret);
8051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
8061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
8071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsint diva_set_driver_dbg_mask (dword id, dword mask) {
8081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  diva_os_spin_lock_magic_t old_irql, old_irql1;
8091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  int ret = -1;
8101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
8111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
812f85aaeba458fda1de199a73566c641516e9a935dAhmed S. Darwish  if (!id || (id >= ARRAY_SIZE(clients))) {
8131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    return (-1);
8141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  }
8151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
8161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  diva_os_enter_spin_lock (&dbg_adapter_lock, &old_irql1, "dbg mask");
8171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  diva_os_enter_spin_lock (&dbg_q_lock, &old_irql, "dbg mask");
8181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
8191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  if (clients[id].hDbg) {
8201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    dword old_mask = clients[id].hDbg->dbgMask;
8211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    mask &= 0x7fffffff;
8221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    clients[id].hDbg->dbgMask = mask;
8231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    clients[id].last_dbgMask = (clients[id].hDbg->dbgMask | clients[id].dbgMask);
8241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    ret = 4;
8251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    diva_change_management_debug_mask (&clients[id], old_mask);
8261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  }
8271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
8281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
8291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  diva_os_leave_spin_lock (&dbg_q_lock, &old_irql, "dbg mask");
8301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
8311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  if (clients[id].request_pending) {
8321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    clients[id].request_pending = 0;
8331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    (*(clients[id].request))((ENTITY*)(*(clients[id].pIdiLib->DivaSTraceGetHandle))(clients[id].pIdiLib->hLib));
8341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  }
8351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
8361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  diva_os_leave_spin_lock (&dbg_adapter_lock, &old_irql1, "dbg mask");
8371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
8381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  return (ret);
8391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
8401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
8411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int diva_get_idi_adapter_info (IDI_CALL request, dword* serial, dword* logical) {
8421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  IDI_SYNC_REQ sync_req;
8431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
8441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  sync_req.xdi_logical_adapter_number.Req = 0;
8451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  sync_req.xdi_logical_adapter_number.Rc = IDI_SYNC_REQ_XDI_GET_LOGICAL_ADAPTER_NUMBER;
8461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  (*request)((ENTITY *)&sync_req);
8471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  *logical = sync_req.xdi_logical_adapter_number.info.logical_adapter_number;
8481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
8491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  sync_req.GetSerial.Req = 0;
8501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  sync_req.GetSerial.Rc = IDI_SYNC_REQ_GET_SERIAL;
8511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  sync_req.GetSerial.serial = 0;
8521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  (*request)((ENTITY *)&sync_req);
8531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	*serial = sync_req.GetSerial.serial;
8541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
8551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  return (0);
8561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
8571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
8581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
8591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  Register XDI adapter as MAINT compatible driver
8601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  */
8611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsvoid diva_mnt_add_xdi_adapter (const DESCRIPTOR* d) {
8621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  diva_os_spin_lock_magic_t old_irql, old_irql1;
8631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  dword sec, usec, logical, serial, org_mask;
8642d09d567127e85dddd027d049196093640025c36David S. Miller  int id, free_id = -1;
865c2dddf941409635601e56c1990c5ab0bd395742cDan Carpenter  char tmp[128];
8661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  diva_dbg_entry_head_t* pmsg = NULL;
8671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  int len;
8681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  word size;
8691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  byte* pmem;
8701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
8711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  diva_os_get_time (&sec, &usec);
8721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  diva_get_idi_adapter_info (d->request, &serial, &logical);
8731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  if (serial & 0xff000000) {
8741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    sprintf (tmp, "ADAPTER:%d SN:%u-%d",
8751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds             (int)logical,
8761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds             serial & 0x00ffffff,
8771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds             (byte)(((serial & 0xff000000) >> 24) + 1));
8781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  } else {
8791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    sprintf (tmp, "ADAPTER:%d SN:%u", (int)logical, serial);
8801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  }
8811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
8821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  if (!(pmem = diva_os_malloc (0, DivaSTraceGetMemotyRequirement (d->channels)))) {
8831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    return;
8841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  }
8851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  memset (pmem, 0x00, DivaSTraceGetMemotyRequirement (d->channels));
8861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
8871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  diva_os_enter_spin_lock (&dbg_adapter_lock, &old_irql1, "register");
8881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  diva_os_enter_spin_lock (&dbg_q_lock, &old_irql, "register");
8891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
890f85aaeba458fda1de199a73566c641516e9a935dAhmed S. Darwish  for (id = 1; id < ARRAY_SIZE(clients); id++) {
8911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    if (clients[id].hDbg && (clients[id].request == d->request)) {
8921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      diva_os_leave_spin_lock (&dbg_q_lock, &old_irql, "register");
8931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      diva_os_leave_spin_lock (&dbg_adapter_lock, &old_irql1, "register");
8941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      diva_os_free(0, pmem);
8951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      return;
8961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    }
8971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    if (clients[id].hDbg) { /* slot is busy */
8981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      continue;
8991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    }
9001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    if (free_id < 0) {
9011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      free_id = id;
9021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    }
9031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    if (!strcmp (clients[id].drvName, tmp)) {
9041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      /*
9051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        This driver was already registered with this name
9061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        and slot is still free - reuse it
9071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        */
9081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      free_id = id;
9091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      break;
9101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    }
9111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  }
9121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
9131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  if (free_id < 0) {
9141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    diva_os_leave_spin_lock (&dbg_q_lock, &old_irql, "register");
9151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    diva_os_leave_spin_lock (&dbg_adapter_lock, &old_irql1, "register");
9161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    diva_os_free (0, pmem);
9171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    return;
9181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  }
9191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
9201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  id = free_id;
9211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  clients[id].request  = d->request;
9221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  clients[id].request_pending = 0;
9231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  clients[id].hDbg     = &clients[id].Dbg;
9241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  clients[id].sec      = sec;
9251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  clients[id].usec     = usec;
9261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  strcpy (clients[id].drvName,     tmp);
9271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  strcpy (clients[id].Dbg.drvName, tmp);
9281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  clients[id].Dbg.drvTag[0] = 0;
9291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  clients[id].logical  = (int)logical;
9301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  clients[id].channels = (int)d->channels;
9311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  clients[id].dma_handle = -1;
9321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
9331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  clients[id].Dbg.dbgMask    = 0;
9341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  clients[id].dbgMask        = clients[id].Dbg.dbgMask;
9351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  if (id) {
9361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    clients[id].Dbg.dbgMask |= clients[free_id].last_dbgMask;
9371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  } else {
9381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    clients[id].last_dbgMask = 0;
9391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  }
9401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  clients[id].Dbg.Registered = DBG_HANDLE_REG_NEW;
9411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  clients[id].Dbg.id         = (byte)id;
9421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  clients[id].Dbg.dbg_end    = DI_deregister;
9431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  clients[id].Dbg.dbg_prt    = DI_format_locked;
9441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  clients[id].Dbg.dbg_ev     = DiProcessEventLog;
9451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  clients[id].Dbg.dbg_irq    = DI_format_locked;
9461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  clients[id].Dbg.next       = (pDbgHandle)DBG_MAGIC;
9471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
9481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  {
9491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    diva_trace_library_user_interface_t diva_maint_user_ifc = { &clients[id],
9501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds																							 diva_maint_state_change_notify,
9511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds																							 diva_maint_trace_notify,
9521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds																							 diva_maint_error };
9531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
9541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    /*
9551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      Attach to adapter management interface
9561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      */
9571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    if ((clients[id].pIdiLib =
9581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds               DivaSTraceLibraryCreateInstance ((int)logical, &diva_maint_user_ifc, pmem))) {
9591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      if (((*(clients[id].pIdiLib->DivaSTraceLibraryStart))(clients[id].pIdiLib->hLib))) {
9601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        diva_mnt_internal_dprintf (0, DLI_ERR, "Adapter(%d) Start failed", (int)logical);
9611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        (*(clients[id].pIdiLib->DivaSTraceLibraryFinit))(clients[id].pIdiLib->hLib);
9621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        clients[id].pIdiLib = NULL;
9631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      }
9641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    } else {
9651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      diva_mnt_internal_dprintf (0, DLI_ERR, "A(%d) management init failed", (int)logical);
9661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    }
9671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  }
9681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
9691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  if (!clients[id].pIdiLib) {
9701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    clients[id].request = NULL;
9711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    clients[id].request_pending = 0;
9721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    clients[id].hDbg    = NULL;
9731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    diva_os_leave_spin_lock (&dbg_q_lock, &old_irql, "register");
9741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    diva_os_leave_spin_lock (&dbg_adapter_lock, &old_irql1, "register");
9751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    diva_os_free (0, pmem);
9761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    return;
9771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  }
9781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
9791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  /*
9801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    Log driver register, MAINT driver ID is '0'
9811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    */
9821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  len = sprintf (tmp, "DIMAINT - drv # %d = '%s' registered",
9831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds                 id, clients[id].Dbg.drvName);
9841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
9851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  while (!(pmsg = (diva_dbg_entry_head_t*)queueAllocMsg (dbg_queue,
9861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds                                      (word)(len+1+sizeof(*pmsg))))) {
9871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    if ((pmsg = (diva_dbg_entry_head_t*)queuePeekMsg (dbg_queue, &size))) {
9881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      queueFreeMsg (dbg_queue);
9891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    } else {
9901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      break;
9911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    }
9921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  }
9931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
9941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  if (pmsg) {
9951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    pmsg->sequence    = dbg_sequence++;
9961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    pmsg->time_sec    = sec;
9971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    pmsg->time_usec   = usec;
9981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    pmsg->facility    = MSG_TYPE_STRING;
9991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    pmsg->dli         = DLI_REG;
10001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    pmsg->drv_id      = 0; /* id 0 - DIMAINT */
10011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    pmsg->di_cpu      = 0;
10021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    pmsg->data_length = len+1;
10031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
10041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    memcpy (&pmsg[1], tmp, len+1);
10051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    queueCompleteMsg (pmsg);
10061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    diva_maint_wakeup_read();
10071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  }
10081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
10091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  org_mask = clients[id].Dbg.dbgMask;
10101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  clients[id].Dbg.dbgMask = 0;
10111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
10121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  diva_os_leave_spin_lock (&dbg_q_lock, &old_irql, "register");
10131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
10141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  if (clients[id].request_pending) {
10151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    clients[id].request_pending = 0;
10161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    (*(clients[id].request))((ENTITY*)(*(clients[id].pIdiLib->DivaSTraceGetHandle))(clients[id].pIdiLib->hLib));
10171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  }
10181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
10191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  diva_os_leave_spin_lock (&dbg_adapter_lock, &old_irql1, "register");
10201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
10211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	diva_set_driver_dbg_mask (id, org_mask);
10221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
10231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
10241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
10251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  De-Register XDI adapter
10261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  */
10271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsvoid diva_mnt_remove_xdi_adapter (const DESCRIPTOR* d) {
10281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  diva_os_spin_lock_magic_t old_irql, old_irql1;
10291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  dword sec, usec;
10301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  int i;
10311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  word size;
10321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  byte* pmem = NULL;
10331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
10341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  diva_os_get_time (&sec, &usec);
10351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
10361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  diva_os_enter_spin_lock (&dbg_adapter_lock, &old_irql1, "read");
10371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  diva_os_enter_spin_lock (&dbg_q_lock, &old_irql, "read");
10381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1039f85aaeba458fda1de199a73566c641516e9a935dAhmed S. Darwish  for (i = 1; i < ARRAY_SIZE(clients); i++) {
10401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    if (clients[i].hDbg && (clients[i].request == d->request)) {
10411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      diva_dbg_entry_head_t* pmsg;
10421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      char tmp[256];
10431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      int len;
10441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
10451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      if (clients[i].pIdiLib) {
10461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        (*(clients[i].pIdiLib->DivaSTraceLibraryFinit))(clients[i].pIdiLib->hLib);
10471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        clients[i].pIdiLib = NULL;
10481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
10491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        pmem = clients[i].pmem;
10501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        clients[i].pmem = NULL;
10511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      }
10521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
10531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      clients[i].hDbg    = NULL;
10541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      clients[i].request_pending = 0;
10551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      if (clients[i].dma_handle >= 0) {
10561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        /*
10571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds          Free DMA handle
10581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds          */
10591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        diva_free_dma_descriptor (clients[i].request, clients[i].dma_handle);
10601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        clients[i].dma_handle = -1;
10611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      }
10621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      clients[i].request = NULL;
10631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
10641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      /*
10651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        Log driver register, MAINT driver ID is '0'
10661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        */
10671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      len = sprintf (tmp, "DIMAINT - drv # %d = '%s' de-registered",
10681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds                     i, clients[i].Dbg.drvName);
10691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
10701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      memset (&clients[i].Dbg, 0x00, sizeof(clients[i].Dbg));
10711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
10721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      while (!(pmsg = (diva_dbg_entry_head_t*)queueAllocMsg (dbg_queue,
10731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds                                        (word)(len+1+sizeof(*pmsg))))) {
10741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        if ((pmsg = (diva_dbg_entry_head_t*)queuePeekMsg (dbg_queue, &size))) {
10751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds          queueFreeMsg (dbg_queue);
10761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        } else {
10771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds          break;
10781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        }
10791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      }
10801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
10811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      if (pmsg) {
10821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        pmsg->sequence    = dbg_sequence++;
10831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        pmsg->time_sec    = sec;
10841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        pmsg->time_usec   = usec;
10851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        pmsg->facility    = MSG_TYPE_STRING;
10861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        pmsg->dli         = DLI_REG;
10871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        pmsg->drv_id      = 0; /* id 0 - DIMAINT */
10881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        pmsg->di_cpu      = 0;
10891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        pmsg->data_length = len+1;
10901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
10911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        memcpy (&pmsg[1], tmp, len+1);
10921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  		  queueCompleteMsg (pmsg);
10931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        diva_maint_wakeup_read();
10941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      }
10951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
10961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      break;
10971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    }
10981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  }
10991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
11001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  diva_os_leave_spin_lock (&dbg_q_lock, &old_irql, "read_ack");
11011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  diva_os_leave_spin_lock (&dbg_adapter_lock, &old_irql1, "read_ack");
11021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
11031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  if (pmem) {
11041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    diva_os_free (0, pmem);
11051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  }
11061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
11071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
11081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* ----------------------------------------------------------------
11091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds     Low level interface for management interface client
11101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds   ---------------------------------------------------------------- */
11111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
11121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  Return handle to client structure
11131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  */
11141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsvoid* SuperTraceOpenAdapter   (int AdapterNumber) {
11151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  int i;
11161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1117f85aaeba458fda1de199a73566c641516e9a935dAhmed S. Darwish  for (i = 1; i < ARRAY_SIZE(clients); i++) {
11181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    if (clients[i].hDbg && clients[i].request && (clients[i].logical == AdapterNumber)) {
11191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      return (&clients[i]);
11201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    }
11211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  }
11221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
11231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  return NULL;
11241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
11251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
11261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsint SuperTraceCloseAdapter  (void* AdapterHandle) {
11271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  return (0);
11281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
11291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
11301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsint SuperTraceReadRequest (void* AdapterHandle, const char* name, byte* data) {
11311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  diva_maint_client_t* pC = (diva_maint_client_t*)AdapterHandle;
11321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
11331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  if (pC && pC->pIdiLib && pC->request) {
11341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    ENTITY* e = (ENTITY*)(*(pC->pIdiLib->DivaSTraceGetHandle))(pC->pIdiLib->hLib);
11351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    byte* xdata = (byte*)&pC->xbuffer[0];
11361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    char tmp = 0;
11371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    word length;
11381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
11391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    if (!strcmp(name, "\\")) { /* Read ROOT */
11401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      name = &tmp;
11411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    }
11421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    length = SuperTraceCreateReadReq (xdata, name);
11431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    single_p (xdata, &length, 0); /* End Of Message */
11441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
11451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    e->Req        = MAN_READ;
11461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    e->ReqCh      = 0;
11471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    e->X->PLength = length;
11481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    e->X->P			  = (byte*)xdata;
11491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
11501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    pC->request_pending = 1;
11511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
11521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    return (0);
11531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  }
11541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
11551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  return (-1);
11561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
11571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
11581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsint SuperTraceGetNumberOfChannels (void* AdapterHandle) {
11591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  if (AdapterHandle) {
11601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    diva_maint_client_t* pC = (diva_maint_client_t*)AdapterHandle;
11611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
11621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    return (pC->channels);
11631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  }
11641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
11651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  return (0);
11661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
11671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
11681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsint SuperTraceASSIGN (void* AdapterHandle, byte* data) {
11691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  diva_maint_client_t* pC = (diva_maint_client_t*)AdapterHandle;
11701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
11711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  if (pC && pC->pIdiLib && pC->request) {
11721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    ENTITY* e = (ENTITY*)(*(pC->pIdiLib->DivaSTraceGetHandle))(pC->pIdiLib->hLib);
11731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    IDI_SYNC_REQ* preq;
11741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    char buffer[((sizeof(preq->xdi_extended_features)+4) > sizeof(ENTITY)) ? (sizeof(preq->xdi_extended_features)+4) : sizeof(ENTITY)];
11751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    char features[4];
11761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    word assign_data_length = 1;
11771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
11781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    features[0] = 0;
11791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    pC->xbuffer[0] = 0;
11801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    preq = (IDI_SYNC_REQ*)&buffer[0];
11811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    preq->xdi_extended_features.Req = 0;
11821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    preq->xdi_extended_features.Rc  = IDI_SYNC_REQ_XDI_GET_EXTENDED_FEATURES;
11831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    preq->xdi_extended_features.info.buffer_length_in_bytes = sizeof(features);
11841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    preq->xdi_extended_features.info.features = &features[0];
11851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
11861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    (*(pC->request))((ENTITY*)preq);
11871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
11881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    if ((features[0] & DIVA_XDI_EXTENDED_FEATURES_VALID) &&
11891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        (features[0] & DIVA_XDI_EXTENDED_FEATURE_MANAGEMENT_DMA)) {
1190162c0d91a365d501c6cc65cba451f2d855e8ee81Andrew Morton      dword uninitialized_var(rx_dma_magic);
11911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      if ((pC->dma_handle = diva_get_dma_descriptor (pC->request, &rx_dma_magic)) >= 0) {
11921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        pC->xbuffer[0] = LLI;
11931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        pC->xbuffer[1] = 8;
11941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        pC->xbuffer[2] = 0x40;
11951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        pC->xbuffer[3] = (byte)pC->dma_handle;
11961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        pC->xbuffer[4] = (byte)rx_dma_magic;
11971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        pC->xbuffer[5] = (byte)(rx_dma_magic >>  8);
11981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        pC->xbuffer[6] = (byte)(rx_dma_magic >> 16);
11991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        pC->xbuffer[7] = (byte)(rx_dma_magic >> 24);
1200215a9c78ae92c0e33261f7973d52d70d9eeb367cHannes Eder	pC->xbuffer[8] = (byte)(DIVA_MAX_MANAGEMENT_TRANSFER_SIZE & 0xFF);
12011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        pC->xbuffer[9] = (byte)(DIVA_MAX_MANAGEMENT_TRANSFER_SIZE >> 8);
12021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        pC->xbuffer[10] = 0;
12031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
12041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        assign_data_length = 11;
12051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      }
12061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    } else {
12071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      pC->dma_handle = -1;
12081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    }
12091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
12101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    e->Id          = MAN_ID;
12111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    e->callback    = diva_maint_xdi_cb;
12121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    e->XNum        = 1;
12131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    e->X           = &pC->XData;
12141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    e->Req         = ASSIGN;
12151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    e->ReqCh       = 0;
12161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    e->X->PLength  = assign_data_length;
12171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    e->X->P        = (byte*)&pC->xbuffer[0];
12181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
12191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    pC->request_pending = 1;
12201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
12211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    return (0);
12221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  }
12231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
12241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  return (-1);
12251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
12261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
12271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsint SuperTraceREMOVE (void* AdapterHandle) {
12281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  diva_maint_client_t* pC = (diva_maint_client_t*)AdapterHandle;
12291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
12301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  if (pC && pC->pIdiLib && pC->request) {
12311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    ENTITY* e = (ENTITY*)(*(pC->pIdiLib->DivaSTraceGetHandle))(pC->pIdiLib->hLib);
12321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
12331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    e->XNum        = 1;
12341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    e->X           = &pC->XData;
12351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    e->Req         = REMOVE;
12361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    e->ReqCh       = 0;
12371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    e->X->PLength  = 1;
12381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    e->X->P        = (byte*)&pC->xbuffer[0];
12391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    pC->xbuffer[0] = 0;
12401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
12411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    pC->request_pending = 1;
12421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
12431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    return (0);
12441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  }
12451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
12461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  return (-1);
12471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
12481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
12491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsint SuperTraceTraceOnRequest(void* hAdapter, const char* name, byte* data) {
12501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  diva_maint_client_t* pC = (diva_maint_client_t*)hAdapter;
12511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
12521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  if (pC && pC->pIdiLib && pC->request) {
12531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    ENTITY* e = (ENTITY*)(*(pC->pIdiLib->DivaSTraceGetHandle))(pC->pIdiLib->hLib);
12541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    byte* xdata = (byte*)&pC->xbuffer[0];
12551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    char tmp = 0;
12561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    word length;
12571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
12581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    if (!strcmp(name, "\\")) { /* Read ROOT */
12591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      name = &tmp;
12601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    }
12611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    length = SuperTraceCreateReadReq (xdata, name);
12621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    single_p (xdata, &length, 0); /* End Of Message */
12631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    e->Req          = MAN_EVENT_ON;
12641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    e->ReqCh        = 0;
12651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    e->X->PLength   = length;
12661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    e->X->P			    = (byte*)xdata;
12671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
12681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    pC->request_pending = 1;
12691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
12701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    return (0);
12711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  }
12721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
12731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  return (-1);
12741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
12751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
12761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsint SuperTraceWriteVar (void* AdapterHandle,
12771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds                        byte* data,
12781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds                        const char* name,
12791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds                        void* var,
12801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds                        byte type,
12811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds                        byte var_length) {
12821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  diva_maint_client_t* pC = (diva_maint_client_t*)AdapterHandle;
12831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
12841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  if (pC && pC->pIdiLib && pC->request) {
12851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    ENTITY* e = (ENTITY*)(*(pC->pIdiLib->DivaSTraceGetHandle))(pC->pIdiLib->hLib);
12861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    diva_man_var_header_t* pVar = (diva_man_var_header_t*)&pC->xbuffer[0];
12871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    word length = SuperTraceCreateReadReq ((byte*)pVar, name);
12881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
12891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    memcpy (&pC->xbuffer[length], var, var_length);
12901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    length += var_length;
12911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    pVar->length += var_length;
12921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    pVar->value_length = var_length;
12931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    pVar->type = type;
12941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    single_p ((byte*)pVar, &length, 0); /* End Of Message */
12951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
12961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    e->Req          = MAN_WRITE;
12971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    e->ReqCh			  = 0;
12981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    e->X->PLength   = length;
12991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    e->X->P			    = (byte*)pVar;
13001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
13011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    pC->request_pending = 1;
13021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
13031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    return (0);
13041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  }
13051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
13061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  return (-1);
13071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
13081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
13091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsint SuperTraceExecuteRequest (void* AdapterHandle,
13101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds                              const char* name,
13111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds                              byte* data) {
13121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  diva_maint_client_t* pC = (diva_maint_client_t*)AdapterHandle;
13131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
13141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  if (pC && pC->pIdiLib && pC->request) {
13151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    ENTITY* e = (ENTITY*)(*(pC->pIdiLib->DivaSTraceGetHandle))(pC->pIdiLib->hLib);
13161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    byte* xdata = (byte*)&pC->xbuffer[0];
13171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    word length;
13181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
13191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    length = SuperTraceCreateReadReq (xdata, name);
13201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    single_p (xdata, &length, 0); /* End Of Message */
13211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
13221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    e->Req          = MAN_EXECUTE;
13231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    e->ReqCh			  = 0;
13241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    e->X->PLength   = length;
13251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    e->X->P			    = (byte*)xdata;
13261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
13271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    pC->request_pending = 1;
13281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
13291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    return (0);
13301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  }
13311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
13321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  return (-1);
13331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
13341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
13351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic word SuperTraceCreateReadReq (byte* P, const char* path) {
13361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	byte var_length;
13371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	byte* plen;
13381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
13391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	var_length = (byte)strlen (path);
13401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
13411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	*P++ = ESC;
13421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	plen = P++;
13431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	*P++ = 0x80; /* MAN_IE */
13441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	*P++ = 0x00; /* Type */
13451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	*P++ = 0x00; /* Attribute */
13461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	*P++ = 0x00; /* Status */
13471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	*P++ = 0x00; /* Variable Length */
13481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	*P++ = var_length;
13491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	memcpy (P, path, var_length);
13501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	P += var_length;
13511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	*plen = var_length + 0x06;
13521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
13531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return ((word)(var_length + 0x08));
13541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
13551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
13561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void single_p (byte * P, word * PLength, byte Id) {
13571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  P[(*PLength)++] = Id;
13581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
13591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
13601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void diva_maint_xdi_cb (ENTITY* e) {
13611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  diva_strace_context_t* pLib = DIVAS_CONTAINING_RECORD(e,diva_strace_context_t,e);
13621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  diva_maint_client_t* pC;
13631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  diva_os_spin_lock_magic_t old_irql, old_irql1;
13641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
13651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
13661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  diva_os_enter_spin_lock (&dbg_adapter_lock, &old_irql1, "xdi_cb");
13671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  diva_os_enter_spin_lock (&dbg_q_lock, &old_irql, "xdi_cb");
13681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
13691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  pC = (diva_maint_client_t*)pLib->hAdapter;
13701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
13711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  if ((e->complete == 255) || (pC->dma_handle < 0)) {
13721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    if ((*(pLib->instance.DivaSTraceMessageInput))(&pLib->instance)) {
13731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      diva_mnt_internal_dprintf (0, DLI_ERR, "Trace internal library error");
13741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    }
13751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  } else {
13761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    /*
13771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      Process combined management interface indication
13781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      */
13791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    if ((*(pLib->instance.DivaSTraceMessageInput))(&pLib->instance)) {
13801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      diva_mnt_internal_dprintf (0, DLI_ERR, "Trace internal library error (DMA mode)");
13811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    }
13821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  }
13831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
13841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  diva_os_leave_spin_lock (&dbg_q_lock, &old_irql, "xdi_cb");
13851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
13861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
13871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (pC->request_pending) {
13881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    pC->request_pending = 0;
13891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    (*(pC->request))(e);
13901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
13911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
13921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  diva_os_leave_spin_lock (&dbg_adapter_lock, &old_irql1, "xdi_cb");
13931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
13941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
13951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
13961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void diva_maint_error (void* user_context,
13971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds                              diva_strace_library_interface_t* hLib,
13981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds                              int Adapter,
13991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds                              int error,
14001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds                              const char* file,
14011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds                              int line) {
14021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	diva_mnt_internal_dprintf (0, DLI_ERR,
14031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds                             "Trace library error(%d) A(%d) %s %d", error, Adapter, file, line);
14041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
14051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
14061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void print_ie (diva_trace_ie_t* ie, char* buffer, int length) {
14071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	int i;
14081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
14091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  buffer[0] = 0;
14101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
14111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  if (length > 32) {
14121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    for (i = 0; ((i < ie->length) && (length > 3)); i++) {
14131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      sprintf (buffer, "%02x", ie->data[i]);
14141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      buffer += 2;
14151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      length -= 2;
14161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      if (i < (ie->length-1)) {
14171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        strcpy (buffer, " ");
14181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        buffer++;
14191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        length--;
14201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      }
14211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    }
14221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  }
14231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
14241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
14251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void diva_maint_state_change_notify (void* user_context,
14261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds                                            diva_strace_library_interface_t* hLib,
14271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds                                            int Adapter,
14281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds                                            diva_trace_line_state_t* channel,
14291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds                                            int notify_subject) {
14301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  diva_maint_client_t*      pC    = (diva_maint_client_t*)user_context;
14311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  diva_trace_fax_state_t*   fax   = &channel->fax;
14321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  diva_trace_modem_state_t* modem = &channel->modem;
14331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  char tmp[256];
14341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
14351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  if (!pC->hDbg) {
14361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    return;
14371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  }
14381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
14391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  switch (notify_subject) {
14401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    case DIVA_SUPER_TRACE_NOTIFY_LINE_CHANGE: {
14411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      int view = (TraceFilter[0] == 0);
14421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      /*
14431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        Process selective Trace
14441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        */
14451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      if (channel->Line[0] == 'I' && channel->Line[1] == 'd' &&
14461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds          channel->Line[2] == 'l' && channel->Line[3] == 'e') {
14471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        if ((TraceFilterIdent == pC->hDbg->id) && (TraceFilterChannel == (int)channel->ChannelNumber)) {
14481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds          (*(hLib->DivaSTraceSetBChannel))(hLib, (int)channel->ChannelNumber, 0);
14491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds          (*(hLib->DivaSTraceSetAudioTap))(hLib, (int)channel->ChannelNumber, 0);
14501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds          diva_mnt_internal_dprintf (pC->hDbg->id, DLI_LOG, "Selective Trace OFF for Ch=%d",
14511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds                                     (int)channel->ChannelNumber);
14521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds          TraceFilterIdent   = -1;
14531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds          TraceFilterChannel = -1;
14541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds          view = 1;
14551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        }
14561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      } else if (TraceFilter[0] && (TraceFilterIdent < 0) && !(diva_mnt_cmp_nmbr (&channel->RemoteAddress[0]) &&
14571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds                                                               diva_mnt_cmp_nmbr (&channel->LocalAddress[0]))) {
14581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
14591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        if ((pC->hDbg->dbgMask & DIVA_MGT_DBG_IFC_BCHANNEL) != 0) { /* Activate B-channel trace */
14601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds          (*(hLib->DivaSTraceSetBChannel))(hLib, (int)channel->ChannelNumber, 1);
14611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        }
14621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        if ((pC->hDbg->dbgMask & DIVA_MGT_DBG_IFC_AUDIO) != 0) { /* Activate AudioTap Trace */
14631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds          (*(hLib->DivaSTraceSetAudioTap))(hLib, (int)channel->ChannelNumber, 1);
14641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        }
14651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
14661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        TraceFilterIdent   = pC->hDbg->id;
14671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        TraceFilterChannel = (int)channel->ChannelNumber;
14681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
14691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        if (TraceFilterIdent >= 0) {
14701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds          diva_mnt_internal_dprintf (pC->hDbg->id, DLI_LOG, "Selective Trace ON for Ch=%d",
14711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds                                     (int)channel->ChannelNumber);
14721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds          view = 1;
14731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        }
14741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      }
14751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      if (view && (pC->hDbg->dbgMask & DIVA_MGT_DBG_LINE_EVENTS)) {
14761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        diva_mnt_internal_dprintf (pC->hDbg->id, DLI_STAT, "L Ch     = %d",
14771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds                                                                     (int)channel->ChannelNumber);
14781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        diva_mnt_internal_dprintf (pC->hDbg->id, DLI_STAT, "L Status = <%s>", &channel->Line[0]);
14791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        diva_mnt_internal_dprintf (pC->hDbg->id, DLI_STAT, "L Layer1 = <%s>", &channel->Framing[0]);
14801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        diva_mnt_internal_dprintf (pC->hDbg->id, DLI_STAT, "L Layer2 = <%s>", &channel->Layer2[0]);
14811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        diva_mnt_internal_dprintf (pC->hDbg->id, DLI_STAT, "L Layer3 = <%s>", &channel->Layer3[0]);
14821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        diva_mnt_internal_dprintf (pC->hDbg->id, DLI_STAT, "L RAddr  = <%s>",
14831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds                                                                     &channel->RemoteAddress[0]);
14841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        diva_mnt_internal_dprintf (pC->hDbg->id, DLI_STAT, "L RSAddr = <%s>",
14851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds                                                                     &channel->RemoteSubAddress[0]);
14861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        diva_mnt_internal_dprintf (pC->hDbg->id, DLI_STAT, "L LAddr  = <%s>",
14871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds                                                                     &channel->LocalAddress[0]);
14881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        diva_mnt_internal_dprintf (pC->hDbg->id, DLI_STAT, "L LSAddr = <%s>",
14891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds                                                                     &channel->LocalSubAddress[0]);
14901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        print_ie(&channel->call_BC, tmp, sizeof(tmp));
14911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        diva_mnt_internal_dprintf (pC->hDbg->id, DLI_STAT, "L BC     = <%s>", tmp);
14921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        print_ie(&channel->call_HLC, tmp, sizeof(tmp));
14931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        diva_mnt_internal_dprintf (pC->hDbg->id, DLI_STAT, "L HLC    = <%s>", tmp);
14941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        print_ie(&channel->call_LLC, tmp, sizeof(tmp));
14951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        diva_mnt_internal_dprintf (pC->hDbg->id, DLI_STAT, "L LLC    = <%s>", tmp);
14961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        diva_mnt_internal_dprintf (pC->hDbg->id, DLI_STAT, "L CR     = 0x%x", channel->CallReference);
14971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        diva_mnt_internal_dprintf (pC->hDbg->id, DLI_STAT, "L Disc   = 0x%x",
14981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds                                                                    channel->LastDisconnecCause);
14991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        diva_mnt_internal_dprintf (pC->hDbg->id, DLI_STAT, "L Owner  = <%s>", &channel->UserID[0]);
15001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      }
15011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
15021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		} break;
15031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
15041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    case DIVA_SUPER_TRACE_NOTIFY_MODEM_CHANGE:
15051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      if (pC->hDbg->dbgMask & DIVA_MGT_DBG_MDM_PROGRESS) {
15061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				{
15071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					int ch = TraceFilterChannel;
15081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					int id = TraceFilterIdent;
15091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1510f85aaeba458fda1de199a73566c641516e9a935dAhmed S. Darwish					if ((id >= 0) && (ch >= 0) && (id < ARRAY_SIZE(clients)) &&
15111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds						(clients[id].Dbg.id == (byte)id) && (clients[id].pIdiLib == hLib)) {
15121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds						if (ch != (int)modem->ChannelNumber) {
15131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds							break;
15141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds						}
15151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					} else if (TraceFilter[0] != 0) {
15161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds						break;
15171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					}
15181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				}
15191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
15201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
15211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        diva_mnt_internal_dprintf(pC->hDbg->id, DLI_STAT, "MDM Ch    = %lu",
15221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds                                                                     (int)modem->ChannelNumber);
15231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        diva_mnt_internal_dprintf(pC->hDbg->id, DLI_STAT, "MDM Event = %lu",     modem->Event);
15241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        diva_mnt_internal_dprintf(pC->hDbg->id, DLI_STAT, "MDM Norm  = %lu",     modem->Norm);
15251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        diva_mnt_internal_dprintf(pC->hDbg->id, DLI_STAT, "MDM Opts. = 0x%08x",  modem->Options);
15261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        diva_mnt_internal_dprintf(pC->hDbg->id, DLI_STAT, "MDM Tx    = %lu Bps", modem->TxSpeed);
15271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        diva_mnt_internal_dprintf(pC->hDbg->id, DLI_STAT, "MDM Rx    = %lu Bps", modem->RxSpeed);
15281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        diva_mnt_internal_dprintf(pC->hDbg->id, DLI_STAT, "MDM RT    = %lu mSec",
15291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds                                                                     modem->RoundtripMsec);
15301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        diva_mnt_internal_dprintf(pC->hDbg->id, DLI_STAT, "MDM Sr    = %lu",     modem->SymbolRate);
15311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        diva_mnt_internal_dprintf(pC->hDbg->id, DLI_STAT, "MDM Rxl   = %d dBm",  modem->RxLeveldBm);
15321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        diva_mnt_internal_dprintf(pC->hDbg->id, DLI_STAT, "MDM El    = %d dBm",  modem->EchoLeveldBm);
15331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        diva_mnt_internal_dprintf(pC->hDbg->id, DLI_STAT, "MDM SNR   = %lu dB",  modem->SNRdb);
15341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        diva_mnt_internal_dprintf(pC->hDbg->id, DLI_STAT, "MDM MAE   = %lu",     modem->MAE);
15351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        diva_mnt_internal_dprintf(pC->hDbg->id, DLI_STAT, "MDM LRet  = %lu",
15361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds                                                                     modem->LocalRetrains);
15371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        diva_mnt_internal_dprintf(pC->hDbg->id, DLI_STAT, "MDM RRet  = %lu",
15381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds                                                                     modem->RemoteRetrains);
15391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        diva_mnt_internal_dprintf(pC->hDbg->id, DLI_STAT, "MDM LRes  = %lu",     modem->LocalResyncs);
15401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        diva_mnt_internal_dprintf(pC->hDbg->id, DLI_STAT, "MDM RRes  = %lu",
15411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds                                                                     modem->RemoteResyncs);
15421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        if (modem->Event == 3) {
15431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds          diva_mnt_internal_dprintf(pC->hDbg->id,DLI_STAT,"MDM Disc  =  %lu",    modem->DiscReason);
15441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        }
15451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      }
15461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      if ((modem->Event == 3) && (pC->hDbg->dbgMask & DIVA_MGT_DBG_MDM_STATISTICS)) {
15471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        (*(pC->pIdiLib->DivaSTraceGetModemStatistics))(pC->pIdiLib);
15481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      }
15491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      break;
15501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
15511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    case DIVA_SUPER_TRACE_NOTIFY_FAX_CHANGE:
15521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      if (pC->hDbg->dbgMask & DIVA_MGT_DBG_FAX_PROGRESS) {
15531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				{
15541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					int ch = TraceFilterChannel;
15551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					int id = TraceFilterIdent;
15561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1557f85aaeba458fda1de199a73566c641516e9a935dAhmed S. Darwish					if ((id >= 0) && (ch >= 0) && (id < ARRAY_SIZE(clients)) &&
15581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds						(clients[id].Dbg.id == (byte)id) && (clients[id].pIdiLib == hLib)) {
15591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds						if (ch != (int)fax->ChannelNumber) {
15601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds							break;
15611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds						}
15621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					} else if (TraceFilter[0] != 0) {
15631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds						break;
15641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					}
15651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				}
15661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
15671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        diva_mnt_internal_dprintf(pC->hDbg->id, DLI_STAT, "FAX Ch    = %lu",(int)fax->ChannelNumber);
15681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        diva_mnt_internal_dprintf(pC->hDbg->id, DLI_STAT, "FAX Event = %lu",     fax->Event);
15691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        diva_mnt_internal_dprintf(pC->hDbg->id, DLI_STAT, "FAX Pages = %lu",     fax->Page_Counter);
15701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        diva_mnt_internal_dprintf(pC->hDbg->id, DLI_STAT, "FAX Feat. = 0x%08x",  fax->Features);
15711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        diva_mnt_internal_dprintf(pC->hDbg->id, DLI_STAT, "FAX ID    = <%s>",    &fax->Station_ID[0]);
15721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        diva_mnt_internal_dprintf(pC->hDbg->id, DLI_STAT, "FAX Saddr = <%s>",    &fax->Subaddress[0]);
15731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        diva_mnt_internal_dprintf(pC->hDbg->id, DLI_STAT, "FAX Pwd   = <%s>",    &fax->Password[0]);
15741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        diva_mnt_internal_dprintf(pC->hDbg->id, DLI_STAT, "FAX Speed = %lu",     fax->Speed);
15751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        diva_mnt_internal_dprintf(pC->hDbg->id, DLI_STAT, "FAX Res.  = 0x%08x",  fax->Resolution);
15761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        diva_mnt_internal_dprintf(pC->hDbg->id, DLI_STAT, "FAX Width = %lu",     fax->Paper_Width);
15771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        diva_mnt_internal_dprintf(pC->hDbg->id, DLI_STAT, "FAX Length= %lu",     fax->Paper_Length);
15781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        diva_mnt_internal_dprintf(pC->hDbg->id, DLI_STAT, "FAX SLT   = %lu",     fax->Scanline_Time);
15791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        if (fax->Event == 3) {
15801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds          diva_mnt_internal_dprintf(pC->hDbg->id, DLI_STAT, "FAX Disc  = %lu",     fax->Disc_Reason);
15811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        }
15821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      }
15831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      if ((fax->Event == 3) && (pC->hDbg->dbgMask & DIVA_MGT_DBG_FAX_STATISTICS)) {
15841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        (*(pC->pIdiLib->DivaSTraceGetFaxStatistics))(pC->pIdiLib);
15851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      }
15861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      break;
15871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
15881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    case DIVA_SUPER_TRACE_INTERFACE_CHANGE:
15891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      if (pC->hDbg->dbgMask & DIVA_MGT_DBG_IFC_EVENTS) {
15901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        diva_mnt_internal_dprintf (pC->hDbg->id, DLI_STAT,
15911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds                                 "Layer 1 -> [%s]", channel->pInterface->Layer1);
15921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        diva_mnt_internal_dprintf (pC->hDbg->id, DLI_STAT,
15931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds                                 "Layer 2 -> [%s]", channel->pInterface->Layer2);
15941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      }
15951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      break;
15961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
15971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    case DIVA_SUPER_TRACE_NOTIFY_STAT_CHANGE:
15981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      if (pC->hDbg->dbgMask & DIVA_MGT_DBG_IFC_STATISTICS) {
15991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        /*
16001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds          Incoming Statistics
16011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds          */
16021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        if (channel->pInterfaceStat->inc.Calls) {
16031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds          diva_mnt_internal_dprintf (pC->hDbg->id, DLI_LOG,
16041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds          "Inc Calls                     =%lu", channel->pInterfaceStat->inc.Calls);
16051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        }
16061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        if (channel->pInterfaceStat->inc.Connected) {
16071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds          diva_mnt_internal_dprintf (pC->hDbg->id, DLI_LOG,
16081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds          "Inc Connected                 =%lu", channel->pInterfaceStat->inc.Connected);
16091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        }
16101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        if (channel->pInterfaceStat->inc.User_Busy) {
16111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds          diva_mnt_internal_dprintf (pC->hDbg->id, DLI_LOG,
16121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds          "Inc Busy                      =%lu", channel->pInterfaceStat->inc.User_Busy);
16131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        }
16141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        if (channel->pInterfaceStat->inc.Call_Rejected) {
16151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds          diva_mnt_internal_dprintf (pC->hDbg->id, DLI_LOG,
16161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds          "Inc Rejected                  =%lu", channel->pInterfaceStat->inc.Call_Rejected);
16171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        }
16181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        if (channel->pInterfaceStat->inc.Wrong_Number) {
16191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds          diva_mnt_internal_dprintf (pC->hDbg->id, DLI_LOG,
16201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds          "Inc Wrong Nr                  =%lu", channel->pInterfaceStat->inc.Wrong_Number);
16211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        }
16221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        if (channel->pInterfaceStat->inc.Incompatible_Dst) {
16231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds          diva_mnt_internal_dprintf (pC->hDbg->id, DLI_LOG,
16241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds          "Inc Incomp. Dest              =%lu", channel->pInterfaceStat->inc.Incompatible_Dst);
16251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        }
16261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        if (channel->pInterfaceStat->inc.Out_of_Order) {
16271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds          diva_mnt_internal_dprintf (pC->hDbg->id, DLI_LOG,
16281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds          "Inc Out of Order              =%lu", channel->pInterfaceStat->inc.Out_of_Order);
16291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        }
16301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        if (channel->pInterfaceStat->inc.Ignored) {
16311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds          diva_mnt_internal_dprintf (pC->hDbg->id, DLI_LOG,
16321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds          "Inc Ignored                   =%lu", channel->pInterfaceStat->inc.Ignored);
16331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        }
16341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
16351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        /*
16361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds          Outgoing Statistics
16371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds          */
16381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        if (channel->pInterfaceStat->outg.Calls) {
16391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds          diva_mnt_internal_dprintf (pC->hDbg->id, DLI_LOG,
16401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds          "Outg Calls                    =%lu", channel->pInterfaceStat->outg.Calls);
16411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        }
16421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        if (channel->pInterfaceStat->outg.Connected) {
16431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds          diva_mnt_internal_dprintf (pC->hDbg->id, DLI_LOG,
16441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds          "Outg Connected                =%lu", channel->pInterfaceStat->outg.Connected);
16451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        }
16461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        if (channel->pInterfaceStat->outg.User_Busy) {
16471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds          diva_mnt_internal_dprintf (pC->hDbg->id, DLI_LOG,
16481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds          "Outg Busy                     =%lu", channel->pInterfaceStat->outg.User_Busy);
16491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        }
16501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        if (channel->pInterfaceStat->outg.No_Answer) {
16511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds          diva_mnt_internal_dprintf (pC->hDbg->id, DLI_LOG,
16521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds          "Outg No Answer                =%lu", channel->pInterfaceStat->outg.No_Answer);
16531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        }
16541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        if (channel->pInterfaceStat->outg.Wrong_Number) {
16551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds          diva_mnt_internal_dprintf (pC->hDbg->id, DLI_LOG,
16561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds          "Outg Wrong Nr                 =%lu", channel->pInterfaceStat->outg.Wrong_Number);
16571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        }
16581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        if (channel->pInterfaceStat->outg.Call_Rejected) {
16591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds          diva_mnt_internal_dprintf (pC->hDbg->id, DLI_LOG,
16601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds          "Outg Rejected                 =%lu", channel->pInterfaceStat->outg.Call_Rejected);
16611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        }
16621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        if (channel->pInterfaceStat->outg.Other_Failures) {
16631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds          diva_mnt_internal_dprintf (pC->hDbg->id, DLI_LOG,
16641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds          "Outg Other Failures           =%lu", channel->pInterfaceStat->outg.Other_Failures);
16651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        }
16661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      }
16671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      break;
16681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
16691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    case DIVA_SUPER_TRACE_NOTIFY_MDM_STAT_CHANGE:
16701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      if (channel->pInterfaceStat->mdm.Disc_Normal) {
16711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        diva_mnt_internal_dprintf (pC->hDbg->id, DLI_LOG,
16721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        "MDM Disc Normal        = %lu", channel->pInterfaceStat->mdm.Disc_Normal);
16731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      }
16741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      if (channel->pInterfaceStat->mdm.Disc_Unspecified) {
16751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        diva_mnt_internal_dprintf (pC->hDbg->id, DLI_LOG,
16761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        "MDM Disc Unsp.         = %lu", channel->pInterfaceStat->mdm.Disc_Unspecified);
16771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      }
16781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      if (channel->pInterfaceStat->mdm.Disc_Busy_Tone) {
16791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        diva_mnt_internal_dprintf (pC->hDbg->id, DLI_LOG,
16801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        "MDM Disc Busy Tone     = %lu", channel->pInterfaceStat->mdm.Disc_Busy_Tone);
16811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      }
16821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      if (channel->pInterfaceStat->mdm.Disc_Congestion) {
16831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        diva_mnt_internal_dprintf (pC->hDbg->id, DLI_LOG,
16841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        "MDM Disc Congestion    = %lu", channel->pInterfaceStat->mdm.Disc_Congestion);
16851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      }
16861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      if (channel->pInterfaceStat->mdm.Disc_Carr_Wait) {
16871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        diva_mnt_internal_dprintf (pC->hDbg->id, DLI_LOG,
16881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        "MDM Disc Carrier Wait  = %lu", channel->pInterfaceStat->mdm.Disc_Carr_Wait);
16891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      }
16901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      if (channel->pInterfaceStat->mdm.Disc_Trn_Timeout) {
16911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        diva_mnt_internal_dprintf (pC->hDbg->id, DLI_LOG,
16921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        "MDM Disc Trn. T.o.     = %lu", channel->pInterfaceStat->mdm.Disc_Trn_Timeout);
16931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      }
16941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      if (channel->pInterfaceStat->mdm.Disc_Incompat) {
16951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        diva_mnt_internal_dprintf (pC->hDbg->id, DLI_LOG,
16961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        "MDM Disc Incompatible  = %lu", channel->pInterfaceStat->mdm.Disc_Incompat);
16971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      }
16981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      if (channel->pInterfaceStat->mdm.Disc_Frame_Rej) {
16991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        diva_mnt_internal_dprintf (pC->hDbg->id, DLI_LOG,
17001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        "MDM Disc Frame Reject  = %lu", channel->pInterfaceStat->mdm.Disc_Frame_Rej);
17011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      }
17021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      if (channel->pInterfaceStat->mdm.Disc_V42bis) {
17031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        diva_mnt_internal_dprintf (pC->hDbg->id, DLI_LOG,
17041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        "MDM Disc V.42bis       = %lu", channel->pInterfaceStat->mdm.Disc_V42bis);
17051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      }
17061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      break;
17071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
17081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    case DIVA_SUPER_TRACE_NOTIFY_FAX_STAT_CHANGE:
17091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      if (channel->pInterfaceStat->fax.Disc_Normal) {
17101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        diva_mnt_internal_dprintf (pC->hDbg->id, DLI_LOG,
17111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        "FAX Disc Normal        = %lu", channel->pInterfaceStat->fax.Disc_Normal);
17121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      }
17131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      if (channel->pInterfaceStat->fax.Disc_Not_Ident) {
17141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        diva_mnt_internal_dprintf (pC->hDbg->id, DLI_LOG,
17151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        "FAX Disc Not Ident.    = %lu", channel->pInterfaceStat->fax.Disc_Not_Ident);
17161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      }
17171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      if (channel->pInterfaceStat->fax.Disc_No_Response) {
17181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        diva_mnt_internal_dprintf (pC->hDbg->id, DLI_LOG,
17191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        "FAX Disc No Response   = %lu", channel->pInterfaceStat->fax.Disc_No_Response);
17201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      }
17211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      if (channel->pInterfaceStat->fax.Disc_Retries) {
17221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        diva_mnt_internal_dprintf (pC->hDbg->id, DLI_LOG,
17231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        "FAX Disc Max Retries   = %lu", channel->pInterfaceStat->fax.Disc_Retries);
17241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      }
17251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      if (channel->pInterfaceStat->fax.Disc_Unexp_Msg) {
17261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        diva_mnt_internal_dprintf (pC->hDbg->id, DLI_LOG,
17271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        "FAX Unexp. Msg.        = %lu", channel->pInterfaceStat->fax.Disc_Unexp_Msg);
17281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      }
17291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      if (channel->pInterfaceStat->fax.Disc_No_Polling) {
17301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        diva_mnt_internal_dprintf (pC->hDbg->id, DLI_LOG,
17311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        "FAX Disc No Polling    = %lu", channel->pInterfaceStat->fax.Disc_No_Polling);
17321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      }
17331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      if (channel->pInterfaceStat->fax.Disc_Training) {
17341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        diva_mnt_internal_dprintf (pC->hDbg->id, DLI_LOG,
17351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        "FAX Disc Training      = %lu", channel->pInterfaceStat->fax.Disc_Training);
17361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      }
17371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      if (channel->pInterfaceStat->fax.Disc_Unexpected) {
17381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        diva_mnt_internal_dprintf (pC->hDbg->id, DLI_LOG,
17391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        "FAX Disc Unexpected    = %lu", channel->pInterfaceStat->fax.Disc_Unexpected);
17401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      }
17411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      if (channel->pInterfaceStat->fax.Disc_Application) {
17421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        diva_mnt_internal_dprintf (pC->hDbg->id, DLI_LOG,
17431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        "FAX Disc Application   = %lu", channel->pInterfaceStat->fax.Disc_Application);
17441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      }
17451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      if (channel->pInterfaceStat->fax.Disc_Incompat) {
17461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        diva_mnt_internal_dprintf (pC->hDbg->id, DLI_LOG,
17471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        "FAX Disc Incompatible  = %lu", channel->pInterfaceStat->fax.Disc_Incompat);
17481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      }
17491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      if (channel->pInterfaceStat->fax.Disc_No_Command) {
17501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        diva_mnt_internal_dprintf (pC->hDbg->id, DLI_LOG,
17511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        "FAX Disc No Command    = %lu", channel->pInterfaceStat->fax.Disc_No_Command);
17521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      }
17531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      if (channel->pInterfaceStat->fax.Disc_Long_Msg) {
17541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        diva_mnt_internal_dprintf (pC->hDbg->id, DLI_LOG,
17551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        "FAX Disc Long Msg.     = %lu", channel->pInterfaceStat->fax.Disc_Long_Msg);
17561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      }
17571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      if (channel->pInterfaceStat->fax.Disc_Supervisor) {
17581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        diva_mnt_internal_dprintf (pC->hDbg->id, DLI_LOG,
17591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        "FAX Disc Supervisor    = %lu", channel->pInterfaceStat->fax.Disc_Supervisor);
17601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      }
17611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      if (channel->pInterfaceStat->fax.Disc_SUB_SEP_PWD) {
17621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        diva_mnt_internal_dprintf (pC->hDbg->id, DLI_LOG,
17631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        "FAX Disc SUP SEP PWD   = %lu", channel->pInterfaceStat->fax.Disc_SUB_SEP_PWD);
17641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      }
17651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      if (channel->pInterfaceStat->fax.Disc_Invalid_Msg) {
17661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        diva_mnt_internal_dprintf (pC->hDbg->id, DLI_LOG,
17671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        "FAX Disc Invalid Msg.  = %lu", channel->pInterfaceStat->fax.Disc_Invalid_Msg);
17681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      }
17691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      if (channel->pInterfaceStat->fax.Disc_Page_Coding) {
17701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        diva_mnt_internal_dprintf (pC->hDbg->id, DLI_LOG,
17711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        "FAX Disc Page Coding   = %lu", channel->pInterfaceStat->fax.Disc_Page_Coding);
17721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      }
17731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      if (channel->pInterfaceStat->fax.Disc_App_Timeout) {
17741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        diva_mnt_internal_dprintf (pC->hDbg->id, DLI_LOG,
17751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        "FAX Disc Appl. T.o.    = %lu", channel->pInterfaceStat->fax.Disc_App_Timeout);
17761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      }
17771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      if (channel->pInterfaceStat->fax.Disc_Unspecified) {
17781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        diva_mnt_internal_dprintf (pC->hDbg->id, DLI_LOG,
17791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        "FAX Disc Unspec.       = %lu", channel->pInterfaceStat->fax.Disc_Unspecified);
17801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      }
17811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      break;
17821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  }
17831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
17841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
17851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
17861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  Receive trace information from the Management Interface and store it in the
17871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  internal trace buffer with MSG_TYPE_MLOG as is, without any filtering.
17881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  Event Filtering and formatting is done in  Management Interface self.
17891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  */
17901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void diva_maint_trace_notify (void* user_context,
17911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds                                     diva_strace_library_interface_t* hLib,
17921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds                                     int Adapter,
17931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds                                     void* xlog_buffer,
17941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds                                     int length) {
17951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  diva_maint_client_t* pC = (diva_maint_client_t*)user_context;
17961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  diva_dbg_entry_head_t* pmsg;
17971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  word size;
17981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  dword sec, usec;
17991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  int ch = TraceFilterChannel;
18001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  int id = TraceFilterIdent;
18011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
18021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  /*
18031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    Selective trace
18041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    */
1805f85aaeba458fda1de199a73566c641516e9a935dAhmed S. Darwish  if ((id >= 0) && (ch >= 0) && (id < ARRAY_SIZE(clients)) &&
18061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      (clients[id].Dbg.id == (byte)id) && (clients[id].pIdiLib == hLib)) {
18071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    const char* p = NULL;
18081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    int ch_value = -1;
18091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    MI_XLOG_HDR *TrcData = (MI_XLOG_HDR *)xlog_buffer;
18101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
18111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    if (Adapter != clients[id].logical) {
18121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      return; /* Ignore all trace messages from other adapters */
18131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    }
18141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
18151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    if (TrcData->code == 24) {
18161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      p = (char*)&TrcData->code;
18171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      p += 2;
18181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    }
18191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
18201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    /*
18211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      All L1 messages start as [dsp,ch], so we can filter this information
18221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      and filter out all messages that use different channel
18231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      */
18241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    if (p && p[0] == '[') {
18251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      if (p[2] == ',') {
18261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        p += 3;
18271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        ch_value = *p - '0';
18281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      } else if (p[3] == ',') {
18291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        p += 4;
18301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        ch_value = *p - '0';
18311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      }
18321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      if (ch_value >= 0) {
18331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        if (p[2] == ']') {
18341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds          ch_value = ch_value * 10 + p[1] - '0';
18351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        }
18361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        if (ch_value != ch) {
18371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds          return; /* Ignore other channels */
18381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        }
18391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      }
18401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    }
18411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
18421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	} else if (TraceFilter[0] != 0) {
18431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    return; /* Ignore trace if trace filter is activated, but idle */
18441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  }
18451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
18461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  diva_os_get_time (&sec, &usec);
18471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
18481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  while (!(pmsg = (diva_dbg_entry_head_t*)queueAllocMsg (dbg_queue,
18491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds                              (word)length+sizeof(*pmsg)))) {
18501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    if ((pmsg = (diva_dbg_entry_head_t*)queuePeekMsg (dbg_queue, &size))) {
18511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      queueFreeMsg (dbg_queue);
18521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    } else {
18531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      break;
18541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    }
18551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  }
18561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  if (pmsg) {
18571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    memcpy (&pmsg[1], xlog_buffer, length);
18581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    pmsg->sequence    = dbg_sequence++;
18591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    pmsg->time_sec    = sec;
18601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    pmsg->time_usec   = usec;
18611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    pmsg->facility    = MSG_TYPE_MLOG;
18621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    pmsg->dli         = pC->logical;
18631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    pmsg->drv_id      = pC->hDbg->id;
18641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    pmsg->di_cpu      = 0;
18651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    pmsg->data_length = length;
18661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    queueCompleteMsg (pmsg);
18671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    if (queueCount(dbg_queue)) {
18681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      diva_maint_wakeup_read();
18691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    }
18701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  }
18711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
18721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
18731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
18741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
18751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  Convert MAINT trace mask to management interface trace mask/work/facility and
18761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  issue command to management interface
18771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  */
18781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void diva_change_management_debug_mask (diva_maint_client_t* pC, dword old_mask) {
18791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  if (pC->request && pC->hDbg && pC->pIdiLib) {
18801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    dword changed = pC->hDbg->dbgMask ^ old_mask;
18811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
18821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    if (changed & DIVA_MGT_DBG_TRACE) {
18831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      (*(pC->pIdiLib->DivaSTraceSetInfo))(pC->pIdiLib,
18841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds                                          (pC->hDbg->dbgMask & DIVA_MGT_DBG_TRACE) != 0);
18851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    }
18861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    if (changed & DIVA_MGT_DBG_DCHAN) {
18871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      (*(pC->pIdiLib->DivaSTraceSetDChannel))(pC->pIdiLib,
18881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds                                              (pC->hDbg->dbgMask & DIVA_MGT_DBG_DCHAN) != 0);
18891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    }
18901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    if (!TraceFilter[0]) {
18911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      if (changed & DIVA_MGT_DBG_IFC_BCHANNEL) {
18921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        int i, state = ((pC->hDbg->dbgMask & DIVA_MGT_DBG_IFC_BCHANNEL) != 0);
18931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
18941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        for (i = 0; i < pC->channels; i++) {
18951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds          (*(pC->pIdiLib->DivaSTraceSetBChannel))(pC->pIdiLib, i+1, state);
18961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        }
18971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      }
18981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      if (changed & DIVA_MGT_DBG_IFC_AUDIO) {
18991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        int i, state = ((pC->hDbg->dbgMask & DIVA_MGT_DBG_IFC_AUDIO) != 0);
19001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
19011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        for (i = 0; i < pC->channels; i++) {
19021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds          (*(pC->pIdiLib->DivaSTraceSetAudioTap))(pC->pIdiLib, i+1, state);
19031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        }
19041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      }
19051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    }
19061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  }
19071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
19081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
19091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
19101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsvoid diva_mnt_internal_dprintf (dword drv_id, dword type, char* fmt, ...) {
19111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  va_list ap;
19121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
19131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	va_start(ap, fmt);
19141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  DI_format (0, (word)drv_id, (int)type, fmt, ap);
19151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	va_end(ap);
19161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
19171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
19181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
19191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  Shutdown all adapters before driver removal
19201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  */
19211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsint diva_mnt_shutdown_xdi_adapters (void) {
19221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  diva_os_spin_lock_magic_t old_irql, old_irql1;
19231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  int i, fret = 0;
19241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  byte * pmem;
19251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
19261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1927f85aaeba458fda1de199a73566c641516e9a935dAhmed S. Darwish  for (i = 1; i < ARRAY_SIZE(clients); i++) {
19281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    pmem = NULL;
19291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
19301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    diva_os_enter_spin_lock (&dbg_adapter_lock, &old_irql1, "unload");
19311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    diva_os_enter_spin_lock (&dbg_q_lock, &old_irql, "unload");
19321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
19331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    if (clients[i].hDbg && clients[i].pIdiLib && clients[i].request) {
19341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      if ((*(clients[i].pIdiLib->DivaSTraceLibraryStop))(clients[i].pIdiLib) == 1) {
19351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        /*
19361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds          Adapter removal complete
19371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds          */
19381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        if (clients[i].pIdiLib) {
19391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds          (*(clients[i].pIdiLib->DivaSTraceLibraryFinit))(clients[i].pIdiLib->hLib);
19401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds          clients[i].pIdiLib = NULL;
19411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
19421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds          pmem = clients[i].pmem;
19431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds          clients[i].pmem = NULL;
19441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        }
19451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        clients[i].hDbg    = NULL;
19461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        clients[i].request_pending = 0;
19471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
19481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        if (clients[i].dma_handle >= 0) {
19491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds          /*
19501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds            Free DMA handle
19511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds            */
19521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds          diva_free_dma_descriptor (clients[i].request, clients[i].dma_handle);
19531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds          clients[i].dma_handle = -1;
19541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				}
19551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        clients[i].request = NULL;
19561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      } else {
19571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        fret = -1;
19581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      }
19591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    }
19601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
19611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    diva_os_leave_spin_lock (&dbg_q_lock, &old_irql, "unload");
19621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    if (clients[i].hDbg && clients[i].pIdiLib && clients[i].request && clients[i].request_pending) {
19631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      clients[i].request_pending = 0;
19641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      (*(clients[i].request))((ENTITY*)(*(clients[i].pIdiLib->DivaSTraceGetHandle))(clients[i].pIdiLib->hLib));
19651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      if (clients[i].dma_handle >= 0) {
19661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        diva_free_dma_descriptor (clients[i].request, clients[i].dma_handle);
19671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        clients[i].dma_handle = -1;
19681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      }
19691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    }
19701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    diva_os_leave_spin_lock (&dbg_adapter_lock, &old_irql1, "unload");
19711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
19721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    if (pmem) {
19731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      diva_os_free (0, pmem);
19741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    }
19751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  }
19761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
19771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  return (fret);
19781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
19791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
19801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
19811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  Set/Read the trace filter used for selective tracing.
19821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  Affects B- and Audio Tap trace mask at run time
19831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  */
19841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsint diva_set_trace_filter (int filter_length, const char* filter) {
19851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  diva_os_spin_lock_magic_t old_irql, old_irql1;
19861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  int i, ch, on, client_b_on, client_atap_on;
19871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
19881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  diva_os_enter_spin_lock (&dbg_adapter_lock, &old_irql1, "dbg mask");
19891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  diva_os_enter_spin_lock (&dbg_q_lock, &old_irql, "write_filter");
19901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
19911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  if (filter_length <= DIVA_MAX_SELECTIVE_FILTER_LENGTH) {
19921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    memcpy (&TraceFilter[0], filter, filter_length);
19931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    if (TraceFilter[filter_length]) {
19941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      TraceFilter[filter_length] = 0;
19951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    }
19961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    if (TraceFilter[0] == '*') {
19971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      TraceFilter[0] = 0;
19981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    }
19991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  } else {
20001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    filter_length = -1;
20011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  }
20021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
20031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  TraceFilterIdent   = -1;
20041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  TraceFilterChannel = -1;
20051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
20061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  on = (TraceFilter[0] == 0);
20071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2008f85aaeba458fda1de199a73566c641516e9a935dAhmed S. Darwish  for (i = 1; i < ARRAY_SIZE(clients); i++) {
20091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    if (clients[i].hDbg && clients[i].pIdiLib && clients[i].request) {
20101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      client_b_on    = on && ((clients[i].hDbg->dbgMask & DIVA_MGT_DBG_IFC_BCHANNEL) != 0);
20111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      client_atap_on = on && ((clients[i].hDbg->dbgMask & DIVA_MGT_DBG_IFC_AUDIO)    != 0);
20121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      for (ch = 0; ch < clients[i].channels; ch++) {
20131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        (*(clients[i].pIdiLib->DivaSTraceSetBChannel))(clients[i].pIdiLib->hLib, ch+1, client_b_on);
20141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        (*(clients[i].pIdiLib->DivaSTraceSetAudioTap))(clients[i].pIdiLib->hLib, ch+1, client_atap_on);
20151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      }
20161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    }
20171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  }
20181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2019f85aaeba458fda1de199a73566c641516e9a935dAhmed S. Darwish  for (i = 1; i < ARRAY_SIZE(clients); i++) {
20201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    if (clients[i].hDbg && clients[i].pIdiLib && clients[i].request && clients[i].request_pending) {
20211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      diva_os_leave_spin_lock (&dbg_q_lock, &old_irql, "write_filter");
20221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      clients[i].request_pending = 0;
20231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      (*(clients[i].request))((ENTITY*)(*(clients[i].pIdiLib->DivaSTraceGetHandle))(clients[i].pIdiLib->hLib));
20241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      diva_os_enter_spin_lock (&dbg_q_lock, &old_irql, "write_filter");
20251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    }
20261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  }
20271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
20281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  diva_os_leave_spin_lock (&dbg_q_lock, &old_irql, "write_filter");
20291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  diva_os_leave_spin_lock (&dbg_adapter_lock, &old_irql1, "dbg mask");
20301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
20311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  return (filter_length);
20321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
20331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
20341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsint diva_get_trace_filter (int max_length, char* filter) {
20351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  diva_os_spin_lock_magic_t old_irql;
20361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  int len;
20371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
20381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  diva_os_enter_spin_lock (&dbg_q_lock, &old_irql, "read_filter");
20391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  len = strlen (&TraceFilter[0]) + 1;
20401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  if (max_length >= len) {
20411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    memcpy (filter, &TraceFilter[0], len);
20421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  }
20431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  diva_os_leave_spin_lock (&dbg_q_lock, &old_irql, "read_filter");
20441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
20451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  return (len);
20461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
20471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
20481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int diva_dbg_cmp_key (const char* ref, const char* key) {
20491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	while (*key && (*ref++ == *key++));
20501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  return (!*key && !*ref);
20511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
20521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
20531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
20541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  In case trace filter starts with "C" character then
20551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  all following characters are interpreted as command.
20561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  Followings commands are available:
20571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  - single, trace single call at time, independent from CPN/CiPN
20581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  */
20591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int diva_mnt_cmp_nmbr (const char* nmbr) {
20601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  const char* ref = &TraceFilter[0];
20611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  int ref_len = strlen(&TraceFilter[0]), nmbr_len = strlen(nmbr);
20621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
20631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  if (ref[0] == 'C') {
20641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    if (diva_dbg_cmp_key (&ref[1], "single")) {
20651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      return (0);
20661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    }
20671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    return (-1);
20681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  }
20691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
20701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  if (!ref_len || (ref_len > nmbr_len)) {
20711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    return (-1);
20721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  }
20731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
20741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  nmbr = nmbr + nmbr_len - 1;
20751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  ref  = ref  + ref_len  - 1;
20761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
20771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  while (ref_len--) {
20781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    if (*nmbr-- != *ref--) {
20791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      return (-1);
20801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    }
20811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  }
20821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
20831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  return (0);
20841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
20851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
20861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int diva_get_dma_descriptor (IDI_CALL request, dword *dma_magic) {
20871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  ENTITY e;
20881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  IDI_SYNC_REQ* pReq = (IDI_SYNC_REQ*)&e;
20891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
20901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  if (!request) {
20911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    return (-1);
20921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  }
20931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
20941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  pReq->xdi_dma_descriptor_operation.Req = 0;
20951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  pReq->xdi_dma_descriptor_operation.Rc = IDI_SYNC_REQ_DMA_DESCRIPTOR_OPERATION;
20961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
20971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  pReq->xdi_dma_descriptor_operation.info.operation =     IDI_SYNC_REQ_DMA_DESCRIPTOR_ALLOC;
20981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  pReq->xdi_dma_descriptor_operation.info.descriptor_number  = -1;
20991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  pReq->xdi_dma_descriptor_operation.info.descriptor_address = NULL;
21001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  pReq->xdi_dma_descriptor_operation.info.descriptor_magic   = 0;
21011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
21021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  (*request)((ENTITY*)pReq);
21031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
21041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  if (!pReq->xdi_dma_descriptor_operation.info.operation &&
21051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      (pReq->xdi_dma_descriptor_operation.info.descriptor_number >= 0) &&
21061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds      pReq->xdi_dma_descriptor_operation.info.descriptor_magic) {
21071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    *dma_magic = pReq->xdi_dma_descriptor_operation.info.descriptor_magic;
21081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    return (pReq->xdi_dma_descriptor_operation.info.descriptor_number);
21091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  } else {
21101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    return (-1);
21111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  }
21121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
21131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
21141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void diva_free_dma_descriptor (IDI_CALL request, int nr) {
21151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  ENTITY e;
21161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  IDI_SYNC_REQ* pReq = (IDI_SYNC_REQ*)&e;
21171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
21181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  if (!request || (nr < 0)) {
21191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    return;
21201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  }
21211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
21221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  pReq->xdi_dma_descriptor_operation.Req = 0;
21231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  pReq->xdi_dma_descriptor_operation.Rc = IDI_SYNC_REQ_DMA_DESCRIPTOR_OPERATION;
21241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
21251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  pReq->xdi_dma_descriptor_operation.info.operation = IDI_SYNC_REQ_DMA_DESCRIPTOR_FREE;
21261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  pReq->xdi_dma_descriptor_operation.info.descriptor_number  = nr;
21271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  pReq->xdi_dma_descriptor_operation.info.descriptor_address = NULL;
21281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  pReq->xdi_dma_descriptor_operation.info.descriptor_magic   = 0;
21291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
21301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  (*request)((ENTITY*)pReq);
21311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
21321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2133