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

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

?? if_cx.c

?? 基于組件方式開發(fā)操作系統(tǒng)的OSKIT源代碼
?? C
?? 第 1 頁 / 共 2 頁
字號:
#if __FreeBSD__ >= 2		/* Mark the board busy on the first startup.		 * Never goes idle. */		kdc_cx[c->board->num].kdc_state = DC_BUSY;#endif		/* Initialize channel, enable receiver and transmitter */		cx_cmd (port, CCR_INITCH | CCR_ENRX | CCR_ENTX);		/* Repeat the command, to avoid the rev.H bug */		cx_cmd (port, CCR_INITCH | CCR_ENRX | CCR_ENTX);		/* Start receiver */		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);}/* * Initialization of interface. */void cxinit (int unit){	cx_chan_t *q, *c = cxchan[unit];	int s = splimp();	print (("cx%d.%d: cxinit\n", c->board->num, c->num));	cxdown (c);	/* Stop all slave subchannels. */	for (q=c->slaveq; q; q=q->slaveq)		cxdown (q);	if (c->ifp->if_flags & IFF_RUNNING) {		cxup (c);		/* Start all slave subchannels. */		for (q=c->slaveq; q; q=q->slaveq)			cxup (q);	}	splx (s);}/* * Fill transmitter buffer with data. */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. */#ifdef __bsdi__	if (c->sopt.ext) {		struct p2pcom *p = (struct p2pcom*) c->master;		int s = splimp ();		IF_DEQUEUE (&p->p2p_isnd, m)		if (! m)			IF_DEQUEUE (&c->master->if_snd, m)		splx (s);	} else#endif	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->bpf)		bpf_mtap (c->bpf, 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. */void cxsend (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(). */void cxstart (struct ifnet *ifp){	cx_chan_t *q, *c = cxchan[ifp->if_unit];	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(). */void cxwatchdog (int unit){	cx_chan_t *q, *c = cxchan[unit];	if (! (c->ifp->if_flags & IFF_RUNNING))		return;	if (c->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 (c->ifp);}/* * Handle receive interrupts, including receive errors and * receive timeout interrupt. */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. */int cxtinth (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);}#ifdef __FreeBSD__void cxintr (int bnum){	cx_board_t *b = cxboard + bnum;#endif#ifdef __bsdi__void cxintr (cx_board_t *b){#endif	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. */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->bpf)		bpf_tap (c->bpf, 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;#ifdef __bsdi__	if (c->sopt.ext) {		struct p2pcom *p = (struct p2pcom*) c->master;		(*p->p2p_input) (p, m);	} else#endif	sppp_input (c->master, m);}void cxswitch (cx_chan_t *c, cx_soft_opt_t new){#ifdef __bsdi__	if (new.ext && ! c->sopt.ext) {		/* Switch to external ppp implementation (BSDI) */		sppp_detach (c->ifp);		bzero ((void*) c->ifp + IFNETSZ, IFSTRUCTSZ-IFNETSZ);	} else if (! new.ext && c->sopt.ext) {		/* Switch to built-in ppp implementation */		bzero ((void*) c->ifp + IFNETSZ, IFSTRUCTSZ-IFNETSZ);		sppp_attach (c->ifp);	}#else	new.ext = 0;#endif	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;}#endif /* NCX */

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
av不卡免费电影| 亚洲精品一区二区三区精华液| 亚洲国产成人tv| 欧美浪妇xxxx高跟鞋交| 日本麻豆一区二区三区视频| 日韩一区二区在线观看| 国产伦精品一区二区三区视频青涩 | 日本欧美韩国一区三区| 精品少妇一区二区三区| 国产精品99久久久久久似苏梦涵| 国产精品乱码一区二三区小蝌蚪| 91在线观看高清| 午夜天堂影视香蕉久久| 精品美女被调教视频大全网站| 成人午夜电影小说| 亚洲午夜在线观看视频在线| 日韩欧美一区二区在线视频| 国产精品1区2区3区| 亚洲三级免费电影| 6080午夜不卡| 高清国产午夜精品久久久久久| 亚洲乱码中文字幕综合| 91麻豆精品国产91久久久| 国产一区 二区| 一区二区三区丝袜| 精品乱人伦一区二区三区| youjizz久久| 日本特黄久久久高潮| 中文字幕的久久| 欧美日韩在线三区| 国产一区二区在线视频| 一区二区国产视频| 精品国产乱码91久久久久久网站| 97se亚洲国产综合自在线| 免费成人小视频| 亚洲日本在线看| 精品国产乱码久久久久久久久| 91玉足脚交白嫩脚丫在线播放| 日本中文字幕一区二区视频| 欧美国产1区2区| 欧美精品日韩一区| av电影天堂一区二区在线| 日本91福利区| 亚洲免费电影在线| 久久综合中文字幕| 香蕉久久一区二区不卡无毒影院| 久久久亚洲午夜电影| 欧洲视频一区二区| 国产精品1024| 日韩精品五月天| 国产精品国产三级国产普通话蜜臀| 69成人精品免费视频| 99久久99精品久久久久久| 蜜臀精品久久久久久蜜臀 | 天堂蜜桃一区二区三区 | 欧美激情一区二区三区| 欧美肥大bbwbbw高潮| 99re热视频这里只精品| 久99久精品视频免费观看| 亚洲精选视频免费看| xvideos.蜜桃一区二区| 欧美日韩精品一二三区| 99re视频精品| 国产成人av一区二区三区在线 | 一区二区三区美女视频| 国产日韩欧美综合一区| 日韩欧美精品在线| 欧美日韩中文字幕一区| 成人av电影在线观看| 国产尤物一区二区| 日韩成人一级片| 亚洲国产精品一区二区www在线| 国产精品高潮久久久久无| 精品国产1区二区| 91精品国产综合久久精品app| 色综合久久久网| jlzzjlzz亚洲女人18| 国产成人免费xxxxxxxx| 久久综合综合久久综合| 日日噜噜夜夜狠狠视频欧美人 | 国产成人综合网站| 久久精品免费观看| 青青青爽久久午夜综合久久午夜| 亚洲va欧美va国产va天堂影院| 日韩美女久久久| 中文字幕一区二区三区乱码在线| 国产日韩v精品一区二区| 欧美sm美女调教| 欧美大片在线观看一区| 欧美日韩成人综合在线一区二区| 色婷婷激情一区二区三区| 波多野结衣在线aⅴ中文字幕不卡| 精品一区二区免费视频| 久久精品国产成人一区二区三区| 日本91福利区| 蜜臀av性久久久久蜜臀av麻豆| 日韩影院精彩在线| 婷婷国产在线综合| 日韩av在线发布| 琪琪一区二区三区| 久久国产精品99精品国产| 久久精品av麻豆的观看方式| 精品国产一区二区三区久久久蜜月| 欧美一级视频精品观看| 日韩一级片网站| 日韩欧美精品在线视频| 精品日韩一区二区| 久久亚洲精品小早川怜子| 26uuu另类欧美亚洲曰本| 久久久一区二区三区| 国产日韩精品一区二区三区在线| 国产视频一区二区在线观看| 国产女人水真多18毛片18精品视频 | 亚洲综合一区二区三区| 亚洲国产你懂的| 日韩不卡一二三区| 久久99国产精品久久99果冻传媒| 九色综合狠狠综合久久| 精品一区二区在线观看| 国产精品一区二区三区乱码 | 国产精品一区二区黑丝| 激情六月婷婷久久| 国产精品综合二区| 成人不卡免费av| 色婷婷久久久亚洲一区二区三区 | 777奇米成人网| 日韩三级视频中文字幕| 久久婷婷综合激情| 国产精品久久久久久久久免费樱桃| 中文字幕欧美一| 亚洲午夜激情网页| 日本免费在线视频不卡一不卡二| 国产真实精品久久二三区| 成人精品gif动图一区| 91免费版在线看| 欧美日韩一区二区在线视频| 日韩三级高清在线| 国产欧美综合在线观看第十页| 亚洲视频免费看| 视频一区二区三区中文字幕| 狠狠久久亚洲欧美| 波多野结衣在线一区| 欧美色图片你懂的| 精品国产乱码久久久久久1区2区 | 一区二区三区自拍| 免费看欧美女人艹b| 国产福利一区二区| 色中色一区二区| 日韩一区二区精品在线观看| 国产欧美一区二区精品久导航| 亚洲精品乱码久久久久久黑人| 天天影视网天天综合色在线播放| 国产综合久久久久久鬼色| 91同城在线观看| 日韩亚洲欧美一区二区三区| 欧美国产精品劲爆| 婷婷综合久久一区二区三区| 国产一区二区免费在线| 在线免费不卡电影| 久久综合色综合88| 一级做a爱片久久| 韩国精品主播一区二区在线观看| 99re这里只有精品首页| 欧美顶级少妇做爰| 国产精品高潮呻吟久久| 琪琪久久久久日韩精品| 亚洲男帅同性gay1069| 青青草精品视频| 99re成人精品视频| 精品理论电影在线观看| 亚洲精品中文在线影院| 美国毛片一区二区| 色偷偷一区二区三区| 久久综合九色综合久久久精品综合| 亚洲美女视频一区| 国产在线视频一区二区| 欧美视频在线一区二区三区| 久久精品视频免费| 天堂影院一区二区| 91免费看视频| 久久久国产一区二区三区四区小说| 亚洲一级二级三级在线免费观看| 国产毛片精品国产一区二区三区| 欧美午夜一区二区三区免费大片| 国产欧美日韩激情| 美腿丝袜一区二区三区| 日本道免费精品一区二区三区| 久久久亚洲高清| 日韩黄色免费电影| 91国模大尺度私拍在线视频| 久久麻豆一区二区| 免费视频最近日韩| 欧美视频精品在线观看| 亚洲国产精品成人久久综合一区 | 成人综合在线网站| 日韩一区二区高清| 亚洲一区二区在线播放相泽| 成人黄色片在线观看| 亚洲精品一区二区三区99| 日日摸夜夜添夜夜添精品视频|