static void bfa_fcs_rpf_sm_rpsc(struct bfa_fcs_rpf_s *rpf, enum rpf_event event) { struct bfa_fcs_rport_s *rport = rpf->rport; bfa_trc(rport->fcs, rport->pid); bfa_trc(rport->fcs, event); switch (event) { case RPFSM_EVENT_RPSC_COMP: bfa_sm_set_state(rpf, bfa_fcs_rpf_sm_online); /* Update speed info in f/w via BFA */ if (rpf->rpsc_speed != BFA_PPORT_SPEED_UNKNOWN) bfa_rport_speed(rport->bfa_rport, rpf->rpsc_speed); else if (rpf->assigned_speed != BFA_PPORT_SPEED_UNKNOWN) bfa_rport_speed(rport->bfa_rport, rpf->assigned_speed); break; case RPFSM_EVENT_RPSC_FAIL: /* RPSC not supported by rport */ bfa_sm_set_state(rpf, bfa_fcs_rpf_sm_online); break; case RPFSM_EVENT_RPSC_ERROR: /* need to retry...delayed a bit. */ if (rpf->rpsc_retries++ < BFA_FCS_RPF_RETRIES) { bfa_timer_start(rport->fcs->bfa, &rpf->timer, bfa_fcs_rpf_timeout, rpf, BFA_FCS_RPF_RETRY_TIMEOUT); bfa_sm_set_state(rpf, bfa_fcs_rpf_sm_rpsc_retry); } else { bfa_sm_set_state(rpf, bfa_fcs_rpf_sm_online); } break; case RPFSM_EVENT_RPORT_OFFLINE: bfa_sm_set_state(rpf, bfa_fcs_rpf_sm_offline); bfa_fcxp_discard(rpf->fcxp); rpf->rpsc_retries = 0; break; default: bfa_sm_fault(rport->fcs, event); } }
static void bfa_fcs_rpf_sm_rpsc(struct bfa_fcs_rpf_s *rpf, enum rpf_event event) { struct bfa_fcs_rport_s *rport = rpf->rport; bfa_trc(rport->fcs, rport->pid); bfa_trc(rport->fcs, event); switch (event) { case RPFSM_EVENT_RPSC_COMP: bfa_sm_set_state(rpf, bfa_fcs_rpf_sm_online); if (rpf->rpsc_speed != BFA_PPORT_SPEED_UNKNOWN) { bfa_rport_speed(rport->bfa_rport, rpf->rpsc_speed); } else if (rpf->assigned_speed != BFA_PPORT_SPEED_UNKNOWN) { bfa_rport_speed(rport->bfa_rport, rpf->assigned_speed); } break; case RPFSM_EVENT_RPSC_FAIL: bfa_sm_set_state(rpf, bfa_fcs_rpf_sm_online); break; case RPFSM_EVENT_RPSC_ERROR: if (rpf->rpsc_retries++ < BFA_FCS_RPF_RETRIES) { bfa_timer_start(rport->fcs->bfa, &rpf->timer, bfa_fcs_rpf_timeout, rpf, BFA_FCS_RPF_RETRY_TIMEOUT); bfa_sm_set_state(rpf, bfa_fcs_rpf_sm_rpsc_retry); } else { bfa_sm_set_state(rpf, bfa_fcs_rpf_sm_online); } break; case RPFSM_EVENT_RPORT_OFFLINE : bfa_sm_set_state(rpf, bfa_fcs_rpf_sm_offline); bfa_fcxp_discard(rpf->fcxp); rpf->rpsc_retries = 0; break; default: bfa_assert(0); } }
void bfa_fcs_rport_set_speed(struct bfa_fcs_rport_s *rport, enum bfa_pport_speed speed) { rport->rpf.assigned_speed = speed; /* Set this speed in f/w only if the RPSC speed is not available */ if (rport->rpf.rpsc_speed == BFA_PPORT_SPEED_UNKNOWN) bfa_rport_speed(rport->bfa_rport, speed); }