cs8900a.c

来自「PXA255/270平台的 CS8900网卡驱动程序」· C语言 代码 · 共 741 行 · 第 1/2 页

C
741
字号
//---------------------------------------------------------------------------
//
//  Copyright (C) 1996-2003. Unpublished Work of Cirrus Logic Corp.
//  All Rights Reserved.
//
//  THIS WORK IS AN UNPUBLISHED WORK AND CONTAINS CONFIDENTIAL,
//  PROPRIETARY AND TRADE SECRET INFORMATION OF CRYSTAL SEMICONDUCTOR.
//  ACCESS TO THIS WORK IS RESTRICTED TO (I) CRYSTAL SEMICONDUCTOR EMPLOYEES
//  WHO HAVE A NEED TO KNOW TO PERFORM TASKS WITHIN THE SCOPE OF THEIR
//  ASSIGNMENTS  AND (II) ENTITIES OTHER THAN CRYSTAL SEMICONDUCTOR WHO
//  HAVE ENTERED INTO  APPROPRIATE LICENSE AGREEMENTS.  NO PART OF THIS
//  WORK MAY BE USED, PRACTICED, PERFORMED, COPIED, DISTRIBUTED, REVISED,
//  MODIFIED, TRANSLATED, ABRIDGED, CONDENSED, EXPANDED, COLLECTED,
//  COMPILED,LINKED,RECAST, TRANSFORMED, ADAPTED IN ANY FORM OR BY ANY
//  MEANS,MANUAL, MECHANICAL, CHEMICAL, ELECTRICAL, ELECTRONIC, OPTICAL,
//  BIOLOGICAL, OR OTHERWISE WITHOUT THE PRIOR WRITTEN PERMISSION AND
//  CONSENT OF CRYSTAL SEMICONDUCTOR . ANY USE OR EXPLOITATION OF THIS WORK
//  WITHOUT THE PRIOR WRITTEN CONSENT OF CRYSTAL SEMICONDUCTOR  COULD
//  SUBJECT THE PERPETRATOR TO CRIMINAL AND CIVIL LIABILITY.
//
//---------------------------------------------------------------------------

#include "cs8900a.h"
#include "cshrd.h"
#include <bsp.h>
#include <oal_intr.h>
#include "bsp_cfg.h"

//#include "bvd1bd.h"
//#include "oalintr.h"
//#include "Oemioctl.h"

#if __DBG
#include "version.h"
#endif


BYTE        NDISVerMajor;
BYTE        NDISVerMinor;

HANDLE  gCS8900Thread;

volatile CS8900_REGS *v_pCS8900Regs;
//****************************************************************************
//
// Local type definitions and declarations
//
//****************************************************************************

typedef enum 
{
    CrystalHardwareOk,
    CrystalHardwareChecksum,
    CrystalHardwareConfig
} CRYSTAL_HARDWARE_STATUS;

//****************************************************************************
//
// Static variables declrations
//
//****************************************************************************

// CRYSTAL_DRIVER CrystalDriver;

//
// This variable is used to control debug output.
//

#if DBG
   INT CrystalDbg = 0;
#endif

extern PVPMINIPDATA gMini_Context;

//****************************************************************************
//
// Function prototypes for functions local to this file
//
//****************************************************************************


#pragma NDIS_INIT_FUNCTION(DriverEntry)

/*++

Routine Description:

    This is the primary initialization routine for the driver.
    It is simply responsible for the intializing the wrapper and registering
    the MAC.  It then calls a system and architecture specific routine that
    will initialize and register each adapter.

Arguments:

    DriverObject - Pointer to driver object created by the system.

Return Value:

    The status of the operation.

--*/

NTSTATUS
DriverEntry(
    IN PDRIVER_OBJECT DriverObject,
    IN PUNICODE_STRING RegistryPath
    )
{

    //
    // Receives the status of the NdisRegisterMac operation.
    //
    NDIS_STATUS Status;

    NDIS_HANDLE CrystalWrapperHandle;
    #define BUS_TYPE NdisInterfaceIsa
    #define BUS_MASTER FALSE
    NDIS_MINIPORT_CHARACTERISTICS CrystalChar;
    NdisZeroMemory( &CrystalChar, sizeof(CrystalChar));

    //
    // Initialize the wrapper.
    //
    PRINTDEBUGMSG(1, (TEXT("==>CS8900:DriverEntry\r\n")));   
    RETAILMSG(1, (TEXT("dlp#: ==>CS8900:DriverEntry\r\n")));

    NdisMInitializeWrapper(
                &CrystalWrapperHandle,
                DriverObject,
                RegistryPath,
                NULL
                );


//    CrystalDriver.WrapperHandle = CrystalWrapperHandle;

    //
    // Initialize the miniport characteristics for the call to
    // NdisMRegisterMiniport.
    //
    NDISVerMajor = CRYSTAL_NDIS_MAJOR_VERSION;
    NDISVerMinor = CRYSTAL_NDIS_MINOR_VERSION;
    CrystalChar.MajorNdisVersion        = CRYSTAL_NDIS_MAJOR_VERSION;
    CrystalChar.MinorNdisVersion        = CRYSTAL_NDIS_MINOR_VERSION;
    CrystalChar.InitializeHandler       = CrystalInitialize;
    CrystalChar.CheckForHangHandler     = CrystalCheckForHang;
    CrystalChar.DisableInterruptHandler = CrystalDisableInterrupt;
    CrystalChar.EnableInterruptHandler  = CrystalEnableInterrupt;
    CrystalChar.HaltHandler             = CrystalHalt;
    CrystalChar.HandleInterruptHandler  = CrystalHandleInterrupt;
    CrystalChar.ISRHandler              = CrystalInterruptService;
    CrystalChar.QueryInformationHandler = CrystalQueryInformation;
    CrystalChar.ReconfigureHandler      = NULL;
    CrystalChar.ResetHandler            = CrystalReset;
    CrystalChar.SendHandler             = CrystalSend;
    CrystalChar.SetInformationHandler   = CrystalSetInformation;
    CrystalChar.TransferDataHandler     = CrystalTransferData;
    CrystalChar.ReturnPacketHandler     = NULL;
    CrystalChar.SendPacketsHandler      = CrystalSendPackets;
    CrystalChar.AllocateCompleteHandler = NULL;

    Status = NdisMRegisterMiniport(
                 CrystalWrapperHandle,
                 &CrystalChar,
                 sizeof(CrystalChar)
                 );

    if (Status == NDIS_STATUS_SUCCESS) 
    {
        PRINTDEBUGMSG(1, (TEXT("<==CS8900:DriverEntry SUCCESS\r\n")));   
        RETAILMSG(1, (TEXT("dlp#: <==CS8900:DriverEntry SUCCESS\r\n")));   
        return NDIS_STATUS_SUCCESS;
    }

    //
    // We can only get here if something went wrong with registering
    // the mac or *all* of the adapters.
    //

    NdisTerminateWrapper(CrystalWrapperHandle, NULL);

    PRINTDEBUGMSG(1, (TEXT("<==CS8900:DriverEntry FAILURE\r\n")));   
    RETAILMSG(1, (TEXT("dlp#: <==CS8900:DriverEntry FAILURE\r\n")));   
    return NDIS_STATUS_FAILURE;

}



#pragma NDIS_PAGABLE_FUNCTION(CrystalInitialize)

/*++

Routine Description:

    CrystalInitialize adds finds and initializes the adapter.

Arguments:

    OpenErrorStatus - Extra status bytes for opening token ring adapters.

    SelectedMediumIndex - Index of the media type chosen by the driver.

    MediumArray - Array of media types for the driver to chose from.

    MediumArraySize - Number of entries in the array.

    MiniportAdapterHandle - Handle for passing to the wrapper when
       referring to this adapter.

    ConfigurationHandle - A handle to pass to NdisOpenConfiguration.

Return Value:

    NDIS_STATUS_SUCCESS
    NDIS_STATUS_FAILURE
    NDIS_STATUS_UNSUPPORTED_MEDIA

Assumptions:

  The NDIS3 spec states that the miniport driver will not re-entered during
  CrystalInitialize().


--*/

static
NDIS_STATUS
CrystalInitialize(
    OUT PNDIS_STATUS OpenErrorStatus,
    OUT PUINT SelectedMediumIndex,
    IN PNDIS_MEDIUM MediumArray,
    IN UINT MediumArraySize,
    IN NDIS_HANDLE MiniportAdapterHandle,
    IN NDIS_HANDLE ConfigurationHandle
    )
{
    UINT i;
    NDIS_STATUS Status=NDIS_STATUS_SUCCESS;
    NDIS_HANDLE ConfigHandle;
    WORD Result;
    PVOMINIPDATA pOSD;
    PVPMINIPDATA pvMini_Context;
    PCHIP  pChip;
    PCD    pData;
    NDIS_PHYSICAL_ADDRESS Temp = NDIS_PHYSICAL_ADDRESS_CONST(-1, -1);
    int    step;

    PRINTDEBUGMSG(1, (TEXT("==>CS8900:CrystalInitialize\r\n")));

    for (step=1; step<20 && Status==NDIS_STATUS_SUCCESS; step++) 		
//    for (step=1; step<20; step++) //dlp
    {        
        PRINTDEBUGMSG(1, (TEXT("cs8900a(): step=%d\r\n"),step));
        switch (step) 
        {
        case 1:
            //
            // Search for the 802.3 media type
            //
            Status=NDIS_STATUS_UNSUPPORTED_MEDIA;
            for (i=0; i<MediumArraySize && Status!=NDIS_STATUS_SUCCESS; i++) 
            {
                if (MediumArray[i] == NdisMedium802_3) 
                {
                    *SelectedMediumIndex = i;
                    Status=NDIS_STATUS_SUCCESS;
                } /* endif */
            } /* endfor */
            break;
        case 2:
            Status = NdisAllocateMemory(
  		                  (PVOID)&pChip,
  		                  (ULONG) sizeof(CHIP),
  		                  0,
  		                  Temp
  		                  );
            
            if (Status != NDIS_STATUS_SUCCESS) 
            {
                NdisWriteErrorLogEntry(MiniportAdapterHandle,
                                       NDIS_ERROR_CODE_OUT_OF_RESOURCES,
                                       2,
                                       2,
                                       2);

                Status=NDIS_ERROR_CODE_OUT_OF_RESOURCES;
            } /* endif */
            break;
        case 3:
            //
            //zero CHIP cntl blk and set up pointers
            //
            NdisZeroMemory( pChip, sizeof(CHIP) );
            pvMini_Context        =  pChip->pPSD  = &pChip->higherdata;    
            pOSD                  =  pChip->pOSD  = &pChip->timerdata;    
            pData                 =  pChip->pData = &pChip->lowerdata;   
            //
            //setup some of the "higher" cntl blk
            //
            pvMini_Context->pChip =  pChip;
            pvMini_Context->vpMiniportAdapterHandle = MiniportAdapterHandle;
            pvMini_Context->pChip->pPSD = pvMini_Context;
            pvMini_Context->CableConnected = NdisMediaStateDisconnected;
            pvMini_Context->CurrentState = NdisHardwareStatusNotReady;

            gMini_Context = pvMini_Context;

            break;
        case 4:
            VominiStartup( pOSD, MiniportAdapterHandle ); 
            break;
        case 5:
            NdisMSetAttributes(MiniportAdapterHandle,
                               (NDIS_HANDLE)pvMini_Context,
                               BUS_MASTER,
                               BUS_TYPE);
            break;
        case 6:
            //
            // Open the configuration information.
            //
            NdisOpenConfiguration(&Status,
                                  &ConfigHandle,
                                  ConfigurationHandle);
            break;
        case 7:
            v_pCS8900Regs = VirtualAlloc(0, sizeof(CS8900_REGS), MEM_RESERVE, PAGE_NOACCESS);
            if (v_pCS8900Regs == NULL) 
            {
                PRINTDEBUGMSG (1,(TEXT("[CS8900] v_pCS8900Regs is not allocated\n\r")));
                Status = NDIS_ERROR_CODE_OUT_OF_RESOURCES;
            }
            if (!VirtualCopy((PVOID)v_pCS8900Regs, (PVOID)ETHERNET_CS8900_BASE_U_VIRTUAL, sizeof(CS8900_REGS), PAGE_READWRITE|PAGE_NOCACHE)) 
			{
                PRINTDEBUGMSG (1,(TEXT("[CS8900] v_pIOPRegs is not mapped\n\r")));
                Status = NDIS_ERROR_CODE_OUT_OF_RESOURCES;
            }

            if (Status == NDIS_ERROR_CODE_OUT_OF_RESOURCES) 
            {
                NdisWriteErrorLogEntry(MiniportAdapterHandle,
                                       NDIS_ERROR_CODE_OUT_OF_RESOURCES,
                                       2,
                                       2,
                                       2);
                if (v_pCS8900Regs) 
                   VirtualFree((PVOID)v_pCS8900Regs, 0, MEM_RELEASE);
            } /* endif */
            break;
        case 8:
			Result = AssignedUserDefinedConfig(pvMini_Context->pChip);
            if (Result != CHIP_SUCCESS) 
                Status=NDIS_STATUS_FAILURE;
            else
                Status=VchipFindIOBase(pChip);
		    break;
        case 9:
            /*Status = NdisMRegisterIoPortRange(&pData->PortOffset,
                                              MiniportAdapterHandle,
                                              (DWORD)pChip->Config.IOBase,
                                              (DWORD)CRYSTAL_IO_SIZE);
            if (Status != NDIS_STATUS_SUCCESS) 
            {            
                NdisWriteErrorLogEntry(MiniportAdapterHandle,
                                       NDIS_ERROR_CODE_BAD_IO_BASE_ADDRESS,
                                       2,
                                       Status,
                                       pChip->Config.IOBase);
     	    } *//* endif */
            break;

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?