plan 9 kernel history: overview | file list | diff list

1991/0403/power/devhotrod.c (diff list | history)

1991/0402/sys/src/9/power/devhotrod.c:25,311991/0403/sys/src/9/power/devhotrod.c:25,31 (short | long | prev | next)
1991/0303    
/* 
1991/0307    
 * If 1, ENABCKSUM causes data transfers to have checksums 
1991/0303    
 */ 
1991/0402    
#define	ENABCKSUM	1 
1991/0403    
#define	ENABCKSUM	0 
1991/0303    
 
1990/1013    
typedef struct Hotrod	Hotrod; 
 
1991/0402/sys/src/9/power/devhotrod.c:44,501991/0403/sys/src/9/power/devhotrod.c:44,50
1991/0307    
#define	NHOTRODDIR	(sizeof hotroddir/sizeof(Dirtab)) 
 
1991/0209    
struct Hotrod{ 
	QLock; 
1991/0403    
	Lock; 
1991/0212    
	QLock		buflock; 
1991/0209    
	Lock		busy; 
1991/0215    
	Hot		*addr;		/* address of the device */ 
1991/0402/sys/src/9/power/devhotrod.c:63,801991/0403/sys/src/9/power/devhotrod.c:63,89
1991/0209    
/* 
 * Commands 
 */ 
void 
1991/0403    
 
Hotmsg** 
1991/0209    
hotsend(Hotrod *h, Hotmsg *m) 
1990/1013    
{ 
1991/0304    
	Hotmsg **mp; 
	long l; 
 
1991/0220    
/* print("hotsend send %d %d %lux %lux\n", h->wi, m->cmd, m, m->param[0]); /**/ 
1991/0403    
	lock(h); 
1991/0401    
	mp = (Hotmsg**)&h->addr->reqstq[h->wi]; 
1991/0304    
	*mp = (Hotmsg*)MP2VME(m); 
1991/0209    
	h->wi++; 
1991/0306    
	if(h->wi >= NRQ) 
1991/0209    
		h->wi = 0; 
1991/0403    
	unlock(h); 
	return mp; 
} 
 
void 
hotwait(Hotmsg **mp) 
{ 
	ulong l; 
 
1991/0304    
	l = 0; 
	while(*mp){ 
		delay(0);	/* just a subroutine call; stay off VME */ 
1991/0402/sys/src/9/power/devhotrod.c:83,881991/0403/sys/src/9/power/devhotrod.c:92,98
1991/0304    
			print("hotsend blocked\n"); 
		} 
	} 
1991/0403    
	return; 
1990/1013    
} 
 
/* 
1991/0402/sys/src/9/power/devhotrod.c:152,1581991/0403/sys/src/9/power/devhotrod.c:162,168
1990/1013    
hotrodopen(Chan *c, int omode) 
{ 
1990/1106    
	Hotrod *hp; 
1991/0212    
	Hotmsg *mp; 
1991/0403    
	Hotmsg *mp, **hmp; 
1990/1106    
 
1990/11211    
	if(c->qid.path == CHDIR){ 
1990/1013    
		if(omode != OREAD) 
1991/0402/sys/src/9/power/devhotrod.c:176,1821991/0403/sys/src/9/power/devhotrod.c:186,193
1991/0209    
		hp->ri = 0; 
1991/0212    
		mp = &u->khot; 
1991/0307    
		mp->cmd = Ureset; 
1991/0209    
		hotsend(hp, &((User*)(u->p->upage->pa|KZERO))->khot); 
1991/0403    
		hmp = hotsend(hp, &((User*)(u->p->upage->pa|KZERO))->khot); 
		hotwait(hmp); 
1991/0215    
		delay(100); 
1991/0214    
		print("reset\n"); 
1991/0219    
 
1991/0402/sys/src/9/power/devhotrod.c:188,1941991/0403/sys/src/9/power/devhotrod.c:199,206
1991/0307    
		mp->cmd = Utest; 
1991/0227    
		mp->param[0] = MP2VME(testbuf); 
		mp->param[1] = NTESTBUF; 
1991/0219    
		hotsend(hp, &((User*)(u->p->upage->pa|KZERO))->khot); 
1991/0403    
		hmp = hotsend(hp, &((User*)(u->p->upage->pa|KZERO))->khot); 
		hotwait(hmp); 
1991/0219    
		delay(100); 
1991/0303    
		print("testing addr %lux size %ld\n", mp->param[0], mp->param[1]); 
		for(;;){ 
1991/0402/sys/src/9/power/devhotrod.c:202,2081991/0403/sys/src/9/power/devhotrod.c:214,221
1991/0328    
		 */ 
		mp = &u->khot; 
		mp->cmd = Ubus; 
		hotsend(hp, &((User*)(u->p->upage->pa|KZERO))->khot); 
1991/0403    
		hmp = hotsend(hp, &((User*)(u->p->upage->pa|KZERO))->khot, 0); 
		hotwait(hmp); 
1991/0302    
#endif 
1990/1018    
	} 
1990/1013    
	c->mode = openmode(omode); 
1991/0402/sys/src/9/power/devhotrod.c:221,2311991/0403/sys/src/9/power/devhotrod.c:234,246
1990/1013    
hotrodclose(Chan *c) 
{ 
1991/0209    
	Hotrod *hp; 
1991/0403    
	Hotmsg **hmp; 
1991/0209    
 
	hp = &hotrod[c->dev]; 
	if(c->qid.path != CHDIR){ 
1991/0307    
		u->khot.cmd = Ureboot; 
1991/0209    
		hotsend(hp, &((User*)(u->p->upage->pa|KZERO))->khot); 
1991/0403    
		hmp = hotsend(hp, &((User*)(u->p->upage->pa|KZERO))->khot); 
		hotwait(hmp); 
1991/0209    
		unlock(&hp->busy); 
	} 
1990/1013    
} 
1991/0402/sys/src/9/power/devhotrod.c:260,2661991/0403/sys/src/9/power/devhotrod.c:275,281
1990/1013    
hotrodread(Chan *c, void *buf, long n) 
{ 
	Hotrod *hp; 
1991/0212    
	Hotmsg *mp; 
1991/0403    
	Hotmsg *mp, **hmp; 
1991/0306    
	ulong l, m, isflush; 
1990/1013    
 
	hp = &hotrod[c->dev]; 
1991/0402/sys/src/9/power/devhotrod.c:278,2841991/0403/sys/src/9/power/devhotrod.c:293,298
1991/0212    
			 *  use supplied buffer, no need to lock for reply 
			 */ 
1991/0306    
			isflush = 0; 
1991/0402    
memset(buf, 0, n); 
1991/0306    
			mp = &((User*)(u->p->upage->pa|KZERO))->khot; 
			if(mp->abort){	/* use reserved flush msg */ 
				mp = &((User*)(u->p->upage->pa|KZERO))->fhot; 
1991/0402/sys/src/9/power/devhotrod.c:286,2991991/0403/sys/src/9/power/devhotrod.c:300,311
1991/0306    
			} 
1991/0307    
			mp->param[2] = 0;	/* reply checksum */ 
1991/0303    
			mp->param[3] = 0;	/* reply count */ 
1991/0212    
			qlock(hp); 
1991/0307    
			mp->cmd = Uread; 
1991/0212    
			mp->param[0] = MP2VME(buf); 
			mp->param[1] = n; 
1991/0306    
			mp->abort = isflush; 
			mp->intr = 0; 
			hotsend(hp, mp); 
1991/0212    
			qunlock(hp); 
1991/0403    
			hmp = hotsend(hp, mp); 
1991/0306    
			if(isflush){		/* busy loop */ 
				l = 100*1000*1000; 
				do 
1991/0402/sys/src/9/power/devhotrod.c:301,3061991/0403/sys/src/9/power/devhotrod.c:313,320
1991/0306    
				while(m==0 && --l>0); 
			}else{ 
				if(waserror()){ 
1991/0403    
					if(*hmp && *hmp==mp) 
						hotwait(hmp); 
1991/0306    
					mp->abort = 1; 
					nexterror(); 
				} 
1991/0402/sys/src/9/power/devhotrod.c:315,3201991/0403/sys/src/9/power/devhotrod.c:329,335
1991/0307    
				hp->addr->error++; 
1991/0303    
				print("hotrod cksum err is %lux sb %lux\n", 
1991/0402    
					hotsum(buf, m, 1), mp->param[2]); 
1991/0403    
/* 
1991/0402    
				print("addr %lux\n", ((char*)buf)+m); 
				{ 
					int i; 
1991/0402/sys/src/9/power/devhotrod.c:323,3281991/0403/sys/src/9/power/devhotrod.c:338,344
1991/0402    
						if(p[i] != i-2) 
							print("%d sb %d %lux %lux\n", p[i], i-2, p[i], &p[i]); 
				} 
1991/0403    
*/ 
1991/0303    
				error(Eio); 
			} 
1991/0402    
			mp->abort = 0; 
1991/0402/sys/src/9/power/devhotrod.c:338,3511991/0403/sys/src/9/power/devhotrod.c:354,366
1991/0307    
			mp->param[2] = 0;	/* reply checksum */ 
1991/0303    
			mp->param[3] = 0;	/* reply count */ 
1991/0212    
			qlock(&hp->buflock); 
			qlock(hp); 
1991/0307    
			mp->cmd = Uread; 
1991/0212    
			mp->param[0] = MP2VME(hp->buf); 
			mp->param[1] = n; 
1991/0306    
			mp->abort = 1; 
			mp->intr = 0; 
			hotsend(hp, mp); 
1991/0212    
			qunlock(hp); 
1991/0403    
			hmp = hotsend(hp, mp); 
			hotwait(hmp); 
1991/0215    
			l = 100*1000*1000; 
1991/0212    
			do 
1991/0303    
				m = mp->param[3]; 
1991/0402/sys/src/9/power/devhotrod.c:360,3661991/0403/sys/src/9/power/devhotrod.c:375,380
1991/0303    
				print("hotrod cksum err is %lux sb %lux\n", 
1991/0402    
					hotsum((ulong*)hp->buf, m, 1), mp->param[2]); 
1991/0303    
				qunlock(&hp->buflock); 
1991/0307    
{int i; for(i=0; i<8; i++) print("%lux\n", ((ulong*)buf)[i]); } 
1991/0303    
				error(Eio); 
			} 
1991/0318    
			memmove(buf, hp->buf, m); 
1991/0402/sys/src/9/power/devhotrod.c:378,3841991/0403/sys/src/9/power/devhotrod.c:392,398
1990/1013    
hotrodwrite(Chan *c, void *buf, long n) 
{ 
	Hotrod *hp; 
1991/0212    
	Hotmsg *mp; 
1991/0403    
	Hotmsg *mp, **hmp; 
1990/1013    
 
	hp = &hotrod[c->dev]; 
1991/0307    
	switch(c->qid.path & ~CHDIR){ 
1991/0402/sys/src/9/power/devhotrod.c:395,4251991/0403/sys/src/9/power/devhotrod.c:409,437
1991/0306    
			 * use supplied buffer, no need to lock for reply 
1991/0212    
			 */ 
1991/0306    
			mp = &((User*)(u->p->upage->pa|KZERO))->khot; 
1991/0402    
			mp->wtype = ((char*)buf)[0]; 
1991/0403    
			mp->wlen = n; 
1991/0306    
			if(mp->abort)	/* use reserved flush msg */ 
				mp = &((User*)(u->p->upage->pa|KZERO))->fhot; 
1991/0212    
			qlock(hp); 
1991/0307    
			mp->cmd = Uwrite; 
1991/0212    
			mp->param[0] = MP2VME(buf); 
			mp->param[1] = n; 
1991/0303    
			mp->param[2] = hotsum(buf, n, ENABCKSUM); 
1991/0306    
			hotsend(hp, mp); 
1991/0212    
			qunlock(hp); 
1991/0403    
			hmp = hotsend(hp, mp); 
			hotwait(hmp); 
1991/0212    
		}else{ 
			/* 
1991/0306    
			 * use hotrod buffer.  lock the buffer until the reply 
1991/0212    
			 */ 
1991/0306    
			mp = &((User*)(u->p->upage->pa|KZERO))->uhot; 
1991/0402    
			mp->wtype = ((char*)buf)[0]; 
1991/0403    
			mp->wlen = n; 
1991/0212    
			qlock(&hp->buflock); 
			qlock(hp); 
1991/0318    
			memmove(hp->buf, buf, n); 
1991/0307    
			mp->cmd = Uwrite; 
1991/0212    
			mp->param[0] = MP2VME(hp->buf); 
			mp->param[1] = n; 
1991/0303    
			mp->param[2] = hotsum((ulong*)hp->buf, n, ENABCKSUM); 
1991/0306    
			hotsend(hp, mp); 
1991/0212    
			qunlock(hp); 
1991/0403    
			hmp = hotsend(hp, mp); 
			hotwait(hmp); 
1991/0212    
			qunlock(&hp->buflock); 
		} 
		return n; 


source code copyright © 1990-2005 Lucent Technologies; see license
Plan 9 distribution
comments to russ cox (rsc@swtch.com)