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

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

?? etherelnk3.c

?? 著名操作系統(tǒng)Plan 9的第三版的部分核心源代碼。現(xiàn)在很難找到了。Plan 9是bell實驗室開發(fā)的Unix后繼者。
?? C
?? 第 1 頁 / 共 4 頁
字號:
			COMMAND(port, AcknowledgeInterrupt, upComplete);			receive905(ether);			status &= ~upComplete;			ctlr->upinterrupts++;		}		if(status & txComplete){			/*			 * Pop the TxStatus stack, accumulating errors.			 * Adjust the TX start threshold if there was an underrun.			 * If there was a Jabber or Underrun error, reset			 * the transmitter, taking care not to reset the dma logic			 * as a busmaster receive may be in progress.			 * For all conditions enable the transmitter.			 */			s = 0;			do{				if(x = inb(port+TxStatus))					outb(port+TxStatus, 0);				s |= x;			}while(STATUS(port) & txComplete);			if(s & txUnderrun){				if(ctlr->dnenabled){					while(inl(port+PktStatus) & dnInProg)						;				}				COMMAND(port, SelectRegisterWindow, Wdiagnostic);				while(ins(port+MediaStatus) & txInProg)					;				COMMAND(port, SelectRegisterWindow, Wop);				if(ctlr->txthreshold < ETHERMAXTU)					ctlr->txthreshold += ETHERMINTU;			}			/*			 * According to the manual, maxCollisions does not require			 * a TxReset, merely a TxEnable. However, evidence points to			 * it being necessary on the 3C905. The jury is still out.			 * On busy or badly configured networks maxCollisions can			 * happen frequently enough for messages to be annoying so			 * keep quiet about them by popular request.			 */			if(s & (txJabber|txUnderrun|maxCollisions)){				if(ctlr->busmaster == 0)					COMMAND(port, TxReset, 0);				else					COMMAND(port, TxReset, (updnReset|dmaReset));				while(STATUS(port) & commandInProgress)					;				COMMAND(port, SetTxStartThresh, ctlr->txthreshold>>ctlr->ts);				if(ctlr->busmaster == 2)					outl(port+TxFreeThresh, HOWMANY(ETHERMAXTU, 256));				if(ctlr->dnenabled)					status |= dnComplete;			}			if(s & ~(txStatusComplete|maxCollisions))				print("#l%d: txstatus 0x%uX, threshold %d\n",			    		ether->ctlrno, s, ctlr->txthreshold);			COMMAND(port, TxEnable, 0);			ether->oerrs++;			status &= ~txComplete;			status |= txAvailable;		}		if(status & txAvailable){			COMMAND(port, AcknowledgeInterrupt, txAvailable);			ctlr->txbusy = 0;			txstart(ether);			status &= ~txAvailable;		}		if(status & dnComplete){			COMMAND(port, AcknowledgeInterrupt, dnComplete);			txstart905(ether);			status &= ~dnComplete;			ctlr->dninterrupts++;		}		if(status & updateStats){			statistics(ether);			status &= ~updateStats;		}		/*		 * Currently, this shouldn't happen.		 */		if(status & rxEarly){			COMMAND(port, AcknowledgeInterrupt, rxEarly);			status &= ~rxEarly;		}		/*		 * Panic if there are any interrupts not dealt with.		 */		if(status & interruptMask)			panic("#l%d: interrupt mask 0x%uX\n", ether->ctlrno, status);		COMMAND(port, AcknowledgeInterrupt, interruptLatch);	}	COMMAND(port, SelectRegisterWindow, w);	iunlock(&ctlr->wlock);}static longifstat(Ether* ether, void* a, long n, ulong offset){	char *p;	int len;	Ctlr *ctlr;	if(n == 0)		return 0;	ctlr = ether->ctlr;	ilock(&ctlr->wlock);	statistics(ether);	iunlock(&ctlr->wlock);	p = malloc(READSTR);	len = snprint(p, READSTR, "interrupts: %lud\n", ctlr->interrupts);	len += snprint(p+len, READSTR-len, "timer: %lud\n", ctlr->timer);	len += snprint(p+len, READSTR-len, "carrierlost: %lud\n", ctlr->stats[CarrierLost]);	len += snprint(p+len, READSTR-len, "sqeerrors: %lud\n", ctlr->stats[SqeErrors]);	len += snprint(p+len, READSTR-len, "multiplecolls: %lud\n", ctlr->stats[MultipleColls]);	len += snprint(p+len, READSTR-len, "singlecollframes: %lud\n", ctlr->stats[SingleCollFrames]);	len += snprint(p+len, READSTR-len, "latecollisions: %lud\n", ctlr->stats[LateCollisions]);	len += snprint(p+len, READSTR-len, "rxoverruns: %lud\n", ctlr->stats[RxOverruns]);	len += snprint(p+len, READSTR-len, "framesxmittedok: %lud\n", ctlr->stats[FramesXmittedOk]);	len += snprint(p+len, READSTR-len, "framesrcvdok: %lud\n", ctlr->stats[FramesRcvdOk]);	len += snprint(p+len, READSTR-len, "framesdeferred: %lud\n", ctlr->stats[FramesDeferred]);	len += snprint(p+len, READSTR-len, "bytesrcvdok: %lud\n", ctlr->stats[BytesRcvdOk]);	len += snprint(p+len, READSTR-len, "bytesxmittedok: %lud\n", ctlr->stats[BytesRcvdOk+1]);	if(ctlr->upenabled){		if(ctlr->upqmax > ctlr->upqmaxhw)			ctlr->upqmaxhw = ctlr->upqmax;		len += snprint(p+len, READSTR-len, "up: q %lud i %lud m %d h %d s %lud\n",			ctlr->upqueued, ctlr->upinterrupts,			ctlr->upqmax, ctlr->upqmaxhw, ctlr->upstalls);		ctlr->upqmax = 0;	}	if(ctlr->dnenabled){		if(ctlr->dnqmax > ctlr->dnqmaxhw)			ctlr->dnqmaxhw = ctlr->dnqmax;		len += snprint(p+len, READSTR-len, "dn: q %lud i %lud m %d h %d\n",			ctlr->dnqueued, ctlr->dninterrupts, ctlr->dnqmax, ctlr->dnqmaxhw);		ctlr->dnqmax = 0;	}	snprint(p+len, READSTR-len, "badssd: %lud\n", ctlr->stats[BytesRcvdOk+2]);	n = readstr(offset, a, n, p);	free(p);	return n;}static voidtxrxreset(int port){	COMMAND(port, TxReset, 0);	while(STATUS(port) & commandInProgress)		;	COMMAND(port, RxReset, 0);	while(STATUS(port) & commandInProgress)		;}typedef struct Adapter {	int	port;	int	irq;	int	tbdf;} Adapter;static Block* adapter;static voidtcmadapter(int port, int irq, int tbdf){	Block *bp;	Adapter *ap;	bp = allocb(sizeof(Adapter));	ap = (Adapter*)bp->rp;	ap->port = port;	ap->irq = irq;	ap->tbdf = tbdf;	bp->next = adapter;	adapter = bp;}/* * Write two 0 bytes to identify the IDport and then reset the * ID sequence. Then send the ID sequence to the card to get * the card into command state. */static voididseq(void){	int i;	uchar al;	static int reset, untag;	/*	 * One time only:	 *	reset any adapters listening	 */	if(reset == 0){		outb(IDport, 0);		outb(IDport, 0);		outb(IDport, 0xC0);		delay(20);		reset = 1;	}	outb(IDport, 0);	outb(IDport, 0);	for(al = 0xFF, i = 0; i < 255; i++){		outb(IDport, al);		if(al & 0x80){			al <<= 1;			al ^= 0xCF;		}		else			al <<= 1;	}	/*	 * One time only:	 *	write ID sequence to get the attention of all adapters;	 *	untag all adapters.	 * If a global reset is done here on all adapters it will confuse	 * any ISA cards configured for EISA mode.	 */	if(untag == 0){		outb(IDport, 0xD0);		untag = 1;	}}static ulongactivate(void){	int i;	ushort x, acr;	/*	 * Do the little configuration dance:	 *	 * 2. write the ID sequence to get to command state.	 */	idseq();	/*	 * 3. Read the Manufacturer ID from the EEPROM.	 *    This is done by writing the IDPort with 0x87 (0x80	 *    is the 'read EEPROM' command, 0x07 is the offset of	 *    the Manufacturer ID field in the EEPROM).	 *    The data comes back 1 bit at a time.	 *    A delay seems necessary between reading the bits.	 *	 * If the ID doesn't match, there are no more adapters.	 */	outb(IDport, 0x87);	delay(20);	for(x = 0, i = 0; i < 16; i++){		delay(20);		x <<= 1;		x |= inb(IDport) & 0x01;	}	if(x != 0x6D50)		return 0;	/*	 * 3. Read the Address Configuration from the EEPROM.	 *    The Address Configuration field is at offset 0x08 in the EEPROM).	 */	outb(IDport, 0x88);	for(acr = 0, i = 0; i < 16; i++){		delay(20);		acr <<= 1;		acr |= inb(IDport) & 0x01;	}	return (acr & 0x1F)*0x10 + 0x200;}static voidtcm509isa(void){	int irq, port;	/*	 * Attempt to activate all adapters. If adapter is set for	 * EISA mode (0x3F0), tag it and ignore. Otherwise, activate	 * it fully.	 */	while(port = activate()){		if(ioalloc(port, 0x10, 0, "tcm509isa") < 0){			print("tcm509isa:port %d in use\n", port);			continue;		}		/*		 * 6. Tag the adapter so it won't respond in future.		 */		outb(IDport, 0xD1);		if(port == 0x3F0){			iofree(port);			continue;		}		/*		 * 6. Activate the adapter by writing the Activate command		 *    (0xFF).		 */		outb(IDport, 0xFF);		delay(20);		/*		 * 8. Can now talk to the adapter's I/O base addresses.		 *    Use the I/O base address from the acr just read.		 *		 *    Enable the adapter and clear out any lingering status		 *    and interrupts.		 */		while(STATUS(port) & commandInProgress)			;		COMMAND(port, SelectRegisterWindow, Wsetup);		outs(port+ConfigControl, Ena);		txrxreset(port);		COMMAND(port, AcknowledgeInterrupt, 0xFF);		irq = (ins(port+ResourceConfig)>>12) & 0x0F;		tcmadapter(port, irq, BUSUNKNOWN);	}}static voidtcm5XXeisa(void){	ushort x;	int irq, port, slot;	/*	 * Check if this is an EISA machine.	 * If not, nothing to do.	 */	if(strncmp((char*)KADDR(0xFFFD9), "EISA", 4))		return;	/*	 * Continue through the EISA slots looking for a match on both	 * 3COM as the manufacturer and 3C579-* or 3C59[27]-* as the product.	 * If an adapter is found, select window 0, enable it and clear	 * out any lingering status and interrupts.	 */	for(slot = 1; slot < MaxEISA; slot++){		port = slot*0x1000;		if(ioalloc(port, 0x1000, 0, "tcm5XXeisa") < 0){			print("tcm5XXeisa: port %d in use\n", port);			continue;		}		if(ins(port+0xC80+ManufacturerID) != 0x6D50){			iofree(port);			continue;		}		x = ins(port+0xC80+ProductID);		if((x & 0xF0FF) != 0x9050 && (x & 0xFF00) != 0x5900){			iofree(port);			continue;		}		COMMAND(port, SelectRegisterWindow, Wsetup);		outs(port+ConfigControl, Ena);		txrxreset(port);		COMMAND(port, AcknowledgeInterrupt, 0xFF);		irq = (ins(port+ResourceConfig)>>12) & 0x0F;		tcmadapter(port, irq, BUSUNKNOWN);	}}static voidtcm59Xpci(void){	Pcidev *p;	int irq, port;	p = nil;	while(p = pcimatch(p, 0x10B7, 0)){		port = p->mem[0].bar & ~0x01;		if(ioalloc(port, p->mem[0].size, 0, "tcm59Xpci") < 0){			print("tcm59Xpci: port %d in use\n", port);			continue;		}		irq = p->intl;		COMMAND(port, GlobalReset, 0);		while(STATUS(port) & commandInProgress)			;		tcmadapter(port, irq, p->tbdf);		pcisetbme(p);	}}static char* tcmpcmcia[] = {	"3C589",			/* 3COM 589[ABCD] */	"3C562",			/* 3COM 562 */	"589E",				/* 3COM Megahertz 589E */	nil,};static inttcm5XXpcmcia(Ether* ether){	int i;	for(i = 0; tcmpcmcia[i] != nil; i++){		if(!cistrcmp(ether->type, tcmpcmcia[i])){			/*			 * No need for an ioalloc here, the 589 reset			 * code deals with it.			if(ioalloc(ether->port, 0x10, 0, "tcm5XXpcmcia") < 0)				return 0;			 */			return ether->port;		}	}	return 0;}static voidsetxcvr(int port, int xcvr, int is9){	int x;	if(is9){		COMMAND(port, SelectRegisterWindow, Wsetup);		x = ins(port+AddressConfig) & ~xcvrMask9;		x |= (xcvr>>20)<<14;		outs(port+AddressConfig, x);	}	else{		COMMAND(port, SelectRegisterWindow, Wfifo);		x = inl(port+InternalConfig) & ~xcvrMask;		x |= xcvr;		outl(port+InternalConfig, x);	}	txrxreset(port);}static voidsetfullduplex(int port){	int x;	COMMAND(port, SelectRegisterWindow, Wfifo);	x = ins(port+MacControl);	outs(port+MacControl, fullDuplexEnable|x);	txrxreset(port);}static intmiimdi(int port, int n){	int data, i;	/*	 * Read n bits from the MII Management Register.	 */	data = 0;	for(i = n-1; i >= 0; i--){		if(ins(port) & mgmtData)			data |= (1<<i);		microdelay(1);		outs(port, mgmtClk);		microdelay(1);		outs(port, 0);		microdelay(1);	}	return data;}static voidmiimdo(int port, int bits, int n){	int i, mdo;	/*	 * Write n bits to the MII Management Register.	 */	for(i = n-1; i >= 0; i--){		if(bits & (1<<i))			mdo = mgmtDir|mgmtData;		else

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
夜夜精品浪潮av一区二区三区| 欧美极品xxx| 日本一区二区三区四区在线视频| 亚洲精品高清在线观看| 精品亚洲欧美一区| 欧美在线观看视频在线| 国产三级一区二区三区| 一区二区三区欧美日韩| 国产丶欧美丶日本不卡视频| 91精品国产麻豆国产自产在线 | 伊人性伊人情综合网| 另类的小说在线视频另类成人小视频在线 | 欧美色图激情小说| 国产精品欧美综合在线| 久久疯狂做爰流白浆xx| 欧美日韩视频在线一区二区| 亚洲欧美日韩国产另类专区 | 蜜桃91丨九色丨蝌蚪91桃色| 在线视频国内自拍亚洲视频| 中文av一区特黄| 国产精品亚洲а∨天堂免在线| 久久er精品视频| 91免费看`日韩一区二区| 精品成a人在线观看| 日韩不卡免费视频| 欧美福利一区二区| 午夜精品久久久| 欧美系列在线观看| 亚洲国产精品一区二区www在线| 欧美日本国产一区| 亚洲.国产.中文慕字在线| 色哦色哦哦色天天综合| 一区二区三区四区高清精品免费观看| 成人午夜大片免费观看| 国产精品电影院| 成人精品鲁一区一区二区| 中文字幕第一区第二区| 成人三级在线视频| 国产精品激情偷乱一区二区∴| jlzzjlzz亚洲日本少妇| 亚洲三级小视频| 在线视频欧美区| 日韩精品久久理论片| 日韩欧美国产综合一区| 91精品久久久久久久久99蜜臂| 亚洲欧美偷拍卡通变态| 色88888久久久久久影院按摩| 亚洲精品日产精品乱码不卡| 欧美在线免费播放| 麻豆成人免费电影| 国产欧美一区视频| 色噜噜狠狠成人网p站| 亚洲国产一区视频| 日韩欧美国产精品一区| 成人午夜激情视频| 亚洲一区二区在线免费看| 欧美一卡二卡在线| 国产精品18久久久久久久网站| 日本一区二区在线不卡| 日本电影亚洲天堂一区| 美女一区二区视频| 亚洲欧洲成人精品av97| 欧美三级欧美一级| 国产毛片精品一区| 亚洲伊人伊色伊影伊综合网| 色狠狠一区二区三区香蕉| 高清国产一区二区三区| 亚洲人成在线播放网站岛国| 91.xcao| 懂色av一区二区三区免费观看| 亚洲女性喷水在线观看一区| 欧美本精品男人aⅴ天堂| 99久久婷婷国产| 久久精品国产免费| 一区二区三区中文免费| 久久综合色婷婷| 欧美老年两性高潮| 成人h精品动漫一区二区三区| 秋霞电影一区二区| 亚洲精品国产一区二区精华液| 日韩免费福利电影在线观看| 91国产精品成人| 波多野结衣中文字幕一区| 日韩综合一区二区| 一区二区三区欧美激情| 国产精品美日韩| 久久久99精品免费观看不卡| 337p亚洲精品色噜噜噜| 国产三级三级三级精品8ⅰ区| 成人高清免费在线播放| 日日噜噜夜夜狠狠视频欧美人| 日本一区二区电影| 亚洲精品一区二区三区四区高清 | 日日欢夜夜爽一区| 亚洲人成电影网站色mp4| 日韩欧美成人激情| 欧美妇女性影城| 欧洲精品在线观看| 色婷婷av一区二区三区大白胸| 成人免费视频caoporn| 国产露脸91国语对白| 美国十次综合导航| 天堂成人国产精品一区| 亚洲综合色噜噜狠狠| 有码一区二区三区| 国产精品黄色在线观看| 中文字幕第一区二区| 国产清纯美女被跳蛋高潮一区二区久久w | 中文字幕一区视频| 日韩一级视频免费观看在线| 精品视频一区二区不卡| 91日韩一区二区三区| 成人av电影在线播放| 懂色av一区二区夜夜嗨| 国产成人精品亚洲日本在线桃色| 日本欧美大码aⅴ在线播放| 日韩电影一二三区| 免费精品99久久国产综合精品| 日韩国产一区二| 蜜臀av性久久久久av蜜臀妖精| 久久不见久久见免费视频1| 狠狠色丁香久久婷婷综合_中| 激情五月婷婷综合| 国产一区二区三区久久久| 国产成人亚洲综合色影视| 丁香六月综合激情| 一本大道久久a久久综合婷婷| 色美美综合视频| 91精品国产色综合久久久蜜香臀| 欧美大片国产精品| 国产亚洲一区字幕| 亚洲欧洲精品一区二区精品久久久| 亚洲欧美一区二区三区孕妇| 亚洲一区中文在线| 久久精品国产一区二区三区免费看| 国产乱对白刺激视频不卡| 99re成人在线| 欧美一区二区三区免费在线看 | 福利视频网站一区二区三区| 91亚洲精品久久久蜜桃| 91精品国产高清一区二区三区蜜臀 | 136国产福利精品导航| 亚洲午夜国产一区99re久久| 日本美女一区二区| 国产成人av一区二区三区在线| 91蝌蚪国产九色| 精品三级在线观看| 成人欧美一区二区三区| 日韩精品一二区| 北条麻妃一区二区三区| 91精品在线麻豆| 国产精品网友自拍| 免费观看一级欧美片| 日韩一区二区免费在线电影| 久久影院午夜论| 久久久精品tv| 自拍偷拍欧美激情| 日本美女一区二区| 国产精品 欧美精品| 亚洲www啪成人一区二区麻豆| av在线一区二区三区| 国产精品天干天干在观线| 国产精品 欧美精品| 久久久99免费| 国产一区二区三区精品欧美日韩一区二区三区 | 欧美视频一区二| 亚洲综合成人在线视频| 色天天综合色天天久久| 一区二区三区美女视频| 欧美视频一二三区| 午夜伊人狠狠久久| 在线视频观看一区| 国产日韩av一区| 成人免费视频caoporn| 亚洲国产高清不卡| 成人国产精品免费观看视频| 国产视频亚洲色图| av在线这里只有精品| 日韩伦理免费电影| 欧美日韩激情一区二区三区| 日韩精品色哟哟| 久久品道一品道久久精品| 国产九色sp调教91| 国产精品国产三级国产专播品爱网| 99在线精品观看| 亚洲成人动漫在线免费观看| 欧美精品久久天天躁| 精品一区二区在线看| 久久这里都是精品| 99vv1com这只有精品| 亚洲图片欧美色图| 精品国产91洋老外米糕| 99re这里只有精品视频首页| 亚洲成人免费电影| 精品三级av在线| 91亚洲国产成人精品一区二三| 一级日本不卡的影视| 日韩欧美中文字幕公布| 暴力调教一区二区三区| 婷婷国产在线综合|