511 lines
15 KiB
C
Executable File

/*++
Copyright (c) 2021 Motorcomm Corporation.
Confidential and Proprietary. All rights reserved.
This is Motorcomm Corporation NIC driver relevant files. Please don't copy, modify,
distribute without commercial permission.
Module Name:
mp_dbg.c
Abstract:
This module contains all debug-related code.
Revision History:
Notes:
--*/
#include "fuxi-gmac.h"
#if defined(UEFI)
#include <Library/UefiLib.h>
UINT32 MPDebugLevel = MP_LOUD;
void DbgPrintAddress(unsigned char* Address)
{
// If your MAC address has a different size, adjust the printf accordingly.
//{ASSERT(ETH_LENGTH_OF_ADDRESS == 6); }
DbgPrintF(MP_LOUD, "%02x-%02x-%02x-%02x-%02x-%02x.", \
Address[0], Address[1], Address[2], \
Address[3], Address[4], Address[5]);
}
void fxgmac_dump_buffer(unsigned char *skb, unsigned int len, int tx_rx)
{
#define ZDbgPrintF(Level, ...) AsciiPrint("fx-pat " __VA_ARGS__); \
//unsigned char buffer[128];
unsigned int i, j;
char * caption[3] = { "Tx",
"Rx",
"Buffer"};
if(tx_rx > 2) tx_rx = 2;
ZDbgPrintF(MP_TRACE, " ************** Data dump start ****************\n");
ZDbgPrintF(MP_TRACE, " %a data of %d bytes\n", caption[tx_rx], len);
for (i = 0; i < len; i += 32) {
unsigned int len_line = min(len - i, 32U);
for(j = 0; j < len_line; j++)
{
AsciiPrint("%02x ", (u8)skb[i + j]);
}
AsciiPrint("\n");
}
ZDbgPrintF(MP_TRACE, " ************** Data dump end ****************\n");
}
#elif defined(_WIN64) || defined(_WIN32)
#include "fuxi-gmac-reg.h"
#include "fuxi-mp.h"
#if DBG
/**
Constants
**/
#define _FILENUMBER 'GBED'
// Bytes to appear on each line of dump output.
//
#define DUMP_BytesPerLine 16
ULONG MPDebugLevel = MP_LOUD;
ULONG MPAllocCount = 0; // the number of outstanding allocs
NDIS_SPIN_LOCK MPMemoryLock; // spinlock for the debug mem list
LIST_ENTRY MPMemoryList;
BOOLEAN MPInitDone = FALSE; // debug mem list init flag
PVOID
MPAuditAllocMemTag(
UINT Size,
CHAR* FileNumber,
ULONG LineNumber,
NDIS_HANDLE MiniportAdapterHandle
)
{
PMP_ALLOCATION pAllocInfo;
PVOID Pointer;
if (!MPInitDone)
{
NdisAllocateSpinLock(&MPMemoryLock);
InitializeListHead(&MPMemoryList);
MPInitDone = TRUE;
}
pAllocInfo = NdisAllocateMemoryWithTagPriority(
MiniportAdapterHandle,
(UINT)(Size + sizeof(MP_ALLOCATION)),
NIC_TAG,
LowPoolPriority);//leileiz
if (pAllocInfo == (PMP_ALLOCATION)NULL)
{
Pointer = NULL;
DbgPrintF(MP_LOUD, "%s - file %s, line %d, Size %d failed!", __FUNCTION__, FileNumber, LineNumber, Size);
}
else
{
Pointer = (PVOID)&(pAllocInfo->UserData);
MP_MEMSET(Pointer, Size, 0xc);
pAllocInfo->Signature = 'DOOG';
pAllocInfo->FileNumber = FileNumber;
pAllocInfo->LineNumber = LineNumber;
pAllocInfo->Size = Size;
NdisAcquireSpinLock(&MPMemoryLock);
InsertTailList(&MPMemoryList, &pAllocInfo->List);
MPAllocCount++;
NdisReleaseSpinLock(&MPMemoryLock);
}
DbgPrintF(MP_LOUD,
"%s - file %s, line %d, %d bytes, [0x"PTR_FORMAT"].", __FUNCTION__,
FileNumber, LineNumber, Size, Pointer);
return(Pointer);
}
VOID MPAuditFreeMem(
IN PVOID Pointer
)
{
PMP_ALLOCATION pAllocInfo;
pAllocInfo = CONTAINING_RECORD(Pointer, MP_ALLOCATION, UserData);
ASSERT(pAllocInfo->Signature == (ULONG)'DOOG');
NdisAcquireSpinLock(&MPMemoryLock);
pAllocInfo->Signature = (ULONG)'DEAD';
RemoveEntryList(&pAllocInfo->List);
MPAllocCount--;
NdisReleaseSpinLock(&MPMemoryLock);
NdisFreeMemory(pAllocInfo, 0, 0);
}
VOID mpDbgPrintUnicodeString(
IN PUNICODE_STRING UnicodeString
)
{
UCHAR Buffer[256];
USHORT i;
for (i = 0; (i < UnicodeString->Length / 2) && (i < 255); i++)
{
Buffer[i] = (UCHAR)UnicodeString->Buffer[i];
}
#pragma prefast(suppress: __WARNING_POTENTIAL_BUFFER_OVERFLOW, "i is bounded by 255");
Buffer[i] = '\0';
DbgPrint("%s", Buffer);
}
// Hex dump 'cb' bytes starting at 'p' grouping 'ulGroup' bytes together.
// For example, with 'ulGroup' of 1, 2, and 4:
//
// 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
// 0000 0000 0000 0000 0000 0000 0000 0000 |................|
// 00000000 00000000 00000000 00000000 |................|
//
// If 'fAddress' is true, the memory address dumped is prepended to each
// line.
//
VOID
Dump(
__in_bcount(cb) IN CHAR* p,
IN ULONG cb,
IN BOOLEAN fAddress,
IN ULONG ulGroup
)
{
INT cbLine;
while (cb)
{
cbLine = (cb < DUMP_BytesPerLine) ? cb : DUMP_BytesPerLine;
#pragma prefast(suppress: __WARNING_POTENTIAL_BUFFER_OVERFLOW, "p is bounded by cb bytes");
DumpLine( p, cbLine, fAddress, ulGroup );
cb -= cbLine;
p += cbLine;
}
}
VOID
DumpLine(
__in_bcount(cb) IN CHAR* p,
IN ULONG cb,
IN BOOLEAN fAddress,
IN ULONG ulGroup
)
{
CHAR* pszDigits = "0123456789ABCDEF";
CHAR szHex[ ((2 + 1) * DUMP_BytesPerLine) + 1 ];
CHAR* pszHex = szHex;
CHAR szAscii[ DUMP_BytesPerLine + 1 ];
CHAR* pszAscii = szAscii;
ULONG ulGrouped = 0;
if (fAddress)
{
DbgPrint( "RLTK: %p: ", p );
}
else
{
DbgPrint( "RLTK: " );
}
while (cb)
{
#pragma prefast(suppress: __WARNING_POTENTIAL_BUFFER_OVERFLOW, "pszHex accessed is always within bounds");
*pszHex++ = pszDigits[ ((UCHAR )*p) / 16 ];
*pszHex++ = pszDigits[ ((UCHAR )*p) % 16 ];
if (++ulGrouped >= ulGroup)
{
*pszHex++ = ' ';
ulGrouped = 0;
}
#pragma prefast(suppress: __WARNING_POTENTIAL_BUFFER_OVERFLOW, "pszAscii is bounded by cb bytes");
*pszAscii++ = (*p >= 32 && *p < 128) ? *p : '.';
++p;
--cb;
}
*pszHex = '\0';
*pszAscii = '\0';
DbgPrint(
"%-*s|%-*s|\n",
(2 * DUMP_BytesPerLine) + (DUMP_BytesPerLine / ulGroup), szHex,
DUMP_BytesPerLine, szAscii );
}
void fxgmac_dump_buffer(unsigned char *skb, unsigned int len, int tx_rx)
{
#define ZDbgPrintF(Level, ...) DbgPrint("fx-pat " ##__VA_ARGS__);
unsigned char buffer[128];
unsigned int i, j;
char * caption[3] = { "Tx",
"Rx",
"Buffer"};
if(tx_rx > 2) tx_rx = 2;
ZDbgPrintF(MP_TRACE, " ************** Data dump start ****************\n");
ZDbgPrintF(MP_TRACE, " %s data of %d bytes\n", caption[tx_rx], len);
for (i = 0; i < len; i += 32) {
unsigned int len_line = min(len - i, 32U);
for(j = 0; j < len_line; j++)
{
sprintf((char *)&buffer[j * 3], " %02x", (u8)skb[i + j]);
}
buffer[j * 3] = '\0';
ZDbgPrintF(MP_TRACE, " %#06x: %s\n", i, buffer);
}
ZDbgPrintF(MP_TRACE, " ************** Data dump end ****************\n");
}
VOID
DbgPrintOidName(
_In_ NDIS_OID Oid)
{
PCHAR oidName = NULL;
switch (Oid) {
#undef MAKECASE
#define MAKECASE(oidx) case oidx: oidName = NIC_DBG_STRING #oidx "\n"; break;
/* Operational OIDs */
MAKECASE(OID_GEN_SUPPORTED_LIST)
MAKECASE(OID_GEN_HARDWARE_STATUS)
MAKECASE(OID_GEN_MEDIA_SUPPORTED)
MAKECASE(OID_GEN_MEDIA_IN_USE)
MAKECASE(OID_GEN_MAXIMUM_LOOKAHEAD)
MAKECASE(OID_GEN_MAXIMUM_FRAME_SIZE)
MAKECASE(OID_GEN_LINK_SPEED)
MAKECASE(OID_GEN_TRANSMIT_BUFFER_SPACE)
MAKECASE(OID_GEN_RECEIVE_BUFFER_SPACE)
MAKECASE(OID_GEN_TRANSMIT_BLOCK_SIZE)
MAKECASE(OID_GEN_RECEIVE_BLOCK_SIZE)
MAKECASE(OID_GEN_VENDOR_ID)
MAKECASE(OID_GEN_VENDOR_DESCRIPTION)
MAKECASE(OID_GEN_VENDOR_DRIVER_VERSION)
MAKECASE(OID_GEN_CURRENT_PACKET_FILTER)
MAKECASE(OID_GEN_CURRENT_LOOKAHEAD)
MAKECASE(OID_GEN_DRIVER_VERSION)
MAKECASE(OID_GEN_MAXIMUM_TOTAL_SIZE)
MAKECASE(OID_GEN_PROTOCOL_OPTIONS)
MAKECASE(OID_GEN_MAC_OPTIONS)
MAKECASE(OID_GEN_MEDIA_CONNECT_STATUS)
MAKECASE(OID_GEN_MAXIMUM_SEND_PACKETS)
MAKECASE(OID_GEN_SUPPORTED_GUIDS)
MAKECASE(OID_GEN_NETWORK_LAYER_ADDRESSES)
MAKECASE(OID_GEN_TRANSPORT_HEADER_OFFSET)
MAKECASE(OID_GEN_MEDIA_CAPABILITIES)
MAKECASE(OID_GEN_PHYSICAL_MEDIUM)
MAKECASE(OID_GEN_MACHINE_NAME)
MAKECASE(OID_GEN_VLAN_ID)
MAKECASE(OID_GEN_RECEIVE_SCALE_PARAMETERS)
MAKECASE(OID_GEN_RECEIVE_SCALE_CAPABILITIES)
MAKECASE(OID_GEN_RECEIVE_HASH)
#if (NTDDI_VERSION >= NTDDI_WINBLUE) ||(NDIS_SUPPORT_NDIS640)
MAKECASE(OID_GEN_ISOLATION_PARAMETERS) // query only
#endif
MAKECASE(OID_GEN_RNDIS_CONFIG_PARAMETER)
/* Operational OIDs for NDIS 6.0 */
MAKECASE(OID_GEN_MAX_LINK_SPEED)
MAKECASE(OID_GEN_LINK_STATE)
MAKECASE(OID_GEN_LINK_PARAMETERS)
MAKECASE(OID_GEN_MINIPORT_RESTART_ATTRIBUTES)
MAKECASE(OID_GEN_ENUMERATE_PORTS)
MAKECASE(OID_GEN_PORT_STATE)
MAKECASE(OID_GEN_PORT_AUTHENTICATION_PARAMETERS)
MAKECASE(OID_GEN_INTERRUPT_MODERATION)
MAKECASE(OID_GEN_PHYSICAL_MEDIUM_EX)
/* Statistical OIDs */
MAKECASE(OID_GEN_XMIT_OK)
MAKECASE(OID_GEN_RCV_OK)
MAKECASE(OID_GEN_XMIT_ERROR)
MAKECASE(OID_GEN_RCV_ERROR)
MAKECASE(OID_GEN_RCV_NO_BUFFER)
MAKECASE(OID_GEN_DIRECTED_BYTES_XMIT)
MAKECASE(OID_GEN_DIRECTED_FRAMES_XMIT)
MAKECASE(OID_GEN_MULTICAST_BYTES_XMIT)
MAKECASE(OID_GEN_MULTICAST_FRAMES_XMIT)
MAKECASE(OID_GEN_BROADCAST_BYTES_XMIT)
MAKECASE(OID_GEN_BROADCAST_FRAMES_XMIT)
MAKECASE(OID_GEN_DIRECTED_BYTES_RCV)
MAKECASE(OID_GEN_DIRECTED_FRAMES_RCV)
MAKECASE(OID_GEN_MULTICAST_BYTES_RCV)
MAKECASE(OID_GEN_MULTICAST_FRAMES_RCV)
MAKECASE(OID_GEN_BROADCAST_BYTES_RCV)
MAKECASE(OID_GEN_BROADCAST_FRAMES_RCV)
MAKECASE(OID_GEN_RCV_CRC_ERROR)
MAKECASE(OID_GEN_TRANSMIT_QUEUE_LENGTH)
/* Statistical OIDs for NDIS 6.0 */
MAKECASE(OID_GEN_STATISTICS)
MAKECASE(OID_GEN_BYTES_RCV)
MAKECASE(OID_GEN_BYTES_XMIT)
MAKECASE(OID_GEN_RCV_DISCARDS)
MAKECASE(OID_GEN_XMIT_DISCARDS)
/* Misc OIDs */
MAKECASE(OID_GEN_GET_TIME_CAPS)
MAKECASE(OID_GEN_GET_NETCARD_TIME)
MAKECASE(OID_GEN_NETCARD_LOAD)
MAKECASE(OID_GEN_DEVICE_PROFILE)
MAKECASE(OID_GEN_INIT_TIME_MS)
MAKECASE(OID_GEN_RESET_COUNTS)
MAKECASE(OID_GEN_MEDIA_SENSE_COUNTS)
/* PnP power management operational OIDs */
MAKECASE(OID_PNP_SET_POWER)
MAKECASE(OID_PNP_QUERY_POWER)
MAKECASE(OID_PNP_CAPABILITIES)
MAKECASE(OID_PNP_ADD_WAKE_UP_PATTERN)
MAKECASE(OID_PNP_REMOVE_WAKE_UP_PATTERN)
MAKECASE(OID_PNP_ENABLE_WAKE_UP)
MAKECASE(OID_PM_HARDWARE_CAPABILITIES)
MAKECASE(OID_PM_ADD_WOL_PATTERN)
MAKECASE(OID_PM_REMOVE_WOL_PATTERN)
MAKECASE(OID_PM_PARAMETERS)
MAKECASE(OID_PM_WOL_PATTERN_LIST)
MAKECASE(OID_PM_ADD_PROTOCOL_OFFLOAD)
MAKECASE(OID_PM_REMOVE_PROTOCOL_OFFLOAD)
MAKECASE(OID_PM_PROTOCOL_OFFLOAD_LIST)
MAKECASE(OID_PNP_WAKE_UP_PATTERN_LIST)
/* PnP power management statistical OIDs */
MAKECASE(OID_PNP_WAKE_UP_ERROR)
MAKECASE(OID_PNP_WAKE_UP_OK)
/* Ethernet operational OIDs */
MAKECASE(OID_802_3_PERMANENT_ADDRESS)
MAKECASE(OID_802_3_CURRENT_ADDRESS)
MAKECASE(OID_802_3_MULTICAST_LIST)
MAKECASE(OID_802_3_MAXIMUM_LIST_SIZE)
MAKECASE(OID_802_3_MAC_OPTIONS)
/* Ethernet operational OIDs for NDIS 6.0 */
MAKECASE(OID_802_3_ADD_MULTICAST_ADDRESS)
MAKECASE(OID_802_3_DELETE_MULTICAST_ADDRESS)
/* Ethernet statistical OIDs */
MAKECASE(OID_802_3_RCV_ERROR_ALIGNMENT)
MAKECASE(OID_802_3_XMIT_ONE_COLLISION)
MAKECASE(OID_802_3_XMIT_MORE_COLLISIONS)
MAKECASE(OID_802_3_XMIT_DEFERRED)
MAKECASE(OID_802_3_XMIT_MAX_COLLISIONS)
MAKECASE(OID_802_3_RCV_OVERRUN)
MAKECASE(OID_802_3_XMIT_UNDERRUN)
MAKECASE(OID_802_3_XMIT_HEARTBEAT_FAILURE)
MAKECASE(OID_802_3_XMIT_TIMES_CRS_LOST)
MAKECASE(OID_802_3_XMIT_LATE_COLLISIONS)
/* TCP/IP OIDs */
MAKECASE(OID_TCP_TASK_OFFLOAD)
MAKECASE(OID_TCP_TASK_IPSEC_ADD_SA)
MAKECASE(OID_TCP_TASK_IPSEC_DELETE_SA)
MAKECASE(OID_TCP_SAN_SUPPORT)
MAKECASE(OID_TCP_TASK_IPSEC_ADD_UDPESP_SA)
MAKECASE(OID_TCP_TASK_IPSEC_DELETE_UDPESP_SA)
MAKECASE(OID_TCP4_OFFLOAD_STATS)
MAKECASE(OID_TCP6_OFFLOAD_STATS)
MAKECASE(OID_IP4_OFFLOAD_STATS)
MAKECASE(OID_IP6_OFFLOAD_STATS)
/* TCP offload OIDs for NDIS 6 */
MAKECASE(OID_TCP_OFFLOAD_CURRENT_CONFIG)
MAKECASE(OID_TCP_OFFLOAD_PARAMETERS)
MAKECASE(OID_TCP_OFFLOAD_HARDWARE_CAPABILITIES)
MAKECASE(OID_TCP_CONNECTION_OFFLOAD_CURRENT_CONFIG)
MAKECASE(OID_TCP_CONNECTION_OFFLOAD_HARDWARE_CAPABILITIES)
MAKECASE(OID_OFFLOAD_ENCAPSULATION)
#if (NDIS_SUPPORT_NDIS620)
/* VMQ OIDs for NDIS 6.20 */
MAKECASE(OID_RECEIVE_FILTER_FREE_QUEUE)
MAKECASE(OID_RECEIVE_FILTER_CLEAR_FILTER)
MAKECASE(OID_RECEIVE_FILTER_ALLOCATE_QUEUE)
MAKECASE(OID_RECEIVE_FILTER_QUEUE_ALLOCATION_COMPLETE)
MAKECASE(OID_RECEIVE_FILTER_SET_FILTER)
#endif
#if (NDIS_SUPPORT_NDIS630 || NDIS_SUPPORT_NDIS680)
/* NDIS QoS OIDs for NDIS 6.30 */
MAKECASE(OID_QOS_PARAMETERS)
#endif
#if (NDIS_SUPPORT_NDIS680)
/* RSSv2 OIDS*/
MAKECASE(OID_GEN_RSS_SET_INDIRECTION_TABLE_ENTRIES)
MAKECASE(OID_GEN_RECEIVE_SCALE_PARAMETERS_V2)
#endif
}
if (oidName)
{
DbgPrintF(MP_LOUD, "%s", oidName);
}
else
{
DbgPrintF(MP_LOUD, "<** Unknown OID 0x%08x **>.", Oid);
}
}
VOID
DbgPrintAddress(
_In_reads_bytes_(ETH_LENGTH_OF_ADDRESS) PUCHAR Address)
{
// If your MAC address has a different size, adjust the printf accordingly.
//{ASSERT(ETH_LENGTH_OF_ADDRESS == 6); }
DbgPrintF(MP_LOUD, "%02x-%02x-%02x-%02x-%02x-%02x.",
Address[0], Address[1], Address[2],
Address[3], Address[4], Address[5]);
}
#endif
#elif defined(LINUX)
#elif defined(UBOOT)
#ifdef DBG
u32 MPDebugLevel = MP_LOUD;
#endif
#else
#endif