| 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,31 – 1991/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 |
| |
| 1991/0403 | #define ENABCKSUM 0 | |
| 1991/0303 | ||
| 1990/1013 | typedef struct Hotrod Hotrod; | |
| 1991/0402/sys/src/9/power/devhotrod.c:44,50 – 1991/0403/sys/src/9/power/devhotrod.c:44,50 | ||
| 1991/0307 | #define NHOTRODDIR (sizeof hotroddir/sizeof(Dirtab)) | |
| 1991/0209 | struct Hotrod{ | |
| 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,80 – 1991/0403/sys/src/9/power/devhotrod.c:63,89 | ||
| 1991/0209 | /* * Commands */ | |
| 1991/0403 | Hotmsg** | |
| 1991/0209 | hotsend(Hotrod *h, Hotmsg *m) | |
| 1990/1013 | { | |
| 1991/0304 | Hotmsg **mp; | |
| 1991/0220 |
| |
| 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,88 – 1991/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,158 – 1991/0403/sys/src/9/power/devhotrod.c:162,168 | ||
| 1990/1013 | hotrodopen(Chan *c, int omode) { | |
| 1990/1106 | Hotrod *hp; | |
| 1991/0212 |
| |
| 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,182 – 1991/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 |
| |
| 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,194 – 1991/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 |
| |
| 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,208 – 1991/0403/sys/src/9/power/devhotrod.c:214,221 | ||
| 1991/0328 | */ mp = &u->khot; mp->cmd = Ubus; | |
| 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,231 – 1991/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 |
| |
| 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,266 – 1991/0403/sys/src/9/power/devhotrod.c:275,281 | ||
| 1990/1013 | hotrodread(Chan *c, void *buf, long n) { Hotrod *hp; | |
| 1991/0212 |
| |
| 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,284 – 1991/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 |
| |
| 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,299 – 1991/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 |
| |
| 1991/0307 | mp->cmd = Uread; | |
| 1991/0212 | mp->param[0] = MP2VME(buf); mp->param[1] = n; | |
| 1991/0306 | mp->abort = isflush; mp->intr = 0; | |
| 1991/0212 |
| |
| 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,306 – 1991/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,320 – 1991/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,328 – 1991/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,351 – 1991/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); | |
| 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; | |
| 1991/0212 |
| |
| 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,366 – 1991/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 |
| |
| 1991/0303 | error(Eio); } | |
| 1991/0318 | memmove(buf, hp->buf, m); | |
| 1991/0402/sys/src/9/power/devhotrod.c:378,384 – 1991/0403/sys/src/9/power/devhotrod.c:392,398 | ||
| 1990/1013 | hotrodwrite(Chan *c, void *buf, long n) { Hotrod *hp; | |
| 1991/0212 |
| |
| 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,425 – 1991/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 |
| |
| 1991/0403 | mp->wlen = n; | |
| 1991/0306 | if(mp->abort) /* use reserved flush msg */ mp = &((User*)(u->p->upage->pa|KZERO))->fhot; | |
| 1991/0212 |
| |
| 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 |
| |
| 1991/0212 |
| |
| 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 |
| |
| 1991/0403 | mp->wlen = n; | |
| 1991/0212 | qlock(&hp->buflock); | |
| 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 |
| |
| 1991/0212 |
| |
| 1991/0403 | hmp = hotsend(hp, mp); hotwait(hmp); | |
| 1991/0212 | qunlock(&hp->buflock); } return n; | |