Module Name: src Committed By: skrll Date: Sat Jan 28 12:12:20 UTC 2017
Modified Files: src/sys/dev/usb [nick-nhusb]: TODO.usbmp if_zyd.c if_zydreg.h Log Message: Remove tsleep/wakeup from if_zyd To generate a diff of this commit: cvs rdiff -u -r1.8.4.10 -r1.8.4.11 src/sys/dev/usb/TODO.usbmp cvs rdiff -u -r1.36.14.12 -r1.36.14.13 src/sys/dev/usb/if_zyd.c cvs rdiff -u -r1.7.16.4 -r1.7.16.5 src/sys/dev/usb/if_zydreg.h Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/dev/usb/TODO.usbmp diff -u src/sys/dev/usb/TODO.usbmp:1.8.4.10 src/sys/dev/usb/TODO.usbmp:1.8.4.11 --- src/sys/dev/usb/TODO.usbmp:1.8.4.10 Sat Jan 28 12:04:17 2017 +++ src/sys/dev/usb/TODO.usbmp Sat Jan 28 12:12:19 2017 @@ -1,4 +1,4 @@ -$NetBSD: TODO.usbmp,v 1.8.4.10 2017/01/28 12:04:17 skrll Exp $ +$NetBSD: TODO.usbmp,v 1.8.4.11 2017/01/28 12:12:19 skrll Exp $ the majority of the USB MP device interface is documented in usbdivar.h. @@ -97,7 +97,6 @@ splusb drivers: wakeup/tsleep drivers: - if_run.c - - if_zyd.c - ucycom.c - udsir.c - uirda.c Index: src/sys/dev/usb/if_zyd.c diff -u src/sys/dev/usb/if_zyd.c:1.36.14.12 src/sys/dev/usb/if_zyd.c:1.36.14.13 --- src/sys/dev/usb/if_zyd.c:1.36.14.12 Mon Dec 5 10:55:18 2016 +++ src/sys/dev/usb/if_zyd.c Sat Jan 28 12:12:19 2017 @@ -1,5 +1,5 @@ /* $OpenBSD: if_zyd.c,v 1.52 2007/02/11 00:08:04 jsg Exp $ */ -/* $NetBSD: if_zyd.c,v 1.36.14.12 2016/12/05 10:55:18 skrll Exp $ */ +/* $NetBSD: if_zyd.c,v 1.36.14.13 2017/01/28 12:12:19 skrll Exp $ */ /*- * Copyright (c) 2006 by Damien Bergamini <damien.bergam...@free.fr> @@ -23,7 +23,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_zyd.c,v 1.36.14.12 2016/12/05 10:55:18 skrll Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_zyd.c,v 1.36.14.13 2017/01/28 12:12:19 skrll Exp $"); #ifdef _KERNEL_OPT #include "opt_usb.h" @@ -343,6 +343,8 @@ zyd_attach(device_t parent, device_t sel IFQ_SET_READY(&ifp->if_snd); memcpy(ifp->if_xname, device_xname(sc->sc_dev), IFNAMSIZ); + mutex_init(&sc->sc_lock, MUTEX_DEFAULT, IPL_SOFTUSB); + cv_init(&sc->sc_cmdcv, "zydcmd"); SIMPLEQ_INIT(&sc->sc_rqh); /* defer configrations after file system is ready to load firmware */ @@ -466,12 +468,11 @@ zyd_detach(device_t self, int flags) struct zyd_softc *sc = device_private(self); struct ieee80211com *ic = &sc->sc_ic; struct ifnet *ifp = &sc->sc_if; - int s; if (!sc->attached) return 0; - s = splusb(); + mutex_enter(&sc->sc_lock); zyd_stop(ifp, 1); usb_rem_task(sc->sc_udev, &sc->sc_task); @@ -487,7 +488,10 @@ zyd_detach(device_t self, int flags) ieee80211_ifdetach(ic); if_detach(ifp); - splx(s); + mutex_exit(&sc->sc_lock); + + mutex_destroy(&sc->sc_lock); + cv_destroy(&sc->sc_cmdcv); usbd_add_drv_event(USB_EVENT_DRIVER_DETACH, sc->sc_udev, sc->sc_dev); @@ -792,7 +796,6 @@ zyd_cmd(struct zyd_softc *sc, uint16_t c uint16_t xferflags; int error; usbd_status uerror; - int s = 0; error = usbd_create_xfer(sc->zyd_ep[ZYD_ENDPT_IOUT], sizeof(uint16_t) + ilen, USBD_FORCE_SHORT_XFER, 0, &xfer); @@ -806,19 +809,18 @@ zyd_cmd(struct zyd_softc *sc, uint16_t c if (!(flags & ZYD_CMD_FLAG_READ)) xferflags |= USBD_SYNCHRONOUS; else { - s = splusb(); rq.idata = idata; rq.odata = odata; rq.len = olen / sizeof(struct zyd_pair); + mutex_enter(&sc->sc_lock); SIMPLEQ_INSERT_TAIL(&sc->sc_rqh, &rq, rq); + mutex_exit(&sc->sc_lock); } usbd_setup_xfer(xfer, 0, &cmd, sizeof(uint16_t) + ilen, xferflags, ZYD_INTR_TIMEOUT, NULL); uerror = usbd_transfer(xfer); if (uerror != USBD_IN_PROGRESS && uerror != 0) { - if (flags & ZYD_CMD_FLAG_READ) - splx(s); printf("%s: could not send command (error=%s)\n", device_xname(sc->sc_dev), usbd_errstr(uerror)); (void)usbd_destroy_xfer(xfer); @@ -829,11 +831,12 @@ zyd_cmd(struct zyd_softc *sc, uint16_t c return 0; /* write: don't wait for reply */ } /* wait at most one second for command reply */ - error = tsleep(odata, PCATCH, "zydcmd", hz); + mutex_enter(&sc->sc_lock); + error = cv_timedwait_sig(&sc->sc_cmdcv, &sc->sc_lock, hz); if (error == EWOULDBLOCK) printf("%s: zyd_read sleep timeout\n", device_xname(sc->sc_dev)); SIMPLEQ_REMOVE(&sc->sc_rqh, &rq, rq, rq); - splx(s); + mutex_exit(&sc->sc_lock); (void)usbd_destroy_xfer(xfer); return error; @@ -1872,6 +1875,7 @@ zyd_intr(struct usbd_xfer *xfer, void * datalen -= sizeof(cmd->code); datalen -= 2; /* XXX: padding? */ + mutex_enter(&sc->sc_lock); SIMPLEQ_FOREACH(rqp, &sc->sc_rqh, rq) { int i; @@ -1888,10 +1892,11 @@ zyd_intr(struct usbd_xfer *xfer, void * /* copy answer into caller-supplied buffer */ memcpy(rqp->odata, cmd->data, sizeof(struct zyd_pair) * rqp->len); - wakeup(rqp->odata); /* wakeup caller */ - + cv_signal(&sc->sc_cmdcv); + mutex_exit(&sc->sc_lock); return; } + mutex_exit(&sc->sc_lock); return; /* unexpected IORD notification */ } else { printf("%s: unknown notification %x\n", device_xname(sc->sc_dev), Index: src/sys/dev/usb/if_zydreg.h diff -u src/sys/dev/usb/if_zydreg.h:1.7.16.4 src/sys/dev/usb/if_zydreg.h:1.7.16.5 --- src/sys/dev/usb/if_zydreg.h:1.7.16.4 Sun Mar 20 08:42:19 2016 +++ src/sys/dev/usb/if_zydreg.h Sat Jan 28 12:12:19 2017 @@ -1,5 +1,5 @@ /* $OpenBSD: if_zydreg.h,v 1.19 2006/11/30 19:28:07 damien Exp $ */ -/* $NetBSD: if_zydreg.h,v 1.7.16.4 2016/03/20 08:42:19 skrll Exp $ */ +/* $NetBSD: if_zydreg.h,v 1.7.16.5 2017/01/28 12:12:19 skrll Exp $ */ /*- * Copyright (c) 2006 by Damien Bergamini <damien.bergam...@free.fr> @@ -1198,6 +1198,9 @@ struct zyd_softc { struct ieee80211_amrr amrr; + kmutex_t sc_lock; + kcondvar_t sc_cmdcv; + SIMPLEQ_HEAD(rqh, rq) sc_rqh; uint16_t fwbase;