cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

queue.c (3785B)


      1// SPDX-License-Identifier: GPL-2.0-or-later
      2/******************************************************************************
      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 Management
     15*/
     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 management
     25 */
     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 queue
     33 */
     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 dispatcher
     60 *	while event queue is not empty
     61 *		get event from queue
     62 *		send command to state machine
     63 *	end
     64 */
     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	CONCENTRATOR
     88		case 99 :
     89			timer_test_event(smc,(int)ev->event) ;
     90			break ;
     91#endif
     92		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 ring
    114 * MUST be called to initiate connection establishment
    115 *
    116 *	on	0	disconnect
    117 *	on	1	connect
    118 */
    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 value
    128 *	flag		flag name
    129 *	value		flag value
    130 * dump current flag setting
    131 */
    132#ifdef	CONCENTRATOR
    133void do_smt_flag(struct s_smc *smc, char *flag, int value)
    134{
    135#ifdef	DEBUG
    136	struct smt_debug	*deb;
    137
    138	SK_UNUSED(smc) ;
    139
    140#ifdef	DEBUG_BRD
    141	deb = &smc->debug;
    142#else
    143	deb = &debug;
    144#endif
    145	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#endif