Lines Matching full:smc
47 #include "h/smc.h"
60 #define GO_STATE(x) (smc->mib.m[MAC0].fddiMACRMTState = (x)|AFLAG)
61 #define ACTIONS_DONE() (smc->mib.m[MAC0].fddiMACRMTState &= ~AFLAG)
103 static void rmt_fsm(struct s_smc *smc, int cmd);
104 static void start_rmt_timer0(struct s_smc *smc, u_long value, int event);
105 static void start_rmt_timer1(struct s_smc *smc, u_long value, int event);
106 static void start_rmt_timer2(struct s_smc *smc, u_long value, int event);
107 static void stop_rmt_timer0(struct s_smc *smc);
108 static void stop_rmt_timer1(struct s_smc *smc);
109 static void stop_rmt_timer2(struct s_smc *smc);
110 static void rmt_dup_actions(struct s_smc *smc);
111 static void rmt_reinsert_actions(struct s_smc *smc);
112 static void rmt_leave_actions(struct s_smc *smc);
113 static void rmt_new_dup_actions(struct s_smc *smc);
123 void rmt_init(struct s_smc *smc) in rmt_init() argument
125 smc->mib.m[MAC0].fddiMACRMTState = ACTIONS(RM0_ISOLATED) ; in rmt_init()
126 smc->r.dup_addr_test = DA_NONE ; in rmt_init()
127 smc->r.da_flag = 0 ; in rmt_init()
128 smc->mib.m[MAC0].fddiMACMA_UnitdataAvailable = FALSE ; in rmt_init()
129 smc->r.sm_ma_avail = FALSE ; in rmt_init()
130 smc->r.loop_avail = 0 ; in rmt_init()
131 smc->r.bn_flag = 0 ; in rmt_init()
132 smc->r.jm_flag = 0 ; in rmt_init()
133 smc->r.no_flag = TRUE ; in rmt_init()
145 void rmt(struct s_smc *smc, int event) in rmt() argument
151 smc->mib.m[MAC0].fddiMACRMTState & AFLAG ? "ACTIONS " : "", in rmt()
152 rmt_states[smc->mib.m[MAC0].fddiMACRMTState & ~AFLAG], in rmt()
154 state = smc->mib.m[MAC0].fddiMACRMTState ; in rmt()
155 rmt_fsm(smc,event) ; in rmt()
157 } while (state != smc->mib.m[MAC0].fddiMACRMTState) ; in rmt()
158 rmt_state_change(smc,(int)smc->mib.m[MAC0].fddiMACRMTState) ; in rmt()
164 static void rmt_fsm(struct s_smc *smc, int cmd) in rmt_fsm() argument
169 if (!smc->r.rm_join && !smc->r.rm_loop && in rmt_fsm()
170 smc->mib.m[MAC0].fddiMACRMTState != ACTIONS(RM0_ISOLATED) && in rmt_fsm()
171 smc->mib.m[MAC0].fddiMACRMTState != RM0_ISOLATED) { in rmt_fsm()
172 RS_SET(smc,RS_NORINGOP) ; in rmt_fsm()
173 rmt_indication(smc,0) ; in rmt_fsm()
178 switch(smc->mib.m[MAC0].fddiMACRMTState) { in rmt_fsm()
180 stop_rmt_timer0(smc) ; in rmt_fsm()
181 stop_rmt_timer1(smc) ; in rmt_fsm()
182 stop_rmt_timer2(smc) ; in rmt_fsm()
187 sm_ma_control(smc,MA_OFFLINE) ; in rmt_fsm()
188 smc->mib.m[MAC0].fddiMACMA_UnitdataAvailable = FALSE ; in rmt_fsm()
189 smc->r.loop_avail = FALSE ; in rmt_fsm()
190 smc->r.sm_ma_avail = FALSE ; in rmt_fsm()
191 smc->r.no_flag = TRUE ; in rmt_fsm()
197 if (smc->r.rm_join || smc->r.rm_loop) { in rmt_fsm()
204 sm_ma_control(smc,MA_RESET) ; in rmt_fsm()
210 start_rmt_timer0(smc,smc->s.rmt_t_non_op,RM_TIMEOUT_NON_OP) ; in rmt_fsm()
211 stop_rmt_timer1(smc) ; in rmt_fsm()
212 stop_rmt_timer2(smc) ; in rmt_fsm()
213 sm_ma_control(smc,MA_BEACON) ; in rmt_fsm()
215 RS_SET(smc,RS_NORINGOP) ; in rmt_fsm()
216 smc->r.sm_ma_avail = FALSE ; in rmt_fsm()
217 rmt_indication(smc,0) ; in rmt_fsm()
223 RS_SET(smc,RS_RINGOPCHANGE) ; in rmt_fsm()
229 smc->r.bn_flag = FALSE ; in rmt_fsm()
230 smc->r.no_flag = TRUE ; in rmt_fsm()
236 stop_rmt_timer0(smc) ; in rmt_fsm()
237 stop_rmt_timer1(smc) ; in rmt_fsm()
238 stop_rmt_timer2(smc) ; in rmt_fsm()
239 smc->r.no_flag = FALSE ; in rmt_fsm()
240 if (smc->r.rm_loop) in rmt_fsm()
241 smc->r.loop_avail = TRUE ; in rmt_fsm()
242 if (smc->r.rm_join) { in rmt_fsm()
243 smc->r.sm_ma_avail = TRUE ; in rmt_fsm()
244 if (smc->mib.m[MAC0].fddiMACMA_UnitdataEnable) in rmt_fsm()
245 smc->mib.m[MAC0].fddiMACMA_UnitdataAvailable = TRUE ; in rmt_fsm()
247 smc->mib.m[MAC0].fddiMACMA_UnitdataAvailable = FALSE ; in rmt_fsm()
250 RS_CLEAR(smc,RS_NORINGOP) ; in rmt_fsm()
251 RS_SET(smc,RS_RINGOPCHANGE) ; in rmt_fsm()
252 rmt_indication(smc,1) ; in rmt_fsm()
253 smt_stat_counter(smc,0) ; in rmt_fsm()
259 smc->mib.m[MAC0].fddiMACMA_UnitdataAvailable = FALSE ; in rmt_fsm()
260 smc->r.loop_avail = FALSE ; in rmt_fsm()
261 RS_SET(smc,RS_RINGOPCHANGE) ; in rmt_fsm()
267 if (smc->mib.m[MAC0].fddiMACMA_UnitdataEnable) in rmt_fsm()
268 smc->mib.m[MAC0].fddiMACMA_UnitdataAvailable = TRUE ; in rmt_fsm()
270 smc->mib.m[MAC0].fddiMACMA_UnitdataAvailable = FALSE ; in rmt_fsm()
273 else if (smc->r.dup_addr_test == DA_FAILED) { in rmt_fsm()
274 smc->mib.m[MAC0].fddiMACMA_UnitdataAvailable = FALSE ; in rmt_fsm()
275 smc->r.loop_avail = FALSE ; in rmt_fsm()
276 smc->r.da_flag = TRUE ; in rmt_fsm()
282 start_rmt_timer0(smc,smc->s.mac_d_max*2,RM_TIMEOUT_D_MAX) ; in rmt_fsm()
283 start_rmt_timer1(smc,smc->s.rmt_t_stuck,RM_TIMEOUT_T_STUCK) ; in rmt_fsm()
284 start_rmt_timer2(smc,smc->s.rmt_t_poll,RM_TIMEOUT_POLL) ; in rmt_fsm()
285 sm_mac_check_beacon_claim(smc) ; in rmt_fsm()
291 start_rmt_timer2(smc,smc->s.rmt_t_poll,RM_TIMEOUT_POLL); in rmt_fsm()
292 sm_mac_check_beacon_claim(smc) ; in rmt_fsm()
296 smc->r.timer0_exp = TRUE ; in rmt_fsm()
305 start_rmt_timer0(smc, in rmt_fsm()
306 smc->s.mac_d_max*2, in rmt_fsm()
316 && smc->r.bn_flag) { in rmt_fsm()
317 smc->r.bn_flag = FALSE ; in rmt_fsm()
320 else if (cmd == RM_TRT_EXP && !smc->r.bn_flag) { in rmt_fsm()
327 if ((tx = sm_mac_get_tx_state(smc)) == 4 || tx == 5) { in rmt_fsm()
329 smc->r.bn_flag = TRUE ; in rmt_fsm()
336 start_rmt_timer1(smc,smc->s.rmt_t_stuck, in rmt_fsm()
340 * We do NOT need to clear smc->r.bn_flag in case of in rmt_fsm()
346 tx, smc->r.bn_flag); in rmt_fsm()
349 else if (cmd == RM_MY_CLAIM && smc->r.timer0_exp) { in rmt_fsm()
350 rmt_new_dup_actions(smc) ; in rmt_fsm()
355 else if (cmd == RM_MY_BEACON && smc->r.timer0_exp) { in rmt_fsm()
356 rmt_new_dup_actions(smc) ; in rmt_fsm()
362 rmt_new_dup_actions(smc) ; in rmt_fsm()
368 smc->r.rm_join && smc->r.bn_flag) { in rmt_fsm()
374 start_rmt_timer0(smc,smc->s.rmt_t_announce,RM_TIMEOUT_ANNOUNCE); in rmt_fsm()
375 start_rmt_timer1(smc,smc->s.rmt_t_stuck,RM_TIMEOUT_T_STUCK) ; in rmt_fsm()
376 start_rmt_timer2(smc,smc->s.rmt_t_poll,RM_TIMEOUT_POLL) ; in rmt_fsm()
377 sm_mac_check_beacon_claim(smc) ; in rmt_fsm()
383 start_rmt_timer2(smc,smc->s.rmt_t_poll,RM_TIMEOUT_POLL); in rmt_fsm()
384 sm_mac_check_beacon_claim(smc) ; in rmt_fsm()
388 if (!smc->r.da_flag) { in rmt_fsm()
394 smc->r.bn_flag) { in rmt_fsm()
395 smc->r.bn_flag = FALSE ; in rmt_fsm()
398 else if (cmd == RM_TRT_EXP && !smc->r.bn_flag) { in rmt_fsm()
405 if ((tx = sm_mac_get_tx_state(smc)) == 4 || tx == 5) { in rmt_fsm()
407 smc->r.bn_flag = TRUE ; in rmt_fsm()
414 start_rmt_timer1(smc,smc->s.rmt_t_stuck, in rmt_fsm()
418 * We do NOT need to clear smc->r.bn_flag in case of in rmt_fsm()
424 tx, smc->r.bn_flag); in rmt_fsm()
427 else if (cmd == RM_TIMEOUT_ANNOUNCE && !smc->r.bn_flag) { in rmt_fsm()
428 rmt_dup_actions(smc) ; in rmt_fsm()
432 smc->r.no_flag = FALSE ; in rmt_fsm()
438 smc->r.rm_join && smc->r.bn_flag) { in rmt_fsm()
444 stop_rmt_timer0(smc) ; in rmt_fsm()
445 stop_rmt_timer1(smc) ; in rmt_fsm()
446 stop_rmt_timer2(smc) ; in rmt_fsm()
452 if (smc->r.dup_addr_test == DA_PASSED) { in rmt_fsm()
453 smc->r.da_flag = FALSE ; in rmt_fsm()
459 smc->r.jm_flag = FALSE ; in rmt_fsm()
460 smc->r.bn_flag = FALSE ; in rmt_fsm()
466 start_rmt_timer0(smc,smc->s.rmt_t_direct,RM_TIMEOUT_T_DIRECT) ; in rmt_fsm()
467 stop_rmt_timer1(smc) ; in rmt_fsm()
468 start_rmt_timer2(smc,smc->s.rmt_t_poll,RM_TIMEOUT_POLL) ; in rmt_fsm()
469 sm_ma_control(smc,MA_DIRECTED) ; in rmt_fsm()
470 RS_SET(smc,RS_BEACON) ; in rmt_fsm()
477 start_rmt_timer2(smc,smc->s.rmt_t_poll,RM_TIMEOUT_POLL); in rmt_fsm()
478 sm_mac_check_beacon_claim(smc) ; in rmt_fsm()
482 * therefore restart_trt_for_dbcn(smc) will be called in rmt_fsm()
485 restart_trt_for_dbcn(smc) ; in rmt_fsm()
490 !smc->r.da_flag) { in rmt_fsm()
491 smc->r.bn_flag = FALSE ; in rmt_fsm()
497 smc->r.da_flag) { in rmt_fsm()
498 smc->r.bn_flag = FALSE ; in rmt_fsm()
509 stop_rmt_timer0(smc) ; in rmt_fsm()
510 stop_rmt_timer1(smc) ; in rmt_fsm()
511 stop_rmt_timer2(smc) ; in rmt_fsm()
512 smc->e.trace_prop |= ENTITY_BIT(ENTITY_MAC) ; in rmt_fsm()
513 queue_event(smc,EVENT_ECM,EC_TRACE_PROP) ; in rmt_fsm()
520 SMT_PANIC(smc,SMT_E0122, SMT_E0122_MSG) ; in rmt_fsm()
529 static void rmt_dup_actions(struct s_smc *smc) in rmt_dup_actions() argument
531 if (smc->r.jm_flag) { in rmt_dup_actions()
534 if (smc->s.rmt_dup_mac_behavior) { in rmt_dup_actions()
535 SMT_ERR_LOG(smc,SMT_E0138, SMT_E0138_MSG) ; in rmt_dup_actions()
536 rmt_reinsert_actions(smc) ; in rmt_dup_actions()
539 SMT_ERR_LOG(smc,SMT_E0135, SMT_E0135_MSG) ; in rmt_dup_actions()
540 rmt_leave_actions(smc) ; in rmt_dup_actions()
548 static void rmt_reinsert_actions(struct s_smc *smc) in rmt_reinsert_actions() argument
550 queue_event(smc,EVENT_ECM,EC_DISCONNECT) ; in rmt_reinsert_actions()
551 queue_event(smc,EVENT_ECM,EC_CONNECT) ; in rmt_reinsert_actions()
557 static void rmt_new_dup_actions(struct s_smc *smc) in rmt_new_dup_actions() argument
559 smc->r.da_flag = TRUE ; in rmt_new_dup_actions()
560 smc->r.bn_flag = FALSE ; in rmt_new_dup_actions()
561 smc->r.jm_flag = FALSE ; in rmt_new_dup_actions()
568 if (smc->s.rmt_dup_mac_behavior) { in rmt_new_dup_actions()
569 SMT_ERR_LOG(smc,SMT_E0138, SMT_E0138_MSG) ; in rmt_new_dup_actions()
570 rmt_reinsert_actions(smc) ; in rmt_new_dup_actions()
573 SMT_ERR_LOG(smc,SMT_E0135, SMT_E0135_MSG) ; in rmt_new_dup_actions()
574 rmt_leave_actions(smc) ; in rmt_new_dup_actions()
582 static void rmt_leave_actions(struct s_smc *smc) in rmt_leave_actions() argument
584 queue_event(smc,EVENT_ECM,EC_DISCONNECT) ; in rmt_leave_actions()
595 static void start_rmt_timer0(struct s_smc *smc, u_long value, int event) in start_rmt_timer0() argument
597 smc->r.timer0_exp = FALSE ; /* clear timer event flag */ in start_rmt_timer0()
598 smt_timer_start(smc,&smc->r.rmt_timer0,value,EV_TOKEN(EVENT_RMT,event)); in start_rmt_timer0()
605 static void start_rmt_timer1(struct s_smc *smc, u_long value, int event) in start_rmt_timer1() argument
607 smc->r.timer1_exp = FALSE ; /* clear timer event flag */ in start_rmt_timer1()
608 smt_timer_start(smc,&smc->r.rmt_timer1,value,EV_TOKEN(EVENT_RMT,event)); in start_rmt_timer1()
615 static void start_rmt_timer2(struct s_smc *smc, u_long value, int event) in start_rmt_timer2() argument
617 smc->r.timer2_exp = FALSE ; /* clear timer event flag */ in start_rmt_timer2()
618 smt_timer_start(smc,&smc->r.rmt_timer2,value,EV_TOKEN(EVENT_RMT,event)); in start_rmt_timer2()
625 static void stop_rmt_timer0(struct s_smc *smc) in stop_rmt_timer0() argument
627 if (smc->r.rmt_timer0.tm_active) in stop_rmt_timer0()
628 smt_timer_stop(smc,&smc->r.rmt_timer0) ; in stop_rmt_timer0()
635 static void stop_rmt_timer1(struct s_smc *smc) in stop_rmt_timer1() argument
637 if (smc->r.rmt_timer1.tm_active) in stop_rmt_timer1()
638 smt_timer_stop(smc,&smc->r.rmt_timer1) ; in stop_rmt_timer1()
645 static void stop_rmt_timer2(struct s_smc *smc) in stop_rmt_timer2() argument
647 if (smc->r.rmt_timer2.tm_active) in stop_rmt_timer2()
648 smt_timer_stop(smc,&smc->r.rmt_timer2) ; in stop_rmt_timer2()