| plan 9 kernel history: overview | file list | diff list |
1994/1111/pc/devastar.c (diff list | history)
| 1994/1109/sys/src/9/pc/devastar.c:7,13 – 1994/1111/sys/src/9/pc/devastar.c:7,12 (short | long | prev | next) | ||
| 1994/1106 | #include "../port/error.h" #include "devtab.h" | |
| 1994/1107 | * Stargate's Avanstar serial board. There are ISA, EISA, microchannel | |
| 1994/1109/sys/src/9/pc/devastar.c:215,223 – 1994/1111/sys/src/9/pc/devastar.c:214,223 | ||
| 1994/1106 | { | |
| 1994/1107 | ISAConf; int id; /* from plan9.ini */ | |
| 1994/1111 | int nchan; /* number of channels */ Astarchan *c; /* channels */ | |
| 1994/1107 | int ramsize; /* 16k or 256k */ | |
| 1994/1106 | GCB *gbc; /* board comm area */ | |
| 1994/1109/sys/src/9/pc/devastar.c:227,253 – 1994/1111/sys/src/9/pc/devastar.c:227,315 | ||
| 1994/1106 | ||
| 1994/1109 | Astar *a; /* controller */ | |
| 1994/1107 | CCB *ccb; /* control block */ | |
| 1994/1111 | int perm; | |
| 1994/1107 | ||
| 1994/1106 | /* buffers */ Queue *iq; Queue *oq; | |
| 1994/1109 | Astar *astar[Maxcard]; | |
| 1994/1111 | static int nastar; | |
| 1994/1107 | ||
| 1994/1111 | enum { Qmem= 0, Qdata, Qctl, Qstat, }; #define TYPE(x) ((x)&0xff) #define BOARD(x) ((((x)&~CHDIR)>>16)&0xff) #define CHAN(x) ((((x)&~CHDIR)>>8)&0xff) #define QID(b,c,t) (((b)<<16)|((c)<<8)|(t)) | |
| 1994/1109 | static int astarsetup(Astar*); | |
| 1994/1107 | ||
| 1994/1111 | int devgen(Chan *c, Dirtab *tab, int ntab, int i, Dir *db) { int dev, sofar, ch, t; USED(tab, ntab); sofar = 0; for(dev = 0; dev < nstar; dev++){ if(sofar == i){ sprint(db->name, "atar%dmem", astar[dev].id); db->qid = QID(dev, 0, Qmem); db->mode = 0660; break; } if(i < sofar + 3*astar[dev].nchan){ i -= sofar; ch = i/3; t = i%3; switch(t){ case 0: sprint(db->name, "eia%d%2.2d", dev, ch); db->mode = astar[dev]->c[ch].perm; db->qid = QID(dev, 0, Qdata); break; case 1: sprint(db->name, "eia%d%2.2dctl", dev, ch); db->mode = astar[dev]->c[ch].perm; db->qid = QID(dev, 0, Qctl); break; case 2: sprint(db->name, "eia%d%2.2dstat", dev, ch); db->mode = 0444; db->qid = QID(dev, 0, Qstat); break; break; } sofar += 1 + 3*astar[dev].nchan; } if(j == nstar) return -1; db->atime = seconds(); db->mtime = kerndate; db->hlength = 0; db->length = length; memmove(db->uid, eve, NAMELEN); memmove(db->gid, eve, NAMELEN); db->type = devchar[c->type]; db->dev = c->dev; if(c->flag&CMSG) db->mode |= CHMOUNT; return 1; } | |
| 1994/1106 | void | |
| 1994/1107 | astarreset(void) | |
| 1994/1106 | { | |
| 1994/1109/sys/src/9/pc/devastar.c:283,314 – 1994/1111/sys/src/9/pc/devastar.c:345,352 | ||
| 1994/1107 | } | |
| 1994/1109 | nastar++; | |
| 1994/1107 | } | |
| 1994/1106 |
| |
| 1994/1107 | } | |
| 1994/1109 | /* isa ports an ax00i can appear at */ int isaport[] = { 0x200, 0x208, 0x300, 0x308, 0x600, 0x608, 0x700, 0x708, 0 }; | |
| 1994/1107 | ||
| 1994/1109/sys/src/9/pc/devastar.c:360,365 – 1994/1111/sys/src/9/pc/devastar.c:398,488 | ||
| 1994/1107 | } c = inb(a->port + ISActl1) & ~ISAirq; outb(a->port + ISActl1, c | isairqcode(a->irq)); | |
| 1994/1111 | return 0; } void astarinit(void) { } Chan* astarattach(char *spec) { return devattach('g', spec); } Chan* astarclone(Chan *c, Chan *nc) { return devclone(c, nc); } int astarwalk(Chan *c, char *name) { return devwalk(c, name, 0, 0, astargen); } void astarstat(Chan *c, char *dp) { devstat(c, dp, 0, 0, astargen); } Chan* astaropen(Chan *c, int omode) { Uart *p; c = devopen(c, omode, 0, 0, astargen); return c; } void astarcreate(Chan *c, char *name, int omode, ulong perm) { USED(c, name, omode, perm); error(Eperm); } void astarclose(Chan *c) { USED(c); } long astarread(Chan *c, void *buf, long n, ulong offset) { Astar *a; if(c->qid.path & CHDIR) return devdirread(c, buf, n, 0, 0, astargen); switch(TYPE(c->qid.path)){ case Qmem: a = astar[ return qread(p->iq, buf, n); } return 0; } long astarwrite(Chan *c, void *buf, long n, ulong offset) { Uart *p; if(c->qid.path & CHDIR) error(Eperm); switch(TYPE(c->qid.path)){ case Qmem: return qread(p->iq, buf, n); } | |
| 1994/1109 | return 0; | |
| 1994/1106 | } | |