diff options
Diffstat (limited to 'xhfc')
-rw-r--r-- | xhfc/xhfc_st_state.c | 26 |
1 files changed, 25 insertions, 1 deletions
diff --git a/xhfc/xhfc_st_state.c b/xhfc/xhfc_st_state.c index 6a94f78..4645447 100644 --- a/xhfc/xhfc_st_state.c +++ b/xhfc/xhfc_st_state.c @@ -50,18 +50,42 @@ void start_state_machine(struct xhfc_span* s) void activate_request(struct xhfc_span* s) { u8 a_su_wr_sta = 0; + int sta = GET_V_SU_STA(s->state); + int impossible_te = !s->nt && + (sta == F2 || sta == F4 || sta == F5 || sta == F5); + int impossible_nt = s->nt && + (sta == G2 || sta == G3); + int no_action_te = !s->nt && + (sta == F0 || sta == F6 || sta == F8); + + if (impossible_te || impossible_nt) { + printk(KERN_INFO DRIVER_NAME ": " + "activate impossible by definition of layer 1" + "in state %c%d on port %d\n", + (s->nt ? 'G' : 'F'), sta, portno(s)); + return; + } else if (no_action_te) { + if(DBG_ST && DBG_SPAN(s)) + printk(KERN_INFO DRIVER_NAME ": " + "no action for activate " + "in state %c%d on port %d\n", + (s->nt ? 'G' : 'F'), sta, portno(s)); + return; + } + if(DBG_ST && DBG_SPAN(s)) printk(KERN_DEBUG DRIVER_NAME ": activate on port %d\n", s->port + 1); + SET_V_SU_ACT(a_su_wr_sta, V_SU_ACT_ACTIVATE); write_xhfc(s->xhfc, R_SU_SEL, s->port); write_xhfc(s->xhfc, A_SU_WR_STA, a_su_wr_sta); - if(!s->nt && GET_V_SU_STA(s->state) == F3 && GET_V_SU_INFO0(s->state)) + if(!s->nt && sta == F3 && GET_V_SU_INFO0(s->state)) s->activation_timer = s->xhfc->ticks + T3_MS; /* xref5 */ else s->activation_timer = NOT_RUNNING; |