efc_device.c (41036B)
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}