Source-Changes-HG archive

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

[src/netbsd-8]: src/sys/dev/usb Pull up following revision(s) (requested by j...



details:   https://anonhg.NetBSD.org/src/rev/c79ba6455958
branches:  netbsd-8
changeset: 851689:c79ba6455958
user:      martin <martin%NetBSD.org@localhost>
date:      Sat May 05 15:05:39 2018 +0000

description:
Pull up following revision(s) (requested by jdolecek in ticket #787):

        sys/dev/usb/xhci.c: revision 1.88-1.90
        sys/dev/usb/xhcireg.h: revision 1.10

add KASSERT() that sc_child* is set to NULL after child detach; just for
readability, it's not immediatelly obvious this is done in xhci_childdet()
no functional changes

trigger the softint processing on that child bus which is not detached yet
fixes PR kern/53066 by Martin Husemann

enable code to only trigger usb processing when EINT is set, to
avoid misinterpreting shared interrupt for another device

when clearing USBSTS, actually preserve the bits which spec requires to
preserve, and actually clear bit 1, which should be actually always
cleared to zero by spec

also #ifdef XHCI_DEBUG some unnecessary register reads
this should finally resolve PR kern/53066 also for Martin

diffstat:

 sys/dev/usb/xhci.c    |  39 +++++++++++++++++++++++++++++++--------
 sys/dev/usb/xhcireg.h |   5 ++++-
 2 files changed, 35 insertions(+), 9 deletions(-)

diffs (120 lines):

diff -r 7f5035668365 -r c79ba6455958 sys/dev/usb/xhci.c
--- a/sys/dev/usb/xhci.c        Sat May 05 15:00:29 2018 +0000
+++ b/sys/dev/usb/xhci.c        Sat May 05 15:05:39 2018 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: xhci.c,v 1.72.2.5 2017/12/21 21:53:31 snj Exp $        */
+/*     $NetBSD: xhci.c,v 1.72.2.6 2018/05/05 15:05:39 martin Exp $     */
 
 /*
  * Copyright (c) 2013 Jonathan A. Kollasch
@@ -34,7 +34,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: xhci.c,v 1.72.2.5 2017/12/21 21:53:31 snj Exp $");
+__KERNEL_RCSID(0, "$NetBSD: xhci.c,v 1.72.2.6 2018/05/05 15:05:39 martin Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_usb.h"
@@ -582,12 +582,14 @@
                rv = config_detach(sc->sc_child2, flags);
                if (rv != 0)
                        return rv;
+               KASSERT(sc->sc_child2 == NULL);
        }
 
        if (sc->sc_child != NULL) {
                rv = config_detach(sc->sc_child, flags);
                if (rv != 0)
                        return rv;
+               KASSERT(sc->sc_child == NULL);
        }
 
        /* XXX unconfigure/free slots */
@@ -1247,7 +1249,16 @@
 
        ret = xhci_intr1(sc);
        if (ret) {
-               usb_schedsoftintr(&sc->sc_bus);
+               KASSERT(sc->sc_child || sc->sc_child2);
+
+               /*
+                * One of child busses could be already detached. It doesn't
+                * matter on which of the two the softintr is scheduled.
+                */
+               if (sc->sc_child)
+                       usb_schedsoftintr(&sc->sc_bus);
+               else
+                       usb_schedsoftintr(&sc->sc_bus2);
        }
 done:
        mutex_spin_exit(&sc->sc_intr_lock);
@@ -1264,24 +1275,36 @@
 
        usbsts = xhci_op_read_4(sc, XHCI_USBSTS);
        DPRINTFN(16, "USBSTS %08jx", usbsts, 0, 0, 0);
-#if 0
-       if ((usbsts & (XHCI_STS_EINT|XHCI_STS_PCD)) == 0) {
+       if ((usbsts & (XHCI_STS_HSE | XHCI_STS_EINT | XHCI_STS_PCD |
+           XHCI_STS_HCE)) == 0) {
+               DPRINTFN(16, "ignored intr not for %s",
+                   device_xname(sc->sc_dev), 0, 0, 0);
                return 0;
        }
-#endif
-       xhci_op_write_4(sc, XHCI_USBSTS,
-           usbsts & (2|XHCI_STS_EINT|XHCI_STS_PCD)); /* XXX */
+
+       /*
+        * Clear EINT and other transient flags, to not misenterpret
+        * next shared interrupt. Also, to avoid race, EINT must be cleared
+        * before XHCI_IMAN_INTR_PEND is cleared.
+        */
+       xhci_op_write_4(sc, XHCI_USBSTS, usbsts & XHCI_STS_RSVDP0);
+
+#ifdef XHCI_DEBUG
        usbsts = xhci_op_read_4(sc, XHCI_USBSTS);
        DPRINTFN(16, "USBSTS %08jx", usbsts, 0, 0, 0);
+#endif
 
        iman = xhci_rt_read_4(sc, XHCI_IMAN(0));
        DPRINTFN(16, "IMAN0 %08jx", iman, 0, 0, 0);
        iman |= XHCI_IMAN_INTR_PEND;
        xhci_rt_write_4(sc, XHCI_IMAN(0), iman);
+
+#ifdef XHCI_DEBUG
        iman = xhci_rt_read_4(sc, XHCI_IMAN(0));
        DPRINTFN(16, "IMAN0 %08jx", iman, 0, 0, 0);
        usbsts = xhci_op_read_4(sc, XHCI_USBSTS);
        DPRINTFN(16, "USBSTS %08jx", usbsts, 0, 0, 0);
+#endif
 
        return 1;
 }
diff -r 7f5035668365 -r c79ba6455958 sys/dev/usb/xhcireg.h
--- a/sys/dev/usb/xhcireg.h     Sat May 05 15:00:29 2018 +0000
+++ b/sys/dev/usb/xhcireg.h     Sat May 05 15:05:39 2018 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: xhcireg.h,v 1.9 2017/01/19 16:05:00 skrll Exp $ */
+/* $NetBSD: xhcireg.h,v 1.9.6.1 2018/05/05 15:05:39 martin Exp $ */
 
 /*-
  * Copyright (c) 2010 Hans Petter Selasky. All rights reserved.
@@ -106,14 +106,17 @@
 
 #define        XHCI_USBSTS             0x04    /* XHCI status */
 #define         XHCI_STS_HCH           0x00000001      /* RO - Host Controller Halted */
+#define         XHCI_STS_RSVDZ0        0x00000002      /* RsvdZ - 2:2 */
 #define         XHCI_STS_HSE           0x00000004      /* RW - Host System Error */
 #define         XHCI_STS_EINT          0x00000008      /* RW - Event Interrupt */
 #define         XHCI_STS_PCD           0x00000010      /* RW - Port Change Detect */
+#define         XHCI_STS_RSVDZ1        __BITS(5, 7)    /* RsvdZ - 5:7 */
 #define         XHCI_STS_SSS           0x00000100      /* RO - Save State Status */
 #define         XHCI_STS_RSS           0x00000200      /* RO - Restore State Status */
 #define         XHCI_STS_SRE           0x00000400      /* RW - Save/Restore Error */
 #define         XHCI_STS_CNR           0x00000800      /* RO - Controller Not Ready */
 #define         XHCI_STS_HCE           0x00001000      /* RO - Host Controller Error */
+#define         XHCI_STS_RSVDP0        __BITS(13, 31)  /* RsvdP - 13:31 */
 
 #define        XHCI_PAGESIZE           0x08    /* XHCI page size mask */
 #define         XHCI_PAGESIZE_4K       0x00000001      /* 4K Page Size */



Home | Main Index | Thread Index | Old Index