Module Name: src Committed By: skrll Date: Tue Oct 27 14:05:29 UTC 2015
Modified Files: src/sys/dev/usb [nick-nhusb]: uhci.c uhcivar.h Log Message: Collapse uhcl_intr_info into uhci_xfer and use TAILQ for list of transfers that are active. To generate a diff of this commit: cvs rdiff -u -r1.264.4.38 -r1.264.4.39 src/sys/dev/usb/uhci.c cvs rdiff -u -r1.52.14.10 -r1.52.14.11 src/sys/dev/usb/uhcivar.h Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/dev/usb/uhci.c diff -u src/sys/dev/usb/uhci.c:1.264.4.38 src/sys/dev/usb/uhci.c:1.264.4.39 --- src/sys/dev/usb/uhci.c:1.264.4.38 Tue Oct 27 08:02:31 2015 +++ src/sys/dev/usb/uhci.c Tue Oct 27 14:05:29 2015 @@ -1,4 +1,4 @@ -/* $NetBSD: uhci.c,v 1.264.4.38 2015/10/27 08:02:31 skrll Exp $ */ +/* $NetBSD: uhci.c,v 1.264.4.39 2015/10/27 14:05:29 skrll Exp $ */ /* * Copyright (c) 1998, 2004, 2011, 2012 The NetBSD Foundation, Inc. @@ -42,7 +42,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: uhci.c,v 1.264.4.38 2015/10/27 08:02:31 skrll Exp $"); +__KERNEL_RCSID(0, "$NetBSD: uhci.c,v 1.264.4.39 2015/10/27 14:05:29 skrll Exp $"); #include "opt_usb.h" @@ -183,8 +183,8 @@ Static usbd_status uhci_alloc_std_chain( uhci_soft_td_t **, uhci_soft_td_t **); Static void uhci_poll_hub(void *); Static void uhci_waitintr(uhci_softc_t *, struct usbd_xfer *); -Static void uhci_check_intr(uhci_softc_t *, uhci_intr_info_t *); -Static void uhci_idone(uhci_intr_info_t *); +Static void uhci_check_intr(uhci_softc_t *, struct uhci_xfer *); +Static void uhci_idone(struct uhci_xfer *); Static void uhci_abort_xfer(struct usbd_xfer *, usbd_status); @@ -366,14 +366,14 @@ const struct usbd_pipe_methods uhci_devi .upm_done = uhci_device_isoc_done, }; -#define uhci_add_intr_info(sc, ii) \ - LIST_INSERT_HEAD(&(sc)->sc_intrhead, (ii), list) -#define uhci_del_intr_info(ii) \ +#define uhci_add_intr_info(sc, ux) \ + TAILQ_INSERT_TAIL(&(sc)->sc_intrhead, (ux), list) +#define uhci_del_intr_info(sc, ux) \ do { \ - LIST_REMOVE((ii), list); \ - (ii)->list.le_prev = NULL; \ + TAILQ_REMOVE(&(sc)->sc_intrhead, (ux), list); \ + (ux)->list.tqe_prev = NULL; \ } while (0) -#define uhci_active_intr_info(ii) ((ii)->list.le_prev != NULL) +#define uhci_active_intr_info(ux) ((ux)->list.tqe_prev != NULL) static inline uhci_soft_qh_t * uhci_find_prev_qh(uhci_soft_qh_t *pqh, uhci_soft_qh_t *sqh) @@ -538,7 +538,7 @@ uhci_init(uhci_softc_t *sc) BUS_DMASYNC_PREWRITE); - LIST_INIT(&sc->sc_intrhead); + TAILQ_INIT(&sc->sc_intrhead); sc->sc_xferpool = pool_cache_init(sizeof(struct uhci_xfer), 0, 0, 0, "uhcixfer", NULL, IPL_USB, NULL, NULL, NULL); @@ -625,7 +625,7 @@ uhci_allocx(struct usbd_bus *bus, unsign struct uhci_xfer *uxfer = UHCI_XFER2UXFER(xfer); #ifdef DIAGNOSTIC - uxfer->iinfo.isdone = true; + uxfer->isdone = true; xfer->ux_state = XFER_BUSY; #endif } @@ -640,7 +640,7 @@ uhci_freex(struct usbd_bus *bus, struct KASSERTMSG(xfer->ux_state == XFER_BUSY, "xfer %p state %d\n", xfer, xfer->ux_state); - KASSERTMSG(uxfer->iinfo.isdone, "xfer %p not done\n", xfer); + KASSERTMSG(uxfer->isdone, "xfer %p not done\n", xfer); #ifdef DIAGNOSTIC xfer->ux_state = XFER_FREE; #endif @@ -895,51 +895,45 @@ uhci_dump_tds(uhci_soft_td_t *std) } Static void -uhci_dump_ii(uhci_intr_info_t *ii) +uhci_dump_ii(uhci_intr_info_t *ux) { struct usbd_pipe *pipe; usb_endpoint_descriptor_t *ed; struct usbd_device *dev; -#ifdef DIAGNOSTIC -#define DONE ii->isdone -#else -#define DONE 0 -#endif - if (ii == NULL) { - printf("ii NULL\n"); + if (ux == NULL) { + printf("ux NULL\n"); return; } - if (ii->xfer == NULL) { - printf("ii %p: done=%d xfer=NULL\n", - ii, DONE); + if (ux->xfer == NULL) { + printf("ux %p: done=%d xfer=NULL\n", + ux, ux->isdone); return; } - pipe = ii->xfer->ux_pipe; + pipe = ux->xfer->ux_pipe; if (pipe == NULL) { - printf("ii %p: done=%d xfer=%p pipe=NULL\n", - ii, DONE, ii->xfer); + printf("ux %p: done=%d xfer=%p pipe=NULL\n", + ux, ux->isdone, ux->xfer); return; } if (pipe->up_endpoint == NULL) { - printf("ii %p: done=%d xfer=%p pipe=%p pipe->up_endpoint=NULL\n", - ii, DONE, ii->xfer, pipe); + printf("ux %p: done=%d xfer=%p pipe=%p pipe->up_endpoint=NULL\n", + ux, ux->isdone, ux->xfer, pipe); return; } if (pipe->up_dev == NULL) { - printf("ii %p: done=%d xfer=%p pipe=%p pipe->up_dev=NULL\n", - ii, DONE, ii->xfer, pipe); + printf("ux %p: done=%d xfer=%p pipe=%p pipe->up_dev=NULL\n", + ux, ux->isdone, ux->xfer, pipe); return; } ed = pipe->up_endpoint->ue_edesc; dev = pipe->up_dev; - printf("ii %p: done=%d xfer=%p dev=%p vid=0x%04x pid=0x%04x addr=%d pipe=%p ep=0x%02x attr=0x%02x\n", - ii, DONE, ii->xfer, dev, + printf("ux %p: done=%d xfer=%p dev=%p vid=0x%04x pid=0x%04x addr=%d pipe=%p ep=0x%02x attr=0x%02x\n", + ux, ux->isdone, ux->xfer, dev, UGETW(dev->ud_ddesc.idVendor), UGETW(dev->ud_ddesc.idProduct), dev->ud_addr, pipe, ed->bEndpointAddress, ed->bmAttributes); -#undef DONE } void uhci_dump_iis(struct uhci_softc *sc); @@ -948,9 +942,9 @@ uhci_dump_iis(struct uhci_softc *sc) { uhci_intr_info_t *ii; - printf("intr_info list:\n"); - for (ii = LIST_FIRST(&sc->sc_intrhead); ii; ii = LIST_NEXT(ii, list)) - uhci_dump_ii(ii); + printf("interrupt list:\n"); + for (ux = TAILQ_FIRST(&sc->sc_intrhead); ux; ux = TAILQ_NEXT(ux, list)) + uhci_dump_ii(ux); } void iidump(void); @@ -1363,7 +1357,7 @@ uhci_softintr(void *v) { struct usbd_bus *bus = v; uhci_softc_t *sc = UHCI_BUS2SC(bus); - uhci_intr_info_t *ii, *nextii; + struct uhci_xfer *ux, *nextux; UHCIHIST_FUNC(); UHCIHIST_CALLED(); DPRINTF("sc %p", sc, 0, 0, 0); @@ -1381,9 +1375,9 @@ uhci_softintr(void *v) * We scan all interrupt descriptors to see if any have * completed. */ - for (ii = LIST_FIRST(&sc->sc_intrhead); ii; ii = nextii) { - nextii = LIST_NEXT(ii, list); - uhci_check_intr(sc, ii); + for (ux = TAILQ_FIRST(&sc->sc_intrhead); ux; ux = nextux) { + nextux = TAILQ_NEXT(ux, list); + uhci_check_intr(sc, ux); } if (sc->sc_softwake) { @@ -1394,25 +1388,26 @@ uhci_softintr(void *v) /* Check for an interrupt. */ void -uhci_check_intr(uhci_softc_t *sc, uhci_intr_info_t *ii) +uhci_check_intr(uhci_softc_t *sc, struct uhci_xfer *ux) { uhci_soft_td_t *std, *lstd; uint32_t status; UHCIHIST_FUNC(); UHCIHIST_CALLED(); - DPRINTFN(15, "ii %p", ii, 0, 0, 0); + DPRINTFN(15, "ux %p", ux, 0, 0, 0); - KASSERT(ii != NULL); + KASSERT(ux != NULL); - if (ii->xfer->ux_status == USBD_CANCELLED || - ii->xfer->ux_status == USBD_TIMEOUT) { - DPRINTF("aborted xfer %p", ii->xfer, 0, 0, 0); + struct usbd_xfer *xfer = &ux->xfer; + if (xfer->ux_status == USBD_CANCELLED || + xfer->ux_status == USBD_TIMEOUT) { + DPRINTF("aborted xfer %p", xfer, 0, 0, 0); return; } - if (ii->stdstart == NULL) + if (ux->stdstart == NULL) return; - lstd = ii->stdend; + lstd = ux->stdend; KASSERT(lstd != NULL); @@ -1429,10 +1424,10 @@ uhci_check_intr(uhci_softc_t *sc, uhci_i /* If the last TD is not marked active we can complete */ if (!(status & UHCI_TD_ACTIVE)) { done: - DPRINTFN(12, "ii=%p done", ii, 0, 0, 0); + DPRINTFN(12, "ux=%p done", ux, 0, 0, 0); - callout_stop(&ii->xfer->ux_callout); - uhci_idone(ii); + callout_stop(&xfer->ux_callout); + uhci_idone(ux); return; } @@ -1441,8 +1436,8 @@ uhci_check_intr(uhci_softc_t *sc, uhci_i * is an error somewhere in the middle, or whether there was a * short packet (SPD and not ACTIVE). */ - DPRINTFN(12, "active ii=%p", ii, 0, 0, 0); - for (std = ii->stdstart; std != lstd; std = std->link.std) { + DPRINTFN(12, "active ux=%p", ux, 0, 0, 0); + for (std = ux->stdstart; std != lstd; std = std->link.std) { usb_syncmem(&std->dma, std->offs + offsetof(uhci_td_t, td_status), sizeof(std->td.td_status), @@ -1454,8 +1449,8 @@ uhci_check_intr(uhci_softc_t *sc, uhci_i /* If there's an active TD the xfer isn't done. */ if (status & UHCI_TD_ACTIVE) { - DPRINTFN(12, "ii=%p std=%p still active", - ii, std, 0, 0); + DPRINTFN(12, "ux=%p std=%p still active", + ux, std, 0, 0); return; } @@ -1467,7 +1462,6 @@ uhci_check_intr(uhci_softc_t *sc, uhci_i * If the data phase of a control transfer is short, we need * to complete the status stage */ - struct usbd_xfer *xfer = ii->xfer; usb_endpoint_descriptor_t *ed = xfer->ux_pipe->up_endpoint->ue_edesc; uint8_t xfertype = UE_GET_XFERTYPE(ed->bmAttributes); @@ -1477,8 +1471,8 @@ uhci_check_intr(uhci_softc_t *sc, uhci_i uhci_soft_qh_t *sqh = upipe->ctrl.sqh; uhci_soft_td_t *stat = upipe->ctrl.stat; - DPRINTFN(12, "ii=%p std=%p control status" - "phase needs completion", ii, ii->stdstart, 0, 0); + DPRINTFN(12, "ux=%p std=%p control status" + "phase needs completion", ux, ux->stdstart, 0, 0); sqh->qh.qh_elink = htole32(stat->physaddr | UHCI_PTR_TD); @@ -1503,9 +1497,9 @@ uhci_check_intr(uhci_softc_t *sc, uhci_i /* Called with USB lock held. */ void -uhci_idone(uhci_intr_info_t *ii) +uhci_idone(struct uhci_xfer *ux) { - struct usbd_xfer *xfer = ii->xfer; + struct usbd_xfer *xfer = &ux->xfer; uhci_softc_t *sc __diagused = UHCI_XFER2SC(xfer); struct uhci_pipe *upipe = (struct uhci_pipe *)xfer->ux_pipe; uhci_soft_td_t *std; @@ -1515,18 +1509,18 @@ uhci_idone(uhci_intr_info_t *ii) KASSERT(sc->sc_bus.ub_usepolling || mutex_owned(&sc->sc_lock)); UHCIHIST_FUNC(); UHCIHIST_CALLED(); - DPRINTFN(12, "ii=%p", ii, 0, 0, 0); + DPRINTFN(12, "ux=%p", ux, 0, 0, 0); #ifdef DIAGNOSTIC #ifdef UHCI_DEBUG - if (ii->isdone) { + if (ux->isdone) { DPRINTF("--- dump start ---", 0, 0, 0, 0); - uhci_dump_ii(ii); + uhci_dump_ii(ux); DPRINTF("--- dump end ---", 0, 0, 0, 0); } #endif - KASSERT(!ii->isdone); - ii->isdone = true; + KASSERT(!ux->isdone); + ux->isdone = true; #endif if (xfer->ux_nframes != 0) { @@ -1534,7 +1528,7 @@ uhci_idone(uhci_intr_info_t *ii) uhci_soft_td_t **stds = upipe->isoc.stds; int i, n, nframes, len; - DPRINTFN(5, "ii=%p isoc ready", ii, 0, 0, 0); + DPRINTFN(5, "ux=%p isoc ready", ux, 0, 0, 0); nframes = xfer->ux_nframes; actlen = 0; @@ -1565,15 +1559,15 @@ uhci_idone(uhci_intr_info_t *ii) } #ifdef UHCI_DEBUG - DPRINTFN(10, "ii=%p, xfer=%p, pipe=%p ready", - ii, xfer, upipe, 0); + DPRINTFN(10, "ux=%p, xfer=%p, pipe=%p ready", + ux, xfer, upipe, 0); if (uhcidebug > 10) - uhci_dump_tds(ii->stdstart); + uhci_dump_tds(ux->stdstart); #endif /* The transfer is done, compute actual length and status. */ actlen = 0; - for (std = ii->stdstart; std != NULL; std = std->link.std) { + for (std = ux->stdstart; std != NULL; std = std->link.std) { usb_syncmem(&std->dma, std->offs, sizeof(std->td), BUS_DMASYNC_POSTWRITE | BUS_DMASYNC_POSTREAD); nstatus = le32toh(std->td.td_status); @@ -1632,7 +1626,7 @@ uhci_idone(uhci_intr_info_t *ii) end: usb_transfer_complete(xfer); KASSERT(sc->sc_bus.ub_usepolling || mutex_owned(&sc->sc_lock)); - DPRINTFN(12, "ii=%p done", ii, 0, 0, 0); + DPRINTFN(12, "ux=%p done", ux, 0, 0, 0); } /* @@ -1641,9 +1635,9 @@ uhci_idone(uhci_intr_info_t *ii) void uhci_timeout(void *addr) { - uhci_intr_info_t *ii = addr; - struct uhci_xfer *uxfer = UHCI_XFER2UXFER(ii->xfer); - uhci_softc_t *sc = UHCI_XFER2SC(ii->xfer); + struct usbd_xfer *xfer = addr; + struct uhci_xfer *uxfer = UHCI_XFER2UXFER(xfer); + uhci_softc_t *sc = UHCI_XFER2SC(xfer); UHCIHIST_FUNC(); UHCIHIST_CALLED(); @@ -1651,13 +1645,13 @@ uhci_timeout(void *addr) if (sc->sc_dying) { mutex_enter(&sc->sc_lock); - uhci_abort_xfer(&uxfer->xfer, USBD_TIMEOUT); + uhci_abort_xfer(xfer, USBD_TIMEOUT); mutex_exit(&sc->sc_lock); return; } /* Execute the abort in a process context. */ - usb_init_task(&uxfer->abort_task, uhci_timeout_task, ii->xfer, + usb_init_task(&uxfer->abort_task, uhci_timeout_task, xfer, USB_TASKQ_MPSAFE); usb_add_task(uxfer->xfer.ux_pipe->up_dev, &uxfer->abort_task, USB_TASKQ_HC); @@ -1688,7 +1682,7 @@ void uhci_waitintr(uhci_softc_t *sc, struct usbd_xfer *xfer) { int timo = xfer->ux_timeout; - uhci_intr_info_t *ii; + struct uhci_xfer *ux; mutex_enter(&sc->sc_lock); @@ -1711,14 +1705,14 @@ uhci_waitintr(uhci_softc_t *sc, struct u /* Timeout */ DPRINTF("timeout", 0, 0, 0, 0); - for (ii = LIST_FIRST(&sc->sc_intrhead); - ii != NULL && ii->xfer != xfer; - ii = LIST_NEXT(ii, list)) - ; + for (ux = TAILQ_FIRST(&sc->sc_intrhead); ux != NULL; + ux = TAILQ_NEXT(ux, list)) + if (&ux->xfer == xfer) + break; - KASSERT(ii != NULL); + KASSERT(ux != NULL); - uhci_idone(ii); + uhci_idone(ux); done: mutex_exit(&sc->sc_lock); @@ -2043,16 +2037,16 @@ usbd_status uhci_device_bulk_start(struct usbd_xfer *xfer) { struct uhci_pipe *upipe = (struct uhci_pipe *)xfer->ux_pipe; + struct uhci_xfer *ux = UHCI_XFER2UXFER(xfer); uhci_softc_t *sc = UHCI_XFER2SC(xfer); - uhci_intr_info_t *ii = &UHCI_XFER2UXFER(xfer)->iinfo; uhci_soft_td_t *data, *dataend; uhci_soft_qh_t *sqh; usbd_status err; int len, isread, endpt; UHCIHIST_FUNC(); UHCIHIST_CALLED(); - DPRINTFN(3, "xfer=%p len=%d flags=%d ii=%p", - xfer, xfer->ux_length, xfer->ux_flags, ii); + DPRINTFN(3, "xfer=%p len=%d flags=%d ux=%p", + xfer, xfer->ux_length, xfer->ux_flags, ux); if (sc->sc_dying) return USBD_IOERROR; @@ -2090,13 +2084,12 @@ uhci_device_bulk_start(struct usbd_xfer #endif /* Set up interrupt info. */ - ii->xfer = xfer; - ii->stdstart = data; - ii->stdend = dataend; + ux->stdstart = data; + ux->stdend = dataend; - KASSERT(ii->isdone); + KASSERT(ux->isdone); #ifdef DIAGNOSTIC - ii->isdone = false; + ux->isdone = false; #endif sqh->elink = data; @@ -2104,11 +2097,11 @@ uhci_device_bulk_start(struct usbd_xfer /* uhci_add_bulk() will do usb_syncmem(sqh) */ uhci_add_bulk(sc, sqh); - uhci_add_intr_info(sc, ii); + uhci_add_intr_info(sc, ux); if (xfer->ux_timeout && !sc->sc_bus.ub_usepolling) { callout_reset(&xfer->ux_callout, mstohz(xfer->ux_timeout), - uhci_timeout, ii); + uhci_timeout, xfer); } xfer->ux_status = USBD_IN_PROGRESS; @@ -2154,7 +2147,7 @@ uhci_device_bulk_abort(struct usbd_xfer void uhci_abort_xfer(struct usbd_xfer *xfer, usbd_status status) { - uhci_intr_info_t *ii = &UHCI_XFER2UXFER(xfer)->iinfo; + struct uhci_xfer *ux = UHCI_XFER2UXFER(xfer); struct uhci_pipe *upipe = (struct uhci_pipe *)xfer->ux_pipe; uhci_softc_t *sc = UHCI_XFER2SC(xfer); uhci_soft_td_t *std; @@ -2199,8 +2192,8 @@ uhci_abort_xfer(struct usbd_xfer *xfer, */ xfer->ux_status = status; /* make software ignore it */ callout_stop(&xfer->ux_callout); - DPRINTF("stop ii=%p", ii, 0, 0, 0); - for (std = ii->stdstart; std != NULL; std = std->link.std) { + DPRINTF("stop ux=%p", ux, 0, 0, 0); + for (std = ux->stdstart; std != NULL; std = std->link.std) { usb_syncmem(&std->dma, std->offs + offsetof(uhci_td_t, td_status), sizeof(std->td.td_status), @@ -2229,7 +2222,7 @@ uhci_abort_xfer(struct usbd_xfer *xfer, */ DPRINTF("callback", 0, 0, 0, 0); #ifdef DIAGNOSTIC - ii->isdone = true; + ux->isdone = true; #endif wake = xfer->ux_hcflags & UXFER_ABORTWAIT; xfer->ux_hcflags &= ~(UXFER_ABORTING | UXFER_ABORTWAIT); @@ -2319,9 +2312,9 @@ uhci_device_intr_transfer(struct usbd_xf usbd_status uhci_device_intr_start(struct usbd_xfer *xfer) { + struct uhci_xfer *ux = UHCI_XFER2UXFER(xfer); struct uhci_pipe *upipe = (struct uhci_pipe *)xfer->ux_pipe; uhci_softc_t *sc = UHCI_XFER2SC(xfer); - uhci_intr_info_t *ii = &UHCI_XFER2UXFER(xfer)->iinfo; uhci_soft_td_t *data, *dataend; uhci_soft_qh_t *sqh; usbd_status err; @@ -2369,12 +2362,11 @@ uhci_device_intr_start(struct usbd_xfer DPRINTFN(10, "--- dump end ---", 0, 0, 0, 0); /* Set up interrupt info. */ - ii->xfer = xfer; - ii->stdstart = data; - ii->stdend = dataend; - KASSERT(ii->isdone); + ux->stdstart = data; + ux->stdend = dataend; + KASSERT(ux->isdone); #ifdef DIAGNOSTIC - ii->isdone = false; + ux->isdone = false; #endif DPRINTFN(10, "qhs[0]=%p", upipe->intr.qhs[0], 0, 0, 0); @@ -2387,7 +2379,7 @@ uhci_device_intr_start(struct usbd_xfer sizeof(sqh->qh.qh_elink), BUS_DMASYNC_PREWRITE | BUS_DMASYNC_PREREAD); } - uhci_add_intr_info(sc, ii); + uhci_add_intr_info(sc, ux); xfer->ux_status = USBD_IN_PROGRESS; mutex_exit(&sc->sc_lock); @@ -2467,13 +2459,13 @@ uhci_device_intr_close(struct usbd_pipe usbd_status uhci_device_request(struct usbd_xfer *xfer) { + struct uhci_xfer *uxfer = UHCI_XFER2UXFER(xfer); struct uhci_pipe *upipe = (struct uhci_pipe *)xfer->ux_pipe; usb_device_request_t *req = &xfer->ux_request; struct usbd_device *dev = upipe->pipe.up_dev; uhci_softc_t *sc = UHCI_XFER2SC(xfer); int addr = dev->ud_addr; int endpt = upipe->pipe.up_endpoint->ue_edesc->bEndpointAddress; - uhci_intr_info_t *ii = &UHCI_XFER2UXFER(xfer)->iinfo; uhci_soft_td_t *setup, *data, *stat, *next, *dataend; uhci_soft_qh_t *sqh; int len; @@ -2551,12 +2543,11 @@ uhci_device_request(struct usbd_xfer *xf DPRINTFN(10, "--- dump end ---", 0, 0, 0, 0); /* Set up interrupt info. */ - ii->xfer = xfer; - ii->stdstart = setup; - ii->stdend = stat; - KASSERT(ii->isdone); + uxfer->stdstart = setup; + uxfer->stdend = stat; + KASSERT(uxfer->isdone); #ifdef DIAGNOSTIC - ii->isdone = false; + uxfer->isdone = false; #endif sqh->elink = setup; @@ -2567,7 +2558,7 @@ uhci_device_request(struct usbd_xfer *xf uhci_add_ls_ctrl(sc, sqh); else uhci_add_hs_ctrl(sc, sqh); - uhci_add_intr_info(sc, ii); + uhci_add_intr_info(sc, uxfer); DPRINTFN(12, "--- dump start ---", 0, 0, 0, 0); #ifdef UHCI_DEBUG if (uhcidebug > 12) { @@ -2599,7 +2590,7 @@ uhci_device_request(struct usbd_xfer *xf DPRINTFN(12, "--- dump end ---", 0, 0, 0, 0); if (xfer->ux_timeout && !sc->sc_bus.ub_usepolling) { callout_reset(&xfer->ux_callout, mstohz(xfer->ux_timeout), - uhci_timeout, ii); + uhci_timeout, xfer); } xfer->ux_status = USBD_IN_PROGRESS; @@ -2719,7 +2710,7 @@ uhci_device_isoc_start(struct usbd_xfer { struct uhci_pipe *upipe = (struct uhci_pipe *)xfer->ux_pipe; uhci_softc_t *sc = UHCI_XFER2SC(xfer); - uhci_intr_info_t *ii = &UHCI_XFER2UXFER(xfer)->iinfo; + struct uhci_xfer *ux = UHCI_XFER2UXFER(xfer); uhci_soft_td_t *end; int i; @@ -2747,15 +2738,14 @@ uhci_device_isoc_start(struct usbd_xfer KASSERT(end != NULL); /* Set up interrupt info. */ - ii->xfer = xfer; - ii->stdstart = end; - ii->stdend = end; + ux->stdstart = end; + ux->stdend = end; - KASSERT(ii->isdone); + KASSERT(ux->isdone); #ifdef DIAGNOSTIC - ii->isdone = false; + ux->isdone = false; #endif - uhci_add_intr_info(sc, ii); + uhci_add_intr_info(sc, ux); mutex_exit(&sc->sc_lock); @@ -2812,7 +2802,7 @@ uhci_device_isoc_abort(struct usbd_xfer delay(maxlen); #ifdef DIAGNOSTIC - UHCI_XFER2UXFER(xfer)->iinfo.isdone = true; + UHCI_XFER2UXFER(xfer)->isdone = true; #endif /* Run callback and remove from interrupt list. */ usb_transfer_complete(xfer); @@ -2958,8 +2948,9 @@ uhci_setup_isoc(struct usbd_pipe *pipe) void uhci_device_isoc_done(struct usbd_xfer *xfer) { - uhci_intr_info_t *ii = &UHCI_XFER2UXFER(xfer)->iinfo; struct uhci_pipe *upipe = (struct uhci_pipe *)xfer->ux_pipe; + struct uhci_xfer *ux = UHCI_XFER2UXFER(xfer); + uhci_softc_t *sc = UHCI_XFER2SC(xfer); int i, offs; int rd = UE_GET_DIR(upipe->pipe.up_endpoint->ue_edesc->bEndpointAddress) == UE_DIR_IN; @@ -2968,35 +2959,31 @@ uhci_device_isoc_done(struct usbd_xfer * DPRINTFN(4, "length=%d, ux_state=0x%08x", xfer->ux_actlen, xfer->ux_state, 0, 0); - if (ii->xfer != xfer) - /* Not on interrupt list, ignore it. */ - return; - - if (!uhci_active_intr_info(ii)) + if (!uhci_active_intr_info(ux)) return; #ifdef DIAGNOSTIC - if (ii->stdend == NULL) { + if (ux->stdend == NULL) { printf("uhci_device_isoc_done: xfer=%p stdend==NULL\n", xfer); #ifdef UHCI_DEBUG - uhci_dump_ii(ii); + uhci_dump_ii(ux); #endif return; } #endif /* Turn off the interrupt since it is active even if the TD is not. */ - usb_syncmem(&ii->stdend->dma, - ii->stdend->offs + offsetof(uhci_td_t, td_status), - sizeof(ii->stdend->td.td_status), + usb_syncmem(&ux->stdend->dma, + ux->stdend->offs + offsetof(uhci_td_t, td_status), + sizeof(ux->stdend->td.td_status), BUS_DMASYNC_POSTWRITE | BUS_DMASYNC_POSTREAD); - ii->stdend->td.td_status &= htole32(~UHCI_TD_IOC); - usb_syncmem(&ii->stdend->dma, - ii->stdend->offs + offsetof(uhci_td_t, td_status), - sizeof(ii->stdend->td.td_status), + ux->stdend->td.td_status &= htole32(~UHCI_TD_IOC); + usb_syncmem(&ux->stdend->dma, + ux->stdend->offs + offsetof(uhci_td_t, td_status), + sizeof(ux->stdend->td.td_status), BUS_DMASYNC_PREWRITE | BUS_DMASYNC_PREREAD); - uhci_del_intr_info(ii); /* remove from active list */ + uhci_del_intr_info(sc, ux); /* remove from active list */ offs = 0; for (i = 0; i < xfer->ux_nframes; i++) { @@ -3009,8 +2996,8 @@ uhci_device_isoc_done(struct usbd_xfer * void uhci_device_intr_done(struct usbd_xfer *xfer) { - uhci_intr_info_t *ii = &UHCI_XFER2UXFER(xfer)->iinfo; uhci_softc_t *sc = UHCI_XFER2SC(xfer); + struct uhci_xfer *ux = UHCI_XFER2UXFER(xfer); struct uhci_pipe *upipe = (struct uhci_pipe *)xfer->ux_pipe; uhci_soft_qh_t *sqh; int i, npoll, isread; @@ -3030,7 +3017,7 @@ uhci_device_intr_done(struct usbd_xfer * sizeof(sqh->qh.qh_elink), BUS_DMASYNC_PREWRITE | BUS_DMASYNC_PREREAD); } - uhci_free_std_chain(sc, ii->stdstart, NULL); + uhci_free_std_chain(sc, ux->stdstart, NULL); isread = UE_GET_DIR(upipe->pipe.up_endpoint->ue_edesc->bEndpointAddress) == UE_DIR_IN; usb_syncmem(&xfer->ux_dmabuf, 0, xfer->ux_length, @@ -3061,11 +3048,11 @@ uhci_device_intr_done(struct usbd_xfer * #endif DPRINTFN(10, "--- dump end ---", 0, 0, 0, 0); - ii->stdstart = data; - ii->stdend = dataend; - KASSERT(ii->isdone); + ux->stdstart = data; + ux->stdend = dataend; + KASSERT(ux->isdone); #ifdef DIAGNOSTIC - ii->isdone = false; + ux->isdone = false; #endif for (i = 0; i < npoll; i++) { sqh = upipe->intr.qhs[i]; @@ -3077,11 +3064,11 @@ uhci_device_intr_done(struct usbd_xfer * BUS_DMASYNC_PREWRITE | BUS_DMASYNC_PREREAD); } xfer->ux_status = USBD_IN_PROGRESS; - /* The ii is already on the examined list, just leave it. */ + /* The ux is already on the examined list, just leave it. */ } else { DPRINTFN(5, "removing", 0, 0, 0, 0); - if (uhci_active_intr_info(ii)) - uhci_del_intr_info(ii); + if (uhci_active_intr_info(ux)) + uhci_del_intr_info(sc, ux); } } @@ -3089,8 +3076,8 @@ uhci_device_intr_done(struct usbd_xfer * void uhci_device_ctrl_done(struct usbd_xfer *xfer) { - uhci_intr_info_t *ii = &UHCI_XFER2UXFER(xfer)->iinfo; uhci_softc_t *sc = UHCI_XFER2SC(xfer); + struct uhci_xfer *ux = UHCI_XFER2UXFER(xfer); struct uhci_pipe *upipe = (struct uhci_pipe *)xfer->ux_pipe; int len = UGETW(xfer->ux_request.wLength); int isread = (xfer->ux_request.bmRequestType & UT_READ); @@ -3101,10 +3088,10 @@ uhci_device_ctrl_done(struct usbd_xfer * KASSERT(xfer->ux_rqflags & URQ_REQUEST); - if (!uhci_active_intr_info(ii)) + if (!uhci_active_intr_info(ux)) return; - uhci_del_intr_info(ii); /* remove from active list */ + uhci_del_intr_info(sc, ux); /* remove from active list */ if (upipe->pipe.up_dev->ud_speed == USB_SPEED_LOW) uhci_remove_ls_ctrl(sc, upipe->ctrl.sqh); @@ -3112,7 +3099,7 @@ uhci_device_ctrl_done(struct usbd_xfer * uhci_remove_hs_ctrl(sc, upipe->ctrl.sqh); if (upipe->ctrl.length != 0) - uhci_free_std_chain(sc, ii->stdstart->link.std, ii->stdend); + uhci_free_std_chain(sc, ux->stdstart->link.std, ux->stdend); if (len) { usb_syncmem(&xfer->ux_dmabuf, 0, len, @@ -3128,24 +3115,24 @@ uhci_device_ctrl_done(struct usbd_xfer * void uhci_device_bulk_done(struct usbd_xfer *xfer) { - uhci_intr_info_t *ii = &UHCI_XFER2UXFER(xfer)->iinfo; + struct uhci_xfer *ux = UHCI_XFER2UXFER(xfer); uhci_softc_t *sc = UHCI_XFER2SC(xfer); struct uhci_pipe *upipe = (struct uhci_pipe *)xfer->ux_pipe; UHCIHIST_FUNC(); UHCIHIST_CALLED(); - DPRINTFN(5, "xfer=%p ii=%p sc=%p upipe=%p", xfer, ii, sc, + DPRINTFN(5, "xfer=%p ux=%p sc=%p upipe=%p", xfer, ux, sc, upipe); KASSERT(mutex_owned(&sc->sc_lock)); - if (!uhci_active_intr_info(ii)) + if (!uhci_active_intr_info(ux)) return; - uhci_del_intr_info(ii); /* remove from active list */ + uhci_del_intr_info(sc, ux); /* remove from active list */ uhci_remove_bulk(sc, upipe->bulk.sqh); - uhci_free_std_chain(sc, ii->stdstart, NULL); + uhci_free_std_chain(sc, ux->stdstart, NULL); DPRINTFN(5, "length=%d", xfer->ux_actlen, 0, 0, 0); } @@ -3712,7 +3699,7 @@ uhci_root_intr_abort(struct usbd_xfer *x xfer->ux_status = USBD_CANCELLED; #ifdef DIAGNOSTIC - UHCI_XFER2UXFER(xfer)->iinfo.isdone = 1; + UHCI_XFER2UXFER(xfer)->isdone = 1; #endif usb_transfer_complete(xfer); } Index: src/sys/dev/usb/uhcivar.h diff -u src/sys/dev/usb/uhcivar.h:1.52.14.10 src/sys/dev/usb/uhcivar.h:1.52.14.11 --- src/sys/dev/usb/uhcivar.h:1.52.14.10 Tue Oct 27 08:02:31 2015 +++ src/sys/dev/usb/uhcivar.h Tue Oct 27 14:05:29 2015 @@ -1,4 +1,4 @@ -/* $NetBSD: uhcivar.h,v 1.52.14.10 2015/10/27 08:02:31 skrll Exp $ */ +/* $NetBSD: uhcivar.h,v 1.52.14.11 2015/10/27 14:05:29 skrll Exp $ */ /* * Copyright (c) 1998 The NetBSD Foundation, Inc. @@ -59,26 +59,14 @@ typedef union { struct uhci_soft_td *std; } uhci_soft_td_qh_t; -/* - * An interrupt info struct contains the information needed to - * execute a requested routine when the controller generates an - * interrupt. Since we cannot know which transfer generated - * the interrupt all structs are linked together so they can be - * searched at interrupt time. - */ -typedef struct uhci_intr_info { - struct usbd_xfer *xfer; - uhci_soft_td_t *stdstart; - uhci_soft_td_t *stdend; - LIST_ENTRY(uhci_intr_info) list; - bool isdone; /* used only when DIAGNOSTIC is defined */ -} uhci_intr_info_t; - struct uhci_xfer { struct usbd_xfer xfer; - uhci_intr_info_t iinfo; struct usb_task abort_task; + uhci_soft_td_t *stdstart; + uhci_soft_td_t *stdend; + TAILQ_ENTRY(uhci_xfer) list; int curframe; + bool isdone; /* used only when DIAGNOSTIC is defined */ }; #define UHCI_BUS2SC(bus) ((bus)->ub_hcpriv) @@ -172,7 +160,7 @@ typedef struct uhci_softc { char sc_suspend; char sc_dying; - LIST_HEAD(, uhci_intr_info) sc_intrhead; + TAILQ_HEAD(, uhci_xfer) sc_intrhead; /* Info for the root hub interrupt "pipe". */ int sc_ival; /* time between root hub intrs */