struct efc_node *
efc_node_find(struct efc_nport *nport, u32 port_id)
{ /* Find an FC node structure given the FC port ID */ return xa_load(&nport->lookup, port_id);
}
switch (evt) { case EFC_EVT_ENTER: {
efc_node_hold_frames(node);
WARN_ON(!efc_els_io_list_empty(node, &node->els_ios_list)); /* by default, we will be freeing node after we unwind */
node->req_free = true;
switch (node->shutdown_reason) { case EFC_NODE_SHUTDOWN_IMPLICIT_LOGO: /* Node shutdown b/c of PLOGI received when node *alreadyloggedin.WehavePLOGIservice *parameters,sosubmitnodeattach;wewon'tbe *freeingthisnode
*/
efc_node_handle_implicit_logo(node); break;
case EFC_NODE_SHUTDOWN_EXPLICIT_LOGO:
efc_node_handle_explicit_logo(node); break;
case EFC_NODE_SHUTDOWN_DEFAULT: default: { /* *shutdownduetolinkdown, *nodegoingaway(xportevent)or *nportshutdown,purgependingand *proceedtocleanupnode
*/
/* cleanup any pending LS_ACC ELSs */
efc_node_send_ls_io_cleanup(node);
node_sm_trace(); /* Node state machine: Wait for all ELSs to complete */ switch (evt) { case EFC_EVT_ENTER:
efc_node_hold_frames(node); if (efc_els_io_list_empty(node, &node->els_ios_list)) {
node_printf(node, "All ELS IOs complete\n");
check_quiesce = true;
} break; case EFC_EVT_EXIT:
efc_node_accept_frames(node); break;
case EFC_EVT_SRRS_ELS_REQ_OK: case EFC_EVT_SRRS_ELS_REQ_FAIL: case EFC_EVT_SRRS_ELS_REQ_RJT: case EFC_EVT_ELS_REQ_ABORTED: if (WARN_ON(!node->els_req_cnt)) break;
node->els_req_cnt--;
check_quiesce = true; break;
case EFC_EVT_SRRS_ELS_CMPL_OK: case EFC_EVT_SRRS_ELS_CMPL_FAIL: if (WARN_ON(!node->els_cmpl_cnt)) break;
node->els_cmpl_cnt--;
check_quiesce = true; break;
case EFC_EVT_ALL_CHILD_NODES_FREE: /* all ELS IO's complete */
node_printf(node, "All ELS IOs complete\n");
WARN_ON(!efc_els_io_list_empty(node, &node->els_ios_list));
check_quiesce = true; break;
case EFC_EVT_NODE_ACTIVE_IO_LIST_EMPTY:
check_quiesce = true; break;
case EFC_EVT_DOMAIN_ATTACH_OK: /* don't care about domain_attach_ok */ break;
/* ignore shutdown events as we're already in shutdown path */ case EFC_EVT_SHUTDOWN: /* have default shutdown event take precedence */
node->shutdown_reason = EFC_NODE_SHUTDOWN_DEFAULT;
fallthrough;
case EFC_EVT_SHUTDOWN_EXPLICIT_LOGO: case EFC_EVT_SHUTDOWN_IMPLICIT_LOGO:
node_printf(node, "%s received\n", efc_sm_event_name(evt)); break;
switch (evt) { case EFC_EVT_ENTER:
efc_node_hold_frames(node); break;
case EFC_EVT_EXIT:
efc_node_accept_frames(node); break;
case EFC_EVT_NODE_FREE_OK: /* node is officially no longer attached */
node->attached = false;
efc_node_transition(node, __efc_node_wait_ios_shutdown, NULL); break;
case EFC_EVT_ALL_CHILD_NODES_FREE: case EFC_EVT_NODE_ACTIVE_IO_LIST_EMPTY: /* As IOs and ELS IO's complete we expect to get these events */ break;
case EFC_EVT_DOMAIN_ATTACH_OK: /* don't care about domain_attach_ok */ break;
/* ignore shutdown events as we're already in shutdown path */ case EFC_EVT_SHUTDOWN: /* have default shutdown event take precedence */
node->shutdown_reason = EFC_NODE_SHUTDOWN_DEFAULT;
fallthrough;
case EFC_EVT_SHUTDOWN_EXPLICIT_LOGO: case EFC_EVT_SHUTDOWN_IMPLICIT_LOGO:
node_printf(node, "%s received\n", efc_sm_event_name(evt)); break; default:
__efc_node_common(__func__, ctx, evt, arg);
}
}
switch (evt) { case EFC_EVT_ENTER:
efc_node_hold_frames(node);
/* first check to see if no ELS IOs are outstanding */ if (efc_els_io_list_empty(node, &node->els_ios_list)) /* If there are any active IOS, Free them. */
efc_node_transition(node, __efc_node_shutdown, NULL); break;
case EFC_EVT_NODE_ACTIVE_IO_LIST_EMPTY: case EFC_EVT_ALL_CHILD_NODES_FREE: if (efc_els_io_list_empty(node, &node->els_ios_list))
efc_node_transition(node, __efc_node_shutdown, NULL); break;
case EFC_EVT_EXIT:
efc_node_accept_frames(node); break;
case EFC_EVT_SRRS_ELS_REQ_FAIL: /* Can happen as ELS IO IO's complete */ if (WARN_ON(!node->els_req_cnt)) break;
node->els_req_cnt--; break;
/* ignore shutdown events as we're already in shutdown path */ case EFC_EVT_SHUTDOWN: /* have default shutdown event take precedence */
node->shutdown_reason = EFC_NODE_SHUTDOWN_DEFAULT;
fallthrough;
case EFC_EVT_SHUTDOWN_EXPLICIT_LOGO: case EFC_EVT_SHUTDOWN_IMPLICIT_LOGO:
efc_log_debug(efc, "[%s] %-20s\n", node->display_name,
efc_sm_event_name(evt)); break; case EFC_EVT_DOMAIN_ATTACH_OK: /* don't care about domain_attach_ok */ break; default:
__efc_node_common(__func__, ctx, evt, arg);
}
}
switch (evt) { case EFC_EVT_ENTER: case EFC_EVT_REENTER: case EFC_EVT_EXIT: case EFC_EVT_NPORT_TOPOLOGY_NOTIFY: case EFC_EVT_NODE_MISSING: case EFC_EVT_FCP_CMD_RCVD: break;
case EFC_EVT_NODE_REFOUND:
node->refound = true; break;
/* *node->attachedmustbesetappropriately *forallnodeattach/detachevents
*/ case EFC_EVT_NODE_ATTACH_OK:
node->attached = true; break;
case EFC_EVT_NODE_FREE_OK: case EFC_EVT_NODE_ATTACH_FAIL:
node->attached = false; break;
/* *handleanyELScompletionsthat *otherstateseitherdidn'tcareabout *orforgotabout
*/ case EFC_EVT_SRRS_ELS_CMPL_OK: case EFC_EVT_SRRS_ELS_CMPL_FAIL: if (WARN_ON(!node->els_cmpl_cnt)) break;
node->els_cmpl_cnt--; break;
/* *handleanyELSrequestcompletionsthat *otherstateseitherdidn'tcareabout *orforgotabout
*/ case EFC_EVT_SRRS_ELS_REQ_OK: case EFC_EVT_SRRS_ELS_REQ_FAIL: case EFC_EVT_SRRS_ELS_REQ_RJT: case EFC_EVT_ELS_REQ_ABORTED: if (WARN_ON(!node->els_req_cnt)) break;
node->els_req_cnt--; break;
case EFC_EVT_ELS_RCVD: { struct fc_frame_header *hdr = cbdata->header->dma.virt;
/* *UnsupportedELSwasreceived, *sendLS_RJT,commandnotsupported
*/
efc_log_debug(efc, "[%s] (%s) ELS x%02x, LS_RJT not supported\n",
node->display_name, funcname,
((u8 *)cbdata->payload->dma.virt)[0]);
case EFC_EVT_PLOGI_RCVD: case EFC_EVT_FLOGI_RCVD: case EFC_EVT_LOGO_RCVD: case EFC_EVT_PRLI_RCVD: case EFC_EVT_PRLO_RCVD: case EFC_EVT_PDISC_RCVD: case EFC_EVT_FDISC_RCVD: case EFC_EVT_ADISC_RCVD: case EFC_EVT_RSCN_RCVD: case EFC_EVT_SCR_RCVD: { struct fc_frame_header *hdr = cbdata->header->dma.virt;
/* sm: / send ELS_RJT */
efc_log_debug(efc, "[%s] (%s) %s sending ELS_RJT\n",
node->display_name, funcname,
efc_sm_event_name(evt)); /* if we didn't catch this in a state, send generic LS_RJT */
efc_send_ls_rjt(node, be16_to_cpu(hdr->fh_ox_id),
ELS_RJT_UNAB, ELS_EXPL_NONE, 0); break;
} case EFC_EVT_ABTS_RCVD: {
efc_log_debug(efc, "[%s] (%s) %s sending BA_ACC\n",
node->display_name, funcname,
efc_sm_event_name(evt));
/* If our event call depth is one and *we'renotholdingframes *thenwecandispatchanypendingframes. *Wedon'twanttoallowtheefc_process_node_pending() *calltorecurse.
*/ if (!node->hold_frames && node->evtdepth == 1)
efc_process_node_pending(node);
/* find a matching event for the ELS command */ for (i = 0; i < ARRAY_SIZE(els_cmd_list); i++) { if (els_cmd_list[i].cmd == buf[0]) {
evt = els_cmd_list[i].evt; break;
}
}
for (;;) { /* need to check for hold frames condition after each frame *processedbecauseanygivenframecouldcauseatransition *toastatethatholdsframes
*/ if (node->hold_frames) break;
seq = NULL; /* Get next frame/sequence */
spin_lock_irqsave(&node->pend_frames_lock, flags);
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.