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

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

?? etherelnk3.c

?? 著名操作系統Plan 9的第三版的部分核心源代碼。現在很難找到了。Plan 9是bell實驗室開發的Unix后繼者。
?? C
?? 第 1 頁 / 共 4 頁
字號:
	return bp;}static uchar*startdma(Ether* ether, ulong address){	int port, status, w;	uchar *wp;	port = ether->port;	w = (STATUS(port)>>13) & 0x07;	COMMAND(port, SelectRegisterWindow, Wmaster);	wp = KADDR(inl(port+MasterAddress));	status = ins(port+MasterStatus);	if(status & (masterInProgress|targetAbort|masterAbort))		print("#l%d: BM status 0x%uX\n", ether->ctlrno, status);	outs(port+MasterStatus, masterMask);	outl(port+MasterAddress, address);	outs(port+MasterLen, sizeof(Etherpkt));	COMMAND(port, StartDma, Upload);	COMMAND(port, SelectRegisterWindow, w);	return wp;}static voidpromiscuous(void* arg, int on){	int filter, port;	Ether *ether;	ether = (Ether*)arg;	port = ether->port;	filter = receiveBroadcast|receiveIndividual;	if(ether->nmaddr)		filter |= receiveMulticast;	if(on)		filter |= receiveAllFrames;	COMMAND(port, SetRxFilter, filter);}static voidmulticast(void* arg, uchar *addr, int on){	int filter, port;	Ether *ether;	USED(addr, on);	ether = (Ether*)arg;	port = ether->port;	filter = receiveBroadcast|receiveIndividual;	if(ether->nmaddr)		filter |= receiveMulticast;	if(ether->prom)		filter |= receiveAllFrames;	COMMAND(port, SetRxFilter, filter);}static voidattach(Ether* ether){	int port, x;	Ctlr *ctlr;	ctlr = ether->ctlr;	ilock(&ctlr->wlock);	if(ctlr->attached){		iunlock(&ctlr->wlock);		return;	}	port = ether->port;	/*	 * Set the receiver packet filter for this and broadcast addresses,	 * set the interrupt masks for all interrupts, enable the receiver	 * and transmitter.	 */	promiscuous(ether, ether->prom);	x = interruptMask;	if(ctlr->busmaster == 1)		x &= ~(rxEarly|rxComplete);	else{		if(ctlr->dnenabled)			x &= ~transferInt;		if(ctlr->upenabled)			x &= ~(rxEarly|rxComplete);	}	COMMAND(port, SetIndicationEnable, x);	COMMAND(port, SetInterruptEnable, x);	COMMAND(port, RxEnable, 0);	COMMAND(port, TxEnable, 0);	/*	 * Prime the busmaster channel for receiving directly into a	 * receive packet buffer if necessary.	 */	if(ctlr->busmaster == 1)		startdma(ether, PADDR(ctlr->rbp->rp));	else{		if(ctlr->upenabled)			outl(port+UpListPtr, PADDR(&ctlr->uphead->np));	}	ctlr->attached = 1;	iunlock(&ctlr->wlock);}static voidstatistics(Ether* ether){	int port, i, u, w;	Ctlr *ctlr;	port = ether->port;	ctlr = ether->ctlr;	/*	 * 3C59[27] require a read between a PIO write and	 * reading a statistics register.	 */	w = (STATUS(port)>>13) & 0x07;	COMMAND(port, SelectRegisterWindow, Wstatistics);	STATUS(port);	for(i = 0; i < UpperFramesOk; i++)		ctlr->stats[i] += inb(port+i) & 0xFF;	u = inb(port+UpperFramesOk) & 0xFF;	ctlr->stats[FramesXmittedOk] += (u & 0x30)<<4;	ctlr->stats[FramesRcvdOk] += (u & 0x03)<<8;	ctlr->stats[BytesRcvdOk] += ins(port+BytesRcvdOk) & 0xFFFF;	ctlr->stats[BytesRcvdOk+1] += ins(port+BytesXmittedOk) & 0xFFFF;	switch(ctlr->xcvr){	case xcvrMii:	case xcvr100BaseTX:	case xcvr100BaseFX:		COMMAND(port, SelectRegisterWindow, Wdiagnostic);		STATUS(port);		ctlr->stats[BytesRcvdOk+2] += inb(port+BadSSD);		break;	}	COMMAND(port, SelectRegisterWindow, w);}static voidtxstart(Ether* ether){	int port, len;	Ctlr *ctlr;	Block *bp;	port = ether->port;	ctlr = ether->ctlr;	/*	 * Attempt to top-up the transmit FIFO. If there's room simply	 * stuff in the packet length (unpadded to a dword boundary), the	 * packet data (padded) and remove the packet from the queue.	 * If there's no room post an interrupt for when there is.	 * This routine is called both from the top level and from interrupt	 * level and expects to be called with ctlr->wlock already locked	 * and the correct register window (Wop) in place.	 */	for(;;){		if(ctlr->txbp){			bp = ctlr->txbp;			ctlr->txbp = 0;		}		else{			bp = qget(ether->oq);			if(bp == nil)				break;		}		len = ROUNDUP(BLEN(bp), 4);		if(len+4 <= ins(port+TxFree)){			outl(port+Fifo, BLEN(bp));			outsl(port+Fifo, bp->rp, len/4);			freeb(bp);			ether->outpackets++;		}		else{			ctlr->txbp = bp;			if(ctlr->txbusy == 0){				ctlr->txbusy = 1;				COMMAND(port, SetTxAvailableThresh, len>>ctlr->ts);			}			break;		}	}}static voidtxstart905(Ether* ether){	Ctlr *ctlr;	int port, stalled, timeo;	Block *bp;	Pd *pd;	ctlr = ether->ctlr;	port = ether->port;	/*	 * Free any completed packets.	 */	pd = ctlr->dntail;	while(ctlr->dnq){		if(PADDR(&pd->np) == inl(port+DnListPtr))			break;		if(pd->bp){			freeb(pd->bp);			pd->bp = nil;		}		ctlr->dnq--;		pd = pd->next;	}	ctlr->dntail = pd;	stalled = 0;	while(ctlr->dnq < (ctlr->ndn-1)){		bp = qget(ether->oq);		if(bp == nil)			break;		pd = ctlr->dnhead->next;		pd->np = 0;		pd->control = dnIndicate|BLEN(bp);		pd->addr = PADDR(bp->rp);		pd->len = updnLastFrag|BLEN(bp);		pd->bp = bp;		if(stalled == 0 && ctlr->dnq && inl(port+DnListPtr)){			COMMAND(port, Stall, dnStall);			for(timeo = 100; (STATUS(port) & commandInProgress) && timeo; timeo--)				;			if(timeo == 0)				print("#l%d: dnstall %d\n", ether->ctlrno, timeo);			stalled = 1;		}		coherence();		ctlr->dnhead->np = PADDR(&pd->np);		ctlr->dnhead->control &= ~dnIndicate;		ctlr->dnhead = pd;		if(ctlr->dnq == 0)			ctlr->dntail = pd;		ctlr->dnq++;		ctlr->dnqueued++;	}	if(ctlr->dnq > ctlr->dnqmax)		ctlr->dnqmax = ctlr->dnq;	/*	 * If the adapter is not currently processing anything	 * and there is something on the queue, start it processing.	 */	if(inl(port+DnListPtr) == 0 && ctlr->dnq)		outl(port+DnListPtr, PADDR(&ctlr->dnhead->np));	if(stalled)		COMMAND(port, Stall, dnUnStall);}static voidtransmit(Ether* ether){	Ctlr *ctlr;	int port, w;	port = ether->port;	ctlr = ether->ctlr;	ilock(&ctlr->wlock);	if(ctlr->dnenabled)		txstart905(ether);	else{		w = (STATUS(port)>>13) & 0x07;		COMMAND(port, SelectRegisterWindow, Wop);		txstart(ether);		COMMAND(port, SelectRegisterWindow, w);	}	iunlock(&ctlr->wlock);}static voidreceive905(Ether* ether){	Ctlr *ctlr;	int len, port, q;	Pd *pd;	Block *bp;	ctlr = ether->ctlr;	port = ether->port;	if(inl(port+UpPktStatus) & upStalled)		ctlr->upstalls++;	q = 0;	for(pd = ctlr->uphead; pd->control & upPktComplete; pd = pd->next){		if(pd->control & upError){			if(pd->control & upOverrun)				ether->overflows++;			if(pd->control & (upOversizedFrame|upRuntFrame))				ether->buffs++;			if(pd->control & upAlignmentError)				ether->frames++;			if(pd->control & upCRCError)				ether->crcs++;		}		else if(bp = iallocb(sizeof(Etherpkt)+4)){			len = pd->control & rxBytes;			pd->bp->wp = pd->bp->rp+len;			etheriq(ether, pd->bp, 1);			pd->bp = bp;			pd->addr = PADDR(bp->rp);			coherence();		}		pd->control = 0;		COMMAND(port, Stall, upUnStall);		q++;	}	ctlr->uphead = pd;	ctlr->upqueued += q;	if(q > ctlr->upqmax)		ctlr->upqmax = q;}static voidreceive(Ether* ether){	int len, port, rxerror, rxstatus;	Ctlr *ctlr;	Block *bp;	port = ether->port;	ctlr = ether->ctlr;	while(((rxstatus = ins(port+RxStatus)) & rxIncomplete) == 0){		if(ctlr->busmaster == 1 && (STATUS(port) & busMasterInProgress))			break;		/*		 * If there was an error, log it and continue.		 * Unfortunately the 3C5[078]9 has the error info in the status register		 * and the 3C59[0257] implement a separate RxError register.		 */		if(rxstatus & rxError){			if(ctlr->rxstatus9){				switch(rxstatus & rxError9){				case rxOverrun9:					ether->overflows++;					break;				case oversizedFrame9:				case runtFrame9:					ether->buffs++;					break;				case alignmentError9:					ether->frames++;					break;				case crcError9:					ether->crcs++;					break;				}			}			else{				rxerror = inb(port+RxError);				if(rxerror & rxOverrun)					ether->overflows++;				if(rxerror & (oversizedFrame|runtFrame))					ether->buffs++;				if(rxerror & alignmentError)					ether->frames++;				if(rxerror & crcError)					ether->crcs++;			}		}		/*		 * If there was an error or a new receive buffer can't be		 * allocated, discard the packet and go on to the next.		 */		if((rxstatus & rxError) || (bp = rbpalloc(iallocb)) == 0){			COMMAND(port, RxDiscard, 0);			while(STATUS(port) & commandInProgress)				;			if(ctlr->busmaster == 1)				startdma(ether, PADDR(ctlr->rbp->rp));			continue;		}		/*		 * A valid receive packet awaits:		 *	if using PIO, read it into the buffer;		 *	discard the packet from the FIFO;		 *	if using busmastering, start a new transfer for		 *	  the next packet and as a side-effect get the		 *	  end-pointer of the one just received;		 *	pass the packet on to whoever wants it.		 */		if(ctlr->busmaster == 0 || ctlr->busmaster == 2){			len = (rxstatus & rxBytes9);			ctlr->rbp->wp = ctlr->rbp->rp + len;			insl(port+Fifo, ctlr->rbp->rp, HOWMANY(len, 4));		}		COMMAND(port, RxDiscard, 0);		while(STATUS(port) & commandInProgress)			;		if(ctlr->busmaster == 1)			ctlr->rbp->wp = startdma(ether, PADDR(bp->rp));		etheriq(ether, ctlr->rbp, 1);		ctlr->rbp = bp;	}}static voidinterrupt(Ureg*, void* arg){	Ether *ether;	int port, status, s, w, x;	Ctlr *ctlr;	ether = arg;	port = ether->port;	ctlr = ether->ctlr;	ilock(&ctlr->wlock);	w = (STATUS(port)>>13) & 0x07;	COMMAND(port, SelectRegisterWindow, Wop);	ctlr->interrupts++;	ctlr->timer += inb(port+Timer) & 0xFF;	while((status = STATUS(port)) & (interruptMask|interruptLatch)){		if(status & hostError){			/*			 * Adapter failure, try to find out why, reset if			 * necessary. What happens if Tx is active and a reset			 * occurs, need to retransmit? This probably isn't right.			 */			COMMAND(port, SelectRegisterWindow, Wdiagnostic);			x = ins(port+FifoDiagnostic);			COMMAND(port, SelectRegisterWindow, Wop);			print("#l%d: status 0x%uX, diag 0x%uX\n",			    ether->ctlrno, status, x);			if(x & txOverrun){				if(ctlr->busmaster == 0)					COMMAND(port, TxReset, 0);				else					COMMAND(port, TxReset, (updnReset|dmaReset));				COMMAND(port, TxEnable, 0);			}			if(x & rxUnderrun){				/*				 * This shouldn't happen...				 * Reset the receiver and restore the filter and RxEarly				 * threshold before re-enabling.				 * Need to restart any busmastering?				 */				COMMAND(port, SelectRegisterWindow, Wstate);				s = (port+RxFilter) & 0x000F;				COMMAND(port, SelectRegisterWindow, Wop);				COMMAND(port, RxReset, 0);				while(STATUS(port) & commandInProgress)					;				COMMAND(port, SetRxFilter, s);				COMMAND(port, SetRxEarlyThresh, ctlr->rxearly>>ctlr->ts);				COMMAND(port, RxEnable, 0);			}			status &= ~hostError;		}		if(status & (transferInt|rxComplete)){			receive(ether);			status &= ~(transferInt|rxComplete);		}		if(status & (upComplete)){

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
久久久91精品国产一区二区三区| 亚洲国产一区二区视频| 亚洲精品乱码久久久久久日本蜜臀 | 色噜噜夜夜夜综合网| 一区二区三区国产| 国产精品一品二品| 欧美日韩一区不卡| 亚洲手机成人高清视频| 国产乱理伦片在线观看夜一区| 欧美视频一区在线| 亚洲欧美国产毛片在线| 国产很黄免费观看久久| 日韩欧美中文字幕制服| 一级精品视频在线观看宜春院 | 91视视频在线观看入口直接观看www | 精品91自产拍在线观看一区| 亚洲激情欧美激情| 欧美mv日韩mv亚洲| 午夜精品久久久久久久| 色欧美片视频在线观看| 亚洲欧美激情小说另类| 99久久综合精品| 国产精品毛片久久久久久| 韩国v欧美v日本v亚洲v| 日韩视频在线观看一区二区| 午夜精品一区二区三区三上悠亚| 国产亚洲精品精华液| 精品制服美女丁香| 日韩精品在线一区二区| 蜜臀精品一区二区三区在线观看| 欧美丰满美乳xxx高潮www| 亚洲一区二区三区视频在线播放| 91在线国产福利| 亚洲欧美另类综合偷拍| 白白色亚洲国产精品| 综合欧美亚洲日本| 久久久影院官网| 国产一区二区女| 精品国产123| 国产成人免费视频网站| 国产女人18毛片水真多成人如厕 | 色婷婷久久久综合中文字幕| 国产精品影视网| 久久综合中文字幕| 大尺度一区二区| 国产精品久久久久久久久免费相片| 国产黄色91视频| 自拍偷拍国产精品| 欧美日韩色一区| 日韩激情av在线| 精品国产91九色蝌蚪| 高清在线观看日韩| 亚洲欧美偷拍卡通变态| 欧美丰满一区二区免费视频| 精彩视频一区二区| 日韩一区有码在线| 欧美少妇一区二区| 国内外精品视频| 久久精品国产99国产| 国产精品嫩草影院com| 色婷婷综合久久久久中文一区二区| 婷婷综合在线观看| 2024国产精品| 91理论电影在线观看| 免费看欧美女人艹b| 国产精品色噜噜| 欧美日韩你懂得| 国产在线视频一区二区| 国产传媒一区在线| 亚洲一区在线视频| 久久精品一区二区三区不卡| 91亚洲精华国产精华精华液| 免费高清在线视频一区·| 国产免费观看久久| 欧美久久久影院| 国产·精品毛片| 蜜桃一区二区三区四区| 亚洲欧洲日产国码二区| 日韩理论电影院| 精品精品国产高清a毛片牛牛| 国产精品综合一区二区三区| 午夜精品福利一区二区三区蜜桃| 久久精品日韩一区二区三区| 欧美日韩一区二区在线观看| 丰满少妇久久久久久久| 日一区二区三区| 亚洲视频一二三区| 欧美精品一区二区蜜臀亚洲| 国产精品久久毛片a| 在线播放91灌醉迷j高跟美女| 91一区在线观看| 国产福利一区二区三区视频在线 | 亚洲一区二区三区精品在线| 奇米色一区二区| 亚洲精品一卡二卡| 中文字幕第一页久久| 欧美一区二区三区在线电影| 欧洲av一区二区嗯嗯嗯啊| 不卡av免费在线观看| 国产乱一区二区| 蜜臀久久99精品久久久画质超高清 | 久久精品亚洲精品国产欧美kt∨| 亚洲精品国产无套在线观 | 欧美一区二区三区在线观看视频| 色综合久久中文综合久久97| 不卡电影免费在线播放一区| 懂色中文一区二区在线播放| 国产一级精品在线| 国产综合久久久久久鬼色| 日韩精品每日更新| 日本中文字幕不卡| 亚洲va欧美va人人爽午夜| 亚洲超丰满肉感bbw| 亚洲综合视频在线| 亚洲精品美国一| 一区二区欧美精品| 亚洲女厕所小便bbb| 亚洲最新视频在线播放| 亚洲香肠在线观看| 亚洲精品乱码久久久久久久久| 亚洲精品视频在线| 成人精品国产福利| 成人福利视频在线| 99视频在线精品| 色屁屁一区二区| 欧美日产在线观看| 日韩欧美成人一区二区| 精品国产青草久久久久福利| 26uuu国产一区二区三区| 久久久精品欧美丰满| 国产精品视频yy9299一区| 亚洲人成7777| 亚洲国产精品一区二区久久恐怖片| 91网站最新网址| 色婷婷久久99综合精品jk白丝| 欧美视频一区在线观看| 欧美一级欧美一级在线播放| 久久综合九色综合97婷婷女人| 国产精品福利av| 亚洲国产综合在线| 免费成人美女在线观看.| 国产一二精品视频| 91丨porny丨首页| 51午夜精品国产| 免费看日韩精品| 成人av电影在线观看| 欧美色综合久久| 精品少妇一区二区三区视频免付费| 2023国产精品自拍| 一区二区三区四区国产精品| 日本午夜精品一区二区三区电影| 久色婷婷小香蕉久久| 93久久精品日日躁夜夜躁欧美| 欧美特级限制片免费在线观看| 欧美大片一区二区三区| 中文字幕日韩一区| 在线视频一区二区三| 日韩女优毛片在线| 国产精品国产精品国产专区不蜜| 天天综合网天天综合色 | 老司机午夜精品| 99精品视频中文字幕| 欧美一二区视频| 亚洲乱码日产精品bd| 美腿丝袜亚洲色图| 一本色道久久加勒比精品| 欧美xxxx在线观看| 国产乱妇无码大片在线观看| 欧美三区在线视频| 中文字幕一区在线| 国产精品18久久久久| 欧美伦理视频网站| 国产精品国产精品国产专区不蜜| 久久国产夜色精品鲁鲁99| 在线免费观看一区| 国产精品久久久久久久久免费丝袜 | 欧美日韩另类国产亚洲欧美一级| 久久久久综合网| 青青青爽久久午夜综合久久午夜| 91免费看片在线观看| 国产色产综合产在线视频| 蜜臀av一区二区三区| 欧美日韩国产高清一区| 一级特黄大欧美久久久| www.一区二区| 欧美韩日一区二区三区| 欧美绝品在线观看成人午夜影视| 中文字幕色av一区二区三区| 国产成人亚洲综合a∨婷婷| 日韩一区二区三区视频| 日韩黄色片在线观看| 欧美日韩亚洲另类| 亚洲大片精品永久免费| 在线亚洲高清视频| 一区二区三区自拍| 欧美伊人久久大香线蕉综合69| 亚洲天堂精品在线观看| 99久久精品国产网站| 亚洲同性同志一二三专区| 欧美精品一区二区久久久|