| plan 9 kernel history: overview | file list | diff list |
1991/0112/port/devwren.c (diff list | history)
| 1991/0110/sys/src/9/port/devwren.c:9,31 – 1991/0112/sys/src/9/port/devwren.c:9,47 (short | long | prev | next) | ||
| 1991/0110 | #include "scsi.h" | |
| 1991/0112 | typedef struct Part Part; typedef struct Disk Disk; | |
| 1991/0110 | enum { | |
| 1991/0112 | Npart= 2, /* maximum partitions per disk */ Ndisk= 64, /* maximum disks */ | |
| 1991/0110 |
| |
| 1991/0112 | Qdir= 0, Qdata= 16, Qstruct= 32, Mask= 0x7, | |
| 1991/0110 | }; | |
| 1991/0112 | static Dirtab *wrendir; #define NWREN (2*(Npart+1)) | |
| 1991/0110 |
| |
| 1991/0112 | struct Part { ulong firstblock; ulong maxblock; }; struct Disk { ulong blocksize; Part p[Npart]; }; | |
| 1991/0110 |
| |
| 1991/0112 | static Disk wren[Ndisk]; | |
| 1991/0110 | ||
| 1991/0112 | static Scsi staticcmd; /* BUG */ static uchar datablk[2*4*512]; /* BUG */ | |
| 1991/0110 | /* * accepts [0-7].[0-7], or abbreviation */ | |
| 1991/0110/sys/src/9/port/devwren.c:50,55 – 1991/0112/sys/src/9/port/devwren.c:66,73 | ||
| 1991/0110 | if (p[3]!=0) goto cant; out: | |
| 1991/0112 | if(dev >= Ndisk) error(Ebadarg); | |
| 1991/0110 | return dev; cant: error(Ebadarg); | |
| 1991/0110/sys/src/9/port/devwren.c:59,71 – 1991/0112/sys/src/9/port/devwren.c:77,97 | ||
| 1991/0110 | wrengen(Chan *c, Dirtab *tab, long ntab, long s, Dir *dp) { long l; | |
| 1991/0112 | Part *p; Disk *d; if(s >= ntab) | |
| 1991/0110 | return -1; | |
| 1991/0112 | if(c->dev >= Ndisk) return -1; tab += s; d = &wren[c->dev]; p = &d->p[tab->qid.path&Mask]; if((tab->qid.path&~Mask) == Qdata) l = d->blocksize * (p->maxblock - p->firstblock); | |
| 1991/0110 | else | |
| 1991/0112 | l = 8; | |
| 1991/0110 | devdir(c, tab->qid, tab->name, l, tab->perm, dp); return 1; } | |
| 1991/0110/sys/src/9/port/devwren.c:72,79 – 1991/0112/sys/src/9/port/devwren.c:98,128 | ||
| 1991/0110 | void wrenreset(void) | |
| 1991/0112 | { Dirtab *p; int i; | |
| 1991/0110 | ||
| 1991/0112 | p = wrendir = ialloc((Npart+1) * 2 * sizeof(Dirtab), 0); for(i = 0; i < Npart; i++){ sprint(p->name, "data%d", i); p->qid.path = Qdata + i; p->perm = 0600; p++->length = 0; strcpy(p->name, "struct%d"); p->qid.path = Qstruct + i; p->perm = 0600; p++->length = 0; } strcpy(p->name, "data"); p->qid.path = Qdata + Npart; p->perm = 0600; p++->length = 0; strcpy(p->name, "struct"); p->qid.path = Qstruct + Npart; p->perm = 0600; p->length = 0; } | |
| 1991/0110 | void wreninit(void) { | |
| 1991/0110/sys/src/9/port/devwren.c:91,96 – 1991/0112/sys/src/9/port/devwren.c:140,149 | ||
| 1991/0110 | uchar buf[32]; int dev; Chan *c; | |
| 1991/0112 | Disk *d; ulong plen; int i; | |
| 1991/0110 | dev = wrendev(param); scsiready(dev); scsisense(dev, buf); | |
| 1991/0110/sys/src/9/port/devwren.c:97,104 – 1991/0112/sys/src/9/port/devwren.c:150,165 | ||
| 1991/0110 | scsicap(dev, buf); c = devattach('r', param); c->dev = dev; | |
| 1991/0112 | d = &wren[dev]; d->blocksize = BGLONG(&buf[4]); plen = BGLONG(&buf[0]); d->p[Npart].firstblock = 0; d->p[Npart].maxblock = plen; plen = plen/Npart; for(i = 0; i < Npart; i++){ d->p[i].firstblock = i*plen; d->p[i].maxblock = (i+1)*plen; } | |
| 1991/0110 | return c; } | |
| 1991/0110/sys/src/9/port/devwren.c:145,160 – 1991/0112/sys/src/9/port/devwren.c:206,228 | ||
| 1991/0110 | { Scsi *cmd = &staticcmd; unsigned long lbn; | |
| 1991/0112 | Part *p; Disk *d; | |
| 1991/0110 | if (n == 0) return 0; | |
| 1991/0112 | if(c->qid.path == CHDIR) | |
| 1991/0110 | return devdirread(c, a, n, wrendir, NWREN, wrengen); | |
| 1991/0112 | d = &wren[c->dev]; p = &(d->p[Mask&c->qid.path]); switch ((int)(c->qid.path & ~Mask)) { | |
| 1991/0110 | case Qdata: | |
| 1991/0112 | if (n % d->blocksize || c->offset % d->blocksize) | |
| 1991/0110 | error(Ebadarg); | |
| 1991/0112 | lbn = (c->offset/d->blocksize) + p->firstblock; if (lbn >= p->maxblock) | |
| 1991/0110 | error(Ebadarg); if (n > sizeof datablk) n = sizeof datablk; | |
| 1991/0110/sys/src/9/port/devwren.c:170,176 – 1991/0112/sys/src/9/port/devwren.c:238,244 | ||
| 1991/0110 | cmd->cmdblk[1] = lbn>>16; cmd->cmdblk[2] = lbn>>8; cmd->cmdblk[3] = lbn; | |
| 1991/0112 | cmd->cmdblk[4] = n/d->blocksize; | |
| 1991/0110 | cmd->cmdblk[5] = 0x00; cmd->cmd.lim = &cmd->cmdblk[6]; cmd->data.lim = cmd->data.base + n; | |
| 1991/0110/sys/src/9/port/devwren.c:187,194 – 1991/0112/sys/src/9/port/devwren.c:255,262 | ||
| 1991/0110 | if (c->offset >= 8) return 0; n = 8; | |
| 1991/0112 | PLONG((uchar *)&a[0], p->maxblock - p->firstblock); PLONG((uchar *)&a[4], d->blocksize); | |
| 1991/0110 | break; default: panic("wrenread"); | |
| 1991/0110/sys/src/9/port/devwren.c:201,214 – 1991/0112/sys/src/9/port/devwren.c:269,288 | ||
| 1991/0110 | { Scsi *cmd = &staticcmd; unsigned long lbn; | |
| 1991/0112 | Part *p; Disk *d; | |
| 1991/0110 | if (n == 0) return 0; | |
| 1991/0112 | d = &wren[c->dev]; p = &(d->p[Mask&c->qid.path]); switch ((int)(c->qid.path & ~Mask)) { | |
| 1991/0110 | case Qdata: | |
| 1991/0112 | if (n % d->blocksize || c->offset % d->blocksize) | |
| 1991/0110 | error(Ebadarg); | |
| 1991/0112 | lbn = c->offset/d->blocksize + p->firstblock; if (lbn >= p->maxblock) | |
| 1991/0110 | error(Ebadarg); if (n > sizeof datablk) n = sizeof datablk; | |
| 1991/0110/sys/src/9/port/devwren.c:224,230 – 1991/0112/sys/src/9/port/devwren.c:298,304 | ||
| 1991/0110 | cmd->cmdblk[1] = lbn>>16; cmd->cmdblk[2] = lbn>>8; cmd->cmdblk[3] = lbn; | |
| 1991/0112 | cmd->cmdblk[4] = n/d->blocksize; | |
| 1991/0110 | cmd->cmdblk[5] = 0x00; cmd->cmd.lim = &cmd->cmdblk[6]; cmd->data.lim = cmd->data.base + n; | |