cs8900a.c

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

C
741
字号
        case 10:
            break;
        case 11:
			pvMini_Context->pChip->Config.EthernetAddr.Part[0] = 0x0000;
			pvMini_Context->pChip->Config.EthernetAddr.Part[1] = 0x5533;
			pvMini_Context->pChip->Config.EthernetAddr.Part[2] = 0xab23;

            NdisMoveMemory(&pvMini_Context->PermanentNetworkAddress,
                           &pvMini_Context->pChip->Config.EthernetAddr,
                           (ULONG) ETH_LENGTH_OF_ADDRESS);
            break;
        case 12:
            if (GetNetworkAddress(ConfigHandle, pvMini_Context->CurrentNetworkAddress) ==
                                                                 NDIS_STATUS_SUCCESS)
		    {
                NdisMoveMemory(&pvMini_Context->pChip->Config.EthernetAddr,
                               &pvMini_Context->CurrentNetworkAddress,
                               (ULONG)ETH_LENGTH_OF_ADDRESS);
       
            } 
		    else 
            {
                NdisMoveMemory(&pvMini_Context->CurrentNetworkAddress,
                               &pvMini_Context->PermanentNetworkAddress,
                               (ULONG)ETH_LENGTH_OF_ADDRESS);
            }
            break;
        case 13:
            // Get the duplex mode from the registry
            pvMini_Context->pChip->Config.RequestedDuplexMode=DUPLEX_FULL;
		    break;
        case 14:
            NdisCloseConfiguration(ConfigHandle);
            break;
        case 15:
            pChip->Config.IntLine = SYSINTR_CS8900;
            Status = NdisMRegisterInterrupt(&(pData->InterruptObject),
                                            MiniportAdapterHandle,
                                            (UINT)pvMini_Context->pChip->Config.IntLine,
                                            (UINT)pvMini_Context->pChip->Config.IntLine,
                                            TRUE,   // Installable ISR: False
                                            FALSE,  // Shared Interrupt: False
                                            (NDIS_INTERRUPT_MODE)NdisInterruptLatched // Level or Edge
                                            );

            if (Status != NDIS_STATUS_SUCCESS) 
            {
                NdisWriteErrorLogEntry(MiniportAdapterHandle,
                                       NDIS_ERROR_CODE_INTERRUPT_CONNECT,
                                       2,
                                       Status,
                                       pvMini_Context->pChip->Config.IntLine);
            } /* endif */
            break;

        case 17:
            NdisMRegisterAdapterShutdownHandler(MiniportAdapterHandle,
                                                pvMini_Context,
                                                CrystalShutdown);

            pvMini_Context->pChip->Config.Filtering = 0;
            pvMini_Context->CurrentState = NdisHardwareStatusInitializing;
            break;
        case 18:
            Result = VchipStartup(pChip );
            if (Result != CHIP_SUCCESS) 
                Status=NDIS_STATUS_FAILURE;
            break;
        case 19:
            if ( pvMini_Context->pChip->Config.DetectedMediaType == MEDIA_NONE ) 
            {
                pvMini_Context->CableConnected = NdisMediaStateDisconnected;
            } 
            else 
            {
                pvMini_Context->CableConnected = NdisMediaStateConnected;
            } /* endif */
            pvMini_Context->CurrentState = NdisHardwareStatusReady;
            break;
      
        } /* endswitch */
    } /* endfor */

    PRINTRETAILMSG(1, (TEXT("DuplexMode=%d; IntLint=0x%x; IOBase=0x%x  Mac0=0x%04x Mac1=0x%04x Mac2=0x%04x\r\n"),
                        pvMini_Context->pChip->Config.RequestedDuplexMode,
                        pvMini_Context->pChip->Config.IntLine,
                        pvMini_Context->pChip->Config.MemoryBase,
                        pChip->Config.EthernetAddr.Part[0],
                        pChip->Config.EthernetAddr.Part[1],
                        pChip->Config.EthernetAddr.Part[2]));

    //
	//Test for failure and cleanup as a function of how many steps were successful
	//
    
    if (Status!=NDIS_STATUS_SUCCESS) 
    {
        for (step -= 2; step>0; step--) 
        {
	        PRINTDEBUGMSG(1, (TEXT("cs8900a(): Error Clean Up! step=%d\r\n"),step));
            switch (step) 
            {
 		    case 17:
                NdisMDeregisterAdapterShutdownHandler(MiniportAdapterHandle);
                break;

            case 15:
                NdisMDeregisterInterrupt( &(pData->InterruptObject) );
                break;
                
            case 9:
                NdisMDeregisterIoPortRange(MiniportAdapterHandle,
                                           pvMini_Context->pChip->Config.IOBase,
                                           pvMini_Context->pChip->Config.IOSize,
                                           pData->PortOffset);
                break;

            case 4:
                VominiShutdown( pOSD );
                break;
                
            case 2:
                NdisFreeMemory( (PVOID)pChip, (UINT)sizeof(CHIP), 0);
                break;
                
            default:
                break;
            } /* endswitch */
        } /* endfor */
    } /* endif */
#if 0	//open by dlp
    gCS8900Thread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE) CS8900DetectThread, NULL, 0, NULL);
    if ( gCS8900Thread == NULL ) 
        Status=NDIS_STATUS_FAILURE;
    else       
    {
        ThreadInfo TI;
        TI.ThreadHandle = gCS8900Thread;
        strcpy((char *)TI.ThreadName, "CS8900 CS8900DetectThread");
        KernelIoControl(IOCTL_SET_THREAD, (LPVOID)&TI, sizeof(ThreadInfo), NULL, 0, NULL);
    }
#endif
    PRINTDEBUGMSG(1, (TEXT("<==CS8900:CrystalInitialize, status = %d\r\n"), Status));	
    return Status;
}


#pragma NDIS_PAGABLE_FUNCTION(CrystalHalt)
/*++
Routine Description:
    CrystalHalt is called when the driver is to remove itself.

Arguments:
    MiniportAdapterContext - Context registered with the wrapper, really
        a pointer to the VP context.

Return Value:
    None.
--*/
extern void CrystalHalt(IN NDIS_HANDLE MiniportAdapterContext)
{
    PVOID pOSD;
    VPM_SetupMiniContext;
    pvMini_Context->CurrentState = NdisHardwareStatusClosing;

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

// Disable Chip Interrupts
    VchipDisableInterrupts( pChip );

// Call NdisDeregisterAdapterShutdownHandler
    NdisMDeregisterAdapterShutdownHandler(MiniportAdapterHandle);

// Reset/Shutdown Chip
    VchipShutdown( pChip );

    NdisMDeregisterInterrupt( &(pChip->pData->InterruptObject) );

    NdisMDeregisterIoPortRange(MiniportAdapterHandle,
                               pChip->Config.IOBase,
                               pChip->Config.IOSize,
                               pChip->pData->PortOffset);

// Free All Miniport Resources (Context, ...)
    pvMini_Context->CurrentState = NdisHardwareStatusNotReady;
// Save address of OS Data
    pOSD = pChip->pOSD;
    VominiShutdown( pOSD );

    NdisFreeMemory( (PVOID)pChip, (UINT)sizeof(CHIP), 0);
    PRINTDEBUGMSG(1, (TEXT("==>CS8900:CrystalHalt\r\n")));   

    return;
}


/*++
Routine Description:
    CrystalShutdown is called when the system is shutdown or it bugchecks.

Arguments:
    MiniportAdapterContext - Context registered with the wrapper, really
        a pointer to VP context.

Return Value:
    None.
--*/
extern void CrystalShutdown(IN NDIS_HANDLE MiniportAdapterContext)
{
    VPM_SetupMiniContext;

    PRINTDEBUGMSG(1, (TEXT("==>CS8900:CrystalShutdown\r\n")));   
    pvMini_Context->CurrentState = NdisHardwareStatusClosing;
    VchipReset( pChip );
    pvMini_Context->CurrentState = NdisHardwareStatusNotReady;
    PRINTDEBUGMSG(1, (TEXT("<==CS8900:CrystalShutdown\r\n")));   
    return;
}

/*++

Routine Description:
    The CrystalReset request instructs the driver to issue a hardware reset
    to the network adapter.  The driver also resets its software state.  See
    the description of MiniportMReset for a detailed description of this request.

Arguments:
    MiniportAdapterContext - Pointer to the VP context.
    AddressingReset - Does the adapter need the addressing information reloaded.

Return Value:
    The function value is the status of the operation.
--*/

extern NDIS_STATUS CrystalReset( OUT PBOOLEAN AddressingReset,
                                 IN NDIS_HANDLE MiniportAdapterContext)
{
    // WORD Result;
    PNDIS_PACKET Packet;
    PTRANSMIT_QUEUE_ELEMENT TxPacket;
    //PCD                     pData;
    
    VPM_SetupMiniContext;

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

    pvMini_Context->CurrentState = NdisHardwareStatusReset;
 
    /* Make sure that all outstanding XMITS get returned on RESET !!! */
   
    // Dequeue the Packet
    DEQ_PACKET(&TxPacket, pChip->pData->TransmitQueue);
    while (TxPacket!=NULL) 
    {
        Packet = CONTAINING_RECORD(TxPacket,NDIS_PACKET,MiniportReserved);	
        NdisMSendComplete(MiniportAdapterHandle,
                          Packet,
                          NDIS_STATUS_SUCCESS);
        DEQ_PACKET(&TxPacket, pChip->pData->TransmitQueue);
    } /* endwhile */

    pvMini_Context->CurrentState = NdisHardwareStatusReady;
    //CrystalHandleInterrupt(MiniportAdapterContext);
    PRINTDEBUGMSG(1, (TEXT("<==CS8900:CrystalReset\r\n")));   
    //RETAILMSG(1, (TEXT("<==CS8900:CrystalReset\r\n")));   
    return NDIS_STATUS_SUCCESS;
}

/*++
Routine Description:
    This routine checks on to see if the tranmitter is hung.

Arguments:
    MiniportAdapterContext - Really a pointer to VP context.

Return Value:
    FALSE - This routine actually does a wake up, rather than having
       the wrapper do it.
--*/
BOOLEAN CrystalCheckForHang(IN PVOID MiniportAdapterContext)
{
    // not yet implemented!
    // DbgBreakPoint();
    VPM_SetupMiniContext;

    PRINTDEBUGMSG(1, (TEXT("==>CS8900:CrystalCheckForHang\r\n")));   
    PRINTDEBUGMSG(1, (TEXT("<==CS8900:CrystalCheckForHang\r\n")));   
    return(FALSE);
}

void VpsMediaChanged( PCHIP pChip )
{
    NDIS_STATUS Status;
    PNDIS_PACKET Packet;
    PTRANSMIT_QUEUE_ELEMENT TxPacket;
   
    VPM_SetupMiniContextFromPchip;

    PRINTDEBUGMSG(1, (TEXT("==>CS8900:VpsMediaChanged\r\n")));   
    /* If the cable was just disconnected */
    if ( pChip->Config.DetectedMediaType == MEDIA_NONE )
    {
        Status = NDIS_STATUS_MEDIA_DISCONNECT;
        pvMini_Context->CableConnected = NdisMediaStateDisconnected;

        /* Make sure that all outstanding XMITS get returned on RESET !!! */

  	    // Dequeue the Packet
  	    DEQ_PACKET(&TxPacket, pChip->pData->TransmitQueue);
  	    while (TxPacket!=NULL) 
        {
            Packet = CONTAINING_RECORD(TxPacket,NDIS_PACKET,MiniportReserved);	
            NdisMSendComplete(MiniportAdapterHandle,
  	                          Packet,
  	                          NDIS_STATUS_SUCCESS);
  	       
  	        DEQ_PACKET(&TxPacket, pChip->pData->TransmitQueue);
  	    } /* endwhile */
    }
    else  /* The cable was just connected */
    {
        Status = NDIS_STATUS_MEDIA_CONNECT;
        pvMini_Context->CableConnected = NdisMediaStateConnected;
    }

#ifndef NDIS30_MINIPORT
    if ( pvMini_Context->CurrentState != NdisHardwareStatusInitializing )
    {
        NdisMIndicateStatus( MiniportAdapterHandle, Status, NULL, 0 );
        NdisMIndicateStatusComplete( MiniportAdapterHandle );
    }
#endif
    PRINTDEBUGMSG(1, (TEXT("<==CS8900:VpsMediaChanged\r\n")));  

}

WORD AssignedUserDefinedConfig(PCHIP pChip)
{
    PRINTDEBUGMSG(1, (TEXT("==>CS8900:AssignedUserDefinedConfig\r\n")));   
	/* Default Media type is 10BaseT */
	pChip->Config.RequestedMediaType = MEDIA_BASE_T;

	/* Default Duplex mode is Half Duplex */
	pChip->Config.RequestedDuplexMode = DUPLEX_FULL;

	/* Media Speed is 10MBPS*/
	pChip->Config.MediaSpeed    = 10;

    pChip->Config.BusType       = BUS_MCA;
    pChip->Config.BusSlot       = (WORD)0;
    pChip->Config.MaxTxCount    = CRYSTAL_TRANSMIT_PACKET_MAXIMUM;
    pChip->Config.Flags         = 0;
    pChip->Config.CurrentDuplexMode = DUPLEX_FULL;
    pChip->Config.DetectedMediaType = MEDIA_BASE_T;

    /* Memory mode is disabled */
    pChip->Config.MemoryBase = (DWORD)UNSPECIFIED;
    pChip->Config.MemorySize = (WORD)UNSPECIFIED;
 
    /* A boot ROM is not installed */
    pChip->Config.ROMBase = (DWORD)UNSPECIFIED;
    pChip->Config.ROMSize = (WORD)UNSPECIFIED;
    
    pChip->Config.DMALine = (BYTE)UNSPECIFIED;

    PRINTDEBUGMSG(1, (TEXT("<==CS8900:AssignedUserDefinedConfig\r\n")));   
    return CHIP_SUCCESS;

}

⌨️ 快捷键说明

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