skqueue.c
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:6k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. /******************************************************************************
  2.  *
  3.  * Name: skqueue.c
  4.  * Project: PCI Gigabit Ethernet Adapter
  5.  * Version: $Revision: 1.14 $
  6.  * Date: $Date: 1998/10/15 15:11:35 $
  7.  * Purpose: Management of an event queue.
  8.  *
  9.  ******************************************************************************/
  10. /******************************************************************************
  11.  *
  12.  * (C)Copyright 1989-1998 SysKonnect,
  13.  * a business unit of Schneider & Koch & Co. Datensysteme GmbH.
  14.  * All Rights Reserved
  15.  *
  16.  * THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF SYSKONNECT
  17.  * The copyright notice above does not evidence any
  18.  * actual or intended publication of such source code.
  19.  *
  20.  * This Module contains Proprietary Information of SysKonnect
  21.  * and should be treated as Confidential.
  22.  *
  23.  * The information in this file is provided for the exclusive use of
  24.  * the licensees of SysKonnect.
  25.  * Such users have the right to use, modify, and incorporate this code
  26.  * into products for purposes authorized by the license agreement
  27.  * provided they include this notice and the associated copyright notice
  28.  * with any such product.
  29.  * The information in this file is provided "AS IS" without warranty.
  30.  *
  31.  ******************************************************************************/
  32. /******************************************************************************
  33.  *
  34.  * History:
  35.  *
  36.  * $Log: skqueue.c,v $
  37.  * Revision 1.14  1998/10/15 15:11:35  gklug
  38.  * fix: ID_sccs to SysKonnectFileId
  39.  *
  40.  * Revision 1.13  1998/09/08 08:47:52  gklug
  41.  * add: init level handling
  42.  *
  43.  * Revision 1.12  1998/09/08 07:43:20  gklug
  44.  * fix: Sirq Event function name
  45.  *
  46.  * Revision 1.11  1998/09/08 05:54:34  gklug
  47.  * chg: define SK_CSUM is replaced by SK_USE_CSUM
  48.  *
  49.  * Revision 1.10  1998/09/03 14:14:49  gklug
  50.  * add: CSUM and HWAC Eventclass and function.
  51.  *
  52.  * Revision 1.9  1998/08/19 09:50:50  gklug
  53.  * fix: remove struct keyword from c-code (see CCC) add typedefs
  54.  *
  55.  * Revision 1.8  1998/08/17 13:43:11  gklug
  56.  * chg: Parameter will be union of 64bit para, 2 times SK_U32 or SK_PTR
  57.  *
  58.  * Revision 1.7  1998/08/14 07:09:11  gklug
  59.  * fix: chg pAc -> pAC
  60.  *
  61.  * Revision 1.6  1998/08/11 12:13:14  gklug
  62.  * add: return code feature of Event service routines
  63.  * add: correct Error log calls
  64.  *
  65.  * Revision 1.5  1998/08/07 12:53:45  gklug
  66.  * fix: first compiled version
  67.  *
  68.  * Revision 1.4  1998/08/07 09:20:48  gklug
  69.  * adapt functions to C coding conventions.
  70.  *
  71.  * Revision 1.3  1998/08/05 11:29:32  gklug
  72.  * rmv: Timer event entry. Timer will queue event directly
  73.  *
  74.  * Revision 1.2  1998/07/31 11:22:40  gklug
  75.  * Initial version
  76.  *
  77.  * Revision 1.1  1998/07/30 15:14:01  gklug
  78.  * Initial version. Adapted from SMT
  79.  *
  80.  *
  81.  *
  82.  ******************************************************************************/
  83. /*
  84. Event queue and dispatcher
  85. */
  86. static const char SysKonnectFileId[] =
  87. "$Header: /usr56/projects/ge/schedule/skqueue.c,v 1.14 1998/10/15 15:11:35 gklug Exp $" ;
  88. #include "h/skdrv1st.h" /* Driver Specific Definitions */
  89. #include "h/skqueue.h" /* Queue Definitions */
  90. #include "h/skdrv2nd.h" /* Adapter Control- and Driver specific Def. */
  91. #ifdef __C2MAN__
  92. /*
  93. Event queue management.
  94. General Description:
  95.  */
  96. intro()
  97. {}
  98. #endif
  99. #define PRINTF(a,b,c)
  100. /*
  101.  * init event queue management
  102.  *
  103.  * Must be called during init level 0.
  104.  */
  105. void SkEventInit(
  106. SK_AC *pAC, /* Adapter context */
  107. SK_IOC Ioc, /* IO context */
  108. int Level) /* Init level */
  109. {
  110. switch (Level) {
  111. case SK_INIT_DATA:
  112. pAC->Event.EvPut = pAC->Event.EvGet = pAC->Event.EvQueue ;
  113. break;
  114. default:
  115. break;
  116. }
  117. }
  118. /*
  119.  * add event to queue
  120.  */
  121. void SkEventQueue(
  122. SK_AC *pAC, /* Adapters context */
  123. SK_U32 Class, /* Event Class */
  124. SK_U32 Event, /* Event to be queued */
  125. SK_EVPARA Para) /* Event parameter */
  126. {
  127. pAC->Event.EvPut->Class = Class ;
  128. pAC->Event.EvPut->Event = Event ;
  129. pAC->Event.EvPut->Para = Para ;
  130. if (++pAC->Event.EvPut == &pAC->Event.EvQueue[SK_MAX_EVENT])
  131. pAC->Event.EvPut = pAC->Event.EvQueue ;
  132. if (pAC->Event.EvPut == pAC->Event.EvGet) {
  133. SK_ERR_LOG(pAC, SK_ERRCL_NORES, SKERR_Q_E001, SKERR_Q_E001MSG) ;
  134. }
  135. }
  136. /*
  137.  * event dispatcher
  138.  * while event queue is not empty
  139.  * get event from queue
  140.  * send command to state machine
  141.  * end
  142.  * return error reported by individual Event function
  143.  * 0 if no error occured.
  144.  */
  145. int SkEventDispatcher(
  146. SK_AC *pAC, /* Adapters Context */
  147. SK_IOC Ioc) /* Io context */
  148. {
  149. SK_EVENTELEM *pEv ; /* pointer into queue */
  150. SK_U32 Class ;
  151. int Rtv ;
  152. pEv = pAC->Event.EvGet ;
  153. PRINTF("dispatch get %x put %xn",pEv,pAC->Event.ev_put) ;
  154. while (pEv != pAC->Event.EvPut) {
  155. PRINTF("dispatch Class %d Event %dn",pEv->Class,pEv->Event) ;
  156. switch(Class = pEv->Class) {
  157. case SKGE_DRV : /* Driver Event */
  158. Rtv = SkDrvEvent(pAC,Ioc,pEv->Event,pEv->Para);
  159. break ;
  160. case SKGE_RLMT : /* RLMT Event */
  161. Rtv = SkRlmtEvent(pAC,Ioc,pEv->Event,pEv->Para);
  162. break ;
  163. case SKGE_I2C : /* I2C Event */
  164. Rtv = SkI2cEvent(pAC,Ioc,pEv->Event,pEv->Para);
  165. break ;
  166. case SKGE_PNMI :
  167. Rtv = SkPnmiEvent(pAC,Ioc,pEv->Event,pEv->Para);
  168. break ;
  169. case SKGE_HWAC :
  170. Rtv = SkGeSirqEvent(pAC,Ioc,pEv->Event,pEv->Para);
  171. break ;
  172. #ifdef SK_USE_CSUM
  173. case SKGE_CSUM :
  174. Rtv = SkCsEvent(pAC,Ioc,pEv->Event,pEv->Para);
  175. break ;
  176. #endif /* SK_USE_CSUM */
  177. default :
  178. SK_ERR_LOG(pAC, SK_ERRCL_SW, SKERR_Q_E002,
  179. SKERR_Q_E002MSG) ;
  180. Rtv = 0;
  181. }
  182. if (Rtv != 0) {
  183. return(Rtv) ;
  184. }
  185. if (++pEv == &pAC->Event.EvQueue[SK_MAX_EVENT])
  186. pEv = pAC->Event.EvQueue ;
  187. /* Renew get: it is used in queue_events to detect overruns */
  188. pAC->Event.EvGet = pEv;
  189. }
  190. return(0) ;
  191. }
  192. /* End of file */