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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? fec.c

?? linux驅(qū)動源碼
?? C
?? 第 1 頁 / 共 5 頁
字號:
		printk(", 10HDX");	if (!(s & PHY_CONF_SPMASK))		printk(", No speed/duplex selected?");	if (s & PHY_CONF_LOOP)		printk(", loopback enabled");	printk(".\n");	fep->sequence_done = 1;}static void mii_relink(struct net_device *dev){	struct fec_enet_private *fep = dev->priv;	int duplex;	fep->link = (fep->phy_status & PHY_STAT_LINK) ? 1 : 0;	mii_display_status(dev);	fep->old_link = fep->link;	if (fep->link) {		duplex = 0;		if (fep->phy_status		    & (PHY_STAT_100FDX | PHY_STAT_10FDX))			duplex = 1;		fec_restart(dev, duplex);		if (netif_queue_stopped(dev)) {			netif_wake_queue(dev);		}	} else {		netif_stop_queue(dev);		fec_stop(dev);	}}static void mii_queue_relink(uint mii_reg, struct net_device *dev, uint data){	struct fec_enet_private *fep = dev->priv;	fep->phy_task.routine = (void *)mii_relink;	fep->phy_task.data = dev;	schedule_task(&fep->phy_task);}static void mii_queue_config(uint mii_reg, struct net_device *dev, uint data){	struct fec_enet_private *fep = dev->priv;	fep->phy_task.routine = (void *)mii_display_config;	fep->phy_task.data = dev;	schedule_task(&fep->phy_task);}phy_cmd_t phy_cmd_relink[] = { { mk_mii_read(MII_REG_CR), mii_queue_relink },			       { mk_mii_end, } };phy_cmd_t phy_cmd_config[] = { { mk_mii_read(MII_REG_CR), mii_queue_config },			       { mk_mii_end, } };/* Read remainder of PHY ID.*/static voidmii_discover_phy3(uint mii_reg, struct net_device *dev, uint data){	struct fec_enet_private *fep;	int	i;	fep = dev->priv;	fep->phy_id |= (mii_reg & 0xffff);	for(i = 0; phy_info[i]; i++)		if(phy_info[i]->id == (fep->phy_id >> 4))			break;	if(!phy_info[i])		panic("%s: PHY id 0x%08x is not supported!\n",		      dev->name, fep->phy_id);	fep->phy = phy_info[i];	fep->phy_id_done = 1;	printk("%s: Phy @ 0x%x, type %s (0x%08x)\n",		dev->name, fep->phy_addr, fep->phy->name, fep->phy_id);}/* Scan all of the MII PHY addresses looking for someone to respond * with a valid ID.  This usually happens quickly. */static voidmii_discover_phy(uint mii_reg, struct net_device *dev, uint data){	struct fec_enet_private *fep;	uint	phytype;	fep = dev->priv;	if ((phytype = (mii_reg & 0xffff)) != 0xffff) {		/* Got first part of ID, now get remainder.		*/		fep->phy_id = phytype << 16;		mii_queue (dev, mk_mii_read(MII_REG_PHYIR2),				mii_discover_phy3, 0);	} else {		fep->phy_addr++;		if (fep->phy_addr < 32) {			mii_queue (dev, mk_mii_read(MII_REG_PHYIR1),					mii_discover_phy, 0);		} else {			printk("fec: No PHY device found.\n");		}	}}#endif	/* CONFIG_USE_MDIO *//* This interrupt occurs when the PHY detects a link change.*/static void#ifdef CONFIG_RPXCLASSICmii_link_interrupt(void *dev_id)#elsemii_link_interrupt(int irq, void * dev_id, struct pt_regs * regs)#endif{#ifdef	CONFIG_USE_MDIO	struct	net_device *dev = dev_id;	struct fec_enet_private *fep = dev->priv;	volatile immap_t *immap = (immap_t *)IMAP_ADDR;	volatile fec_t *fecp = &(immap->im_cpm.cp_fec);	unsigned int ecntrl = fecp->fec_ecntrl;        /*         * Acknowledge the interrupt if possible. If we have not         * found the PHY yet we can't process or acknowledge the         * interrupt now. Instead we ignore this interrupt for now,         * which we can do since it is edge triggered. It will be         * acknowledged later by fec_enet_open().	 */	if (fep->phy) {		/*		 * We need the FEC enabled to access the MII		 */		if ((ecntrl & FEC_ECNTRL_ETHER_EN) == 0) {			fecp->fec_ecntrl |= FEC_ECNTRL_ETHER_EN;		}		mii_do_cmd(dev, fep->phy->ack_int);		mii_do_cmd(dev, phy_cmd_relink);  /* restart and display status */		if ((ecntrl & FEC_ECNTRL_ETHER_EN) == 0) {			fecp->fec_ecntrl = ecntrl;	/* restore old settings */		}	}#else	printk ("FEC: unexpected Link interrupt\n");#endif	/* CONFIG_USE_MDIO */}static intfec_enet_open(struct net_device *dev){	struct fec_enet_private *fep = dev->priv;	/* I should reset the ring buffers here, but I don't yet know	 * a simple way to do that.	 */#ifdef	CONFIG_USE_MDIO	fep->sequence_done = 0;	fep->link = 0;	if (fep->phy) {	/*	mii_do_cmd(dev, fep->phy->ack_int);	*/		mii_do_cmd(dev, fep->phy->config);		mii_do_cmd(dev, phy_cmd_config);  /* display configuration */		while(!fep->sequence_done)			schedule();		mii_do_cmd(dev, fep->phy->startup);#if defined(CONFIG_USE_MDIO) && defined(CONFIG_FEC_DP83846A)		if(fep->phy == &phy_info_dp83846a) {			/* Initializing timers			 */			init_timer( &fep->phy_timer_list );			/* Starting timer for periodic link status check			 * After 100 milli-seconds, mdio_timer_callback function is called.			 */			fep->phy_timer_list.expires  = jiffies + (100 * HZ / 1000);			fep->phy_timer_list.data     = (unsigned long)dev;			fep->phy_timer_list.function = mdio_timer_callback;			add_timer( &fep->phy_timer_list );		}#if defined(CONFIG_IP_PNP)        printk("%s: Waiting for the link to be up...\n", dev->name);        while ( fep->link == 0 ||		((((volatile fec_t*)dev->base_addr)->fec_ecntrl & FEC_ECNTRL_ETHER_EN) == 0))        {            schedule();        }#endif /* CONFIG_IP_PNP */#endif /* CONFIG_USE_MDIO && CONFIG_FEC_DP83846A */		netif_start_queue(dev);		return 0;		/* Success */	}	return -ENODEV;		/* No PHY we understand */#else	fep->link = 1;	netif_start_queue(dev);	return 0;	/* Success */#endif	/* CONFIG_USE_MDIO */}static intfec_enet_close(struct net_device *dev){	/* Don't know what to do yet.	*/	netif_stop_queue(dev);	fec_stop(dev);	return 0;}static struct net_device_stats *fec_enet_get_stats(struct net_device *dev){	struct fec_enet_private *fep = (struct fec_enet_private *)dev->priv;	return &fep->stats;}#ifdef CONFIG_USE_MDIO#if defined(CONFIG_FEC_DP83846A)/* Execute the ack_int command set and schedules next timer call back.  */static void mdio_timer_callback(unsigned long data){	struct net_device *dev = (struct net_device *)data;	struct fec_enet_private *fep = (struct fec_enet_private *)(dev->priv);	mii_do_cmd(dev, fep->phy->ack_int);	if(fep->link == 0) {		fep->phy_timer_list.expires  = jiffies + (100 * HZ / 1000); /* Sleep for 100ms */	} else {		fep->phy_timer_list.expires  = jiffies + (1 * HZ); /* Sleep for 1 sec. */	}	add_timer( &fep->phy_timer_list );}#endif /* CONFIG_FEC_DP83846A */static void mdio_callback(uint regval, struct net_device *dev, uint data){	mdio_read_data_t* mrd = (mdio_read_data_t *)data;	mrd->regval = 0xFFFF & regval;	wake_up_process(mrd->sleeping_task);}static int mdio_read(struct net_device *dev, int phy_id, int location){	uint retval;	mdio_read_data_t* mrd = (mdio_read_data_t *)kmalloc(sizeof(*mrd), GFP_KERNEL);	mrd->sleeping_task = current;	set_current_state(TASK_INTERRUPTIBLE);	mii_queue(dev, mk_mii_read(location), mdio_callback, (unsigned int) mrd);	schedule();	retval = mrd->regval;	kfree(mrd);	return retval;}void mdio_write(struct net_device *dev, int phy_id, int location, int value){	mii_queue(dev, mk_mii_write(location, value), NULL, 0);}static int fec_enet_ioctl(struct net_device *dev, struct ifreq *rq, int cmd){	struct fec_enet_private *cep = (struct fec_enet_private *)dev->priv;	struct mii_ioctl_data *data = (struct mii_ioctl_data *)&rq->ifr_data;	int phy = cep->phy_addr & 0x1f;	int retval;	if (data == NULL) {		retval = -EINVAL;	} else {		switch(cmd) {		case SIOCETHTOOL:			return netdev_ethtool_ioctl(dev, (void*)rq->ifr_data);			break;		case SIOCGMIIPHY:		/* Get address of MII PHY in use. */		case SIOCDEVPRIVATE:		/* for binary compat, remove in 2.5 */			data->phy_id = phy;		case SIOCGMIIREG:		/* Read MII PHY register.	*/		case SIOCDEVPRIVATE+1:		/* for binary compat, remove in 2.5 */			data->val_out = mdio_read (dev,						data->phy_id & 0x1f,						data->reg_num & 0x1f);			retval = 0;			break;		case SIOCSMIIREG:		/* Write MII PHY register.	*/		case SIOCDEVPRIVATE+2:		/* for binary compat, remove in 2.5 */			if (!capable(CAP_NET_ADMIN)) {				retval = -EPERM;			} else {				mdio_write(dev,					data->phy_id & 0x1f,					data->reg_num & 0x1f,					data->val_in);				retval = 0;			}			break;		default:			retval = -EOPNOTSUPP;			break;		}	}	return retval;}static int netdev_ethtool_ioctl (struct net_device *dev, void *useraddr){	u32 ethcmd;	/* dev_ioctl() in ../../net/core/dev.c has already checked	   capable(CAP_NET_ADMIN), so don't bother with that here.  */	if (copy_from_user (&ethcmd, useraddr, sizeof (ethcmd)))		return -EFAULT;	switch (ethcmd) {	case ETHTOOL_GDRVINFO:		{			struct ethtool_drvinfo info = { ETHTOOL_GDRVINFO };			strcpy (info.driver, dev->name);			strcpy (info.version, "0.2");			strcpy (info.bus_info, "");			if (copy_to_user (useraddr, &info, sizeof (info)))				return -EFAULT;			return 0;		}	default:		break;	}	return -EOPNOTSUPP;}#endif	/* CONFIG_USE_MDIO *//* Returns the CRC needed when filling in the hash table for * multicast group filtering * pAddr must point to a MAC address (6 bytes) */static u32 fec_mulicast_calc_crc(char *pAddr){	u8	byte;	int	byte_count;	int	bit_count;	u32	crc = 0xffffffff;	u8	msb;	for (byte_count=0; byte_count<6; byte_count++) {        	byte = pAddr[byte_count];		for (bit_count=0; bit_count<8; bit_count++) {            		msb = crc >> 31;            		crc <<= 1;            		if (msb ^ (byte & 0x1)) {                		crc ^= FEC_CRC_POLY;   	    		}            		byte >>= 1;		}        }	return (crc);}/* Set or clear the multicast filter for this adaptor. * Skeleton taken from sunlance driver. * The CPM Ethernet implementation allows Multicast as well as individual * MAC address filtering.  Some of the drivers check to make sure it is * a group multicast address, and discard those that are not.  I guess I * will do the same for now, but just remove the test if you want * individual filtering as well (do the upper net layers want or support * this kind of feature?). */static void set_multicast_list(struct net_device *dev){	struct	fec_enet_private *fep;	volatile fec_t *ep;	fep = (struct fec_enet_private *)dev->priv;	ep = &(((immap_t *)IMAP_ADDR)->im_cpm.cp_fec);	if (dev->flags&IFF_PROMISC) {		/* Log any net taps. */		printk("%s: Promiscuous mode enabled.\n", dev->name);		ep->fec_r_cntrl |= FEC_RCNTRL_PROM;	} else {		ep->fec_r_cntrl &= ~FEC_RCNTRL_PROM;		if (dev->flags & IFF_ALLMULTI) {			/* Catch all multicast addresses, so set the			 * filter to all 1's.			 */			ep->fec_hash_table_high = 0xffffffff;			ep->fec_hash_table_low = 0xffffffff;		} else {			struct dev_mc_list *pmc = dev->mc_list;			/* Clear Hash-Table			*/			ep->fec_hash_table_high = 0;			ep->fec_hash_table_low = 0;			/* Now populate the hash table			*/#ifdef DEBUG_MULTICAST			if (pmc) {				printk ("%s: Recalculating hash-table:\n",					dev->name);				printk (" MAC Address         high     low\n");			}#endif			while (pmc) {				u32	crc;				int	temp;				u32	csrVal;				int	hash_index;				crc = fec_mulicast_calc_crc(pmc->dmi_addr);				temp = (crc & 0x3f) >> 1;				hash_index = ((temp & 0x01) << 4) |					     ((temp & 0x02) << 2) |					     ((temp & 0x04))      |					     ((temp & 0x08) >> 2) |					     ((temp & 0x10) >> 4);				csrVal = (1 << hash_index);				if (crc & 1) {					ep->fec_hash_table_high	|= csrVal;				}				else {					ep->fec_hash_table_low	|= csrVal;				}#ifdef DEBUG_MULTICAST				printk (" %02x:%02x:%02x:%02x:%02x:%02x   %08x %08x\n",					(int)pmc->dmi_addr[0],					(int)pmc->dmi_addr[1],					(int)pmc->dmi_addr[2],					(int)pmc->dmi_addr[3],					(int)pmc->dmi_addr[4],					(int)pmc->dmi_addr[5],					ep->fec_hash_table_high,					ep->fec_hash_table_low				);#endif				pmc = pmc->next;			}		}#if 0		else {			/* Clear filter and add the addresses in the list.			*/			ep->sen_gaddr1 = 0;			ep->sen_gaddr2 = 0;			ep->sen_gaddr3 = 0;			ep->sen_gaddr4 = 0;			dmi = dev->mc_list;			for (i=0; i<dev->mc_count; i++) {

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日韩天堂在线观看| 夜夜嗨av一区二区三区中文字幕| 日韩欧美你懂的| 欧美精品成人一区二区三区四区| 在线免费观看视频一区| 91丨九色丨尤物| 91欧美一区二区| 91在线一区二区三区| 91麻豆成人久久精品二区三区| av在线不卡电影| 91影院在线观看| 91免费视频网| 欧美三级电影网站| 日韩一区二区免费在线观看| 91麻豆精品国产无毒不卡在线观看| 欧美日韩视频第一区| 91麻豆精品国产综合久久久久久| 欧美一区二区播放| 久久只精品国产| 中文字幕一区二区视频| 一区二区在线看| 亚洲r级在线视频| 久久66热re国产| 成人午夜精品在线| 欧洲人成人精品| 日韩一区二区在线免费观看| 久久久天堂av| 亚洲人成网站色在线观看| 伊人开心综合网| 免费高清不卡av| 成人免费高清视频| 欧美性生交片4| 中文字幕在线观看一区| 亚洲一区视频在线| 久久超碰97人人做人人爱| 国产成人日日夜夜| 欧美亚洲高清一区| 欧美大肚乱孕交hd孕妇| 国产精品久久久久四虎| 亚洲一区在线观看免费| 韩国成人精品a∨在线观看| 成人午夜av电影| 欧美电影影音先锋| 国产色婷婷亚洲99精品小说| 亚洲人成精品久久久久| 免播放器亚洲一区| 91在线porny国产在线看| 欧美一级黄色大片| 1区2区3区欧美| 老司机午夜精品99久久| 99视频超级精品| 日韩欧美在线网站| 亚洲视频在线观看三级| 蜜臀av一区二区在线免费观看| 成人国产精品视频| 91精品福利在线一区二区三区| 国产精品另类一区| 精品无人区卡一卡二卡三乱码免费卡| 99这里只有久久精品视频| 日韩无一区二区| 亚洲免费看黄网站| 国产成人亚洲综合a∨猫咪| 欧美理论在线播放| 亚洲人妖av一区二区| 国产专区欧美精品| 欧美精品亚洲二区| 国产精品久久久爽爽爽麻豆色哟哟| 午夜精品视频一区| 99re成人精品视频| 精品国产成人在线影院 | 天堂一区二区在线| 成人动漫视频在线| 欧美xxxxx牲另类人与| 亚洲一区在线电影| 91亚洲精品一区二区乱码| 精品国产精品网麻豆系列| 亚洲aaa精品| 91国产视频在线观看| 国产精品美女久久久久aⅴ| 九九**精品视频免费播放| 欧美日韩成人一区二区| 自拍偷拍亚洲激情| 顶级嫩模精品视频在线看| 日韩精品一区二区三区四区| 丝袜亚洲另类欧美综合| 日本道免费精品一区二区三区| 欧美经典一区二区| 国产成人免费在线| 久久久91精品国产一区二区三区| 麻豆91免费观看| 欧美一区二视频| 婷婷久久综合九色国产成人| 在线看一区二区| 亚洲精品伦理在线| 91视视频在线观看入口直接观看www | 国产精品资源在线观看| 欧美肥大bbwbbw高潮| 亚洲黄色片在线观看| 色婷婷av一区二区三区软件| 国产精品国产精品国产专区不蜜 | 青青草国产成人99久久| 欧美日本一道本| 丝袜美腿亚洲一区二区图片| 欧美日韩一级片网站| 亚洲成人资源在线| 69堂成人精品免费视频| 奇米精品一区二区三区在线观看一| 色8久久精品久久久久久蜜 | 粉嫩久久99精品久久久久久夜| 久久久噜噜噜久久中文字幕色伊伊| 激情综合色综合久久综合| 久久免费精品国产久精品久久久久| 精品亚洲国内自在自线福利| 久久丝袜美腿综合| 国产不卡在线播放| 亚洲欧美在线aaa| 一本色道a无线码一区v| 亚洲国产视频一区二区| 欧美美女视频在线观看| 日本美女一区二区三区| 精品剧情v国产在线观看在线| 久久99在线观看| 久久嫩草精品久久久久| 成人黄色网址在线观看| 亚洲免费观看高清完整| 欧美日韩成人高清| 国内精品视频一区二区三区八戒| 国产婷婷精品av在线| 成人sese在线| 亚洲国产精品麻豆| 26uuu久久天堂性欧美| 成人免费va视频| 亚洲国产精品天堂| 久久久精品综合| 91在线观看免费视频| 日韩不卡一二三区| 中文在线资源观看网站视频免费不卡 | 六月婷婷色综合| 国产精品狼人久久影院观看方式| 在线国产亚洲欧美| 精品一区二区三区在线观看国产| 国产欧美视频在线观看| 色av成人天堂桃色av| 久久精品国产亚洲一区二区三区| 中文字幕精品一区| 欧美日本韩国一区| 国产成人精品1024| 亚洲一区二区三区视频在线| 日韩精品一区二区三区三区免费| 成人美女在线视频| 日韩国产精品久久久| 国产精品免费久久久久| 在线播放视频一区| 99在线热播精品免费| 日韩精品一级中文字幕精品视频免费观看| 久久众筹精品私拍模特| 在线欧美日韩国产| 国产成人无遮挡在线视频| 天天av天天翘天天综合网色鬼国产 | 欧美日韩国产一区| 欧美妇女性影城| av在线免费不卡| 国产在线精品视频| 亚洲6080在线| 亚洲视频 欧洲视频| 欧美一区日韩一区| 色噜噜久久综合| 播五月开心婷婷综合| 久久成人久久鬼色| 首页综合国产亚洲丝袜| 亚洲精品成人精品456| 国产蜜臀av在线一区二区三区| 日韩欧美另类在线| 7777精品伊人久久久大香线蕉的| 96av麻豆蜜桃一区二区| 国产福利一区二区| 日韩av电影天堂| 亚洲综合丝袜美腿| 亚洲人成精品久久久久| 亚洲国产成人一区二区三区| 欧美成人性战久久| 91精品国产综合久久精品图片| 欧洲亚洲国产日韩| 91蝌蚪porny| 91免费看`日韩一区二区| 懂色av一区二区在线播放| 国产专区综合网| 极品少妇xxxx偷拍精品少妇| 日韩国产欧美三级| 日韩福利电影在线| 丝袜亚洲另类欧美综合| 亚洲精品乱码久久久久久| 国产精品天美传媒沈樵| 日韩欧美久久久| 欧美大片日本大片免费观看| 欧美日韩精品一区视频| 激情丁香综合五月| 国产精品综合二区| 久久国产精品72免费观看| 日韩高清一区二区|