2005-04-16 15:20:36 -07:00
/******************************************************************************
*
* ( 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 .
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/*
SMT Event Queue Management
*/
# include "h/types.h"
# include "h/fddi.h"
# include "h/smc.h"
# ifndef lint
static const char ID_sccs [ ] = " @(#)queue.c 2.9 97/08/04 (C) SK " ;
# endif
# define PRINTF(a,b,c)
/*
* init event queue management
*/
void ev_init ( struct s_smc * smc )
{
smc - > q . ev_put = smc - > q . ev_get = smc - > q . ev_queue ;
}
/*
* add event to queue
*/
void queue_event ( struct s_smc * smc , int class , int event )
{
PRINTF ( " queue class %d event %d \n " , class , event ) ;
smc - > q . ev_put - > class = class ;
smc - > q . ev_put - > event = event ;
if ( + + smc - > q . ev_put = = & smc - > q . ev_queue [ MAX_EVENT ] )
smc - > q . ev_put = smc - > q . ev_queue ;
if ( smc - > q . ev_put = = smc - > q . ev_get ) {
SMT_ERR_LOG ( smc , SMT_E0137 , SMT_E0137_MSG ) ;
}
}
/*
* timer_event is called from HW timer package .
*/
void timer_event ( struct s_smc * smc , u_long token )
{
PRINTF ( " timer event class %d token %d \n " ,
EV_T_CLASS ( token ) ,
EV_T_EVENT ( token ) ) ;
queue_event ( smc , EV_T_CLASS ( token ) , EV_T_EVENT ( token ) ) ;
}
/*
* event dispatcher
* while event queue is not empty
* get event from queue
* send command to state machine
* end
*/
void ev_dispatcher ( struct s_smc * smc )
{
struct event_queue * ev ; /* pointer into queue */
int class ;
ev = smc - > q . ev_get ;
PRINTF ( " dispatch get %x put %x \n " , ev , smc - > q . ev_put ) ;
while ( ev ! = smc - > q . ev_put ) {
PRINTF ( " dispatch class %d event %d \n " , ev - > class , ev - > event ) ;
switch ( class = ev - > class ) {
case EVENT_ECM : /* Entity Corordination Man. */
ecm ( smc , ( int ) ev - > event ) ;
break ;
case EVENT_CFM : /* Configuration Man. */
cfm ( smc , ( int ) ev - > event ) ;
break ;
case EVENT_RMT : /* Ring Man. */
rmt ( smc , ( int ) ev - > event ) ;
break ;
case EVENT_SMT :
smt_event ( smc , ( int ) ev - > event ) ;
break ;
# ifdef CONCENTRATOR
case 99 :
timer_test_event ( smc , ( int ) ev - > event ) ;
break ;
# endif
case EVENT_PCMA : /* PHY A */
case EVENT_PCMB : /* PHY B */
default :
if ( class > = EVENT_PCMA & &
class < EVENT_PCMA + NUMPHYS ) {
pcm ( smc , class - EVENT_PCMA , ( int ) ev - > event ) ;
break ;
}
SMT_PANIC ( smc , SMT_E0121 , SMT_E0121_MSG ) ;
return ;
}
if ( + + ev = = & smc - > q . ev_queue [ MAX_EVENT ] )
ev = smc - > q . ev_queue ;
/* Renew get: it is used in queue_events to detect overruns */
smc - > q . ev_get = ev ;
}
}
/*
* smt_online connects to or disconnects from the ring
* MUST be called to initiate connection establishment
*
* on 0 disconnect
* on 1 connect
*/
u_short smt_online ( struct s_smc * smc , int on )
{
queue_event ( smc , EVENT_ECM , on ? EC_CONNECT : EC_DISCONNECT ) ;
ev_dispatcher ( smc ) ;
2010-09-23 05:40:09 +00:00
return smc - > mib . fddiSMTCF_State ;
2005-04-16 15:20:36 -07:00
}
/*
* set SMT flag to value
* flag flag name
* value flag value
* dump current flag setting
*/
# ifdef CONCENTRATOR
void do_smt_flag ( struct s_smc * smc , char * flag , int value )
{
# ifdef DEBUG
struct smt_debug * deb ;
SK_UNUSED ( smc ) ;
# ifdef DEBUG_BRD
deb = & smc - > debug ;
# else
deb = & debug ;
# endif
if ( ! strcmp ( flag , " smt " ) )
deb - > d_smt = value ;
else if ( ! strcmp ( flag , " smtf " ) )
deb - > d_smtf = value ;
else if ( ! strcmp ( flag , " pcm " ) )
deb - > d_pcm = value ;
else if ( ! strcmp ( flag , " rmt " ) )
deb - > d_rmt = value ;
else if ( ! strcmp ( flag , " cfm " ) )
deb - > d_cfm = value ;
else if ( ! strcmp ( flag , " ecm " ) )
deb - > d_ecm = value ;
printf ( " smt %d \n " , deb - > d_smt ) ;
printf ( " smtf %d \n " , deb - > d_smtf ) ;
printf ( " pcm %d \n " , deb - > d_pcm ) ;
printf ( " rmt %d \n " , deb - > d_rmt ) ;
printf ( " cfm %d \n " , deb - > d_cfm ) ;
printf ( " ecm %d \n " , deb - > d_ecm ) ;
# endif /* DEBUG */
}
# endif