Lines Matching full:smc
43 #include "h/smc.h"
56 #define GO_STATE(x) (smc->mib.m[MAC0].fddiMACRMTState = (x)|AFLAG)
57 #define ACTIONS_DONE() (smc->mib.m[MAC0].fddiMACRMTState &= ~AFLAG)
99 static void rmt_fsm(struct s_smc *smc, int cmd);
100 static void start_rmt_timer0(struct s_smc *smc, u_long value, int event);
101 static void start_rmt_timer1(struct s_smc *smc, u_long value, int event);
102 static void start_rmt_timer2(struct s_smc *smc, u_long value, int event);
103 static void stop_rmt_timer0(struct s_smc *smc);
104 static void stop_rmt_timer1(struct s_smc *smc);
105 static void stop_rmt_timer2(struct s_smc *smc);
106 static void rmt_dup_actions(struct s_smc *smc);
107 static void rmt_reinsert_actions(struct s_smc *smc);
108 static void rmt_leave_actions(struct s_smc *smc);
109 static void rmt_new_dup_actions(struct s_smc *smc);
119 void rmt_init(struct s_smc *smc) in rmt_init() argument
121 smc->mib.m[MAC0].fddiMACRMTState = ACTIONS(RM0_ISOLATED) ; in rmt_init()
122 smc->r.dup_addr_test = DA_NONE ; in rmt_init()
123 smc->r.da_flag = 0 ; in rmt_init()
124 smc->mib.m[MAC0].fddiMACMA_UnitdataAvailable = FALSE ; in rmt_init()
125 smc->r.sm_ma_avail = FALSE ; in rmt_init()
126 smc->r.loop_avail = 0 ; in rmt_init()
127 smc->r.bn_flag = 0 ; in rmt_init()
128 smc->r.jm_flag = 0 ; in rmt_init()
129 smc->r.no_flag = TRUE ; in rmt_init()
141 void rmt(struct s_smc *smc, int event) in rmt() argument
147 smc->mib.m[MAC0].fddiMACRMTState & AFLAG ? "ACTIONS " : "", in rmt()
148 rmt_states[smc->mib.m[MAC0].fddiMACRMTState & ~AFLAG], in rmt()
150 state = smc->mib.m[MAC0].fddiMACRMTState ; in rmt()
151 rmt_fsm(smc,event) ; in rmt()
153 } while (state != smc->mib.m[MAC0].fddiMACRMTState) ; in rmt()
154 rmt_state_change(smc,(int)smc->mib.m[MAC0].fddiMACRMTState) ; in rmt()
160 static void rmt_fsm(struct s_smc *smc, int cmd) in rmt_fsm() argument
165 if (!smc->r.rm_join && !smc->r.rm_loop && in rmt_fsm()
166 smc->mib.m[MAC0].fddiMACRMTState != ACTIONS(RM0_ISOLATED) && in rmt_fsm()
167 smc->mib.m[MAC0].fddiMACRMTState != RM0_ISOLATED) { in rmt_fsm()
168 RS_SET(smc,RS_NORINGOP) ; in rmt_fsm()
169 rmt_indication(smc,0) ; in rmt_fsm()
174 switch(smc->mib.m[MAC0].fddiMACRMTState) { in rmt_fsm()
176 stop_rmt_timer0(smc) ; in rmt_fsm()
177 stop_rmt_timer1(smc) ; in rmt_fsm()
178 stop_rmt_timer2(smc) ; in rmt_fsm()
183 sm_ma_control(smc,MA_OFFLINE) ; in rmt_fsm()
184 smc->mib.m[MAC0].fddiMACMA_UnitdataAvailable = FALSE ; in rmt_fsm()
185 smc->r.loop_avail = FALSE ; in rmt_fsm()
186 smc->r.sm_ma_avail = FALSE ; in rmt_fsm()
187 smc->r.no_flag = TRUE ; in rmt_fsm()
193 if (smc->r.rm_join || smc->r.rm_loop) { in rmt_fsm()
200 sm_ma_control(smc,MA_RESET) ; in rmt_fsm()
206 start_rmt_timer0(smc,smc->s.rmt_t_non_op,RM_TIMEOUT_NON_OP) ; in rmt_fsm()
207 stop_rmt_timer1(smc) ; in rmt_fsm()
208 stop_rmt_timer2(smc) ; in rmt_fsm()
209 sm_ma_control(smc,MA_BEACON) ; in rmt_fsm()
211 RS_SET(smc,RS_NORINGOP) ; in rmt_fsm()
212 smc->r.sm_ma_avail = FALSE ; in rmt_fsm()
213 rmt_indication(smc,0) ; in rmt_fsm()
219 RS_SET(smc,RS_RINGOPCHANGE) ; in rmt_fsm()
225 smc->r.bn_flag = FALSE ; in rmt_fsm()
226 smc->r.no_flag = TRUE ; in rmt_fsm()
232 stop_rmt_timer0(smc) ; in rmt_fsm()
233 stop_rmt_timer1(smc) ; in rmt_fsm()
234 stop_rmt_timer2(smc) ; in rmt_fsm()
235 smc->r.no_flag = FALSE ; in rmt_fsm()
236 if (smc->r.rm_loop) in rmt_fsm()
237 smc->r.loop_avail = TRUE ; in rmt_fsm()
238 if (smc->r.rm_join) { in rmt_fsm()
239 smc->r.sm_ma_avail = TRUE ; in rmt_fsm()
240 if (smc->mib.m[MAC0].fddiMACMA_UnitdataEnable) in rmt_fsm()
241 smc->mib.m[MAC0].fddiMACMA_UnitdataAvailable = TRUE ; in rmt_fsm()
243 smc->mib.m[MAC0].fddiMACMA_UnitdataAvailable = FALSE ; in rmt_fsm()
246 RS_CLEAR(smc,RS_NORINGOP) ; in rmt_fsm()
247 RS_SET(smc,RS_RINGOPCHANGE) ; in rmt_fsm()
248 rmt_indication(smc,1) ; in rmt_fsm()
249 smt_stat_counter(smc,0) ; in rmt_fsm()
255 smc->mib.m[MAC0].fddiMACMA_UnitdataAvailable = FALSE ; in rmt_fsm()
256 smc->r.loop_avail = FALSE ; in rmt_fsm()
257 RS_SET(smc,RS_RINGOPCHANGE) ; in rmt_fsm()
263 if (smc->mib.m[MAC0].fddiMACMA_UnitdataEnable) in rmt_fsm()
264 smc->mib.m[MAC0].fddiMACMA_UnitdataAvailable = TRUE ; in rmt_fsm()
266 smc->mib.m[MAC0].fddiMACMA_UnitdataAvailable = FALSE ; in rmt_fsm()
269 else if (smc->r.dup_addr_test == DA_FAILED) { in rmt_fsm()
270 smc->mib.m[MAC0].fddiMACMA_UnitdataAvailable = FALSE ; in rmt_fsm()
271 smc->r.loop_avail = FALSE ; in rmt_fsm()
272 smc->r.da_flag = TRUE ; in rmt_fsm()
278 start_rmt_timer0(smc,smc->s.mac_d_max*2,RM_TIMEOUT_D_MAX) ; in rmt_fsm()
279 start_rmt_timer1(smc,smc->s.rmt_t_stuck,RM_TIMEOUT_T_STUCK) ; in rmt_fsm()
280 start_rmt_timer2(smc,smc->s.rmt_t_poll,RM_TIMEOUT_POLL) ; in rmt_fsm()
281 sm_mac_check_beacon_claim(smc) ; in rmt_fsm()
287 start_rmt_timer2(smc,smc->s.rmt_t_poll,RM_TIMEOUT_POLL); in rmt_fsm()
288 sm_mac_check_beacon_claim(smc) ; in rmt_fsm()
292 smc->r.timer0_exp = TRUE ; in rmt_fsm()
301 start_rmt_timer0(smc, in rmt_fsm()
302 smc->s.mac_d_max*2, in rmt_fsm()
312 && smc->r.bn_flag) { in rmt_fsm()
313 smc->r.bn_flag = FALSE ; in rmt_fsm()
316 else if (cmd == RM_TRT_EXP && !smc->r.bn_flag) { in rmt_fsm()
323 if ((tx = sm_mac_get_tx_state(smc)) == 4 || tx == 5) { in rmt_fsm()
325 smc->r.bn_flag = TRUE ; in rmt_fsm()
332 start_rmt_timer1(smc,smc->s.rmt_t_stuck, in rmt_fsm()
336 * We do NOT need to clear smc->r.bn_flag in case of in rmt_fsm()
342 tx, smc->r.bn_flag); in rmt_fsm()
345 else if (cmd == RM_MY_CLAIM && smc->r.timer0_exp) { in rmt_fsm()
346 rmt_new_dup_actions(smc) ; in rmt_fsm()
351 else if (cmd == RM_MY_BEACON && smc->r.timer0_exp) { in rmt_fsm()
352 rmt_new_dup_actions(smc) ; in rmt_fsm()
358 rmt_new_dup_actions(smc) ; in rmt_fsm()
364 smc->r.rm_join && smc->r.bn_flag) { in rmt_fsm()
370 start_rmt_timer0(smc,smc->s.rmt_t_announce,RM_TIMEOUT_ANNOUNCE); in rmt_fsm()
371 start_rmt_timer1(smc,smc->s.rmt_t_stuck,RM_TIMEOUT_T_STUCK) ; in rmt_fsm()
372 start_rmt_timer2(smc,smc->s.rmt_t_poll,RM_TIMEOUT_POLL) ; in rmt_fsm()
373 sm_mac_check_beacon_claim(smc) ; in rmt_fsm()
379 start_rmt_timer2(smc,smc->s.rmt_t_poll,RM_TIMEOUT_POLL); in rmt_fsm()
380 sm_mac_check_beacon_claim(smc) ; in rmt_fsm()
384 if (!smc->r.da_flag) { in rmt_fsm()
390 smc->r.bn_flag) { in rmt_fsm()
391 smc->r.bn_flag = FALSE ; in rmt_fsm()
394 else if (cmd == RM_TRT_EXP && !smc->r.bn_flag) { in rmt_fsm()
401 if ((tx = sm_mac_get_tx_state(smc)) == 4 || tx == 5) { in rmt_fsm()
403 smc->r.bn_flag = TRUE ; in rmt_fsm()
410 start_rmt_timer1(smc,smc->s.rmt_t_stuck, in rmt_fsm()
414 * We do NOT need to clear smc->r.bn_flag in case of in rmt_fsm()
420 tx, smc->r.bn_flag); in rmt_fsm()
423 else if (cmd == RM_TIMEOUT_ANNOUNCE && !smc->r.bn_flag) { in rmt_fsm()
424 rmt_dup_actions(smc) ; in rmt_fsm()
428 smc->r.no_flag = FALSE ; in rmt_fsm()
434 smc->r.rm_join && smc->r.bn_flag) { in rmt_fsm()
440 stop_rmt_timer0(smc) ; in rmt_fsm()
441 stop_rmt_timer1(smc) ; in rmt_fsm()
442 stop_rmt_timer2(smc) ; in rmt_fsm()
448 if (smc->r.dup_addr_test == DA_PASSED) { in rmt_fsm()
449 smc->r.da_flag = FALSE ; in rmt_fsm()
455 smc->r.jm_flag = FALSE ; in rmt_fsm()
456 smc->r.bn_flag = FALSE ; in rmt_fsm()
462 start_rmt_timer0(smc,smc->s.rmt_t_direct,RM_TIMEOUT_T_DIRECT) ; in rmt_fsm()
463 stop_rmt_timer1(smc) ; in rmt_fsm()
464 start_rmt_timer2(smc,smc->s.rmt_t_poll,RM_TIMEOUT_POLL) ; in rmt_fsm()
465 sm_ma_control(smc,MA_DIRECTED) ; in rmt_fsm()
466 RS_SET(smc,RS_BEACON) ; in rmt_fsm()
473 start_rmt_timer2(smc,smc->s.rmt_t_poll,RM_TIMEOUT_POLL); in rmt_fsm()
474 sm_mac_check_beacon_claim(smc) ; in rmt_fsm()
478 * therefore restart_trt_for_dbcn(smc) will be called in rmt_fsm()
481 restart_trt_for_dbcn(smc) ; in rmt_fsm()
486 !smc->r.da_flag) { in rmt_fsm()
487 smc->r.bn_flag = FALSE ; in rmt_fsm()
493 smc->r.da_flag) { in rmt_fsm()
494 smc->r.bn_flag = FALSE ; in rmt_fsm()
505 stop_rmt_timer0(smc) ; in rmt_fsm()
506 stop_rmt_timer1(smc) ; in rmt_fsm()
507 stop_rmt_timer2(smc) ; in rmt_fsm()
508 smc->e.trace_prop |= ENTITY_BIT(ENTITY_MAC) ; in rmt_fsm()
509 queue_event(smc,EVENT_ECM,EC_TRACE_PROP) ; in rmt_fsm()
516 SMT_PANIC(smc,SMT_E0122, SMT_E0122_MSG) ; in rmt_fsm()
525 static void rmt_dup_actions(struct s_smc *smc) in rmt_dup_actions() argument
527 if (smc->r.jm_flag) { in rmt_dup_actions()
530 if (smc->s.rmt_dup_mac_behavior) { in rmt_dup_actions()
531 SMT_ERR_LOG(smc,SMT_E0138, SMT_E0138_MSG) ; in rmt_dup_actions()
532 rmt_reinsert_actions(smc) ; in rmt_dup_actions()
535 SMT_ERR_LOG(smc,SMT_E0135, SMT_E0135_MSG) ; in rmt_dup_actions()
536 rmt_leave_actions(smc) ; in rmt_dup_actions()
544 static void rmt_reinsert_actions(struct s_smc *smc) in rmt_reinsert_actions() argument
546 queue_event(smc,EVENT_ECM,EC_DISCONNECT) ; in rmt_reinsert_actions()
547 queue_event(smc,EVENT_ECM,EC_CONNECT) ; in rmt_reinsert_actions()
553 static void rmt_new_dup_actions(struct s_smc *smc) in rmt_new_dup_actions() argument
555 smc->r.da_flag = TRUE ; in rmt_new_dup_actions()
556 smc->r.bn_flag = FALSE ; in rmt_new_dup_actions()
557 smc->r.jm_flag = FALSE ; in rmt_new_dup_actions()
564 if (smc->s.rmt_dup_mac_behavior) { in rmt_new_dup_actions()
565 SMT_ERR_LOG(smc,SMT_E0138, SMT_E0138_MSG) ; in rmt_new_dup_actions()
566 rmt_reinsert_actions(smc) ; in rmt_new_dup_actions()
569 SMT_ERR_LOG(smc,SMT_E0135, SMT_E0135_MSG) ; in rmt_new_dup_actions()
570 rmt_leave_actions(smc) ; in rmt_new_dup_actions()
578 static void rmt_leave_actions(struct s_smc *smc) in rmt_leave_actions() argument
580 queue_event(smc,EVENT_ECM,EC_DISCONNECT) ; in rmt_leave_actions()
591 static void start_rmt_timer0(struct s_smc *smc, u_long value, int event) in start_rmt_timer0() argument
593 smc->r.timer0_exp = FALSE ; /* clear timer event flag */ in start_rmt_timer0()
594 smt_timer_start(smc,&smc->r.rmt_timer0,value,EV_TOKEN(EVENT_RMT,event)); in start_rmt_timer0()
601 static void start_rmt_timer1(struct s_smc *smc, u_long value, int event) in start_rmt_timer1() argument
603 smc->r.timer1_exp = FALSE ; /* clear timer event flag */ in start_rmt_timer1()
604 smt_timer_start(smc,&smc->r.rmt_timer1,value,EV_TOKEN(EVENT_RMT,event)); in start_rmt_timer1()
611 static void start_rmt_timer2(struct s_smc *smc, u_long value, int event) in start_rmt_timer2() argument
613 smc->r.timer2_exp = FALSE ; /* clear timer event flag */ in start_rmt_timer2()
614 smt_timer_start(smc,&smc->r.rmt_timer2,value,EV_TOKEN(EVENT_RMT,event)); in start_rmt_timer2()
621 static void stop_rmt_timer0(struct s_smc *smc) in stop_rmt_timer0() argument
623 if (smc->r.rmt_timer0.tm_active) in stop_rmt_timer0()
624 smt_timer_stop(smc,&smc->r.rmt_timer0) ; in stop_rmt_timer0()
631 static void stop_rmt_timer1(struct s_smc *smc) in stop_rmt_timer1() argument
633 if (smc->r.rmt_timer1.tm_active) in stop_rmt_timer1()
634 smt_timer_stop(smc,&smc->r.rmt_timer1) ; in stop_rmt_timer1()
641 static void stop_rmt_timer2(struct s_smc *smc) in stop_rmt_timer2() argument
643 if (smc->r.rmt_timer2.tm_active) in stop_rmt_timer2()
644 smt_timer_stop(smc,&smc->r.rmt_timer2) ; in stop_rmt_timer2()