205 lines
4.5 KiB
C
205 lines
4.5 KiB
C
|
/******************************************************************************
|
||
|
*
|
||
|
* (C)Copyright 1998,1999 SysKonnect,
|
||
|
* a business unit of Schneider & Koch & Co. Datensysteme GmbH.
|
||
|
*
|
||
|
* See the file "skfddi.c" for further information.
|
||
|
*
|
||
|
* This program is free software; you can redistribute it and/or modify
|
||
|
* it under the terms of the GNU General Public License as published by
|
||
|
* the Free Software Foundation; either version 2 of the License, or
|
||
|
* (at your option) any later version.
|
||
|
*
|
||
|
* The information in this file is provided "AS IS" without warranty.
|
||
|
*
|
||
|
******************************************************************************/
|
||
|
|
||
|
/*
|
||
|
IBM FDDI read error log function
|
||
|
*/
|
||
|
|
||
|
#include "h/types.h"
|
||
|
#include "h/fddi.h"
|
||
|
#include "h/smc.h"
|
||
|
#include "h/lnkstat.h"
|
||
|
|
||
|
#ifndef lint
|
||
|
static const char ID_sccs[] = "@(#)lnkstat.c 1.8 97/04/11 (C) SK " ;
|
||
|
#endif
|
||
|
|
||
|
#ifdef sun
|
||
|
#define _far
|
||
|
#endif
|
||
|
|
||
|
#define EL_IS_OK(x,l) ((((int)&(((struct s_error_log *)0)->x)) + \
|
||
|
sizeof(er->x)) <= l)
|
||
|
|
||
|
/*
|
||
|
BEGIN_MANUAL_ENTRY(if,func;others;11)
|
||
|
|
||
|
u_long smt_get_error_word(smc)
|
||
|
struct s_smc *smc ;
|
||
|
|
||
|
Function DOWNCALL (SMT, lnkstat.c)
|
||
|
This functions returns the SMT error work for AIX events.
|
||
|
|
||
|
Return smt_error_word These bits are supported:
|
||
|
|
||
|
SMT_ERL_ALC == [PS/PA].fddiPORTLerFlag
|
||
|
SMT_ERL_BLC == [PB].fddiPORTLerFlag
|
||
|
SMT_ERL_NCC == fddiMACNotCopiedFlag
|
||
|
SMT_ERL_FEC == fddiMACFrameErrorFlag
|
||
|
|
||
|
END_MANUAL_ENTRY()
|
||
|
*/
|
||
|
u_long smt_get_error_word(struct s_smc *smc)
|
||
|
{
|
||
|
u_long st;
|
||
|
|
||
|
/*
|
||
|
* smt error word low
|
||
|
*/
|
||
|
st = 0 ;
|
||
|
if (smc->s.sas == SMT_SAS) {
|
||
|
if (smc->mib.p[PS].fddiPORTLerFlag)
|
||
|
st |= SMT_ERL_ALC ;
|
||
|
}
|
||
|
else {
|
||
|
if (smc->mib.p[PA].fddiPORTLerFlag)
|
||
|
st |= SMT_ERL_ALC ;
|
||
|
if (smc->mib.p[PB].fddiPORTLerFlag)
|
||
|
st |= SMT_ERL_BLC ;
|
||
|
}
|
||
|
if (smc->mib.m[MAC0].fddiMACNotCopiedFlag)
|
||
|
st |= SMT_ERL_NCC ; /* not copied condition */
|
||
|
if (smc->mib.m[MAC0].fddiMACFrameErrorFlag)
|
||
|
st |= SMT_ERL_FEC ; /* frame error condition */
|
||
|
|
||
|
return st;
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
BEGIN_MANUAL_ENTRY(if,func;others;11)
|
||
|
|
||
|
u_long smt_get_event_word(smc)
|
||
|
struct s_smc *smc ;
|
||
|
|
||
|
Function DOWNCALL (SMT, lnkstat.c)
|
||
|
This functions returns the SMT event work for AIX events.
|
||
|
|
||
|
Return smt_event_word always 0
|
||
|
|
||
|
END_MANUAL_ENTRY()
|
||
|
*/
|
||
|
u_long smt_get_event_word(struct s_smc *smc)
|
||
|
{
|
||
|
return (u_long) 0;
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
BEGIN_MANUAL_ENTRY(if,func;others;11)
|
||
|
|
||
|
u_long smt_get_port_event_word(smc)
|
||
|
struct s_smc *smc ;
|
||
|
|
||
|
Function DOWNCALL (SMT, lnkstat.c)
|
||
|
This functions returns the SMT port event work for AIX events.
|
||
|
|
||
|
Return smt_port_event_word always 0
|
||
|
|
||
|
END_MANUAL_ENTRY()
|
||
|
*/
|
||
|
u_long smt_get_port_event_word(struct s_smc *smc)
|
||
|
{
|
||
|
return (u_long) 0;
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
BEGIN_MANUAL_ENTRY(if,func;others;11)
|
||
|
|
||
|
u_long smt_read_errorlog(smc,p,len)
|
||
|
struct s_smc *smc ;
|
||
|
char _far *p ;
|
||
|
int len ;
|
||
|
|
||
|
Function DOWNCALL (SMT, lnkstat.c)
|
||
|
This functions returns the SMT error log field for AIX events.
|
||
|
|
||
|
Para p pointer to the error log field
|
||
|
len len of the error log field
|
||
|
|
||
|
Return len used len of the error log field
|
||
|
|
||
|
END_MANUAL_ENTRY()
|
||
|
*/
|
||
|
int smt_read_errorlog(struct s_smc *smc, char _far *p, int len)
|
||
|
{
|
||
|
int i ;
|
||
|
int st ;
|
||
|
struct s_error_log _far *er ;
|
||
|
|
||
|
er = (struct s_error_log _far *) p ;
|
||
|
if (len > sizeof(struct s_error_log))
|
||
|
len = sizeof(struct s_error_log) ;
|
||
|
for (i = 0 ; i < len ; i++)
|
||
|
*p++ = 0 ;
|
||
|
/*
|
||
|
* set count
|
||
|
*/
|
||
|
if (EL_IS_OK(set_count_high,len)) {
|
||
|
er->set_count_low = (u_short)smc->mib.fddiSMTSetCount.count ;
|
||
|
er->set_count_high =
|
||
|
(u_short)(smc->mib.fddiSMTSetCount.count >> 16L) ;
|
||
|
}
|
||
|
/*
|
||
|
* aci
|
||
|
*/
|
||
|
if (EL_IS_OK(aci_id_code,len)) {
|
||
|
er->aci_id_code = 0 ;
|
||
|
}
|
||
|
/*
|
||
|
* purge counter is missed frames; 16 bits only
|
||
|
*/
|
||
|
if (EL_IS_OK(purge_frame_counter,len)) {
|
||
|
if (smc->mib.m[MAC0].fddiMACCopied_Ct > 0xffff)
|
||
|
er->purge_frame_counter = 0xffff ;
|
||
|
else
|
||
|
er->purge_frame_counter =
|
||
|
(u_short)smc->mib.m[MAC0].fddiMACCopied_Ct ;
|
||
|
}
|
||
|
/*
|
||
|
* CMT and RMT state machines
|
||
|
*/
|
||
|
if (EL_IS_OK(ecm_state,len))
|
||
|
er->ecm_state = smc->mib.fddiSMTECMState ;
|
||
|
|
||
|
if (EL_IS_OK(pcm_b_state,len)) {
|
||
|
if (smc->s.sas == SMT_SAS) {
|
||
|
er->pcm_a_state = smc->y[PS].mib->fddiPORTPCMState ;
|
||
|
er->pcm_b_state = 0 ;
|
||
|
}
|
||
|
else {
|
||
|
er->pcm_a_state = smc->y[PA].mib->fddiPORTPCMState ;
|
||
|
er->pcm_b_state = smc->y[PB].mib->fddiPORTPCMState ;
|
||
|
}
|
||
|
}
|
||
|
if (EL_IS_OK(cfm_state,len))
|
||
|
er->cfm_state = smc->mib.fddiSMTCF_State ;
|
||
|
if (EL_IS_OK(rmt_state,len))
|
||
|
er->rmt_state = smc->mib.m[MAC0].fddiMACRMTState ;
|
||
|
|
||
|
/*
|
||
|
* smt error word low (we only need the low order 16 bits.)
|
||
|
*/
|
||
|
|
||
|
st = smt_get_error_word(smc) & 0xffff ;
|
||
|
|
||
|
if (EL_IS_OK(smt_error_low,len))
|
||
|
er->smt_error_low = st ;
|
||
|
|
||
|
if (EL_IS_OK(ucode_version_level,len))
|
||
|
er->ucode_version_level = 0x0101 ;
|
||
|
return(len) ;
|
||
|
}
|
||
|
|