M pc/ether509.c => pc/ether509.c +1 -1
@@ 581,7 581,7 @@ ether509reset(Ether *ether)
}
}
if(strcmp(ether->type, "3C589") == 0)
- port = ether->card.port;
+ port = ether->port;
if(port == 0)
port = tcm579(ether);
if(port == 0)
M pc/scsi.c => pc/scsi.c +13 -8
@@ 158,7 158,7 @@ scsiprobe(Ctlr *ctlr)
print("scsi%d: unit %d inquire failed, status %d\n", t->ctlrno, i, s);
continue;
}
- print("scsi%d: unit %d %s\n", t->ctlrno, i, t->inq+8);
+ print("scsi%d: unit %d:%2.2ux: %s\n", t->ctlrno, i, t->inq[0], t->inq+8);
t->ok = 1;
}
}
@@ 185,10 185,10 @@ inventory(void)
}
int
-scsiinv(int devno, int type, Target **rt, uchar **inq, char *id)
+scsiinv(int devno, int *type, Target **rt, uchar **inq, char *id)
{
Target *t;
- int ctlr, unit;
+ int ctlr, *i, unit;
inventory();
@@ 200,11 200,16 @@ scsiinv(int devno, int type, Target **rt, uchar **inq, char *id)
t = &scsi[ctlr]->target[unit];
devno++;
- if(t->ok && (t->inq[0]&0x1F) == type){
- *rt = t;
- *inq = t->inq;
- sprint(id, "scsi%d: unit %d", ctlr, unit);
- return devno;
+ if(t->ok){
+ for(i = type; *i >= 0; i++){
+ if((t->inq[0]&0x1F) != *i)
+ continue;
+ *rt = t;
+ *inq = t->inq;
+ sprint(id, "scsi%d: unit %d", ctlr, unit);
+print("devno %d = %s\n", devno, id);
+ return devno;
+ }
}
}
return -1;
M port/devsd.c => port/devsd.c +37 -2
@@ 9,6 9,13 @@
#include "../port/error.h"
#include "devtab.h"
+enum {
+ TypeDA = 0x00, /* Direct Access */
+ TypeWO = 0x04, /* Worm */
+ TypeCD = 0x05, /* CD-ROM */
+ TypeMO = 0x07, /* rewriteable Magneto-Optical */
+};
+
enum
{
LogNpart = 4,
@@ 51,6 58,11 @@ Disk disk[Ndisk];
static void sdrdpart(Disk*);
static long sdio(Chan*, int, char*, ulong, ulong);
+static int types[] = {
+ TypeDA, TypeWO, TypeCD, TypeMO,
+ -1,
+};
+
static int
sdgen(Chan *c, Dirtab*, long, long s, Dir *dirp)
{
@@ 93,7 105,7 @@ sdinit(void)
dev = 0;
for(;;) {
d = &disk[ndisk];
- dev = scsiinv(dev, 0, &d->t, &d->inquire, d->id);
+ dev = scsiinv(dev, types, &d->t, &d->inquire, d->id);
if(dev < 0)
break;
@@ 140,7 152,21 @@ sdinit(void)
d->size = s;
d->bsize = b;
- sprint(d->vol, "sd%d", ndisk);
+ switch(d->inquire[0] & 0x1F){
+
+ case TypeDA:
+ case TypeWO:
+ case TypeMO:
+ sprint(d->vol, "sd%d", ndisk);
+ break;
+
+ case TypeCD:
+ sprint(d->vol, "cd%d", ndisk);
+ break;
+
+ default:
+ continue;
+ }
if(++ndisk >= Ndisk)
break;
@@ 278,6 304,12 @@ sdrdpart(Disk *d)
p++;
d->npart = 2;
+ if((d->inquire[0] & 0x1F) == TypeCD){
+ scsifree(b);
+ qunlock(d);
+ return;
+ }
+
scsibio(d->t, d->lun, SCSIread, b, 1, d->bsize, d->table[0].end-1);
b[d->bsize-1] = '\0';
@@ 320,6 352,9 @@ sdio(Chan *c, int write, char *a, ulong len, ulong offset)
d = &disk[DRIVE(c->qid)];
p = &d->table[PART(c->qid)];
+ if(write && (d->inquire[0] & 0x1F) == TypeCD)
+ error(Eperm);
+
block = (offset / d->bsize) + p->beg;
n = (offset + len + d->bsize - 1) / d->bsize + p->beg - block;
max = SCSImaxxfer / d->bsize;
M port/portfns.h => port/portfns.h +1 -1
@@ 240,7 240,7 @@ int scsicap(Target*, char, ulong*, ulong*);
int scsiexec(Target*, int, uchar*, int, void*, int*);
#define scsifree(p) free(p)
int scsiinquiry(Target*, char, void*, int*);
-int scsiinv(int, int, Target**, uchar**, char*);
+int scsiinv(int, int*, Target**, uchar**, char*);
int scsireqsense(Target*, char, int);
int scsistart(Target*, char, int);
Target* scsiunit(int, int);