Lines Matching +full:no +full:- +full:temp +full:- +full:support

1 /*-
2 * SPDX-License-Identifier: BSD-2-Clause
20 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
103 #define UBARR(sc) bus_space_barrier((sc)->sc_io_tag, (sc)->sc_io_hdl, 0, (sc)->sc_io_size, \
106 do { UBARR(sc); bus_space_write_1((sc)->sc_io_tag, (sc)->sc_io_hdl, (r), (x)); \
109 do { UBARR(sc); bus_space_write_2((sc)->sc_io_tag, (sc)->sc_io_hdl, (r), (x)); \
112 do { UBARR(sc); bus_space_write_4((sc)->sc_io_tag, (sc)->sc_io_hdl, (r), (x)); \
114 #define UREAD1(sc, r) (UBARR(sc), bus_space_read_1((sc)->sc_io_tag, (sc)->sc_io_hdl, (r)))
115 #define UREAD2(sc, r) (UBARR(sc), bus_space_read_2((sc)->sc_io_tag, (sc)->sc_io_hdl, (r)))
116 #define UREAD4(sc, r) (UBARR(sc), bus_space_read_4((sc)->sc_io_tag, (sc)->sc_io_hdl, (r)))
171 cb(bus, &sc->sc_hw.pframes_pc, &sc->sc_hw.pframes_pg, in uhci_iterate_hw_softc()
174 cb(bus, &sc->sc_hw.ls_ctl_start_pc, &sc->sc_hw.ls_ctl_start_pg, in uhci_iterate_hw_softc()
177 cb(bus, &sc->sc_hw.fs_ctl_start_pc, &sc->sc_hw.fs_ctl_start_pg, in uhci_iterate_hw_softc()
180 cb(bus, &sc->sc_hw.bulk_start_pc, &sc->sc_hw.bulk_start_pg, in uhci_iterate_hw_softc()
183 cb(bus, &sc->sc_hw.last_qh_pc, &sc->sc_hw.last_qh_pg, in uhci_iterate_hw_softc()
186 cb(bus, &sc->sc_hw.last_td_pc, &sc->sc_hw.last_td_pg, in uhci_iterate_hw_softc()
190 cb(bus, sc->sc_hw.isoc_start_pc + i, in uhci_iterate_hw_softc()
191 sc->sc_hw.isoc_start_pg + i, in uhci_iterate_hw_softc()
196 cb(bus, sc->sc_hw.intr_start_pc + i, in uhci_iterate_hw_softc()
197 sc->sc_hw.intr_start_pg + i, in uhci_iterate_hw_softc()
205 ml->buf_pc = xfer->frbuffers + 0; in uhci_mem_layout_init()
206 ml->fix_pc = xfer->buf_fixup; in uhci_mem_layout_init()
208 ml->buf_offset = 0; in uhci_mem_layout_init()
210 ml->max_frame_size = xfer->max_frame_size; in uhci_mem_layout_init()
216 usbd_get_page(ml->buf_pc, ml->buf_offset, &ml->buf_res); in uhci_mem_layout_fixup()
218 if (ml->buf_res.length < td->len) { in uhci_mem_layout_fixup()
221 usbd_get_page(ml->fix_pc, 0, &ml->fix_res); in uhci_mem_layout_fixup()
223 td->td_buffer = htole32(ml->fix_res.physaddr); in uhci_mem_layout_fixup()
230 * +----+----+ - - - in uhci_mem_layout_fixup()
232 * +----+----+ - - - in uhci_mem_layout_fixup()
235 * +----+ in uhci_mem_layout_fixup()
237 * +----+ in uhci_mem_layout_fixup()
240 if ((td->td_token & htole32(UHCI_TD_PID)) == in uhci_mem_layout_fixup()
242 td->fix_pc = ml->fix_pc; in uhci_mem_layout_fixup()
243 usb_pc_cpu_invalidate(ml->fix_pc); in uhci_mem_layout_fixup()
246 td->fix_pc = NULL; in uhci_mem_layout_fixup()
250 usbd_copy_out(ml->buf_pc, ml->buf_offset, in uhci_mem_layout_fixup()
251 ml->fix_res.buffer, td->len); in uhci_mem_layout_fixup()
253 usb_pc_cpu_flush(ml->fix_pc); in uhci_mem_layout_fixup()
258 ml->fix_pc++; in uhci_mem_layout_fixup()
261 td->td_buffer = htole32(ml->buf_res.physaddr); in uhci_mem_layout_fixup()
262 td->fix_pc = NULL; in uhci_mem_layout_fixup()
267 ml->buf_offset += td->len; in uhci_mem_layout_fixup()
280 USB_BUS_LOCK_ASSERT(&sc->sc_bus, MA_OWNED); in uhci_restart()
289 usbd_get_page(&sc->sc_hw.pframes_pc, 0, &buf_res); in uhci_restart()
301 usb_pause_mtx(&sc->sc_bus.bus_mtx, hz / 100); in uhci_restart()
317 USB_BUS_LOCK_ASSERT(&sc->sc_bus, MA_OWNED); in uhci_reset()
331 usb_pause_mtx(&sc->sc_bus.bus_mtx, in uhci_reset()
341 while (n--) { in uhci_reset()
344 usb_pause_mtx(&sc->sc_bus.bus_mtx, hz / 1000); in uhci_reset()
351 device_printf(sc->sc_bus.bdev, in uhci_reset()
357 while (n--) { in uhci_reset()
360 usb_pause_mtx(&sc->sc_bus.bus_mtx, hz / 1000); in uhci_reset()
368 device_printf(sc->sc_bus.bdev, in uhci_reset()
378 USB_BUS_UNLOCK(&sc->sc_bus); in uhci_reset()
381 usb_callout_drain(&sc->sc_root_intr); in uhci_reset()
383 USB_BUS_LOCK(&sc->sc_bus); in uhci_reset()
389 USB_BUS_LOCK_ASSERT(&sc->sc_bus, MA_OWNED); in uhci_start()
402 device_printf(sc->sc_bus.bdev, in uhci_start()
420 qh->qh_self = in uhci_init_qh()
424 qh->page_cache = pc; in uhci_init_qh()
439 td->td_self = in uhci_init_td()
443 td->page_cache = pc; in uhci_init_td()
457 usb_callout_init_mtx(&sc->sc_root_intr, &sc->sc_bus.bus_mtx, 0); in uhci_init()
467 sc->sc_ls_ctl_p_last = in uhci_init()
468 uhci_init_qh(&sc->sc_hw.ls_ctl_start_pc); in uhci_init()
470 sc->sc_fs_ctl_p_last = in uhci_init()
471 uhci_init_qh(&sc->sc_hw.fs_ctl_start_pc); in uhci_init()
473 sc->sc_bulk_p_last = in uhci_init()
474 uhci_init_qh(&sc->sc_hw.bulk_start_pc); in uhci_init()
476 sc->sc_reclaim_qh_p = in uhci_init()
477 sc->sc_fs_ctl_p_last; in uhci_init()
480 sc->sc_reclaim_qh_p = in uhci_init()
481 sc->sc_bulk_p_last; in uhci_init()
484 sc->sc_last_qh_p = in uhci_init()
485 uhci_init_qh(&sc->sc_hw.last_qh_pc); in uhci_init()
487 sc->sc_last_td_p = in uhci_init()
488 uhci_init_td(&sc->sc_hw.last_td_pc); in uhci_init()
491 sc->sc_isoc_p_last[x] = in uhci_init()
492 uhci_init_td(sc->sc_hw.isoc_start_pc + x); in uhci_init()
496 sc->sc_intr_p_last[x] = in uhci_init()
497 uhci_init_qh(sc->sc_hw.intr_start_pc + x); in uhci_init()
516 qh_x = sc->sc_intr_p_last[x]; in uhci_init()
517 qh_y = sc->sc_intr_p_last[y]; in uhci_init()
519 qh_x->h_next = NULL; in uhci_init()
520 qh_x->qh_h_next = qh_y->qh_self; in uhci_init()
521 qh_x->e_next = NULL; in uhci_init()
522 qh_x->qh_e_next = htole32(UHCI_PTR_T); in uhci_init()
532 qh_ls = sc->sc_ls_ctl_p_last; in uhci_init()
533 qh_intr = sc->sc_intr_p_last[0]; in uhci_init()
536 qh_intr->h_next = qh_ls; in uhci_init()
537 qh_intr->qh_h_next = qh_ls->qh_self; in uhci_init()
538 qh_intr->e_next = 0; in uhci_init()
539 qh_intr->qh_e_next = htole32(UHCI_PTR_T); in uhci_init()
545 td_x = sc->sc_isoc_p_last[x]; in uhci_init()
546 qh_intr = sc->sc_intr_p_last[x | (UHCI_IFRAMELIST_COUNT / 2)]; in uhci_init()
549 td_x->next = NULL; in uhci_init()
550 td_x->td_next = qh_intr->qh_self; in uhci_init()
551 td_x->td_status = htole32(UHCI_TD_IOS); in uhci_init()
552 td_x->td_token = htole32(0); in uhci_init()
553 td_x->td_buffer = htole32(0); in uhci_init()
560 qh_ls = sc->sc_ls_ctl_p_last; in uhci_init()
561 qh_fs = sc->sc_fs_ctl_p_last; in uhci_init()
564 qh_ls->h_next = qh_fs; in uhci_init()
565 qh_ls->qh_h_next = qh_fs->qh_self; in uhci_init()
566 qh_ls->e_next = 0; in uhci_init()
567 qh_ls->qh_e_next = htole32(UHCI_PTR_T); in uhci_init()
575 qh_ctl = sc->sc_fs_ctl_p_last; in uhci_init()
576 qh_blk = sc->sc_bulk_p_last; in uhci_init()
579 qh_ctl->h_next = qh_blk; in uhci_init()
580 qh_ctl->qh_h_next = qh_blk->qh_self; in uhci_init()
581 qh_ctl->e_next = 0; in uhci_init()
582 qh_ctl->qh_e_next = htole32(UHCI_PTR_T); in uhci_init()
584 qh_lst = sc->sc_last_qh_p; in uhci_init()
587 qh_blk->h_next = qh_lst; in uhci_init()
588 qh_blk->qh_h_next = qh_lst->qh_self; in uhci_init()
589 qh_blk->e_next = 0; in uhci_init()
590 qh_blk->qh_e_next = htole32(UHCI_PTR_T); in uhci_init()
592 td_lst = sc->sc_last_td_p; in uhci_init()
595 qh_lst->h_next = 0; in uhci_init()
596 qh_lst->qh_h_next = htole32(UHCI_PTR_T); /* end of QH chain */ in uhci_init()
597 qh_lst->e_next = td_lst; in uhci_init()
598 qh_lst->qh_e_next = td_lst->td_self; in uhci_init()
604 td_lst->next = 0; in uhci_init()
605 td_lst->td_next = htole32(UHCI_PTR_T); in uhci_init()
606 td_lst->td_status = htole32(0); /* inactive */ in uhci_init()
607 td_lst->td_token = htole32(0); in uhci_init()
608 td_lst->td_buffer = htole32(0); in uhci_init()
614 usbd_get_page(&sc->sc_hw.pframes_pc, 0, &buf_res); in uhci_init()
623 * pframes -> full speed isochronous -> interrupt QH's -> low in uhci_init()
624 * speed control -> full speed control -> bulk transfers in uhci_init()
630 sc->sc_isoc_p_last[x % UHCI_VFRAMELIST_COUNT]->td_self; in uhci_init()
635 usb_bus_mem_flush_all(&sc->sc_bus, &uhci_iterate_hw_softc); in uhci_init()
638 sc->sc_bus.methods = &uhci_bus_methods; in uhci_init()
640 USB_BUS_LOCK(&sc->sc_bus); in uhci_init()
646 USB_BUS_UNLOCK(&sc->sc_bus); in uhci_init()
649 uhci_do_poll(&sc->sc_bus); in uhci_init()
663 USB_BUS_LOCK(&sc->sc_bus); in uhci_suspend()
673 USB_BUS_UNLOCK(&sc->sc_bus); in uhci_suspend()
679 USB_BUS_LOCK(&sc->sc_bus); in uhci_resume()
693 USB_BUS_UNLOCK(&sc->sc_bus); in uhci_resume()
701 uhci_do_poll(&sc->sc_bus); in uhci_resume()
710 device_get_nameunit(sc->sc_bus.bdev), in uhci_dumpregs()
727 uint8_t temp; in uhci_dump_td() local
729 usb_pc_cpu_invalidate(p->page_cache); in uhci_dump_td()
731 td_next = le32toh(p->td_next); in uhci_dump_td()
732 td_status = le32toh(p->td_status); in uhci_dump_td()
733 td_token = le32toh(p->td_token); in uhci_dump_td()
739 temp = ((td_next & UHCI_PTR_T) || (td_next == 0)); in uhci_dump_td()
744 le32toh(p->td_self), in uhci_dump_td()
748 le32toh(p->td_buffer)); in uhci_dump_td()
753 (td_next & 1) ? "-T" : "", in uhci_dump_td()
754 (td_next & 2) ? "-Q" : "", in uhci_dump_td()
755 (td_next & 4) ? "-VF" : "", in uhci_dump_td()
756 (td_status & UHCI_TD_BITSTUFF) ? "-BITSTUFF" : "", in uhci_dump_td()
757 (td_status & UHCI_TD_CRCTO) ? "-CRCTO" : "", in uhci_dump_td()
758 (td_status & UHCI_TD_NAK) ? "-NAK" : "", in uhci_dump_td()
759 (td_status & UHCI_TD_BABBLE) ? "-BABBLE" : "", in uhci_dump_td()
760 (td_status & UHCI_TD_DBUFFER) ? "-DBUFFER" : "", in uhci_dump_td()
761 (td_status & UHCI_TD_STALLED) ? "-STALLED" : "", in uhci_dump_td()
762 (td_status & UHCI_TD_ACTIVE) ? "-ACTIVE" : "", in uhci_dump_td()
763 (td_status & UHCI_TD_IOC) ? "-IOC" : "", in uhci_dump_td()
764 (td_status & UHCI_TD_IOS) ? "-IOS" : "", in uhci_dump_td()
765 (td_status & UHCI_TD_LS) ? "-LS" : "", in uhci_dump_td()
766 (td_status & UHCI_TD_SPD) ? "-SPD" : "", in uhci_dump_td()
775 return (temp); in uhci_dump_td()
781 uint8_t temp; in uhci_dump_qh() local
785 usb_pc_cpu_invalidate(sqh->page_cache); in uhci_dump_qh()
787 qh_h_next = le32toh(sqh->qh_h_next); in uhci_dump_qh()
788 qh_e_next = le32toh(sqh->qh_e_next); in uhci_dump_qh()
791 le32toh(sqh->qh_self), qh_h_next, qh_e_next); in uhci_dump_qh()
793 temp = ((((sqh->h_next != NULL) && !(qh_h_next & UHCI_PTR_T)) ? 1 : 0) | in uhci_dump_qh()
794 (((sqh->e_next != NULL) && !(qh_e_next & UHCI_PTR_T)) ? 2 : 0)); in uhci_dump_qh()
796 return (temp); in uhci_dump_qh()
803 uhci_dump_qh(sc->sc_ls_ctl_p_last); in uhci_dump_all()
804 uhci_dump_qh(sc->sc_fs_ctl_p_last); in uhci_dump_all()
805 uhci_dump_qh(sc->sc_bulk_p_last); in uhci_dump_all()
806 uhci_dump_qh(sc->sc_last_qh_p); in uhci_dump_all()
814 td = td->obj_next) { in uhci_dump_tds()
840 if (++(sc->sc_loops) == 1) { in uhci_add_loop()
843 qh_lst = sc->sc_last_qh_p; in uhci_add_loop()
844 qh_rec = sc->sc_reclaim_qh_p; in uhci_add_loop()
848 qh_lst->qh_h_next = qh_rec->qh_self; in uhci_add_loop()
849 usb_pc_cpu_flush(qh_lst->page_cache); in uhci_add_loop()
863 if (--(sc->sc_loops) == 0) { in uhci_rem_loop()
866 qh_lst = sc->sc_last_qh_p; in uhci_rem_loop()
867 qh_lst->qh_h_next = htole32(UHCI_PTR_T); in uhci_rem_loop()
868 usb_pc_cpu_flush(qh_lst->page_cache); in uhci_rem_loop()
880 usbd_transfer_enqueue(&xfer->xroot->bus->intr_q, xfer); in uhci_transfer_intr_enqueue()
883 if (xfer->timeout != 0) { in uhci_transfer_intr_enqueue()
884 usbd_transfer_timeout_ms(xfer, &uhci_timeout, xfer->timeout); in uhci_transfer_intr_enqueue()
894 /* (sc->sc_bus.mtx) must be locked */ in _uhci_append_td()
896 std->next = last->next; in _uhci_append_td()
897 std->td_next = last->td_next; in _uhci_append_td()
899 std->prev = last; in _uhci_append_td()
901 usb_pc_cpu_flush(std->page_cache); in _uhci_append_td()
904 * the last->next->prev is never followed: std->next->prev = std; in _uhci_append_td()
906 last->next = std; in _uhci_append_td()
907 last->td_next = std->td_self; in _uhci_append_td()
909 usb_pc_cpu_flush(last->page_cache); in _uhci_append_td()
920 if (sqh->h_prev != NULL) { in _uhci_append_qh()
925 /* (sc->sc_bus.mtx) must be locked */ in _uhci_append_qh()
927 sqh->h_next = last->h_next; in _uhci_append_qh()
928 sqh->qh_h_next = last->qh_h_next; in _uhci_append_qh()
930 sqh->h_prev = last; in _uhci_append_qh()
932 usb_pc_cpu_flush(sqh->page_cache); in _uhci_append_qh()
935 * The "last->h_next->h_prev" is never followed: in _uhci_append_qh()
937 * "sqh->h_next->h_prev" = sqh; in _uhci_append_qh()
940 last->h_next = sqh; in _uhci_append_qh()
941 last->qh_h_next = sqh->qh_self; in _uhci_append_qh()
943 usb_pc_cpu_flush(last->page_cache); in _uhci_append_qh()
956 /* (sc->sc_bus.mtx) must be locked */ in _uhci_remove_td()
958 std->prev->next = std->next; in _uhci_remove_td()
959 std->prev->td_next = std->td_next; in _uhci_remove_td()
961 usb_pc_cpu_flush(std->prev->page_cache); in _uhci_remove_td()
963 if (std->next) { in _uhci_remove_td()
964 std->next->prev = std->prev; in _uhci_remove_td()
965 usb_pc_cpu_flush(std->next->page_cache); in _uhci_remove_td()
967 return ((last == std) ? std->prev : last); in _uhci_remove_td()
976 /* (sc->sc_bus.mtx) must be locked */ in _uhci_remove_qh()
979 if (sqh->h_prev) { in _uhci_remove_qh()
980 sqh->h_prev->h_next = sqh->h_next; in _uhci_remove_qh()
981 sqh->h_prev->qh_h_next = sqh->qh_h_next; in _uhci_remove_qh()
983 usb_pc_cpu_flush(sqh->h_prev->page_cache); in _uhci_remove_qh()
985 if (sqh->h_next) { in _uhci_remove_qh()
986 sqh->h_next->h_prev = sqh->h_prev; in _uhci_remove_qh()
987 usb_pc_cpu_flush(sqh->h_next->page_cache); in _uhci_remove_qh()
989 last = ((last == sqh) ? sqh->h_prev : last); in _uhci_remove_qh()
991 sqh->h_prev = 0; in _uhci_remove_qh()
993 usb_pc_cpu_flush(sqh->page_cache); in _uhci_remove_qh()
1002 uint32_t nframes = xfer->nframes; in uhci_isoc_done()
1005 uint32_t *plen = xfer->frlengths; in uhci_isoc_done()
1007 uhci_td_t *td = xfer->td_transfer_first; in uhci_isoc_done()
1008 uhci_td_t **pp_last = &sc->sc_isoc_p_last[xfer->qh_pos]; in uhci_isoc_done()
1011 xfer, xfer->endpoint); in uhci_isoc_done()
1017 while (nframes--) { in uhci_isoc_done()
1022 if (pp_last >= &sc->sc_isoc_p_last[UHCI_VFRAMELIST_COUNT]) { in uhci_isoc_done()
1023 pp_last = &sc->sc_isoc_p_last[0]; in uhci_isoc_done()
1031 usb_pc_cpu_invalidate(td->page_cache); in uhci_isoc_done()
1032 status = le32toh(td->td_status); in uhci_isoc_done()
1039 if (td->fix_pc) { in uhci_isoc_done()
1040 usbd_get_page(td->fix_pc, 0, &res); in uhci_isoc_done()
1044 usb_pc_cpu_invalidate(td->fix_pc); in uhci_isoc_done()
1046 usbd_copy_in(xfer->frbuffers, offset, in uhci_isoc_done()
1058 td = td->obj_next; in uhci_isoc_done()
1061 xfer->aframes = xfer->nframes; in uhci_isoc_done()
1074 td = xfer->td_transfer_cache; in uhci_non_isoc_done_sub()
1075 td_alt_next = td->alt_next; in uhci_non_isoc_done_sub()
1077 if (xfer->aframes != xfer->nframes) { in uhci_non_isoc_done_sub()
1078 usbd_xfer_set_frame_len(xfer, xfer->aframes, 0); in uhci_non_isoc_done_sub()
1081 usb_pc_cpu_invalidate(td->page_cache); in uhci_non_isoc_done_sub()
1082 status = le32toh(td->td_status); in uhci_non_isoc_done_sub()
1083 token = le32toh(td->td_token); in uhci_non_isoc_done_sub()
1091 if (len > td->len) { in uhci_non_isoc_done_sub()
1094 "0x%04x/0x%04x bytes\n", len, td->len); in uhci_non_isoc_done_sub()
1097 } else if ((xfer->aframes != xfer->nframes) && (len > 0)) { in uhci_non_isoc_done_sub()
1098 if (td->fix_pc) { in uhci_non_isoc_done_sub()
1099 usbd_get_page(td->fix_pc, 0, &res); in uhci_non_isoc_done_sub()
1106 usb_pc_cpu_invalidate(td->fix_pc); in uhci_non_isoc_done_sub()
1108 usbd_copy_in(xfer->frbuffers + xfer->aframes, in uhci_non_isoc_done_sub()
1109 xfer->frlengths[xfer->aframes], res.buffer, len); in uhci_non_isoc_done_sub()
1113 xfer->frlengths[xfer->aframes] += len; in uhci_non_isoc_done_sub()
1116 if (((void *)td) == xfer->td_transfer_last) { in uhci_non_isoc_done_sub()
1126 if (len != td->len) { in uhci_non_isoc_done_sub()
1127 if (xfer->flags_int.short_frames_ok) { in uhci_non_isoc_done_sub()
1129 td = td->alt_next; in uhci_non_isoc_done_sub()
1136 td = td->obj_next; in uhci_non_isoc_done_sub()
1138 if (td->alt_next != td_alt_next) { in uhci_non_isoc_done_sub()
1146 xfer->td_transfer_cache = td; in uhci_non_isoc_done_sub()
1150 xfer->endpoint->toggle_next = (token & UHCI_TD_SET_DT(1)) ? 0 : 1; in uhci_non_isoc_done_sub()
1156 xfer->address, xfer->endpointno, xfer->aframes, in uhci_non_isoc_done_sub()
1185 xfer, xfer->endpoint); in uhci_non_isoc_done()
1189 uhci_dump_tds(xfer->td_transfer_first); in uhci_non_isoc_done()
1199 xfer->td_transfer_cache = xfer->td_transfer_first; in uhci_non_isoc_done()
1201 if (xfer->flags_int.control_xfr) { in uhci_non_isoc_done()
1202 if (xfer->flags_int.control_hdr) { in uhci_non_isoc_done()
1205 xfer->aframes = 1; in uhci_non_isoc_done()
1207 if (xfer->td_transfer_cache == NULL) { in uhci_non_isoc_done()
1211 while (xfer->aframes != xfer->nframes) { in uhci_non_isoc_done()
1213 xfer->aframes++; in uhci_non_isoc_done()
1215 if (xfer->td_transfer_cache == NULL) { in uhci_non_isoc_done()
1220 if (xfer->flags_int.control_xfr && in uhci_non_isoc_done()
1221 !xfer->flags_int.control_act) { in uhci_non_isoc_done()
1228 /*------------------------------------------------------------------------*
1231 * The main purpose of this function is to update the data-toggle
1233 *------------------------------------------------------------------------*/
1244 td = xfer->td_transfer_cache; in uhci_check_transfer_sub()
1245 qh = xfer->qh_start[xfer->flags_int.curr_dma_set]; in uhci_check_transfer_sub()
1247 td_token = td->obj_next->td_token; in uhci_check_transfer_sub()
1248 td = td->alt_next; in uhci_check_transfer_sub()
1249 xfer->td_transfer_cache = td; in uhci_check_transfer_sub()
1250 td_self = td->td_self; in uhci_check_transfer_sub()
1251 td_alt_next = td->alt_next; in uhci_check_transfer_sub()
1253 if (xfer->flags_int.control_xfr) in uhci_check_transfer_sub()
1256 if (!((td->td_token ^ td_token) & htole32(UHCI_TD_SET_DT(1)))) in uhci_check_transfer_sub()
1263 td->td_token ^= htole32(UHCI_TD_SET_DT(1)); in uhci_check_transfer_sub()
1264 usb_pc_cpu_flush(td->page_cache); in uhci_check_transfer_sub()
1266 if (td == xfer->td_transfer_last) { in uhci_check_transfer_sub()
1270 td = td->obj_next; in uhci_check_transfer_sub()
1272 if (td->alt_next != td_alt_next) { in uhci_check_transfer_sub()
1280 qh->qh_e_next = td_self; in uhci_check_transfer_sub()
1281 usb_pc_cpu_flush(qh->page_cache); in uhci_check_transfer_sub()
1286 /*------------------------------------------------------------------------*
1292 *------------------------------------------------------------------------*/
1301 if (xfer->endpoint->methods == &uhci_device_isoc_methods) { in uhci_check_transfer()
1304 td = xfer->td_transfer_last; in uhci_check_transfer()
1306 usb_pc_cpu_invalidate(td->page_cache); in uhci_check_transfer()
1307 status = le32toh(td->td_status); in uhci_check_transfer()
1311 td = xfer->td_transfer_first; in uhci_check_transfer()
1313 usb_pc_cpu_invalidate(td->page_cache); in uhci_check_transfer()
1314 status |= le32toh(td->td_status); in uhci_check_transfer()
1321 /* non-isochronous transfer */ in uhci_check_transfer()
1328 td = xfer->td_transfer_cache; in uhci_check_transfer()
1331 usb_pc_cpu_invalidate(td->page_cache); in uhci_check_transfer()
1332 status = le32toh(td->td_status); in uhci_check_transfer()
1339 xfer->td_transfer_cache = td; in uhci_check_transfer()
1345 if (((void *)td) == xfer->td_transfer_last) { in uhci_check_transfer()
1358 if ((td->td_next == htole32(UHCI_PTR_T)) || in uhci_check_transfer()
1359 (UHCI_TD_GET_ACTLEN(status) < td->len)) { in uhci_check_transfer()
1360 if (xfer->flags_int.short_frames_ok) { in uhci_check_transfer()
1362 if (td->alt_next) { in uhci_check_transfer()
1364 xfer->td_transfer_cache = td; in uhci_check_transfer()
1372 td = td->obj_next; in uhci_check_transfer()
1392 TAILQ_FOREACH(xfer, &sc->sc_bus.intr_q.head, wait_entry) { in uhci_interrupt_poll()
1403 /*------------------------------------------------------------------------*
1404 * uhci_interrupt - UHCI interrupt handler
1406 * NOTE: Do not access "sc->sc_bus.bdev" inside the interrupt handler,
1407 * hence the interrupt handler will be setup before "sc->sc_bus.bdev"
1409 *------------------------------------------------------------------------*/
1415 USB_BUS_LOCK(&sc->sc_bus); in uhci_interrupt()
1446 /* no acknowledge needed */ in uhci_interrupt()
1475 USB_BUS_UNLOCK(&sc->sc_bus); in uhci_interrupt()
1488 USB_BUS_LOCK_ASSERT(xfer->xroot->bus, MA_OWNED); in uhci_timeout()
1499 USB_BUS_LOCK(&sc->sc_bus); in uhci_do_poll()
1501 USB_BUS_UNLOCK(&sc->sc_bus); in uhci_do_poll()
1505 uhci_setup_standard_chain_sub(struct uhci_std_temp *temp) in uhci_setup_standard_chain_sub() argument
1516 shortpkt_old = temp->shortpkt; in uhci_setup_standard_chain_sub()
1517 len_old = temp->len; in uhci_setup_standard_chain_sub()
1522 if ((temp->td_token & htole32(UHCI_TD_PID)) == htole32(UHCI_TD_PID_IN)) { in uhci_setup_standard_chain_sub()
1523 temp->td_status |= htole32(UHCI_TD_SPD); in uhci_setup_standard_chain_sub()
1525 temp->td_status &= ~htole32(UHCI_TD_SPD); in uhci_setup_standard_chain_sub()
1528 temp->ml.buf_offset = 0; in uhci_setup_standard_chain_sub()
1532 temp->td_token &= ~htole32(UHCI_TD_SET_MAXLEN(0)); in uhci_setup_standard_chain_sub()
1533 temp->td_token |= htole32(UHCI_TD_SET_MAXLEN(temp->average)); in uhci_setup_standard_chain_sub()
1535 td = temp->td; in uhci_setup_standard_chain_sub()
1536 td_next = temp->td_next; in uhci_setup_standard_chain_sub()
1539 if (temp->len == 0) { in uhci_setup_standard_chain_sub()
1540 if (temp->shortpkt) { in uhci_setup_standard_chain_sub()
1545 temp->shortpkt = 1; in uhci_setup_standard_chain_sub()
1546 temp->td_token |= htole32(UHCI_TD_SET_MAXLEN(0)); in uhci_setup_standard_chain_sub()
1550 average = temp->average; in uhci_setup_standard_chain_sub()
1552 if (temp->len < average) { in uhci_setup_standard_chain_sub()
1553 temp->shortpkt = 1; in uhci_setup_standard_chain_sub()
1554 temp->td_token &= ~htole32(UHCI_TD_SET_MAXLEN(0)); in uhci_setup_standard_chain_sub()
1555 temp->td_token |= htole32(UHCI_TD_SET_MAXLEN(temp->len)); in uhci_setup_standard_chain_sub()
1556 average = temp->len; in uhci_setup_standard_chain_sub()
1566 td_next = td->obj_next; in uhci_setup_standard_chain_sub()
1568 /* check if we are pre-computing */ in uhci_setup_standard_chain_sub()
1573 temp->len -= average; in uhci_setup_standard_chain_sub()
1579 td->td_status = temp->td_status; in uhci_setup_standard_chain_sub()
1580 td->td_token = temp->td_token; in uhci_setup_standard_chain_sub()
1584 temp->td_token ^= htole32(UHCI_TD_SET_DT(1)); in uhci_setup_standard_chain_sub()
1587 td->len = 0; in uhci_setup_standard_chain_sub()
1588 td->td_buffer = 0; in uhci_setup_standard_chain_sub()
1589 td->fix_pc = NULL; in uhci_setup_standard_chain_sub()
1594 temp->len -= average; in uhci_setup_standard_chain_sub()
1596 td->len = average; in uhci_setup_standard_chain_sub()
1600 uhci_mem_layout_fixup(&temp->ml, td); in uhci_setup_standard_chain_sub()
1603 td->alt_next = td_alt_next; in uhci_setup_standard_chain_sub()
1605 if ((td_next == td_alt_next) && temp->setup_alt_next) { in uhci_setup_standard_chain_sub()
1607 td->td_status |= htole32(UHCI_TD_IOC); in uhci_setup_standard_chain_sub()
1608 td->td_next = htole32(UHCI_PTR_T); in uhci_setup_standard_chain_sub()
1612 td->td_next = td_next->td_self; in uhci_setup_standard_chain_sub()
1616 usb_pc_cpu_flush(td->page_cache); in uhci_setup_standard_chain_sub()
1623 if (temp->last_frame) { in uhci_setup_standard_chain_sub()
1631 temp->shortpkt = shortpkt_old; in uhci_setup_standard_chain_sub()
1632 temp->len = len_old; in uhci_setup_standard_chain_sub()
1635 temp->td = td; in uhci_setup_standard_chain_sub()
1636 temp->td_next = td_next; in uhci_setup_standard_chain_sub()
1642 struct uhci_std_temp temp; in uhci_setup_standard_chain() local
1647 xfer->address, UE_GET_ADDR(xfer->endpointno), in uhci_setup_standard_chain()
1648 xfer->sumlen, usbd_get_speed(xfer->xroot->udev)); in uhci_setup_standard_chain()
1650 temp.average = xfer->max_frame_size; in uhci_setup_standard_chain()
1651 temp.max_frame_size = xfer->max_frame_size; in uhci_setup_standard_chain()
1654 xfer->flags_int.curr_dma_set ^= 1; in uhci_setup_standard_chain()
1657 td = xfer->td_start[xfer->flags_int.curr_dma_set]; in uhci_setup_standard_chain()
1658 xfer->td_transfer_first = td; in uhci_setup_standard_chain()
1659 xfer->td_transfer_cache = td; in uhci_setup_standard_chain()
1661 temp.td = NULL; in uhci_setup_standard_chain()
1662 temp.td_next = td; in uhci_setup_standard_chain()
1663 temp.last_frame = 0; in uhci_setup_standard_chain()
1664 temp.setup_alt_next = xfer->flags_int.short_frames_ok; in uhci_setup_standard_chain()
1666 uhci_mem_layout_init(&temp.ml, xfer); in uhci_setup_standard_chain()
1668 temp.td_status = in uhci_setup_standard_chain()
1672 if (xfer->xroot->udev->speed == USB_SPEED_LOW) { in uhci_setup_standard_chain()
1673 temp.td_status |= htole32(UHCI_TD_LS); in uhci_setup_standard_chain()
1675 temp.td_token = in uhci_setup_standard_chain()
1676 htole32(UHCI_TD_SET_ENDPT(xfer->endpointno) | in uhci_setup_standard_chain()
1677 UHCI_TD_SET_DEVADDR(xfer->address)); in uhci_setup_standard_chain()
1679 if (xfer->endpoint->toggle_next) { in uhci_setup_standard_chain()
1681 temp.td_token |= htole32(UHCI_TD_SET_DT(1)); in uhci_setup_standard_chain()
1685 if (xfer->flags_int.control_xfr) { in uhci_setup_standard_chain()
1686 if (xfer->flags_int.control_hdr) { in uhci_setup_standard_chain()
1687 temp.td_token &= htole32(UHCI_TD_SET_DEVADDR(0x7F) | in uhci_setup_standard_chain()
1689 temp.td_token |= htole32(UHCI_TD_PID_SETUP | in uhci_setup_standard_chain()
1692 temp.len = xfer->frlengths[0]; in uhci_setup_standard_chain()
1693 temp.ml.buf_pc = xfer->frbuffers + 0; in uhci_setup_standard_chain()
1694 temp.shortpkt = temp.len ? 1 : 0; in uhci_setup_standard_chain()
1696 if (xfer->nframes == 1) { in uhci_setup_standard_chain()
1697 /* no STATUS stage yet, SETUP is last */ in uhci_setup_standard_chain()
1698 if (xfer->flags_int.control_act) { in uhci_setup_standard_chain()
1699 temp.last_frame = 1; in uhci_setup_standard_chain()
1700 temp.setup_alt_next = 0; in uhci_setup_standard_chain()
1703 uhci_setup_standard_chain_sub(&temp); in uhci_setup_standard_chain()
1710 while (x != xfer->nframes) { in uhci_setup_standard_chain()
1713 temp.len = xfer->frlengths[x]; in uhci_setup_standard_chain()
1714 temp.ml.buf_pc = xfer->frbuffers + x; in uhci_setup_standard_chain()
1718 if (x == xfer->nframes) { in uhci_setup_standard_chain()
1719 if (xfer->flags_int.control_xfr) { in uhci_setup_standard_chain()
1720 /* no STATUS stage yet, DATA is last */ in uhci_setup_standard_chain()
1721 if (xfer->flags_int.control_act) { in uhci_setup_standard_chain()
1722 temp.last_frame = 1; in uhci_setup_standard_chain()
1723 temp.setup_alt_next = 0; in uhci_setup_standard_chain()
1726 temp.last_frame = 1; in uhci_setup_standard_chain()
1727 temp.setup_alt_next = 0; in uhci_setup_standard_chain()
1735 temp.td_token &= htole32(UHCI_TD_SET_DEVADDR(0x7F) | in uhci_setup_standard_chain()
1739 if (temp.len == 0) { in uhci_setup_standard_chain()
1742 temp.shortpkt = 0; in uhci_setup_standard_chain()
1747 temp.shortpkt = (xfer->flags.force_short_xfer) ? 0 : 1; in uhci_setup_standard_chain()
1752 temp.td_token |= in uhci_setup_standard_chain()
1753 (UE_GET_DIR(xfer->endpointno) == UE_DIR_IN) ? in uhci_setup_standard_chain()
1757 uhci_setup_standard_chain_sub(&temp); in uhci_setup_standard_chain()
1762 if (xfer->flags_int.control_xfr && in uhci_setup_standard_chain()
1763 !xfer->flags_int.control_act) { in uhci_setup_standard_chain()
1769 temp.td_token &= htole32(UHCI_TD_SET_DEVADDR(0x7F) | in uhci_setup_standard_chain()
1772 temp.td_token |= in uhci_setup_standard_chain()
1773 (UE_GET_DIR(xfer->endpointno) == UE_DIR_OUT) ? in uhci_setup_standard_chain()
1777 temp.len = 0; in uhci_setup_standard_chain()
1778 temp.ml.buf_pc = NULL; in uhci_setup_standard_chain()
1779 temp.shortpkt = 0; in uhci_setup_standard_chain()
1780 temp.last_frame = 1; in uhci_setup_standard_chain()
1781 temp.setup_alt_next = 0; in uhci_setup_standard_chain()
1783 uhci_setup_standard_chain_sub(&temp); in uhci_setup_standard_chain()
1785 td = temp.td; in uhci_setup_standard_chain()
1788 td->td_next = htole32(UHCI_PTR_T); in uhci_setup_standard_chain()
1792 td->td_status |= htole32(UHCI_TD_IOC); in uhci_setup_standard_chain()
1794 usb_pc_cpu_flush(td->page_cache); in uhci_setup_standard_chain()
1798 xfer->td_transfer_last = td; in uhci_setup_standard_chain()
1803 xfer->endpoint->toggle_next); in uhci_setup_standard_chain()
1804 uhci_dump_tds(xfer->td_transfer_first); in uhci_setup_standard_chain()
1807 return (xfer->td_transfer_first); in uhci_setup_standard_chain()
1817 const struct usb_pipe_methods *methods = xfer->endpoint->methods; in uhci_device_done()
1818 uhci_softc_t *sc = UHCI_BUS2SC(xfer->xroot->bus); in uhci_device_done()
1821 USB_BUS_LOCK_ASSERT(&sc->sc_bus, MA_OWNED); in uhci_device_done()
1824 xfer, xfer->endpoint, error); in uhci_device_done()
1826 qh = xfer->qh_start[xfer->flags_int.curr_dma_set]; in uhci_device_done()
1828 usb_pc_cpu_invalidate(qh->page_cache); in uhci_device_done()
1830 if (xfer->flags_int.bandwidth_reclaimed) { in uhci_device_done()
1831 xfer->flags_int.bandwidth_reclaimed = 0; in uhci_device_done()
1835 UHCI_REMOVE_QH(qh, sc->sc_bulk_p_last); in uhci_device_done()
1838 if (xfer->xroot->udev->speed == USB_SPEED_LOW) { in uhci_device_done()
1839 UHCI_REMOVE_QH(qh, sc->sc_ls_ctl_p_last); in uhci_device_done()
1841 UHCI_REMOVE_QH(qh, sc->sc_fs_ctl_p_last); in uhci_device_done()
1845 UHCI_REMOVE_QH(qh, sc->sc_intr_p_last[xfer->qh_pos]); in uhci_device_done()
1849 * which will update "xfer->frlengths". in uhci_device_done()
1851 if (xfer->td_transfer_first && in uhci_device_done()
1852 xfer->td_transfer_last) { in uhci_device_done()
1856 xfer->td_transfer_first = NULL; in uhci_device_done()
1857 xfer->td_transfer_last = NULL; in uhci_device_done()
1863 /*------------------------------------------------------------------------*
1864 * uhci bulk support
1865 *------------------------------------------------------------------------*/
1887 uhci_softc_t *sc = UHCI_BUS2SC(xfer->xroot->bus); in uhci_device_bulk_start()
1895 qh = xfer->qh_start[xfer->flags_int.curr_dma_set]; in uhci_device_bulk_start()
1897 qh->e_next = td; in uhci_device_bulk_start()
1898 qh->qh_e_next = td->td_self; in uhci_device_bulk_start()
1900 if (xfer->xroot->udev->flags.self_suspended == 0) { in uhci_device_bulk_start()
1901 UHCI_APPEND_QH(qh, sc->sc_bulk_p_last); in uhci_device_bulk_start()
1903 xfer->flags_int.bandwidth_reclaimed = 1; in uhci_device_bulk_start()
1905 usb_pc_cpu_flush(qh->page_cache); in uhci_device_bulk_start()
1920 /*------------------------------------------------------------------------*
1921 * uhci control support
1922 *------------------------------------------------------------------------*/
1944 uhci_softc_t *sc = UHCI_BUS2SC(xfer->xroot->bus); in uhci_device_ctrl_start()
1952 qh = xfer->qh_start[xfer->flags_int.curr_dma_set]; in uhci_device_ctrl_start()
1954 qh->e_next = td; in uhci_device_ctrl_start()
1955 qh->qh_e_next = td->td_self; in uhci_device_ctrl_start()
1958 * NOTE: some devices choke on bandwidth- reclamation for control in uhci_device_ctrl_start()
1961 if (xfer->xroot->udev->flags.self_suspended == 0) { in uhci_device_ctrl_start()
1962 if (xfer->xroot->udev->speed == USB_SPEED_LOW) { in uhci_device_ctrl_start()
1963 UHCI_APPEND_QH(qh, sc->sc_ls_ctl_p_last); in uhci_device_ctrl_start()
1965 UHCI_APPEND_QH(qh, sc->sc_fs_ctl_p_last); in uhci_device_ctrl_start()
1968 usb_pc_cpu_flush(qh->page_cache); in uhci_device_ctrl_start()
1982 /*------------------------------------------------------------------------*
1983 * uhci interrupt support
1984 *------------------------------------------------------------------------*/
1988 uhci_softc_t *sc = UHCI_BUS2SC(xfer->xroot->bus); in uhci_device_intr_open()
1996 if (xfer->interval >= bit) { in uhci_device_intr_open()
2000 if (sc->sc_intr_stat[x] < in uhci_device_intr_open()
2001 sc->sc_intr_stat[best]) { in uhci_device_intr_open()
2011 sc->sc_intr_stat[best]++; in uhci_device_intr_open()
2012 xfer->qh_pos = best; in uhci_device_intr_open()
2015 best, xfer->interval); in uhci_device_intr_open()
2021 uhci_softc_t *sc = UHCI_BUS2SC(xfer->xroot->bus); in uhci_device_intr_close()
2023 sc->sc_intr_stat[xfer->qh_pos]--; in uhci_device_intr_close()
2037 uhci_softc_t *sc = UHCI_BUS2SC(xfer->xroot->bus); in uhci_device_intr_start()
2045 qh = xfer->qh_start[xfer->flags_int.curr_dma_set]; in uhci_device_intr_start()
2047 qh->e_next = td; in uhci_device_intr_start()
2048 qh->qh_e_next = td->td_self; in uhci_device_intr_start()
2050 if (xfer->xroot->udev->flags.self_suspended == 0) { in uhci_device_intr_start()
2052 UHCI_APPEND_QH(qh, sc->sc_intr_p_last[xfer->qh_pos]); in uhci_device_intr_start()
2054 usb_pc_cpu_flush(qh->page_cache); in uhci_device_intr_start()
2069 /*------------------------------------------------------------------------*
2070 * uhci isochronous support
2071 *------------------------------------------------------------------------*/
2080 (UE_GET_DIR(xfer->endpointno) == UE_DIR_IN) ? in uhci_device_isoc_open()
2081 UHCI_TD_IN(0, xfer->endpointno, xfer->address, 0) : in uhci_device_isoc_open()
2082 UHCI_TD_OUT(0, xfer->endpointno, xfer->address, 0); in uhci_device_isoc_open()
2089 for (td = xfer->td_start[ds]; td; td = td->obj_next) { in uhci_device_isoc_open()
2091 td->td_status = htole32(UHCI_TD_IOS); in uhci_device_isoc_open()
2092 td->td_token = td_token; in uhci_device_isoc_open()
2094 usb_pc_cpu_flush(td->page_cache); in uhci_device_isoc_open()
2109 uhci_softc_t *sc = UHCI_BUS2SC(xfer->xroot->bus); in uhci_device_isoc_enter()
2123 xfer, xfer->endpoint->isoc_next, xfer->nframes); in uhci_device_isoc_enter()
2128 xfer, nframes, 0, 1, UHCI_VFRAMELIST_COUNT - 1, &startframe)) in uhci_device_isoc_enter()
2133 nframes = xfer->nframes; in uhci_device_isoc_enter()
2137 plen = xfer->frlengths; in uhci_device_isoc_enter()
2140 xfer->flags_int.curr_dma_set ^= 1; in uhci_device_isoc_enter()
2143 td = xfer->td_start[xfer->flags_int.curr_dma_set]; in uhci_device_isoc_enter()
2144 xfer->td_transfer_first = td; in uhci_device_isoc_enter()
2146 pp_last = &sc->sc_isoc_p_last[startframe]; in uhci_device_isoc_enter()
2150 xfer->qh_pos = startframe; in uhci_device_isoc_enter()
2152 while (nframes--) { in uhci_device_isoc_enter()
2157 if (pp_last >= &sc->sc_isoc_p_last[UHCI_VFRAMELIST_COUNT]) { in uhci_device_isoc_enter()
2158 pp_last = &sc->sc_isoc_p_last[0]; in uhci_device_isoc_enter()
2160 if (*plen > xfer->max_frame_size) { in uhci_device_isoc_enter()
2167 xfer->max_frame_size); in uhci_device_isoc_enter()
2170 *plen = xfer->max_frame_size; in uhci_device_isoc_enter()
2174 td->td_token &= htole32(~UHCI_TD_MAXLEN_MASK); in uhci_device_isoc_enter()
2175 td->td_token |= htole32(UHCI_TD_SET_MAXLEN(*plen)); in uhci_device_isoc_enter()
2177 td->len = *plen; in uhci_device_isoc_enter()
2179 if (td->len == 0) { in uhci_device_isoc_enter()
2184 td->td_buffer = 0; in uhci_device_isoc_enter()
2185 td->fix_pc = NULL; in uhci_device_isoc_enter()
2195 td->td_status = htole32 in uhci_device_isoc_enter()
2202 td->td_status = htole32 in uhci_device_isoc_enter()
2209 usb_pc_cpu_flush(td->page_cache); in uhci_device_isoc_enter()
2223 td = td->obj_next; in uhci_device_isoc_enter()
2226 xfer->td_transfer_last = td_last; in uhci_device_isoc_enter()
2244 /*------------------------------------------------------------------------*
2245 * uhci root control support
2246 *------------------------------------------------------------------------*
2248 *------------------------------------------------------------------------*/
2338 usb_pause_mtx(&sc->sc_bus.bus_mtx, in uhci_portreset()
2347 mtx_unlock(&sc->sc_bus.bus_mtx); in uhci_portreset()
2355 mtx_lock(&sc->sc_bus.bus_mtx); in uhci_portreset()
2364 usb_pause_mtx(&sc->sc_bus.bus_mtx, in uhci_portreset()
2374 * No device is connected (or was disconnected in uhci_portreset()
2410 sc->sc_isreset = 1; in uhci_portreset()
2418 uhci_softc_t *sc = UHCI_BUS2SC(udev->bus); in uhci_roothub_exec()
2430 USB_BUS_LOCK_ASSERT(&sc->sc_bus, MA_OWNED); in uhci_roothub_exec()
2433 ptr = (const void *)&sc->sc_hub_desc.temp; in uhci_roothub_exec()
2437 value = UGETW(req->wValue); in uhci_roothub_exec()
2438 index = UGETW(req->wIndex); in uhci_roothub_exec()
2442 req->bmRequestType, req->bRequest, in uhci_roothub_exec()
2443 UGETW(req->wLength), value, index); in uhci_roothub_exec()
2446 switch (C(req->bRequest, req->bmRequestType)) { in uhci_roothub_exec()
2451 * DEVICE_REMOTE_WAKEUP and ENDPOINT_HALT are no-ops in uhci_roothub_exec()
2457 sc->sc_hub_desc.temp[0] = sc->sc_conf; in uhci_roothub_exec()
2486 str_ptr = sc->sc_vendor; in uhci_roothub_exec()
2499 (sc->sc_hub_desc.temp, in uhci_roothub_exec()
2500 sizeof(sc->sc_hub_desc.temp), in uhci_roothub_exec()
2511 sc->sc_hub_desc.temp[0] = 0; in uhci_roothub_exec()
2515 USETW(sc->sc_hub_desc.stat.wStatus, UDS_SELF_POWERED); in uhci_roothub_exec()
2520 USETW(sc->sc_hub_desc.stat.wStatus, 0); in uhci_roothub_exec()
2527 sc->sc_addr = value; in uhci_roothub_exec()
2534 sc->sc_conf = value; in uhci_roothub_exec()
2588 sc->sc_isreset = 0; in uhci_roothub_exec()
2592 sc->sc_isresumed &= ~(1 << index); in uhci_roothub_exec()
2613 sc->sc_hub_desc.temp[0] = in uhci_roothub_exec()
2627 memset(sc->sc_hub_desc.temp, 0, 16); in uhci_roothub_exec()
2659 usb_pause_mtx(&sc->sc_bus.bus_mtx, hz / 50); in uhci_roothub_exec()
2666 usb_pause_mtx(&sc->sc_bus.bus_mtx, hz / 500); in uhci_roothub_exec()
2668 sc->sc_isresumed |= (1 << index); in uhci_roothub_exec()
2674 if (sc->sc_isresumed & (1 << index)) in uhci_roothub_exec()
2676 if (sc->sc_isreset) in uhci_roothub_exec()
2678 USETW(sc->sc_hub_desc.ps.wPortStatus, status); in uhci_roothub_exec()
2679 USETW(sc->sc_hub_desc.ps.wPortChange, change); in uhci_roothub_exec()
2680 len = sizeof(sc->sc_hub_desc.ps); in uhci_roothub_exec()
2744 USB_BUS_LOCK_ASSERT(&sc->sc_bus, MA_OWNED); in uhci_root_intr()
2746 sc->sc_hub_idata[0] = 0; in uhci_root_intr()
2750 sc->sc_hub_idata[0] |= 1 << 1; in uhci_root_intr()
2754 sc->sc_hub_idata[0] |= 1 << 2; in uhci_root_intr()
2758 usb_callout_reset(&sc->sc_root_intr, hz, in uhci_root_intr()
2761 if (sc->sc_hub_idata[0] != 0) { in uhci_root_intr()
2762 uhub_root_intr(&sc->sc_bus, sc->sc_hub_idata, in uhci_root_intr()
2763 sizeof(sc->sc_hub_idata)); in uhci_root_intr()
2780 xfer = parm->curr_xfer; in uhci_xfer_setup()
2782 parm->hc_max_packet_size = 0x500; in uhci_xfer_setup()
2783 parm->hc_max_packet_count = 1; in uhci_xfer_setup()
2784 parm->hc_max_frame_size = 0x500; in uhci_xfer_setup()
2789 if (parm->methods == &uhci_device_ctrl_methods) { in uhci_xfer_setup()
2790 xfer->flags_int.bdma_enable = 1; in uhci_xfer_setup()
2791 xfer->flags_int.bdma_no_post_sync = 1; in uhci_xfer_setup()
2798 ntd = ((2 * xfer->nframes) + 1 /* STATUS */ in uhci_xfer_setup()
2799 + (xfer->max_data_length / xfer->max_frame_size)); in uhci_xfer_setup()
2801 } else if (parm->methods == &uhci_device_bulk_methods) { in uhci_xfer_setup()
2802 xfer->flags_int.bdma_enable = 1; in uhci_xfer_setup()
2803 xfer->flags_int.bdma_no_post_sync = 1; in uhci_xfer_setup()
2808 ntd = ((2 * xfer->nframes) in uhci_xfer_setup()
2809 + (xfer->max_data_length / xfer->max_frame_size)); in uhci_xfer_setup()
2811 } else if (parm->methods == &uhci_device_intr_methods) { in uhci_xfer_setup()
2812 xfer->flags_int.bdma_enable = 1; in uhci_xfer_setup()
2813 xfer->flags_int.bdma_no_post_sync = 1; in uhci_xfer_setup()
2818 ntd = ((2 * xfer->nframes) in uhci_xfer_setup()
2819 + (xfer->max_data_length / xfer->max_frame_size)); in uhci_xfer_setup()
2821 } else if (parm->methods == &uhci_device_isoc_methods) { in uhci_xfer_setup()
2822 xfer->flags_int.bdma_enable = 1; in uhci_xfer_setup()
2823 xfer->flags_int.bdma_no_post_sync = 1; in uhci_xfer_setup()
2828 ntd = xfer->nframes; in uhci_xfer_setup()
2837 if (parm->err) { in uhci_xfer_setup()
2845 nfixup = (parm->bufsize / USB_PAGE_SIZE) + 1; in uhci_xfer_setup()
2851 align = xfer->max_frame_size; in uhci_xfer_setup()
2859 if (!(xfer->max_frame_size & in uhci_xfer_setup()
2860 (xfer->max_frame_size - 1))) { in uhci_xfer_setup()
2861 n--; in uhci_xfer_setup()
2876 parm, &pc, xfer->max_frame_size, in uhci_xfer_setup()
2878 parm->err = USB_ERR_NOMEM; in uhci_xfer_setup()
2881 xfer->buf_fixup = pc; in uhci_xfer_setup()
2885 if (parm->err) { in uhci_xfer_setup()
2893 parm->err = USB_ERR_NOMEM; in uhci_xfer_setup()
2896 if (parm->buf) { in uhci_xfer_setup()
2905 if ((parm->methods == &uhci_device_bulk_methods) || in uhci_xfer_setup()
2906 (parm->methods == &uhci_device_ctrl_methods) || in uhci_xfer_setup()
2907 (parm->methods == &uhci_device_intr_methods)) { in uhci_xfer_setup()
2909 td->td_self = htole32(page_info.physaddr | in uhci_xfer_setup()
2912 td->td_self = htole32(page_info.physaddr | in uhci_xfer_setup()
2916 td->obj_next = last_obj; in uhci_xfer_setup()
2917 td->page_cache = pc + n; in uhci_xfer_setup()
2924 xfer->td_start[xfer->flags_int.curr_dma_set] = last_obj; in uhci_xfer_setup()
2931 parm->err = USB_ERR_NOMEM; in uhci_xfer_setup()
2934 if (parm->buf) { in uhci_xfer_setup()
2943 qh->qh_self = htole32(page_info.physaddr | UHCI_PTR_QH); in uhci_xfer_setup()
2944 qh->obj_next = last_obj; in uhci_xfer_setup()
2945 qh->page_cache = pc + n; in uhci_xfer_setup()
2952 xfer->qh_start[xfer->flags_int.curr_dma_set] = last_obj; in uhci_xfer_setup()
2954 if (!xfer->flags_int.curr_dma_set) { in uhci_xfer_setup()
2955 xfer->flags_int.curr_dma_set = 1; in uhci_xfer_setup()
2964 uhci_softc_t *sc = UHCI_BUS2SC(udev->bus); in uhci_ep_init()
2967 ep, udev->address, in uhci_ep_init()
2968 edesc->bEndpointAddress, udev->flags.usb_mode, in uhci_ep_init()
2969 sc->sc_addr); in uhci_ep_init()
2971 if (udev->device_index != sc->sc_addr) { in uhci_ep_init()
2972 switch (edesc->bmAttributes & UE_XFERTYPE) { in uhci_ep_init()
2974 ep->methods = &uhci_device_ctrl_methods; in uhci_ep_init()
2977 ep->methods = &uhci_device_intr_methods; in uhci_ep_init()
2980 if (udev->speed == USB_SPEED_FULL) { in uhci_ep_init()
2981 ep->methods = &uhci_device_isoc_methods; in uhci_ep_init()
2985 ep->methods = &uhci_device_bulk_methods; in uhci_ep_init()
3013 struct uhci_softc *sc = UHCI_BUS2SC(udev->bus); in uhci_device_resume()
3020 USB_BUS_LOCK(udev->bus); in uhci_device_resume()
3022 TAILQ_FOREACH(xfer, &sc->sc_bus.intr_q.head, wait_entry) { in uhci_device_resume()
3023 if (xfer->xroot->udev == udev) { in uhci_device_resume()
3024 methods = xfer->endpoint->methods; in uhci_device_resume()
3025 qh = xfer->qh_start[xfer->flags_int.curr_dma_set]; in uhci_device_resume()
3028 UHCI_APPEND_QH(qh, sc->sc_bulk_p_last); in uhci_device_resume()
3030 xfer->flags_int.bandwidth_reclaimed = 1; in uhci_device_resume()
3033 if (xfer->xroot->udev->speed == USB_SPEED_LOW) { in uhci_device_resume()
3034 UHCI_APPEND_QH(qh, sc->sc_ls_ctl_p_last); in uhci_device_resume()
3036 UHCI_APPEND_QH(qh, sc->sc_fs_ctl_p_last); in uhci_device_resume()
3040 UHCI_APPEND_QH(qh, sc->sc_intr_p_last[xfer->qh_pos]); in uhci_device_resume()
3045 USB_BUS_UNLOCK(udev->bus); in uhci_device_resume()
3053 struct uhci_softc *sc = UHCI_BUS2SC(udev->bus); in uhci_device_suspend()
3060 USB_BUS_LOCK(udev->bus); in uhci_device_suspend()
3062 TAILQ_FOREACH(xfer, &sc->sc_bus.intr_q.head, wait_entry) { in uhci_device_suspend()
3063 if (xfer->xroot->udev == udev) { in uhci_device_suspend()
3064 methods = xfer->endpoint->methods; in uhci_device_suspend()
3065 qh = xfer->qh_start[xfer->flags_int.curr_dma_set]; in uhci_device_suspend()
3067 if (xfer->flags_int.bandwidth_reclaimed) { in uhci_device_suspend()
3068 xfer->flags_int.bandwidth_reclaimed = 0; in uhci_device_suspend()
3072 UHCI_REMOVE_QH(qh, sc->sc_bulk_p_last); in uhci_device_suspend()
3075 if (xfer->xroot->udev->speed == USB_SPEED_LOW) { in uhci_device_suspend()
3076 UHCI_REMOVE_QH(qh, sc->sc_ls_ctl_p_last); in uhci_device_suspend()
3078 UHCI_REMOVE_QH(qh, sc->sc_fs_ctl_p_last); in uhci_device_suspend()
3082 UHCI_REMOVE_QH(qh, sc->sc_intr_p_last[xfer->qh_pos]); in uhci_device_suspend()
3087 USB_BUS_UNLOCK(udev->bus); in uhci_device_suspend()
3120 flags = bus->hw_power_state; in uhci_set_hw_power()
3134 device_get_unit(sc->sc_bus.bdev)); in uhci_set_hw_power()
3138 device_get_unit(sc->sc_bus.bdev)); in uhci_set_hw_power()