162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-or-later
262306a36Sopenharmony_ci/******************************************************************************
362306a36Sopenharmony_ci *
462306a36Sopenharmony_ci *	(C)Copyright 1998,1999 SysKonnect,
562306a36Sopenharmony_ci *	a business unit of Schneider & Koch & Co. Datensysteme GmbH.
662306a36Sopenharmony_ci *
762306a36Sopenharmony_ci *	See the file "skfddi.c" for further information.
862306a36Sopenharmony_ci *
962306a36Sopenharmony_ci *	The information in this file is provided "AS IS" without warranty.
1062306a36Sopenharmony_ci *
1162306a36Sopenharmony_ci ******************************************************************************/
1262306a36Sopenharmony_ci
1362306a36Sopenharmony_ci/*
1462306a36Sopenharmony_ci	Init SMT
1562306a36Sopenharmony_ci	call all module level initialization routines
1662306a36Sopenharmony_ci*/
1762306a36Sopenharmony_ci
1862306a36Sopenharmony_ci#include "h/types.h"
1962306a36Sopenharmony_ci#include "h/fddi.h"
2062306a36Sopenharmony_ci#include "h/smc.h"
2162306a36Sopenharmony_ci
2262306a36Sopenharmony_civoid init_fddi_driver(struct s_smc *smc, const u_char *mac_addr);
2362306a36Sopenharmony_ci
2462306a36Sopenharmony_ci/* define global debug variable */
2562306a36Sopenharmony_ci#if defined(DEBUG) && !defined(DEBUG_BRD)
2662306a36Sopenharmony_cistruct smt_debug debug;
2762306a36Sopenharmony_ci#endif
2862306a36Sopenharmony_ci
2962306a36Sopenharmony_ci#ifndef MULT_OEM
3062306a36Sopenharmony_ci#define OEMID(smc,i)	oem_id[i]
3162306a36Sopenharmony_ci	extern u_char	oem_id[] ;
3262306a36Sopenharmony_ci#else	/* MULT_OEM */
3362306a36Sopenharmony_ci#define OEMID(smc,i)	smc->hw.oem_id->oi_mark[i]
3462306a36Sopenharmony_ci	extern struct s_oem_ids	oem_ids[] ;
3562306a36Sopenharmony_ci#endif	/* MULT_OEM */
3662306a36Sopenharmony_ci
3762306a36Sopenharmony_ci/*
3862306a36Sopenharmony_ci * Set OEM specific values
3962306a36Sopenharmony_ci *
4062306a36Sopenharmony_ci * Can not be called in smt_reset_defaults, because it is not sure that
4162306a36Sopenharmony_ci * the OEM ID is already defined.
4262306a36Sopenharmony_ci */
4362306a36Sopenharmony_cistatic void set_oem_spec_val(struct s_smc *smc)
4462306a36Sopenharmony_ci{
4562306a36Sopenharmony_ci	struct fddi_mib *mib ;
4662306a36Sopenharmony_ci
4762306a36Sopenharmony_ci	mib = &smc->mib ;
4862306a36Sopenharmony_ci
4962306a36Sopenharmony_ci	/*
5062306a36Sopenharmony_ci	 * set IBM specific values
5162306a36Sopenharmony_ci	 */
5262306a36Sopenharmony_ci	if (OEMID(smc,0) == 'I') {
5362306a36Sopenharmony_ci		mib->fddiSMTConnectionPolicy = POLICY_MM ;
5462306a36Sopenharmony_ci	}
5562306a36Sopenharmony_ci}
5662306a36Sopenharmony_ci
5762306a36Sopenharmony_ci/*
5862306a36Sopenharmony_ci * Init SMT
5962306a36Sopenharmony_ci */
6062306a36Sopenharmony_ciint init_smt(struct s_smc *smc, const u_char *mac_addr)
6162306a36Sopenharmony_ci/* u_char *mac_addr;	canonical address or NULL */
6262306a36Sopenharmony_ci{
6362306a36Sopenharmony_ci	int	p ;
6462306a36Sopenharmony_ci
6562306a36Sopenharmony_ci#if defined(DEBUG) && !defined(DEBUG_BRD)
6662306a36Sopenharmony_ci	debug.d_smt = 0 ;
6762306a36Sopenharmony_ci	debug.d_smtf = 0 ;
6862306a36Sopenharmony_ci	debug.d_rmt = 0 ;
6962306a36Sopenharmony_ci	debug.d_ecm = 0 ;
7062306a36Sopenharmony_ci	debug.d_pcm = 0 ;
7162306a36Sopenharmony_ci	debug.d_cfm = 0 ;
7262306a36Sopenharmony_ci
7362306a36Sopenharmony_ci	debug.d_plc = 0 ;
7462306a36Sopenharmony_ci#ifdef	ESS
7562306a36Sopenharmony_ci	debug.d_ess = 0 ;
7662306a36Sopenharmony_ci#endif
7762306a36Sopenharmony_ci#ifdef	SBA
7862306a36Sopenharmony_ci	debug.d_sba = 0 ;
7962306a36Sopenharmony_ci#endif
8062306a36Sopenharmony_ci#endif	/* DEBUG && !DEBUG_BRD */
8162306a36Sopenharmony_ci
8262306a36Sopenharmony_ci	/* First initialize the ports mib->pointers */
8362306a36Sopenharmony_ci	for ( p = 0; p < NUMPHYS; p ++ ) {
8462306a36Sopenharmony_ci		smc->y[p].mib = & smc->mib.p[p] ;
8562306a36Sopenharmony_ci	}
8662306a36Sopenharmony_ci
8762306a36Sopenharmony_ci	set_oem_spec_val(smc) ;
8862306a36Sopenharmony_ci	(void) smt_set_mac_opvalues(smc) ;
8962306a36Sopenharmony_ci	init_fddi_driver(smc,mac_addr) ;	/* HW driver */
9062306a36Sopenharmony_ci	smt_fixup_mib(smc) ;		/* update values that depend on s.sas */
9162306a36Sopenharmony_ci
9262306a36Sopenharmony_ci	ev_init(smc) ;			/* event queue */
9362306a36Sopenharmony_ci#ifndef	SLIM_SMT
9462306a36Sopenharmony_ci	smt_init_evc(smc) ;		/* evcs in MIB */
9562306a36Sopenharmony_ci#endif	/* no SLIM_SMT */
9662306a36Sopenharmony_ci	smt_timer_init(smc) ;		/* timer package */
9762306a36Sopenharmony_ci	smt_agent_init(smc) ;		/* SMT frame manager */
9862306a36Sopenharmony_ci
9962306a36Sopenharmony_ci	pcm_init(smc) ;			/* PCM state machine */
10062306a36Sopenharmony_ci	ecm_init(smc) ;			/* ECM state machine */
10162306a36Sopenharmony_ci	cfm_init(smc) ;			/* CFM state machine */
10262306a36Sopenharmony_ci	rmt_init(smc) ;			/* RMT state machine */
10362306a36Sopenharmony_ci
10462306a36Sopenharmony_ci	for (p = 0 ; p < NUMPHYS ; p++) {
10562306a36Sopenharmony_ci		pcm(smc,p,0) ;		/* PCM A state machine */
10662306a36Sopenharmony_ci	}
10762306a36Sopenharmony_ci	ecm(smc,0) ;			/* ECM state machine */
10862306a36Sopenharmony_ci	cfm(smc,0) ;			/* CFM state machine */
10962306a36Sopenharmony_ci	rmt(smc,0) ;			/* RMT state machine */
11062306a36Sopenharmony_ci
11162306a36Sopenharmony_ci	smt_agent_task(smc) ;		/* NIF FSM etc */
11262306a36Sopenharmony_ci
11362306a36Sopenharmony_ci        PNMI_INIT(smc) ;                /* PNMI initialization */
11462306a36Sopenharmony_ci
11562306a36Sopenharmony_ci	return 0;
11662306a36Sopenharmony_ci}
11762306a36Sopenharmony_ci
118