Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sys/dev/usb Implement (incorrect?) data toggle clear method.



details:   https://anonhg.NetBSD.org/src/rev/667cca59509f
branches:  trunk
changeset: 517922:667cca59509f
user:      augustss <augustss%NetBSD.org@localhost>
date:      Wed Nov 21 14:00:12 2001 +0000

description:
Implement (incorrect?) data toggle clear method.
Implement allocation of qTD chains.

diffstat:

 sys/dev/usb/ehci.c |  69 ++++++++++++++++++++++++++++++-----------------------
 1 files changed, 39 insertions(+), 30 deletions(-)

diffs (193 lines):

diff -r a248376bffb4 -r 667cca59509f sys/dev/usb/ehci.c
--- a/sys/dev/usb/ehci.c        Wed Nov 21 13:44:47 2001 +0000
+++ b/sys/dev/usb/ehci.c        Wed Nov 21 14:00:12 2001 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: ehci.c,v 1.21 2001/11/21 13:43:38 augustss Exp $       */
+/*     $NetBSD: ehci.c,v 1.22 2001/11/21 14:00:12 augustss Exp $       */
 
 /*
  * Copyright (c) 2001 The NetBSD Foundation, Inc.
@@ -47,7 +47,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ehci.c,v 1.21 2001/11/21 13:43:38 augustss Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ehci.c,v 1.22 2001/11/21 14:00:12 augustss Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -484,7 +484,9 @@
                eintrs &= ~EHCI_STS_IAA;
        }
        if (eintrs & (EHCI_STS_INT | EHCI_STS_ERRINT)) {
-               DPRINTF(("ehci_intr1: INT/ERRINT\n"));
+               DPRINTF(("ehci_intr1: %s %s\n", 
+                        eintrs & EHCI_STS_INT ? "INT" : "",
+                        eintrs & EHCI_STS_ERRINT ? "ERRINT" : ""));
                usb_schedsoftintr(&sc->sc_bus);
                eintrs &= ~(EHCI_STS_INT | EHCI_STS_ERRINT);
        }
@@ -598,7 +600,7 @@
        ehci_soft_qtd_t *sqtd, *lsqtd;
        u_int32_t status;
 
-       DPRINTFN(15, ("ehci_check_intr: ex=%p\n", ex));
+       DPRINTFN(/*15*/2, ("ehci_check_intr: ex=%p\n", ex));
 
        if (ex->sqtdstart == NULL) {
                printf("ehci_check_intr: sqtdstart=NULL\n");
@@ -649,7 +651,7 @@
        u_int32_t status = 0, nstatus;
        int actlen;
 
-       DPRINTFN(12, ("ehci_idone: ex=%p\n", ex));
+       DPRINTFN(/*12*/2, ("ehci_idone: ex=%p\n", ex));
 #ifdef DIAGNOSTIC
        {
                int s = splhigh();
@@ -692,14 +694,18 @@
                if (EHCI_QTD_GET_PID(status) != EHCI_QTD_PID_SETUP)
                        actlen += sqtd->len - EHCI_QTD_GET_BYTES(status);
        }
-#if 0
+
        /* If there are left over TDs we need to update the toggle. */
-       if (sqtd != NULL)
+       if (sqtd != NULL) {
+               printf("ehci_idone: need toggle update\n");
+#if 0
                epipe->nexttoggle = EHCI_TD_GET_DT(le32toh(std->td.td_token));
 #endif
+       }
 
        status &= EHCI_QTD_STATERRS;
-       DPRINTFN(10, ("ehci_idone: actlen=%d, status=0x%x\n", actlen, status));
+       DPRINTFN(/*10*/2, ("ehci_idone: len=%d actlen=%d, status=0x%x\n",
+                          xfer->length, actlen, status));
        xfer->actlen = actlen;
        if (status != 0) {
 #ifdef EHCI_DEBUG
@@ -710,7 +716,7 @@
                                 "\6HALTED",
                                 sbuf, sizeof(sbuf));
 
-               DPRINTFN((status == EHCI_QTD_HALTED)*10,
+               DPRINTFN((status == EHCI_QTD_HALTED)*/*10*/2,
                         ("ehci_idone: error, addr=%d, endpt=0x%02x, "
                          "status 0x%s\n",
                          xfer->pipe->device->address,
@@ -727,7 +733,7 @@
        }
 
        usb_transfer_complete(xfer);
-       DPRINTFN(12, ("ehci_idone: ex=%p done\n", ex));
+       DPRINTFN(/*12*/2, ("ehci_idone: ex=%p done\n", ex));
 }
 
 /*
@@ -981,11 +987,12 @@
 {
        struct ehci_pipe *epipe = (struct ehci_pipe *)pipe;
 
-       printf("ehci_device_clear_toggle: epipe=%p\n", epipe);
-#if 0
-OOO
-       epipe->sed->ed.ed_headp &= htole32(~EHCI_TOGGLECARRY);
+       DPRINTF(("ehci_device_clear_toggle: epipe=%p\n", epipe));
+#ifdef USB_DEBUG
+       if (ehcidebug)
+               usbd_dump_pipe(pipe);
 #endif
+       epipe->sqh->qh.qh_qtd.qtd_status &= htole32(~EHCI_QTD_TOGGLE);
 }
 
 Static void
@@ -1226,7 +1233,7 @@
        head->qh.qh_link = htole32(sqh->physaddr | EHCI_LINK_QH);
 
 #ifdef EHCI_DEBUG
-       if (ehcidebug > 0) {
+       if (ehcidebug > 5) {
                printf("ehci_add_qh:\n");
                ehci_dump_sqh(sqh);
        }
@@ -1986,7 +1993,7 @@
                     ehci_soft_qtd_t **sp, ehci_soft_qtd_t **ep)
 {
        ehci_soft_qtd_t *next, *cur;
-       ehci_physaddr_t dataphys, dataphysend, nextphys;
+       ehci_physaddr_t dataphys, dataphyspage, dataphyslastpage, nextphys;
        u_int32_t qtdstatus;
        int len, curlen;
        int i;
@@ -1996,7 +2003,7 @@
 
        len = alen;
        dataphys = DMAADDR(dma);
-       dataphysend = EHCI_PAGE(dataphys + len - 1);
+       dataphyslastpage = EHCI_PAGE(dataphys + len - 1);
        qtdstatus = htole32(
            EHCI_QTD_SET_STATUS(EHCI_QTD_ACTIVE) |
            EHCI_QTD_SET_PID(rd ? EHCI_QTD_PID_IN : EHCI_QTD_PID_OUT) |
@@ -2011,31 +2018,29 @@
                goto nomem;
        *sp = cur;
        for (;;) {
+               dataphyspage = EHCI_PAGE(dataphys);
                /* The EHCI hardware can handle at most 4 page crossings. */
-               if (EHCI_PAGE(dataphys) == dataphysend ||
-                   EHCI_PAGE(dataphys) + EHCI_QTD_NBUFFERS * EHCI_PAGE_SIZE
-                     == dataphysend) {
+               if (dataphyslastpage - dataphyspage < EHCI_QTD_NBUFFERS) {
                        /* we can handle it in this QTD */
                        curlen = len;
                } else {
-#if 0
+                       DPRINTF(("ehci_alloc_std_chain: multiple QTDs\n"));
+
                        /* must use multiple TDs, fill as much as possible. */
-                       curlen = 2 * EHCI_PAGE_SIZE - 
-                                (dataphys & (EHCI_PAGE_SIZE-1));
+                       curlen = EHCI_QTD_NBUFFERS * EHCI_PAGE_SIZE - 
+                                EHCI_PAGE_OFFSET(dataphys);
+
+                       /* XXX true for EHCI? */
                        /* the length must be a multiple of the max size */
                        curlen -= curlen % UGETW(epipe->pipe.endpoint->edesc->wMaxPacketSize);
 #ifdef DIAGNOSTIC
                        if (curlen == 0)
                                panic("ehci_alloc_std: curlen == 0\n");
 #endif
-#else
-                       printf("ehci_alloc_std_chain: multiple QTDs\n");
-                       return (USBD_NOMEM);
-#endif
                }
                DPRINTFN(4,("ehci_alloc_std_chain: dataphys=0x%08x "
-                           "dataphysend=0x%08x len=%d curlen=%d\n",
-                           dataphys, dataphysend,
+                           "dataphyslastpage=0x%08x len=%d curlen=%d\n",
+                           dataphys, dataphyslastpage,
                            len, curlen));
                len -= curlen;
 
@@ -2202,6 +2207,10 @@
        ehci_softc_t *sc = (ehci_softc_t *)epipe->pipe.device->bus;
 
        DPRINTF(("ehci_timeout: exfer=%p\n", exfer));
+#ifdef USB_DEBUG
+       if (ehcidebug)
+               usbd_dump_pipe(exfer->xfer.pipe);
+#endif
 
        if (sc->sc_dying) {
                ehci_abort_xfer(&exfer->xfer, USBD_TIMEOUT);
@@ -2495,7 +2504,7 @@
        int len, isread, endpt;
        int s;
 
-       DPRINTFN(3, ("ehci_device_bulk_transfer: xfer=%p len=%d flags=%d\n",
+       DPRINTFN(2, ("ehci_device_bulk_transfer: xfer=%p len=%d flags=%d\n",
                     xfer, xfer->length, xfer->flags));
 
        if (sc->sc_dying)



Home | Main Index | Thread Index | Old Index