On Sun, Apr 15, 2018 at 10:04:13PM -0700, Mike Larkin wrote:
> On Sun, Apr 15, 2018 at 11:47:45PM -0500, Juan Morado wrote:
> > System:  OpenBSD 6.3
> > Details: OpenBSD 6.3 (GENERIC.MP) #107: Sat Mar 24 14:21:59 MDT 2018
> >             [email protected]:/usr/src/sys/arch/amd64/compile/
> > GENERIC.MP
> > 
> > Architecture: OpenBSD.amd64
> > Machine:      amd64
> > 
> > Description:  Touching the track pad of this ASUS X541SA laptop during boot
> > causes a kernel panic when running 6.3. Touching/using the trackpad after X
> > starts causes the system to become unresponsive (hang).
> > 
> > How to repeat: Reboot the system, swipe a finger on the track pad while
> > booting. Or use the track pad after the machine has booted and X has
> > started.
> > 
> > Fix: no known work around or fix
> > 
> > "show panic", trace, ps, and "show registers" output attached in
> > ddb_trace.txt
> > 
> > dmesg.txt contains the dmesg.
> 
> > addr 1: xHCI root hub, Intel
> >  addr 2: USB Flash Disk, General
> 
> 
> jsg, kettenis? Thoughts?
> 
> -ml
> 
> 
> 
> 
> 
> > Domain /dev/pci0:
> >  0:0:0: Intel Braswell Host
> >  0:2:0: Intel HD Graphics
> >  0:11:0: Intel Braswell Power
> >  0:19:0: Intel Braswell AHCI
> >  0:20:0: Intel Braswell xHCI
> >  0:26:0: Intel Braswell TXE
> >  0:27:0: Intel Braswell HD Audio
> >  0:28:0: Intel Braswell PCIE
> >  0:28:2: Intel Braswell PCIE
> >  0:28:3: Intel Braswell PCIE
> >  0:31:0: Intel Braswell PCU LPC
> >  0:31:3: Intel Braswell SMBus
> >  2:0:0: Realtek 8101E
> >  3:0:0: Realtek 8191SE
> 
> > System:  OpenBSD 6.3
> > Details: OpenBSD 6.3 (GENERIC.MP) #107: Sat Mar 24 14:21:59 MDT 2018
> >             
> > [email protected]:/usr/src/sys/arch/amd64/compile/GENERIC.MP
> > 
> > Architecture: OpenBSD.amd64
> > Machine:      amd64
> > 
> > Description:  Touching the track pad of this ASUS X541SA laptop during boot 
> > causes a kernel panic. Touching/using the trackpad after X starts causes 
> > the system to become unresponsive (hang).
> > 
> > How to repeat: Reboot the system, swip a finger on the track pad while 
> > booting. Or use the track pad after the machine has booted and X has 
> > started. 
> > 
> > Fix: no known work around or fix
> > 
> > 
> > ddb{0}> show panic
> > kernel page fault
> > uvm_fault(0xffffffff81afca80, 0xffff8000006f8000, 0, 1) -> e
> > ihidev_intr(ffff8000000d9300) at ihidev_intr+0x18a
> > end trace frame: 0xffff8000314a3ac8, count: 0
> > 
> > ddb{0}> trace
> > ihidev_intr(ffff8000000d9300) at ihidev_intr+0x18a
> > intr_handler(0,ffff800000127280) at intr_handler+0x57
> > Xintr_ioapic_level17_untramp() at Xintr_ioapic_level17_untramp+0x12c
> > --- interrupt ---
> > acpicpu_idle() at acpicpu_idle+0x1d9
> > cpu_idle_cycle(0,0,ffffffff81abbff0,ffffffff817e4290,ffffffff817e44b5,fffffff181c1f0)
> >  at cpu_idle_cycle+0x10
> > end trace frame: 0x0, count: -5

I'm curious if disestablishing the interrupt handler in attach in the
early returns before sc_ibuf has been allocated changes anything.

Index: ihidev.c
===================================================================
RCS file: /cvs/src/sys/dev/i2c/ihidev.c,v
retrieving revision 1.16
diff -u -p -r1.16 ihidev.c
--- ihidev.c    12 Jan 2018 08:11:47 -0000      1.16
+++ ihidev.c    16 Apr 2018 06:17:48 -0000
@@ -139,8 +139,14 @@ ihidev_attach(struct device *parent, str
            (char *)ia->ia_cookie);
 
        sc->sc_nrepid = ihidev_maxrepid(sc->sc_report, sc->sc_reportlen);
-       if (sc->sc_nrepid < 0)
+       if (sc->sc_nrepid < 0) {
+               printf("%s: nrepid %d\n", sc->sc_dev.dv_xname, sc->sc_nrepid);
+               if (sc->sc_ih) {
+                       intr_disestablish(sc->sc_ih);
+                       sc->sc_ih = NULL;
+               }
                return;
+       }
 
        printf("%s: %d report id%s\n", sc->sc_dev.dv_xname, sc->sc_nrepid,
            sc->sc_nrepid > 1 ? "s" : "");
@@ -150,6 +156,10 @@ ihidev_attach(struct device *parent, str
            M_DEVBUF, M_NOWAIT | M_ZERO);
        if (sc->sc_subdevs == NULL) {
                printf("%s: failed allocating memory\n", sc->sc_dev.dv_xname);
+               if (sc->sc_ih) {
+                       intr_disestablish(sc->sc_ih);
+                       sc->sc_ih = NULL;
+               }
                return;
        }
 

Reply via email to