~kris/9p

9hist

5d25f6bafd84edd38c148f42afb0e6ef292b9a7a — David du Colombier 31 years ago 09a09ef
Plan 9 from Bell Labs 1995-04-03
4 files changed, 52 insertions(+), 12 deletions(-)

M pc/ether509.c
M pc/scsi.c
M port/devsd.c
M port/portfns.h
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);