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

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

?? ether79c970.c

?? 這是一個同樣來自貝爾實驗室的和UNIX有著淵源的操作系統, 其簡潔的設計和實現易于我們學習和理解
?? C
字號:
/* * AMD79C970 * PCnet-PCI Single-Chip Ethernet Controller for PCI Local Bus * To do: *	finish this rewrite */#include "u.h"#include "lib.h"#include "mem.h"#include "dat.h"#include "fns.h"#include "io.h"#include "etherif.h"enum {	Lognrdre	= 6,	Nrdre		= (1<<Lognrdre),/* receive descriptor ring entries */	Logntdre	= 4,	Ntdre		= (1<<Logntdre),/* transmit descriptor ring entries */	Rbsize		= ETHERMAXTU+4,	/* ring buffer size (+4 for CRC) */};enum {					/* DWIO I/O resource map */	Aprom		= 0x0000,	/* physical address */	Rdp		= 0x0010,	/* register data port */	Rap		= 0x0014,	/* register address port */	Sreset		= 0x0018,	/* software reset */	Bdp		= 0x001C,	/* bus configuration register data port */};enum {					/* CSR0 */	Init		= 0x0001,	/* begin initialisation */	Strt		= 0x0002,	/* enable chip */	Stop		= 0x0004,	/* disable chip */	Tdmd		= 0x0008,	/* transmit demand */	Txon		= 0x0010,	/* transmitter on */	Rxon		= 0x0020,	/* receiver on */	Iena		= 0x0040,	/* interrupt enable */	Intr		= 0x0080,	/* interrupt flag */	Idon		= 0x0100,	/* initialisation done */	Tint		= 0x0200,	/* transmit interrupt */	Rint		= 0x0400,	/* receive interrupt */	Merr		= 0x0800,	/* memory error */	Miss		= 0x1000,	/* missed frame */	Cerr		= 0x2000,	/* collision */	Babl		= 0x4000,	/* transmitter timeout */	Err		= 0x8000,	/* Babl|Cerr|Miss|Merr */};	enum {					/* CSR3 */	Bswp		= 0x0004,	/* byte swap */	Emba		= 0x0008,	/* enable modified back-off algorithm */	Dxmt2pd		= 0x0010,	/* disable transmit two part deferral */	Lappen		= 0x0020,	/* look-ahead packet processing enable */};enum {					/* CSR4 */	ApadXmt		= 0x0800,	/* auto pad transmit */};enum {					/* CSR15 */	Prom		= 0x8000,	/* promiscuous mode */};typedef struct {			/* Initialisation Block */	ushort	mode;	uchar	rlen;			/* upper 4 bits */	uchar	tlen;			/* upper 4 bits */	uchar	padr[6];	uchar	res[2];	uchar	ladr[8];	ulong	rdra;	ulong	tdra;} Iblock;typedef struct {			/* descriptor ring entry */	ulong	addr;	ulong	md1;			/* status|bcnt */	ulong	md2;			/* rcc|rpc|mcnt */	void*	data;} Dre;enum {					/* md1 */	Enp		= 0x01000000,	/* end of packet */	Stp		= 0x02000000,	/* start of packet */	RxBuff		= 0x04000000,	/* buffer error */	Def		= 0x04000000,	/* deferred */	Crc		= 0x08000000,	/* CRC error */	One		= 0x08000000,	/* one retry needed */	Oflo		= 0x10000000,	/* overflow error */	More		= 0x10000000,	/* more than one retry needed */	Fram		= 0x20000000,	/* framing error */	RxErr		= 0x40000000,	/* Fram|Oflo|Crc|RxBuff */	TxErr		= 0x40000000,	/* Uflo|Lcol|Lcar|Rtry */	Own		= 0x80000000,};enum {					/* md2 */	Rtry		= 0x04000000,	/* failed after repeated retries */	Lcar		= 0x08000000,	/* loss of carrier */	Lcol		= 0x10000000,	/* late collision */	Uflo		= 0x40000000,	/* underflow error */	TxBuff		= 0x80000000,	/* buffer error */};typedef struct Ctlr Ctlr;struct Ctlr {	Lock;	int	port;	Pcidev*	pcidev;	Ctlr*	next;	int	active;	int	init;			/* initialisation in progress */	Iblock	iblock;	Dre*	rdr;			/* receive descriptor ring */	int	rdrx;	Dre*	tdr;			/* transmit descriptor ring */	int	tdrh;			/* host index into tdr */	int	tdri;			/* interface index into tdr */	int	ntq;			/* descriptors active */	ulong	rxbuff;			/* receive statistics */	ulong	crc;	ulong	oflo;	ulong	fram;	ulong	rtry;			/* transmit statistics */	ulong	lcar;	ulong	lcol;	ulong	uflo;	ulong	txbuff;	ulong	merr;			/* bobf is such a whiner */	ulong	miss;	ulong	babl;	int		(*ior)(Ctlr*, int);	void		(*iow)(Ctlr*, int, int);};static Ctlr* ctlrhead;static Ctlr* ctlrtail;/* * The Rdp, Rap, Sreset, Bdp ports are 32-bit port offset in the enumeration above. * To get to 16-bit offsets, scale down with 0x10 staying the same. */static intio16r(Ctlr* c, int r){	if(r >= Rdp)		r = (r-Rdp)/2+Rdp;	return ins(c->port+r);}static voidio16w(Ctlr* c, int r, int v){	if(r >= Rdp)		r = (r-Rdp)/2+Rdp;	outs(c->port+r, v);}static intio32r(Ctlr* c, int r){	return inl(c->port+r);}static voidio32w(Ctlr* c, int r, int v){	outl(c->port+r, v);}static voidattach(Ether*){}static voiddetach(Ether* ether){	Ctlr *ctlr;	ctlr = ether->ctlr;	ctlr->iow(ctlr, Rdp, Iena|Stop);}static voidringinit(Ctlr* ctlr){	Dre *dre;	/*	 * Initialise the receive and transmit buffer rings.	 * The ring entries must be aligned on 16-byte boundaries.	 *	 * This routine is protected by ctlr->init.	 */	if(ctlr->rdr == 0){		ctlr->rdr = ialloc(Nrdre*sizeof(Dre), 0x10);		for(dre = ctlr->rdr; dre < &ctlr->rdr[Nrdre]; dre++){			dre->data = malloc(Rbsize);			dre->addr = PADDR(dre->data);			dre->md2 = 0;			dre->md1 = Own|(-Rbsize & 0xFFFF);		}	}	ctlr->rdrx = 0;	if(ctlr->tdr == 0)		ctlr->tdr = ialloc(Ntdre*sizeof(Dre), 0x10);	memset(ctlr->tdr, 0, Ntdre*sizeof(Dre));	ctlr->tdrh = ctlr->tdri = 0;}static voidtransmit(Ether* ether){	Ctlr *ctlr;	Block *bp;	Dre *dre;	RingBuf *tb;	ctlr = ether->ctlr;	if(ctlr->init)		return;	while(ctlr->ntq < (Ntdre-1)){		tb = &ether->tb[ether->ti];		if(tb->owner != Interface)			break;		bp = allocb(tb->len);		memmove(bp->wp, tb->pkt, tb->len);		memmove(bp->wp+Eaddrlen, ether->ea, Eaddrlen);		bp->wp += tb->len;		/*		 * Give ownership of the descriptor to the chip,		 * increment the software ring descriptor pointer		 * and tell the chip to poll.		 * There's no need to pad to ETHERMINTU		 * here as ApadXmt is set in CSR4.		 */		dre = &ctlr->tdr[ctlr->tdrh];		dre->data = bp;		dre->addr = PADDR(bp->rp);		dre->md2 = 0;		dre->md1 = Own|Stp|Enp|Oflo|(-BLEN(bp) & 0xFFFF);		ctlr->ntq++;		ctlr->iow(ctlr, Rap, 0);		ctlr->iow(ctlr, Rdp, Iena|Tdmd);		ctlr->tdrh = NEXT(ctlr->tdrh, Ntdre);		tb->owner = Host;		ether->ti = NEXT(ether->ti, ether->ntb);	}}static voidinterrupt(Ureg*, void* arg){	Ctlr *ctlr;	Ether *ether;	int csr0;	Dre *dre;	RingBuf *rb;	ether = arg;	ctlr = ether->ctlr;	/*	 * Acknowledge all interrupts and whine about those that shouldn't	 * happen.	 */intrloop:	csr0 = ctlr->ior(ctlr, Rdp) & 0xFFFF;	ctlr->iow(ctlr, Rdp, Babl|Cerr|Miss|Merr|Rint|Tint|Iena);	if(csr0 & Merr)		ctlr->merr++;	if(csr0 & Miss)		ctlr->miss++;	if(csr0 & Babl)		ctlr->babl++;	//if(csr0 & (Babl|Miss|Merr))	//	print("#l%d: csr0 = 0x%uX\n", ether->ctlrno, csr0);	if(!(csr0 & (Rint|Tint)))		return;	/*	 * Receiver interrupt: run round the descriptor ring logging	 * errors and passing valid receive data up to the higher levels	 * until a descriptor is encountered still owned by the chip.	 */	if(csr0 & Rint){		dre = &ctlr->rdr[ctlr->rdrx];		while(!(dre->md1 & Own)){			rb = &ether->rb[ether->ri];			if(dre->md1 & RxErr){				if(dre->md1 & RxBuff)					ctlr->rxbuff++;				if(dre->md1 & Crc)					ctlr->crc++;				if(dre->md1 & Oflo)					ctlr->oflo++;				if(dre->md1 & Fram)					ctlr->fram++;			}			else if(rb->owner == Interface){				rb->owner = Host;				rb->len = (dre->md2 & 0x0FFF)-4;				memmove(rb->pkt, dre->data, rb->len);				ether->ri = NEXT(ether->ri, ether->nrb);			}			/*			 * Finished with this descriptor, reinitialise it,			 * give it back to the chip, then on to the next...			 */			dre->md2 = 0;			dre->md1 = Own|(-Rbsize & 0xFFFF);			ctlr->rdrx = NEXT(ctlr->rdrx, Nrdre);			dre = &ctlr->rdr[ctlr->rdrx];		}	}	/*	 * Transmitter interrupt: wakeup anyone waiting for a free descriptor.	 */	if(csr0 & Tint){		lock(ctlr);		while(ctlr->ntq){			dre = &ctlr->tdr[ctlr->tdri];			if(dre->md1 & Own)				break;				if(dre->md1 & TxErr){				if(dre->md2 & Rtry)					ctlr->rtry++;				if(dre->md2 & Lcar)					ctlr->lcar++;				if(dre->md2 & Lcol)					ctlr->lcol++;				if(dre->md2 & Uflo)					ctlr->uflo++;				if(dre->md2 & TxBuff)					ctlr->txbuff++;			}				freeb(dre->data);				ctlr->ntq--;			ctlr->tdri = NEXT(ctlr->tdri, Ntdre);		}		transmit(ether);		unlock(ctlr);	}	goto intrloop;}static voidamd79c970pci(void){	Ctlr *ctlr;	Pcidev *p;	p = nil;	while(p = pcimatch(p, 0x1022, 0x2000)){		ctlr = malloc(sizeof(Ctlr));		ctlr->port = p->mem[0].bar & ~0x01;		ctlr->pcidev = p;		if(ctlrhead != nil)			ctlrtail->next = ctlr;		else			ctlrhead = ctlr;		ctlrtail = ctlr;	}}intamd79c970reset(Ether* ether){	int x;	uchar ea[Eaddrlen];	Ctlr *ctlr;	if(ctlrhead == nil)		amd79c970pci();	/*	 * Any adapter matches if no port is supplied,	 * otherwise the ports must match.	 */	for(ctlr = ctlrhead; ctlr != nil; ctlr = ctlr->next){		if(ctlr->active)			continue;		if(ether->port == 0 || ether->port == ctlr->port){			ctlr->active = 1;			break;		}	}	if(ctlr == nil)		return -1;	/*	 * Allocate a controller structure and start to initialise it.	 */	ether->ctlr = ctlr;	ether->port = ctlr->port;	ether->irq = ctlr->pcidev->intl;	ether->tbdf = ctlr->pcidev->tbdf;	pcisetbme(ctlr->pcidev);	ilock(ctlr);	ctlr->init = 1;	io32r(ctlr, Sreset);	io16r(ctlr, Sreset);	if(io16w(ctlr, Rap, 0), io16r(ctlr, Rdp) == 4){		ctlr->ior = io16r;		ctlr->iow = io16w;	}else if(io32w(ctlr, Rap, 0), io32r(ctlr, Rdp) == 4){		ctlr->ior = io32r;		ctlr->iow = io32w;	}else{		print("#l%d: card doesn't talk right\n", ether->ctlrno);		iunlock(ctlr);		return -1;	}	ctlr->iow(ctlr, Rap, 88);	x = ctlr->ior(ctlr, Rdp);	ctlr->iow(ctlr, Rap, 89);	x |= ctlr->ior(ctlr, Rdp)<<16;	switch(x&0xFFFFFFF){	case 0x2420003:	/* PCnet/PCI 79C970 */	case 0x2621003:	/* PCnet/PCI II 79C970A */		break;	default:		print("unknown PCnet card version %.7ux\n", x&0xFFFFFFF);		iunlock(ctlr);		return -1;	}	/*	 * Set the software style in BCR20 to be PCnet-PCI to ensure 32-bit access.	 * Set the auto pad transmit in CSR4.	 */	ctlr->iow(ctlr, Rap, 20);	ctlr->iow(ctlr, Bdp, 0x0002);	ctlr->iow(ctlr, Rap, 4);	x = ctlr->ior(ctlr, Rdp) & 0xFFFF;	ctlr->iow(ctlr, Rdp, ApadXmt|x);	ctlr->iow(ctlr, Rap, 0);	/*	 * Check if the adapter's station address is to be overridden.	 * If not, read it from the I/O-space and set in ether->ea prior to	 * loading the station address in the initialisation block.	 */	memset(ea, 0, Eaddrlen);	if(!memcmp(ea, ether->ea, Eaddrlen)){		x = ctlr->ior(ctlr, Aprom);		ether->ea[0] = x;		ether->ea[1] = x>>8;		if(ctlr->ior == io16r)			x = ctlr->ior(ctlr, Aprom+2);		else			x >>= 16;		ether->ea[2] = x;		ether->ea[3] = x>>8;		x = ctlr->ior(ctlr, Aprom+4);		ether->ea[4] = x;		ether->ea[5] = x>>8;	}	/*	 * Start to fill in the initialisation block	 * (must be DWORD aligned).	 */	ctlr->iblock.rlen = Lognrdre<<4;	ctlr->iblock.tlen = Logntdre<<4;	memmove(ctlr->iblock.padr, ether->ea, sizeof(ctlr->iblock.padr));	ringinit(ctlr);	ctlr->iblock.rdra = PADDR(ctlr->rdr);	ctlr->iblock.tdra = PADDR(ctlr->tdr);	/*	 * Point the chip at the initialisation block and tell it to go.	 * Mask the Idon interrupt and poll for completion. Strt and interrupt	 * enables will be set later when attaching to the network.	 */	x = PADDR(&ctlr->iblock);	ctlr->iow(ctlr, Rap, 1);	ctlr->iow(ctlr, Rdp, x & 0xFFFF);	ctlr->iow(ctlr, Rap, 2);	ctlr->iow(ctlr, Rdp, (x>>16) & 0xFFFF);	ctlr->iow(ctlr, Rap, 3);	ctlr->iow(ctlr, Rdp, Idon);	ctlr->iow(ctlr, Rap, 0);	ctlr->iow(ctlr, Rdp, Init);	while(!(ctlr->ior(ctlr, Rdp) & Idon))		;	/*	 * We used to set CSR0 to Idon|Stop here, and then	 * in attach change it to Iena|Strt.  Apparently the simulated	 * 79C970 in VMware never enables after a write of Idon|Stop,	 * so we enable the device here now.	 */	ctlr->iow(ctlr, Rdp, Iena|Strt);	ctlr->init = 0;	iunlock(ctlr);	/*	 * Linkage to the generic ethernet driver.	 */	ether->attach = attach;	ether->transmit = transmit;	ether->interrupt = interrupt;	ether->detach = detach;	return 0;}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
天堂av在线一区| 自拍偷自拍亚洲精品播放| 福利91精品一区二区三区| 麻豆一区二区在线| 久久精品99国产精品| 美腿丝袜亚洲综合| 国产高清不卡一区二区| 国产成人一区二区精品非洲| 精品无码三级在线观看视频| 六月丁香综合在线视频| 国产精品一区二区久激情瑜伽| 国产麻豆成人精品| av成人免费在线| 色婷婷亚洲综合| 欧美日本一区二区在线观看| 91精品国产黑色紧身裤美女| 欧美成人欧美edvon| 国产欧美一区二区精品仙草咪| 久久这里只精品最新地址| 国产精品麻豆一区二区| 亚洲精选一二三| 日韩和欧美一区二区| 国产永久精品大片wwwapp| 成人福利视频网站| 色天使色偷偷av一区二区| 91精品中文字幕一区二区三区| 欧美一区二区日韩| 日本一区二区高清| 性做久久久久久免费观看欧美| 久久www免费人成看片高清| 国产91高潮流白浆在线麻豆| 99热这里都是精品| 欧美美女黄视频| 国产午夜精品久久久久久免费视| 中文字幕一区二区三区精华液| 最近日韩中文字幕| 另类小说欧美激情| 日本黄色一区二区| 国产精品乱子久久久久| 亚洲国产中文字幕| 粉嫩高潮美女一区二区三区| 欧美日韩专区在线| 国产日韩欧美不卡| 美女视频免费一区| 一本一道综合狠狠老| 26uuu精品一区二区在线观看| 亚洲黄色性网站| 国产不卡一区视频| 日韩精品一区二区三区在线 | 精品久久久久99| 一区二区三区欧美视频| 国产成人精品免费看| 8v天堂国产在线一区二区| 中文字幕日本乱码精品影院| 奇米四色…亚洲| 欧美私模裸体表演在线观看| 日本一区二区综合亚洲| 精品一区二区三区日韩| 在线播放中文一区| 亚洲国产精品人人做人人爽| www.欧美日韩| 中文字幕免费观看一区| 久久99精品国产麻豆婷婷| 欧美日韩aaaaa| 亚洲宅男天堂在线观看无病毒| youjizz国产精品| 国产精品嫩草影院av蜜臀| 青青国产91久久久久久| 欧美日韩成人在线| 午夜电影久久久| 欧美日韩高清影院| 性感美女极品91精品| 欧美性猛交xxxx乱大交退制版| 亚洲人成网站精品片在线观看| 成人av资源在线| 中文一区在线播放| 波多野结衣亚洲一区| 亚洲欧洲www| eeuss鲁一区二区三区| 中文字幕久久午夜不卡| 久久9热精品视频| 欧美成人一区二区三区在线观看| 天堂va蜜桃一区二区三区| 欧美一区三区四区| 青青草国产精品亚洲专区无| 日韩欧美视频一区| 国产一区二区三区香蕉| 亚洲国产成人一区二区三区| av一区二区久久| 亚洲午夜久久久久中文字幕久| 欧美丝袜丝交足nylons图片| 午夜精品久久久久久不卡8050| 欧美二区三区的天堂| 狠狠色丁香九九婷婷综合五月| 久久久久高清精品| 色婷婷一区二区三区四区| 日韩电影免费在线看| 久久噜噜亚洲综合| 91偷拍与自偷拍精品| 亚洲午夜精品一区二区三区他趣| 欧美优质美女网站| 免费高清在线一区| 国产精品久久久久久户外露出 | 日韩三级精品电影久久久 | 欧美日韩亚洲另类| 美腿丝袜一区二区三区| 中文字幕欧美激情一区| 91福利小视频| 久久精品久久精品| 亚洲免费资源在线播放| 91麻豆精品国产91久久久久久| 国产不卡在线视频| 婷婷久久综合九色国产成人| 国产日产精品一区| 欧美日韩成人综合在线一区二区| 国产麻豆精品一区二区| 亚洲大片一区二区三区| 亚洲国产高清不卡| 日韩欧美一级二级| 欧美日韩在线播放三区| 成人黄页在线观看| 免费在线观看精品| 亚洲动漫第一页| 国产精品美女久久久久久久久| 欧美一区二区三区小说| 一本在线高清不卡dvd| 国产不卡在线一区| 久久精品国产色蜜蜜麻豆| 亚洲制服丝袜av| 亚洲欧洲一区二区在线播放| 精品国内片67194| 欧美另类z0zxhd电影| 一本色道久久综合亚洲91| 国产一区二区三区| 久久99国产精品免费| 秋霞成人午夜伦在线观看| 亚洲va国产天堂va久久en| 亚洲人成亚洲人成在线观看图片| 中文字幕免费一区| 国产精品久久综合| 久久久久久久网| 欧美大片在线观看一区二区| 欧美视频在线不卡| av在线这里只有精品| 99久免费精品视频在线观看| 高清成人在线观看| 成人在线一区二区三区| 国产成人免费在线| 粉嫩一区二区三区在线看| 国产在线精品一区在线观看麻豆| 久久激情综合网| 国产在线不卡一卡二卡三卡四卡| 久久丁香综合五月国产三级网站 | 精品av综合导航| 精品成人a区在线观看| 久久这里只有精品首页| 国产欧美精品区一区二区三区 | 色视频欧美一区二区三区| 成人av资源站| 91国偷自产一区二区三区成为亚洲经典| 成a人片亚洲日本久久| 99免费精品视频| 欧美私人免费视频| 91精品综合久久久久久| xnxx国产精品| 国产精品久久久久影视| 成人免费在线观看入口| 亚洲精品日产精品乱码不卡| 亚洲大片精品永久免费| 久久99在线观看| av不卡在线观看| 欧美日韩一区二区三区视频| 欧美一二三四区在线| 久久―日本道色综合久久| 国产精品高潮久久久久无| 夜夜精品浪潮av一区二区三区| 亚洲不卡在线观看| 国内国产精品久久| av在线播放不卡| 欧美日韩精品系列| 久久久久久久久久美女| 亚洲欧美在线另类| 亚洲亚洲精品在线观看| 韩国欧美一区二区| 色老综合老女人久久久| 欧美日韩视频一区二区| 久久一区二区三区四区| 亚洲激情自拍偷拍| 久久国产福利国产秒拍| 91免费视频网| 精品国产亚洲在线| 亚洲精品高清在线| 狠狠v欧美v日韩v亚洲ⅴ| 在线观看www91| 国产精品视频观看| 久久国产尿小便嘘嘘尿| 欧美三级中文字幕| 国产精品传媒视频| 激情五月婷婷综合| 91麻豆精品国产自产在线|