📄 nsc.c
字号:
*/
VOID DisplayRegs()
{
UCHAR bank;
UCHAR imstcr;
// RETAILMSG(1,(TEXT("---------INTC---------\r\n")));
// RETAILMSG(1,(TEXT("pNIMR= %8x\r\n"), READ_REGISTER_USHORT(pNIMR)));
// RETAILMSG(1,(TEXT("---------PMSC---------\r\n")));
// RETAILMSG(1,(TEXT("pSMSCR= %8x\r\n"), READ_REGISTER_USHORT(pSMSCR)));
// RETAILMSG(1,(TEXT("pSCONFR= %8x\r\n"), READ_REGISTER_USHORT(pSCONFR)));
// RETAILMSG(1,(TEXT("pSPLLCR= %8x\r\n"), READ_REGISTER_USHORT(pSPLLCR)));
// RETAILMSG(1,(TEXT("pSRR= %8x\r\n"), READ_REGISTER_USHORT(pSRR)));
// RETAILMSG(1,(TEXT("--------UART Register of FIR Portion----------\r\n")));
// RETAILMSG(1,(TEXT("pIrIER= %8x\r\n"), READ_REGISTER_UCHAR(pIrIER)));
// RETAILMSG(1,(TEXT("pIrIIR= %8x\r\n"), READ_REGISTER_UCHAR(pIrIIR)));
// RETAILMSG(1,(TEXT("pIrLCR= %8x\r\n"), READ_REGISTER_UCHAR(pIrLCR)));
// RETAILMSG(1,(TEXT("pIrMCR= %8x\r\n"), READ_REGISTER_UCHAR(pIrMCR)));
// RETAILMSG(1,(TEXT("---------FIR Controller Register---------\r\n")));
RETAILMSG(1,(TEXT("pISIRR= %8x\r\n"), READ_REGISTER_UCHAR(pISIRR)));
RETAILMSG(1,(TEXT("pIFIRCR= %8x\r\n"), READ_REGISTER_UCHAR(pIFIRCR)));
RETAILMSG(1,(TEXT("pITMCR= %8x\r\n"), READ_REGISTER_UCHAR(pITMCR)));
bank = imstcr = READ_REGISTER_UCHAR(pIMSTCR);
bank &= CC_FIR_IMSTCR_RST_BANK;
WRITE_REGISTER_UCHAR(pIMSTCR, bank);//bank0
RETAILMSG(1,(TEXT("---------BANK0---------\r\n")));
RETAILMSG(1,(TEXT("pIMSTCR= %8x\r\n"), READ_REGISTER_UCHAR(pIMSTCR)));
RETAILMSG(1,(TEXT("pITC1R= %8x\r\n"), READ_REGISTER_UCHAR(pITC1R)));
RETAILMSG(1,(TEXT("pITC2R= %8x\r\n"), READ_REGISTER_UCHAR(pITC2R)));
RETAILMSG(1,(TEXT("pIRCR= %8x\r\n"), READ_REGISTER_UCHAR(pIRCR)));
WRITE_REGISTER_UCHAR(pIMSTCR, bank|CC_FIR_IMSTCR_BANK1);//bank1
RETAILMSG(1,(TEXT("---------BANK1---------\r\n")));
RETAILMSG(1,(TEXT("pIFAR= %8x\r\n"), READ_REGISTER_UCHAR(pIFAR)));
RETAILMSG(1,(TEXT("pIRBCLR= %8x\r\n"), READ_REGISTER_UCHAR(pIRBCLR)));
RETAILMSG(1,(TEXT("pIRBCHR= %8x\r\n"), READ_REGISTER_UCHAR(pIRBCHR)));
RETAILMSG(1,(TEXT("pIRRFPLR= %8x\r\n"), READ_REGISTER_UCHAR(pIRRFPLR)));
RETAILMSG(1,(TEXT("pIRRFPHR= %8x\r\n"), READ_REGISTER_UCHAR(pIRRFPHR)));
RETAILMSG(1,(TEXT("pITBCLR= %8x\r\n"), READ_REGISTER_UCHAR(pITBCLR)));
RETAILMSG(1,(TEXT("pITBCHR= %8x\r\n"), READ_REGISTER_UCHAR(pITBCHR)));
WRITE_REGISTER_UCHAR(pIMSTCR, bank|CC_FIR_IMSTCR_BANK2);//bank2
RETAILMSG(1,(TEXT("---------BANK2---------\r\n")));
RETAILMSG(1,(TEXT("pIIRC1R= %8x\r\n"), READ_REGISTER_UCHAR(pIIRC1R)));
RETAILMSG(1,(TEXT("pIIRTCR= %8x\r\n"), READ_REGISTER_UCHAR(pIIRTCR)));
RETAILMSG(1,(TEXT("pIIRC2R= %8x\r\n"), READ_REGISTER_UCHAR(pIIRC2R)));
RETAILMSG(1,(TEXT("pITMR= %8x\r\n"), READ_REGISTER_UCHAR(pITMR)));
RETAILMSG(1,(TEXT("pIIRC3R= %8x\r\n"), READ_REGISTER_UCHAR(pIIRC3R)));
WRITE_REGISTER_UCHAR(pIMSTCR, imstcr);
/* RETAILMSG(1,(TEXT("---------DMAC---------\r\n")));
RETAILMSG(1,(TEXT("pSAR0= %8x\r\n"), READ_REGISTER_ULONG(pSAR0)));
RETAILMSG(1,(TEXT("pDAR0= %8x\r\n"), READ_REGISTER_ULONG(pDAR0)));
RETAILMSG(1,(TEXT("pDMATCR0= %8x\r\n"), READ_REGISTER_ULONG(pDMATCR0)));
RETAILMSG(1,(TEXT("pCHCR0= %8x\r\n"), READ_REGISTER_ULONG(pCHCR0)));
RETAILMSG(1,(TEXT("pDMAOR= %8x\r\n"), READ_REGISTER_ULONG(pDMAOR)));
*/
}
VOID SetRegs()
{
WRITE_REGISTER_UCHAR(pIrMCR, READ_REGISTER_UCHAR(pIrMCR)|SERIAL_MCR_IRQ_ENABLE);
WRITE_REGISTER_UCHAR(pIrLCR, SERIAL_8_DATA | SERIAL_1_STOP | SERIAL_NONE_PARITY);
}
//
// 1999-Oct-22 cea Modified to use the HDSL-3600 IrDA transceiver
//
VOID SetFirMode()
{
UCHAR imstcr;
WRITE_REGISTER_UCHAR(pISIRR ,0x00); // Select FIR mode
WRITE_REGISTER_UCHAR(pIFIRCR, READ_REGISTER_UCHAR(pIFIRCR) | CC_FIR_IFIRCR_TMODE);//Select IBM-like transceiver mode
imstcr = READ_REGISTER_UCHAR(pIMSTCR);
WRITE_REGISTER_UCHAR(pIMSTCR, (imstcr & CC_FIR_IMSTCR_RST_BANK) | CC_FIR_IMSTCR_BANK2);//Select Bank2
WRITE_REGISTER_UCHAR(pIIRTCR, READ_REGISTER_UCHAR(pIIRTCR) | CC_FIR_IIRTCR_MODSEL);//MODESEL pin to HIGH
WRITE_REGISTER_UCHAR(pIMSTCR, imstcr);//Select original Bank
}
//
// 1999-Oct-22 cea Modified to use the HDSL-3600 IrDA transceiver
//
VOID SetSirMode()
{
UCHAR imstcr;
// The CC must be in FIR mode to change the state of the MODESEL pin
WRITE_REGISTER_UCHAR(pISIRR ,0x00); // Select FIR mode
WRITE_REGISTER_UCHAR(pIFIRCR, READ_REGISTER_UCHAR(pIFIRCR) | CC_FIR_IFIRCR_TMODE);//Select IBM-like transceiver mode
imstcr = READ_REGISTER_UCHAR(pIMSTCR);
WRITE_REGISTER_UCHAR(pIMSTCR, (imstcr & CC_FIR_IMSTCR_RST_BANK) | CC_FIR_IMSTCR_BANK2);//Select Bank2
WRITE_REGISTER_UCHAR(pIIRTCR, READ_REGISTER_UCHAR(pIIRTCR) & ~CC_FIR_IIRTCR_MODSEL);//MODESEL pin to LOW
WRITE_REGISTER_UCHAR(pIMSTCR, imstcr);//Select original Bank
WRITE_REGISTER_UCHAR(pISIRR ,CC_FIR_ISIRR_SIRMOD); // Select SIR mode
}
#ifdef OUTMSG
void DumpNdisPacket(PNDIS_PACKET Packet, UINT Line)
{
UINT PhysBufCnt, BufCnt, TotLen, Len,i;
PNDIS_BUFFER NdisBuffer;
PVOID Address;
UCHAR buf[35],buf2[35];
NdisQueryPacket(Packet, &PhysBufCnt, &BufCnt, &NdisBuffer, &TotLen);
// RETAILMSG(1,(TEXT("Packet:%08X PhysBufCnt:%d BufCnt:%d TotLen:%d\n"),Packet, PhysBufCnt, BufCnt, TotLen));
while (NdisBuffer)
{
for(i=0;i<35;i++){
buf[i]=buf2[i]=0xff;
}
NdisQueryBuffer(NdisBuffer, &Address, &Len);
// RETAILMSG(1,(TEXT(" Buffer:%08X Address:%08X Length:%d\n"),NdisBuffer, Address, Len));
for(i=0;i<Len;i++){
buf[i]= *((UCHAR*)((long)Address + i));
if( *((UCHAR*)((long)Address + i)) != 0x00 ){
buf2[i]= *((UCHAR*)((long)Address + i));
}
}
if(Len <= 2){
RETAILMSG(1,(TEXT("Length:%d 0x%x[%c]0x%x[%c]\r\n"),Len,buf[0],buf2[0],buf[1],buf2[1]));
}else
if(Len > 2 && Len <= 10){
RETAILMSG(1,(TEXT("Length:%d 0x%x[%c]0x%x[%c]0x%x[%c]0x%x[%c]0x%x[%c]0x%x[%c]0x%x[%c]0x%x[%c]0x%x[%c]0x%x[%c]\r\n")
,Len,buf[0],buf2[0],buf[1],buf2[1],buf[2],buf2[2],buf[3],buf2[3],buf[4],buf2[4],buf[5],buf2[5],buf[6],buf2[6],buf[7],buf2[7],buf[8],buf2[8],buf[9],buf2[9]));
}else
if(Len > 10 && Len <= 20){
RETAILMSG(1,(TEXT("Length:%d 0x%x[%c]0x%x[%c]0x%x[%c]0x%x[%c]0x%x[%c]0x%x[%c]0x%x[%c]0x%x[%c]0x%x[%c]0x%x[%c]0x%x[%c]0x%x[%c]0x%x[%c]0x%x[%c]0x%x[%c]0x%x[%c]0x%x[%c]0x%x[%c]0x%x[%c]0x%x[%c]\r\n")
,Len
,buf[0],buf2[0],buf[1],buf2[1],buf[2],buf2[2],buf[3],buf2[3],buf[4],buf2[4],buf[5],buf2[5],buf[6],buf2[6],buf[7],buf2[7],buf[8],buf2[8],buf[9],buf2[9]
,buf[10],buf2[10],buf[11],buf2[11],buf[12],buf2[12],buf[13],buf2[13],buf[14],buf2[14],buf[15],buf2[15],buf[16],buf2[16],buf[17],buf2[17],buf[18],buf2[18],buf[19],buf2[19]));
}else
if(Len > 20 && Len <= 35){
RETAILMSG(1,(TEXT("Length:%d 0x%x[%c]0x%x[%c]0x%x[%c]0x%x[%c]0x%x[%c]0x%x[%c]0x%x[%c]0x%x[%c]0x%x[%c]0x%x[%c]0x%x[%c]0x%x[%c]0x%x[%c]0x%x[%c]0x%x[%c]0x%x[%c]0x%x[%c]0x%x[%c]0x%x[%c]0x%x[%c]0x%x[%c]0x%x[%c]0x%x[%c]0x%x[%c]0x%x[%c]0x%x[%c]0x%x[%c]0x%x[%c]0x%x[%c]0x%x[%c]0x%x[%c]0x%x[%c]0x%x[%c]0x%x[%c]0x%x[%c]\r\n")
,Len
,buf[0],buf2[0],buf[1],buf2[1],buf[2],buf2[2],buf[3],buf2[3],buf[4],buf2[4],buf[5],buf2[5],buf[6],buf2[6],buf[7],buf2[7],buf[8],buf2[8],buf[9],buf2[9]
,buf[10],buf2[10],buf[11],buf2[11],buf[12],buf2[12],buf[13],buf2[13],buf[14],buf2[14],buf[15],buf2[15],buf[16],buf2[16],buf[17],buf2[17],buf[18],buf2[18],buf[19],buf2[19]
,buf[20],buf2[20],buf[21],buf2[21],buf[22],buf2[22],buf[23],buf2[23],buf[24],buf2[24],buf[25],buf2[25],buf[26],buf2[26],buf[27],buf2[27],buf[28],buf2[28],buf[29],buf2[29]
,buf[30],buf2[30],buf[31],buf2[31],buf[32],buf2[32],buf[33],buf2[33],buf[34],buf2[34]));
}
NdisGetNextBuffer(NdisBuffer, &NdisBuffer);
}
}
#endif
BOOLEAN MiniportCheckForHang(NDIS_HANDLE MiniportAdapterContext)
{
/******************************************************************************
* Modification Done by Maneesh Gupta
*
* Debug Messages has been removed
*****************************************************************************/
#if 0
LOG(TEXT("==> MiniportCheckForHang"), 0);
DBGOUT((TEXT("==> MiniportCheckForHang(0x%x)\r\n"),
(UINT)MiniportAdapterContext));
LOG(TEXT("<== MiniportCheckForHang"), 1);
DBGOUT((TEXT("<== MiniportCheckForHang(0x%x)\r\n"),
(UINT)MiniportAdapterContext));
#endif 0
/******************************************************************************
* End of modification Done by Maneesh Gupta
*****************************************************************************/
return FALSE;
}
/*
*************************************************************************
* MiniportDisableInterrupt
*************************************************************************
*
* Disables the NIC from generating interrupts.
*
*/
VOID MiniportDisableInterrupt(NDIS_HANDLE MiniportAdapterContext)
{
IrDevice *thisDev = CONTEXT_TO_DEV(MiniportAdapterContext);
LOG(TEXT("==> MiniportDisableInterrupt"), 0);
DBGOUT((TEXT("==> MiniportDisableInterrupt(0x%x)"),
(UINT)MiniportAdapterContext));
if (!thisDev->resourcesReleased){
thisDev->intEnabled = FALSE;
SetCOMInterrupts(thisDev, FALSE);
}
LOG(TEXT("<== MiniportDisableInterrupt"), 1);
DBGOUT((TEXT("<== MiniportDisableInterrupt(0x%x)"),
(UINT)MiniportAdapterContext));
}
/*
*************************************************************************
* MiniportEnableInterrupt
*************************************************************************
*
* Enables the IR card to generate interrupts.
*
*/
VOID MiniportEnableInterrupt(IN NDIS_HANDLE MiniportAdapterContext)
{
IrDevice *thisDev = CONTEXT_TO_DEV(MiniportAdapterContext);
LOG(TEXT("==> MiniportEnableInterrupt"), 0);
DBGOUT((TEXT("==> MiniportEnableInterrupt(0x%x)"),
(UINT)MiniportAdapterContext));
if (!thisDev->resourcesReleased){
thisDev->intEnabled = TRUE;
SetCOMInterrupts(thisDev, TRUE);
}
LOG(TEXT("<== MiniportEnableInterrupt"), 1);
DBGOUT((TEXT("<== MiniportEnableInterrupt(0x%x)"),
(UINT)MiniportAdapterContext));
}
/*
*************************************************************************
* MiniportHalt
*************************************************************************
*
* Halts the network interface card.
*
*/
VOID MiniportHalt(IN NDIS_HANDLE MiniportAdapterContext)
{
IrDevice *thisDev = CONTEXT_TO_DEV(MiniportAdapterContext);
LOG(TEXT("==> MiniportHalt"), 0);
DBGOUT((TEXT("==> MiniportHalt(0x%x)"), (UINT)MiniportAdapterContext));
/*
* Remove this device from our global list
*/
if (thisDev == firstIrDevice){
firstIrDevice = firstIrDevice->next;
}
else {
IrDevice *dev;
for (dev = firstIrDevice; dev && (dev->next != thisDev);
dev = dev->next){}
if (dev) {
dev->next = dev->next->next;
}
else {
/*
* Don't omit this error check. I've seen NDIS call
* MiniportHalt with a bogus context when the system
* gets corrupted.
*/
LOG(TEXT("Error: Bad context in MiniportHalt"), 0);
DBGERR((TEXT("Bad context in MiniportHalt")));
return;
}
}
/*
* Now destroy the device object.
*/
NSC_Shutdown(thisDev);
DoClose(thisDev);
NdisMDeregisterIoPortRange(thisDev->ndisAdapterHandle,
thisDev->portInfo.ioBase, 8, (PVOID)thisDev->mappedPortRange);
FreeDevice(thisDev);
LOG(TEXT("<== MiniportHalt"), 1);
DBGOUT((TEXT("<== MiniportHalt(0x%x)"), (UINT)MiniportAdapterContext));
}
/*
*************************************************************************
* MiniportSyncHandleInterrupt
*************************************************************************
*
* This function is called from MiniportHandleInterrupt via
* NdisMSynchronizeWithInterrupt to synchronize with MiniportISR. This is
* required because the deferred procedure call (MiniportHandleInterrupt)
* shares data with MiniportISR but cannot achieve mutual exclusion with a
* spinlock because ISR's are not allowed to acquire spinlocks.
* This function should be called WITH DEVICE LOCK HELD, however, to
* synchronize with the rest of the miniport code (besides the ISR).
* The device's IRQ is masked out in the PIC while this function executes,
* so don't make calls up the stack.
*/
BOOLEAN MiniportSyncHandleInterrupt(PVOID MiniportAdapterContext)
{
IrDevice *thisDev = CONTEXT_TO_DEV(MiniportAdapterContext);
// QueueLock should be held.
LOG(TEXT("==> MiniportSyncHandleInterrupt"), 0);
DBGOUT((TEXT("==> MiniportSyncHandleInterrupt(0x%x)"),
(UINT)MiniportAdapterContext));
#if 0 // Since we're using queues, this function doesn't really do anything.
/*
* Update .firstRcvBufIndex and .lastRcvBufIndex.
*/
while ((thisDev->firstRcvBufIndex != NO_BUF_INDEX) &&
(thisDev->rcvBufs[thisDev->firstRcvBufIndex].state ==
STATE_FREE)) {
if (thisDev->firstRcvBufIndex == thisDev->lastRcvBufIndex) {
thisDev->firstRcvBufIndex =
thisDev->lastRcvBufIndex = NO_BUF_INDEX;
}
else {
thisDev->firstRcvBufIndex =
NEXT_RCV_BUF_INDEX(thisDev->firstRcvBufIndex);
}
}
#endif
LOG(TEXT("<== MiniportSyncHandleInterrupt"), 1);
DBGOUT((TEXT("<== MiniportSyncHandleInterrupt(0x%x)"),
(UINT)MiniportAdapterContext));
return TRUE;
}
void InterlockedInsertBufferSorted(PLIST_ENTRY Head,
rcvBuffer *rcvBuf,
PNDIS_SPIN_LOCK Lock)
{
PLIST_ENTRY ListEntry;
DBGOUT((TEXT("==>InterlockedInsertBufferSorted")));
NdisAcquireSpinLock(Lock);
if (IsListEmpty(Head))
{
InsertHeadList(Head, &rcvBuf->listEntry);
}
else
{
BOOLEAN EntryInserted = FALSE;
for (ListEntry = Head->Flink;
ListEntry != Head;
ListEntry = ListEntry->Flink)
{
rcvBuffer *temp = CONTAINING_RECORD(ListEntry,
rcvBuffer,
listEntry);
if (temp->dataBuf > rcvBuf->dataBuf)
{
// We found one that comes after ours.
// We need to insert before it
InsertTailList(ListEntry, &rcvBuf->listEntry);
EntryInserted = TRUE;
break;
}
}
if (!EntryInserted)
{
// We didn't find an entry on the last who's address was later
// than our buffer. We go at the end.
InsertTailList(Head, &rcvBuf->listEntry);
}
}
NdisReleaseSpinLock(Lock);
DBGOUT((TEXT("<==InterlockedInsertBufferSorted")));
}
/*
*************************************************************************
* DeliverFullBuffers
*************************************************************************
*
* Deliver received packets to the protocol.
* Return TRUE if delivered at least one frame.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -