adds a timeout ctl request now used by the disk and the serial drivers. Reference: /n/sources/patch/applied/devusbtimeoutctl Date: Fri Jul 24 12:09:42 CES 2009 Signed-off-by: nemo@lsub.org --- /sys/src/9/pc/devusb.c Fri Jul 24 12:08:47 2009 +++ /sys/src/9/pc/devusb.c Fri Jul 24 12:08:43 2009 @@ -89,6 +89,7 @@ CMaddress, /* address (address is assigned) */ CMdebugep, /* debug n (set/clear debug for this ep) */ CMname, /* name str (show up as #u/name as well) */ + CMtmout, /* timeout n (activate timeouts for ep) */ /* Hub feature selectors */ Rportenable = 1, @@ -132,6 +133,7 @@ {CMdebugep, "debug", 2}, {CMclrhalt, "clrhalt", 1}, {CMname, "name", 2}, + {CMtmout, "timeout", 2}, }; static Dirtab usbdir[] = @@ -303,6 +305,8 @@ s = seprint(s, se, " idx %d", ep->idx); if(ep->name != nil) s = seprint(s, se, " name '%s'", ep->name); + if(ep->tmout != 0) + s = seprint(s, se, " tmout"); if(ep == ep->ep0){ s = seprint(s, se, " ctlrno %#x", ep->hp->ctlrno); s = seprint(s, se, " eps:"); @@ -467,6 +471,7 @@ ep->dev = d; ep->ep0 = ep; /* no ref counted here */ ep->ttype = Tctl; + ep->tmout = Xfertmout; ep->mode = ORDWR; dprint("newdev %#p ep%d.%d %#p\n", d, d->nb, ep->nb, ep); return ep; @@ -495,11 +500,20 @@ nep->mode = mode; nep->ttype = tt; nep->debug = ep->debug; - if(tt == Tintr || tt == Tiso) /* assign defaults */ + /* set defaults */ + switch(tt){ + case Tctl: + nep->tmout = Xfertmout; + break; + case Tintr: + nep->pollival = 10; + break; + case Tiso: + nep->tmout = Xfertmout; nep->pollival = 10; - if(tt == Tiso){ nep->samplesz = 4; nep->hz = 44100; + break; } deprint("newdevep ep%d.%d %#p\n", d->nb, nep->nb, nep); return ep; @@ -1297,8 +1311,16 @@ validname(cb->f[1], 0); kstrdup(&ep->name, cb->f[1]); break; + case CMtmout: + deprint("usb epctl %s\n", cb->f[0]); + if(ep->ttype == Tiso || ep->ttype == Tctl) + error("ctl ignored for this endpoint type"); + ep->tmout = strtoul(cb->f[1], nil, 0); + if(ep->tmout != 0 && ep->tmout < Xfertmout) + ep->tmout = Xfertmout; + break; default: - panic("usb: unknown epctl %d", ct->index); + panic("usb: unknown epctl %d\n", ct->index); } free(cb); poperror();