亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? lan9118.c

?? Lan9118以太網芯片linux驅動程序
?? C
?? 第 1 頁 / 共 4 頁
字號:
/*****************************************************************************
   
Copyright (c) 2004-2005, SMSC
 
This code and information is provided as is without warranty of any kind,
either expressed or implied, including but not limited to the implied
warranties of merchantability and/or fitness for a particular purpose.
 
File name   :  lan9118.c  

Description :  st driver for the ethernet chip SMSC LAN9118.

Date            Modification                	Name        	
----            ------------                	-------				
18/02/05	Initial release V1.16		Phong Le
*****************************************************************************/

#ifndef LAN9118_SOURCE
#error LAN9118_SOURCE NOT DEFINED
#endif

#include "LAN9118.h"

static const NGubyte _date_code[]="021805";

/* global variables */
static const char driver_version [] = "SMSC Lan9118 Driver Version 1.16\n";

/* prototypes of local functions */
static void lan9118Isr(void *data);
static int lan9118Open(NGifnet * netp);
static void lan9118Start(NGifnet * netp);
static int lan9118Close(NGifnet* netp);
#ifdef _lint
static void lan9118SetMulti(const NGifnet * const netp);
#else
static void lan9118SetMulti(NGifnet * netp);
#endif
static BOOLEAN Lan_MacNotBusy(const DWORD dwLanBase);

/* 
 * WriteFifo (dwBase, dwOffset, pdwBuf, dwDwordCount)
 *	Writes 'dwDwordCount' 4-byte integers starting at address 'pdwBuf'
 *	into TX fifo at address (dwBase + dwOffset)
 */
void WriteFifo(
	const DWORD dwBase,
	const DWORD dwOffset,
	const DWORD *pdwBuf,
	DWORD dwDwordCount)
{
	volatile DWORD * pdwReg;
	pdwReg = (volatile DWORD *)(dwBase + dwOffset);
	
	while (dwDwordCount >= 16UL)
	{
		*pdwReg = *pdwBuf++;
		*pdwReg = *pdwBuf++;
		*pdwReg = *pdwBuf++;
		*pdwReg = *pdwBuf++;
		*pdwReg = *pdwBuf++;
		*pdwReg = *pdwBuf++;
		*pdwReg = *pdwBuf++;
		*pdwReg = *pdwBuf++;

		*pdwReg = *pdwBuf++;
		*pdwReg = *pdwBuf++;
		*pdwReg = *pdwBuf++;
		*pdwReg = *pdwBuf++;
		*pdwReg = *pdwBuf++;
		*pdwReg = *pdwBuf++;
		*pdwReg = *pdwBuf++;
		*pdwReg = *pdwBuf++;

		dwDwordCount -= 16UL;
	}

	while (dwDwordCount)
	{
		*pdwReg = *pdwBuf++;
		dwDwordCount--;
	}
}

/*
 * ReadFifo (dwBase, dwOffset, pdwBuf, dwDwordCount)
 * 	Reads 'dwDwordCount' 4-byte integers from RX fifo at address
 * 	(dwBase + dwOffset) and stores in memory buffer at address
 * 	pdwBuf
 */
void ReadFifo(
	const DWORD dwBase,
	const DWORD dwOffset,
	DWORD *pdwBuf,
	DWORD dwDwordCount)
{
	DWORD dummy;
	const volatile DWORD * const pdwReg = 
		(const volatile DWORD * const)(dwBase + dwOffset);
	
	dwDwordCount--;		/* do not store CRC on OS20 buffer */
	while (dwDwordCount >= 16UL)
	{
		*pdwBuf++ = *pdwReg;
		*pdwBuf++ = *pdwReg;
		*pdwBuf++ = *pdwReg;
		*pdwBuf++ = *pdwReg;
		*pdwBuf++ = *pdwReg;
		*pdwBuf++ = *pdwReg;
		*pdwBuf++ = *pdwReg;
		*pdwBuf++ = *pdwReg;

		*pdwBuf++ = *pdwReg;
		*pdwBuf++ = *pdwReg;
		*pdwBuf++ = *pdwReg;
		*pdwBuf++ = *pdwReg;
		*pdwBuf++ = *pdwReg;
		*pdwBuf++ = *pdwReg;
		*pdwBuf++ = *pdwReg;
		*pdwBuf++ = *pdwReg;

		dwDwordCount -= 16UL;
	}

	while (dwDwordCount)
	{
		*pdwBuf++ = *pdwReg;
		dwDwordCount--;
	}
	dummy = *pdwReg;
	dummy = dummy;
}

/*
 * LanDetectChipId () returns the ID of the Concord Ethernet chip.
 * 	Possible valid values are 0x115, 0x116, 0x117, 0x118
 */
DWORD LanDetectChipId (const DWORD dwLanBase)
{
	DWORD dwIdRev;

  	dwIdRev = GetRegDW (dwLanBase, ID_REV);
	dwIdRev = (dwIdRev >> 16) & 0xffffUL;
	if ((dwIdRev != 0x0118UL) && (dwIdRev != 0x0117UL) &&
		(dwIdRev != 0x0116UL) && (dwIdRev != 0x0115UL))
	{
	  dwIdRev = 0xffffffffUL;
	}
	return dwIdRev;
}

/*
 * LanDelayUS (dwLanBase, dwUS) delays 'dwUS' microseconds in this
 * 	function.
 */
void LanDelayUS(const DWORD dwLanBase, const DWORD dwUS)
{
	DWORD dwStartTick, dwEndTick, dwCurrentTick;

	// get starting timestamp
	dwStartTick = GetRegDW(dwLanBase, FREE_RUN);

	//	Calculate ending tick.  Make sure we always wait at least 1 uS.
	//	Note that this could wrap-around (handled later).
	if (dwUS == 0UL)
	{
		dwEndTick = dwStartTick + 25UL;
	}
	else
	{
		dwEndTick = dwStartTick + (dwUS*25UL);
	}

	//	4 possible cases:
	//		1.  could start on 0's
	//		2.  could end on ff's
	//		3.  could have a wrap-around before end
	//		4.  normal case (none of the above)
	if (dwStartTick == 0UL)						// case 1 above -- started on 0's
	{
		do {
			dwCurrentTick = GetRegDW(dwLanBase, FREE_RUN);
		} while (dwCurrentTick <= dwEndTick);
	}
	else if (dwEndTick == 0xFFFFFFFFUL)			// case 2 above -- ended on ff's
	{
		do {
			dwCurrentTick = GetRegDW(dwLanBase, FREE_RUN);
		} while (dwCurrentTick >= dwStartTick);
	}
	else if (dwEndTick < dwStartTick)			// case 3 above -- wrap-around before end
	{
		do {
			dwCurrentTick = GetRegDW(dwLanBase, FREE_RUN);
		} while ((dwCurrentTick >= dwStartTick) || (dwCurrentTick <= dwEndTick));
	}
	else										// case 4 above -- the "normal" case
	{
		do {
			dwCurrentTick = GetRegDW(dwLanBase, FREE_RUN);
		} while ((dwCurrentTick >= dwStartTick) && (dwCurrentTick <= dwEndTick));
	}
}

/*
FUNCTION: Lan_WriteTxFifo
	This function is used to write a buffer to the
	Tx Fifo in PIO mode.
	This function is only intended to be called 
	  from with in other Lan_xxx functions.
*/
void Lan_WriteTxFifo(
	const DWORD dwLanBase, 
	const DWORD * const pdwBuf, 
	DWORD dwDwordCount)
{
	WriteFifo(
		dwLanBase,
		TX_DATA_FIFO_PORT,
		pdwBuf,dwDwordCount);
}

/*
FUNCTION: Lan_ReadRxFifo
    This function is used to read a buffer to the 
	Rx Fifo in PIO mode.
	This function is only intended to be called
	  from with in other Lan_xxx functions.
*/
void Lan_ReadRxFifo(
	const DWORD dwLanBase, 
	DWORD * pdwBuf, 
	DWORD dwDwordCount)
{
	ReadFifo(
		dwLanBase,
        RX_FIFO_PORT,
		pdwBuf,dwDwordCount);
}

/*
FUNCTION: update_tx_counters
	This function pops tx status and update statistics.
*/
void Lan_UpdateTxCounters(NGifnet *netp)
{
	DWORD dwLanBase;
	DWORD dwTxStatus=0UL;

	dwLanBase = (DWORD) NG_ETHIF_DATA(((void *) netp), eif_base);
	while((dwTxStatus=Lan_CompleteTx(dwLanBase))!=0UL)
	{
		if(dwTxStatus&0x80000000UL) {
		} else {
			if(dwTxStatus&0x00008000UL) {
				netp->if_oerrors++;
			} else {
				netp->if_opackets++;
				netp->if_obytes += (dwTxStatus>>16);
			}
		}
	}
}

/*
FUNCTION: Lan_MacLoad
	initialze MAC address.
	return TRUE on success, FALSE on failure
*/
BOOLEAN Lan_MacLoad(NGifnet * netp)
{
	int i;	
	DWORD dwHigh16, dwLow32;
	DWORD dwLanBase;
		
	dwLanBase = (DWORD) NG_ETHIF_DATA(((void *) netp), eif_base);

	for (i = 0; i < 6; i++)
  	{  
		if (NG_ETHIF_DATA(((void *) netp), eif_addr[i]) != 0)
		{
			break;
		}
  	} 
  
	if (i < 6) 
  	{ 
		/* use application-defined MAC address */
		dwHigh16 = ((DWORD)NG_ETHIF_DATA(((void *) netp), eif_addr[4])) |
		  (((DWORD)NG_ETHIF_DATA(((void *) netp), eif_addr[5])) << 8);
		dwLow32 = ((DWORD)NG_ETHIF_DATA(((void *) netp), eif_addr [0])) |
		  (((DWORD)NG_ETHIF_DATA(((void *) netp), eif_addr[1])) << 8) |
		  (((DWORD)NG_ETHIF_DATA(((void *) netp), eif_addr[2])) << 16) |
		  (((DWORD)NG_ETHIF_DATA(((void *) netp), eif_addr[3])) << 24);
  		
  		/* set MAC address into lan9118 */
		Lan_SetMacAddress (dwLanBase, dwHigh16, dwLow32);
  	} 
  	else
 	{ 
  		/* get MAC address from lan9118 */
		Lan_GetMacAddress (dwLanBase, &dwHigh16, &dwLow32);
	  	
		if (((dwHigh16 & 0xffffUL) == 0UL) && (dwLow32 == 0UL))
		{
			return FALSE;
		}	
		
		/* update MAC address into NexGen structure */
		NG_ETHIF_DATA(((void *) netp), eif_addr[4]) = (NGubyte) (dwHigh16 & 0xffUL); 
		NG_ETHIF_DATA(((void *) netp), eif_addr[5]) = (NGubyte) ((dwHigh16 >> 8) & 0xffUL); 
		NG_ETHIF_DATA(((void *) netp), eif_addr[0]) = (NGubyte) (dwLow32 & 0xffUL); 
		NG_ETHIF_DATA(((void *) netp), eif_addr[1]) = (NGubyte) ((dwLow32 >> 8) & 0xffUL); 
		NG_ETHIF_DATA(((void *) netp), eif_addr[2]) = (NGubyte) ((dwLow32 >> 16) & 0xffUL); 
		NG_ETHIF_DATA(((void *) netp), eif_addr[3]) = (NGubyte) ((dwLow32 >> 24) & 0xffUL); 
        }
	return TRUE;
}

/*
 ****************************************************************************
 *	Indirect (MAC) Registers and Reader/Writers
 ****************************************************************************
 */
static BOOLEAN Lan_MacNotBusy(const DWORD dwLanBase)
{
	NGuint i=0U;
#ifdef SMC_DEBUG
	char buf [256];
#endif

	/* wait for MAC not busy, w/ timeout */
	for(i = 0U; i < 40U; i++)
	{
		if((GetRegDW(dwLanBase, MAC_CSR_CMD) & MAC_CSR_CMD_CSR_BUSY_)==(0UL)) 
		{
			return TRUE;
		}
	}
#ifdef SMC_DEBUG
	sprintf (buf, "timeout waiting for MAC not BUSY. MAC_CSR_CMD = 0x%08lX\n", (DWORD)(*(volatile DWORD *)(dwLanBase + MAC_CSR_CMD)));
	OS_TEXT_OUT (buf);
#endif
	return FALSE;
}


/*
FUNCTION: Lan_GetMacRegDW
    This function is used to read a Mac Register.
	This function is only intended to be called
	  from with in other Lan_xxx functions.
*/
DWORD Lan_GetMacRegDW(
	const DWORD dwLanBase, 
	const DWORD dwOffset)
{
	DWORD dwTemp;
	/* wait until not busy, w/ timeout */
	if (GetRegDW(dwLanBase, MAC_CSR_CMD) & MAC_CSR_CMD_CSR_BUSY_)
	{
#ifdef SMC_DEBUG
		OS_TEXT_OUT ("LanGetMacRegDW() failed MAC already busy at entry\n");
#endif
		return 0xFFFFFFFFUL;
	}

	/* send the MAC Cmd w/ offset */
	SetRegDW(dwLanBase, MAC_CSR_CMD, 
		((dwOffset & 0x000000FFUL) | MAC_CSR_CMD_CSR_BUSY_ | MAC_CSR_CMD_R_NOT_W_));

	/* force flush of previous write */
	dwTemp = GetRegDW(dwLanBase, BYTE_TEST);
	dwTemp = dwTemp;

	/* wait for the read to happen, w/ timeout */
	if (!Lan_MacNotBusy(dwLanBase))
	{
#ifdef SMC_DEBUG
		OS_TEXT_OUT ("LanGetMacRegDW() failed waiting for MAC not busy after read\n");
#endif
		return 0xFFFFFFFFUL;
	}
	else
	{
		/* finally, return the read data */
		return GetRegDW(dwLanBase, MAC_CSR_DATA);
	}
}

/*
FUNCTION: Lan_SetMacRegDW
	This function is used to write a Mac register.
	This function is only intended to be called
	  from with in other Lan_xxx functions.
*/
void Lan_SetMacRegDW(
	const DWORD dwLanBase, 
	const DWORD dwOffset, 
	const DWORD dwVal)
{
	DWORD dwTemp;

	if (GetRegDW(dwLanBase, MAC_CSR_CMD) & MAC_CSR_CMD_CSR_BUSY_)
	{
#ifdef SMC_DEBUG
		OS_TEXT_OUT ("LanSetMacRegDW() failed MAC already busy at entry\n");
#endif
		return;
	}

	/* send the data to write */
	SetRegDW(dwLanBase, MAC_CSR_DATA, dwVal);

	/* do the actual write */
	SetRegDW(dwLanBase, MAC_CSR_CMD, 
		((dwOffset & 0x000000FFUL) | MAC_CSR_CMD_CSR_BUSY_));

	/* force flush of previous write */
	dwTemp = GetRegDW(dwLanBase, BYTE_TEST);
	dwTemp = dwTemp;

	/* wait for the write to complete, w/ timeout */
	if (!Lan_MacNotBusy(dwLanBase))
	{
#ifdef SMC_DEBUG
		OS_TEXT_OUT ("LanSetMacRegDW() failed waiting for MAC not busy after write\n");
#endif
	}
}

/* Phy_GetRegW () reads a 16-bit phy register values */
NGushort Phy_GetRegW(
	const NGifnet * const netp,
	const DWORD dwRegIndex)
{
	const LAN9118_DATA *pLan9118Data;
	DWORD dwLanBase;
	int ictrl;	/* save previous interrupt state */
	DWORD dwAddr=0UL;
	NGuint i=0U;
	NGushort result= (NGushort) 0xFFFF;


	dwLanBase = (DWORD) NG_ETHIF_DATA(((void *) netp), eif_base);
	pLan9118Data = (PLAN9118_DATA) netp->if_devptr1;

	ictrl = ngOSIntrCtl(NG_INTRCTL_DISABLE);

	/* confirm MII not busy
 */
	if ((Lan_GetMacRegDW(dwLanBase, MII_ACC) & MII_ACC_MII_BUSY_) != 0UL)

	{

#ifdef SMC_DEBUG
		OS_TEXT_OUT("MII is busy in Phy_GetRegW???\n");

#endif
		result = (NGushort) 0;

		goto DONE;

	}



	/* set the address, index & direction (read from PHY)
 */
	dwAddr = ((pLan9118Data->dwPhyAddress&0x1FUL)<<11) | ((dwRegIndex & 0x1FUL)<<6);

	Lan_SetMacRegDW(dwLanBase,MII_ACC,dwAddr);

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
午夜电影网一区| 玉足女爽爽91| 人人爽香蕉精品| 91精品国产色综合久久不卡电影 | 成人免费视频播放| 国产精品青草久久| 99久久精品国产精品久久| 中文成人av在线| 国产亚洲欧洲997久久综合 | 亚洲国产欧美日韩另类综合 | 成人免费毛片嘿嘿连载视频| 韩国精品免费视频| 亚洲欧美另类综合偷拍| 欧美一卡二卡在线| 日韩一区二区在线看片| 成人国产免费视频| 强制捆绑调教一区二区| 蜜桃在线一区二区三区| 国产精品全国免费观看高清| 国产精品久久久久久久久久久免费看 | 国产成人精品一区二区三区四区 | 亚洲女同一区二区| 亚洲va欧美va国产va天堂影院| 精品国产不卡一区二区三区| 丰满少妇在线播放bd日韩电影| 午夜一区二区三区视频| 奇米精品一区二区三区在线观看一| 蜜臀av一级做a爰片久久| 黄页视频在线91| 一本色道久久综合亚洲aⅴ蜜桃| 午夜精品在线看| 国内精品写真在线观看| av在线播放成人| 国产精品99精品久久免费| 日韩精品成人一区二区在线| 亚洲欧洲精品天堂一级| 国产调教视频一区| 亚洲人妖av一区二区| 久久久久国产精品免费免费搜索| 91精品国产综合久久小美女| 色综合亚洲欧洲| 国产黄色91视频| 欧洲在线/亚洲| 日本大香伊一区二区三区| 97国产一区二区| 日韩网站在线看片你懂的| 国产精品成人一区二区艾草| 日本aⅴ免费视频一区二区三区 | 日韩三级高清在线| 中文字幕一区二区三区在线播放| 日韩精品免费视频人成| 97精品久久久久中文字幕| www国产亚洲精品久久麻豆| 精品粉嫩超白一线天av| 亚洲美女屁股眼交| 国产69精品久久777的优势| 日韩一区二区免费视频| 一区二区三区在线看| 亚洲精品国产视频| 国产白丝精品91爽爽久久| 欧美一级一区二区| 亚洲第一电影网| 日本道色综合久久| 最新国产成人在线观看| 国产一区二区三区四区在线观看 | 97se狠狠狠综合亚洲狠狠| 精品国产乱码久久| 日韩av在线播放中文字幕| 日韩不卡在线观看日韩不卡视频| 色哟哟国产精品| 最新日韩av在线| 不卡视频一二三| 国产精品国产三级国产普通话蜜臀| 理论片日本一区| jlzzjlzz欧美大全| 国产欧美综合在线| 亚洲国产一区二区三区青草影视 | 一区二区欧美精品| 色婷婷久久综合| 亚洲人成在线观看一区二区| 91香蕉视频在线| 制服.丝袜.亚洲.另类.中文| 亚洲一二三区不卡| 91麻豆精品国产91久久久久| 日韩精品成人一区二区三区| 51精品久久久久久久蜜臀| 日本怡春院一区二区| 精品久久久久久久一区二区蜜臀| 亚洲精品一二三| 色噜噜狠狠一区二区三区果冻| 一区二区三区精品视频在线| 在线看日本不卡| 天堂一区二区在线免费观看| 精品理论电影在线| 国产91在线|亚洲| 日韩理论片一区二区| 欧亚洲嫩模精品一区三区| 午夜伊人狠狠久久| 26uuu精品一区二区在线观看| 国产成人av影院| 亚洲综合免费观看高清完整版| 久久av老司机精品网站导航| 久久久久久久久久久电影| 成人av在线观| 免费一区二区视频| 久久久777精品电影网影网| 99久久国产综合精品女不卡| 一级中文字幕一区二区| 日韩免费高清电影| 日韩激情中文字幕| 久久精品一区二区三区不卡| 91免费看视频| 日日摸夜夜添夜夜添国产精品 | 亚洲精品在线一区二区| 成人激情av网| 男女男精品视频网| 亚洲在线观看免费视频| 久久婷婷一区二区三区| 欧美自拍偷拍一区| 国模一区二区三区白浆| 亚洲午夜精品在线| 久久久久久影视| 欧美日韩国产123区| 最新国产成人在线观看| 欧美一级专区免费大片| 91网上在线视频| 国产一区二区三区国产| 日韩综合小视频| 最新欧美精品一区二区三区| 精品国产第一区二区三区观看体验 | 日本欧美加勒比视频| 1区2区3区欧美| 久久众筹精品私拍模特| 精品视频999| 午夜精品在线看| 亚洲色图制服诱惑| 国产欧美综合在线| www日韩大片| 日韩片之四级片| 欧美日韩激情一区二区三区| 99久久综合国产精品| 国产一区二区三区综合| 极品少妇一区二区三区精品视频| 精品福利av导航| 91精品国产乱码| 欧美日韩一区高清| 91国偷自产一区二区开放时间 | 免费成人在线网站| 视频一区二区三区入口| 一区二区视频在线| 亚洲欧美电影一区二区| 国产精品国产馆在线真实露脸| 26uuu另类欧美亚洲曰本| 欧美成人vps| 精品美女在线播放| 欧美tickle裸体挠脚心vk| 日韩精品一区二区三区老鸭窝 | 国产精品天干天干在线综合| 久久综合色8888| 精品国产99国产精品| 精品电影一区二区| 国产欧美一区二区精品忘忧草| 国产午夜精品久久久久久久| 久久久噜噜噜久久中文字幕色伊伊| 欧美电影免费观看高清完整版在线观看 | 美女网站色91| 精品一二三四在线| 国产一区二区在线视频| 国产91综合一区在线观看| 91女神在线视频| 3751色影院一区二区三区| 日韩精品一区二区三区中文不卡| 久久你懂得1024| 亚洲欧洲av在线| 亚洲综合图片区| 美女网站视频久久| 东方欧美亚洲色图在线| 91亚洲精品一区二区乱码| 欧美日韩激情一区| 久久在线观看免费| 亚洲私人影院在线观看| 偷偷要91色婷婷| 国产mv日韩mv欧美| 在线亚洲一区二区| 精品日韩一区二区三区免费视频| 国产亚洲欧美在线| 一区二区三区四区蜜桃| 久草精品在线观看| 91老师片黄在线观看| 91精品国模一区二区三区| 中文字幕精品一区二区三区精品 | 免费在线观看精品| 不卡一区在线观看| 日韩欧美一区二区三区在线| 国产日韩综合av| 婷婷六月综合网| 国产成人在线视频网站| 欧美精品色综合| 欧美日韩国产片| 日本一区二区动态图|