Lines Matching refs:sc

60 static void ehci_dump_regs(ehci_softc_t *sc);
61 static void ehci_dump_sqh(ehci_softc_t *sc, ehci_qh_t *sqh);
89 static void ehci_root_intr(ehci_softc_t *sc);
92 ehci_softc_t *sc;
111 ehci_softc_t *sc = EHCI_BUS2SC(bus);
114 cb(bus, &sc->sc_hw.pframes_pc, &sc->sc_hw.pframes_pg,
117 cb(bus, &sc->sc_hw.terminate_pc, &sc->sc_hw.terminate_pg,
120 cb(bus, &sc->sc_hw.async_start_pc, &sc->sc_hw.async_start_pg,
124 cb(bus, sc->sc_hw.intr_start_pc + i,
125 sc->sc_hw.intr_start_pg + i,
130 cb(bus, sc->sc_hw.isoc_hs_start_pc + i,
131 sc->sc_hw.isoc_hs_start_pg + i,
136 cb(bus, sc->sc_hw.isoc_fs_start_pc + i,
137 sc->sc_hw.isoc_fs_start_pg + i,
143 ehci_reset(ehci_softc_t *sc)
148 EOWRITE4(sc, EHCI_USBCMD, EHCI_CMD_HCRESET);
151 hcr = EOREAD4(sc, EHCI_USBCMD) & EHCI_CMD_HCRESET;
153 if (sc->sc_vendor_post_reset != NULL)
154 sc->sc_vendor_post_reset(sc);
158 device_printf(sc->sc_bus.bdev, "Reset timeout\n");
163 ehci_hcreset(ehci_softc_t *sc)
168 EOWRITE4(sc, EHCI_USBCMD, 0); /* Halt controller */
171 hcr = EOREAD4(sc, EHCI_USBSTS) & EHCI_STS_HCH;
181 device_printf(sc->sc_bus.bdev, "stop timeout\n");
183 return (ehci_reset(sc));
187 ehci_init_sub(struct ehci_softc *sc)
194 cparams = EREAD4(sc, EHCI_HCCPARAMS);
202 EOWRITE4(sc, EHCI_CTRLDSSEGMENT, 0);
205 usbd_get_page(&sc->sc_hw.pframes_pc, 0, &buf_res);
206 EOWRITE4(sc, EHCI_PERIODICLISTBASE, buf_res.physaddr);
208 usbd_get_page(&sc->sc_hw.async_start_pc, 0, &buf_res);
209 EOWRITE4(sc, EHCI_ASYNCLISTADDR, buf_res.physaddr | EHCI_LINK_QH);
212 EOWRITE4(sc, EHCI_USBINTR, sc->sc_eintrs);
215 EOWRITE4(sc, EHCI_USBCMD,
217 (EOREAD4(sc, EHCI_USBCMD) & EHCI_CMD_FLS_M) |
223 EOWRITE4(sc, EHCI_CONFIGFLAG, EHCI_CONF_CF);
227 hcr = EOREAD4(sc, EHCI_USBSTS) & EHCI_STS_HCH;
233 device_printf(sc->sc_bus.bdev, "run timeout\n");
240 ehci_init(ehci_softc_t *sc)
256 callout_init_mtx(&sc->sc_tmo_pcd, &sc->sc_bus.bus_mtx, 0);
257 callout_init_mtx(&sc->sc_tmo_poll, &sc->sc_bus.bus_mtx, 0);
259 sc->sc_offs = EHCI_CAPLENGTH(EREAD4(sc, EHCI_CAPLEN_HCIVERSION));
263 sc->sc_flags |= EHCI_SCFLG_IAADBUG;
265 sc->sc_flags |= EHCI_SCFLG_LOSTINTRBUG;
267 ehci_dump_regs(sc);
271 version = EHCI_HCIVERSION(EREAD4(sc, EHCI_CAPLEN_HCIVERSION));
272 device_printf(sc->sc_bus.bdev, "EHCI version %x.%x\n",
275 sparams = EREAD4(sc, EHCI_HCSPARAMS);
278 sc->sc_noport = EHCI_HCS_N_PORTS(sparams);
279 sc->sc_bus.usbrev = USB_REV_2_0;
280 if (!(sc->sc_flags & EHCI_SCFLG_DONTRESET)) {
283 device_get_nameunit(sc->sc_bus.bdev));
284 err = ehci_hcreset(sc);
286 device_printf(sc->sc_bus.bdev, "reset timeout\n");
295 if (EHCI_CMD_FLS(EOREAD4(sc, EHCI_USBCMD)) == 3) {
296 device_printf(sc->sc_bus.bdev, "invalid frame-list-size\n");
300 sc->sc_bus.methods = &ehci_bus_methods;
302 sc->sc_eintrs = EHCI_NORMAL_INTRS;
304 usbd_get_page(&sc->sc_hw.terminate_pc, 0, &buf_res);
307 sc->sc_terminate_self = htohc32(sc, buf_res.physaddr);
311 htohc32(sc, EHCI_LINK_TERMINATE);
313 htohc32(sc, EHCI_LINK_TERMINATE);
315 htohc32(sc, EHCI_QTD_HALTED);
318 usbd_get_page(sc->sc_hw.intr_start_pc + i, 0, &buf_res);
324 qh_t->page_cache = sc->sc_hw.intr_start_pc + i;
328 sc->sc_intr_p_last[i] = qh_t;
331 htohc32(sc, buf_res.physaddr) |
332 htohc32(sc, EHCI_LINK_QH);
335 htohc32(sc, EHCI_QH_SET_EPS(EHCI_QH_SPEED_HIGH));
337 htohc32(sc, EHCI_QH_SET_MULT(1));
341 htohc32(sc, EHCI_LINK_TERMINATE);
343 htohc32(sc, EHCI_LINK_TERMINATE);
345 htohc32(sc, EHCI_QTD_HALTED);
361 qh_x = sc->sc_intr_p_last[x];
362 qh_y = sc->sc_intr_p_last[y];
374 qh_t = sc->sc_intr_p_last[0];
377 qh_t->qh_link = htohc32(sc, EHCI_LINK_TERMINATE);
383 usbd_get_page(sc->sc_hw.isoc_fs_start_pc + i, 0, &buf_res);
388 sitd->page_cache = sc->sc_hw.isoc_fs_start_pc + i;
392 sc->sc_isoc_fs_p_last[i] = sitd;
397 htohc32(sc, buf_res.physaddr) |
398 htohc32(sc, EHCI_LINK_SITD);
401 htohc32(sc, EHCI_LINK_TERMINATE);
404 sc->sc_intr_p_last[i | (EHCI_VIRTUAL_FRAMELIST_COUNT / 2)]->qh_self;
406 usbd_get_page(sc->sc_hw.isoc_hs_start_pc + i, 0, &buf_res);
412 itd->page_cache = sc->sc_hw.isoc_hs_start_pc + i;
416 sc->sc_isoc_hs_p_last[i] = itd;
421 htohc32(sc, buf_res.physaddr) |
422 htohc32(sc, EHCI_LINK_ITD);
428 usbd_get_page(&sc->sc_hw.pframes_pc, 0, &buf_res);
438 pframes[i] = sc->sc_isoc_hs_p_last
442 usbd_get_page(&sc->sc_hw.async_start_pc, 0, &buf_res);
448 qh_t->page_cache = &sc->sc_hw.async_start_pc;
452 sc->sc_async_p_last = qh_t;
457 htohc32(sc, buf_res.physaddr) |
458 htohc32(sc, EHCI_LINK_QH);
462 htohc32(sc, EHCI_QH_SET_EPS(EHCI_QH_SPEED_HIGH) | EHCI_QH_HRECL);
463 qh_t->qh_endphub = htohc32(sc, EHCI_QH_SET_MULT(1));
468 qh_t->qh_qtd.qtd_next = htohc32(sc, EHCI_LINK_TERMINATE);
469 qh_t->qh_qtd.qtd_altnext = htohc32(sc, EHCI_LINK_TERMINATE);
470 qh_t->qh_qtd.qtd_status = htohc32(sc, EHCI_QTD_HALTED);
474 usb_bus_mem_flush_all(&sc->sc_bus, &ehci_iterate_hw_softc);
478 ehci_dump_sqh(sc, sc->sc_async_p_last);
483 err = ehci_init_sub(sc);
487 ehci_do_poll(&sc->sc_bus);
496 ehci_detach(ehci_softc_t *sc)
498 USB_BUS_LOCK(&sc->sc_bus);
500 callout_stop(&sc->sc_tmo_pcd);
501 callout_stop(&sc->sc_tmo_poll);
503 EOWRITE4(sc, EHCI_USBINTR, 0);
504 USB_BUS_UNLOCK(&sc->sc_bus);
506 if (ehci_hcreset(sc)) {
513 callout_drain(&sc->sc_tmo_pcd);
514 callout_drain(&sc->sc_tmo_poll);
518 ehci_suspend(ehci_softc_t *sc)
523 (void)ehci_hcreset(sc);
527 ehci_resume(ehci_softc_t *sc)
530 (void)ehci_hcreset(sc);
533 (void)ehci_init_sub(sc);
536 ehci_do_poll(&sc->sc_bus);
541 ehci_dump_regs(ehci_softc_t *sc)
545 i = EOREAD4(sc, EHCI_USBCMD);
581 i = EOREAD4(sc, EHCI_USBSTS);
607 EOREAD4(sc, EHCI_USBINTR));
609 EOREAD4(sc, EHCI_FRINDEX),
610 EOREAD4(sc, EHCI_CTRLDSSEGMENT),
611 EOREAD4(sc, EHCI_PERIODICLISTBASE),
612 EOREAD4(sc, EHCI_ASYNCLISTADDR));
613 for (i = 1; i <= sc->sc_noport; i++) {
615 EOREAD4(sc, EHCI_PORTSC(i)));
620 ehci_dump_link(ehci_softc_t *sc, uint32_t link, int type)
622 link = hc32toh(sc, link);
649 ehci_dump_qtd(ehci_softc_t *sc, ehci_qtd_t *qtd)
654 ehci_dump_link(sc, qtd->qtd_next, 0);
656 ehci_dump_link(sc, qtd->qtd_altnext, 0);
658 s = hc32toh(sc, qtd->qtd_status);
675 hc32toh(sc, qtd->qtd_buffer[s]));
679 hc32toh(sc, qtd->qtd_buffer_hi[s]));
684 ehci_dump_sqtd(ehci_softc_t *sc, ehci_qtd_t *sqtd)
689 PRINTK("QTD(%p) at 0x%08x:\n", sqtd, hc32toh(sc, sqtd->qtd_self));
690 ehci_dump_qtd(sc, sqtd);
691 temp = (sqtd->qtd_next & htohc32(sc, EHCI_LINK_TERMINATE)) ? 1 : 0;
696 ehci_dump_sqtds(ehci_softc_t *sc, ehci_qtd_t *sqtd)
703 stop = ehci_dump_sqtd(sc, sqtd);
711 ehci_dump_sqh(ehci_softc_t *sc, ehci_qh_t *qh)
717 PRINTK("QH(%p) at 0x%08x:\n", qh, hc32toh(sc, qh->qh_self) & ~0x1F);
719 ehci_dump_link(sc, qh->qh_link, 1);
721 endp = hc32toh(sc, qh->qh_endp);
730 endphub = hc32toh(sc, qh->qh_endphub);
737 ehci_dump_link(sc, qh->qh_curqtd, 0);
740 ehci_dump_qtd(sc, (void *)&qh->qh_qtd);
744 ehci_dump_sitd(ehci_softc_t *sc, ehci_sitd_t *sitd)
747 PRINTK("SITD(%p) at 0x%08x\n", sitd, hc32toh(sc, sitd->sitd_self) & ~0x1F);
748 PRINTK(" next=0x%08x\n", hc32toh(sc, sitd->sitd_next));
750 hc32toh(sc, sitd->sitd_portaddr),
751 (sitd->sitd_portaddr & htohc32(sc, EHCI_SITD_SET_DIR_IN))
753 EHCI_SITD_GET_ADDR(hc32toh(sc, sitd->sitd_portaddr)),
754 EHCI_SITD_GET_ENDPT(hc32toh(sc, sitd->sitd_portaddr)),
755 EHCI_SITD_GET_PORT(hc32toh(sc, sitd->sitd_portaddr)),
756 EHCI_SITD_GET_HUBA(hc32toh(sc, sitd->sitd_portaddr)));
757 PRINTK(" mask=0x%08x\n", hc32toh(sc, sitd->sitd_mask));
758 PRINTK(" status=0x%08x <%s> len=0x%x\n", hc32toh(sc, sitd->sitd_status),
759 (sitd->sitd_status & htohc32(sc, EHCI_SITD_ACTIVE)) ? "ACTIVE" : "",
760 EHCI_SITD_GET_LEN(hc32toh(sc, sitd->sitd_status)));
762 hc32toh(sc, sitd->sitd_back),
763 hc32toh(sc, sitd->sitd_bp[0]),
764 hc32toh(sc, sitd->sitd_bp[1]),
765 hc32toh(sc, sitd->sitd_bp_hi[0]),
766 hc32toh(sc, sitd->sitd_bp_hi[1]));
770 ehci_dump_itd(ehci_softc_t *sc, ehci_itd_t *itd)
773 PRINTK("ITD(%p) at 0x%08x\n", itd, hc32toh(sc, itd->itd_self) & ~0x1F);
774 PRINTK(" next=0x%08x\n", hc32toh(sc, itd->itd_next));
775 PRINTK(" status[0]=0x%08x; <%s>\n", hc32toh(sc, itd->itd_status[0]),
776 (itd->itd_status[0] & htohc32(sc, EHCI_ITD_ACTIVE)) ? "ACTIVE" : "");
777 PRINTK(" status[1]=0x%08x; <%s>\n", hc32toh(sc, itd->itd_status[1]),
778 (itd->itd_status[1] & htohc32(sc, EHCI_ITD_ACTIVE)) ? "ACTIVE" : "");
779 PRINTK(" status[2]=0x%08x; <%s>\n", hc32toh(sc, itd->itd_status[2]),
780 (itd->itd_status[2] & htohc32(sc, EHCI_ITD_ACTIVE)) ? "ACTIVE" : "");
781 PRINTK(" status[3]=0x%08x; <%s>\n", hc32toh(sc, itd->itd_status[3]),
782 (itd->itd_status[3] & htohc32(sc, EHCI_ITD_ACTIVE)) ? "ACTIVE" : "");
783 PRINTK(" status[4]=0x%08x; <%s>\n", hc32toh(sc, itd->itd_status[4]),
784 (itd->itd_status[4] & htohc32(sc, EHCI_ITD_ACTIVE)) ? "ACTIVE" : "");
785 PRINTK(" status[5]=0x%08x; <%s>\n", hc32toh(sc, itd->itd_status[5]),
786 (itd->itd_status[5] & htohc32(sc, EHCI_ITD_ACTIVE)) ? "ACTIVE" : "");
787 PRINTK(" status[6]=0x%08x; <%s>\n", hc32toh(sc, itd->itd_status[6]),
788 (itd->itd_status[6] & htohc32(sc, EHCI_ITD_ACTIVE)) ? "ACTIVE" : "");
789 PRINTK(" status[7]=0x%08x; <%s>\n", hc32toh(sc, itd->itd_status[7]),
790 (itd->itd_status[7] & htohc32(sc, EHCI_ITD_ACTIVE)) ? "ACTIVE" : "");
791 PRINTK(" bp[0]=0x%08x\n", hc32toh(sc, itd->itd_bp[0]));
793 EHCI_ITD_GET_ADDR(hc32toh(sc, itd->itd_bp[0])),
794 EHCI_ITD_GET_ENDPT(hc32toh(sc, itd->itd_bp[0])));
795 PRINTK(" bp[1]=0x%08x\n", hc32toh(sc, itd->itd_bp[1]));
797 (hc32toh(sc, itd->itd_bp[1]) & EHCI_ITD_SET_DIR_IN) ? "in" : "out",
798 EHCI_ITD_GET_MPL(hc32toh(sc, itd->itd_bp[1])));
800 hc32toh(sc, itd->itd_bp[2]),
801 hc32toh(sc, itd->itd_bp[3]),
802 hc32toh(sc, itd->itd_bp[4]),
803 hc32toh(sc, itd->itd_bp[5]),
804 hc32toh(sc, itd->itd_bp[6]));
807 hc32toh(sc, itd->itd_bp_hi[0]),
808 hc32toh(sc, itd->itd_bp_hi[1]),
809 hc32toh(sc, itd->itd_bp_hi[2]),
810 hc32toh(sc, itd->itd_bp_hi[3]),
811 hc32toh(sc, itd->itd_bp_hi[4]),
812 hc32toh(sc, itd->itd_bp_hi[5]),
813 hc32toh(sc, itd->itd_bp_hi[6]));
817 ehci_dump_isoc(ehci_softc_t *sc)
824 pos = (EOREAD4(sc, EHCI_FRINDEX) / 8) &
830 itd = sc->sc_isoc_hs_p_last[pos];
831 sitd = sc->sc_isoc_fs_p_last[pos];
834 ehci_dump_itd(sc, itd);
839 ehci_dump_sitd(sc, sitd);
870 /* (sc->sc_bus.mtx) must be locked */
896 /* (sc->sc_bus.mtx) must be locked */
927 /* (sc->sc_bus.mtx) must be locked */
954 /* (sc->sc_bus.mtx) must be locked */
974 /* (sc->sc_bus.mtx) must be locked */
994 /* (sc->sc_bus.mtx) must be locked */
1041 ehci_softc_t *sc = EHCI_BUS2SC(xfer->xroot->bus);
1055 status = hc32toh(sc, td->qtd_status);
1145 ehci_softc_t *sc = EHCI_BUS2SC(xfer->xroot->bus);
1146 ehci_dump_sqtds(sc, xfer->td_transfer_first);
1195 ehci_softc_t *sc = EHCI_BUS2SC(xfer->xroot->bus);
1208 status = hc32toh(sc, td->sitd_status);
1214 status |= hc32toh(sc, td->sitd_status);
1250 if (!(status & htohc32(sc, EHCI_ITD_ACTIVE))) {
1270 status = hc32toh(sc, qh->qh_qtd.qtd_status);
1278 status = hc32toh(sc, td->qtd_status);
1331 ehci_pcd_enable(ehci_softc_t *sc)
1333 USB_BUS_LOCK_ASSERT(&sc->sc_bus, MA_OWNED);
1335 sc->sc_eintrs |= EHCI_STS_PCD;
1336 EOWRITE4(sc, EHCI_USBINTR, sc->sc_eintrs);
1339 EOWRITE4(sc, EHCI_USBSTS, EHCI_STS_PCD);
1341 ehci_root_intr(sc);
1345 ehci_interrupt_poll(ehci_softc_t *sc)
1350 TAILQ_FOREACH(xfer, &sc->sc_bus.intr_q.head, wait_entry) {
1377 ehci_softc_t *sc = (ehci_softc_t *)ehci_arg;
1380 ehci_interrupt_poll(sc);
1386 * NOTE: Do not access "sc->sc_bus.bdev" inside the interrupt handler,
1387 * hence the interrupt handler will be setup before "sc->sc_bus.bdev"
1391 ehci_interrupt(unsigned int irq, ehci_softc_t *sc)
1395 USB_BUS_LOCK(&sc->sc_bus);
1400 ehci_dump_regs(sc);
1404 status = EHCI_STS_INTRS(EOREAD4(sc, EHCI_USBSTS));
1410 if (!(status & sc->sc_eintrs)) {
1413 EOWRITE4(sc, EHCI_USBSTS, status); /* acknowledge */
1415 status &= sc->sc_eintrs;
1419 ehci_dump_regs(sc);
1420 ehci_dump_isoc(sc);
1428 sc->sc_eintrs &= ~EHCI_STS_PCD;
1429 EOWRITE4(sc, EHCI_USBINTR, sc->sc_eintrs);
1431 ehci_root_intr(sc);
1434 callout_reset(&sc->sc_tmo_pcd, hz,
1435 (void *)&ehci_pcd_enable, sc);
1441 sc->sc_eintrs &= ~status;
1442 EOWRITE4(sc, EHCI_USBINTR, sc->sc_eintrs);
1445 ehci_interrupt_poll(sc);
1447 if (sc->sc_flags & EHCI_SCFLG_LOSTINTRBUG) {
1448 callout_reset(&sc->sc_tmo_poll, hz / 128,
1449 (void *)&ehci_poll_timeout, sc);
1453 USB_BUS_UNLOCK(&sc->sc_bus);
1475 ehci_softc_t *sc = EHCI_BUS2SC(bus);
1477 USB_BUS_LOCK(&sc->sc_bus);
1478 ehci_interrupt_poll(sc);
1479 USB_BUS_UNLOCK(&sc->sc_bus);
1497 terminate = temp->sc->sc_terminate_self;
1498 qtd_altnext = temp->sc->sc_terminate_self;
1552 htohc32(temp->sc, EHCI_QTD_IOC |
1560 htohc32(temp->sc, EHCI_QTD_TOGGLE_MASK);
1584 htohc32(temp->sc, EHCI_QTD_TOGGLE_MASK);
1598 htohc32(temp->sc, buf_res.physaddr);
1600 htohc32(temp->sc, (unsigned int)buf_res.buffer);
1611 htohc32(temp->sc,
1632 htohc32(temp->sc,
1703 temp.sc = EHCI_BUS2SC(xfer->xroot->bus);
1724 htohc32(temp.sc, EHCI_QTD_SET_TOGGLE(1U));
1735 htohc32(temp.sc, EHCI_QTD_SET_CERR(3));
1744 htohc32(temp.sc, EHCI_QTD_SET_CERR(3));
1745 temp.qtd_status |= htohc32(temp.sc,
1791 htohc32(temp.sc, EHCI_QTD_SET_CERR(3) |
1809 htohc32(temp.sc, EHCI_QTD_ACTIVE |
1811 htohc32(temp.sc, EHCI_QTD_ACTIVE |
1826 temp.qtd_status &= htohc32(temp.sc, EHCI_QTD_SET_CERR(3) |
1830 htohc32(temp.sc, EHCI_QTD_ACTIVE |
1833 htohc32(temp.sc, EHCI_QTD_ACTIVE |
1850 td->qtd_next = htohc32(temp.sc, EHCI_LINK_TERMINATE);
1851 td->qtd_altnext = htohc32(temp.sc, EHCI_LINK_TERMINATE);
1863 ehci_dump_sqtds(temp.sc,
1904 qh->qh_endp = htohc32(temp.sc, qh_endp);
1913 qh->qh_endphub = htohc32(temp.sc, qh_endphub);
1920 qh->qh_qtd.qtd_status = htohc32(temp.sc, EHCI_QTD_SET_TOGGLE(1U));
1929 htohc32(temp.sc, EHCI_LINK_TERMINATE);
1953 ehci_root_intr(ehci_softc_t *sc)
1957 USB_BUS_LOCK_ASSERT(&sc->sc_bus, MA_OWNED);
1960 (void)memset_s(sc->sc_hub_idata, sizeof(sc->sc_hub_idata), 0, sizeof(sc->sc_hub_idata));
1963 m = (sc->sc_noport + 1);
1964 if (m > (8 * sizeof(sc->sc_hub_idata))) {
1965 m = (8 * sizeof(sc->sc_hub_idata));
1969 if (EOREAD4(sc, EHCI_PORTSC(i)) & EHCI_PS_CLEAR) {
1970 sc->sc_hub_idata[i / 8] |= 1 << (i % 8);
1974 uhub_root_intr(&sc->sc_bus, sc->sc_hub_idata,
1975 sizeof(sc->sc_hub_idata));
1979 ehci_isoc_fs_done(ehci_softc_t *sc, struct usb_xfer *xfer)
1986 ehci_sitd_t **pp_last = &sc->sc_isoc_fs_p_last[xfer->qh_pos];
1996 if (pp_last >= &sc->sc_isoc_fs_p_last[EHCI_VIRTUAL_FRAMELIST_COUNT]) {
1997 pp_last = &sc->sc_isoc_fs_p_last[0];
2002 ehci_dump_sitd(sc, td);
2006 status = hc32toh(sc, td->sitd_status);
2032 ehci_isoc_hs_done(ehci_softc_t *sc, struct usb_xfer *xfer)
2040 ehci_itd_t **pp_last = &sc->sc_isoc_hs_p_last[xfer->qh_pos];
2050 if (pp_last >= &sc->sc_isoc_hs_p_last[EHCI_VIRTUAL_FRAMELIST_COUNT]) {
2051 pp_last = &sc->sc_isoc_hs_p_last[0];
2056 ehci_dump_itd(sc, td);
2061 status = hc32toh(sc, td->itd_status[td_no]);
2108 ehci_softc_t *sc = EHCI_BUS2SC(xfer->xroot->bus);
2110 USB_BUS_LOCK_ASSERT(&sc->sc_bus, MA_OWNED);
2121 ehci_dump_sqtds(sc,
2128 sc->sc_async_p_last);
2134 sc->sc_intr_p_last[xfer->qh_pos]);
2144 ehci_isoc_fs_done(sc, xfer);
2147 ehci_isoc_hs_done(sc, xfer);
2178 ehci_doorbell_async(struct ehci_softc *sc)
2189 temp = EOREAD4(sc, EHCI_USBCMD);
2191 EOWRITE4(sc, EHCI_USBCMD, temp | EHCI_CMD_IAAD);
2197 ehci_softc_t *sc = EHCI_BUS2SC(xfer->xroot->bus);
2200 ehci_setup_standard_chain(xfer, &sc->sc_async_p_last);
2209 if (sc->sc_flags & EHCI_SCFLG_IAADBUG)
2212 ehci_doorbell_async(sc);
2247 ehci_softc_t *sc = EHCI_BUS2SC(xfer->xroot->bus);
2250 ehci_setup_standard_chain(xfer, &sc->sc_async_p_last);
2270 ehci_softc_t *sc = EHCI_BUS2SC(xfer->xroot->bus);
2288 if (sc->sc_intr_stat[x] <
2289 sc->sc_intr_stat[best]) {
2299 sc->sc_intr_stat[best]++;
2309 ehci_softc_t *sc = EHCI_BUS2SC(xfer->xroot->bus);
2311 sc->sc_intr_stat[xfer->qh_pos]--;
2328 ehci_softc_t *sc = EHCI_BUS2SC(xfer->xroot->bus);
2331 ehci_setup_standard_chain(xfer, &sc->sc_intr_p_last[xfer->qh_pos]);
2351 ehci_softc_t *sc = EHCI_BUS2SC(xfer->xroot->bus);
2365 sitd_portaddr = htohc32(sc, sitd_portaddr);
2380 td->sitd_back = htohc32(sc, EHCI_LINK_TERMINATE);
2397 ehci_softc_t *sc = EHCI_BUS2SC(xfer->xroot->bus);
2419 nframes = EOREAD4(sc, EHCI_FRINDEX) / 8;
2452 usb_isoc_time_expand(&sc->sc_bus, nframes) +
2470 pp_last = &sc->sc_isoc_fs_p_last[xfer->endpoint->isoc_next];
2481 if (pp_last >= &sc->sc_isoc_fs_p_last[EHCI_VIRTUAL_FRAMELIST_COUNT])
2482 pp_last = &sc->sc_isoc_fs_p_last[0];
2519 td->sitd_bp[0] = htohc32(sc, buf_res.physaddr);
2521 td->sitd_bp[0] = htohc32(sc, (unsigned int)buf_res.buffer);
2571 td->sitd_bp[1] = htohc32(sc, temp);
2573 td->sitd_mask = htohc32(sc, sitd_mask);
2576 td->sitd_status = htohc32(sc,
2581 td->sitd_status = htohc32(sc,
2590 ehci_dump_sitd(sc, td);
2605 xfer->endpoint->isoc_next = (pp_last - &sc->sc_isoc_fs_p_last[0]) &
2647 ehci_softc_t *sc = EHCI_BUS2SC(xfer->xroot->bus);
2669 td->itd_bp[0] = htohc32(sc,
2681 td->itd_bp[1] = htohc32(sc, temp);
2684 td->itd_bp[2] = htohc32(sc, xfer->max_packet_count & 3);
2704 ehci_softc_t *sc = EHCI_BUS2SC(xfer->xroot->bus);
2728 nframes = EOREAD4(sc, EHCI_FRINDEX) / 8;
2761 usb_isoc_time_expand(&sc->sc_bus, nframes) + buf_offset +
2780 pp_last = &sc->sc_isoc_hs_p_last[xfer->endpoint->isoc_next];
2791 if (pp_last >= &sc->sc_isoc_hs_p_last[EHCI_VIRTUAL_FRAMELIST_COUNT]) {
2792 pp_last = &sc->sc_isoc_hs_p_last[0];
2811 td->itd_status[td_no] = htohc32(sc, status);
2843 td->itd_bp[0] &= htohc32(sc, 0xFFF);
2844 td->itd_bp[0] |= htohc32(sc, page_addr);
2854 td->itd_status[x] |= htohc32(sc, status);
2884 td->itd_bp[page_no] &= htohc32(sc, 0xFFF);
2885 td->itd_bp[page_no] |= htohc32(sc, page_addr);
2891 td->itd_status[td_no - 1] |= htohc32(sc, EHCI_ITD_IOC);
2897 ehci_dump_itd(sc, td);
2913 xfer->endpoint->isoc_next = (pp_last - &sc->sc_isoc_hs_p_last[0]) &
3000 ehci_get_port_speed_portsc(struct ehci_softc *sc, uint16_t index)
3004 v = EOREAD4(sc, EHCI_PORTSC(index));
3015 ehci_get_port_speed_hostc(struct ehci_softc *sc, uint16_t index)
3019 v = EOREAD4(sc, EHCI_HOSTC(index));
3033 ehci_softc_t *sc = EHCI_BUS2SC(udev->bus);
3044 USB_BUS_LOCK_ASSERT(&sc->sc_bus, MA_OWNED);
3047 ptr = (const void *)&sc->sc_hub_desc;
3070 sc->sc_hub_desc.temp[0] = sc->sc_conf;
3112 str_ptr = sc->sc_vendor;
3125 sc->sc_hub_desc.temp,
3126 sizeof(sc->sc_hub_desc.temp),
3136 sc->sc_hub_desc.temp[0] = 0;
3140 USETW(sc->sc_hub_desc.stat.wStatus, UDS_SELF_POWERED);
3145 USETW(sc->sc_hub_desc.stat.wStatus, 0);
3152 sc->sc_addr = value;
3159 sc->sc_conf = value;
3179 (index > sc->sc_noport)) {
3184 v = EOREAD4(sc, port) & ~EHCI_PS_CLEAR;
3187 EOWRITE4(sc, port, v & ~EHCI_PS_PE);
3195 EOWRITE4(sc, port, v | EHCI_PS_FPR);
3198 usb_pause_mtx(&sc->sc_bus.bus_mtx, hz / 50);
3200 EOWRITE4(sc, port, v & ~(EHCI_PS_SUSP |
3204 usb_pause_mtx(&sc->sc_bus.bus_mtx, hz / 250);
3207 EOWRITE4(sc, port, v & ~EHCI_PS_PP);
3216 EOWRITE4(sc, port, v & ~EHCI_PS_PIC);
3219 EOWRITE4(sc, port, v | EHCI_PS_CSC);
3222 EOWRITE4(sc, port, v | EHCI_PS_PEC);
3225 EOWRITE4(sc, port, v | EHCI_PS_SUSP);
3228 EOWRITE4(sc, port, v | EHCI_PS_OCC);
3231 sc->sc_isreset = 0;
3243 v = EREAD4(sc, EHCI_HCSPARAMS);
3245 sc->sc_hub_desc.hubd = ehci_hubd;
3246 sc->sc_hub_desc.hubd.bNbrPorts = sc->sc_noport;
3256 USETW(sc->sc_hub_desc.hubd.wHubCharacteristics, i);
3258 sc->sc_hub_desc.hubd.bPwrOn2PwrGood = 200;
3260 sc->sc_hub_desc.hubd.bDescLength =
3261 8 + ((sc->sc_noport + 7) / 8);
3262 len = sc->sc_hub_desc.hubd.bDescLength;
3266 (void)memset_s(sc->sc_hub_desc.temp, sizeof(sc->sc_hub_desc.temp), 0, len);
3272 (index > sc->sc_noport)) {
3276 v = EOREAD4(sc, EHCI_PORTSC(index));
3278 if (sc->sc_flags & EHCI_SCFLG_TT) {
3279 if (sc->sc_vendor_get_port_speed != NULL) {
3280 i = sc->sc_vendor_get_port_speed(sc, index);
3282 device_printf(sc->sc_bus.bdev,
3302 USETW(sc->sc_hub_desc.ps.wPortStatus, i);
3312 if (sc->sc_isreset)
3314 USETW(sc->sc_hub_desc.ps.wPortChange, i);
3315 len = sizeof(sc->sc_hub_desc.ps);
3324 (index > sc->sc_noport)) {
3329 v = EOREAD4(sc, port) & ~EHCI_PS_CLEAR;
3332 EOWRITE4(sc, port, v | EHCI_PS_PE);
3335 EOWRITE4(sc, port, v | EHCI_PS_SUSP);
3340 (sc->sc_flags & EHCI_SCFLG_TT) == 0) {
3348 EOWRITE4(sc, port, v | EHCI_PS_PR);
3351 usb_pause_mtx(&sc->sc_bus.bus_mtx,
3355 if (!(sc->sc_flags & EHCI_SCFLG_NORESTERM))
3356 EOWRITE4(sc, port, v);
3359 usb_pause_mtx(&sc->sc_bus.bus_mtx,
3362 v = EOREAD4(sc, port);
3365 device_printf(sc->sc_bus.bdev,
3371 (sc->sc_flags & EHCI_SCFLG_TT) == 0) {
3377 sc->sc_isreset = 1;
3384 EOWRITE4(sc, port, v | EHCI_PS_PP);
3393 EOWRITE4(sc, port, v | EHCI_PS_PIC);
3421 ehci_softc_t *sc;
3430 sc = EHCI_BUS2SC(parm->udev->bus);
3579 td->itd_self = htohc32(sc, page_info.physaddr | EHCI_LINK_ITD);
3581 td->itd_self = htohc32(sc, (unsigned int)page_info.buffer | EHCI_LINK_ITD);
3607 td->sitd_self = htohc32(sc, page_info.physaddr | EHCI_LINK_SITD);
3609 td->sitd_self = htohc32(sc, (unsigned int)page_info.buffer | EHCI_LINK_SITD);
3635 qtd->qtd_self = htohc32(sc, page_info.physaddr);
3637 qtd->qtd_self = htohc32(sc, (unsigned int)page_info.buffer);
3667 qh->qh_self = htohc32(sc, page_info.physaddr | EHCI_LINK_QH);
3669 qh->qh_self = htohc32(sc, (unsigned int)page_info.buffer | EHCI_LINK_QH);
3697 ehci_softc_t *sc = EHCI_BUS2SC(udev->bus);
3702 sc->sc_addr);
3704 if (udev->device_index != sc->sc_addr) {
3757 ehci_softc_t *sc = EHCI_BUS2SC(udev->bus);
3765 TAILQ_FOREACH(xfer, &sc->sc_bus.intr_q.head, wait_entry) {
3772 sc->sc_async_p_last);
3776 sc->sc_intr_p_last[xfer->qh_pos]);
3789 ehci_softc_t *sc = EHCI_BUS2SC(udev->bus);
3797 TAILQ_FOREACH(xfer, &sc->sc_bus.intr_q.head, wait_entry) {
3806 sc->sc_async_p_last);
3810 sc->sc_intr_p_last[xfer->qh_pos]);
3821 struct ehci_softc *sc = EHCI_BUS2SC(bus);
3826 ehci_suspend(sc);
3829 ehci_resume(sc);
3839 ehci_softc_t *sc = EHCI_BUS2SC(bus);
3849 temp = EOREAD4(sc, EHCI_USBCMD);
3863 EOWRITE4(sc, EHCI_USBCMD, temp);
3873 struct ehci_softc *sc = EHCI_BUS2SC(xfer->xroot->bus);
3878 ehci_doorbell_async(sc);
3893 struct ehci_softc *sc = EHCI_BUS2SC(xfer->xroot->bus);
3898 ehci_doorbell_async(sc);