📄 interrup.c
字号:
//
// Copyright (c) Renesas Technology Corp. 1999-2003 All Rights Reserved.
//
// LAN91C111 network hardware driver
//
//----------------------------------------------------------------------------
//
// FILE : INTERRUP.C
// CREATED : 1998. 4.18 (for NE2000 driver)
// MODIFIED : 2003.08.06
// AUTHOR : Renesas Technology Corp.
// HARDWARE : RENESAS HS7751RSTC01H (S1-E, ITS-DS5)
// TARGET OS : Microsoft(R) Windows(R) CE .NET 4.2
// FUNCTION : Functions related to interrupt services
// HISTORY :
// 1999. 4.26
// - Released as SMC91C94 LAN driver for PFM-DS6x by modifying
// NE2000 driver in PB2.12 reference drivers.
// (Detailed history for PFM-DS6x are omitted.)
// 2002. 4.26
// - Modified to LAN91C111 driver for HS7751RSTC01H.
// 2002. 9. 5
// - Header style is changed and file informations are added.
/*++
THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
PARTICULAR PURPOSE.
Copyright (c) 1995-2000 Microsoft Corporation. All rights reserved.
Module Name:
interrup.c
Abstract:
This is a part of the driver for the National Semiconductor Novell 2000
Ethernet controller. It contains the interrupt-handling routines.
This driver conforms to the NDIS 3.0 interface.
--*/
#include "precomp.h"
#include "smc91c94.h"
extern void LAN91C111Init(void);
extern unsigned short READ_PHY(unsigned char address);
extern void WRITE_PHY(unsigned char address, unsigned short data);
int Linked =1;
int NoPartner =0;
int CurrentLinkStatus = 0;
extern PBYTE EtherNetBase;
#ifdef DEBUG
extern void printregs(void);
#define PrintRegs printregs()
#else
#define PrintRegs
#endif
//
// On debug builds tell the compiler to keep the symbols for
// internal functions, otw throw them out.
//
#if DBG
#define STATIC
#else
#define STATIC static
#endif
INDICATE_STATUS
CelanIndicatePacket(
IN PCELAN_ADAPTER Adapter
);
VOID
CelanDoNextSend(
PCELAN_ADAPTER Adapter
);
//
// This is used to pad short packets.
//
static UCHAR BlankBuffer[60] = " ";
static UCHAR PacketBuffer[2000];
VOID
CelanEnableInterrupt(
IN NDIS_HANDLE MiniportAdapterContext
)
/*++
Routine Description:
This routine is used to turn on the interrupt mask.
Arguments:
Context - The adapter for the CELAN to start.
Return Value:
None.
--*/
{
PCELAN_ADAPTER Adapter = (PCELAN_ADAPTER)(MiniportAdapterContext);
DEBUGMSG(ZONE_INTR, (TEXT("+CELAN:EnableInterrupt\r\n")));
CardUnblockInterrupts(Adapter);
DEBUGMSG(ZONE_INTR, (TEXT("-CELAN:EnableInterrupt\r\n")));
}
VOID
CelanDisableInterrupt(
IN NDIS_HANDLE MiniportAdapterContext
)
/*++
Routine Description:
This routine is used to turn off the interrupt mask.
Arguments:
Context - The adapter for the CELAN to start.
Return Value:
None.
--*/
{
PCELAN_ADAPTER Adapter = (PCELAN_ADAPTER)(MiniportAdapterContext);
DEBUGMSG(ZONE_INTR, (TEXT("+CELAN:DisableInterrupt\r\n")));
CardBlockInterrupts(Adapter);
DEBUGMSG(ZONE_INTR, (TEXT("-CELAN:DisableInterrupt\r\n")));
}
VOID
CelanIsr(
OUT PBOOLEAN InterruptRecognized,
OUT PBOOLEAN QueueDpc,
IN PVOID Context
)
/*++
Routine Description:
This is the interrupt handler which is registered with the operating
system. If several are pending (i.e. transmit complete and receive),
handle them all. Block new interrupts until all pending interrupts
are handled.
Arguments:
InterruptRecognized - Boolean value which returns TRUE if the
ISR recognizes the interrupt as coming from this adapter.
QueueDpc - TRUE if a DPC should be queued.
Context - pointer to the adapter object
Return Value:
None.
--*/
{
PCELAN_ADAPTER Adapter = ((PCELAN_ADAPTER)Context);
DEBUGMSG(ZONE_INTR, (TEXT("CELAN:Isr entered\r\n")));
IF_LOG( CelanLog('i'); )
//
// Force the INT signal from the chip low. When all
// interrupts are acknowledged interrupts will be unblocked,
//
CardBlockInterrupts(Adapter);
*InterruptRecognized = TRUE;
*QueueDpc = TRUE;
DEBUGMSG(ZONE_INTR, (TEXT("CELAN:Isr done\r\n")));
return;
}
VOID
CelanHandleInterrupt(
IN NDIS_HANDLE MiniportAdapterContext
)
/*++
Routine Description:
This is the defered processing routine for interrupts. It
reads from the Interrupt Status Register any outstanding
interrupts and handles them.
Arguments:
MiniportAdapterContext - a handle to the adapter block.
Return Value:
NONE.
--*/
{
//
// The adapter to process
//
PCELAN_ADAPTER Adapter = ((PCELAN_ADAPTER)MiniportAdapterContext);
//
// The most recent port value read.
//
UCHAR InterruptStatus;
unsigned short PHYINTERRUPTS;
unsigned short PHYSTATUS;
WORD Bank;
Bank = ReadWord(BANK_SELECT);
// RETAILMSG(1, (TEXT("CELAN:CelanHandleInterrupt\r\n")));
//
// Get the interrupt bits and save them.
//
CardGetInterruptStatus(Adapter, &InterruptStatus);
// DEBUGMSG(ZONE_INTR, (TEXT("CELAN:Interrupt status = %02x \r\n"),InterruptStatus));
PHYINTERRUPTS = READ_PHY(18);
if(InterruptStatus & MD_INT) {
// Acknowledge the interrupt
SelectBank(BANK2);
WriteWord(INT_REG,ReadWord(INT_REG) & (0xff00 | MD_INT));
PHYSTATUS = READ_PHY(5);
if( PHYSTATUS & 0x0100) {
RETAILMSG(1,(TEXT("100Base-TX Full Duplex capable.\r\n")));
}
else if( PHYSTATUS & 0x0080) {
RETAILMSG(1,(TEXT("100Base-TX Half Duplex capable.\r\n")));
}
else if( PHYSTATUS & 0x0040) {
RETAILMSG(1,(TEXT("10Base-T Full Duplex capable.\r\n")));
}
else if( PHYSTATUS & 0x0020) {
RETAILMSG(1,(TEXT("10Base-T Half Duplex capable.\r\n")));
}
}
if(InterruptStatus & OVRN_INT) {
Adapter->MissedPackets++;
DEBUGMSG(ZONE_ERROR, (TEXT("CELAN:RX over RUN\r\n")));
// Disable Receive
SelectBank(BANK0);
WriteWord(RCR,(Adapter->NicReceiveConfig)&~RCR_ENABLE);
// Acknowledge the interrupt
SelectBank(BANK2);
WriteWord(INT_REG,ReadWord(INT_REG) & (0xff00 | OVRN_INT));
}
while (InterruptStatus & TX_INT) {
SelectBank(BANK2);
// Write the TX Done Packet Number to Packet Num Reg
WriteWord(PNR_ARR,ReadWord(FIFO_PORTS));
// PrintRegs;
// Read the first word of the packet
WriteWord(POINTER,PTR_READ);
if (ReadWord(DATA_1)&TS_SUCCESS) {
DEBUGMSG(ZONE_XMIT, (TEXT("Trasimission succeeded. %04x\r\n"),ReadWord(DATA_1)));
} else {
DEBUGMSG(ZONE_ERROR, (TEXT("Trasimision not succeeded. %04x\r\n"),ReadWord(DATA_1)));
Adapter->FramesXmitBad++;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -