From: "Theo de Raadt" Subject: Re: qwx(4) suspend/hibernate + resume To: tech@openbsd.org Date: Wed, 21 Feb 2024 10:18:25 -0700 Works for multiple suspends on a x13s. Stefan Sperling wrote: > This patch adds suspend/hibernate + resume support to qwx(4). > > Without this patch, upon resume the qwx0 interface remains apparently > associated to the previous AP (as displayed by ifconfig) but no traffic > will pass until the user runs: ifconfig qwx0 down up > > With this patch, the qwx0 interface begins scanning for APs upon resume > without requiring user interaction. > > On the Z13 I can only test hibernate, which works as expected. > Could someone test suspend, e.g. on the X13s? Thanks! > > diff 5d222591396a4298c24273941b8f06dafeb24bf3 6dc955176d769c398ad467a99b6434d9c54d57b8 > commit - 5d222591396a4298c24273941b8f06dafeb24bf3 > commit + 6dc955176d769c398ad467a99b6434d9c54d57b8 > blob - 66827a4458b4ce35d2d14d38e770482959311866 > blob + b1c0c1a5f3627951ac086c6d403fbbd57d8f8b1b > --- sys/dev/ic/qwx.c > +++ sys/dev/ic/qwx.c > @@ -24762,3 +24762,33 @@ qwx_dmamem_free(bus_dma_tag_t dmat, struct qwx_dmamem > bus_dmamap_destroy(dmat, adm->map); > free(adm, M_DEVBUF, sizeof(*adm)); > } > + > +int > +qwx_activate(struct device *self, int act) > +{ > + struct qwx_softc *sc = (struct qwx_softc *)self; > + struct ifnet *ifp = &sc->sc_ic.ic_if; > + int err = 0; > + > + switch (act) { > + case DVACT_QUIESCE: > + if (ifp->if_flags & IFF_RUNNING) { > + rw_enter_write(&sc->ioctl_rwl); > + qwx_stop(ifp); > + rw_exit(&sc->ioctl_rwl); > + } > + break; > + case DVACT_RESUME: > + break; > + case DVACT_WAKEUP: > + if ((ifp->if_flags & (IFF_UP | IFF_RUNNING)) == IFF_UP) { > + err = qwx_init(ifp); > + if (err) > + printf("%s: could not initialize hardware\n", > + sc->sc_dev.dv_xname); > + } > + break; > + } > + > + return 0; > +} > blob - 6d81b9cf6b0ddbe8e67fb0d78d6b4cd4b7944dac > blob + f7f429fa27e3fc5f63cb9345a9e90f46d5fbf15d > --- sys/dev/ic/qwxvar.h > +++ sys/dev/ic/qwxvar.h > @@ -1901,6 +1901,7 @@ int qwx_dp_service_srng(struct qwx_softc *, int); > int qwx_init_hw_params(struct qwx_softc *); > int qwx_attach(struct qwx_softc *); > void qwx_detach(struct qwx_softc *); > +int qwx_activate(struct device *, int); > > void qwx_core_deinit(struct qwx_softc *); > void qwx_ce_cleanup_pipes(struct qwx_softc *); > blob - 05cab4d0fc248d6c48d48ac9aad36fa6aa30c328 > blob + 9fd14232402e064ea2c520f63ba8d6afd0b36431 > --- sys/dev/pci/if_qwx_pci.c > +++ sys/dev/pci/if_qwx_pci.c > @@ -402,7 +402,6 @@ int qwx_pci_match(struct device *, void *, void *); > void qwx_pci_attach(struct device *, struct device *, void *); > int qwx_pci_detach(struct device *, int); > void qwx_pci_attach_hook(struct device *); > -int qwx_pci_activate(struct device *, int); > void qwx_pci_free_xfer_rings(struct qwx_pci_softc *); > int qwx_pci_alloc_xfer_ring(struct qwx_softc *, struct qwx_pci_xfer_ring *, > uint32_t, uint32_t, uint32_t, size_t); > @@ -526,7 +525,7 @@ const struct cfattach qwx_pci_ca = { > qwx_pci_match, > qwx_pci_attach, > qwx_pci_detach, > - qwx_pci_activate > + qwx_activate > }; > > /* XXX pcidev */ > @@ -1204,19 +1203,6 @@ qwx_pci_attach_hook(struct device *self) > splx(s); > } > > -int > -qwx_pci_activate(struct device *self, int act) > -{ > - switch (act) { > - case DVACT_SUSPEND: > - break; > - case DVACT_WAKEUP: > - break; > - } > - > - return 0; > -} > - > void > qwx_pci_free_xfer_rings(struct qwx_pci_softc *psc) > { >