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