From ddd921e8ef6df58a590eb43301d4db346219c928 Mon Sep 17 00:00:00 2001 From: David du Colombier <0intro@gmail.com> Date: Mon, 24 Jul 2000 00:00:00 +0000 Subject: [PATCH] Plan 9 from Bell Labs 2000-07-24 --- pc/devusb.c | 31 ++++++++++++++----------------- 1 file changed, 14 insertions(+), 17 deletions(-) diff --git a/pc/devusb.c b/pc/devusb.c index ecb3bf03d6fc33e20c66f590131032fda65f4aef..7046a97ed2f7004b678e96ac9b6d3e0661dfe805 100644 --- a/pc/devusb.c +++ b/pc/devusb.c @@ -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; iep); 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)