Index: ohci.c =================================================================== RCS file: /home/ncvs/src/sys/dev/usb/controller/ohci.c,v retrieving revision 1.21 diff -u -r1.21 ohci.c --- ohci.c 30 Jul 2009 00:14:34 -0000 1.21 +++ ohci.c 30 Aug 2009 15:42:53 -0000 @@ -73,6 +73,15 @@ #include #include +#if _BYTE_ORDER == _BIG_ENDIAN +#define SWAP_ENDIAN OHCI_LITTLE_ENDIAN +#else +#define SWAP_ENDIAN OHCI_BIG_ENDIAN +#endif + +#define O32TOH(val) (sc->sc_endian == SWAP_ENDIAN ? bswap32(val) : val) +#define HTOO32(val) O32TOH(val) + #define OHCI_BUS2SC(bus) \ ((ohci_softc_t *)(((uint8_t *)(bus)) - \ ((uint8_t *)&(((ohci_softc_t *)0)->sc_bus)))) @@ -84,11 +93,11 @@ SYSCTL_INT(_hw_usb_ohci, OID_AUTO, debug, CTLFLAG_RW, &ohcidebug, 0, "ohci debug level"); static void ohci_dumpregs(ohci_softc_t *); -static void ohci_dump_tds(ohci_td_t *); -static uint8_t ohci_dump_td(ohci_td_t *); -static void ohci_dump_ed(ohci_ed_t *); -static uint8_t ohci_dump_itd(ohci_itd_t *); -static void ohci_dump_itds(ohci_itd_t *); +static void ohci_dump_tds(struct ohci_softc *, ohci_td_t *); +static uint8_t ohci_dump_td(struct ohci_softc *, ohci_td_t *); +static void ohci_dump_ed(struct ohci_softc *, ohci_ed_t *); +static uint8_t ohci_dump_itd(struct ohci_softc *, ohci_itd_t *); +static void ohci_dump_itds(struct ohci_softc *, ohci_itd_t *); #endif @@ -292,7 +301,7 @@ } static struct ohci_ed * -ohci_init_ed(struct usb_page_cache *pc) +ohci_init_ed(struct ohci_softc *sc, struct usb_page_cache *pc) { struct usb_page_search buf_res; struct ohci_ed *ed; @@ -301,8 +310,8 @@ ed = buf_res.buffer; - ed->ed_self = htole32(buf_res.physaddr); - ed->ed_flags = htole32(OHCI_ED_SKIP); + ed->ed_self = HTOO32(buf_res.physaddr); + ed->ed_flags = HTOO32(OHCI_ED_SKIP); ed->page_cache = pc; return (ed); @@ -326,17 +335,17 @@ */ sc->sc_ctrl_p_last = - ohci_init_ed(&sc->sc_hw.ctrl_start_pc); + ohci_init_ed(sc, &sc->sc_hw.ctrl_start_pc); sc->sc_bulk_p_last = - ohci_init_ed(&sc->sc_hw.bulk_start_pc); + ohci_init_ed(sc, &sc->sc_hw.bulk_start_pc); sc->sc_isoc_p_last = - ohci_init_ed(&sc->sc_hw.isoc_start_pc); + ohci_init_ed(sc, &sc->sc_hw.isoc_start_pc); for (i = 0; i != OHCI_NO_EDS; i++) { sc->sc_intr_p_last[i] = - ohci_init_ed(sc->sc_hw.intr_start_pc + i); + ohci_init_ed(sc, sc->sc_hw.intr_start_pc + i); } /* @@ -403,10 +412,10 @@ if (ohcidebug > 15) { for (i = 0; i != OHCI_NO_EDS; i++) { printf("ed#%d ", i); - ohci_dump_ed(sc->sc_intr_p_last[i]); + ohci_dump_ed(sc, sc->sc_intr_p_last[i]); } printf("iso "); - ohci_dump_ed(sc->sc_isoc_p_last); + ohci_dump_ed(sc, sc->sc_isoc_p_last); } #endif @@ -557,33 +566,33 @@ hcca = ohci_get_hcca(sc); DPRINTF(" HCCA: frame_number=0x%04x done_head=0x%08x\n", - le32toh(hcca->hcca_frame_number), - le32toh(hcca->hcca_done_head)); + O32TOH(hcca->hcca_frame_number), + O32TOH(hcca->hcca_done_head)); } static void -ohci_dump_tds(ohci_td_t *std) +ohci_dump_tds(struct ohci_softc *sc, ohci_td_t *std) { for (; std; std = std->obj_next) { - if (ohci_dump_td(std)) { + if (ohci_dump_td(sc, std)) { break; } } } static uint8_t -ohci_dump_td(ohci_td_t *std) +ohci_dump_td(struct ohci_softc *sc, ohci_td_t *std) { uint32_t td_flags; uint8_t temp; usb_pc_cpu_invalidate(std->page_cache); - td_flags = le32toh(std->td_flags); + td_flags = O32TOH(std->td_flags); temp = (std->td_next == 0); printf("TD(%p) at 0x%08x: %s%s%s%s%s delay=%d ec=%d " "cc=%d\ncbp=0x%08x next=0x%08x be=0x%08x\n", - std, le32toh(std->td_self), + std, O32TOH(std->td_self), (td_flags & OHCI_TD_R) ? "-R" : "", (td_flags & OHCI_TD_OUT) ? "-OUT" : "", (td_flags & OHCI_TD_IN) ? "-IN" : "", @@ -592,15 +601,15 @@ OHCI_TD_GET_DI(td_flags), OHCI_TD_GET_EC(td_flags), OHCI_TD_GET_CC(td_flags), - le32toh(std->td_cbp), - le32toh(std->td_next), - le32toh(std->td_be)); + O32TOH(std->td_cbp), + O32TOH(std->td_next), + O32TOH(std->td_be)); return (temp); } static uint8_t -ohci_dump_itd(ohci_itd_t *sitd) +ohci_dump_itd(struct ohci_softc *sc, ohci_itd_t *sitd) { uint32_t itd_flags; uint16_t i; @@ -608,19 +617,19 @@ usb_pc_cpu_invalidate(sitd->page_cache); - itd_flags = le32toh(sitd->itd_flags); + itd_flags = O32TOH(sitd->itd_flags); temp = (sitd->itd_next == 0); printf("ITD(%p) at 0x%08x: sf=%d di=%d fc=%d cc=%d\n" "bp0=0x%08x next=0x%08x be=0x%08x\n", - sitd, le32toh(sitd->itd_self), + sitd, O32TOH(sitd->itd_self), OHCI_ITD_GET_SF(itd_flags), OHCI_ITD_GET_DI(itd_flags), OHCI_ITD_GET_FC(itd_flags), OHCI_ITD_GET_CC(itd_flags), - le32toh(sitd->itd_bp0), - le32toh(sitd->itd_next), - le32toh(sitd->itd_be)); + O32TOH(sitd->itd_bp0), + O32TOH(sitd->itd_next), + O32TOH(sitd->itd_be)); for (i = 0; i < OHCI_ITD_NOFFSET; i++) { printf("offs[%d]=0x%04x ", i, (uint32_t)le16toh(sitd->itd_offset[i])); @@ -631,29 +640,30 @@ } static void -ohci_dump_itds(ohci_itd_t *sitd) +ohci_dump_itds(struct ohci_softc *sc, ohci_itd_t *sitd) { for (; sitd; sitd = sitd->obj_next) { - if (ohci_dump_itd(sitd)) { + if (ohci_dump_itd(sc, sitd)) { break; } } } static void -ohci_dump_ed(ohci_ed_t *sed) +ohci_dump_ed(struct ohci_softc *sc, ohci_ed_t *sed) { uint32_t ed_flags; uint32_t ed_headp; usb_pc_cpu_invalidate(sed->page_cache); - ed_flags = le32toh(sed->ed_flags); - ed_headp = le32toh(sed->ed_headp); + ed_flags = O32TOH(sed->ed_flags); + ed_headp = O32TOH(sed->ed_headp); - printf("ED(%p) at 0x%08x: addr=%d endpt=%d maxp=%d flags=%s%s%s%s%s\n" + printf("%sED(%p) at 0x%08x: addr=%d endpt=%d maxp=%d flags=%s%s%s%s%s\n" "tailp=0x%08x headflags=%s%s headp=0x%08x nexted=0x%08x\n", - sed, le32toh(sed->ed_self), + (first) ? "" : " ", + sed, O32TOH(sed->ed_self), OHCI_ED_GET_FA(ed_flags), OHCI_ED_GET_EN(ed_flags), OHCI_ED_GET_MAXP(ed_flags), @@ -662,11 +672,11 @@ (ed_flags & OHCI_ED_SPEED) ? "-LOWSPEED" : "", (ed_flags & OHCI_ED_SKIP) ? "-SKIP" : "", (ed_flags & OHCI_ED_FORMAT_ISO) ? "-ISO" : "", - le32toh(sed->ed_tailp), + O32TOH(sed->ed_tailp), (ed_headp & OHCI_HALTED) ? "-HALTED" : "", (ed_headp & OHCI_TOGGLECARRY) ? "-CARRY" : "", - le32toh(sed->ed_headp), - le32toh(sed->ed_next)); + O32TOH(sed->ed_headp), + O32TOH(sed->ed_next)); } #endif @@ -752,6 +762,9 @@ static void ohci_isoc_done(struct usb_xfer *xfer) { +#ifdef USB_DEBUG + ohci_softc_t *sc = OHCI_BUS2SC(xfer->xroot->bus); +#endif uint8_t nframes; uint32_t *plen = xfer->frlengths; volatile uint16_t *olen; @@ -766,7 +779,7 @@ #ifdef USB_DEBUG if (ohcidebug > 5) { DPRINTF("isoc TD\n"); - ohci_dump_itd(td); + ohci_dump_itd(sc, td); } #endif usb_pc_cpu_invalidate(td->page_cache); @@ -834,6 +847,7 @@ static usb_error_t ohci_non_isoc_done_sub(struct usb_xfer *xfer) { + ohci_softc_t *sc = OHCI_BUS2SC(xfer->xroot->bus); ohci_td_t *td; ohci_td_t *td_alt_next; uint32_t temp; @@ -852,8 +866,8 @@ while (1) { usb_pc_cpu_invalidate(td->page_cache); - phy_start = le32toh(td->td_cbp); - td_flags = le32toh(td->td_flags); + phy_start = O32TOH(td->td_cbp); + td_flags = O32TOH(td->td_flags); cc = OHCI_TD_GET_CC(td_flags); if (phy_start) { @@ -861,7 +875,7 @@ * short transfer - compute the number of remaining * bytes in the hardware buffer: */ - phy_end = le32toh(td->td_be); + phy_end = O32TOH(td->td_be); temp = (OHCI_PAGE(phy_start ^ phy_end) ? (OHCI_PAGE_SIZE + 1) : 0x0001); temp += OHCI_PAGE_OFFSET(phy_end); @@ -927,6 +941,9 @@ static void ohci_non_isoc_done(struct usb_xfer *xfer) { +#ifdef USB_DEBUG + struct ohci_softc *sc = OHCI_BUS2SC(xfer->xroot->bus); +#endif usb_error_t err = 0; DPRINTFN(13, "xfer=%p endpoint=%p transfer done\n", @@ -934,7 +951,7 @@ #ifdef USB_DEBUG if (ohcidebug > 10) { - ohci_dump_tds(xfer->td_transfer_first); + ohci_dump_tds(sc, xfer->td_transfer_first); } #endif @@ -979,6 +996,7 @@ static void ohci_check_transfer_sub(struct usb_xfer *xfer) { + ohci_softc_t *sc = OHCI_BUS2SC(xfer->xroot->bus); ohci_td_t *td; ohci_ed_t *ed; uint32_t phy_start; @@ -991,9 +1009,9 @@ while (1) { usb_pc_cpu_invalidate(td->page_cache); - phy_start = le32toh(td->td_cbp); - td_flags = le32toh(td->td_flags); - td_next = le32toh(td->td_next); + phy_start = O32TOH(td->td_cbp); + td_flags = O32TOH(td->td_flags); + td_next = O32TOH(td->td_next); /* Check for last transfer */ if (((void *)td) == xfer->td_transfer_last) { @@ -1063,6 +1081,7 @@ static uint8_t ohci_check_transfer(struct usb_xfer *xfer) { + ohci_softc_t *sc = OHCI_BUS2SC(xfer->xroot->bus); ohci_ed_t *ed; uint32_t ed_headp; uint32_t ed_tailp; @@ -1072,8 +1091,8 @@ ed = xfer->qh_start[xfer->flags_int.curr_dma_set]; usb_pc_cpu_invalidate(ed->page_cache); - ed_headp = le32toh(ed->ed_headp); - ed_tailp = le32toh(ed->ed_tailp); + ed_headp = O32TOH(ed->ed_headp); + ed_tailp = O32TOH(ed->ed_tailp); if ((ed_headp & OHCI_HALTED) || (((ed_headp ^ ed_tailp) & (~0xF)) == 0)) { @@ -1163,7 +1182,7 @@ } #endif - done = le32toh(hcca->hcca_done_head); + done = O32TOH(hcca->hcca_done_head); /* * The LSb of done is used to inform the HC Driver that an interrupt @@ -1280,7 +1299,8 @@ } static void -ohci_setup_standard_chain_sub(struct ohci_std_temp *temp) +ohci_setup_standard_chain_sub(struct ohci_softc *sc, + struct ohci_std_temp *temp) { struct usb_page_search buf_res; ohci_td_t *td; @@ -1300,10 +1320,10 @@ /* software is used to detect short incoming transfers */ - if ((temp->td_flags & htole32(OHCI_TD_DP_MASK)) == htole32(OHCI_TD_IN)) { - temp->td_flags |= htole32(OHCI_TD_R); + if ((temp->td_flags & HTOO32(OHCI_TD_DP_MASK)) == HTOO32(OHCI_TD_IN)) { + temp->td_flags |= HTOO32(OHCI_TD_R); } else { - temp->td_flags &= ~htole32(OHCI_TD_R); + temp->td_flags &= ~HTOO32(OHCI_TD_R); } restart: @@ -1357,7 +1377,7 @@ td->td_flags = temp->td_flags; /* the next TD uses TOGGLE_CARRY */ - temp->td_flags &= ~htole32(OHCI_TD_TOGGLE_MASK); + temp->td_flags &= ~HTOO32(OHCI_TD_TOGGLE_MASK); if (average == 0) { /* @@ -1371,11 +1391,11 @@ } else { usbd_get_page(temp->pc, buf_offset, &buf_res); - td->td_cbp = htole32(buf_res.physaddr); + td->td_cbp = HTOO32(buf_res.physaddr); buf_offset += (average - 1); usbd_get_page(temp->pc, buf_offset, &buf_res); - td->td_be = htole32(buf_res.physaddr); + td->td_be = HTOO32(buf_res.physaddr); buf_offset++; td->len = average; @@ -1387,9 +1407,9 @@ if ((td_next == td_alt_next) && temp->setup_alt_next) { /* we need to receive these frames one by one ! */ - td->td_flags &= htole32(~OHCI_TD_INTR_MASK); - td->td_flags |= htole32(OHCI_TD_SET_DI(1)); - td->td_next = htole32(OHCI_TD_NEXT_END); + td->td_flags &= HTOO32(~OHCI_TD_INTR_MASK); + td->td_flags |= HTOO32(OHCI_TD_SET_DI(1)); + td->td_next = HTOO32(OHCI_TD_NEXT_END); } else { if (td_next) { /* link the current TD with the next one */ @@ -1424,7 +1444,8 @@ } static void -ohci_setup_standard_chain(struct usb_xfer *xfer, ohci_ed_t **ed_last) +ohci_setup_standard_chain(struct ohci_softc *sc, struct usb_xfer *xfer, + ohci_ed_t **ed_last) { struct ohci_std_temp temp; struct usb_pipe_methods *methods; @@ -1461,7 +1482,7 @@ if (xfer->flags_int.control_xfr) { if (xfer->flags_int.control_hdr) { - temp.td_flags = htole32(OHCI_TD_SETUP | OHCI_TD_NOCC | + temp.td_flags = HTOO32(OHCI_TD_SETUP | OHCI_TD_NOCC | OHCI_TD_TOGGLE_0 | OHCI_TD_NOINTR); temp.len = xfer->frlengths[0]; @@ -1475,7 +1496,7 @@ temp.setup_alt_next = 0; } } - ohci_setup_standard_chain_sub(&temp); + ohci_setup_standard_chain_sub(sc, &temp); /* * XXX assume that the setup message is @@ -1487,22 +1508,22 @@ } else { x = 0; } - temp.td_flags = htole32(OHCI_TD_NOCC | OHCI_TD_NOINTR); + temp.td_flags = HTOO32(OHCI_TD_NOCC | OHCI_TD_NOINTR); /* set data toggle */ if (xfer->endpoint->toggle_next) { - temp.td_flags |= htole32(OHCI_TD_TOGGLE_1); + temp.td_flags |= HTOO32(OHCI_TD_TOGGLE_1); } else { - temp.td_flags |= htole32(OHCI_TD_TOGGLE_0); + temp.td_flags |= HTOO32(OHCI_TD_TOGGLE_0); } /* set endpoint direction */ if (UE_GET_DIR(xfer->endpointno) == UE_DIR_IN) { - temp.td_flags |= htole32(OHCI_TD_IN); + temp.td_flags |= HTOO32(OHCI_TD_IN); } else { - temp.td_flags |= htole32(OHCI_TD_OUT); + temp.td_flags |= HTOO32(OHCI_TD_OUT); } while (x != xfer->nframes) { @@ -1539,7 +1560,7 @@ temp.shortpkt = (xfer->flags.force_short_xfer) ? 0 : 1; } - ohci_setup_standard_chain_sub(&temp); + ohci_setup_standard_chain_sub(sc, &temp); } /* check if we should append a status stage */ @@ -1555,10 +1576,10 @@ /* set endpoint direction and data toggle */ if (UE_GET_DIR(xfer->endpointno) == UE_DIR_IN) { - temp.td_flags = htole32(OHCI_TD_OUT | + temp.td_flags = HTOO32(OHCI_TD_OUT | OHCI_TD_NOCC | OHCI_TD_TOGGLE_1 | OHCI_TD_SET_DI(1)); } else { - temp.td_flags = htole32(OHCI_TD_IN | + temp.td_flags = HTOO32(OHCI_TD_IN | OHCI_TD_NOCC | OHCI_TD_TOGGLE_1 | OHCI_TD_SET_DI(1)); } @@ -1568,14 +1589,14 @@ temp.last_frame = 1; temp.setup_alt_next = 0; - ohci_setup_standard_chain_sub(&temp); + ohci_setup_standard_chain_sub(sc, &temp); } td = temp.td; /* Ensure that last TD is terminating: */ - td->td_next = htole32(OHCI_TD_NEXT_END); - td->td_flags &= ~htole32(OHCI_TD_INTR_MASK); - td->td_flags |= htole32(OHCI_TD_SET_DI(1)); + td->td_next = HTOO32(OHCI_TD_NEXT_END); + td->td_flags &= ~HTOO32(OHCI_TD_INTR_MASK); + td->td_flags |= HTOO32(OHCI_TD_SET_DI(1)); usb_pc_cpu_flush(td->page_cache); @@ -1587,7 +1608,7 @@ if (ohcidebug > 8) { DPRINTF("nexttog=%d; data before transfer:\n", xfer->endpoint->toggle_next); - ohci_dump_tds(xfer->td_transfer_first); + ohci_dump_tds(sc, xfer->td_transfer_first); } #endif @@ -1602,7 +1623,7 @@ if (xfer->xroot->udev->speed == USB_SPEED_LOW) { ed_flags |= OHCI_ED_SPEED; } - ed->ed_flags = htole32(ed_flags); + ed->ed_flags = HTOO32(ed_flags); td = xfer->td_transfer_first; @@ -1726,7 +1747,7 @@ ohci_softc_t *sc = OHCI_BUS2SC(xfer->xroot->bus); /* setup TD's and QH */ - ohci_setup_standard_chain(xfer, &sc->sc_bulk_p_last); + ohci_setup_standard_chain(sc, xfer, &sc->sc_bulk_p_last); /* put transfer on interrupt queue */ ohci_transfer_intr_enqueue(xfer); @@ -1767,7 +1788,7 @@ ohci_softc_t *sc = OHCI_BUS2SC(xfer->xroot->bus); /* setup TD's and QH */ - ohci_setup_standard_chain(xfer, &sc->sc_ctrl_p_last); + ohci_setup_standard_chain(sc, xfer, &sc->sc_ctrl_p_last); /* put transfer on interrupt queue */ ohci_transfer_intr_enqueue(xfer); @@ -1839,7 +1860,8 @@ ohci_softc_t *sc = OHCI_BUS2SC(xfer->xroot->bus); /* setup TD's and QH */ - ohci_setup_standard_chain(xfer, &sc->sc_intr_p_last[xfer->qh_pos]); + ohci_setup_standard_chain(sc, xfer, + &sc->sc_intr_p_last[xfer->qh_pos]); /* put transfer on interrupt queue */ ohci_transfer_intr_enqueue(xfer); @@ -1888,7 +1910,7 @@ hcca = ohci_get_hcca(sc); - nframes = le32toh(hcca->hcca_frame_number); + nframes = O32TOH(hcca->hcca_frame_number); DPRINTFN(6, "xfer=%p isoc_next=%u nframes=%u hcca_fn=%u\n", xfer, xfer->endpoint->isoc_next, xfer->nframes, nframes); @@ -1957,7 +1979,7 @@ (nframes == 0)) { /* fill current ITD */ - td->itd_flags = htole32( + td->itd_flags = HTOO32( OHCI_ITD_NOCC | OHCI_ITD_SET_SF(xfer->endpoint->isoc_next) | OHCI_ITD_NOINTR | @@ -1980,9 +2002,9 @@ length = OHCI_PAGE_MASK(buf_res.physaddr); buf_res.physaddr = OHCI_PAGE(buf_res.physaddr); - td->itd_bp0 = htole32(buf_res.physaddr); + td->itd_bp0 = HTOO32(buf_res.physaddr); usbd_get_page(xfer->frbuffers, buf_offset - 1, &buf_res); - td->itd_be = htole32(buf_res.physaddr); + td->itd_be = HTOO32(buf_res.physaddr); while (ncur--) { itd_offset[ncur] += length; @@ -2006,8 +2028,8 @@ } /* update the last TD */ - td_last->itd_flags &= ~htole32(OHCI_ITD_NOINTR); - td_last->itd_flags |= htole32(OHCI_ITD_SET_DI(0)); + td_last->itd_flags &= ~HTOO32(OHCI_ITD_NOINTR); + td_last->itd_flags |= HTOO32(OHCI_ITD_SET_DI(0)); td_last->itd_next = 0; usb_pc_cpu_flush(td_last->page_cache); @@ -2017,7 +2039,7 @@ #ifdef USB_DEBUG if (ohcidebug > 8) { DPRINTF("data before transfer:\n"); - ohci_dump_itds(xfer->td_transfer_first); + ohci_dump_itds(sc, xfer->td_transfer_first); } #endif ed = xfer->qh_start[xfer->flags_int.curr_dma_set]; @@ -2034,7 +2056,7 @@ if (xfer->xroot->udev->speed == USB_SPEED_LOW) { ed_flags |= OHCI_ED_SPEED; } - ed->ed_flags = htole32(ed_flags); + ed->ed_flags = HTOO32(ed_flags); td = xfer->td_transfer_first; @@ -2512,7 +2534,7 @@ td = page_info.buffer; /* init TD */ - td->td_self = htole32(page_info.physaddr); + td->td_self = HTOO32(page_info.physaddr); td->obj_next = last_obj; td->page_cache = pc + n; @@ -2536,7 +2558,7 @@ itd = page_info.buffer; /* init TD */ - itd->itd_self = htole32(page_info.physaddr); + itd->itd_self = HTOO32(page_info.physaddr); itd->obj_next = last_obj; itd->page_cache = pc + n; @@ -2564,7 +2586,7 @@ ed = page_info.buffer; /* init QH */ - ed->ed_self = htole32(page_info.physaddr); + ed->ed_self = HTOO32(page_info.physaddr); ed->obj_next = last_obj; ed->page_cache = pc + n; Index: ohci.h =================================================================== RCS file: /home/ncvs/src/sys/dev/usb/controller/ohci.h,v retrieving revision 1.7 diff -u -r1.7 ohci.h --- ohci.h 29 May 2009 18:46:57 -0000 1.7 +++ ohci.h 30 Aug 2009 15:42:53 -0000 @@ -321,6 +321,10 @@ struct usb_bus sc_bus; /* base device */ struct usb_callout sc_tmo_rhsc; union ohci_hub_desc sc_hub_desc; + int sc_endian; +#define OHCI_LITTLE_ENDIAN 0 /* typical (uninitialized default) */ +#define OHCI_BIG_ENDIAN 1 /* big endian OHCI? never seen it */ +#define OHCI_HOST_ENDIAN 2 /* if OHCI always matches CPU */ struct usb_device *sc_devices[OHCI_MAX_DEVICES]; struct resource *sc_io_res;