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 + -
显示快捷键?