@ -106,9 +106,13 @@ static void bfa_fcs_rport_sm_nsquery_sending(struct bfa_fcs_rport_s *rport,
enum rport_event event ) ;
static void bfa_fcs_rport_sm_nsquery ( struct bfa_fcs_rport_s * rport ,
enum rport_event event ) ;
static void bfa_fcs_rport_sm_adisc_sending ( struct bfa_fcs_rport_s * rport ,
enum rport_event event ) ;
static void bfa_fcs_rport_sm_adisc ( struct bfa_fcs_rport_s * rport ,
static void bfa_fcs_rport_sm_adisc_online_sending (
struct bfa_fcs_rport_s * rport , enum rport_event event ) ;
static void bfa_fcs_rport_sm_adisc_online ( struct bfa_fcs_rport_s * rport ,
enum rport_event event ) ;
static void bfa_fcs_rport_sm_adisc_offline_sending ( struct bfa_fcs_rport_s
* rport , enum rport_event event ) ;
static void bfa_fcs_rport_sm_adisc_offline ( struct bfa_fcs_rport_s * rport ,
enum rport_event event ) ;
static void bfa_fcs_rport_sm_fc4_logorcv ( struct bfa_fcs_rport_s * rport ,
enum rport_event event ) ;
@ -150,8 +154,10 @@ static struct bfa_sm_table_s rport_sm_table[] = {
{ BFA_SM ( bfa_fcs_rport_sm_online ) , BFA_RPORT_ONLINE } ,
{ BFA_SM ( bfa_fcs_rport_sm_nsquery_sending ) , BFA_RPORT_NSQUERY } ,
{ BFA_SM ( bfa_fcs_rport_sm_nsquery ) , BFA_RPORT_NSQUERY } ,
{ BFA_SM ( bfa_fcs_rport_sm_adisc_sending ) , BFA_RPORT_ADISC } ,
{ BFA_SM ( bfa_fcs_rport_sm_adisc ) , BFA_RPORT_ADISC } ,
{ BFA_SM ( bfa_fcs_rport_sm_adisc_online_sending ) , BFA_RPORT_ADISC } ,
{ BFA_SM ( bfa_fcs_rport_sm_adisc_online ) , BFA_RPORT_ADISC } ,
{ BFA_SM ( bfa_fcs_rport_sm_adisc_offline_sending ) , BFA_RPORT_ADISC } ,
{ BFA_SM ( bfa_fcs_rport_sm_adisc_offline ) , BFA_RPORT_ADISC } ,
{ BFA_SM ( bfa_fcs_rport_sm_fc4_logorcv ) , BFA_RPORT_LOGORCV } ,
{ BFA_SM ( bfa_fcs_rport_sm_fc4_logosend ) , BFA_RPORT_LOGO } ,
{ BFA_SM ( bfa_fcs_rport_sm_fc4_offline ) , BFA_RPORT_OFFLINE } ,
@ -231,10 +237,19 @@ bfa_fcs_rport_sm_plogi_sending(struct bfa_fcs_rport_s *rport,
bfa_fcs_rport_send_plogiacc ( rport , NULL ) ;
break ;
case RPSM_EVENT_SCN_OFFLINE :
bfa_sm_set_state ( rport , bfa_fcs_rport_sm_offline ) ;
bfa_fcxp_walloc_cancel ( rport - > fcs - > bfa , & rport - > fcxp_wqe ) ;
bfa_timer_start ( rport - > fcs - > bfa , & rport - > timer ,
bfa_fcs_rport_timeout , rport ,
bfa_fcs_rport_del_timeout ) ;
break ;
case RPSM_EVENT_ADDRESS_CHANGE :
case RPSM_EVENT_SCN :
case RPSM_EVENT_FAB_ SCN :
/* query the NS */
bfa_fcxp_walloc_cancel ( rport - > fcs - > bfa , & rport - > fcxp_wqe ) ;
WARN_ON ( ! ( bfa_fcport_get_topology ( rport - > port - > fcs - > bfa ) ! =
BFA_PORT_TOPOLOGY_LOOP ) ) ;
bfa_sm_set_state ( rport , bfa_fcs_rport_sm_nsdisc_sending ) ;
rport - > ns_retries = 0 ;
bfa_fcs_rport_send_nsdisc ( rport , NULL ) ;
@ -280,12 +295,20 @@ bfa_fcs_rport_sm_plogiacc_sending(struct bfa_fcs_rport_s *rport,
case RPSM_EVENT_PLOGI_RCVD :
case RPSM_EVENT_PLOGI_COMP :
case RPSM_EVENT_SCN :
case RPSM_EVENT_FAB_ SCN :
/*
* Ignore , SCN is possibly online notification .
*/
break ;
case RPSM_EVENT_SCN_OFFLINE :
bfa_sm_set_state ( rport , bfa_fcs_rport_sm_offline ) ;
bfa_fcxp_walloc_cancel ( rport - > fcs - > bfa , & rport - > fcxp_wqe ) ;
bfa_timer_start ( rport - > fcs - > bfa , & rport - > timer ,
bfa_fcs_rport_timeout , rport ,
bfa_fcs_rport_del_timeout ) ;
break ;
case RPSM_EVENT_ADDRESS_CHANGE :
bfa_fcxp_walloc_cancel ( rport - > fcs - > bfa , & rport - > fcxp_wqe ) ;
bfa_sm_set_state ( rport , bfa_fcs_rport_sm_nsdisc_sending ) ;
@ -346,9 +369,19 @@ bfa_fcs_rport_sm_plogi_retry(struct bfa_fcs_rport_s *rport,
bfa_fcs_rport_send_plogiacc ( rport , NULL ) ;
break ;
case RPSM_EVENT_SCN_OFFLINE :
bfa_sm_set_state ( rport , bfa_fcs_rport_sm_offline ) ;
bfa_timer_stop ( & rport - > timer ) ;
bfa_timer_start ( rport - > fcs - > bfa , & rport - > timer ,
bfa_fcs_rport_timeout , rport ,
bfa_fcs_rport_del_timeout ) ;
break ;
case RPSM_EVENT_ADDRESS_CHANGE :
case RPSM_EVENT_SCN :
case RPSM_EVENT_FAB_ SCN :
bfa_timer_stop ( & rport - > timer ) ;
WARN_ON ( ! ( bfa_fcport_get_topology ( rport - > port - > fcs - > bfa ) ! =
BFA_PORT_TOPOLOGY_LOOP ) ) ;
bfa_sm_set_state ( rport , bfa_fcs_rport_sm_nsdisc_sending ) ;
rport - > ns_retries = 0 ;
bfa_fcs_rport_send_nsdisc ( rport , NULL ) ;
@ -422,7 +455,18 @@ bfa_fcs_rport_sm_plogi(struct bfa_fcs_rport_s *rport, enum rport_event event)
}
break ;
case RPSM_EVENT_PLOGI_RETRY :
case RPSM_EVENT_SCN_ONLINE :
break ;
case RPSM_EVENT_SCN_OFFLINE :
bfa_sm_set_state ( rport , bfa_fcs_rport_sm_offline ) ;
bfa_fcxp_discard ( rport - > fcxp ) ;
bfa_timer_start ( rport - > fcs - > bfa , & rport - > timer ,
bfa_fcs_rport_timeout , rport ,
bfa_fcs_rport_del_timeout ) ;
break ;
case RPSM_EVENT_PLOGI_RETRY :
rport - > plogi_retries = 0 ;
bfa_sm_set_state ( rport , bfa_fcs_rport_sm_plogi_retry ) ;
bfa_timer_start ( rport - > fcs - > bfa , & rport - > timer ,
@ -440,8 +484,10 @@ bfa_fcs_rport_sm_plogi(struct bfa_fcs_rport_s *rport, enum rport_event event)
break ;
case RPSM_EVENT_ADDRESS_CHANGE :
case RPSM_EVENT_SCN :
case RPSM_EVENT_FAB_ SCN :
bfa_fcxp_discard ( rport - > fcxp ) ;
WARN_ON ( ! ( bfa_fcport_get_topology ( rport - > port - > fcs - > bfa ) ! =
BFA_PORT_TOPOLOGY_LOOP ) ) ;
bfa_sm_set_state ( rport , bfa_fcs_rport_sm_nsdisc_sending ) ;
rport - > ns_retries = 0 ;
bfa_fcs_rport_send_nsdisc ( rport , NULL ) ;
@ -512,7 +558,8 @@ bfa_fcs_rport_sm_fc4_fcs_online(struct bfa_fcs_rport_s *rport,
case RPSM_EVENT_PLOGI_COMP :
case RPSM_EVENT_LOGO_IMP :
case RPSM_EVENT_ADDRESS_CHANGE :
case RPSM_EVENT_SCN :
case RPSM_EVENT_FAB_SCN :
case RPSM_EVENT_SCN_OFFLINE :
bfa_sm_set_state ( rport , bfa_fcs_rport_sm_fc4_offline ) ;
bfa_fcs_rport_fcs_offline_action ( rport ) ;
break ;
@ -561,9 +608,10 @@ bfa_fcs_rport_sm_hal_online(struct bfa_fcs_rport_s *rport,
bfa_fcs_rport_fcs_offline_action ( rport ) ;
break ;
case RPSM_EVENT_SCN :
case RPSM_EVENT_FAB_ SCN :
case RPSM_EVENT_LOGO_IMP :
case RPSM_EVENT_ADDRESS_CHANGE :
case RPSM_EVENT_SCN_OFFLINE :
bfa_sm_set_state ( rport , bfa_fcs_rport_sm_fc4_offline ) ;
bfa_fcs_rport_fcs_offline_action ( rport ) ;
break ;
@ -595,14 +643,15 @@ bfa_fcs_rport_sm_online(struct bfa_fcs_rport_s *rport, enum rport_event event)
bfa_trc ( rport - > fcs , event ) ;
switch ( event ) {
case RPSM_EVENT_SCN :
case RPSM_EVENT_FAB_ SCN :
if ( bfa_fcs_fabric_is_switched ( rport - > port - > fabric ) ) {
bfa_sm_set_state ( rport ,
bfa_fcs_rport_sm_nsquery_sending ) ;
rport - > ns_retries = 0 ;
bfa_fcs_rport_send_nsdisc ( rport , NULL ) ;
} else {
bfa_sm_set_state ( rport , bfa_fcs_rport_sm_adisc_sending ) ;
bfa_sm_set_state ( rport ,
bfa_fcs_rport_sm_adisc_online_sending ) ;
bfa_fcs_rport_send_adisc ( rport , NULL ) ;
}
break ;
@ -610,6 +659,7 @@ bfa_fcs_rport_sm_online(struct bfa_fcs_rport_s *rport, enum rport_event event)
case RPSM_EVENT_PLOGI_RCVD :
case RPSM_EVENT_LOGO_IMP :
case RPSM_EVENT_ADDRESS_CHANGE :
case RPSM_EVENT_SCN_OFFLINE :
bfa_sm_set_state ( rport , bfa_fcs_rport_sm_fc4_offline ) ;
bfa_fcs_rport_hal_offline_action ( rport ) ;
break ;
@ -625,6 +675,7 @@ bfa_fcs_rport_sm_online(struct bfa_fcs_rport_s *rport, enum rport_event event)
bfa_fcs_rport_hal_offline_action ( rport ) ;
break ;
case RPSM_EVENT_SCN_ONLINE :
case RPSM_EVENT_PLOGI_COMP :
break ;
@ -656,7 +707,7 @@ bfa_fcs_rport_sm_nsquery_sending(struct bfa_fcs_rport_s *rport,
bfa_fcs_rport_hal_offline_action ( rport ) ;
break ;
case RPSM_EVENT_SCN :
case RPSM_EVENT_FAB_ SCN :
/*
* ignore SCN , wait for response to query itself
*/
@ -696,7 +747,7 @@ bfa_fcs_rport_sm_nsquery(struct bfa_fcs_rport_s *rport, enum rport_event event)
switch ( event ) {
case RPSM_EVENT_ACCEPTED :
bfa_sm_set_state ( rport , bfa_fcs_rport_sm_adisc_sending ) ;
bfa_sm_set_state ( rport , bfa_fcs_rport_sm_adisc_online_ sending ) ;
bfa_fcs_rport_send_adisc ( rport , NULL ) ;
break ;
@ -718,7 +769,7 @@ bfa_fcs_rport_sm_nsquery(struct bfa_fcs_rport_s *rport, enum rport_event event)
bfa_fcs_rport_hal_offline_action ( rport ) ;
break ;
case RPSM_EVENT_SCN :
case RPSM_EVENT_FAB_ SCN :
break ;
case RPSM_EVENT_LOGO_RCVD :
@ -747,7 +798,7 @@ bfa_fcs_rport_sm_nsquery(struct bfa_fcs_rport_s *rport, enum rport_event event)
* authenticating with rport . FC - 4 s are paused .
*/
static void
bfa_fcs_rport_sm_adisc_sending ( struct bfa_fcs_rport_s * rport ,
bfa_fcs_rport_sm_adisc_online_ sending ( struct bfa_fcs_rport_s * rport ,
enum rport_event event )
{
bfa_trc ( rport - > fcs , rport - > pwwn ) ;
@ -756,7 +807,7 @@ bfa_fcs_rport_sm_adisc_sending(struct bfa_fcs_rport_s *rport,
switch ( event ) {
case RPSM_EVENT_FCXP_SENT :
bfa_sm_set_state ( rport , bfa_fcs_rport_sm_adisc ) ;
bfa_sm_set_state ( rport , bfa_fcs_rport_sm_adisc_online ) ;
break ;
case RPSM_EVENT_DELETE :
@ -779,7 +830,7 @@ bfa_fcs_rport_sm_adisc_sending(struct bfa_fcs_rport_s *rport,
bfa_fcs_rport_hal_offline_action ( rport ) ;
break ;
case RPSM_EVENT_SCN :
case RPSM_EVENT_FAB_ SCN :
break ;
case RPSM_EVENT_PLOGI_RCVD :
@ -798,7 +849,8 @@ bfa_fcs_rport_sm_adisc_sending(struct bfa_fcs_rport_s *rport,
* FC - 4 s are paused .
*/
static void
bfa_fcs_rport_sm_adisc ( struct bfa_fcs_rport_s * rport , enum rport_event event )
bfa_fcs_rport_sm_adisc_online ( struct bfa_fcs_rport_s * rport ,
enum rport_event event )
{
bfa_trc ( rport - > fcs , rport - > pwwn ) ;
bfa_trc ( rport - > fcs , rport - > pid ) ;
@ -831,7 +883,7 @@ bfa_fcs_rport_sm_adisc(struct bfa_fcs_rport_s *rport, enum rport_event event)
bfa_fcs_rport_hal_offline_action ( rport ) ;
break ;
case RPSM_EVENT_SCN :
case RPSM_EVENT_FAB_ SCN :
/*
* already processing RSCN
*/
@ -856,7 +908,96 @@ bfa_fcs_rport_sm_adisc(struct bfa_fcs_rport_s *rport, enum rport_event event)
}
/*
* Rport has sent LOGO . Awaiting FC - 4 offline completion callback .
* ADISC is being sent for authenticating with rport
* Already did offline actions .
*/
static void
bfa_fcs_rport_sm_adisc_offline_sending ( struct bfa_fcs_rport_s * rport ,
enum rport_event event )
{
bfa_trc ( rport - > fcs , rport - > pwwn ) ;
bfa_trc ( rport - > fcs , rport - > pid ) ;
bfa_trc ( rport - > fcs , event ) ;
switch ( event ) {
case RPSM_EVENT_FCXP_SENT :
bfa_sm_set_state ( rport , bfa_fcs_rport_sm_adisc_offline ) ;
break ;
case RPSM_EVENT_DELETE :
case RPSM_EVENT_SCN_OFFLINE :
case RPSM_EVENT_LOGO_IMP :
case RPSM_EVENT_LOGO_RCVD :
case RPSM_EVENT_PRLO_RCVD :
bfa_sm_set_state ( rport , bfa_fcs_rport_sm_offline ) ;
bfa_fcxp_walloc_cancel ( rport - > fcs - > bfa ,
& rport - > fcxp_wqe ) ;
bfa_timer_start ( rport - > fcs - > bfa , & rport - > timer ,
bfa_fcs_rport_timeout , rport ,
bfa_fcs_rport_del_timeout ) ;
break ;
case RPSM_EVENT_PLOGI_RCVD :
bfa_sm_set_state ( rport , bfa_fcs_rport_sm_plogiacc_sending ) ;
bfa_fcxp_walloc_cancel ( rport - > fcs - > bfa , & rport - > fcxp_wqe ) ;
bfa_fcs_rport_send_plogiacc ( rport , NULL ) ;
break ;
default :
bfa_sm_fault ( rport - > fcs , event ) ;
}
}
/*
* ADISC to rport
* Already did offline actions
*/
static void
bfa_fcs_rport_sm_adisc_offline ( struct bfa_fcs_rport_s * rport ,
enum rport_event event )
{
bfa_trc ( rport - > fcs , rport - > pwwn ) ;
bfa_trc ( rport - > fcs , rport - > pid ) ;
bfa_trc ( rport - > fcs , event ) ;
switch ( event ) {
case RPSM_EVENT_ACCEPTED :
bfa_sm_set_state ( rport , bfa_fcs_rport_sm_hal_online ) ;
bfa_fcs_rport_hal_online ( rport ) ;
break ;
case RPSM_EVENT_PLOGI_RCVD :
bfa_sm_set_state ( rport , bfa_fcs_rport_sm_plogiacc_sending ) ;
bfa_fcxp_discard ( rport - > fcxp ) ;
bfa_fcs_rport_send_plogiacc ( rport , NULL ) ;
break ;
case RPSM_EVENT_FAILED :
bfa_sm_set_state ( rport , bfa_fcs_rport_sm_offline ) ;
bfa_timer_start ( rport - > fcs - > bfa , & rport - > timer ,
bfa_fcs_rport_timeout , rport ,
bfa_fcs_rport_del_timeout ) ;
break ;
case RPSM_EVENT_DELETE :
case RPSM_EVENT_SCN_OFFLINE :
case RPSM_EVENT_LOGO_IMP :
case RPSM_EVENT_LOGO_RCVD :
case RPSM_EVENT_PRLO_RCVD :
bfa_sm_set_state ( rport , bfa_fcs_rport_sm_offline ) ;
bfa_fcxp_discard ( rport - > fcxp ) ;
bfa_timer_start ( rport - > fcs - > bfa , & rport - > timer ,
bfa_fcs_rport_timeout , rport ,
bfa_fcs_rport_del_timeout ) ;
break ;
default :
bfa_sm_fault ( rport - > fcs , event ) ;
}
}
/*
* Rport has sent LOGO . Awaiting FC - 4 offline completion callback .
*/
static void
bfa_fcs_rport_sm_fc4_logorcv ( struct bfa_fcs_rport_s * rport ,
@ -881,6 +1022,8 @@ bfa_fcs_rport_sm_fc4_logorcv(struct bfa_fcs_rport_s *rport,
bfa_sm_set_state ( rport , bfa_fcs_rport_sm_fc4_off_delete ) ;
break ;
case RPSM_EVENT_SCN_ONLINE :
case RPSM_EVENT_SCN_OFFLINE :
case RPSM_EVENT_HCB_ONLINE :
case RPSM_EVENT_LOGO_RCVD :
case RPSM_EVENT_PRLO_RCVD :
@ -945,6 +1088,8 @@ bfa_fcs_rport_sm_fc4_offline(struct bfa_fcs_rport_s *rport,
bfa_fcs_rport_hal_offline ( rport ) ;
break ;
case RPSM_EVENT_SCN_ONLINE :
break ;
case RPSM_EVENT_LOGO_RCVD :
/*
* Rport is going offline . Just ack the logo
@ -956,8 +1101,9 @@ bfa_fcs_rport_sm_fc4_offline(struct bfa_fcs_rport_s *rport,
bfa_fcs_rport_send_prlo_acc ( rport ) ;
break ;
case RPSM_EVENT_SCN_OFFLINE :
case RPSM_EVENT_HCB_ONLINE :
case RPSM_EVENT_SCN :
case RPSM_EVENT_FAB_ SCN :
case RPSM_EVENT_LOGO_IMP :
case RPSM_EVENT_ADDRESS_CHANGE :
/*
@ -1015,6 +1161,19 @@ bfa_fcs_rport_sm_hcb_offline(struct bfa_fcs_rport_s *rport,
bfa_fcs_rport_sm_nsdisc_sending ) ;
rport - > ns_retries = 0 ;
bfa_fcs_rport_send_nsdisc ( rport , NULL ) ;
} else if ( bfa_fcport_get_topology ( rport - > port - > fcs - > bfa ) = =
BFA_PORT_TOPOLOGY_LOOP ) {
if ( rport - > scn_online ) {
bfa_sm_set_state ( rport ,
bfa_fcs_rport_sm_adisc_offline_sending ) ;
bfa_fcs_rport_send_adisc ( rport , NULL ) ;
} else {
bfa_sm_set_state ( rport ,
bfa_fcs_rport_sm_offline ) ;
bfa_timer_start ( rport - > fcs - > bfa , & rport - > timer ,
bfa_fcs_rport_timeout , rport ,
bfa_fcs_rport_del_timeout ) ;
}
} else {
bfa_sm_set_state ( rport , bfa_fcs_rport_sm_plogi_sending ) ;
rport - > plogi_retries = 0 ;
@ -1027,7 +1186,9 @@ bfa_fcs_rport_sm_hcb_offline(struct bfa_fcs_rport_s *rport,
bfa_fcs_rport_free ( rport ) ;
break ;
case RPSM_EVENT_SCN :
case RPSM_EVENT_SCN_ONLINE :
case RPSM_EVENT_SCN_OFFLINE :
case RPSM_EVENT_FAB_SCN :
case RPSM_EVENT_LOGO_RCVD :
case RPSM_EVENT_PRLO_RCVD :
case RPSM_EVENT_PLOGI_RCVD :
@ -1106,6 +1267,8 @@ bfa_fcs_rport_sm_hcb_logorcv(struct bfa_fcs_rport_s *rport,
bfa_sm_set_state ( rport , bfa_fcs_rport_sm_hcb_offline ) ;
break ;
case RPSM_EVENT_SCN_ONLINE :
case RPSM_EVENT_SCN_OFFLINE :
case RPSM_EVENT_LOGO_RCVD :
case RPSM_EVENT_PRLO_RCVD :
/*
@ -1146,6 +1309,8 @@ bfa_fcs_rport_sm_hcb_logosend(struct bfa_fcs_rport_s *rport,
bfa_sm_set_state ( rport , bfa_fcs_rport_sm_delete_pending ) ;
break ;
case RPSM_EVENT_SCN_ONLINE :
case RPSM_EVENT_SCN_OFFLINE :
case RPSM_EVENT_ADDRESS_CHANGE :
break ;
@ -1172,7 +1337,9 @@ bfa_fcs_rport_sm_logo_sending(struct bfa_fcs_rport_s *rport,
bfa_fcs_rport_free ( rport ) ;
break ;
case RPSM_EVENT_SCN :
case RPSM_EVENT_SCN_ONLINE :
case RPSM_EVENT_SCN_OFFLINE :
case RPSM_EVENT_FAB_SCN :
case RPSM_EVENT_ADDRESS_CHANGE :
break ;
@ -1209,10 +1376,12 @@ bfa_fcs_rport_sm_offline(struct bfa_fcs_rport_s *rport, enum rport_event event)
bfa_fcs_rport_free ( rport ) ;
break ;
case RPSM_EVENT_SCN :
case RPSM_EVENT_FAB_ SCN :
case RPSM_EVENT_ADDRESS_CHANGE :
bfa_sm_set_state ( rport , bfa_fcs_rport_sm_nsdisc_sending ) ;
bfa_timer_stop ( & rport - > timer ) ;
WARN_ON ( ! ( bfa_fcport_get_topology ( rport - > port - > fcs - > bfa ) ! =
BFA_PORT_TOPOLOGY_LOOP ) ) ;
bfa_sm_set_state ( rport , bfa_fcs_rport_sm_nsdisc_sending ) ;
rport - > ns_retries = 0 ;
bfa_fcs_rport_send_nsdisc ( rport , NULL ) ;
break ;
@ -1232,6 +1401,7 @@ bfa_fcs_rport_sm_offline(struct bfa_fcs_rport_s *rport, enum rport_event event)
case RPSM_EVENT_LOGO_RCVD :
case RPSM_EVENT_PRLO_RCVD :
case RPSM_EVENT_LOGO_IMP :
case RPSM_EVENT_SCN_OFFLINE :
break ;
case RPSM_EVENT_PLOGI_COMP :
@ -1240,6 +1410,12 @@ bfa_fcs_rport_sm_offline(struct bfa_fcs_rport_s *rport, enum rport_event event)
bfa_fcs_rport_fcs_online_action ( rport ) ;
break ;
case RPSM_EVENT_SCN_ONLINE :
bfa_timer_stop ( & rport - > timer ) ;
bfa_sm_set_state ( rport , bfa_fcs_rport_sm_plogi_sending ) ;
bfa_fcs_rport_send_plogi ( rport , NULL ) ;
break ;
case RPSM_EVENT_PLOGI_SEND :
bfa_timer_stop ( & rport - > timer ) ;
bfa_sm_set_state ( rport , bfa_fcs_rport_sm_plogi_sending ) ;
@ -1280,7 +1456,7 @@ bfa_fcs_rport_sm_nsdisc_sending(struct bfa_fcs_rport_s *rport,
bfa_fcs_rport_send_plogiacc ( rport , NULL ) ;
break ;
case RPSM_EVENT_SCN :
case RPSM_EVENT_FAB_ SCN :
case RPSM_EVENT_LOGO_RCVD :
case RPSM_EVENT_PRLO_RCVD :
case RPSM_EVENT_PLOGI_SEND :
@ -1326,7 +1502,7 @@ bfa_fcs_rport_sm_nsdisc_retry(struct bfa_fcs_rport_s *rport,
bfa_fcs_rport_send_nsdisc ( rport , NULL ) ;
break ;
case RPSM_EVENT_SCN :
case RPSM_EVENT_FAB_ SCN :
case RPSM_EVENT_ADDRESS_CHANGE :
bfa_sm_set_state ( rport , bfa_fcs_rport_sm_nsdisc_sending ) ;
bfa_timer_stop ( & rport - > timer ) ;
@ -1439,7 +1615,7 @@ bfa_fcs_rport_sm_nsdisc_sent(struct bfa_fcs_rport_s *rport,
case RPSM_EVENT_PRLO_RCVD :
bfa_fcs_rport_send_prlo_acc ( rport ) ;
break ;
case RPSM_EVENT_SCN :
case RPSM_EVENT_FAB_ SCN :
/*
* ignore , wait for NS query response
*/
@ -2546,7 +2722,7 @@ void
bfa_fcs_rport_scn ( struct bfa_fcs_rport_s * rport )
{
rport - > stats . rscns + + ;
bfa_sm_send_event ( rport , RPSM_EVENT_SCN ) ;
bfa_sm_send_event ( rport , RPSM_EVENT_FAB_ SCN ) ;
}
/*
@ -2621,6 +2797,48 @@ bfa_cb_rport_qos_scn_flowid(void *cbarg,
bfa_fcs_rport_aen_post ( rport , BFA_RPORT_AEN_QOS_FLOWID , & aen_data ) ;
}
void
bfa_cb_rport_scn_online ( struct bfa_s * bfa )
{
struct bfa_fcs_s * fcs = & ( ( struct bfad_s * ) bfa - > bfad ) - > bfa_fcs ;
struct bfa_fcs_lport_s * port = bfa_fcs_get_base_port ( fcs ) ;
struct bfa_fcs_rport_s * rp ;
struct list_head * qe ;
list_for_each ( qe , & port - > rport_q ) {
rp = ( struct bfa_fcs_rport_s * ) qe ;
bfa_sm_send_event ( rp , RPSM_EVENT_SCN_ONLINE ) ;
rp - > scn_online = BFA_TRUE ;
}
if ( bfa_fcs_lport_is_online ( port ) )
bfa_fcs_lport_lip_scn_online ( port ) ;
}
void
bfa_cb_rport_scn_no_dev ( void * rport )
{
struct bfa_fcs_rport_s * rp = rport ;
bfa_sm_send_event ( rp , RPSM_EVENT_SCN_OFFLINE ) ;
rp - > scn_online = BFA_FALSE ;
}
void
bfa_cb_rport_scn_offline ( struct bfa_s * bfa )
{
struct bfa_fcs_s * fcs = & ( ( struct bfad_s * ) bfa - > bfad ) - > bfa_fcs ;
struct bfa_fcs_lport_s * port = bfa_fcs_get_base_port ( fcs ) ;
struct bfa_fcs_rport_s * rp ;
struct list_head * qe ;
list_for_each ( qe , & port - > rport_q ) {
rp = ( struct bfa_fcs_rport_s * ) qe ;
bfa_sm_send_event ( rp , RPSM_EVENT_SCN_OFFLINE ) ;
rp - > scn_online = BFA_FALSE ;
}
}
/*
* brief
* This routine is a static BFA callback when there is a QoS priority