patch-2.2.18 linux/drivers/net/skfp/lnkstat.c

Next file: linux/drivers/net/skfp/pcmplc.c
Previous file: linux/drivers/net/skfp/hwt.c
Back to the patch index
Back to the overall index

diff -u --new-file --recursive --exclude-from /usr/src/exclude v2.2.17/drivers/net/skfp/lnkstat.c linux/drivers/net/skfp/lnkstat.c
@@ -0,0 +1,209 @@
+/******************************************************************************
+ *
+ *	(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(smc)
+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(smc)
+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(smc)
+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(smc,p,len)
+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) ;
+}

FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)