52#define _OHCI_MAKE32(x) ((uint32_t)(x))
58#define _OHCI_MAKEMASK1(n) (_OHCI_MAKE32(1) << _OHCI_MAKE32(n))
64#define _OHCI_MAKEMASK(v,n) (_OHCI_MAKE32((_OHCI_MAKE32(1)<<(v))-1) << _OHCI_MAKE32(n))
70#define _OHCI_MAKEVALUE(v,n) (_OHCI_MAKE32(v) << _OHCI_MAKE32(n))
71#define _OHCI_GETVALUE(v,n,m) ((_OHCI_MAKE32(v) & _OHCI_MAKE32(m)) >> _OHCI_MAKE32(n))
79#define OHCI_ED_ALIGN 32
89#define M_OHCI_ED_FA _OHCI_MAKEMASK(7,S_OHCI_ED_FA)
90#define V_OHCI_ED_FA(x) _OHCI_MAKEVALUE(x,S_OHCI_ED_FA)
91#define G_OHCI_ED_FA(x) _OHCI_GETVALUE(x,S_OHCI_ED_FA,M_OHCI_ED_FA)
94#define M_OHCI_ED_EN _OHCI_MAKEMASK(4,S_OHCI_ED_EN)
95#define V_OHCI_ED_EN(x) _OHCI_MAKEVALUE(x,S_OHCI_ED_EN)
96#define G_OHCI_ED_EN(x) _OHCI_GETVALUE(x,S_OHCI_ED_EN,M_OHCI_ED_EN)
98#define S_OHCI_ED_DIR 11
99#define M_OHCI_ED_DIR _OHCI_MAKEMASK(2,S_OHCI_ED_DIR)
100#define V_OHCI_ED_DIR(x) _OHCI_MAKEVALUE(x,S_OHCI_ED_DIR)
101#define G_OHCI_ED_DIR(x) _OHCI_GETVALUE(x,S_OHCI_ED_DIR,M_OHCI_ED_DIR)
103#define K_OHCI_ED_DIR_FROMTD 0
104#define K_OHCI_ED_DIR_OUT 1
105#define K_OHCI_ED_DIR_IN 2
107#define M_OHCI_ED_LOWSPEED _OHCI_MAKEMASK1(13)
108#define M_OHCI_ED_SKIP _OHCI_MAKEMASK1(14)
109#define M_OHCI_ED_ISOCFMT _OHCI_MAKEMASK1(15)
111#define S_OHCI_ED_MPS 16
112#define M_OHCI_ED_MPS _OHCI_MAKEMASK(11,S_OHCI_ED_MPS)
113#define V_OHCI_ED_MPS(x) _OHCI_MAKEVALUE(x,S_OHCI_ED_MPS)
114#define G_OHCI_ED_MPS(x) _OHCI_GETVALUE(x,S_OHCI_ED_MPS,M_OHCI_ED_MPS)
116#define M_OHCI_ED_PTRMASK 0xFFFFFFF0
117#define M_OHCI_ED_HALT _OHCI_MAKEMASK1(0)
118#define M_OHCI_ED_TOGGLECARRY _OHCI_MAKEMASK1(1)
124#define OHCI_TD_ALIGN 32
133#define M_OHCI_TD_SHORTOK _OHCI_MAKEMASK1(18)
135#define S_OHCI_TD_PID 19
136#define M_OHCI_TD_PID _OHCI_MAKEMASK(2,S_OHCI_TD_PID)
137#define V_OHCI_TD_PID(x) _OHCI_MAKEVALUE(x,S_OHCI_TD_PID)
138#define G_OHCI_TD_PID(x) _OHCI_GETVALUE(x,S_OHCI_TD_PID,M_OHCI_TD_PID)
140#define K_OHCI_TD_SETUP 0
141#define K_OHCI_TD_OUT 1
142#define K_OHCI_TD_IN 2
143#define K_OHCI_TD_RESERVED 3
145#define V_OHCI_TD_SETUP V_OHCI_TD_PID(K_OHCI_TD_SETUP)
146#define V_OHCI_TD_OUT V_OHCI_TD_PID(K_OHCI_TD_OUT)
147#define V_OHCI_TD_IN V_OHCI_TD_PID(K_OHCI_TD_IN)
148#define V_OHCI_TD_RESERVED V_OHCI_TD_PID(K_OHCI_TD_RESERVED)
150#define S_OHCI_TD_DI 21
151#define M_OHCI_TD_DI _OHCI_MAKEMASK(3,S_OHCI_TD_DI)
152#define V_OHCI_TD_DI(x) _OHCI_MAKEVALUE(x,S_OHCI_TD_DI)
153#define G_OHCI_TD_DI(x) _OHCI_GETVALUE(x,S_OHCI_TD_DI,M_OHCI_TD_DI)
155#define K_OHCI_TD_NOINTR 7
156#define V_OHCI_TD_NOINTR V_OHCI_TD_DI(K_OHCI_TD_NOINTR)
158#define S_OHCI_TD_DT 24
159#define M_OHCI_TD_DT _OHCI_MAKEMASK(2,S_OHCI_TD_DT)
160#define V_OHCI_TD_DT(x) _OHCI_MAKEVALUE(x,S_OHCI_TD_DT)
161#define G_OHCI_TD_DT(x) _OHCI_GETVALUE(x,S_OHCI_TD_DT,M_OHCI_TD_DT)
163#define K_OHCI_TD_DT_DATA0 2
164#define K_OHCI_TD_DT_DATA1 3
165#define K_OHCI_TD_DT_TCARRY 0
167#define S_OHCI_TD_EC 26
168#define M_OHCI_TD_EC _OHCI_MAKEMASK(2,S_OHCI_TD_EC)
169#define V_OHCI_TD_EC(x) _OHCI_MAKEVALUE(x,S_OHCI_TD_EC)
170#define G_OHCI_TD_EC(x) _OHCI_GETVALUE(x,S_OHCI_TD_EC,M_OHCI_TD_EC)
172#define S_OHCI_TD_CC 28
173#define M_OHCI_TD_CC _OHCI_MAKEMASK(4,S_OHCI_TD_CC)
174#define V_OHCI_TD_CC(x) _OHCI_MAKEVALUE(x,S_OHCI_TD_CC)
175#define G_OHCI_TD_CC(x) _OHCI_GETVALUE(x,S_OHCI_TD_CC,M_OHCI_TD_CC)
177#define K_OHCI_CC_NOERROR 0
178#define K_OHCI_CC_CRC 1
179#define K_OHCI_CC_BITSTUFFING 2
180#define K_OHCI_CC_DATATOGGLEMISMATCH 3
181#define K_OHCI_CC_STALL 4
182#define K_OHCI_CC_DEVICENOTRESPONDING 5
183#define K_OHCI_CC_PIDCHECKFAILURE 6
184#define K_OHCI_CC_UNEXPECTEDPID 7
185#define K_OHCI_CC_DATAOVERRUN 8
186#define K_OHCI_CC_DATAUNDERRUN 9
187#define K_OHCI_CC_BUFFEROVERRUN 12
188#define K_OHCI_CC_BUFFERUNDERRUN 13
189#define K_OHCI_CC_NOTACCESSED 15
191#define K_OHCI_CC_CANCELLED 0xFF
193#define OHCI_TD_MAX_DATA 8192
208#define OHCI_INTTABLE_SIZE 32
210#define OHCI_HCCA_ALIGN 256
224#define _OHCI_REGIDX(x) ((x)*4)
226#define R_OHCI_REVISION _OHCI_REGIDX(0)
227#define R_OHCI_CONTROL _OHCI_REGIDX(1)
228#define R_OHCI_CMDSTATUS _OHCI_REGIDX(2)
229#define R_OHCI_INTSTATUS _OHCI_REGIDX(3)
230#define R_OHCI_INTENABLE _OHCI_REGIDX(4)
231#define R_OHCI_INTDISABLE _OHCI_REGIDX(5)
232#define R_OHCI_HCCA _OHCI_REGIDX(6)
233#define R_OHCI_PERIODCURRENTED _OHCI_REGIDX(7)
234#define R_OHCI_CONTROLHEADED _OHCI_REGIDX(8)
235#define R_OHCI_CONTROLCURRENTED _OHCI_REGIDX(9)
236#define R_OHCI_BULKHEADED _OHCI_REGIDX(10)
237#define R_OHCI_BULKCURRENTED _OHCI_REGIDX(11)
238#define R_OHCI_DONEHEAD _OHCI_REGIDX(12)
239#define R_OHCI_FMINTERVAL _OHCI_REGIDX(13)
240#define R_OHCI_FMREMAINING _OHCI_REGIDX(14)
241#define R_OHCI_FMNUMBER _OHCI_REGIDX(15)
242#define R_OHCI_PERIODICSTART _OHCI_REGIDX(16)
243#define R_OHCI_LSTHRESHOLD _OHCI_REGIDX(17)
244#define R_OHCI_RHDSCRA _OHCI_REGIDX(18)
245#define R_OHCI_RHDSCRB _OHCI_REGIDX(19)
246#define R_OHCI_RHSTATUS _OHCI_REGIDX(20)
247#define R_OHCI_RHPORTSTATUS(x) _OHCI_REGIDX(20+(x))
254#define S_OHCI_REV_REV 0
255#define M_OHCI_REV_REV _OHCI_MAKEMASK(8,S_OHCI_REV_REV)
256#define V_OHCI_REV_REV(x) _OHCI_MAKEVALUE(x,S_OHCI_REV_REV)
257#define G_OHCI_REV_REV(x) _OHCI_GETVALUE(x,S_OHCI_REV_REV,M_OHCI_REV_REV)
258#define K_OHCI_REV_11 0x10
264#define S_OHCI_CONTROL_CBSR 0
265#define M_OHCI_CONTROL_CBSR _OHCI_MAKEMASK(2,S_OHCI_CONTROL_CBSR)
266#define V_OHCI_CONTROL_CBSR(x) _OHCI_MAKEVALUE(x,S_OHCI_CONTROL_CBSR)
267#define G_OHCI_CONTROL_CBSR(x) _OHCI_GETVALUE(x,S_OHCI_CONTROL_CBSR,M_OHCI_CONTROL_CBSR)
269#define K_OHCI_CBSR_11 0
270#define K_OHCI_CBSR_21 1
271#define K_OHCI_CBSR_31 2
272#define K_OHCI_CBSR_41 3
274#define M_OHCI_CONTROL_PLE _OHCI_MAKEMASK1(2)
275#define M_OHCI_CONTROL_IE _OHCI_MAKEMASK1(3)
276#define M_OHCI_CONTROL_CLE _OHCI_MAKEMASK1(4)
277#define M_OHCI_CONTROL_BLE _OHCI_MAKEMASK1(5)
279#define S_OHCI_CONTROL_HCFS 6
280#define M_OHCI_CONTROL_HCFS _OHCI_MAKEMASK(2,S_OHCI_CONTROL_HCFS)
281#define V_OHCI_CONTROL_HCFS(x) _OHCI_MAKEVALUE(x,S_OHCI_CONTROL_HCFS)
282#define G_OHCI_CONTROL_HCFS(x) _OHCI_GETVALUE(x,S_OHCI_CONTROL_HCFS,M_OHCI_CONTROL_HCFS)
284#define K_OHCI_HCFS_RESET 0
285#define K_OHCI_HCFS_RESUME 1
286#define K_OHCI_HCFS_OPERATIONAL 2
287#define K_OHCI_HCFS_SUSPEND 3
289#define M_OHCI_CONTROL_IR _OHCI_MAKEMASK1(8)
290#define M_OHCI_CONTROL_RWC _OHCI_MAKEMASK1(9)
291#define M_OHCI_CONTROL_RWE _OHCI_MAKEMASK1(10)
297#define M_OHCI_CMDSTATUS_HCR _OHCI_MAKEMASK1(0)
298#define M_OHCI_CMDSTATUS_CLF _OHCI_MAKEMASK1(1)
299#define M_OHCI_CMDSTATUS_BLF _OHCI_MAKEMASK1(2)
300#define M_OHCI_CMDSTATUS_OCR _OHCI_MAKEMASK1(3)
302#define S_OHCI_CMDSTATUS_SOC 16
303#define M_OHCI_CMDSTATUS_SOC _OHCI_MAKEMASK(2,S_OHCI_CMDSTATUS_SOC)
304#define V_OHCI_CMDSTATUS_SOC(x) _OHCI_MAKEVALUE(x,S_OHCI_CMDSTATUS_SOC)
305#define G_OHCI_CMDSTATUS_SOC(x) _OHCI_GETVALUE(x,S_OHCI_CMDSTATUS_SOC,M_OHCI_CMDSTATUS_SOC)
312#define M_OHCI_INT_SO _OHCI_MAKEMASK1(0)
313#define M_OHCI_INT_WDH _OHCI_MAKEMASK1(1)
314#define M_OHCI_INT_SF _OHCI_MAKEMASK1(2)
315#define M_OHCI_INT_RD _OHCI_MAKEMASK1(3)
316#define M_OHCI_INT_UE _OHCI_MAKEMASK1(4)
317#define M_OHCI_INT_FNO _OHCI_MAKEMASK1(5)
318#define M_OHCI_INT_RHSC _OHCI_MAKEMASK1(6)
319#define M_OHCI_INT_OC _OHCI_MAKEMASK1(30)
320#define M_OHCI_INT_MIE _OHCI_MAKEMASK1(31)
322#define M_OHCI_INT_ALL M_OHCI_INT_SO | M_OHCI_INT_WDH | M_OHCI_INT_SF | \
323 M_OHCI_INT_RD | M_OHCI_INT_UE | M_OHCI_INT_FNO | \
324 M_OHCI_INT_RHSC | M_OHCI_INT_OC | M_OHCI_INT_MIE
331#define S_OHCI_FMINTERVAL_FI 0
332#define M_OHCI_FMINTERVAL_FI _OHCI_MAKEMASK(14,S_OHCI_FMINTERVAL_FI)
333#define V_OHCI_FMINTERVAL_FI(x) _OHCI_MAKEVALUE(x,S_OHCI_FMINTERVAL_FI)
334#define G_OHCI_FMINTERVAL_FI(x) _OHCI_GETVALUE(x,S_OHCI_FMINTERVAL_FI,M_OHCI_FMINTERVAL_FI)
336#define S_OHCI_FMINTERVAL_FSMPS 16
337#define M_OHCI_FMINTERVAL_FSMPS _OHCI_MAKEMASK(15,S_OHCI_FMINTERVAL_FSMPS)
338#define V_OHCI_FMINTERVAL_FSMPS(x) _OHCI_MAKEVALUE(x,S_OHCI_FMINTERVAL_FSMPS)
339#define G_OHCI_FMINTERVAL_FSMPS(x) _OHCI_GETVALUE(x,S_OHCI_FMINTERVAL_FSMPS,M_OHCI_FMINTERVAL_FSMPS)
341#define OHCI_CALC_FSMPS(x) ((((x)-210)*6/7))
344#define M_OHCI_FMINTERVAL_FIT _OHCI_MAKEMASK1(31)
351#define S_OHCI_FMREMAINING_FR 0
352#define M_OHCI_FMREMAINING_FR _OHCI_MAKEMASK(14,S_OHCI_FMREMAINING_FR)
353#define V_OHCI_FMREMAINING_FR(x) _OHCI_MAKEVALUE(x,S_OHCI_FMREMAINING_FR)
354#define G_OHCI_FMREMAINING_FR(x) _OHCI_GETVALUE(x,S_OHCI_FMREMAINING_FR,M_OHCI_FMREMAINING_FR)
356#define M_OHCI_FMREMAINING_FRT _OHCI_MAKEMASK1(31)
363#define S_OHCI_RHDSCRA_NDP 0
364#define M_OHCI_RHDSCRA_NDP _OHCI_MAKEMASK(8,S_OHCI_RHDSCRA_NDP)
365#define V_OHCI_RHDSCRA_NDP(x) _OHCI_MAKEVALUE(x,S_OHCI_RHDSCRA_NDP)
366#define G_OHCI_RHDSCRA_NDP(x) _OHCI_GETVALUE(x,S_OHCI_RHDSCRA_NDP,M_OHCI_RHDSCRA_NDP)
368#define M_OHCI_RHDSCRA_PSM _OHCI_MAKEMASK1(8)
369#define M_OHCI_RHDSCRA_NPS _OHCI_MAKEMASK1(9)
370#define M_OHCI_RHDSCRA_DT _OHCI_MAKEMASK1(10)
371#define M_OHCI_RHDSCRA_OCPM _OHCI_MAKEMASK1(11)
372#define M_OHCI_RHDSCRA_NOCP _OHCI_MAKEMASK1(12)
374#define S_OHCI_RHDSCRA_POTPGT 24
375#define M_OHCI_RHDSCRA_POTPGT _OHCI_MAKEMASK(8,S_OHCI_RHDSCRA_POTPGT)
376#define V_OHCI_RHDSCRA_POTPGT(x) _OHCI_MAKEVALUE(x,S_OHCI_RHDSCRA_POTPGT)
377#define G_OHCI_RHDSCRA_POTPGT(x) _OHCI_GETVALUE(x,S_OHCI_RHDSCRA_POTPGT,M_OHCI_RHDSCRA_POTPGT)
383#define S_OHCI_RHDSCRB_DR 0
384#define M_OHCI_RHDSCRB_DR _OHCI_MAKEMASK(16,S_OHCI_RHDSCRB_DR)
385#define V_OHCI_RHDSCRB_DR(x) _OHCI_MAKEVALUE(x,S_OHCI_RHDSCRB_DR)
386#define G_OHCI_RHDSCRB_DR(x) _OHCI_GETVALUE(x,S_OHCI_RHDSCRB_DR,M_OHCI_RHDSCRB_DR)
388#define S_OHCI_RHDSCRB_PPCM 16
389#define M_OHCI_RHDSCRB_PPCM _OHCI_MAKEMASK(16,S_OHCI_RHDSCRB_PPCM)
390#define V_OHCI_RHDSCRB_PPCM(x) _OHCI_MAKEVALUE(x,S_OHCI_RHDSCRB_PPCM)
391#define G_OHCI_RHDSCRB_PPCM(x) _OHCI_GETVALUE(x,S_OHCI_RHDSCRB_PPCM,M_OHCI_RHDSCRB_PPCM)
397#define M_OHCI_RHSTATUS_LPS _OHCI_MAKEMASK1(0)
398#define M_OHCI_RHSTATUS_OCI _OHCI_MAKEMASK1(1)
399#define M_OHCI_RHSTATUS_DRWE _OHCI_MAKEMASK1(15)
400#define M_OHCI_RHSTATUS_LPSC _OHCI_MAKEMASK1(16)
401#define M_OHCI_RHSTATUS_OCIC _OHCI_MAKEMASK1(17)
402#define M_OHCI_RHSTATUS_CRWE _OHCI_MAKEMASK1(31)
408#define M_OHCI_RHPORTSTAT_CCS _OHCI_MAKEMASK1(0)
409#define M_OHCI_RHPORTSTAT_PES _OHCI_MAKEMASK1(1)
410#define M_OHCI_RHPORTSTAT_PSS _OHCI_MAKEMASK1(2)
411#define M_OHCI_RHPORTSTAT_POCI _OHCI_MAKEMASK1(3)
412#define M_OHCI_RHPORTSTAT_PRS _OHCI_MAKEMASK1(4)
413#define M_OHCI_RHPORTSTAT_PPS _OHCI_MAKEMASK1(8)
414#define M_OHCI_RHPORTSTAT_LSDA _OHCI_MAKEMASK1(9)
415#define M_OHCI_RHPORTSTAT_CSC _OHCI_MAKEMASK1(16)
416#define M_OHCI_RHPORTSTAT_PESC _OHCI_MAKEMASK1(17)
417#define M_OHCI_RHPORTSTAT_PSSC _OHCI_MAKEMASK1(18)
418#define M_OHCI_RHPORTSTAT_OCIC _OHCI_MAKEMASK1(19)
419#define M_OHCI_RHPORTSTAT_PRSC _OHCI_MAKEMASK1(20)
421#define M_OHCI_RHPORTSTAT_ALLC (M_OHCI_RHPORTSTAT_CSC | \
422 M_OHCI_RHPORTSTAT_PSSC | \
423 M_OHCI_RHPORTSTAT_OCIC | \
424 M_OHCI_RHPORTSTAT_PRSC)
430#define beginningof(ptr,type,field) ((type *) (((int) (ptr)) - ((int) ((type *) 0)->field)))
432#define OHCI_INTTREE_SIZE 63
434#define OHCI_EDPOOL_SIZE 128
435#define OHCI_TDPOOL_SIZE 64
488#define OHCI_RESET_DELAY 20
#define OHCI_INTTABLE_SIZE
struct ohci_ed_s ohci_ed_t
struct ohci_hcca_s ohci_hcca_t
struct ohci_endpoint_s ohci_endpoint_t
struct ohci_transfer_s ohci_transfer_t
struct ohci_td_s ohci_td_t
#define OHCI_INTTREE_SIZE
struct ohci_softc_s ohci_softc_t
struct ohci_endpoint_s * ep_next
uint32_t hcca_reserved[29]
uint32_t hcca_inttable[OHCI_INTTABLE_SIZE]
ohci_endpoint_t * ohci_endpoint_pool
ohci_td_t * ohci_hwtdpool
ohci_endpoint_t * ohci_inttable[OHCI_INTTABLE_SIZE]
ohci_transfer_t * ohci_transfer_pool
ohci_ed_t * ohci_hwedpool
volatile uint32_t * ohci_regs
ohci_endpoint_t * ohci_ctl_list
ohci_endpoint_t * ohci_isoc_list
ohci_transfer_t * ohci_transfer_freelist
ohci_endpoint_t * ohci_edtable[OHCI_INTTREE_SIZE]
ohci_endpoint_t * ohci_bulk_list
ohci_endpoint_t * ohci_endpoint_freelist
struct ohci_transfer_s * t_next