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

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

?? ns9750_eth.c

?? UBOOT 源碼
?? C
?? 第 1 頁 / 共 2 頁
字號:
	*get_eth_reg_addr (NS9750_ETH_MCFG) =		ns9750_mii_get_clock_divisor (nPhyMaxMdioClock);	/* reset PHY */	ns9750_mii_write (PHY_COMMON_CTRL, PHY_COMMON_CTRL_RESET);	ns9750_mii_write (PHY_COMMON_CTRL, 0);	/* @TODO check time */	udelay (3000);		/* [2] p.70 says at least 300us reset recovery time. But				   go sure, it didn't worked stable at higher timer				   frequencies under LxNETES-2.x */	/* MII clock has been setup to default, ns9750_mii_identify_phy should	   work for all */	if (!ns9750_mii_identify_phy ()) {		printk (KERN_ERR NS9750_DRIVER_NAME			": Unsupported PHY, aborting\n");		return 0;	}	/* now take the highest MDIO clock possible after detection */	*get_eth_reg_addr (NS9750_ETH_MCFG) =		ns9750_mii_get_clock_divisor (nPhyMaxMdioClock);	/* PHY has been detected, so there can be no abort reason and we can	   finish initializing ethernet */	uiLastLinkStatus = 0xff;	/* undefined */	if ((ucLinkMode & FS_EEPROM_AUTONEG_ENABLE_MASK) ==	    FS_EEPROM_AUTONEG_DISABLE)		/* use parameters defined */		ns9750_link_force ();	else		ns9750_link_auto_negotiate ();	if (phyDetected == PHY_LXT971A)		/* set LED2 to link mode */		ns9750_mii_write (PHY_LXT971_LED_CFG,				  PHY_LXT971_LED_CFG_LINK_ACT <<				  PHY_LXT971_LED_CFG_SHIFT_LED2);	return 1;}/*********************************************************************** * @Function: ns9750_link_force * @Return: void * @Descr: configures eth and MII to use the link mode defined in *	   ucLinkMode ***********************************************************************/static void ns9750_link_force (void){	unsigned short uiControl;	DEBUG_FN (DEBUG_LINK);	uiControl = ns9750_mii_read (PHY_COMMON_CTRL);	uiControl &= ~(PHY_COMMON_CTRL_SPD_MA |		       PHY_COMMON_CTRL_AUTO_NEG | PHY_COMMON_CTRL_DUPLEX);	uiLastLinkStatus = 0;	if ((ucLinkMode & FS_EEPROM_AUTONEG_SPEED_MASK) ==	    FS_EEPROM_AUTONEG_SPEED_100) {		uiControl |= PHY_COMMON_CTRL_SPD_100;		uiLastLinkStatus |= PHY_LXT971_STAT2_100BTX;	} else		uiControl |= PHY_COMMON_CTRL_SPD_10;	if ((ucLinkMode & FS_EEPROM_AUTONEG_DUPLEX_MASK) ==	    FS_EEPROM_AUTONEG_DUPLEX_FULL) {		uiControl |= PHY_COMMON_CTRL_DUPLEX;		uiLastLinkStatus |= PHY_LXT971_STAT2_DUPLEX_MODE;	}	ns9750_mii_write (PHY_COMMON_CTRL, uiControl);	ns9750_link_print_changed ();	ns9750_link_update_egcr ();}/*********************************************************************** * @Function: ns9750_link_auto_negotiate * @Return: void * @Descr: performs auto-negotation of link. ***********************************************************************/static void ns9750_link_auto_negotiate (void){	unsigned long ulStartJiffies;	unsigned short uiStatus;	DEBUG_FN (DEBUG_LINK);	/* run auto-negotation */	/* define what we are capable of */	ns9750_mii_write (PHY_COMMON_AUTO_ADV,			  PHY_COMMON_AUTO_ADV_100BTXFD |			  PHY_COMMON_AUTO_ADV_100BTX |			  PHY_COMMON_AUTO_ADV_10BTFD |			  PHY_COMMON_AUTO_ADV_10BT |			  PHY_COMMON_AUTO_ADV_802_3);	/* start auto-negotiation */	ns9750_mii_write (PHY_COMMON_CTRL,			  PHY_COMMON_CTRL_AUTO_NEG |			  PHY_COMMON_CTRL_RES_AUTO);	/* wait for completion */	ulStartJiffies = get_ticks ();	while (get_ticks () < ulStartJiffies + NS9750_MII_NEG_DELAY) {		uiStatus = ns9750_mii_read (PHY_COMMON_STAT);		if ((uiStatus &		     (PHY_COMMON_STAT_AN_COMP | PHY_COMMON_STAT_LNK_STAT)) ==		    (PHY_COMMON_STAT_AN_COMP | PHY_COMMON_STAT_LNK_STAT)) {			/* lucky we are, auto-negotiation succeeded */			ns9750_link_print_changed ();			ns9750_link_update_egcr ();			return;		}	}	DEBUG_ARGS0 (DEBUG_LINK, "auto-negotiation timed out\n");	/* ignore invalid link settings */}/*********************************************************************** * @Function: ns9750_link_update_egcr * @Return: void * @Descr: updates the EGCR and MAC2 link status after mode change or *	   auto-negotation ***********************************************************************/static void ns9750_link_update_egcr (void){	unsigned int unEGCR;	unsigned int unMAC2;	unsigned int unIPGT;	DEBUG_FN (DEBUG_LINK);	unEGCR = *get_eth_reg_addr (NS9750_ETH_EGCR1);	unMAC2 = *get_eth_reg_addr (NS9750_ETH_MAC2);	unIPGT = *get_eth_reg_addr (NS9750_ETH_IPGT) & ~NS9750_ETH_IPGT_MA;	unMAC2 &= ~NS9750_ETH_MAC2_FULLD;	if ((uiLastLinkStatus & PHY_LXT971_STAT2_DUPLEX_MODE)	    == PHY_LXT971_STAT2_DUPLEX_MODE) {		unMAC2 |= NS9750_ETH_MAC2_FULLD;		unIPGT |= 0x15; /* see [1] p. 339 */	} else		unIPGT |= 0x12; /* see [1] p. 339 */	*get_eth_reg_addr (NS9750_ETH_MAC2) = unMAC2;	*get_eth_reg_addr (NS9750_ETH_EGCR1) = unEGCR;	*get_eth_reg_addr (NS9750_ETH_IPGT) = unIPGT;}/*********************************************************************** * @Function: ns9750_link_print_changed * @Return: void * @Descr: checks whether the link status has changed and if so prints *	   the new mode ***********************************************************************/static void ns9750_link_print_changed (void){	unsigned short uiStatus;	unsigned short uiControl;	DEBUG_FN (DEBUG_LINK);	uiControl = ns9750_mii_read (PHY_COMMON_CTRL);	if ((uiControl & PHY_COMMON_CTRL_AUTO_NEG) ==	    PHY_COMMON_CTRL_AUTO_NEG) {		/* PHY_COMMON_STAT_LNK_STAT is only set on autonegotiation */		uiStatus = ns9750_mii_read (PHY_COMMON_STAT);		if (!(uiStatus & PHY_COMMON_STAT_LNK_STAT)) {			printk (KERN_WARNING NS9750_DRIVER_NAME				": link down\n");			/* @TODO Linux: carrier_off */		} else {			/* @TODO Linux: carrier_on */			if (phyDetected == PHY_LXT971A) {				uiStatus = ns9750_mii_read (PHY_LXT971_STAT2);				uiStatus &= (PHY_LXT971_STAT2_100BTX |					     PHY_LXT971_STAT2_DUPLEX_MODE |					     PHY_LXT971_STAT2_AUTO_NEG);				/* mask out all uninteresting parts */			}			/* other PHYs must store there link information in			   uiStatus as PHY_LXT971 */		}	} else {		/* mode has been forced, so uiStatus should be the same as the		   last link status, enforce printing */		uiStatus = uiLastLinkStatus;		uiLastLinkStatus = 0xff;	}	if (uiStatus != uiLastLinkStatus) {		/* save current link status */		uiLastLinkStatus = uiStatus;		/* print new link status */		printk (KERN_INFO NS9750_DRIVER_NAME			": link mode %i Mbps %s duplex %s\n",			(uiStatus & PHY_LXT971_STAT2_100BTX) ? 100 : 10,			(uiStatus & PHY_LXT971_STAT2_DUPLEX_MODE) ? "full" :			"half",			(uiStatus & PHY_LXT971_STAT2_AUTO_NEG) ? "(auto)" :			"");	}}/*********************************************************************** * the MII low level stuff ***********************************************************************//*********************************************************************** * @Function: ns9750_mii_identify_phy * @Return: 1 if supported PHY has been detected otherwise 0 * @Descr: checks for supported PHY and prints the IDs. ***********************************************************************/static char ns9750_mii_identify_phy (void){	unsigned short uiID1;	unsigned short uiID2;	unsigned char *szName;	char cRes = 0;	DEBUG_FN (DEBUG_MII);	phyDetected = (PhyType) uiID1 = ns9750_mii_read (PHY_COMMON_ID1);	switch (phyDetected) {	case PHY_LXT971A:		szName = "LXT971A";		uiID2 = ns9750_mii_read (PHY_COMMON_ID2);		nPhyMaxMdioClock = PHY_LXT971_MDIO_MAX_CLK;		cRes = 1;		break;	case PHY_NONE:	default:		/* in case uiID1 == 0 && uiID2 == 0 we may have the wrong		   address or reset sets the wrong NS9750_ETH_MCFG_CLKS */		uiID2 = 0;		szName = "unknown";		nPhyMaxMdioClock = PHY_MDIO_MAX_CLK;		phyDetected = PHY_NONE;	}	printk (KERN_INFO NS9750_DRIVER_NAME		": PHY (0x%x, 0x%x) = %s detected\n", uiID1, uiID2, szName);	return cRes;}/*********************************************************************** * @Function: ns9750_mii_read * @Return: the data read from PHY register uiRegister * @Descr: the data read may be invalid if timed out. If so, a message *	   is printed but the invalid data is returned. *	   The fixed device address is being used. ***********************************************************************/static unsigned short ns9750_mii_read (unsigned short uiRegister){	DEBUG_FN (DEBUG_MII_LOW);	/* write MII register to be read */	*get_eth_reg_addr (NS9750_ETH_MADR) =		NS9750_ETH_PHY_ADDRESS << 8 | uiRegister;	*get_eth_reg_addr (NS9750_ETH_MCMD) = NS9750_ETH_MCMD_READ;	if (!ns9750_mii_poll_busy ())		printk (KERN_WARNING NS9750_DRIVER_NAME			": MII still busy in read\n");	/* continue to read */	*get_eth_reg_addr (NS9750_ETH_MCMD) = 0;	return (unsigned short) (*get_eth_reg_addr (NS9750_ETH_MRDD));}/*********************************************************************** * @Function: ns9750_mii_write * @Return: nothing * @Descr: writes the data to the PHY register. In case of a timeout, *	   no special handling is performed but a message printed *	   The fixed device address is being used. ***********************************************************************/static void ns9750_mii_write (unsigned short uiRegister,			      unsigned short uiData){	DEBUG_FN (DEBUG_MII_LOW);	/* write MII register to be written */	*get_eth_reg_addr (NS9750_ETH_MADR) =		NS9750_ETH_PHY_ADDRESS << 8 | uiRegister;	*get_eth_reg_addr (NS9750_ETH_MWTD) = uiData;	if (!ns9750_mii_poll_busy ()) {		printf (KERN_WARNING NS9750_DRIVER_NAME			": MII still busy in write\n");	}}/*********************************************************************** * @Function: ns9750_mii_get_clock_divisor * @Return: the clock divisor that should be used in NS9750_ETH_MCFG_CLKS * @Descr: if no clock divisor can be calculated for the *	   current SYSCLK and the maximum MDIO Clock, a warning is printed *	   and the greatest divisor is taken ***********************************************************************/static unsigned int ns9750_mii_get_clock_divisor (unsigned int unMaxMDIOClk){	struct {		unsigned int unSysClkDivisor;		unsigned int unClks;	/* field for NS9750_ETH_MCFG_CLKS */	} PHYClockDivisors[] = {		{		4, NS9750_ETH_MCFG_CLKS_4}, {		6, NS9750_ETH_MCFG_CLKS_6}, {		8, NS9750_ETH_MCFG_CLKS_8}, {		10, NS9750_ETH_MCFG_CLKS_10}, {		20, NS9750_ETH_MCFG_CLKS_20}, {		30, NS9750_ETH_MCFG_CLKS_30}, {		40, NS9750_ETH_MCFG_CLKS_40}	};	int nIndexSysClkDiv;	int nArraySize =		sizeof (PHYClockDivisors) / sizeof (PHYClockDivisors[0]);	unsigned int unClks = NS9750_ETH_MCFG_CLKS_40;	/* defaults to							   greatest div */	DEBUG_FN (DEBUG_INIT);	for (nIndexSysClkDiv = 0; nIndexSysClkDiv < nArraySize;	     nIndexSysClkDiv++) {		/* find first sysclock divisor that isn't higher than 2.5 MHz		   clock */		if (AHB_CLK_FREQ /		    PHYClockDivisors[nIndexSysClkDiv].unSysClkDivisor <=		    unMaxMDIOClk) {			unClks = PHYClockDivisors[nIndexSysClkDiv].unClks;			break;		}	}	DEBUG_ARGS2 (DEBUG_INIT,		     "Taking MDIO Clock bit mask 0x%0x for max clock %i\n",		     unClks, unMaxMDIOClk);	/* return greatest divisor */	return unClks;}/*********************************************************************** * @Function: ns9750_mii_poll_busy * @Return: 0 if timed out otherwise the remaing timeout * @Descr: waits until the MII has completed a command or it times out *	   code may be interrupted by hard interrupts. *	   It is not checked what happens on multiple actions when *	   the first is still being busy and we timeout. ***********************************************************************/static unsigned int ns9750_mii_poll_busy (void){	unsigned int unTimeout = 10000;	DEBUG_FN (DEBUG_MII_LOW);	while (((*get_eth_reg_addr (NS9750_ETH_MIND) & NS9750_ETH_MIND_BUSY)		== NS9750_ETH_MIND_BUSY) && unTimeout)		unTimeout--;	return unTimeout;}#endif /* CONFIG_DRIVER_NS9750_ETHERNET */

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日韩欧美国产一区二区三区| 综合欧美亚洲日本| 日本一区二区三级电影在线观看 | 亚洲高清免费观看高清完整版在线观看| 亚洲自拍偷拍麻豆| 不卡av在线网| 精品日产卡一卡二卡麻豆| 亚洲蜜臀av乱码久久精品蜜桃| 蜜桃久久精品一区二区| 91在线精品秘密一区二区| 日韩欧美一区二区久久婷婷| 亚洲精品写真福利| 成人性生交大合| 欧美videos大乳护士334| 亚洲香蕉伊在人在线观| www.日本不卡| 国产午夜精品在线观看| 老司机午夜精品99久久| 欧美日本韩国一区二区三区视频| 国产精品久久毛片av大全日韩| 麻豆国产欧美一区二区三区| 欧美日韩国产在线播放网站| 亚洲色图19p| 白白色 亚洲乱淫| 国产欧美一区二区精品仙草咪| 久国产精品韩国三级视频| 9191精品国产综合久久久久久 | 91最新地址在线播放| 国产午夜精品久久| 国产尤物一区二区在线| 欧美不卡一区二区三区| 美女视频一区二区| 91精品国产色综合久久| 欧美aaaaa成人免费观看视频| 欧美日韩一卡二卡三卡| 亚洲在线视频一区| 欧美日韩高清不卡| 日韩高清一区在线| 欧美一区二区三区在线电影| 免费观看成人鲁鲁鲁鲁鲁视频| 666欧美在线视频| 日韩国产欧美在线视频| 欧美丰满嫩嫩电影| 奇米影视7777精品一区二区| 欧美一区二区三区男人的天堂| 免费精品99久久国产综合精品| 日韩欧美在线123| 国产乱码精品一品二品| 国产精品夫妻自拍| 色吧成人激情小说| 日欧美一区二区| 精品国产一区二区三区av性色| 国产一区二区三区四| 国产精品高潮久久久久无| 欧洲亚洲国产日韩| 日韩和欧美一区二区三区| 亚洲精品一区二区精华| 午夜精品久久久久久久久| 日韩欧美国产三级| 成人亚洲精品久久久久软件| 成人免费小视频| 欧美日韩久久一区| 久久国产精品免费| 国产精品国产自产拍高清av| 国产精品影视天天线| 国产精品无码永久免费888| 成人网在线播放| 国产日韩欧美精品综合| 成人免费的视频| 亚洲精品国产无天堂网2021| 欧美亚洲禁片免费| 日本vs亚洲vs韩国一区三区二区 | 欧美蜜桃一区二区三区| 日本成人在线看| 精品人在线二区三区| 成人99免费视频| 亚洲视频在线一区二区| 日韩精品一区二区三区在线观看 | 色天使久久综合网天天| 欧美aⅴ一区二区三区视频| 久久久久久久久久久久电影| 岛国av在线一区| 一区二区三区在线视频观看 | 亚洲国产精品精华液网站| 欧美日韩国产中文| 国产一区中文字幕| 亚洲少妇最新在线视频| 在线成人免费视频| 粉嫩绯色av一区二区在线观看| 亚洲另类春色校园小说| 日韩欧美国产电影| 成人自拍视频在线| 男男视频亚洲欧美| 亚洲色图视频网| 欧美一区二区三区在线电影 | 日韩欧美成人激情| 国产精品996| 午夜影视日本亚洲欧洲精品| 久久久蜜桃精品| 欧美日韩一区二区欧美激情| 国产99精品在线观看| 亚洲国产日韩综合久久精品| 国产精品网站在线观看| 91精品在线观看入口| 国产suv精品一区二区883| 日韩精品免费专区| 一区二区三区四区亚洲| 欧美激情综合五月色丁香小说| 欧美日韩一区二区在线观看| 99在线视频精品| 国产一区二区久久| 青青草国产成人av片免费| 亚洲一二三区在线观看| 国产精品毛片久久久久久久| 日韩一区二区三区四区| 欧美日韩在线观看一区二区| 91小视频在线免费看| 国产成人av一区二区三区在线观看| 亚洲高清不卡在线观看| 一区二区三区精品视频| 椎名由奈av一区二区三区| 久久免费国产精品| 欧美成人video| 日韩一区二区三区电影 | 在线电影一区二区三区| 色婷婷av一区二区三区gif| 不卡免费追剧大全电视剧网站| 免费成人在线播放| 性久久久久久久久久久久| 亚洲亚洲人成综合网络| 亚洲动漫第一页| 亚洲一区二区偷拍精品| 久久理论电影网| 中文一区二区完整视频在线观看| 久久久另类综合| 久久精品亚洲乱码伦伦中文| 久久人人97超碰com| 日本一区二区三区国色天香 | 久久国产麻豆精品| 蜜臀91精品一区二区三区| 蜜臀久久99精品久久久久久9| 日韩影院在线观看| 丝袜国产日韩另类美女| 奇米影视一区二区三区| 免费成人你懂的| 美女视频黄免费的久久 | 亚洲va韩国va欧美va精品| 亚洲成人三级小说| 同产精品九九九| 日韩在线一二三区| 久久精品国产精品青草| 成人精品视频.| 91亚洲精品久久久蜜桃| 欧美日本在线播放| 精品日韩在线一区| 国产欧美精品一区| 亚洲视频在线一区观看| 亚洲超碰精品一区二区| 丝袜诱惑制服诱惑色一区在线观看 | 久久国产欧美日韩精品| 成人晚上爱看视频| 欧美日韩在线观看一区二区| 久久一区二区视频| 成人欧美一区二区三区小说 | 精品国产一区久久| 中文字幕一区二区在线观看| 亚洲综合色区另类av| 国产一区欧美二区| 91一区二区三区在线播放| 欧美麻豆精品久久久久久| 久久亚洲精精品中文字幕早川悠里| 日本一区二区三区视频视频| 一本到不卡精品视频在线观看| 欧美人体做爰大胆视频| 亚洲精品视频免费观看| 久久精品国产澳门| 日本乱人伦aⅴ精品| 26uuuu精品一区二区| 亚洲午夜av在线| 国产精品一二三四区| 欧美体内she精高潮| 久久影院视频免费| 亚洲一区二区影院| 欧日韩精品视频| 久久精品一区蜜桃臀影院| 亚洲成人精品一区二区| 成人美女视频在线看| 精品欧美久久久| 一区二区在线观看视频在线观看| 国精产品一区一区三区mba桃花| 99久久er热在这里只有精品15| 欧美成人精品福利| 亚洲国产精品视频| av不卡免费电影| 久久综合色之久久综合| 日韩制服丝袜先锋影音| 欧美中文字幕久久| 日韩美女久久久| 不卡高清视频专区| 国产精品美女久久久久高潮|