2 * USB Universal Host Controller Interface (sic) driver.
5 * - Too many delays and ilocks.
6 * - bandwidth admission control must be done per-frame.
7 * - interrupt endpoints should go on a tree like [oe]hci.
8 * - must warn of power overruns.
12 #include "../port/lib.h"
17 #include "../port/error.h"
18 #include "../port/usb.h"
20 typedef struct Ctlio Ctlio;
21 typedef struct Ctlr Ctlr;
22 typedef struct Isoio Isoio;
24 typedef struct Qhpool Qhpool;
25 typedef struct Qio Qio;
27 typedef struct Tdpool Tdpool;
31 Resetdelay = 100, /* delay after a controller reset (ms) */
32 Enabledelay = 100, /* waiting for a port to enable */
33 Abortdelay = 10, /* delay after cancelling Tds (ms) */
34 Incr = 64, /* for Td and Qh pools */
36 Tdatomic = 8, /* max nb. of Tds per bulk I/O op. */
38 /* Queue states (software) */
50 Nframes = 1024, /* 2ⁿ for xspanalloc; max 1024 */
51 Align = 16, /* for data structures */
53 /* Size of small buffer kept within Tds. (software) */
54 /* Keep as a multiple of Align to maintain alignment of Tds in pool */
58 * Some ports are short, some are long, some are byte.
59 * We use ins[bsl] and not vmap.
63 Chcreset = 0x02, /* host controller reset */
64 Cgreset = 0x04, /* global reset */
65 Cegsm = 0x08, /* enter global suspend */
66 Cfgr = 0x10, /* forge global resume */
67 Cdbg = 0x20, /* single step, debug */
68 Cmaxp = 0x80, /* max packet */
71 Susbintr = 0x01, /* interrupt */
72 Seintr = 0x02, /* error interrupt */
73 Sresume = 0x04, /* resume detect */
74 Shserr = 0x08, /* host system error */
75 Shcerr = 0x10, /* host controller error */
76 Shalted = 0x20, /* controller halted */
80 Itmout = 0x01, /* timeout or crc */
81 Iresume = 0x02, /* resume interrupt enable */
82 Ioc = 0x04, /* interrupt on complete */
83 Ishort = 0x08, /* short packet interrupt */
87 SOFmod = 0xC, /* start of frame modifier register */
90 PSpresent = 0x0001, /* device present */
91 PSstatuschg = 0x0002, /* PSpresent changed */
92 PSenable = 0x0004, /* device enabled */
93 PSchange = 0x0008, /* PSenable changed */
94 PSresume = 0x0040, /* resume detected */
95 PSreserved1 = 0x0080, /* always read as 1; reserved */
96 PSslow = 0x0100, /* device has low speed */
97 PSreset = 0x0200, /* port reset */
98 PSsuspend = 0x1000, /* port suspended */
100 /* Transfer descriptor link */
101 Tdterm = 0x1, /* nil (terminate) */
102 Tdlinkqh = 0x2, /* link refers to a QH */
103 Tdvf = 0x4, /* run linked Tds first (depth-first)*/
105 /* Transfer status bits */
106 Tdbitstuff = 0x00020000, /* bit stuffing error */
107 Tdcrcto = 0x00040000, /* crc or timeout error */
108 Tdnak = 0x00080000, /* nak packet received */
109 Tdbabble = 0x00100000, /* babble detected */
110 Tddberr = 0x00200000, /* data buf. error */
111 Tdstalled = 0x00400000, /* serious error to ep. */
112 Tdactive = 0x00800000, /* enabled/in use by hw */
113 /* Transfer control bits */
114 Tdioc = 0x01000000, /* interrupt on complete */
115 Tdiso = 0x02000000, /* isochronous select */
116 Tdlow = 0x04000000, /* low speed device */
117 Tderr1 = 0x08000000, /* bit 0 of error counter */
118 Tderr2 = 0x10000000, /* bit 1 of error counter */
119 Tdspd = 0x20000000, /* short packet detect */
121 Tdlen = 0x000003FF, /* actual length field */
123 Tdfatalerr = Tdnak|Tdbabble|Tdstalled, /* hw retries others */
124 Tderrors = Tdfatalerr|Tdbitstuff|Tdcrcto|Tddberr,
126 /* Transfer descriptor token bits */
128 Tddata1 = 0x80000, /* data toggle (1==DATA1) */
133 Tdmaxpkt = 0x800, /* max packet size */
135 /* Queue head bits */
136 QHterm = 1<<0, /* nil (terminate) */
137 QHlinkqh = 1<<1, /* link refers to a QH */
138 QHvf = 1<<2, /* vertical first (depth first) */
143 Lock; /* for ilock. qh lists and basic ctlr I/O */
144 QLock portlck; /* for port resets/enable... */
147 int port; /* I/O address */
148 Qh* qhs; /* list of Qhs for this controller */
149 Qh* qh[Tmax]; /* Dummy Qhs to insert Qhs after */
150 Isoio* iso; /* list of active iso I/O */
151 ulong* frames; /* frame list (used by hw) */
152 ulong load; /* max load for a single frame */
153 ulong isoload; /* max iso load for a single frame */
154 int nintr; /* number of interrupts attended */
155 int ntdintr; /* number of intrs. with something to do */
156 int nqhintr; /* number of intrs. for Qhs */
157 int nisointr; /* number of intrs. for iso transfers */
162 QLock; /* for the entire I/O process */
163 Rendez; /* wait for completion */
164 Qh* qh; /* Td list (field const after init) */
165 int usbid; /* usb address for endpoint/device */
166 int toggle; /* Tddata0/Tddata1 */
167 int tok; /* Tdtoksetup, Tdtokin, Tdtokout */
168 ulong iotime; /* time of last I/O */
169 int debug; /* debug flag from the endpoint */
170 char* err; /* error string */
175 Qio; /* a single Qio for each RPC */
176 uchar* data; /* read from last ctl req. */
177 int ndata; /* number of bytes read */
183 Rendez; /* wait for space/completion/errors */
184 int usbid; /* address used for device/endpoint */
185 int tok; /* Tdtokin or Tdtokout */
186 int state; /* Qrun -> Qdone -> Qrun... -> Qclose */
187 int nframes; /* Nframes/ep->pollival */
188 uchar* data; /* iso data buffers if not embedded */
189 int td0frno; /* frame number for first Td */
190 Td* tdu; /* next td for user I/O in tdps */
191 Td* tdi; /* next td processed by interrupt */
192 char* err; /* error string */
193 int nerrs; /* nb of consecutive I/O errors */
194 long nleft; /* number of bytes left from last write */
195 int debug; /* debug flag from the endpoint */
196 Isoio* next; /* in list of active Isoios */
197 Td* tdps[Nframes]; /* pointer to Td used for i-th frame or nil */
198 int delay; /* maximum number of bytes to buffer */
224 * Queue header (known by hw).
225 * 16-byte aligned. first two words used by hw.
226 * They are taken from the pool upon endpoint opening and
227 * queued after the dummy queue header for the endpoint type
228 * in the controller. Actual I/O happens as Tds are linked into it.
229 * The driver does I/O in lock-step.
230 * The user builds a list of Tds and links it into the Qh,
231 * then the Qh goes from Qidle to Qrun and nobody touches it until
232 * it becomes Qdone at interrupt time.
233 * At that point the user collects the Tds and it goes Qidle.
234 * A premature cancel may set the state to Qclose and abort I/O.
235 * The Ctlr lock protects change of state for Qhs in use.
239 ulong link; /* link to next horiz. item (eg. Qh) */
240 ulong elink; /* link to element (eg. Td; updated by hw) */
242 ulong state; /* Qidle -> Qinstall -> Qrun -> Qdone | Qclose */
243 Qio* io; /* for this queue */
245 Qh* next; /* in active or free list */
246 Td* tds; /* Td list in this Qh (initially, elink) */
247 char* tag; /* debug and align, mostly */
251 * Transfer descriptor.
252 * 16-byte aligned. first two words used by hw. Next 4 by sw.
253 * We keep an embedded buffer for small I/O transfers.
254 * They are taken from the pool when buffers are needed for I/O
255 * and linked at the Qh/Isoio for the endpoint and direction requiring it.
256 * The block keeps actual data. They are protected from races by
257 * the queue or the pool keeping it. The owner of the link to the Td
258 * is free to use it and can be the only one using it.
262 ulong link; /* Link to next Td or Qh */
263 ulong csw; /* control and status word (updated by hw) */
264 ulong token; /* endpt, device, pid */
265 ulong buffer; /* buffer pointer */
267 Td* next; /* in qh or Isoio or free list */
268 ulong ndata; /* bytes available/used at data */
269 uchar* data; /* pointer to actual data */
270 void* buff; /* allocated data, for large transfers */
272 uchar sbuff[Tdndata]; /* embedded buffer, for small transfers */
275 #define INB(x) inb(ctlr->port+(x))
276 #define INS(x) ins(ctlr->port+(x))
277 #define INL(x) inl(ctlr->port+(x))
278 #define OUTB(x, v) outb(ctlr->port+(x), (v))
279 #define OUTS(x, v) outs(ctlr->port+(x), (v))
280 #define OUTL(x, v) outl(ctlr->port+(x), (v))
281 #define TRUNC(x, sz) ((x) & ((sz)-1))
282 #define PTR(q) ((void*)KADDR((ulong)(q) & ~ (0xF|PCIWINDOW)))
283 #define QPTR(q) ((Qh*)PTR(q))
284 #define TPTR(q) ((Td*)PTR(q))
285 #define PORT(p) (Portsc0 + 2*(p))
286 #define diprint if(debug || iso->debug)print
287 #define ddiprint if(debug>1 || iso->debug>1)print
288 #define dqprint if(debug || (qh->io && qh->io->debug))print
289 #define ddqprint if(debug>1 || (qh->io && qh->io->debug>1))print
291 static Ctlr* ctlrs[Nhcis];
293 static Tdpool tdpool;
294 static Qhpool qhpool;
297 static char* qhsname[] = { "idle", "install", "run", "done", "close", "FREE" };
300 uhcicmd(Ctlr *ctlr, int c)
306 uhcirun(Ctlr *ctlr, int on)
310 ddprint("uhci %#ux setting run to %d\n", ctlr->port, on);
313 uhcicmd(ctlr, INS(Cmd)|Crun);
315 uhcicmd(ctlr, INS(Cmd) & ~Crun);
316 for(i = 0; i < 100; i++)
317 if(on == 0 && (INS(Status) & Shalted) != 0)
319 else if(on != 0 && (INS(Status) & Shalted) == 0)
324 dprint("uhci %#x run cmd timed out\n", ctlr->port);
325 ddprint("uhci %#ux cmd %#ux sts %#ux\n",
326 ctlr->port, INS(Cmd), INS(Status));
332 return (td->csw+1) & Tdlen;
338 return ((td->token>>21)+1) & (Tdmaxpkt-1);
344 return td->token & 0xFF;
348 seprinttd(char *s, char *se, Td *td)
350 s = seprint(s, se, "%#p link %#ulx", td, td->link);
351 if((td->link & Tdvf) != 0)
352 s = seprint(s, se, "V");
353 if((td->link & Tdterm) != 0)
354 s = seprint(s, se, "T");
355 if((td->link & Tdlinkqh) != 0)
356 s = seprint(s, se, "Q");
357 s = seprint(s, se, " csw %#ulx ", td->csw);
358 if(td->csw & Tdactive)
359 s = seprint(s, se, "a");
361 s = seprint(s, se, "I");
363 s = seprint(s, se, "i");
365 s = seprint(s, se, "l");
366 if((td->csw & (Tderr1|Tderr2)) == 0)
367 s = seprint(s, se, "z");
368 if(td->csw & Tderrors)
369 s = seprint(s, se, " err %#ulx", td->csw & Tderrors);
370 if(td->csw & Tdstalled)
371 s = seprint(s, se, "s");
372 if(td->csw & Tddberr)
373 s = seprint(s, se, "d");
374 if(td->csw & Tdbabble)
375 s = seprint(s, se, "b");
377 s = seprint(s, se, "n");
378 if(td->csw & Tdcrcto)
379 s = seprint(s, se, "c");
380 if(td->csw & Tdbitstuff)
381 s = seprint(s, se, "B");
382 s = seprint(s, se, " stslen %d", tdlen(td));
384 s = seprint(s, se, " token %#ulx", td->token);
385 if(td->token == 0) /* the BWS loopback Td, ignore rest */
387 s = seprint(s, se, " maxlen %d", maxtdlen(td));
388 if(td->token & Tddata1)
389 s = seprint(s, se, " d1");
391 s = seprint(s, se, " d0");
392 s = seprint(s, se, " id %#ulx:", (td->token>>15) & Epmax);
393 s = seprint(s, se, "%#ulx", (td->token>>8) & Devmax);
396 s = seprint(s, se, " in");
399 s = seprint(s, se, " out");
402 s = seprint(s, se, " setup");
405 s = seprint(s, se, " BADPID");
407 s = seprint(s, se, "\n\t buffer %#ulx data %#p", td->buffer, td->data);
408 s = seprint(s, se, " ndata %uld sbuff %#p buff %#p",
409 td->ndata, td->sbuff, td->buff);
411 s = seprintdata(s, se, td->data, td->ndata);
416 isodump(Isoio *iso, int all)
422 print("iso %#p %s state %d nframes %d"
423 " td0 %#p tdu %#p tdi %#p data %#p\n",
424 iso, iso->tok == Tdtokin ? "in" : "out",
425 iso->state, iso->nframes, iso->tdps[iso->td0frno],
426 iso->tdu, iso->tdi, iso->data);
428 print("\terr='%s'\n", iso->err);
430 seprinttd(buf, buf+sizeof(buf), iso->tdu);
431 print("\ttdu %s\n", buf);
432 seprinttd(buf, buf+sizeof(buf), iso->tdi);
433 print("\ttdi %s\n", buf);
435 td = iso->tdps[iso->td0frno];
436 for(i = 0; i < iso->nframes; i++){
437 seprinttd(buf, buf+sizeof(buf), td);
442 print("\t%s\n", buf);
449 sameptr(void *p, ulong l)
457 dumptd(Td *td, char *pref)
465 se = buf+sizeof(buf);
466 for(; td != nil; td = td->next){
467 s = seprinttd(buf, se, td);
468 if(!sameptr(td->next, td->link))
469 seprint(s, se, " next %#p != link %#ulx %#p",
470 td->next, td->link, TPTR(td->link));
471 print("%std %s\n", pref, buf);
473 print("...more tds...\n");
480 qhdump(Qh *qh, char *pref)
489 se = buf+sizeof(buf);
490 s = seprint(s, se, "%sqh %s %#p state %s link %#ulx", pref,
491 qh->tag, qh, qhsname[qh->state], qh->link);
492 if(!sameptr(qh->tds, qh->elink))
493 s = seprint(s, se, " [tds %#p != elink %#ulx %#p]",
494 qh->tds, qh->elink, TPTR(qh->elink));
495 if(!sameptr(qh->next, qh->link))
496 s = seprint(s, se, " [next %#p != link %#ulx %#p]",
497 qh->next, qh->link, QPTR(qh->link));
498 if((qh->link & Tdterm) != 0)
499 s = seprint(s, se, "T");
500 if((qh->link & Tdlinkqh) != 0)
501 s = seprint(s, se, "Q");
502 s = seprint(s, se, " elink %#ulx", qh->elink);
503 if((qh->elink & Tdterm) != 0)
504 s = seprint(s, se, "T");
505 if((qh->elink & Tdlinkqh) != 0)
506 s = seprint(s, se, "Q");
507 s = seprint(s, se, " io %#p", qh->io);
508 if(qh->io != nil && qh->io->err != nil)
509 seprint(s, se, " err='%s'", qh->io->err);
511 dumptd(qh->tds, "\t");
512 if((qh->elink & QHterm) == 0){
515 for(td = qh->elink; (td & Tdterm) == 0; td = TPTR(td)->link){
517 if(td == TPTR(td)->link) /* BWS Td */
529 xdump(Ctlr *ctlr, int doilock)
536 if(ctlr == ctlrs[0]){
538 print("tds: alloc %d = inuse %d + free %d\n",
539 tdpool.nalloc, tdpool.ninuse, tdpool.nfree);
542 print("qhs: alloc %d = inuse %d + free %d\n",
543 qhpool.nalloc, qhpool.ninuse, qhpool.nfree);
548 print("uhci port %#x frames %#p nintr %d ntdintr %d",
549 ctlr->port, ctlr->frames, ctlr->nintr, ctlr->ntdintr);
550 print(" nqhintr %d nisointr %d\n", ctlr->nqhintr, ctlr->nisointr);
551 print("cmd %#ux sts %#ux fl %#ulx ps1 %#ux ps2 %#ux frames[0] %#ulx\n",
552 INS(Cmd), INS(Status),
553 INL(Flbaseadd), INS(PORT(0)), INS(PORT(1)),
555 for(iso = ctlr->iso; iso != nil; iso = iso->next)
558 for(qh = ctlr->qhs; qh != nil; qh = qh->next){
584 if(tdpool.free == nil){
585 ddprint("uhci: tdalloc %d Tds\n", Incr);
586 pool = xspanalloc(Incr*ROUND(sizeof(Td), Align), Align, 0);
589 for(i=Incr; --i>=0;){
590 td = (Td*)(pool + i*ROUND(sizeof(Td), Align));
591 td->next = tdpool.free;
594 tdpool.nalloc += Incr;
595 tdpool.nfree += Incr;
598 tdpool.free = td->next;
603 memset(td, 0, sizeof(Td));
605 assert(((uintptr)td & 0xF) == 0);
617 td->next = tdpool.free;
625 qhlinkqh(Qh* qh, Qh* next)
630 next->link = qh->link;
631 next->next = qh->next;
632 qh->link = PCIWADDR(next)|QHlinkqh;
638 qhlinktd(Qh *qh, Td *td)
642 qh->elink = QHvf|QHterm;
644 qh->elink = PCIWADDR(td);
648 tdlinktd(Td *td, Td *next)
654 td->link = PCIWADDR(next)|Tdvf;
658 qhalloc(Ctlr *ctlr, Qh *prev, Qio *io, char *tag)
665 if(qhpool.free == nil){
666 ddprint("uhci: qhalloc %d Qhs\n", Incr);
667 pool = xspanalloc(Incr*ROUND(sizeof(Qh), Align), Align, 0);
670 for(i=Incr; --i>=0;){
671 qh = (Qh*)(pool + i*ROUND(sizeof(Qh), Align));
672 qh->next = qhpool.free;
675 qhpool.nalloc += Incr;
676 qhpool.nfree += Incr;
679 qhpool.free = qh->next;
691 kstrdup(&qh->tag, tag);
700 assert(((uintptr)qh & 0xF) == 0);
705 qhfree(Ctlr *ctlr, Qh *qh)
711 for(q = ctlr->qhs; q != nil; q = q->next)
715 panic("qhfree: nil q");
718 qh->state = Qfree; /* paranoia */
721 while((td = qh->tds) != nil){
727 qh->next = qhpool.free;
734 ddprint("qhfree: qh %#p\n", qh);
743 return "crc/timeout error";
745 return "babble detected";
749 return "bit stuffing error";
761 return iso->state == Qclose ||
762 (iso->state == Qrun &&
763 iso->tok == Tdtokin && iso->tdi != iso->tdu);
772 return iso->state == Qclose ||
773 (iso->state == Qrun &&
774 iso->tok == Tdtokout && iso->tdu->next != iso->tdi);
785 if(iso->state == Qclose || iso->err || iso->delay == 0)
789 for(tdi = iso->tdi; tdi->next != iso->tdu; tdi = tdi->next){
790 if((tdi->csw & Tdactive) == 0)
792 delay += maxtdlen(tdi);
793 if(delay > iso->delay)
797 return delay <= iso->delay;
801 tdisoinit(Isoio *iso, Td *td, long count)
804 td->token = ((count-1)<<21)| ((iso->usbid & 0x7FF)<<8) | iso->tok;
805 td->csw = Tderr1|Tdiso|Tdactive|Tdioc;
809 * Process Iso i/o on interrupt. For writes update just error status.
810 * For reads update tds to reflect data and also error status.
811 * When tdi aproaches tdu, advance tdu; data may be lost.
812 * (If nframes is << Nframes tdu might be far away but this avoids
813 * races regarding frno.)
814 * If we suffer errors for more than half the frames we stall.
817 isointerrupt(Ctlr *ctlr, Isoio* iso)
825 if((tdi->csw & Tdactive) != 0) /* nothing new done */
828 ddiprint("isointr: iso %#p: tdi %#p tdu %#p\n", iso, tdi, iso->tdu);
829 if(iso->state != Qrun && iso->state != Qdone)
830 panic("isointr: iso state");
831 if(debug > 1 || iso->debug > 1)
834 nframes = iso->nframes / 2; /* limit how many we look */
837 for(i = 0; i < nframes && (tdi->csw & Tdactive) == 0; i++){
839 err = tdi->csw & Tderrors;
842 else if(iso->nerrs++ > iso->nframes/2)
843 tdi->csw |= Tdstalled;
844 if((tdi->csw & Tdstalled) != 0){
846 iso->err = errmsg(err);
847 diprint("isointerrupt: tdi %#p error %#ux %s\n",
849 diprint("ctlr load %uld\n", ctlr->load);
853 tdi->ndata = tdlen(tdi);
855 if(tdi->next == iso->tdu || tdi->next->next == iso->tdu){
856 memset(iso->tdu->data, 0, maxtdlen(iso->tdu));
857 tdisoinit(iso, iso->tdu, maxtdlen(iso->tdu));
858 iso->tdu = iso->tdu->next;
863 ddiprint("isointr: %d frames processed\n", i);
867 if(isocanwrite(iso) || isocanread(iso)){
868 diprint("wakeup iso %#p tdi %#p tdu %#p\n", iso,
875 * Process a Qh upon interrupt. There's one per ongoing user I/O.
876 * User process releases resources later, that is not done here.
877 * We may find in this order one or more Tds:
878 * - none/many non active and completed Tds
879 * - none/one (usually(!) not active) and failed Td
880 * - none/many active Tds.
881 * Upon errors the entire transfer is aborted and error reported.
882 * Otherwise, the transfer is complete only when all Tds are done or
883 * when a read with less than maxpkt is found.
884 * Use the software list and not qh->elink to avoid races.
885 * We could use qh->elink to see if there's something new or not.
888 qhinterrupt(Ctlr *ctlr, Qh *qh)
894 if(qh->state != Qrun)
895 panic("qhinterrupt: qh state");
897 panic("qhinterrupt: no tds");
898 if((qh->tds->csw & Tdactive) == 0)
899 ddqprint("qhinterrupt port %#ux qh %#p p0 %#x p1 %#x\n",
900 ctlr->port, qh, INS(PORT(0)), INS(PORT(1)));
901 for(td = qh->tds; td != nil; td = td->next){
902 if(td->csw & Tdactive)
905 if((td->csw & Tdstalled) != 0){
906 err = td->csw & Tderrors;
907 /* just stalled is end of xfer but not an error */
908 if(err != Tdstalled && qh->io->err == nil){
909 qh->io->err = errmsg(td->csw & Tderrors);
910 dqprint("qhinterrupt: td %#p error %#ux %s\n",
911 td, err, qh->io->err);
912 dqprint("ctlr load %uld\n", ctlr->load);
916 if((td->csw & Tdnak) != 0){ /* retransmit; not serious */
921 td->ndata = tdlen(td);
922 if(td->ndata < maxtdlen(td)){ /* EOT */
929 * Done. Make void the Tds not used (errors or EOT) and wakeup epio.
932 for(; td != nil; td = td->next)
939 interrupt(Ureg*, void *a)
955 if((sts & Sall) == 0){ /* not for us; sharing irq */
959 OUTS(Status, sts & Sall);
962 iprint("uhci %#ux: not running: uhci bug?\n", ctlr->port);
963 /* BUG: should abort everything in this case */
966 frptr = INL(Flbaseadd);
968 frno = TRUNC(frno, Nframes);
969 iprint("cmd %#ux sts %#ux frptr %#ux frno %d\n",
970 cmd, sts, frptr, frno);
974 * Will we know in USB 3.0 who the interrupt was for?.
975 * Do they still teach indexing in CS?
976 * This is Intel's doing.
978 for(iso = ctlr->iso; iso != nil; iso = iso->next)
979 if(iso->state == Qrun || iso->state == Qdone)
980 isointerrupt(ctlr, iso);
981 for(qh = ctlr->qhs; qh != nil; qh = qh->next)
982 if(qh->state == Qrun)
983 qhinterrupt(ctlr, qh);
984 else if(qh->state == Qclose)
990 * iso->tdu is the next place to put data. When it gets full
991 * it is activated and tdu advanced.
994 putsamples(Ctlr *ctlr, Isoio *iso, uchar *b, long count)
999 for(tot = 0; isocanwrite(iso) && tot < count; tot += n){
1003 if(n > maxtdlen(tdu) - left)
1004 n = maxtdlen(tdu) - left;
1005 iunlock(ctlr); /* can pagefault here */
1006 memmove(tdu->data+left, b+tot, n);
1011 if(iso->nleft == maxtdlen(tdu)){
1012 tdisoinit(iso, tdu, iso->nleft);
1013 iso->tdu = tdu->next;
1021 * Queue data for writing and return error status from
1022 * last writes done, to maintain buffered data.
1025 episowrite(Ep *ep, Isoio *iso, void *a, long count)
1033 iso->debug = ep->debug;
1034 iso->delay = ep->sampledelay * ep->samplesz;
1035 diprint("uhci: episowrite: %#p ep%d.%d\n", iso, ep->dev->nb, ep->nb);
1044 if(iso->state == Qclose){
1046 error(iso->err ? iso->err : Eio);
1050 for(tot = 0; tot < count; tot += nw){
1051 while(isocanwrite(iso) == 0){
1053 diprint("uhci: episowrite: %#p sleep\n", iso);
1056 iso->err = "I/O timed out";
1060 tsleep(iso, isocanwrite, iso, ep->tmout);
1066 if(iso->state == Qclose || err != nil){
1068 error(err ? err : Eio);
1070 if(iso->state != Qrun)
1071 panic("episowrite: iso not running");
1072 nw = putsamples(ctlr, iso, b+tot, count-tot);
1074 while(isodelay(iso) == 0){
1076 sleep(iso, isodelay, iso);
1079 if(iso->state != Qclose)
1082 err = iso->err; /* in case it failed early */
1088 diprint("uhci: episowrite: %#p %d bytes\n", iso, tot);
1093 * Available data is kept at tdu and following tds, up to tdi (excluded).
1096 episoread(Ep *ep, Isoio *iso, void *a, int count)
1104 iso->debug = ep->debug;
1105 diprint("uhci: episoread: %#p ep%d.%d\n", iso, ep->dev->nb, ep->nb);
1117 if(iso->state == Qclose){
1119 error(iso->err ? iso->err : Eio);
1122 while(isocanread(iso) == 0){
1124 diprint("uhci: episoread: %#p sleep\n", iso);
1127 iso->err = "I/O timed out";
1131 tsleep(iso, isocanread, iso, ep->tmout);
1135 if(iso->state == Qclose){
1137 error(iso->err ? iso->err : Eio);
1141 for(tot = 0; iso->tdi != iso->tdu && tot < count; tot += nr){
1143 if(tdu->csw & Tdactive){
1144 diprint("uhci: episoread: %#p tdu active\n", iso);
1148 if(tot + nr > count)
1151 print("uhci: ep%d.%d: too many polls\n",
1152 ep->dev->nb, ep->nb);
1154 iunlock(ctlr); /* We could page fault here */
1155 memmove(b+tot, tdu->data, nr);
1160 memmove(tdu->data, tdu->data+nr, tdu->ndata - nr);
1163 if(tdu->ndata == 0){
1164 tdisoinit(iso, tdu, ep->maxpkt);
1165 iso->tdu = tdu->next;
1171 diprint("uhci: episoread: %#p %d bytes err '%s'\n", iso, tot, iso->err);
1187 epgettd(Ep *ep, Qio *io, int flags, void *a, int count)
1192 if(ep->maxpkt < count)
1193 error("maxpkt too short");
1195 if(count <= Tdndata)
1196 td->data = td->sbuff;
1198 td->data = td->buff = smalloc(ep->maxpkt);
1199 td->buffer = PCIWADDR(td->data);
1201 if(a != nil && count > 0)
1202 memmove(td->data, a, count);
1203 td->csw = Tderr2|Tderr1|flags;
1204 if(ep->dev->speed == Lowspeed)
1206 tok = io->tok | io->toggle;
1207 io->toggle = nexttoggle(io->toggle);
1208 td->token = ((count-1)<<21) | ((io->usbid&0x7FF)<<8) | tok;
1214 * Try to get them idle
1223 for(td = qh->tds; td != nil; td = td->next){
1224 if(td->csw & Tdactive){
1226 td->csw &= ~(Tdactive|Tdioc);
1238 return qh->state != Qrun;
1242 epiowait(Ctlr *ctlr, Qio *io, int tmout, ulong load)
1248 ddqprint("uhci io %#p sleep on qh %#p state %uld\n", io, qh, qh->state);
1251 dqprint("uhci io %#p qh %#p timed out\n", io, qh);
1255 sleep(io, epiodone, qh);
1257 tsleep(io, epiodone, qh, tmout);
1261 if(qh->state == Qrun)
1263 else if(qh->state != Qdone && qh->state != Qclose)
1264 panic("epio: queue not done and not closed");
1269 io->err = "request timed out";
1273 tsleep(&up->sleep, return0, 0, Abortdelay);
1277 if(qh->state != Qclose)
1286 * To make it work for control transfers, the caller may
1287 * lock the Qio for the entire control transfer.
1290 epio(Ep *ep, Qio *io, void *a, long count, int mustlock)
1292 Td *td, *ltd, *td0, *ntd;
1298 int saved, ntds, tmout;
1303 io->debug = ep->debug;
1305 ddeprint("epio: %s ep%d.%d io %#p count %ld load %uld\n",
1306 io->tok == Tdtokin ? "in" : "out",
1307 ep->dev->nb, ep->nb, io, count, ctlr->load);
1308 if((debug > 1 || ep->debug > 1) && io->tok != Tdtokin){
1309 seprintdata(buf, buf+sizeof(buf), a, count);
1310 print("uchi epio: user data: %s\n", buf);
1322 if(qh == nil || qh->state == Qclose){ /* Tds released by cancelio */
1324 error(io->err ? io->err : Eio);
1326 if(qh->state != Qidle)
1327 panic("epio: qh not idle");
1328 qh->state = Qinstall;
1338 if(c != nil && io->tok != Tdtokin)
1339 td = epgettd(ep, io, Tdactive, c+tot, n);
1341 td = epgettd(ep, io, Tdactive|Tdspd, nil, n);
1349 }while(tot < count);
1350 if(td0 == nil || ltd == nil)
1351 panic("epio: no td");
1353 ltd->csw |= Tdioc; /* the last one interrupts */
1354 ddeprint("uhci: load %uld ctlr load %uld\n", load, ctlr->load);
1356 if(qh->state != Qclose){
1357 io->iotime = TK2MS(MACHP(0)->ticks);
1365 epiowait(ctlr, io, tmout, load);
1367 if(debug > 1 || ep->debug > 1)
1368 dumptd(td0, "epio: got tds: ");
1376 for(td = td0; td != nil; td = ntd){
1379 * Use td tok, not io tok, because of setup packets.
1380 * Also, if the Td was stalled or active (previous Td
1381 * was a short packet), we must save the toggle as it is.
1383 if(td->csw & (Tdstalled|Tdactive)){
1385 io->toggle = td->token & Tddata1;
1388 if(err == nil && n < 0)
1390 if(err == nil && n > 0 && tot < count){
1391 if((tot + n) > count)
1393 if(c != nil && tdtok(td) == Tdtokin){
1394 memmove(c, td->data, n);
1407 ddeprint("epio: io %#p: %d tds: return %ld err '%s'\n",
1408 io, ntds, tot, err);
1415 * halt condition was cleared on the endpoint. update our toggles.
1427 if(ep->mode != OREAD){
1429 io[OWRITE].toggle = Tddata0;
1430 deprint("ep clrhalt for io %#p\n", io+OWRITE);
1431 qunlock(&io[OWRITE]);
1433 if(ep->mode != OWRITE){
1435 io[OREAD].toggle = Tddata0;
1436 deprint("ep clrhalt for io %#p\n", io+OREAD);
1437 qunlock(&io[OREAD]);
1444 epread(Ep *ep, void *a, long count)
1452 ddeprint("uhci: epread\n");
1454 panic("epread: not open");
1464 ddeprint("epread ctl ndata %d\n", cio->ndata);
1466 error("request expected");
1467 else if(cio->ndata == 0){
1471 if(count > cio->ndata)
1474 memmove(a, cio->data, count);
1475 /* BUG for big transfers */
1478 cio->ndata = 0; /* signal EOF next time */
1482 if(debug>1 || ep->debug){
1483 seprintdata(buf, buf+sizeof(buf), a, count);
1484 print("epread: %s\n", buf);
1491 return epio(ep, &io[OREAD], a, count, 1);
1494 delta = TK2MS(MACHP(0)->ticks) - io[OREAD].iotime + 1;
1495 if(delta < ep->pollival / 2)
1496 tsleep(&up->sleep, return0, 0, ep->pollival/2 - delta);
1499 return epio(ep, &io[OREAD], a, count, 1);
1502 return episoread(ep, iso, a, count);
1504 panic("epread: bad ep ttype %d", ep->ttype);
1510 * Control transfers are one setup write (data0)
1511 * plus zero or more reads/writes (data1, data0, ...)
1512 * plus a final write/read with data1 to ack.
1513 * For both host to device and device to host we perform
1514 * the entire transfer when the user writes the request,
1515 * and keep any data read from the device for a later read.
1516 * We call epio three times instead of placing all Tds at
1517 * the same time because doing so leads to crc/tmout errors
1519 * Upon errors on the data phase we must still run the status
1520 * phase or the device may cease responding in the future.
1523 epctlio(Ep *ep, Ctlio *cio, void *a, long count)
1528 ddeprint("epctlio: cio %#p ep%d.%d count %ld\n",
1529 cio, ep->dev->nb, ep->nb, count);
1530 if(count < Rsetuplen)
1531 error("short usb comand");
1544 /* set the address if unset and out of configuration state */
1545 if(ep->dev->state != Dconfig && ep->dev->state != Dreset)
1547 cio->usbid = ((ep->nb&Epmax)<<7)|(ep->dev->nb&Devmax);
1549 cio->tok = Tdtoksetup;
1550 cio->toggle = Tddata0;
1551 if(epio(ep, cio, a, Rsetuplen, 0) < Rsetuplen)
1556 cio->toggle = Tddata1;
1557 if(c[Rtype] & Rd2h){
1559 len = GET2(c+Rcount);
1561 error("bad length in d2h request");
1563 error("d2h data too large to fit in uhci");
1564 a = cio->data = smalloc(len+1);
1566 cio->tok = Tdtokout;
1573 len = epio(ep, cio, a, len, 0);
1576 if(c[Rtype] & Rd2h){
1579 cio->tok = Tdtokout;
1584 count = Rsetuplen + len;
1587 cio->toggle = Tddata1;
1588 epio(ep, cio, nil, 0, 0);
1591 ddeprint("epctlio cio %#p return %ld\n", cio, count);
1596 epwrite(Ep *ep, void *a, long count)
1606 ddeprint("uhci: epwrite ep%d.%d\n", ep->dev->nb, ep->nb);
1608 panic("uhci: epwrite: not open");
1612 return epctlio(ep, cio, a, count);
1618 * Put at most Tdatomic Tds (512 bytes) at a time.
1619 * Otherwise some devices produce babble errors.
1622 for(tot = 0; tot < count ; tot += nw){
1624 if(nw > Tdatomic * ep->maxpkt)
1625 nw = Tdatomic * ep->maxpkt;
1626 nw = epio(ep, &io[OWRITE], b+tot, nw, 1);
1631 delta = TK2MS(MACHP(0)->ticks) - io[OWRITE].iotime + 1;
1632 if(delta < ep->pollival)
1633 tsleep(&up->sleep, return0, 0, ep->pollival - delta);
1636 return epio(ep, &io[OWRITE], a, count, 1);
1639 return episowrite(ep, iso, a, count);
1641 panic("uhci: epwrite: bad ep ttype %d", ep->ttype);
1658 if(ep->mode == ORDWR)
1659 error("iso i/o is half-duplex");
1662 iso->debug = ep->debug;
1663 iso->next = nil; /* paranoia */
1664 if(ep->mode == OREAD)
1667 iso->tok = Tdtokout;
1668 iso->usbid = ((ep->nb & Epmax)<<7)|(ep->dev->nb & Devmax);
1670 iso->nframes = Nframes/ep->pollival;
1671 if(iso->nframes < 3)
1672 error("uhci isoopen bug"); /* we need at least 3 tds */
1675 if(ctlr->load + ep->load > 800)
1676 print("usb: uhci: bandwidth may be exceeded\n");
1677 ctlr->load += ep->load;
1678 ctlr->isoload += ep->load;
1679 dprint("uhci: load %uld isoload %uld\n", ctlr->load, ctlr->isoload);
1683 * From here on this cannot raise errors
1684 * unless we catch them and release here all memory allocated.
1686 if(ep->maxpkt > Tdndata)
1687 iso->data = smalloc(iso->nframes*ep->maxpkt);
1689 frno = INS(Frnum) + 10; /* start 10ms ahead */
1690 frno = TRUNC(frno, Nframes);
1692 iso->td0frno = frno;
1695 for(i = 0; i < iso->nframes; i++){
1696 td = iso->tdps[frno] = tdalloc();
1697 if(ep->mode == OREAD)
1700 size = (ep->hz+left) * ep->pollival / 1000;
1701 size *= ep->samplesz;
1702 left = (ep->hz+left) * ep->pollival % 1000;
1703 if(size > ep->maxpkt){
1704 print("uhci: ep%d.%d: size > maxpkt\n",
1705 ep->dev->nb, ep->nb);
1706 print("size = %d max = %ld\n", size, ep->maxpkt);
1711 td->data = iso->data + i * ep->maxpkt;
1713 td->data = td->sbuff;
1714 td->buffer = PCIWADDR(td->data);
1715 tdisoinit(iso, td, size);
1719 frno = TRUNC(frno+ep->pollival, Nframes);
1721 ltd->next = iso->tdps[iso->td0frno];
1722 iso->tdi = iso->tdps[iso->td0frno];
1723 iso->tdu = iso->tdi;
1725 frno = iso->td0frno;
1726 for(i = 0; i < iso->nframes; i++){
1727 iso->tdps[frno]->link = ctlr->frames[frno];
1728 frno = TRUNC(frno+ep->pollival, Nframes);
1731 frno = iso->td0frno;
1732 for(i = 0; i < iso->nframes; i++){
1733 ctlr->frames[frno] = PCIWADDR(iso->tdps[frno]);
1734 frno = TRUNC(frno+ep->pollival, Nframes);
1736 iso->next = ctlr->iso;
1740 if(debug > 1 || iso->debug >1)
1745 * Allocate the endpoint and set it up for I/O
1746 * in the controller. This must follow what's said
1747 * in Ep regarding configuration, including perhaps
1748 * the saved toggles (saved on a previous close of
1749 * the endpoint data file by epclose).
1761 deprint("uhci: epopen ep%d.%d\n", ep->dev->nb, ep->nb);
1763 panic("uhci: epopen called with open ep");
1769 if(ep->maxpkt > Tdmaxpkt){
1770 print("uhci: maxkpkt too large: using %d\n", Tdmaxpkt);
1771 ep->maxpkt = Tdmaxpkt;
1773 cqh = ctlr->qh[ep->ttype];
1776 error("endpoint not configured");
1778 ep->aux = smalloc(sizeof(Isoio));
1782 cio = ep->aux = smalloc(sizeof(Ctlio));
1783 cio->debug = ep->debug;
1786 if(ep->dev->isroot != 0 && ep->nb == 0) /* root hub */
1788 cio->qh = qhalloc(ctlr, cqh, cio, "epc");
1792 io = ep->aux = smalloc(sizeof(Qio)*2);
1793 io[OREAD].debug = io[OWRITE].debug = ep->debug;
1794 usbid = ((ep->nb&Epmax)<<7)|(ep->dev->nb &Devmax);
1795 if(ep->mode != OREAD){
1796 if(ep->toggle[OWRITE] != 0)
1797 io[OWRITE].toggle = Tddata1;
1799 io[OWRITE].toggle = Tddata0;
1800 io[OWRITE].tok = Tdtokout;
1801 io[OWRITE].qh = qhalloc(ctlr, cqh, io+OWRITE, "epw");
1802 io[OWRITE].usbid = usbid;
1804 if(ep->mode != OWRITE){
1805 if(ep->toggle[OREAD] != 0)
1806 io[OREAD].toggle = Tddata1;
1808 io[OREAD].toggle = Tddata0;
1809 io[OREAD].tok = Tdtokin;
1810 io[OREAD].qh = qhalloc(ctlr, cqh, io+OREAD, "epr");
1811 io[OREAD].usbid = usbid;
1815 if(debug>1 || ep->debug)
1817 deprint("uhci: epopen done\n");
1822 cancelio(Ctlr *ctlr, Qio *io)
1828 if(qh == nil || qh->state == Qclose){
1832 dqprint("uhci: cancelio for qh %#p state %s\n",
1833 qh, qhsname[qh->state]);
1840 tsleep(&up->sleep, return0, 0, Abortdelay);
1845 /* wait for epio if running */
1854 cancelisoio(Ctlr *ctlr, Isoio *iso, int pollival, ulong load)
1863 if(iso->state == Qclose){
1867 if(iso->state != Qrun && iso->state != Qdone)
1868 panic("bad iso state");
1869 iso->state = Qclose;
1870 if(ctlr->isoload < load)
1871 panic("uhci: low isoload");
1872 ctlr->isoload -= load;
1874 for(il = &ctlr->iso; *il != nil; il = &(*il)->next)
1878 panic("isocancel: not found");
1880 frno = iso->td0frno;
1881 for(i = 0; i < iso->nframes; i++){
1882 td = iso->tdps[frno];
1883 td->csw &= ~(Tdioc|Tdactive);
1884 for(lp=&ctlr->frames[frno]; !(*lp & Tdterm);
1885 lp = &TPTR(*lp)->link)
1889 panic("cancelisoio: td not found");
1891 frno = TRUNC(frno+pollival, Nframes);
1896 * wakeup anyone waiting for I/O and
1897 * wait to be sure no I/O is in progress in the controller.
1898 * and then wait to be sure episo-io is no longer running.
1901 diprint("cancelisoio iso %#p waiting for I/O to cease\n", iso);
1902 tsleep(&up->sleep, return0, 0, 5);
1905 diprint("cancelisoio iso %#p releasing iso\n", iso);
1907 frno = iso->td0frno;
1908 for(i = 0; i < iso->nframes; i++){
1909 tdfree(iso->tdps[frno]);
1910 iso->tdps[frno] = nil;
1911 frno = TRUNC(frno+pollival, Nframes);
1926 deprint("uhci: epclose ep%d.%d\n", ep->dev->nb, ep->nb);
1929 panic("uhci: epclose called with closed ep");
1933 cancelio(ctlr, cio);
1940 ep->toggle[OREAD] = ep->toggle[OWRITE] = 0;
1941 if(ep->mode != OWRITE){
1942 cancelio(ctlr, &io[OREAD]);
1943 if(io[OREAD].toggle == Tddata1)
1944 ep->toggle[OREAD] = 1;
1946 if(ep->mode != OREAD){
1947 cancelio(ctlr, &io[OWRITE]);
1948 if(io[OWRITE].toggle == Tddata1)
1949 ep->toggle[OWRITE] = 1;
1954 cancelisoio(ctlr, iso, ep->pollival, ep->load);
1957 panic("epclose: bad ttype %d", ep->ttype);
1966 seprintep(char *s, char *e, Ep *ep)
1983 s = seprint(s,e,"cio %#p qh %#p"
1984 " id %#x tog %#x tok %#x err %s\n",
1985 cio, cio->qh, cio->usbid, cio->toggle,
1986 cio->tok, cio->err);
1991 if(ep->mode != OWRITE)
1992 s = seprint(s,e,"r: qh %#p id %#x tog %#x tok %#x err %s\n",
1993 io[OREAD].qh, io[OREAD].usbid, io[OREAD].toggle,
1994 io[OREAD].tok, io[OREAD].err);
1995 if(ep->mode != OREAD)
1996 s = seprint(s,e,"w: qh %#p id %#x tog %#x tok %#x err %s\n",
1997 io[OWRITE].qh, io[OWRITE].usbid, io[OWRITE].toggle,
1998 io[OWRITE].tok, io[OWRITE].err);
2002 s = seprint(s,e,"iso %#p id %#x tok %#x tdu %#p tdi %#p err %s\n",
2003 iso, iso->usbid, iso->tok, iso->tdu, iso->tdi, iso->err);
2011 portenable(Hci *hp, int port, int on)
2018 dprint("uhci: %#x port %d enable=%d\n", ctlr->port, port, on);
2019 ioport = PORT(port-1);
2020 eqlock(&ctlr->portlck);
2022 qunlock(&ctlr->portlck);
2028 OUTS(ioport, s | PSenable);
2030 OUTS(ioport, s & ~PSenable);
2033 tsleep(&up->sleep, return0, 0, Enabledelay);
2034 dprint("uhci %#ux port %d enable=%d: sts %#x\n",
2035 ctlr->port, port, on, INS(ioport));
2036 qunlock(&ctlr->portlck);
2042 portreset(Hci *hp, int port, int on)
2050 dprint("uhci: %#ux port %d reset\n", ctlr->port, port);
2055 OUTS(p, INS(p) & ~PSreset);
2056 OUTS(p, INS(p) | PSenable);
2058 for(i=0; i<1000 && (INS(p) & PSenable) == 0; i++)
2060 OUTS(p, (INS(p) & ~PSreset)|PSenable);
2062 dprint("uhci %#ux after port %d reset: sts %#x\n",
2063 ctlr->port, port, INS(p));
2068 portstatus(Hci *hp, int port)
2076 ioport = PORT(port-1);
2077 eqlock(&ctlr->portlck);
2080 qunlock(&ctlr->portlck);
2085 if(s & (PSstatuschg | PSchange)){
2087 ddprint("uhci %#ux port %d status %#x\n", ctlr->port, port, s);
2090 qunlock(&ctlr->portlck);
2094 * We must return status bits as a
2095 * get port status hub request would do.
2118 static int already = 0;
2128 while(p = pcimatch(p, 0, 0)){
2130 * Find UHCI controllers (Programming Interface = 0).
2132 if(p->ccrb != Pcibcserial || p->ccru != Pciscusb)
2136 io = p->mem[4].bar & ~0x0F;
2142 print("usbuhci: %#x %#x: failed to map registers\n",
2146 if(ioalloc(io, p->mem[4].size, 0, "usbuhci") < 0){
2147 print("usbuhci: port %#ux in use\n", io);
2151 dprint("uhci: %#x %#x: port %#ux size %#x irq %d\n",
2152 p->vid, p->did, io, p->mem[4].size, p->intl);
2154 ctlr = malloc(sizeof(Ctlr));
2157 print("usbuhci: no memory\n");
2162 for(i = 0; i < Nhcis; i++)
2163 if(ctlrs[i] == nil){
2168 print("usbuhci: bug: no more controllers\n");
2173 uhcimeminit(Ctlr *ctlr)
2180 ctlr->qhs = ctlr->qh[Tctl] = qhalloc(ctlr, nil, nil, "CTL");
2181 ctlr->qh[Tintr] = qhalloc(ctlr, ctlr->qh[Tctl], nil, "INT");
2182 ctlr->qh[Tbulk] = qhalloc(ctlr, ctlr->qh[Tintr], nil, "BLK");
2184 /* idle Td from dummy Qh at the end. looped back to itself */
2185 /* This is a workaround for PIIX4 errata 29773804.pdf */
2186 qh = qhalloc(ctlr, ctlr->qh[Tbulk], nil, "BWS");
2188 td->link = PCIWADDR(td);
2191 /* loop (hw only) from the last qh back to control xfers.
2192 * this may be done only for some of them. Disable until ehci comes.
2195 qh->link = PCIWADDR(ctlr->qhs);
2197 frsize = Nframes*sizeof(ulong);
2198 ctlr->frames = xspanalloc(frsize, frsize, 0);
2199 if(ctlr->frames == nil)
2200 panic("uhci reset: no memory");
2203 for(i = 0; i < Nframes; i++)
2204 ctlr->frames[i] = PCIWADDR(ctlr->qhs)|QHlinkqh;
2205 OUTL(Flbaseadd, PCIWADDR(ctlr->frames));
2207 dprint("uhci %#ux flb %#ulx frno %#ux\n", ctlr->port,
2208 INL(Flbaseadd), INS(Frnum));
2219 dprint("uhci %#ux init\n", ctlr->port);
2222 OUTS(Usbintr, Itmout|Iresume|Ioc|Ishort);
2224 dprint("uhci: init: cmd %#ux sts %#ux sof %#ux",
2225 INS(Cmd), INS(Status), INS(SOFmod));
2226 dprint(" flb %#ulx frno %#ux psc0 %#ux psc1 %#ux",
2227 INL(Flbaseadd), INS(Frnum), INS(PORT(0)), INS(PORT(1)));
2228 /* guess other ports */
2229 for(i = 2; i < 6; i++){
2231 if(sts != 0xFFFF && (sts & PSreserved1) == 1){
2232 dprint(" psc%d %#ux", i, sts);
2237 for(i = 0; i < hp->nports; i++)
2243 uhcireset(Ctlr *ctlr)
2249 dprint("uhci %#ux reset\n", ctlr->port);
2252 * Turn off legacy mode. Some controllers won't
2253 * interrupt us as expected otherwise.
2256 pcicfgw16(ctlr->pcidev, 0xc0, 0x2000);
2260 uhcicmd(ctlr, Cgreset); /* global reset */
2262 uhcicmd(ctlr, 0); /* all halt */
2263 uhcicmd(ctlr, Chcreset); /* controller reset */
2264 for(i = 0; i < 100; i++){
2265 if((INS(Cmd) & Chcreset) == 0)
2270 print("uhci %#x controller reset timed out\n", ctlr->port);
2276 setdebug(Hci*, int d)
2297 static Lock resetlck;
2302 if(getconf("*nousbuhci"))
2309 * Any adapter matches if no hp->port is supplied,
2310 * otherwise the ports must match.
2313 for(i = 0; i < Nhcis && ctlrs[i] != nil; i++){
2315 if(ctlr->active == 0)
2316 if(hp->port == 0 || hp->port == ctlr->port){
2322 if(ctlrs[i] == nil || i == Nhcis)
2327 hp->port = ctlr->port;
2330 hp->nports = 2; /* default */
2336 * Linkage to the generic HCI driver.
2340 hp->interrupt = interrupt;
2341 hp->epopen = epopen;
2342 hp->epclose = epclose;
2343 hp->epread = epread;
2344 hp->epwrite = epwrite;
2345 hp->seprintep = seprintep;
2346 hp->portenable = portenable;
2347 hp->portreset = portreset;
2348 hp->portstatus = portstatus;
2349 hp->shutdown = shutdown;
2350 hp->debug = setdebug;
2354 * IRQ2 doesn't really exist, it's used to gang the interrupt
2355 * controllers together. A device set to IRQ2 will appear on
2356 * the second interrupt controller as IRQ9.
2360 intrenable(hp->irq, hp->interrupt, hp, hp->tbdf, hp->type);
2368 addhcitype("uhci", reset);