> On 09/04/15(Thu) 13:11, Thomas Pfaff wrote:
> > $ cu -l cuaU0
> > Connected to /dev/cuaU0 (speed 9600)
> > ucom0 detached
> > uchcom0 detached
> >
> > [EOT]
> > kernel: protection fault trap, code=0
> > Stopped at      ehci_check_intr+0x12:   movzbl  0x3(%rax),%eax
> > ddb{0}> trace
> > ehci_check_intr() at ehci_check_intr+0x12
> > ehci_softintr() at ehci_softintr+0x3f
> > softintr_dispatch() at softintr_dispatch+0x7f
> > Xsoftnet() at Xsoftnet+0x2d

This diff seems to fix the problem.

  $ cu -l cuaU0
  Connected to /dev/cuaU0 (speed 9600)
  ucom0 detached
  uchcom0 detached

  [EOT]
  $

(I had to edit uchcom.c since the diff did not apply but
I'm pretty confident I removed the correct lines :-) )

> It seems that uchcom(4) has a bug preventing it's interrupt pipe from
> being close.  This has the side effect of leaking a xfer and triggering
> the NULL-dereference you're seeing if an interrupt occurs after the
> pipe has been freed.
> 
> Could you test the diff below and tell me if it fixes this issue?
> 
> Index: uchcom.c
> ===================================================================
> RCS file: /cvs/src/sys/dev/usb/uchcom.c,v
> retrieving revision 1.23
> diff -u -p -r1.23 uchcom.c
> --- uchcom.c  14 Mar 2015 03:38:49 -0000      1.23
> +++ uchcom.c  13 Apr 2015 09:00:04 -0000
> @@ -814,9 +814,6 @@ uchcom_close_intr_pipe(struct uchcom_sof
>  {
>       usbd_status err;
>  
> -     if (usbd_is_dying(sc->sc_udev))
> -             return;
> -
>       if (sc->sc_intr_pipe != NULL) {
>               usbd_abort_pipe(sc->sc_intr_pipe);
>               err = usbd_close_pipe(sc->sc_intr_pipe);
> @@ -911,9 +908,6 @@ void
>  uchcom_close(void *arg, int portno)
>  {
>       struct uchcom_softc *sc = arg;
> -
> -     if (usbd_is_dying(sc->sc_udev))
> -             return;
>  
>       uchcom_close_intr_pipe(sc);
>  }

Reply via email to