queue.c
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:4k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

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