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

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

?? winbond-840.c

?? LINUX 2.6.17.4的源碼
?? C
?? 第 1 頁 / 共 4 頁
字號:
	/* Initialize the Tx descriptors */	for (i = 0; i < TX_RING_SIZE; i++) {		np->tx_skbuff[i] = NULL;		np->tx_ring[i].status = 0;	}	np->tx_full = 0;	np->tx_q_bytes = np->dirty_tx = np->cur_tx = 0;	iowrite32(np->ring_dma_addr, np->base_addr + RxRingPtr);	iowrite32(np->ring_dma_addr+sizeof(struct w840_rx_desc)*RX_RING_SIZE,		np->base_addr + TxRingPtr);}static void free_rxtx_rings(struct netdev_private* np){	int i;	/* Free all the skbuffs in the Rx queue. */	for (i = 0; i < RX_RING_SIZE; i++) {		np->rx_ring[i].status = 0;		if (np->rx_skbuff[i]) {			pci_unmap_single(np->pci_dev,						np->rx_addr[i],						np->rx_skbuff[i]->len,						PCI_DMA_FROMDEVICE);			dev_kfree_skb(np->rx_skbuff[i]);		}		np->rx_skbuff[i] = NULL;	}	for (i = 0; i < TX_RING_SIZE; i++) {		if (np->tx_skbuff[i]) {			pci_unmap_single(np->pci_dev,						np->tx_addr[i],						np->tx_skbuff[i]->len,						PCI_DMA_TODEVICE);			dev_kfree_skb(np->tx_skbuff[i]);		}		np->tx_skbuff[i] = NULL;	}}static void init_registers(struct net_device *dev){	struct netdev_private *np = netdev_priv(dev);	void __iomem *ioaddr = np->base_addr;	int i;	for (i = 0; i < 6; i++)		iowrite8(dev->dev_addr[i], ioaddr + StationAddr + i);	/* Initialize other registers. */#ifdef __BIG_ENDIAN	i = (1<<20);	/* Big-endian descriptors */#else	i = 0;#endif	i |= (0x04<<2);		/* skip length 4 u32 */	i |= 0x02;		/* give Rx priority */	/* Configure the PCI bus bursts and FIFO thresholds.	   486: Set 8 longword cache alignment, 8 longword burst.	   586: Set 16 longword cache alignment, no burst limit.	   Cache alignment bits 15:14	     Burst length 13:8		0000	<not allowed> 		0000 align to cache	0800 8 longwords		4000	8  longwords		0100 1 longword		1000 16 longwords		8000	16 longwords		0200 2 longwords	2000 32 longwords		C000	32  longwords		0400 4 longwords */#if defined (__i386__) && !defined(MODULE)	/* When not a module we can work around broken '486 PCI boards. */	if (boot_cpu_data.x86 <= 4) {		i |= 0x4800;		printk(KERN_INFO "%s: This is a 386/486 PCI system, setting cache "			   "alignment to 8 longwords.\n", dev->name);	} else {		i |= 0xE000;	}#elif defined(__powerpc__) || defined(__i386__) || defined(__alpha__) || defined(__ia64__) || defined(__x86_64__)	i |= 0xE000;#elif defined(__sparc__)	i |= 0x4800;#else#warning Processor architecture undefined	i |= 0x4800;#endif	iowrite32(i, ioaddr + PCIBusCfg);	np->csr6 = 0;	/* 128 byte Tx threshold; 		Transmit on; Receive on; */	update_csr6(dev, 0x00022002 | update_link(dev) | __set_rx_mode(dev));	/* Clear and Enable interrupts by setting the interrupt mask. */	iowrite32(0x1A0F5, ioaddr + IntrStatus);	iowrite32(0x1A0F5, ioaddr + IntrEnable);	iowrite32(0, ioaddr + RxStartDemand);}static void tx_timeout(struct net_device *dev){	struct netdev_private *np = netdev_priv(dev);	void __iomem *ioaddr = np->base_addr;	printk(KERN_WARNING "%s: Transmit timed out, status %8.8x,"		   " resetting...\n", dev->name, ioread32(ioaddr + IntrStatus));	{		int i;		printk(KERN_DEBUG "  Rx ring %p: ", np->rx_ring);		for (i = 0; i < RX_RING_SIZE; i++)			printk(" %8.8x", (unsigned int)np->rx_ring[i].status);		printk("\n"KERN_DEBUG"  Tx ring %p: ", np->tx_ring);		for (i = 0; i < TX_RING_SIZE; i++)			printk(" %8.8x", np->tx_ring[i].status);		printk("\n");	}	printk(KERN_DEBUG "Tx cur %d Tx dirty %d Tx Full %d, q bytes %d.\n",				np->cur_tx, np->dirty_tx, np->tx_full, np->tx_q_bytes);	printk(KERN_DEBUG "Tx Descriptor addr %xh.\n",ioread32(ioaddr+0x4C));	disable_irq(dev->irq);	spin_lock_irq(&np->lock);	/*	 * Under high load dirty_tx and the internal tx descriptor pointer	 * come out of sync, thus perform a software reset and reinitialize	 * everything.	 */	iowrite32(1, np->base_addr+PCIBusCfg);	udelay(1);	free_rxtx_rings(np);	init_rxtx_rings(dev);	init_registers(dev);	spin_unlock_irq(&np->lock);	enable_irq(dev->irq);	netif_wake_queue(dev);	dev->trans_start = jiffies;	np->stats.tx_errors++;	return;}/* Initialize the Rx and Tx rings, along with various 'dev' bits. */static int alloc_ringdesc(struct net_device *dev){	struct netdev_private *np = netdev_priv(dev);	np->rx_buf_sz = (dev->mtu <= 1500 ? PKT_BUF_SZ : dev->mtu + 32);	np->rx_ring = pci_alloc_consistent(np->pci_dev,			sizeof(struct w840_rx_desc)*RX_RING_SIZE +			sizeof(struct w840_tx_desc)*TX_RING_SIZE,			&np->ring_dma_addr);	if(!np->rx_ring)		return -ENOMEM;	init_rxtx_rings(dev);	return 0;}static void free_ringdesc(struct netdev_private *np){	pci_free_consistent(np->pci_dev,			sizeof(struct w840_rx_desc)*RX_RING_SIZE +			sizeof(struct w840_tx_desc)*TX_RING_SIZE,			np->rx_ring, np->ring_dma_addr);}static int start_tx(struct sk_buff *skb, struct net_device *dev){	struct netdev_private *np = netdev_priv(dev);	unsigned entry;	/* Caution: the write order is important here, set the field	   with the "ownership" bits last. */	/* Calculate the next Tx descriptor entry. */	entry = np->cur_tx % TX_RING_SIZE;	np->tx_addr[entry] = pci_map_single(np->pci_dev,				skb->data,skb->len, PCI_DMA_TODEVICE);	np->tx_skbuff[entry] = skb;	np->tx_ring[entry].buffer1 = np->tx_addr[entry];	if (skb->len < TX_BUFLIMIT) {		np->tx_ring[entry].length = DescWholePkt | skb->len;	} else {		int len = skb->len - TX_BUFLIMIT;		np->tx_ring[entry].buffer2 = np->tx_addr[entry]+TX_BUFLIMIT;		np->tx_ring[entry].length = DescWholePkt | (len << 11) | TX_BUFLIMIT;	}	if(entry == TX_RING_SIZE-1)		np->tx_ring[entry].length |= DescEndRing;	/* Now acquire the irq spinlock.	 * The difficult race is the the ordering between	 * increasing np->cur_tx and setting DescOwn:	 * - if np->cur_tx is increased first the interrupt	 *   handler could consider the packet as transmitted	 *   since DescOwn is cleared.	 * - If DescOwn is set first the NIC could report the	 *   packet as sent, but the interrupt handler would ignore it	 *   since the np->cur_tx was not yet increased.	 */	spin_lock_irq(&np->lock);	np->cur_tx++;	wmb(); /* flush length, buffer1, buffer2 */	np->tx_ring[entry].status = DescOwn;	wmb(); /* flush status and kick the hardware */	iowrite32(0, np->base_addr + TxStartDemand);	np->tx_q_bytes += skb->len;	/* Work around horrible bug in the chip by marking the queue as full	   when we do not have FIFO room for a maximum sized packet. */	if (np->cur_tx - np->dirty_tx > TX_QUEUE_LEN ||		((np->drv_flags & HasBrokenTx) && np->tx_q_bytes > TX_BUG_FIFO_LIMIT)) {		netif_stop_queue(dev);		wmb();		np->tx_full = 1;	}	spin_unlock_irq(&np->lock);	dev->trans_start = jiffies;	if (debug > 4) {		printk(KERN_DEBUG "%s: Transmit frame #%d queued in slot %d.\n",			   dev->name, np->cur_tx, entry);	}	return 0;}static void netdev_tx_done(struct net_device *dev){	struct netdev_private *np = netdev_priv(dev);	for (; np->cur_tx - np->dirty_tx > 0; np->dirty_tx++) {		int entry = np->dirty_tx % TX_RING_SIZE;		int tx_status = np->tx_ring[entry].status;		if (tx_status < 0)			break;		if (tx_status & 0x8000) { 	/* There was an error, log it. */#ifndef final_version			if (debug > 1)				printk(KERN_DEBUG "%s: Transmit error, Tx status %8.8x.\n",					   dev->name, tx_status);#endif			np->stats.tx_errors++;			if (tx_status & 0x0104) np->stats.tx_aborted_errors++;			if (tx_status & 0x0C80) np->stats.tx_carrier_errors++;			if (tx_status & 0x0200) np->stats.tx_window_errors++;			if (tx_status & 0x0002) np->stats.tx_fifo_errors++;			if ((tx_status & 0x0080) && np->mii_if.full_duplex == 0)				np->stats.tx_heartbeat_errors++;		} else {#ifndef final_version			if (debug > 3)				printk(KERN_DEBUG "%s: Transmit slot %d ok, Tx status %8.8x.\n",					   dev->name, entry, tx_status);#endif			np->stats.tx_bytes += np->tx_skbuff[entry]->len;			np->stats.collisions += (tx_status >> 3) & 15;			np->stats.tx_packets++;		}		/* Free the original skb. */		pci_unmap_single(np->pci_dev,np->tx_addr[entry],					np->tx_skbuff[entry]->len,					PCI_DMA_TODEVICE);		np->tx_q_bytes -= np->tx_skbuff[entry]->len;		dev_kfree_skb_irq(np->tx_skbuff[entry]);		np->tx_skbuff[entry] = NULL;	}	if (np->tx_full &&		np->cur_tx - np->dirty_tx < TX_QUEUE_LEN_RESTART &&		np->tx_q_bytes < TX_BUG_FIFO_LIMIT) {		/* The ring is no longer full, clear tbusy. */		np->tx_full = 0;		wmb();		netif_wake_queue(dev);	}}/* The interrupt handler does all of the Rx thread work and cleans up   after the Tx thread. */static irqreturn_t intr_handler(int irq, void *dev_instance, struct pt_regs *rgs){	struct net_device *dev = (struct net_device *)dev_instance;	struct netdev_private *np = netdev_priv(dev);	void __iomem *ioaddr = np->base_addr;	int work_limit = max_interrupt_work;	int handled = 0;	if (!netif_device_present(dev))		return IRQ_NONE;	do {		u32 intr_status = ioread32(ioaddr + IntrStatus);		/* Acknowledge all of the current interrupt sources ASAP. */		iowrite32(intr_status & 0x001ffff, ioaddr + IntrStatus);		if (debug > 4)			printk(KERN_DEBUG "%s: Interrupt, status %4.4x.\n",				   dev->name, intr_status);		if ((intr_status & (NormalIntr|AbnormalIntr)) == 0)			break;		handled = 1;		if (intr_status & (IntrRxDone | RxNoBuf))			netdev_rx(dev);		if (intr_status & RxNoBuf)			iowrite32(0, ioaddr + RxStartDemand);		if (intr_status & (TxIdle | IntrTxDone) &&			np->cur_tx != np->dirty_tx) {			spin_lock(&np->lock);			netdev_tx_done(dev);			spin_unlock(&np->lock);		}		/* Abnormal error summary/uncommon events handlers. */		if (intr_status & (AbnormalIntr | TxFIFOUnderflow | IntrPCIErr |						   TimerInt | IntrTxStopped))			netdev_error(dev, intr_status);		if (--work_limit < 0) {			printk(KERN_WARNING "%s: Too much work at interrupt, "				   "status=0x%4.4x.\n", dev->name, intr_status);			/* Set the timer to re-enable the other interrupts after			   10*82usec ticks. */			spin_lock(&np->lock);			if (netif_device_present(dev)) {				iowrite32(AbnormalIntr | TimerInt, ioaddr + IntrEnable);				iowrite32(10, ioaddr + GPTimer);			}			spin_unlock(&np->lock);			break;		}	} while (1);	if (debug > 3)		printk(KERN_DEBUG "%s: exiting interrupt, status=%#4.4x.\n",			   dev->name, ioread32(ioaddr + IntrStatus));	return IRQ_RETVAL(handled);}/* This routine is logically part of the interrupt handler, but separated   for clarity and better register allocation. */static int netdev_rx(struct net_device *dev){	struct netdev_private *np = netdev_priv(dev);	int entry = np->cur_rx % RX_RING_SIZE;	int work_limit = np->dirty_rx + RX_RING_SIZE - np->cur_rx;	if (debug > 4) {		printk(KERN_DEBUG " In netdev_rx(), entry %d status %4.4x.\n",			   entry, np->rx_ring[entry].status);	}	/* If EOP is set on the next entry, it's a new packet. Send it up. */	while (--work_limit >= 0) {		struct w840_rx_desc *desc = np->rx_head_desc;		s32 status = desc->status;		if (debug > 4)			printk(KERN_DEBUG "  netdev_rx() status was %8.8x.\n",				   status);		if (status < 0)			break;		if ((status & 0x38008300) != 0x0300) {			if ((status & 0x38000300) != 0x0300) {				/* Ingore earlier buffers. */				if ((status & 0xffff) != 0x7fff) {					printk(KERN_WARNING "%s: Oversized Ethernet frame spanned "						   "multiple buffers, entry %#x status %4.4x!\n",						   dev->name, np->cur_rx, status);					np->stats.rx_length_errors++;				}			} else if (status & 0x8000) {				/* There was a fatal error. */				if (debug > 2)					printk(KERN_DEBUG "%s: Receive error, Rx status %8.8x.\n",						   dev->name, status);				np->stats.rx_errors++; /* end of a packet.*/				if (status & 0x0890) np->stats.rx_length_errors++;				if (status & 0x004C) np->stats.rx_frame_errors++;				if (status & 0x0002) np->stats.rx_crc_errors++;			}		} else {			struct sk_buff *skb;			/* Omit the four octet CRC from the length. */			int pkt_len = ((status >> 16) & 0x7ff) - 4;#ifndef final_version			if (debug > 4)				printk(KERN_DEBUG "  netdev_rx() normal Rx pkt length %d"					   " status %x.\n", pkt_len, status);#endif			/* Check if the packet is long enough to accept without copying			   to a minimally-sized skbuff. */			if (pkt_len < rx_copybreak				&& (skb = dev_alloc_skb(pkt_len + 2)) != NULL) {				skb->dev = dev;				skb_reserve(skb, 2);	/* 16 byte align the IP header */				pci_dma_sync_single_for_cpu(np->pci_dev,np->rx_addr[entry],							    np->rx_skbuff[entry]->len,							    PCI_DMA_FROMDEVICE);				eth_copy_and_sum(skb, np->rx_skbuff[entry]->data, pkt_len, 0);				skb_put(skb, pkt_len);				pci_dma_sync_single_for_device(np->pci_dev,np->rx_addr[entry],							       np->rx_skbuff[entry]->len,							       PCI_DMA_FROMDEVICE);			} else {				pci_unmap_single(np->pci_dev,np->rx_addr[entry],							np->rx_skbuff[entry]->len,							PCI_DMA_FROMDEVICE);				skb_put(skb = np->rx_skbuff[entry], pkt_len);				np->rx_skbuff[entry] = NULL;			}#ifndef final_version				/* Remove after testing. */			/* You will want this info for the initial debug. */			if (debug > 5)				printk(KERN_DEBUG "  Rx data %2.2x:%2.2x:%2.2x:%2.2x:%2.2x:"					   "%2.2x %2.2x:%2.2x:%2.2x:%2.2x:%2.2x:%2.2x %2.2x%2.2x "					   "%d.%d.%d.%d.\n",					   skb->data[0], skb->data[1], skb->data[2], skb->data[3],

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
麻豆精品视频在线观看| 国精品**一区二区三区在线蜜桃| 亚洲天堂av一区| www.亚洲在线| 精品人伦一区二区色婷婷| 国产精品1区二区.| 久久久蜜臀国产一区二区| 不卡的看片网站| 亚洲不卡在线观看| 亚洲欧美日韩中文字幕一区二区三区| 精品视频在线免费看| 亚洲午夜羞羞片| 国产成人av福利| 久久久.com| 国产精品一色哟哟哟| 欧美日韩国产精品成人| 精品久久久久一区| 亚洲欧美视频在线观看视频| 国产综合色视频| 精品精品欲导航| 日韩一区二区三免费高清| 欧美成人官网二区| 亚洲自拍偷拍欧美| 色婷婷国产精品综合在线观看| 亚洲免费观看高清完整版在线观看| 国产sm精品调教视频网站| 3d动漫精品啪啪| 国产精品久久久久久久久快鸭 | 国产成人av网站| 日韩女优制服丝袜电影| 日韩欧美国产一区在线观看| 国产在线不卡一区| 国产精品一区二区黑丝| 丁香一区二区三区| 国产成人精品综合在线观看| 99久久精品99国产精品| 欧美亚洲综合另类| 韩国v欧美v日本v亚洲v| 中文一区在线播放| 69堂成人精品免费视频| 丁香婷婷综合网| 极品瑜伽女神91| 国产精品主播直播| 天天色天天爱天天射综合| 在线观看欧美黄色| 97久久超碰精品国产| 亚洲精品一区二区三区影院| 亚洲国产精品久久久久秋霞影院| 91免费在线看| 日本韩国欧美一区二区三区| 久久成人麻豆午夜电影| 亚洲午夜一二三区视频| 精品第一国产综合精品aⅴ| 国产精品无码永久免费888| 麻豆精品国产传媒mv男同| 亚洲一区二区欧美| 日韩国产一二三区| 色综合网站在线| 久久美女艺术照精彩视频福利播放| 亚洲免费观看高清完整版在线观看熊 | 国产精品视频你懂的| 亚洲chinese男男1069| 午夜视频一区在线观看| 亚洲最大色网站| 香蕉乱码成人久久天堂爱免费| 一区在线观看视频| 最新高清无码专区| 欧美日韩高清影院| 欧美色视频在线| 欧美一区二区三区系列电影| 国产精品污污网站在线观看| 激情丁香综合五月| 精品88久久久久88久久久| 精品久久久网站| 欧美性色欧美a在线播放| 久久久久九九视频| 91成人免费在线视频| 国产精品天美传媒| 国产成人av一区| 亚洲乱码国产乱码精品精小说| 国产色综合久久| 性久久久久久久久| 国产mv日韩mv欧美| 美女网站色91| 成人精品一区二区三区四区| 欧美在线不卡一区| 日韩一区在线播放| 粉嫩13p一区二区三区| 91 com成人网| 国产人成亚洲第一网站在线播放| 不卡电影一区二区三区| 美日韩一区二区| 奇米色一区二区三区四区| 日韩中文字幕区一区有砖一区 | 国产蜜臀av在线一区二区三区| 欧美成va人片在线观看| 91精品国产91久久久久久一区二区| 欧美午夜精品久久久久久孕妇| 欧美影视一区二区三区| 欧美精品免费视频| 精品国产乱码久久久久久久| 久久精品日产第一区二区三区高清版| 日韩一区二区免费视频| 色婷婷av一区二区三区gif| 91香蕉视频污在线| 欧美午夜电影网| 日韩欧美国产午夜精品| 欧美韩日一区二区三区| 亚洲三级小视频| 免费在线观看成人| 丰满少妇久久久久久久| 欧美伊人久久大香线蕉综合69| 精品视频1区2区| 日韩免费视频线观看| 国产精品久久久久久久久免费相片| 亚洲一二三四区不卡| 日韩国产在线一| 国产ts人妖一区二区| 欧美精品乱码久久久久久| 久久嫩草精品久久久精品| 亚洲精品欧美专区| 国产综合色视频| 欧美优质美女网站| 久久精品视频在线看| 性感美女极品91精品| 床上的激情91.| 宅男噜噜噜66一区二区66| 国产精品嫩草影院com| 天使萌一区二区三区免费观看| 国产精品一区二区在线观看不卡 | 青青草原综合久久大伊人精品优势| 国产成人午夜99999| 欧美日韩国产区一| 亚洲人吸女人奶水| 国产成人亚洲综合a∨婷婷| 欧美精品成人一区二区三区四区| 国产喷白浆一区二区三区| 天天色图综合网| 欧美主播一区二区三区| 中文字幕一区二区三中文字幕 | 色88888久久久久久影院按摩| 欧美大度的电影原声| 中文字幕视频一区二区三区久| 免费xxxx性欧美18vr| 欧美亚洲综合一区| 亚洲欧美色一区| 成人性生交大片免费| 日韩免费一区二区| 麻豆91精品视频| 欧美精品免费视频| 亚洲一二三四在线| 欧美性做爰猛烈叫床潮| 亚洲成a人片在线观看中文| 成人高清免费观看| 国产偷v国产偷v亚洲高清| 蜜桃传媒麻豆第一区在线观看| 精品视频在线视频| 日日摸夜夜添夜夜添亚洲女人| 日本精品一级二级| 一区二区三区在线免费| 在线一区二区三区四区五区 | 成人免费高清在线| 国产精品久久午夜| 波多野洁衣一区| 亚洲丝袜自拍清纯另类| 91麻豆swag| 亚洲午夜激情网页| 91精品黄色片免费大全| 奇米色一区二区| 欧美精品一区二区在线观看| 麻豆精品在线播放| 日本一区二区视频在线| 国产成a人亚洲精品| 亚洲天堂精品在线观看| 欧美吞精做爰啪啪高潮| 日韩电影免费在线看| 亚洲精品一区二区三区蜜桃下载 | 欧美久久久久中文字幕| 裸体在线国模精品偷拍| 欧美高清在线视频| 在线亚洲人成电影网站色www| 日韩中文字幕一区二区三区| 亚洲精品一区二区三区蜜桃下载| 国产精品一卡二卡在线观看| 日韩一级片在线播放| 久久99国产精品麻豆| 国产精品久久久久国产精品日日| 91成人在线免费观看| 极品销魂美女一区二区三区| 国产精品久久久久aaaa樱花| 欧美日韩成人激情| 国产二区国产一区在线观看| 一区二区三区影院| 欧美成人官网二区| 一本久久a久久免费精品不卡| 麻豆91在线看| 一区二区视频免费在线观看| 日韩三级高清在线| 99久久伊人久久99| 精品一区二区在线视频|