49#ifdef USB_GLOBAL_INCLUDE_FILE
50#include USB_GLOBAL_INCLUDE_FILE
52#include <sys/stdint.h>
53#include <sys/stddef.h>
58#include <sys/kernel.h>
60#include <sys/module.h>
63#include <sys/condvar.h>
64#include <sys/sysctl.h>
66#include <sys/unistd.h>
67#include <sys/callout.h>
68#include <sys/malloc.h>
74#define USB_DEBUG_VAR ehcidebug
92#define EHCI_BUS2SC(bus) \
93 __containerof(bus, ehci_softc_t, sc_bus)
96static int ehcidebug = 0;
97static int ehcinohighspeed = 0;
98static int ehciiaadbug = 0;
99static int ehcilostintrbug = 0;
101static SYSCTL_NODE(_hw_usb, OID_AUTO, ehci, CTLFLAG_RW | CTLFLAG_MPSAFE, 0,
104 &ehcidebug, 0,
"Debug level");
105SYSCTL_INT(_hw_usb_ehci, OID_AUTO, no_hs, CTLFLAG_RWTUN,
106 &ehcinohighspeed, 0,
"Disable High Speed USB");
107SYSCTL_INT(_hw_usb_ehci, OID_AUTO, iaadbug, CTLFLAG_RWTUN,
108 &ehciiaadbug, 0,
"Enable doorbell bug workaround");
109SYSCTL_INT(_hw_usb_ehci, OID_AUTO, lostintrbug, CTLFLAG_RWTUN,
110 &ehcilostintrbug, 0,
"Enable lost interrupt bug workaround");
117#define EHCI_INTR_ENDPT 1
190 for (i = 0; i < 100; i++) {
199 device_printf(sc->
sc_bus.
bdev,
"reset timeout\n");
210 for (i = 0; i < 100; i++) {
222 device_printf(sc->
sc_bus.
bdev,
"stop timeout\n");
237 DPRINTF(
"cparams=0x%x\n", cparams);
240 DPRINTF(
"HCC uses 64-bit structures\n");
266 for (i = 0; i < 100; i++) {
274 device_printf(sc->
sc_bus.
bdev,
"run timeout\n");
310 device_printf(sc->
sc_bus.
bdev,
"EHCI version %x.%x\n",
311 version >> 8, version & 0xff);
314 DPRINTF(
"sparams=0x%x\n", sparams);
326 device_printf(sc->
sc_bus.
bdev,
"reset timeout\n");
336 device_printf(sc->
sc_bus.
bdev,
"invalid frame-list-size\n");
378 htohc32(sc, buf_res.physaddr) |
406 y = (x ^ bit) | (bit / 2);
448 htohc32(sc, buf_res.physaddr) |
472 htohc32(sc, buf_res.physaddr) |
514 htohc32(sc, buf_res.physaddr) |
603 printf(
"cmd=0x%08x\n", i);
606 printf(
" EHCI_CMD_ITC_1\n");
608 printf(
" EHCI_CMD_ITC_2\n");
610 printf(
" EHCI_CMD_ITC_4\n");
612 printf(
" EHCI_CMD_ITC_8\n");
614 printf(
" EHCI_CMD_ITC_16\n");
616 printf(
" EHCI_CMD_ITC_32\n");
618 printf(
" EHCI_CMD_ITC_64\n");
620 printf(
" EHCI_CMD_ASPME\n");
622 printf(
" EHCI_CMD_ASPMC\n");
624 printf(
" EHCI_CMD_LHCR\n");
626 printf(
" EHCI_CMD_IAAD\n");
628 printf(
" EHCI_CMD_ASE\n");
630 printf(
" EHCI_CMD_PSE\n");
632 printf(
" EHCI_CMD_FLS_M\n");
634 printf(
" EHCI_CMD_HCRESET\n");
636 printf(
" EHCI_CMD_RS\n");
640 printf(
"sts=0x%08x\n", i);
643 printf(
" EHCI_STS_ASS\n");
645 printf(
" EHCI_STS_PSS\n");
647 printf(
" EHCI_STS_REC\n");
649 printf(
" EHCI_STS_HCH\n");
651 printf(
" EHCI_STS_IAA\n");
653 printf(
" EHCI_STS_HSE\n");
655 printf(
" EHCI_STS_FLR\n");
657 printf(
" EHCI_STS_PCD\n");
659 printf(
" EHCI_STS_ERRINT\n");
661 printf(
" EHCI_STS_INT\n");
663 printf(
"ien=0x%08x\n",
665 printf(
"frindex=0x%08x ctrdsegm=0x%08x periodic=0x%08x async=0x%08x\n",
671 printf(
"port %d status=0x%08x\n", i,
677ehci_dump_link(
ehci_softc_t *sc, uint32_t link,
int type)
680 printf(
"0x%08x", link);
711 ehci_dump_link(sc, qtd->
qtd_next, 0);
716 printf(
" status=0x%08x: toggle=%d bytes=0x%x ioc=%d c_page=0x%x\n",
719 printf(
" cerr=%d pid=%d stat=%s%s%s%s%s%s%s%s\n",
730 for (s = 0; s < 5; s++) {
731 printf(
" buffer[%d]=0x%08x\n", s,
734 for (s = 0; s < 5; s++) {
735 printf(
" buffer_hi[%d]=0x%08x\n", s,
747 ehci_dump_qtd(sc, sqtd);
759 for (i = 0; sqtd && (i < 20) && !stop; sqtd = sqtd->
obj_next, i++) {
760 stop = ehci_dump_sqtd(sc, sqtd);
763 printf(
"dump aborted, too many TDs\n");
774 printf(
"QH(%p) at 0x%08x:\n", qh,
hc32toh(sc, qh->
qh_self) & ~0x1F);
776 ehci_dump_link(sc, qh->
qh_link, 1);
779 printf(
" endp=0x%08x\n", endp);
780 printf(
" addr=0x%02x inact=%d endpt=%d eps=%d dtc=%d hrecl=%d\n",
784 printf(
" mpl=0x%x ctl=%d nrl=%d\n",
788 printf(
" endphub=0x%08x\n", endphub);
789 printf(
" smask=0x%02x cmask=0x%02x huba=0x%02x port=%d mult=%d\n",
796 printf(
"Overlay qTD:\n");
797 ehci_dump_qtd(sc, (
void *)&qh->
qh_qtd);
806 printf(
" portaddr=0x%08x dir=%s addr=%d endpt=0x%x port=0x%x huba=0x%x\n",
818 printf(
" back=0x%08x, bp=0x%08x,0x%08x,0x%08x,0x%08x\n",
830 printf(
"ITD(%p) at 0x%08x\n", itd,
hc32toh(sc, itd->
itd_self) & ~0x1F);
849 printf(
" addr=0x%02x; endpt=0x%01x\n",
853 printf(
" dir=%s; mpl=0x%02x\n",
856 printf(
" bp[2..6]=0x%08x,0x%08x,0x%08x,0x%08x,0x%08x\n",
862 printf(
" bp_hi=0x%08x,0x%08x,0x%08x,0x%08x,\n"
863 " 0x%08x,0x%08x,0x%08x\n",
884 printf(
"%s: isochronous dump from frame 0x%03x:\n",
890 while (itd && max && max--) {
891 ehci_dump_itd(sc, itd);
895 while (sitd && max && max--) {
896 ehci_dump_sitd(sc, sitd);
919#define EHCI_APPEND_FS_TD(std,last) (last) = _ehci_append_fs_td(std,last)
923 DPRINTFN(11,
"%p to %p\n", std, last);
945#define EHCI_APPEND_HS_TD(std,last) (last) = _ehci_append_hs_td(std,last)
949 DPRINTFN(11,
"%p to %p\n", std, last);
971#define EHCI_APPEND_QH(sqh,last) (last) = _ehci_append_qh(sqh,last)
975 DPRINTFN(11,
"%p to %p\n", sqh, last);
977 if (sqh->
prev != NULL) {
979 DPRINTFN(0,
"QH already linked!\n");
1003#define EHCI_REMOVE_FS_TD(std,last) (last) = _ehci_remove_fs_td(std,last)
1007 DPRINTFN(11,
"%p from %p\n", std, last);
1020 return ((last == std) ? std->
prev : last);
1023#define EHCI_REMOVE_HS_TD(std,last) (last) = _ehci_remove_hs_td(std,last)
1027 DPRINTFN(11,
"%p from %p\n", std, last);
1040 return ((last == std) ? std->
prev : last);
1043#define EHCI_REMOVE_QH(sqh,last) (last) = _ehci_remove_qh(sqh,last)
1047 DPRINTFN(11,
"%p from %p\n", sqh, last);
1062 last = ((last == sqh) ? sqh->
prev : last);
1085 else if (actlen != xlen)
1120 DPRINTF(
"Invalid status length, "
1121 "0x%04x/0x%04x bytes\n",
len, td->
len);
1153 if (td->alt_next != td_alt_next) {
1165 DPRINTFN(11,
"error, addr=%d, endpt=0x%02x, frame=0x%02x"
1166 "status=%s%s%s%s%s%s%s%s\n",
1196 DPRINTFN(13,
"xfer=%p endpoint=%p transfer done\n",
1200 if (ehcidebug > 10) {
1259 DPRINTFN(13,
"xfer=%p checking transfer\n", xfer);
1383 DPRINTFN(13,
"xfer=%p is still active\n", xfer);
1410 TAILQ_FOREACH(xfer, &sc->
sc_bus.
intr_q.head, wait_entry) {
1457 DPRINTFN(16,
"real interrupt\n");
1460 if (ehcidebug > 15) {
1478 printf(
"%s: unrecoverable error, "
1479 "controller halted\n", __FUNCTION__);
1505 printf(
"%s: blocking interrupts 0x%x\n", __FUNCTION__,
status);
1552 uint32_t buf_offset;
1557 uint8_t shortpkt_old;
1565 len_old = temp->
len;
1574 if (temp->
len == 0) {
1586 if (temp->
len < average) {
1590 average = temp->
len;
1595 panic(
"%s: out of EHCI transfer descriptors!", __FUNCTION__);
1607 temp->
len -= average;
1628 td->qtd_buffer[0] = 0;
1629 td->qtd_buffer[1] = 0;
1630 td->qtd_buffer[2] = 0;
1631 td->qtd_buffer[3] = 0;
1632 td->qtd_buffer[4] = 0;
1633 td->qtd_buffer_hi[0] = 0;
1634 td->qtd_buffer_hi[1] = 0;
1635 td->qtd_buffer_hi[2] = 0;
1636 td->qtd_buffer_hi[3] = 0;
1637 td->qtd_buffer_hi[4] = 0;
1653 temp->
len -= average;
1660 td->qtd_buffer_hi[0] = 0;
1670 buf_res.physaddr & (~0xFFF));
1671 td->qtd_buffer_hi[x] = 0;
1683 buf_offset += average;
1687 buf_res.physaddr & (~0xFFF));
1688 td->qtd_buffer_hi[x] = 0;
1692 td->qtd_buffer[x] = 0;
1693 td->qtd_buffer_hi[x] = 0;
1699 td->qtd_next =
td_next->qtd_self;
1702 td->alt_next = td_alt_next;
1726 temp->
len = len_old;
1744 DPRINTFN(9,
"addr=%d endpt=%d sumlen=%d speed=%d\n",
1841 if (temp.
len == 0) {
1905 if (ehcidebug > 8) {
1906 DPRINTF(
"nexttog=%d; data before transfer:\n",
1908 ehci_dump_sqtds(temp.
sc,
2011 for (i = 1; i < m; i++) {
2015 DPRINTF(
"port %d changed\n", i);
2025 uint32_t nframes = xfer->
nframes;
2032 DPRINTFN(13,
"xfer=%p endpoint=%p transfer done\n",
2037 panic(
"%s:%d: out of TD's\n",
2038 __FUNCTION__, __LINE__);
2044 if (ehcidebug > 15) {
2046 ehci_dump_sitd(sc, td);
2054 DPRINTFN(2,
"status=0x%08x, rem=%u\n",
status,
len);
2078 uint32_t nframes = xfer->
nframes;
2086 DPRINTFN(13,
"xfer=%p endpoint=%p transfer done\n",
2091 panic(
"%s:%d: out of TD's\n",
2092 __FUNCTION__, __LINE__);
2098 if (ehcidebug > 15) {
2100 ehci_dump_itd(sc, td);
2109 DPRINTFN(2,
"status=0x%08x, len=%u\n",
status,
len);
2132 if ((td_no == 8) || (nframes == 0)) {
2155 DPRINTFN(2,
"xfer=%p, endpoint=%p, error=%d\n",
2161 if (ehcidebug > 8) {
2162 DPRINTF(
"nexttog=%d; data after transfer:\n",
2341 DPRINTFN(3,
"best=%d interval=%d\n",
2408 for (ds = 0; ds != 2; ds++) {
2441 uint32_t buf_offset;
2443 uint32_t startframe;
2455 DPRINTFN(6,
"xfer=%p next=%d nframes=%d\n",
2464 DPRINTFN(3,
"start next=%d\n", startframe);
2481 pp_last = &sc->sc_isoc_fs_p_last[startframe];
2485 xfer->
qh_pos = startframe;
2489 panic(
"%s:%d: out of TD's\n",
2490 __FUNCTION__, __LINE__);
2493 pp_last = &sc->sc_isoc_fs_p_last[0];
2501 printf(
"%s: frame length(%d) exceeds %d "
2502 "bytes (frame truncated)\n",
2503 __FUNCTION__, *
plen,
2512 sa = usbd_fs_isoc_schedule_alloc_slot(xfer,
2530 buf_offset += *
plen;
2537 temp = buf_res.physaddr & ~0xFFF;
2564 sa = (sb - sa) & 0x3F;
2567 sb = (-(4 << sa)) & 0xFE;
2568 sa = (1 << sa) & 0x3F;
2591 if (ehcidebug > 15) {
2592 DPRINTF(
"FS-TD %d\n", nframes);
2593 ehci_dump_sitd(sc, td);
2656 for (ds = 0; ds != 2; ds++) {
2708 bus_size_t page_addr;
2711 uint32_t buf_offset;
2713 uint32_t startframe;
2724 DPRINTFN(6,
"xfer=%p next=%d nframes=%d shift=%d\n",
2734 DPRINTFN(3,
"start next=%d\n", startframe);
2750 pp_last = &sc->sc_isoc_hs_p_last[startframe];
2754 xfer->
qh_pos = startframe;
2758 panic(
"%s:%d: out of TD's\n",
2759 __FUNCTION__, __LINE__);
2762 pp_last = &sc->sc_isoc_hs_p_last[0];
2769 printf(
"%s: frame length(%d) exceeds %d bytes "
2770 "(frame truncated)\n",
2783 buf_offset += *
plen;
2793 if ((td_no == 8) || (nframes == 0)) {
2795 for (x = td_no; x != 8; x++) {
2807 page_addr = buf_res.physaddr & ~0xFFF;
2812 for (x = 0; x != td_no; x++) {
2815 (buf_res.physaddr & 0xFFF));
2831 if ((buf_res.physaddr ^ page_addr) & ~0xFFF) {
2833 page_addr = buf_res.physaddr & ~0xFFF;
2835 panic(
"%s: too many pages\n", __FUNCTION__);
2850 if (ehcidebug > 15) {
2851 DPRINTF(
"HS-TD %d\n", nframes);
2852 ehci_dump_itd(sc, td);
2899 {0}, {0}, {0x00, 0x01},
2935 .bInterfaceProtocol = 0,
2942 .wMaxPacketSize[0] = 8,
2993 v =
EOREAD4(sc, port) & ~EHCI_PS_CLEAR;
3002 const char *str_ptr;
3022 DPRINTFN(3,
"type=0x%02x request=0x%02x wLen=0x%04x "
3023 "wValue=0x%04x wIndex=0x%04x\n",
3024 req->bmRequestType,
req->bRequest,
3027#define C(x,y) ((x) | ((y) << 8))
3028 switch (
C(
req->bRequest,
req->bmRequestType)) {
3042 switch (
value >> 8) {
3044 if ((
value & 0xff) != 0) {
3057 if ((
value & 0xff) != 0) {
3066 if ((
value & 0xff) != 0) {
3075 switch (
value & 0xff) {
3085 str_ptr =
"EHCI root HUB";
3145 DPRINTFN(9,
"UR_CLEAR_PORT_FEATURE\n");
3153 v =
EOREAD4(sc, port) & ~EHCI_PS_CLEAR;
3179 DPRINTFN(3,
"clear port test "
3183 DPRINTFN(3,
"clear port ind "
3208 if ((
value & 0xff) != 0) {
3238 DPRINTFN(9,
"get port status i=%d\n",
3246 DPRINTFN(9,
"port status=0x%04x\n", v);
3252 "EHCI_SCFLG_TT quirk is set but "
3253 "sc_vendor_get_hub_speed() is NULL\n");
3298 v =
EOREAD4(sc, port) & ~EHCI_PS_CLEAR;
3307 DPRINTFN(6,
"reset port %d\n",
index);
3309 if (ehcinohighspeed) {
3341 DPRINTF(
"ehci after reset, status=0x%08x\n", v);
3344 "port reset timeout\n");
3355 DPRINTF(
"ehci port %d reset, status = 0x%08x\n",
3360 DPRINTFN(3,
"set port power %d\n",
index);
3365 DPRINTFN(3,
"set port test %d\n",
index);
3369 DPRINTFN(3,
"set port ind %d\n",
index);
3456 nqtd = ((2 * xfer->
nframes) + 1
3510 nitd = ((xfer->
nframes + 7) / 8) <<
3538 for (
n = 0;
n != nitd;
n++) {
3562 for (
n = 0;
n != nsitd;
n++) {
3586 for (
n = 0;
n != nqtd;
n++) {
3614 for (
n = 0;
n != nqh;
n++) {
3651 DPRINTFN(2,
"endpoint=%p, addr=%d, endpt=%d, mode=%d (%d)\n",
3712 TAILQ_FOREACH(xfer, &sc->
sc_bus.
intr_q.head, wait_entry) {
3744 TAILQ_FOREACH(xfer, &sc->
sc_bus.
intr_q.head, wait_entry) {
3792 flags =
bus->hw_power_state;
3805 DPRINTF(
"Periodic is active\n");
static SYSCTL_NODE(_hw_usb, OID_AUTO, dwc_otg, CTLFLAG_RW|CTLFLAG_MPSAFE, 0, "USB DWC OTG")
SYSCTL_INT(_hw_usb_dwc_otg, OID_AUTO, phy_type, CTLFLAG_RDTUN, &dwc_otg_phy_type, 0, "DWC OTG PHY TYPE - 0/1/2/3 - ULPI/HSIC/INTERNAL/UTMI+")
#define EHCI_APPEND_HS_TD(std, last)
static void ehci_device_isoc_fs_enter(struct usb_xfer *xfer)
static void ehci_setup_standard_chain_sub(struct ehci_std_temp *temp)
static void ehci_device_bulk_enter(struct usb_xfer *xfer)
#define EHCI_REMOVE_QH(sqh, last)
static void ehci_device_bulk_start(struct usb_xfer *xfer)
static const struct usb_pipe_methods ehci_device_bulk_methods
static ehci_sitd_t * _ehci_remove_fs_td(ehci_sitd_t *std, ehci_sitd_t *last)
static void ehci_device_ctrl_open(struct usb_xfer *xfer)
static uint8_t ehci_check_transfer(struct usb_xfer *)
#define EHCI_APPEND_QH(sqh, last)
static usb_error_t ehci_hcreset(ehci_softc_t *sc)
static const struct ehci_config_desc ehci_confd
static void ehci_doorbell_async(struct ehci_softc *sc)
void ehci_interrupt(ehci_softc_t *sc)
static ehci_qh_t * _ehci_remove_qh(ehci_qh_t *sqh, ehci_qh_t *last)
static void ehci_device_isoc_fs_open(struct usb_xfer *xfer)
static const struct usb_bus_methods ehci_bus_methods
static ehci_itd_t * _ehci_append_hs_td(ehci_itd_t *std, ehci_itd_t *last)
static int ehci_init_sub(struct ehci_softc *sc)
static void ehci_root_intr(ehci_softc_t *sc)
uint16_t ehci_get_port_speed_hostc(struct ehci_softc *sc, uint16_t index)
static ehci_itd_t * _ehci_remove_hs_td(ehci_itd_t *std, ehci_itd_t *last)
static void ehci_disown(ehci_softc_t *sc, uint16_t index, uint8_t lowspeed)
static usb_error_t ehci_roothub_exec(struct usb_device *udev, struct usb_device_request *req, const void **pptr, uint16_t *plength)
void ehci_detach(ehci_softc_t *sc)
static void ehci_non_isoc_done(struct usb_xfer *xfer)
static void ehci_device_done(struct usb_xfer *, usb_error_t)
static void ehci_xfer_setup(struct usb_setup_params *parm)
static void ehci_device_isoc_fs_start(struct usb_xfer *xfer)
static const struct usb_pipe_methods ehci_device_isoc_fs_methods
static void ehci_device_resume(struct usb_device *udev)
static void ehci_device_intr_open(struct usb_xfer *xfer)
static void ehci_device_suspend(struct usb_device *udev)
static void ehci_device_isoc_fs_close(struct usb_xfer *xfer)
static const struct usb_device_qualifier ehci_odevd
static void ehci_device_isoc_hs_close(struct usb_xfer *xfer)
static const struct usb_hub_descriptor ehci_hubd
void ehci_iterate_hw_softc(struct usb_bus *bus, usb_bus_mem_sub_cb_t *cb)
static void ehci_timeout(void *)
static void ehci_set_hw_power(struct usb_bus *bus)
static void ehci_ep_init(struct usb_device *udev, struct usb_endpoint_descriptor *edesc, struct usb_endpoint *ep)
static void ehci_get_dma_delay(struct usb_device *udev, uint32_t *pus)
static void ehci_start_dma_delay(struct usb_xfer *xfer)
static const struct usb_pipe_methods ehci_device_intr_methods
static void ehci_isoc_fs_done(ehci_softc_t *sc, struct usb_xfer *xfer)
static const struct usb_pipe_methods ehci_device_isoc_hs_methods
static void ehci_device_ctrl_enter(struct usb_xfer *xfer)
static usb_error_t ehci_non_isoc_done_sub(struct usb_xfer *xfer)
static void ehci_pcd_enable(ehci_softc_t *sc)
static void ehci_isoc_hs_done(ehci_softc_t *sc, struct usb_xfer *xfer)
static void ehci_do_poll(struct usb_bus *)
static const struct usb_device_descriptor ehci_devd
static void ehci_device_bulk_open(struct usb_xfer *xfer)
static void ehci_data_toggle_update(struct usb_xfer *xfer, uint16_t actlen, uint16_t xlen)
static void ehci_device_isoc_hs_enter(struct usb_xfer *xfer)
usb_error_t ehci_reset(ehci_softc_t *sc)
static void ehci_set_hw_power_sleep(struct usb_bus *bus, uint32_t state)
#define EHCI_REMOVE_HS_TD(std, last)
static const struct usb_pipe_methods ehci_device_ctrl_methods
static void ehci_device_intr_start(struct usb_xfer *xfer)
static void ehci_interrupt_poll(ehci_softc_t *sc)
static void ehci_device_intr_enter(struct usb_xfer *xfer)
static void ehci_device_isoc_hs_start(struct usb_xfer *xfer)
#define EHCI_APPEND_FS_TD(std, last)
static ehci_sitd_t * _ehci_append_fs_td(ehci_sitd_t *std, ehci_sitd_t *last)
static void ehci_device_ctrl_close(struct usb_xfer *xfer)
static void ehci_transfer_intr_enqueue(struct usb_xfer *xfer)
static ehci_qh_t * _ehci_append_qh(ehci_qh_t *sqh, ehci_qh_t *last)
static void ehci_device_intr_close(struct usb_xfer *xfer)
static void ehci_device_ctrl_start(struct usb_xfer *xfer)
static void ehci_device_isoc_hs_open(struct usb_xfer *xfer)
#define EHCI_REMOVE_FS_TD(std, last)
static void ehci_xfer_unsetup(struct usb_xfer *xfer)
usb_error_t ehci_init(ehci_softc_t *sc)
static void ehci_start_dma_delay_second(struct usb_xfer *xfer)
uint16_t ehci_get_port_speed_portsc(struct ehci_softc *sc, uint16_t index)
static void ehci_suspend(ehci_softc_t *sc)
static void ehci_setup_standard_chain(struct usb_xfer *xfer, ehci_qh_t **qh_last)
static void ehci_resume(ehci_softc_t *sc)
static void ehci_poll_timeout(void *)
static void ehci_device_bulk_close(struct usb_xfer *xfer)
#define EHCI_QTD_GET_CERR(x)
#define EHCI_FRAMELIST_COUNT
volatile uint32_t qh_endphub
#define EHCI_QTD_GET_C_PAGE(x)
#define EHCI_QH_SET_HUBA(x)
#define EHCI_QTD_SPLITXSTATE
#define EHCI_QH_GET_DTC(x)
#define EHCI_SITD_GET_ADDR(x)
#define EHCI_SITD_GET_PORT(x)
#define EHCI_QH_SPEED_LOW
#define EHCI_QH_SPEED_HIGH
#define EHCI_ITD_GET_ENDPT(x)
#define EHCI_SITD_SET_DIR_IN
#define EHCI_ITD_GET_LEN(x)
#define EHCI_SITD_SET_CMASK(x)
#define EHCI_QH_GET_EPS(x)
#define EHCI_QTD_SET_BYTES(x)
#define EHCI_QTD_SET_CERR(x)
#define EHCI_SITD_SET_ADDR(x)
#define EHCI_ITD_SET_MPL(x)
#define EHCI_QH_GET_MPL(x)
#define EHCI_QH_SET_PORT(x)
#define EHCI_SITD_SET_SMASK(x)
#define EHCI_SITD_SET_PORT(x)
#define EHCI_QH_GET_PORT(x)
#define EHCI_QH_SET_SMASK(x)
#define EHCI_SITD_GET_ENDPT(x)
#define EHCI_SITD_SET_HUBA(x)
#define EHCI_QH_GET_ENDPT(x)
#define EHCI_QTD_GET_IOC(x)
#define EHCI_SITD_GET_LEN(x)
#define EHCI_QTD_GET_TOGGLE(x)
volatile uint32_t qtd_altnext
#define EHCI_QH_SET_CMASK(x)
#define EHCI_QH_SPEED_FULL
#define EHCI_QH_GET_HUBA(x)
#define EHCI_LINK_TERMINATE
#define EHCI_SCFLG_DONTRESET
#define EHCI_SITD_SET_LEN(len)
#define EHCI_SCFLG_NORESTERM
#define EHCI_SCFLG_IAADBUG
#define EHCI_ITD_SET_ADDR(x)
#define EHCI_QH_SET_EPS(x)
#define EHCI_QTD_TOGGLE_MASK
#define EHCI_QH_GET_NRL(x)
#define EHCI_QH_GET_SMASK(x)
#define EHCI_QTD_GET_PID(x)
static __inline uint32_t hc32toh(const struct ehci_softc *sc, const uint32_t v)
#define EHCI_QH_SET_ENDPT(x)
#define EHCI_QTD_SET_TOGGLE(x)
#define EHCI_QTD_STATERRS
#define EHCI_QH_SET_ADDR(x)
#define EHCI_ITD_SET_ENDPT(x)
#define EHCI_ITD_SET_LEN(x)
#define EHCI_VIRTUAL_FRAMELIST_COUNT
#define EHCI_QH_GET_HRECL(x)
#define EOWRITE4(sc, a, x)
volatile uint32_t qh_endp
static __inline uint32_t htohc32(const struct ehci_softc *sc, const uint32_t v)
#define EHCI_LINK_TYPE(x)
#define EHCI_QH_SET_MPL(x)
#define EHCI_QH_SET_NRL(x)
#define EHCI_QTD_PID_SETUP
#define EHCI_ITD_SET_DIR_IN
#define EHCI_QTD_NBUFFERS
#define EHCI_QH_GET_MULT(x)
#define EHCI_ITD_GET_ADDR(x)
#define EHCI_SITD_SET_ENDPT(x)
#define EHCI_QH_GET_INACT(x)
#define EHCI_FRAMELIST_ALIGN
#define EHCI_QTD_MISSEDMICRO
#define EHCI_SITD_GET_HUBA(x)
#define EHCI_QTD_SET_PID(x)
volatile uint32_t sitd_portaddr
#define EHCI_QTD_PAYLOAD_MAX
#define EHCI_QTD_PINGSTATE
#define EHCI_SCFLG_LOSTINTRBUG
volatile uint32_t sitd_mask
#define EHCI_ITD_SET_PG(x)
#define EHCI_QH_SET_MULT(x)
#define EHCI_QTD_GET_BYTES(x)
#define EHCI_ITD_GET_MPL(x)
#define EHCI_QH_GET_ADDR(x)
#define EHCI_QH_GET_CTL(x)
#define EHCI_QH_GET_CMASK(x)
#define EHCI_CAPLENGTH(x)
#define EHCI_PORT_SPEED_HIGH
#define EHCI_PORTSC_PSPD_MASK
#define EHCI_HOSTC_PSPD_MASK
#define EHCI_CTRLDSSEGMENT
#define EHCI_STS_INTRS(x)
#define EHCI_HCIVERSION(x)
#define EHCI_PORTSC_PSPD_SHIFT
#define EHCI_HCS_N_PORTS(x)
#define EHCI_PORT_RESET_COMPLETE
#define EHCI_HCC_64BIT(x)
#define EHCI_HOSTC_PSPD_SHIFT
#define EHCI_CAPLEN_HCIVERSION
#define EHCI_PS_IS_LOWSPEED(x)
#define EHCI_HCS_P_INDICATOR(x)
#define EHCI_PORT_SPEED_LOW
#define EHCI_PERIODICLISTBASE
#define EHCI_NORMAL_INTRS
#define EHCI_ASYNCLISTADDR
volatile uint32_t td_next
volatile uint16_t itd_offset[OHCI_ITD_NOFFSET]
struct usb_config_descriptor confd
struct usb_page_cache terminate_pc
struct usb_page async_start_pg
struct usb_page isoc_hs_start_pg[EHCI_VIRTUAL_FRAMELIST_COUNT]
struct usb_page isoc_fs_start_pg[EHCI_VIRTUAL_FRAMELIST_COUNT]
struct usb_page_cache pframes_pc
struct usb_page pframes_pg
struct usb_page intr_start_pg[EHCI_VIRTUAL_FRAMELIST_COUNT]
struct usb_page_cache async_start_pc
struct usb_page_cache isoc_fs_start_pc[EHCI_VIRTUAL_FRAMELIST_COUNT]
struct usb_page_cache isoc_hs_start_pc[EHCI_VIRTUAL_FRAMELIST_COUNT]
struct usb_page terminate_pg
struct usb_page_cache intr_start_pc[EHCI_VIRTUAL_FRAMELIST_COUNT]
struct ehci_itd * obj_next
volatile uint32_t itd_bp_hi[7]
volatile uint32_t itd_next
volatile uint32_t itd_status[8]
struct usb_page_cache * page_cache
volatile uint32_t itd_bp[7]
volatile uint32_t qtd_status
volatile uint32_t qtd_buffer[EHCI_QTD_NBUFFERS]
volatile uint32_t qtd_altnext
volatile uint32_t qtd_buffer_hi[EHCI_QTD_NBUFFERS]
volatile uint32_t qtd_next
struct usb_page_cache * page_cache
volatile uint32_t qh_link
struct ehci_qh_sub qh_qtd
volatile uint32_t qh_endp
struct ehci_qh * obj_next
volatile uint32_t qh_curqtd
volatile uint32_t qh_endphub
volatile uint32_t qtd_buffer_hi[EHCI_QTD_NBUFFERS]
struct usb_page_cache * page_cache
volatile uint32_t qtd_status
volatile uint32_t qtd_altnext
volatile uint32_t qtd_buffer[EHCI_QTD_NBUFFERS]
struct ehci_qtd * alt_next
struct ehci_qtd * obj_next
volatile uint32_t qtd_next
struct ehci_sitd * obj_next
volatile uint32_t sitd_back
volatile uint32_t sitd_bp_hi[2]
volatile uint32_t sitd_bp[2]
volatile uint32_t sitd_portaddr
volatile uint32_t sitd_next
volatile uint32_t sitd_mask
struct usb_page_cache * page_cache
volatile uint32_t sitd_status
struct usb_callout sc_tmo_pcd
struct ehci_qh * sc_intr_p_last[EHCI_VIRTUAL_FRAMELIST_COUNT]
struct usb_callout sc_tmo_poll
struct ehci_qh * sc_async_p_last
uint16_t sc_intr_stat[EHCI_VIRTUAL_FRAMELIST_COUNT]
void(* sc_vendor_post_reset)(struct ehci_softc *sc)
uint32_t sc_terminate_self
struct ehci_hw_softc sc_hw
struct ehci_itd * sc_isoc_hs_p_last[EHCI_VIRTUAL_FRAMELIST_COUNT]
struct ehci_sitd * sc_isoc_fs_p_last[EHCI_VIRTUAL_FRAMELIST_COUNT]
union ehci_hub_desc sc_hub_desc
uint16_t(* sc_vendor_get_port_speed)(struct ehci_softc *sc, uint16_t index)
struct usb_page_cache * pc
void(* endpoint_init)(struct usb_device *, struct usb_endpoint_descriptor *, struct usb_endpoint *)
const struct usb_bus_methods * methods
struct usb_xfer_queue intr_q
uByte bConfigurationValue
enum usb_hc_mode usb_mode
struct usb_device * parent_hs_hub
struct usb_device_flags flags
const struct usb_pipe_methods * methods
uWord wHubCharacteristics
void(* open)(struct usb_xfer *)
uint32_t hc_max_frame_size
uint8_t hc_max_packet_count
struct usb_xfer * curr_xfer
uint16_t hc_max_packet_size
const struct usb_pipe_methods * methods
usb_frlength_t * frlengths
usb_frlength_t max_data_length
struct usb_page_cache * frbuffers
struct usb_endpoint * endpoint
struct usb_xfer_flags_int flags_int
struct usb_xfer_flags flags
struct usb_xfer_root * xroot
usb_frlength_t max_hc_frame_size
uint16_t isoc_time_complete
struct usb_hub_descriptor hubd
struct usb_port_status ps
#define UHD_PWR_INDIVIDUAL
#define UT_WRITE_INTERFACE
#define UR_SET_DESCRIPTOR
#define UT_WRITE_CLASS_OTHER
#define UT_WRITE_CLASS_DEVICE
#define UPS_C_PORT_ENABLED
#define UPS_C_OVERCURRENT_INDICATOR
#define UR_CLEAR_TT_BUFFER
#define UHF_C_PORT_SUSPEND
#define UDESC_DEVICE_QUALIFIER
#define UHF_C_PORT_OVER_CURRENT
#define UT_WRITE_ENDPOINT
#define UT_READ_CLASS_DEVICE
#define UT_READ_CLASS_OTHER
#define UHF_PORT_INDICATOR
#define USB_FS_BYTES_PER_HS_UFRAME
#define UHD_PWR_NO_SWITCH
#define UPS_C_CONNECT_STATUS
#define UPS_CURRENT_CONNECT_STATUS
#define UHF_C_PORT_ENABLE
#define UPS_OVERCURRENT_INDICATOR
#define UT_READ_INTERFACE
#define UR_GET_DESCRIPTOR
#define UHF_C_PORT_CONNECTION
void usbd_get_page(struct usb_page_cache *pc, usb_frlength_t offset, struct usb_page_search *res)
void usb_pc_cpu_invalidate(struct usb_page_cache *pc)
void usb_pc_cpu_flush(struct usb_page_cache *pc)
#define USB_HW_POWER_RESUME
void usb_bus_mem_flush_all(struct usb_bus *bus, usb_bus_mem_cb_t *cb)
#define USB_HW_POWER_BULK
#define USB_HW_POWER_CONTROL
#define USB_HW_POWER_SUSPEND
#define USB_HW_POWER_SHUTDOWN
void() usb_bus_mem_sub_cb_t(struct usb_bus *bus, struct usb_page_cache *pc, struct usb_page *pg, usb_size_t size, usb_size_t align)
#define USB_HW_POWER_ISOC
#define USB_HW_POWER_INTERRUPT
#define USB_BUS_UNLOCK(_b)
#define USB_BUS_LOCK_ASSERT(_b, _t)
#define usb_port_root_reset_delay
enum usb_dev_speed usbd_get_speed(struct usb_device *udev)
#define USB_FS_ISOC_UFRAME_MAX
void uhub_root_intr(struct usb_bus *bus, const uint8_t *ptr, uint8_t len)
void usb_hs_bandwidth_alloc(struct usb_xfer *xfer)
void usb_hs_bandwidth_free(struct usb_xfer *xfer)
void usbd_transfer_setup_sub(struct usb_setup_params *parm)
void usbd_transfer_done(struct usb_xfer *xfer, usb_error_t error)
void usbd_xfer_set_frame_len(struct usb_xfer *xfer, usb_frcount_t frindex, usb_frlength_t len)
uint8_t usbd_xfer_get_fps_shift(struct usb_xfer *xfer)
void usb_dma_delay_done_cb(struct usb_xfer *xfer)
void usbd_transfer_enqueue(struct usb_xfer_queue *pq, struct usb_xfer *xfer)
uint8_t usbd_xfer_get_isochronous_start_frame(struct usb_xfer *xfer, uint32_t frame_curr, uint32_t frame_min, uint32_t frame_ms, uint32_t frame_mask, uint32_t *p_frame_start)
void usbd_transfer_timeout_ms(struct usb_xfer *xfer, void(*cb)(void *arg), usb_timeout_t ms)
uint8_t usbd_transfer_setup_sub_malloc(struct usb_setup_params *parm, struct usb_page_cache **ppc, usb_size_t size, usb_size_t align, usb_size_t count)
void usb_pause_mtx(struct mtx *mtx, int timo)
uint8_t usb_make_str_desc(void *ptr, uint16_t max_len, const char *s)
#define usb_callout_init_mtx(c, m, f)
#define usb_callout_reset(c,...)
@ USB_ERR_NORMAL_COMPLETION
#define usb_callout_drain(c)
#define USB_MS_TO_TICKS(ms)
#define usb_callout_stop(c)