queue.c 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  1. // SPDX-License-Identifier: GPL-2.0-or-later
  2. /******************************************************************************
  3. *
  4. * (C)Copyright 1998,1999 SysKonnect,
  5. * a business unit of Schneider & Koch & Co. Datensysteme GmbH.
  6. *
  7. * See the file "skfddi.c" for further information.
  8. *
  9. * The information in this file is provided "AS IS" without warranty.
  10. *
  11. ******************************************************************************/
  12. /*
  13. SMT Event Queue Management
  14. */
  15. #include "h/types.h"
  16. #include "h/fddi.h"
  17. #include "h/smc.h"
  18. #define PRINTF(a,b,c)
  19. /*
  20. * init event queue management
  21. */
  22. void ev_init(struct s_smc *smc)
  23. {
  24. smc->q.ev_put = smc->q.ev_get = smc->q.ev_queue ;
  25. }
  26. /*
  27. * add event to queue
  28. */
  29. void queue_event(struct s_smc *smc, int class, int event)
  30. {
  31. PRINTF("queue class %d event %d\n",class,event) ;
  32. smc->q.ev_put->class = class ;
  33. smc->q.ev_put->event = event ;
  34. if (++smc->q.ev_put == &smc->q.ev_queue[MAX_EVENT])
  35. smc->q.ev_put = smc->q.ev_queue ;
  36. if (smc->q.ev_put == smc->q.ev_get) {
  37. SMT_ERR_LOG(smc,SMT_E0137, SMT_E0137_MSG) ;
  38. }
  39. }
  40. /*
  41. * timer_event is called from HW timer package.
  42. */
  43. void timer_event(struct s_smc *smc, u_long token)
  44. {
  45. PRINTF("timer event class %d token %d\n",
  46. EV_T_CLASS(token),
  47. EV_T_EVENT(token)) ;
  48. queue_event(smc,EV_T_CLASS(token),EV_T_EVENT(token));
  49. }
  50. /*
  51. * event dispatcher
  52. * while event queue is not empty
  53. * get event from queue
  54. * send command to state machine
  55. * end
  56. */
  57. void ev_dispatcher(struct s_smc *smc)
  58. {
  59. struct event_queue *ev ; /* pointer into queue */
  60. int class ;
  61. ev = smc->q.ev_get ;
  62. PRINTF("dispatch get %x put %x\n",ev,smc->q.ev_put) ;
  63. while (ev != smc->q.ev_put) {
  64. PRINTF("dispatch class %d event %d\n",ev->class,ev->event) ;
  65. switch(class = ev->class) {
  66. case EVENT_ECM : /* Entity Corordination Man. */
  67. ecm(smc,(int)ev->event) ;
  68. break ;
  69. case EVENT_CFM : /* Configuration Man. */
  70. cfm(smc,(int)ev->event) ;
  71. break ;
  72. case EVENT_RMT : /* Ring Man. */
  73. rmt(smc,(int)ev->event) ;
  74. break ;
  75. case EVENT_SMT :
  76. smt_event(smc,(int)ev->event) ;
  77. break ;
  78. #ifdef CONCENTRATOR
  79. case 99 :
  80. timer_test_event(smc,(int)ev->event) ;
  81. break ;
  82. #endif
  83. case EVENT_PCMA : /* PHY A */
  84. case EVENT_PCMB : /* PHY B */
  85. default :
  86. if (class >= EVENT_PCMA &&
  87. class < EVENT_PCMA + NUMPHYS) {
  88. pcm(smc,class - EVENT_PCMA,(int)ev->event) ;
  89. break ;
  90. }
  91. SMT_PANIC(smc,SMT_E0121, SMT_E0121_MSG) ;
  92. return ;
  93. }
  94. if (++ev == &smc->q.ev_queue[MAX_EVENT])
  95. ev = smc->q.ev_queue ;
  96. /* Renew get: it is used in queue_events to detect overruns */
  97. smc->q.ev_get = ev;
  98. }
  99. }
  100. /*
  101. * smt_online connects to or disconnects from the ring
  102. * MUST be called to initiate connection establishment
  103. *
  104. * on 0 disconnect
  105. * on 1 connect
  106. */
  107. u_short smt_online(struct s_smc *smc, int on)
  108. {
  109. queue_event(smc,EVENT_ECM,on ? EC_CONNECT : EC_DISCONNECT) ;
  110. ev_dispatcher(smc) ;
  111. return smc->mib.fddiSMTCF_State;
  112. }
  113. /*
  114. * set SMT flag to value
  115. * flag flag name
  116. * value flag value
  117. * dump current flag setting
  118. */
  119. #ifdef CONCENTRATOR
  120. void do_smt_flag(struct s_smc *smc, char *flag, int value)
  121. {
  122. #ifdef DEBUG
  123. struct smt_debug *deb;
  124. SK_UNUSED(smc) ;
  125. #ifdef DEBUG_BRD
  126. deb = &smc->debug;
  127. #else
  128. deb = &debug;
  129. #endif
  130. if (!strcmp(flag,"smt"))
  131. deb->d_smt = value ;
  132. else if (!strcmp(flag,"smtf"))
  133. deb->d_smtf = value ;
  134. else if (!strcmp(flag,"pcm"))
  135. deb->d_pcm = value ;
  136. else if (!strcmp(flag,"rmt"))
  137. deb->d_rmt = value ;
  138. else if (!strcmp(flag,"cfm"))
  139. deb->d_cfm = value ;
  140. else if (!strcmp(flag,"ecm"))
  141. deb->d_ecm = value ;
  142. printf("smt %d\n",deb->d_smt) ;
  143. printf("smtf %d\n",deb->d_smtf) ;
  144. printf("pcm %d\n",deb->d_pcm) ;
  145. printf("rmt %d\n",deb->d_rmt) ;
  146. printf("cfm %d\n",deb->d_cfm) ;
  147. printf("ecm %d\n",deb->d_ecm) ;
  148. #endif /* DEBUG */
  149. }
  150. #endif