Plan 9 from Bell Labs’s /usr/web/sources/extra/9hist/port/devwren.c

Copyright © 2021 Plan 9 Foundation.
Distributed under the MIT License.
Download the Plan 9 distribution.


## diffname port/devwren.c 1991/0110
## diff -e /dev/null /n/bootesdump/1991/0110/sys/src/9/68020/devwren.c
0a
#include	"u.h"
#include	"lib.h"
#include	"mem.h"
#include	"dat.h"
#include	"fns.h"
#include	"errno.h"
#include	"devtab.h"
#include	"io.h"

#include	"scsi.h"

enum {
	Qdir, Qdata, Qstruct,
};

static Dirtab wrendir[]={
	"data",		{Qdata},	0,	0600,
	"struct",	{Qstruct},	8,	0400,
};

#define	NWREN	(sizeof wrendir/sizeof(Dirtab))

static long	maxblock[64];
static long	blocksize[64];

static Scsi	staticcmd;		/* BUG */
static uchar	datablk[4*512];		/* BUG */

/*
 *  accepts [0-7].[0-7], or abbreviation
 */
static int
wrendev(char *p)
{
	int dev = 0;
	if (p==0 || p[0]==0)
		goto out;
	if (p[0]<'0' || p[0]>'7')
		goto cant;
	dev = (p[0]-'0')<<3;
	if (p[1]==0)
		goto out;
	if (p[1]!='.')
		goto cant;
	if (p[2]==0)
		goto out;
	if (p[2]<'0' || p[2]>'7')
		goto cant;
	dev |= p[2]-'0';
	if (p[3]!=0)
		goto cant;
out:
	return dev;
cant:
	error(Ebadarg);
}

static int
wrengen(Chan *c, Dirtab *tab, long ntab, long s, Dir *dp)
{
	long l;
	if(tab==0 || s>=ntab)
		return -1;
	tab+=s;
	if (tab->qid.path==Qdata && 0<=c->dev && c->dev<64)
		l = maxblock[c->dev]*blocksize[c->dev];
	else
		l = tab->length;
	devdir(c, tab->qid, tab->name, l, tab->perm, dp);
	return 1;
}

void
wrenreset(void)
{}

void
wreninit(void)
{
	Scsi *cmd = &staticcmd;
	cmd->cmd.base = cmd->cmdblk;
	cmd->data.base = datablk;
}

/*
 *  param is #r<target>.<lun>
 */
Chan *
wrenattach(char *param)
{
	uchar buf[32];
	int dev;
	Chan *c;
	dev = wrendev(param);
	scsiready(dev);
	scsisense(dev, buf);
	scsicap(dev, buf);
	c = devattach('r', param);
	c->dev = dev;
	maxblock[dev] = BGLONG(&buf[0]);
	blocksize[dev] = BGLONG(&buf[4]);
	return c;
}

Chan *
wrenclone(Chan *c, Chan *nc)
{
	return devclone(c, nc);
}

int
wrenwalk(Chan *c, char *name)
{
	return devwalk(c, name, wrendir, NWREN, wrengen);
}

void
wrenstat(Chan *c, char *db)
{
	devstat(c, db, wrendir, NWREN, wrengen);
}

Chan *
wrenopen(Chan *c, int omode)
{
	if (c->qid.path == Qdata && scsiready(c->dev) != 0)
		error(Eio);
	return devopen(c, omode, wrendir, NWREN, wrengen);
}

void
wrencreate(Chan *c, char *name, int omode, ulong perm)
{
	error(Eperm);
}

void
wrenclose(Chan *c)
{}

#define	PSHORT(p, v)		((p)[0]=(v), (p)[1]=((v)>>8))
#define	PLONG(p, v)		(PSHORT(p, (v)), PSHORT(p+2, (v)>>16))
long
wrenread(Chan *c, char *a, long n)
{
	Scsi *cmd = &staticcmd;
	unsigned long lbn;
	if (n == 0)
		return 0;
	switch ((int)(c->qid.path & ~CHDIR)) {
	case Qdir:
		return devdirread(c, a, n, wrendir, NWREN, wrengen);
	case Qdata:
		if (n % blocksize[c->dev] || c->offset % blocksize[c->dev])
			error(Ebadarg);
		lbn = c->offset/blocksize[c->dev];
		if (lbn >= maxblock[c->dev])
			error(Ebadarg);
		if (n > sizeof datablk)
			n = sizeof datablk;
		qlock(cmd);
		if (waserror()) {
			qunlock(cmd);
			nexterror();
		}
		cmd->target = c->dev>>3;
		cmd->lun = c->dev&7;
		cmd->cmd.ptr = cmd->cmd.base;
		cmd->cmdblk[0] = 0x08;
		cmd->cmdblk[1] = lbn>>16;
		cmd->cmdblk[2] = lbn>>8;
		cmd->cmdblk[3] = lbn;
		cmd->cmdblk[4] = n/blocksize[c->dev];
		cmd->cmdblk[5] = 0x00;
		cmd->cmd.lim = &cmd->cmdblk[6];
		cmd->data.lim = cmd->data.base + n;
		cmd->data.ptr = cmd->data.base;
		cmd->save = cmd->data.base;
		scsiexec(cmd, 1);
		n = cmd->data.ptr - cmd->data.base;
		memcpy(a, cmd->data.base, n);
		qunlock(cmd);
		break;
	case Qstruct:
		if (n < 8)
			error(Ebadarg);
		if (c->offset >= 8)
			return 0;
		n = 8;
		PLONG((uchar *)&a[0], maxblock[c->dev]);
		PLONG((uchar *)&a[4], blocksize[c->dev]);
		break;
	default:
		panic("wrenread");
	}
	return n;
}

long
wrenwrite(Chan *c, char *a, long n)
{
	Scsi *cmd = &staticcmd;
	unsigned long lbn;
	if (n == 0)
		return 0;
	switch ((int)(c->qid.path & ~CHDIR)) {
	case Qdata:
		if (n % blocksize[c->dev] || c->offset % blocksize[c->dev])
			error(Ebadarg);
		lbn = c->offset/blocksize[c->dev];
		if (lbn >= maxblock[c->dev])
			error(Ebadarg);
		if (n > sizeof datablk)
			n = sizeof datablk;
		qlock(cmd);
		if (waserror()) {
			qunlock(cmd);
			nexterror();
		}
		cmd->target = c->dev>>3;
		cmd->lun = c->dev&7;
		cmd->cmd.ptr = cmd->cmd.base;
		cmd->cmdblk[0] = 0x0a;
		cmd->cmdblk[1] = lbn>>16;
		cmd->cmdblk[2] = lbn>>8;
		cmd->cmdblk[3] = lbn;
		cmd->cmdblk[4] = n/blocksize[c->dev];
		cmd->cmdblk[5] = 0x00;
		cmd->cmd.lim = &cmd->cmdblk[6];
		cmd->data.lim = cmd->data.base + n;
		cmd->data.ptr = cmd->data.base;
		cmd->save = cmd->data.base;
		memcpy(cmd->data.base, a, n);
		scsiexec(cmd, 0);
		n = cmd->data.ptr - cmd->data.base;
		qunlock(cmd);
		break;
	default:
		panic("wrenwrite");
	}
	return n;
}

void
wrenremove(Chan *c)
{
	error(Eperm);
}

void
wrenwstat(Chan *c, char *dp)
{
	error(Eperm);
}
.
## diffname port/devwren.c 1991/0112
## diff -e /n/bootesdump/1991/0110/sys/src/9/68020/devwren.c /n/bootesdump/1991/0112/sys/src/9/68020/devwren.c
227c
		cmd->cmdblk[4] = n/d->blocksize;
.
210,211c
		lbn = c->offset/d->blocksize + p->firstblock;
		if (lbn >= p->maxblock)
.
208c
		if (n % d->blocksize || c->offset % d->blocksize)
.
206c

	d = &wren[c->dev];
	p = &(d->p[Mask&c->qid.path]);
	switch ((int)(c->qid.path & ~Mask)) {
.
203a
	Part *p;
	Disk *d;

.
190,191c
		PLONG((uchar *)&a[0], p->maxblock - p->firstblock);
		PLONG((uchar *)&a[4], d->blocksize);
.
173c
		cmd->cmdblk[4] = n/d->blocksize;
.
156,157c
		lbn = (c->offset/d->blocksize) + p->firstblock;
		if (lbn >= p->maxblock)
.
154c
		if (n % d->blocksize || c->offset % d->blocksize)
.
152a

	d = &wren[c->dev];
	p = &(d->p[Mask&c->qid.path]);
	switch ((int)(c->qid.path & ~Mask)) {
.
150,151c

	if(c->qid.path == CHDIR)
.
147a
	Part *p;
	Disk *d;

.
100,101c
	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;
	}
.
93a
	Disk *d;
	ulong plen;
	int i;

.
76a
	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;
}

.
75c
{
	Dirtab *p;
	int i;
.
68c
		l = 8;
.
64,66c
	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);
.
62c
	Part *p;
	Disk *d;

	if(s >= ntab)
.
52a
	if(dev >= Ndisk)
		error(Ebadarg);
.
28a
static Scsi	staticcmd;			/* BUG */
static uchar	datablk[2*4*512];		/* BUG */

.
26,27c
static Disk	wren[Ndisk];
.
23,24c
struct Part
{
	ulong 	firstblock;
	ulong 	maxblock;
};
struct Disk
{
	ulong	blocksize;
	Part	p[Npart];
};
.
21c
static Dirtab *wrendir;
#define	NWREN	(2*(Npart+1))
.
16,18c
	Qdir=		0,
	Qdata=		16,
	Qstruct=	32,

	Mask=		0x7,
.
13,14c
	Npart=		2,	/* maximum partitions per disk */
	Ndisk=		64,	/* maximum disks */
.
11a
typedef struct Part	Part;
typedef struct Disk	Disk;

.
## diffname port/devwren.c 1991/0115
## diff -e /n/bootesdump/1991/0112/sys/src/9/68020/devwren.c /n/bootesdump/1991/0115/sys/src/9/68020/devwren.c
111c
		sprint(p->name, "struct%d", i);
.
44a
#define	BGLONG(p)	(((((((p)[0]<<8)|(p)[1])<<8)|(p)[2])<<8)|(p)[3])

.
42,43c
static Scsi	staticcmd;		/* BUG */
static uchar	datablk[BY2PG];		/* BUG */
.
10,11d
## diffname port/devwren.c 1991/0318
## diff -e /n/bootesdump/1991/0201/sys/src/9/68020/devwren.c /n/bootesdump/1991/0318/sys/src/9/gnot/devwren.c
307c
		memmove(cmd->data.base, a, n);
.
249c
		memmove(a, cmd->data.base, n);
.
## diffname port/devwren.c 1991/0411
## diff -e /n/bootesdump/1991/0318/sys/src/9/gnot/devwren.c /n/bootesdump/1991/0411/sys/src/9/gnot/devwren.c
284c
		lbn = offset/d->blocksize + p->firstblock;
.
282c
		if (n % d->blocksize || offset % d->blocksize)
.
268c
wrenwrite(Chan *c, char *a, long n, ulong offset)
.
255c
		if (offset >= 8)
.
224c
		lbn = (offset/d->blocksize) + p->firstblock;
.
222c
		if (n % d->blocksize || offset % d->blocksize)
.
205c
wrenread(Chan *c, char *a, long n, ulong offset)
.
## diffname port/devwren.c 1991/0419
## diff -e /n/bootesdump/1991/0411/sys/src/9/gnot/devwren.c /n/bootesdump/1991/0419/sys/src/9/gnot/devwren.c
177a
Chan*
wrenclwalk(Chan *c, char *name)
{
	return devclwalk(c, name);
}

.
## diffname port/devwren.c 1991/0423
## diff -e /n/bootesdump/1991/0423/sys/src/9/gnot/devwren.c /n/bootesdump/1991/0423/sys/src/9/port/devwren.c
308,312d
300,303d
293,295c
		if (n > DATASIZE)
			n = DATASIZE;
		cmd = scsicmd(c->dev, 0x0a, n);
.
276,277c
	Scsi *cmd;
	ulong lbn;
.
248,252d
240,243d
233,235c
		if (n > DATASIZE)
			n = DATASIZE;
		cmd = scsicmd(c->dev, 0x08, n);
.
213,214c
	Scsi *cmd;
	ulong lbn;
.
128,132c
{}
.
40,41c
#define	DATASIZE	(8*1024)	/* BUG */
.
## diffname port/devwren.c 1991/0427
## diff -e /n/bootesdump/1991/0423/sys/src/9/port/devwren.c /n/bootesdump/1991/0427/sys/src/9/port/devwren.c
173,178d
## diffname port/devwren.c 1991/0429
## diff -e /n/bootesdump/1991/0427/sys/src/9/port/devwren.c /n/bootesdump/1991/0429/sys/src/9/port/devwren.c
149a

print("Block size %lux capacity %lux\n", d->blocksize, BGLONG(&buf[0]));

.
## diffname port/devwren.c 1991/0530
## diff -e /n/bootesdump/1991/0429/sys/src/9/port/devwren.c /n/bootesdump/1991/0530/sys/src/9/port/devwren.c
151,152d
## diffname port/devwren.c 1991/0603
## diff -e /n/bootesdump/1991/0530/sys/src/9/port/devwren.c /n/bootesdump/1991/0603/sys/src/9/port/devwren.c
305a
}

void
wrenint(uchar *a, ulong x)
{
	a[0] = x >> 24;
	a[1] = x >> 16;
	a[2] = x >> 8;
	a[3] = x;
.
244,246c
		n = 2*sizeof(ulong);
		wrenint((uchar*)a, p->maxblock - p->firstblock);
		wrenint((uchar*)a+sizeof(ulong), d->blocksize);
.
242c
		if (offset >= 2*sizeof(ulong))
.
240c
		if (n < 2*sizeof(ulong))
.
198,199d
39a
void	wrenint(uchar*, ulong);

.
## diffname port/devwren.c 1991/0604
## diff -e /n/bootesdump/1991/0603/sys/src/9/port/devwren.c /n/bootesdump/1991/0604/sys/src/9/port/devwren.c
288a
		poperror();
.
237a
		poperror();
.
## diffname port/devwren.c 1991/0615
## diff -e /n/bootesdump/1991/0604/sys/src/9/port/devwren.c /n/bootesdump/1991/0615/sys/src/9/port/devwren.c
153c
	plen = BGLONG(&buf[0])+1;
.
## diffname port/devwren.c 1991/0705
## diff -e /n/bootesdump/1991/0615/sys/src/9/port/devwren.c /n/bootesdump/1991/0705/sys/src/9/port/devwren.c
153c
	plen = BGLONG(&buf[0]);
.
## diffname port/devwren.c 1991/0706
## diff -e /n/bootesdump/1991/0705/sys/src/9/port/devwren.c /n/bootesdump/1991/0706/sys/src/9/port/devwren.c
153c
	plen = BGLONG(&buf[0])+1;
.
## diffname port/devwren.c 1991/0823
## diff -e /n/bootesdump/1991/0706/sys/src/9/port/devwren.c /n/bootesdump/1991/0823/sys/src/9/port/devwren.c
310,316c
	/*
	 *  read partition table from disk, null terminate
	 */
	cmd = scsicmd(dev, 0x08, dp->bytes);
	if(waserror()){
		qunlock(cmd);
		nexterror();
	}
	n = dp->p[0].end-1;
	cmd->cmdblk[1] = n>>16;
	cmd->cmdblk[2] = n>>8;
	cmd->cmdblk[3] = n;
	cmd->cmdblk[4] = 1;
	scsiexec(cmd, 1);
	cmd->data.base[dp->bytes-1] = 0;

	/*
	 *  parse partition table.
	 */
	n = getfields((char *)cmd->data.base, line, Npart+1, '\n');
	if(strncmp(line[0], MAGIC, sizeof(MAGIC)-1) != 0)
		goto out;
	for(i = 1; i < n; i++){
		pp++;
		if(getfields(line[i], field, 3, ' ') != 3){
			break;
		}
		strncpy(pp->name, field[0], NAMELEN);
		pp->start = strtoul(field[1], 0, 0);
		pp->end = strtoul(field[2], 0, 0);
		if(pp->start > pp->end || pp->start >= dp->p[0].end){
			break;
		}
		dp->npart++;
	}
out:
	qunlock(cmd);
	poperror();
.
304,308c
	scsiready(dev);
	scsisense(dev, buf);
	scsicap(dev, buf);
	dp = &wren[dev];
	dp->drive = dev;
	if(dp->npart)
		return;
	/*
	 *  we always have a partition for the whole disk
	 *  and one for the partition table
	 */
	dp->bytes = (buf[4]<<24)+(buf[5]<<16)+(buf[6]<<8)+(buf[7]);
	pp = &dp->p[0];
	strcpy(pp->name, "disk");
	pp->start = 0;
	pp->end = (buf[0]<<24)+(buf[1]<<16)+(buf[2]<<8)+(buf[3]) + 1;
	pp++;
	strcpy(pp->name, "partition");
	pp->start = dp->p[0].end - 1;
	pp->end = dp->p[0].end;
	dp->npart = 2;
.
301,302c
	Scsi *cmd;
	Drive *dp;
	Partition *pp;
	uchar buf[32];
	char *b;
	char *line[Npart+1];
	char *field[3];
	ulong n;
	int i;
.
298,299c
/*
 *  read partition table.  The partition table is just ascii strings.
 */
#define MAGIC "plan9 partitions"
static void
wrenpart(int dev)
.
294a
	cmd->cmdblk[1] = block>>16;
	cmd->cmdblk[2] = block>>8;
	cmd->cmdblk[3] = block;
	cmd->cmdblk[4] = n;
	if(write)
		memmove(cmd->data.base, a, n*d->bytes);
	scsiexec(cmd, !write);
	n = cmd->data.ptr - cmd->data.base;
	if(!write)
		memmove(a, cmd->data.base, n);
	qunlock(cmd);
	poperror();
.
290,293c
		nexterror();
.
265,288c
	if(n > DATASIZE)
		n = DATASIZE;
	n /= d->bytes;
	if(block + n > p->end)
		n = p->end - block;
	if(n == 0)
		return 0;
	if(write)
		cmd = scsicmd(d->drive, 0x0a, n*d->bytes);
	else
		cmd = scsicmd(d->drive, 0x08, n*d->bytes);
	if(waserror()){
.
263c
	if(n % d->bytes || offset % d->bytes)
		error(Ebadarg);
	block = offset / d->bytes + p->start;
	if(block >= p->end)
.
259,261c
	void *b;
	ulong block;
.
257a
	Drive *d;
	Partition *p;

	d = &wren[DRIVE(c->qid.path)];
	p = &d->p[PART(c->qid.path)];
	return wrenio(d, p, 1, a, n, offset);
}

static long
wrenio(Drive *d, Partition *p, int write, char *a, ulong n, ulong offset)
{
.
214,252c
	d = &wren[DRIVE(c->qid.path)];
	p = &d->p[PART(c->qid.path)];
	return wrenio(d, p, 0, a, n, offset);
.
212c
		return devdirread(c, a, n, 0, 0, wrengen);
.
208,209d
203,206c
	Drive *d;
	Partition *p;
.
199a
void
wrenremove(Chan *c)
{
	error(Eperm);
}

void
wrenwstat(Chan *c, char *dp)
{
	error(Eperm);
}

.
198c
{
}
.
185,187c
	return devopen(c, omode, 0, 0, wrengen);
.
182c
Chan*
.
179c
	devstat(c, dp, 0, 0, wrengen);
.
177c
wrenstat(Chan *c, char *dp)
.
173c
	return devwalk(c, name, 0, 0, wrengen);
.
164c
Chan*
.
149,160c
	c->dev = drive;
.
144,147c
	drive = wrendev(param);
	wrenpart(drive);
.
140,142c
	int drive;
.
137,138d
129c
{
}
.
103,124d
89,96c
	if(s >= dp->npart)
		return 0;

	pp = &dp->p[s];
	sprint(name, "hd%d%s", drive, pp->name);
	name[NAMELEN] = 0;
	qid.path = MKQID(drive, s);
	l = (pp->end - pp->start) * dp->bytes;
	devdir(c, qid, name, l, 0600, dirp);
.
86,87c
	dp = &wren[drive];
.
84c
	qid.vers = 0;
	drive = s/Npart;
	s = s % Npart;
	if(drive >= Ndisk)
.
80,82c
	Qid qid;
	int drive;
	char name[NAMELEN+4];
	Drive *dp;
	Partition *pp;
	ulong l;
.
78c
wrengen(Chan *c, Dirtab *tab, long ntab, long s, Dir *dirp)
.
66,67c
	dev |= p[2] - '0';
	if(p[3] != 0)
.
64c
	if(p[2] < '0' || p[2] > '7')
.
62c
	if(p[2] == 0)
.
60c
	if(p[1] != '.')
.
57,58c
	dev = (p[0] - '0') << 3;
	if(p[1] == 0)
.
55c
	if(p[0] < '0' || p[0] > '7')
.
53c

	if(p == 0 || p[0] == 0)
.
44c
static void	wrenpart(int);
static long	wrenio(Drive *, Partition *, int, char *, ulong, ulong);
.
40,41d
38c
static Drive	wren[Ndisk];
.
34,35c
	ulong		bytes;			/* bytes per block */
	int		npart;			/* actual number of partitions */
	int		drive;
	Partition	p[Npart];
.
32c

struct Drive
.
29,30c
	ulong	start;
	ulong	end;
	char	name[NAMELEN+1];
.
24,27c
struct Partition
.
22a
#define PART(x)		((x)&0xF)
#define DRIVE(x)	(((x)>>4)&0x7)
#define MKQID(d,p)	(((d)<<4) | (p))
.
18,21d
16a
	/* file types */
.
14c
	Npart=		8+2,	/* 8 sub partitions, disk, and partition */
.
10,11c
typedef struct Partition	Partition;
typedef struct Drive		Drive;
.
## diffname port/devwren.c 1991/0921
## diff -e /n/bootesdump/1991/0823/sys/src/9/port/devwren.c /n/bootesdump/1991/0921/sys/src/9/port/devwren.c
128c
	c = devattach('w', param);
.
## diffname port/devwren.c 1991/0927
## diff -e /n/bootesdump/1991/0921/sys/src/9/port/devwren.c /n/bootesdump/1991/0927/sys/src/9/port/devwren.c
324a
	scsifree(b);
.
322,323d
314,320d
306,312c
	n = getfields(rawpart, line, Npart+1, '\n');
	if(strncmp(line[0], MAGIC, sizeof(MAGIC)-1) == 0){
		for(i = 1; i < n; i++){
			pp++;
			if(getfields(line[i], field, 3, ' ') != 3){
				break;
			}
			strncpy(pp->name, field[0], NAMELEN);
			pp->start = strtoul(field[1], 0, 0);
			pp->end = strtoul(field[2], 0, 0);
			if(pp->start > pp->end || pp->start >= dp->p[0].end){
				break;
			}
			dp->npart++;
.
295,301c
	scsibread(dev, b, 1, dp->bytes, dp->p[0].end-1);
	rawpart = b->virt;
	rawpart[dp->bytes-1] = 0;
.
292c
		scsifree(b);
.
290c
	b = scsibuf();
.
270,271c

.
259,261c
	Scsibuf *b;
	char *rawpart, *line[Npart+1], *field[3];
.
255d
244a
	scsifree(b);
.
233,243c
	if(write){
		memmove(b->virt, a, n*d->bytes);
		n = scsibwrite(d->drive, b, n, d->bytes, block);
	}else{
		n = scsibread(d->drive, b, n, d->bytes, block);
		memmove(a, b->virt, n);
	}
.
230c
		scsifree(b);
.
225,228c
	b = scsibuf();
.
209,210c
	Scsibuf *b;
.
201a
	if(d->npart == 0)
		errors("bad drive");
.
190a
	if(d->npart == 0)
		errors("bad drive");
.
99c
	if(drive & 7)
		sprint(name, "hd%d.%d%s", drive>>3, drive&7, pp->name);
	else
		sprint(name, "hd%d%s", drive>>3, pp->name);
.
96c
		return -1;
.
89,90c
	drive = c->dev;
.
41,42d
21c
#define DRIVE(x)	(((x)>>4)&(Ndisk-1))
.
15c
	Ndisk=		64,	/* maximum disks; must be power of 2 or change DRIVE */
.
9a
#define DATASIZE	(8*1024)

.
## diffname port/devwren.c 1991/1019
## diff -e /n/bootesdump/1991/0927/sys/src/9/port/devwren.c /n/bootesdump/1991/1019/sys/src/9/port/devwren.c
219c
		errors("io not block aligned");
.
207c
		errors("drive repartitioned");
.
194c
		errors("drive repartitioned");
.
57,75c
		errors("bad scsi drive specifier");
	drive = p[0] - '0';
	unit = 0;
	if(p[1]){
		if(p[1] != '.' || p[2] < '0' || p[2] > '7' || p[3] != '\0')
			errors("bad scsi unit specifier");
		unit = p[2] - '0';
	}
	return (drive << 3) | unit;
.
54,55c
	if(p == 0 || p[0] == '\0')
		return 0;
.
52c
	int drive, unit;
.
17c
	Ndisk=		64,	/* maximum disks; if you change it, you must
				   map from dev to disk */
.
## diffname port/devwren.c 1991/1109
## diff -e /n/bootesdump/1991/1019/sys/src/9/port/devwren.c /n/bootesdump/1991/1109/sys/src/9/port/devwren.c
96c
	devdir(c, qid, name, l, eve, 0600, dirp);
.
## diffname port/devwren.c 1991/1112
## diff -e /n/bootesdump/1991/1109/sys/src/9/port/devwren.c /n/bootesdump/1991/1112/sys/src/9/port/devwren.c
96c
	devdir(c, qid, name, l, eve, 0666, dirp);
.
## diffname port/devwren.c 1991/1203
## diff -e /n/bootesdump/1991/1112/sys/src/9/port/devwren.c /n/bootesdump/1991/1203/sys/src/9/port/devwren.c
235c
	return len;
.
230,231c
		x = scsibread(d->drive, b, n, d->bytes, block);
		if(x < offset)
			len = 0;
		else if(len > x - offset)
			len = x - offset;
		memmove(a, (char*)b->virt + offset, len);
.
227,228c
		if(offset || len % d->bytes){
			x = scsibread(d->drive, b, n, d->bytes, block);
			if(x < n * d->bytes){
				n = x / d->bytes;
				x = n * d->bytes - offset;
				if(len > x)
					len = x;
			}
		}
		memmove((char*)b->virt + offset, a, len);
		x = scsibwrite(d->drive, b, n, d->bytes, block);
		if(x < offset)
			len = 0;
		else if(len > x - offset)
			len = x - offset;
.
225a
	offset %= d->bytes;
.
219c
	if(block >= p->end || n == 0)
.
212,216c
	n = (offset + len + d->bytes - 1) / d->bytes + p->start - block;
	max = DATASIZE / d->bytes;
	if(n > max)
		n = max;
.
203,210d
200,201d
194a
	Scsibuf *b;
	ulong block, n, max, x;
.
192a
	return wrenio(c, 1, a, n, offset);
}

static long
wrenio(Chan *c, int write, char *a, ulong len, ulong offset)
{
.
182,187c
	return wrenio(c, 0, a, n, offset);
.
176,179d
45c
static long	wrenio(Chan*, int, char*, ulong, ulong);
.
## diffname port/devwren.c 1991/1210
## diff -e /n/bootesdump/1991/1203/sys/src/9/port/devwren.c /n/bootesdump/1991/1210/sys/src/9/port/devwren.c
169a
	USED(c, dp);
.
163a
	USED(c);
.
158a
	USED(c);
.
152a
	USED(c, name, omode, perm);
.
## diffname port/devwren.c 1991/1220
## diff -e /n/bootesdump/1991/1210/sys/src/9/port/devwren.c /n/bootesdump/1991/1220/sys/src/9/port/devwren.c
265c
	if (scsicap(dev, buf))
		error(Eio);
.
## diffname port/devwren.c 1992/0109
## diff -e /n/bootesdump/1991/1220/sys/src/9/port/devwren.c /n/bootesdump/1992/0109/sys/src/9/port/devwren.c
301c
	if(n > 0 && strncmp(line[0], MAGIC, sizeof(MAGIC)-1) == 0){
.
## diffname port/devwren.c 1992/0111
## diff -e /n/bootesdump/1992/0109/sys/src/9/port/devwren.c /n/bootesdump/1992/0111/sys/src/9/port/devwren.c
6c
#include	"../port/error.h"
.
## diffname port/devwren.c 1992/0114
## diff -e /n/bootesdump/1992/0111/sys/src/9/port/devwren.c /n/bootesdump/1992/0114/sys/src/9/port/devwren.c
200,201c
	if(d->npart == 0)			/* drive repartitioned */
		error(Eio);
.
63c
			error(Ebadarg);
.
58c
		error(Ebadarg);
.
## diffname port/devwren.c 1992/0129
## diff -e /n/bootesdump/1992/0114/sys/src/9/port/devwren.c /n/bootesdump/1992/0129/sys/src/9/port/devwren.c
188c
	n = wrenio(c, 1, a, n, offset);
	if(n)
		return n;
	error("end of device");
.
## diffname port/devwren.c 1992/0219
## diff -e /n/bootesdump/1992/0129/sys/src/9/port/devwren.c /n/bootesdump/1992/0219/sys/src/9/port/devwren.c
315d
313c
			if(pp->start > pp->end || pp->start >= dp->p[0].end)
.
309d
307c
			if(getfields(line[i], field, 3, ' ') != 3)
.
304c
	if(strncmp(line[0], MAGIC, sizeof(MAGIC)-1) == 0){
.
266,268c
	if(scsiready(dev)){
		scsisense(dev, buf);
		if(scsiready(dev))
			print("scsi %d.%d not ready: sense 0x%2.2ux, code 0x%2.2ux\n",
				dev>>3, dev&7, buf[2], buf[12]);
	}
	if(scsicap(dev, buf))
.
## diffname port/devwren.c 1992/0301
## diff -e /n/bootesdump/1992/0219/sys/src/9/port/devwren.c /n/bootesdump/1992/0301/sys/src/9/port/devwren.c
322a
	qunlock(dp);
.
320a
	dp->npart = pp - dp->p;
.
318c
			pp++;
.
310d
306a
	pp = &dp->p[2];
.
278,292d
272,275d
268,270c
		if (scsicap(dev, buf))
			error(Eio);
		dp->drive = dev;
		dp->ready = 1;

		/*
		 *  we always have a partition for the whole disk
		 *  and one for the partition table
		 */
		dp->bytes = (buf[4]<<24)+(buf[5]<<16)+(buf[6]<<8)+(buf[7]);
		pp = &dp->p[0];
		strcpy(pp->name, "disk");
		pp->start = 0;
		pp->end = (buf[0]<<24)+(buf[1]<<16)+(buf[2]<<8)+(buf[3]) + 1;
		pp++;
		strcpy(pp->name, "partition");
		pp->start = dp->p[0].end - 1;
		pp->end = dp->p[0].end;
.
266c
	dp = &wren[dev];
	if(waserror()){
		qunlock(dp);
		nexterror();
	}
	qlock(dp);
	if(!dp->ready){
		scsiready(dev);
.
38a
	int		ready;			/* true if ever ready */
.
35a
	QLock;
.
## diffname port/devwren.c 1992/0303
## diff -e /n/bootesdump/1992/0301/sys/src/9/port/devwren.c /n/bootesdump/1992/0303/sys/src/9/port/devwren.c
328a
	poperror();
.
## diffname port/devwren.c 1992/0321
## diff -e /n/bootesdump/1992/0303/sys/src/9/port/devwren.c /n/bootesdump/1992/0321/sys/src/9/port/devwren.c
2c
#include	"../port/lib.h"
.
## diffname port/devwren.c 1992/0603
## diff -e /n/bootesdump/1992/0321/sys/src/9/port/devwren.c /n/bootesdump/1992/0603/sys/src/9/port/devwren.c
193a
	return 0;		/* not reached */
.
## diffname port/devwren.c 1992/0711
## diff -e /n/bootesdump/1992/0603/sys/src/9/port/devwren.c /n/bootesdump/1992/0711/sys/src/9/port/devwren.c
80a
	USED(tab, ntab);
.
## diffname port/devwren.c 1992/0808
## diff -e /n/bootesdump/1992/0711/sys/src/9/port/devwren.c /n/bootesdump/1992/0808/sys/src/9/port/devwren.c
316c
	if(n > 0 && strncmp(line[0], MAGIC, sizeof(MAGIC)-1) == 0){
.
284,297c
	/*
	 *  we always have a partition for the whole disk
	 *  and one for the partition table
	 */
	dp->bytes = (buf[4]<<24)+(buf[5]<<16)+(buf[6]<<8)+(buf[7]);
	pp = &dp->p[0];
	strcpy(pp->name, "disk");
	pp->start = 0;
	pp->end = (buf[0]<<24)+(buf[1]<<16)+(buf[2]<<8)+(buf[3]) + 1;
	pp++;
	strcpy(pp->name, "partition");
	pp->start = dp->p[0].end - 1;
	pp->end = dp->p[0].end;
.
276,282c
	scsiready(dev);
	scsisense(dev, buf);
	if(scsicap(dev, buf))
		error(Eio);
	dp->drive = dev;
	dp->readonly = scsiwp(dev);
.
114c
 *  param is #w<target>.<lun>
.
99c
	devdir(c, qid, name, l, eve, dp->readonly ? 0444 : 0666, dirp);
.
40c
	int		readonly;
.
## diffname port/devwren.c 1992/0825
## diff -e /n/bootesdump/1992/0808/sys/src/9/port/devwren.c /n/bootesdump/1992/0825/sys/src/9/port/devwren.c
296a
	scsiinquiry(dev, buf, sizeof buf);
	if(memcmp(&buf[8], "INSITE  I325VM        *F", 24) == 0)
		scsimodesense(dev, 0x2e, buf, 0x2a);
.
264c
	uchar buf[128];
.
## diffname port/devwren.c 1992/1009
## diff -e /n/bootesdump/1992/0825/sys/src/9/port/devwren.c /n/bootesdump/1992/1009/sys/src/9/port/devwren.c
277a
	scsistartstop(dev, ScsiStartunit);
.
## diffname port/devwren.c 1992/1215
## diff -e /n/bootesdump/1992/1009/sys/src/9/port/devwren.c /n/bootesdump/1992/1215/sys/src/9/port/devwren.c
278a
	scsisense(dev, buf);
.
## diffname port/devwren.c 1993/0115
## diff -e /n/bootesdump/1992/1215/sys/src/9/port/devwren.c /n/bootesdump/1993/0115/sys/src/9/port/devwren.c
95c
		sprint(name, "sd%d%s", drive>>3, pp->name);
.
93c
		sprint(name, "sd%d.%d%s", drive>>3, drive&7, pp->name);
.
## diffname port/devwren.c 1993/1124 # deleted
## diff -e /n/bootesdump/1993/0115/sys/src/9/port/devwren.c /n/fornaxdump/1993/1124/sys/src/brazil/port/devwren.c
1,336d

Bell Labs OSI certified Powered by Plan 9

(Return to Plan 9 Home Page)

Copyright © 2021 Plan 9 Foundation. All Rights Reserved.
Comments to webmaster@9p.io.