184860c5dSDavid du Colombier /* override default macros from ../port/usb.h */ 284860c5dSDavid du Colombier #undef dprint 384860c5dSDavid du Colombier #undef ddprint 484860c5dSDavid du Colombier #undef deprint 584860c5dSDavid du Colombier #undef ddeprint 684860c5dSDavid du Colombier #define dprint if(ehcidebug)print 784860c5dSDavid du Colombier #define ddprint if(ehcidebug>1)print 884860c5dSDavid du Colombier #define deprint if(ehcidebug || ep->debug)print 984860c5dSDavid du Colombier #define ddeprint if(ehcidebug>1 || ep->debug>1)print 1084860c5dSDavid du Colombier 1184860c5dSDavid du Colombier typedef struct Ctlr Ctlr; 127bb09086SDavid du Colombier typedef struct Eopio Eopio; 1384860c5dSDavid du Colombier typedef struct Isoio Isoio; 1484860c5dSDavid du Colombier typedef struct Poll Poll; 1584860c5dSDavid du Colombier typedef struct Qh Qh; 1684860c5dSDavid du Colombier typedef struct Qtree Qtree; 1784860c5dSDavid du Colombier 1884860c5dSDavid du Colombier #pragma incomplete Ctlr; 1984860c5dSDavid du Colombier #pragma incomplete Eopio; 2084860c5dSDavid du Colombier #pragma incomplete Isoio; 2184860c5dSDavid du Colombier #pragma incomplete Poll; 2284860c5dSDavid du Colombier #pragma incomplete Qh; 2384860c5dSDavid du Colombier #pragma incomplete Qtree; 2484860c5dSDavid du Colombier 2584860c5dSDavid du Colombier struct Poll 2684860c5dSDavid du Colombier { 2784860c5dSDavid du Colombier Lock; 2884860c5dSDavid du Colombier Rendez; 2984860c5dSDavid du Colombier int must; 3084860c5dSDavid du Colombier int does; 3184860c5dSDavid du Colombier }; 3284860c5dSDavid du Colombier 3384860c5dSDavid du Colombier struct Ctlr 3484860c5dSDavid du Colombier { 3584860c5dSDavid du Colombier Rendez; /* for waiting to async advance doorbell */ 3684860c5dSDavid du Colombier Lock; /* for ilock. qh lists and basic ctlr I/O */ 3784860c5dSDavid du Colombier QLock portlck; /* for port resets/enable... (and doorbell) */ 3884860c5dSDavid du Colombier int active; /* in use or not */ 3984860c5dSDavid du Colombier Ecapio* capio; /* Capability i/o regs */ 4084860c5dSDavid du Colombier Eopio* opio; /* Operational i/o regs */ 4184860c5dSDavid du Colombier 4284860c5dSDavid du Colombier int nframes; /* 1024, 512, or 256 frames in the list */ 4384860c5dSDavid du Colombier ulong* frames; /* periodic frame list (hw) */ 4484860c5dSDavid du Colombier Qh* qhs; /* async Qh circular list for bulk/ctl */ 4584860c5dSDavid du Colombier Qtree* tree; /* tree of Qhs for the periodic list */ 4684860c5dSDavid du Colombier int ntree; /* number of dummy qhs in tree */ 4784860c5dSDavid du Colombier Qh* intrqhs; /* list of (not dummy) qhs in tree */ 4884860c5dSDavid du Colombier Isoio* iso; /* list of active Iso I/O */ 4984860c5dSDavid du Colombier ulong load; 5084860c5dSDavid du Colombier ulong isoload; 5184860c5dSDavid du Colombier int nintr; /* number of interrupts attended */ 5284860c5dSDavid du Colombier int ntdintr; /* number of intrs. with something to do */ 5384860c5dSDavid du Colombier int nqhintr; /* number of async td intrs. */ 5484860c5dSDavid du Colombier int nisointr; /* number of periodic td intrs. */ 5584860c5dSDavid du Colombier int nreqs; 5684860c5dSDavid du Colombier Poll poll; 5784860c5dSDavid du Colombier }; 5884860c5dSDavid du Colombier 5984860c5dSDavid du Colombier /* 607bb09086SDavid du Colombier * Operational registers (hw) 617bb09086SDavid du Colombier */ 627bb09086SDavid du Colombier struct Eopio 637bb09086SDavid du Colombier { 647bb09086SDavid du Colombier ulong cmd; /* 00 command */ 657bb09086SDavid du Colombier ulong sts; /* 04 status */ 667bb09086SDavid du Colombier ulong intr; /* 08 interrupt enable */ 677bb09086SDavid du Colombier ulong frno; /* 0c frame index */ 687bb09086SDavid du Colombier ulong seg; /* 10 bits 63:32 of EHCI datastructs (unused) */ 697bb09086SDavid du Colombier ulong frbase; /* 14 frame list base addr, 4096-byte boundary */ 707bb09086SDavid du Colombier ulong link; /* 18 link for async list */ 717bb09086SDavid du Colombier uchar d2c[0x40-0x1c]; /* 1c dummy */ 727bb09086SDavid du Colombier ulong config; /* 40 1: all ports default-routed to this HC */ 737bb09086SDavid du Colombier ulong portsc[3]; /* 44 Port status and control, one per port */ 747bb09086SDavid du Colombier 757bb09086SDavid du Colombier /* defined for omap35 ehci at least */ 767bb09086SDavid du Colombier uchar _pad0[0x80 - 0x50]; 777bb09086SDavid du Colombier ulong insn[6]; /* implementation-specific */ 787bb09086SDavid du Colombier }; 797bb09086SDavid du Colombier 807bb09086SDavid du Colombier typedef struct Uhh Uhh; 817bb09086SDavid du Colombier struct Uhh { 827bb09086SDavid du Colombier ulong revision; /* ro */ 837bb09086SDavid du Colombier uchar _pad0[0x10-0x4]; 847bb09086SDavid du Colombier ulong sysconfig; 857bb09086SDavid du Colombier ulong sysstatus; /* ro */ 867bb09086SDavid du Colombier 877bb09086SDavid du Colombier uchar _pad1[0x40-0x18]; 887bb09086SDavid du Colombier ulong hostconfig; 897bb09086SDavid du Colombier ulong debug_csr; 907bb09086SDavid du Colombier }; 917bb09086SDavid du Colombier 92*5bdeb9a2SDavid du Colombier enum { 93*5bdeb9a2SDavid du Colombier /* hostconfig bits */ 94*5bdeb9a2SDavid du Colombier P1ulpi_bypass = 1<<0, /* utmi if set; else ulpi */ 95*5bdeb9a2SDavid du Colombier }; 96*5bdeb9a2SDavid du Colombier 977bb09086SDavid du Colombier extern Ecapio *ehcidebugcapio; 987bb09086SDavid du Colombier extern int ehcidebugport; 9984860c5dSDavid du Colombier 10084860c5dSDavid du Colombier extern int ehcidebug; 10184860c5dSDavid du Colombier 10284860c5dSDavid du Colombier void ehcilinkage(Hci *hp); 10384860c5dSDavid du Colombier void ehcimeminit(Ctlr *ctlr); 10484860c5dSDavid du Colombier void ehcirun(Ctlr *ctlr, int on); 105