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

嵌入式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. IBM FDDI read error log function
  18. */
  19. #include "h/types.h"
  20. #include "h/fddi.h"
  21. #include "h/smc.h"
  22. #include "h/lnkstat.h"
  23. #ifndef lint
  24. static const char ID_sccs[] = "@(#)lnkstat.c 1.8 97/04/11 (C) SK " ;
  25. #endif
  26. #ifdef sun
  27. #define _far
  28. #endif
  29. #define EL_IS_OK(x,l) ((((int)&(((struct s_error_log *)0)->x)) + 
  30. sizeof(er->x)) <= l)
  31. /*
  32. BEGIN_MANUAL_ENTRY(if,func;others;11)
  33. u_long smt_get_error_word(smc)
  34. struct s_smc *smc ;
  35. Function DOWNCALL (SMT, lnkstat.c)
  36. This functions returns the SMT error work for AIX events.
  37. Return smt_error_word These bits are supported:
  38. SMT_ERL_ALC ==  [PS/PA].fddiPORTLerFlag
  39. SMT_ERL_BLC == [PB].fddiPORTLerFlag
  40. SMT_ERL_NCC == fddiMACNotCopiedFlag
  41. SMT_ERL_FEC == fddiMACFrameErrorFlag
  42. END_MANUAL_ENTRY()
  43.  */
  44. u_long smt_get_error_word(smc)
  45. struct s_smc *smc ;
  46. {
  47. u_long st;
  48. /*
  49.  * smt error word low
  50.  */
  51. st = 0 ;
  52. if (smc->s.sas == SMT_SAS) {
  53. if (smc->mib.p[PS].fddiPORTLerFlag)
  54. st |= SMT_ERL_ALC ;
  55. }
  56. else {
  57. if (smc->mib.p[PA].fddiPORTLerFlag)
  58. st |= SMT_ERL_ALC ;
  59. if (smc->mib.p[PB].fddiPORTLerFlag)
  60. st |= SMT_ERL_BLC ;
  61. }
  62. if (smc->mib.m[MAC0].fddiMACNotCopiedFlag)
  63. st |= SMT_ERL_NCC ; /* not copied condition */
  64. if (smc->mib.m[MAC0].fddiMACFrameErrorFlag)
  65. st |= SMT_ERL_FEC ; /* frame error condition */
  66. return st;
  67. }
  68. /*
  69. BEGIN_MANUAL_ENTRY(if,func;others;11)
  70. u_long smt_get_event_word(smc)
  71. struct s_smc *smc ;
  72. Function DOWNCALL (SMT, lnkstat.c)
  73. This functions returns the SMT event work for AIX events.
  74. Return smt_event_word always 0
  75. END_MANUAL_ENTRY()
  76.  */
  77. u_long smt_get_event_word(smc)
  78. struct s_smc *smc ;
  79. {
  80. return (u_long) 0;
  81. }
  82. /*
  83. BEGIN_MANUAL_ENTRY(if,func;others;11)
  84. u_long smt_get_port_event_word(smc)
  85. struct s_smc *smc ;
  86. Function DOWNCALL (SMT, lnkstat.c)
  87. This functions returns the SMT port event work for AIX events.
  88. Return smt_port_event_word always 0
  89. END_MANUAL_ENTRY()
  90.  */
  91. u_long smt_get_port_event_word(smc)
  92. struct s_smc *smc ;
  93. {
  94. return (u_long) 0;
  95. }
  96. /*
  97. BEGIN_MANUAL_ENTRY(if,func;others;11)
  98. u_long smt_read_errorlog(smc,p,len)
  99. struct s_smc *smc ;
  100. char _far *p ;
  101. int len ;
  102. Function DOWNCALL (SMT, lnkstat.c)
  103. This functions returns the SMT error log field for AIX events.
  104. Para p pointer to the error log field
  105. len len of the error log field
  106. Return len used len of the error log field
  107. END_MANUAL_ENTRY()
  108.  */
  109. int smt_read_errorlog(smc,p,len)
  110. struct s_smc *smc ;
  111. char _far *p ;
  112. int len ;
  113. {
  114. int i ;
  115. int st ;
  116. struct s_error_log _far *er ;
  117. er = (struct s_error_log _far *) p ;
  118. if (len > sizeof(struct s_error_log))
  119. len = sizeof(struct s_error_log) ;
  120. for (i = 0 ; i < len ; i++)
  121. *p++ = 0 ;
  122. /*
  123.  * set count
  124.  */
  125. if (EL_IS_OK(set_count_high,len)) {
  126. er->set_count_low = (u_short)smc->mib.fddiSMTSetCount.count ;
  127. er->set_count_high =
  128. (u_short)(smc->mib.fddiSMTSetCount.count >> 16L) ;
  129. }
  130. /*
  131.  * aci
  132.  */
  133. if (EL_IS_OK(aci_id_code,len)) {
  134. er->aci_id_code = 0 ;
  135. }
  136. /*
  137.  * purge counter is missed frames; 16 bits only
  138.  */
  139. if (EL_IS_OK(purge_frame_counter,len)) {
  140. if (smc->mib.m[MAC0].fddiMACCopied_Ct > 0xffff)
  141. er->purge_frame_counter = 0xffff ;
  142. else
  143. er->purge_frame_counter =
  144. (u_short)smc->mib.m[MAC0].fddiMACCopied_Ct ;
  145. }
  146. /*
  147.  * CMT and RMT state machines
  148.  */
  149. if (EL_IS_OK(ecm_state,len))
  150. er->ecm_state = smc->mib.fddiSMTECMState ;
  151. if (EL_IS_OK(pcm_b_state,len)) {
  152. if (smc->s.sas == SMT_SAS) {
  153. er->pcm_a_state = smc->y[PS].mib->fddiPORTPCMState ;
  154. er->pcm_b_state = 0 ;
  155. }
  156. else {
  157. er->pcm_a_state = smc->y[PA].mib->fddiPORTPCMState ;
  158. er->pcm_b_state = smc->y[PB].mib->fddiPORTPCMState ;
  159. }
  160. }
  161. if (EL_IS_OK(cfm_state,len))
  162. er->cfm_state = smc->mib.fddiSMTCF_State ;
  163. if (EL_IS_OK(rmt_state,len))
  164. er->rmt_state = smc->mib.m[MAC0].fddiMACRMTState ;
  165. /*
  166.  * smt error word low (we only need the low order 16 bits.)
  167.  */
  168. st = smt_get_error_word(smc) & 0xffff ;
  169. if (EL_IS_OK(smt_error_low,len))
  170. er->smt_error_low = st ;
  171. if (EL_IS_OK(ucode_version_level,len))
  172. er->ucode_version_level = 0x0101 ;
  173. return(len) ;
  174. }