123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227 |
- /* override default macros from ../port/usb.h */
- #undef dprint
- #undef ddprint
- #undef deprint
- #undef ddeprint
- #define dprint if(ehcidebug)print
- #define ddprint if(ehcidebug>1)print
- #define deprint if(ehcidebug || ep->debug)print
- #define ddeprint if(ehcidebug>1 || ep->debug>1)print
- typedef struct Ctlr Ctlr;
- typedef struct Ecapio Ecapio;
- typedef struct Edbgio Edbgio;
- typedef struct Eopio Eopio;
- typedef struct Isoio Isoio;
- typedef struct Poll Poll;
- typedef struct Qh Qh;
- typedef struct Qtree Qtree;
- #pragma incomplete Ctlr;
- #pragma incomplete Ecapio;
- #pragma incomplete Edbgio;
- #pragma incomplete Eopio;
- #pragma incomplete Isoio;
- #pragma incomplete Poll;
- #pragma incomplete Qh;
- #pragma incomplete Qtree;
- /*
- * EHCI interface registers and bits
- */
- enum
- {
- /* Ecapio->parms reg. */
- Cnports = 0xF, /* nport bits */
- Cdbgportshift = 20, /* debug port */
- Cdbgportmask = 0xF,
- /* Ecapio->capparms bits */
- C64 = 1<<0, /* 64-bits */
- Cpfl = 1<<1, /* program'ble frame list: can be <1024 */
- Casp = 1<<2, /* asynch. sched. park */
- Ceecpshift = 8, /* extended capabilities ptr. */
- Ceecpmask = (1<<8) - 1,
- Clegacy = 1, /* legacy support cap. id */
- CLbiossem = 2, /* legacy cap. bios sem. */
- CLossem = 3, /* legacy cap. os sem */
- CLcontrol = 4, /* legacy support control & status */
- /* typed links */
- Lterm = 1,
- Litd = 0<<1,
- Lqh = 1<<1,
- Lsitd = 2<<1,
- Lfstn = 3<<1, /* we don't use these */
- /* Cmd reg. */
- Cstop = 0x00000, /* stop running */
- Crun = 0x00001, /* start operation */
- Chcreset = 0x00002, /* host controller reset */
- Cflsmask = 0x0000C, /* frame list size bits */
- Cfls1024 = 0x00000, /* frame list size 1024 */
- Cfls512 = 0x00004, /* frame list size 512 frames */
- Cfls256 = 0x00008, /* frame list size 256 frames */
- Cpse = 0x00010, /* periodic sched. enable */
- Case = 0x00020, /* async sched. enable */
- Ciasync = 0x00040, /* interrupt on async advance doorbell */
- Citc1 = 0x10000, /* interrupt threshold ctl. 1 µframe */
- Citc4 = 0x40000, /* same. 2 µframes */
- /* ... */
- Citc8 = 0x80000, /* same. 8 µframes (can go up to 64) */
- /* Sts reg. */
- Sasyncss = 0x08000, /* aync schedule status */
- Speriodss = 0x04000, /* periodic schedule status */
- Srecl = 0x02000, /* reclamnation (empty async sched.) */
- Shalted = 0x01000, /* h.c. is halted */
- Sasync = 0x00020, /* interrupt on async advance */
- Sherr = 0x00010, /* host system error */
- Sfrroll = 0x00008, /* frame list roll over */
- Sportchg = 0x00004, /* port change detect */
- Serrintr = 0x00002, /* error interrupt */
- Sintr = 0x00001, /* interrupt */
- Sintrs = 0x0003F, /* interrupts status */
- /* Intr reg. */
- Iusb = 0x01, /* intr. on usb */
- Ierr = 0x02, /* intr. on usb error */
- Iportchg = 0x04, /* intr. on port change */
- Ifrroll = 0x08, /* intr. on frlist roll over */
- Ihcerr = 0x10, /* intr. on host error */
- Iasync = 0x20, /* intr. on async advance enable */
- Iall = 0x3F, /* all interrupts */
- /* Config reg. */
- Callmine = 1, /* route all ports to us */
- /* Portsc reg. */
- Pspresent = 0x00000001, /* device present */
- Psstatuschg = 0x00000002, /* Pspresent changed */
- Psenable = 0x00000004, /* device enabled */
- Pschange = 0x00000008, /* Psenable changed */
- Psresume = 0x00000040, /* resume detected */
- Pssuspend = 0x00000080, /* port suspended */
- Psreset = 0x00000100, /* port reset */
- Pspower = 0x00001000, /* port power on */
- Psowner = 0x00002000, /* port owned by companion */
- Pslinemask = 0x00000C00, /* line status bits */
- Pslow = 0x00000400, /* low speed device */
- /* Debug port csw reg. */
- Cowner = 0x40000000, /* port owned by ehci */
- Cenable = 0x10000000, /* debug port enabled */
- Cdone = 0x00010000, /* request is done */
- Cbusy = 0x00000400, /* port in use by a driver */
- Cerrmask= 0x00000380, /* error code bits */
- Chwerr = 0x00000100, /* hardware error */
- Cterr = 0x00000080, /* transaction error */
- Cfailed = 0x00000040, /* transaction did fail */
- Cgo = 0x00000020, /* execute the transaction */
- Cwrite = 0x00000010, /* request is a write */
- Clen = 0x0000000F, /* data len */
- /* Debug port pid reg. */
- Prpidshift = 16, /* received pid */
- Prpidmask = 0xFF,
- Pspidshift = 8, /* sent pid */
- Pspidmask = 0xFF,
- Ptokshift = 0, /* token pid */
- Ptokmask = 0xFF,
- Ptoggle = 0x00008800, /* to update toggles */
- Ptogglemask = 0x0000FF00,
- /* Debug port addr reg. */
- Adevshift = 8, /* device address */
- Adevmask = 0x7F,
- Aepshift = 0, /* endpoint number */
- Aepmask = 0xF,
- };
- /*
- * Capability registers (hw)
- */
- struct Ecapio
- {
- ulong cap; /* 00 controller capability register */
- ulong parms; /* 04 structural parameters register */
- ulong capparms; /* 08 capability parameters */
- ulong portroute; /* 0c not on the CS5536 */
- };
- /*
- * Debug port registers (hw)
- */
- struct Edbgio
- {
- ulong csw; /* control and status */
- ulong pid; /* USB pid */
- uchar data[8]; /* data buffer */
- ulong addr; /* device and endpoint addresses */
- };
- struct Poll
- {
- Lock;
- Rendez;
- int must;
- int does;
- };
- struct Ctlr
- {
- Rendez; /* for waiting to async advance doorbell */
- Lock; /* for ilock. qh lists and basic ctlr I/O */
- QLock portlck; /* for port resets/enable... (and doorbell) */
- int active; /* in use or not */
- Pcidev* pcidev;
- Ecapio* capio; /* Capability i/o regs */
- Eopio* opio; /* Operational i/o regs */
- int nframes; /* 1024, 512, or 256 frames in the list */
- ulong* frames; /* periodic frame list (hw) */
- Qh* qhs; /* async Qh circular list for bulk/ctl */
- Qtree* tree; /* tree of Qhs for the periodic list */
- int ntree; /* number of dummy qhs in tree */
- Qh* intrqhs; /* list of (not dummy) qhs in tree */
- Isoio* iso; /* list of active Iso I/O */
- ulong load;
- ulong isoload;
- int nintr; /* number of interrupts attended */
- int ntdintr; /* number of intrs. with something to do */
- int nqhintr; /* number of async td intrs. */
- int nisointr; /* number of periodic td intrs. */
- int nreqs;
- Poll poll;
- };
- /*
- * PC-specific stuff
- */
- /*
- * Operational registers (hw)
- */
- struct Eopio
- {
- ulong cmd; /* 00 command */
- ulong sts; /* 04 status */
- ulong intr; /* 08 interrupt enable */
- ulong frno; /* 0c frame index */
- ulong seg; /* 10 bits 63:32 of EHCI datastructs (unused) */
- ulong frbase; /* 14 frame list base addr, 4096-byte boundary */
- ulong link; /* 18 link for async list */
- uchar d2c[0x40-0x1c]; /* 1c dummy */
- ulong config; /* 40 1: all ports default-routed to this HC */
- ulong portsc[1]; /* 44 Port status and control, one per port */
- };
- extern int ehcidebug;
- extern Ecapio *ehcidebugcapio;
- extern int ehcidebugport;
- void ehcilinkage(Hci *hp);
- void ehcimeminit(Ctlr *ctlr);
- void ehcirun(Ctlr *ctlr, int on);
|