Advertisement
Guest User

Untitled

a guest
Nov 28th, 2015
68
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.11 KB | None | 0 0
  1. Index: maple.c
  2. ===================================================================
  3. RCS file: /cvsroot/src/sys/arch/dreamcast/dev/maple/maple.c,v
  4. retrieving revision 1.51
  5. diff -u -p -d -r1.51 maple.c
  6. --- maple.c 25 Jul 2014 08:10:32 -0000 1.51
  7. +++ maple.c 28 Nov 2015 14:26:39 -0000
  8. @@ -76,6 +76,8 @@ __KERNEL_RCSID(0, "$NetBSD: maple.c,v 1.
  9. #include <sys/systm.h>
  10. #include <sys/conf.h>
  11. #include <sys/bus.h>
  12. +#include <sys/mutex.h>
  13. +#include <sys/condvar.h>
  14.  
  15. #include <uvm/uvm.h>
  16.  
  17. @@ -247,6 +249,11 @@ mapleattach(device_t parent, device_t se
  18. maple_polling = 1;
  19. maple_scanbus(sc);
  20.  
  21. + mutex_init(&sc->sc_dma_lock, MUTEX_DEFAULT, IPL_MAPLE);
  22. + cv_init(&sc->sc_dma_cv, device_xname(self));
  23. + mutex_init(&sc->sc_event_lock, MUTEX_DEFAULT, IPL_SOFTCLOCK);
  24. + cv_init(&sc->sc_event_cv, device_xname(self));
  25. +
  26. callout_init(&sc->maple_callout_ch, 0);
  27.  
  28. sc->sc_intrhand = sysasic_intr_establish(SYSASIC_EVENT_MAPLE_DMADONE,
  29. @@ -835,13 +842,12 @@ maple_command(device_t dev, struct maple
  30. {
  31. struct maple_softc *sc = device_private(dev);
  32. struct maple_func *fn;
  33. - int s;
  34.  
  35. KASSERT(func >= 0 && func < 32);
  36. KASSERT(command);
  37. KASSERT((flags & ~MAPLE_FLAG_CMD_PERIODIC_TIMING) == 0);
  38.  
  39. - s = splsoftclock();
  40. + mutex_enter(&sc->sc_event_lock);
  41.  
  42. fn = &u->u_func[func];
  43. #if 1 /*def DIAGNOSTIC*/
  44. @@ -860,9 +866,9 @@ maple_command(device_t dev, struct maple
  45. } else {
  46. fn->f_cmdstat = MAPLE_CMDSTAT_ASYNC;
  47. TAILQ_INSERT_TAIL(&sc->sc_acmdq, fn, f_cmdq);
  48. - wakeup(&sc->sc_event); /* wake for async event */
  49. + cv_broadcast(&sc->sc_event_cv); /* wake for async event */
  50. }
  51. - splx(s);
  52. + mutex_exit(&sc->sc_event_lock);
  53. }
  54.  
  55. static void
  56. @@ -1422,7 +1428,6 @@ maple_event_thread(void *arg)
  57. {
  58. struct maple_softc *sc = arg;
  59. unsigned cnt = 1; /* timing counter */
  60. - int s;
  61. #if defined(MAPLE_DEBUG) && MAPLE_DEBUG > 1
  62. int noreq = 0;
  63. #endif
  64. @@ -1485,19 +1490,19 @@ maple_event_thread(void *arg)
  65. /*
  66. * start DMA
  67. */
  68. - s = splmaple();
  69. + mutex_enter(&sc->sc_dma_lock);
  70. maple_start(sc);
  71.  
  72. /*
  73. * wait until DMA done
  74. */
  75. - if (tsleep(&sc->sc_dmadone, PWAIT, "mdma", hz)
  76. + if (cv_timedwait(&sc->sc_dma_cv, &sc->sc_dma_lock, hz)
  77. == EWOULDBLOCK) {
  78. /* was DDB active? */
  79. printf("%s: timed out\n",
  80. device_xname(sc->sc_dev));
  81. }
  82. - splx(s);
  83. + mutex_exit(&sc->sc_dma_lock);
  84.  
  85. /*
  86. * call handlers
  87. @@ -1522,17 +1527,17 @@ maple_event_thread(void *arg)
  88. /*
  89. * wait for an event
  90. */
  91. - s = splsoftclock();
  92. + mutex_enter(&sc->sc_event_lock);
  93. if (TAILQ_EMPTY(&sc->sc_acmdq) && sc->sc_event == 0 &&
  94. TAILQ_EMPTY(&sc->sc_periodicdeferq)) {
  95. - if (tsleep(&sc->sc_event, PWAIT, "mslp", hz)
  96. - == EWOULDBLOCK) {
  97. + if (cv_timedwait(&sc->sc_event_cv, &sc->sc_event_lock,
  98. + hz) == EWOULDBLOCK) {
  99. printf("%s: event timed out\n",
  100. device_xname(sc->sc_dev));
  101. }
  102.  
  103. }
  104. - splx(s);
  105. + mutex_exit(&sc->sc_event_lock);
  106.  
  107. }
  108.  
  109. @@ -1547,7 +1552,9 @@ maple_intr(void *arg)
  110. {
  111. struct maple_softc *sc = arg;
  112.  
  113. - wakeup(&sc->sc_dmadone);
  114. + mutex_enter(&sc->sc_dma_lock);
  115. + cv_broadcast(&sc->sc_dma_cv);
  116. + mutex_exit(&sc->sc_dma_lock);
  117.  
  118. return 1;
  119. }
  120. @@ -1557,8 +1564,10 @@ maple_callout(void *ctx)
  121. {
  122. struct maple_softc *sc = ctx;
  123.  
  124. + mutex_enter(&sc->sc_event_lock);
  125. sc->sc_event = 1; /* mark as periodic event */
  126. - wakeup(&sc->sc_event);
  127. + cv_broadcast(&sc->sc_event_cv);
  128. + mutex_exit(&sc->sc_event_lock);
  129. }
  130.  
  131. /*
  132. Index: maplevar.h
  133. ===================================================================
  134. RCS file: /cvsroot/src/sys/arch/dreamcast/dev/maple/maplevar.h,v
  135. retrieving revision 1.14
  136. diff -u -p -d -r1.14 maplevar.h
  137. --- maplevar.h 27 Oct 2012 17:17:45 -0000 1.14
  138. +++ maplevar.h 28 Nov 2015 14:26:39 -0000
  139. @@ -184,9 +184,13 @@ struct maple_softc {
  140. uint32_t sc_txbuf_phys; /* 29-bit physical address */
  141.  
  142. void *sc_intrhand;
  143. - int sc_dmadone; /* wchan */
  144.  
  145. - int sc_event; /* periodic event is active / wchan */
  146. + kmutex_t sc_dma_lock;
  147. + kcondvar_t sc_dma_cv;
  148. +
  149. + int sc_event; /* periodic event is active */
  150. + kmutex_t sc_event_lock;
  151. + kcondvar_t sc_event_cv;
  152.  
  153. SIMPLEQ_HEAD(maple_dmaq_head, maple_unit) sc_dmaq, sc_retryq;
  154. TAILQ_HEAD(maple_unitq_head, maple_unit) sc_probeq, sc_pingq;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement