forked from ~ljy/RK356X_SDK_RELEASE

hc
2023-12-09 95099d4622f8cb224d94e314c7a8e0df60b13f87
kernel/drivers/scsi/lpfc/lpfc_nportdisc.c
....@@ -1,7 +1,7 @@
11 /*******************************************************************
22 * This file is part of the Emulex Linux Device Driver for *
33 * Fibre Channel Host Bus Adapters. *
4
- * Copyright (C) 2017-2018 Broadcom. All Rights Reserved. The term *
4
+ * Copyright (C) 2017-2019 Broadcom. All Rights Reserved. The term *
55 * “Broadcom” refers to Broadcom Inc. and/or its subsidiaries. *
66 * Copyright (C) 2004-2016 Emulex. All rights reserved. *
77 * EMULEX and SLI are trademarks of Emulex. *
....@@ -31,8 +31,6 @@
3131 #include <scsi/scsi_host.h>
3232 #include <scsi/scsi_transport_fc.h>
3333 #include <scsi/fc/fc_fs.h>
34
-
35
-#include <linux/nvme-fc-driver.h>
3634
3735 #include "lpfc_hw4.h"
3836 #include "lpfc_hw.h"
....@@ -154,7 +152,7 @@
154152 memcpy(&ndlp->nlp_portname, &sp->portName, sizeof (struct lpfc_name));
155153 return 1;
156154 bad_service_param:
157
- lpfc_printf_vlog(vport, KERN_ERR, LOG_DISCOVERY,
155
+ lpfc_printf_vlog(vport, KERN_ERR, LOG_TRACE_EVENT,
158156 "0207 Device %x "
159157 "(%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x) sent "
160158 "invalid service parameters. Ignoring device.\n",
....@@ -279,6 +277,109 @@
279277 lpfc_cancel_retry_delay_tmo(phba->pport, ndlp);
280278 }
281279
280
+/* lpfc_defer_pt2pt_acc - Complete SLI3 pt2pt processing on link up
281
+ * @phba: pointer to lpfc hba data structure.
282
+ * @link_mbox: pointer to CONFIG_LINK mailbox object
283
+ *
284
+ * This routine is only called if we are SLI3, direct connect pt2pt
285
+ * mode and the remote NPort issues the PLOGI after link up.
286
+ */
287
+static void
288
+lpfc_defer_pt2pt_acc(struct lpfc_hba *phba, LPFC_MBOXQ_t *link_mbox)
289
+{
290
+ LPFC_MBOXQ_t *login_mbox;
291
+ MAILBOX_t *mb = &link_mbox->u.mb;
292
+ struct lpfc_iocbq *save_iocb;
293
+ struct lpfc_nodelist *ndlp;
294
+ int rc;
295
+
296
+ ndlp = link_mbox->ctx_ndlp;
297
+ login_mbox = link_mbox->context3;
298
+ save_iocb = login_mbox->context3;
299
+ link_mbox->context3 = NULL;
300
+ login_mbox->context3 = NULL;
301
+
302
+ /* Check for CONFIG_LINK error */
303
+ if (mb->mbxStatus) {
304
+ lpfc_printf_log(phba, KERN_ERR, LOG_TRACE_EVENT,
305
+ "4575 CONFIG_LINK fails pt2pt discovery: %x\n",
306
+ mb->mbxStatus);
307
+ mempool_free(login_mbox, phba->mbox_mem_pool);
308
+ mempool_free(link_mbox, phba->mbox_mem_pool);
309
+ kfree(save_iocb);
310
+ return;
311
+ }
312
+
313
+ /* Now that CONFIG_LINK completed, and our SID is configured,
314
+ * we can now proceed with sending the PLOGI ACC.
315
+ */
316
+ rc = lpfc_els_rsp_acc(link_mbox->vport, ELS_CMD_PLOGI,
317
+ save_iocb, ndlp, login_mbox);
318
+ if (rc) {
319
+ lpfc_printf_log(phba, KERN_ERR, LOG_TRACE_EVENT,
320
+ "4576 PLOGI ACC fails pt2pt discovery: %x\n",
321
+ rc);
322
+ mempool_free(login_mbox, phba->mbox_mem_pool);
323
+ }
324
+
325
+ mempool_free(link_mbox, phba->mbox_mem_pool);
326
+ kfree(save_iocb);
327
+}
328
+
329
+/**
330
+ * lpfc_defer_tgt_acc - Progress SLI4 target rcv PLOGI handler
331
+ * @phba: Pointer to HBA context object.
332
+ * @pmb: Pointer to mailbox object.
333
+ *
334
+ * This function provides the unreg rpi mailbox completion handler for a tgt.
335
+ * The routine frees the memory resources associated with the completed
336
+ * mailbox command and transmits the ELS ACC.
337
+ *
338
+ * This routine is only called if we are SLI4, acting in target
339
+ * mode and the remote NPort issues the PLOGI after link up.
340
+ **/
341
+static void
342
+lpfc_defer_acc_rsp(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmb)
343
+{
344
+ struct lpfc_vport *vport = pmb->vport;
345
+ struct lpfc_nodelist *ndlp = pmb->ctx_ndlp;
346
+ LPFC_MBOXQ_t *mbox = pmb->context3;
347
+ struct lpfc_iocbq *piocb = NULL;
348
+ int rc;
349
+
350
+ if (mbox) {
351
+ pmb->context3 = NULL;
352
+ piocb = mbox->context3;
353
+ mbox->context3 = NULL;
354
+ }
355
+
356
+ /*
357
+ * Complete the unreg rpi mbx request, and update flags.
358
+ * This will also restart any deferred events.
359
+ */
360
+ lpfc_nlp_get(ndlp);
361
+ lpfc_sli4_unreg_rpi_cmpl_clr(phba, pmb);
362
+
363
+ if (!piocb) {
364
+ lpfc_printf_vlog(vport, KERN_ERR, LOG_TRACE_EVENT,
365
+ "4578 PLOGI ACC fail\n");
366
+ if (mbox)
367
+ mempool_free(mbox, phba->mbox_mem_pool);
368
+ goto out;
369
+ }
370
+
371
+ rc = lpfc_els_rsp_acc(vport, ELS_CMD_PLOGI, piocb, ndlp, mbox);
372
+ if (rc) {
373
+ lpfc_printf_vlog(vport, KERN_ERR, LOG_TRACE_EVENT,
374
+ "4579 PLOGI ACC fail %x\n", rc);
375
+ if (mbox)
376
+ mempool_free(mbox, phba->mbox_mem_pool);
377
+ }
378
+ kfree(piocb);
379
+out:
380
+ lpfc_nlp_put(ndlp);
381
+}
382
+
282383 static int
283384 lpfc_rcv_plogi(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
284385 struct lpfc_iocbq *cmdiocb)
....@@ -291,17 +392,20 @@
291392 IOCB_t *icmd;
292393 struct serv_parm *sp;
293394 uint32_t ed_tov;
294
- LPFC_MBOXQ_t *mbox;
395
+ LPFC_MBOXQ_t *link_mbox;
396
+ LPFC_MBOXQ_t *login_mbox;
397
+ struct lpfc_iocbq *save_iocb;
295398 struct ls_rjt stat;
296399 uint32_t vid, flag;
297
- int rc;
400
+ u16 rpi;
401
+ int rc, defer_acc;
298402
299403 memset(&stat, 0, sizeof (struct ls_rjt));
300404 pcmd = (struct lpfc_dmabuf *) cmdiocb->context2;
301405 lp = (uint32_t *) pcmd->virt;
302406 sp = (struct serv_parm *) ((uint8_t *) lp + sizeof (uint32_t));
303407 if (wwn_to_u64(sp->portName.u.wwn) == 0) {
304
- lpfc_printf_vlog(vport, KERN_ERR, LOG_ELS,
408
+ lpfc_printf_vlog(vport, KERN_ERR, LOG_TRACE_EVENT,
305409 "0140 PLOGI Reject: invalid nname\n");
306410 stat.un.b.lsRjtRsnCode = LSRJT_UNABLE_TPC;
307411 stat.un.b.lsRjtRsnCodeExp = LSEXP_INVALID_PNAME;
....@@ -310,7 +414,7 @@
310414 return 0;
311415 }
312416 if (wwn_to_u64(sp->nodeName.u.wwn) == 0) {
313
- lpfc_printf_vlog(vport, KERN_ERR, LOG_ELS,
417
+ lpfc_printf_vlog(vport, KERN_ERR, LOG_TRACE_EVENT,
314418 "0141 PLOGI Reject: invalid pname\n");
315419 stat.un.b.lsRjtRsnCode = LSRJT_UNABLE_TPC;
316420 stat.un.b.lsRjtRsnCodeExp = LSEXP_INVALID_NNAME;
....@@ -343,6 +447,7 @@
343447 else
344448 ndlp->nlp_fcp_info |= CLASS3;
345449
450
+ defer_acc = 0;
346451 ndlp->nlp_class_sup = 0;
347452 if (sp->cls1.classValid)
348453 ndlp->nlp_class_sup |= FC_COS_CLASS1;
....@@ -354,12 +459,12 @@
354459 ndlp->nlp_class_sup |= FC_COS_CLASS4;
355460 ndlp->nlp_maxframe =
356461 ((sp->cmn.bbRcvSizeMsb & 0x0F) << 8) | sp->cmn.bbRcvSizeLsb;
357
-
358462 /* if already logged in, do implicit logout */
359463 switch (ndlp->nlp_state) {
360464 case NLP_STE_NPR_NODE:
361465 if (!(ndlp->nlp_flag & NLP_NPR_ADISC))
362466 break;
467
+ fallthrough;
363468 case NLP_STE_REG_LOGIN_ISSUE:
364469 case NLP_STE_PRLI_ISSUE:
365470 case NLP_STE_UNMAPPED_NODE:
....@@ -376,13 +481,18 @@
376481 }
377482 if (nlp_portwwn != 0 &&
378483 nlp_portwwn != wwn_to_u64(sp->portName.u.wwn))
379
- lpfc_printf_vlog(vport, KERN_ERR, LOG_ELS,
484
+ lpfc_printf_vlog(vport, KERN_ERR, LOG_TRACE_EVENT,
380485 "0143 PLOGI recv'd from DID: x%x "
381486 "WWPN changed: old %llx new %llx\n",
382487 ndlp->nlp_DID,
383488 (unsigned long long)nlp_portwwn,
384489 (unsigned long long)
385490 wwn_to_u64(sp->portName.u.wwn));
491
+
492
+ /* Notify transport of connectivity loss to trigger cleanup. */
493
+ if (phba->nvmet_support &&
494
+ ndlp->nlp_state == NLP_STE_UNMAPPED_NODE)
495
+ lpfc_nvmet_invalidate_host(phba, ndlp);
386496
387497 ndlp->nlp_prev_state = ndlp->nlp_state;
388498 /* rport needs to be unregistered first */
....@@ -394,6 +504,10 @@
394504 ndlp->nlp_type &= ~(NLP_NVME_TARGET | NLP_NVME_INITIATOR);
395505 ndlp->nlp_fcp_info &= ~NLP_FCP_2_DEVICE;
396506 ndlp->nlp_flag &= ~NLP_FIRSTBURST;
507
+
508
+ login_mbox = NULL;
509
+ link_mbox = NULL;
510
+ save_iocb = NULL;
397511
398512 /* Check for Nport to NPort pt2pt protocol */
399513 if ((vport->fc_flag & FC_PT2PT) &&
....@@ -422,17 +536,22 @@
422536 if (phba->sli_rev == LPFC_SLI_REV4)
423537 lpfc_issue_reg_vfi(vport);
424538 else {
425
- mbox = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL);
426
- if (mbox == NULL)
539
+ defer_acc = 1;
540
+ link_mbox = mempool_alloc(phba->mbox_mem_pool,
541
+ GFP_KERNEL);
542
+ if (!link_mbox)
427543 goto out;
428
- lpfc_config_link(phba, mbox);
429
- mbox->mbox_cmpl = lpfc_sli_def_mbox_cmpl;
430
- mbox->vport = vport;
431
- rc = lpfc_sli_issue_mbox(phba, mbox, MBX_NOWAIT);
432
- if (rc == MBX_NOT_FINISHED) {
433
- mempool_free(mbox, phba->mbox_mem_pool);
544
+ lpfc_config_link(phba, link_mbox);
545
+ link_mbox->mbox_cmpl = lpfc_defer_pt2pt_acc;
546
+ link_mbox->vport = vport;
547
+ link_mbox->ctx_ndlp = ndlp;
548
+
549
+ save_iocb = kzalloc(sizeof(*save_iocb), GFP_KERNEL);
550
+ if (!save_iocb)
434551 goto out;
435
- }
552
+ /* Save info from cmd IOCB used in rsp */
553
+ memcpy((uint8_t *)save_iocb, (uint8_t *)cmdiocb,
554
+ sizeof(struct lpfc_iocbq));
436555 }
437556
438557 lpfc_can_disctmo(vport);
....@@ -447,30 +566,57 @@
447566 ndlp->nlp_flag |= NLP_SUPPRESS_RSP;
448567 }
449568
450
- mbox = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL);
451
- if (!mbox)
569
+ login_mbox = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL);
570
+ if (!login_mbox)
452571 goto out;
453572
454573 /* Registering an existing RPI behaves differently for SLI3 vs SLI4 */
455
- if (phba->sli_rev == LPFC_SLI_REV4)
574
+ if (phba->nvmet_support && !defer_acc) {
575
+ link_mbox = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL);
576
+ if (!link_mbox)
577
+ goto out;
578
+
579
+ /* As unique identifiers such as iotag would be overwritten
580
+ * with those from the cmdiocb, allocate separate temporary
581
+ * storage for the copy.
582
+ */
583
+ save_iocb = kzalloc(sizeof(*save_iocb), GFP_KERNEL);
584
+ if (!save_iocb)
585
+ goto out;
586
+
587
+ /* Unreg RPI is required for SLI4. */
588
+ rpi = phba->sli4_hba.rpi_ids[ndlp->nlp_rpi];
589
+ lpfc_unreg_login(phba, vport->vpi, rpi, link_mbox);
590
+ link_mbox->vport = vport;
591
+ link_mbox->ctx_ndlp = ndlp;
592
+ link_mbox->mbox_cmpl = lpfc_defer_acc_rsp;
593
+
594
+ if (((ndlp->nlp_DID & Fabric_DID_MASK) != Fabric_DID_MASK) &&
595
+ (!(vport->fc_flag & FC_OFFLINE_MODE)))
596
+ ndlp->nlp_flag |= NLP_UNREG_INP;
597
+
598
+ /* Save info from cmd IOCB used in rsp */
599
+ memcpy(save_iocb, cmdiocb, sizeof(*save_iocb));
600
+
601
+ /* Delay sending ACC till unreg RPI completes. */
602
+ defer_acc = 1;
603
+ } else if (phba->sli_rev == LPFC_SLI_REV4)
456604 lpfc_unreg_rpi(vport, ndlp);
457605
458606 rc = lpfc_reg_rpi(phba, vport->vpi, icmd->un.rcvels.remoteID,
459
- (uint8_t *) sp, mbox, ndlp->nlp_rpi);
460
- if (rc) {
461
- mempool_free(mbox, phba->mbox_mem_pool);
607
+ (uint8_t *)sp, login_mbox, ndlp->nlp_rpi);
608
+ if (rc)
462609 goto out;
463
- }
464610
465611 /* ACC PLOGI rsp command needs to execute first,
466
- * queue this mbox command to be processed later.
612
+ * queue this login_mbox command to be processed later.
467613 */
468
- mbox->mbox_cmpl = lpfc_mbx_cmpl_reg_login;
614
+ login_mbox->mbox_cmpl = lpfc_mbx_cmpl_reg_login;
469615 /*
470
- * mbox->context2 = lpfc_nlp_get(ndlp) deferred until mailbox
616
+ * login_mbox->ctx_ndlp = lpfc_nlp_get(ndlp) deferred until mailbox
471617 * command issued in lpfc_cmpl_els_acc().
472618 */
473
- mbox->vport = vport;
619
+ login_mbox->vport = vport;
474620 spin_lock_irq(shost->host_lock);
475621 ndlp->nlp_flag |= (NLP_ACC_REGLOGIN | NLP_RCV_PLOGI);
476622 spin_unlock_irq(shost->host_lock);
....@@ -494,6 +640,9 @@
494640 if ((vport->port_type == LPFC_NPIV_PORT &&
495641 vport->cfg_restrict_login)) {
496642
643
+ /* no deferred ACC */
644
+ kfree(save_iocb);
645
+
497646 /* In order to preserve RPIs, we want to cleanup
498647 * the default RPI the firmware created to rcv
499648 * this ELS request. The only way to do this is
....@@ -505,16 +654,50 @@
505654 stat.un.b.lsRjtRsnCode = LSRJT_INVALID_CMD;
506655 stat.un.b.lsRjtRsnCodeExp = LSEXP_NOTHING_MORE;
507656 rc = lpfc_els_rsp_reject(vport, stat.un.lsRjtError, cmdiocb,
508
- ndlp, mbox);
657
+ ndlp, login_mbox);
509658 if (rc)
510
- mempool_free(mbox, phba->mbox_mem_pool);
659
+ mempool_free(login_mbox, phba->mbox_mem_pool);
511660 return 1;
512661 }
513
- rc = lpfc_els_rsp_acc(vport, ELS_CMD_PLOGI, cmdiocb, ndlp, mbox);
662
+ if (defer_acc) {
663
+ /* So the order here should be:
664
+ * SLI3 pt2pt
665
+ * Issue CONFIG_LINK mbox
666
+ * CONFIG_LINK cmpl
667
+ * SLI4 tgt
668
+ * Issue UNREG RPI mbx
669
+ * UNREG RPI cmpl
670
+ * Issue PLOGI ACC
671
+ * PLOGI ACC cmpl
672
+ * Issue REG_LOGIN mbox
673
+ */
674
+
675
+ /* Save the REG_LOGIN mbox for and rcv IOCB copy later */
676
+ link_mbox->context3 = login_mbox;
677
+ login_mbox->context3 = save_iocb;
678
+
679
+ /* Start the ball rolling by issuing CONFIG_LINK here */
680
+ rc = lpfc_sli_issue_mbox(phba, link_mbox, MBX_NOWAIT);
681
+ if (rc == MBX_NOT_FINISHED)
682
+ goto out;
683
+ return 1;
684
+ }
685
+
686
+ rc = lpfc_els_rsp_acc(vport, ELS_CMD_PLOGI, cmdiocb, ndlp, login_mbox);
514687 if (rc)
515
- mempool_free(mbox, phba->mbox_mem_pool);
688
+ mempool_free(login_mbox, phba->mbox_mem_pool);
516689 return 1;
517690 out:
691
+ if (defer_acc)
692
+ lpfc_printf_log(phba, KERN_ERR, LOG_TRACE_EVENT,
693
+ "4577 discovery failure: %p %p %p\n",
694
+ save_iocb, link_mbox, login_mbox);
695
+ kfree(save_iocb);
696
+ if (link_mbox)
697
+ mempool_free(link_mbox, phba->mbox_mem_pool);
698
+ if (login_mbox)
699
+ mempool_free(login_mbox, phba->mbox_mem_pool);
700
+
518701 stat.un.b.lsRjtRsnCode = LSRJT_UNABLE_TPC;
519702 stat.un.b.lsRjtRsnCodeExp = LSEXP_OUT_OF_RESOURCE;
520703 lpfc_els_rsp_reject(vport, stat.un.lsRjtError, cmdiocb, ndlp, NULL);
....@@ -537,8 +720,8 @@
537720 struct lpfc_nodelist *ndlp;
538721 uint32_t cmd;
539722
540
- elsiocb = (struct lpfc_iocbq *)mboxq->context1;
541
- ndlp = (struct lpfc_nodelist *) mboxq->context2;
723
+ elsiocb = (struct lpfc_iocbq *)mboxq->ctx_buf;
724
+ ndlp = (struct lpfc_nodelist *)mboxq->ctx_ndlp;
542725 vport = mboxq->vport;
543726 cmd = elsiocb->drvrTimeout;
544727
....@@ -614,11 +797,17 @@
614797 ndlp, NULL);
615798 }
616799 out:
617
- /* If we are authenticated, move to the proper state */
618
- if (ndlp->nlp_type & NLP_FCP_TARGET)
619
- lpfc_nlp_set_state(vport, ndlp, NLP_STE_MAPPED_NODE);
620
- else
621
- lpfc_nlp_set_state(vport, ndlp, NLP_STE_UNMAPPED_NODE);
800
+ /* If we are authenticated, move to the proper state.
801
+ * It is possible an ADISC arrived and the remote nport
802
+ * is already in MAPPED or UNMAPPED state. Catch this
803
+ * condition and don't set the nlp_state again because
804
+ * it causes an unnecessary transport unregister/register.
805
+ */
806
+ if (ndlp->nlp_type & (NLP_FCP_TARGET | NLP_NVME_TARGET)) {
807
+ if (ndlp->nlp_state != NLP_STE_MAPPED_NODE)
808
+ lpfc_nlp_set_state(vport, ndlp,
809
+ NLP_STE_MAPPED_NODE);
810
+ }
622811
623812 return 1;
624813 }
....@@ -661,8 +850,15 @@
661850 lpfc_els_rsp_acc(vport, ELS_CMD_PRLO, cmdiocb, ndlp, NULL);
662851 else
663852 lpfc_els_rsp_acc(vport, ELS_CMD_ACC, cmdiocb, ndlp, NULL);
853
+
854
+ /* Notify transport of connectivity loss to trigger cleanup. */
855
+ if (phba->nvmet_support &&
856
+ ndlp->nlp_state == NLP_STE_UNMAPPED_NODE)
857
+ lpfc_nvmet_invalidate_host(phba, ndlp);
858
+
664859 if (ndlp->nlp_DID == Fabric_DID) {
665
- if (vport->port_state <= LPFC_FDISC)
860
+ if (vport->port_state <= LPFC_FDISC ||
861
+ vport->fc_flag & FC_PT2PT)
666862 goto out;
667863 lpfc_linkdown_port(vport);
668864 spin_lock_irq(shost->host_lock);
....@@ -805,8 +1001,14 @@
8051001 if (npr->writeXferRdyDis)
8061002 ndlp->nlp_flag |= NLP_FIRSTBURST;
8071003 }
808
- if (npr->Retry)
1004
+ if (npr->Retry && ndlp->nlp_type &
1005
+ (NLP_FCP_INITIATOR | NLP_FCP_TARGET))
8091006 ndlp->nlp_fcp_info |= NLP_FCP_2_DEVICE;
1007
+
1008
+ if (npr->Retry && phba->nsler &&
1009
+ ndlp->nlp_type & (NLP_NVME_INITIATOR | NLP_NVME_TARGET))
1010
+ ndlp->nlp_nvme_info |= NLP_NVME_NSLER;
1011
+
8101012
8111013 /* If this driver is in nvme target mode, set the ndlp's fc4
8121014 * type to NVME provided the PRLI response claims NVME FC4
....@@ -832,7 +1034,7 @@
8321034 "rport rolechg: role:x%x did:x%x flg:x%x",
8331035 roles, ndlp->nlp_DID, ndlp->nlp_flag);
8341036
835
- if (phba->cfg_enable_fc4_type != LPFC_ENABLE_NVME)
1037
+ if (vport->cfg_enable_fc4_type != LPFC_ENABLE_NVME)
8361038 fc_remote_port_rolechg(rport, roles);
8371039 }
8381040 }
....@@ -872,27 +1074,53 @@
8721074 * lpfc_release_rpi - Release a RPI by issuing unreg_login mailbox cmd.
8731075 * @phba : Pointer to lpfc_hba structure.
8741076 * @vport: Pointer to lpfc_vport structure.
1077
+ * @ndlp: Pointer to lpfc_nodelist structure.
8751078 * @rpi : rpi to be release.
8761079 *
8771080 * This function will send a unreg_login mailbox command to the firmware
8781081 * to release a rpi.
8791082 **/
880
-void
881
-lpfc_release_rpi(struct lpfc_hba *phba,
882
- struct lpfc_vport *vport,
883
- uint16_t rpi)
1083
+static void
1084
+lpfc_release_rpi(struct lpfc_hba *phba, struct lpfc_vport *vport,
1085
+ struct lpfc_nodelist *ndlp, uint16_t rpi)
8841086 {
8851087 LPFC_MBOXQ_t *pmb;
8861088 int rc;
8871089
1090
+ /* If there is already an UNREG in progress for this ndlp,
1091
+ * no need to queue up another one.
1092
+ */
1093
+ if (ndlp->nlp_flag & NLP_UNREG_INP) {
1094
+ lpfc_printf_vlog(vport, KERN_INFO, LOG_DISCOVERY,
1095
+ "1435 release_rpi SKIP UNREG x%x on "
1096
+ "NPort x%x deferred x%x flg x%x "
1097
+ "Data: x%px\n",
1098
+ ndlp->nlp_rpi, ndlp->nlp_DID,
1099
+ ndlp->nlp_defer_did,
1100
+ ndlp->nlp_flag, ndlp);
1101
+ return;
1102
+ }
1103
+
8881104 pmb = (LPFC_MBOXQ_t *) mempool_alloc(phba->mbox_mem_pool,
8891105 GFP_KERNEL);
8901106 if (!pmb)
891
- lpfc_printf_vlog(vport, KERN_ERR, LOG_MBOX,
892
- "2796 mailbox memory allocation failed \n");
1107
+ lpfc_printf_vlog(vport, KERN_ERR, LOG_TRACE_EVENT,
1108
+ "2796 mailbox memory allocation failed \n");
8931109 else {
8941110 lpfc_unreg_login(phba, vport->vpi, rpi, pmb);
8951111 pmb->mbox_cmpl = lpfc_sli_def_mbox_cmpl;
1112
+ pmb->vport = vport;
1113
+ pmb->ctx_ndlp = ndlp;
1114
+
1115
+ if (((ndlp->nlp_DID & Fabric_DID_MASK) != Fabric_DID_MASK) &&
1116
+ (!(vport->fc_flag & FC_OFFLINE_MODE)))
1117
+ ndlp->nlp_flag |= NLP_UNREG_INP;
1118
+
1119
+ lpfc_printf_vlog(vport, KERN_INFO, LOG_DISCOVERY,
1120
+ "1437 release_rpi UNREG x%x "
1121
+ "on NPort x%x flg x%x\n",
1122
+ ndlp->nlp_rpi, ndlp->nlp_DID, ndlp->nlp_flag);
1123
+
8961124 rc = lpfc_sli_issue_mbox(phba, pmb, MBX_NOWAIT);
8971125 if (rc == MBX_NOT_FINISHED)
8981126 mempool_free(pmb, phba->mbox_mem_pool);
....@@ -913,9 +1141,9 @@
9131141 (evt == NLP_EVT_CMPL_REG_LOGIN) &&
9141142 (!pmb->u.mb.mbxStatus)) {
9151143 rpi = pmb->u.mb.un.varWords[0];
916
- lpfc_release_rpi(phba, vport, rpi);
1144
+ lpfc_release_rpi(phba, vport, ndlp, rpi);
9171145 }
918
- lpfc_printf_vlog(vport, KERN_ERR, LOG_DISCOVERY,
1146
+ lpfc_printf_vlog(vport, KERN_ERR, LOG_TRACE_EVENT,
9191147 "0271 Illegal State Transition: node x%x "
9201148 "event x%x, state x%x Data: x%x x%x\n",
9211149 ndlp->nlp_DID, evt, ndlp->nlp_state, ndlp->nlp_rpi,
....@@ -933,11 +1161,11 @@
9331161 * to stop it.
9341162 */
9351163 if (!(ndlp->nlp_flag & NLP_RCV_PLOGI)) {
936
- lpfc_printf_vlog(vport, KERN_ERR, LOG_DISCOVERY,
937
- "0272 Illegal State Transition: node x%x "
938
- "event x%x, state x%x Data: x%x x%x\n",
939
- ndlp->nlp_DID, evt, ndlp->nlp_state, ndlp->nlp_rpi,
940
- ndlp->nlp_flag);
1164
+ lpfc_printf_vlog(vport, KERN_ERR, LOG_TRACE_EVENT,
1165
+ "0272 Illegal State Transition: node x%x "
1166
+ "event x%x, state x%x Data: x%x x%x\n",
1167
+ ndlp->nlp_DID, evt, ndlp->nlp_state,
1168
+ ndlp->nlp_rpi, ndlp->nlp_flag);
9411169 }
9421170 return ndlp->nlp_state;
9431171 }
....@@ -1157,7 +1385,7 @@
11571385 if ((ndlp->nlp_DID != FDMI_DID) &&
11581386 (wwn_to_u64(sp->portName.u.wwn) == 0 ||
11591387 wwn_to_u64(sp->nodeName.u.wwn) == 0)) {
1160
- lpfc_printf_vlog(vport, KERN_ERR, LOG_ELS,
1388
+ lpfc_printf_vlog(vport, KERN_ERR, LOG_TRACE_EVENT,
11611389 "0142 PLOGI RSP: Invalid WWN.\n");
11621390 goto out;
11631391 }
....@@ -1219,7 +1447,8 @@
12191447 } else {
12201448 mbox = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL);
12211449 if (!mbox) {
1222
- lpfc_printf_vlog(vport, KERN_ERR, LOG_ELS,
1450
+ lpfc_printf_vlog(vport, KERN_ERR,
1451
+ LOG_TRACE_EVENT,
12231452 "0133 PLOGI: no memory "
12241453 "for config_link "
12251454 "Data: x%x x%x x%x x%x\n",
....@@ -1244,7 +1473,7 @@
12441473
12451474 mbox = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL);
12461475 if (!mbox) {
1247
- lpfc_printf_vlog(vport, KERN_ERR, LOG_ELS,
1476
+ lpfc_printf_vlog(vport, KERN_ERR, LOG_TRACE_EVENT,
12481477 "0018 PLOGI: no memory for reg_login "
12491478 "Data: x%x x%x x%x x%x\n",
12501479 ndlp->nlp_DID, ndlp->nlp_state,
....@@ -1265,7 +1494,7 @@
12651494 ndlp->nlp_flag |= NLP_REG_LOGIN_SEND;
12661495 mbox->mbox_cmpl = lpfc_mbx_cmpl_reg_login;
12671496 }
1268
- mbox->context2 = lpfc_nlp_get(ndlp);
1497
+ mbox->ctx_ndlp = lpfc_nlp_get(ndlp);
12691498 mbox->vport = vport;
12701499 if (lpfc_sli_issue_mbox(phba, mbox, MBX_NOWAIT)
12711500 != MBX_NOT_FINISHED) {
....@@ -1279,12 +1508,12 @@
12791508 * command
12801509 */
12811510 lpfc_nlp_put(ndlp);
1282
- mp = (struct lpfc_dmabuf *) mbox->context1;
1511
+ mp = (struct lpfc_dmabuf *)mbox->ctx_buf;
12831512 lpfc_mbuf_free(phba, mp->virt, mp->phys);
12841513 kfree(mp);
12851514 mempool_free(mbox, phba->mbox_mem_pool);
12861515
1287
- lpfc_printf_vlog(vport, KERN_ERR, LOG_ELS,
1516
+ lpfc_printf_vlog(vport, KERN_ERR, LOG_TRACE_EVENT,
12881517 "0134 PLOGI: cannot issue reg_login "
12891518 "Data: x%x x%x x%x x%x\n",
12901519 ndlp->nlp_DID, ndlp->nlp_state,
....@@ -1292,7 +1521,7 @@
12921521 } else {
12931522 mempool_free(mbox, phba->mbox_mem_pool);
12941523
1295
- lpfc_printf_vlog(vport, KERN_ERR, LOG_ELS,
1524
+ lpfc_printf_vlog(vport, KERN_ERR, LOG_TRACE_EVENT,
12961525 "0135 PLOGI: cannot format reg_login "
12971526 "Data: x%x x%x x%x x%x\n",
12981527 ndlp->nlp_DID, ndlp->nlp_state,
....@@ -1303,7 +1532,7 @@
13031532 out:
13041533 if (ndlp->nlp_DID == NameServer_DID) {
13051534 lpfc_vport_set_state(vport, FC_VPORT_FAILED);
1306
- lpfc_printf_vlog(vport, KERN_ERR, LOG_ELS,
1535
+ lpfc_printf_vlog(vport, KERN_ERR, LOG_TRACE_EVENT,
13071536 "0261 Cannot Register NameServer login\n");
13081537 }
13091538
....@@ -1341,7 +1570,7 @@
13411570 if (!(phba->pport->load_flag & FC_UNLOADING) &&
13421571 !mb->mbxStatus) {
13431572 rpi = pmb->u.mb.un.varWords[0];
1344
- lpfc_release_rpi(phba, vport, rpi);
1573
+ lpfc_release_rpi(phba, vport, ndlp, rpi);
13451574 }
13461575 return ndlp->nlp_state;
13471576 }
....@@ -1522,7 +1751,13 @@
15221751 }
15231752 }
15241753
1525
- if (ndlp->nlp_type & NLP_FCP_TARGET) {
1754
+ if (ndlp->nlp_type & NLP_FCP_TARGET)
1755
+ ndlp->nlp_fc4_type |= NLP_FC4_FCP;
1756
+
1757
+ if (ndlp->nlp_type & NLP_NVME_TARGET)
1758
+ ndlp->nlp_fc4_type |= NLP_FC4_NVME;
1759
+
1760
+ if (ndlp->nlp_type & (NLP_FCP_TARGET | NLP_NVME_TARGET)) {
15261761 ndlp->nlp_prev_state = NLP_STE_ADISC_ISSUE;
15271762 lpfc_nlp_set_state(vport, ndlp, NLP_STE_MAPPED_NODE);
15281763 } else {
....@@ -1642,16 +1877,17 @@
16421877 LPFC_MBOXQ_t *mb;
16431878 LPFC_MBOXQ_t *nextmb;
16441879 struct lpfc_dmabuf *mp;
1880
+ struct lpfc_nodelist *ns_ndlp;
16451881
16461882 cmdiocb = (struct lpfc_iocbq *) arg;
16471883
16481884 /* cleanup any ndlp on mbox q waiting for reglogin cmpl */
16491885 if ((mb = phba->sli.mbox_active)) {
16501886 if ((mb->u.mb.mbxCommand == MBX_REG_LOGIN64) &&
1651
- (ndlp == (struct lpfc_nodelist *) mb->context2)) {
1887
+ (ndlp == (struct lpfc_nodelist *)mb->ctx_ndlp)) {
16521888 ndlp->nlp_flag &= ~NLP_REG_LOGIN_SEND;
16531889 lpfc_nlp_put(ndlp);
1654
- mb->context2 = NULL;
1890
+ mb->ctx_ndlp = NULL;
16551891 mb->mbox_cmpl = lpfc_sli_def_mbox_cmpl;
16561892 }
16571893 }
....@@ -1659,8 +1895,8 @@
16591895 spin_lock_irq(&phba->hbalock);
16601896 list_for_each_entry_safe(mb, nextmb, &phba->sli.mboxq, list) {
16611897 if ((mb->u.mb.mbxCommand == MBX_REG_LOGIN64) &&
1662
- (ndlp == (struct lpfc_nodelist *) mb->context2)) {
1663
- mp = (struct lpfc_dmabuf *) (mb->context1);
1898
+ (ndlp == (struct lpfc_nodelist *)mb->ctx_ndlp)) {
1899
+ mp = (struct lpfc_dmabuf *)(mb->ctx_buf);
16641900 if (mp) {
16651901 __lpfc_mbuf_free(phba, mp->virt, mp->phys);
16661902 kfree(mp);
....@@ -1673,6 +1909,13 @@
16731909 }
16741910 }
16751911 spin_unlock_irq(&phba->hbalock);
1912
+
1913
+ /* software abort if any GID_FT is outstanding */
1914
+ if (vport->cfg_enable_fc4_type != LPFC_ENABLE_FCP) {
1915
+ ns_ndlp = lpfc_findnode_did(vport, NameServer_DID);
1916
+ if (ns_ndlp && NLP_CHK_NODE_ACT(ns_ndlp))
1917
+ lpfc_els_abort(phba, ns_ndlp);
1918
+ }
16761919
16771920 lpfc_rcv_logo(vport, ndlp, cmdiocb, ELS_CMD_LOGO);
16781921 return ndlp->nlp_state;
....@@ -1714,12 +1957,11 @@
17141957 LPFC_MBOXQ_t *pmb = (LPFC_MBOXQ_t *) arg;
17151958 MAILBOX_t *mb = &pmb->u.mb;
17161959 uint32_t did = mb->un.varWords[1];
1717
- int rc = 0;
17181960
17191961 if (mb->mbxStatus) {
17201962 /* RegLogin failed */
1721
- lpfc_printf_vlog(vport, KERN_ERR, LOG_DISCOVERY,
1722
- "0246 RegLogin failed Data: x%x x%x x%x x%x "
1963
+ lpfc_printf_vlog(vport, KERN_ERR, LOG_TRACE_EVENT,
1964
+ "0246 RegLogin failed Data: x%x x%x x%x x%x "
17231965 "x%x\n",
17241966 did, mb->mbxStatus, vport->port_state,
17251967 mb->un.varRegLogin.vpi,
....@@ -1769,8 +2011,9 @@
17692011 * is configured try it.
17702012 */
17712013 ndlp->nlp_fc4_type |= NLP_FC4_FCP;
1772
- if ((phba->cfg_enable_fc4_type == LPFC_ENABLE_BOTH) ||
1773
- (phba->cfg_enable_fc4_type == LPFC_ENABLE_NVME)) {
2014
+ if ((!(vport->fc_flag & FC_PT2PT_NO_NVME)) &&
2015
+ (vport->cfg_enable_fc4_type == LPFC_ENABLE_BOTH ||
2016
+ vport->cfg_enable_fc4_type == LPFC_ENABLE_NVME)) {
17742017 ndlp->nlp_fc4_type |= NLP_FC4_NVME;
17752018 /* We need to update the localport also */
17762019 lpfc_nvme_update_localport(vport);
....@@ -1780,14 +2023,25 @@
17802023 ndlp->nlp_fc4_type |= NLP_FC4_FCP;
17812024
17822025 } else if (ndlp->nlp_fc4_type == 0) {
1783
- rc = lpfc_ns_cmd(vport, SLI_CTNS_GFT_ID,
1784
- 0, ndlp->nlp_DID);
1785
- return ndlp->nlp_state;
2026
+ /* If we are only configured for FCP, the driver
2027
+ * should just issue PRLI for FCP. Otherwise issue
2028
+ * GFT_ID to determine if remote port supports NVME.
2029
+ */
2030
+ if (vport->cfg_enable_fc4_type != LPFC_ENABLE_FCP) {
2031
+ lpfc_ns_cmd(vport, SLI_CTNS_GFT_ID, 0,
2032
+ ndlp->nlp_DID);
2033
+ return ndlp->nlp_state;
2034
+ }
2035
+ ndlp->nlp_fc4_type = NLP_FC4_FCP;
17862036 }
17872037
17882038 ndlp->nlp_prev_state = NLP_STE_REG_LOGIN_ISSUE;
17892039 lpfc_nlp_set_state(vport, ndlp, NLP_STE_PRLI_ISSUE);
1790
- lpfc_issue_els_prli(vport, ndlp, 0);
2040
+ if (lpfc_issue_els_prli(vport, ndlp, 0)) {
2041
+ lpfc_issue_els_logo(vport, ndlp, 0);
2042
+ ndlp->nlp_prev_state = NLP_STE_REG_LOGIN_ISSUE;
2043
+ lpfc_nlp_set_state(vport, ndlp, NLP_STE_NPR_NODE);
2044
+ }
17912045 } else {
17922046 if ((vport->fc_flag & FC_PT2PT) && phba->nvmet_support)
17932047 phba->targetport->port_id = vport->fc_myDID;
....@@ -1984,6 +2238,13 @@
19842238 /* Complete setting up the remote ndlp personality. */
19852239 if (bf_get_be32(prli_init, nvpr))
19862240 ndlp->nlp_type |= NLP_NVME_INITIATOR;
2241
+
2242
+ if (phba->nsler && bf_get_be32(prli_nsler, nvpr) &&
2243
+ bf_get_be32(prli_conf, nvpr))
2244
+
2245
+ ndlp->nlp_nvme_info |= NLP_NVME_NSLER;
2246
+ else
2247
+ ndlp->nlp_nvme_info &= ~NLP_NVME_NSLER;
19872248
19882249 /* Target driver cannot solicit NVME FB. */
19892250 if (bf_get_be32(prli_tgt, nvpr)) {
....@@ -2864,18 +3125,21 @@
28643125 uint32_t(*func) (struct lpfc_vport *, struct lpfc_nodelist *, void *,
28653126 uint32_t);
28663127 uint32_t got_ndlp = 0;
3128
+ uint32_t data1;
28673129
28683130 if (lpfc_nlp_get(ndlp))
28693131 got_ndlp = 1;
28703132
28713133 cur_state = ndlp->nlp_state;
28723134
3135
+ data1 = (((uint32_t)ndlp->nlp_fc4_type << 16) |
3136
+ ((uint32_t)ndlp->nlp_type));
28733137 /* DSM in event <evt> on NPort <nlp_DID> in state <cur_state> */
28743138 lpfc_printf_vlog(vport, KERN_INFO, LOG_DISCOVERY,
28753139 "0211 DSM in event x%x on NPort x%x in "
2876
- "state %d Data: x%x x%x\n",
2877
- evt, ndlp->nlp_DID, cur_state,
2878
- ndlp->nlp_flag, ndlp->nlp_fc4_type);
3140
+ "state %d rpi x%x Data: x%x x%x\n",
3141
+ evt, ndlp->nlp_DID, cur_state, ndlp->nlp_rpi,
3142
+ ndlp->nlp_flag, data1);
28793143
28803144 lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_DSM,
28813145 "DSM in: evt:%d ste:%d did:x%x",
....@@ -2886,9 +3150,13 @@
28863150
28873151 /* DSM out state <rc> on NPort <nlp_DID> */
28883152 if (got_ndlp) {
3153
+ data1 = (((uint32_t)ndlp->nlp_fc4_type << 16) |
3154
+ ((uint32_t)ndlp->nlp_type));
28893155 lpfc_printf_vlog(vport, KERN_INFO, LOG_DISCOVERY,
2890
- "0212 DSM out state %d on NPort x%x Data: x%x\n",
2891
- rc, ndlp->nlp_DID, ndlp->nlp_flag);
3156
+ "0212 DSM out state %d on NPort x%x "
3157
+ "rpi x%x Data: x%x x%x\n",
3158
+ rc, ndlp->nlp_DID, ndlp->nlp_rpi, ndlp->nlp_flag,
3159
+ data1);
28923160
28933161 lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_DSM,
28943162 "DSM out: ste:%d did:x%x flg:x%x",