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

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

?? ne.c

?? 單片機學習資料 適合初學者進行開發學習
?? C
?? 第 1 頁 / 共 2 頁
字號:
	} else {		start_page = NE1SM_START_PG;		stop_page = NE1SM_STOP_PG;	}#endif#if defined(CONFIG_CPU_H8300H)	start_page = NESM_START_PG;	stop_page = NESM_STOP_PG;	H8300_INIT_NE();#endif	neX000 = (SA_prom[14] == 0x57  &&  SA_prom[15] == 0x57);	ctron =  (SA_prom[0] == 0x00 && SA_prom[1] == 0x00 && SA_prom[2] == 0x1d);	copam =  (SA_prom[14] == 0x49 && SA_prom[15] == 0x00);	/* Set up the rest of the parameters. */	if (neX000 || bad_card || copam) {		name = (wordlength == 2) ? "NE2000" : "NE1000";	}	else if (ctron)	{		name = (wordlength == 2) ? "Ctron-8" : "Ctron-16";		start_page = 0x01;		stop_page = (wordlength == 2) ? 0x40 : 0x20;	}	else	{#ifdef SUPPORT_NE_BAD_CLONES		/* Ack!  Well, there might be a *bad* NE*000 clone there.		   Check for total bogus addresses. */		for (i = 0; bad_clone_list[i].name8; i++)		{			if (SA_prom[0] == bad_clone_list[i].SAprefix[0] &&				SA_prom[1] == bad_clone_list[i].SAprefix[1] &&				SA_prom[2] == bad_clone_list[i].SAprefix[2])			{				if (wordlength == 2)				{					name = bad_clone_list[i].name16;				} else {					name = bad_clone_list[i].name8;				}				break;			}		}		if (bad_clone_list[i].name8 == NULL)		{			printk(" not found (invalid signature %2.2x %2.2x).\n",				SA_prom[14], SA_prom[15]);			ret = -ENXIO;			goto err_out;		}#else		printk(" not found.\n");		ret = -ENXIO;		goto err_out;#endif	}	if (dev->irq < 2)	{		unsigned long cookie = probe_irq_on();		outb_p(0x50, ioaddr + EN0_IMR);	/* Enable one interrupt. */		outb_p(0x00, ioaddr + EN0_RCNTLO);		outb_p(0x00, ioaddr + EN0_RCNTHI);		outb_p(E8390_RREAD+E8390_START, ioaddr); /* Trigger it... */		mdelay(10);		/* wait 10ms for interrupt to propagate */		outb_p(0x00, ioaddr + EN0_IMR); 		/* Mask it again. */		dev->irq = probe_irq_off(cookie);		if (ei_debug > 2)			printk(" autoirq is %d\n", dev->irq);	} else if (dev->irq == 2)		/* Fixup for users that don't know that IRQ 2 is really IRQ 9,		   or don't know which one to set. */		dev->irq = 9;	if (! dev->irq) {		printk(" failed to detect IRQ line.\n");		ret = -EAGAIN;		goto err_out;	}	/* Allocate dev->priv and fill in 8390 specific dev fields. */	if (ethdev_init(dev))	{        	printk (" unable to get memory for dev->priv.\n");        	ret = -ENOMEM;		goto err_out;	}	/* Snarf the interrupt now.  There's no point in waiting since we cannot	   share and the board will usually be enabled. */	ret = request_irq(dev->irq, ei_interrupt, 0, name, dev);#ifdef CONFIG_COLDFIRE	if (ret == 0)		ne2000_irqsetup(dev->irq);#endif	if (ret) {		printk (" unable to get IRQ %d (errno=%d).\n", dev->irq, ret);		goto err_out_kfree;	}	dev->base_addr = ioaddr;	for(i = 0; i < ETHER_ADDR_LEN; i++) {		printk(" %2.2x", SA_prom[i]);		dev->dev_addr[i] = SA_prom[i];	}	printk("\n%s: %s found at %#x, using IRQ %d.\n",		dev->name, name, ioaddr, dev->irq);	ei_status.name = name;	ei_status.tx_start_page = start_page;	ei_status.stop_page = stop_page;	ei_status.word16 = (wordlength == 2);	ei_status.rx_start_page = start_page + TX_PAGES;#ifdef PACKETBUF_MEMSIZE	 /* Allow the packet buffer size to be overridden by know-it-alls. */	ei_status.stop_page = ei_status.tx_start_page + PACKETBUF_MEMSIZE;#endif	ei_status.reset_8390 = &ne_reset_8390;	ei_status.block_input = &ne_block_input;	ei_status.block_output = &ne_block_output;	ei_status.get_8390_hdr = &ne_get_8390_hdr;	ei_status.priv = 0;	dev->open = &ne_open;	dev->stop = &ne_close;	NS8390_init(dev, 0);	return 0;err_out_kfree:	kfree(dev->priv);	dev->priv = NULL;err_out:#if !defined(CONFIG_COLDFIRE) && !defined(CONFIG_CPU_H8300H)	release_region(ioaddr, NE_IO_EXTENT);#endif	return ret;}static int ne_open(struct net_device *dev){	ei_open(dev);	return 0;}static int ne_close(struct net_device *dev){	if (ei_debug > 1)		printk(KERN_DEBUG "%s: Shutting down ethercard.\n", dev->name);	ei_close(dev);	return 0;}/* Hard reset the card.  This used to pause for the same period that a   8390 reset command required, but that shouldn't be necessary. */static void ne_reset_8390(struct net_device *dev){	unsigned long reset_start_time = jiffies;	if (ei_debug > 1)		printk(KERN_DEBUG "resetting the 8390 t=%ld...", jiffies);	/* DON'T change these to inb_p/outb_p or reset will fail on clones. */	outb(inb(NE_BASE + NE_RESET), NE_BASE + NE_RESET);	ei_status.txing = 0;	ei_status.dmaing = 0;	/* This check _should_not_ be necessary, omit eventually. */	while ((inb_p(NE_BASE+EN0_ISR) & ENISR_RESET) == 0)		if (jiffies - reset_start_time > 2*HZ/100) {			printk(KERN_WARNING "%s: ne_reset_8390() did not complete.\n", dev->name);			break;		}	outb_p(ENISR_RESET, NE_BASE + EN0_ISR);	/* Ack intr. */}/* Grab the 8390 specific header. Similar to the block_input routine, but   we don't need to be concerned with ring wrap as the header will be at   the start of a page, so we optimize accordingly. */static void ne_get_8390_hdr(struct net_device *dev, struct e8390_pkt_hdr *hdr, int ring_page){	int nic_base = dev->base_addr;	/* This *shouldn't* happen. If it does, it's the last thing you'll see */	if (ei_status.dmaing)	{		printk(KERN_EMERG "%s: DMAing conflict in ne_get_8390_hdr "			"[DMAstat:%d][irqlock:%d].\n",			dev->name, ei_status.dmaing, ei_status.irqlock);		return;	}	ei_status.dmaing |= 0x01;	outb_p(E8390_NODMA+E8390_PAGE0+E8390_START, nic_base+ NE_CMD);	outb_p(sizeof(struct e8390_pkt_hdr), nic_base + EN0_RCNTLO);	outb_p(0, nic_base + EN0_RCNTHI);	outb_p(0, nic_base + EN0_RSARLO);		/* On page boundary */	outb_p(ring_page, nic_base + EN0_RSARHI);	outb_p(E8390_RREAD+E8390_START, nic_base + NE_CMD);	if (ei_status.word16)		insw(NE_BASE + NE_DATAPORT, hdr, sizeof(struct e8390_pkt_hdr)>>1);	else		insb(NE_BASE + NE_DATAPORT, hdr, sizeof(struct e8390_pkt_hdr));	outb_p(ENISR_RDC, nic_base + EN0_ISR);	/* Ack intr. */	ei_status.dmaing &= ~0x01;	le16_to_cpus(&hdr->count);}/* Block input and output, similar to the Crynwr packet driver.  If you   are porting to a new ethercard, look at the packet driver source for hints.   The NEx000 doesn't share the on-board packet memory -- you have to put   the packet out through the "remote DMA" dataport using outb. */static void ne_block_input(struct net_device *dev, int count, struct sk_buff *skb, int ring_offset){#ifdef NE_SANITY_CHECK	int xfer_count = count;#endif	int nic_base = dev->base_addr;	char *buf = skb->data;	/* This *shouldn't* happen. If it does, it's the last thing you'll see */	if (ei_status.dmaing)	{		printk(KERN_EMERG "%s: DMAing conflict in ne_block_input "			"[DMAstat:%d][irqlock:%d].\n",			dev->name, ei_status.dmaing, ei_status.irqlock);		return;	}	ei_status.dmaing |= 0x01;	outb_p(E8390_NODMA+E8390_PAGE0+E8390_START, nic_base+ NE_CMD);	outb_p(count & 0xff, nic_base + EN0_RCNTLO);	outb_p(count >> 8, nic_base + EN0_RCNTHI);	outb_p(ring_offset & 0xff, nic_base + EN0_RSARLO);	outb_p(ring_offset >> 8, nic_base + EN0_RSARHI);	outb_p(E8390_RREAD+E8390_START, nic_base + NE_CMD);	if (ei_status.word16)	{		insw(NE_BASE + NE_DATAPORT,buf,count>>1);		if (count & 0x01)		{			buf[count-1] = inb(NE_BASE + NE_DATAPORT);#ifdef NE_SANITY_CHECK			xfer_count++;#endif		}	} else {		insb(NE_BASE + NE_DATAPORT, buf, count);	}#ifdef NE_SANITY_CHECK	/* This was for the ALPHA version only, but enough people have	   been encountering problems so it is still here.  If you see	   this message you either 1) have a slightly incompatible clone	   or 2) have noise/speed problems with your bus. */	if (ei_debug > 1)	{		/* DMA termination address check... */		int addr, tries = 20;		do {			/* DON'T check for 'inb_p(EN0_ISR) & ENISR_RDC' here			   -- it's broken for Rx on some cards! */			int high = inb_p(nic_base + EN0_RSARHI);			int low = inb_p(nic_base + EN0_RSARLO);			addr = (high << 8) + low;			if (((ring_offset + xfer_count) & 0xff) == low)				break;		} while (--tries > 0);	 	if (tries <= 0)			printk(KERN_WARNING "%s: RX transfer address mismatch,"				"%#4.4x (expected) vs. %#4.4x (actual).\n",				dev->name, ring_offset + xfer_count, addr);	}#endif	outb_p(ENISR_RDC, nic_base + EN0_ISR);	/* Ack intr. */	ei_status.dmaing &= ~0x01;}static void ne_block_output(struct net_device *dev, int count,		const unsigned char *buf, const int start_page){	int nic_base = NE_BASE;	unsigned long dma_start;#ifdef NE_SANITY_CHECK	int retries = 0;#endif	/* Round the count up for word writes.  Do we need to do this?	   What effect will an odd byte count have on the 8390?	   I should check someday. */	if (ei_status.word16 && (count & 0x01))		count++;	/* This *shouldn't* happen. If it does, it's the last thing you'll see */	if (ei_status.dmaing)	{		printk(KERN_EMERG "%s: DMAing conflict in ne_block_output."			"[DMAstat:%d][irqlock:%d]\n",			dev->name, ei_status.dmaing, ei_status.irqlock);		return;	}	ei_status.dmaing |= 0x01;	/* We should already be in page 0, but to be safe... */	outb_p(E8390_PAGE0+E8390_START+E8390_NODMA, nic_base + NE_CMD);#ifdef NE_SANITY_CHECKretry:#endif#ifdef NE8390_RW_BUGFIX	/* Handle the read-before-write bug the same way as the	   Crynwr packet driver -- the NatSemi method doesn't work.	   Actually this doesn't always work either, but if you have	   problems with your NEx000 this is better than nothing! */	outb_p(0x42, nic_base + EN0_RCNTLO);	outb_p(0x00,   nic_base + EN0_RCNTHI);	outb_p(0x42, nic_base + EN0_RSARLO);	outb_p(0x00, nic_base + EN0_RSARHI);	outb_p(E8390_RREAD+E8390_START, nic_base + NE_CMD);	/* Make certain that the dummy read has occurred. */	udelay(6);#endif	outb_p(ENISR_RDC, nic_base + EN0_ISR);	/* Now the normal output. */	outb_p(count & 0xff, nic_base + EN0_RCNTLO);	outb_p(count >> 8,   nic_base + EN0_RCNTHI);	outb_p(0x00, nic_base + EN0_RSARLO);	outb_p(start_page, nic_base + EN0_RSARHI);	outb_p(E8390_RWRITE+E8390_START, nic_base + NE_CMD);	if (ei_status.word16) {		outsw(NE_BASE + NE_DATAPORT, buf, count>>1);	} else {		outsb(NE_BASE + NE_DATAPORT, buf, count);	}	dma_start = jiffies;#ifdef NE_SANITY_CHECK	/* This was for the ALPHA version only, but enough people have	   been encountering problems so it is still here. */	if (ei_debug > 1)	{		/* DMA termination address check... */		int addr, tries = 20;		do {			int high = inb_p(nic_base + EN0_RSARHI);			int low = inb_p(nic_base + EN0_RSARLO);			addr = (high << 8) + low;			if ((start_page << 8) + count == addr)				break;		} while (--tries > 0);		if (tries <= 0)		{			printk(KERN_WARNING "%s: Tx packet transfer address mismatch,"				"%#4.4x (expected) vs. %#4.4x (actual).\n",				dev->name, (start_page << 8) + count, addr);			if (retries++ == 0)				goto retry;		}	}#endif	while ((inb_p(nic_base + EN0_ISR) & ENISR_RDC) == 0)		if (jiffies - dma_start > 2*HZ/100) {		/* 20ms */			printk(KERN_WARNING "%s: timeout waiting for Tx RDC.\n", dev->name);			ne_reset_8390(dev);			NS8390_init(dev,1);			break;		}	outb_p(ENISR_RDC, nic_base + EN0_ISR);	/* Ack intr. */	ei_status.dmaing &= ~0x01;	return;}#ifdef MODULE#define MAX_NE_CARDS	4	/* Max number of NE cards per module */static struct net_device dev_ne[MAX_NE_CARDS];static int io[MAX_NE_CARDS];static int irq[MAX_NE_CARDS];static int bad[MAX_NE_CARDS];	/* 0xbad = bad sig or no reset ack */MODULE_PARM(io, "1-" __MODULE_STRING(MAX_NE_CARDS) "i");MODULE_PARM(irq, "1-" __MODULE_STRING(MAX_NE_CARDS) "i");MODULE_PARM(bad, "1-" __MODULE_STRING(MAX_NE_CARDS) "i");MODULE_PARM_DESC(io, "I/O base address(es),required");MODULE_PARM_DESC(irq, "IRQ number(s)");MODULE_PARM_DESC(bad, "Accept card(s) with bad signatures");MODULE_DESCRIPTION("NE1000/NE2000 ISA/PnP Ethernet driver");MODULE_LICENSE("GPL");/* This is set up so that no ISA autoprobe takes place. We can't guaranteethat the ne2k probe is the last 8390 based probe to take place (as itis at boot) and so the probe will get confused by any other 8390 cards.ISA device autoprobes on a running machine are not recommended anyway. */int init_module(void){	int this_dev, found = 0;	for (this_dev = 0; this_dev < MAX_NE_CARDS; this_dev++) {		struct net_device *dev = &dev_ne[this_dev];		dev->irq = irq[this_dev];		dev->mem_end = bad[this_dev];		dev->base_addr = io[this_dev];		dev->init = ne_probe;		if (register_netdev(dev) == 0) {			found++;			continue;		}		if (found != 0) { 	/* Got at least one. */			return 0;		}		if (io[this_dev] != 0)			printk(KERN_WARNING "ne.c: No NE*000 card found at i/o = %#x\n", io[this_dev]);		else			printk(KERN_NOTICE "ne.c: You must supply \"io=0xNNN\" value(s) for ISA cards.\n");		return -ENXIO;	}	return 0;}void cleanup_module(void){	int this_dev;	for (this_dev = 0; this_dev < MAX_NE_CARDS; this_dev++) {		struct net_device *dev = &dev_ne[this_dev];		if (dev->priv != NULL) {			void *priv = dev->priv;			struct pci_dev *idev = (struct pci_dev *)ei_status.priv;			if (idev)				idev->deactivate(idev);			free_irq(dev->irq, dev);			release_region(dev->base_addr, NE_IO_EXTENT);			unregister_netdev(dev);			kfree(priv);		}	}}#endif /* MODULE *//* * Local variables: *  compile-command: "gcc -DKERNEL -Wall -O6 -fomit-frame-pointer -I/usr/src/linux/net/tcp -c ne.c" *  version-control: t *  kept-new-versions: 5 * End: */

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美精品一区二区在线播放| 一本到不卡免费一区二区| 亚洲成人免费在线观看| 亚洲同性同志一二三专区| 久久久不卡网国产精品一区| 日韩精品自拍偷拍| 日韩女优制服丝袜电影| 欧美r级电影在线观看| 日韩视频免费观看高清完整版 | 99国产精品久久久久久久久久| 天涯成人国产亚洲精品一区av| 亚洲一二三级电影| 亚洲国产一区二区三区| 午夜欧美在线一二页| 日韩精品成人一区二区三区| 日本va欧美va欧美va精品| 欧美aa在线视频| 国产在线精品不卡| 成人美女视频在线观看18| 99精品视频在线观看| 91黄色激情网站| 日韩欧美成人激情| 最新高清无码专区| 日韩综合小视频| 国产黑丝在线一区二区三区| 99久久精品久久久久久清纯| 欧美日本一区二区在线观看| 精品欧美一区二区在线观看| 中文字幕不卡三区| 亚洲五月六月丁香激情| 激情文学综合插| 99久久精品久久久久久清纯| 91.com在线观看| 欧美高清在线一区二区| 亚洲777理论| 丁香亚洲综合激情啪啪综合| 欧美亚洲一区三区| 欧美精品一区二区三区蜜桃 | 亚洲成人av资源| 免费人成精品欧美精品| 国产成人av一区二区三区在线| 欧美伊人久久久久久午夜久久久久| 欧美一级国产精品| 亚洲免费在线观看| 国产精品亚洲成人| 欧美精品亚洲二区| 1024成人网色www| 久久www免费人成看片高清| 色av成人天堂桃色av| www久久久久| 三级亚洲高清视频| 色综合久久久久久久久| 国产视频一区二区在线| 日日欢夜夜爽一区| 在线亚洲高清视频| 中文字幕日本乱码精品影院| 狠狠色丁香婷综合久久| 5月丁香婷婷综合| 亚洲一卡二卡三卡四卡五卡| 91丨九色丨国产丨porny| 国产欧美日韩三级| 国产一区二区三区四区五区美女| 欧美疯狂做受xxxx富婆| 亚洲国产精品综合小说图片区| 成人性生交大片免费看在线播放| 欧美mv日韩mv亚洲| 麻豆极品一区二区三区| 正在播放一区二区| 日韩av电影天堂| 欧美久久高跟鞋激| 亚洲在线视频网站| 欧美午夜精品久久久久久超碰| 最新国产の精品合集bt伙计| jizzjizzjizz欧美| 成人欧美一区二区三区小说| 成人av在线资源网站| 日本一区二区三区高清不卡| 成人永久aaa| 中文字幕一区二区三区在线观看| 国产不卡高清在线观看视频| 欧美国产激情二区三区| 99视频有精品| 一区二区三区自拍| 欧美三级资源在线| 日韩成人av影视| 久久先锋影音av鲁色资源| 精品在线观看视频| 国产免费观看久久| 色又黄又爽网站www久久| 亚洲一区二区三区四区在线免费观看| 欧美午夜精品一区| 久久精品国产在热久久| 国产亚洲一区二区三区四区| 成人黄色在线视频| 亚洲一区二区三区视频在线 | 六月婷婷色综合| 久久蜜臀精品av| av电影天堂一区二区在线观看| 亚洲欧美日韩人成在线播放| 欧美日韩精品综合在线| 麻豆国产欧美一区二区三区| 中文字幕乱码一区二区免费| 日本道免费精品一区二区三区| 五月综合激情日本mⅴ| 精品国产精品一区二区夜夜嗨| 成人教育av在线| 午夜精品在线视频一区| 亚洲精品一区二区三区四区高清| 国产+成+人+亚洲欧洲自线| 亚洲高清一区二区三区| 精品国产一区二区三区不卡| 91蝌蚪国产九色| 免费成人在线网站| 中文字幕一区二区三区av| 欧美日韩国产在线观看| 国产福利精品一区二区| 亚洲一区二区美女| 久久久三级国产网站| 欧美在线一二三| 国产在线国偷精品产拍免费yy| 亚洲黄网站在线观看| 国产精品一区二区在线观看不卡| 欧美日韩国产色站一区二区三区| 国产麻豆精品在线| 亚洲一区二区影院| 国产精品国产三级国产a| 欧美福利视频导航| 日本福利一区二区| 成人免费高清视频在线观看| 麻豆91精品91久久久的内涵| 亚洲精品日日夜夜| 国产精品久久毛片av大全日韩| 日韩一区二区三区四区| 欧美性一二三区| 99久久免费视频.com| 国产永久精品大片wwwapp| 亚洲第一成人在线| 亚洲激情在线播放| 国产精品美女久久久久久久网站| 日韩欧美一级特黄在线播放| 欧美日韩国产精品成人| 91视频观看视频| 北条麻妃一区二区三区| 国产成人午夜精品影院观看视频 | 亚洲男人的天堂av| 国产精品区一区二区三| 欧美精品一区二区蜜臀亚洲| 91精品国产麻豆| 欧美日韩亚洲高清一区二区| 不卡一卡二卡三乱码免费网站| 国产精一区二区三区| 黄页视频在线91| 久久国产日韩欧美精品| 蜜臀av一级做a爰片久久| 日本 国产 欧美色综合| 丝袜美腿亚洲一区二区图片| 亚洲一卡二卡三卡四卡五卡| 亚洲电影中文字幕在线观看| 亚洲成人免费视频| 午夜国产不卡在线观看视频| 一区二区三区小说| 亚洲一本大道在线| 免费人成黄页网站在线一区二区| 麻豆91在线播放免费| 国内精品伊人久久久久av影院| 久久不见久久见免费视频7| 国产精品自拍在线| voyeur盗摄精品| 91麻豆视频网站| 欧美日韩一区二区三区四区五区| 欧美在线你懂得| 日韩一区二区三区视频| 国产亚洲欧洲997久久综合 | 天天综合天天综合色| 午夜精品123| 看国产成人h片视频| 精品一区二区日韩| 成人av电影在线网| 91成人免费电影| 日韩久久久久久| 中文字幕高清一区| 亚洲永久免费视频| 紧缚奴在线一区二区三区| 成人中文字幕在线| 欧美日韩国产综合视频在线观看 | 国产精品成人免费在线| 亚洲免费伊人电影| 蜜桃av一区二区三区电影| 国产乱码精品一区二区三区av | 亚洲一区二区免费视频| 久久99精品网久久| 色综合一个色综合亚洲| 欧美人xxxx| 中文字幕第一区二区| 视频一区二区三区在线| 成人av网址在线| 精品少妇一区二区三区免费观看| 中文字幕一区二区三区在线播放 | 日韩一级黄色大片| 一区二区中文视频|