diff options
Diffstat (limited to 'drivers/net/fddi/skfp/smtinit.c')
| -rw-r--r-- | drivers/net/fddi/skfp/smtinit.c | 125 | 
1 files changed, 125 insertions, 0 deletions
diff --git a/drivers/net/fddi/skfp/smtinit.c b/drivers/net/fddi/skfp/smtinit.c new file mode 100644 index 00000000000..e3a0c0bc223 --- /dev/null +++ b/drivers/net/fddi/skfp/smtinit.c @@ -0,0 +1,125 @@ +/****************************************************************************** + * + *	(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. + * + ******************************************************************************/ + +/* +	Init SMT +	call all module level initialization routines +*/ + +#include "h/types.h" +#include "h/fddi.h" +#include "h/smc.h" + +#ifndef	lint +static const char ID_sccs[] = "@(#)smtinit.c	1.15 97/05/06 (C) SK " ; +#endif + +void init_fddi_driver(struct s_smc *smc, u_char *mac_addr); + +/* define global debug variable */ +#if defined(DEBUG) && !defined(DEBUG_BRD) +struct smt_debug debug; +#endif + +#ifndef MULT_OEM +#define OEMID(smc,i)	oem_id[i] +	extern u_char	oem_id[] ; +#else	/* MULT_OEM */ +#define OEMID(smc,i)	smc->hw.oem_id->oi_mark[i] +	extern struct s_oem_ids	oem_ids[] ; +#endif	/* MULT_OEM */ + +/* + * Set OEM specific values + * + * Can not be called in smt_reset_defaults, because it is not sure that + * the OEM ID is already defined. + */ +static void set_oem_spec_val(struct s_smc *smc) +{ +	struct fddi_mib *mib ; + +	mib = &smc->mib ; + +	/* +	 * set IBM specific values +	 */ +	if (OEMID(smc,0) == 'I') { +		mib->fddiSMTConnectionPolicy = POLICY_MM ; +	} +} + +/* + * Init SMT + */ +int init_smt(struct s_smc *smc, u_char *mac_addr) +/* u_char *mac_addr;	canonical address or NULL */ +{ +	int	p ; + +#if defined(DEBUG) && !defined(DEBUG_BRD) +	debug.d_smt = 0 ; +	debug.d_smtf = 0 ; +	debug.d_rmt = 0 ; +	debug.d_ecm = 0 ; +	debug.d_pcm = 0 ; +	debug.d_cfm = 0 ; + +	debug.d_plc = 0 ; +#ifdef	ESS +	debug.d_ess = 0 ; +#endif +#ifdef	SBA +	debug.d_sba = 0 ; +#endif +#endif	/* DEBUG && !DEBUG_BRD */ + +	/* First initialize the ports mib->pointers */ +	for ( p = 0; p < NUMPHYS; p ++ ) { +		smc->y[p].mib = & smc->mib.p[p] ; +	} + +	set_oem_spec_val(smc) ;	 +	(void) smt_set_mac_opvalues(smc) ; +	init_fddi_driver(smc,mac_addr) ;	/* HW driver */ +	smt_fixup_mib(smc) ;		/* update values that depend on s.sas */ + +	ev_init(smc) ;			/* event queue */ +#ifndef	SLIM_SMT +	smt_init_evc(smc) ;		/* evcs in MIB */ +#endif	/* no SLIM_SMT */ +	smt_timer_init(smc) ;		/* timer package */ +	smt_agent_init(smc) ;		/* SMT frame manager */ + +	pcm_init(smc) ;			/* PCM state machine */ +	ecm_init(smc) ;			/* ECM state machine */ +	cfm_init(smc) ;			/* CFM state machine */ +	rmt_init(smc) ;			/* RMT state machine */ + +	for (p = 0 ; p < NUMPHYS ; p++) { +		pcm(smc,p,0) ;		/* PCM A state machine */ +	} +	ecm(smc,0) ;			/* ECM state machine */ +	cfm(smc,0) ;			/* CFM state machine */ +	rmt(smc,0) ;			/* RMT state machine */ + +	smt_agent_task(smc) ;		/* NIF FSM etc */ + +        PNMI_INIT(smc) ;                /* PNMI initialization */ + +	return 0; +} +  | 
