diff options
author | 2016-09-05 09:59:20 +0000 | |
---|---|---|
committer | 2016-09-05 09:59:20 +0000 | |
commit | 1716ab5418d500e2e881e343db7b3bd7d227d064 (patch) | |
tree | c9bf1e0cfb3ec54287afc85c94c89293ae6b71f6 | |
parent | ldapd regress is creating files during make obj; comment out until fixed (diff) | |
download | wireguard-openbsd-1716ab5418d500e2e881e343db7b3bd7d227d064.tar.xz wireguard-openbsd-1716ab5418d500e2e881e343db7b3bd7d227d064.zip |
Backout previous commit; does not compile.
-rw-r--r-- | sys/dev/pci/if_ipw.c | 31 | ||||
-rw-r--r-- | sys/dev/pci/if_ipwvar.h | 6 |
2 files changed, 26 insertions, 11 deletions
diff --git a/sys/dev/pci/if_ipw.c b/sys/dev/pci/if_ipw.c index c9a0ed2c144..fcbe289c4da 100644 --- a/sys/dev/pci/if_ipw.c +++ b/sys/dev/pci/if_ipw.c @@ -1,4 +1,4 @@ -/* $OpenBSD: if_ipw.c,v 1.116 2016/09/05 08:17:29 tedu Exp $ */ +/* $OpenBSD: if_ipw.c,v 1.117 2016/09/05 09:59:20 kettenis Exp $ */ /*- * Copyright (c) 2004-2008 @@ -28,7 +28,6 @@ #include <sys/task.h> #include <sys/mbuf.h> #include <sys/kernel.h> -#include <sys/rwlock.h> #include <sys/socket.h> #include <sys/systm.h> #include <sys/conf.h> @@ -204,7 +203,6 @@ ipw_attach(struct device *parent, struct device *self, void *aux) } printf(": %s", intrstr); - rw_init(&sc->sc_rwlock, "ipwlock"); task_set(&sc->sc_scantask, ipw_scan, sc); task_set(&sc->sc_authandassoctask, ipw_auth_and_assoc, sc); @@ -320,14 +318,17 @@ ipw_wakeup(struct ipw_softc *sc) data &= ~0x0000ff00; pci_conf_write(sc->sc_pct, sc->sc_pcitag, 0x40, data); - rw_enter_write(&sc->sc_rwlock); s = splnet(); + while (sc->sc_flags & IPW_FLAG_BUSY) + tsleep(&sc->sc_flags, PZERO, "ipwpwr", 0); + sc->sc_flags |= IPW_FLAG_BUSY; if (ifp->if_flags & IFF_UP) ipw_init(ifp); + sc->sc_flags &= ~IPW_FLAG_BUSY; + wakeup(&sc->sc_flags); splx(s); - rw_exit_write(&sc->sc_rwlock); } int @@ -1358,10 +1359,18 @@ ipw_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data) struct ifreq *ifr; int s, error = 0; - error = rw_enter(&sc->sc_rwlock, RW_ENTER | RW_INTR); - if (error) - return error; s = splnet(); + /* + * Prevent processes from entering this function while another + * process is tsleep'ing in it. + */ + while ((sc->sc_flags & IPW_FLAG_BUSY) && error == 0) + error = tsleep(&sc->sc_flags, PCATCH, "ipwioc", 0); + if (error != 0) { + splx(s); + return error; + } + sc->sc_flags |= IPW_FLAG_BUSY; switch (cmd) { case SIOCSIFADDR: @@ -1410,8 +1419,9 @@ ipw_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data) error = 0; } + sc->sc_flags &= ~IPW_FLAG_BUSY; + wakeup(&sc->sc_flags); splx(s); - rw_exit_write(&sc->sc_rwlock); return error; } @@ -1473,6 +1483,8 @@ ipw_stop_master(struct ipw_softc *sc) tmp = CSR_READ_4(sc, IPW_CSR_RST); CSR_WRITE_4(sc, IPW_CSR_RST, tmp | IPW_RST_PRINCETON_RESET); + + sc->sc_flags &= ~IPW_FLAG_FW_INITED; } int @@ -1992,6 +2004,7 @@ ipw_init(struct ifnet *ifp) printf("%s: could not load firmware\n", sc->sc_dev.dv_xname); goto fail2; } + sc->sc_flags |= IPW_FLAG_FW_INITED; free(fw.data, M_DEVBUF, fw.size); fw.data = NULL; diff --git a/sys/dev/pci/if_ipwvar.h b/sys/dev/pci/if_ipwvar.h index bef0fff5f23..e61e83bfd30 100644 --- a/sys/dev/pci/if_ipwvar.h +++ b/sys/dev/pci/if_ipwvar.h @@ -1,4 +1,4 @@ -/* $OpenBSD: if_ipwvar.h,v 1.26 2016/09/05 08:17:29 tedu Exp $ */ +/* $OpenBSD: if_ipwvar.h,v 1.27 2016/09/05 09:59:20 kettenis Exp $ */ /*- * Copyright (c) 2004-2006 @@ -82,7 +82,9 @@ struct ipw_softc { int (*sc_newstate)(struct ieee80211com *, enum ieee80211_state, int); - struct rwlock sc_rwlock; + uint32_t sc_flags; +#define IPW_FLAG_FW_INITED (1 << 0) +#define IPW_FLAG_BUSY (1 << 1) bus_space_tag_t sc_st; bus_space_handle_t sc_sh; |