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

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

?? if_cx.c

?? 基于組件方式開發(fā)操作系統(tǒng)的OSKIT源代碼
?? C
?? 第 1 頁(yè) / 共 2 頁(yè)
字號(hào):
		outw (ARBCNT(port), DMABUFSZ);		outb (ARBSTS(port), BSTS_OWN24);		outw (BRBCNT(port), DMABUFSZ);		outb (BRBSTS(port), BSTS_OWN24);		/* Raise DTR and RTS */		cx_chan_dtr (c, 1);		cx_chan_rts (c, 1);		/* Enable interrupts */		outb (IER(port), IER_RXD | IER_TXD);}/* * Fill transmitter buffer with data. */static void cxput (cx_chan_t *c, char b){	struct mbuf *m;	unsigned char *buf;	unsigned short port = c->chip->port, len, cnt_port, sts_port;	/* Choose the buffer. */	if (b == 'A') {		buf      = c->atbuf;		cnt_port = ATBCNT(port);		sts_port = ATBSTS(port);	} else {		buf      = c->btbuf;		cnt_port = BTBCNT(port);		sts_port = BTBSTS(port);	}	/* Is it busy? */	if (inb (sts_port) & BSTS_OWN24) {		if (c->ifp->if_flags & IFF_DEBUG)			print (("cx%d.%d: tbuf %c already busy, bsts=%b\n",				c->board->num, c->num, b,				inb (sts_port), BSTS_BITS));		goto ret;	}	/* Get the packet to send. */	m = sppp_dequeue (c->master);	if (! m)		return;	len = m->m_pkthdr.len;	/* Count the transmitted bytes to the subchannel, not the master. */	c->master->if_obytes -= len + 3;	c->ifp->if_obytes += len + 3;	c->stat->obytes += len + 3;	if (len >= DMABUFSZ) {		printf ("cx%d.%d: too long packet: %d bytes: ",			c->board->num, c->num, len);		printmbuf (m);		m_freem (m);		return;	}	m_copydata (m, 0, len, buf);#if NBPFILTER > 0	if (c->ifp->if_bpf)		bpf_mtap (c->ifp, m);#endif	m_freem (m);	/* Start transmitter. */	outw (cnt_port, len);	outb (sts_port, BSTS_EOFR | BSTS_INTR | BSTS_OWN24);	if (c->ifp->if_flags & IFF_DEBUG)		print (("cx%d.%d: enqueue %d bytes to %c\n",			c->board->num, c->num, len, buf==c->atbuf ? 'A' : 'B'));ret:	c->ifp->if_flags |= IFF_OACTIVE;}/* * Start output on the (slave) interface.  Get another datagram to send * off of the interface queue, and copy it to the interface * before starting the output. */static voidcxsend (cx_chan_t *c){	unsigned short port = c->chip->port;	if (c->ifp->if_flags & IFF_DEBUG)		print (("cx%d.%d: cxsend\n", c->board->num, c->num));	/* No output if the interface is down. */	if (! (c->ifp->if_flags & IFF_RUNNING))		return;	/* Set the current channel number. */	outb (CAR(port), c->num & 3);	/* Determine the buffer order. */	if (inb (DMABSTS(port)) & DMABSTS_NTBUF) {		cxput (c, 'B');		cxput (c, 'A');	} else {		cxput (c, 'A');		cxput (c, 'B');	}	/* Set up transmit timeout. */	if (c->master->if_flags & IFF_OACTIVE)		c->master->if_timer = TXTIMEOUT;	/*	 * Enable TXMPTY interrupt,	 * to catch the case when the second buffer is empty.	 */	if ((inb (ATBSTS(port)) & BSTS_OWN24) &&	    (inb (BTBSTS(port)) & BSTS_OWN24)) {		outb (IER(port), IER_RXD | IER_TXD | IER_TXMPTY);	} else		outb (IER(port), IER_RXD | IER_TXD);}/* * Start output on the (master) interface and all slave interfaces. * Always called on splimp(). */static voidcxstart (struct ifnet *ifp){	cx_chan_t *q, *c = ifp->if_softc;	if (c->ifp->if_flags & IFF_DEBUG)		print (("cx%d.%d: cxstart\n", c->board->num, c->num));	/* Start the master subchannel. */	cxsend (c);	/* Start all slave subchannels. */	if (c->slaveq && ! sppp_isempty (c->master))		for (q=c->slaveq; q; q=q->slaveq)			if ((q->ifp->if_flags & IFF_RUNNING) &&			    ! (q->ifp->if_flags & IFF_OACTIVE))				cxsend (q);}/* * Handle transmit timeouts. * Recover after lost transmit interrupts. * Always called on splimp(). */static voidcxwatchdog (struct ifnet *ifp){	cx_chan_t *q, *c = ifp->if_softc;	if (! (ifp->if_flags & IFF_RUNNING))		return;	if (ifp->if_flags & IFF_DEBUG)		printf ("cx%d.%d: device timeout\n", c->board->num, c->num);	cxdown (c);	for (q=c->slaveq; q; q=q->slaveq)		cxdown (q);	cxup (c);	for (q=c->slaveq; q; q=q->slaveq)		cxup (q);		cxstart (ifp);}/* * Handle receive interrupts, including receive errors and * receive timeout interrupt. */static void cxrinth (cx_chan_t *c){	unsigned short port = c->chip->port;	unsigned short len, risr = inw (RISR(port));	/* Receive errors. */	if (risr & (RIS_BUSERR | RIS_OVERRUN | RISH_CRCERR | RISH_RXABORT)) {		if (c->ifp->if_flags & IFF_DEBUG)			printf ("cx%d.%d: receive error, risr=%b\n",				c->board->num, c->num, risr, RISH_BITS);		++c->ifp->if_ierrors;		++c->stat->ierrs;		if (risr & RIS_OVERRUN)			++c->ifp->if_collisions;	} else if (risr & RIS_EOBUF) {		if (c->ifp->if_flags & IFF_DEBUG)			print (("cx%d.%d: hdlc receive interrupt, risr=%b, arbsts=%b, brbsts=%b\n",				c->board->num, c->num, risr, RISH_BITS,				inb (ARBSTS(port)), BSTS_BITS,				inb (BRBSTS(port)), BSTS_BITS));		++c->stat->ipkts;		/* Handle received data. */		len = (risr & RIS_BB) ? inw(BRBCNT(port)) : inw(ARBCNT(port));		c->stat->ibytes += len;		if (len > DMABUFSZ) {			/* Fatal error: actual DMA transfer size			 * exceeds our buffer size.  It could be caused			 * by incorrectly programmed DMA register or			 * hardware fault.  Possibly, should panic here. */			printf ("cx%d.%d: panic! DMA buffer overflow: %d bytes\n",			       c->board->num, c->num, len);			++c->ifp->if_ierrors;		} else if (! (risr & RIS_EOFR)) {			/* The received frame does not fit in the DMA buffer.			 * It could be caused by serial lie noise,			 * or if the peer has too big MTU. */			if (c->ifp->if_flags & IFF_DEBUG)				printf ("cx%d.%d: received frame length exceeds MTU, risr=%b\n",					c->board->num, c->num, risr, RISH_BITS);			++c->ifp->if_ierrors;		} else {			/* Valid frame received. */			if (c->ifp->if_flags & IFF_DEBUG)				print (("cx%d.%d: hdlc received %d bytes\n",				c->board->num, c->num, len));			cxinput (c, (risr & RIS_BB) ? c->brbuf : c->arbuf, len);			++c->ifp->if_ipackets;		}	} else if (c->ifp->if_flags & IFF_DEBUG) {		print (("cx%d.%d: unknown hdlc receive interrupt, risr=%b\n",			c->board->num, c->num, risr, RISH_BITS));		++c->stat->ierrs;	}	/* Restart receiver. */	if (! (inb (ARBSTS(port)) & BSTS_OWN24)) {		outw (ARBCNT(port), DMABUFSZ);		outb (ARBSTS(port), BSTS_OWN24);	}	if (! (inb (BRBSTS(port)) & BSTS_OWN24)) {		outw (BRBCNT(port), DMABUFSZ);		outb (BRBSTS(port), BSTS_OWN24);	}}/* * Handle transmit interrupt. */static intcxtinth (cx_chan_t *c){	unsigned short port = c->chip->port;	unsigned char tisr = inb (TISR(port));	unsigned char teoir = 0;	c->ifp->if_flags &= ~IFF_OACTIVE;	if (c->ifp == c->master)		c->ifp->if_timer = 0;	if (tisr & (TIS_BUSERR | TIS_UNDERRUN)) {		/* if (c->ifp->if_flags & IFF_DEBUG) */			print (("cx%d.%d: transmit error, tisr=%b, atbsts=%b, btbsts=%b\n",				c->board->num, c->num, tisr, TIS_BITS,				inb (ATBSTS(port)), BSTS_BITS,				inb (BTBSTS(port)), BSTS_BITS));		++c->ifp->if_oerrors;		++c->stat->oerrs;		/* Terminate the failed buffer. */		/* teoir = TEOI_TERMBUFF; */	} else if (c->ifp->if_flags & IFF_DEBUG)		print (("cx%d.%d: hdlc transmit interrupt, tisr=%b, atbsts=%b, btbsts=%b\n",			c->board->num, c->num, tisr, TIS_BITS,			inb (ATBSTS(port)), BSTS_BITS,			inb (BTBSTS(port)), BSTS_BITS));	if (tisr & TIS_EOFR) {		++c->ifp->if_opackets;		++c->stat->opkts;	}	/* Start output on the (sub-) channel. */	cxsend (c);	return (teoir);}static voidcxintr (int bnum){	cx_board_t *b = cxboard + bnum;	while (! (inw (BSR(b->port)) & BSR_NOINTR)) {		/* Acknowledge the interrupt to enter the interrupt context. */		/* Read the local interrupt vector register. */		unsigned char livr = inb (IACK(b->port, BRD_INTR_LEVEL));		cx_chan_t *c = b->chan + (livr>>2 & 0xf);		unsigned short port = c->chip->port;		unsigned short eoiport = REOIR(port);		unsigned char eoi = 0;		if (c->type == T_NONE) {			printf ("cx%d.%d: unexpected interrupt, livr=0x%x\n",				c->board->num, c->num, livr);			continue;       /* incorrect channel number? */		}		/* print (("cx%d.%d: interrupt, livr=0x%x\n",			c->board->num, c->num, livr)); */		/* Clear RTS to stop receiver data flow while we are busy		 * processing the interrupt, thus avoiding underruns. */		if (! c->sopt.norts) {			outb (MSVR_RTS(port), 0);			c->rts = 0;		}		switch (livr & 3) {		case LIV_EXCEP:         /* receive exception */		case LIV_RXDATA:        /* receive interrupt */			++c->stat->rintr;			switch (c->mode) {			case M_ASYNC: eoi = cxrinta (c); break;			case M_HDLC:  cxrinth (c);       break;			default:;       /* No bisync and X.21 yet */			}			break;		case LIV_TXDATA:        /* transmit interrupt */			++c->stat->tintr;			eoiport = TEOIR(port);			switch (c->mode) {			case M_ASYNC: cxtinta (c);       break;			case M_HDLC:  eoi = cxtinth (c); break;			default:;       /* No bisync and X.21 yet */			}			break;		case LIV_MODEM:         /* modem/timer interrupt */			++c->stat->mintr;			eoiport = MEOIR(port);			cxmint (c);			break;		}		/* Raise RTS for this channel if and only if		 * both receive buffers are empty. */		if (! c->sopt.norts && (inb (CSR(port)) & CSRA_RXEN) &&		    (inb (ARBSTS(port)) & BSTS_OWN24) &&		    (inb (BRBSTS(port)) & BSTS_OWN24)) {			outb (MSVR_RTS(port), MSV_RTS);			c->rts = 1;		}		/* Exit from interrupt context. */		outb (eoiport, eoi);		/* Master channel - start output on all idle subchannels. */		if (c->master == c->ifp && c->slaveq &&		    (livr & 3) == LIV_TXDATA && c->mode == M_HDLC &&		    ! sppp_isempty (c->ifp)) {			cx_chan_t *q;			for (q=c->slaveq; q; q=q->slaveq)				if ((q->ifp->if_flags & IFF_RUNNING) &&				    ! (q->ifp->if_flags & IFF_OACTIVE))					cxsend (q);		}	}}/* * Process the received packet. */static void cxinput (cx_chan_t *c, void *buf, unsigned len){	/* Make an mbuf. */	struct mbuf *m = makembuf (buf, len);	if (! m) {		if (c->ifp->if_flags & IFF_DEBUG)			printf ("cx%d.%d: no memory for packet\n",				c->board->num, c->num);		++c->ifp->if_iqdrops;		return;	}	m->m_pkthdr.rcvif = c->master;#ifdef DEBUG	if (c->ifp->if_flags & IFF_DEBUG)	printmbuf (m);#endif#if NBPFILTER > 0	/*	 * Check if there's a BPF listener on this interface.	 * If so, hand off the raw packet to bpf.	 */	if (c->ifp->if_bpf)		bpf_tap (c->ifp, buf, len);#endif	/* Count the received bytes to the subchannel, not the master. */	c->master->if_ibytes -= len + 3;	c->ifp->if_ibytes += len + 3;	sppp_input (c->master, m);}void cxswitch (cx_chan_t *c, cx_soft_opt_t new){	new.ext = 0;	if (! new.ext) {		struct sppp *sp = (struct sppp*) c->ifp;		if (new.cisco)			sp->pp_flags |= PP_CISCO;		else			sp->pp_flags &= ~PP_CISCO;		if (new.keepalive)			sp->pp_flags |= PP_KEEPALIVE;		else			sp->pp_flags &= ~PP_KEEPALIVE;	}	c->sopt = new;}

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美日韩国产欧美日美国产精品| 欧美一二三四区在线| 国产成人精品三级| 久久国产精品99久久人人澡| 青草国产精品久久久久久| 午夜精品福利在线| 亚洲网友自拍偷拍| 亚洲成人自拍一区| 日韩和的一区二区| 秋霞午夜av一区二区三区| 日韩av中文在线观看| 美女诱惑一区二区| 久久99精品久久久| 国产精品自拍网站| 粉嫩av亚洲一区二区图片| 国产69精品久久777的优势| 成人妖精视频yjsp地址| 不卡av免费在线观看| 92国产精品观看| 欧美伊人久久大香线蕉综合69| 在线观看视频91| 在线成人av网站| 日韩精品一区二区三区在线| 久久这里只精品最新地址| 久久九九国产精品| 国产精品国产三级国产aⅴ原创| 日韩一区日韩二区| 亚洲国产视频在线| 久久国产精品72免费观看| 国产毛片精品国产一区二区三区| 高清成人在线观看| 色婷婷狠狠综合| 欧美一区二区日韩| 国产女主播一区| 亚洲一区自拍偷拍| 免费三级欧美电影| 国产成人免费在线观看| 91色|porny| 欧美一区二区三区播放老司机| 国产亚洲一二三区| 一级精品视频在线观看宜春院| 亚洲成人免费视| 精品一区二区日韩| 色综合久久久久综合体| 91精品福利在线一区二区三区 | 国产高清精品网站| 91麻豆国产自产在线观看| 欧美日韩三级一区二区| 26uuu久久综合| 一区二区三区中文字幕| 精品亚洲免费视频| 91黄色免费看| 久久综合久久鬼色中文字| 亚洲欧美一区二区在线观看| 另类小说欧美激情| 日本乱码高清不卡字幕| 精品日本一线二线三线不卡| 综合亚洲深深色噜噜狠狠网站| 美洲天堂一区二卡三卡四卡视频| 91在线视频免费91| 精品99999| 亚洲午夜日本在线观看| 大白屁股一区二区视频| 91精品久久久久久久99蜜桃| 综合久久久久综合| 黄色小说综合网站| 欧美日韩国产小视频在线观看| 中文字幕av免费专区久久| 日韩福利电影在线观看| 色综合天天综合网国产成人综合天| 日韩你懂的在线播放| 亚洲国产一区二区三区青草影视| 成人在线一区二区三区| 欧美变态tickling挠脚心| 亚洲精品水蜜桃| 成人免费视频网站在线观看| 精品成人私密视频| 日韩黄色免费电影| 在线免费不卡视频| 国产精品妹子av| 国产一区二区网址| 日韩欧美在线网站| 水野朝阳av一区二区三区| 91免费版在线| 中文字幕av一区二区三区免费看 | 亚洲精品乱码久久久久久黑人| 精品影视av免费| 欧美一区三区四区| 一区二区三区高清| 白白色 亚洲乱淫| 久久精品亚洲一区二区三区浴池| 男人操女人的视频在线观看欧美 | 国产亚洲欧洲一区高清在线观看| 毛片一区二区三区| 91精品婷婷国产综合久久性色| 亚洲在线一区二区三区| 色美美综合视频| 中文字幕一区二区5566日韩| 成人黄色大片在线观看| 国产日本一区二区| 国产在线精品一区二区不卡了| 日韩美女视频在线| 精品综合免费视频观看| 日韩欧美国产一区二区三区 | 高清在线观看日韩| 久久久久久97三级| 国产在线观看一区二区| 久久嫩草精品久久久久| 国产一区二三区好的| 久久精品网站免费观看| 国产成人久久精品77777最新版本| 久久一夜天堂av一区二区三区| 国内精品第一页| 肉肉av福利一精品导航| 精品视频色一区| 日韩**一区毛片| 欧美成人video| 国产精品996| 国产精品福利一区二区| 91丨九色丨蝌蚪富婆spa| 亚洲理论在线观看| 欧美日韩一区二区电影| 日韩国产欧美视频| 精品美女一区二区三区| 丰满少妇在线播放bd日韩电影| 国产精品久久久久9999吃药| 色综合久久综合中文综合网| 亚洲国产aⅴ天堂久久| 日韩视频一区二区在线观看| 国产一区二区导航在线播放| 欧美经典一区二区| 日本精品一区二区三区高清| 天天综合色天天综合| 精品sm在线观看| aaa亚洲精品| 午夜日韩在线观看| www亚洲一区| 91麻豆6部合集magnet| 午夜激情一区二区| 精品久久人人做人人爱| 成人黄色小视频在线观看| 午夜天堂影视香蕉久久| 久久综合精品国产一区二区三区| 丁香婷婷综合网| 亚洲一级不卡视频| 精品va天堂亚洲国产| 色综合久久久久综合体桃花网| 蜜臀av亚洲一区中文字幕| 欧美国产日韩亚洲一区| 欧美视频精品在线观看| 久久福利视频一区二区| 最新热久久免费视频| 欧美一区二区三区在| 成人性生交大片免费看视频在线 | 一区二区不卡在线播放| 欧美不卡123| 欧美图区在线视频| 国产91精品在线观看| 日韩精品国产欧美| 1区2区3区国产精品| 日韩一级片在线观看| 91丨九色丨蝌蚪富婆spa| 久久99蜜桃精品| 亚洲综合精品久久| 日本一区二区动态图| 4438x亚洲最大成人网| 91丝袜呻吟高潮美腿白嫩在线观看| 蜜桃视频在线一区| 一区二区三区在线视频免费| 国产亚洲成aⅴ人片在线观看| 欧美日韩国产一级二级| 91在线丨porny丨国产| 国产精品1区2区3区在线观看| 婷婷久久综合九色综合伊人色| 国产精品麻豆一区二区| 日韩三区在线观看| 在线观看国产精品网站| 成人在线综合网| 加勒比av一区二区| 午夜精品福利久久久| 亚洲人一二三区| 欧美国产日韩精品免费观看| 日韩一级大片在线观看| 欧美三级中文字幕在线观看| av亚洲精华国产精华| 精品写真视频在线观看| 亚洲成av人片www| 亚洲精品国产a| 国产精品家庭影院| 国产亚洲一区二区三区在线观看| 欧美一级生活片| 欧美日韩视频在线观看一区二区三区 | 国产成人一区在线| 国产精品国产自产拍高清av| 久久精品人人做人人爽97| 欧美一区二区福利在线| 欧美日韩美女一区二区| 欧洲色大大久久| 91久久精品国产91性色tv| 91一区一区三区|