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

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

?? rtl8139.c

?? linux_8139驅(qū)動源碼,研究一遍
?? C
?? 第 1 頁 / 共 5 頁
字號:
		tp->tx_full = 0;	tp->cur_rx = 0;	tp->dirty_tx = tp->cur_tx = 0;		tp->txPtr = tp->txPtr=0;		memset(tp->txDescArray, 0x0, NUM_CP_TX_DESC*sizeof(struct CPlusTxDesc));	memset(tp->rxDescArray, 0x0, NUM_CP_RX_DESC*sizeof(struct CPlusRxDesc)); 	for (i=0 ; i<NUM_CP_TX_DESC ; i++)		tp->tx_skbuff[i]=0;	for (i=0; i <NUM_CP_RX_DESC; i++) {		if(i==NUM_CP_RX_DESC-1)			tp->rxDescArray[i].status = 0xC0000000+RX_BUF_SIZE;		else			tp->rxDescArray[i].status = 0x80000000+RX_BUF_SIZE;		tp->rxBufferRing[i]=kmalloc(RX_BUF_SIZE, GFP_KERNEL);		tp->rxDescArray[i].buf_addr=virt_to_bus(tp->rxBufferRing[i]);	}}/* Initialize the Rx and Tx rings, along with various 'dev' bits. */static voidrtl8129_init_ring(struct net_device *dev){	struct rtl8129_private *tp = (struct rtl8129_private *)dev->priv;	int i;	tp->tx_full = 0;	tp->cur_rx = 0;	tp->dirty_tx = tp->cur_tx = 0;	for (i = 0; i < NUM_TX_DESC; i++) {		tp->tx_skbuffa[i] = 0;		tp->tx_buf[i] = &tp->tx_bufs[i*TX_BUF_SIZE];	}}static int rtl8139cp_start_xmit(struct sk_buff *skb, struct net_device *dev){	struct rtl8129_private *tp = (struct rtl8129_private *)dev->priv;	long ioaddr = dev->base_addr;	int entry;	if (test_and_set_bit(0, (void*)&dev->tbusy) != 0) {		if (jiffies - dev->trans_start >= TX_TIMEOUT)			rtl8129_tx_timeout(dev);		return 1;	}	entry=tp->cur_tx%NUM_CP_TX_DESC;	tp->tx_skbuff[entry] = skb;	tp->txDescArray[entry].buf_addr=virt_to_bus(skb->data);	if(entry!=NUM_CP_TX_DESC-1)	  tp->txDescArray[entry].status= 0xB0000000 |(skb->len > ETH_ZLEN ? skb->len : ETH_ZLEN);        else	  tp->txDescArray[entry].status= 0xF0000000 |(skb->len > ETH_ZLEN ? skb->len : ETH_ZLEN);         outb(0x40, ioaddr+CPlusTxPoll);	if (++tp->cur_tx - tp->dirty_tx < NUM_CP_TX_DESC)  /* Typical path */		clear_bit(0, (void*)&dev->tbusy);	else {		set_bit(0, &tp->tx_full);		if (tp->cur_tx - (volatile int)tp->dirty_tx < NUM_CP_TX_DESC) {			clear_bit(0, (void*)&dev->tbusy);			clear_bit(0, &tp->tx_full);		}	}	dev->trans_start = jiffies;	if (debug > 4)		printk(KERN_DEBUG"%s: Queued Tx packet at %p size %d to slot %d.\n",			   dev->name, skb->data, (int)skb->len, entry);	return 0;}static intrtl8129_start_xmit(struct sk_buff *skb, struct net_device *dev){	struct rtl8129_private *tp = (struct rtl8129_private *)dev->priv;	long ioaddr = dev->base_addr;	int entry;	/* Block a timer-based transmit from overlapping.  This could better be	   done with atomic_swap(1, dev->tbusy), but set_bit() works as well. */	if (test_and_set_bit(0, (void*)&dev->tbusy) != 0) {		if (jiffies - dev->trans_start >= TX_TIMEOUT)			rtl8129_tx_timeout(dev);		return 1;	}	/* Calculate the next Tx descriptor entry. */	entry = tp->cur_tx % NUM_TX_DESC;	tp->tx_skbuffa[entry] = skb;	if ((long)skb->data & 3) {			/* Must use alignment buffer. */		memcpy(tp->tx_buf[entry], skb->data, skb->len);		outl(virt_to_bus(tp->tx_buf[entry]), ioaddr + TxAddr0 + entry*4);	} else		outl(virt_to_bus(skb->data), ioaddr + TxAddr0 + entry*4);	/* Note: the chip doesn't have auto-pad! */	outl(tp->tx_flag | (skb->len >= ETH_ZLEN ? skb->len : ETH_ZLEN),		 ioaddr + TxStatus0 + entry*4);	/* There is a race condition here -- we might read dirty_tx, take an	   interrupt that clears the Tx queue, and only then set tx_full.	   So we do this in two phases. */	if (++tp->cur_tx - tp->dirty_tx < NUM_TX_DESC)	/* Typical path */		clear_bit(0, (void*)&dev->tbusy);	else {		set_bit(0, &tp->tx_full);		if (tp->cur_tx - (volatile int)tp->dirty_tx < NUM_TX_DESC) {			clear_bit(0, (void*)&dev->tbusy);			clear_bit(0, &tp->tx_full);		}	}	dev->trans_start = jiffies;	if (debug > 4)		printk(KERN_DEBUG"%s: Queued Tx packet at %p size %d to slot %d.\n",			   dev->name, skb->data, (int)skb->len, entry);	return 0;}/* The interrupt handler does all of the Rx thread work and cleans up   after the Tx thread. */static void rtl8139CP_interrupt(int irq, void *dev_instance, struct pt_regs *regs){	struct net_device *dev = (struct net_device *)dev_instance;	struct rtl8129_private *tp = (struct rtl8129_private *)dev->priv;	int boguscnt = max_interrupt_work;	long ioaddr = dev->base_addr;	int link_changed = 0;#if defined(__i386__)	/* A lock to prevent simultaneous entry bug on Intel SMP machines. */	if (test_and_set_bit(0, (void*)&dev->interrupt)) {		printk(KERN_ERR"%s: SMP simultaneous entry of an interrupt handler.\n",			   dev->name);		dev->interrupt = 0;	/* Avoid halting machine. */		return;	}#else	if (dev->interrupt) {		printk(KERN_ERR "%s: Re-entering the interrupt handler.\n", dev->name);		return;	}	dev->interrupt = 1;#endif	do {		int status = inw(ioaddr + IntrStatus);		/* Acknowledge all of the current interrupt sources ASAP, but		   an first get an additional status bit from CSCR. */                if ((status & RxUnderrun)  &&  inw(ioaddr+CSCR) & CSCR_LinkChangeBit)                {   link_changed = inw(ioaddr+CSCR) & CSCR_LinkChangeBit;        	/* If link OK, disable Link Down Power Saving mode.           	If link OFF, enable it. This mode is avaiable only for RTL8139C */                                  if((inb(ioaddr+TxConfig+3) & 0x7C)==0x74)                                                 // 0x74 is RTL8139C HW Ver.                    {                        if( (inb(ioaddr + MediaStatus) & LINK_Status)==0)                           outb(inb(ioaddr+Config5) | 0x4, ioaddr+Config5);                        else                           outb(inb(ioaddr+Config5) & 0xB, ioaddr+Config5);                    }                }		if (status & (RxFIFOOver | RxOverflow) )			outw( RxFIFOOver & RxOverflow, ioaddr + IntrStatus);		if (status & TxErr)			outl( 0x01, ioaddr + TxConfig);		outw(status, ioaddr + IntrStatus);		if (debug > 4)			printk(KERN_DEBUG"%s: interrupt  status=%#4.4x new intstat=%#4.4x.\n",				   dev->name, status, inw(ioaddr + IntrStatus));		if ((status & (PCIErr|PCSTimeout|RxUnderrun|RxOverflow|RxFIFOOver|TxErr|TxOK|RxErr|RxOK)) == 0)			break;		if (status & (RxOK|RxUnderrun|RxOverflow|RxFIFOOver))/* Rx interrupt */			rtl8139cp_rx(dev);		if (status & (TxErr | TxOK)) {			unsigned int dirty_tx = tp->dirty_tx;			while (tp->cur_tx - dirty_tx > 0) {				int entry = dirty_tx % NUM_CP_TX_DESC;				/* Free the original skb. */				dev_free_skb(tp->tx_skbuff[entry]);				tp->tx_skbuff[entry] = 0;				if (test_bit(0, &tp->tx_full)) {					/* The ring is no longer full, clear tbusy. */					clear_bit(0, &tp->tx_full);					clear_bit(0, (void*)&dev->tbusy);					netif_wake_queue(dev);				}				dirty_tx++;				tp->stats.tx_packets++;			}#ifndef final_version			if (tp->cur_tx - dirty_tx > NUM_CP_TX_DESC) {				printk(KERN_ERR"%s: Out-of-sync dirty pointer, %d vs. %d, full=%d.\n",					   dev->name, dirty_tx, tp->cur_tx, (int)tp->tx_full);				dirty_tx += NUM_CP_TX_DESC;			}#endif			tp->dirty_tx = dirty_tx;		}		/* Check uncommon events with one test. */		if (status & (PCIErr|PCSTimeout |RxUnderrun|RxOverflow|RxFIFOOver					  |TxErr|RxErr)) {			if (debug > 2)				printk(KERN_NOTICE"%s: Abnormal interrupt, status %8.8x.\n",					   dev->name, status);			if (status == 0xffff)				break;			/* Update the error count. */			tp->stats.rx_missed_errors += inl(ioaddr + RxMissed);			outl(0, ioaddr + RxMissed);			if ((status & RxUnderrun)  &&  link_changed  &&				(tp->drv_flags & HAS_LNK_CHNG)) {				/* Really link-change on new chips. */				int lpar = inw(ioaddr + NWayLPAR);				int duplex = (lpar&0x0100) || (lpar & 0x01C0) == 0x0040					|| tp->duplex_lock; 				if (tp->full_duplex != duplex) {					tp->full_duplex = duplex;					outb(Cfg9346_Unlock, ioaddr + Cfg9346);					outb(tp->full_duplex ? 0x60 : 0x20, ioaddr + Config1);					outb(Cfg9346_Lock, ioaddr + Cfg9346);				}				status &= ~RxUnderrun;			}			if (status & (RxUnderrun | RxOverflow | RxErr | RxFIFOOver))				tp->stats.rx_errors++;			if (status & (PCSTimeout)) tp->stats.rx_length_errors++;			if (status & (RxUnderrun|RxFIFOOver)) tp->stats.rx_fifo_errors++;			if (status & RxOverflow) {				tp->stats.rx_over_errors++;			}			if (status & PCIErr) {				u32 pci_cmd_status;				pci_read_config_dword(tp->pci_dev, PCI_COMMAND, &pci_cmd_status);				printk(KERN_ERR "%s: PCI Bus error %4.4x.\n",					   dev->name, pci_cmd_status);			}		}		if (--boguscnt < 0) {			printk(KERN_WARNING"%s: Too much work at interrupt, "				   "IntrStatus=0x%4.4x.\n",				   dev->name, status);			/* Clear all interrupt sources. */			outw(0xffff, ioaddr + IntrStatus);			break;		}	} while (1);	if (debug > 3)		printk(KERN_DEBUG"%s: exiting interrupt, intr_status=%#4.4x.\n",			   dev->name, inw(ioaddr + IntrStatus));#if defined(__i386__)	clear_bit(0, (void*)&dev->interrupt);#else	dev->interrupt = 0;#endif	return;}/* The interrupt handler does all of the Rx thread work and cleans up   after the Tx thread. */static void rtl8129_interrupt(int irq, void *dev_instance, struct pt_regs *regs){	struct net_device *dev = (struct net_device *)dev_instance;	struct rtl8129_private *tp = (struct rtl8129_private *)dev->priv;	int boguscnt = max_interrupt_work;	long ioaddr = dev->base_addr;	int link_changed = 0;		/* Grrr, avoid bogus "uninitialized" warning */#if defined(__i386__)	/* A lock to prevent simultaneous entry bug on Intel SMP machines. */	if (test_and_set_bit(0, (void*)&dev->interrupt)) {		printk(KERN_ERR"%s: SMP simultaneous entry of an interrupt handler.\n",			   dev->name);		dev->interrupt = 0;	/* Avoid halting machine. */		return;	}#else	if (dev->interrupt) {		printk(KERN_ERR "%s: Re-entering the interrupt handler.\n", dev->name);		return;	}	dev->interrupt = 1;#endif	do {		int status = inw(ioaddr + IntrStatus);		/* Acknowledge all of the current interrupt sources ASAP, but		   an first get an additional status bit from CSCR. */                if ((status & RxUnderrun)  &&  inw(ioaddr+CSCR) & CSCR_LinkChangeBit)                {   link_changed = inw(ioaddr+CSCR) & CSCR_LinkChangeBit;        /* If link OK, disable Link Down Power Saving mode.           If link OFF, enable it. This mode is avaiable only for RTL8139C */                                        if((inb(ioaddr+TxConfig+3) & 0x7C)==0x74)                                                 // 0x74 is RTL8139C HW Ver.                    {                        if((inb(ioaddr+GPPinData) & 0x04)==0)                           outb(inb(ioaddr+Config5) | 0x4, ioaddr+Config5);                        else                           outb(inb(ioaddr+Config5) & 0xB, ioaddr+Config5);                    }                }/*		if (status & RxUnderrun)			link_changed = inw(ioaddr+CSCR) & CSCR_LinkChangeBit;*/		outw(status, ioaddr + IntrStatus);		if (debug > 4)			printk(KERN_DEBUG"%s: interrupt  status=%#4.4x new intstat=%#4.4x.\n",				   dev->name, status, inw(ioaddr + IntrStatus));		if ((status & (PCIErr|PCSTimeout|RxUnderrun|RxOverflow|RxFIFOOver					   |TxErr|TxOK|RxErr|RxOK)) == 0)			break;		if (status & (RxOK|RxUnderrun|RxOverflow|RxFIFOOver))/* Rx interrupt */			rtl8129_rx(dev);		if (status & (TxOK | TxErr)) {			unsigned int dirty_tx = tp->dirty_tx;			while (tp->cur_tx - dirty_tx > 0) {				int entry = dirty_tx % NUM_TX_DESC;				int txstatus = inl(ioaddr + TxStatus0 + entry*4);				if ( ! (txstatus & (TxStatOK | TxUnderrun | TxAborted)))					break;			/* It still hasn't been Txed */				/* Note: TxCarrierLost is always asserted at 100mbps. */				if (txstatus & (TxOutOfWindow | TxAborted)) {					/* There was an major error, log it. */					if (debug > 1)						printk(KERN_NOTICE"%s: Transmit error, Tx status %8.8x.\n",							   dev->name, txstatus);					tp->stats.tx_errors++;					if (txstatus&TxAborted) {						tp->stats.tx_aborted_errors++;						outl(TX_DMA_BURST << TX_DMA_BURST_SHIFT, ioaddr + TxConfig);					}					if (txstatus&TxCarrierLost) tp->stats.tx_carrier_errors++;					if (txstatus&TxOutOfWindow) tp->stats.tx_window_errors++;#ifdef ETHER_STATS					if ((txstatus & 0x0f000000) == 0x0f000000)						tp->stats.collisions16++;#endif				} else {					if (txstatus & TxUnderrun) {						/* Add 64 to the Tx FIFO threshold. */						if (tp->tx_flag <  0x00300000)							tp->tx_flag += 0x00020000;						tp->stats.tx_fifo_errors++;					}					tp->stats.collisions += (txstatus >> 24) & 15;#if LINUX_VERSION_CODE > 0x20119					tp->stats.tx_bytes += txstatus & 0x7ff;#endif					tp->stats.tx_packets++;				}				/* Free the original skb. */				dev_free_skb(tp->tx_skbuffa[entry]);				tp->tx_skbuffa[entry] = 0;				if (test_bit(0, &tp->tx_full)) {					/* The ring is no longer full, clear tbusy. */					clear_bit(0, &tp->tx_full);					clear_bit(0, (void*)&dev->tbusy);					netif_wake_queue(dev);				}				dirty_tx++;			}#ifndef final_version			if (tp->cur_tx - dirty_tx > NUM_TX_DESC) {				printk(KERN_ERR"%s: Out-of-sync dirty pointer, %d vs. %d, full=%d.\n",					   dev->name, dirty_tx, tp->cur_tx, (int)tp->tx_full);				dirty_tx += NUM_TX_DESC;

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产一区中文字幕| 亚洲成av人影院| 国产成人午夜视频| 久久久噜噜噜久噜久久综合| 激情文学综合插| 国产日本亚洲高清| 99v久久综合狠狠综合久久| 1024精品合集| 欧美亚洲图片小说| 日本vs亚洲vs韩国一区三区 | 色偷偷久久一区二区三区| 国产精品你懂的| 日本乱码高清不卡字幕| 日韩精品电影在线观看| 日韩亚洲电影在线| 国产成人一级电影| 亚洲同性同志一二三专区| 欧美在线视频不卡| 黑人巨大精品欧美一区| 一区在线观看视频| 69av一区二区三区| 国产精品亚洲午夜一区二区三区 | 成人午夜av影视| 亚洲综合久久av| 精品国产一区二区亚洲人成毛片| 粉嫩aⅴ一区二区三区四区| 亚洲一区二区欧美| 久久久久久久性| 欧美午夜精品一区二区三区| 极品美女销魂一区二区三区| 亚洲男女毛片无遮挡| 日韩一区二区三区在线视频| 99久久国产综合精品女不卡| 婷婷综合在线观看| 亚洲欧美在线视频| 精品久久久久一区二区国产| 色婷婷久久一区二区三区麻豆| 免费人成网站在线观看欧美高清| 日韩一区在线看| 久久综合一区二区| 欧美日韩国产在线播放网站| 成人高清视频在线观看| 久久aⅴ国产欧美74aaa| 亚洲一二三四区| 国产精品美女久久久久av爽李琼 | 亚洲天堂av老司机| 久久人人爽爽爽人久久久| 欧美亚洲综合久久| 成人毛片视频在线观看| 韩国av一区二区三区四区| 视频一区免费在线观看| 亚洲精品成人天堂一二三| 国产日韩精品视频一区| 日韩精品在线网站| 欧美日韩国产一区二区三区地区| 成人午夜电影久久影院| 久久精品国产77777蜜臀| 一区二区三区国产精华| 国产精品久久久久影视| 国产婷婷精品av在线| 欧美精品一区二区三区高清aⅴ| 欧美亚洲愉拍一区二区| 一本一本大道香蕉久在线精品 | 国产在线精品一区二区夜色 | 日韩欧美精品在线| 欧美日韩视频在线第一区| 91在线视频在线| 9久草视频在线视频精品| 国产精华液一区二区三区| 久久av资源网| 韩国一区二区在线观看| 久久国产精品第一页| 日韩精品一区第一页| 丝袜美腿成人在线| 日本亚洲一区二区| 天堂一区二区在线| 日本中文在线一区| 日本午夜一区二区| 美女视频第一区二区三区免费观看网站| 午夜欧美一区二区三区在线播放| 粉嫩aⅴ一区二区三区四区| 国产精品影视网| 国产不卡高清在线观看视频| 成人一区二区在线观看| 成人爱爱电影网址| 91网站在线观看视频| 91黄色在线观看| 欧美日韩免费观看一区三区| 欧美日韩国产天堂| 日韩欧美一二三四区| 精品欧美久久久| 国产欧美中文在线| 亚洲图片另类小说| 天天综合天天做天天综合| 蜜桃av一区二区三区电影| 国产一区视频导航| 成人精品免费网站| 欧美午夜影院一区| 日韩午夜激情免费电影| 国产亚洲1区2区3区| 国产精品黄色在线观看| 亚洲一区二区视频在线观看| 日韩综合小视频| 国产精品中文字幕日韩精品| www.亚洲国产| 在线不卡a资源高清| 久久亚洲二区三区| 亚洲视频一区二区免费在线观看| 亚洲成在线观看| 国产一区二区主播在线| 99免费精品在线观看| 欧美美女喷水视频| 国产农村妇女毛片精品久久麻豆 | 91成人免费在线视频| 欧美一级午夜免费电影| 国产欧美日韩在线看| 亚洲一区二区欧美日韩| 国产精品综合网| 欧美在线观看一区| 久久青草欧美一区二区三区| 亚洲精品免费播放| 黄色精品一二区| 欧美在线视频全部完| 久久久国际精品| 亚洲h动漫在线| 成人午夜视频网站| 日韩一区二区精品葵司在线| 国产精品国产自产拍高清av王其| 午夜精品久久久久久久久久| 粉嫩av亚洲一区二区图片| 欧美一区二区在线免费观看| 亚洲欧美自拍偷拍色图| 韩国女主播成人在线观看| 欧美日韩久久久一区| 欧美激情一区二区三区不卡| 奇米四色…亚洲| 在线看日本不卡| 国产精品国产a级| 极品少妇xxxx精品少妇偷拍| 欧美日韩亚洲综合一区二区三区| 国产精品欧美久久久久无广告| 蜜臀av性久久久久蜜臀aⅴ流畅 | 午夜精品一区二区三区免费视频| 高清日韩电视剧大全免费| 日韩午夜精品电影| 亚洲成a人片综合在线| 色偷偷88欧美精品久久久| 久久久www成人免费无遮挡大片| 秋霞电影网一区二区| 欧美日韩一二三区| 亚洲精品国产一区二区精华液 | 日韩视频永久免费| 亚洲成人免费影院| 色老综合老女人久久久| 国产精品卡一卡二卡三| 国产成人小视频| 国产午夜三级一区二区三| 精品午夜久久福利影院| 日韩午夜在线观看| 蜜桃av噜噜一区| 色婷婷久久久综合中文字幕 | 欧美日韩日日摸| 26uuu国产电影一区二区| 日本伊人精品一区二区三区观看方式| 一本到高清视频免费精品| 日韩一区欧美小说| 成人av动漫在线| 国产综合久久久久久久久久久久 | 五月天欧美精品| 欧美成人女星排行榜| 成人性视频免费网站| 亚洲乱码国产乱码精品精98午夜| 欧美精品久久久久久久久老牛影院| 久草在线在线精品观看| 中文字幕在线播放不卡一区| 欧美日韩国产综合草草| 国产一区二区三区在线观看精品| ...xxx性欧美| 日韩视频免费观看高清完整版在线观看| 国产69精品一区二区亚洲孕妇| 一区二区欧美精品| 久久免费美女视频| 欧美吻胸吃奶大尺度电影| 国产精品影视天天线| 亚洲丶国产丶欧美一区二区三区| 久久综合色8888| 欧美伊人久久大香线蕉综合69| 韩国三级中文字幕hd久久精品| 国产精品电影院| 欧美r级在线观看| 色噜噜狠狠色综合欧洲selulu| 国产一区二区视频在线播放| 亚洲在线视频免费观看| 国产精品热久久久久夜色精品三区| 欧美日韩国产精品成人| av在线不卡观看免费观看| 麻豆国产精品777777在线| 一区二区三区精品视频在线| 日本一区二区在线不卡| 日韩精品一区在线|