⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 interrup.c

📁 Wince4.2 BSP for SH4 engineering development board
💻 C
📖 第 1 页 / 共 2 页
字号:

//
//      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 + -