~kris/9p

9hist

ddd921e8ef6df58a590eb43301d4db346219c928 — David du Colombier 26 years ago 24fcf82
Plan 9 from Bell Labs 2000-07-24
1 files changed, 14 insertions(+), 17 deletions(-)

M pc/devusb.c
M pc/devusb.c => pc/devusb.c +14 -17
@@ 59,6 59,11 @@ typedef struct Udev Udev;
typedef struct QH QH;
typedef struct TD TD;

#define Class(csp)		((csp)&0xff)
#define Subclass(csp)	(((csp)>>8)&0xff)
#define Proto(csp)		(((csp)>>16)&0xff)
#define CSP(c, s, p)	((c) | ((s)<<8) | ((p)<<16))

struct TD {
	ulong	link;
	ulong	status;	/* controller r/w */


@@ 168,9 173,7 @@ struct Udev {
	int		state;
	int		id;
	byte	port;		/* port number on connecting hub */
	byte	class;
	byte	subclass;
	byte	proto;
	ulong	csp;
	int		ls;
	int		npt;
	Endpt*	ep[16];		/* active end points */


@@ 211,9 214,7 @@ struct Endpt {
	int		maxpkt;	/* maximum packet size (from endpoint descriptor) */
	int		data01;	/* 0=DATA0, 1=DATA1 */
	byte	eof;
	byte	class;
	byte	subclass;
	byte	proto;
	ulong	csp;
	byte	mode;	/* OREAD, OWRITE, ORDWR */
	byte	nbuf;	/* number of buffers allowed */
	byte	periodic;


@@ 990,7 991,7 @@ static void
usbdevreset(Udev *d)
{
	d->state = Disabled;
	if(d->class == Hubclass)
	if(Class(d->csp) == Hubclass)
		for(d = d->ports; d != nil; d = d->next)
			usbdevreset(d);
}


@@ 1689,10 1690,10 @@ usbread(Chan *c, void *a, long n, vlong offset)
			free(s);
			nexterror();
		}
		l = snprint(s, READSTR, "%s %d.%d.%d\n", devstates[d->state], d->class, d->subclass, d->proto);
		l = snprint(s, READSTR, "%s %#6.6x\n", devstates[d->state], d->csp);
		for(i=0; i<nelem(d->ep); i++)
			if((e = d->ep[i]) != nil)	/* TO DO: freeze e */
				l += snprint(s+l, READSTR-l, "%2d %ud.%ud.%ud bytes %10lud blocks %10lud\n", i, e->class, e->subclass, e->proto, e->nbytes, e->nblocks);
				l += snprint(s+l, READSTR-l, "%2d %#6.6x %10lud bytes %10lud blocks\n", i, e->csp, e->nbytes, e->nblocks);
		n = readstr(offset, a, n, s);
		poperror();
		free(s);


@@ 1813,23 1814,19 @@ usbwrite(Chan *c, void *a, long n, vlong)
		nf = getfields(cmd, fields, nelem(fields), 0, " \t\n");
		if(nf > 1 && strcmp(fields[0], "speed") == 0){
			d->ls = strtoul(fields[1], nil, 0) == 0;
		} else if(nf > 5 && strcmp(fields[0], "class") == 0){
		} else if(nf > 3 && strcmp(fields[0], "class") == 0){
			i = strtoul(fields[2], nil, 0);
			d->npt = strtoul(fields[1], nil, 0);
			/* class config# class subclass proto */
			/* class config# csp ( == class subclass proto) */
			if (i < 0 || i >= nelem(d->ep)
			 || d->npt > nelem(d->ep) || i >= d->npt)
				error(Ebadarg);
			if (i == 0) {
				d->class = strtoul(fields[3], nil, 0);
				d->subclass = strtoul(fields[4], nil, 0);
				d->proto = strtoul(fields[5], nil, 0);
				d->csp = strtoul(fields[3], nil, 0);
			}
			if(d->ep[i] == nil)
				d->ep[i] = devendpt(d, i, 1);
			d->ep[i]->class = strtoul(fields[3], nil, 0);
			d->ep[i]->subclass = strtoul(fields[4], nil, 0);
			d->ep[i]->proto = strtoul(fields[5], nil, 0);
			d->ep[i]->csp = strtoul(fields[3], nil, 0);
		}else if(nf > 2 && strcmp(fields[0], "data") == 0){
			i = strtoul(fields[1], nil, 0);
			if(i < 0 || i >= nelem(d->ep) || d->ep[i] == nil)