> Date: Thu, 5 Sep 2019 18:23:37 +0200
> From: Alexander Bluhm <[email protected]>
> 
> On Wed, Sep 04, 2019 at 03:54:25PM +0200, Mark Kettenis wrote:
> > > If the mapping cannot be solved, maybe the activate function can skip
> > > all work if sc->sc.sc_size is 0.
> >
> > So this is, IMHO, the only viable approach.  I just wanted to trick
> > somebody else into doing the work ;).
> 
> ehci does that.
> 
> ----------------------------
> revision 1.31
> date: 2019/05/02 20:28:46;  author: kettenis;  state: Exp;  lines: +8 -4;  
> commitid: UueNy7svryPLHN1X;
> Avoid running the activate function for a partially attached ehci(4) driver.
> The Realtek DASH ehci(4) doesn't have a properly set SBRN register which
> prevents us from fully attaching the device.  This would result in a panic
> during suspend because the activate function will access register that
> aren't mapped.
> 
> ok deraadt@
> ----------------------------
> 
> If I do the same for uhci, it solves my problem.

Well, not really since USB 1.1 devices won't work...

> ok?

ok kettenis@

> Index: dev/pci/uhci_pci.c
> ===================================================================
> RCS file: /data/mirror/openbsd/cvs/src/sys/dev/pci/uhci_pci.c,v
> retrieving revision 1.33
> diff -u -p -r1.33 uhci_pci.c
> --- dev/pci/uhci_pci.c        16 May 2014 18:17:03 -0000      1.33
> +++ dev/pci/uhci_pci.c        5 Sep 2019 16:15:44 -0000
> @@ -86,6 +86,9 @@ uhci_pci_activate(struct device *self, i
>  {
>       struct uhci_pci_softc *sc = (struct uhci_pci_softc *)self;
> 
> +     if (sc->sc.sc_size == 0)
> +             return 0;
> +
>       /* On resume, set legacy support attribute and enable intrs */
>       switch (act) {
>       case DVACT_RESUME:
> @@ -190,6 +193,7 @@ uhci_pci_attach(struct device *parent, s
> 
>  unmap_ret:
>       bus_space_unmap(sc->sc.iot, sc->sc.ioh, sc->sc.sc_size);
> +     sc->sc.sc_size = 0;
>       splx(s);
>  }
> 
> @@ -218,6 +222,7 @@ uhci_pci_attach_deferred(struct device *
>  unmap_ret:
>       bus_space_unmap(sc->sc.iot, sc->sc.ioh, sc->sc.sc_size);
>       pci_intr_disestablish(sc->sc_pc, sc->sc_ih);
> +     sc->sc.sc_size = 0;
>       splx(s);
>  }
> 
> 

Reply via email to