📄 ndis4cs8950.c
字号:
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 + -