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

📄 smsc100fd.c

📁 smsc公司的网络芯片smsc100fd的wince源码。
💻 C
📖 第 1 页 / 共 5 页
字号:
    //
	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 + -