📄 smsc100fd.c
字号:
//
NdisMSetAttributes (pAdapter->hMiniportAdapterHandle, (NDIS_HANDLE)pAdapter, FALSE, NdisInterfaceInternal);
//
// Initialize the card.
//
DEBUGMSG (ZONE_INIT, (TEXT (" SMSC100FD: RegisterAdapter: Calling CardInitialize\r\n")));
if (!CardInitialize (pAdapter))
{
//
// Card seems to have failed.
//
DEBUGMSG (ZONE_INIT, (TEXT ("!SMSC100FD: RegisterAdapter: CardInitialize -- Failed\r\n")));
NdisWriteErrorLogEntry (pAdapter->hMiniportAdapterHandle, NDIS_ERROR_CODE_ADAPTER_NOT_FOUND, 0);
status = NDIS_STATUS_ADAPTER_NOT_FOUND;
return (status);
}
DEBUGMSG (ZONE_INIT, (TEXT (" SMSC100FD: RegisterAdapter: CardInitialize -- Success\r\n")));
//
// Initialize the receive variables.
//
pAdapter->usNicReceiveConfig = RCR_ENABLE | RCR_STRIP_CRC;
//
// Read the Ethernet address out of the EEPROM.
//
CardReadEthernetAddress (pAdapter);
//
// Now initialize the NIC.
//
pAdapter->usNicInterruptMask = IM_TX_INT | IM_RCV_INT | IM_RX_OVRN_INT | IM_EPH_INT;
//
// Link us on to the chain of adapters for this driver.
//
pAdapter->NextAdapter = gSmsc100FdMiniportBlock.AdapterQueue;
gSmsc100FdMiniportBlock.AdapterQueue = pAdapter;
//
// Setup the card based on the initialization information
//
DEBUGMSG (ZONE_INIT, (TEXT (" SMSC100FD: RegisterAdapter CardSetup\r\n")));
if (CardSetup (pAdapter))
{
//
// Initialize the interrupt.
//
status = NdisMRegisterInterrupt (&pAdapter->Interrupt, pAdapter->hMiniportAdapterHandle, pAdapter->ucInterruptNumber, pAdapter->ucInterruptNumber, FALSE, FALSE, NdisInterruptLatched);
if (status == NDIS_STATUS_SUCCESS)
{
DEBUGMSG (ZONE_INIT, (TEXT (" SMSC100FD: RegisterAdapter Interrupt Connected\r\n")));
// register a shutdown handler for this card
NdisMRegisterAdapterShutdownHandler (pAdapter->hMiniportAdapterHandle, pAdapter, Smsc100FdShutdown);
//
// Start up the adapter.
//
CardStart (pAdapter);
//
// Initialization completed successfully.
//
DEBUGMSG (ZONE_INIT, (TEXT (" SMSC100FD: RegisterAdapter OK\r\n")));
return (NDIS_STATUS_SUCCESS);
}
else
DEBUGMSG (ZONE_INIT, (TEXT ("!SMSC100FD: RegisterAdapter NdisRegisterInterrupt Failed\r\n")));
NdisWriteErrorLogEntry (pAdapter->hMiniportAdapterHandle, NDIS_ERROR_CODE_INTERRUPT_CONNECT, 0);
}
//
// The NIC could not be written to.
//
NdisWriteErrorLogEntry (pAdapter->hMiniportAdapterHandle, NDIS_ERROR_CODE_ADAPTER_NOT_FOUND, 0);
DEBUGMSG (ZONE_INIT, (TEXT ("!SMSC100FD: RegisterAdapter: CardSetup -- Failed\r\n")));
status = NDIS_STATUS_ADAPTER_NOT_FOUND;
//
// Code to unwind what has already been set up when a part of
// initialization fails, which is jumped into at various
// points based on where the failure occured. Jumping to
// a higher-numbered failure point will execute the code
// for that block and all lower-numbered ones.
//
//
// Take the Adapter out of the AdapterQueue.
//
if (gSmsc100FdMiniportBlock.AdapterQueue == pAdapter)
gSmsc100FdMiniportBlock.AdapterQueue = pAdapter->NextAdapter;
else
{
PSMSC100FD_ADAPTER TmpAdapter = gSmsc100FdMiniportBlock.AdapterQueue;
while (TmpAdapter->NextAdapter != pAdapter)
TmpAdapter = TmpAdapter->NextAdapter;
TmpAdapter->NextAdapter = TmpAdapter->NextAdapter->NextAdapter;
}
DEBUGMSG (ZONE_INIT, (TEXT ("-SMSC100FD: RegisterAdapter\r\n")));
return (status);
}
/*
* Description:
* Smsc100FdShutdown is called to shut down the adapter. Unblock any threads and terminate any loops.
*
* Arguments:
* hMiniportAdapterContext - The context value that the Miniport returned from Smsc100FdInitialize.
*
* Return Value:
* None.
*/
VOID
Smsc100FdShutdown (IN NDIS_HANDLE hMiniportAdapterContext)
{
PSMSC100FD_ADAPTER pAdapter = (PSMSC100FD_ADAPTER)(hMiniportAdapterContext);
//
// Shut down the chip.
//
CardStop (pAdapter);
}
/*
* Description:
* Disable interrupts on the adaptor card.
*
* Arguments:
* pAdapter - Pointer to the pAdapter object.
*
* Return Value:
* None.
*/
#pragma NDIS_PAGEABLE_FUNCTION (CardBlockInterrupts)
VOID
CardBlockInterrupts (IN PSMSC100FD_ADAPTER pAdapter)
{
WORD wBank;
DEBUGMSG (ZONE_INTR, (TEXT ("SMSC100FD: CardBlockInterrupt\r\n")));
wBank = ReadWord (pAdapter,BANK_SELECT);
SelectBank (pAdapter,BANK2);
WriteWord (pAdapter,INTERRUPT_REGISTER, 0);
SelectBank (pAdapter,wBank);
}
/*
* Description:
* Enable interrupts on the adaptor card.
*
* Arguments:
* pAdapter - Pointer to the pAdapter object.
*
* Return Value:
* None.
*/
#pragma NDIS_PAGEABLE_FUNCTION (CardUnblockInterrupts)
VOID
CardUnblockInterrupts (IN PSMSC100FD_ADAPTER pAdapter)
{
WORD wBank;
DEBUGMSG (ZONE_INTR, (TEXT ("SMSC100FD: CardUnblockInterrupt: InterruptMask %04x\r\n"), pAdapter->usNicInterruptMask));
wBank = ReadWord (pAdapter,BANK_SELECT);
SelectBank (pAdapter,BANK2);
WriteWord (pAdapter,INTERRUPT_REGISTER, pAdapter->usNicInterruptMask);
SelectBank (pAdapter,wBank);
}
/*
* Description:
* Stops the card.
*
* Arguments:
* pAdapter - Pointer to the adapter structure.
*
* Return Value:
* None.
*/
VOID
CardStop (IN PSMSC100FD_ADAPTER pAdapter)
{
DEBUGMSG (ZONE_FUNCTION, (TEXT ("+SMSC100FD: CardStop\r\n")));
SelectBank (pAdapter,BANK0);
WriteWord (pAdapter,RCR, 0);
DEBUGMSG (ZONE_FUNCTION, (TEXT ("-SMSC100FD: CardStop\r\n")));
}
/*
* Description:
* Resets the card.
*
* Arguments:
* pAdapter - Pointer to the adapter structure.
*
* Return Value:
* TRUE if everything is OK.
*/
BOOLEAN
CardReset (IN PSMSC100FD_ADAPTER pAdapter)
{
WORD wRcr;
DEBUGMSG (ZONE_FUNCTION, (TEXT ("+SMSC100FD: CardReset\r\n")));
//
// Stop the chip
//
CardStop (pAdapter);
//
// Write to and read from RCR to make sure it is there.
//
DEBUGMSG (ZONE_INIT, (TEXT ("SMSC100FD: Reset SMSC91C100FD\r\n")));
SelectBank (pAdapter,BANK0);
WriteWord (pAdapter,RCR, RCR_SOFTRESET);
Sleep (10);
wRcr = ReadWord (pAdapter,RCR);
if ((wRcr & RCR_SOFTRESET) != RCR_SOFTRESET)
{
DEBUGMSG (ZONE_ERROR, (TEXT ("SMSC100FD: CardReset - RCR = 0x%x, Expected 0x%x\r\n"), wRcr, (RCR_SOFTRESET)));
return (FALSE);
}
WriteWord (pAdapter,RCR, 0);
Sleep (10);
//
// Restart the chip
//
CardSetup (pAdapter);
CardStart (pAdapter);
DEBUGMSG (ZONE_FUNCTION, (TEXT ("-SMSC100FD: CardReset\r\n")));
return (TRUE);
}
/*
* Description:
* Initializes the card into a running state.
*
* Arguments:
* pAdapter - Pointer to the adapter structure.
*
* Return Value:
* TRUE if everything is OK.
*/
#pragma NDIS_PAGEABLE_FUNCTION(CardInitialize)
BOOLEAN
CardInitialize (IN PSMSC100FD_ADAPTER pAdapter)
{
UINT uiDelay;
WORD wRcr;
// PWORD pPcbRevisionRegisterBase;
// PWORD pSw1RegisterBase;
// ULONG ulSw1PhysicalRegisterBase;
// ULONG ulSw1PhysicalRegisterSize;
// USHORT usPcbRev;
// UCHAR ucSw1;
BOOL bResult = FALSE;
DEBUGMSG (ZONE_INIT, (TEXT ("+SMSC100FD: CardInitialize\r\n")));
// NKDbgPrintfW (L"+SMSC100FD: CardInitialize\r\n");
//
// VirtualAlloc Register Area SMSC100FD register access.
// Page Aliegnment
if (pAdapter==NULL)
return FALSE;
pAdapter->pVirtualRegisterBase = (PBYTE)VirtualAlloc (0, PAGE_SIZE, MEM_RESERVE,PAGE_NOACCESS);
DEBUGMSG (ZONE_INIT, (TEXT ("SMSC100FD: VirtualAlloc at 0x%x.\r\n"), pAdapter->pVirtualRegisterBase));
if (pAdapter->pVirtualRegisterBase==NULL)
return FALSE;
bResult= VirtualCopy ((PVOID)pAdapter->pVirtualRegisterBase, (PVOID)(pAdapter->ulIoBaseAddress & (~(PAGE_SIZE-1))), PAGE_SIZE, PAGE_READWRITE | PAGE_NOCACHE);
pAdapter->pVirtualRegisterBase += (pAdapter->ulIoBaseAddress & (PAGE_SIZE-1));
//page alignment for ETHERNET_BASE.
if (bResult)
{
DEBUGMSG (ZONE_INIT, (TEXT ("SMSC100FD: InitialCard at 0x%x.\r\n"), pAdapter->pVirtualRegisterBase));
// Reset the SMSC91C100FD
SelectBank (pAdapter,BANK0);
WriteWord (pAdapter,RCR, RCR_SOFTRESET);
Sleep (10);
wRcr = ReadWord (pAdapter,RCR);
if ((wRcr & RCR_SOFTRESET) != RCR_SOFTRESET)
{
DEBUGMSG (ZONE_ERROR, (TEXT ("SMSC100FD: CardInitialize - RCR = 0x%x, Expected 0x%x\r\n"), wRcr, (RCR_SOFTRESET)));
bResult = FALSE;
}
else
{
WriteWord (pAdapter,RCR, 0);
Sleep (100);
// Initialize the control register
SelectBank (pAdapter,BANK1);
WriteWord (pAdapter,CONTROL, CTL_TE_ENABLE | CTL_LE_ENABLE);
// Reset MMU
SelectBank (pAdapter,BANK2);
WriteWord (pAdapter,MMU_CMD, MC_RESET);
Sleep(100);
for (uiDelay = 0; uiDelay < MMU_WAIT_LOOP*10; uiDelay++)
{
if (!(ReadWord (pAdapter,MMU_CMD) & MC_BUSY))
break;
}
if (uiDelay == MMU_WAIT_LOOP)
{
DEBUGMSG (ZONE_INIT, (TEXT ("-SMSC100FD: CardInitialize: MMU reset failed., MMU_CMD = 0x%x\r\n"), ReadWord(pAdapter,MMU_CMD)));
bResult = FALSE;
}
else
{
// Initialize the memory configuration register
SelectBank (pAdapter,BANK0);
WriteWord (pAdapter,MCR, 4); // Reserve 4x512 Bytes for TX
DEBUGMSG (ZONE_INIT, (TEXT ("-SMSC100FD: CardInitialize: Success\r\n")));
return (TRUE);
}
}
}
else
{
DEBUGMSG (ZONE_INIT, (TEXT ("SMSC100FD: VirtualCopy ETHERNET_BASE failed.\r\n")));
bResult = FALSE;
}
if (pAdapter->pVirtualRegisterBase) {
VirtualFree ((PVOID)(pAdapter->pVirtualRegisterBase-(pAdapter->ulIoBaseAddress & (PAGE_SIZE-1))), 0, MEM_RELEASE);
pAdapter->pVirtualRegisterBase = NULL;
}
return (bResult);
}
/*
* Description:
* Reads in the Ethernet address from the SMSC91C100FD.
*
* Arguments:
* pAdapter - Pointer to the adapter structure.
*
* Return Value:
* None.
*/
#pragma NDIS_PAGEABLE_FUNCTION(CardReadEthernetAddress)
VOID
CardReadEthernetAddress (IN PSMSC100FD_ADAPTER pAdapter)
{
// Read the MAC address registers
SelectBank (pAdapter,BANK1);
pAdapter->ucStationAddress[0] = ReadWord(pAdapter,ADDR0) & 0xFF;
pAdapter->ucStationAddress[1] = ReadWord(pAdapter,ADDR0) >> 8;
pAdapter->ucStationAddress[2] = ReadWord(pAdapter,ADDR1) & 0xFF;
pAdapter->ucStationAddress[3] = ReadWord(pAdapter,ADDR1) >> 8;
pAdapter->ucStationAddress[4] = ReadWord(pAdapter,ADDR2) & 0xFF;
pAdapter->ucStationAddress[5] = ReadWord(pAdapter,ADDR2) >> 8;
RETAILMSG (1, (TEXT ("SMSC100FD: StationAddress [ %02x-%02x-%02x-%02x-%02x-%02x ]\r\n"), pAdapter->ucStationAddress[0], pAdapter->ucStationAddress[1], pAdapter->ucStationAddress[2], pAdapter->ucStationAddress[3], pAdapter->ucStationAddress[4], pAdapter->ucStationAddress[5]));
}
/*
* Description:
* Sets up the SMSC91C100FD.
*
* Arguments:
* pAdapter - Pointer to the adapter structure.
*
* Return Value:
* TRUE if successful.
*/
BOOLEAN
CardSetup (IN PSMSC100FD_ADAPTER pAdapter)
{
UINT uiIndex;
WORD wRcr;
UINT uiDelay;
USHORT usPhy;
DEBUGMSG (ZONE_FUNCTION, (TEXT ("+SMSC100FD: CardSetup\r\n")));
SelectBank (pAdapter,BANK0);
WriteWord (pAdapter,RCR, RCR_SOFTRESET);
Sleep (10);
wRcr = ReadWord (pAdapter,RCR);
if ((wRcr & RCR_SOFTRESET) != RCR_SOFTRESET)
{
DEBUGMSG (ZONE_ERROR, (TEXT ("SMSC100FD: CardSetup: CardReset - RCR = 0x%x, Expected 0x%x\r\n"), wRcr, (RCR_SOFTRESET)));
return (FALSE);
}
WriteWord (pAdapter,RCR, 0);
Sleep (10);
// Initialize the control register
DEBUGMSG (ZONE_INIT, (TEXT ("SMSC100FD: CardSetup: Initializing Control register\r\n")));
SelectBank (pAdapter,BANK1);
WriteWord (pAdapter,CONTROL, CTL_AUTO_RELEASE | CTL_ONE_1 | CTL_TE_ENABLE | CTL_ONE_2 | CTL_LE_ENABLE);
// Initialize the configuration register
SelectBank (pAdapter,BANK1);
WriteWord (pAdapter,CONFIG, (UINT16)(ReadWord (pAdapter,CONFIG) | CFG_MII_SELECT) );
DEBUGMSG (ZONE_INIT, (TEXT ("SMSC100FD: CardSetup: CONFIG register reads back 0x%x\r\n"), ReadWord(pAdapter,CONFIG) ));
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -