Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- Index: maple.c
- ===================================================================
- RCS file: /cvsroot/src/sys/arch/dreamcast/dev/maple/maple.c,v
- retrieving revision 1.51
- diff -u -p -d -r1.51 maple.c
- --- maple.c 25 Jul 2014 08:10:32 -0000 1.51
- +++ maple.c 28 Nov 2015 14:26:39 -0000
- @@ -76,6 +76,8 @@ __KERNEL_RCSID(0, "$NetBSD: maple.c,v 1.
- #include <sys/systm.h>
- #include <sys/conf.h>
- #include <sys/bus.h>
- +#include <sys/mutex.h>
- +#include <sys/condvar.h>
- #include <uvm/uvm.h>
- @@ -247,6 +249,11 @@ mapleattach(device_t parent, device_t se
- maple_polling = 1;
- maple_scanbus(sc);
- + mutex_init(&sc->sc_dma_lock, MUTEX_DEFAULT, IPL_MAPLE);
- + cv_init(&sc->sc_dma_cv, device_xname(self));
- + mutex_init(&sc->sc_event_lock, MUTEX_DEFAULT, IPL_SOFTCLOCK);
- + cv_init(&sc->sc_event_cv, device_xname(self));
- +
- callout_init(&sc->maple_callout_ch, 0);
- sc->sc_intrhand = sysasic_intr_establish(SYSASIC_EVENT_MAPLE_DMADONE,
- @@ -835,13 +842,12 @@ maple_command(device_t dev, struct maple
- {
- struct maple_softc *sc = device_private(dev);
- struct maple_func *fn;
- - int s;
- KASSERT(func >= 0 && func < 32);
- KASSERT(command);
- KASSERT((flags & ~MAPLE_FLAG_CMD_PERIODIC_TIMING) == 0);
- - s = splsoftclock();
- + mutex_enter(&sc->sc_event_lock);
- fn = &u->u_func[func];
- #if 1 /*def DIAGNOSTIC*/
- @@ -860,9 +866,9 @@ maple_command(device_t dev, struct maple
- } else {
- fn->f_cmdstat = MAPLE_CMDSTAT_ASYNC;
- TAILQ_INSERT_TAIL(&sc->sc_acmdq, fn, f_cmdq);
- - wakeup(&sc->sc_event); /* wake for async event */
- + cv_broadcast(&sc->sc_event_cv); /* wake for async event */
- }
- - splx(s);
- + mutex_exit(&sc->sc_event_lock);
- }
- static void
- @@ -1422,7 +1428,6 @@ maple_event_thread(void *arg)
- {
- struct maple_softc *sc = arg;
- unsigned cnt = 1; /* timing counter */
- - int s;
- #if defined(MAPLE_DEBUG) && MAPLE_DEBUG > 1
- int noreq = 0;
- #endif
- @@ -1485,19 +1490,19 @@ maple_event_thread(void *arg)
- /*
- * start DMA
- */
- - s = splmaple();
- + mutex_enter(&sc->sc_dma_lock);
- maple_start(sc);
- /*
- * wait until DMA done
- */
- - if (tsleep(&sc->sc_dmadone, PWAIT, "mdma", hz)
- + if (cv_timedwait(&sc->sc_dma_cv, &sc->sc_dma_lock, hz)
- == EWOULDBLOCK) {
- /* was DDB active? */
- printf("%s: timed out\n",
- device_xname(sc->sc_dev));
- }
- - splx(s);
- + mutex_exit(&sc->sc_dma_lock);
- /*
- * call handlers
- @@ -1522,17 +1527,17 @@ maple_event_thread(void *arg)
- /*
- * wait for an event
- */
- - s = splsoftclock();
- + mutex_enter(&sc->sc_event_lock);
- if (TAILQ_EMPTY(&sc->sc_acmdq) && sc->sc_event == 0 &&
- TAILQ_EMPTY(&sc->sc_periodicdeferq)) {
- - if (tsleep(&sc->sc_event, PWAIT, "mslp", hz)
- - == EWOULDBLOCK) {
- + if (cv_timedwait(&sc->sc_event_cv, &sc->sc_event_lock,
- + hz) == EWOULDBLOCK) {
- printf("%s: event timed out\n",
- device_xname(sc->sc_dev));
- }
- }
- - splx(s);
- + mutex_exit(&sc->sc_event_lock);
- }
- @@ -1547,7 +1552,9 @@ maple_intr(void *arg)
- {
- struct maple_softc *sc = arg;
- - wakeup(&sc->sc_dmadone);
- + mutex_enter(&sc->sc_dma_lock);
- + cv_broadcast(&sc->sc_dma_cv);
- + mutex_exit(&sc->sc_dma_lock);
- return 1;
- }
- @@ -1557,8 +1564,10 @@ maple_callout(void *ctx)
- {
- struct maple_softc *sc = ctx;
- + mutex_enter(&sc->sc_event_lock);
- sc->sc_event = 1; /* mark as periodic event */
- - wakeup(&sc->sc_event);
- + cv_broadcast(&sc->sc_event_cv);
- + mutex_exit(&sc->sc_event_lock);
- }
- /*
- Index: maplevar.h
- ===================================================================
- RCS file: /cvsroot/src/sys/arch/dreamcast/dev/maple/maplevar.h,v
- retrieving revision 1.14
- diff -u -p -d -r1.14 maplevar.h
- --- maplevar.h 27 Oct 2012 17:17:45 -0000 1.14
- +++ maplevar.h 28 Nov 2015 14:26:39 -0000
- @@ -184,9 +184,13 @@ struct maple_softc {
- uint32_t sc_txbuf_phys; /* 29-bit physical address */
- void *sc_intrhand;
- - int sc_dmadone; /* wchan */
- - int sc_event; /* periodic event is active / wchan */
- + kmutex_t sc_dma_lock;
- + kcondvar_t sc_dma_cv;
- +
- + int sc_event; /* periodic event is active */
- + kmutex_t sc_event_lock;
- + kcondvar_t sc_event_cv;
- SIMPLEQ_HEAD(maple_dmaq_head, maple_unit) sc_dmaq, sc_retryq;
- TAILQ_HEAD(maple_unitq_head, maple_unit) sc_probeq, sc_pingq;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement