1*84860c5dSDavid du Colombier /* override default macros from ../port/usb.h */ 2*84860c5dSDavid du Colombier #undef dprint 3*84860c5dSDavid du Colombier #undef ddprint 4*84860c5dSDavid du Colombier #undef deprint 5*84860c5dSDavid du Colombier #undef ddeprint 6*84860c5dSDavid du Colombier #define dprint if(ehcidebug)print 7*84860c5dSDavid du Colombier #define ddprint if(ehcidebug>1)print 8*84860c5dSDavid du Colombier #define deprint if(ehcidebug || ep->debug)print 9*84860c5dSDavid du Colombier #define ddeprint if(ehcidebug>1 || ep->debug>1)print 10*84860c5dSDavid du Colombier 11*84860c5dSDavid du Colombier typedef struct Ctlr Ctlr; 12154abd99SDavid du Colombier typedef struct Eopio Eopio; 13*84860c5dSDavid du Colombier typedef struct Isoio Isoio; 14*84860c5dSDavid du Colombier typedef struct Poll Poll; 15*84860c5dSDavid du Colombier typedef struct Qh Qh; 16*84860c5dSDavid du Colombier typedef struct Qtree Qtree; 17*84860c5dSDavid du Colombier 18*84860c5dSDavid du Colombier #pragma incomplete Ctlr; 19*84860c5dSDavid du Colombier #pragma incomplete Ecapio; 20*84860c5dSDavid du Colombier #pragma incomplete Eopio; 21*84860c5dSDavid du Colombier #pragma incomplete Edbgio; 22*84860c5dSDavid du Colombier #pragma incomplete Isoio; 23*84860c5dSDavid du Colombier #pragma incomplete Poll; 24*84860c5dSDavid du Colombier #pragma incomplete Qh; 25*84860c5dSDavid du Colombier #pragma incomplete Qtree; 26154abd99SDavid du Colombier 27*84860c5dSDavid du Colombier struct Poll 28*84860c5dSDavid du Colombier { 29*84860c5dSDavid du Colombier Lock; 30*84860c5dSDavid du Colombier Rendez; 31*84860c5dSDavid du Colombier int must; 32*84860c5dSDavid du Colombier int does; 33*84860c5dSDavid du Colombier }; 34*84860c5dSDavid du Colombier 35*84860c5dSDavid du Colombier struct Ctlr 36*84860c5dSDavid du Colombier { 37*84860c5dSDavid du Colombier Rendez; /* for waiting to async advance doorbell */ 38*84860c5dSDavid du Colombier Lock; /* for ilock. qh lists and basic ctlr I/O */ 39*84860c5dSDavid du Colombier QLock portlck; /* for port resets/enable... (and doorbell) */ 40*84860c5dSDavid du Colombier int active; /* in use or not */ 41*84860c5dSDavid du Colombier Ecapio* capio; /* Capability i/o regs */ 42*84860c5dSDavid du Colombier Eopio* opio; /* Operational i/o regs */ 43*84860c5dSDavid du Colombier 44*84860c5dSDavid du Colombier int nframes; /* 1024, 512, or 256 frames in the list */ 45*84860c5dSDavid du Colombier ulong* frames; /* periodic frame list (hw) */ 46*84860c5dSDavid du Colombier Qh* qhs; /* async Qh circular list for bulk/ctl */ 47*84860c5dSDavid du Colombier Qtree* tree; /* tree of Qhs for the periodic list */ 48*84860c5dSDavid du Colombier int ntree; /* number of dummy qhs in tree */ 49*84860c5dSDavid du Colombier Qh* intrqhs; /* list of (not dummy) qhs in tree */ 50*84860c5dSDavid du Colombier Isoio* iso; /* list of active Iso I/O */ 51*84860c5dSDavid du Colombier ulong load; 52*84860c5dSDavid du Colombier ulong isoload; 53*84860c5dSDavid du Colombier int nintr; /* number of interrupts attended */ 54*84860c5dSDavid du Colombier int ntdintr; /* number of intrs. with something to do */ 55*84860c5dSDavid du Colombier int nqhintr; /* number of async td intrs. */ 56*84860c5dSDavid du Colombier int nisointr; /* number of periodic td intrs. */ 57*84860c5dSDavid du Colombier int nreqs; 58*84860c5dSDavid du Colombier Poll poll; 59*84860c5dSDavid du Colombier }; 60*84860c5dSDavid du Colombier 61*84860c5dSDavid du Colombier /* 62154abd99SDavid du Colombier * Operational registers (hw) 63154abd99SDavid du Colombier */ 64154abd99SDavid du Colombier struct Eopio 65154abd99SDavid du Colombier { 66154abd99SDavid du Colombier ulong cmd; /* 00 command */ 67154abd99SDavid du Colombier ulong sts; /* 04 status */ 68154abd99SDavid du Colombier ulong intr; /* 08 interrupt enable */ 69154abd99SDavid du Colombier ulong frno; /* 0c frame index */ 70154abd99SDavid du Colombier ulong seg; /* 10 bits 63:32 of EHCI datastructs (unused) */ 71154abd99SDavid du Colombier ulong frbase; /* 14 frame list base addr, 4096-byte boundary */ 72154abd99SDavid du Colombier ulong link; /* 18 link for async list */ 73154abd99SDavid du Colombier uchar d2c[0x40-0x1c]; /* 1c dummy */ 74154abd99SDavid du Colombier ulong config; /* 40 1: all ports default-routed to this HC */ 75154abd99SDavid du Colombier ulong portsc[1]; /* 44 Port status and control, one per port */ 7656713243SDavid du Colombier 7756713243SDavid du Colombier /* 7856713243SDavid du Colombier * these are present on the Kirkwood USB controller. 7956713243SDavid du Colombier * are they standard now? Marvell doesn't document them publically. 8056713243SDavid du Colombier */ 8156713243SDavid du Colombier uchar _pad0[0x64-0x48]; 8256713243SDavid du Colombier ulong otgsc; 8356713243SDavid du Colombier ulong usbmode; 8456713243SDavid du Colombier ulong epsetupsts; 8556713243SDavid du Colombier ulong epprime; 8656713243SDavid du Colombier ulong epflush; 8756713243SDavid du Colombier ulong epsts; 8856713243SDavid du Colombier ulong epcompl; 89ab6ce076SDavid du Colombier ulong epctl[6]; 90ab6ce076SDavid du Colombier 91ab6ce076SDavid du Colombier /* freescale registers */ 92ab6ce076SDavid du Colombier uchar _pad1[0x2c0-0x98]; 93ab6ce076SDavid du Colombier ulong snoop1; 94ab6ce076SDavid du Colombier ulong snoop2; 95ab6ce076SDavid du Colombier ulong agecntthresh; 96ab6ce076SDavid du Colombier ulong prictl; /* priority control */ 97ab6ce076SDavid du Colombier ulong sictl; /* system interface control */ 98ab6ce076SDavid du Colombier 99ab6ce076SDavid du Colombier uchar _pad2[0x3c0-0x2d4]; 100ab6ce076SDavid du Colombier ulong ctl; 101154abd99SDavid du Colombier }; 102154abd99SDavid du Colombier 103*84860c5dSDavid du Colombier extern int ehcidebug; 104154abd99SDavid du Colombier 105*84860c5dSDavid du Colombier void ehcilinkage(Hci *hp); 106*84860c5dSDavid du Colombier void ehcimeminit(Ctlr *ctlr); 107*84860c5dSDavid du Colombier void ehcirun(Ctlr *ctlr, int on); 108