/n/sources/plan9/sys/src/fs/dev/juke.c:61,66 - /sys/src/fs/dev/juke.c:61,76 Sstart, /* loaded and spinning */ }; + enum + { + /* element types */ + Eauto = 0, + Etransport = 1, + Estorage = 2, + Eimport =3, + Etransfer = 4, + }; + extern int FIXEDSIZE; static int wormsense(Device*); /n/sources/plan9/sys/src/fs/dev/juke.c:69,75 - /sys/src/fs/dev/juke.c:79,85 static int mmove(Juke*, int, int, int, int); static int bestdrive(Juke*, int); static void waitready(Device*); - static void element(Juke*, int); + static void element(Juke*, int, int); /* * mounts and spins up the device /n/sources/plan9/sys/src/fs/dev/juke.c:276,294 - /sys/src/fs/dev/juke.c:286,302 long size; w = d->private; - if(w->fixedsize) { + if(w->fixedsize) size = w->fixedsize; - goto out; + else { + v = wormunit(d); + if(v == 0) + return 0; + size = v->max; + qunlock(v); + if(FIXEDSIZE) // TODO? push FIXEDSIZE into Device or Juke struct + w->fixedsize = size; } - - v = wormunit(d); - if(v == 0) - return 0; - size = v->max; - qunlock(v); - if(FIXEDSIZE) // TODO? push FIXEDSIZE into Device or Juke struct - w->fixedsize = size; - out: if(d->type == Devlworm) return size-1; return size; /n/sources/plan9/sys/src/fs/dev/juke.c:511,518 - /sys/src/fs/dev/juke.c:519,527 { Side *v; Juke *w; - long l, m; + long l; int s; + long m; uchar cmd[10]; w = d->private; /n/sources/plan9/sys/src/fs/dev/juke.c:600,610 - /sys/src/fs/dev/juke.c:609,619 if(recur == 0) { recur = 1; print("element from=%d\n", from); - element(w, from); + element(w, from, Eauto); print("element to=%d\n", to); - element(w, to); + element(w, to, Eauto); print("element trans=%d\n", trans); - element(w, trans); + element(w, trans, Etransport); recur = 0; } return 1; /n/sources/plan9/sys/src/fs/dev/juke.c:638,643 - /sys/src/fs/dev/juke.c:647,655 w->dt0 = (buf[4+14]<<8) | buf[4+15]; w->ndt = (buf[4+16]<<8) | buf[4+17]; + #ifdef OLD_REVERSE + w->rot = 1; + #else memset(cmd, 0, 6); memset(buf, 0, sizeof(buf)); cmd[0] = 0x1a; /* mode sense */ /n/sources/plan9/sys/src/fs/dev/juke.c:647,654 - /sys/src/fs/dev/juke.c:659,666 s = scsiio(w->juke, SCSIread, cmd, sizeof(cmd), buf, sizeof(buf)); if(s) panic("geometry #%x\n", s); - w->rot = buf[4+2] & 1; + #endif print(" mt %d %d\n", w->mt0, w->nmt); print(" se %d %d\n", w->se0, w->nse); /n/sources/plan9/sys/src/fs/dev/juke.c:661,675 - /sys/src/fs/dev/juke.c:673,687 static void - element(Juke *w, int e) + element(Juke *w, int e, int type) { uchar cmd[12], buf[8+8+88]; int s, t; - //loop: memset(cmd, 0, sizeof(cmd)); memset(buf, 0, sizeof(buf)); cmd[0] = 0xb8; /* read element status */ + cmd[1] = type & 0xf; /* type */ cmd[2] = e>>8; /* starting element */ cmd[3] = e; cmd[5] = 1; /* number of elements */ /n/sources/plan9/sys/src/fs/dev/juke.c:683,689 - /sys/src/fs/dev/juke.c:695,701 s = (buf[0]<<8) | buf[1]; if(s != e) { - print("element = %d\n", s); + print("element = %d, != %d\n", s, e); goto bad; } if(buf[3] != 1) { /n/sources/plan9/sys/src/fs/dev/juke.c:690,706 - /sys/src/fs/dev/juke.c:702,719 print("number reported = %d\n", buf[3]); goto bad; } + s = (buf[8+8+0]<<8) | buf[8+8+1]; if(s != e) { print("element1 = %d\n", s); goto bad; - } + } switch(buf[8+0]) { /* element type */ default: print("unknown element %d: %d\n", e, buf[8+0]); goto bad; - case 1: /* transport */ + case Etransport: /* transport */ s = e - w->mt0; if(s < 0 || s >= w->nmt) goto bad; /n/sources/plan9/sys/src/fs/dev/juke.c:709,715 - /sys/src/fs/dev/juke.c:722,728 (buf[8+8+10]<<8) | buf[8+8+11], (buf[8+8+9]>>6) & 1); break; - case 2: /* storage */ + case Estorage: /* storage */ s = e - w->se0; if(s < 0 || s >= w->nse) goto bad; /n/sources/plan9/sys/src/fs/dev/juke.c:718,725 - /sys/src/fs/dev/juke.c:731,745 w->side[s].status = Sunload; if(w->rot) w->side[w->nse+s].status = w->side[s].status; + + if (w->side[s].status == Sunload) { + print("media %d full\n", s); + } else { + print("media %d empty\n", s); + } + break; - case 3: /* import/export */ + case Eimport: /* import/export */ s = e - w->ie0; if(s < 0 || s >= w->nie) goto bad; /n/sources/plan9/sys/src/fs/dev/juke.c:728,734 - /sys/src/fs/dev/juke.c:748,754 (buf[8+8+10]<<8) | buf[8+8+11], (buf[8+8+9]>>6) & 1); break; - case 4: /* data transfer */ + case Etransfer: /* data transfer */ s = e - w->dt0; if(s < 0 || s >= w->ndt) goto bad; /n/sources/plan9/sys/src/fs/dev/juke.c:770,779 - /sys/src/fs/dev/juke.c:790,797 break; } return; - bad: - // panic("element"); - return; + panic("element"); } static /n/sources/plan9/sys/src/fs/dev/juke.c:784,796 - /sys/src/fs/dev/juke.c:802,814 /* mark empty shelves */ for(i=0; inse; i++) - element(w, w->se0+i); + element(w, w->se0+i, Estorage); for(i=0; inmt; i++) - element(w, w->mt0+i); + element(w, w->mt0+i, Etransport); for(i=0; inie; i++) - element(w, w->ie0+i); + element(w, w->ie0+i, Eimport); for(i=0; indt; i++) - element(w, w->dt0+i); + element(w, w->dt0+i, Etransfer); f = 0; for(i=0; inse; i++) { /n/sources/plan9/sys/src/fs/dev/juke.c:820,826 - /sys/src/fs/dev/juke.c:838,844 switch(d->type) { default: print("juke platter not (devmcat of) dev(l)worm: %Z\n", d); - goto bad; + panic("jinit: type"); case Devmcat: /* /n/sources/plan9/sys/src/fs/dev/juke.c:842,856 - /sys/src/fs/dev/juke.c:860,870 if(d->private) { print("juke platter private pointer set %p\n", d->private); - goto bad; + panic("jinit: private"); } d->private = w; break; } - return; - - bad: - panic("jinit"); } Side* /n/sources/plan9/sys/src/fs/dev/juke.c:1130,1136 - /sys/src/fs/dev/juke.c:1144,1150 int dowcp(void) { - return 0; + return 0; } /* /n/sources/plan9/sys/src/fs/dev/juke.c:1143,1149 - /sys/src/fs/dev/juke.c:1157,1162 long t; Side *v; Juke *w; - t = toytime() - TWORM; for(w=jukelist; w; w=w->link) {