📄 nsc.c
字号:
/*
Copyright(c) 1998,1999 SIC/Hitachi,Ltd.
Module Name:
nsc.c
Revision History:
26th May 1999 Released
*/
//#define OUTMSG
#include "nsc.h"
#include "newdong.h"
#include "firregs.h"
#include "cc.h"
/******************************************************************************
* Modification Done by Maneesh Gupta
*
* S1.h has been replaced by platform.h
* Mobytel.h has been removed as it is no longer needed.
* SH4.h has been included
*****************************************************************************/
//#include "platform.h"
//#include "sh4.h"
/******************************************************************************
* End of modification Done by Maneesh Gupta
*****************************************************************************/
//#include "oalintr.h"
#include "hw16550.h"
#include "macros.h"
extern DWORD dwSysIntrIR;
extern DWORD dwSysIntrFirmware;
extern DWORD dwHD64465Base;
extern UIR IrDongleResource;
/*
* We keep a linked list of device objects
*/
IrDevice *firstIrDevice = NULL;
/* This fuction sets up the device for Recv */
void SetupRecv(IrDevice *thisDev);
BOOL AllocateFirRegs();
VOID FreeFirRegs();
//
// Debug Counters
//
DebugCounters RegStats = {0,0,0,0,0,0,0,0,0};
#ifdef RECEIVE_PACKET_LOGGING
typedef struct {
UCHAR Data[12];
} DATA_BITS;
typedef struct {
USHORT Tag;
USHORT Line;
union {
struct {
PNDIS_PACKET Packet;
PVOID DmaBuffer;
ULONG Length;
} Packet;
struct {
PLIST_ENTRY Head;
PLIST_ENTRY Entry;
} List;
struct {
PVOID Start;
ULONG Offset;
ULONG Length;
} Dma;
DATA_BITS Data;
};
} RCV_LOG;
#define CHAIN_PACKET_TAG 'CP'
#define UNCHAIN_PACKET_TAG 'UP'
#define ADD_HEAD_LIST_TAG 'HA'
#define ADD_TAIL_LIST_TAG 'TA'
#define REMOVE_HEAD_LIST_TAG 'HR'
#define REMOVE_ENTRY_TAG 'ER'
#define DMA_TAG 'MD'
#define DATA_TAG 'AD'
#define DATA2_TAG '2D'
#define NUM_RCV_LOG 256
ULONG RcvLogIndex = 0;
RCV_LOG RcvLog[NUM_RCV_LOG];
BOOLEAN SyncGetRcvLogEntry(PVOID Context)
{
DBGOUT((TEXT("==>SyncGetRcvLogEntry")));
*(ULONG*)Context = RcvLogIndex++;
RcvLogIndex &= NUM_RCV_LOG-1;
DBGOUT((TEXT("<==SyncGetRcvLogEntry")));
return TRUE;
}
ULONG __inline GetRcvLogEntry(IrDevice *thisDev)
{
ULONG Entry;
DBGOUT((TEXT("==>GetRcvLogEntry")));
NdisAcquireSpinLock(&thisDev->QueueLock);
NdisMSynchronizeWithInterrupt(&thisDev->interruptObj, SyncGetRcvLogEntry, &Entry);
NdisReleaseSpinLock(&thisDev->QueueLock);
DBGOUT((TEXT("<==GetRcvLogEntry")));
return Entry;
}
#define LOG_InsertHeadList(d, h, e) \
{ \
ULONG i = GetRcvLogEntry(d); \
RcvLog[i].Tag = ADD_HEAD_LIST_TAG; \
RcvLog[i].Line = __LINE__; \
RcvLog[i].List.Head = (h); \
RcvLog[i].List.Entry = (PLIST_ENTRY)(e); \
}
#define LOG_InsertTailList(d, h, e) \
{ \
ULONG i = GetRcvLogEntry(d); \
RcvLog[i].Tag = ADD_TAIL_LIST_TAG; \
RcvLog[i].Line = __LINE__; \
RcvLog[i].List.Head = (h); \
RcvLog[i].List.Entry = (PLIST_ENTRY)(e); \
}
#define LOG_RemoveHeadList(d, h, e) \
{ \
ULONG i = GetRcvLogEntry(d); \
RcvLog[i].Tag = REMOVE_HEAD_LIST_TAG; \
RcvLog[i].Line = __LINE__; \
RcvLog[i].List.Head = (h); \
RcvLog[i].List.Entry = (PLIST_ENTRY)(e); \
}
#define LOG_RemoveEntryList(d, e) \
{ \
ULONG i = GetRcvLogEntry(d); \
RcvLog[i].Tag = REMOVE_ENTRY_TAG; \
RcvLog[i].Line = __LINE__; \
RcvLog[i].List.Head = NULL; \
RcvLog[i].List.Entry = (PLIST_ENTRY)(e); \
}
#define LOG_PacketChain(d, p) \
{ \
PNDIS_BUFFER NdisBuffer; \
PVOID Address; \
ULONG Len; \
ULONG i = GetRcvLogEntry(d); \
RcvLog[i].Tag = CHAIN_PACKET_TAG; \
RcvLog[i].Line = __LINE__; \
NdisQueryPacket((p), NULL, NULL, &NdisBuffer, NULL); \
NdisQueryBuffer(NdisBuffer, &Address, &Len); \
RcvLog[i].Packet.Packet = (p); \
RcvLog[i].Packet.DmaBuffer = Address; \
RcvLog[i].Packet.Length = Len; \
}
#define LOG_PacketUnchain(d, p) \
{ \
PNDIS_BUFFER NdisBuffer; \
PVOID Address; \
ULONG Len; \
ULONG i = GetRcvLogEntry(d); \
RcvLog[i].Tag = UNCHAIN_PACKET_TAG; \
RcvLog[i].Line = __LINE__; \
NdisQueryPacket((p), NULL, NULL, &NdisBuffer, NULL); \
NdisQueryBuffer(NdisBuffer, &Address, &Len); \
RcvLog[i].Packet.Packet = (p); \
RcvLog[i].Packet.DmaBuffer = Address; \
RcvLog[i].Packet.Length = Len; \
}
#define LOG_Dma(d) \
{ \
ULONG i = GetRcvLogEntry(d); \
RcvLog[i].Tag = DMA_TAG; \
RcvLog[i].Line = __LINE__; \
RcvLog[i].Dma.Start = (d)->rcvDmaBuffer; \
RcvLog[i].Dma.Offset = (d)->rcvDmaOffset; \
RcvLog[i].Dma.Length = (d)->rcvDmaSize; \
}
#define LOG_Data(d,s) \
{ \
ULONG i = GetRcvLogEntry(d); \
RcvLog[i].Tag = DATA_TAG; \
RcvLog[i].Line = ((USHORT)(s))&0xffff; \
RcvLog[i].Data = *(DATA_BITS*)(s); \
}
#define LOG_Data2(d,s) \
{ \
ULONG i = GetRcvLogEntry(d); \
RcvLog[i].Tag = DATA2_TAG; \
RcvLog[i].Line = ((USHORT)(s))&0xffff; \
RcvLog[i].Data = *(DATA_BITS*)(s); \
}
void DumpNdisPacket(PNDIS_PACKET Packet, UINT Line)
{
UINT PhysBufCnt, BufCnt, TotLen, Len;
PNDIS_BUFFER NdisBuffer;
PVOID Address;
DbgPrint("Badly formed NDIS packet at line %d\n", Line);
NdisQueryPacket(Packet, &PhysBufCnt, &BufCnt, &NdisBuffer, &TotLen);
DbgPrint("Packet:%08X PhysBufCnt:%d BufCnt:%d TotLen:%d\n",
Packet, PhysBufCnt, BufCnt, TotLen);
while (NdisBuffer)
{
NdisQueryBuffer(NdisBuffer, &Address, &Len);
DbgPrint(" Buffer:%08X Address:%08X Length:%d\n",
NdisBuffer, Address, Len);
NdisGetNextBuffer(NdisBuffer, &NdisBuffer);
}
DbgBreakPoint();
}
#define VerifyNdisPacket(p, b) \
{ \
UINT BufCnt; \
\
NdisQueryPacket((p), NULL, &BufCnt, NULL, NULL); \
if (BufCnt>(b)) \
{ \
DumpNdisPacket((p), __LINE__); \
} \
}
#else
#define VerifyNdisPacket(p,b)
#define LOG_InsertHeadList(d, h, e)
#define LOG_InsertTailList(d, h, e)
#define LOG_RemoveHeadList(d, h, e)
#define LOG_RemoveEntryList(d, e)
#define LOG_PacketChain(d, p)
#define LOG_PacketUnchain(d, p)
#define LOG_Dma(d)
#define LOG_Data(d,s)
#define LOG_Data2(d,s)
#endif
#ifdef UNDER_CE
//
// Debugging information.
//
#ifdef DEBUG
DBGPARAM dpCurSettings =
{
TEXT("NSCIrda"),
{
TEXT("Init"), TEXT("SirMode"),
TEXT("FirMode"), TEXT("Tx"),
TEXT("Rx"), TEXT("TxTrace"),
TEXT("Packet"), TEXT("Isr"),
TEXT("Dma"), TEXT("Undefined"),
TEXT("Stat"), TEXT("Log"),
TEXT("Buffer"), TEXT("Msg"),
TEXT("Warn"), TEXT("Error")
},
0
// ((1 << 8) | (1 << 3) | (1 << 4))
// 0x00008000 | (1 << 8)
// 0xdfff
// 0xffff
// ((1 << 1) | (1 << 6) | (1 << 7) | (1 << 9) | (1 << 15))
};
#endif // DEBUG
PVOID g_pvDmaVirtualBase;
BOOL WINAPI
DllEntry(
HANDLE hInstDll,
DWORD Op,
LPVOID lpvReserved
)
{
ULONG nTmpVal;
DBGOUT((TEXT("==>DllEntry")));
switch (Op)
{
case DLL_PROCESS_ATTACH:
DEBUGREGISTER((HMODULE)hInstDll);
IRFIR_LOG_INIT();
DEBUGMSG(ZONE_INIT, (TEXT("NscFir: DLL Process Attach.\r\n")));
//
// Windows CE. Allocate contiguous memory from drivers globals. See
// externs.h.
// Need to get virtual pointer to our DMA physical.
//
// Check to make sure that our buffer requirements have not changed.
ASSERT((NUM_RCV_BUFS * RCV_BUFFER_SIZE) == 33024);
ASSERT((RCV_BUFFER_SIZE + MAX_IRDA_DATA_SIZE * 8) == 35264);
ASSERT(RCV_DMA_SIZE == 18504);
g_pvDmaVirtualBase = VirtualAlloc(
0, NSCIRDA_DMA_BUFFER_LEN,
MEM_RESERVE, PAGE_NOACCESS);
if (g_pvDmaVirtualBase == NULL)
{
return (FALSE);
}
nTmpVal = VirtualCopy(
g_pvDmaVirtualBase,
(LPVOID)(NSCIRDA_DMA_BUFFER_BASE_PA | 0x80000000),
NSCIRDA_DMA_BUFFER_LEN,
PAGE_READWRITE | PAGE_NOCACHE);
if (nTmpVal != TRUE)
{
return (FALSE);
}
if(AllocateFirRegs() != TRUE)
{
return (FALSE);
}
break;
case DLL_PROCESS_DETACH:
DEBUGMSG(ZONE_INIT, (TEXT("NscFir: DLL Process Detach.\r\n")));
// Free our virtual address.
if (g_pvDmaVirtualBase)
{
VirtualFree(
g_pvDmaVirtualBase,
0,
MEM_RELEASE);
g_pvDmaVirtualBase = NULL;
}
FreeFirRegs();
break;
default:
break;
}
DBGOUT((TEXT("<==DllEntry")));
return (TRUE);
}
#endif // UNDER_CE
/*
*************************************************************************
* MiniportCheckForHang
*************************************************************************
*
* Reports the state of the network interface card.
*
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -