brintos

brintos / linux-shallow public Read only

0
0
Text · 3.7 KiB · abe155a Raw
166 lines · c
1// SPDX-License-Identifier: GPL-2.0-or-later2/******************************************************************************3 *4 *	(C)Copyright 1998,1999 SysKonnect,5 *	a business unit of Schneider & Koch & Co. Datensysteme GmbH.6 *7 *	See the file "skfddi.c" for further information.8 *9 *	The information in this file is provided "AS IS" without warranty.10 *11 ******************************************************************************/12 13/*14	SMT Event Queue Management15*/16 17#include "h/types.h"18#include "h/fddi.h"19#include "h/smc.h"20 21#define PRINTF(a,b,c)22 23/*24 * init event queue management25 */26void ev_init(struct s_smc *smc)27{28	smc->q.ev_put = smc->q.ev_get = smc->q.ev_queue ;29}30 31/*32 * add event to queue33 */34void queue_event(struct s_smc *smc, int class, int event)35{36	PRINTF("queue class %d event %d\n",class,event) ;37	smc->q.ev_put->class = class ;38	smc->q.ev_put->event = event ;39	if (++smc->q.ev_put == &smc->q.ev_queue[MAX_EVENT])40		smc->q.ev_put = smc->q.ev_queue ;41 42	if (smc->q.ev_put == smc->q.ev_get) {43		SMT_ERR_LOG(smc,SMT_E0137, SMT_E0137_MSG) ;44	}45}46 47/*48 * timer_event is called from HW timer package.49 */50void timer_event(struct s_smc *smc, u_long token)51{52	PRINTF("timer event class %d token %d\n",53		EV_T_CLASS(token),54		EV_T_EVENT(token)) ;55	queue_event(smc,EV_T_CLASS(token),EV_T_EVENT(token));56}57 58/*59 * event dispatcher60 *	while event queue is not empty61 *		get event from queue62 *		send command to state machine63 *	end64 */65void ev_dispatcher(struct s_smc *smc)66{67	struct event_queue *ev ;	/* pointer into queue */68	int		class ;69 70	ev = smc->q.ev_get ;71	PRINTF("dispatch get %x put %x\n",ev,smc->q.ev_put) ;72	while (ev != smc->q.ev_put) {73		PRINTF("dispatch class %d event %d\n",ev->class,ev->event) ;74		switch(class = ev->class) {75		case EVENT_ECM :		/* Entity Corordination  Man. */76			ecm(smc,(int)ev->event) ;77			break ;78		case EVENT_CFM :		/* Configuration Man. */79			cfm(smc,(int)ev->event) ;80			break ;81		case EVENT_RMT :		/* Ring Man. */82			rmt(smc,(int)ev->event) ;83			break ;84		case EVENT_SMT :85			smt_event(smc,(int)ev->event) ;86			break ;87#ifdef	CONCENTRATOR88		case 99 :89			timer_test_event(smc,(int)ev->event) ;90			break ;91#endif92		case EVENT_PCMA :		/* PHY A */93		case EVENT_PCMB :		/* PHY B */94		default :95			if (class >= EVENT_PCMA &&96			    class < EVENT_PCMA + NUMPHYS) {97				pcm(smc,class - EVENT_PCMA,(int)ev->event) ;98				break ;99			}100			SMT_PANIC(smc,SMT_E0121, SMT_E0121_MSG) ;101			return ;102		}103 104		if (++ev == &smc->q.ev_queue[MAX_EVENT])105			ev = smc->q.ev_queue ;106 107		/* Renew get: it is used in queue_events to detect overruns */108		smc->q.ev_get = ev;109	}110}111 112/*113 * smt_online connects to or disconnects from the ring114 * MUST be called to initiate connection establishment115 *116 *	on	0	disconnect117 *	on	1	connect118 */119u_short smt_online(struct s_smc *smc, int on)120{121	queue_event(smc,EVENT_ECM,on ? EC_CONNECT : EC_DISCONNECT) ;122	ev_dispatcher(smc) ;123	return smc->mib.fddiSMTCF_State;124}125 126/*127 * set SMT flag to value128 *	flag		flag name129 *	value		flag value130 * dump current flag setting131 */132#ifdef	CONCENTRATOR133void do_smt_flag(struct s_smc *smc, char *flag, int value)134{135#ifdef	DEBUG136	struct smt_debug	*deb;137 138	SK_UNUSED(smc) ;139 140#ifdef	DEBUG_BRD141	deb = &smc->debug;142#else143	deb = &debug;144#endif145	if (!strcmp(flag,"smt"))146		deb->d_smt = value ;147	else if (!strcmp(flag,"smtf"))148		deb->d_smtf = value ;149	else if (!strcmp(flag,"pcm"))150		deb->d_pcm = value ;151	else if (!strcmp(flag,"rmt"))152		deb->d_rmt = value ;153	else if (!strcmp(flag,"cfm"))154		deb->d_cfm = value ;155	else if (!strcmp(flag,"ecm"))156		deb->d_ecm = value ;157	printf("smt	%d\n",deb->d_smt) ;158	printf("smtf	%d\n",deb->d_smtf) ;159	printf("pcm	%d\n",deb->d_pcm) ;160	printf("rmt	%d\n",deb->d_rmt) ;161	printf("cfm	%d\n",deb->d_cfm) ;162	printf("ecm	%d\n",deb->d_ecm) ;163#endif	/* DEBUG */164}165#endif166