~kris/9p

9hist

53f6982eab3059cf494f8bd2f16f7ae87cf2dee9 — David du Colombier 25 years ago e282cfa
Plan 9 from Bell Labs 2001-07-12
6 files changed, 44 insertions(+), 64 deletions(-)

M bitsy/fns.h
M pc/ether79c970.c
M pc/fns.h
M pc/memory.c
M port/devdup.c
M port/lib.h
M bitsy/fns.h => bitsy/fns.h +2 -0
@@ 28,7 28,9 @@ char*	getconf(char*);
ulong	getcpuid(void);
ulong	getfar(void);
ulong	getfsr(void);
void*	getlink(void);
#define	getpgcolor(a)	0
void*	getsp(void);
void	gpiointrenable(ulong, int, void (*)(Ureg*, void*), void*, char*);
void	h3650uartsetup(void);
void	icacheinvalidate(void);

M pc/ether79c970.c => pc/ether79c970.c +31 -56
@@ 107,9 107,13 @@ enum {					/* md2 */
	TxBuff		= 0x80000000,	/* buffer error */
};

typedef struct Ctlr Ctlr;
typedef struct Ctlr {
	Lock;
	int	port;
	Pcidev*	pcidev;
	Ctlr*	next;
	int	active;

	int	init;			/* initialisation in progress */
	Iblock	iblock;


@@ 138,6 142,9 @@ typedef struct Ctlr {
	ulong	babl;
} Ctlr;

static Ctlr* ctlrhead;
static Ctlr* ctlrtail;

#define csr32r(c, r)	(inl((c)->port+(r)))
#define csr32w(c, r, l)	(outl((c)->port+(r), (ulong)(l)))



@@ 419,38 426,12 @@ intrloop:
	goto intrloop;
}

typedef struct Adapter {
	int	port;
	int	irq;
	int	tbdf;
} Adapter;
static Block* adapter;

static int
amd79c970adapter(Block** bpp, int port, int irq, int tbdf)
{
	Block *bp;
	Adapter *ap;

	bp = allocb(sizeof(Adapter));
	if(bp == nil)
		return -1;
	ap = (Adapter*)bp->rp;
	ap->port = port;
	ap->irq = irq;
	ap->tbdf = tbdf;

	bp->next = *bpp;
	*bpp = bp;

	return 0;
}

static void
amd79c970pci(void)
{
	Pcidev *p;
	int port;
	Ctlr *ctlr;
	Pcidev *p;

	p = nil;
	while(p = pcimatch(p, 0x1022, 0x2000)){


@@ 459,58 440,53 @@ amd79c970pci(void)
			print("amd79c970: port 0x%uX in use\n", port);
			continue;
		}
		if(amd79c970adapter(&adapter, port, p->intl, p->tbdf)){
			iofree(port);
			continue;
		}
		pcisetbme(p);
		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;
	}
}

static int
reset(Ether* ether)
{
	int port, x;
	Block *bp, **bpp;
	Adapter *ap;
	int x;
	uchar ea[Eaddrlen];
	Ctlr *ctlr;
	static int scandone;

	if(scandone == 0){
	if(ctlrhead == nil)
		amd79c970pci();
		scandone = 1;
	}

	/*
	 * Any adapter matches if no port is supplied,
	 * otherwise the ports must match.
	 */
	port = 0;
	bpp = &adapter;
	for(bp = *bpp; bp; bp = bp->next){
		ap = (Adapter*)bp->rp;
		if(ether->port == 0 || ether->port == ap->port){
			port = ap->port;
			ether->irq = ap->irq;
			ether->tbdf = ap->tbdf;
			*bpp = bp->next;
			freeb(bp);
	for(ctlr = ctlrhead; ctlr != nil; ctlr = ctlr->next){
		if(ctlr->active)
			continue;
		if(ether->port == 0 || ether->port == ctlr->port){
			ctlr->active = 1;
			break;
		}
		bpp = &bp->next;
	}
	if(port == 0)
	if(ctlr == nil)
		return -1;

	/*
	 * Allocate a controller structure and start to initialise it.
	 */
	ether->ctlr = malloc(sizeof(Ctlr));
	ctlr = ether->ctlr;
	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;
	ctlr->port = port;

	/*
	 * How to tell what mode the chip is in at this point - if it's in WORD


@@ 592,7 568,6 @@ reset(Ether* ether)
	/*
	 * Linkage to the generic ethernet driver.
	 */
	ether->port = port;
	ether->attach = attach;
	ether->transmit = transmit;
	ether->interrupt = interrupt;

M pc/fns.h => pc/fns.h +2 -0
@@ 38,9 38,11 @@ ulong	getcr3(void);
ulong	getcr4(void);
char*	getconf(char*);
int	havecycintr(void);
void	halt(void);
int	i8042auxcmd(int);
void	i8042auxenable(void (*)(int, int));
void	i8042reset(void);
void	i8250console(void);
void	i8253init(int, int);
void	i8253enable(void);
uvlong	i8253read(uvlong*);

M pc/memory.c => pc/memory.c +8 -5
@@ 225,11 225,14 @@ umbscan(void)
	 */
	p = KADDR(0xC0000);
	while(p < (uchar*)KADDR(0xE0000)){
		if (p[0] == 0x55 && p[1] == 0xAA) {
			/* Skip p[2] chunks of 512 bytes.  Test for 0x55 AA before
			     poking obtrusively, or else the Thinkpad X20 dies when
			     setting up the cardbus (PB) */
			p += p[2] * 512;
		/*
		 * Test for 0x55 0xAA before poking obtrusively,
		 * some machines (e.g. Thinkpad X20) seem to map
		 * something dynamic here (cardbus?) causing weird
		 * problems if it is changed.
		 */
		if(p[0] == 0x55 && p[1] == 0xAA){
			p += p[2]*512;
			continue;
		}


M port/devdup.c => port/devdup.c +1 -1
@@ 118,7 118,7 @@ dupread(Chan *c, void *va, long n, vlong offset)
}

static long
dupwrite(Chan *c, void *va, long n, vlong)
dupwrite(Chan *c, void*, long, vlong)
{
	if(c->qid.path & 1){
		print("do ctl write\n");

M port/lib.h => port/lib.h +0 -2
@@ 74,8 74,6 @@ extern	int	print(char*, ...);
 */
extern	char*	cleanname(char*);
extern	ulong	getcallerpc(void*);
extern	void*	getsp(void);
extern	void*	getlink(void);

extern	long	strtol(char*, char**, int);
extern	ulong	strtoul(char*, char**, int);