On 25/07/17(Tue) 00:30, sc dying wrote:
> On 2017/07/24 14:35, Martin Pieuchot wrote:
> > [...]
> > Here's a diff to try and play with.  I'd guess the problem is in
> > pipe_close().  Which state has the EP you're closing?  Do we close
> > the EP correctly?
> 
> EP 3 is RX pipe, EP 4 is TX pipe.
> Looks good to me.

Does that mean it works?  Do you still see a RXERROR with it?

> > - /* Mask the endpoint */
> > + /* Stop the endpoint */
> > + bus_dmamap_sync(sdev->ictx_dma.tag, sdev->ictx_dma.map, 0,
> > +    sc->sc_pagesize, BUS_DMASYNC_POSTREAD);
> > + state = letoh32(XHCI_EPCTX_STATE(sdev->ep_ctx[xp->dci - 1]->info_lo));
> 
> Do you wanna see output context (device context, 6.2.1)?

I'm not sure why would I, could you elaborate?

I though the Endpoint Context, sec. 6.2.3, is enough.  Updated diff with
a corrected letoh32().

Index: xhci.c
===================================================================
RCS file: /cvs/src/sys/dev/usb/xhci.c,v
retrieving revision 1.73
diff -u -p -r1.73 xhci.c
--- xhci.c      22 Jun 2017 02:44:37 -0000      1.73
+++ xhci.c      27 Jul 2017 12:21:54 -0000
@@ -1251,13 +1251,22 @@ xhci_pipe_close(struct usbd_pipe *pipe)
        struct xhci_softc *sc = (struct xhci_softc *)pipe->device->bus;
        struct xhci_pipe *lxp, *xp = (struct xhci_pipe *)pipe;
        struct xhci_soft_dev *sdev = &sc->sc_sdevs[xp->slot];
+       uint32_t state;
        int i;
 
        /* Root Hub */
        if (pipe->device->depth == 0)
                return;
 
-       /* Mask the endpoint */
+       /* If required, stop the endpoint */
+       bus_dmamap_sync(sdev->ictx_dma.tag, sdev->ictx_dma.map, 0,
+           sc->sc_pagesize, BUS_DMASYNC_POSTREAD);
+       state = XHCI_EPCTX_STATE(letoh32(sdev->ep_ctx[xp->dci - 1]->info_lo));
+       printf("%s: EP %d state=%x\n", DEVNAME(sc), xp->dci, state);
+       if (state != XHCI_EP_STOPPED && xhci_cmd_stop_ep(sc, xp->slot, xp->dci))
+               DPRINTF(("%s: error stopping ep (%d)\n", DEVNAME(sc), xp->dci));
+
+       /* Mask it */
        sdev->input_ctx->drop_flags = htole32(XHCI_INCTX_MASK_DCI(xp->dci));
        sdev->input_ctx->add_flags = 0;
 

Reply via email to