File Index
Files and directories
Sign in
FILE

efc_device.c

File preview with syntax highlighting.

linux-6.19.14/drivers/scsi/elx/libefc/efc_device.c C
   1// SPDX-License-Identifier: GPL-2.0
   2/*
   3 * Copyright (C) 2021 Broadcom. All Rights Reserved. The term
   4 * “Broadcom” refers to Broadcom Inc. and/or its subsidiaries.
   5 */
   6
   7/*
   8 * device_sm Node State Machine: Remote Device States
   9 */
  10
  11#include "efc.h"
  12#include "efc_device.h"
  13#include "efc_fabric.h"
  14
  15void
  16efc_d_send_prli_rsp(struct efc_node *node, u16 ox_id)
  17{
  18	int rc = EFC_SCSI_CALL_COMPLETE;
  19	struct efc *efc = node->efc;
  20
  21	node->ls_acc_oxid = ox_id;
  22	node->send_ls_acc = EFC_NODE_SEND_LS_ACC_PRLI;
  23
  24	/*
  25	 * Wait for backend session registration
  26	 * to complete before sending PRLI resp
  27	 */
  28
  29	if (node->init) {
  30		efc_log_info(efc, "[%s] found(initiator) WWPN:%s WWNN:%s\n",
  31			     node->display_name, node->wwpn, node->wwnn);
  32		if (node->nport->enable_tgt)
  33			rc = efc->tt.scsi_new_node(efc, node);
  34	}
  35
  36	if (rc < 0)
  37		efc_node_post_event(node, EFC_EVT_NODE_SESS_REG_FAIL, NULL);
  38
  39	if (rc == EFC_SCSI_CALL_COMPLETE)
  40		efc_node_post_event(node, EFC_EVT_NODE_SESS_REG_OK, NULL);
  41}
  42
  43static void
  44__efc_d_common(const char *funcname, struct efc_sm_ctx *ctx,
  45	       enum efc_sm_event evt, void *arg)
  46{
  47	struct efc_node *node = NULL;
  48	struct efc *efc = NULL;
  49
  50	node = ctx->app;
  51	efc = node->efc;
  52
  53	switch (evt) {
  54	/* Handle shutdown events */
  55	case EFC_EVT_SHUTDOWN:
  56		efc_log_debug(efc, "[%s] %-20s %-20s\n", node->display_name,
  57			      funcname, efc_sm_event_name(evt));
  58		node->shutdown_reason = EFC_NODE_SHUTDOWN_DEFAULT;
  59		efc_node_transition(node, __efc_d_initiate_shutdown, NULL);
  60		break;
  61	case EFC_EVT_SHUTDOWN_EXPLICIT_LOGO:
  62		efc_log_debug(efc, "[%s] %-20s %-20s\n",
  63			      node->display_name, funcname,
  64				efc_sm_event_name(evt));
  65		node->shutdown_reason = EFC_NODE_SHUTDOWN_EXPLICIT_LOGO;
  66		efc_node_transition(node, __efc_d_initiate_shutdown, NULL);
  67		break;
  68	case EFC_EVT_SHUTDOWN_IMPLICIT_LOGO:
  69		efc_log_debug(efc, "[%s] %-20s %-20s\n", node->display_name,
  70			      funcname, efc_sm_event_name(evt));
  71		node->shutdown_reason = EFC_NODE_SHUTDOWN_IMPLICIT_LOGO;
  72		efc_node_transition(node, __efc_d_initiate_shutdown, NULL);
  73		break;
  74
  75	default:
  76		/* call default event handler common to all nodes */
  77		__efc_node_common(funcname, ctx, evt, arg);
  78	}
  79}
  80
  81static void
  82__efc_d_wait_del_node(struct efc_sm_ctx *ctx,
  83		      enum efc_sm_event evt, void *arg)
  84{
  85	struct efc_node *node = ctx->app;
  86
  87	efc_node_evt_set(ctx, evt, __func__);
  88
  89	/*
  90	 * State is entered when a node sends a delete initiator/target call
  91	 * to the target-server/initiator-client and needs to wait for that
  92	 * work to complete.
  93	 */
  94	node_sm_trace();
  95
  96	switch (evt) {
  97	case EFC_EVT_ENTER:
  98		efc_node_hold_frames(node);
  99		fallthrough;
 100
 101	case EFC_EVT_NODE_ACTIVE_IO_LIST_EMPTY:
 102	case EFC_EVT_ALL_CHILD_NODES_FREE:
 103		/* These are expected events. */
 104		break;
 105
 106	case EFC_EVT_NODE_DEL_INI_COMPLETE:
 107	case EFC_EVT_NODE_DEL_TGT_COMPLETE:
 108		/*
 109		 * node has either been detached or is in the process
 110		 * of being detached,
 111		 * call common node's initiate cleanup function
 112		 */
 113		efc_node_initiate_cleanup(node);
 114		break;
 115
 116	case EFC_EVT_EXIT:
 117		efc_node_accept_frames(node);
 118		break;
 119
 120	case EFC_EVT_SRRS_ELS_REQ_FAIL:
 121		/* Can happen as ELS IO IO's complete */
 122		WARN_ON(!node->els_req_cnt);
 123		node->els_req_cnt--;
 124		break;
 125
 126	/* ignore shutdown events as we're already in shutdown path */
 127	case EFC_EVT_SHUTDOWN:
 128		/* have default shutdown event take precedence */
 129		node->shutdown_reason = EFC_NODE_SHUTDOWN_DEFAULT;
 130		fallthrough;
 131
 132	case EFC_EVT_SHUTDOWN_EXPLICIT_LOGO:
 133	case EFC_EVT_SHUTDOWN_IMPLICIT_LOGO:
 134		node_printf(node, "%s received\n", efc_sm_event_name(evt));
 135		break;
 136	case EFC_EVT_DOMAIN_ATTACH_OK:
 137		/* don't care about domain_attach_ok */
 138		break;
 139	default:
 140		__efc_d_common(__func__, ctx, evt, arg);
 141	}
 142}
 143
 144static void
 145__efc_d_wait_del_ini_tgt(struct efc_sm_ctx *ctx,
 146			 enum efc_sm_event evt, void *arg)
 147{
 148	struct efc_node *node = ctx->app;
 149
 150	efc_node_evt_set(ctx, evt, __func__);
 151
 152	node_sm_trace();
 153
 154	switch (evt) {
 155	case EFC_EVT_ENTER:
 156		efc_node_hold_frames(node);
 157		fallthrough;
 158
 159	case EFC_EVT_NODE_ACTIVE_IO_LIST_EMPTY:
 160	case EFC_EVT_ALL_CHILD_NODES_FREE:
 161		/* These are expected events. */
 162		break;
 163
 164	case EFC_EVT_NODE_DEL_INI_COMPLETE:
 165	case EFC_EVT_NODE_DEL_TGT_COMPLETE:
 166		efc_node_transition(node, __efc_d_wait_del_node, NULL);
 167		break;
 168
 169	case EFC_EVT_EXIT:
 170		efc_node_accept_frames(node);
 171		break;
 172
 173	case EFC_EVT_SRRS_ELS_REQ_FAIL:
 174		/* Can happen as ELS IO IO's complete */
 175		WARN_ON(!node->els_req_cnt);
 176		node->els_req_cnt--;
 177		break;
 178
 179	/* ignore shutdown events as we're already in shutdown path */
 180	case EFC_EVT_SHUTDOWN:
 181		/* have default shutdown event take precedence */
 182		node->shutdown_reason = EFC_NODE_SHUTDOWN_DEFAULT;
 183		fallthrough;
 184
 185	case EFC_EVT_SHUTDOWN_EXPLICIT_LOGO:
 186	case EFC_EVT_SHUTDOWN_IMPLICIT_LOGO:
 187		node_printf(node, "%s received\n", efc_sm_event_name(evt));
 188		break;
 189	case EFC_EVT_DOMAIN_ATTACH_OK:
 190		/* don't care about domain_attach_ok */
 191		break;
 192	default:
 193		__efc_d_common(__func__, ctx, evt, arg);
 194	}
 195}
 196
 197void
 198__efc_d_initiate_shutdown(struct efc_sm_ctx *ctx,
 199			  enum efc_sm_event evt, void *arg)
 200{
 201	struct efc_node *node = ctx->app;
 202	struct efc *efc = node->efc;
 203
 204	efc_node_evt_set(ctx, evt, __func__);
 205
 206	node_sm_trace();
 207
 208	switch (evt) {
 209	case EFC_EVT_ENTER: {
 210		int rc = EFC_SCSI_CALL_COMPLETE;
 211
 212		/* assume no wait needed */
 213		node->els_io_enabled = false;
 214
 215		/* make necessary delete upcall(s) */
 216		if (node->init && !node->targ) {
 217			efc_log_info(node->efc,
 218				     "[%s] delete (initiator) WWPN %s WWNN %s\n",
 219				node->display_name,
 220				node->wwpn, node->wwnn);
 221			efc_node_transition(node,
 222					    __efc_d_wait_del_node,
 223					     NULL);
 224			if (node->nport->enable_tgt)
 225				rc = efc->tt.scsi_del_node(efc, node,
 226					EFC_SCSI_INITIATOR_DELETED);
 227
 228			if (rc == EFC_SCSI_CALL_COMPLETE || rc < 0)
 229				efc_node_post_event(node,
 230					EFC_EVT_NODE_DEL_INI_COMPLETE, NULL);
 231
 232		} else if (node->targ && !node->init) {
 233			efc_log_info(node->efc,
 234				     "[%s] delete (target) WWPN %s WWNN %s\n",
 235				node->display_name,
 236				node->wwpn, node->wwnn);
 237			efc_node_transition(node,
 238					    __efc_d_wait_del_node,
 239					     NULL);
 240			if (node->nport->enable_ini)
 241				rc = efc->tt.scsi_del_node(efc, node,
 242					EFC_SCSI_TARGET_DELETED);
 243
 244			if (rc == EFC_SCSI_CALL_COMPLETE)
 245				efc_node_post_event(node,
 246					EFC_EVT_NODE_DEL_TGT_COMPLETE, NULL);
 247
 248		} else if (node->init && node->targ) {
 249			efc_log_info(node->efc,
 250				     "[%s] delete (I+T) WWPN %s WWNN %s\n",
 251				node->display_name, node->wwpn, node->wwnn);
 252			efc_node_transition(node, __efc_d_wait_del_ini_tgt,
 253					    NULL);
 254			if (node->nport->enable_tgt)
 255				rc = efc->tt.scsi_del_node(efc, node,
 256						EFC_SCSI_INITIATOR_DELETED);
 257
 258			if (rc == EFC_SCSI_CALL_COMPLETE)
 259				efc_node_post_event(node,
 260					EFC_EVT_NODE_DEL_INI_COMPLETE, NULL);
 261			/* assume no wait needed */
 262			rc = EFC_SCSI_CALL_COMPLETE;
 263			if (node->nport->enable_ini)
 264				rc = efc->tt.scsi_del_node(efc, node,
 265						EFC_SCSI_TARGET_DELETED);
 266
 267			if (rc == EFC_SCSI_CALL_COMPLETE)
 268				efc_node_post_event(node,
 269					EFC_EVT_NODE_DEL_TGT_COMPLETE, NULL);
 270		}
 271
 272		/* we've initiated the upcalls as needed, now kick off the node
 273		 * detach to precipitate the aborting of outstanding exchanges
 274		 * associated with said node
 275		 *
 276		 * Beware: if we've made upcall(s), we've already transitioned
 277		 * to a new state by the time we execute this.
 278		 * consider doing this before the upcalls?
 279		 */
 280		if (node->attached) {
 281			/* issue hw node free; don't care if succeeds right
 282			 * away or sometime later, will check node->attached
 283			 * later in shutdown process
 284			 */
 285			rc = efc_cmd_node_detach(efc, &node->rnode);
 286			if (rc < 0)
 287				node_printf(node,
 288					    "Failed freeing HW node, rc=%d\n",
 289					rc);
 290		}
 291
 292		/* if neither initiator nor target, proceed to cleanup */
 293		if (!node->init && !node->targ) {
 294			/*
 295			 * node has either been detached or is in
 296			 * the process of being detached,
 297			 * call common node's initiate cleanup function
 298			 */
 299			efc_node_initiate_cleanup(node);
 300		}
 301		break;
 302	}
 303	case EFC_EVT_ALL_CHILD_NODES_FREE:
 304		/* Ignore, this can happen if an ELS is
 305		 * aborted while in a delay/retry state
 306		 */
 307		break;
 308	default:
 309		__efc_d_common(__func__, ctx, evt, arg);
 310	}
 311}
 312
 313void
 314__efc_d_wait_loop(struct efc_sm_ctx *ctx,
 315		  enum efc_sm_event evt, void *arg)
 316{
 317	struct efc_node *node = ctx->app;
 318
 319	efc_node_evt_set(ctx, evt, __func__);
 320
 321	node_sm_trace();
 322
 323	switch (evt) {
 324	case EFC_EVT_ENTER:
 325		efc_node_hold_frames(node);
 326		break;
 327
 328	case EFC_EVT_EXIT:
 329		efc_node_accept_frames(node);
 330		break;
 331
 332	case EFC_EVT_DOMAIN_ATTACH_OK: {
 333		/* send PLOGI automatically if initiator */
 334		efc_node_init_device(node, true);
 335		break;
 336	}
 337	default:
 338		__efc_d_common(__func__, ctx, evt, arg);
 339	}
 340}
 341
 342void
 343efc_send_ls_acc_after_attach(struct efc_node *node,
 344			     struct fc_frame_header *hdr,
 345			     enum efc_node_send_ls_acc ls)
 346{
 347	u16 ox_id = be16_to_cpu(hdr->fh_ox_id);
 348
 349	/* Save the OX_ID for sending LS_ACC sometime later */
 350	WARN_ON(node->send_ls_acc != EFC_NODE_SEND_LS_ACC_NONE);
 351
 352	node->ls_acc_oxid = ox_id;
 353	node->send_ls_acc = ls;
 354	node->ls_acc_did = ntoh24(hdr->fh_d_id);
 355}
 356
 357void
 358efc_process_prli_payload(struct efc_node *node, void *prli)
 359{
 360	struct {
 361		struct fc_els_prli prli;
 362		struct fc_els_spp sp;
 363	} *pp;
 364
 365	pp = prli;
 366	node->init = (pp->sp.spp_flags & FCP_SPPF_INIT_FCN) != 0;
 367	node->targ = (pp->sp.spp_flags & FCP_SPPF_TARG_FCN) != 0;
 368}
 369
 370void
 371__efc_d_wait_plogi_acc_cmpl(struct efc_sm_ctx *ctx,
 372			    enum efc_sm_event evt, void *arg)
 373{
 374	struct efc_node *node = ctx->app;
 375
 376	efc_node_evt_set(ctx, evt, __func__);
 377
 378	node_sm_trace();
 379
 380	switch (evt) {
 381	case EFC_EVT_ENTER:
 382		efc_node_hold_frames(node);
 383		break;
 384
 385	case EFC_EVT_EXIT:
 386		efc_node_accept_frames(node);
 387		break;
 388
 389	case EFC_EVT_SRRS_ELS_CMPL_FAIL:
 390		WARN_ON(!node->els_cmpl_cnt);
 391		node->els_cmpl_cnt--;
 392		node->shutdown_reason = EFC_NODE_SHUTDOWN_DEFAULT;
 393		efc_node_transition(node, __efc_d_initiate_shutdown, NULL);
 394		break;
 395
 396	case EFC_EVT_SRRS_ELS_CMPL_OK:	/* PLOGI ACC completions */
 397		WARN_ON(!node->els_cmpl_cnt);
 398		node->els_cmpl_cnt--;
 399		efc_node_transition(node, __efc_d_port_logged_in, NULL);
 400		break;
 401
 402	default:
 403		__efc_d_common(__func__, ctx, evt, arg);
 404	}
 405}
 406
 407void
 408__efc_d_wait_logo_rsp(struct efc_sm_ctx *ctx,
 409		      enum efc_sm_event evt, void *arg)
 410{
 411	struct efc_node *node = ctx->app;
 412
 413	efc_node_evt_set(ctx, evt, __func__);
 414
 415	node_sm_trace();
 416
 417	switch (evt) {
 418	case EFC_EVT_ENTER:
 419		efc_node_hold_frames(node);
 420		break;
 421
 422	case EFC_EVT_EXIT:
 423		efc_node_accept_frames(node);
 424		break;
 425
 426	case EFC_EVT_SRRS_ELS_REQ_OK:
 427	case EFC_EVT_SRRS_ELS_REQ_RJT:
 428	case EFC_EVT_SRRS_ELS_REQ_FAIL:
 429		/* LOGO response received, sent shutdown */
 430		if (efc_node_check_els_req(ctx, evt, arg, ELS_LOGO,
 431					   __efc_d_common, __func__))
 432			return;
 433
 434		WARN_ON(!node->els_req_cnt);
 435		node->els_req_cnt--;
 436		node_printf(node,
 437			    "LOGO sent (evt=%s), shutdown node\n",
 438			efc_sm_event_name(evt));
 439		/* sm: / post explicit logout */
 440		efc_node_post_event(node, EFC_EVT_SHUTDOWN_EXPLICIT_LOGO,
 441				    NULL);
 442		break;
 443
 444	default:
 445		__efc_d_common(__func__, ctx, evt, arg);
 446	}
 447}
 448
 449void
 450efc_node_init_device(struct efc_node *node, bool send_plogi)
 451{
 452	node->send_plogi = send_plogi;
 453	if ((node->efc->nodedb_mask & EFC_NODEDB_PAUSE_NEW_NODES) &&
 454	    (node->rnode.fc_id != FC_FID_DOM_MGR)) {
 455		node->nodedb_state = __efc_d_init;
 456		efc_node_transition(node, __efc_node_paused, NULL);
 457	} else {
 458		efc_node_transition(node, __efc_d_init, NULL);
 459	}
 460}
 461
 462static void
 463efc_d_check_plogi_topology(struct efc_node *node, u32 d_id)
 464{
 465	switch (node->nport->topology) {
 466	case EFC_NPORT_TOPO_P2P:
 467		/* we're not attached and nport is p2p,
 468		 * need to attach
 469		 */
 470		efc_domain_attach(node->nport->domain, d_id);
 471		efc_node_transition(node, __efc_d_wait_domain_attach, NULL);
 472		break;
 473	case EFC_NPORT_TOPO_FABRIC:
 474		/* we're not attached and nport is fabric, domain
 475		 * attach should have already been requested as part
 476		 * of the fabric state machine, wait for it
 477		 */
 478		efc_node_transition(node, __efc_d_wait_domain_attach, NULL);
 479		break;
 480	case EFC_NPORT_TOPO_UNKNOWN:
 481		/* Two possibilities:
 482		 * 1. received a PLOGI before our FLOGI has completed
 483		 *    (possible since completion comes in on another
 484		 *    CQ), thus we don't know what we're connected to
 485		 *    yet; transition to a state to wait for the
 486		 *    fabric node to tell us;
 487		 * 2. PLOGI received before link went down and we
 488		 * haven't performed domain attach yet.
 489		 * Note: we cannot distinguish between 1. and 2.
 490		 * so have to assume PLOGI
 491		 * was received after link back up.
 492		 */
 493		node_printf(node, "received PLOGI, unknown topology did=0x%x\n",
 494			    d_id);
 495		efc_node_transition(node, __efc_d_wait_topology_notify, NULL);
 496		break;
 497	default:
 498		node_printf(node, "received PLOGI, unexpected topology %d\n",
 499			    node->nport->topology);
 500	}
 501}
 502
 503void
 504__efc_d_init(struct efc_sm_ctx *ctx, enum efc_sm_event evt, void *arg)
 505{
 506	struct efc_node_cb *cbdata = arg;
 507	struct efc_node *node = ctx->app;
 508
 509	efc_node_evt_set(ctx, evt, __func__);
 510
 511	node_sm_trace();
 512
 513	/*
 514	 * This state is entered when a node is instantiated,
 515	 * either having been discovered from a name services query,
 516	 * or having received a PLOGI/FLOGI.
 517	 */
 518	switch (evt) {
 519	case EFC_EVT_ENTER:
 520		if (!node->send_plogi)
 521			break;
 522		/* only send if we have initiator capability,
 523		 * and domain is attached
 524		 */
 525		if (node->nport->enable_ini &&
 526		    node->nport->domain->attached) {
 527			efc_send_plogi(node);
 528
 529			efc_node_transition(node, __efc_d_wait_plogi_rsp, NULL);
 530		} else {
 531			node_printf(node, "not sending plogi nport.ini=%d,",
 532				    node->nport->enable_ini);
 533			node_printf(node, "domain attached=%d\n",
 534				    node->nport->domain->attached);
 535		}
 536		break;
 537	case EFC_EVT_PLOGI_RCVD: {
 538		/* T, or I+T */
 539		struct fc_frame_header *hdr = cbdata->header->dma.virt;
 540		int rc;
 541
 542		efc_node_save_sparms(node, cbdata->payload->dma.virt);
 543		efc_send_ls_acc_after_attach(node,
 544					     cbdata->header->dma.virt,
 545					     EFC_NODE_SEND_LS_ACC_PLOGI);
 546
 547		/* domain not attached; several possibilities: */
 548		if (!node->nport->domain->attached) {
 549			efc_d_check_plogi_topology(node, ntoh24(hdr->fh_d_id));
 550			break;
 551		}
 552
 553		/* domain already attached */
 554		rc = efc_node_attach(node);
 555		efc_node_transition(node, __efc_d_wait_node_attach, NULL);
 556		if (rc < 0)
 557			efc_node_post_event(node, EFC_EVT_NODE_ATTACH_FAIL, NULL);
 558
 559		break;
 560	}
 561
 562	case EFC_EVT_FDISC_RCVD: {
 563		__efc_d_common(__func__, ctx, evt, arg);
 564		break;
 565	}
 566
 567	case EFC_EVT_FLOGI_RCVD: {
 568		struct fc_frame_header *hdr = cbdata->header->dma.virt;
 569		u32 d_id = ntoh24(hdr->fh_d_id);
 570
 571		/* sm: / save sparams, send FLOGI acc */
 572		memcpy(node->nport->domain->flogi_service_params,
 573		       cbdata->payload->dma.virt,
 574		       sizeof(struct fc_els_flogi));
 575
 576		/* send FC LS_ACC response, override s_id */
 577		efc_fabric_set_topology(node, EFC_NPORT_TOPO_P2P);
 578
 579		efc_send_flogi_p2p_acc(node, be16_to_cpu(hdr->fh_ox_id), d_id);
 580
 581		if (efc_p2p_setup(node->nport)) {
 582			node_printf(node, "p2p failed, shutting down node\n");
 583			efc_node_post_event(node, EFC_EVT_SHUTDOWN, NULL);
 584			break;
 585		}
 586
 587		efc_node_transition(node,  __efc_p2p_wait_flogi_acc_cmpl, NULL);
 588		break;
 589	}
 590
 591	case EFC_EVT_LOGO_RCVD: {
 592		struct fc_frame_header *hdr = cbdata->header->dma.virt;
 593
 594		if (!node->nport->domain->attached) {
 595			/* most likely a frame left over from before a link
 596			 * down; drop and
 597			 * shut node down w/ "explicit logout" so pending
 598			 * frames are processed
 599			 */
 600			node_printf(node, "%s domain not attached, dropping\n",
 601				    efc_sm_event_name(evt));
 602			efc_node_post_event(node,
 603					EFC_EVT_SHUTDOWN_EXPLICIT_LOGO, NULL);
 604			break;
 605		}
 606
 607		efc_send_logo_acc(node, be16_to_cpu(hdr->fh_ox_id));
 608		efc_node_transition(node, __efc_d_wait_logo_acc_cmpl, NULL);
 609		break;
 610	}
 611
 612	case EFC_EVT_PRLI_RCVD:
 613	case EFC_EVT_PRLO_RCVD:
 614	case EFC_EVT_PDISC_RCVD:
 615	case EFC_EVT_ADISC_RCVD:
 616	case EFC_EVT_RSCN_RCVD: {
 617		struct fc_frame_header *hdr = cbdata->header->dma.virt;
 618
 619		if (!node->nport->domain->attached) {
 620			/* most likely a frame left over from before a link
 621			 * down; drop and shut node down w/ "explicit logout"
 622			 * so pending frames are processed
 623			 */
 624			node_printf(node, "%s domain not attached, dropping\n",
 625				    efc_sm_event_name(evt));
 626
 627			efc_node_post_event(node,
 628					    EFC_EVT_SHUTDOWN_EXPLICIT_LOGO,
 629					    NULL);
 630			break;
 631		}
 632		node_printf(node, "%s received, sending reject\n",
 633			    efc_sm_event_name(evt));
 634
 635		efc_send_ls_rjt(node, be16_to_cpu(hdr->fh_ox_id),
 636				ELS_RJT_UNAB, ELS_EXPL_PLOGI_REQD, 0);
 637
 638		break;
 639	}
 640
 641	case EFC_EVT_FCP_CMD_RCVD: {
 642		/* note: problem, we're now expecting an ELS REQ completion
 643		 * from both the LOGO and PLOGI
 644		 */
 645		if (!node->nport->domain->attached) {
 646			/* most likely a frame left over from before a
 647			 * link down; drop and
 648			 * shut node down w/ "explicit logout" so pending
 649			 * frames are processed
 650			 */
 651			node_printf(node, "%s domain not attached, dropping\n",
 652				    efc_sm_event_name(evt));
 653			efc_node_post_event(node,
 654					    EFC_EVT_SHUTDOWN_EXPLICIT_LOGO,
 655					    NULL);
 656			break;
 657		}
 658
 659		/* Send LOGO */
 660		node_printf(node, "FCP_CMND received, send LOGO\n");
 661		if (efc_send_logo(node)) {
 662			/*
 663			 * failed to send LOGO, go ahead and cleanup node
 664			 * anyways
 665			 */
 666			node_printf(node, "Failed to send LOGO\n");
 667			efc_node_post_event(node,
 668					    EFC_EVT_SHUTDOWN_EXPLICIT_LOGO,
 669					    NULL);
 670		} else {
 671			/* sent LOGO, wait for response */
 672			efc_node_transition(node,
 673					    __efc_d_wait_logo_rsp, NULL);
 674		}
 675		break;
 676	}
 677	case EFC_EVT_DOMAIN_ATTACH_OK:
 678		/* don't care about domain_attach_ok */
 679		break;
 680
 681	default:
 682		__efc_d_common(__func__, ctx, evt, arg);
 683	}
 684}
 685
 686void
 687__efc_d_wait_plogi_rsp(struct efc_sm_ctx *ctx,
 688		       enum efc_sm_event evt, void *arg)
 689{
 690	int rc;
 691	struct efc_node_cb *cbdata = arg;
 692	struct efc_node *node = ctx->app;
 693
 694	efc_node_evt_set(ctx, evt, __func__);
 695
 696	node_sm_trace();
 697
 698	switch (evt) {
 699	case EFC_EVT_PLOGI_RCVD: {
 700		/* T, or I+T */
 701		/* received PLOGI with svc parms, go ahead and attach node
 702		 * when PLOGI that was sent ultimately completes, it'll be a
 703		 * no-op
 704		 *
 705		 * If there is an outstanding PLOGI sent, can we set a flag
 706		 * to indicate that we don't want to retry it if it times out?
 707		 */
 708		efc_node_save_sparms(node, cbdata->payload->dma.virt);
 709		efc_send_ls_acc_after_attach(node,
 710					     cbdata->header->dma.virt,
 711				EFC_NODE_SEND_LS_ACC_PLOGI);
 712		/* sm: domain->attached / efc_node_attach */
 713		rc = efc_node_attach(node);
 714		efc_node_transition(node, __efc_d_wait_node_attach, NULL);
 715		if (rc < 0)
 716			efc_node_post_event(node,
 717					    EFC_EVT_NODE_ATTACH_FAIL, NULL);
 718
 719		break;
 720	}
 721
 722	case EFC_EVT_PRLI_RCVD:
 723		/* I, or I+T */
 724		/* sent PLOGI and before completion was seen, received the
 725		 * PRLI from the remote node (WCQEs and RCQEs come in on
 726		 * different queues and order of processing cannot be assumed)
 727		 * Save OXID so PRLI can be sent after the attach and continue
 728		 * to wait for PLOGI response
 729		 */
 730		efc_process_prli_payload(node, cbdata->payload->dma.virt);
 731		efc_send_ls_acc_after_attach(node,
 732					     cbdata->header->dma.virt,
 733				EFC_NODE_SEND_LS_ACC_PRLI);
 734		efc_node_transition(node, __efc_d_wait_plogi_rsp_recvd_prli,
 735				    NULL);
 736		break;
 737
 738	case EFC_EVT_LOGO_RCVD: /* why don't we do a shutdown here?? */
 739	case EFC_EVT_PRLO_RCVD:
 740	case EFC_EVT_PDISC_RCVD:
 741	case EFC_EVT_FDISC_RCVD:
 742	case EFC_EVT_ADISC_RCVD:
 743	case EFC_EVT_RSCN_RCVD:
 744	case EFC_EVT_SCR_RCVD: {
 745		struct fc_frame_header *hdr = cbdata->header->dma.virt;
 746
 747		node_printf(node, "%s received, sending reject\n",
 748			    efc_sm_event_name(evt));
 749
 750		efc_send_ls_rjt(node, be16_to_cpu(hdr->fh_ox_id),
 751				ELS_RJT_UNAB, ELS_EXPL_PLOGI_REQD, 0);
 752
 753		break;
 754	}
 755
 756	case EFC_EVT_SRRS_ELS_REQ_OK:	/* PLOGI response received */
 757		/* Completion from PLOGI sent */
 758		if (efc_node_check_els_req(ctx, evt, arg, ELS_PLOGI,
 759					   __efc_d_common, __func__))
 760			return;
 761
 762		WARN_ON(!node->els_req_cnt);
 763		node->els_req_cnt--;
 764		/* sm: / save sparams, efc_node_attach */
 765		efc_node_save_sparms(node, cbdata->els_rsp.virt);
 766		rc = efc_node_attach(node);
 767		efc_node_transition(node, __efc_d_wait_node_attach, NULL);
 768		if (rc < 0)
 769			efc_node_post_event(node,
 770					    EFC_EVT_NODE_ATTACH_FAIL, NULL);
 771
 772		break;
 773
 774	case EFC_EVT_SRRS_ELS_REQ_FAIL:	/* PLOGI response received */
 775		/* PLOGI failed, shutdown the node */
 776		if (efc_node_check_els_req(ctx, evt, arg, ELS_PLOGI,
 777					   __efc_d_common, __func__))
 778			return;
 779
 780		WARN_ON(!node->els_req_cnt);
 781		node->els_req_cnt--;
 782		efc_node_post_event(node, EFC_EVT_SHUTDOWN, NULL);
 783		break;
 784
 785	case EFC_EVT_SRRS_ELS_REQ_RJT:
 786		/* Our PLOGI was rejected, this is ok in some cases */
 787		if (efc_node_check_els_req(ctx, evt, arg, ELS_PLOGI,
 788					   __efc_d_common, __func__))
 789			return;
 790
 791		WARN_ON(!node->els_req_cnt);
 792		node->els_req_cnt--;
 793		break;
 794
 795	case EFC_EVT_FCP_CMD_RCVD: {
 796		/* not logged in yet and outstanding PLOGI so don't send LOGO,
 797		 * just drop
 798		 */
 799		node_printf(node, "FCP_CMND received, drop\n");
 800		break;
 801	}
 802
 803	default:
 804		__efc_d_common(__func__, ctx, evt, arg);
 805	}
 806}
 807
 808void
 809__efc_d_wait_plogi_rsp_recvd_prli(struct efc_sm_ctx *ctx,
 810				  enum efc_sm_event evt, void *arg)
 811{
 812	int rc;
 813	struct efc_node_cb *cbdata = arg;
 814	struct efc_node *node = ctx->app;
 815
 816	efc_node_evt_set(ctx, evt, __func__);
 817
 818	node_sm_trace();
 819
 820	switch (evt) {
 821	case EFC_EVT_ENTER:
 822		/*
 823		 * Since we've received a PRLI, we have a port login and will
 824		 * just need to wait for the PLOGI response to do the node
 825		 * attach and then we can send the LS_ACC for the PRLI. If,
 826		 * during this time, we receive FCP_CMNDs (which is possible
 827		 * since we've already sent a PRLI and our peer may have
 828		 * accepted). At this time, we are not waiting on any other
 829		 * unsolicited frames to continue with the login process. Thus,
 830		 * it will not hurt to hold frames here.
 831		 */
 832		efc_node_hold_frames(node);
 833		break;
 834
 835	case EFC_EVT_EXIT:
 836		efc_node_accept_frames(node);
 837		break;
 838
 839	case EFC_EVT_SRRS_ELS_REQ_OK:	/* PLOGI response received */
 840		/* Completion from PLOGI sent */
 841		if (efc_node_check_els_req(ctx, evt, arg, ELS_PLOGI,
 842					   __efc_d_common, __func__))
 843			return;
 844
 845		WARN_ON(!node->els_req_cnt);
 846		node->els_req_cnt--;
 847		/* sm: / save sparams, efc_node_attach */
 848		efc_node_save_sparms(node, cbdata->els_rsp.virt);
 849		rc = efc_node_attach(node);
 850		efc_node_transition(node, __efc_d_wait_node_attach, NULL);
 851		if (rc < 0)
 852			efc_node_post_event(node, EFC_EVT_NODE_ATTACH_FAIL,
 853					    NULL);
 854
 855		break;
 856
 857	case EFC_EVT_SRRS_ELS_REQ_FAIL:	/* PLOGI response received */
 858	case EFC_EVT_SRRS_ELS_REQ_RJT:
 859		/* PLOGI failed, shutdown the node */
 860		if (efc_node_check_els_req(ctx, evt, arg, ELS_PLOGI,
 861					   __efc_d_common, __func__))
 862			return;
 863
 864		WARN_ON(!node->els_req_cnt);
 865		node->els_req_cnt--;
 866		efc_node_post_event(node, EFC_EVT_SHUTDOWN, NULL);
 867		break;
 868
 869	default:
 870		__efc_d_common(__func__, ctx, evt, arg);
 871	}
 872}
 873
 874void
 875__efc_d_wait_domain_attach(struct efc_sm_ctx *ctx,
 876			   enum efc_sm_event evt, void *arg)
 877{
 878	int rc;
 879	struct efc_node *node = ctx->app;
 880
 881	efc_node_evt_set(ctx, evt, __func__);
 882
 883	node_sm_trace();
 884
 885	switch (evt) {
 886	case EFC_EVT_ENTER:
 887		efc_node_hold_frames(node);
 888		break;
 889
 890	case EFC_EVT_EXIT:
 891		efc_node_accept_frames(node);
 892		break;
 893
 894	case EFC_EVT_DOMAIN_ATTACH_OK:
 895		WARN_ON(!node->nport->domain->attached);
 896		/* sm: / efc_node_attach */
 897		rc = efc_node_attach(node);
 898		efc_node_transition(node, __efc_d_wait_node_attach, NULL);
 899		if (rc < 0)
 900			efc_node_post_event(node, EFC_EVT_NODE_ATTACH_FAIL,
 901					    NULL);
 902
 903		break;
 904
 905	default:
 906		__efc_d_common(__func__, ctx, evt, arg);
 907	}
 908}
 909
 910void
 911__efc_d_wait_topology_notify(struct efc_sm_ctx *ctx,
 912			     enum efc_sm_event evt, void *arg)
 913{
 914	int rc;
 915	struct efc_node *node = ctx->app;
 916
 917	efc_node_evt_set(ctx, evt, __func__);
 918
 919	node_sm_trace();
 920
 921	switch (evt) {
 922	case EFC_EVT_ENTER:
 923		efc_node_hold_frames(node);
 924		break;
 925
 926	case EFC_EVT_EXIT:
 927		efc_node_accept_frames(node);
 928		break;
 929
 930	case EFC_EVT_NPORT_TOPOLOGY_NOTIFY: {
 931		enum efc_nport_topology *topology = arg;
 932
 933		WARN_ON(node->nport->domain->attached);
 934
 935		WARN_ON(node->send_ls_acc != EFC_NODE_SEND_LS_ACC_PLOGI);
 936
 937		node_printf(node, "topology notification, topology=%d\n",
 938			    *topology);
 939
 940		/* At the time the PLOGI was received, the topology was unknown,
 941		 * so we didn't know which node would perform the domain attach:
 942		 * 1. The node from which the PLOGI was sent (p2p) or
 943		 * 2. The node to which the FLOGI was sent (fabric).
 944		 */
 945		if (*topology == EFC_NPORT_TOPO_P2P) {
 946			/* if this is p2p, need to attach to the domain using
 947			 * the d_id from the PLOGI received
 948			 */
 949			efc_domain_attach(node->nport->domain,
 950					  node->ls_acc_did);
 951		}
 952		/* else, if this is fabric, the domain attach
 953		 * should be performed by the fabric node (node sending FLOGI);
 954		 * just wait for attach to complete
 955		 */
 956
 957		efc_node_transition(node, __efc_d_wait_domain_attach, NULL);
 958		break;
 959	}
 960	case EFC_EVT_DOMAIN_ATTACH_OK:
 961		WARN_ON(!node->nport->domain->attached);
 962		node_printf(node, "domain attach ok\n");
 963		/* sm: / efc_node_attach */
 964		rc = efc_node_attach(node);
 965		efc_node_transition(node, __efc_d_wait_node_attach, NULL);
 966		if (rc < 0)
 967			efc_node_post_event(node,
 968					    EFC_EVT_NODE_ATTACH_FAIL, NULL);
 969
 970		break;
 971
 972	default:
 973		__efc_d_common(__func__, ctx, evt, arg);
 974	}
 975}
 976
 977void
 978__efc_d_wait_node_attach(struct efc_sm_ctx *ctx,
 979			 enum efc_sm_event evt, void *arg)
 980{
 981	struct efc_node *node = ctx->app;
 982
 983	efc_node_evt_set(ctx, evt, __func__);
 984
 985	node_sm_trace();
 986
 987	switch (evt) {
 988	case EFC_EVT_ENTER:
 989		efc_node_hold_frames(node);
 990		break;
 991
 992	case EFC_EVT_EXIT:
 993		efc_node_accept_frames(node);
 994		break;
 995
 996	case EFC_EVT_NODE_ATTACH_OK:
 997		node->attached = true;
 998		switch (node->send_ls_acc) {
 999		case EFC_NODE_SEND_LS_ACC_PLOGI: {
1000			/* sm: send_plogi_acc is set / send PLOGI acc */
1001			/* Normal case for T, or I+T */
1002			efc_send_plogi_acc(node, node->ls_acc_oxid);
1003			efc_node_transition(node, __efc_d_wait_plogi_acc_cmpl,
1004					    NULL);
1005			node->send_ls_acc = EFC_NODE_SEND_LS_ACC_NONE;
1006			node->ls_acc_io = NULL;
1007			break;
1008		}
1009		case EFC_NODE_SEND_LS_ACC_PRLI: {
1010			efc_d_send_prli_rsp(node, node->ls_acc_oxid);
1011			node->send_ls_acc = EFC_NODE_SEND_LS_ACC_NONE;
1012			node->ls_acc_io = NULL;
1013			break;
1014		}
1015		case EFC_NODE_SEND_LS_ACC_NONE:
1016		default:
1017			/* Normal case for I */
1018			/* sm: send_plogi_acc is not set / send PLOGI acc */
1019			efc_node_transition(node,
1020					    __efc_d_port_logged_in, NULL);
1021			break;
1022		}
1023		break;
1024
1025	case EFC_EVT_NODE_ATTACH_FAIL:
1026		/* node attach failed, shutdown the node */
1027		node->attached = false;
1028		node_printf(node, "node attach failed\n");
1029		node->shutdown_reason = EFC_NODE_SHUTDOWN_DEFAULT;
1030		efc_node_transition(node, __efc_d_initiate_shutdown, NULL);
1031		break;
1032
1033	/* Handle shutdown events */
1034	case EFC_EVT_SHUTDOWN:
1035		node_printf(node, "%s received\n", efc_sm_event_name(evt));
1036		node->shutdown_reason = EFC_NODE_SHUTDOWN_DEFAULT;
1037		efc_node_transition(node, __efc_d_wait_attach_evt_shutdown,
1038				    NULL);
1039		break;
1040	case EFC_EVT_SHUTDOWN_EXPLICIT_LOGO:
1041		node_printf(node, "%s received\n", efc_sm_event_name(evt));
1042		node->shutdown_reason = EFC_NODE_SHUTDOWN_EXPLICIT_LOGO;
1043		efc_node_transition(node, __efc_d_wait_attach_evt_shutdown,
1044				    NULL);
1045		break;
1046	case EFC_EVT_SHUTDOWN_IMPLICIT_LOGO:
1047		node_printf(node, "%s received\n", efc_sm_event_name(evt));
1048		node->shutdown_reason = EFC_NODE_SHUTDOWN_IMPLICIT_LOGO;
1049		efc_node_transition(node,
1050				    __efc_d_wait_attach_evt_shutdown, NULL);
1051		break;
1052	default:
1053		__efc_d_common(__func__, ctx, evt, arg);
1054	}
1055}
1056
1057void
1058__efc_d_wait_attach_evt_shutdown(struct efc_sm_ctx *ctx,
1059				 enum efc_sm_event evt, void *arg)
1060{
1061	struct efc_node *node = ctx->app;
1062
1063	efc_node_evt_set(ctx, evt, __func__);
1064
1065	node_sm_trace();
1066
1067	switch (evt) {
1068	case EFC_EVT_ENTER:
1069		efc_node_hold_frames(node);
1070		break;
1071
1072	case EFC_EVT_EXIT:
1073		efc_node_accept_frames(node);
1074		break;
1075
1076	/* wait for any of these attach events and then shutdown */
1077	case EFC_EVT_NODE_ATTACH_OK:
1078		node->attached = true;
1079		node_printf(node, "Attach evt=%s, proceed to shutdown\n",
1080			    efc_sm_event_name(evt));
1081		efc_node_transition(node, __efc_d_initiate_shutdown, NULL);
1082		break;
1083
1084	case EFC_EVT_NODE_ATTACH_FAIL:
1085		/* node attach failed, shutdown the node */
1086		node->attached = false;
1087		node_printf(node, "Attach evt=%s, proceed to shutdown\n",
1088			    efc_sm_event_name(evt));
1089		efc_node_transition(node, __efc_d_initiate_shutdown, NULL);
1090		break;
1091
1092	/* ignore shutdown events as we're already in shutdown path */
1093	case EFC_EVT_SHUTDOWN:
1094		/* have default shutdown event take precedence */
1095		node->shutdown_reason = EFC_NODE_SHUTDOWN_DEFAULT;
1096		fallthrough;
1097
1098	case EFC_EVT_SHUTDOWN_EXPLICIT_LOGO:
1099	case EFC_EVT_SHUTDOWN_IMPLICIT_LOGO:
1100		node_printf(node, "%s received\n", efc_sm_event_name(evt));
1101		break;
1102
1103	default:
1104		__efc_d_common(__func__, ctx, evt, arg);
1105	}
1106}
1107
1108void
1109__efc_d_port_logged_in(struct efc_sm_ctx *ctx,
1110		       enum efc_sm_event evt, void *arg)
1111{
1112	struct efc_node_cb *cbdata = arg;
1113	struct efc_node *node = ctx->app;
1114
1115	efc_node_evt_set(ctx, evt, __func__);
1116
1117	node_sm_trace();
1118
1119	switch (evt) {
1120	case EFC_EVT_ENTER:
1121		/* Normal case for I or I+T */
1122		if (node->nport->enable_ini &&
1123		    !(node->rnode.fc_id != FC_FID_DOM_MGR)) {
1124			/* sm: if enable_ini / send PRLI */
1125			efc_send_prli(node);
1126			/* can now expect ELS_REQ_OK/FAIL/RJT */
1127		}
1128		break;
1129
1130	case EFC_EVT_FCP_CMD_RCVD: {
1131		break;
1132	}
1133
1134	case EFC_EVT_PRLI_RCVD: {
1135		/* Normal case for T or I+T */
1136		struct fc_frame_header *hdr = cbdata->header->dma.virt;
1137		struct {
1138			struct fc_els_prli prli;
1139			struct fc_els_spp sp;
1140		} *pp;
1141
1142		pp = cbdata->payload->dma.virt;
1143		if (pp->sp.spp_type != FC_TYPE_FCP) {
1144			/*Only FCP is supported*/
1145			efc_send_ls_rjt(node, be16_to_cpu(hdr->fh_ox_id),
1146					ELS_RJT_UNAB, ELS_EXPL_UNSUPR, 0);
1147			break;
1148		}
1149
1150		efc_process_prli_payload(node, cbdata->payload->dma.virt);
1151		efc_d_send_prli_rsp(node, be16_to_cpu(hdr->fh_ox_id));
1152		break;
1153	}
1154
1155	case EFC_EVT_NODE_SESS_REG_OK:
1156		if (node->send_ls_acc == EFC_NODE_SEND_LS_ACC_PRLI)
1157			efc_send_prli_acc(node, node->ls_acc_oxid);
1158
1159		node->send_ls_acc = EFC_NODE_SEND_LS_ACC_NONE;
1160		efc_node_transition(node, __efc_d_device_ready, NULL);
1161		break;
1162
1163	case EFC_EVT_NODE_SESS_REG_FAIL:
1164		efc_send_ls_rjt(node, node->ls_acc_oxid, ELS_RJT_UNAB,
1165				ELS_EXPL_UNSUPR, 0);
1166		node->send_ls_acc = EFC_NODE_SEND_LS_ACC_NONE;
1167		break;
1168
1169	case EFC_EVT_SRRS_ELS_REQ_OK: {	/* PRLI response */
1170		/* Normal case for I or I+T */
1171		if (efc_node_check_els_req(ctx, evt, arg, ELS_PRLI,
1172					   __efc_d_common, __func__))
1173			return;
1174
1175		WARN_ON(!node->els_req_cnt);
1176		node->els_req_cnt--;
1177		/* sm: / process PRLI payload */
1178		efc_process_prli_payload(node, cbdata->els_rsp.virt);
1179		efc_node_transition(node, __efc_d_device_ready, NULL);
1180		break;
1181	}
1182
1183	case EFC_EVT_SRRS_ELS_REQ_FAIL: {	/* PRLI response failed */
1184		/* I, I+T, assume some link failure, shutdown node */
1185		if (efc_node_check_els_req(ctx, evt, arg, ELS_PRLI,
1186					   __efc_d_common, __func__))
1187			return;
1188
1189		WARN_ON(!node->els_req_cnt);
1190		node->els_req_cnt--;
1191		efc_node_post_event(node, EFC_EVT_SHUTDOWN, NULL);
1192		break;
1193	}
1194
1195	case EFC_EVT_SRRS_ELS_REQ_RJT: {
1196		/* PRLI rejected by remote
1197		 * Normal for I, I+T (connected to an I)
1198		 * Node doesn't want to be a target, stay here and wait for a
1199		 * PRLI from the remote node
1200		 * if it really wants to connect to us as target
1201		 */
1202		if (efc_node_check_els_req(ctx, evt, arg, ELS_PRLI,
1203					   __efc_d_common, __func__))
1204			return;
1205
1206		WARN_ON(!node->els_req_cnt);
1207		node->els_req_cnt--;
1208		break;
1209	}
1210
1211	case EFC_EVT_SRRS_ELS_CMPL_OK: {
1212		/* Normal T, I+T, target-server rejected the process login */
1213		/* This would be received only in the case where we sent
1214		 * LS_RJT for the PRLI, so
1215		 * do nothing.   (note: as T only we could shutdown the node)
1216		 */
1217		WARN_ON(!node->els_cmpl_cnt);
1218		node->els_cmpl_cnt--;
1219		break;
1220	}
1221
1222	case EFC_EVT_PLOGI_RCVD: {
1223		/*sm: / save sparams, set send_plogi_acc,
1224		 *post implicit logout
1225		 * Save plogi parameters
1226		 */
1227		efc_node_save_sparms(node, cbdata->payload->dma.virt);
1228		efc_send_ls_acc_after_attach(node,
1229					     cbdata->header->dma.virt,
1230				EFC_NODE_SEND_LS_ACC_PLOGI);
1231
1232		/* Restart node attach with new service parameters,
1233		 * and send ACC
1234		 */
1235		efc_node_post_event(node, EFC_EVT_SHUTDOWN_IMPLICIT_LOGO,
1236				    NULL);
1237		break;
1238	}
1239
1240	case EFC_EVT_LOGO_RCVD: {
1241		/* I, T, I+T */
1242		struct fc_frame_header *hdr = cbdata->header->dma.virt;
1243
1244		node_printf(node, "%s received attached=%d\n",
1245			    efc_sm_event_name(evt),
1246					node->attached);
1247		/* sm: / send LOGO acc */
1248		efc_send_logo_acc(node, be16_to_cpu(hdr->fh_ox_id));
1249		efc_node_transition(node, __efc_d_wait_logo_acc_cmpl, NULL);
1250		break;
1251	}
1252
1253	default:
1254		__efc_d_common(__func__, ctx, evt, arg);
1255	}
1256}
1257
1258void
1259__efc_d_wait_logo_acc_cmpl(struct efc_sm_ctx *ctx,
1260			   enum efc_sm_event evt, void *arg)
1261{
1262	struct efc_node *node = ctx->app;
1263
1264	efc_node_evt_set(ctx, evt, __func__);
1265
1266	node_sm_trace();
1267
1268	switch (evt) {
1269	case EFC_EVT_ENTER:
1270		efc_node_hold_frames(node);
1271		break;
1272
1273	case EFC_EVT_EXIT:
1274		efc_node_accept_frames(node);
1275		break;
1276
1277	case EFC_EVT_SRRS_ELS_CMPL_OK:
1278	case EFC_EVT_SRRS_ELS_CMPL_FAIL:
1279		/* sm: / post explicit logout */
1280		WARN_ON(!node->els_cmpl_cnt);
1281		node->els_cmpl_cnt--;
1282		efc_node_post_event(node,
1283				    EFC_EVT_SHUTDOWN_EXPLICIT_LOGO, NULL);
1284		break;
1285	default:
1286		__efc_d_common(__func__, ctx, evt, arg);
1287	}
1288}
1289
1290void
1291__efc_d_device_ready(struct efc_sm_ctx *ctx,
1292		     enum efc_sm_event evt, void *arg)
1293{
1294	struct efc_node_cb *cbdata = arg;
1295	struct efc_node *node = ctx->app;
1296	struct efc *efc = node->efc;
1297
1298	efc_node_evt_set(ctx, evt, __func__);
1299
1300	if (evt != EFC_EVT_FCP_CMD_RCVD)
1301		node_sm_trace();
1302
1303	switch (evt) {
1304	case EFC_EVT_ENTER:
1305		node->fcp_enabled = true;
1306		if (node->targ) {
1307			efc_log_info(efc,
1308				     "[%s] found (target) WWPN %s WWNN %s\n",
1309				node->display_name,
1310				node->wwpn, node->wwnn);
1311			if (node->nport->enable_ini)
1312				efc->tt.scsi_new_node(efc, node);
1313		}
1314		break;
1315
1316	case EFC_EVT_EXIT:
1317		node->fcp_enabled = false;
1318		break;
1319
1320	case EFC_EVT_PLOGI_RCVD: {
1321		/* sm: / save sparams, set send_plogi_acc, post implicit
1322		 * logout
1323		 * Save plogi parameters
1324		 */
1325		efc_node_save_sparms(node, cbdata->payload->dma.virt);
1326		efc_send_ls_acc_after_attach(node,
1327					     cbdata->header->dma.virt,
1328				EFC_NODE_SEND_LS_ACC_PLOGI);
1329
1330		/*
1331		 * Restart node attach with new service parameters,
1332		 * and send ACC
1333		 */
1334		efc_node_post_event(node,
1335				    EFC_EVT_SHUTDOWN_IMPLICIT_LOGO, NULL);
1336		break;
1337	}
1338
1339	case EFC_EVT_PRLI_RCVD: {
1340		/* T, I+T: remote initiator is slow to get started */
1341		struct fc_frame_header *hdr = cbdata->header->dma.virt;
1342		struct {
1343			struct fc_els_prli prli;
1344			struct fc_els_spp sp;
1345		} *pp;
1346
1347		pp = cbdata->payload->dma.virt;
1348		if (pp->sp.spp_type != FC_TYPE_FCP) {
1349			/*Only FCP is supported*/
1350			efc_send_ls_rjt(node, be16_to_cpu(hdr->fh_ox_id),
1351					ELS_RJT_UNAB, ELS_EXPL_UNSUPR, 0);
1352			break;
1353		}
1354
1355		efc_process_prli_payload(node, cbdata->payload->dma.virt);
1356		efc_send_prli_acc(node, be16_to_cpu(hdr->fh_ox_id));
1357		break;
1358	}
1359
1360	case EFC_EVT_PRLO_RCVD: {
1361		struct fc_frame_header *hdr = cbdata->header->dma.virt;
1362		/* sm: / send PRLO acc */
1363		efc_send_prlo_acc(node, be16_to_cpu(hdr->fh_ox_id));
1364		/* need implicit logout? */
1365		break;
1366	}
1367
1368	case EFC_EVT_LOGO_RCVD: {
1369		struct fc_frame_header *hdr = cbdata->header->dma.virt;
1370
1371		node_printf(node, "%s received attached=%d\n",
1372			    efc_sm_event_name(evt), node->attached);
1373		/* sm: / send LOGO acc */
1374		efc_send_logo_acc(node, be16_to_cpu(hdr->fh_ox_id));
1375		efc_node_transition(node, __efc_d_wait_logo_acc_cmpl, NULL);
1376		break;
1377	}
1378
1379	case EFC_EVT_ADISC_RCVD: {
1380		struct fc_frame_header *hdr = cbdata->header->dma.virt;
1381		/* sm: / send ADISC acc */
1382		efc_send_adisc_acc(node, be16_to_cpu(hdr->fh_ox_id));
1383		break;
1384	}
1385
1386	case EFC_EVT_ABTS_RCVD:
1387		/* sm: / process ABTS */
1388		efc_log_err(efc, "Unexpected event:%s\n",
1389			    efc_sm_event_name(evt));
1390		break;
1391
1392	case EFC_EVT_NODE_ACTIVE_IO_LIST_EMPTY:
1393		break;
1394
1395	case EFC_EVT_NODE_REFOUND:
1396		break;
1397
1398	case EFC_EVT_NODE_MISSING:
1399		if (node->nport->enable_rscn)
1400			efc_node_transition(node, __efc_d_device_gone, NULL);
1401
1402		break;
1403
1404	case EFC_EVT_SRRS_ELS_CMPL_OK:
1405		/* T, or I+T, PRLI accept completed ok */
1406		WARN_ON(!node->els_cmpl_cnt);
1407		node->els_cmpl_cnt--;
1408		break;
1409
1410	case EFC_EVT_SRRS_ELS_CMPL_FAIL:
1411		/* T, or I+T, PRLI accept failed to complete */
1412		WARN_ON(!node->els_cmpl_cnt);
1413		node->els_cmpl_cnt--;
1414		node_printf(node, "Failed to send PRLI LS_ACC\n");
1415		break;
1416
1417	default:
1418		__efc_d_common(__func__, ctx, evt, arg);
1419	}
1420}
1421
1422void
1423__efc_d_device_gone(struct efc_sm_ctx *ctx,
1424		    enum efc_sm_event evt, void *arg)
1425{
1426	struct efc_node_cb *cbdata = arg;
1427	struct efc_node *node = ctx->app;
1428	struct efc *efc = node->efc;
1429
1430	efc_node_evt_set(ctx, evt, __func__);
1431
1432	node_sm_trace();
1433
1434	switch (evt) {
1435	case EFC_EVT_ENTER: {
1436		int rc = EFC_SCSI_CALL_COMPLETE;
1437		int rc_2 = EFC_SCSI_CALL_COMPLETE;
1438		static const char * const labels[] = {
1439			"none", "initiator", "target", "initiator+target"
1440		};
1441
1442		efc_log_info(efc, "[%s] missing (%s)    WWPN %s WWNN %s\n",
1443			     node->display_name,
1444				labels[(node->targ << 1) | (node->init)],
1445						node->wwpn, node->wwnn);
1446
1447		switch (efc_node_get_enable(node)) {
1448		case EFC_NODE_ENABLE_T_TO_T:
1449		case EFC_NODE_ENABLE_I_TO_T:
1450		case EFC_NODE_ENABLE_IT_TO_T:
1451			rc = efc->tt.scsi_del_node(efc, node,
1452				EFC_SCSI_TARGET_MISSING);
1453			break;
1454
1455		case EFC_NODE_ENABLE_T_TO_I:
1456		case EFC_NODE_ENABLE_I_TO_I:
1457		case EFC_NODE_ENABLE_IT_TO_I:
1458			rc = efc->tt.scsi_del_node(efc, node,
1459				EFC_SCSI_INITIATOR_MISSING);
1460			break;
1461
1462		case EFC_NODE_ENABLE_T_TO_IT:
1463			rc = efc->tt.scsi_del_node(efc, node,
1464				EFC_SCSI_INITIATOR_MISSING);
1465			break;
1466
1467		case EFC_NODE_ENABLE_I_TO_IT:
1468			rc = efc->tt.scsi_del_node(efc, node,
1469						  EFC_SCSI_TARGET_MISSING);
1470			break;
1471
1472		case EFC_NODE_ENABLE_IT_TO_IT:
1473			rc = efc->tt.scsi_del_node(efc, node,
1474				EFC_SCSI_INITIATOR_MISSING);
1475			rc_2 = efc->tt.scsi_del_node(efc, node,
1476				EFC_SCSI_TARGET_MISSING);
1477			break;
1478
1479		default:
1480			rc = EFC_SCSI_CALL_COMPLETE;
1481			break;
1482		}
1483
1484		if (rc == EFC_SCSI_CALL_COMPLETE &&
1485		    rc_2 == EFC_SCSI_CALL_COMPLETE)
1486			efc_node_post_event(node, EFC_EVT_SHUTDOWN, NULL);
1487
1488		break;
1489	}
1490	case EFC_EVT_NODE_REFOUND:
1491		/* two approaches, reauthenticate with PLOGI/PRLI, or ADISC */
1492
1493		/* reauthenticate with PLOGI/PRLI */
1494		/* efc_node_transition(node, __efc_d_discovered, NULL); */
1495
1496		/* reauthenticate with ADISC */
1497		/* sm: / send ADISC */
1498		efc_send_adisc(node);
1499		efc_node_transition(node, __efc_d_wait_adisc_rsp, NULL);
1500		break;
1501
1502	case EFC_EVT_PLOGI_RCVD: {
1503		/* sm: / save sparams, set send_plogi_acc, post implicit
1504		 * logout
1505		 * Save plogi parameters
1506		 */
1507		efc_node_save_sparms(node, cbdata->payload->dma.virt);
1508		efc_send_ls_acc_after_attach(node,
1509					     cbdata->header->dma.virt,
1510				EFC_NODE_SEND_LS_ACC_PLOGI);
1511
1512		/*
1513		 * Restart node attach with new service parameters, and send
1514		 * ACC
1515		 */
1516		efc_node_post_event(node, EFC_EVT_SHUTDOWN_IMPLICIT_LOGO,
1517				    NULL);
1518		break;
1519	}
1520
1521	case EFC_EVT_FCP_CMD_RCVD: {
1522		/* most likely a stale frame (received prior to link down),
1523		 * if attempt to send LOGO, will probably timeout and eat
1524		 * up 20s; thus, drop FCP_CMND
1525		 */
1526		node_printf(node, "FCP_CMND received, drop\n");
1527		break;
1528	}
1529	case EFC_EVT_LOGO_RCVD: {
1530		/* I, T, I+T */
1531		struct fc_frame_header *hdr = cbdata->header->dma.virt;
1532
1533		node_printf(node, "%s received attached=%d\n",
1534			    efc_sm_event_name(evt), node->attached);
1535		/* sm: / send LOGO acc */
1536		efc_send_logo_acc(node, be16_to_cpu(hdr->fh_ox_id));
1537		efc_node_transition(node, __efc_d_wait_logo_acc_cmpl, NULL);
1538		break;
1539	}
1540	default:
1541		__efc_d_common(__func__, ctx, evt, arg);
1542	}
1543}
1544
1545void
1546__efc_d_wait_adisc_rsp(struct efc_sm_ctx *ctx,
1547		       enum efc_sm_event evt, void *arg)
1548{
1549	struct efc_node_cb *cbdata = arg;
1550	struct efc_node *node = ctx->app;
1551
1552	efc_node_evt_set(ctx, evt, __func__);
1553
1554	node_sm_trace();
1555
1556	switch (evt) {
1557	case EFC_EVT_SRRS_ELS_REQ_OK:
1558		if (efc_node_check_els_req(ctx, evt, arg, ELS_ADISC,
1559					   __efc_d_common, __func__))
1560			return;
1561
1562		WARN_ON(!node->els_req_cnt);
1563		node->els_req_cnt--;
1564		efc_node_transition(node, __efc_d_device_ready, NULL);
1565		break;
1566
1567	case EFC_EVT_SRRS_ELS_REQ_RJT:
1568		/* received an LS_RJT, in this case, send shutdown
1569		 * (explicit logo) event which will unregister the node,
1570		 * and start over with PLOGI
1571		 */
1572		if (efc_node_check_els_req(ctx, evt, arg, ELS_ADISC,
1573					   __efc_d_common, __func__))
1574			return;
1575
1576		WARN_ON(!node->els_req_cnt);
1577		node->els_req_cnt--;
1578		/* sm: / post explicit logout */
1579		efc_node_post_event(node,
1580				    EFC_EVT_SHUTDOWN_EXPLICIT_LOGO,
1581				     NULL);
1582		break;
1583
1584	case EFC_EVT_LOGO_RCVD: {
1585		/* In this case, we have the equivalent of an LS_RJT for
1586		 * the ADISC, so we need to abort the ADISC, and re-login
1587		 * with PLOGI
1588		 */
1589		/* sm: / request abort, send LOGO acc */
1590		struct fc_frame_header *hdr = cbdata->header->dma.virt;
1591
1592		node_printf(node, "%s received attached=%d\n",
1593			    efc_sm_event_name(evt), node->attached);
1594
1595		efc_send_logo_acc(node, be16_to_cpu(hdr->fh_ox_id));
1596		efc_node_transition(node, __efc_d_wait_logo_acc_cmpl, NULL);
1597		break;
1598	}
1599	default:
1600		__efc_d_common(__func__, ctx, evt, arg);
1601	}
1602}
~/ Read-only file preview.