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

Linux/Unix编程

开发平台:

Unix_Linux

  1. /******************************************************************************
  2.  *
  3.  * Name: skgehwt.c
  4.  * Project: PCI Gigabit Ethernet Adapter
  5.  * Version: $Revision: 1.12 $
  6.  * Date: $Date: 1998/10/15 15:11:34 $
  7.  * Purpose: Hardware Timer.
  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: skgehwt.c,v $
  37.  * Revision 1.12  1998/10/15 15:11:34  gklug
  38.  * fix: ID_sccs to SysKonnectFileId
  39.  *
  40.  * Revision 1.11  1998/10/08 15:27:51  gklug
  41.  * chg: correction factor is host clock dependent
  42.  *
  43.  * Revision 1.10  1998/09/15 14:18:31  cgoos
  44.  * Changed more BOOLEANs to SK_xxx
  45.  *
  46.  * Revision 1.9  1998/09/15 14:16:06  cgoos
  47.  * Changed line 107: FALSE to SK_FALSE
  48.  *
  49.  * Revision 1.8  1998/08/24 13:04:44  gklug
  50.  * fix: typo
  51.  *
  52.  * Revision 1.7  1998/08/19 09:50:49  gklug
  53.  * fix: remove struct keyword from c-code (see CCC) add typedefs
  54.  *
  55.  * Revision 1.6  1998/08/17 09:59:02  gklug
  56.  * fix: typos
  57.  *
  58.  * Revision 1.5  1998/08/14 07:09:10  gklug
  59.  * fix: chg pAc -> pAC
  60.  *
  61.  * Revision 1.4  1998/08/10 14:14:52  gklug
  62.  * rmv: unneccessary SK_ADDR macro
  63.  *
  64.  * Revision 1.3  1998/08/07 12:53:44  gklug
  65.  * fix: first compiled version
  66.  *
  67.  * Revision 1.2  1998/08/07 09:19:29  gklug
  68.  * adapt functions to the C coding conventions
  69.  * rmv unneccessary functions.
  70.  *
  71.  * Revision 1.1  1998/08/05 11:28:36  gklug
  72.  * first version: adapted from SMT/FDDI
  73.  *
  74.  *
  75.  *
  76.  *
  77.  ******************************************************************************/
  78. /*
  79. Event queue and dispatcher
  80. */
  81. static const char SysKonnectFileId[] =
  82. "$Header: /usr56/projects/ge/schedule/skgehwt.c,v 1.12 1998/10/15 15:11:34 gklug Exp $" ;
  83. #include "h/skdrv1st.h" /* Driver Specific Definitions */
  84. #include "h/skdrv2nd.h" /* Adapter Control- and Driver specific Def. */
  85. #ifdef __C2MAN__
  86. /*
  87. Hardware Timer function queue management.
  88. General Description:
  89.  */
  90. intro()
  91. {}
  92. #endif
  93. /*
  94.  * Prototypes of local functions.
  95.  */
  96. #define SK_HWT_MAX (65000)
  97. /* correction factor */
  98. #define SK_HWT_FAC (1000 * (SK_U32)pAC->GIni.GIHstClkFact / 100)
  99. /*
  100.  * Initialize hardware timer.
  101.  *
  102.  * Must be called during init level 1.
  103.  */
  104. void SkHwtInit(
  105. SK_AC *pAC, /* Adapters context */
  106. SK_IOC Ioc) /* IoContext */
  107. {
  108. pAC->Hwt.TStart = 0 ;
  109. pAC->Hwt.TStop = 0 ;
  110. pAC->Hwt.TActive = SK_FALSE ;
  111. SkHwtStop(pAC,Ioc) ;
  112. }
  113. /*
  114.  *
  115.  * Start hardware timer (clock ticks are 16us).
  116.  *
  117.  */
  118. void SkHwtStart(
  119. SK_AC *pAC, /* Adapters context */
  120. SK_IOC Ioc, /* IoContext */
  121. SK_U32 Time) /* Time in units of 16us to load the timer with. */
  122. {
  123. SK_U32 Cnt ;
  124. if (Time > SK_HWT_MAX)
  125. Time = SK_HWT_MAX ;
  126. pAC->Hwt.TStart = Time ;
  127. pAC->Hwt.TStop = 0L ;
  128. Cnt = Time ;
  129. /*
  130.  * if time < 16 us
  131.  * time = 16 us
  132.  */
  133. if (!Cnt) {
  134. Cnt++ ;
  135. }
  136. SK_OUT32(Ioc, B2_TI_INI, Cnt * SK_HWT_FAC) ;
  137. SK_OUT16(Ioc, B2_TI_CRTL, TIM_START) ; /* Start timer. */
  138. pAC->Hwt.TActive = SK_TRUE ;
  139. }
  140. /*
  141.  * Stop hardware timer.
  142.  * and clear the timer IRQ
  143.  */
  144. void SkHwtStop(
  145. SK_AC *pAC, /* Adapters context */
  146. SK_IOC Ioc) /* IoContext */
  147. {
  148. SK_OUT16(Ioc, B2_TI_CRTL, TIM_STOP) ;
  149. SK_OUT16(Ioc, B2_TI_CRTL, TIM_CLR_IRQ) ;
  150. pAC->Hwt.TActive = SK_FALSE ;
  151. }
  152. /*
  153.  * Stop hardware timer and read time elapsed since last start.
  154.  *
  155.  * returns
  156.  * The elapsed time since last start in units of 16us.
  157.  *
  158.  */
  159. SK_U32 SkHwtRead(
  160. SK_AC *pAC, /* Adapters context */
  161. SK_IOC Ioc) /* IoContext */
  162. {
  163. SK_U32 TRead ;
  164. SK_U32 IStatus ;
  165. if (pAC->Hwt.TActive) {
  166. SkHwtStop(pAC,Ioc) ;
  167. SK_IN32(Ioc, B2_TI_VAL, &TRead);
  168. TRead /= SK_HWT_FAC;
  169. SK_IN32(Ioc, B0_ISRC, &IStatus);
  170. /* Check if timer expired (or wraparound). */
  171. if ((TRead > pAC->Hwt.TStart) || (IStatus & IS_TIMINT)) {
  172. SkHwtStop(pAC,Ioc) ;
  173. pAC->Hwt.TStop = pAC->Hwt.TStart ;
  174. } else {
  175. pAC->Hwt.TStop = pAC->Hwt.TStart - TRead ;
  176. }
  177. }
  178. return (pAC->Hwt.TStop) ;
  179. }
  180. /*
  181.  * interrupt source= timer
  182.  */
  183. void SkHwtIsr(
  184. SK_AC *pAC, /* Adapters context */
  185. SK_IOC Ioc) /* IoContext */
  186. {
  187. SkHwtStop(pAC,Ioc);
  188. pAC->Hwt.TStop = pAC->Hwt.TStart;
  189. SkTimerDone(pAC,Ioc) ;
  190. }
  191. /* End of file */