^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) // SPDX-License-Identifier: GPL-2.0-or-later
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) /******************************************************************************
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) * (C)Copyright 1998,1999 SysKonnect,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) * a business unit of Schneider & Koch & Co. Datensysteme GmbH.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) * See the file "skfddi.c" for further information.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) * The information in this file is provided "AS IS" without warranty.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) ******************************************************************************/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) SMT ECM
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) Entity Coordination Management
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) Hardware independent state machine
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) * Hardware independent state machine implemantation
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) * The following external SMT functions are referenced :
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) * queue_event()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) * smt_timer_start()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) * smt_timer_stop()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) * The following external HW dependent functions are referenced :
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) * sm_pm_bypass_req()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) * sm_pm_get_ls()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) * The following HW dependent events are required :
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) * NONE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) #include "h/types.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) #include "h/fddi.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) #include "h/smc.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) #define KERNEL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) #include "h/smtstate.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) #ifndef lint
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) static const char ID_sccs[] = "@(#)ecm.c 2.7 99/08/05 (C) SK " ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) * FSM Macros
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) #define AFLAG 0x10
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) #define GO_STATE(x) (smc->mib.fddiSMTECMState = (x)|AFLAG)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) #define ACTIONS_DONE() (smc->mib.fddiSMTECMState &= ~AFLAG)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) #define ACTIONS(x) (x|AFLAG)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) #define EC0_OUT 0 /* not inserted */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) #define EC1_IN 1 /* inserted */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) #define EC2_TRACE 2 /* tracing */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) #define EC3_LEAVE 3 /* leaving the ring */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) #define EC4_PATH_TEST 4 /* performing path test */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) #define EC5_INSERT 5 /* bypass being turned on */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) #define EC6_CHECK 6 /* checking bypass */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) #define EC7_DEINSERT 7 /* bypass being turnde off */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) * symbolic state names
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) static const char * const ecm_states[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) "EC0_OUT","EC1_IN","EC2_TRACE","EC3_LEAVE","EC4_PATH_TEST",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) "EC5_INSERT","EC6_CHECK","EC7_DEINSERT"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) } ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) * symbolic event names
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) static const char * const ecm_events[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) "NONE","EC_CONNECT","EC_DISCONNECT","EC_TRACE_PROP","EC_PATH_TEST",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) "EC_TIMEOUT_TD","EC_TIMEOUT_TMAX",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) "EC_TIMEOUT_IMAX","EC_TIMEOUT_INMAX","EC_TEST_DONE"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) } ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) * all Globals are defined in smc.h
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) * struct s_ecm
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) * function declarations
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) static void ecm_fsm(struct s_smc *smc, int cmd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) static void start_ecm_timer(struct s_smc *smc, u_long value, int event);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) static void stop_ecm_timer(struct s_smc *smc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) static void prop_actions(struct s_smc *smc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) init ECM state machine
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) clear all ECM vars and flags
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) void ecm_init(struct s_smc *smc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) smc->e.path_test = PT_PASSED ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) smc->e.trace_prop = 0 ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) smc->e.sb_flag = 0 ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) smc->mib.fddiSMTECMState = ACTIONS(EC0_OUT) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) smc->e.ecm_line_state = FALSE ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) ECM state machine
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) called by dispatcher
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) do
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) display state change
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) process event
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) until SM is stable
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) void ecm(struct s_smc *smc, int event)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) int state ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) do {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) DB_ECM("ECM : state %s%s event %s",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) smc->mib.fddiSMTECMState & AFLAG ? "ACTIONS " : "",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) ecm_states[smc->mib.fddiSMTECMState & ~AFLAG],
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) ecm_events[event]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) state = smc->mib.fddiSMTECMState ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) ecm_fsm(smc,event) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) event = 0 ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) } while (state != smc->mib.fddiSMTECMState) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) ecm_state_change(smc,(int)smc->mib.fddiSMTECMState) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) process ECM event
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) static void ecm_fsm(struct s_smc *smc, int cmd)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) int ls_a ; /* current line state PHY A */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) int ls_b ; /* current line state PHY B */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) int p ; /* ports */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) smc->mib.fddiSMTBypassPresent = sm_pm_bypass_present(smc) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) if (cmd == EC_CONNECT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) smc->mib.fddiSMTRemoteDisconnectFlag = FALSE ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) /* For AIX event notification: */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) /* Is a disconnect command remotely issued ? */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) if (cmd == EC_DISCONNECT &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) smc->mib.fddiSMTRemoteDisconnectFlag == TRUE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) AIX_EVENT (smc, (u_long) CIO_HARD_FAIL, (u_long)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) FDDI_REMOTE_DISCONNECT, smt_get_event_word(smc),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) smt_get_error_word(smc) );
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) /*jd 05-Aug-1999 Bug #10419 "Port Disconnect fails at Dup MAc Cond."*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) if (cmd == EC_CONNECT) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) smc->e.DisconnectFlag = FALSE ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) else if (cmd == EC_DISCONNECT) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) smc->e.DisconnectFlag = TRUE ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) switch(smc->mib.fddiSMTECMState) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) case ACTIONS(EC0_OUT) :
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) * We do not perform a path test
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) smc->e.path_test = PT_PASSED ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) smc->e.ecm_line_state = FALSE ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) stop_ecm_timer(smc) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) ACTIONS_DONE() ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) break ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) case EC0_OUT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) /*EC01*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) if (cmd == EC_CONNECT && !smc->mib.fddiSMTBypassPresent
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) && smc->e.path_test==PT_PASSED) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) GO_STATE(EC1_IN) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) break ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) /*EC05*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) else if (cmd == EC_CONNECT && (smc->e.path_test==PT_PASSED) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) smc->mib.fddiSMTBypassPresent &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) (smc->s.sas == SMT_DAS)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) GO_STATE(EC5_INSERT) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) break ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) case ACTIONS(EC1_IN) :
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) stop_ecm_timer(smc) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) smc->e.trace_prop = 0 ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) sm_ma_control(smc,MA_TREQ) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) for (p = 0 ; p < NUMPHYS ; p++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) if (smc->mib.p[p].fddiPORTHardwarePresent)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) queue_event(smc,EVENT_PCMA+p,PC_START) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) ACTIONS_DONE() ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) break ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) case EC1_IN:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) /*EC12*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) if (cmd == EC_TRACE_PROP) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) prop_actions(smc) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) GO_STATE(EC2_TRACE) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) break ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) /*EC13*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) else if (cmd == EC_DISCONNECT) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) GO_STATE(EC3_LEAVE) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) break ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) case ACTIONS(EC2_TRACE) :
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) start_ecm_timer(smc,MIB2US(smc->mib.fddiSMTTrace_MaxExpiration),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) EC_TIMEOUT_TMAX) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) ACTIONS_DONE() ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) break ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) case EC2_TRACE :
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) /*EC22*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) if (cmd == EC_TRACE_PROP) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) prop_actions(smc) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) GO_STATE(EC2_TRACE) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) break ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) /*EC23a*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) else if (cmd == EC_DISCONNECT) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) smc->e.path_test = PT_EXITING ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) GO_STATE(EC3_LEAVE) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) break ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) /*EC23b*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) else if (smc->e.path_test == PT_PENDING) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230) GO_STATE(EC3_LEAVE) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) break ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) /*EC23c*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) else if (cmd == EC_TIMEOUT_TMAX) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) /* Trace_Max is expired */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236) /* -> send AIX_EVENT */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) AIX_EVENT(smc, (u_long) FDDI_RING_STATUS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) (u_long) FDDI_SMT_ERROR, (u_long)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) FDDI_TRACE_MAX, smt_get_error_word(smc));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) smc->e.path_test = PT_PENDING ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) GO_STATE(EC3_LEAVE) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) break ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) break ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) case ACTIONS(EC3_LEAVE) :
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) start_ecm_timer(smc,smc->s.ecm_td_min,EC_TIMEOUT_TD) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247) for (p = 0 ; p < NUMPHYS ; p++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) queue_event(smc,EVENT_PCMA+p,PC_STOP) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249) ACTIONS_DONE() ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) break ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251) case EC3_LEAVE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252) /*EC30*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) if (cmd == EC_TIMEOUT_TD && !smc->mib.fddiSMTBypassPresent &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) (smc->e.path_test != PT_PENDING)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) GO_STATE(EC0_OUT) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256) break ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) /*EC34*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) else if (cmd == EC_TIMEOUT_TD &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260) (smc->e.path_test == PT_PENDING)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) GO_STATE(EC4_PATH_TEST) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262) break ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264) /*EC31*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) else if (cmd == EC_CONNECT && smc->e.path_test == PT_PASSED) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266) GO_STATE(EC1_IN) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267) break ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269) /*EC33*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270) else if (cmd == EC_DISCONNECT &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271) smc->e.path_test == PT_PENDING) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272) smc->e.path_test = PT_EXITING ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274) * stay in state - state will be left via timeout
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277) /*EC37*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) else if (cmd == EC_TIMEOUT_TD &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279) smc->mib.fddiSMTBypassPresent &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280) smc->e.path_test != PT_PENDING) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281) GO_STATE(EC7_DEINSERT) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282) break ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284) break ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285) case ACTIONS(EC4_PATH_TEST) :
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286) stop_ecm_timer(smc) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287) smc->e.path_test = PT_TESTING ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288) start_ecm_timer(smc,smc->s.ecm_test_done,EC_TEST_DONE) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289) /* now perform path test ... just a simulation */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290) ACTIONS_DONE() ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291) break ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292) case EC4_PATH_TEST :
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293) /* path test done delay */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294) if (cmd == EC_TEST_DONE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295) smc->e.path_test = PT_PASSED ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297) if (smc->e.path_test == PT_FAILED)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298) RS_SET(smc,RS_PATHTEST) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300) /*EC40a*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301) if (smc->e.path_test == PT_FAILED &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302) !smc->mib.fddiSMTBypassPresent) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303) GO_STATE(EC0_OUT) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304) break ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306) /*EC40b*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307) else if (cmd == EC_DISCONNECT &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 308) !smc->mib.fddiSMTBypassPresent) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 309) GO_STATE(EC0_OUT) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 310) break ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 312) /*EC41*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 313) else if (smc->e.path_test == PT_PASSED) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 314) GO_STATE(EC1_IN) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 315) break ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 316) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 317) /*EC47a*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 318) else if (smc->e.path_test == PT_FAILED &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 319) smc->mib.fddiSMTBypassPresent) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 320) GO_STATE(EC7_DEINSERT) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 321) break ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 322) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 323) /*EC47b*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 324) else if (cmd == EC_DISCONNECT &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 325) smc->mib.fddiSMTBypassPresent) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 326) GO_STATE(EC7_DEINSERT) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 327) break ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 328) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 329) break ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 330) case ACTIONS(EC5_INSERT) :
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 331) sm_pm_bypass_req(smc,BP_INSERT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 332) start_ecm_timer(smc,smc->s.ecm_in_max,EC_TIMEOUT_INMAX) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 333) ACTIONS_DONE() ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 334) break ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 335) case EC5_INSERT :
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 336) /*EC56*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 337) if (cmd == EC_TIMEOUT_INMAX) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 338) GO_STATE(EC6_CHECK) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 339) break ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 340) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 341) /*EC57*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 342) else if (cmd == EC_DISCONNECT) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 343) GO_STATE(EC7_DEINSERT) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 344) break ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 345) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 346) break ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 347) case ACTIONS(EC6_CHECK) :
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 348) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 349) * in EC6_CHECK, we *POLL* the line state !
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 350) * check whether both bypass switches have switched.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 351) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 352) start_ecm_timer(smc,smc->s.ecm_check_poll,0) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 353) smc->e.ecm_line_state = TRUE ; /* flag to pcm: report Q/HLS */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 354) ACTIONS_DONE() ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 355) break ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 356) case EC6_CHECK :
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 357) ls_a = sm_pm_get_ls(smc,PA) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 358) ls_b = sm_pm_get_ls(smc,PB) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 359)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 360) /*EC61*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 361) if (((ls_a == PC_QLS) || (ls_a == PC_HLS)) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 362) ((ls_b == PC_QLS) || (ls_b == PC_HLS)) ) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 363) smc->e.sb_flag = FALSE ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 364) smc->e.ecm_line_state = FALSE ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 365) GO_STATE(EC1_IN) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 366) break ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 367) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 368) /*EC66*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 369) else if (!smc->e.sb_flag &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 370) (((ls_a == PC_ILS) && (ls_b == PC_QLS)) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 371) ((ls_a == PC_QLS) && (ls_b == PC_ILS)))){
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 372) smc->e.sb_flag = TRUE ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 373) DB_ECMN(1, "ECM : EC6_CHECK - stuck bypass");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 374) AIX_EVENT(smc, (u_long) FDDI_RING_STATUS, (u_long)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 375) FDDI_SMT_ERROR, (u_long) FDDI_BYPASS_STUCK,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 376) smt_get_error_word(smc));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 377) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 378) /*EC67*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 379) else if (cmd == EC_DISCONNECT) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 380) smc->e.ecm_line_state = FALSE ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 381) GO_STATE(EC7_DEINSERT) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 382) break ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 383) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 384) else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 385) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 386) * restart poll
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 387) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 388) start_ecm_timer(smc,smc->s.ecm_check_poll,0) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 389) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 390) break ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 391) case ACTIONS(EC7_DEINSERT) :
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 392) sm_pm_bypass_req(smc,BP_DEINSERT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 393) start_ecm_timer(smc,smc->s.ecm_i_max,EC_TIMEOUT_IMAX) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 394) ACTIONS_DONE() ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 395) break ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 396) case EC7_DEINSERT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 397) /*EC70*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 398) if (cmd == EC_TIMEOUT_IMAX) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 399) GO_STATE(EC0_OUT) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 400) break ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 401) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 402) /*EC75*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 403) else if (cmd == EC_CONNECT && smc->e.path_test == PT_PASSED) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 404) GO_STATE(EC5_INSERT) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 405) break ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 406) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 407) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 408) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 409) SMT_PANIC(smc,SMT_E0107, SMT_E0107_MSG) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 410) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 411) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 412) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 413)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 414) #ifndef CONCENTRATOR
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 415) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 416) * trace propagation actions for SAS & DAS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 417) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 418) static void prop_actions(struct s_smc *smc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 419) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 420) int port_in = 0 ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 421) int port_out = 0 ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 422)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 423) RS_SET(smc,RS_EVENT) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 424) switch (smc->s.sas) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 425) case SMT_SAS :
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 426) port_in = port_out = pcm_get_s_port(smc) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 427) break ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 428) case SMT_DAS :
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 429) port_in = cfm_get_mac_input(smc) ; /* PA or PB */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 430) port_out = cfm_get_mac_output(smc) ; /* PA or PB */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 431) break ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 432) case SMT_NAC :
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 433) SMT_PANIC(smc,SMT_E0108, SMT_E0108_MSG) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 434) return ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 435) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 436)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 437) DB_ECM("ECM : prop_actions - trace_prop %lu", smc->e.trace_prop);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 438) DB_ECM("ECM : prop_actions - in %d out %d", port_in, port_out);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 439)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 440) if (smc->e.trace_prop & ENTITY_BIT(ENTITY_MAC)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 441) /* trace initiatior */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 442) DB_ECM("ECM : initiate TRACE on PHY %c", 'A' + port_in - PA);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 443) queue_event(smc,EVENT_PCM+port_in,PC_TRACE) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 444) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 445) else if ((smc->e.trace_prop & ENTITY_BIT(ENTITY_PHY(PA))) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 446) port_out != PA) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 447) /* trace propagate upstream */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 448) DB_ECM("ECM : propagate TRACE on PHY B");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 449) queue_event(smc,EVENT_PCMB,PC_TRACE) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 450) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 451) else if ((smc->e.trace_prop & ENTITY_BIT(ENTITY_PHY(PB))) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 452) port_out != PB) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 453) /* trace propagate upstream */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 454) DB_ECM("ECM : propagate TRACE on PHY A");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 455) queue_event(smc,EVENT_PCMA,PC_TRACE) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 456) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 457) else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 458) /* signal trace termination */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 459) DB_ECM("ECM : TRACE terminated");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 460) smc->e.path_test = PT_PENDING ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 461) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 462) smc->e.trace_prop = 0 ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 463) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 464) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 465) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 466) * trace propagation actions for Concentrator
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 467) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 468) static void prop_actions(struct s_smc *smc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 469) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 470) int initiator ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 471) int upstream ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 472) int p ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 473)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 474) RS_SET(smc,RS_EVENT) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 475) while (smc->e.trace_prop) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 476) DB_ECM("ECM : prop_actions - trace_prop %d",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 477) smc->e.trace_prop);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 478)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 479) if (smc->e.trace_prop & ENTITY_BIT(ENTITY_MAC)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 480) initiator = ENTITY_MAC ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 481) smc->e.trace_prop &= ~ENTITY_BIT(ENTITY_MAC) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 482) DB_ECM("ECM: MAC initiates trace");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 483) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 484) else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 485) for (p = NUMPHYS-1 ; p >= 0 ; p--) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 486) if (smc->e.trace_prop &
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 487) ENTITY_BIT(ENTITY_PHY(p)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 488) break ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 489) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 490) initiator = ENTITY_PHY(p) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 491) smc->e.trace_prop &= ~ENTITY_BIT(ENTITY_PHY(p)) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 492) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 493) upstream = cem_get_upstream(smc,initiator) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 494)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 495) if (upstream == ENTITY_MAC) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 496) /* signal trace termination */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 497) DB_ECM("ECM : TRACE terminated");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 498) smc->e.path_test = PT_PENDING ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 499) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 500) else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 501) /* trace propagate upstream */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 502) DB_ECM("ECM : propagate TRACE on PHY %d", upstream);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 503) queue_event(smc,EVENT_PCM+upstream,PC_TRACE) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 504) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 505) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 506) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 507) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 508)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 509)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 510) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 511) * SMT timer interface
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 512) * start ECM timer
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 513) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 514) static void start_ecm_timer(struct s_smc *smc, u_long value, int event)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 515) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 516) smt_timer_start(smc,&smc->e.ecm_timer,value,EV_TOKEN(EVENT_ECM,event));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 517) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 518)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 519) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 520) * SMT timer interface
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 521) * stop ECM timer
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 522) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 523) static void stop_ecm_timer(struct s_smc *smc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 524) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 525) if (smc->e.ecm_timer.tm_active)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 526) smt_timer_stop(smc,&smc->e.ecm_timer) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 527) }