Пример #1
0
/*
	ECM state machine
	called by dispatcher

	do
		display state change
		process event
	until SM is stable
*/
void ecm(struct s_smc *smc, int event)
{
	int	state ;

	do {
		DB_ECM("ECM : state %s%s",
			(smc->mib.fddiSMTECMState & AFLAG) ? "ACTIONS " : "",
			ecm_states[smc->mib.fddiSMTECMState & ~AFLAG]) ;
		DB_ECM(" event %s\n",ecm_events[event],0) ;
		state = smc->mib.fddiSMTECMState ;
		ecm_fsm(smc,event) ;
		event = 0 ;
	} while (state != smc->mib.fddiSMTECMState) ;
	ecm_state_change(smc,(int)smc->mib.fddiSMTECMState) ;
}
Пример #2
0
static void prop_actions(struct s_smc *smc)
{
	int	initiator ;
	int	upstream ;
	int	p ;

	RS_SET(smc,RS_EVENT) ;
	while (smc->e.trace_prop) {
		DB_ECM("ECM : prop_actions - trace_prop %d\n",
			smc->e.trace_prop,0) ;

		if (smc->e.trace_prop & ENTITY_BIT(ENTITY_MAC)) {
			initiator = ENTITY_MAC ;
			smc->e.trace_prop &= ~ENTITY_BIT(ENTITY_MAC) ;
			DB_ECM("ECM: MAC initiates trace\n",0,0) ;
		}
		else {
			for (p = NUMPHYS-1 ; p >= 0 ; p--) {
				if (smc->e.trace_prop &
					ENTITY_BIT(ENTITY_PHY(p)))
					break ;
			}
			initiator = ENTITY_PHY(p) ;
			smc->e.trace_prop &= ~ENTITY_BIT(ENTITY_PHY(p)) ;
		}
		upstream = cem_get_upstream(smc,initiator) ;

		if (upstream == ENTITY_MAC) {
			
			DB_ECM("ECM : TRACE terminated\n",0,0) ;
			smc->e.path_test = PT_PENDING ;
		}
		else {
			
			DB_ECM("ECM : propagate TRACE on PHY %d\n",upstream,0) ;
			queue_event(smc,EVENT_PCM+upstream,PC_TRACE) ;
		}
	}
}
Пример #3
0
static void prop_actions(struct s_smc *smc)
{
	int	port_in = 0 ;
	int	port_out = 0 ;

	RS_SET(smc,RS_EVENT) ;
	switch (smc->s.sas) {
	case SMT_SAS :
		port_in = port_out = pcm_get_s_port(smc) ;
		break ;
	case SMT_DAS :
		port_in = cfm_get_mac_input(smc) ;	
		port_out = cfm_get_mac_output(smc) ;	
		break ;
	case SMT_NAC :
		SMT_PANIC(smc,SMT_E0108, SMT_E0108_MSG) ;
		return ;
	}

	DB_ECM("ECM : prop_actions - trace_prop %d\n", smc->e.trace_prop,0) ;
	DB_ECM("ECM : prop_actions - in %d out %d\n", port_in,port_out) ;

	if (smc->e.trace_prop & ENTITY_BIT(ENTITY_MAC)) {
		
		DB_ECM("ECM : initiate TRACE on PHY %c\n",'A'+port_in-PA,0) ;
		queue_event(smc,EVENT_PCM+port_in,PC_TRACE) ;
	}
	else if ((smc->e.trace_prop & ENTITY_BIT(ENTITY_PHY(PA))) &&
		port_out != PA) {
		
		DB_ECM("ECM : propagate TRACE on PHY B\n",0,0) ;
		queue_event(smc,EVENT_PCMB,PC_TRACE) ;
	}
	else if ((smc->e.trace_prop & ENTITY_BIT(ENTITY_PHY(PB))) &&
		port_out != PB) {
		
		DB_ECM("ECM : propagate TRACE on PHY A\n",0,0) ;
		queue_event(smc,EVENT_PCMA,PC_TRACE) ;
	}
	else {
		
		DB_ECM("ECM : TRACE terminated\n",0,0) ;
		smc->e.path_test = PT_PENDING ;
	}
	smc->e.trace_prop = 0 ;
}