You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
158 lines
4.5 KiB
158 lines
4.5 KiB
/*++
|
|
|
|
Copyright (c) 1999 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
debug.c
|
|
|
|
|
|
Author:
|
|
|
|
ervinp
|
|
|
|
Environment:
|
|
|
|
Kernel mode
|
|
|
|
Revision History:
|
|
|
|
|
|
--*/
|
|
|
|
#include <WDM.H>
|
|
|
|
#include <usbdi.h>
|
|
#include <usbdlib.h>
|
|
#include <usbioctl.h>
|
|
|
|
#include "usb8023.h"
|
|
#include "debug.h"
|
|
|
|
#if DBG
|
|
|
|
BOOLEAN dbgTrapOnWarn = FALSE;
|
|
BOOLEAN dbgVerbose = FALSE;
|
|
BOOLEAN dbgDumpBytes = FALSE; // show all packets; slows us down too much to run
|
|
BOOLEAN dbgDumpPktStatesOnEmpty = TRUE;
|
|
|
|
|
|
VOID InitDebug()
|
|
{
|
|
#if DBG_WRAP_MEMORY
|
|
InitializeListHead(&dbgAllMemoryList);
|
|
#endif
|
|
}
|
|
|
|
VOID DbgShowBytes(PUCHAR msg, PUCHAR buf, ULONG len)
|
|
{
|
|
|
|
#define PRNT(ch) ((((ch) < ' ') || ((ch) > '~')) ? '.' : (ch))
|
|
|
|
if (dbgDumpBytes){
|
|
ULONG i;
|
|
DbgPrint("%s (len %xh @ %p): \r\n", msg, len, buf);
|
|
|
|
for (i = 0; i < len; i += 16){
|
|
DbgPrint(" ");
|
|
|
|
if (len-i >= 16){
|
|
PUCHAR ptr = buf+i;
|
|
DbgPrint("%02x %02x %02x %02x %02x %02x %02x %02x "
|
|
"%02x %02x %02x %02x %02x %02x %02x %02x "
|
|
" "
|
|
"%c%c%c%c%c%c%c%c %c%c%c%c%c%c%c%c",
|
|
ptr[0], ptr[1], ptr[2], ptr[3], ptr[4], ptr[5], ptr[6], ptr[7],
|
|
ptr[8], ptr[9], ptr[10], ptr[11], ptr[12], ptr[13], ptr[14], ptr[15],
|
|
PRNT(ptr[0]), PRNT(ptr[1]), PRNT(ptr[2]), PRNT(ptr[3]),
|
|
PRNT(ptr[4]), PRNT(ptr[5]), PRNT(ptr[6]), PRNT(ptr[7]),
|
|
PRNT(ptr[8]), PRNT(ptr[9]), PRNT(ptr[10]), PRNT(ptr[11]),
|
|
PRNT(ptr[12]), PRNT(ptr[13]), PRNT(ptr[14]), PRNT(ptr[15])
|
|
);
|
|
}
|
|
else {
|
|
ULONG j;
|
|
for (j = 0; j < 16; j++){
|
|
if (j == 8) DbgPrint(" ");
|
|
if (i+j < len){
|
|
DbgPrint("%02x ", (ULONG)buf[i+j]);
|
|
}
|
|
else {
|
|
DbgPrint(" ");
|
|
}
|
|
}
|
|
DbgPrint(" ");
|
|
for (j = 0; j < 16; j++){
|
|
if (j == 8) DbgPrint(" ");
|
|
if (i+j < len){
|
|
UCHAR ch = buf[i+j];
|
|
DbgPrint("%c", PRNT(ch));
|
|
}
|
|
else {
|
|
// DbgPrint(" ");
|
|
}
|
|
}
|
|
}
|
|
|
|
DbgPrint("\r\n");
|
|
}
|
|
}
|
|
}
|
|
|
|
VOID DbgShowMdlBytes(PUCHAR msg, PMDL mdl)
|
|
{
|
|
|
|
if (dbgDumpBytes){
|
|
DbgPrint("\n %s (MDL @ %p): \r\n", msg, mdl);
|
|
while (mdl){
|
|
#if defined(SPECIAL_WIN98SE_BUILD) || defined(SPECIAL_WINME_BUILD)
|
|
PVOID thisBuf = MmGetSystemAddressForMdl(mdl);
|
|
#else
|
|
PVOID thisBuf = MmGetSystemAddressForMdlSafe(mdl, NormalPoolPriority);
|
|
#endif
|
|
ULONG thisBufLen = MmGetMdlByteCount(mdl);
|
|
if (thisBuf) {
|
|
DbgShowBytes(" <MDL buffer>", thisBuf, thisBufLen);
|
|
}
|
|
mdl = mdl->Next;
|
|
}
|
|
}
|
|
}
|
|
|
|
DbgDumpPacketList(PUCHAR msg, PLIST_ENTRY listHead)
|
|
{
|
|
PLIST_ENTRY listEntry;
|
|
USBPACKET *packet;
|
|
ULONG timeNow = DbgGetSystemTime_msec();
|
|
|
|
DbgPrint("\n %s: ", msg);
|
|
for (listEntry = listHead->Flink; listEntry != listHead; listEntry = listEntry->Flink){
|
|
packet = CONTAINING_RECORD(listEntry, USBPACKET, listEntry);
|
|
DbgPrint("\n packet #%d @%p - buf @%p, len=%xh, (msg:%xh), age=%d msec", packet->packetId, packet, packet->dataBuffer, packet->dataBufferCurrentLength, *(PULONG)packet->dataBuffer, timeNow-packet->timeStamp);
|
|
}
|
|
|
|
}
|
|
|
|
VOID DbgDumpPacketStates(ADAPTEREXT *adapter)
|
|
{
|
|
if (dbgDumpPktStatesOnEmpty){
|
|
KIRQL oldIrql;
|
|
|
|
KeAcquireSpinLock(&adapter->adapterSpinLock, &oldIrql);
|
|
|
|
DbgPrint("\n *** USB8023 RAN OUT OF PACKETS, dumping packet states: *** ");
|
|
|
|
DbgDumpPacketList("PENDING READ packets", &adapter->usbPendingReadPackets);
|
|
DbgDumpPacketList("PENDING WRITE packets", &adapter->usbPendingWritePackets);
|
|
DbgDumpPacketList("COMPLETED READ packets", &adapter->usbCompletedReadPackets);
|
|
DbgDumpPacketList("FREE packets", &adapter->usbFreePacketPool);
|
|
|
|
DbgPrint("\n hit 'g' to continue ...");
|
|
DbgBreakPoint();
|
|
|
|
KeReleaseSpinLock(&adapter->adapterSpinLock, oldIrql);
|
|
}
|
|
}
|
|
|
|
|
|
#endif
|