| plan 9 kernel history: overview | file list | diff list |
2001/1120/pc/devusb.c (diff list | history)
| 2001/1117/sys/src/9/pc/devusb.c:279,284 – 2001/1120/sys/src/9/pc/devusb.c:279,285 (short | long | prev | next) | ||
| 1999/1005 | static Ctlr ubus; static char Estalled[] = "usb endpoint stalled"; | |
| 2001/1120 | static char Ebadusbmsg[] = "invalid parameters to USB ctl message"; | |
| 1999/1005 | static QLock usbstate; /* protects name space state */ static Udev* usbdev[32]; | |
| 2001/1117/sys/src/9/pc/devusb.c:287,292 – 2001/1120/sys/src/9/pc/devusb.c:288,329 | ||
| 1999/1005 | Endpt* f; } activends; | |
| 2001/1120 | enum { BCMdisable, BCMenable, BCMreset, }; enum { CMclass, CMdata, CMdebug, CMep, CMmaxpkt, CMspeed, CMunstall, }; static Cmdtab usbbusctlmsg[] = { BCMdisable, "disable", 2, BCMenable, "enable", 2, BCMreset, "reset", 2, }; static Cmdtab usbctlmsg[] = { CMclass, "class", 4, CMdata, "data", 3, CMdebug, "debug", 3, CMep, "ep", 6, CMmaxpkt, "maxpkt", 3, CMspeed, "speed", 2, CMunstall, "unstall", 2, }; | |
| 1999/1005 | static long readusb(Endpt*, void*, long); static long writeusb(Endpt*, void*, long, int); | |
| 2001/1117/sys/src/9/pc/devusb.c:2003,2009 – 2001/1120/sys/src/9/pc/devusb.c:2040,2048 | ||
| 2001/0626 | { Udev *d; Endpt *e; | |
| 2001/1120 | Cmdbuf *cb; Cmdtab *ct; int id, nw, t, i; | |
| 2001/0626 | char cmd[50], *fields[10]; if(c->qid.type == QTDIR) | |
| 2001/1117/sys/src/9/pc/devusb.c:2010,2033 – 2001/1120/sys/src/9/pc/devusb.c:2049,2078 | ||
| 2001/0626 | error(Egreg); t = QID(c->qid); if(t == Qbusctl){ | |
| 2001/1117 |
| |
| 2001/0626 |
| |
| 2001/1120 | cb = parsecmd(a, n); if(waserror()){ free(cb); nexterror(); } ct = lookupcmd(cb, usbbusctlmsg, nelem(usbbusctlmsg)); | |
| 2001/0626 | id = strtol(fields[1], nil, 0); if(id != 1 && id != 2) | |
| 2001/1120 | cmderror(cb, "usb port number not 1 or 2 in"); switch(ct->index){ case BCMdisable: | |
| 2001/0626 | portenable(id, 0); | |
| 2001/1120 | break; case BCMenable: portenable(id, 1); break; case BCMreset: portreset(id); break; } poperror(); free(cb); | |
| 2001/0626 | return n; } d = usbdevice(c); | |
| 2001/1117/sys/src/9/pc/devusb.c:2034,2095 – 2001/1120/sys/src/9/pc/devusb.c:2079,2148 | ||
| 2001/0626 | t = QID(c->qid); switch(t){ case Qctl: | |
| 2001/1117 |
| |
| 2001/0626 |
| |
| 2001/1120 | cb = parsecmd(a, n); if(waserror()){ free(cb); nexterror(); } ct = lookupcmd(cb, usbctlmsg, nelem(usbctlmsg)); switch(ct->index){ case CMspeed: d->ls = strtoul(cb->f[1], nil, 0) == 0; break; case CMclass: i = strtoul(cb->f[2], nil, 0); d->npt = strtoul(cb->f[1], nil, 0); | |
| 2001/0626 | /* class config# csp ( == class subclass proto) */ if (i < 0 || i >= nelem(d->ep) || d->npt > nelem(d->ep) || i >= d->npt) | |
| 2001/1120 | cmderror(cb, Ebadusbmsg); if (i == 0) d->csp = strtoul(cb->f[3], nil, 0); | |
| 2001/0626 | if(d->ep[i] == nil) d->ep[i] = devendpt(d, i, 1); | |
| 2001/1120 | d->ep[i]->csp = strtoul(cb->f[3], nil, 0); break; case CMdata: i = strtoul(cb->f[1], nil, 0); | |
| 2001/0626 | if(i < 0 || i >= nelem(d->ep) || d->ep[i] == nil) | |
| 2001/1120 | error(Ebadusbmsg); | |
| 2001/0626 | e = d->ep[i]; | |
| 2001/1120 | e->data01 = strtoul(cb->f[2], nil, 0) != 0; break; case CMmaxpkt: i = strtoul(cb->f[1], nil, 0); | |
| 2001/0626 | if(i < 0 || i >= nelem(d->ep) || d->ep[i] == nil) | |
| 2001/1120 | error(Ebadusbmsg); | |
| 2001/0626 | e = d->ep[i]; | |
| 2001/1120 | e->maxpkt = strtoul(cb->f[2], nil, 0); | |
| 2001/0626 | if(e->maxpkt > 1500) e->maxpkt = 1500; | |
| 2001/1120 | break; case CMdebug: i = strtoul(cb->f[1], nil, 0); | |
| 2001/0626 | if(i < -1 || i >= nelem(d->ep) || d->ep[i] == nil) | |
| 2001/1120 | error(Ebadusbmsg); | |
| 2001/0626 | if (i == -1) debug = 0; else { debug = 1; e = d->ep[i]; | |
| 2001/1120 | e->debug = strtoul(cb->f[2], nil, 0); | |
| 2001/0626 | } | |
| 2001/1120 | break; case CMunstall: i = strtoul(cb->f[1], nil, 0); | |
| 2001/0626 | if(i < 0 || i >= nelem(d->ep) || d->ep[i] == nil) | |
| 2001/1120 | error(Ebadusbmsg); | |
| 2001/0626 | e = d->ep[i]; e->err = nil; | |
| 2001/1120 | break; case CMep: | |
| 2001/0916 | /* ep n `bulk' mode maxpkt nbuf OR | |
| 2001/1006 | * ep n period mode samplesize KHz | |
| 2001/0916 | */ | |
| 2001/0626 |
| |
| 2001/1120 | i = strtoul(cb->f[1], nil, 0); | |
| 2001/0626 | if(i < 0 || i >= nelem(d->ep)) { XPRINT("field 1: 0 <= %d < %d\n", i, nelem(d->ep)); error(Ebadarg); | |
| 2001/1117/sys/src/9/pc/devusb.c:2104,2110 – 2001/1120/sys/src/9/pc/devusb.c:2157,2163 | ||
| 2001/0626 | } | |
| 2001/1016 | if (e->active) | |
| 2001/0918 | error(Eperm); | |
| 2001/0916 |
| |
| 2001/1120 | if(strcmp(cb->f[2], "bulk") == 0){ | |
| 2001/0626 | Ctlr *ub; | |
| 2001/0918 | e->iso = 0; | |
| 2001/1117/sys/src/9/pc/devusb.c:2119,2136 – 2001/1120/sys/src/9/pc/devusb.c:2172,2189 | ||
| 2001/0626 | panic("usbwrite: allocqh"); } queueqh(e->epq); | |
| 2001/0916 |
| |
| 2001/0626 |
| |
| 2001/1120 | e->mode = strcmp(cb->f[3],"r") == 0? OREAD : strcmp(cb->f[3],"w") == 0? OWRITE : ORDWR; i = strtoul(cb->f[4], nil, 0); | |
| 2001/0916 | if(i < 8 || i > 1023) i = 8; e->maxpkt = i; | |
| 2001/1120 | i = strtoul(cb->f[5], nil, 0); | |
| 2001/0916 | if(i >= 1 && i <= 32) e->nbuf = i; } else { /* ep n period mode samplesize KHz */ | |
| 2001/1120 | i = strtoul(cb->f[2], nil, 0); | |
| 2001/0916 | if(i > 0 && i <= 1000){ | |
| 2001/0626 | e->pollms = i; | |
| 2001/0916 | }else { | |
| 2001/1117/sys/src/9/pc/devusb.c:2137,2145 – 2001/1120/sys/src/9/pc/devusb.c:2190,2198 | ||
| 2001/0626 | XPRINT("field 4: 0 <= %d <= 1000\n", i); error(Ebadarg); } | |
| 2001/0916 |
| |
| 2001/1120 | e->mode = strcmp(cb->f[3],"r") == 0? OREAD : strcmp(cb->f[3],"w") == 0? OWRITE : ORDWR; i = strtoul(cb->f[4], nil, 0); | |
| 2001/0916 | if(i >= 1 && i <= 8){ e->samplesz = i; }else { | |
| 2001/1117/sys/src/9/pc/devusb.c:2146,2152 – 2001/1120/sys/src/9/pc/devusb.c:2199,2205 | ||
| 2001/0916 | XPRINT("field 4: 0 < %d <= 8\n", i); error(Ebadarg); } | |
| 2001/1120 | i = strtoul(cb->f[5], nil, 0); | |
| 2001/0916 | if(i >= 1 && i <= 100000){ /* Hz */ e->hz = i; | |
| 2001/1117/sys/src/9/pc/devusb.c:2161,2170 – 2001/1120/sys/src/9/pc/devusb.c:2214,2223 | ||
| 2001/0626 | } poperror(); | |
| 2001/0918 | qunlock(&usbstate); | |
| 2001/0626 |
| |
| 2001/1120 | poperror(); free(cb); | |
| 2001/0626 | return n; case Qsetup: /* SETUP endpoint 0 */ | |