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

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

?? fec.c

?? linux驅(qū)動源碼
?? C
?? 第 1 頁 / 共 5 頁
字號:
			bdp++;		}	}#endif	if (!fep->tx_full) {		netif_wake_queue(dev);	}}/* The interrupt handler. * This is called from the MPC core interrupt. */static	voidfec_enet_interrupt(int irq, void * dev_id, struct pt_regs * regs){	struct	net_device *dev = dev_id;	volatile fec_t	*fecp;	uint	int_events;#ifdef CONFIG_FEC_PACKETHOOK	struct	fec_enet_private *fep = dev->priv;	__u32 regval;	if (fep->ph_regaddr) regval = *fep->ph_regaddr;#endif	fecp = (volatile fec_t*)dev->base_addr;	/* Get the interrupt events that caused us to be here.	*/	while ((int_events = fecp->fec_ievent) != 0) {		fecp->fec_ievent = int_events;		if ((int_events & (FEC_ENET_HBERR | FEC_ENET_BABR |				   FEC_ENET_BABT | FEC_ENET_EBERR)) != 0) {			printk("FEC ERROR %x\n", int_events);		}		/* Handle receive event in its own function.		 */		if (int_events & FEC_ENET_RXF) {#ifdef CONFIG_FEC_PACKETHOOK			fec_enet_rx(dev, regval);#else			fec_enet_rx(dev);#endif		}		/* Transmit OK, or non-fatal error. Update the buffer		   descriptors. FEC handles all errors, we just discover		   them as part of the transmit process.		*/		if (int_events & FEC_ENET_TXF) {#ifdef CONFIG_FEC_PACKETHOOK			fec_enet_tx(dev, regval);#else			fec_enet_tx(dev);#endif		}		if (int_events & FEC_ENET_MII) {#ifdef	CONFIG_USE_MDIO			fec_enet_mii(dev);#elseprintk("%s[%d] %s: unexpected FEC_ENET_MII event\n", __FILE__,__LINE__,__FUNCTION__);#endif	/* CONFIG_USE_MDIO */		}	}}static void#ifdef CONFIG_FEC_PACKETHOOKfec_enet_tx(struct net_device *dev, __u32 regval)#elsefec_enet_tx(struct net_device *dev)#endif{	struct	fec_enet_private *fep;	volatile cbd_t	*bdp;	struct	sk_buff	*skb;	fep = dev->priv;	spin_lock(&fep->lock);	bdp = fep->dirty_tx;	while ((bdp->cbd_sc&BD_ENET_TX_READY) == 0) {		if (bdp == fep->cur_tx && fep->tx_full == 0)			break;		skb = fep->tx_skbuff[fep->skb_dirty];		/* Check for errors. */		if (bdp->cbd_sc & (BD_ENET_TX_HB | BD_ENET_TX_LC |				   BD_ENET_TX_RL | BD_ENET_TX_UN |				   BD_ENET_TX_CSL)) {			fep->stats.tx_errors++;			if (bdp->cbd_sc & BD_ENET_TX_HB)  /* No heartbeat */				fep->stats.tx_heartbeat_errors++;			if (bdp->cbd_sc & BD_ENET_TX_LC)  /* Late collision */				fep->stats.tx_window_errors++;			if (bdp->cbd_sc & BD_ENET_TX_RL)  /* Retrans limit */				fep->stats.tx_aborted_errors++;			if (bdp->cbd_sc & BD_ENET_TX_UN)  /* Underrun */				fep->stats.tx_fifo_errors++;			if (bdp->cbd_sc & BD_ENET_TX_CSL) /* Carrier lost */				fep->stats.tx_carrier_errors++;		} else {#ifdef CONFIG_FEC_PACKETHOOK			/* Packet hook ... */			if (fep->ph_txhandler &&			    ((struct ethhdr *)skb->data)->h_proto			    == fep->ph_proto) {				fep->ph_txhandler((__u8*)skb->data, skb->len,						  regval, fep->ph_priv);			}#endif			fep->stats.tx_packets++;		}#ifndef final_version		if (bdp->cbd_sc & BD_ENET_TX_READY)			printk("HEY! Enet xmit interrupt and TX_READY.\n");#endif		/* Deferred means some collisions occurred during transmit,		 * but we eventually sent the packet OK.		 */		if (bdp->cbd_sc & BD_ENET_TX_DEF)			fep->stats.collisions++;		/* Free the sk buffer associated with this last transmit.		 */#if 0printk("TXI: %x %x %x\n", bdp, skb, fep->skb_dirty);#endif		dev_kfree_skb_irq (skb/*, FREE_WRITE*/);		fep->tx_skbuff[fep->skb_dirty] = NULL;		fep->skb_dirty = (fep->skb_dirty + 1) & TX_RING_MOD_MASK;		/* Update pointer to next buffer descriptor to be transmitted.		 */		if (bdp->cbd_sc & BD_ENET_TX_WRAP)			bdp = fep->tx_bd_base;		else			bdp++;		/* Since we have freed up a buffer, the ring is no longer		 * full.		 */		if (fep->tx_full) {			fep->tx_full = 0;			if (netif_queue_stopped(dev))				netif_wake_queue(dev);		}#ifdef CONFIG_FEC_PACKETHOOK		/* Re-read register. Not exactly guaranteed to be correct,		   but... */		if (fep->ph_regaddr) regval = *fep->ph_regaddr;#endif	}	fep->dirty_tx = (cbd_t *)bdp;	spin_unlock(&fep->lock);}/* During a receive, the cur_rx points to the current incoming buffer. * When we update through the ring, if the next incoming buffer has * not been given to the system, we just set the empty indicator, * effectively tossing the packet. */static void#ifdef CONFIG_FEC_PACKETHOOKfec_enet_rx(struct net_device *dev, __u32 regval)#elsefec_enet_rx(struct net_device *dev)#endif{	struct	fec_enet_private *fep;	volatile fec_t	*fecp;	volatile cbd_t *bdp;	struct	sk_buff	*skb;	ushort	pkt_len;	__u8 *data;	fep = dev->priv;	fecp = (volatile fec_t*)dev->base_addr;	/* First, grab all of the stats for the incoming packet.	 * These get messed up if we get called due to a busy condition.	 */	bdp = fep->cur_rx;while (!(bdp->cbd_sc & BD_ENET_RX_EMPTY)) {#ifndef final_version	/* Since we have allocated space to hold a complete frame,	 * the last indicator should be set.	 */	if ((bdp->cbd_sc & BD_ENET_RX_LAST) == 0)		printk("FEC ENET: rcv is not +last\n");#endif	/* Check for errors. */	if (bdp->cbd_sc & (BD_ENET_RX_LG | BD_ENET_RX_SH | BD_ENET_RX_NO |			   BD_ENET_RX_CR | BD_ENET_RX_OV)) {		fep->stats.rx_errors++;		if (bdp->cbd_sc & (BD_ENET_RX_LG | BD_ENET_RX_SH)) {		/* Frame too long or too short. */			fep->stats.rx_length_errors++;		}		if (bdp->cbd_sc & BD_ENET_RX_NO)	/* Frame alignment */			fep->stats.rx_frame_errors++;		if (bdp->cbd_sc & BD_ENET_RX_CR)	/* CRC Error */			fep->stats.rx_crc_errors++;		if (bdp->cbd_sc & BD_ENET_RX_OV)	/* FIFO overrun */			fep->stats.rx_crc_errors++;	}	/* Report late collisions as a frame error.	 * On this error, the BD is closed, but we don't know what we	 * have in the buffer.  So, just drop this frame on the floor.	 */	if (bdp->cbd_sc & BD_ENET_RX_CL) {		fep->stats.rx_errors++;		fep->stats.rx_frame_errors++;		goto rx_processing_done;	}	/* Process the incoming frame.	 */	fep->stats.rx_packets++;	pkt_len = bdp->cbd_datlen;	fep->stats.rx_bytes += pkt_len;	data = (__u8*)__va(bdp->cbd_bufaddr);#ifdef CONFIG_FEC_PACKETHOOK	/* Packet hook ... */	if (fep->ph_rxhandler) {		if (((struct ethhdr *)data)->h_proto == fep->ph_proto) {			switch (fep->ph_rxhandler(data, pkt_len, regval,						  fep->ph_priv)) {			case 1:				goto rx_processing_done;				break;			case 0:				break;			default:				fep->stats.rx_errors++;				goto rx_processing_done;			}		}	}	/* If it wasn't filtered - copy it to an sk buffer. */#endif	/* This does 16 byte alignment, exactly what we need.	 * The packet length includes FCS, but we don't want to	 * include that when passing upstream as it messes up	 * bridging applications.	 */	skb = dev_alloc_skb(pkt_len-4);	if (skb == NULL) {		printk("%s: Memory squeeze, dropping packet.\n", dev->name);		fep->stats.rx_dropped++;	} else {		skb->dev = dev;		skb_put(skb,pkt_len-4);	/* Make room */		eth_copy_and_sum(skb,				 (unsigned char *)__va(bdp->cbd_bufaddr),				 pkt_len-4, 0);		skb->protocol=eth_type_trans(skb,dev);#ifdef DEBUG_MULTICAST		if (bdp->cbd_sc & BD_ENET_RX_MC) {			printk ("%s: Received Multicast packet DA: "				"%2x:%2x:%2x:%2x:%2x:%2x\n",				dev->name,				(int)data[0], (int)data[1],				(int)data[2], (int)data[3],				(int)data[4], (int)data[5]			);		}#endif		netif_rx(skb);	}rx_processing_done:	/* Clear the status flags for this buffer.	*/	bdp->cbd_sc &= ~BD_ENET_RX_STATS;	/* Mark the buffer empty.	*/	bdp->cbd_sc |= BD_ENET_RX_EMPTY;	/* Update BD pointer to next entry.	*/	if (bdp->cbd_sc & BD_ENET_RX_WRAP)		bdp = fep->rx_bd_base;	else		bdp++;#if 1	/* Doing this here will keep the FEC running while we process	 * incoming frames.  On a heavily loaded network, we should be	 * able to keep up at the expense of system resources.	 */	fecp->fec_r_des_active = 0x01000000;#endif#ifdef CONFIG_FEC_PACKETHOOK	/* Re-read register. Not exactly guaranteed to be correct,	   but... */	if (fep->ph_regaddr) regval = *fep->ph_regaddr;#endif   } /* while (!(bdp->cbd_sc & BD_ENET_RX_EMPTY)) */	fep->cur_rx = (cbd_t *)bdp;#if 0	/* Doing this here will allow us to process all frames in the	 * ring before the FEC is allowed to put more there.  On a heavily	 * loaded network, some frames may be lost.  Unfortunately, this	 * increases the interrupt overhead since we can potentially work	 * our way back to the interrupt return only to come right back	 * here.	 */	fecp->fec_r_des_active = 0x01000000;#endif}#ifdef	CONFIG_USE_MDIOstatic voidfec_enet_mii(struct net_device *dev){	struct	fec_enet_private *fep;	volatile fec_t	*ep;	mii_list_t	*mip;	uint		mii_reg;	fep = (struct fec_enet_private *)dev->priv;	ep = &(((immap_t *)IMAP_ADDR)->im_cpm.cp_fec);	mii_reg = ep->fec_mii_data;	if ((mip = mii_head) == NULL) {		printk("MII and no head!\n");		return;	}	if (mip->mii_func != NULL)		(*(mip->mii_func))(mii_reg, dev, mip->mii_data);	mii_head = mip->mii_next;	mip->mii_next = mii_free;	mii_free = mip;	if ((mip = mii_head) != NULL) {		ep->fec_mii_data = mip->mii_regval;	}}static intmii_queue (struct net_device *dev, int regval,	   void (*func)(uint, struct net_device *, uint),	   uint data){	struct fec_enet_private *fep;	unsigned long	flags;	mii_list_t	*mip;	int		retval;	/* Add PHY address to register command.	*/	fep = dev->priv;	regval |= fep->phy_addr << 23;	retval = 0;	save_flags(flags);	cli();	if ((mip = mii_free) != NULL) {		mii_free = mip->mii_next;		mip->mii_regval = regval;		mip->mii_func = func;		mip->mii_next = NULL;		mip->mii_data = data;		if (mii_head) {			mii_tail->mii_next = mip;			mii_tail = mip;		} else {			mii_head = mii_tail = mip;			(&(((immap_t *)IMAP_ADDR)->im_cpm.cp_fec))->fec_mii_data = regval;		}	} else {		retval = 1;	}	restore_flags(flags);	return(retval);}static void mii_do_cmd(struct net_device *dev, const phy_cmd_t *c){	int k;	if(!c)		return;	for(k = 0; (c+k)->mii_data != mk_mii_end; k++)		mii_queue(dev, (c+k)->mii_data, (c+k)->funct, 0);}static void mii_parse_sr(uint mii_reg, struct net_device *dev, uint data){	volatile struct fec_enet_private *fep = dev->priv;	uint s = fep->phy_status;	s &= ~(PHY_STAT_LINK | PHY_STAT_FAULT | PHY_STAT_ANC);	if (mii_reg & 0x0004)		s |= PHY_STAT_LINK;	if (mii_reg & 0x0010)		s |= PHY_STAT_FAULT;	if (mii_reg & 0x0020)		s |= PHY_STAT_ANC;	fep->phy_status = s;	fep->link = (s & PHY_STAT_LINK) ? 1 : 0;}static void mii_parse_cr(uint mii_reg, struct net_device *dev, uint data){	volatile struct fec_enet_private *fep = dev->priv;	uint s = fep->phy_status;	s &= ~(PHY_CONF_ANE | PHY_CONF_LOOP);	if (mii_reg & 0x1000)		s |= PHY_CONF_ANE;	if (mii_reg & 0x4000)		s |= PHY_CONF_LOOP;	fep->phy_status = s;}static void mii_parse_anar(uint mii_reg, struct net_device *dev, uint data){	volatile struct fec_enet_private *fep = dev->priv;	uint s = fep->phy_status;	s &= ~(PHY_CONF_SPMASK);	if (mii_reg & 0x0020)		s |= PHY_CONF_10HDX;	if (mii_reg & 0x0040)		s |= PHY_CONF_10FDX;	if (mii_reg & 0x0080)		s |= PHY_CONF_100HDX;	if (mii_reg & 0x0100)		s |= PHY_CONF_100FDX;	fep->phy_status = s;}#if 0static void mii_disp_reg(uint mii_reg, struct net_device *dev, uint data){	printk("reg %u = 0x%04x\n", (mii_reg >> 18) & 0x1f, mii_reg & 0xffff);}#endif/* ------------------------------------------------------------------------- *//* The Level one LXT970 is used by many boards				     */#ifdef CONFIG_FEC_LXT970#define MII_LXT970_MIRROR    16  /* Mirror register           */#define MII_LXT970_IER       17  /* Interrupt Enable Register */#define MII_LXT970_ISR       18  /* Interrupt Status Register */#define MII_LXT970_CONFIG    19  /* Configuration Register    */#define MII_LXT970_CSR       20  /* Chip Status Register      */static void mii_parse_lxt970_csr(uint mii_reg, struct net_device *dev, uint data){	volatile struct fec_enet_private *fep = dev->priv;	uint s = fep->phy_status;	s &= ~(PHY_STAT_SPMASK);	if (mii_reg & 0x0800) {		if (mii_reg & 0x1000)			s |= PHY_STAT_100FDX;		else			s |= PHY_STAT_100HDX;	} else {		if (mii_reg & 0x1000)			s |= PHY_STAT_10FDX;		else

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
午夜精品影院在线观看| 91美女视频网站| www国产成人| 激情综合网av| 欧美精彩视频一区二区三区| 国产精品一区二区久激情瑜伽| 国产喷白浆一区二区三区| 国产成人精品在线看| 亚洲欧美视频在线观看视频| 欧美午夜片在线观看| 精品一区二区三区免费播放| 亚洲国产成人自拍| 在线观看亚洲一区| 久久不见久久见免费视频1| 国产精品嫩草99a| 欧美三级欧美一级| 国产精品一区在线| 一区二区三区中文字幕在线观看| 欧美人动与zoxxxx乱| 国产精品一区二区无线| 亚洲精品伦理在线| 欧美成人精品1314www| 成人h精品动漫一区二区三区| 一级中文字幕一区二区| 欧美mv日韩mv国产| 91在线视频在线| 美美哒免费高清在线观看视频一区二区| 久久久久久久国产精品影院| 欧美亚洲综合色| 国产成人精品在线看| 亚洲va天堂va国产va久| 国产欧美精品区一区二区三区| 91官网在线观看| 国产精品一区2区| 亚洲mv在线观看| 成人免费在线视频观看| 精品乱人伦小说| 欧美制服丝袜第一页| 成人小视频免费观看| 日本中文字幕一区| 亚洲另类色综合网站| 久久精品一区二区三区av| 欧美亚洲国产怡红院影院| 国产成人午夜精品5599| 免费在线看成人av| 亚洲一区二区三区精品在线| 国产色综合一区| 精品久久久久香蕉网| 欧美日韩一级二级三级| 91蜜桃网址入口| 国产aⅴ综合色| 久久av资源站| 日韩av一级片| 亚洲一区成人在线| 中文字幕一区二区5566日韩| 久久亚洲精品国产精品紫薇| 欧美日韩国产在线观看| 欧美在线观看视频一区二区三区| 国产91精品入口| 国产激情视频一区二区三区欧美 | 一区二区三区四区不卡在线| 国产丝袜在线精品| 久久―日本道色综合久久| 日韩欧美一区二区不卡| 7777精品伊人久久久大香线蕉最新版 | 亚洲精品日日夜夜| 亚洲人123区| 亚洲人快播电影网| 亚洲欧美日韩国产综合| 中文字幕在线不卡| 中文字幕一区二区三区精华液| 久久久美女毛片| 久久精品视频在线看| 26uuu国产电影一区二区| 日韩精品中文字幕一区二区三区| 91精品国产综合久久小美女| 欧美一区二区美女| 欧美一级免费大片| 日韩免费一区二区三区在线播放| 日韩午夜电影在线观看| 日韩精品一区二区在线观看| 精品国产在天天线2019| ww久久中文字幕| 久久亚洲精精品中文字幕早川悠里 | 91.麻豆视频| 欧美tickling挠脚心丨vk| 久久久综合激的五月天| 国产精品三级视频| 亚洲欧美激情一区二区| 亚洲一区二区在线播放相泽| 亚洲成av人片一区二区| 美女网站一区二区| 成人久久视频在线观看| 91豆麻精品91久久久久久| 4438x成人网最大色成网站| 欧美成人一区二区三区片免费 | 亚洲少妇屁股交4| 亚洲免费在线播放| 日韩黄色免费电影| 国产美女久久久久| 91在线云播放| 欧美一区二区三区在线电影 | 中文字幕日本乱码精品影院| 亚洲一区二区三区四区的| 美腿丝袜亚洲综合| 成人综合在线观看| 日本精品视频一区二区三区| 日韩一区二区三区视频| 国产欧美va欧美不卡在线| 亚洲综合在线五月| 狠狠色狠狠色合久久伊人| av电影在线不卡| 久久久精品日韩欧美| 亚洲天堂网中文字| 日本伊人午夜精品| 99热在这里有精品免费| 91精品免费在线| 亚洲区小说区图片区qvod| 老司机精品视频线观看86| 99re8在线精品视频免费播放| 欧美一区二视频| 国产精品污www在线观看| 亚洲成人动漫精品| av亚洲精华国产精华精华| 欧美大白屁股肥臀xxxxxx| 尤物av一区二区| 国产成人免费网站| 欧美丰满美乳xxx高潮www| 国产精品乱码妇女bbbb| 六月丁香婷婷久久| 欧美视频一区在线观看| 欧美激情综合五月色丁香| 麻豆一区二区在线| 精品1区2区3区| 日韩一区日韩二区| 国产成人一区在线| 精品久久久久香蕉网| 午夜欧美视频在线观看| 99国产精品久| 国产清纯白嫩初高生在线观看91| 日本91福利区| 欧美人牲a欧美精品| 一区二区三区高清| av男人天堂一区| 国产精品欧美久久久久无广告| 久久精品国产成人一区二区三区| 精品视频免费看| 亚洲一区在线看| 日本电影欧美片| 亚洲免费观看高清完整版在线观看 | 日韩免费观看高清完整版在线观看| 亚洲精品免费在线| 色综合久久中文综合久久97| 欧美激情在线一区二区| 国产精品69久久久久水密桃| 日韩亚洲欧美中文三级| 日韩av电影免费观看高清完整版在线观看| 色婷婷综合在线| 中文字幕综合网| 91在线免费视频观看| 国产精品久久久久一区二区三区共| 久久91精品国产91久久小草 | 国产精品一区二区无线| 国产亚洲综合av| 国产精品亚洲成人| 欧美激情一区二区三区四区| 国产999精品久久久久久| 久久久久久久久久电影| 国产成人av电影在线观看| 久久精品男人的天堂| 国产精品资源在线看| 国产精品视频一二三| 成人av资源在线观看| 亚洲人成小说网站色在线| 色狠狠色狠狠综合| 亚洲一区二区偷拍精品| 欧美精品aⅴ在线视频| 亚洲va国产va欧美va观看| 欧美一区二区三区喷汁尤物| 日本成人在线网站| 久久久久久久网| 99久久久精品| 婷婷综合另类小说色区| 日韩一级二级三级| 国产精品自拍三区| 中文字幕色av一区二区三区| 欧美亚州韩日在线看免费版国语版| 天涯成人国产亚洲精品一区av| 欧美电影一区二区三区| 免费高清视频精品| 久久久777精品电影网影网| 不卡免费追剧大全电视剧网站| 一区二区三区在线观看国产| 欧美丰满高潮xxxx喷水动漫| 国产麻豆午夜三级精品| 亚洲欧美日韩国产综合| 日韩一级免费观看| 成人高清视频在线| 午夜不卡在线视频| 欧美高清一级片在线观看|