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

📄 ndis4cs8950.c

📁 EP9315开发板的Wince6.0的BSP包文件
💻 C
📖 第 1 页 / 共 3 页
字号:
            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 != TRUE) {
                  Status=NDIS_STATUS_FAILURE;
               } /* endif */
            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 */
        

    //
    //Test for failure and cleanup as a function of how many steps were successful
    //
    
    if (Status!=NDIS_STATUS_SUCCESS) {
       for (step-=1; step>0; step--) {
        switch (step) {
           case 17:
              NdisMDeregisterAdapterShutdownHandler(MiniportAdapterHandle);
           break;
           case 16:
               /* do nothing */
            break;
           case 15:
               /* do nothing */
           break;
           case 14:
        // Release the contiguous physical memory used for DMA Tx & Rx Queues.
           DMARelMem(pChip);
           break;
           case 13:
             NdisMDeregisterInterrupt( &(pData->InterruptObject) );
           break;

           case 4:
              VominiShutdown( pOSD );
           break;
           case 2:
              NdisFreeMemory( (PVOID)pChip, (UINT)sizeof(CHIP), 0);

           break;
           default:
           break;
         } /* endswitch */
       } /* endfor */
    } /* endif */
     
    return Status;
}


//****************************************************************************
// 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.
//
#pragma NDIS_PAGABLE_FUNCTION(CrystalHalt)
extern void CrystalHalt
(
    IN NDIS_HANDLE MiniportAdapterContext
)
{

   
    PVOID pOSD;
    VPM_SetupMiniContext;
    pvMini_Context->CurrentState = NdisHardwareStatusClosing;

    //
    // Disable Chip Interrupts
    //
    VchipDisableInterrupts( pChip );

    //
    // Call NdisDeregisterAdapterShutdownHandler
    //
    NdisMDeregisterAdapterShutdownHandler
    (
        MiniportAdapterHandle
    );

    //
    // Reset/Shutdown Chip
    //
    VchipShutdown( pChip );

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

    //
    // Release the contiguous physical memory used for DMA Tx & Rx Queues.
    //
    DMARelMem(pChip);

    //
    // 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);

    return;
}


//****************************************************************************
// CrystalShutdown
//****************************************************************************
// 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;

    pvMini_Context->CurrentState = NdisHardwareStatusClosing;
    VchipReset( pChip );
    pvMini_Context->CurrentState = NdisHardwareStatusNotReady;
    
    return;
}


//****************************************************************************
// CrystalReset - TODO TODO TODO
//****************************************************************************
// 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
)
{
    VPM_SetupMiniContext;
	//NKDbgPrintfW(L"*** CrystalReset entered ******* \r\n");

	VchipSoftReset(pChip);
	//VchipStartup(pChip);
	*AddressingReset = TRUE;

	//StartupPHY( pChip );
	//Sleep(10);

	//NKDbgPrintfW(L"*** CrystalReset \r\n");
    return NDIS_STATUS_SUCCESS;
}

//****************************************************************************
// CrystalCheckForHang
//****************************************************************************
// 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
)
{
    // DbgBreakPoint();
    VPM_SetupMiniContext;
    
    return(FALSE);
}


//****************************************************************************
// VpsMediaChanged
//****************************************************************************
// 
// 
//

void VpsMediaChanged( PCHIP pChip )
{
   NDIS_STATUS Status;
   PNDIS_PACKET Packet;
   PTXQUEUEELEMENT pTxQueueElem;
   WORD  QueuedPackets;
   int i;

   VPM_SetupMiniContextFromPchip;

   /* 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
      /* Make sure that all outstanding XMITS get returned on RESET !!! */

      for (i=0,QueuedPackets=pvMini_Context->XmitQueueDepth;
           i<QueuedPackets;
           i++,pvMini_Context->XmitQueueDepth--)
      {

         Packet = pvMini_Context->TxQueueHead;

         if (Packet == NULL) {
            break;
         } /* endif */

         pTxQueueElem = (PVOID)&(pvMini_Context->TxQueueHead->MiniportReserved);
         pvMini_Context->TxQueueHead = pTxQueueElem->NextPacket;

 
         NdisMSendComplete(MiniportAdapterHandle,
                           Packet,
                           NDIS_STATUS_SUCCESS
                           );

      } /* endfor */
   }
   else  /* The cable was just connected */
   {
      Status = NDIS_STATUS_MEDIA_CONNECT;
      pvMini_Context->CableConnected = NdisMediaStateConnected;
   }

   if ( pvMini_Context->CurrentState != NdisHardwareStatusInitializing )
   {
      NdisMIndicateStatus( MiniportAdapterHandle, Status, NULL, 0 );
      NdisMIndicateStatusComplete( MiniportAdapterHandle );
   }
}

//****************************************************************************
// CrystalQueryInformation
//****************************************************************************
// Routine Description:
// 
//     CrystalQueryInformation handles a query operation for a
//     single OID.
//
// Arguments:
//
//     MiniportAdapterContext - Context registered with the wrapper, really
//         a pointer to the VP context.
//
//     Oid - The OID of the query.
//
//     InformationBuffer - Holds the result of the query.
//
//     InformationBufferLength - The length of InformationBuffer.
//
//     BytesWritten - If the call is successful, returns the number
//         of bytes written to InformationBuffer.
//
//     BytesNeeded - If there is not enough room in InformationBuffer
//         to satisfy the OID, returns the amount of storage needed.
//
// Return Value:
//
//     NDIS_STATUS_SUCCESS
//     NDIS_STATUS_PENDING
//     NDIS_STATUS_INVALID_LENGTH
//     NDIS_STATUS_INVALID_OID
//
extern NDIS_STATUS CrystalQueryInformation
(
    IN NDIS_HANDLE MiniportAdapterContext,
    IN NDIS_OID Oid,
    IN PVOID InformationBuffer,
    IN ULONG InformationBufferLength,
    OUT PULONG BytesWritten,
    OUT PULONG BytesNeeded
)
{
   PVOID       SourceBuffer;
   ULONG       SourceBufferLength;
   ULONG       GenericUlong;
   USHORT      GenericUshort;
   UCHAR       VendorId[4];

   UCHAR IsaDescriptor[] = VENDOR_PRODUCT_NAME_STR;

   NDIS_OID CrystalGlobalSupportedOids[] = {
      OID_GEN_SUPPORTED_LIST,
      OID_GEN_HARDWARE_STATUS,
      OID_GEN_MEDIA_SUPPORTED,
      OID_GEN_MEDIA_IN_USE,
      OID_GEN_MAXIMUM_LOOKAHEAD,
      OID_GEN_MAXIMUM_FRAME_SIZE,
      OID_GEN_LINK_SPEED,
      OID_GEN_TRANSMIT_BUFFER_SPACE,
      OID_GEN_RECEIVE_BUFFER_SPACE,
      OID_GEN_TRANSMIT_BLOCK_SIZE,
      OID_GEN_RECEIVE_BLOCK_SIZE,
      OID_GEN_VENDOR_ID,
      OID_GEN_VENDOR_DESCRIPTION,
      OID_GEN_VENDOR_DRIVER_VERSION,
      OID_GEN_CURRENT_PACKET_FILTER,
      OID_GEN_CURRENT_LOOKAHEAD,
      OID_GEN_DRIVER_VERSION,
      OID_GEN_MAXIMUM_TOTAL_SIZE,
      OID_GEN_PROTOCOL_OPTIONS,
      OID_GEN_MAC_OPTIONS,
      OID_GEN_MEDIA_CONNECT_STATUS,     // NEW
      OID_GEN_MAXIMUM_SEND_PACKETS,     // NEW
      OID_GEN_XMIT_OK,
      OID_GEN_RCV_OK,
      OID_GEN_XMIT_ERROR,
      OID_GEN_RCV_ERROR,
      OID_GEN_RCV_NO_BUFFER,
//    OID_GEN_DIRECTED_BYTES_XMIT,
//    OID_GEN_DIRECTED_FRAMES_XMIT,
//    OID_GEN_MULTICAST_BYTES_XMIT,
//    OID_GEN_MULTICAST_FRAMES_XMIT,
//    OID_GEN_BROADCAST_BYTES_XMIT,
//    OID_GEN_BROADCAST_FRAMES_XMIT,
//    OID_GEN_DIRECTED_BYTES_RCV,
//    OID_GEN_DIRECTED_FRAMES_RCV,
//    OID_GEN_MULTICAST_BYTES_RCV,
//    OID_GEN_MULTICAST_FRAMES_RCV,
//    OID_GEN_BROADCAST_BYTES_RCV,
//    OID_GEN_BROADCAST_FRAMES_RCV,
      OID_GEN_RCV_CRC_ERROR,
      OID_GEN_TRANSMIT_QUEUE_LENGTH,
      OID_802_3_PERMANENT_ADDRESS,
      OID_802_3_CURRENT_ADDRESS,
      OID_802_3_MULTICAST_LIST,
      OID_802_3_MAXIMUM_LIST_SIZE,
      OID_802_3_MAC_OPTIONS,            // NEW
      OID_802_3_RCV_ERROR_ALIGNMENT,
      OID_802_3_XMIT_ONE_COLLISION,
      OID_802_3_XMIT_MORE_COLLISIONS,
//    OID_802_3_XMIT_DEFERRED,
      OID_802_3_XMIT_MAX_COLLISIONS,
      OID_802_3_RCV_OVERRUN,
      OID_802_3_XMIT_UNDERRUN,
//    OID_802_3_XMIT_HEARTBEAT_FAILURE,
      OID_802_3_XMIT_TIMES_CRS_LOST,
//    OID_802_3_XMIT_LATE_COLLISIONS,
   };

    VPM_SetupMiniContext;
    //
    // Initialize these once, since this is the majority
    // of cases.
    //
    SourceBuffer       = &GenericUlong;
    SourceBufferLength = sizeof(ULONG);
    
    switch (Oid) {
    case OID_GEN_SUPPORTED_LIST:
        SourceBuffer =  CrystalGlobalSupportedOids;
        SourceBufferLength = sizeof(CrystalGlobalSupportedOids);
        break;
    case OID_GEN_HARDWARE_STATUS:
         GenericUlong = pvMini_Context->CurrentState;
         break;
    case OID_GEN_MEDIA_SUPPORTED:
    case OID_GEN_MEDIA_IN_USE:
         GenericUlong = NdisMedium802_3;
         break;
    case OID_GEN_MAXIMUM_LOOKAHEAD:
         GenericUlong = VP_MAX_FRAMESIZE - VP_HEADERSIZE;
        break;
    case OID_GEN_MAXIMUM_FRAME_SIZE:
         GenericUlong = VP_MAX_FRAMESIZE - VP_HEADERSIZE; // leave off Header
         break;
    case OID_GEN_LINK_SPEED:
         if (pChip->Config.DetectedMediaSpeed==MEDIA_NONE) {
            GenericUlong = 0;
         } else {
            GenericUlong = 10000 * pChip->Config.DetectedMediaSpeed;
         } /* endif */
         break;
    case OID_GEN_TRANSMIT_BUFFER_SPACE:
         GenericUlong = pChip->Config.MaxTxCount * VP_MAX_FRAMESIZE;

⌨️ 快捷键说明

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