Lines Matching defs:xfer
187 void ehci_abort_isoc_xfer(struct usbd_xfer *xfer,
576 ehci_pcd(struct ehci_softc *sc, struct usbd_xfer *xfer)
581 if (xfer == NULL) {
586 p = KERNADDR(&xfer->dmabuf, 0);
587 m = min(sc->sc_noport, xfer->length * 8 - 1);
588 memset(p, 0, xfer->length);
594 xfer->actlen = xfer->length;
595 xfer->status = USBD_NORMAL_COMPLETION;
597 usb_transfer_complete(xfer);
658 ehci_check_intr(sc, &ex->xfer);
676 ehci_check_intr(struct ehci_softc *sc, struct usbd_xfer *xfer)
678 int attr = xfer->pipe->endpoint->edesc->bmAttributes;
681 ehci_check_itd_intr(sc, xfer);
683 ehci_check_qh_intr(sc, xfer);
687 ehci_check_qh_intr(struct ehci_softc *sc, struct usbd_xfer *xfer)
689 struct ehci_xfer *ex = (struct ehci_xfer *)xfer;
716 /* If there's an active QTD the xfer isn't done. */
719 /* Any kind of error makes the xfer done. */
735 timeout_del(&xfer->timeout_handle);
736 usb_rem_task(xfer->pipe->device, &xfer->abort_task);
737 ehci_idone(xfer);
741 ehci_check_itd_intr(struct ehci_softc *sc, struct usbd_xfer *xfer)
743 struct ehci_xfer *ex = (struct ehci_xfer *)xfer;
747 if (xfer != SIMPLEQ_FIRST(&xfer->pipe->queue))
753 if (xfer->device->speed == USB_SPEED_HIGH) {
775 timeout_del(&xfer->timeout_handle);
776 usb_rem_task(xfer->pipe->device, &xfer->abort_task);
777 ehci_isoc_idone(xfer);
781 ehci_isoc_idone(struct usbd_xfer *xfer)
783 struct ehci_xfer *ex = (struct ehci_xfer *)xfer;
788 if (xfer->status == USBD_CANCELLED || xfer->status == USBD_TIMEOUT)
791 if (xfer->device->speed == USB_SPEED_HIGH) {
792 switch (xfer->pipe->endpoint->edesc->bInterval) {
794 panic("isoc xfer suddenly has 0 bInterval, invalid");
820 * an xfer.
822 if (nframes >= xfer->nframes)
830 xfer->frlengths[nframes++] = len;
843 if (xfer->frlengths[nframes] >= len)
844 len = xfer->frlengths[nframes] - len;
848 xfer->frlengths[nframes++] = len;
856 xfer->actlen = actlen;
857 xfer->status = USBD_NORMAL_COMPLETION;
859 usb_syncmem(&xfer->dmabuf, 0, xfer->length,
860 usbd_xfer_isread(xfer) ?
862 usb_transfer_complete(xfer);
866 ehci_idone(struct usbd_xfer *xfer)
868 struct ehci_xfer *ex = (struct ehci_xfer *)xfer;
885 if (xfer->status == USBD_CANCELLED || xfer->status == USBD_TIMEOUT)
907 "status=0x%x\n", xfer->length, actlen, cerr, status));
908 xfer->actlen = actlen;
911 xfer->status = USBD_STALLED;
913 xfer->status = USBD_IOERROR; /* more info XXX */
915 xfer->status = USBD_NORMAL_COMPLETION;
917 if (xfer->actlen)
918 usb_syncmem(&xfer->dmabuf, 0, xfer->actlen,
919 usbd_xfer_isread(xfer) ?
921 usb_transfer_complete(xfer);
1141 ehci_freex(struct usbd_bus *bus, struct usbd_xfer *xfer)
1143 struct ehci_xfer *ex = (struct ehci_xfer*)xfer;
1525 DPRINTF(("ehci: bad xfer type %d\n", xfertype));
1780 ehci_root_ctrl_transfer(struct usbd_xfer *xfer)
1785 err = usb_insert_transfer(xfer);
1790 return (ehci_root_ctrl_start(SIMPLEQ_FIRST(&xfer->pipe->queue)));
1794 ehci_root_ctrl_start(struct usbd_xfer *xfer)
1796 struct ehci_softc *sc = (struct ehci_softc *)xfer->device->bus;
1811 if (!(xfer->rqflags & URQ_REQUEST))
1815 req = &xfer->request;
1825 buf = KERNADDR(&xfer->dmabuf, 0);
2159 xfer->actlen = totlen;
2162 xfer->status = err;
2164 usb_transfer_complete(xfer);
2182 ehci_root_ctrl_abort(struct usbd_xfer *xfer)
2195 ehci_root_intr_done(struct usbd_xfer *xfer)
2200 ehci_root_intr_transfer(struct usbd_xfer *xfer)
2205 err = usb_insert_transfer(xfer);
2210 return (ehci_root_intr_start(SIMPLEQ_FIRST(&xfer->pipe->queue)));
2214 ehci_root_intr_start(struct usbd_xfer *xfer)
2216 struct ehci_softc *sc = (struct ehci_softc *)xfer->device->bus;
2221 sc->sc_intrxfer = xfer;
2227 ehci_root_intr_abort(struct usbd_xfer *xfer)
2229 struct ehci_softc *sc = (struct ehci_softc *)xfer->device->bus;
2234 xfer->status = USBD_CANCELLED;
2236 usb_transfer_complete(xfer);
2246 ehci_root_ctrl_done(struct usbd_xfer *xfer)
2347 ehci_alloc_sqtd_chain(struct ehci_softc *sc, u_int alen, struct usbd_xfer *xfer,
2355 int rd = usbd_xfer_isread(xfer);
2356 struct usb_dma *dma = &xfer->dmabuf;
2361 iscontrol = UE_GET_XFERTYPE(xfer->pipe->endpoint->edesc->bmAttributes) ==
2369 mps = UGETW(xfer->pipe->endpoint->edesc->wMaxPacketSize);
2370 forceshort = ((xfer->flags & USBD_FORCE_SHORT_XFER) || len == 0) &&
2493 struct ehci_pipe *epipe = (struct ehci_pipe *)ex->xfer.pipe;
2607 ehci_abort_xfer(struct usbd_xfer *xfer, usbd_status status)
2609 struct ehci_softc *sc = (struct ehci_softc *)xfer->device->bus;
2610 struct ehci_pipe *epipe = (struct ehci_pipe *)xfer->pipe;
2611 struct ehci_xfer *ex = (struct ehci_xfer*)xfer;
2616 if (sc->sc_bus.dying || xfer->status == USBD_NOT_STARTED) {
2618 if (xfer->status != USBD_NOT_STARTED)
2620 xfer->status = status; /* make software ignore it */
2621 timeout_del(&xfer->timeout_handle);
2622 usb_rem_task(xfer->device, &xfer->abort_task);
2626 usb_transfer_complete(xfer);
2631 if (xfer->device->bus->intr_context)
2644 xfer->status = status;
2653 * Step 1: Make interrupt routine and timeouts ignore xfer.
2657 xfer->status = status; /* make software ignore it */
2659 timeout_del(&xfer->timeout_handle);
2660 usb_rem_task(xfer->device, &xfer->abort_task);
2704 /* Do the wakeup first to avoid touching the xfer after the callback. */
2710 usb_transfer_complete(xfer);
2716 ehci_abort_isoc_xfer(struct usbd_xfer *xfer, usbd_status status)
2718 struct ehci_softc *sc = (struct ehci_softc *)xfer->device->bus;
2719 struct ehci_xfer *ex = (struct ehci_xfer *)xfer;
2726 if (sc->sc_bus.dying || xfer->status == USBD_NOT_STARTED) {
2727 if (xfer->status != USBD_NOT_STARTED)
2729 xfer->status = status;
2730 timeout_del(&xfer->timeout_handle);
2731 usb_rem_task(xfer->device, &xfer->abort_task);
2732 usb_transfer_complete(xfer);
2737 if (xfer->status != USBD_IN_PROGRESS) {
2746 xfer->status = status;
2748 timeout_del(&xfer->timeout_handle);
2749 usb_rem_task(xfer->device, &xfer->abort_task);
2751 if (xfer->device->speed == USB_SPEED_HIGH) {
2791 usb_transfer_complete(xfer);
2797 struct usbd_xfer *xfer = addr;
2798 struct ehci_softc *sc = (struct ehci_softc *)xfer->device->bus;
2805 usb_init_task(&xfer->abort_task, ehci_timeout_task, addr,
2807 usb_add_task(xfer->device, &xfer->abort_task);
2813 struct usbd_xfer *xfer = addr;
2817 ehci_abort_xfer(xfer, USBD_TIMEOUT);
2848 ehci_device_ctrl_transfer(struct usbd_xfer *xfer)
2853 err = usb_insert_transfer(xfer);
2858 return (ehci_device_ctrl_start(SIMPLEQ_FIRST(&xfer->pipe->queue)));
2862 ehci_device_ctrl_start(struct usbd_xfer *xfer)
2864 struct ehci_softc *sc = (struct ehci_softc *)xfer->device->bus;
2865 struct ehci_pipe *epipe = (struct ehci_pipe *)xfer->pipe;
2866 struct ehci_xfer *ex = (struct ehci_xfer *)xfer;
2867 usb_device_request_t *req = &xfer->request;
2874 KASSERT(xfer->rqflags & URQ_REQUEST);
2896 err = ehci_alloc_sqtd_chain(sc, len, xfer, &next, &end);
2929 EHCI_QTD_SET_PID(usbd_xfer_isread(xfer) ?
2954 if (xfer->timeout && !sc->sc_bus.use_polling) {
2955 timeout_del(&xfer->timeout_handle);
2956 timeout_set(&xfer->timeout_handle, ehci_timeout, xfer);
2957 timeout_add_msec(&xfer->timeout_handle, xfer->timeout);
2960 xfer->status = USBD_IN_PROGRESS;
2970 xfer->status = err;
2971 usb_transfer_complete(xfer);
2976 ehci_device_ctrl_done(struct usbd_xfer *xfer)
2978 struct ehci_softc *sc = (struct ehci_softc *)xfer->device->bus;
2979 struct ehci_xfer *ex = (struct ehci_xfer *)xfer;
2981 KASSERT(xfer->rqflags & URQ_REQUEST);
2983 if (xfer->status != USBD_NOMEM) {
2989 ehci_device_ctrl_abort(struct usbd_xfer *xfer)
2991 ehci_abort_xfer(xfer, USBD_CANCELLED);
3001 ehci_device_bulk_transfer(struct usbd_xfer *xfer)
3006 err = usb_insert_transfer(xfer);
3011 return (ehci_device_bulk_start(SIMPLEQ_FIRST(&xfer->pipe->queue)));
3015 ehci_device_bulk_start(struct usbd_xfer *xfer)
3017 struct ehci_softc *sc = (struct ehci_softc *)xfer->device->bus;
3018 struct ehci_pipe *epipe = (struct ehci_pipe *)xfer->pipe;
3019 struct ehci_xfer *ex = (struct ehci_xfer *)xfer;
3025 KASSERT(!(xfer->rqflags & URQ_REQUEST));
3032 err = ehci_alloc_sqtd_chain(sc, xfer->length, xfer, &data, &dataend);
3034 xfer->status = err;
3035 usb_transfer_complete(xfer);
3051 if (xfer->timeout && !sc->sc_bus.use_polling) {
3052 timeout_del(&xfer->timeout_handle);
3053 timeout_set(&xfer->timeout_handle, ehci_timeout, xfer);
3054 timeout_add_msec(&xfer->timeout_handle, xfer->timeout);
3057 xfer->status = USBD_IN_PROGRESS;
3064 ehci_device_bulk_abort(struct usbd_xfer *xfer)
3066 ehci_abort_xfer(xfer, USBD_CANCELLED);
3079 ehci_device_bulk_done(struct usbd_xfer *xfer)
3081 struct ehci_softc *sc = (struct ehci_softc *)xfer->device->bus;
3082 struct ehci_xfer *ex = (struct ehci_xfer *)xfer;
3084 if (xfer->status != USBD_NOMEM) {
3112 ehci_device_intr_transfer(struct usbd_xfer *xfer)
3117 err = usb_insert_transfer(xfer);
3125 return (ehci_device_intr_start(SIMPLEQ_FIRST(&xfer->pipe->queue)));
3129 ehci_device_intr_start(struct usbd_xfer *xfer)
3131 struct ehci_softc *sc = (struct ehci_softc *)xfer->device->bus;
3132 struct ehci_xfer *ex = (struct ehci_xfer *)xfer;
3133 struct ehci_pipe *epipe = (struct ehci_pipe *)xfer->pipe;
3139 KASSERT(!(xfer->rqflags & URQ_REQUEST));
3146 err = ehci_alloc_sqtd_chain(sc, xfer->length, xfer, &data, &dataend);
3148 xfer->status = err;
3149 usb_transfer_complete(xfer);
3164 if (xfer->timeout && !sc->sc_bus.use_polling) {
3165 timeout_del(&xfer->timeout_handle);
3166 timeout_set(&xfer->timeout_handle, ehci_timeout, xfer);
3167 timeout_add_msec(&xfer->timeout_handle, xfer->timeout);
3170 xfer->status = USBD_IN_PROGRESS;
3177 ehci_device_intr_abort(struct usbd_xfer *xfer)
3179 KASSERT(!xfer->pipe->repeat || xfer->pipe->intrxfer == xfer);
3186 ehci_abort_xfer(xfer, USBD_CANCELLED);
3196 ehci_device_intr_done(struct usbd_xfer *xfer)
3198 struct ehci_softc *sc = (struct ehci_softc *)xfer->device->bus;
3199 struct ehci_pipe *epipe = (struct ehci_pipe *)xfer->pipe;
3200 struct ehci_xfer *ex = (struct ehci_xfer *)xfer;
3206 if (xfer->pipe->repeat) {
3211 err = ehci_alloc_sqtd_chain(sc, xfer->length, xfer, &data, &dataend);
3213 xfer->status = err;
3230 if (xfer->timeout && !sc->sc_bus.use_polling) {
3231 timeout_del(&xfer->timeout_handle);
3232 timeout_set(&xfer->timeout_handle, ehci_timeout, xfer);
3233 timeout_add_msec(&xfer->timeout_handle, xfer->timeout);
3236 xfer->status = USBD_IN_PROGRESS;
3238 } else if (xfer->status != USBD_NOMEM) {
3244 ehci_device_isoc_transfer(struct usbd_xfer *xfer)
3248 err = usb_insert_transfer(xfer);
3252 return (ehci_device_isoc_start(xfer));
3256 ehci_device_isoc_start(struct usbd_xfer *xfer)
3258 struct ehci_softc *sc = (struct ehci_softc *)xfer->device->bus;
3259 struct ehci_pipe *epipe = (struct ehci_pipe *)xfer->pipe;
3260 struct ehci_xfer *ex = (struct ehci_xfer *)xfer;
3261 usb_endpoint_descriptor_t *ed = xfer->pipe->endpoint->edesc;
3267 KASSERT(!(xfer->rqflags & URQ_REQUEST));
3273 * this when another xfer completes. So, check if this is already
3291 if ((1 << (ival - 1)) * xfer->nframes >= (sc->sc_flsize - 4) * 8)
3297 if (xfer->device->speed == USB_SPEED_HIGH) {
3298 if (ehci_alloc_itd_chain(sc, xfer))
3303 if (ehci_alloc_sitd_chain(sc, xfer))
3366 xfer->status = USBD_IN_PROGRESS;
3367 xfer->done = 0;
3374 ehci_alloc_itd_chain(struct ehci_softc *sc, struct usbd_xfer *xfer)
3376 struct ehci_xfer *ex = (struct ehci_xfer *)xfer;
3377 usb_endpoint_descriptor_t *ed = xfer->pipe->endpoint->edesc;
3401 nframes = (xfer->nframes + (ufrperframe - 1)) / ufrperframe;
3406 usb_syncmem(&xfer->dmabuf, 0, xfer->length,
3407 usbd_xfer_isread(xfer) ?
3428 int addr = DMAADDR(&xfer->dmabuf, froffs);
3438 EHCI_ITD_SET_LEN(xfer->frlengths[trans_count]) |
3440 EHCI_ITD_SET_OFFS(DMAADDR(&xfer->dmabuf, offs))
3443 offs += xfer->frlengths[trans_count];
3446 if (trans_count >= xfer->nframes) { /*Set IOC*/
3466 if (page_offs >= xfer->dmabuf.block->size)
3469 long long page = DMAADDR(&xfer->dmabuf, page_offs);
3480 EHCI_ITD_SET_DADDR(xfer->pipe->device->address)
3484 (usbd_xfer_isread(xfer) ? EHCI_ITD_SET_DIR(1) : 0) |
3501 ehci_alloc_sitd_chain(struct ehci_softc *sc, struct usbd_xfer *xfer)
3503 struct ehci_xfer *ex = (struct ehci_xfer *)xfer;
3504 struct usbd_device *hshub = xfer->device->myhsport->parent;
3505 usb_endpoint_descriptor_t *ed = xfer->pipe->endpoint->edesc;
3511 nframes = xfer->nframes;
3516 EHCI_SITD_SET_ADDR(xfer->device->address) |
3517 EHCI_SITD_SET_PORT(xfer->device->myhsport->portno) |
3520 if (usbd_xfer_isread(xfer))
3523 usb_syncmem(&xfer->dmabuf, 0, xfer->length,
3524 usbd_xfer_isread(xfer) ?
3527 uint32_t addr = DMAADDR(&xfer->dmabuf, offs);
3528 uint32_t page = EHCI_PAGE(addr + xfer->frlengths[i] - 1);
3544 EHCI_SITD_SET_LEN(xfer->frlengths[i]) |
3548 uf = max(1, ((xfer->frlengths[i] + 187) / 188));
3555 if (usbd_xfer_isread(xfer)) {
3576 offs += xfer->frlengths[i];
3586 ehci_device_isoc_abort(struct usbd_xfer *xfer)
3591 ehci_abort_isoc_xfer(xfer, USBD_CANCELLED);
3601 ehci_device_isoc_done(struct usbd_xfer *xfer)
3603 struct ehci_softc *sc = (struct ehci_softc *)xfer->device->bus;
3604 struct ehci_pipe *epipe = (struct ehci_pipe *)xfer->pipe;
3605 struct ehci_xfer *ex = (struct ehci_xfer *)xfer;
3610 if (xfer->status != USBD_NOMEM) {