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

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

?? 3c509.c

?? linux 1.0 源代碼
?? C
?? 第 1 頁 / 共 2 頁
字號:
	/* Transmitter timeout, serious problems. */	if (dev->tbusy) {		int tickssofar = jiffies - dev->trans_start;		if (tickssofar < 10)			return 1;		printk("%s: transmit timed out, tx_status %2.2x status %4.4x.\n",			   dev->name, inb(ioaddr + TX_STATUS), inw(ioaddr + EL3_STATUS));		dev->trans_start = jiffies;		/* Issue TX_RESET and TX_START commands. */		outw(0x5800, ioaddr + EL3_CMD); /* TX_RESET */		outw(0x4800, ioaddr + EL3_CMD); /* TX_START */		dev->tbusy = 0;	}	if (skb == NULL) {		dev_tint(dev);		return 0;	}	/* Fill in the ethernet header. */	if (!skb->arp  &&  dev->rebuild_header(skb->data, dev)) {		skb->dev = dev;		arp_queue (skb);		return 0;	}	skb->arp=1;	if (skb->len <= 0)		return 0;	if (el3_debug > 4) {		printk("%s: el3_start_xmit(lenght = %ld) called, status %4.4x.\n",			   dev->name, skb->len, inw(ioaddr + EL3_STATUS));	}#ifndef final_version	{	/* Error-checking code, delete for 1.00. */		ushort status = inw(ioaddr + EL3_STATUS);		if (status & 0x0001 		/* IRQ line active, missed one. */			&& inw(ioaddr + EL3_STATUS) & 1) { 			/* Make sure. */			printk("%s: Missed interrupt, status then %04x now %04x"				   "  Tx %2.2x Rx %4.4x.\n", dev->name, status,				   inw(ioaddr + EL3_STATUS), inb(ioaddr + TX_STATUS),				   inw(ioaddr + RX_STATUS));			outw(0x7800, ioaddr + EL3_CMD); /* Fake interrupt trigger. */			outw(0x6899, ioaddr + EL3_CMD); /* Ack IRQ */			outw(0x78ff, ioaddr + EL3_CMD); /* Set all status bits visible. */		}	}#endif	/* Avoid timer-based retransmission conflicts. */	if (set_bit(0, (void*)&dev->tbusy) != 0)		printk("%s: Transmitter access conflict.\n", dev->name);	else {		/* Put out the doubleword header... */		outw(skb->len, ioaddr + TX_FIFO);		outw(0x00, ioaddr + TX_FIFO);		/* ... and the packet rounded to a doubleword. */		outsl(ioaddr + TX_FIFO, skb->data, (skb->len + 3) >> 2);			dev->trans_start = jiffies;		if (inw(ioaddr + TX_FREE) > 1536) {			dev->tbusy=0;		} else			/* Interrupt us when the FIFO has room for max-sized packet. */			outw(0x9000 + 1536, ioaddr + EL3_CMD);	}	if (skb->free)		kfree_skb (skb, FREE_WRITE);	/* Clear the Tx status stack. */	{		short tx_status;		int i = 4;		while (--i > 0	&&	(tx_status = inb(ioaddr + TX_STATUS)) > 0) {			if (el3_debug > 5)				printk("		Tx status %4.4x.\n", tx_status);			if (tx_status & 0x38) lp->stats.tx_aborted_errors++;			if (tx_status & 0x30) outw(0x5800, ioaddr + EL3_CMD);			if (tx_status & 0x3C) outw(0x4800, ioaddr + EL3_CMD);			outb(0x00, ioaddr + TX_STATUS); /* Pop the status stack. */		}	}	return 0;}/* The EL3 interrupt handler. */static voidel3_interrupt(int reg_ptr){	int irq = -(((struct pt_regs *)reg_ptr)->orig_eax+2);	struct device *dev = (struct device *)(irq2dev_map[irq]);	int ioaddr, status;	int i = 0;	if (dev == NULL) {		printk ("el3_interrupt(): irq %d for unknown device.\n", irq);		return;	}	if (dev->interrupt)		printk("%s: Re-entering the interrupt handler.\n", dev->name);	dev->interrupt = 1;	ioaddr = dev->base_addr;	status = inw(ioaddr + EL3_STATUS);	if (el3_debug > 4)		printk("%s: interrupt, status %4.4x.\n", dev->name, status);		while ((status = inw(ioaddr + EL3_STATUS)) & 0x01) {		if (status & 0x10)			el3_rx(dev);		if (status & 0x08) {			if (el3_debug > 5)				printk("	TX room bit was handled.\n");			/* There's room in the FIFO for a full-sized packet. */			outw(0x6808, ioaddr + EL3_CMD); /* Ack IRQ */			dev->tbusy = 0;			mark_bh(INET_BH);		}		if (status & 0x80)				/* Statistics full. */			update_stats(ioaddr, dev);				if (++i > 10) {			printk("%s: Infinite loop in interrupt, status %4.4x.\n",				   dev->name, status);			/* Clear all interrupts we have handled. */			outw(0x68FF, ioaddr + EL3_CMD);			break;		}		/* Acknowledge the IRQ. */		outw(0x6891, ioaddr + EL3_CMD); /* Ack IRQ */	}	if (el3_debug > 4) {		printk("%s: exiting interrupt, status %4.4x.\n", dev->name,			   inw(ioaddr + EL3_STATUS));	}		dev->interrupt = 0;	return;}static struct enet_statistics *el3_get_stats(struct device *dev){	struct el3_private *lp = (struct el3_private *)dev->priv;	sti();	update_stats(dev->base_addr, dev);	cli();	return &lp->stats;}/*  Update statistics.  We change to register window 6, so this should be run	single-threaded if the device is active. This is expected to be a rare	operation, and it's simpler for the rest of the driver to assume that	window 1 is always valid rather than use a special window-state variable.	*/static void update_stats(int ioaddr, struct device *dev){	struct el3_private *lp = (struct el3_private *)dev->priv;	if (el3_debug > 5)		printk("   Updating the statistics.\n");	/* Turn off statistics updates while reading. */	outw(0xB000, ioaddr + EL3_CMD);	/* Switch to the stats window, and read everything. */	EL3WINDOW(6);	lp->stats.tx_carrier_errors 	+= inb(ioaddr + 0);	lp->stats.tx_heartbeat_errors	+= inb(ioaddr + 1);	/* Multiple collisions. */	   	inb(ioaddr + 2);	lp->stats.collisions			+= inb(ioaddr + 3);	lp->stats.tx_window_errors		+= inb(ioaddr + 4);	lp->stats.rx_fifo_errors		+= inb(ioaddr + 5);	lp->stats.tx_packets			+= inb(ioaddr + 6);	lp->stats.rx_packets			+= inb(ioaddr + 7);	/* Tx deferrals */				inb(ioaddr + 8);	inw(ioaddr + 10);	/* Total Rx and Tx octets. */	inw(ioaddr + 12);	/* Back to window 1, and turn statistics back on. */	EL3WINDOW(1);	outw(0xA800, ioaddr + EL3_CMD);	return;}static intel3_rx(struct device *dev){	struct el3_private *lp = (struct el3_private *)dev->priv;	int ioaddr = dev->base_addr;	short rx_status;	if (el3_debug > 5)		printk("	   In rx_packet(), status %4.4x, rx_status %4.4x.\n",			   inw(ioaddr+EL3_STATUS), inw(ioaddr+RX_STATUS));	while ((rx_status = inw(ioaddr + RX_STATUS)) > 0) {		if (rx_status & 0x4000) { /* Error, update stats. */			short error = rx_status & 0x3800;			lp->stats.rx_errors++;			switch (error) {			case 0x0000:		lp->stats.rx_over_errors++; break;			case 0x0800:		lp->stats.rx_length_errors++; break;			case 0x1000:		lp->stats.rx_frame_errors++; break;			case 0x1800:		lp->stats.rx_length_errors++; break;			case 0x2000:		lp->stats.rx_frame_errors++; break;			case 0x2800:		lp->stats.rx_crc_errors++; break;			}		}		if ( (! (rx_status & 0x4000))			|| ! (rx_status & 0x1000)) { /* Dribble bits are OK. */			short pkt_len = rx_status & 0x7ff;			int sksize = sizeof(struct sk_buff) + pkt_len + 3;			struct sk_buff *skb;			skb = alloc_skb(sksize, GFP_ATOMIC);			if (el3_debug > 4)				printk("	   Receiving packet size %d status %4.4x.\n",					   pkt_len, rx_status);			if (skb != NULL) {				skb->mem_len = sksize;				skb->mem_addr = skb;				skb->len = pkt_len;				skb->dev = dev;				/* 'skb->data' points to the start of sk_buff data area. */				insl(ioaddr+RX_FIFO, skb->data,							(pkt_len + 3) >> 2);#ifdef HAVE_NETIF_RX				netif_rx(skb);				outw(0x4000, ioaddr + EL3_CMD); /* Rx discard */				continue;#else				skb->lock = 0;				if (dev_rint((unsigned char *)skb, pkt_len,							 IN_SKBUFF,dev)== 0){					if (el3_debug > 6)						printk("	 dev_rint() happy, status %4.4x.\n",						inb(ioaddr + EL3_STATUS));					outw(0x4000, ioaddr + EL3_CMD); /* Rx discard */					while (inw(ioaddr + EL3_STATUS) & 0x1000)					  printk("	Waiting for 3c509 to discard packet, status %x.\n",							 inw(ioaddr + EL3_STATUS) );					if (el3_debug > 6)						printk("	 discarded packet, status %4.4x.\n",						inb(ioaddr + EL3_STATUS));					continue;				} else {					printk("%s: receive buffers full.\n", dev->name);					kfree_s(skb, sksize);				}#endif			} else if (el3_debug)				printk("%s: Couldn't allocate a sk_buff of size %d.\n",					   dev->name, sksize);		}		lp->stats.rx_dropped++;		outw(0x4000, ioaddr + EL3_CMD); /* Rx discard */		while (inw(ioaddr + EL3_STATUS) & 0x1000)		  printk("	Waiting for 3c509 to discard packet, status %x.\n",				 inw(ioaddr + EL3_STATUS) );	}	if (el3_debug > 5)		printk("	   Exiting rx_packet(), status %4.4x, rx_status %4.4x.\n",			   inw(ioaddr+EL3_STATUS), inw(ioaddr+8));	return 0;}#ifdef HAVE_MULTICAST/* Set or clear the multicast filter for this adaptor.   num_addrs == -1		Promiscuous mode, receive all packets   num_addrs == 0		Normal mode, clear multicast list   num_addrs > 0		Multicast mode, receive normal and MC packets, and do						best-effort filtering. */static voidset_multicast_list(struct device *dev, int num_addrs, void *addrs){	short ioaddr = dev->base_addr;	if (num_addrs > 0) {		outw(0x8007, ioaddr + EL3_CMD);	} else if (num_addrs < 0) {		outw(0x8008, ioaddr + EL3_CMD);	} else		outw(0x8005, ioaddr + EL3_CMD);}#endifstatic intel3_close(struct device *dev){	int ioaddr = dev->base_addr;	if (el3_debug > 2)		printk("%s: Shutting down ethercard.\n", dev->name);	dev->tbusy = 1;	dev->start = 0;	/* Turn off statistics.	 We update lp->stats below. */	outw(0xB000, ioaddr + EL3_CMD);	/* Disable the receiver and transmitter. */	outw(0x1800, ioaddr + EL3_CMD);	outw(0x5000, ioaddr + EL3_CMD);	if (dev->if_port == 3)		/* Turn off thinnet power. */		outw(0xb800, ioaddr + EL3_CMD);	else if (dev->if_port == 0) {		/* Disable link beat and jabber, if_port may change ere next open(). */		EL3WINDOW(4);		outw(inw(ioaddr + WN4_MEDIA) & ~MEDIA_TP, ioaddr + WN4_MEDIA);	}	free_irq(dev->irq);	/* Switching back to window 0 disables the IRQ. */	EL3WINDOW(0);	/* But we explicitly zero the IRQ line select anyway. */	outw(0x0f00, ioaddr + 8);	irq2dev_map[dev->irq] = 0;	update_stats(ioaddr, dev);	return 0;}/* * Local variables: *  compile-command: "gcc -D__KERNEL__ -I/usr/src/linux/net/inet -Wall -Wstrict-prototypes -O6 -m486 -c 3c509.c" *  version-control: t *  kept-new-versions: 5 *  tab-width: 4 * End: */

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
91成人看片片| 国产精品久久一级| 成人欧美一区二区三区视频网页| 亚洲最新视频在线观看| 国产·精品毛片| 欧美一区二区福利视频| 一区二区三区四区精品在线视频| 国产美女精品人人做人人爽| 欧美一区二区三区视频免费| 亚洲一二三专区| jvid福利写真一区二区三区| 久久久精品tv| 久久99精品国产.久久久久久| 欧美日韩精品高清| 亚洲一区二区三区美女| 99久久精品国产麻豆演员表| 国产网站一区二区| 久久99精品国产.久久久久久| 91精品国产综合久久精品app | 一本到不卡精品视频在线观看| 日韩精品中文字幕一区二区三区| 香蕉乱码成人久久天堂爱免费| 色老汉av一区二区三区| 亚洲你懂的在线视频| 99精品国产99久久久久久白柏| 欧美激情一区二区三区全黄| 国产麻豆精品一区二区| 久久伊人中文字幕| 国产最新精品精品你懂的| 精品国产第一区二区三区观看体验| 石原莉奈一区二区三区在线观看| 欧美日韩一本到| 91伊人久久大香线蕉| 欧美日产在线观看| 一区二区三区成人| 性欧美大战久久久久久久久| 91成人免费网站| 亚洲免费三区一区二区| 色八戒一区二区三区| 麻豆精品精品国产自在97香蕉| 色中色一区二区| 爽好久久久欧美精品| 在线播放中文一区| 亚洲va韩国va欧美va| 欧美大胆一级视频| 久久99深爱久久99精品| 精品午夜一区二区三区在线观看| 亚洲一区中文在线| 狠狠色2019综合网| 亚洲国产综合91精品麻豆| 国产精品一区三区| 亚洲va欧美va国产va天堂影院| www.亚洲在线| 日韩美女视频在线| 亚洲一区二区高清| 国产成人啪午夜精品网站男同| 国产91精品入口| 国产精品福利一区| 99re在线视频这里只有精品| 中文字幕在线观看一区| 欧美激情中文字幕一区二区| 亚洲一区二区三区四区在线观看| 风间由美一区二区三区在线观看| 成人激情开心网| 日韩精品在线一区| 亚洲国产综合在线| 91在线免费看| 精品对白一区国产伦| 亚洲精品一线二线三线无人区| 欧美r级电影在线观看| 国产精品色在线| 亚洲欧美日韩电影| 色综合天天狠狠| 国产高清一区日本| 精品国产区一区| 亚洲高清久久久| 久久久蜜桃精品| 7777精品伊人久久久大香线蕉最新版| 日本一区二区三区在线不卡| 五月婷婷综合激情| 国内欧美视频一区二区 | 国产精品系列在线观看| 欧美人妇做爰xxxⅹ性高电影| 国产精品国产自产拍高清av| 色婷婷综合久久久久中文一区二区 | 久久久国产午夜精品| 91免费国产在线观看| 激情五月激情综合网| 九九九久久久精品| 亚洲国产精品成人综合| 日韩亚洲欧美综合| 91激情在线视频| 国产电影精品久久禁18| 亚洲国产日产av| 国产精品水嫩水嫩| 久久这里只精品最新地址| 欧美日韩在线播放三区四区| 99久久99久久综合| 丁香天五香天堂综合| 国产一区欧美二区| 男人的j进女人的j一区| 午夜电影一区二区| 亚洲一区在线视频观看| 亚洲九九爱视频| 亚洲区小说区图片区qvod| 国产精品视频免费看| 久久久精品天堂| 国产日韩亚洲欧美综合| 欧美激情资源网| 国产欧美一区二区三区网站 | 中文字幕一区二区三区乱码在线| 337p日本欧洲亚洲大胆精品| 欧美一级高清大全免费观看| 欧美日韩免费观看一区三区| 欧美视频一区在线| 欧美日本乱大交xxxxx| 777奇米成人网| 欧美一级欧美一级在线播放| 欧美精品 日韩| 精品久久一区二区| 欧美哺乳videos| 国产视频一区二区在线| 国产欧美精品国产国产专区| 国产精品欧美一级免费| 亚洲精选视频在线| 亚洲成a人片在线观看中文| 天天综合色天天综合| 麻豆91在线看| 国产99久久久国产精品免费看| 成人美女在线视频| 在线区一区二视频| 欧美一区二区三区四区视频| 欧美精品一区二区精品网| 中文字幕乱码一区二区免费| 亚洲欧美视频在线观看| 首页国产丝袜综合| 激情综合网激情| 99久久99久久精品国产片果冻| 色婷婷综合五月| 日韩欧美另类在线| 国产精品天天摸av网| 亚洲国产精品嫩草影院| 色综合中文字幕| 制服.丝袜.亚洲.另类.中文 | 欧美一二区视频| 国产亚洲精品bt天堂精选| 亚洲黄一区二区三区| 日本美女一区二区三区视频| 国产九色sp调教91| 欧美在线制服丝袜| 精品久久久久久久久久久久久久久久久| 中文字幕成人在线观看| 五月天国产精品| 粉嫩一区二区三区在线看| 欧美日韩精品一区二区三区四区| 久久综合色综合88| 亚洲伦理在线免费看| 国产一区二区三区免费看| 欧美优质美女网站| 久久婷婷国产综合精品青草| 亚洲福中文字幕伊人影院| 老司机精品视频一区二区三区| 国产香蕉久久精品综合网| 日本欧美加勒比视频| 成人激情文学综合网| 日韩欧美国产麻豆| 亚洲黄色小视频| 国产suv精品一区二区三区| 91精品国产91久久久久久一区二区 | 中文字幕一区二区日韩精品绯色| 日日夜夜免费精品视频| 91碰在线视频| 亚洲亚洲人成综合网络| zzijzzij亚洲日本少妇熟睡| 日韩丝袜美女视频| 亚洲成人手机在线| 日本精品一级二级| 国产精品麻豆99久久久久久| 一本一道综合狠狠老| 日本道色综合久久| 欧美群妇大交群中文字幕| 日韩无一区二区| 亚洲一区二区三区四区五区中文 | 日韩高清电影一区| 欧美影院一区二区三区| 国产精品久久久久精k8| 国产一区二区三区在线看麻豆| 欧美日韩国产综合视频在线观看| 国产精品家庭影院| 成人高清免费在线播放| 久久久久久久久久久久久女国产乱| 日本女优在线视频一区二区| 欧美三区免费完整视频在线观看| 亚洲精品久久7777| 色悠久久久久综合欧美99| 国产精品视频第一区| 亚洲乱码国产乱码精品精的特点| 日本视频免费一区| 91.com视频| 蜜桃视频一区二区|