0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024 #include <linux/blkdev.h>
0025 #include <linux/pci.h>
0026 #include <linux/slab.h>
0027 #include <linux/interrupt.h>
0028 #include <linux/delay.h>
0029
0030 #include <scsi/scsi.h>
0031 #include <scsi/scsi_device.h>
0032 #include <scsi/scsi_host.h>
0033 #include <scsi/scsi_transport_fc.h>
0034 #include <uapi/scsi/fc/fc_fs.h>
0035 #include <uapi/scsi/fc/fc_els.h>
0036
0037 #include "lpfc_hw4.h"
0038 #include "lpfc_hw.h"
0039 #include "lpfc_sli.h"
0040 #include "lpfc_sli4.h"
0041 #include "lpfc_nl.h"
0042 #include "lpfc_disc.h"
0043 #include "lpfc_scsi.h"
0044 #include "lpfc.h"
0045 #include "lpfc_logmsg.h"
0046 #include "lpfc_crtn.h"
0047 #include "lpfc_vport.h"
0048 #include "lpfc_debugfs.h"
0049
0050 static int lpfc_els_retry(struct lpfc_hba *, struct lpfc_iocbq *,
0051 struct lpfc_iocbq *);
0052 static void lpfc_cmpl_fabric_iocb(struct lpfc_hba *, struct lpfc_iocbq *,
0053 struct lpfc_iocbq *);
0054 static void lpfc_fabric_abort_vport(struct lpfc_vport *vport);
0055 static int lpfc_issue_els_fdisc(struct lpfc_vport *vport,
0056 struct lpfc_nodelist *ndlp, uint8_t retry);
0057 static int lpfc_issue_fabric_iocb(struct lpfc_hba *phba,
0058 struct lpfc_iocbq *iocb);
0059 static void lpfc_cmpl_els_edc(struct lpfc_hba *phba,
0060 struct lpfc_iocbq *cmdiocb,
0061 struct lpfc_iocbq *rspiocb);
0062 static void lpfc_cmpl_els_uvem(struct lpfc_hba *, struct lpfc_iocbq *,
0063 struct lpfc_iocbq *);
0064
0065 static int lpfc_max_els_tries = 3;
0066
0067 static void lpfc_init_cs_ctl_bitmap(struct lpfc_vport *vport);
0068 static void lpfc_vmid_set_cs_ctl_range(struct lpfc_vport *vport, u32 min, u32 max);
0069 static void lpfc_vmid_put_cs_ctl(struct lpfc_vport *vport, u32 ctcl_vmid);
0070
0071
0072
0073
0074
0075
0076
0077
0078
0079
0080
0081
0082
0083
0084
0085
0086
0087
0088
0089
0090
0091
0092
0093 int
0094 lpfc_els_chk_latt(struct lpfc_vport *vport)
0095 {
0096 struct Scsi_Host *shost = lpfc_shost_from_vport(vport);
0097 struct lpfc_hba *phba = vport->phba;
0098 uint32_t ha_copy;
0099
0100 if (vport->port_state >= LPFC_VPORT_READY ||
0101 phba->link_state == LPFC_LINK_DOWN ||
0102 phba->sli_rev > LPFC_SLI_REV3)
0103 return 0;
0104
0105
0106 if (lpfc_readl(phba->HAregaddr, &ha_copy))
0107 return 1;
0108
0109 if (!(ha_copy & HA_LATT))
0110 return 0;
0111
0112
0113 lpfc_printf_vlog(vport, KERN_ERR, LOG_TRACE_EVENT,
0114 "0237 Pending Link Event during "
0115 "Discovery: State x%x\n",
0116 phba->pport->port_state);
0117
0118
0119
0120
0121
0122
0123
0124 spin_lock_irq(shost->host_lock);
0125 vport->fc_flag |= FC_ABORT_DISCOVERY;
0126 spin_unlock_irq(shost->host_lock);
0127
0128 if (phba->link_state != LPFC_CLEAR_LA)
0129 lpfc_issue_clear_la(phba, vport);
0130
0131 return 1;
0132 }
0133
0134
0135
0136
0137
0138
0139
0140
0141
0142
0143
0144
0145
0146
0147
0148
0149
0150
0151
0152
0153
0154
0155
0156
0157
0158
0159
0160
0161
0162 struct lpfc_iocbq *
0163 lpfc_prep_els_iocb(struct lpfc_vport *vport, u8 expect_rsp,
0164 u16 cmd_size, u8 retry,
0165 struct lpfc_nodelist *ndlp, u32 did,
0166 u32 elscmd)
0167 {
0168 struct lpfc_hba *phba = vport->phba;
0169 struct lpfc_iocbq *elsiocb;
0170 struct lpfc_dmabuf *pcmd, *prsp, *pbuflist, *bmp;
0171 struct ulp_bde64_le *bpl;
0172 u32 timeout = 0;
0173
0174 if (!lpfc_is_link_up(phba))
0175 return NULL;
0176
0177
0178 elsiocb = lpfc_sli_get_iocbq(phba);
0179 if (!elsiocb)
0180 return NULL;
0181
0182
0183
0184
0185
0186 if ((did == Fabric_DID) &&
0187 (phba->hba_flag & HBA_FIP_SUPPORT) &&
0188 ((elscmd == ELS_CMD_FLOGI) ||
0189 (elscmd == ELS_CMD_FDISC) ||
0190 (elscmd == ELS_CMD_LOGO)))
0191 switch (elscmd) {
0192 case ELS_CMD_FLOGI:
0193 elsiocb->cmd_flag |=
0194 ((LPFC_ELS_ID_FLOGI << LPFC_FIP_ELS_ID_SHIFT)
0195 & LPFC_FIP_ELS_ID_MASK);
0196 break;
0197 case ELS_CMD_FDISC:
0198 elsiocb->cmd_flag |=
0199 ((LPFC_ELS_ID_FDISC << LPFC_FIP_ELS_ID_SHIFT)
0200 & LPFC_FIP_ELS_ID_MASK);
0201 break;
0202 case ELS_CMD_LOGO:
0203 elsiocb->cmd_flag |=
0204 ((LPFC_ELS_ID_LOGO << LPFC_FIP_ELS_ID_SHIFT)
0205 & LPFC_FIP_ELS_ID_MASK);
0206 break;
0207 }
0208 else
0209 elsiocb->cmd_flag &= ~LPFC_FIP_ELS_ID_MASK;
0210
0211
0212
0213 pcmd = kmalloc(sizeof(*pcmd), GFP_KERNEL);
0214 if (pcmd)
0215 pcmd->virt = lpfc_mbuf_alloc(phba, MEM_PRI, &pcmd->phys);
0216 if (!pcmd || !pcmd->virt)
0217 goto els_iocb_free_pcmb_exit;
0218
0219 INIT_LIST_HEAD(&pcmd->list);
0220
0221
0222 if (expect_rsp) {
0223 prsp = kmalloc(sizeof(*prsp), GFP_KERNEL);
0224 if (prsp)
0225 prsp->virt = lpfc_mbuf_alloc(phba, MEM_PRI,
0226 &prsp->phys);
0227 if (!prsp || !prsp->virt)
0228 goto els_iocb_free_prsp_exit;
0229 INIT_LIST_HEAD(&prsp->list);
0230 } else {
0231 prsp = NULL;
0232 }
0233
0234
0235 pbuflist = kmalloc(sizeof(*pbuflist), GFP_KERNEL);
0236 if (pbuflist)
0237 pbuflist->virt = lpfc_mbuf_alloc(phba, MEM_PRI,
0238 &pbuflist->phys);
0239 if (!pbuflist || !pbuflist->virt)
0240 goto els_iocb_free_pbuf_exit;
0241
0242 INIT_LIST_HEAD(&pbuflist->list);
0243
0244 if (expect_rsp) {
0245 switch (elscmd) {
0246 case ELS_CMD_FLOGI:
0247 timeout = FF_DEF_RATOV * 2;
0248 break;
0249 case ELS_CMD_LOGO:
0250 timeout = phba->fc_ratov;
0251 break;
0252 default:
0253 timeout = phba->fc_ratov * 2;
0254 }
0255
0256
0257 elsiocb->num_bdes = 2;
0258 }
0259
0260 if (phba->sli_rev == LPFC_SLI_REV4)
0261 bmp = pcmd;
0262 else
0263 bmp = pbuflist;
0264
0265 lpfc_sli_prep_els_req_rsp(phba, elsiocb, vport, bmp, cmd_size, did,
0266 elscmd, timeout, expect_rsp);
0267
0268 bpl = (struct ulp_bde64_le *)pbuflist->virt;
0269 bpl->addr_low = cpu_to_le32(putPaddrLow(pcmd->phys));
0270 bpl->addr_high = cpu_to_le32(putPaddrHigh(pcmd->phys));
0271 bpl->type_size = cpu_to_le32(cmd_size);
0272 bpl->type_size |= cpu_to_le32(ULP_BDE64_TYPE_BDE_64);
0273
0274 if (expect_rsp) {
0275 bpl++;
0276 bpl->addr_low = cpu_to_le32(putPaddrLow(prsp->phys));
0277 bpl->addr_high = cpu_to_le32(putPaddrHigh(prsp->phys));
0278 bpl->type_size = cpu_to_le32(FCELSSIZE);
0279 bpl->type_size |= cpu_to_le32(ULP_BDE64_TYPE_BDE_64);
0280 }
0281
0282 elsiocb->cmd_dmabuf = pcmd;
0283 elsiocb->bpl_dmabuf = pbuflist;
0284 elsiocb->retry = retry;
0285 elsiocb->vport = vport;
0286 elsiocb->drvrTimeout = (phba->fc_ratov << 1) + LPFC_DRVR_TIMEOUT;
0287
0288 if (prsp)
0289 list_add(&prsp->list, &pcmd->list);
0290 if (expect_rsp) {
0291
0292 lpfc_printf_vlog(vport, KERN_INFO, LOG_ELS,
0293 "0116 Xmit ELS command x%x to remote "
0294 "NPORT x%x I/O tag: x%x, port state:x%x "
0295 "rpi x%x fc_flag:x%x\n",
0296 elscmd, did, elsiocb->iotag,
0297 vport->port_state, ndlp->nlp_rpi,
0298 vport->fc_flag);
0299 } else {
0300
0301 lpfc_printf_vlog(vport, KERN_INFO, LOG_ELS,
0302 "0117 Xmit ELS response x%x to remote "
0303 "NPORT x%x I/O tag: x%x, size: x%x "
0304 "port_state x%x rpi x%x fc_flag x%x\n",
0305 elscmd, ndlp->nlp_DID, elsiocb->iotag,
0306 cmd_size, vport->port_state,
0307 ndlp->nlp_rpi, vport->fc_flag);
0308 }
0309
0310 return elsiocb;
0311
0312 els_iocb_free_pbuf_exit:
0313 if (expect_rsp)
0314 lpfc_mbuf_free(phba, prsp->virt, prsp->phys);
0315 kfree(pbuflist);
0316
0317 els_iocb_free_prsp_exit:
0318 lpfc_mbuf_free(phba, pcmd->virt, pcmd->phys);
0319 kfree(prsp);
0320
0321 els_iocb_free_pcmb_exit:
0322 kfree(pcmd);
0323 lpfc_sli_release_iocbq(phba, elsiocb);
0324 return NULL;
0325 }
0326
0327
0328
0329
0330
0331
0332
0333
0334
0335
0336
0337
0338
0339
0340
0341
0342
0343 int
0344 lpfc_issue_fabric_reglogin(struct lpfc_vport *vport)
0345 {
0346 struct lpfc_hba *phba = vport->phba;
0347 LPFC_MBOXQ_t *mbox;
0348 struct lpfc_nodelist *ndlp;
0349 struct serv_parm *sp;
0350 int rc;
0351 int err = 0;
0352
0353 sp = &phba->fc_fabparam;
0354 ndlp = lpfc_findnode_did(vport, Fabric_DID);
0355 if (!ndlp) {
0356 err = 1;
0357 goto fail;
0358 }
0359
0360 mbox = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL);
0361 if (!mbox) {
0362 err = 2;
0363 goto fail;
0364 }
0365
0366 vport->port_state = LPFC_FABRIC_CFG_LINK;
0367 lpfc_config_link(phba, mbox);
0368 mbox->mbox_cmpl = lpfc_sli_def_mbox_cmpl;
0369 mbox->vport = vport;
0370
0371 rc = lpfc_sli_issue_mbox(phba, mbox, MBX_NOWAIT);
0372 if (rc == MBX_NOT_FINISHED) {
0373 err = 3;
0374 goto fail_free_mbox;
0375 }
0376
0377 mbox = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL);
0378 if (!mbox) {
0379 err = 4;
0380 goto fail;
0381 }
0382 rc = lpfc_reg_rpi(phba, vport->vpi, Fabric_DID, (uint8_t *)sp, mbox,
0383 ndlp->nlp_rpi);
0384 if (rc) {
0385 err = 5;
0386 goto fail_free_mbox;
0387 }
0388
0389 mbox->mbox_cmpl = lpfc_mbx_cmpl_fabric_reg_login;
0390 mbox->vport = vport;
0391
0392
0393
0394 mbox->ctx_ndlp = lpfc_nlp_get(ndlp);
0395 if (!mbox->ctx_ndlp) {
0396 err = 6;
0397 goto fail_free_mbox;
0398 }
0399
0400 rc = lpfc_sli_issue_mbox(phba, mbox, MBX_NOWAIT);
0401 if (rc == MBX_NOT_FINISHED) {
0402 err = 7;
0403 goto fail_issue_reg_login;
0404 }
0405
0406 return 0;
0407
0408 fail_issue_reg_login:
0409
0410
0411
0412 lpfc_nlp_put(ndlp);
0413 fail_free_mbox:
0414 lpfc_mbox_rsrc_cleanup(phba, mbox, MBOX_THD_UNLOCKED);
0415 fail:
0416 lpfc_vport_set_state(vport, FC_VPORT_FAILED);
0417 lpfc_printf_vlog(vport, KERN_ERR, LOG_TRACE_EVENT,
0418 "0249 Cannot issue Register Fabric login: Err %d\n",
0419 err);
0420 return -ENXIO;
0421 }
0422
0423
0424
0425
0426
0427
0428
0429
0430
0431
0432
0433
0434 int
0435 lpfc_issue_reg_vfi(struct lpfc_vport *vport)
0436 {
0437 struct lpfc_hba *phba = vport->phba;
0438 LPFC_MBOXQ_t *mboxq = NULL;
0439 struct lpfc_nodelist *ndlp;
0440 struct lpfc_dmabuf *dmabuf = NULL;
0441 int rc = 0;
0442
0443
0444 if ((phba->sli_rev == LPFC_SLI_REV4) &&
0445 !(phba->link_flag & LS_LOOPBACK_MODE) &&
0446 !(vport->fc_flag & FC_PT2PT)) {
0447 ndlp = lpfc_findnode_did(vport, Fabric_DID);
0448 if (!ndlp) {
0449 rc = -ENODEV;
0450 goto fail;
0451 }
0452 }
0453
0454 mboxq = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL);
0455 if (!mboxq) {
0456 rc = -ENOMEM;
0457 goto fail;
0458 }
0459
0460
0461 if ((vport->fc_flag & FC_FABRIC) || (vport->fc_flag & FC_PT2PT)) {
0462 rc = lpfc_mbox_rsrc_prep(phba, mboxq);
0463 if (rc) {
0464 rc = -ENOMEM;
0465 goto fail_mbox;
0466 }
0467 dmabuf = mboxq->ctx_buf;
0468 memcpy(dmabuf->virt, &phba->fc_fabparam,
0469 sizeof(struct serv_parm));
0470 }
0471
0472 vport->port_state = LPFC_FABRIC_CFG_LINK;
0473 if (dmabuf) {
0474 lpfc_reg_vfi(mboxq, vport, dmabuf->phys);
0475
0476 mboxq->ctx_buf = dmabuf;
0477 } else {
0478 lpfc_reg_vfi(mboxq, vport, 0);
0479 }
0480
0481 mboxq->mbox_cmpl = lpfc_mbx_cmpl_reg_vfi;
0482 mboxq->vport = vport;
0483 rc = lpfc_sli_issue_mbox(phba, mboxq, MBX_NOWAIT);
0484 if (rc == MBX_NOT_FINISHED) {
0485 rc = -ENXIO;
0486 goto fail_mbox;
0487 }
0488 return 0;
0489
0490 fail_mbox:
0491 lpfc_mbox_rsrc_cleanup(phba, mboxq, MBOX_THD_UNLOCKED);
0492 fail:
0493 lpfc_vport_set_state(vport, FC_VPORT_FAILED);
0494 lpfc_printf_vlog(vport, KERN_ERR, LOG_TRACE_EVENT,
0495 "0289 Issue Register VFI failed: Err %d\n", rc);
0496 return rc;
0497 }
0498
0499
0500
0501
0502
0503
0504
0505
0506
0507
0508
0509
0510 int
0511 lpfc_issue_unreg_vfi(struct lpfc_vport *vport)
0512 {
0513 struct lpfc_hba *phba = vport->phba;
0514 struct Scsi_Host *shost;
0515 LPFC_MBOXQ_t *mboxq;
0516 int rc;
0517
0518 mboxq = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL);
0519 if (!mboxq) {
0520 lpfc_printf_log(phba, KERN_ERR, LOG_TRACE_EVENT,
0521 "2556 UNREG_VFI mbox allocation failed"
0522 "HBA state x%x\n", phba->pport->port_state);
0523 return -ENOMEM;
0524 }
0525
0526 lpfc_unreg_vfi(mboxq, vport);
0527 mboxq->vport = vport;
0528 mboxq->mbox_cmpl = lpfc_unregister_vfi_cmpl;
0529
0530 rc = lpfc_sli_issue_mbox(phba, mboxq, MBX_NOWAIT);
0531 if (rc == MBX_NOT_FINISHED) {
0532 lpfc_printf_log(phba, KERN_ERR, LOG_TRACE_EVENT,
0533 "2557 UNREG_VFI issue mbox failed rc x%x "
0534 "HBA state x%x\n",
0535 rc, phba->pport->port_state);
0536 mempool_free(mboxq, phba->mbox_mem_pool);
0537 return -EIO;
0538 }
0539
0540 shost = lpfc_shost_from_vport(vport);
0541 spin_lock_irq(shost->host_lock);
0542 vport->fc_flag &= ~FC_VFI_REGISTERED;
0543 spin_unlock_irq(shost->host_lock);
0544 return 0;
0545 }
0546
0547
0548
0549
0550
0551
0552
0553
0554
0555
0556
0557
0558
0559
0560
0561
0562
0563
0564
0565 static uint8_t
0566 lpfc_check_clean_addr_bit(struct lpfc_vport *vport,
0567 struct serv_parm *sp)
0568 {
0569 struct lpfc_hba *phba = vport->phba;
0570 uint8_t fabric_param_changed = 0;
0571 struct Scsi_Host *shost = lpfc_shost_from_vport(vport);
0572
0573 if ((vport->fc_prevDID != vport->fc_myDID) ||
0574 memcmp(&vport->fabric_portname, &sp->portName,
0575 sizeof(struct lpfc_name)) ||
0576 memcmp(&vport->fabric_nodename, &sp->nodeName,
0577 sizeof(struct lpfc_name)) ||
0578 (vport->vport_flag & FAWWPN_PARAM_CHG)) {
0579 fabric_param_changed = 1;
0580 vport->vport_flag &= ~FAWWPN_PARAM_CHG;
0581 }
0582
0583
0584
0585
0586
0587
0588
0589
0590
0591
0592 if (fabric_param_changed && !sp->cmn.clean_address_bit &&
0593 (vport->fc_prevDID || phba->cfg_delay_discovery)) {
0594 spin_lock_irq(shost->host_lock);
0595 vport->fc_flag |= FC_DISC_DELAYED;
0596 spin_unlock_irq(shost->host_lock);
0597 }
0598
0599 return fabric_param_changed;
0600 }
0601
0602
0603
0604
0605
0606
0607
0608
0609
0610
0611
0612
0613
0614
0615
0616
0617
0618
0619
0620
0621
0622
0623 static int
0624 lpfc_cmpl_els_flogi_fabric(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
0625 struct serv_parm *sp, uint32_t ulp_word4)
0626 {
0627 struct Scsi_Host *shost = lpfc_shost_from_vport(vport);
0628 struct lpfc_hba *phba = vport->phba;
0629 struct lpfc_nodelist *np;
0630 struct lpfc_nodelist *next_np;
0631 uint8_t fabric_param_changed;
0632
0633 spin_lock_irq(shost->host_lock);
0634 vport->fc_flag |= FC_FABRIC;
0635 spin_unlock_irq(shost->host_lock);
0636
0637 phba->fc_edtov = be32_to_cpu(sp->cmn.e_d_tov);
0638 if (sp->cmn.edtovResolution)
0639 phba->fc_edtov = (phba->fc_edtov + 999999) / 1000000;
0640
0641 phba->fc_edtovResol = sp->cmn.edtovResolution;
0642 phba->fc_ratov = (be32_to_cpu(sp->cmn.w2.r_a_tov) + 999) / 1000;
0643
0644 if (phba->fc_topology == LPFC_TOPOLOGY_LOOP) {
0645 spin_lock_irq(shost->host_lock);
0646 vport->fc_flag |= FC_PUBLIC_LOOP;
0647 spin_unlock_irq(shost->host_lock);
0648 }
0649
0650 vport->fc_myDID = ulp_word4 & Mask_DID;
0651 memcpy(&ndlp->nlp_portname, &sp->portName, sizeof(struct lpfc_name));
0652 memcpy(&ndlp->nlp_nodename, &sp->nodeName, sizeof(struct lpfc_name));
0653 ndlp->nlp_class_sup = 0;
0654 if (sp->cls1.classValid)
0655 ndlp->nlp_class_sup |= FC_COS_CLASS1;
0656 if (sp->cls2.classValid)
0657 ndlp->nlp_class_sup |= FC_COS_CLASS2;
0658 if (sp->cls3.classValid)
0659 ndlp->nlp_class_sup |= FC_COS_CLASS3;
0660 if (sp->cls4.classValid)
0661 ndlp->nlp_class_sup |= FC_COS_CLASS4;
0662 ndlp->nlp_maxframe = ((sp->cmn.bbRcvSizeMsb & 0x0F) << 8) |
0663 sp->cmn.bbRcvSizeLsb;
0664
0665 fabric_param_changed = lpfc_check_clean_addr_bit(vport, sp);
0666 if (fabric_param_changed) {
0667
0668 if (phba->cfg_enable_SmartSAN ||
0669 (phba->cfg_fdmi_on == LPFC_FDMI_SUPPORT)) {
0670
0671 vport->fdmi_hba_mask = LPFC_FDMI2_HBA_ATTR;
0672 if (phba->cfg_enable_SmartSAN)
0673 vport->fdmi_port_mask = LPFC_FDMI2_SMART_ATTR;
0674 else
0675 vport->fdmi_port_mask = LPFC_FDMI2_PORT_ATTR;
0676 } else {
0677 vport->fdmi_hba_mask = 0;
0678 vport->fdmi_port_mask = 0;
0679 }
0680
0681 }
0682 memcpy(&vport->fabric_portname, &sp->portName,
0683 sizeof(struct lpfc_name));
0684 memcpy(&vport->fabric_nodename, &sp->nodeName,
0685 sizeof(struct lpfc_name));
0686 memcpy(&phba->fc_fabparam, sp, sizeof(struct serv_parm));
0687
0688 if (phba->sli3_options & LPFC_SLI3_NPIV_ENABLED) {
0689 if (sp->cmn.response_multiple_NPort) {
0690 lpfc_printf_vlog(vport, KERN_WARNING,
0691 LOG_ELS | LOG_VPORT,
0692 "1816 FLOGI NPIV supported, "
0693 "response data 0x%x\n",
0694 sp->cmn.response_multiple_NPort);
0695 spin_lock_irq(&phba->hbalock);
0696 phba->link_flag |= LS_NPIV_FAB_SUPPORTED;
0697 spin_unlock_irq(&phba->hbalock);
0698 } else {
0699
0700
0701 lpfc_printf_vlog(vport, KERN_WARNING,
0702 LOG_ELS | LOG_VPORT,
0703 "1817 Fabric does not support NPIV "
0704 "- configuring single port mode.\n");
0705 spin_lock_irq(&phba->hbalock);
0706 phba->link_flag &= ~LS_NPIV_FAB_SUPPORTED;
0707 spin_unlock_irq(&phba->hbalock);
0708 }
0709 }
0710
0711
0712
0713
0714
0715 if ((phba->sli_rev == LPFC_SLI_REV4) &&
0716 (phba->sli4_hba.lnk_info.lnk_tp == LPFC_LNK_TYPE_FC)) {
0717
0718 if (fabric_param_changed)
0719 lpfc_unregister_fcf_prep(phba);
0720
0721
0722 if (vport->fc_flag & FC_VFI_REGISTERED)
0723 lpfc_issue_reg_vfi(vport);
0724 }
0725
0726 if (fabric_param_changed &&
0727 !(vport->fc_flag & FC_VPORT_NEEDS_REG_VPI)) {
0728
0729
0730
0731
0732 list_for_each_entry_safe(np, next_np,
0733 &vport->fc_nodes, nlp_listp) {
0734 if ((np->nlp_state != NLP_STE_NPR_NODE) ||
0735 !(np->nlp_flag & NLP_NPR_ADISC))
0736 continue;
0737 spin_lock_irq(&np->lock);
0738 np->nlp_flag &= ~NLP_NPR_ADISC;
0739 spin_unlock_irq(&np->lock);
0740 lpfc_unreg_rpi(vport, np);
0741 }
0742 lpfc_cleanup_pending_mbox(vport);
0743
0744 if (phba->sli_rev == LPFC_SLI_REV4) {
0745 lpfc_sli4_unreg_all_rpis(vport);
0746 lpfc_mbx_unreg_vpi(vport);
0747 spin_lock_irq(shost->host_lock);
0748 vport->fc_flag |= FC_VPORT_NEEDS_INIT_VPI;
0749 spin_unlock_irq(shost->host_lock);
0750 }
0751
0752
0753
0754
0755
0756 spin_lock_irq(shost->host_lock);
0757 vport->fc_flag |= FC_VPORT_NEEDS_REG_VPI;
0758 spin_unlock_irq(shost->host_lock);
0759 } else if ((phba->sli_rev == LPFC_SLI_REV4) &&
0760 !(vport->fc_flag & FC_VPORT_NEEDS_REG_VPI)) {
0761
0762
0763
0764
0765 lpfc_nlp_set_state(vport, ndlp, NLP_STE_UNMAPPED_NODE);
0766 lpfc_register_new_vport(phba, vport, ndlp);
0767 return 0;
0768 }
0769
0770 if (phba->sli_rev < LPFC_SLI_REV4) {
0771 lpfc_nlp_set_state(vport, ndlp, NLP_STE_REG_LOGIN_ISSUE);
0772 if (phba->sli3_options & LPFC_SLI3_NPIV_ENABLED &&
0773 vport->fc_flag & FC_VPORT_NEEDS_REG_VPI)
0774 lpfc_register_new_vport(phba, vport, ndlp);
0775 else
0776 lpfc_issue_fabric_reglogin(vport);
0777 } else {
0778 ndlp->nlp_type |= NLP_FABRIC;
0779 lpfc_nlp_set_state(vport, ndlp, NLP_STE_UNMAPPED_NODE);
0780 if ((!(vport->fc_flag & FC_VPORT_NEEDS_REG_VPI)) &&
0781 (vport->vpi_state & LPFC_VPI_REGISTERED)) {
0782 lpfc_start_fdiscs(phba);
0783 lpfc_do_scr_ns_plogi(phba, vport);
0784 } else if (vport->fc_flag & FC_VFI_REGISTERED)
0785 lpfc_issue_init_vpi(vport);
0786 else {
0787 lpfc_printf_vlog(vport, KERN_INFO, LOG_ELS,
0788 "3135 Need register VFI: (x%x/%x)\n",
0789 vport->fc_prevDID, vport->fc_myDID);
0790 lpfc_issue_reg_vfi(vport);
0791 }
0792 }
0793 return 0;
0794 }
0795
0796
0797
0798
0799
0800
0801
0802
0803
0804
0805
0806
0807
0808
0809
0810
0811
0812
0813
0814
0815
0816 static int
0817 lpfc_cmpl_els_flogi_nport(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
0818 struct serv_parm *sp)
0819 {
0820 struct Scsi_Host *shost = lpfc_shost_from_vport(vport);
0821 struct lpfc_hba *phba = vport->phba;
0822 LPFC_MBOXQ_t *mbox;
0823 int rc;
0824
0825 spin_lock_irq(shost->host_lock);
0826 vport->fc_flag &= ~(FC_FABRIC | FC_PUBLIC_LOOP);
0827 vport->fc_flag |= FC_PT2PT;
0828 spin_unlock_irq(shost->host_lock);
0829
0830
0831 phba->sli3_options &= ~LPFC_SLI3_NPIV_ENABLED;
0832
0833
0834 if ((phba->sli_rev == LPFC_SLI_REV4) && phba->fc_topology_changed) {
0835 lpfc_unregister_fcf_prep(phba);
0836
0837 spin_lock_irq(shost->host_lock);
0838 vport->fc_flag &= ~FC_VFI_REGISTERED;
0839 spin_unlock_irq(shost->host_lock);
0840 phba->fc_topology_changed = 0;
0841 }
0842
0843 rc = memcmp(&vport->fc_portname, &sp->portName,
0844 sizeof(vport->fc_portname));
0845
0846 if (rc >= 0) {
0847
0848 spin_lock_irq(shost->host_lock);
0849 vport->fc_flag |= FC_PT2PT_PLOGI;
0850 spin_unlock_irq(shost->host_lock);
0851
0852
0853
0854
0855
0856
0857
0858 if (rc)
0859 vport->fc_myDID = PT2PT_LocalID;
0860
0861
0862
0863
0864
0865 if (!(ndlp->fc4_xpt_flags & (SCSI_XPT_REGD | NVME_XPT_REGD)))
0866 lpfc_nlp_put(ndlp);
0867
0868 ndlp = lpfc_findnode_did(vport, PT2PT_RemoteID);
0869 if (!ndlp) {
0870
0871
0872
0873
0874 ndlp = lpfc_nlp_init(vport, PT2PT_RemoteID);
0875 if (!ndlp)
0876 goto fail;
0877 }
0878
0879 memcpy(&ndlp->nlp_portname, &sp->portName,
0880 sizeof(struct lpfc_name));
0881 memcpy(&ndlp->nlp_nodename, &sp->nodeName,
0882 sizeof(struct lpfc_name));
0883
0884 lpfc_nlp_set_state(vport, ndlp, NLP_STE_NPR_NODE);
0885 spin_lock_irq(&ndlp->lock);
0886 ndlp->nlp_flag |= NLP_NPR_2B_DISC;
0887 spin_unlock_irq(&ndlp->lock);
0888
0889 mbox = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL);
0890 if (!mbox)
0891 goto fail;
0892
0893 lpfc_config_link(phba, mbox);
0894
0895 mbox->mbox_cmpl = lpfc_mbx_cmpl_local_config_link;
0896 mbox->vport = vport;
0897 rc = lpfc_sli_issue_mbox(phba, mbox, MBX_NOWAIT);
0898 if (rc == MBX_NOT_FINISHED) {
0899 mempool_free(mbox, phba->mbox_mem_pool);
0900 goto fail;
0901 }
0902 } else {
0903
0904
0905
0906
0907 if (!(ndlp->fc4_xpt_flags & (SCSI_XPT_REGD | NVME_XPT_REGD)))
0908 lpfc_nlp_put(ndlp);
0909
0910
0911 lpfc_disc_start(vport);
0912 }
0913
0914 return 0;
0915 fail:
0916 return -ENXIO;
0917 }
0918
0919
0920
0921
0922
0923
0924
0925
0926
0927
0928
0929
0930
0931
0932
0933
0934
0935
0936
0937
0938
0939
0940
0941
0942 static void
0943 lpfc_cmpl_els_flogi(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
0944 struct lpfc_iocbq *rspiocb)
0945 {
0946 struct lpfc_vport *vport = cmdiocb->vport;
0947 struct Scsi_Host *shost = lpfc_shost_from_vport(vport);
0948 struct lpfc_nodelist *ndlp = cmdiocb->ndlp;
0949 IOCB_t *irsp;
0950 struct lpfc_dmabuf *pcmd = cmdiocb->cmd_dmabuf, *prsp;
0951 struct serv_parm *sp;
0952 uint16_t fcf_index;
0953 int rc;
0954 u32 ulp_status, ulp_word4, tmo;
0955
0956
0957 if (lpfc_els_chk_latt(vport)) {
0958
0959
0960
0961 if (!(ndlp->fc4_xpt_flags & SCSI_XPT_REGD))
0962 lpfc_nlp_put(ndlp);
0963 goto out;
0964 }
0965
0966 ulp_status = get_job_ulpstatus(phba, rspiocb);
0967 ulp_word4 = get_job_word4(phba, rspiocb);
0968
0969 if (phba->sli_rev == LPFC_SLI_REV4) {
0970 tmo = get_wqe_tmo(cmdiocb);
0971 } else {
0972 irsp = &rspiocb->iocb;
0973 tmo = irsp->ulpTimeout;
0974 }
0975
0976 lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_CMD,
0977 "FLOGI cmpl: status:x%x/x%x state:x%x",
0978 ulp_status, ulp_word4,
0979 vport->port_state);
0980
0981 if (ulp_status) {
0982
0983
0984
0985
0986 if ((phba->hba_flag & HBA_FIP_SUPPORT) &&
0987 (phba->fcf.fcf_flag & FCF_DISCOVERY)) {
0988 if (phba->link_state < LPFC_LINK_UP)
0989 goto stop_rr_fcf_flogi;
0990 if ((phba->fcoe_cvl_eventtag_attn ==
0991 phba->fcoe_cvl_eventtag) &&
0992 (ulp_status == IOSTAT_LOCAL_REJECT) &&
0993 ((ulp_word4 & IOERR_PARAM_MASK) ==
0994 IOERR_SLI_ABORTED))
0995 goto stop_rr_fcf_flogi;
0996 else
0997 phba->fcoe_cvl_eventtag_attn =
0998 phba->fcoe_cvl_eventtag;
0999 lpfc_printf_log(phba, KERN_WARNING, LOG_FIP | LOG_ELS,
1000 "2611 FLOGI failed on FCF (x%x), "
1001 "status:x%x/x%x, tmo:x%x, perform "
1002 "roundrobin FCF failover\n",
1003 phba->fcf.current_rec.fcf_indx,
1004 ulp_status, ulp_word4, tmo);
1005 lpfc_sli4_set_fcf_flogi_fail(phba,
1006 phba->fcf.current_rec.fcf_indx);
1007 fcf_index = lpfc_sli4_fcf_rr_next_index_get(phba);
1008 rc = lpfc_sli4_fcf_rr_next_proc(vport, fcf_index);
1009 if (rc)
1010 goto out;
1011 }
1012
1013 stop_rr_fcf_flogi:
1014
1015 if (!(ulp_status == IOSTAT_LOCAL_REJECT &&
1016 ((ulp_word4 & IOERR_PARAM_MASK) ==
1017 IOERR_LOOP_OPEN_FAILURE)))
1018 lpfc_printf_vlog(vport, KERN_ERR, LOG_TRACE_EVENT,
1019 "2858 FLOGI failure Status:x%x/x%x TMO"
1020 ":x%x Data x%x x%x\n",
1021 ulp_status, ulp_word4, tmo,
1022 phba->hba_flag, phba->fcf.fcf_flag);
1023
1024
1025 if (lpfc_els_retry(phba, cmdiocb, rspiocb))
1026 goto out;
1027
1028 lpfc_printf_vlog(vport, KERN_WARNING, LOG_TRACE_EVENT,
1029 "0150 FLOGI failure Status:x%x/x%x "
1030 "xri x%x TMO:x%x refcnt %d\n",
1031 ulp_status, ulp_word4, cmdiocb->sli4_xritag,
1032 tmo, kref_read(&ndlp->kref));
1033
1034
1035 if (!(ulp_status == IOSTAT_LOCAL_REJECT &&
1036 ((ulp_word4 & IOERR_PARAM_MASK) ==
1037 IOERR_LOOP_OPEN_FAILURE))) {
1038
1039 lpfc_printf_vlog(vport, KERN_ERR, LOG_TRACE_EVENT,
1040 "0100 FLOGI failure Status:x%x/x%x "
1041 "TMO:x%x\n",
1042 ulp_status, ulp_word4, tmo);
1043 goto flogifail;
1044 }
1045
1046
1047 spin_lock_irq(shost->host_lock);
1048 vport->fc_flag &= ~(FC_FABRIC | FC_PUBLIC_LOOP |
1049 FC_PT2PT_NO_NVME);
1050 spin_unlock_irq(shost->host_lock);
1051
1052
1053
1054
1055
1056 if (phba->alpa_map[0] == 0)
1057 vport->cfg_discovery_threads = LPFC_MAX_DISC_THREADS;
1058 if ((phba->sli_rev == LPFC_SLI_REV4) &&
1059 (!(vport->fc_flag & FC_VFI_REGISTERED) ||
1060 (vport->fc_prevDID != vport->fc_myDID) ||
1061 phba->fc_topology_changed)) {
1062 if (vport->fc_flag & FC_VFI_REGISTERED) {
1063 if (phba->fc_topology_changed) {
1064 lpfc_unregister_fcf_prep(phba);
1065 spin_lock_irq(shost->host_lock);
1066 vport->fc_flag &= ~FC_VFI_REGISTERED;
1067 spin_unlock_irq(shost->host_lock);
1068 phba->fc_topology_changed = 0;
1069 } else {
1070 lpfc_sli4_unreg_all_rpis(vport);
1071 }
1072 }
1073
1074
1075 if (!lpfc_error_lost_link(ulp_status, ulp_word4))
1076 lpfc_issue_reg_vfi(vport);
1077
1078 lpfc_nlp_put(ndlp);
1079 goto out;
1080 }
1081 goto flogifail;
1082 }
1083 spin_lock_irq(shost->host_lock);
1084 vport->fc_flag &= ~FC_VPORT_CVL_RCVD;
1085 vport->fc_flag &= ~FC_VPORT_LOGO_RCVD;
1086 spin_unlock_irq(shost->host_lock);
1087
1088
1089
1090
1091
1092 prsp = list_get_first(&pcmd->list, struct lpfc_dmabuf, list);
1093 if (!prsp)
1094 goto out;
1095 sp = prsp->virt + sizeof(uint32_t);
1096
1097
1098 lpfc_printf_vlog(vport, KERN_INFO, LOG_ELS,
1099 "0101 FLOGI completes successfully, I/O tag:x%x "
1100 "xri x%x Data: x%x x%x x%x x%x x%x x%x x%x %d\n",
1101 cmdiocb->iotag, cmdiocb->sli4_xritag,
1102 ulp_word4, sp->cmn.e_d_tov,
1103 sp->cmn.w2.r_a_tov, sp->cmn.edtovResolution,
1104 vport->port_state, vport->fc_flag,
1105 sp->cmn.priority_tagging, kref_read(&ndlp->kref));
1106
1107 if (sp->cmn.priority_tagging)
1108 vport->phba->pport->vmid_flag |= (LPFC_VMID_ISSUE_QFPA |
1109 LPFC_VMID_TYPE_PRIO);
1110
1111 if (vport->port_state == LPFC_FLOGI) {
1112
1113
1114
1115
1116 if (sp->cmn.fPort)
1117 rc = lpfc_cmpl_els_flogi_fabric(vport, ndlp, sp,
1118 ulp_word4);
1119 else if (!(phba->hba_flag & HBA_FCOE_MODE))
1120 rc = lpfc_cmpl_els_flogi_nport(vport, ndlp, sp);
1121 else {
1122 lpfc_printf_vlog(vport, KERN_ERR, LOG_TRACE_EVENT,
1123 "2831 FLOGI response with cleared Fabric "
1124 "bit fcf_index 0x%x "
1125 "Switch Name %02x%02x%02x%02x%02x%02x%02x%02x "
1126 "Fabric Name "
1127 "%02x%02x%02x%02x%02x%02x%02x%02x\n",
1128 phba->fcf.current_rec.fcf_indx,
1129 phba->fcf.current_rec.switch_name[0],
1130 phba->fcf.current_rec.switch_name[1],
1131 phba->fcf.current_rec.switch_name[2],
1132 phba->fcf.current_rec.switch_name[3],
1133 phba->fcf.current_rec.switch_name[4],
1134 phba->fcf.current_rec.switch_name[5],
1135 phba->fcf.current_rec.switch_name[6],
1136 phba->fcf.current_rec.switch_name[7],
1137 phba->fcf.current_rec.fabric_name[0],
1138 phba->fcf.current_rec.fabric_name[1],
1139 phba->fcf.current_rec.fabric_name[2],
1140 phba->fcf.current_rec.fabric_name[3],
1141 phba->fcf.current_rec.fabric_name[4],
1142 phba->fcf.current_rec.fabric_name[5],
1143 phba->fcf.current_rec.fabric_name[6],
1144 phba->fcf.current_rec.fabric_name[7]);
1145
1146 lpfc_nlp_put(ndlp);
1147 spin_lock_irq(&phba->hbalock);
1148 phba->fcf.fcf_flag &= ~FCF_DISCOVERY;
1149 phba->hba_flag &= ~(FCF_RR_INPROG | HBA_DEVLOSS_TMO);
1150 spin_unlock_irq(&phba->hbalock);
1151 phba->fcf.fcf_redisc_attempted = 0;
1152 goto out;
1153 }
1154 if (!rc) {
1155
1156 if (phba->hba_flag & HBA_FIP_SUPPORT)
1157 lpfc_printf_vlog(vport, KERN_INFO, LOG_FIP |
1158 LOG_ELS,
1159 "2769 FLOGI to FCF (x%x) "
1160 "completed successfully\n",
1161 phba->fcf.current_rec.fcf_indx);
1162 spin_lock_irq(&phba->hbalock);
1163 phba->fcf.fcf_flag &= ~FCF_DISCOVERY;
1164 phba->hba_flag &= ~(FCF_RR_INPROG | HBA_DEVLOSS_TMO);
1165 spin_unlock_irq(&phba->hbalock);
1166 phba->fcf.fcf_redisc_attempted = 0;
1167 goto out;
1168 }
1169 } else if (vport->port_state > LPFC_FLOGI &&
1170 vport->fc_flag & FC_PT2PT) {
1171
1172
1173
1174
1175
1176 if (!sp->cmn.fPort)
1177 goto out;
1178 }
1179
1180 flogifail:
1181 spin_lock_irq(&phba->hbalock);
1182 phba->fcf.fcf_flag &= ~FCF_DISCOVERY;
1183 spin_unlock_irq(&phba->hbalock);
1184
1185 if (!lpfc_error_lost_link(ulp_status, ulp_word4)) {
1186
1187 lpfc_disc_list_loopmap(vport);
1188
1189
1190 lpfc_disc_start(vport);
1191 } else if (((ulp_status != IOSTAT_LOCAL_REJECT) ||
1192 (((ulp_word4 & IOERR_PARAM_MASK) !=
1193 IOERR_SLI_ABORTED) &&
1194 ((ulp_word4 & IOERR_PARAM_MASK) !=
1195 IOERR_SLI_DOWN))) &&
1196 (phba->link_state != LPFC_CLEAR_LA)) {
1197
1198 lpfc_issue_clear_la(phba, vport);
1199 }
1200 out:
1201 phba->hba_flag &= ~HBA_FLOGI_OUTSTANDING;
1202 lpfc_els_free_iocb(phba, cmdiocb);
1203 lpfc_nlp_put(ndlp);
1204 }
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214 static void
1215 lpfc_cmpl_els_link_down(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
1216 struct lpfc_iocbq *rspiocb)
1217 {
1218 uint32_t *pcmd;
1219 uint32_t cmd;
1220 u32 ulp_status, ulp_word4;
1221
1222 pcmd = (uint32_t *)cmdiocb->cmd_dmabuf->virt;
1223 cmd = *pcmd;
1224
1225 ulp_status = get_job_ulpstatus(phba, rspiocb);
1226 ulp_word4 = get_job_word4(phba, rspiocb);
1227
1228 lpfc_printf_log(phba, KERN_INFO, LOG_ELS,
1229 "6445 ELS completes after LINK_DOWN: "
1230 " Status %x/%x cmd x%x flg x%x\n",
1231 ulp_status, ulp_word4, cmd,
1232 cmdiocb->cmd_flag);
1233
1234 if (cmdiocb->cmd_flag & LPFC_IO_FABRIC) {
1235 cmdiocb->cmd_flag &= ~LPFC_IO_FABRIC;
1236 atomic_dec(&phba->fabric_iocb_count);
1237 }
1238 lpfc_els_free_iocb(phba, cmdiocb);
1239 }
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262 static int
1263 lpfc_issue_els_flogi(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
1264 uint8_t retry)
1265 {
1266 struct lpfc_hba *phba = vport->phba;
1267 struct serv_parm *sp;
1268 union lpfc_wqe128 *wqe = NULL;
1269 IOCB_t *icmd = NULL;
1270 struct lpfc_iocbq *elsiocb;
1271 struct lpfc_iocbq defer_flogi_acc;
1272 u8 *pcmd, ct;
1273 uint16_t cmdsize;
1274 uint32_t tmo, did;
1275 int rc;
1276
1277 cmdsize = (sizeof(uint32_t) + sizeof(struct serv_parm));
1278 elsiocb = lpfc_prep_els_iocb(vport, 1, cmdsize, retry, ndlp,
1279 ndlp->nlp_DID, ELS_CMD_FLOGI);
1280
1281 if (!elsiocb)
1282 return 1;
1283
1284 wqe = &elsiocb->wqe;
1285 pcmd = (uint8_t *)elsiocb->cmd_dmabuf->virt;
1286 icmd = &elsiocb->iocb;
1287
1288
1289 *((uint32_t *) (pcmd)) = ELS_CMD_FLOGI;
1290 pcmd += sizeof(uint32_t);
1291 memcpy(pcmd, &vport->fc_sparam, sizeof(struct serv_parm));
1292 sp = (struct serv_parm *) pcmd;
1293
1294
1295 sp->cmn.e_d_tov = 0;
1296 sp->cmn.w2.r_a_tov = 0;
1297 sp->cmn.virtual_fabric_support = 0;
1298 sp->cls1.classValid = 0;
1299 if (sp->cmn.fcphLow < FC_PH3)
1300 sp->cmn.fcphLow = FC_PH3;
1301 if (sp->cmn.fcphHigh < FC_PH3)
1302 sp->cmn.fcphHigh = FC_PH3;
1303
1304
1305 if (phba->cfg_vmid_priority_tagging) {
1306 sp->cmn.priority_tagging = 1;
1307
1308 if (uuid_is_null((uuid_t *)vport->lpfc_vmid_host_uuid)) {
1309 memcpy(vport->lpfc_vmid_host_uuid, phba->wwpn,
1310 sizeof(phba->wwpn));
1311 memcpy(&vport->lpfc_vmid_host_uuid[8], phba->wwnn,
1312 sizeof(phba->wwnn));
1313 }
1314 }
1315
1316 if (phba->sli_rev == LPFC_SLI_REV4) {
1317 if (bf_get(lpfc_sli_intf_if_type, &phba->sli4_hba.sli_intf) ==
1318 LPFC_SLI_INTF_IF_TYPE_0) {
1319
1320 ct = SLI4_CT_FCFI;
1321 bf_set(wqe_ct, &wqe->els_req.wqe_com, ct);
1322
1323
1324 bf_set(wqe_ctxt_tag, &wqe->els_req.wqe_com,
1325 phba->fcf.fcfi);
1326 }
1327
1328
1329 sp->cls2.classValid = 0;
1330 sp->cls2.seqDelivery = 0;
1331 } else {
1332
1333 sp->cls2.seqDelivery = (sp->cls2.classValid) ? 1 : 0;
1334 sp->cls3.seqDelivery = (sp->cls3.classValid) ? 1 : 0;
1335 if (phba->sli3_options & LPFC_SLI3_NPIV_ENABLED) {
1336 sp->cmn.request_multiple_Nport = 1;
1337
1338 icmd->ulpCt_h = 1;
1339 icmd->ulpCt_l = 0;
1340 } else {
1341 sp->cmn.request_multiple_Nport = 0;
1342 }
1343
1344 if (phba->fc_topology != LPFC_TOPOLOGY_LOOP) {
1345 icmd->un.elsreq64.myID = 0;
1346 icmd->un.elsreq64.fl = 1;
1347 }
1348 }
1349
1350 tmo = phba->fc_ratov;
1351 phba->fc_ratov = LPFC_DISC_FLOGI_TMO;
1352 lpfc_set_disctmo(vport);
1353 phba->fc_ratov = tmo;
1354
1355 phba->fc_stat.elsXmitFLOGI++;
1356 elsiocb->cmd_cmpl = lpfc_cmpl_els_flogi;
1357
1358 lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_CMD,
1359 "Issue FLOGI: opt:x%x",
1360 phba->sli3_options, 0, 0);
1361
1362 elsiocb->ndlp = lpfc_nlp_get(ndlp);
1363 if (!elsiocb->ndlp) {
1364 lpfc_els_free_iocb(phba, elsiocb);
1365 return 1;
1366 }
1367
1368 rc = lpfc_issue_fabric_iocb(phba, elsiocb);
1369 if (rc == IOCB_ERROR) {
1370 lpfc_els_free_iocb(phba, elsiocb);
1371 lpfc_nlp_put(ndlp);
1372 return 1;
1373 }
1374
1375 phba->hba_flag |= (HBA_FLOGI_ISSUED | HBA_FLOGI_OUTSTANDING);
1376
1377
1378 phba->link_flag &= ~LS_EXTERNAL_LOOPBACK;
1379
1380
1381 if (phba->defer_flogi_acc_flag) {
1382
1383 ndlp = lpfc_findnode_did(vport, 0);
1384 if (!ndlp)
1385 return 0;
1386
1387 did = vport->fc_myDID;
1388 vport->fc_myDID = Fabric_DID;
1389
1390 memset(&defer_flogi_acc, 0, sizeof(struct lpfc_iocbq));
1391
1392 if (phba->sli_rev == LPFC_SLI_REV4) {
1393 bf_set(wqe_ctxt_tag,
1394 &defer_flogi_acc.wqe.xmit_els_rsp.wqe_com,
1395 phba->defer_flogi_acc_rx_id);
1396 bf_set(wqe_rcvoxid,
1397 &defer_flogi_acc.wqe.xmit_els_rsp.wqe_com,
1398 phba->defer_flogi_acc_ox_id);
1399 } else {
1400 icmd = &defer_flogi_acc.iocb;
1401 icmd->ulpContext = phba->defer_flogi_acc_rx_id;
1402 icmd->unsli3.rcvsli3.ox_id =
1403 phba->defer_flogi_acc_ox_id;
1404 }
1405
1406 lpfc_printf_vlog(vport, KERN_INFO, LOG_ELS,
1407 "3354 Xmit deferred FLOGI ACC: rx_id: x%x,"
1408 " ox_id: x%x, hba_flag x%x\n",
1409 phba->defer_flogi_acc_rx_id,
1410 phba->defer_flogi_acc_ox_id, phba->hba_flag);
1411
1412
1413 lpfc_els_rsp_acc(vport, ELS_CMD_FLOGI, &defer_flogi_acc,
1414 ndlp, NULL);
1415
1416 phba->defer_flogi_acc_flag = false;
1417 vport->fc_myDID = did;
1418
1419
1420
1421
1422 lpfc_nlp_put(ndlp);
1423 }
1424
1425 return 0;
1426 }
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442 int
1443 lpfc_els_abort_flogi(struct lpfc_hba *phba)
1444 {
1445 struct lpfc_sli_ring *pring;
1446 struct lpfc_iocbq *iocb, *next_iocb;
1447 struct lpfc_nodelist *ndlp;
1448 u32 ulp_command;
1449
1450
1451 lpfc_printf_log(phba, KERN_INFO, LOG_DISCOVERY,
1452 "0201 Abort outstanding I/O on NPort x%x\n",
1453 Fabric_DID);
1454
1455 pring = lpfc_phba_elsring(phba);
1456 if (unlikely(!pring))
1457 return -EIO;
1458
1459
1460
1461
1462
1463 spin_lock_irq(&phba->hbalock);
1464 list_for_each_entry_safe(iocb, next_iocb, &pring->txcmplq, list) {
1465 ulp_command = get_job_cmnd(phba, iocb);
1466 if (ulp_command == CMD_ELS_REQUEST64_CR) {
1467 ndlp = iocb->ndlp;
1468 if (ndlp && ndlp->nlp_DID == Fabric_DID) {
1469 if ((phba->pport->fc_flag & FC_PT2PT) &&
1470 !(phba->pport->fc_flag & FC_PT2PT_PLOGI))
1471 iocb->fabric_cmd_cmpl =
1472 lpfc_ignore_els_cmpl;
1473 lpfc_sli_issue_abort_iotag(phba, pring, iocb,
1474 NULL);
1475 }
1476 }
1477 }
1478
1479 lpfc_issue_hb_tmo(phba);
1480
1481 spin_unlock_irq(&phba->hbalock);
1482
1483 return 0;
1484 }
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502 int
1503 lpfc_initial_flogi(struct lpfc_vport *vport)
1504 {
1505 struct lpfc_nodelist *ndlp;
1506
1507 vport->port_state = LPFC_FLOGI;
1508 lpfc_set_disctmo(vport);
1509
1510
1511 ndlp = lpfc_findnode_did(vport, Fabric_DID);
1512 if (!ndlp) {
1513
1514 ndlp = lpfc_nlp_init(vport, Fabric_DID);
1515 if (!ndlp)
1516 return 0;
1517
1518 ndlp->nlp_type |= NLP_FABRIC;
1519
1520
1521 lpfc_enqueue_node(vport, ndlp);
1522 }
1523
1524
1525 vport->fc_flag &= ~FC_FABRIC;
1526 if (lpfc_issue_els_flogi(vport, ndlp, 0)) {
1527
1528
1529
1530
1531 if (!(ndlp->fc4_xpt_flags & (SCSI_XPT_REGD | NVME_XPT_REGD)) &&
1532 !(ndlp->nlp_flag & NLP_IN_DEV_LOSS))
1533 lpfc_nlp_put(ndlp);
1534 return 0;
1535 }
1536 return 1;
1537 }
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555 int
1556 lpfc_initial_fdisc(struct lpfc_vport *vport)
1557 {
1558 struct lpfc_nodelist *ndlp;
1559
1560
1561 ndlp = lpfc_findnode_did(vport, Fabric_DID);
1562 if (!ndlp) {
1563
1564 ndlp = lpfc_nlp_init(vport, Fabric_DID);
1565 if (!ndlp)
1566 return 0;
1567
1568
1569 ndlp->nlp_type |= NLP_FABRIC;
1570
1571
1572 lpfc_enqueue_node(vport, ndlp);
1573 }
1574
1575 if (lpfc_issue_els_fdisc(vport, ndlp, 0)) {
1576
1577
1578
1579
1580 if (!(ndlp->fc4_xpt_flags & (SCSI_XPT_REGD | NVME_XPT_REGD)) &&
1581 !(ndlp->nlp_flag & NLP_IN_DEV_LOSS))
1582 lpfc_nlp_put(ndlp);
1583 return 0;
1584 }
1585 return 1;
1586 }
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599 void
1600 lpfc_more_plogi(struct lpfc_vport *vport)
1601 {
1602 if (vport->num_disc_nodes)
1603 vport->num_disc_nodes--;
1604
1605
1606 lpfc_printf_vlog(vport, KERN_INFO, LOG_DISCOVERY,
1607 "0232 Continue discovery with %d PLOGIs to go "
1608 "Data: x%x x%x x%x\n",
1609 vport->num_disc_nodes, vport->fc_plogi_cnt,
1610 vport->fc_flag, vport->port_state);
1611
1612 if (vport->fc_flag & FC_NLP_MORE)
1613
1614 lpfc_els_disc_plogi(vport);
1615
1616 return;
1617 }
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650 static struct lpfc_nodelist *
1651 lpfc_plogi_confirm_nport(struct lpfc_hba *phba, uint32_t *prsp,
1652 struct lpfc_nodelist *ndlp)
1653 {
1654 struct lpfc_vport *vport = ndlp->vport;
1655 struct lpfc_nodelist *new_ndlp;
1656 struct serv_parm *sp;
1657 uint8_t name[sizeof(struct lpfc_name)];
1658 uint32_t keepDID = 0, keep_nlp_flag = 0;
1659 uint32_t keep_new_nlp_flag = 0;
1660 uint16_t keep_nlp_state;
1661 u32 keep_nlp_fc4_type = 0;
1662 struct lpfc_nvme_rport *keep_nrport = NULL;
1663 unsigned long *active_rrqs_xri_bitmap = NULL;
1664
1665
1666
1667
1668 if (ndlp->nlp_type & NLP_FABRIC)
1669 return ndlp;
1670
1671 sp = (struct serv_parm *) ((uint8_t *) prsp + sizeof(uint32_t));
1672 memset(name, 0, sizeof(struct lpfc_name));
1673
1674
1675
1676
1677 new_ndlp = lpfc_findnode_wwpn(vport, &sp->portName);
1678
1679
1680 if (!new_ndlp || (new_ndlp == ndlp))
1681 return ndlp;
1682
1683
1684
1685
1686
1687 lpfc_nlp_unreg_node(vport, new_ndlp);
1688
1689 if (phba->sli_rev == LPFC_SLI_REV4) {
1690 active_rrqs_xri_bitmap = mempool_alloc(phba->active_rrq_pool,
1691 GFP_KERNEL);
1692 if (active_rrqs_xri_bitmap)
1693 memset(active_rrqs_xri_bitmap, 0,
1694 phba->cfg_rrq_xri_bitmap_sz);
1695 }
1696
1697 lpfc_printf_vlog(vport, KERN_INFO, LOG_ELS | LOG_NODE,
1698 "3178 PLOGI confirm: ndlp x%x x%x x%x: "
1699 "new_ndlp x%x x%x x%x\n",
1700 ndlp->nlp_DID, ndlp->nlp_flag, ndlp->nlp_fc4_type,
1701 (new_ndlp ? new_ndlp->nlp_DID : 0),
1702 (new_ndlp ? new_ndlp->nlp_flag : 0),
1703 (new_ndlp ? new_ndlp->nlp_fc4_type : 0));
1704
1705 keepDID = new_ndlp->nlp_DID;
1706
1707 if (phba->sli_rev == LPFC_SLI_REV4 && active_rrqs_xri_bitmap)
1708 memcpy(active_rrqs_xri_bitmap, new_ndlp->active_rrqs_xri_bitmap,
1709 phba->cfg_rrq_xri_bitmap_sz);
1710
1711
1712
1713
1714
1715
1716 if (vport->fc_flag & FC_FABRIC) {
1717 keep_nlp_fc4_type = new_ndlp->nlp_fc4_type;
1718 new_ndlp->nlp_fc4_type = ndlp->nlp_fc4_type;
1719 }
1720
1721 lpfc_unreg_rpi(vport, new_ndlp);
1722 new_ndlp->nlp_DID = ndlp->nlp_DID;
1723 new_ndlp->nlp_prev_state = ndlp->nlp_prev_state;
1724 if (phba->sli_rev == LPFC_SLI_REV4)
1725 memcpy(new_ndlp->active_rrqs_xri_bitmap,
1726 ndlp->active_rrqs_xri_bitmap,
1727 phba->cfg_rrq_xri_bitmap_sz);
1728
1729
1730 spin_lock_irq(&ndlp->lock);
1731 spin_lock_irq(&new_ndlp->lock);
1732 keep_new_nlp_flag = new_ndlp->nlp_flag;
1733 keep_nlp_flag = ndlp->nlp_flag;
1734 new_ndlp->nlp_flag = ndlp->nlp_flag;
1735
1736
1737 if (keep_new_nlp_flag & NLP_UNREG_INP)
1738 new_ndlp->nlp_flag |= NLP_UNREG_INP;
1739 else
1740 new_ndlp->nlp_flag &= ~NLP_UNREG_INP;
1741
1742
1743 if (keep_new_nlp_flag & NLP_RPI_REGISTERED)
1744 new_ndlp->nlp_flag |= NLP_RPI_REGISTERED;
1745 else
1746 new_ndlp->nlp_flag &= ~NLP_RPI_REGISTERED;
1747
1748
1749
1750
1751
1752 if (keep_new_nlp_flag & NLP_DROPPED)
1753 new_ndlp->nlp_flag |= NLP_DROPPED;
1754 else
1755 new_ndlp->nlp_flag &= ~NLP_DROPPED;
1756
1757 ndlp->nlp_flag = keep_new_nlp_flag;
1758
1759
1760 if (keep_nlp_flag & NLP_UNREG_INP)
1761 ndlp->nlp_flag |= NLP_UNREG_INP;
1762 else
1763 ndlp->nlp_flag &= ~NLP_UNREG_INP;
1764
1765
1766 if (keep_nlp_flag & NLP_RPI_REGISTERED)
1767 ndlp->nlp_flag |= NLP_RPI_REGISTERED;
1768 else
1769 ndlp->nlp_flag &= ~NLP_RPI_REGISTERED;
1770
1771
1772
1773
1774
1775 if (keep_nlp_flag & NLP_DROPPED)
1776 ndlp->nlp_flag |= NLP_DROPPED;
1777 else
1778 ndlp->nlp_flag &= ~NLP_DROPPED;
1779
1780 spin_unlock_irq(&new_ndlp->lock);
1781 spin_unlock_irq(&ndlp->lock);
1782
1783
1784 keep_nlp_state = new_ndlp->nlp_state;
1785 lpfc_nlp_set_state(vport, new_ndlp, ndlp->nlp_state);
1786
1787
1788 keep_nrport = new_ndlp->nrport;
1789 new_ndlp->nrport = ndlp->nrport;
1790
1791
1792 if (memcmp(&ndlp->nlp_portname, name, sizeof(struct lpfc_name)) == 0) {
1793
1794
1795
1796
1797 lpfc_printf_vlog(vport, KERN_INFO, LOG_ELS,
1798 "3179 PLOGI confirm NEW: %x %x\n",
1799 new_ndlp->nlp_DID, keepDID);
1800
1801
1802
1803
1804
1805 ndlp->nlp_DID = keepDID;
1806 ndlp->nlp_fc4_type = keep_nlp_fc4_type;
1807 lpfc_nlp_set_state(vport, ndlp, keep_nlp_state);
1808 if (phba->sli_rev == LPFC_SLI_REV4 &&
1809 active_rrqs_xri_bitmap)
1810 memcpy(ndlp->active_rrqs_xri_bitmap,
1811 active_rrqs_xri_bitmap,
1812 phba->cfg_rrq_xri_bitmap_sz);
1813
1814 } else {
1815 lpfc_printf_vlog(vport, KERN_INFO, LOG_ELS,
1816 "3180 PLOGI confirm SWAP: %x %x\n",
1817 new_ndlp->nlp_DID, keepDID);
1818
1819 lpfc_unreg_rpi(vport, ndlp);
1820
1821
1822
1823
1824 ndlp->nlp_DID = keepDID;
1825 ndlp->nlp_fc4_type = keep_nlp_fc4_type;
1826
1827 if (phba->sli_rev == LPFC_SLI_REV4 &&
1828 active_rrqs_xri_bitmap)
1829 memcpy(ndlp->active_rrqs_xri_bitmap,
1830 active_rrqs_xri_bitmap,
1831 phba->cfg_rrq_xri_bitmap_sz);
1832
1833
1834
1835
1836 if ((ndlp->nlp_state == NLP_STE_UNMAPPED_NODE) ||
1837 (ndlp->nlp_state == NLP_STE_MAPPED_NODE))
1838 keep_nlp_state = NLP_STE_NPR_NODE;
1839 lpfc_nlp_set_state(vport, ndlp, keep_nlp_state);
1840 ndlp->nrport = keep_nrport;
1841 }
1842
1843
1844
1845
1846
1847 if (!ndlp->rport && (ndlp->nlp_state == NLP_STE_NPR_NODE))
1848 lpfc_disc_state_machine(vport, ndlp, NULL, NLP_EVT_DEVICE_RM);
1849
1850 if (phba->sli_rev == LPFC_SLI_REV4 &&
1851 active_rrqs_xri_bitmap)
1852 mempool_free(active_rrqs_xri_bitmap,
1853 phba->active_rrq_pool);
1854
1855 lpfc_printf_vlog(vport, KERN_INFO, LOG_ELS | LOG_NODE,
1856 "3173 PLOGI confirm exit: new_ndlp x%x x%x x%x\n",
1857 new_ndlp->nlp_DID, new_ndlp->nlp_flag,
1858 new_ndlp->nlp_fc4_type);
1859
1860 return new_ndlp;
1861 }
1862
1863
1864
1865
1866
1867
1868
1869
1870
1871
1872
1873
1874 void
1875 lpfc_end_rscn(struct lpfc_vport *vport)
1876 {
1877 struct Scsi_Host *shost = lpfc_shost_from_vport(vport);
1878
1879 if (vport->fc_flag & FC_RSCN_MODE) {
1880
1881
1882
1883
1884 if (vport->fc_rscn_id_cnt ||
1885 (vport->fc_flag & FC_RSCN_DISCOVERY) != 0)
1886 lpfc_els_handle_rscn(vport);
1887 else {
1888 spin_lock_irq(shost->host_lock);
1889 vport->fc_flag &= ~FC_RSCN_MODE;
1890 spin_unlock_irq(shost->host_lock);
1891 }
1892 }
1893 }
1894
1895
1896
1897
1898
1899
1900
1901
1902
1903
1904
1905
1906
1907 static void
1908 lpfc_cmpl_els_rrq(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
1909 struct lpfc_iocbq *rspiocb)
1910 {
1911 struct lpfc_vport *vport = cmdiocb->vport;
1912 struct lpfc_nodelist *ndlp = cmdiocb->ndlp;
1913 struct lpfc_node_rrq *rrq;
1914 u32 ulp_status = get_job_ulpstatus(phba, rspiocb);
1915 u32 ulp_word4 = get_job_word4(phba, rspiocb);
1916
1917
1918 rrq = cmdiocb->context_un.rrq;
1919 cmdiocb->rsp_iocb = rspiocb;
1920
1921 lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_CMD,
1922 "RRQ cmpl: status:x%x/x%x did:x%x",
1923 ulp_status, ulp_word4,
1924 get_job_els_rsp64_did(phba, cmdiocb));
1925
1926
1927
1928 lpfc_printf_vlog(vport, KERN_INFO, LOG_ELS,
1929 "2880 RRQ completes to DID x%x "
1930 "Data: x%x x%x x%x x%x x%x\n",
1931 ndlp->nlp_DID, ulp_status, ulp_word4,
1932 get_wqe_tmo(cmdiocb), rrq->xritag, rrq->rxid);
1933
1934 if (ulp_status) {
1935
1936
1937 if (ulp_status != IOSTAT_LS_RJT ||
1938 (((ulp_word4) >> 16 != LSRJT_INVALID_CMD) &&
1939 ((ulp_word4) >> 16 != LSRJT_UNABLE_TPC)) ||
1940 (phba)->pport->cfg_log_verbose & LOG_ELS)
1941 lpfc_printf_vlog(vport, KERN_ERR, LOG_TRACE_EVENT,
1942 "2881 RRQ failure DID:%06X Status:"
1943 "x%x/x%x\n",
1944 ndlp->nlp_DID, ulp_status,
1945 ulp_word4);
1946 }
1947
1948 lpfc_clr_rrq_active(phba, rrq->xritag, rrq);
1949 lpfc_els_free_iocb(phba, cmdiocb);
1950 lpfc_nlp_put(ndlp);
1951 return;
1952 }
1953
1954
1955
1956
1957
1958
1959
1960
1961
1962
1963
1964
1965
1966
1967
1968
1969
1970
1971
1972
1973 static void
1974 lpfc_cmpl_els_plogi(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
1975 struct lpfc_iocbq *rspiocb)
1976 {
1977 struct lpfc_vport *vport = cmdiocb->vport;
1978 struct Scsi_Host *shost = lpfc_shost_from_vport(vport);
1979 IOCB_t *irsp;
1980 struct lpfc_nodelist *ndlp, *free_ndlp;
1981 struct lpfc_dmabuf *prsp;
1982 int disc;
1983 struct serv_parm *sp = NULL;
1984 u32 ulp_status, ulp_word4, did, iotag;
1985 bool release_node = false;
1986
1987
1988 cmdiocb->rsp_iocb = rspiocb;
1989
1990 ulp_status = get_job_ulpstatus(phba, rspiocb);
1991 ulp_word4 = get_job_word4(phba, rspiocb);
1992 did = get_job_els_rsp64_did(phba, cmdiocb);
1993
1994 if (phba->sli_rev == LPFC_SLI_REV4) {
1995 iotag = get_wqe_reqtag(cmdiocb);
1996 } else {
1997 irsp = &rspiocb->iocb;
1998 iotag = irsp->ulpIoTag;
1999 }
2000
2001 lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_CMD,
2002 "PLOGI cmpl: status:x%x/x%x did:x%x",
2003 ulp_status, ulp_word4, did);
2004
2005 ndlp = lpfc_findnode_did(vport, did);
2006 if (!ndlp) {
2007 lpfc_printf_vlog(vport, KERN_ERR, LOG_TRACE_EVENT,
2008 "0136 PLOGI completes to NPort x%x "
2009 "with no ndlp. Data: x%x x%x x%x\n",
2010 did, ulp_status, ulp_word4, iotag);
2011 goto out_freeiocb;
2012 }
2013
2014
2015
2016
2017 spin_lock_irq(&ndlp->lock);
2018 disc = (ndlp->nlp_flag & NLP_NPR_2B_DISC);
2019 ndlp->nlp_flag &= ~NLP_NPR_2B_DISC;
2020 spin_unlock_irq(&ndlp->lock);
2021
2022
2023 lpfc_printf_vlog(vport, KERN_INFO, LOG_ELS,
2024 "0102 PLOGI completes to NPort x%06x "
2025 "Data: x%x x%x x%x x%x x%x\n",
2026 ndlp->nlp_DID, ndlp->nlp_fc4_type,
2027 ulp_status, ulp_word4,
2028 disc, vport->num_disc_nodes);
2029
2030
2031 if (lpfc_els_chk_latt(vport)) {
2032 spin_lock_irq(&ndlp->lock);
2033 ndlp->nlp_flag |= NLP_NPR_2B_DISC;
2034 spin_unlock_irq(&ndlp->lock);
2035 goto out;
2036 }
2037
2038 if (ulp_status) {
2039
2040 if (lpfc_els_retry(phba, cmdiocb, rspiocb)) {
2041
2042 if (disc) {
2043 spin_lock_irq(&ndlp->lock);
2044 ndlp->nlp_flag |= NLP_NPR_2B_DISC;
2045 spin_unlock_irq(&ndlp->lock);
2046 }
2047 goto out;
2048 }
2049
2050 if (ulp_status != IOSTAT_LS_RJT ||
2051 (((ulp_word4) >> 16 != LSRJT_INVALID_CMD) &&
2052 ((ulp_word4) >> 16 != LSRJT_UNABLE_TPC)) ||
2053 (phba)->pport->cfg_log_verbose & LOG_ELS)
2054 lpfc_printf_vlog(vport, KERN_ERR, LOG_TRACE_EVENT,
2055 "2753 PLOGI failure DID:%06X "
2056 "Status:x%x/x%x\n",
2057 ndlp->nlp_DID, ulp_status,
2058 ulp_word4);
2059
2060
2061 if (!lpfc_error_lost_link(ulp_status, ulp_word4))
2062 lpfc_disc_state_machine(vport, ndlp, cmdiocb,
2063 NLP_EVT_CMPL_PLOGI);
2064
2065
2066
2067
2068 spin_lock_irq(&ndlp->lock);
2069 if ((ndlp->nlp_flag & (NLP_ACC_REGLOGIN | NLP_RCV_PLOGI)) &&
2070 ndlp->nlp_state == NLP_STE_REG_LOGIN_ISSUE) {
2071 spin_unlock_irq(&ndlp->lock);
2072 goto out;
2073 }
2074
2075
2076
2077
2078
2079 if (!(ndlp->fc4_xpt_flags & (SCSI_XPT_REGD | NVME_XPT_REGD))) {
2080 ndlp->nlp_flag &= ~NLP_NPR_2B_DISC;
2081 if (!(ndlp->nlp_flag & NLP_IN_DEV_LOSS))
2082 release_node = true;
2083 }
2084 spin_unlock_irq(&ndlp->lock);
2085
2086 if (release_node)
2087 lpfc_disc_state_machine(vport, ndlp, cmdiocb,
2088 NLP_EVT_DEVICE_RM);
2089 } else {
2090
2091 prsp = list_entry(cmdiocb->cmd_dmabuf->list.next,
2092 struct lpfc_dmabuf, list);
2093 ndlp = lpfc_plogi_confirm_nport(phba, prsp->virt, ndlp);
2094
2095 sp = (struct serv_parm *)((u8 *)prsp->virt +
2096 sizeof(u32));
2097
2098 ndlp->vmid_support = 0;
2099 if ((phba->cfg_vmid_app_header && sp->cmn.app_hdr_support) ||
2100 (phba->cfg_vmid_priority_tagging &&
2101 sp->cmn.priority_tagging)) {
2102 lpfc_printf_log(phba, KERN_DEBUG, LOG_ELS,
2103 "4018 app_hdr_support %d tagging %d DID x%x\n",
2104 sp->cmn.app_hdr_support,
2105 sp->cmn.priority_tagging,
2106 ndlp->nlp_DID);
2107
2108 ndlp->vmid_support = 1;
2109 }
2110
2111 lpfc_disc_state_machine(vport, ndlp, cmdiocb,
2112 NLP_EVT_CMPL_PLOGI);
2113 }
2114
2115 if (disc && vport->num_disc_nodes) {
2116
2117 lpfc_more_plogi(vport);
2118
2119 if (vport->num_disc_nodes == 0) {
2120 spin_lock_irq(shost->host_lock);
2121 vport->fc_flag &= ~FC_NDISC_ACTIVE;
2122 spin_unlock_irq(shost->host_lock);
2123
2124 lpfc_can_disctmo(vport);
2125 lpfc_end_rscn(vport);
2126 }
2127 }
2128
2129 out:
2130 lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_NODE,
2131 "PLOGI Cmpl PUT: did:x%x refcnt %d",
2132 ndlp->nlp_DID, kref_read(&ndlp->kref), 0);
2133
2134 out_freeiocb:
2135
2136 free_ndlp = cmdiocb->ndlp;
2137
2138 lpfc_els_free_iocb(phba, cmdiocb);
2139 lpfc_nlp_put(free_ndlp);
2140 return;
2141 }
2142
2143
2144
2145
2146
2147
2148
2149
2150
2151
2152
2153
2154
2155
2156
2157
2158
2159
2160
2161
2162
2163 int
2164 lpfc_issue_els_plogi(struct lpfc_vport *vport, uint32_t did, uint8_t retry)
2165 {
2166 struct lpfc_hba *phba = vport->phba;
2167 struct serv_parm *sp;
2168 struct lpfc_nodelist *ndlp;
2169 struct lpfc_iocbq *elsiocb;
2170 uint8_t *pcmd;
2171 uint16_t cmdsize;
2172 int ret;
2173
2174 ndlp = lpfc_findnode_did(vport, did);
2175 if (!ndlp)
2176 return 1;
2177
2178
2179
2180
2181
2182 if ((ndlp->nlp_flag & NLP_UNREG_INP) &&
2183 ((ndlp->nlp_DID & Fabric_DID_MASK) != Fabric_DID_MASK) &&
2184 !(vport->fc_flag & FC_OFFLINE_MODE)) {
2185 lpfc_printf_vlog(vport, KERN_INFO, LOG_DISCOVERY,
2186 "4110 Issue PLOGI x%x deferred "
2187 "on NPort x%x rpi x%x Data: x%px\n",
2188 ndlp->nlp_defer_did, ndlp->nlp_DID,
2189 ndlp->nlp_rpi, ndlp);
2190
2191
2192 if (ndlp->nlp_defer_did == NLP_EVT_NOTHING_PENDING)
2193 ndlp->nlp_defer_did = did;
2194 return 0;
2195 }
2196
2197 cmdsize = (sizeof(uint32_t) + sizeof(struct serv_parm));
2198 elsiocb = lpfc_prep_els_iocb(vport, 1, cmdsize, retry, ndlp, did,
2199 ELS_CMD_PLOGI);
2200 if (!elsiocb)
2201 return 1;
2202
2203 spin_lock_irq(&ndlp->lock);
2204 ndlp->nlp_flag &= ~NLP_FCP_PRLI_RJT;
2205 spin_unlock_irq(&ndlp->lock);
2206
2207 pcmd = (uint8_t *)elsiocb->cmd_dmabuf->virt;
2208
2209
2210 *((uint32_t *) (pcmd)) = ELS_CMD_PLOGI;
2211 pcmd += sizeof(uint32_t);
2212 memcpy(pcmd, &vport->fc_sparam, sizeof(struct serv_parm));
2213 sp = (struct serv_parm *) pcmd;
2214
2215
2216
2217
2218
2219 if ((vport->fc_flag & FC_FABRIC) && !(vport->fc_flag & FC_PUBLIC_LOOP))
2220 sp->cmn.altBbCredit = 1;
2221
2222 if (sp->cmn.fcphLow < FC_PH_4_3)
2223 sp->cmn.fcphLow = FC_PH_4_3;
2224
2225 if (sp->cmn.fcphHigh < FC_PH3)
2226 sp->cmn.fcphHigh = FC_PH3;
2227
2228 sp->cmn.valid_vendor_ver_level = 0;
2229 memset(sp->un.vendorVersion, 0, sizeof(sp->un.vendorVersion));
2230 sp->cmn.bbRcvSizeMsb &= 0xF;
2231
2232
2233 ndlp->vmid_support = 0;
2234 if (vport->vmid_priority_tagging)
2235 sp->cmn.priority_tagging = 1;
2236 else if (phba->cfg_vmid_app_header &&
2237 bf_get(lpfc_ftr_ashdr, &phba->sli4_hba.sli4_flags))
2238 sp->cmn.app_hdr_support = 1;
2239
2240 lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_CMD,
2241 "Issue PLOGI: did:x%x",
2242 did, 0, 0);
2243
2244
2245
2246
2247 if (phba->sli.sli_flag & LPFC_SLI_SUPPRESS_RSP) {
2248 sp->cmn.valid_vendor_ver_level = 1;
2249 sp->un.vv.vid = cpu_to_be32(LPFC_VV_EMLX_ID);
2250 sp->un.vv.flags = cpu_to_be32(LPFC_VV_SUPPRESS_RSP);
2251 }
2252
2253 phba->fc_stat.elsXmitPLOGI++;
2254 elsiocb->cmd_cmpl = lpfc_cmpl_els_plogi;
2255
2256 lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_CMD,
2257 "Issue PLOGI: did:x%x refcnt %d",
2258 did, kref_read(&ndlp->kref), 0);
2259 elsiocb->ndlp = lpfc_nlp_get(ndlp);
2260 if (!elsiocb->ndlp) {
2261 lpfc_els_free_iocb(phba, elsiocb);
2262 return 1;
2263 }
2264
2265 ret = lpfc_sli_issue_iocb(phba, LPFC_ELS_RING, elsiocb, 0);
2266 if (ret) {
2267 lpfc_els_free_iocb(phba, elsiocb);
2268 lpfc_nlp_put(ndlp);
2269 return 1;
2270 }
2271
2272 return 0;
2273 }
2274
2275
2276
2277
2278
2279
2280
2281
2282
2283
2284
2285
2286
2287
2288 static void
2289 lpfc_cmpl_els_prli(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
2290 struct lpfc_iocbq *rspiocb)
2291 {
2292 struct lpfc_vport *vport = cmdiocb->vport;
2293 struct lpfc_nodelist *ndlp;
2294 char *mode;
2295 u32 loglevel;
2296 u32 ulp_status;
2297 u32 ulp_word4;
2298 bool release_node = false;
2299
2300
2301 cmdiocb->rsp_iocb = rspiocb;
2302
2303 ndlp = cmdiocb->ndlp;
2304
2305 ulp_status = get_job_ulpstatus(phba, rspiocb);
2306 ulp_word4 = get_job_word4(phba, rspiocb);
2307
2308 spin_lock_irq(&ndlp->lock);
2309 ndlp->nlp_flag &= ~NLP_PRLI_SND;
2310
2311
2312 vport->fc_prli_sent--;
2313 ndlp->fc4_prli_sent--;
2314 spin_unlock_irq(&ndlp->lock);
2315
2316 lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_CMD,
2317 "PRLI cmpl: status:x%x/x%x did:x%x",
2318 ulp_status, ulp_word4,
2319 ndlp->nlp_DID);
2320
2321
2322 lpfc_printf_vlog(vport, KERN_INFO, LOG_ELS,
2323 "0103 PRLI completes to NPort x%06x "
2324 "Data: x%x x%x x%x x%x\n",
2325 ndlp->nlp_DID, ulp_status, ulp_word4,
2326 vport->num_disc_nodes, ndlp->fc4_prli_sent);
2327
2328
2329 if (lpfc_els_chk_latt(vport))
2330 goto out;
2331
2332 if (ulp_status) {
2333
2334 if (lpfc_els_retry(phba, cmdiocb, rspiocb)) {
2335
2336 goto out;
2337 }
2338
2339
2340
2341
2342 if ((vport->fc_flag & FC_FABRIC) ||
2343 (vport->cfg_enable_fc4_type != LPFC_ENABLE_BOTH)) {
2344 mode = KERN_ERR;
2345 loglevel = LOG_TRACE_EVENT;
2346 } else {
2347 mode = KERN_INFO;
2348 loglevel = LOG_ELS;
2349 }
2350
2351
2352 lpfc_printf_vlog(vport, mode, loglevel,
2353 "2754 PRLI failure DID:%06X Status:x%x/x%x, "
2354 "data: x%x\n",
2355 ndlp->nlp_DID, ulp_status,
2356 ulp_word4, ndlp->fc4_prli_sent);
2357
2358
2359 if (!lpfc_error_lost_link(ulp_status, ulp_word4))
2360 lpfc_disc_state_machine(vport, ndlp, cmdiocb,
2361 NLP_EVT_CMPL_PRLI);
2362
2363
2364
2365
2366
2367 if (vport->fc_flag & FC_PT2PT)
2368 goto out;
2369
2370
2371
2372
2373
2374
2375 spin_lock_irq(&ndlp->lock);
2376 if (!(ndlp->fc4_xpt_flags & (SCSI_XPT_REGD | NVME_XPT_REGD)) &&
2377 !ndlp->fc4_prli_sent) {
2378 ndlp->nlp_flag &= ~NLP_NPR_2B_DISC;
2379 if (!(ndlp->nlp_flag & NLP_IN_DEV_LOSS))
2380 release_node = true;
2381 }
2382 spin_unlock_irq(&ndlp->lock);
2383
2384 if (release_node)
2385 lpfc_disc_state_machine(vport, ndlp, cmdiocb,
2386 NLP_EVT_DEVICE_RM);
2387 } else {
2388
2389
2390
2391
2392
2393 lpfc_disc_state_machine(vport, ndlp, cmdiocb,
2394 NLP_EVT_CMPL_PRLI);
2395 }
2396
2397 out:
2398 lpfc_els_free_iocb(phba, cmdiocb);
2399 lpfc_nlp_put(ndlp);
2400 return;
2401 }
2402
2403
2404
2405
2406
2407
2408
2409
2410
2411
2412
2413
2414
2415
2416
2417
2418
2419
2420
2421
2422
2423 int
2424 lpfc_issue_els_prli(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
2425 uint8_t retry)
2426 {
2427 int rc = 0;
2428 struct lpfc_hba *phba = vport->phba;
2429 PRLI *npr;
2430 struct lpfc_nvme_prli *npr_nvme;
2431 struct lpfc_iocbq *elsiocb;
2432 uint8_t *pcmd;
2433 uint16_t cmdsize;
2434 u32 local_nlp_type, elscmd;
2435
2436
2437
2438
2439
2440
2441
2442 if (phba->sli_rev == LPFC_SLI_REV4 &&
2443 vport->fc_flag & FC_RSCN_MODE &&
2444 vport->nvmei_support)
2445 ndlp->nlp_fc4_type |= NLP_FC4_NVME;
2446 local_nlp_type = ndlp->nlp_fc4_type;
2447
2448
2449
2450
2451 ndlp->nlp_type &= ~(NLP_FCP_TARGET | NLP_FCP_INITIATOR);
2452 ndlp->nlp_type &= ~(NLP_NVME_TARGET | NLP_NVME_INITIATOR);
2453 ndlp->nlp_fcp_info &= ~NLP_FCP_2_DEVICE;
2454 ndlp->nlp_flag &= ~(NLP_FIRSTBURST | NLP_NPR_2B_DISC);
2455 ndlp->nvme_fb_size = 0;
2456
2457 send_next_prli:
2458 if (local_nlp_type & NLP_FC4_FCP) {
2459
2460 cmdsize = (sizeof(uint32_t) + sizeof(PRLI));
2461 elscmd = ELS_CMD_PRLI;
2462 } else if (local_nlp_type & NLP_FC4_NVME) {
2463
2464 cmdsize = (sizeof(uint32_t) + sizeof(struct lpfc_nvme_prli));
2465 elscmd = ELS_CMD_NVMEPRLI;
2466 } else {
2467 lpfc_printf_vlog(vport, KERN_INFO, LOG_DISCOVERY,
2468 "3083 Unknown FC_TYPE x%x ndlp x%06x\n",
2469 ndlp->nlp_fc4_type, ndlp->nlp_DID);
2470 return 1;
2471 }
2472
2473
2474
2475
2476 if (phba->sli_rev == LPFC_SLI_REV3 &&
2477 ndlp->nlp_fc4_type == NLP_FC4_NVME) {
2478 lpfc_printf_vlog(vport, KERN_INFO, LOG_DISCOVERY,
2479 "3088 Rport fc4 type 0x%x not supported by SLI3 adapter\n",
2480 ndlp->nlp_type);
2481 lpfc_disc_state_machine(vport, ndlp, NULL, NLP_EVT_DEVICE_RM);
2482 return 1;
2483 }
2484
2485 elsiocb = lpfc_prep_els_iocb(vport, 1, cmdsize, retry, ndlp,
2486 ndlp->nlp_DID, elscmd);
2487 if (!elsiocb)
2488 return 1;
2489
2490 pcmd = (uint8_t *)elsiocb->cmd_dmabuf->virt;
2491
2492
2493 memset(pcmd, 0, cmdsize);
2494
2495 if (local_nlp_type & NLP_FC4_FCP) {
2496
2497
2498
2499
2500
2501 *((uint32_t *)(pcmd)) = ELS_CMD_PRLI;
2502 pcmd += sizeof(uint32_t);
2503 npr = (PRLI *)pcmd;
2504
2505
2506
2507
2508
2509 if (phba->vpd.rev.feaLevelHigh >= 0x02) {
2510 npr->ConfmComplAllowed = 1;
2511 npr->Retry = 1;
2512 npr->TaskRetryIdReq = 1;
2513 }
2514 npr->estabImagePair = 1;
2515 npr->readXferRdyDis = 1;
2516 if (vport->cfg_first_burst_size)
2517 npr->writeXferRdyDis = 1;
2518
2519
2520 npr->prliType = PRLI_FCP_TYPE;
2521 npr->initiatorFunc = 1;
2522 elsiocb->cmd_flag |= LPFC_PRLI_FCP_REQ;
2523
2524
2525 local_nlp_type &= ~NLP_FC4_FCP;
2526 } else if (local_nlp_type & NLP_FC4_NVME) {
2527
2528
2529
2530
2531 *((uint32_t *)(pcmd)) = ELS_CMD_NVMEPRLI;
2532 pcmd += sizeof(uint32_t);
2533 npr_nvme = (struct lpfc_nvme_prli *)pcmd;
2534 bf_set(prli_type_code, npr_nvme, PRLI_NVME_TYPE);
2535 bf_set(prli_estabImagePair, npr_nvme, 0);
2536 if (phba->nsler) {
2537 bf_set(prli_nsler, npr_nvme, 1);
2538 bf_set(prli_conf, npr_nvme, 1);
2539 }
2540
2541
2542 if ((phba->cfg_nvme_enable_fb) &&
2543 !phba->nvmet_support)
2544 bf_set(prli_fba, npr_nvme, 1);
2545
2546 if (phba->nvmet_support) {
2547 bf_set(prli_tgt, npr_nvme, 1);
2548 bf_set(prli_disc, npr_nvme, 1);
2549 } else {
2550 bf_set(prli_init, npr_nvme, 1);
2551 bf_set(prli_conf, npr_nvme, 1);
2552 }
2553
2554 npr_nvme->word1 = cpu_to_be32(npr_nvme->word1);
2555 npr_nvme->word4 = cpu_to_be32(npr_nvme->word4);
2556 elsiocb->cmd_flag |= LPFC_PRLI_NVME_REQ;
2557
2558
2559 local_nlp_type &= ~NLP_FC4_NVME;
2560 }
2561
2562 phba->fc_stat.elsXmitPRLI++;
2563 elsiocb->cmd_cmpl = lpfc_cmpl_els_prli;
2564
2565 lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_CMD,
2566 "Issue PRLI: did:x%x refcnt %d",
2567 ndlp->nlp_DID, kref_read(&ndlp->kref), 0);
2568 elsiocb->ndlp = lpfc_nlp_get(ndlp);
2569 if (!elsiocb->ndlp) {
2570 lpfc_els_free_iocb(phba, elsiocb);
2571 return 1;
2572 }
2573
2574 rc = lpfc_sli_issue_iocb(phba, LPFC_ELS_RING, elsiocb, 0);
2575 if (rc == IOCB_ERROR) {
2576 lpfc_els_free_iocb(phba, elsiocb);
2577 lpfc_nlp_put(ndlp);
2578 return 1;
2579 }
2580
2581
2582
2583
2584
2585 spin_lock_irq(&ndlp->lock);
2586 ndlp->nlp_flag |= NLP_PRLI_SND;
2587 vport->fc_prli_sent++;
2588 ndlp->fc4_prli_sent++;
2589 spin_unlock_irq(&ndlp->lock);
2590
2591
2592
2593
2594 if (phba->sli_rev == LPFC_SLI_REV4 &&
2595 local_nlp_type & (NLP_FC4_FCP | NLP_FC4_NVME))
2596 goto send_next_prli;
2597 else
2598 return 0;
2599 }
2600
2601
2602
2603
2604
2605
2606
2607
2608
2609
2610
2611
2612
2613 static void
2614 lpfc_rscn_disc(struct lpfc_vport *vport)
2615 {
2616 lpfc_can_disctmo(vport);
2617
2618
2619
2620 if (vport->fc_npr_cnt)
2621 if (lpfc_els_disc_plogi(vport))
2622 return;
2623
2624 lpfc_end_rscn(vport);
2625 }
2626
2627
2628
2629
2630
2631
2632
2633
2634
2635
2636
2637 static void
2638 lpfc_adisc_done(struct lpfc_vport *vport)
2639 {
2640 struct Scsi_Host *shost = lpfc_shost_from_vport(vport);
2641 struct lpfc_hba *phba = vport->phba;
2642
2643
2644
2645
2646
2647 if ((phba->sli3_options & LPFC_SLI3_NPIV_ENABLED) &&
2648 !(vport->fc_flag & FC_RSCN_MODE) &&
2649 (phba->sli_rev < LPFC_SLI_REV4)) {
2650
2651
2652
2653
2654
2655 if (!lpfc_is_link_up(phba))
2656 return;
2657
2658
2659
2660
2661
2662
2663
2664
2665
2666 lpfc_issue_clear_la(phba, vport);
2667 lpfc_issue_reg_vpi(phba, vport);
2668 return;
2669 }
2670
2671
2672
2673
2674 if (vport->port_state < LPFC_VPORT_READY) {
2675
2676 lpfc_issue_clear_la(phba, vport);
2677 if (!(vport->fc_flag & FC_ABORT_DISCOVERY)) {
2678 vport->num_disc_nodes = 0;
2679
2680 if (vport->fc_npr_cnt)
2681 lpfc_els_disc_plogi(vport);
2682 if (!vport->num_disc_nodes) {
2683 spin_lock_irq(shost->host_lock);
2684 vport->fc_flag &= ~FC_NDISC_ACTIVE;
2685 spin_unlock_irq(shost->host_lock);
2686 lpfc_can_disctmo(vport);
2687 lpfc_end_rscn(vport);
2688 }
2689 }
2690 vport->port_state = LPFC_VPORT_READY;
2691 } else
2692 lpfc_rscn_disc(vport);
2693 }
2694
2695
2696
2697
2698
2699
2700
2701
2702
2703
2704 void
2705 lpfc_more_adisc(struct lpfc_vport *vport)
2706 {
2707 if (vport->num_disc_nodes)
2708 vport->num_disc_nodes--;
2709
2710 lpfc_printf_vlog(vport, KERN_INFO, LOG_DISCOVERY,
2711 "0210 Continue discovery with %d ADISCs to go "
2712 "Data: x%x x%x x%x\n",
2713 vport->num_disc_nodes, vport->fc_adisc_cnt,
2714 vport->fc_flag, vport->port_state);
2715
2716 if (vport->fc_flag & FC_NLP_MORE) {
2717 lpfc_set_disctmo(vport);
2718
2719 lpfc_els_disc_adisc(vport);
2720 }
2721 if (!vport->num_disc_nodes)
2722 lpfc_adisc_done(vport);
2723 return;
2724 }
2725
2726
2727
2728
2729
2730
2731
2732
2733
2734
2735
2736
2737
2738
2739
2740
2741
2742 static void
2743 lpfc_cmpl_els_adisc(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
2744 struct lpfc_iocbq *rspiocb)
2745 {
2746 struct lpfc_vport *vport = cmdiocb->vport;
2747 IOCB_t *irsp;
2748 struct lpfc_nodelist *ndlp;
2749 int disc;
2750 u32 ulp_status, ulp_word4, tmo;
2751 bool release_node = false;
2752
2753
2754 cmdiocb->rsp_iocb = rspiocb;
2755
2756 ndlp = cmdiocb->ndlp;
2757
2758 ulp_status = get_job_ulpstatus(phba, rspiocb);
2759 ulp_word4 = get_job_word4(phba, rspiocb);
2760
2761 if (phba->sli_rev == LPFC_SLI_REV4) {
2762 tmo = get_wqe_tmo(cmdiocb);
2763 } else {
2764 irsp = &rspiocb->iocb;
2765 tmo = irsp->ulpTimeout;
2766 }
2767
2768 lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_CMD,
2769 "ADISC cmpl: status:x%x/x%x did:x%x",
2770 ulp_status, ulp_word4,
2771 ndlp->nlp_DID);
2772
2773
2774
2775
2776 spin_lock_irq(&ndlp->lock);
2777 disc = (ndlp->nlp_flag & NLP_NPR_2B_DISC);
2778 ndlp->nlp_flag &= ~(NLP_ADISC_SND | NLP_NPR_2B_DISC);
2779 spin_unlock_irq(&ndlp->lock);
2780
2781 lpfc_printf_vlog(vport, KERN_INFO, LOG_ELS,
2782 "0104 ADISC completes to NPort x%x "
2783 "Data: x%x x%x x%x x%x x%x\n",
2784 ndlp->nlp_DID, ulp_status, ulp_word4,
2785 tmo, disc, vport->num_disc_nodes);
2786
2787 if (lpfc_els_chk_latt(vport)) {
2788 spin_lock_irq(&ndlp->lock);
2789 ndlp->nlp_flag |= NLP_NPR_2B_DISC;
2790 spin_unlock_irq(&ndlp->lock);
2791 goto out;
2792 }
2793
2794 if (ulp_status) {
2795
2796 if (lpfc_els_retry(phba, cmdiocb, rspiocb)) {
2797
2798 if (disc) {
2799 spin_lock_irq(&ndlp->lock);
2800 ndlp->nlp_flag |= NLP_NPR_2B_DISC;
2801 spin_unlock_irq(&ndlp->lock);
2802 lpfc_set_disctmo(vport);
2803 }
2804 goto out;
2805 }
2806
2807 lpfc_printf_vlog(vport, KERN_ERR, LOG_TRACE_EVENT,
2808 "2755 ADISC failure DID:%06X Status:x%x/x%x\n",
2809 ndlp->nlp_DID, ulp_status,
2810 ulp_word4);
2811 lpfc_disc_state_machine(vport, ndlp, cmdiocb,
2812 NLP_EVT_CMPL_ADISC);
2813
2814
2815
2816
2817
2818 spin_lock_irq(&ndlp->lock);
2819 if (!(ndlp->fc4_xpt_flags & (SCSI_XPT_REGD | NVME_XPT_REGD))) {
2820 ndlp->nlp_flag &= ~NLP_NPR_2B_DISC;
2821 if (!(ndlp->nlp_flag & NLP_IN_DEV_LOSS))
2822 release_node = true;
2823 }
2824 spin_unlock_irq(&ndlp->lock);
2825
2826 if (release_node)
2827 lpfc_disc_state_machine(vport, ndlp, cmdiocb,
2828 NLP_EVT_DEVICE_RM);
2829 } else
2830
2831 lpfc_disc_state_machine(vport, ndlp, cmdiocb,
2832 NLP_EVT_CMPL_ADISC);
2833
2834
2835 if (disc && vport->num_disc_nodes)
2836 lpfc_more_adisc(vport);
2837 out:
2838 lpfc_els_free_iocb(phba, cmdiocb);
2839 lpfc_nlp_put(ndlp);
2840 return;
2841 }
2842
2843
2844
2845
2846
2847
2848
2849
2850
2851
2852
2853
2854
2855
2856
2857
2858
2859
2860
2861
2862 int
2863 lpfc_issue_els_adisc(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
2864 uint8_t retry)
2865 {
2866 int rc = 0;
2867 struct lpfc_hba *phba = vport->phba;
2868 ADISC *ap;
2869 struct lpfc_iocbq *elsiocb;
2870 uint8_t *pcmd;
2871 uint16_t cmdsize;
2872
2873 cmdsize = (sizeof(uint32_t) + sizeof(ADISC));
2874 elsiocb = lpfc_prep_els_iocb(vport, 1, cmdsize, retry, ndlp,
2875 ndlp->nlp_DID, ELS_CMD_ADISC);
2876 if (!elsiocb)
2877 return 1;
2878
2879 pcmd = (uint8_t *)elsiocb->cmd_dmabuf->virt;
2880
2881
2882 *((uint32_t *) (pcmd)) = ELS_CMD_ADISC;
2883 pcmd += sizeof(uint32_t);
2884
2885
2886 ap = (ADISC *) pcmd;
2887 ap->hardAL_PA = phba->fc_pref_ALPA;
2888 memcpy(&ap->portName, &vport->fc_portname, sizeof(struct lpfc_name));
2889 memcpy(&ap->nodeName, &vport->fc_nodename, sizeof(struct lpfc_name));
2890 ap->DID = be32_to_cpu(vport->fc_myDID);
2891
2892 phba->fc_stat.elsXmitADISC++;
2893 elsiocb->cmd_cmpl = lpfc_cmpl_els_adisc;
2894 spin_lock_irq(&ndlp->lock);
2895 ndlp->nlp_flag |= NLP_ADISC_SND;
2896 spin_unlock_irq(&ndlp->lock);
2897 elsiocb->ndlp = lpfc_nlp_get(ndlp);
2898 if (!elsiocb->ndlp) {
2899 lpfc_els_free_iocb(phba, elsiocb);
2900 goto err;
2901 }
2902
2903 lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_CMD,
2904 "Issue ADISC: did:x%x refcnt %d",
2905 ndlp->nlp_DID, kref_read(&ndlp->kref), 0);
2906
2907 rc = lpfc_sli_issue_iocb(phba, LPFC_ELS_RING, elsiocb, 0);
2908 if (rc == IOCB_ERROR) {
2909 lpfc_els_free_iocb(phba, elsiocb);
2910 lpfc_nlp_put(ndlp);
2911 goto err;
2912 }
2913
2914 return 0;
2915
2916 err:
2917 spin_lock_irq(&ndlp->lock);
2918 ndlp->nlp_flag &= ~NLP_ADISC_SND;
2919 spin_unlock_irq(&ndlp->lock);
2920 return 1;
2921 }
2922
2923
2924
2925
2926
2927
2928
2929
2930
2931
2932
2933
2934 static void
2935 lpfc_cmpl_els_logo(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
2936 struct lpfc_iocbq *rspiocb)
2937 {
2938 struct lpfc_nodelist *ndlp = cmdiocb->ndlp;
2939 struct lpfc_vport *vport = ndlp->vport;
2940 IOCB_t *irsp;
2941 unsigned long flags;
2942 uint32_t skip_recovery = 0;
2943 int wake_up_waiter = 0;
2944 u32 ulp_status;
2945 u32 ulp_word4;
2946 u32 tmo;
2947
2948
2949 cmdiocb->rsp_iocb = rspiocb;
2950
2951 ulp_status = get_job_ulpstatus(phba, rspiocb);
2952 ulp_word4 = get_job_word4(phba, rspiocb);
2953
2954 if (phba->sli_rev == LPFC_SLI_REV4) {
2955 tmo = get_wqe_tmo(cmdiocb);
2956 } else {
2957 irsp = &rspiocb->iocb;
2958 tmo = irsp->ulpTimeout;
2959 }
2960
2961 spin_lock_irq(&ndlp->lock);
2962 ndlp->nlp_flag &= ~NLP_LOGO_SND;
2963 if (ndlp->save_flags & NLP_WAIT_FOR_LOGO) {
2964 wake_up_waiter = 1;
2965 ndlp->save_flags &= ~NLP_WAIT_FOR_LOGO;
2966 }
2967 spin_unlock_irq(&ndlp->lock);
2968
2969 lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_CMD,
2970 "LOGO cmpl: status:x%x/x%x did:x%x",
2971 ulp_status, ulp_word4,
2972 ndlp->nlp_DID);
2973
2974
2975 lpfc_printf_vlog(vport, KERN_INFO, LOG_ELS,
2976 "0105 LOGO completes to NPort x%x "
2977 "refcnt %d nflags x%x Data: x%x x%x x%x x%x\n",
2978 ndlp->nlp_DID, kref_read(&ndlp->kref), ndlp->nlp_flag,
2979 ulp_status, ulp_word4,
2980 tmo, vport->num_disc_nodes);
2981
2982 if (lpfc_els_chk_latt(vport)) {
2983 skip_recovery = 1;
2984 goto out;
2985 }
2986
2987
2988
2989
2990
2991
2992 if (ulp_status) {
2993
2994 lpfc_printf_vlog(vport, KERN_ERR, LOG_TRACE_EVENT,
2995 "2756 LOGO failure, No Retry DID:%06X "
2996 "Status:x%x/x%x\n",
2997 ndlp->nlp_DID, ulp_status,
2998 ulp_word4);
2999
3000 if (lpfc_error_lost_link(ulp_status, ulp_word4)) {
3001 skip_recovery = 1;
3002 goto out;
3003 }
3004 }
3005
3006
3007 lpfc_disc_state_machine(vport, ndlp, cmdiocb, NLP_EVT_CMPL_LOGO);
3008
3009
3010
3011
3012 if (ndlp->nlp_flag & NLP_TARGET_REMOVE) {
3013 spin_lock_irq(&ndlp->lock);
3014 if (phba->sli_rev == LPFC_SLI_REV4)
3015 ndlp->nlp_flag |= NLP_RELEASE_RPI;
3016 ndlp->nlp_flag &= ~NLP_NPR_2B_DISC;
3017 spin_unlock_irq(&ndlp->lock);
3018 lpfc_disc_state_machine(vport, ndlp, cmdiocb,
3019 NLP_EVT_DEVICE_RM);
3020 goto out_rsrc_free;
3021 }
3022
3023 out:
3024
3025
3026
3027
3028
3029
3030 if (wake_up_waiter && ndlp->logo_waitq)
3031 wake_up(ndlp->logo_waitq);
3032
3033
3034
3035
3036
3037 if (ndlp->nlp_type & (NLP_FCP_TARGET | NLP_NVME_TARGET) &&
3038 skip_recovery == 0) {
3039 lpfc_cancel_retry_delay_tmo(vport, ndlp);
3040 spin_lock_irqsave(&ndlp->lock, flags);
3041 ndlp->nlp_flag |= NLP_NPR_2B_DISC;
3042 spin_unlock_irqrestore(&ndlp->lock, flags);
3043
3044 lpfc_printf_vlog(vport, KERN_INFO, LOG_ELS,
3045 "3187 LOGO completes to NPort x%x: Start "
3046 "Recovery Data: x%x x%x x%x x%x\n",
3047 ndlp->nlp_DID, ulp_status,
3048 ulp_word4, tmo,
3049 vport->num_disc_nodes);
3050
3051 lpfc_els_free_iocb(phba, cmdiocb);
3052 lpfc_nlp_put(ndlp);
3053
3054 lpfc_disc_start(vport);
3055 return;
3056 }
3057
3058
3059
3060
3061
3062
3063 if (!(ndlp->fc4_xpt_flags & (SCSI_XPT_REGD | NVME_XPT_REGD))) {
3064 spin_lock_irq(&ndlp->lock);
3065 ndlp->nlp_flag &= ~NLP_NPR_2B_DISC;
3066 spin_unlock_irq(&ndlp->lock);
3067 lpfc_disc_state_machine(vport, ndlp, cmdiocb,
3068 NLP_EVT_DEVICE_RM);
3069 }
3070 out_rsrc_free:
3071
3072 lpfc_els_free_iocb(phba, cmdiocb);
3073 lpfc_nlp_put(ndlp);
3074 }
3075
3076
3077
3078
3079
3080
3081
3082
3083
3084
3085
3086
3087
3088
3089
3090
3091
3092
3093
3094
3095
3096
3097 int
3098 lpfc_issue_els_logo(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
3099 uint8_t retry)
3100 {
3101 struct lpfc_hba *phba = vport->phba;
3102 struct lpfc_iocbq *elsiocb;
3103 uint8_t *pcmd;
3104 uint16_t cmdsize;
3105 int rc;
3106
3107 spin_lock_irq(&ndlp->lock);
3108 if (ndlp->nlp_flag & NLP_LOGO_SND) {
3109 spin_unlock_irq(&ndlp->lock);
3110 return 0;
3111 }
3112 spin_unlock_irq(&ndlp->lock);
3113
3114 cmdsize = (2 * sizeof(uint32_t)) + sizeof(struct lpfc_name);
3115 elsiocb = lpfc_prep_els_iocb(vport, 1, cmdsize, retry, ndlp,
3116 ndlp->nlp_DID, ELS_CMD_LOGO);
3117 if (!elsiocb)
3118 return 1;
3119
3120 pcmd = (uint8_t *)elsiocb->cmd_dmabuf->virt;
3121 *((uint32_t *) (pcmd)) = ELS_CMD_LOGO;
3122 pcmd += sizeof(uint32_t);
3123
3124
3125 *((uint32_t *) (pcmd)) = be32_to_cpu(vport->fc_myDID);
3126 pcmd += sizeof(uint32_t);
3127 memcpy(pcmd, &vport->fc_portname, sizeof(struct lpfc_name));
3128
3129 phba->fc_stat.elsXmitLOGO++;
3130 elsiocb->cmd_cmpl = lpfc_cmpl_els_logo;
3131 spin_lock_irq(&ndlp->lock);
3132 ndlp->nlp_flag |= NLP_LOGO_SND;
3133 ndlp->nlp_flag &= ~NLP_ISSUE_LOGO;
3134 spin_unlock_irq(&ndlp->lock);
3135 elsiocb->ndlp = lpfc_nlp_get(ndlp);
3136 if (!elsiocb->ndlp) {
3137 lpfc_els_free_iocb(phba, elsiocb);
3138 goto err;
3139 }
3140
3141 lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_CMD,
3142 "Issue LOGO: did:x%x refcnt %d",
3143 ndlp->nlp_DID, kref_read(&ndlp->kref), 0);
3144
3145 rc = lpfc_sli_issue_iocb(phba, LPFC_ELS_RING, elsiocb, 0);
3146 if (rc == IOCB_ERROR) {
3147 lpfc_els_free_iocb(phba, elsiocb);
3148 lpfc_nlp_put(ndlp);
3149 goto err;
3150 }
3151
3152 spin_lock_irq(&ndlp->lock);
3153 ndlp->nlp_prev_state = ndlp->nlp_state;
3154 spin_unlock_irq(&ndlp->lock);
3155 lpfc_nlp_set_state(vport, ndlp, NLP_STE_LOGO_ISSUE);
3156 return 0;
3157
3158 err:
3159 spin_lock_irq(&ndlp->lock);
3160 ndlp->nlp_flag &= ~NLP_LOGO_SND;
3161 spin_unlock_irq(&ndlp->lock);
3162 return 1;
3163 }
3164
3165
3166
3167
3168
3169
3170
3171
3172
3173
3174
3175
3176
3177
3178
3179
3180 static void
3181 lpfc_cmpl_els_cmd(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
3182 struct lpfc_iocbq *rspiocb)
3183 {
3184 struct lpfc_vport *vport = cmdiocb->vport;
3185 struct lpfc_nodelist *free_ndlp;
3186 IOCB_t *irsp;
3187 u32 ulp_status, ulp_word4, tmo, did, iotag;
3188
3189 ulp_status = get_job_ulpstatus(phba, rspiocb);
3190 ulp_word4 = get_job_word4(phba, rspiocb);
3191 did = get_job_els_rsp64_did(phba, cmdiocb);
3192
3193 if (phba->sli_rev == LPFC_SLI_REV4) {
3194 tmo = get_wqe_tmo(cmdiocb);
3195 iotag = get_wqe_reqtag(cmdiocb);
3196 } else {
3197 irsp = &rspiocb->iocb;
3198 tmo = irsp->ulpTimeout;
3199 iotag = irsp->ulpIoTag;
3200 }
3201
3202 lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_CMD,
3203 "ELS cmd cmpl: status:x%x/x%x did:x%x",
3204 ulp_status, ulp_word4, did);
3205
3206
3207 lpfc_printf_vlog(vport, KERN_INFO, LOG_ELS,
3208 "0106 ELS cmd tag x%x completes Data: x%x x%x x%x\n",
3209 iotag, ulp_status, ulp_word4, tmo);
3210
3211
3212 lpfc_els_chk_latt(vport);
3213
3214 free_ndlp = cmdiocb->ndlp;
3215
3216 lpfc_els_free_iocb(phba, cmdiocb);
3217 lpfc_nlp_put(free_ndlp);
3218 }
3219
3220
3221
3222
3223
3224
3225
3226
3227
3228
3229
3230
3231
3232
3233
3234 static int
3235 lpfc_reg_fab_ctrl_node(struct lpfc_vport *vport, struct lpfc_nodelist *fc_ndlp)
3236 {
3237 int rc = 0;
3238 struct lpfc_hba *phba = vport->phba;
3239 struct lpfc_nodelist *ns_ndlp;
3240 LPFC_MBOXQ_t *mbox;
3241
3242 if (fc_ndlp->nlp_flag & NLP_RPI_REGISTERED)
3243 return rc;
3244
3245 ns_ndlp = lpfc_findnode_did(vport, NameServer_DID);
3246 if (!ns_ndlp)
3247 return -ENODEV;
3248
3249 lpfc_printf_vlog(vport, KERN_INFO, LOG_NODE,
3250 "0935 %s: Reg FC RPI x%x on FC DID x%x NSSte: x%x\n",
3251 __func__, fc_ndlp->nlp_rpi, fc_ndlp->nlp_DID,
3252 ns_ndlp->nlp_state);
3253 if (ns_ndlp->nlp_state != NLP_STE_UNMAPPED_NODE)
3254 return -ENODEV;
3255
3256 mbox = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL);
3257 if (!mbox) {
3258 lpfc_printf_vlog(vport, KERN_ERR, LOG_NODE,
3259 "0936 %s: no memory for reg_login "
3260 "Data: x%x x%x x%x x%x\n", __func__,
3261 fc_ndlp->nlp_DID, fc_ndlp->nlp_state,
3262 fc_ndlp->nlp_flag, fc_ndlp->nlp_rpi);
3263 return -ENOMEM;
3264 }
3265 rc = lpfc_reg_rpi(phba, vport->vpi, fc_ndlp->nlp_DID,
3266 (u8 *)&vport->fc_sparam, mbox, fc_ndlp->nlp_rpi);
3267 if (rc) {
3268 rc = -EACCES;
3269 goto out;
3270 }
3271
3272 fc_ndlp->nlp_flag |= NLP_REG_LOGIN_SEND;
3273 mbox->mbox_cmpl = lpfc_mbx_cmpl_fc_reg_login;
3274 mbox->ctx_ndlp = lpfc_nlp_get(fc_ndlp);
3275 if (!mbox->ctx_ndlp) {
3276 rc = -ENOMEM;
3277 goto out;
3278 }
3279
3280 mbox->vport = vport;
3281 rc = lpfc_sli_issue_mbox(phba, mbox, MBX_NOWAIT);
3282 if (rc == MBX_NOT_FINISHED) {
3283 rc = -ENODEV;
3284 lpfc_nlp_put(fc_ndlp);
3285 goto out;
3286 }
3287
3288 lpfc_nlp_set_state(vport, fc_ndlp,
3289 NLP_STE_REG_LOGIN_ISSUE);
3290 return 0;
3291
3292 out:
3293 lpfc_mbox_rsrc_cleanup(phba, mbox, MBOX_THD_UNLOCKED);
3294 lpfc_printf_vlog(vport, KERN_ERR, LOG_NODE,
3295 "0938 %s: failed to format reg_login "
3296 "Data: x%x x%x x%x x%x\n", __func__,
3297 fc_ndlp->nlp_DID, fc_ndlp->nlp_state,
3298 fc_ndlp->nlp_flag, fc_ndlp->nlp_rpi);
3299 return rc;
3300 }
3301
3302
3303
3304
3305
3306
3307
3308
3309
3310
3311
3312
3313 static void
3314 lpfc_cmpl_els_disc_cmd(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
3315 struct lpfc_iocbq *rspiocb)
3316 {
3317 struct lpfc_vport *vport = cmdiocb->vport;
3318 IOCB_t *irsp;
3319 struct lpfc_els_rdf_rsp *prdf;
3320 struct lpfc_dmabuf *pcmd, *prsp;
3321 u32 *pdata;
3322 u32 cmd;
3323 struct lpfc_nodelist *ndlp = cmdiocb->ndlp;
3324 u32 ulp_status, ulp_word4, tmo, did, iotag;
3325
3326 ulp_status = get_job_ulpstatus(phba, rspiocb);
3327 ulp_word4 = get_job_word4(phba, rspiocb);
3328 did = get_job_els_rsp64_did(phba, cmdiocb);
3329
3330 if (phba->sli_rev == LPFC_SLI_REV4) {
3331 tmo = get_wqe_tmo(cmdiocb);
3332 iotag = get_wqe_reqtag(cmdiocb);
3333 } else {
3334 irsp = &rspiocb->iocb;
3335 tmo = irsp->ulpTimeout;
3336 iotag = irsp->ulpIoTag;
3337 }
3338
3339 lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_CMD,
3340 "ELS cmd cmpl: status:x%x/x%x did:x%x",
3341 ulp_status, ulp_word4, did);
3342
3343
3344 lpfc_printf_vlog(vport, KERN_INFO, LOG_ELS | LOG_CGN_MGMT,
3345 "0217 ELS cmd tag x%x completes Data: x%x x%x x%x x%x\n",
3346 iotag, ulp_status, ulp_word4, tmo, cmdiocb->retry);
3347
3348 pcmd = cmdiocb->cmd_dmabuf;
3349 if (!pcmd)
3350 goto out;
3351
3352 pdata = (u32 *)pcmd->virt;
3353 if (!pdata)
3354 goto out;
3355 cmd = *pdata;
3356
3357
3358 if (ulp_status == IOSTAT_LOCAL_REJECT &&
3359 ((ulp_word4 & IOERR_PARAM_MASK) ==
3360 IOERR_SEQUENCE_TIMEOUT)) {
3361 cmdiocb->retry++;
3362 if (cmdiocb->retry <= 1) {
3363 switch (cmd) {
3364 case ELS_CMD_SCR:
3365 lpfc_issue_els_scr(vport, cmdiocb->retry);
3366 break;
3367 case ELS_CMD_EDC:
3368 lpfc_issue_els_edc(vport, cmdiocb->retry);
3369 break;
3370 case ELS_CMD_RDF:
3371 lpfc_issue_els_rdf(vport, cmdiocb->retry);
3372 break;
3373 }
3374 goto out;
3375 }
3376 phba->fc_stat.elsRetryExceeded++;
3377 }
3378 if (cmd == ELS_CMD_EDC) {
3379
3380 lpfc_cmpl_els_edc(phba, cmdiocb, rspiocb);
3381 return;
3382 }
3383 if (ulp_status) {
3384
3385 lpfc_printf_vlog(vport, KERN_WARNING, LOG_ELS | LOG_CGN_MGMT,
3386 "4203 ELS cmd x%x error: x%x x%X\n", cmd,
3387 ulp_status, ulp_word4);
3388 goto out;
3389 }
3390
3391
3392
3393
3394 if (cmd == ELS_CMD_RDF) {
3395 int i;
3396
3397 prsp = list_get_first(&pcmd->list, struct lpfc_dmabuf, list);
3398 if (!prsp)
3399 goto out;
3400
3401 prdf = (struct lpfc_els_rdf_rsp *)prsp->virt;
3402 if (!prdf)
3403 goto out;
3404
3405 for (i = 0; i < ELS_RDF_REG_TAG_CNT &&
3406 i < be32_to_cpu(prdf->reg_d1.reg_desc.count); i++)
3407 lpfc_printf_vlog(vport, KERN_INFO,
3408 LOG_ELS | LOG_CGN_MGMT,
3409 "4677 Fabric RDF Notification Grant "
3410 "Data: 0x%08x Reg: %x %x\n",
3411 be32_to_cpu(
3412 prdf->reg_d1.desc_tags[i]),
3413 phba->cgn_reg_signal,
3414 phba->cgn_reg_fpin);
3415 }
3416
3417 out:
3418
3419 lpfc_els_chk_latt(vport);
3420 lpfc_els_free_iocb(phba, cmdiocb);
3421 lpfc_nlp_put(ndlp);
3422 return;
3423 }
3424
3425
3426
3427
3428
3429
3430
3431
3432
3433
3434
3435
3436
3437
3438
3439
3440
3441
3442
3443
3444
3445 int
3446 lpfc_issue_els_scr(struct lpfc_vport *vport, uint8_t retry)
3447 {
3448 int rc = 0;
3449 struct lpfc_hba *phba = vport->phba;
3450 struct lpfc_iocbq *elsiocb;
3451 uint8_t *pcmd;
3452 uint16_t cmdsize;
3453 struct lpfc_nodelist *ndlp;
3454
3455 cmdsize = (sizeof(uint32_t) + sizeof(SCR));
3456
3457 ndlp = lpfc_findnode_did(vport, Fabric_Cntl_DID);
3458 if (!ndlp) {
3459 ndlp = lpfc_nlp_init(vport, Fabric_Cntl_DID);
3460 if (!ndlp)
3461 return 1;
3462 lpfc_enqueue_node(vport, ndlp);
3463 }
3464
3465 elsiocb = lpfc_prep_els_iocb(vport, 1, cmdsize, retry, ndlp,
3466 ndlp->nlp_DID, ELS_CMD_SCR);
3467 if (!elsiocb)
3468 return 1;
3469
3470 if (phba->sli_rev == LPFC_SLI_REV4) {
3471 rc = lpfc_reg_fab_ctrl_node(vport, ndlp);
3472 if (rc) {
3473 lpfc_els_free_iocb(phba, elsiocb);
3474 lpfc_printf_vlog(vport, KERN_ERR, LOG_NODE,
3475 "0937 %s: Failed to reg fc node, rc %d\n",
3476 __func__, rc);
3477 return 1;
3478 }
3479 }
3480 pcmd = (uint8_t *)elsiocb->cmd_dmabuf->virt;
3481
3482 *((uint32_t *) (pcmd)) = ELS_CMD_SCR;
3483 pcmd += sizeof(uint32_t);
3484
3485
3486 memset(pcmd, 0, sizeof(SCR));
3487 ((SCR *) pcmd)->Function = SCR_FUNC_FULL;
3488
3489 lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_CMD,
3490 "Issue SCR: did:x%x",
3491 ndlp->nlp_DID, 0, 0);
3492
3493 phba->fc_stat.elsXmitSCR++;
3494 elsiocb->cmd_cmpl = lpfc_cmpl_els_disc_cmd;
3495 elsiocb->ndlp = lpfc_nlp_get(ndlp);
3496 if (!elsiocb->ndlp) {
3497 lpfc_els_free_iocb(phba, elsiocb);
3498 return 1;
3499 }
3500
3501 lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_CMD,
3502 "Issue SCR: did:x%x refcnt %d",
3503 ndlp->nlp_DID, kref_read(&ndlp->kref), 0);
3504
3505 rc = lpfc_sli_issue_iocb(phba, LPFC_ELS_RING, elsiocb, 0);
3506 if (rc == IOCB_ERROR) {
3507 lpfc_els_free_iocb(phba, elsiocb);
3508 lpfc_nlp_put(ndlp);
3509 return 1;
3510 }
3511
3512 return 0;
3513 }
3514
3515
3516
3517
3518
3519
3520
3521
3522
3523
3524
3525
3526
3527
3528
3529
3530
3531
3532
3533
3534 int
3535 lpfc_issue_els_rscn(struct lpfc_vport *vport, uint8_t retry)
3536 {
3537 int rc = 0;
3538 struct lpfc_hba *phba = vport->phba;
3539 struct lpfc_iocbq *elsiocb;
3540 struct lpfc_nodelist *ndlp;
3541 struct {
3542 struct fc_els_rscn rscn;
3543 struct fc_els_rscn_page portid;
3544 } *event;
3545 uint32_t nportid;
3546 uint16_t cmdsize = sizeof(*event);
3547
3548
3549 if (phba->fc_topology == LPFC_TOPOLOGY_LOOP &&
3550 !(vport->fc_flag & FC_PUBLIC_LOOP))
3551 return 1;
3552
3553 if (vport->fc_flag & FC_PT2PT) {
3554
3555 ndlp = lpfc_findnode_mapped(vport);
3556 if (!ndlp)
3557 return 1;
3558 } else {
3559 nportid = FC_FID_FCTRL;
3560
3561 ndlp = lpfc_findnode_did(vport, nportid);
3562 if (!ndlp) {
3563
3564 ndlp = lpfc_nlp_init(vport, nportid);
3565 if (!ndlp)
3566 return 1;
3567 lpfc_enqueue_node(vport, ndlp);
3568 }
3569 }
3570
3571 elsiocb = lpfc_prep_els_iocb(vport, 1, cmdsize, retry, ndlp,
3572 ndlp->nlp_DID, ELS_CMD_RSCN_XMT);
3573
3574 if (!elsiocb)
3575 return 1;
3576
3577 event = elsiocb->cmd_dmabuf->virt;
3578
3579 event->rscn.rscn_cmd = ELS_RSCN;
3580 event->rscn.rscn_page_len = sizeof(struct fc_els_rscn_page);
3581 event->rscn.rscn_plen = cpu_to_be16(cmdsize);
3582
3583 nportid = vport->fc_myDID;
3584
3585 event->portid.rscn_page_flags = 0;
3586 event->portid.rscn_fid[0] = (nportid & 0x00FF0000) >> 16;
3587 event->portid.rscn_fid[1] = (nportid & 0x0000FF00) >> 8;
3588 event->portid.rscn_fid[2] = nportid & 0x000000FF;
3589
3590 phba->fc_stat.elsXmitRSCN++;
3591 elsiocb->cmd_cmpl = lpfc_cmpl_els_cmd;
3592 elsiocb->ndlp = lpfc_nlp_get(ndlp);
3593 if (!elsiocb->ndlp) {
3594 lpfc_els_free_iocb(phba, elsiocb);
3595 return 1;
3596 }
3597
3598 lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_CMD,
3599 "Issue RSCN: did:x%x",
3600 ndlp->nlp_DID, 0, 0);
3601
3602 rc = lpfc_sli_issue_iocb(phba, LPFC_ELS_RING, elsiocb, 0);
3603 if (rc == IOCB_ERROR) {
3604 lpfc_els_free_iocb(phba, elsiocb);
3605 lpfc_nlp_put(ndlp);
3606 return 1;
3607 }
3608
3609 return 0;
3610 }
3611
3612
3613
3614
3615
3616
3617
3618
3619
3620
3621
3622
3623
3624
3625
3626
3627
3628
3629
3630
3631
3632
3633 static int
3634 lpfc_issue_els_farpr(struct lpfc_vport *vport, uint32_t nportid, uint8_t retry)
3635 {
3636 int rc = 0;
3637 struct lpfc_hba *phba = vport->phba;
3638 struct lpfc_iocbq *elsiocb;
3639 FARP *fp;
3640 uint8_t *pcmd;
3641 uint32_t *lp;
3642 uint16_t cmdsize;
3643 struct lpfc_nodelist *ondlp;
3644 struct lpfc_nodelist *ndlp;
3645
3646 cmdsize = (sizeof(uint32_t) + sizeof(FARP));
3647
3648 ndlp = lpfc_findnode_did(vport, nportid);
3649 if (!ndlp) {
3650 ndlp = lpfc_nlp_init(vport, nportid);
3651 if (!ndlp)
3652 return 1;
3653 lpfc_enqueue_node(vport, ndlp);
3654 }
3655
3656 elsiocb = lpfc_prep_els_iocb(vport, 1, cmdsize, retry, ndlp,
3657 ndlp->nlp_DID, ELS_CMD_FARPR);
3658 if (!elsiocb)
3659 return 1;
3660
3661 pcmd = (uint8_t *)elsiocb->cmd_dmabuf->virt;
3662
3663 *((uint32_t *) (pcmd)) = ELS_CMD_FARPR;
3664 pcmd += sizeof(uint32_t);
3665
3666
3667 fp = (FARP *) (pcmd);
3668 memset(fp, 0, sizeof(FARP));
3669 lp = (uint32_t *) pcmd;
3670 *lp++ = be32_to_cpu(nportid);
3671 *lp++ = be32_to_cpu(vport->fc_myDID);
3672 fp->Rflags = 0;
3673 fp->Mflags = (FARP_MATCH_PORT | FARP_MATCH_NODE);
3674
3675 memcpy(&fp->RportName, &vport->fc_portname, sizeof(struct lpfc_name));
3676 memcpy(&fp->RnodeName, &vport->fc_nodename, sizeof(struct lpfc_name));
3677 ondlp = lpfc_findnode_did(vport, nportid);
3678 if (ondlp) {
3679 memcpy(&fp->OportName, &ondlp->nlp_portname,
3680 sizeof(struct lpfc_name));
3681 memcpy(&fp->OnodeName, &ondlp->nlp_nodename,
3682 sizeof(struct lpfc_name));
3683 }
3684
3685 lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_CMD,
3686 "Issue FARPR: did:x%x",
3687 ndlp->nlp_DID, 0, 0);
3688
3689 phba->fc_stat.elsXmitFARPR++;
3690 elsiocb->cmd_cmpl = lpfc_cmpl_els_cmd;
3691 elsiocb->ndlp = lpfc_nlp_get(ndlp);
3692 if (!elsiocb->ndlp) {
3693 lpfc_els_free_iocb(phba, elsiocb);
3694 return 1;
3695 }
3696
3697 rc = lpfc_sli_issue_iocb(phba, LPFC_ELS_RING, elsiocb, 0);
3698 if (rc == IOCB_ERROR) {
3699
3700
3701
3702
3703 lpfc_els_free_iocb(phba, elsiocb);
3704 lpfc_nlp_put(ndlp);
3705 return 1;
3706 }
3707
3708
3709
3710
3711 return 0;
3712 }
3713
3714
3715
3716
3717
3718
3719
3720
3721
3722
3723
3724
3725
3726
3727
3728
3729
3730 int
3731 lpfc_issue_els_rdf(struct lpfc_vport *vport, uint8_t retry)
3732 {
3733 struct lpfc_hba *phba = vport->phba;
3734 struct lpfc_iocbq *elsiocb;
3735 struct lpfc_els_rdf_req *prdf;
3736 struct lpfc_nodelist *ndlp;
3737 uint16_t cmdsize;
3738 int rc;
3739
3740 cmdsize = sizeof(*prdf);
3741
3742 ndlp = lpfc_findnode_did(vport, Fabric_Cntl_DID);
3743 if (!ndlp) {
3744 ndlp = lpfc_nlp_init(vport, Fabric_Cntl_DID);
3745 if (!ndlp)
3746 return -ENODEV;
3747 lpfc_enqueue_node(vport, ndlp);
3748 }
3749
3750
3751 if (vport->port_type == LPFC_NPIV_PORT)
3752 return -EACCES;
3753
3754 elsiocb = lpfc_prep_els_iocb(vport, 1, cmdsize, retry, ndlp,
3755 ndlp->nlp_DID, ELS_CMD_RDF);
3756 if (!elsiocb)
3757 return -ENOMEM;
3758
3759
3760 prdf = (struct lpfc_els_rdf_req *)elsiocb->cmd_dmabuf->virt;
3761 memset(prdf, 0, cmdsize);
3762 prdf->rdf.fpin_cmd = ELS_RDF;
3763 prdf->rdf.desc_len = cpu_to_be32(sizeof(struct lpfc_els_rdf_req) -
3764 sizeof(struct fc_els_rdf));
3765 prdf->reg_d1.reg_desc.desc_tag = cpu_to_be32(ELS_DTAG_FPIN_REGISTER);
3766 prdf->reg_d1.reg_desc.desc_len = cpu_to_be32(
3767 FC_TLV_DESC_LENGTH_FROM_SZ(prdf->reg_d1));
3768 prdf->reg_d1.reg_desc.count = cpu_to_be32(ELS_RDF_REG_TAG_CNT);
3769 prdf->reg_d1.desc_tags[0] = cpu_to_be32(ELS_DTAG_LNK_INTEGRITY);
3770 prdf->reg_d1.desc_tags[1] = cpu_to_be32(ELS_DTAG_DELIVERY);
3771 prdf->reg_d1.desc_tags[2] = cpu_to_be32(ELS_DTAG_PEER_CONGEST);
3772 prdf->reg_d1.desc_tags[3] = cpu_to_be32(ELS_DTAG_CONGESTION);
3773
3774 lpfc_printf_vlog(vport, KERN_INFO, LOG_ELS | LOG_CGN_MGMT,
3775 "6444 Xmit RDF to remote NPORT x%x Reg: %x %x\n",
3776 ndlp->nlp_DID, phba->cgn_reg_signal,
3777 phba->cgn_reg_fpin);
3778
3779 phba->cgn_fpin_frequency = LPFC_FPIN_INIT_FREQ;
3780 elsiocb->cmd_cmpl = lpfc_cmpl_els_disc_cmd;
3781 elsiocb->ndlp = lpfc_nlp_get(ndlp);
3782 if (!elsiocb->ndlp) {
3783 lpfc_els_free_iocb(phba, elsiocb);
3784 return -EIO;
3785 }
3786
3787 lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_CMD,
3788 "Issue RDF: did:x%x refcnt %d",
3789 ndlp->nlp_DID, kref_read(&ndlp->kref), 0);
3790
3791 rc = lpfc_sli_issue_iocb(phba, LPFC_ELS_RING, elsiocb, 0);
3792 if (rc == IOCB_ERROR) {
3793 lpfc_els_free_iocb(phba, elsiocb);
3794 lpfc_nlp_put(ndlp);
3795 return -EIO;
3796 }
3797 return 0;
3798 }
3799
3800
3801
3802
3803
3804
3805
3806
3807
3808
3809
3810
3811
3812
3813
3814 static int
3815 lpfc_els_rcv_rdf(struct lpfc_vport *vport, struct lpfc_iocbq *cmdiocb,
3816 struct lpfc_nodelist *ndlp)
3817 {
3818
3819 if (lpfc_els_rsp_acc(vport, ELS_CMD_RDF, cmdiocb, ndlp, NULL)) {
3820 lpfc_printf_vlog(vport, KERN_INFO, LOG_ELS | LOG_CGN_MGMT,
3821 "1623 Failed to RDF_ACC from x%x for x%x\n",
3822 ndlp->nlp_DID, vport->fc_myDID);
3823 return -EIO;
3824 }
3825
3826
3827 if (lpfc_issue_els_rdf(vport, 0)) {
3828 lpfc_printf_vlog(vport, KERN_INFO, LOG_ELS | LOG_CGN_MGMT,
3829 "2623 Failed to re register RDF for x%x\n",
3830 vport->fc_myDID);
3831 return -EIO;
3832 }
3833
3834 return 0;
3835 }
3836
3837
3838
3839
3840
3841
3842
3843
3844
3845
3846
3847 static void
3848 lpfc_least_capable_settings(struct lpfc_hba *phba,
3849 struct fc_diag_cg_sig_desc *pcgd)
3850 {
3851 u32 rsp_sig_cap = 0, drv_sig_cap = 0;
3852 u32 rsp_sig_freq_cyc = 0, rsp_sig_freq_scale = 0;
3853
3854
3855 rsp_sig_cap = be32_to_cpu(pcgd->xmt_signal_capability);
3856 rsp_sig_freq_cyc = be16_to_cpu(pcgd->xmt_signal_frequency.count);
3857 rsp_sig_freq_scale = be16_to_cpu(pcgd->xmt_signal_frequency.units);
3858
3859
3860 if (rsp_sig_cap == EDC_CG_SIG_NOTSUPPORTED)
3861 goto out_no_support;
3862
3863
3864
3865
3866
3867 switch (rsp_sig_freq_scale) {
3868 case EDC_CG_SIGFREQ_SEC:
3869 rsp_sig_freq_cyc *= MSEC_PER_SEC;
3870 break;
3871 case EDC_CG_SIGFREQ_MSEC:
3872 rsp_sig_freq_cyc = 1;
3873 break;
3874 default:
3875 goto out_no_support;
3876 }
3877
3878
3879 drv_sig_cap = phba->cgn_reg_signal;
3880
3881
3882 if (rsp_sig_freq_cyc > phba->cgn_sig_freq)
3883 phba->cgn_sig_freq = rsp_sig_freq_cyc;
3884
3885
3886
3887
3888
3889 phba->cgn_reg_fpin = LPFC_CGN_FPIN_WARN | LPFC_CGN_FPIN_ALARM;
3890 phba->cgn_reg_signal = EDC_CG_SIG_NOTSUPPORTED;
3891 if (rsp_sig_cap == EDC_CG_SIG_WARN_ONLY &&
3892 (drv_sig_cap == EDC_CG_SIG_WARN_ONLY ||
3893 drv_sig_cap == EDC_CG_SIG_WARN_ALARM)) {
3894 phba->cgn_reg_signal = EDC_CG_SIG_WARN_ONLY;
3895 phba->cgn_reg_fpin &= ~LPFC_CGN_FPIN_WARN;
3896 }
3897 if (rsp_sig_cap == EDC_CG_SIG_WARN_ALARM) {
3898 if (drv_sig_cap == EDC_CG_SIG_WARN_ALARM) {
3899 phba->cgn_reg_signal = EDC_CG_SIG_WARN_ALARM;
3900 phba->cgn_reg_fpin = LPFC_CGN_FPIN_NONE;
3901 }
3902 if (drv_sig_cap == EDC_CG_SIG_WARN_ONLY) {
3903 phba->cgn_reg_signal = EDC_CG_SIG_WARN_ONLY;
3904 phba->cgn_reg_fpin &= ~LPFC_CGN_FPIN_WARN;
3905 }
3906 }
3907
3908
3909 return;
3910
3911 out_no_support:
3912 phba->cgn_reg_signal = EDC_CG_SIG_NOTSUPPORTED;
3913 phba->cgn_sig_freq = 0;
3914 phba->cgn_reg_fpin = LPFC_CGN_FPIN_ALARM | LPFC_CGN_FPIN_WARN;
3915 }
3916
3917 DECLARE_ENUM2STR_LOOKUP(lpfc_get_tlv_dtag_nm, fc_ls_tlv_dtag,
3918 FC_LS_TLV_DTAG_INIT);
3919
3920
3921
3922
3923
3924
3925
3926
3927
3928
3929
3930
3931
3932
3933 static void
3934 lpfc_cmpl_els_edc(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
3935 struct lpfc_iocbq *rspiocb)
3936 {
3937 IOCB_t *irsp_iocb;
3938 struct fc_els_edc_resp *edc_rsp;
3939 struct fc_tlv_desc *tlv;
3940 struct fc_diag_cg_sig_desc *pcgd;
3941 struct fc_diag_lnkflt_desc *plnkflt;
3942 struct lpfc_dmabuf *pcmd, *prsp;
3943 const char *dtag_nm;
3944 u32 *pdata, dtag;
3945 int desc_cnt = 0, bytes_remain;
3946 bool rcv_cap_desc = false;
3947 struct lpfc_nodelist *ndlp;
3948 u32 ulp_status, ulp_word4, tmo, did, iotag;
3949
3950 ndlp = cmdiocb->ndlp;
3951
3952 ulp_status = get_job_ulpstatus(phba, rspiocb);
3953 ulp_word4 = get_job_word4(phba, rspiocb);
3954 did = get_job_els_rsp64_did(phba, rspiocb);
3955
3956 if (phba->sli_rev == LPFC_SLI_REV4) {
3957 tmo = get_wqe_tmo(rspiocb);
3958 iotag = get_wqe_reqtag(rspiocb);
3959 } else {
3960 irsp_iocb = &rspiocb->iocb;
3961 tmo = irsp_iocb->ulpTimeout;
3962 iotag = irsp_iocb->ulpIoTag;
3963 }
3964
3965 lpfc_debugfs_disc_trc(phba->pport, LPFC_DISC_TRC_ELS_CMD,
3966 "EDC cmpl: status:x%x/x%x did:x%x",
3967 ulp_status, ulp_word4, did);
3968
3969
3970 lpfc_printf_log(phba, KERN_INFO, LOG_ELS | LOG_CGN_MGMT,
3971 "4201 EDC cmd tag x%x completes Data: x%x x%x x%x\n",
3972 iotag, ulp_status, ulp_word4, tmo);
3973
3974 pcmd = cmdiocb->cmd_dmabuf;
3975 if (!pcmd)
3976 goto out;
3977
3978 pdata = (u32 *)pcmd->virt;
3979 if (!pdata)
3980 goto out;
3981
3982
3983 if (ulp_status)
3984 goto out;
3985
3986 prsp = list_get_first(&pcmd->list, struct lpfc_dmabuf, list);
3987 if (!prsp)
3988 goto out;
3989
3990 edc_rsp = prsp->virt;
3991 if (!edc_rsp)
3992 goto out;
3993
3994
3995 lpfc_printf_log(phba, KERN_INFO, LOG_ELS | LOG_CGN_MGMT,
3996 "4676 Fabric EDC Rsp: "
3997 "0x%02x, 0x%08x\n",
3998 edc_rsp->acc_hdr.la_cmd,
3999 be32_to_cpu(edc_rsp->desc_list_len));
4000
4001
4002
4003
4004
4005
4006 bytes_remain = be32_to_cpu(edc_rsp->desc_list_len) -
4007 sizeof(struct fc_els_lsri_desc);
4008 if (bytes_remain <= 0)
4009 goto out;
4010
4011 tlv = edc_rsp->desc;
4012
4013
4014
4015
4016
4017 while (bytes_remain) {
4018 if (bytes_remain < FC_TLV_DESC_HDR_SZ) {
4019 lpfc_printf_log(phba, KERN_WARNING, LOG_CGN_MGMT,
4020 "6461 Truncated TLV hdr on "
4021 "Diagnostic descriptor[%d]\n",
4022 desc_cnt);
4023 goto out;
4024 }
4025
4026 dtag = be32_to_cpu(tlv->desc_tag);
4027 switch (dtag) {
4028 case ELS_DTAG_LNK_FAULT_CAP:
4029 if (bytes_remain < FC_TLV_DESC_SZ_FROM_LENGTH(tlv) ||
4030 FC_TLV_DESC_SZ_FROM_LENGTH(tlv) !=
4031 sizeof(struct fc_diag_lnkflt_desc)) {
4032 lpfc_printf_log(
4033 phba, KERN_WARNING, LOG_CGN_MGMT,
4034 "6462 Truncated Link Fault Diagnostic "
4035 "descriptor[%d]: %d vs 0x%zx 0x%zx\n",
4036 desc_cnt, bytes_remain,
4037 FC_TLV_DESC_SZ_FROM_LENGTH(tlv),
4038 sizeof(struct fc_diag_cg_sig_desc));
4039 goto out;
4040 }
4041 plnkflt = (struct fc_diag_lnkflt_desc *)tlv;
4042 lpfc_printf_log(
4043 phba, KERN_INFO, LOG_ELS | LOG_CGN_MGMT,
4044 "4617 Link Fault Desc Data: 0x%08x 0x%08x "
4045 "0x%08x 0x%08x 0x%08x\n",
4046 be32_to_cpu(plnkflt->desc_tag),
4047 be32_to_cpu(plnkflt->desc_len),
4048 be32_to_cpu(
4049 plnkflt->degrade_activate_threshold),
4050 be32_to_cpu(
4051 plnkflt->degrade_deactivate_threshold),
4052 be32_to_cpu(plnkflt->fec_degrade_interval));
4053 break;
4054 case ELS_DTAG_CG_SIGNAL_CAP:
4055 if (bytes_remain < FC_TLV_DESC_SZ_FROM_LENGTH(tlv) ||
4056 FC_TLV_DESC_SZ_FROM_LENGTH(tlv) !=
4057 sizeof(struct fc_diag_cg_sig_desc)) {
4058 lpfc_printf_log(
4059 phba, KERN_WARNING, LOG_CGN_MGMT,
4060 "6463 Truncated Cgn Signal Diagnostic "
4061 "descriptor[%d]: %d vs 0x%zx 0x%zx\n",
4062 desc_cnt, bytes_remain,
4063 FC_TLV_DESC_SZ_FROM_LENGTH(tlv),
4064 sizeof(struct fc_diag_cg_sig_desc));
4065 goto out;
4066 }
4067
4068 pcgd = (struct fc_diag_cg_sig_desc *)tlv;
4069 lpfc_printf_log(
4070 phba, KERN_INFO, LOG_ELS | LOG_CGN_MGMT,
4071 "4616 CGN Desc Data: 0x%08x 0x%08x "
4072 "0x%08x 0x%04x 0x%04x 0x%08x 0x%04x 0x%04x\n",
4073 be32_to_cpu(pcgd->desc_tag),
4074 be32_to_cpu(pcgd->desc_len),
4075 be32_to_cpu(pcgd->xmt_signal_capability),
4076 be16_to_cpu(pcgd->xmt_signal_frequency.count),
4077 be16_to_cpu(pcgd->xmt_signal_frequency.units),
4078 be32_to_cpu(pcgd->rcv_signal_capability),
4079 be16_to_cpu(pcgd->rcv_signal_frequency.count),
4080 be16_to_cpu(pcgd->rcv_signal_frequency.units));
4081
4082
4083
4084
4085 lpfc_least_capable_settings(phba, pcgd);
4086 rcv_cap_desc = true;
4087 break;
4088 default:
4089 dtag_nm = lpfc_get_tlv_dtag_nm(dtag);
4090 lpfc_printf_log(phba, KERN_WARNING, LOG_CGN_MGMT,
4091 "4919 unknown Diagnostic "
4092 "Descriptor[%d]: tag x%x (%s)\n",
4093 desc_cnt, dtag, dtag_nm);
4094 }
4095
4096 bytes_remain -= FC_TLV_DESC_SZ_FROM_LENGTH(tlv);
4097 tlv = fc_tlv_next_desc(tlv);
4098 desc_cnt++;
4099 }
4100
4101 out:
4102 if (!rcv_cap_desc) {
4103 phba->cgn_reg_fpin = LPFC_CGN_FPIN_ALARM | LPFC_CGN_FPIN_WARN;
4104 phba->cgn_reg_signal = EDC_CG_SIG_NOTSUPPORTED;
4105 phba->cgn_sig_freq = 0;
4106 lpfc_printf_log(phba, KERN_WARNING, LOG_ELS | LOG_CGN_MGMT,
4107 "4202 EDC rsp error - sending RDF "
4108 "for FPIN only.\n");
4109 }
4110
4111 lpfc_config_cgn_signal(phba);
4112
4113
4114 lpfc_els_chk_latt(phba->pport);
4115 lpfc_debugfs_disc_trc(phba->pport, LPFC_DISC_TRC_ELS_CMD,
4116 "EDC Cmpl: did:x%x refcnt %d",
4117 ndlp->nlp_DID, kref_read(&ndlp->kref), 0);
4118 lpfc_els_free_iocb(phba, cmdiocb);
4119 lpfc_nlp_put(ndlp);
4120 }
4121
4122 static void
4123 lpfc_format_edc_cgn_desc(struct lpfc_hba *phba, struct fc_diag_cg_sig_desc *cgd)
4124 {
4125
4126
4127
4128 cgd->desc_tag = cpu_to_be32(ELS_DTAG_CG_SIGNAL_CAP);
4129
4130
4131 cgd->desc_len = cpu_to_be32(
4132 FC_TLV_DESC_LENGTH_FROM_SZ(struct fc_diag_cg_sig_desc));
4133
4134
4135
4136
4137
4138
4139 if (phba->cmf_active_mode == LPFC_CFG_OFF) {
4140
4141
4142
4143
4144 phba->cgn_sig_freq = 0;
4145 return;
4146 }
4147 switch (phba->cgn_reg_signal) {
4148 case EDC_CG_SIG_WARN_ONLY:
4149 cgd->rcv_signal_capability = cpu_to_be32(EDC_CG_SIG_WARN_ONLY);
4150 break;
4151 case EDC_CG_SIG_WARN_ALARM:
4152 cgd->rcv_signal_capability = cpu_to_be32(EDC_CG_SIG_WARN_ALARM);
4153 break;
4154 default:
4155
4156 break;
4157 }
4158
4159
4160
4161
4162 cgd->rcv_signal_frequency.count =
4163 cpu_to_be16(lpfc_fabric_cgn_frequency);
4164 cgd->rcv_signal_frequency.units =
4165 cpu_to_be16(EDC_CG_SIGFREQ_MSEC);
4166 }
4167
4168
4169
4170
4171
4172
4173
4174
4175
4176
4177
4178
4179
4180
4181
4182
4183
4184
4185
4186
4187
4188
4189
4190 int
4191 lpfc_issue_els_edc(struct lpfc_vport *vport, uint8_t retry)
4192 {
4193 struct lpfc_hba *phba = vport->phba;
4194 struct lpfc_iocbq *elsiocb;
4195 struct lpfc_els_edc_req *edc_req;
4196 struct fc_diag_cg_sig_desc *cgn_desc;
4197 u16 cmdsize;
4198 struct lpfc_nodelist *ndlp;
4199 u8 *pcmd = NULL;
4200 u32 edc_req_size, cgn_desc_size;
4201 int rc;
4202
4203 if (vport->port_type == LPFC_NPIV_PORT)
4204 return -EACCES;
4205
4206 ndlp = lpfc_findnode_did(vport, Fabric_DID);
4207 if (!ndlp || ndlp->nlp_state != NLP_STE_UNMAPPED_NODE)
4208 return -ENODEV;
4209
4210
4211 if (!phba->cgn_init_reg_signal)
4212 goto try_rdf;
4213
4214 edc_req_size = sizeof(struct fc_els_edc);
4215 cgn_desc_size = sizeof(struct fc_diag_cg_sig_desc);
4216 cmdsize = edc_req_size + cgn_desc_size;
4217 elsiocb = lpfc_prep_els_iocb(vport, 1, cmdsize, retry, ndlp,
4218 ndlp->nlp_DID, ELS_CMD_EDC);
4219 if (!elsiocb)
4220 goto try_rdf;
4221
4222
4223 pcmd = (u8 *)elsiocb->cmd_dmabuf->virt;
4224 memset(pcmd, 0, cmdsize);
4225 edc_req = (struct lpfc_els_edc_req *)pcmd;
4226 edc_req->edc.desc_len = cpu_to_be32(cgn_desc_size);
4227 edc_req->edc.edc_cmd = ELS_EDC;
4228
4229 cgn_desc = &edc_req->cgn_desc;
4230
4231 lpfc_format_edc_cgn_desc(phba, cgn_desc);
4232
4233 phba->cgn_sig_freq = lpfc_fabric_cgn_frequency;
4234
4235 lpfc_printf_vlog(vport, KERN_INFO, LOG_ELS | LOG_CGN_MGMT,
4236 "4623 Xmit EDC to remote "
4237 "NPORT x%x reg_sig x%x reg_fpin:x%x\n",
4238 ndlp->nlp_DID, phba->cgn_reg_signal,
4239 phba->cgn_reg_fpin);
4240
4241 elsiocb->cmd_cmpl = lpfc_cmpl_els_disc_cmd;
4242 elsiocb->ndlp = lpfc_nlp_get(ndlp);
4243 if (!elsiocb->ndlp) {
4244 lpfc_els_free_iocb(phba, elsiocb);
4245 return -EIO;
4246 }
4247
4248 lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_CMD,
4249 "Issue EDC: did:x%x refcnt %d",
4250 ndlp->nlp_DID, kref_read(&ndlp->kref), 0);
4251 rc = lpfc_sli_issue_iocb(phba, LPFC_ELS_RING, elsiocb, 0);
4252 if (rc == IOCB_ERROR) {
4253
4254
4255
4256
4257 lpfc_els_free_iocb(phba, elsiocb);
4258 lpfc_nlp_put(ndlp);
4259 goto try_rdf;
4260 }
4261 return 0;
4262 try_rdf:
4263 phba->cgn_reg_fpin = LPFC_CGN_FPIN_WARN | LPFC_CGN_FPIN_ALARM;
4264 phba->cgn_reg_signal = EDC_CG_SIG_NOTSUPPORTED;
4265 rc = lpfc_issue_els_rdf(vport, 0);
4266 return rc;
4267 }
4268
4269
4270
4271
4272
4273
4274
4275
4276
4277
4278
4279
4280
4281 void
4282 lpfc_cancel_retry_delay_tmo(struct lpfc_vport *vport, struct lpfc_nodelist *nlp)
4283 {
4284 struct Scsi_Host *shost = lpfc_shost_from_vport(vport);
4285 struct lpfc_work_evt *evtp;
4286
4287 if (!(nlp->nlp_flag & NLP_DELAY_TMO))
4288 return;
4289 spin_lock_irq(&nlp->lock);
4290 nlp->nlp_flag &= ~NLP_DELAY_TMO;
4291 spin_unlock_irq(&nlp->lock);
4292 del_timer_sync(&nlp->nlp_delayfunc);
4293 nlp->nlp_last_elscmd = 0;
4294 if (!list_empty(&nlp->els_retry_evt.evt_listp)) {
4295 list_del_init(&nlp->els_retry_evt.evt_listp);
4296
4297 evtp = &nlp->els_retry_evt;
4298 lpfc_nlp_put((struct lpfc_nodelist *)evtp->evt_arg1);
4299 }
4300 if (nlp->nlp_flag & NLP_NPR_2B_DISC) {
4301 spin_lock_irq(&nlp->lock);
4302 nlp->nlp_flag &= ~NLP_NPR_2B_DISC;
4303 spin_unlock_irq(&nlp->lock);
4304 if (vport->num_disc_nodes) {
4305 if (vport->port_state < LPFC_VPORT_READY) {
4306
4307 lpfc_more_adisc(vport);
4308 } else {
4309
4310 lpfc_more_plogi(vport);
4311 if (vport->num_disc_nodes == 0) {
4312 spin_lock_irq(shost->host_lock);
4313 vport->fc_flag &= ~FC_NDISC_ACTIVE;
4314 spin_unlock_irq(shost->host_lock);
4315 lpfc_can_disctmo(vport);
4316 lpfc_end_rscn(vport);
4317 }
4318 }
4319 }
4320 }
4321 return;
4322 }
4323
4324
4325
4326
4327
4328
4329
4330
4331
4332
4333
4334
4335
4336
4337
4338 void
4339 lpfc_els_retry_delay(struct timer_list *t)
4340 {
4341 struct lpfc_nodelist *ndlp = from_timer(ndlp, t, nlp_delayfunc);
4342 struct lpfc_vport *vport = ndlp->vport;
4343 struct lpfc_hba *phba = vport->phba;
4344 unsigned long flags;
4345 struct lpfc_work_evt *evtp = &ndlp->els_retry_evt;
4346
4347 spin_lock_irqsave(&phba->hbalock, flags);
4348 if (!list_empty(&evtp->evt_listp)) {
4349 spin_unlock_irqrestore(&phba->hbalock, flags);
4350 return;
4351 }
4352
4353
4354
4355
4356 evtp->evt_arg1 = lpfc_nlp_get(ndlp);
4357 if (evtp->evt_arg1) {
4358 evtp->evt = LPFC_EVT_ELS_RETRY;
4359 list_add_tail(&evtp->evt_listp, &phba->work_list);
4360 lpfc_worker_wake_up(phba);
4361 }
4362 spin_unlock_irqrestore(&phba->hbalock, flags);
4363 return;
4364 }
4365
4366
4367
4368
4369
4370
4371
4372
4373
4374
4375 void
4376 lpfc_els_retry_delay_handler(struct lpfc_nodelist *ndlp)
4377 {
4378 struct lpfc_vport *vport = ndlp->vport;
4379 uint32_t cmd, retry;
4380
4381 spin_lock_irq(&ndlp->lock);
4382 cmd = ndlp->nlp_last_elscmd;
4383 ndlp->nlp_last_elscmd = 0;
4384
4385 if (!(ndlp->nlp_flag & NLP_DELAY_TMO)) {
4386 spin_unlock_irq(&ndlp->lock);
4387 return;
4388 }
4389
4390 ndlp->nlp_flag &= ~NLP_DELAY_TMO;
4391 spin_unlock_irq(&ndlp->lock);
4392
4393
4394
4395
4396
4397 del_timer_sync(&ndlp->nlp_delayfunc);
4398 retry = ndlp->nlp_retry;
4399 ndlp->nlp_retry = 0;
4400
4401 switch (cmd) {
4402 case ELS_CMD_FLOGI:
4403 lpfc_issue_els_flogi(vport, ndlp, retry);
4404 break;
4405 case ELS_CMD_PLOGI:
4406 if (!lpfc_issue_els_plogi(vport, ndlp->nlp_DID, retry)) {
4407 ndlp->nlp_prev_state = ndlp->nlp_state;
4408 lpfc_nlp_set_state(vport, ndlp, NLP_STE_PLOGI_ISSUE);
4409 }
4410 break;
4411 case ELS_CMD_ADISC:
4412 if (!lpfc_issue_els_adisc(vport, ndlp, retry)) {
4413 ndlp->nlp_prev_state = ndlp->nlp_state;
4414 lpfc_nlp_set_state(vport, ndlp, NLP_STE_ADISC_ISSUE);
4415 }
4416 break;
4417 case ELS_CMD_PRLI:
4418 case ELS_CMD_NVMEPRLI:
4419 if (!lpfc_issue_els_prli(vport, ndlp, retry)) {
4420 ndlp->nlp_prev_state = ndlp->nlp_state;
4421 lpfc_nlp_set_state(vport, ndlp, NLP_STE_PRLI_ISSUE);
4422 }
4423 break;
4424 case ELS_CMD_LOGO:
4425 if (!lpfc_issue_els_logo(vport, ndlp, retry)) {
4426 ndlp->nlp_prev_state = ndlp->nlp_state;
4427 lpfc_nlp_set_state(vport, ndlp, NLP_STE_LOGO_ISSUE);
4428 }
4429 break;
4430 case ELS_CMD_FDISC:
4431 if (!(vport->fc_flag & FC_VPORT_NEEDS_INIT_VPI))
4432 lpfc_issue_els_fdisc(vport, ndlp, retry);
4433 break;
4434 }
4435 return;
4436 }
4437
4438
4439
4440
4441
4442
4443
4444
4445
4446
4447
4448
4449
4450 int
4451 lpfc_link_reset(struct lpfc_vport *vport)
4452 {
4453 struct lpfc_hba *phba = vport->phba;
4454 LPFC_MBOXQ_t *mbox;
4455 uint32_t control;
4456 int rc;
4457
4458 lpfc_printf_vlog(vport, KERN_ERR, LOG_ELS,
4459 "2851 Attempt link reset\n");
4460 mbox = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL);
4461 if (!mbox) {
4462 lpfc_printf_log(phba, KERN_ERR, LOG_TRACE_EVENT,
4463 "2852 Failed to allocate mbox memory");
4464 return 1;
4465 }
4466
4467
4468 if (phba->sli_rev <= LPFC_SLI_REV3) {
4469 spin_lock_irq(&phba->hbalock);
4470 phba->sli.sli_flag |= LPFC_PROCESS_LA;
4471 control = readl(phba->HCregaddr);
4472 control |= HC_LAINT_ENA;
4473 writel(control, phba->HCregaddr);
4474 readl(phba->HCregaddr);
4475 spin_unlock_irq(&phba->hbalock);
4476 }
4477
4478 lpfc_init_link(phba, mbox, phba->cfg_topology,
4479 phba->cfg_link_speed);
4480 mbox->mbox_cmpl = lpfc_sli_def_mbox_cmpl;
4481 mbox->vport = vport;
4482 rc = lpfc_sli_issue_mbox(phba, mbox, MBX_NOWAIT);
4483 if ((rc != MBX_BUSY) && (rc != MBX_SUCCESS)) {
4484 lpfc_printf_log(phba, KERN_ERR, LOG_TRACE_EVENT,
4485 "2853 Failed to issue INIT_LINK "
4486 "mbox command, rc:x%x\n", rc);
4487 mempool_free(mbox, phba->mbox_mem_pool);
4488 return 1;
4489 }
4490
4491 return 0;
4492 }
4493
4494
4495
4496
4497
4498
4499
4500
4501
4502
4503
4504
4505
4506
4507
4508
4509
4510
4511
4512
4513
4514
4515 static int
4516 lpfc_els_retry(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
4517 struct lpfc_iocbq *rspiocb)
4518 {
4519 struct lpfc_vport *vport = cmdiocb->vport;
4520 union lpfc_wqe128 *irsp = &rspiocb->wqe;
4521 struct lpfc_nodelist *ndlp = cmdiocb->ndlp;
4522 struct lpfc_dmabuf *pcmd = cmdiocb->cmd_dmabuf;
4523 uint32_t *elscmd;
4524 struct ls_rjt stat;
4525 int retry = 0, maxretry = lpfc_max_els_tries, delay = 0;
4526 int logerr = 0;
4527 uint32_t cmd = 0;
4528 uint32_t did;
4529 int link_reset = 0, rc;
4530 u32 ulp_status = get_job_ulpstatus(phba, rspiocb);
4531 u32 ulp_word4 = get_job_word4(phba, rspiocb);
4532
4533
4534
4535
4536
4537
4538 if (pcmd && pcmd->virt) {
4539 elscmd = (uint32_t *) (pcmd->virt);
4540 cmd = *elscmd++;
4541 }
4542
4543 if (ndlp)
4544 did = ndlp->nlp_DID;
4545 else {
4546
4547 did = get_job_els_rsp64_did(phba, rspiocb);
4548 ndlp = lpfc_findnode_did(vport, did);
4549 if (!ndlp && (cmd != ELS_CMD_PLOGI))
4550 return 0;
4551 }
4552
4553 lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_CMD,
4554 "Retry ELS: wd7:x%x wd4:x%x did:x%x",
4555 *(((uint32_t *)irsp) + 7), ulp_word4, did);
4556
4557 switch (ulp_status) {
4558 case IOSTAT_FCP_RSP_ERROR:
4559 break;
4560 case IOSTAT_REMOTE_STOP:
4561 if (phba->sli_rev == LPFC_SLI_REV4) {
4562
4563
4564
4565
4566 lpfc_set_rrq_active(phba, ndlp,
4567 cmdiocb->sli4_lxritag, 0, 0);
4568 }
4569 break;
4570 case IOSTAT_LOCAL_REJECT:
4571 switch ((ulp_word4 & IOERR_PARAM_MASK)) {
4572 case IOERR_LOOP_OPEN_FAILURE:
4573 if (cmd == ELS_CMD_PLOGI && cmdiocb->retry == 0)
4574 delay = 1000;
4575 retry = 1;
4576 break;
4577
4578 case IOERR_ILLEGAL_COMMAND:
4579 lpfc_printf_vlog(vport, KERN_ERR, LOG_TRACE_EVENT,
4580 "0124 Retry illegal cmd x%x "
4581 "retry:x%x delay:x%x\n",
4582 cmd, cmdiocb->retry, delay);
4583 retry = 1;
4584
4585 maxretry = 8;
4586 if (cmdiocb->retry > 2)
4587 delay = 1000;
4588 break;
4589
4590 case IOERR_NO_RESOURCES:
4591 logerr = 1;
4592 retry = 1;
4593 if (cmdiocb->retry > 100)
4594 delay = 100;
4595 maxretry = 250;
4596 break;
4597
4598 case IOERR_ILLEGAL_FRAME:
4599 delay = 100;
4600 retry = 1;
4601 break;
4602
4603 case IOERR_INVALID_RPI:
4604 if (cmd == ELS_CMD_PLOGI &&
4605 did == NameServer_DID) {
4606
4607
4608 maxretry = 0;
4609 delay = 100;
4610 }
4611 retry = 1;
4612 break;
4613
4614 case IOERR_SEQUENCE_TIMEOUT:
4615 if (cmd == ELS_CMD_PLOGI &&
4616 did == NameServer_DID &&
4617 (cmdiocb->retry + 1) == maxretry) {
4618
4619 link_reset = 1;
4620 break;
4621 }
4622 retry = 1;
4623 delay = 100;
4624 break;
4625 case IOERR_SLI_ABORTED:
4626
4627
4628
4629 if (cmd == ELS_CMD_PLOGI) {
4630
4631 if (ndlp &&
4632 ndlp->nlp_state != NLP_STE_PLOGI_ISSUE)
4633 goto out_retry;
4634 retry = 1;
4635 maxretry = 2;
4636 }
4637 break;
4638 }
4639 break;
4640
4641 case IOSTAT_NPORT_RJT:
4642 case IOSTAT_FABRIC_RJT:
4643 if (ulp_word4 & RJT_UNAVAIL_TEMP) {
4644 retry = 1;
4645 break;
4646 }
4647 break;
4648
4649 case IOSTAT_NPORT_BSY:
4650 case IOSTAT_FABRIC_BSY:
4651 logerr = 1;
4652 retry = 1;
4653 break;
4654
4655 case IOSTAT_LS_RJT:
4656 stat.un.ls_rjt_error_be = cpu_to_be32(ulp_word4);
4657
4658
4659
4660 if ((vport->fc_flag & FC_PT2PT) &&
4661 cmd == ELS_CMD_NVMEPRLI) {
4662 switch (stat.un.b.lsRjtRsnCode) {
4663 case LSRJT_UNABLE_TPC:
4664 case LSRJT_INVALID_CMD:
4665 case LSRJT_LOGICAL_ERR:
4666 case LSRJT_CMD_UNSUPPORTED:
4667 lpfc_printf_vlog(vport, KERN_WARNING, LOG_ELS,
4668 "0168 NVME PRLI LS_RJT "
4669 "reason %x port doesn't "
4670 "support NVME, disabling NVME\n",
4671 stat.un.b.lsRjtRsnCode);
4672 retry = 0;
4673 vport->fc_flag |= FC_PT2PT_NO_NVME;
4674 goto out_retry;
4675 }
4676 }
4677 switch (stat.un.b.lsRjtRsnCode) {
4678 case LSRJT_UNABLE_TPC:
4679
4680
4681
4682
4683
4684
4685
4686 if ((cmd == ELS_CMD_PRLI || cmd == ELS_CMD_NVMEPRLI) &&
4687 stat.un.b.lsRjtRsnCodeExp !=
4688 LSEXP_REQ_UNSUPPORTED) {
4689 delay = 1000;
4690 maxretry = lpfc_max_els_tries + 1;
4691 retry = 1;
4692 break;
4693 }
4694
4695
4696 if (stat.un.b.lsRjtRsnCodeExp ==
4697 LSEXP_CMD_IN_PROGRESS) {
4698 if (cmd == ELS_CMD_PLOGI) {
4699 delay = 1000;
4700 maxretry = 48;
4701 }
4702 retry = 1;
4703 break;
4704 }
4705 if (stat.un.b.lsRjtRsnCodeExp ==
4706 LSEXP_CANT_GIVE_DATA) {
4707 if (cmd == ELS_CMD_PLOGI) {
4708 delay = 1000;
4709 maxretry = 48;
4710 }
4711 retry = 1;
4712 break;
4713 }
4714 if (cmd == ELS_CMD_PLOGI) {
4715 delay = 1000;
4716 maxretry = lpfc_max_els_tries + 1;
4717 retry = 1;
4718 break;
4719 }
4720 if ((phba->sli3_options & LPFC_SLI3_NPIV_ENABLED) &&
4721 (cmd == ELS_CMD_FDISC) &&
4722 (stat.un.b.lsRjtRsnCodeExp == LSEXP_OUT_OF_RESOURCE)){
4723 lpfc_printf_vlog(vport, KERN_ERR,
4724 LOG_TRACE_EVENT,
4725 "0125 FDISC Failed (x%x). "
4726 "Fabric out of resources\n",
4727 stat.un.lsRjtError);
4728 lpfc_vport_set_state(vport,
4729 FC_VPORT_NO_FABRIC_RSCS);
4730 }
4731 break;
4732
4733 case LSRJT_LOGICAL_BSY:
4734 if ((cmd == ELS_CMD_PLOGI) ||
4735 (cmd == ELS_CMD_PRLI) ||
4736 (cmd == ELS_CMD_NVMEPRLI)) {
4737 delay = 1000;
4738 maxretry = 48;
4739 } else if (cmd == ELS_CMD_FDISC) {
4740
4741 maxretry = 48;
4742 if (cmdiocb->retry >= 32)
4743 delay = 1000;
4744 }
4745 retry = 1;
4746 break;
4747
4748 case LSRJT_LOGICAL_ERR:
4749
4750
4751
4752
4753 if (cmd == ELS_CMD_FDISC &&
4754 stat.un.b.lsRjtRsnCodeExp == LSEXP_PORT_LOGIN_REQ) {
4755 maxretry = 3;
4756 delay = 1000;
4757 retry = 1;
4758 } else if (cmd == ELS_CMD_FLOGI &&
4759 stat.un.b.lsRjtRsnCodeExp ==
4760 LSEXP_NOTHING_MORE) {
4761 vport->fc_sparam.cmn.bbRcvSizeMsb &= 0xf;
4762 retry = 1;
4763 lpfc_printf_vlog(vport, KERN_ERR,
4764 LOG_TRACE_EVENT,
4765 "0820 FLOGI Failed (x%x). "
4766 "BBCredit Not Supported\n",
4767 stat.un.lsRjtError);
4768 }
4769 break;
4770
4771 case LSRJT_PROTOCOL_ERR:
4772 if ((phba->sli3_options & LPFC_SLI3_NPIV_ENABLED) &&
4773 (cmd == ELS_CMD_FDISC) &&
4774 ((stat.un.b.lsRjtRsnCodeExp == LSEXP_INVALID_PNAME) ||
4775 (stat.un.b.lsRjtRsnCodeExp == LSEXP_INVALID_NPORT_ID))
4776 ) {
4777 lpfc_printf_vlog(vport, KERN_ERR,
4778 LOG_TRACE_EVENT,
4779 "0122 FDISC Failed (x%x). "
4780 "Fabric Detected Bad WWN\n",
4781 stat.un.lsRjtError);
4782 lpfc_vport_set_state(vport,
4783 FC_VPORT_FABRIC_REJ_WWN);
4784 }
4785 break;
4786 case LSRJT_VENDOR_UNIQUE:
4787 if ((stat.un.b.vendorUnique == 0x45) &&
4788 (cmd == ELS_CMD_FLOGI)) {
4789 goto out_retry;
4790 }
4791 break;
4792 case LSRJT_CMD_UNSUPPORTED:
4793
4794
4795
4796
4797
4798 if (stat.un.b.lsRjtRsnCodeExp ==
4799 LSEXP_REQ_UNSUPPORTED) {
4800 if (cmd == ELS_CMD_PRLI) {
4801 spin_lock_irq(&ndlp->lock);
4802 ndlp->nlp_flag |= NLP_FCP_PRLI_RJT;
4803 spin_unlock_irq(&ndlp->lock);
4804 retry = 0;
4805 goto out_retry;
4806 }
4807 }
4808 break;
4809 }
4810 break;
4811
4812 case IOSTAT_INTERMED_RSP:
4813 case IOSTAT_BA_RJT:
4814 break;
4815
4816 default:
4817 break;
4818 }
4819
4820 if (link_reset) {
4821 rc = lpfc_link_reset(vport);
4822 if (rc) {
4823
4824
4825
4826 retry = 1;
4827 delay = 100;
4828 goto out_retry;
4829 }
4830 return 1;
4831 }
4832
4833 if (did == FDMI_DID)
4834 retry = 1;
4835
4836 if ((cmd == ELS_CMD_FLOGI) &&
4837 (phba->fc_topology != LPFC_TOPOLOGY_LOOP) &&
4838 !lpfc_error_lost_link(ulp_status, ulp_word4)) {
4839
4840 retry = 1;
4841
4842 if (phba->link_flag != LS_LOOPBACK_MODE)
4843 maxretry = 0;
4844 else
4845 maxretry = 2;
4846
4847 if (cmdiocb->retry >= 100)
4848 delay = 5000;
4849 else if (cmdiocb->retry >= 32)
4850 delay = 1000;
4851 } else if ((cmd == ELS_CMD_FDISC) &&
4852 !lpfc_error_lost_link(ulp_status, ulp_word4)) {
4853
4854 retry = 1;
4855 maxretry = vport->cfg_devloss_tmo;
4856 delay = 1000;
4857 }
4858
4859 cmdiocb->retry++;
4860 if (maxretry && (cmdiocb->retry >= maxretry)) {
4861 phba->fc_stat.elsRetryExceeded++;
4862 retry = 0;
4863 }
4864
4865 if ((vport->load_flag & FC_UNLOADING) != 0)
4866 retry = 0;
4867
4868 out_retry:
4869 if (retry) {
4870 if ((cmd == ELS_CMD_PLOGI) || (cmd == ELS_CMD_FDISC)) {
4871
4872 if (phba->fcf.fcf_flag & FCF_DISCOVERY) {
4873 lpfc_printf_vlog(vport, KERN_INFO, LOG_ELS,
4874 "2849 Stop retry ELS command "
4875 "x%x to remote NPORT x%x, "
4876 "Data: x%x x%x\n", cmd, did,
4877 cmdiocb->retry, delay);
4878 return 0;
4879 }
4880 }
4881
4882
4883 lpfc_printf_vlog(vport, KERN_INFO, LOG_ELS,
4884 "0107 Retry ELS command x%x to remote "
4885 "NPORT x%x Data: x%x x%x\n",
4886 cmd, did, cmdiocb->retry, delay);
4887
4888 if (((cmd == ELS_CMD_PLOGI) || (cmd == ELS_CMD_ADISC)) &&
4889 ((ulp_status != IOSTAT_LOCAL_REJECT) ||
4890 ((ulp_word4 & IOERR_PARAM_MASK) !=
4891 IOERR_NO_RESOURCES))) {
4892
4893
4894
4895 if (timer_pending(&vport->fc_disctmo) ||
4896 (vport->fc_flag & FC_RSCN_MODE))
4897 lpfc_set_disctmo(vport);
4898 }
4899
4900 phba->fc_stat.elsXmitRetry++;
4901 if (ndlp && delay) {
4902 phba->fc_stat.elsDelayRetry++;
4903 ndlp->nlp_retry = cmdiocb->retry;
4904
4905
4906 mod_timer(&ndlp->nlp_delayfunc,
4907 jiffies + msecs_to_jiffies(delay));
4908 spin_lock_irq(&ndlp->lock);
4909 ndlp->nlp_flag |= NLP_DELAY_TMO;
4910 spin_unlock_irq(&ndlp->lock);
4911
4912 ndlp->nlp_prev_state = ndlp->nlp_state;
4913 if ((cmd == ELS_CMD_PRLI) ||
4914 (cmd == ELS_CMD_NVMEPRLI))
4915 lpfc_nlp_set_state(vport, ndlp,
4916 NLP_STE_PRLI_ISSUE);
4917 else if (cmd != ELS_CMD_ADISC)
4918 lpfc_nlp_set_state(vport, ndlp,
4919 NLP_STE_NPR_NODE);
4920 ndlp->nlp_last_elscmd = cmd;
4921
4922 return 1;
4923 }
4924 switch (cmd) {
4925 case ELS_CMD_FLOGI:
4926 lpfc_issue_els_flogi(vport, ndlp, cmdiocb->retry);
4927 return 1;
4928 case ELS_CMD_FDISC:
4929 lpfc_issue_els_fdisc(vport, ndlp, cmdiocb->retry);
4930 return 1;
4931 case ELS_CMD_PLOGI:
4932 if (ndlp) {
4933 ndlp->nlp_prev_state = ndlp->nlp_state;
4934 lpfc_nlp_set_state(vport, ndlp,
4935 NLP_STE_PLOGI_ISSUE);
4936 }
4937 lpfc_issue_els_plogi(vport, did, cmdiocb->retry);
4938 return 1;
4939 case ELS_CMD_ADISC:
4940 ndlp->nlp_prev_state = ndlp->nlp_state;
4941 lpfc_nlp_set_state(vport, ndlp, NLP_STE_ADISC_ISSUE);
4942 lpfc_issue_els_adisc(vport, ndlp, cmdiocb->retry);
4943 return 1;
4944 case ELS_CMD_PRLI:
4945 case ELS_CMD_NVMEPRLI:
4946 ndlp->nlp_prev_state = ndlp->nlp_state;
4947 lpfc_nlp_set_state(vport, ndlp, NLP_STE_PRLI_ISSUE);
4948 lpfc_issue_els_prli(vport, ndlp, cmdiocb->retry);
4949 return 1;
4950 case ELS_CMD_LOGO:
4951 ndlp->nlp_prev_state = ndlp->nlp_state;
4952 lpfc_nlp_set_state(vport, ndlp, NLP_STE_LOGO_ISSUE);
4953 lpfc_issue_els_logo(vport, ndlp, cmdiocb->retry);
4954 return 1;
4955 }
4956 }
4957
4958 if (logerr) {
4959 lpfc_printf_vlog(vport, KERN_ERR, LOG_TRACE_EVENT,
4960 "0137 No retry ELS command x%x to remote "
4961 "NPORT x%x: Out of Resources: Error:x%x/%x\n",
4962 cmd, did, ulp_status,
4963 ulp_word4);
4964 }
4965 else {
4966 lpfc_printf_vlog(vport, KERN_INFO, LOG_ELS,
4967 "0108 No retry ELS command x%x to remote "
4968 "NPORT x%x Retried:%d Error:x%x/%x\n",
4969 cmd, did, cmdiocb->retry, ulp_status,
4970 ulp_word4);
4971 }
4972 return 0;
4973 }
4974
4975
4976
4977
4978
4979
4980
4981
4982
4983
4984
4985
4986
4987
4988
4989 static int
4990 lpfc_els_free_data(struct lpfc_hba *phba, struct lpfc_dmabuf *buf_ptr1)
4991 {
4992 struct lpfc_dmabuf *buf_ptr;
4993
4994
4995 if (!list_empty(&buf_ptr1->list)) {
4996 list_remove_head(&buf_ptr1->list, buf_ptr,
4997 struct lpfc_dmabuf,
4998 list);
4999 lpfc_mbuf_free(phba, buf_ptr->virt, buf_ptr->phys);
5000 kfree(buf_ptr);
5001 }
5002 lpfc_mbuf_free(phba, buf_ptr1->virt, buf_ptr1->phys);
5003 kfree(buf_ptr1);
5004 return 0;
5005 }
5006
5007
5008
5009
5010
5011
5012
5013
5014
5015
5016
5017
5018
5019 static int
5020 lpfc_els_free_bpl(struct lpfc_hba *phba, struct lpfc_dmabuf *buf_ptr)
5021 {
5022 lpfc_mbuf_free(phba, buf_ptr->virt, buf_ptr->phys);
5023 kfree(buf_ptr);
5024 return 0;
5025 }
5026
5027
5028
5029
5030
5031
5032
5033
5034
5035
5036
5037
5038
5039
5040
5041
5042
5043
5044
5045
5046
5047
5048
5049
5050
5051
5052
5053
5054 int
5055 lpfc_els_free_iocb(struct lpfc_hba *phba, struct lpfc_iocbq *elsiocb)
5056 {
5057 struct lpfc_dmabuf *buf_ptr, *buf_ptr1;
5058
5059
5060 elsiocb->ndlp = NULL;
5061
5062
5063 if (elsiocb->cmd_dmabuf) {
5064 if (elsiocb->cmd_flag & LPFC_DELAY_MEM_FREE) {
5065
5066
5067
5068
5069 elsiocb->cmd_flag &= ~LPFC_DELAY_MEM_FREE;
5070 buf_ptr = elsiocb->cmd_dmabuf;
5071 elsiocb->cmd_dmabuf = NULL;
5072 if (buf_ptr) {
5073 buf_ptr1 = NULL;
5074 spin_lock_irq(&phba->hbalock);
5075 if (!list_empty(&buf_ptr->list)) {
5076 list_remove_head(&buf_ptr->list,
5077 buf_ptr1, struct lpfc_dmabuf,
5078 list);
5079 INIT_LIST_HEAD(&buf_ptr1->list);
5080 list_add_tail(&buf_ptr1->list,
5081 &phba->elsbuf);
5082 phba->elsbuf_cnt++;
5083 }
5084 INIT_LIST_HEAD(&buf_ptr->list);
5085 list_add_tail(&buf_ptr->list, &phba->elsbuf);
5086 phba->elsbuf_cnt++;
5087 spin_unlock_irq(&phba->hbalock);
5088 }
5089 } else {
5090 buf_ptr1 = elsiocb->cmd_dmabuf;
5091 lpfc_els_free_data(phba, buf_ptr1);
5092 elsiocb->cmd_dmabuf = NULL;
5093 }
5094 }
5095
5096 if (elsiocb->bpl_dmabuf) {
5097 buf_ptr = elsiocb->bpl_dmabuf;
5098 lpfc_els_free_bpl(phba, buf_ptr);
5099 elsiocb->bpl_dmabuf = NULL;
5100 }
5101 lpfc_sli_release_iocbq(phba, elsiocb);
5102 return 0;
5103 }
5104
5105
5106
5107
5108
5109
5110
5111
5112
5113
5114
5115
5116
5117
5118
5119
5120
5121
5122 static void
5123 lpfc_cmpl_els_logo_acc(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
5124 struct lpfc_iocbq *rspiocb)
5125 {
5126 struct lpfc_nodelist *ndlp = cmdiocb->ndlp;
5127 struct lpfc_vport *vport = cmdiocb->vport;
5128 u32 ulp_status, ulp_word4;
5129
5130 ulp_status = get_job_ulpstatus(phba, rspiocb);
5131 ulp_word4 = get_job_word4(phba, rspiocb);
5132
5133 lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_RSP,
5134 "ACC LOGO cmpl: status:x%x/x%x did:x%x",
5135 ulp_status, ulp_word4, ndlp->nlp_DID);
5136
5137 lpfc_printf_vlog(vport, KERN_INFO, LOG_ELS,
5138 "0109 ACC to LOGO completes to NPort x%x refcnt %d "
5139 "Data: x%x x%x x%x\n",
5140 ndlp->nlp_DID, kref_read(&ndlp->kref), ndlp->nlp_flag,
5141 ndlp->nlp_state, ndlp->nlp_rpi);
5142
5143
5144
5145
5146
5147
5148 if (ndlp->nlp_type & NLP_FABRIC &&
5149 ((ndlp->nlp_DID & WELL_KNOWN_DID_MASK) != WELL_KNOWN_DID_MASK))
5150 goto out;
5151
5152 if (ndlp->nlp_state == NLP_STE_NPR_NODE) {
5153
5154
5155
5156
5157 if ((ndlp->nlp_flag & NLP_DELAY_TMO) &&
5158 (ndlp->nlp_last_elscmd == ELS_CMD_PLOGI))
5159 goto out;
5160
5161
5162 if (!lpfc_nlp_not_used(ndlp)) {
5163
5164
5165
5166
5167 lpfc_unreg_rpi(vport, ndlp);
5168 } else {
5169
5170
5171
5172 cmdiocb->ndlp = NULL;
5173 }
5174 }
5175 out:
5176
5177
5178
5179
5180 lpfc_els_free_iocb(phba, cmdiocb);
5181 lpfc_nlp_put(ndlp);
5182 }
5183
5184
5185
5186
5187
5188
5189
5190
5191
5192
5193
5194
5195
5196
5197 void
5198 lpfc_mbx_cmpl_dflt_rpi(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmb)
5199 {
5200 struct lpfc_nodelist *ndlp = pmb->ctx_ndlp;
5201 u32 mbx_flag = pmb->mbox_flag;
5202 u32 mbx_cmd = pmb->u.mb.mbxCommand;
5203
5204 if (ndlp) {
5205 lpfc_printf_vlog(ndlp->vport, KERN_INFO, LOG_NODE,
5206 "0006 rpi x%x DID:%x flg:%x %d x%px "
5207 "mbx_cmd x%x mbx_flag x%x x%px\n",
5208 ndlp->nlp_rpi, ndlp->nlp_DID, ndlp->nlp_flag,
5209 kref_read(&ndlp->kref), ndlp, mbx_cmd,
5210 mbx_flag, pmb);
5211
5212
5213
5214
5215
5216
5217 spin_lock_irq(&ndlp->lock);
5218 ndlp->nlp_flag &= ~NLP_REG_LOGIN_SEND;
5219 if (mbx_cmd == MBX_UNREG_LOGIN)
5220 ndlp->nlp_flag &= ~NLP_UNREG_INP;
5221 spin_unlock_irq(&ndlp->lock);
5222 lpfc_nlp_put(ndlp);
5223 lpfc_drop_node(ndlp->vport, ndlp);
5224 }
5225
5226 lpfc_mbox_rsrc_cleanup(phba, pmb, MBOX_THD_UNLOCKED);
5227 }
5228
5229
5230
5231
5232
5233
5234
5235
5236
5237
5238
5239
5240
5241
5242 static void
5243 lpfc_cmpl_els_rsp(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
5244 struct lpfc_iocbq *rspiocb)
5245 {
5246 struct lpfc_nodelist *ndlp = cmdiocb->ndlp;
5247 struct lpfc_vport *vport = ndlp ? ndlp->vport : NULL;
5248 struct Scsi_Host *shost = vport ? lpfc_shost_from_vport(vport) : NULL;
5249 IOCB_t *irsp;
5250 LPFC_MBOXQ_t *mbox = NULL;
5251 u32 ulp_status, ulp_word4, tmo, did, iotag;
5252
5253 if (!vport) {
5254 lpfc_printf_log(phba, KERN_ERR, LOG_TRACE_EVENT,
5255 "3177 ELS response failed\n");
5256 goto out;
5257 }
5258 if (cmdiocb->context_un.mbox)
5259 mbox = cmdiocb->context_un.mbox;
5260
5261 ulp_status = get_job_ulpstatus(phba, rspiocb);
5262 ulp_word4 = get_job_word4(phba, rspiocb);
5263 did = get_job_els_rsp64_did(phba, cmdiocb);
5264
5265 if (phba->sli_rev == LPFC_SLI_REV4) {
5266 tmo = get_wqe_tmo(cmdiocb);
5267 iotag = get_wqe_reqtag(cmdiocb);
5268 } else {
5269 irsp = &rspiocb->iocb;
5270 tmo = irsp->ulpTimeout;
5271 iotag = irsp->ulpIoTag;
5272 }
5273
5274
5275 if (!ndlp || lpfc_els_chk_latt(vport)) {
5276 if (mbox)
5277 lpfc_mbox_rsrc_cleanup(phba, mbox, MBOX_THD_UNLOCKED);
5278 goto out;
5279 }
5280
5281 lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_RSP,
5282 "ELS rsp cmpl: status:x%x/x%x did:x%x",
5283 ulp_status, ulp_word4, did);
5284
5285 lpfc_printf_vlog(vport, KERN_INFO, LOG_ELS,
5286 "0110 ELS response tag x%x completes "
5287 "Data: x%x x%x x%x x%x x%x x%x x%x x%x %p %p\n",
5288 iotag, ulp_status, ulp_word4, tmo,
5289 ndlp->nlp_DID, ndlp->nlp_flag, ndlp->nlp_state,
5290 ndlp->nlp_rpi, kref_read(&ndlp->kref), mbox, ndlp);
5291 if (mbox) {
5292 if (ulp_status == 0
5293 && (ndlp->nlp_flag & NLP_ACC_REGLOGIN)) {
5294 if (!lpfc_unreg_rpi(vport, ndlp) &&
5295 (!(vport->fc_flag & FC_PT2PT))) {
5296 if (ndlp->nlp_state == NLP_STE_PLOGI_ISSUE ||
5297 ndlp->nlp_state ==
5298 NLP_STE_REG_LOGIN_ISSUE) {
5299 lpfc_printf_vlog(vport, KERN_INFO,
5300 LOG_DISCOVERY,
5301 "0314 PLOGI recov "
5302 "DID x%x "
5303 "Data: x%x x%x x%x\n",
5304 ndlp->nlp_DID,
5305 ndlp->nlp_state,
5306 ndlp->nlp_rpi,
5307 ndlp->nlp_flag);
5308 goto out_free_mbox;
5309 }
5310 }
5311
5312
5313
5314
5315 mbox->ctx_ndlp = lpfc_nlp_get(ndlp);
5316 if (!mbox->ctx_ndlp)
5317 goto out_free_mbox;
5318
5319 mbox->vport = vport;
5320 if (ndlp->nlp_flag & NLP_RM_DFLT_RPI) {
5321 mbox->mbox_flag |= LPFC_MBX_IMED_UNREG;
5322 mbox->mbox_cmpl = lpfc_mbx_cmpl_dflt_rpi;
5323 }
5324 else {
5325 mbox->mbox_cmpl = lpfc_mbx_cmpl_reg_login;
5326 ndlp->nlp_prev_state = ndlp->nlp_state;
5327 lpfc_nlp_set_state(vport, ndlp,
5328 NLP_STE_REG_LOGIN_ISSUE);
5329 }
5330
5331 ndlp->nlp_flag |= NLP_REG_LOGIN_SEND;
5332 if (lpfc_sli_issue_mbox(phba, mbox, MBX_NOWAIT)
5333 != MBX_NOT_FINISHED)
5334 goto out;
5335
5336
5337
5338
5339 lpfc_nlp_put(ndlp);
5340 ndlp->nlp_flag &= ~NLP_REG_LOGIN_SEND;
5341
5342
5343 lpfc_printf_vlog(vport, KERN_ERR, LOG_TRACE_EVENT,
5344 "0138 ELS rsp: Cannot issue reg_login for x%x "
5345 "Data: x%x x%x x%x\n",
5346 ndlp->nlp_DID, ndlp->nlp_flag, ndlp->nlp_state,
5347 ndlp->nlp_rpi);
5348 }
5349 out_free_mbox:
5350 lpfc_mbox_rsrc_cleanup(phba, mbox, MBOX_THD_UNLOCKED);
5351 }
5352 out:
5353 if (ndlp && shost) {
5354 spin_lock_irq(&ndlp->lock);
5355 if (mbox)
5356 ndlp->nlp_flag &= ~NLP_ACC_REGLOGIN;
5357 ndlp->nlp_flag &= ~NLP_RM_DFLT_RPI;
5358 spin_unlock_irq(&ndlp->lock);
5359 }
5360
5361
5362
5363
5364 if (phba->sli_rev == LPFC_SLI_REV4 &&
5365 (vport && vport->port_type == LPFC_NPIV_PORT) &&
5366 !(ndlp->fc4_xpt_flags & SCSI_XPT_REGD) &&
5367 ndlp->nlp_flag & NLP_RELEASE_RPI) {
5368 if (ndlp->nlp_state != NLP_STE_PLOGI_ISSUE &&
5369 ndlp->nlp_state != NLP_STE_REG_LOGIN_ISSUE) {
5370 lpfc_sli4_free_rpi(phba, ndlp->nlp_rpi);
5371 spin_lock_irq(&ndlp->lock);
5372 ndlp->nlp_rpi = LPFC_RPI_ALLOC_ERROR;
5373 ndlp->nlp_flag &= ~NLP_RELEASE_RPI;
5374 spin_unlock_irq(&ndlp->lock);
5375 lpfc_drop_node(vport, ndlp);
5376 }
5377 }
5378
5379
5380 lpfc_els_free_iocb(phba, cmdiocb);
5381 lpfc_nlp_put(ndlp);
5382 return;
5383 }
5384
5385
5386
5387
5388
5389
5390
5391
5392
5393
5394
5395
5396
5397
5398
5399
5400
5401
5402
5403
5404
5405
5406
5407
5408
5409
5410 int
5411 lpfc_els_rsp_acc(struct lpfc_vport *vport, uint32_t flag,
5412 struct lpfc_iocbq *oldiocb, struct lpfc_nodelist *ndlp,
5413 LPFC_MBOXQ_t *mbox)
5414 {
5415 struct lpfc_hba *phba = vport->phba;
5416 IOCB_t *icmd;
5417 IOCB_t *oldcmd;
5418 union lpfc_wqe128 *wqe;
5419 union lpfc_wqe128 *oldwqe = &oldiocb->wqe;
5420 struct lpfc_iocbq *elsiocb;
5421 uint8_t *pcmd;
5422 struct serv_parm *sp;
5423 uint16_t cmdsize;
5424 int rc;
5425 ELS_PKT *els_pkt_ptr;
5426 struct fc_els_rdf_resp *rdf_resp;
5427
5428 switch (flag) {
5429 case ELS_CMD_ACC:
5430 cmdsize = sizeof(uint32_t);
5431 elsiocb = lpfc_prep_els_iocb(vport, 0, cmdsize, oldiocb->retry,
5432 ndlp, ndlp->nlp_DID, ELS_CMD_ACC);
5433 if (!elsiocb) {
5434 spin_lock_irq(&ndlp->lock);
5435 ndlp->nlp_flag &= ~NLP_LOGO_ACC;
5436 spin_unlock_irq(&ndlp->lock);
5437 return 1;
5438 }
5439
5440 if (phba->sli_rev == LPFC_SLI_REV4) {
5441 wqe = &elsiocb->wqe;
5442
5443 bf_set(wqe_ctxt_tag, &wqe->xmit_els_rsp.wqe_com,
5444 bf_get(wqe_ctxt_tag,
5445 &oldwqe->xmit_els_rsp.wqe_com));
5446
5447
5448 bf_set(wqe_rcvoxid, &wqe->xmit_els_rsp.wqe_com,
5449 bf_get(wqe_rcvoxid,
5450 &oldwqe->xmit_els_rsp.wqe_com));
5451 } else {
5452 icmd = &elsiocb->iocb;
5453 oldcmd = &oldiocb->iocb;
5454 icmd->ulpContext = oldcmd->ulpContext;
5455 icmd->unsli3.rcvsli3.ox_id =
5456 oldcmd->unsli3.rcvsli3.ox_id;
5457 }
5458
5459 pcmd = elsiocb->cmd_dmabuf->virt;
5460 *((uint32_t *) (pcmd)) = ELS_CMD_ACC;
5461 pcmd += sizeof(uint32_t);
5462
5463 lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_RSP,
5464 "Issue ACC: did:x%x flg:x%x",
5465 ndlp->nlp_DID, ndlp->nlp_flag, 0);
5466 break;
5467 case ELS_CMD_FLOGI:
5468 case ELS_CMD_PLOGI:
5469 cmdsize = (sizeof(struct serv_parm) + sizeof(uint32_t));
5470 elsiocb = lpfc_prep_els_iocb(vport, 0, cmdsize, oldiocb->retry,
5471 ndlp, ndlp->nlp_DID, ELS_CMD_ACC);
5472 if (!elsiocb)
5473 return 1;
5474
5475 if (phba->sli_rev == LPFC_SLI_REV4) {
5476 wqe = &elsiocb->wqe;
5477
5478 bf_set(wqe_ctxt_tag, &wqe->xmit_els_rsp.wqe_com,
5479 bf_get(wqe_ctxt_tag,
5480 &oldwqe->xmit_els_rsp.wqe_com));
5481
5482
5483 bf_set(wqe_rcvoxid, &wqe->xmit_els_rsp.wqe_com,
5484 bf_get(wqe_rcvoxid,
5485 &oldwqe->xmit_els_rsp.wqe_com));
5486 } else {
5487 icmd = &elsiocb->iocb;
5488 oldcmd = &oldiocb->iocb;
5489 icmd->ulpContext = oldcmd->ulpContext;
5490 icmd->unsli3.rcvsli3.ox_id =
5491 oldcmd->unsli3.rcvsli3.ox_id;
5492 }
5493
5494 pcmd = (u8 *)elsiocb->cmd_dmabuf->virt;
5495
5496 if (mbox)
5497 elsiocb->context_un.mbox = mbox;
5498
5499 *((uint32_t *) (pcmd)) = ELS_CMD_ACC;
5500 pcmd += sizeof(uint32_t);
5501 sp = (struct serv_parm *)pcmd;
5502
5503 if (flag == ELS_CMD_FLOGI) {
5504
5505 memcpy(sp, &phba->fc_fabparam,
5506 sizeof(struct serv_parm));
5507
5508
5509 sp->cmn.fPort = 0;
5510
5511
5512 sp->cls1.classValid = 0;
5513 sp->cls2.classValid = 0;
5514 sp->cls3.classValid = 0;
5515 sp->cls4.classValid = 0;
5516
5517
5518 memcpy(&sp->portName, &vport->fc_sparam.portName,
5519 sizeof(struct lpfc_name));
5520 memcpy(&sp->nodeName, &vport->fc_sparam.nodeName,
5521 sizeof(struct lpfc_name));
5522 } else {
5523 memcpy(pcmd, &vport->fc_sparam,
5524 sizeof(struct serv_parm));
5525
5526 sp->cmn.valid_vendor_ver_level = 0;
5527 memset(sp->un.vendorVersion, 0,
5528 sizeof(sp->un.vendorVersion));
5529 sp->cmn.bbRcvSizeMsb &= 0xF;
5530
5531
5532
5533
5534 if (phba->sli.sli_flag & LPFC_SLI_SUPPRESS_RSP) {
5535 sp->cmn.valid_vendor_ver_level = 1;
5536 sp->un.vv.vid = cpu_to_be32(LPFC_VV_EMLX_ID);
5537 sp->un.vv.flags =
5538 cpu_to_be32(LPFC_VV_SUPPRESS_RSP);
5539 }
5540 }
5541
5542 lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_RSP,
5543 "Issue ACC FLOGI/PLOGI: did:x%x flg:x%x",
5544 ndlp->nlp_DID, ndlp->nlp_flag, 0);
5545 break;
5546 case ELS_CMD_PRLO:
5547 cmdsize = sizeof(uint32_t) + sizeof(PRLO);
5548 elsiocb = lpfc_prep_els_iocb(vport, 0, cmdsize, oldiocb->retry,
5549 ndlp, ndlp->nlp_DID, ELS_CMD_PRLO);
5550 if (!elsiocb)
5551 return 1;
5552
5553 if (phba->sli_rev == LPFC_SLI_REV4) {
5554 wqe = &elsiocb->wqe;
5555
5556 bf_set(wqe_ctxt_tag, &wqe->xmit_els_rsp.wqe_com,
5557 bf_get(wqe_ctxt_tag,
5558 &oldwqe->xmit_els_rsp.wqe_com));
5559
5560
5561 bf_set(wqe_rcvoxid, &wqe->xmit_els_rsp.wqe_com,
5562 bf_get(wqe_rcvoxid,
5563 &oldwqe->xmit_els_rsp.wqe_com));
5564 } else {
5565 icmd = &elsiocb->iocb;
5566 oldcmd = &oldiocb->iocb;
5567 icmd->ulpContext = oldcmd->ulpContext;
5568 icmd->unsli3.rcvsli3.ox_id =
5569 oldcmd->unsli3.rcvsli3.ox_id;
5570 }
5571
5572 pcmd = (u8 *) elsiocb->cmd_dmabuf->virt;
5573
5574 memcpy(pcmd, oldiocb->cmd_dmabuf->virt,
5575 sizeof(uint32_t) + sizeof(PRLO));
5576 *((uint32_t *) (pcmd)) = ELS_CMD_PRLO_ACC;
5577 els_pkt_ptr = (ELS_PKT *) pcmd;
5578 els_pkt_ptr->un.prlo.acceptRspCode = PRLO_REQ_EXECUTED;
5579
5580 lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_RSP,
5581 "Issue ACC PRLO: did:x%x flg:x%x",
5582 ndlp->nlp_DID, ndlp->nlp_flag, 0);
5583 break;
5584 case ELS_CMD_RDF:
5585 cmdsize = sizeof(*rdf_resp);
5586 elsiocb = lpfc_prep_els_iocb(vport, 0, cmdsize, oldiocb->retry,
5587 ndlp, ndlp->nlp_DID, ELS_CMD_ACC);
5588 if (!elsiocb)
5589 return 1;
5590
5591 if (phba->sli_rev == LPFC_SLI_REV4) {
5592 wqe = &elsiocb->wqe;
5593
5594 bf_set(wqe_ctxt_tag, &wqe->xmit_els_rsp.wqe_com,
5595 bf_get(wqe_ctxt_tag,
5596 &oldwqe->xmit_els_rsp.wqe_com));
5597
5598
5599 bf_set(wqe_rcvoxid, &wqe->xmit_els_rsp.wqe_com,
5600 bf_get(wqe_rcvoxid,
5601 &oldwqe->xmit_els_rsp.wqe_com));
5602 } else {
5603 icmd = &elsiocb->iocb;
5604 oldcmd = &oldiocb->iocb;
5605 icmd->ulpContext = oldcmd->ulpContext;
5606 icmd->unsli3.rcvsli3.ox_id =
5607 oldcmd->unsli3.rcvsli3.ox_id;
5608 }
5609
5610 pcmd = (u8 *)elsiocb->cmd_dmabuf->virt;
5611 rdf_resp = (struct fc_els_rdf_resp *)pcmd;
5612 memset(rdf_resp, 0, sizeof(*rdf_resp));
5613 rdf_resp->acc_hdr.la_cmd = ELS_LS_ACC;
5614
5615
5616 rdf_resp->desc_list_len = cpu_to_be32(12);
5617
5618
5619 rdf_resp->lsri.desc_tag = cpu_to_be32(1);
5620 rdf_resp->lsri.desc_len = cpu_to_be32(sizeof(u32));
5621 rdf_resp->lsri.rqst_w0.cmd = ELS_RDF;
5622 break;
5623 default:
5624 return 1;
5625 }
5626 if (ndlp->nlp_flag & NLP_LOGO_ACC) {
5627 spin_lock_irq(&ndlp->lock);
5628 if (!(ndlp->nlp_flag & NLP_RPI_REGISTERED ||
5629 ndlp->nlp_flag & NLP_REG_LOGIN_SEND))
5630 ndlp->nlp_flag &= ~NLP_LOGO_ACC;
5631 spin_unlock_irq(&ndlp->lock);
5632 elsiocb->cmd_cmpl = lpfc_cmpl_els_logo_acc;
5633 } else {
5634 elsiocb->cmd_cmpl = lpfc_cmpl_els_rsp;
5635 }
5636
5637 phba->fc_stat.elsXmitACC++;
5638 elsiocb->ndlp = lpfc_nlp_get(ndlp);
5639 if (!elsiocb->ndlp) {
5640 lpfc_els_free_iocb(phba, elsiocb);
5641 return 1;
5642 }
5643
5644 rc = lpfc_sli_issue_iocb(phba, LPFC_ELS_RING, elsiocb, 0);
5645 if (rc == IOCB_ERROR) {
5646 lpfc_els_free_iocb(phba, elsiocb);
5647 lpfc_nlp_put(ndlp);
5648 return 1;
5649 }
5650
5651
5652 lpfc_printf_vlog(vport, KERN_INFO, LOG_ELS,
5653 "0128 Xmit ELS ACC response Status: x%x, IoTag: x%x, "
5654 "XRI: x%x, DID: x%x, nlp_flag: x%x nlp_state: x%x "
5655 "RPI: x%x, fc_flag x%x refcnt %d\n",
5656 rc, elsiocb->iotag, elsiocb->sli4_xritag,
5657 ndlp->nlp_DID, ndlp->nlp_flag, ndlp->nlp_state,
5658 ndlp->nlp_rpi, vport->fc_flag, kref_read(&ndlp->kref));
5659 return 0;
5660 }
5661
5662
5663
5664
5665
5666
5667
5668
5669
5670
5671
5672
5673
5674
5675
5676
5677
5678
5679
5680
5681
5682
5683
5684 int
5685 lpfc_els_rsp_reject(struct lpfc_vport *vport, uint32_t rejectError,
5686 struct lpfc_iocbq *oldiocb, struct lpfc_nodelist *ndlp,
5687 LPFC_MBOXQ_t *mbox)
5688 {
5689 int rc;
5690 struct lpfc_hba *phba = vport->phba;
5691 IOCB_t *icmd;
5692 IOCB_t *oldcmd;
5693 union lpfc_wqe128 *wqe;
5694 struct lpfc_iocbq *elsiocb;
5695 uint8_t *pcmd;
5696 uint16_t cmdsize;
5697
5698 cmdsize = 2 * sizeof(uint32_t);
5699 elsiocb = lpfc_prep_els_iocb(vport, 0, cmdsize, oldiocb->retry, ndlp,
5700 ndlp->nlp_DID, ELS_CMD_LS_RJT);
5701 if (!elsiocb)
5702 return 1;
5703
5704 if (phba->sli_rev == LPFC_SLI_REV4) {
5705 wqe = &elsiocb->wqe;
5706 bf_set(wqe_ctxt_tag, &wqe->generic.wqe_com,
5707 get_job_ulpcontext(phba, oldiocb));
5708 bf_set(wqe_rcvoxid, &wqe->xmit_els_rsp.wqe_com,
5709 get_job_rcvoxid(phba, oldiocb));
5710 } else {
5711 icmd = &elsiocb->iocb;
5712 oldcmd = &oldiocb->iocb;
5713 icmd->ulpContext = oldcmd->ulpContext;
5714 icmd->unsli3.rcvsli3.ox_id = oldcmd->unsli3.rcvsli3.ox_id;
5715 }
5716
5717 pcmd = (uint8_t *)elsiocb->cmd_dmabuf->virt;
5718
5719 *((uint32_t *) (pcmd)) = ELS_CMD_LS_RJT;
5720 pcmd += sizeof(uint32_t);
5721 *((uint32_t *) (pcmd)) = rejectError;
5722
5723 if (mbox)
5724 elsiocb->context_un.mbox = mbox;
5725
5726
5727 lpfc_printf_vlog(vport, KERN_INFO, LOG_ELS,
5728 "0129 Xmit ELS RJT x%x response tag x%x "
5729 "xri x%x, did x%x, nlp_flag x%x, nlp_state x%x, "
5730 "rpi x%x\n",
5731 rejectError, elsiocb->iotag,
5732 get_job_ulpcontext(phba, elsiocb), ndlp->nlp_DID,
5733 ndlp->nlp_flag, ndlp->nlp_state, ndlp->nlp_rpi);
5734 lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_RSP,
5735 "Issue LS_RJT: did:x%x flg:x%x err:x%x",
5736 ndlp->nlp_DID, ndlp->nlp_flag, rejectError);
5737
5738 phba->fc_stat.elsXmitLSRJT++;
5739 elsiocb->cmd_cmpl = lpfc_cmpl_els_rsp;
5740 elsiocb->ndlp = lpfc_nlp_get(ndlp);
5741 if (!elsiocb->ndlp) {
5742 lpfc_els_free_iocb(phba, elsiocb);
5743 return 1;
5744 }
5745
5746
5747
5748
5749
5750 if (phba->sli_rev == LPFC_SLI_REV4 &&
5751 vport->port_type == LPFC_NPIV_PORT &&
5752 !(ndlp->fc4_xpt_flags & SCSI_XPT_REGD)) {
5753 spin_lock_irq(&ndlp->lock);
5754 ndlp->nlp_flag |= NLP_RELEASE_RPI;
5755 spin_unlock_irq(&ndlp->lock);
5756 }
5757
5758 rc = lpfc_sli_issue_iocb(phba, LPFC_ELS_RING, elsiocb, 0);
5759 if (rc == IOCB_ERROR) {
5760 lpfc_els_free_iocb(phba, elsiocb);
5761 lpfc_nlp_put(ndlp);
5762 return 1;
5763 }
5764
5765 return 0;
5766 }
5767
5768
5769
5770
5771
5772
5773
5774
5775
5776
5777
5778
5779
5780
5781
5782 static int
5783 lpfc_issue_els_edc_rsp(struct lpfc_vport *vport, struct lpfc_iocbq *cmdiocb,
5784 struct lpfc_nodelist *ndlp)
5785 {
5786 struct lpfc_hba *phba = vport->phba;
5787 struct lpfc_els_edc_rsp *edc_rsp;
5788 struct lpfc_iocbq *elsiocb;
5789 IOCB_t *icmd, *cmd;
5790 union lpfc_wqe128 *wqe;
5791 uint8_t *pcmd;
5792 int cmdsize, rc;
5793
5794 cmdsize = sizeof(struct lpfc_els_edc_rsp);
5795 elsiocb = lpfc_prep_els_iocb(vport, 0, cmdsize, cmdiocb->retry,
5796 ndlp, ndlp->nlp_DID, ELS_CMD_ACC);
5797 if (!elsiocb)
5798 return 1;
5799
5800 if (phba->sli_rev == LPFC_SLI_REV4) {
5801 wqe = &elsiocb->wqe;
5802 bf_set(wqe_ctxt_tag, &wqe->generic.wqe_com,
5803 get_job_ulpcontext(phba, cmdiocb));
5804 bf_set(wqe_rcvoxid, &wqe->xmit_els_rsp.wqe_com,
5805 get_job_rcvoxid(phba, cmdiocb));
5806 } else {
5807 icmd = &elsiocb->iocb;
5808 cmd = &cmdiocb->iocb;
5809 icmd->ulpContext = cmd->ulpContext;
5810 icmd->unsli3.rcvsli3.ox_id = cmd->unsli3.rcvsli3.ox_id;
5811 }
5812
5813 pcmd = elsiocb->cmd_dmabuf->virt;
5814 memset(pcmd, 0, cmdsize);
5815
5816 edc_rsp = (struct lpfc_els_edc_rsp *)pcmd;
5817 edc_rsp->edc_rsp.acc_hdr.la_cmd = ELS_LS_ACC;
5818 edc_rsp->edc_rsp.desc_list_len = cpu_to_be32(
5819 FC_TLV_DESC_LENGTH_FROM_SZ(struct lpfc_els_edc_rsp));
5820 edc_rsp->edc_rsp.lsri.desc_tag = cpu_to_be32(ELS_DTAG_LS_REQ_INFO);
5821 edc_rsp->edc_rsp.lsri.desc_len = cpu_to_be32(
5822 FC_TLV_DESC_LENGTH_FROM_SZ(struct fc_els_lsri_desc));
5823 edc_rsp->edc_rsp.lsri.rqst_w0.cmd = ELS_EDC;
5824 lpfc_format_edc_cgn_desc(phba, &edc_rsp->cgn_desc);
5825
5826 lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_RSP,
5827 "Issue EDC ACC: did:x%x flg:x%x refcnt %d",
5828 ndlp->nlp_DID, ndlp->nlp_flag,
5829 kref_read(&ndlp->kref));
5830 elsiocb->cmd_cmpl = lpfc_cmpl_els_rsp;
5831
5832 phba->fc_stat.elsXmitACC++;
5833 elsiocb->ndlp = lpfc_nlp_get(ndlp);
5834 if (!elsiocb->ndlp) {
5835 lpfc_els_free_iocb(phba, elsiocb);
5836 return 1;
5837 }
5838
5839 rc = lpfc_sli_issue_iocb(phba, LPFC_ELS_RING, elsiocb, 0);
5840 if (rc == IOCB_ERROR) {
5841 lpfc_els_free_iocb(phba, elsiocb);
5842 lpfc_nlp_put(ndlp);
5843 return 1;
5844 }
5845
5846
5847 lpfc_printf_vlog(vport, KERN_INFO, LOG_ELS,
5848 "0152 Xmit EDC ACC response Status: x%x, IoTag: x%x, "
5849 "XRI: x%x, DID: x%x, nlp_flag: x%x nlp_state: x%x "
5850 "RPI: x%x, fc_flag x%x\n",
5851 rc, elsiocb->iotag, elsiocb->sli4_xritag,
5852 ndlp->nlp_DID, ndlp->nlp_flag, ndlp->nlp_state,
5853 ndlp->nlp_rpi, vport->fc_flag);
5854
5855 return 0;
5856 }
5857
5858
5859
5860
5861
5862
5863
5864
5865
5866
5867
5868
5869
5870
5871
5872
5873
5874
5875
5876
5877 int
5878 lpfc_els_rsp_adisc_acc(struct lpfc_vport *vport, struct lpfc_iocbq *oldiocb,
5879 struct lpfc_nodelist *ndlp)
5880 {
5881 struct lpfc_hba *phba = vport->phba;
5882 ADISC *ap;
5883 IOCB_t *icmd, *oldcmd;
5884 union lpfc_wqe128 *wqe;
5885 struct lpfc_iocbq *elsiocb;
5886 uint8_t *pcmd;
5887 uint16_t cmdsize;
5888 int rc;
5889 u32 ulp_context;
5890
5891 cmdsize = sizeof(uint32_t) + sizeof(ADISC);
5892 elsiocb = lpfc_prep_els_iocb(vport, 0, cmdsize, oldiocb->retry, ndlp,
5893 ndlp->nlp_DID, ELS_CMD_ACC);
5894 if (!elsiocb)
5895 return 1;
5896
5897 if (phba->sli_rev == LPFC_SLI_REV4) {
5898 wqe = &elsiocb->wqe;
5899
5900 bf_set(wqe_ctxt_tag, &wqe->generic.wqe_com,
5901 get_job_ulpcontext(phba, oldiocb));
5902 ulp_context = get_job_ulpcontext(phba, elsiocb);
5903
5904 bf_set(wqe_rcvoxid, &wqe->xmit_els_rsp.wqe_com,
5905 get_job_rcvoxid(phba, oldiocb));
5906 } else {
5907 icmd = &elsiocb->iocb;
5908 oldcmd = &oldiocb->iocb;
5909 icmd->ulpContext = oldcmd->ulpContext;
5910 ulp_context = elsiocb->iocb.ulpContext;
5911 icmd->unsli3.rcvsli3.ox_id =
5912 oldcmd->unsli3.rcvsli3.ox_id;
5913 }
5914
5915
5916 lpfc_printf_vlog(vport, KERN_INFO, LOG_ELS,
5917 "0130 Xmit ADISC ACC response iotag x%x xri: "
5918 "x%x, did x%x, nlp_flag x%x, nlp_state x%x rpi x%x\n",
5919 elsiocb->iotag, ulp_context,
5920 ndlp->nlp_DID, ndlp->nlp_flag, ndlp->nlp_state,
5921 ndlp->nlp_rpi);
5922 pcmd = (uint8_t *)elsiocb->cmd_dmabuf->virt;
5923
5924 *((uint32_t *) (pcmd)) = ELS_CMD_ACC;
5925 pcmd += sizeof(uint32_t);
5926
5927 ap = (ADISC *) (pcmd);
5928 ap->hardAL_PA = phba->fc_pref_ALPA;
5929 memcpy(&ap->portName, &vport->fc_portname, sizeof(struct lpfc_name));
5930 memcpy(&ap->nodeName, &vport->fc_nodename, sizeof(struct lpfc_name));
5931 ap->DID = be32_to_cpu(vport->fc_myDID);
5932
5933 lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_RSP,
5934 "Issue ACC ADISC: did:x%x flg:x%x refcnt %d",
5935 ndlp->nlp_DID, ndlp->nlp_flag, kref_read(&ndlp->kref));
5936
5937 phba->fc_stat.elsXmitACC++;
5938 elsiocb->cmd_cmpl = lpfc_cmpl_els_rsp;
5939 elsiocb->ndlp = lpfc_nlp_get(ndlp);
5940 if (!elsiocb->ndlp) {
5941 lpfc_els_free_iocb(phba, elsiocb);
5942 return 1;
5943 }
5944
5945 rc = lpfc_sli_issue_iocb(phba, LPFC_ELS_RING, elsiocb, 0);
5946 if (rc == IOCB_ERROR) {
5947 lpfc_els_free_iocb(phba, elsiocb);
5948 lpfc_nlp_put(ndlp);
5949 return 1;
5950 }
5951
5952 return 0;
5953 }
5954
5955
5956
5957
5958
5959
5960
5961
5962
5963
5964
5965
5966
5967
5968
5969
5970
5971
5972
5973
5974 int
5975 lpfc_els_rsp_prli_acc(struct lpfc_vport *vport, struct lpfc_iocbq *oldiocb,
5976 struct lpfc_nodelist *ndlp)
5977 {
5978 struct lpfc_hba *phba = vport->phba;
5979 PRLI *npr;
5980 struct lpfc_nvme_prli *npr_nvme;
5981 lpfc_vpd_t *vpd;
5982 IOCB_t *icmd;
5983 IOCB_t *oldcmd;
5984 union lpfc_wqe128 *wqe;
5985 struct lpfc_iocbq *elsiocb;
5986 uint8_t *pcmd;
5987 uint16_t cmdsize;
5988 uint32_t prli_fc4_req, *req_payload;
5989 struct lpfc_dmabuf *req_buf;
5990 int rc;
5991 u32 elsrspcmd, ulp_context;
5992
5993
5994
5995
5996 req_buf = oldiocb->cmd_dmabuf;
5997 req_payload = (((uint32_t *)req_buf->virt) + 1);
5998
5999
6000 prli_fc4_req = be32_to_cpu(*req_payload);
6001 prli_fc4_req = (prli_fc4_req >> 24) & 0xff;
6002 lpfc_printf_vlog(vport, KERN_INFO, LOG_ELS,
6003 "6127 PRLI_ACC: Req Type x%x, Word1 x%08x\n",
6004 prli_fc4_req, *((uint32_t *)req_payload));
6005
6006 if (prli_fc4_req == PRLI_FCP_TYPE) {
6007 cmdsize = sizeof(uint32_t) + sizeof(PRLI);
6008 elsrspcmd = (ELS_CMD_ACC | (ELS_CMD_PRLI & ~ELS_RSP_MASK));
6009 } else if (prli_fc4_req & PRLI_NVME_TYPE) {
6010 cmdsize = sizeof(uint32_t) + sizeof(struct lpfc_nvme_prli);
6011 elsrspcmd = (ELS_CMD_ACC | (ELS_CMD_NVMEPRLI & ~ELS_RSP_MASK));
6012 } else {
6013 return 1;
6014 }
6015
6016 elsiocb = lpfc_prep_els_iocb(vport, 0, cmdsize, oldiocb->retry, ndlp,
6017 ndlp->nlp_DID, elsrspcmd);
6018 if (!elsiocb)
6019 return 1;
6020
6021 if (phba->sli_rev == LPFC_SLI_REV4) {
6022 wqe = &elsiocb->wqe;
6023 bf_set(wqe_ctxt_tag, &wqe->generic.wqe_com,
6024 get_job_ulpcontext(phba, oldiocb));
6025 ulp_context = get_job_ulpcontext(phba, elsiocb);
6026 bf_set(wqe_rcvoxid, &wqe->xmit_els_rsp.wqe_com,
6027 get_job_rcvoxid(phba, oldiocb));
6028 } else {
6029 icmd = &elsiocb->iocb;
6030 oldcmd = &oldiocb->iocb;
6031 icmd->ulpContext = oldcmd->ulpContext;
6032 ulp_context = elsiocb->iocb.ulpContext;
6033 icmd->unsli3.rcvsli3.ox_id =
6034 oldcmd->unsli3.rcvsli3.ox_id;
6035 }
6036
6037
6038 lpfc_printf_vlog(vport, KERN_INFO, LOG_ELS,
6039 "0131 Xmit PRLI ACC response tag x%x xri x%x, "
6040 "did x%x, nlp_flag x%x, nlp_state x%x, rpi x%x\n",
6041 elsiocb->iotag, ulp_context,
6042 ndlp->nlp_DID, ndlp->nlp_flag, ndlp->nlp_state,
6043 ndlp->nlp_rpi);
6044 pcmd = (uint8_t *)elsiocb->cmd_dmabuf->virt;
6045 memset(pcmd, 0, cmdsize);
6046
6047 *((uint32_t *)(pcmd)) = elsrspcmd;
6048 pcmd += sizeof(uint32_t);
6049
6050
6051 vpd = &phba->vpd;
6052
6053 if (prli_fc4_req == PRLI_FCP_TYPE) {
6054
6055
6056
6057
6058
6059 npr = (PRLI *) pcmd;
6060 if ((ndlp->nlp_type & NLP_FCP_TARGET) &&
6061 (vpd->rev.feaLevelHigh >= 0x02)) {
6062 npr->ConfmComplAllowed = 1;
6063 npr->Retry = 1;
6064 npr->TaskRetryIdReq = 1;
6065 }
6066 npr->acceptRspCode = PRLI_REQ_EXECUTED;
6067 npr->estabImagePair = 1;
6068 npr->readXferRdyDis = 1;
6069 npr->ConfmComplAllowed = 1;
6070 npr->prliType = PRLI_FCP_TYPE;
6071 npr->initiatorFunc = 1;
6072 } else if (prli_fc4_req & PRLI_NVME_TYPE) {
6073
6074 npr_nvme = (struct lpfc_nvme_prli *) pcmd;
6075 bf_set(prli_type_code, npr_nvme, PRLI_NVME_TYPE);
6076 bf_set(prli_estabImagePair, npr_nvme, 0);
6077 bf_set(prli_acc_rsp_code, npr_nvme, PRLI_REQ_EXECUTED);
6078 if (phba->nvmet_support) {
6079 bf_set(prli_tgt, npr_nvme, 1);
6080 bf_set(prli_disc, npr_nvme, 1);
6081 if (phba->cfg_nvme_enable_fb) {
6082 bf_set(prli_fba, npr_nvme, 1);
6083
6084
6085
6086
6087
6088 bf_set(prli_fb_sz, npr_nvme,
6089 phba->cfg_nvmet_fb_size);
6090 }
6091 } else {
6092 bf_set(prli_init, npr_nvme, 1);
6093 }
6094
6095 lpfc_printf_vlog(vport, KERN_INFO, LOG_NVME_DISC,
6096 "6015 NVME issue PRLI ACC word1 x%08x "
6097 "word4 x%08x word5 x%08x flag x%x, "
6098 "fcp_info x%x nlp_type x%x\n",
6099 npr_nvme->word1, npr_nvme->word4,
6100 npr_nvme->word5, ndlp->nlp_flag,
6101 ndlp->nlp_fcp_info, ndlp->nlp_type);
6102 npr_nvme->word1 = cpu_to_be32(npr_nvme->word1);
6103 npr_nvme->word4 = cpu_to_be32(npr_nvme->word4);
6104 npr_nvme->word5 = cpu_to_be32(npr_nvme->word5);
6105 } else
6106 lpfc_printf_vlog(vport, KERN_INFO, LOG_DISCOVERY,
6107 "6128 Unknown FC_TYPE x%x x%x ndlp x%06x\n",
6108 prli_fc4_req, ndlp->nlp_fc4_type,
6109 ndlp->nlp_DID);
6110
6111 lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_RSP,
6112 "Issue ACC PRLI: did:x%x flg:x%x",
6113 ndlp->nlp_DID, ndlp->nlp_flag, kref_read(&ndlp->kref));
6114
6115 phba->fc_stat.elsXmitACC++;
6116 elsiocb->cmd_cmpl = lpfc_cmpl_els_rsp;
6117 elsiocb->ndlp = lpfc_nlp_get(ndlp);
6118 if (!elsiocb->ndlp) {
6119 lpfc_els_free_iocb(phba, elsiocb);
6120 return 1;
6121 }
6122
6123 rc = lpfc_sli_issue_iocb(phba, LPFC_ELS_RING, elsiocb, 0);
6124 if (rc == IOCB_ERROR) {
6125 lpfc_els_free_iocb(phba, elsiocb);
6126 lpfc_nlp_put(ndlp);
6127 return 1;
6128 }
6129
6130 return 0;
6131 }
6132
6133
6134
6135
6136
6137
6138
6139
6140
6141
6142
6143
6144
6145
6146
6147
6148
6149
6150
6151
6152
6153 static int
6154 lpfc_els_rsp_rnid_acc(struct lpfc_vport *vport, uint8_t format,
6155 struct lpfc_iocbq *oldiocb, struct lpfc_nodelist *ndlp)
6156 {
6157 struct lpfc_hba *phba = vport->phba;
6158 RNID *rn;
6159 IOCB_t *icmd, *oldcmd;
6160 union lpfc_wqe128 *wqe;
6161 struct lpfc_iocbq *elsiocb;
6162 uint8_t *pcmd;
6163 uint16_t cmdsize;
6164 int rc;
6165 u32 ulp_context;
6166
6167 cmdsize = sizeof(uint32_t) + sizeof(uint32_t)
6168 + (2 * sizeof(struct lpfc_name));
6169 if (format)
6170 cmdsize += sizeof(RNID_TOP_DISC);
6171
6172 elsiocb = lpfc_prep_els_iocb(vport, 0, cmdsize, oldiocb->retry, ndlp,
6173 ndlp->nlp_DID, ELS_CMD_ACC);
6174 if (!elsiocb)
6175 return 1;
6176
6177 if (phba->sli_rev == LPFC_SLI_REV4) {
6178 wqe = &elsiocb->wqe;
6179 bf_set(wqe_ctxt_tag, &wqe->generic.wqe_com,
6180 get_job_ulpcontext(phba, oldiocb));
6181 ulp_context = get_job_ulpcontext(phba, elsiocb);
6182 bf_set(wqe_rcvoxid, &wqe->xmit_els_rsp.wqe_com,
6183 get_job_rcvoxid(phba, oldiocb));
6184 } else {
6185 icmd = &elsiocb->iocb;
6186 oldcmd = &oldiocb->iocb;
6187 icmd->ulpContext = oldcmd->ulpContext;
6188 ulp_context = elsiocb->iocb.ulpContext;
6189 icmd->unsli3.rcvsli3.ox_id =
6190 oldcmd->unsli3.rcvsli3.ox_id;
6191 }
6192
6193
6194 lpfc_printf_vlog(vport, KERN_INFO, LOG_ELS,
6195 "0132 Xmit RNID ACC response tag x%x xri x%x\n",
6196 elsiocb->iotag, ulp_context);
6197 pcmd = (uint8_t *)elsiocb->cmd_dmabuf->virt;
6198 *((uint32_t *) (pcmd)) = ELS_CMD_ACC;
6199 pcmd += sizeof(uint32_t);
6200
6201 memset(pcmd, 0, sizeof(RNID));
6202 rn = (RNID *) (pcmd);
6203 rn->Format = format;
6204 rn->CommonLen = (2 * sizeof(struct lpfc_name));
6205 memcpy(&rn->portName, &vport->fc_portname, sizeof(struct lpfc_name));
6206 memcpy(&rn->nodeName, &vport->fc_nodename, sizeof(struct lpfc_name));
6207 switch (format) {
6208 case 0:
6209 rn->SpecificLen = 0;
6210 break;
6211 case RNID_TOPOLOGY_DISC:
6212 rn->SpecificLen = sizeof(RNID_TOP_DISC);
6213 memcpy(&rn->un.topologyDisc.portName,
6214 &vport->fc_portname, sizeof(struct lpfc_name));
6215 rn->un.topologyDisc.unitType = RNID_HBA;
6216 rn->un.topologyDisc.physPort = 0;
6217 rn->un.topologyDisc.attachedNodes = 0;
6218 break;
6219 default:
6220 rn->CommonLen = 0;
6221 rn->SpecificLen = 0;
6222 break;
6223 }
6224
6225 lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_RSP,
6226 "Issue ACC RNID: did:x%x flg:x%x refcnt %d",
6227 ndlp->nlp_DID, ndlp->nlp_flag, kref_read(&ndlp->kref));
6228
6229 phba->fc_stat.elsXmitACC++;
6230 elsiocb->cmd_cmpl = lpfc_cmpl_els_rsp;
6231 elsiocb->ndlp = lpfc_nlp_get(ndlp);
6232 if (!elsiocb->ndlp) {
6233 lpfc_els_free_iocb(phba, elsiocb);
6234 return 1;
6235 }
6236
6237 rc = lpfc_sli_issue_iocb(phba, LPFC_ELS_RING, elsiocb, 0);
6238 if (rc == IOCB_ERROR) {
6239 lpfc_els_free_iocb(phba, elsiocb);
6240 lpfc_nlp_put(ndlp);
6241 return 1;
6242 }
6243
6244 return 0;
6245 }
6246
6247
6248
6249
6250
6251
6252
6253
6254
6255 static void
6256 lpfc_els_clear_rrq(struct lpfc_vport *vport,
6257 struct lpfc_iocbq *iocb, struct lpfc_nodelist *ndlp)
6258 {
6259 struct lpfc_hba *phba = vport->phba;
6260 uint8_t *pcmd;
6261 struct RRQ *rrq;
6262 uint16_t rxid;
6263 uint16_t xri;
6264 struct lpfc_node_rrq *prrq;
6265
6266
6267 pcmd = (uint8_t *)iocb->cmd_dmabuf->virt;
6268 pcmd += sizeof(uint32_t);
6269 rrq = (struct RRQ *)pcmd;
6270 rrq->rrq_exchg = be32_to_cpu(rrq->rrq_exchg);
6271 rxid = bf_get(rrq_rxid, rrq);
6272
6273 lpfc_printf_vlog(vport, KERN_INFO, LOG_ELS,
6274 "2883 Clear RRQ for SID:x%x OXID:x%x RXID:x%x"
6275 " x%x x%x\n",
6276 be32_to_cpu(bf_get(rrq_did, rrq)),
6277 bf_get(rrq_oxid, rrq),
6278 rxid,
6279 get_wqe_reqtag(iocb),
6280 get_job_ulpcontext(phba, iocb));
6281
6282 lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_RSP,
6283 "Clear RRQ: did:x%x flg:x%x exchg:x%.08x",
6284 ndlp->nlp_DID, ndlp->nlp_flag, rrq->rrq_exchg);
6285 if (vport->fc_myDID == be32_to_cpu(bf_get(rrq_did, rrq)))
6286 xri = bf_get(rrq_oxid, rrq);
6287 else
6288 xri = rxid;
6289 prrq = lpfc_get_active_rrq(vport, xri, ndlp->nlp_DID);
6290 if (prrq)
6291 lpfc_clr_rrq_active(phba, xri, prrq);
6292 return;
6293 }
6294
6295
6296
6297
6298
6299
6300
6301
6302
6303
6304
6305
6306 static int
6307 lpfc_els_rsp_echo_acc(struct lpfc_vport *vport, uint8_t *data,
6308 struct lpfc_iocbq *oldiocb, struct lpfc_nodelist *ndlp)
6309 {
6310 struct lpfc_hba *phba = vport->phba;
6311 IOCB_t *icmd, *oldcmd;
6312 union lpfc_wqe128 *wqe;
6313 struct lpfc_iocbq *elsiocb;
6314 uint8_t *pcmd;
6315 uint16_t cmdsize;
6316 int rc;
6317 u32 ulp_context;
6318
6319 if (phba->sli_rev == LPFC_SLI_REV4)
6320 cmdsize = oldiocb->wcqe_cmpl.total_data_placed;
6321 else
6322 cmdsize = oldiocb->iocb.unsli3.rcvsli3.acc_len;
6323
6324
6325
6326
6327 if (cmdsize > LPFC_BPL_SIZE)
6328 cmdsize = LPFC_BPL_SIZE;
6329 elsiocb = lpfc_prep_els_iocb(vport, 0, cmdsize, oldiocb->retry, ndlp,
6330 ndlp->nlp_DID, ELS_CMD_ACC);
6331 if (!elsiocb)
6332 return 1;
6333
6334 if (phba->sli_rev == LPFC_SLI_REV4) {
6335 wqe = &elsiocb->wqe;
6336 bf_set(wqe_ctxt_tag, &wqe->generic.wqe_com,
6337 get_job_ulpcontext(phba, oldiocb));
6338 ulp_context = get_job_ulpcontext(phba, elsiocb);
6339 bf_set(wqe_rcvoxid, &wqe->xmit_els_rsp.wqe_com,
6340 get_job_rcvoxid(phba, oldiocb));
6341 } else {
6342 icmd = &elsiocb->iocb;
6343 oldcmd = &oldiocb->iocb;
6344 icmd->ulpContext = oldcmd->ulpContext;
6345 ulp_context = elsiocb->iocb.ulpContext;
6346 icmd->unsli3.rcvsli3.ox_id =
6347 oldcmd->unsli3.rcvsli3.ox_id;
6348 }
6349
6350
6351 lpfc_printf_vlog(vport, KERN_INFO, LOG_ELS,
6352 "2876 Xmit ECHO ACC response tag x%x xri x%x\n",
6353 elsiocb->iotag, ulp_context);
6354 pcmd = (uint8_t *)elsiocb->cmd_dmabuf->virt;
6355 *((uint32_t *) (pcmd)) = ELS_CMD_ACC;
6356 pcmd += sizeof(uint32_t);
6357 memcpy(pcmd, data, cmdsize - sizeof(uint32_t));
6358
6359 lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_RSP,
6360 "Issue ACC ECHO: did:x%x flg:x%x refcnt %d",
6361 ndlp->nlp_DID, ndlp->nlp_flag, kref_read(&ndlp->kref));
6362
6363 phba->fc_stat.elsXmitACC++;
6364 elsiocb->cmd_cmpl = lpfc_cmpl_els_rsp;
6365 elsiocb->ndlp = lpfc_nlp_get(ndlp);
6366 if (!elsiocb->ndlp) {
6367 lpfc_els_free_iocb(phba, elsiocb);
6368 return 1;
6369 }
6370
6371 rc = lpfc_sli_issue_iocb(phba, LPFC_ELS_RING, elsiocb, 0);
6372 if (rc == IOCB_ERROR) {
6373 lpfc_els_free_iocb(phba, elsiocb);
6374 lpfc_nlp_put(ndlp);
6375 return 1;
6376 }
6377
6378 return 0;
6379 }
6380
6381
6382
6383
6384
6385
6386
6387
6388
6389
6390
6391
6392
6393
6394
6395
6396
6397
6398
6399
6400 int
6401 lpfc_els_disc_adisc(struct lpfc_vport *vport)
6402 {
6403 struct Scsi_Host *shost = lpfc_shost_from_vport(vport);
6404 struct lpfc_nodelist *ndlp, *next_ndlp;
6405 int sentadisc = 0;
6406
6407
6408 list_for_each_entry_safe(ndlp, next_ndlp, &vport->fc_nodes, nlp_listp) {
6409
6410 if (ndlp->nlp_state != NLP_STE_NPR_NODE ||
6411 !(ndlp->nlp_flag & NLP_NPR_ADISC))
6412 continue;
6413
6414 spin_lock_irq(&ndlp->lock);
6415 ndlp->nlp_flag &= ~NLP_NPR_ADISC;
6416 spin_unlock_irq(&ndlp->lock);
6417
6418 if (!(ndlp->nlp_flag & NLP_NPR_2B_DISC)) {
6419
6420
6421
6422
6423
6424
6425
6426 lpfc_nlp_unreg_node(vport, ndlp);
6427 lpfc_unreg_rpi(vport, ndlp);
6428 continue;
6429 }
6430
6431 ndlp->nlp_prev_state = ndlp->nlp_state;
6432 lpfc_nlp_set_state(vport, ndlp, NLP_STE_ADISC_ISSUE);
6433 lpfc_issue_els_adisc(vport, ndlp, 0);
6434 sentadisc++;
6435 vport->num_disc_nodes++;
6436 if (vport->num_disc_nodes >=
6437 vport->cfg_discovery_threads) {
6438 spin_lock_irq(shost->host_lock);
6439 vport->fc_flag |= FC_NLP_MORE;
6440 spin_unlock_irq(shost->host_lock);
6441 break;
6442 }
6443
6444 }
6445 if (sentadisc == 0) {
6446 spin_lock_irq(shost->host_lock);
6447 vport->fc_flag &= ~FC_NLP_MORE;
6448 spin_unlock_irq(shost->host_lock);
6449 }
6450 return sentadisc;
6451 }
6452
6453
6454
6455
6456
6457
6458
6459
6460
6461
6462
6463
6464
6465
6466
6467
6468
6469
6470
6471
6472 int
6473 lpfc_els_disc_plogi(struct lpfc_vport *vport)
6474 {
6475 struct Scsi_Host *shost = lpfc_shost_from_vport(vport);
6476 struct lpfc_nodelist *ndlp, *next_ndlp;
6477 int sentplogi = 0;
6478
6479
6480 list_for_each_entry_safe(ndlp, next_ndlp, &vport->fc_nodes, nlp_listp) {
6481 if (ndlp->nlp_state == NLP_STE_NPR_NODE &&
6482 (ndlp->nlp_flag & NLP_NPR_2B_DISC) != 0 &&
6483 (ndlp->nlp_flag & NLP_DELAY_TMO) == 0 &&
6484 (ndlp->nlp_flag & NLP_NPR_ADISC) == 0) {
6485 ndlp->nlp_prev_state = ndlp->nlp_state;
6486 lpfc_nlp_set_state(vport, ndlp, NLP_STE_PLOGI_ISSUE);
6487 lpfc_issue_els_plogi(vport, ndlp->nlp_DID, 0);
6488 sentplogi++;
6489 vport->num_disc_nodes++;
6490 if (vport->num_disc_nodes >=
6491 vport->cfg_discovery_threads) {
6492 spin_lock_irq(shost->host_lock);
6493 vport->fc_flag |= FC_NLP_MORE;
6494 spin_unlock_irq(shost->host_lock);
6495 break;
6496 }
6497 }
6498 }
6499
6500 lpfc_printf_vlog(vport, KERN_INFO, LOG_DISCOVERY,
6501 "6452 Discover PLOGI %d flag x%x\n",
6502 sentplogi, vport->fc_flag);
6503
6504 if (sentplogi) {
6505 lpfc_set_disctmo(vport);
6506 }
6507 else {
6508 spin_lock_irq(shost->host_lock);
6509 vport->fc_flag &= ~FC_NLP_MORE;
6510 spin_unlock_irq(shost->host_lock);
6511 }
6512 return sentplogi;
6513 }
6514
6515 static uint32_t
6516 lpfc_rdp_res_link_service(struct fc_rdp_link_service_desc *desc,
6517 uint32_t word0)
6518 {
6519
6520 desc->tag = cpu_to_be32(RDP_LINK_SERVICE_DESC_TAG);
6521 desc->payload.els_req = word0;
6522 desc->length = cpu_to_be32(sizeof(desc->payload));
6523
6524 return sizeof(struct fc_rdp_link_service_desc);
6525 }
6526
6527 static uint32_t
6528 lpfc_rdp_res_sfp_desc(struct fc_rdp_sfp_desc *desc,
6529 uint8_t *page_a0, uint8_t *page_a2)
6530 {
6531 uint16_t wavelength;
6532 uint16_t temperature;
6533 uint16_t rx_power;
6534 uint16_t tx_bias;
6535 uint16_t tx_power;
6536 uint16_t vcc;
6537 uint16_t flag = 0;
6538 struct sff_trasnceiver_codes_byte4 *trasn_code_byte4;
6539 struct sff_trasnceiver_codes_byte5 *trasn_code_byte5;
6540
6541 desc->tag = cpu_to_be32(RDP_SFP_DESC_TAG);
6542
6543 trasn_code_byte4 = (struct sff_trasnceiver_codes_byte4 *)
6544 &page_a0[SSF_TRANSCEIVER_CODE_B4];
6545 trasn_code_byte5 = (struct sff_trasnceiver_codes_byte5 *)
6546 &page_a0[SSF_TRANSCEIVER_CODE_B5];
6547
6548 if ((trasn_code_byte4->fc_sw_laser) ||
6549 (trasn_code_byte5->fc_sw_laser_sl) ||
6550 (trasn_code_byte5->fc_sw_laser_sn)) {
6551 flag |= (SFP_FLAG_PT_SWLASER << SFP_FLAG_PT_SHIFT);
6552 } else if (trasn_code_byte4->fc_lw_laser) {
6553 wavelength = (page_a0[SSF_WAVELENGTH_B1] << 8) |
6554 page_a0[SSF_WAVELENGTH_B0];
6555 if (wavelength == SFP_WAVELENGTH_LC1310)
6556 flag |= SFP_FLAG_PT_LWLASER_LC1310 << SFP_FLAG_PT_SHIFT;
6557 if (wavelength == SFP_WAVELENGTH_LL1550)
6558 flag |= SFP_FLAG_PT_LWLASER_LL1550 << SFP_FLAG_PT_SHIFT;
6559 }
6560
6561 flag |= ((page_a0[SSF_IDENTIFIER] == SFF_PG0_IDENT_SFP) ?
6562 SFP_FLAG_CT_SFP_PLUS : SFP_FLAG_CT_UNKNOWN)
6563 << SFP_FLAG_CT_SHIFT;
6564
6565
6566 flag |= ((page_a0[SSF_CONNECTOR] == SFF_PG0_CONNECTOR_LC) ?
6567 SFP_FLAG_IS_OPTICAL_PORT : 0)
6568 << SFP_FLAG_IS_OPTICAL_SHIFT;
6569
6570 temperature = (page_a2[SFF_TEMPERATURE_B1] << 8 |
6571 page_a2[SFF_TEMPERATURE_B0]);
6572 vcc = (page_a2[SFF_VCC_B1] << 8 |
6573 page_a2[SFF_VCC_B0]);
6574 tx_power = (page_a2[SFF_TXPOWER_B1] << 8 |
6575 page_a2[SFF_TXPOWER_B0]);
6576 tx_bias = (page_a2[SFF_TX_BIAS_CURRENT_B1] << 8 |
6577 page_a2[SFF_TX_BIAS_CURRENT_B0]);
6578 rx_power = (page_a2[SFF_RXPOWER_B1] << 8 |
6579 page_a2[SFF_RXPOWER_B0]);
6580 desc->sfp_info.temperature = cpu_to_be16(temperature);
6581 desc->sfp_info.rx_power = cpu_to_be16(rx_power);
6582 desc->sfp_info.tx_bias = cpu_to_be16(tx_bias);
6583 desc->sfp_info.tx_power = cpu_to_be16(tx_power);
6584 desc->sfp_info.vcc = cpu_to_be16(vcc);
6585
6586 desc->sfp_info.flags = cpu_to_be16(flag);
6587 desc->length = cpu_to_be32(sizeof(desc->sfp_info));
6588
6589 return sizeof(struct fc_rdp_sfp_desc);
6590 }
6591
6592 static uint32_t
6593 lpfc_rdp_res_link_error(struct fc_rdp_link_error_status_desc *desc,
6594 READ_LNK_VAR *stat)
6595 {
6596 uint32_t type;
6597
6598 desc->tag = cpu_to_be32(RDP_LINK_ERROR_STATUS_DESC_TAG);
6599
6600 type = VN_PT_PHY_PF_PORT << VN_PT_PHY_SHIFT;
6601
6602 desc->info.port_type = cpu_to_be32(type);
6603
6604 desc->info.link_status.link_failure_cnt =
6605 cpu_to_be32(stat->linkFailureCnt);
6606 desc->info.link_status.loss_of_synch_cnt =
6607 cpu_to_be32(stat->lossSyncCnt);
6608 desc->info.link_status.loss_of_signal_cnt =
6609 cpu_to_be32(stat->lossSignalCnt);
6610 desc->info.link_status.primitive_seq_proto_err =
6611 cpu_to_be32(stat->primSeqErrCnt);
6612 desc->info.link_status.invalid_trans_word =
6613 cpu_to_be32(stat->invalidXmitWord);
6614 desc->info.link_status.invalid_crc_cnt = cpu_to_be32(stat->crcCnt);
6615
6616 desc->length = cpu_to_be32(sizeof(desc->info));
6617
6618 return sizeof(struct fc_rdp_link_error_status_desc);
6619 }
6620
6621 static uint32_t
6622 lpfc_rdp_res_bbc_desc(struct fc_rdp_bbc_desc *desc, READ_LNK_VAR *stat,
6623 struct lpfc_vport *vport)
6624 {
6625 uint32_t bbCredit;
6626
6627 desc->tag = cpu_to_be32(RDP_BBC_DESC_TAG);
6628
6629 bbCredit = vport->fc_sparam.cmn.bbCreditLsb |
6630 (vport->fc_sparam.cmn.bbCreditMsb << 8);
6631 desc->bbc_info.port_bbc = cpu_to_be32(bbCredit);
6632 if (vport->phba->fc_topology != LPFC_TOPOLOGY_LOOP) {
6633 bbCredit = vport->phba->fc_fabparam.cmn.bbCreditLsb |
6634 (vport->phba->fc_fabparam.cmn.bbCreditMsb << 8);
6635 desc->bbc_info.attached_port_bbc = cpu_to_be32(bbCredit);
6636 } else {
6637 desc->bbc_info.attached_port_bbc = 0;
6638 }
6639
6640 desc->bbc_info.rtt = 0;
6641 desc->length = cpu_to_be32(sizeof(desc->bbc_info));
6642
6643 return sizeof(struct fc_rdp_bbc_desc);
6644 }
6645
6646 static uint32_t
6647 lpfc_rdp_res_oed_temp_desc(struct lpfc_hba *phba,
6648 struct fc_rdp_oed_sfp_desc *desc, uint8_t *page_a2)
6649 {
6650 uint32_t flags = 0;
6651
6652 desc->tag = cpu_to_be32(RDP_OED_DESC_TAG);
6653
6654 desc->oed_info.hi_alarm = page_a2[SSF_TEMP_HIGH_ALARM];
6655 desc->oed_info.lo_alarm = page_a2[SSF_TEMP_LOW_ALARM];
6656 desc->oed_info.hi_warning = page_a2[SSF_TEMP_HIGH_WARNING];
6657 desc->oed_info.lo_warning = page_a2[SSF_TEMP_LOW_WARNING];
6658
6659 if (phba->sfp_alarm & LPFC_TRANSGRESSION_HIGH_TEMPERATURE)
6660 flags |= RDP_OET_HIGH_ALARM;
6661 if (phba->sfp_alarm & LPFC_TRANSGRESSION_LOW_TEMPERATURE)
6662 flags |= RDP_OET_LOW_ALARM;
6663 if (phba->sfp_warning & LPFC_TRANSGRESSION_HIGH_TEMPERATURE)
6664 flags |= RDP_OET_HIGH_WARNING;
6665 if (phba->sfp_warning & LPFC_TRANSGRESSION_LOW_TEMPERATURE)
6666 flags |= RDP_OET_LOW_WARNING;
6667
6668 flags |= ((0xf & RDP_OED_TEMPERATURE) << RDP_OED_TYPE_SHIFT);
6669 desc->oed_info.function_flags = cpu_to_be32(flags);
6670 desc->length = cpu_to_be32(sizeof(desc->oed_info));
6671 return sizeof(struct fc_rdp_oed_sfp_desc);
6672 }
6673
6674 static uint32_t
6675 lpfc_rdp_res_oed_voltage_desc(struct lpfc_hba *phba,
6676 struct fc_rdp_oed_sfp_desc *desc,
6677 uint8_t *page_a2)
6678 {
6679 uint32_t flags = 0;
6680
6681 desc->tag = cpu_to_be32(RDP_OED_DESC_TAG);
6682
6683 desc->oed_info.hi_alarm = page_a2[SSF_VOLTAGE_HIGH_ALARM];
6684 desc->oed_info.lo_alarm = page_a2[SSF_VOLTAGE_LOW_ALARM];
6685 desc->oed_info.hi_warning = page_a2[SSF_VOLTAGE_HIGH_WARNING];
6686 desc->oed_info.lo_warning = page_a2[SSF_VOLTAGE_LOW_WARNING];
6687
6688 if (phba->sfp_alarm & LPFC_TRANSGRESSION_HIGH_VOLTAGE)
6689 flags |= RDP_OET_HIGH_ALARM;
6690 if (phba->sfp_alarm & LPFC_TRANSGRESSION_LOW_VOLTAGE)
6691 flags |= RDP_OET_LOW_ALARM;
6692 if (phba->sfp_warning & LPFC_TRANSGRESSION_HIGH_VOLTAGE)
6693 flags |= RDP_OET_HIGH_WARNING;
6694 if (phba->sfp_warning & LPFC_TRANSGRESSION_LOW_VOLTAGE)
6695 flags |= RDP_OET_LOW_WARNING;
6696
6697 flags |= ((0xf & RDP_OED_VOLTAGE) << RDP_OED_TYPE_SHIFT);
6698 desc->oed_info.function_flags = cpu_to_be32(flags);
6699 desc->length = cpu_to_be32(sizeof(desc->oed_info));
6700 return sizeof(struct fc_rdp_oed_sfp_desc);
6701 }
6702
6703 static uint32_t
6704 lpfc_rdp_res_oed_txbias_desc(struct lpfc_hba *phba,
6705 struct fc_rdp_oed_sfp_desc *desc,
6706 uint8_t *page_a2)
6707 {
6708 uint32_t flags = 0;
6709
6710 desc->tag = cpu_to_be32(RDP_OED_DESC_TAG);
6711
6712 desc->oed_info.hi_alarm = page_a2[SSF_BIAS_HIGH_ALARM];
6713 desc->oed_info.lo_alarm = page_a2[SSF_BIAS_LOW_ALARM];
6714 desc->oed_info.hi_warning = page_a2[SSF_BIAS_HIGH_WARNING];
6715 desc->oed_info.lo_warning = page_a2[SSF_BIAS_LOW_WARNING];
6716
6717 if (phba->sfp_alarm & LPFC_TRANSGRESSION_HIGH_TXBIAS)
6718 flags |= RDP_OET_HIGH_ALARM;
6719 if (phba->sfp_alarm & LPFC_TRANSGRESSION_LOW_TXBIAS)
6720 flags |= RDP_OET_LOW_ALARM;
6721 if (phba->sfp_warning & LPFC_TRANSGRESSION_HIGH_TXBIAS)
6722 flags |= RDP_OET_HIGH_WARNING;
6723 if (phba->sfp_warning & LPFC_TRANSGRESSION_LOW_TXBIAS)
6724 flags |= RDP_OET_LOW_WARNING;
6725
6726 flags |= ((0xf & RDP_OED_TXBIAS) << RDP_OED_TYPE_SHIFT);
6727 desc->oed_info.function_flags = cpu_to_be32(flags);
6728 desc->length = cpu_to_be32(sizeof(desc->oed_info));
6729 return sizeof(struct fc_rdp_oed_sfp_desc);
6730 }
6731
6732 static uint32_t
6733 lpfc_rdp_res_oed_txpower_desc(struct lpfc_hba *phba,
6734 struct fc_rdp_oed_sfp_desc *desc,
6735 uint8_t *page_a2)
6736 {
6737 uint32_t flags = 0;
6738
6739 desc->tag = cpu_to_be32(RDP_OED_DESC_TAG);
6740
6741 desc->oed_info.hi_alarm = page_a2[SSF_TXPOWER_HIGH_ALARM];
6742 desc->oed_info.lo_alarm = page_a2[SSF_TXPOWER_LOW_ALARM];
6743 desc->oed_info.hi_warning = page_a2[SSF_TXPOWER_HIGH_WARNING];
6744 desc->oed_info.lo_warning = page_a2[SSF_TXPOWER_LOW_WARNING];
6745
6746 if (phba->sfp_alarm & LPFC_TRANSGRESSION_HIGH_TXPOWER)
6747 flags |= RDP_OET_HIGH_ALARM;
6748 if (phba->sfp_alarm & LPFC_TRANSGRESSION_LOW_TXPOWER)
6749 flags |= RDP_OET_LOW_ALARM;
6750 if (phba->sfp_warning & LPFC_TRANSGRESSION_HIGH_TXPOWER)
6751 flags |= RDP_OET_HIGH_WARNING;
6752 if (phba->sfp_warning & LPFC_TRANSGRESSION_LOW_TXPOWER)
6753 flags |= RDP_OET_LOW_WARNING;
6754
6755 flags |= ((0xf & RDP_OED_TXPOWER) << RDP_OED_TYPE_SHIFT);
6756 desc->oed_info.function_flags = cpu_to_be32(flags);
6757 desc->length = cpu_to_be32(sizeof(desc->oed_info));
6758 return sizeof(struct fc_rdp_oed_sfp_desc);
6759 }
6760
6761
6762 static uint32_t
6763 lpfc_rdp_res_oed_rxpower_desc(struct lpfc_hba *phba,
6764 struct fc_rdp_oed_sfp_desc *desc,
6765 uint8_t *page_a2)
6766 {
6767 uint32_t flags = 0;
6768
6769 desc->tag = cpu_to_be32(RDP_OED_DESC_TAG);
6770
6771 desc->oed_info.hi_alarm = page_a2[SSF_RXPOWER_HIGH_ALARM];
6772 desc->oed_info.lo_alarm = page_a2[SSF_RXPOWER_LOW_ALARM];
6773 desc->oed_info.hi_warning = page_a2[SSF_RXPOWER_HIGH_WARNING];
6774 desc->oed_info.lo_warning = page_a2[SSF_RXPOWER_LOW_WARNING];
6775
6776 if (phba->sfp_alarm & LPFC_TRANSGRESSION_HIGH_RXPOWER)
6777 flags |= RDP_OET_HIGH_ALARM;
6778 if (phba->sfp_alarm & LPFC_TRANSGRESSION_LOW_RXPOWER)
6779 flags |= RDP_OET_LOW_ALARM;
6780 if (phba->sfp_warning & LPFC_TRANSGRESSION_HIGH_RXPOWER)
6781 flags |= RDP_OET_HIGH_WARNING;
6782 if (phba->sfp_warning & LPFC_TRANSGRESSION_LOW_RXPOWER)
6783 flags |= RDP_OET_LOW_WARNING;
6784
6785 flags |= ((0xf & RDP_OED_RXPOWER) << RDP_OED_TYPE_SHIFT);
6786 desc->oed_info.function_flags = cpu_to_be32(flags);
6787 desc->length = cpu_to_be32(sizeof(desc->oed_info));
6788 return sizeof(struct fc_rdp_oed_sfp_desc);
6789 }
6790
6791 static uint32_t
6792 lpfc_rdp_res_opd_desc(struct fc_rdp_opd_sfp_desc *desc,
6793 uint8_t *page_a0, struct lpfc_vport *vport)
6794 {
6795 desc->tag = cpu_to_be32(RDP_OPD_DESC_TAG);
6796 memcpy(desc->opd_info.vendor_name, &page_a0[SSF_VENDOR_NAME], 16);
6797 memcpy(desc->opd_info.model_number, &page_a0[SSF_VENDOR_PN], 16);
6798 memcpy(desc->opd_info.serial_number, &page_a0[SSF_VENDOR_SN], 16);
6799 memcpy(desc->opd_info.revision, &page_a0[SSF_VENDOR_REV], 4);
6800 memcpy(desc->opd_info.date, &page_a0[SSF_DATE_CODE], 8);
6801 desc->length = cpu_to_be32(sizeof(desc->opd_info));
6802 return sizeof(struct fc_rdp_opd_sfp_desc);
6803 }
6804
6805 static uint32_t
6806 lpfc_rdp_res_fec_desc(struct fc_fec_rdp_desc *desc, READ_LNK_VAR *stat)
6807 {
6808 if (bf_get(lpfc_read_link_stat_gec2, stat) == 0)
6809 return 0;
6810 desc->tag = cpu_to_be32(RDP_FEC_DESC_TAG);
6811
6812 desc->info.CorrectedBlocks =
6813 cpu_to_be32(stat->fecCorrBlkCount);
6814 desc->info.UncorrectableBlocks =
6815 cpu_to_be32(stat->fecUncorrBlkCount);
6816
6817 desc->length = cpu_to_be32(sizeof(desc->info));
6818
6819 return sizeof(struct fc_fec_rdp_desc);
6820 }
6821
6822 static uint32_t
6823 lpfc_rdp_res_speed(struct fc_rdp_port_speed_desc *desc, struct lpfc_hba *phba)
6824 {
6825 uint16_t rdp_cap = 0;
6826 uint16_t rdp_speed;
6827
6828 desc->tag = cpu_to_be32(RDP_PORT_SPEED_DESC_TAG);
6829
6830 switch (phba->fc_linkspeed) {
6831 case LPFC_LINK_SPEED_1GHZ:
6832 rdp_speed = RDP_PS_1GB;
6833 break;
6834 case LPFC_LINK_SPEED_2GHZ:
6835 rdp_speed = RDP_PS_2GB;
6836 break;
6837 case LPFC_LINK_SPEED_4GHZ:
6838 rdp_speed = RDP_PS_4GB;
6839 break;
6840 case LPFC_LINK_SPEED_8GHZ:
6841 rdp_speed = RDP_PS_8GB;
6842 break;
6843 case LPFC_LINK_SPEED_10GHZ:
6844 rdp_speed = RDP_PS_10GB;
6845 break;
6846 case LPFC_LINK_SPEED_16GHZ:
6847 rdp_speed = RDP_PS_16GB;
6848 break;
6849 case LPFC_LINK_SPEED_32GHZ:
6850 rdp_speed = RDP_PS_32GB;
6851 break;
6852 case LPFC_LINK_SPEED_64GHZ:
6853 rdp_speed = RDP_PS_64GB;
6854 break;
6855 case LPFC_LINK_SPEED_128GHZ:
6856 rdp_speed = RDP_PS_128GB;
6857 break;
6858 case LPFC_LINK_SPEED_256GHZ:
6859 rdp_speed = RDP_PS_256GB;
6860 break;
6861 default:
6862 rdp_speed = RDP_PS_UNKNOWN;
6863 break;
6864 }
6865
6866 desc->info.port_speed.speed = cpu_to_be16(rdp_speed);
6867
6868 if (phba->lmt & LMT_256Gb)
6869 rdp_cap |= RDP_PS_256GB;
6870 if (phba->lmt & LMT_128Gb)
6871 rdp_cap |= RDP_PS_128GB;
6872 if (phba->lmt & LMT_64Gb)
6873 rdp_cap |= RDP_PS_64GB;
6874 if (phba->lmt & LMT_32Gb)
6875 rdp_cap |= RDP_PS_32GB;
6876 if (phba->lmt & LMT_16Gb)
6877 rdp_cap |= RDP_PS_16GB;
6878 if (phba->lmt & LMT_10Gb)
6879 rdp_cap |= RDP_PS_10GB;
6880 if (phba->lmt & LMT_8Gb)
6881 rdp_cap |= RDP_PS_8GB;
6882 if (phba->lmt & LMT_4Gb)
6883 rdp_cap |= RDP_PS_4GB;
6884 if (phba->lmt & LMT_2Gb)
6885 rdp_cap |= RDP_PS_2GB;
6886 if (phba->lmt & LMT_1Gb)
6887 rdp_cap |= RDP_PS_1GB;
6888
6889 if (rdp_cap == 0)
6890 rdp_cap = RDP_CAP_UNKNOWN;
6891 if (phba->cfg_link_speed != LPFC_USER_LINK_SPEED_AUTO)
6892 rdp_cap |= RDP_CAP_USER_CONFIGURED;
6893
6894 desc->info.port_speed.capabilities = cpu_to_be16(rdp_cap);
6895 desc->length = cpu_to_be32(sizeof(desc->info));
6896 return sizeof(struct fc_rdp_port_speed_desc);
6897 }
6898
6899 static uint32_t
6900 lpfc_rdp_res_diag_port_names(struct fc_rdp_port_name_desc *desc,
6901 struct lpfc_vport *vport)
6902 {
6903
6904 desc->tag = cpu_to_be32(RDP_PORT_NAMES_DESC_TAG);
6905
6906 memcpy(desc->port_names.wwnn, &vport->fc_nodename,
6907 sizeof(desc->port_names.wwnn));
6908
6909 memcpy(desc->port_names.wwpn, &vport->fc_portname,
6910 sizeof(desc->port_names.wwpn));
6911
6912 desc->length = cpu_to_be32(sizeof(desc->port_names));
6913 return sizeof(struct fc_rdp_port_name_desc);
6914 }
6915
6916 static uint32_t
6917 lpfc_rdp_res_attach_port_names(struct fc_rdp_port_name_desc *desc,
6918 struct lpfc_vport *vport, struct lpfc_nodelist *ndlp)
6919 {
6920
6921 desc->tag = cpu_to_be32(RDP_PORT_NAMES_DESC_TAG);
6922 if (vport->fc_flag & FC_FABRIC) {
6923 memcpy(desc->port_names.wwnn, &vport->fabric_nodename,
6924 sizeof(desc->port_names.wwnn));
6925
6926 memcpy(desc->port_names.wwpn, &vport->fabric_portname,
6927 sizeof(desc->port_names.wwpn));
6928 } else {
6929 memcpy(desc->port_names.wwnn, &ndlp->nlp_nodename,
6930 sizeof(desc->port_names.wwnn));
6931
6932 memcpy(desc->port_names.wwpn, &ndlp->nlp_portname,
6933 sizeof(desc->port_names.wwpn));
6934 }
6935
6936 desc->length = cpu_to_be32(sizeof(desc->port_names));
6937 return sizeof(struct fc_rdp_port_name_desc);
6938 }
6939
6940 static void
6941 lpfc_els_rdp_cmpl(struct lpfc_hba *phba, struct lpfc_rdp_context *rdp_context,
6942 int status)
6943 {
6944 struct lpfc_nodelist *ndlp = rdp_context->ndlp;
6945 struct lpfc_vport *vport = ndlp->vport;
6946 struct lpfc_iocbq *elsiocb;
6947 struct ulp_bde64 *bpl;
6948 IOCB_t *icmd;
6949 union lpfc_wqe128 *wqe;
6950 uint8_t *pcmd;
6951 struct ls_rjt *stat;
6952 struct fc_rdp_res_frame *rdp_res;
6953 uint32_t cmdsize, len;
6954 uint16_t *flag_ptr;
6955 int rc;
6956 u32 ulp_context;
6957
6958 if (status != SUCCESS)
6959 goto error;
6960
6961
6962 cmdsize = sizeof(struct fc_rdp_res_frame);
6963
6964 elsiocb = lpfc_prep_els_iocb(vport, 0, cmdsize,
6965 lpfc_max_els_tries, rdp_context->ndlp,
6966 rdp_context->ndlp->nlp_DID, ELS_CMD_ACC);
6967 if (!elsiocb)
6968 goto free_rdp_context;
6969
6970 ulp_context = get_job_ulpcontext(phba, elsiocb);
6971 if (phba->sli_rev == LPFC_SLI_REV4) {
6972 wqe = &elsiocb->wqe;
6973
6974 bf_set(wqe_rcvoxid, &wqe->xmit_els_rsp.wqe_com,
6975 rdp_context->ox_id);
6976 bf_set(wqe_ctxt_tag, &wqe->xmit_els_rsp.wqe_com,
6977 rdp_context->rx_id);
6978 } else {
6979 icmd = &elsiocb->iocb;
6980 icmd->ulpContext = rdp_context->rx_id;
6981 icmd->unsli3.rcvsli3.ox_id = rdp_context->ox_id;
6982 }
6983
6984 lpfc_printf_vlog(vport, KERN_INFO, LOG_ELS,
6985 "2171 Xmit RDP response tag x%x xri x%x, "
6986 "did x%x, nlp_flag x%x, nlp_state x%x, rpi x%x",
6987 elsiocb->iotag, ulp_context,
6988 ndlp->nlp_DID, ndlp->nlp_flag, ndlp->nlp_state,
6989 ndlp->nlp_rpi);
6990 rdp_res = (struct fc_rdp_res_frame *)elsiocb->cmd_dmabuf->virt;
6991 pcmd = (uint8_t *)elsiocb->cmd_dmabuf->virt;
6992 memset(pcmd, 0, sizeof(struct fc_rdp_res_frame));
6993 *((uint32_t *) (pcmd)) = ELS_CMD_ACC;
6994
6995
6996 flag_ptr = (uint16_t *)(rdp_context->page_a2 + SSF_ALARM_FLAGS);
6997 phba->sfp_alarm |= *flag_ptr;
6998 flag_ptr = (uint16_t *)(rdp_context->page_a2 + SSF_WARNING_FLAGS);
6999 phba->sfp_warning |= *flag_ptr;
7000
7001
7002 len = 8;
7003 len += lpfc_rdp_res_link_service((struct fc_rdp_link_service_desc *)
7004 (len + pcmd), ELS_CMD_RDP);
7005
7006 len += lpfc_rdp_res_sfp_desc((struct fc_rdp_sfp_desc *)(len + pcmd),
7007 rdp_context->page_a0, rdp_context->page_a2);
7008 len += lpfc_rdp_res_speed((struct fc_rdp_port_speed_desc *)(len + pcmd),
7009 phba);
7010 len += lpfc_rdp_res_link_error((struct fc_rdp_link_error_status_desc *)
7011 (len + pcmd), &rdp_context->link_stat);
7012 len += lpfc_rdp_res_diag_port_names((struct fc_rdp_port_name_desc *)
7013 (len + pcmd), vport);
7014 len += lpfc_rdp_res_attach_port_names((struct fc_rdp_port_name_desc *)
7015 (len + pcmd), vport, ndlp);
7016 len += lpfc_rdp_res_fec_desc((struct fc_fec_rdp_desc *)(len + pcmd),
7017 &rdp_context->link_stat);
7018 len += lpfc_rdp_res_bbc_desc((struct fc_rdp_bbc_desc *)(len + pcmd),
7019 &rdp_context->link_stat, vport);
7020 len += lpfc_rdp_res_oed_temp_desc(phba,
7021 (struct fc_rdp_oed_sfp_desc *)(len + pcmd),
7022 rdp_context->page_a2);
7023 len += lpfc_rdp_res_oed_voltage_desc(phba,
7024 (struct fc_rdp_oed_sfp_desc *)(len + pcmd),
7025 rdp_context->page_a2);
7026 len += lpfc_rdp_res_oed_txbias_desc(phba,
7027 (struct fc_rdp_oed_sfp_desc *)(len + pcmd),
7028 rdp_context->page_a2);
7029 len += lpfc_rdp_res_oed_txpower_desc(phba,
7030 (struct fc_rdp_oed_sfp_desc *)(len + pcmd),
7031 rdp_context->page_a2);
7032 len += lpfc_rdp_res_oed_rxpower_desc(phba,
7033 (struct fc_rdp_oed_sfp_desc *)(len + pcmd),
7034 rdp_context->page_a2);
7035 len += lpfc_rdp_res_opd_desc((struct fc_rdp_opd_sfp_desc *)(len + pcmd),
7036 rdp_context->page_a0, vport);
7037
7038 rdp_res->length = cpu_to_be32(len - 8);
7039 elsiocb->cmd_cmpl = lpfc_cmpl_els_rsp;
7040
7041
7042 bpl = (struct ulp_bde64 *)elsiocb->bpl_dmabuf->virt;
7043 bpl->tus.f.bdeSize = len;
7044 bpl->tus.f.bdeFlags = 0;
7045 bpl->tus.w = le32_to_cpu(bpl->tus.w);
7046
7047 phba->fc_stat.elsXmitACC++;
7048 elsiocb->ndlp = lpfc_nlp_get(ndlp);
7049 if (!elsiocb->ndlp) {
7050 lpfc_els_free_iocb(phba, elsiocb);
7051 goto free_rdp_context;
7052 }
7053
7054 rc = lpfc_sli_issue_iocb(phba, LPFC_ELS_RING, elsiocb, 0);
7055 if (rc == IOCB_ERROR) {
7056 lpfc_els_free_iocb(phba, elsiocb);
7057 lpfc_nlp_put(ndlp);
7058 }
7059
7060 goto free_rdp_context;
7061
7062 error:
7063 cmdsize = 2 * sizeof(uint32_t);
7064 elsiocb = lpfc_prep_els_iocb(vport, 0, cmdsize, lpfc_max_els_tries,
7065 ndlp, ndlp->nlp_DID, ELS_CMD_LS_RJT);
7066 if (!elsiocb)
7067 goto free_rdp_context;
7068
7069 if (phba->sli_rev == LPFC_SLI_REV4) {
7070 wqe = &elsiocb->wqe;
7071
7072 bf_set(wqe_rcvoxid, &wqe->xmit_els_rsp.wqe_com,
7073 rdp_context->ox_id);
7074 bf_set(wqe_ctxt_tag,
7075 &wqe->xmit_els_rsp.wqe_com,
7076 rdp_context->rx_id);
7077 } else {
7078 icmd = &elsiocb->iocb;
7079 icmd->ulpContext = rdp_context->rx_id;
7080 icmd->unsli3.rcvsli3.ox_id = rdp_context->ox_id;
7081 }
7082
7083 pcmd = (uint8_t *)elsiocb->cmd_dmabuf->virt;
7084
7085 *((uint32_t *) (pcmd)) = ELS_CMD_LS_RJT;
7086 stat = (struct ls_rjt *)(pcmd + sizeof(uint32_t));
7087 stat->un.b.lsRjtRsnCode = LSRJT_UNABLE_TPC;
7088
7089 phba->fc_stat.elsXmitLSRJT++;
7090 elsiocb->cmd_cmpl = lpfc_cmpl_els_rsp;
7091 elsiocb->ndlp = lpfc_nlp_get(ndlp);
7092 if (!elsiocb->ndlp) {
7093 lpfc_els_free_iocb(phba, elsiocb);
7094 goto free_rdp_context;
7095 }
7096
7097 rc = lpfc_sli_issue_iocb(phba, LPFC_ELS_RING, elsiocb, 0);
7098 if (rc == IOCB_ERROR) {
7099 lpfc_els_free_iocb(phba, elsiocb);
7100 lpfc_nlp_put(ndlp);
7101 }
7102
7103 free_rdp_context:
7104
7105
7106
7107 lpfc_nlp_put(ndlp);
7108 kfree(rdp_context);
7109 }
7110
7111 static int
7112 lpfc_get_rdp_info(struct lpfc_hba *phba, struct lpfc_rdp_context *rdp_context)
7113 {
7114 LPFC_MBOXQ_t *mbox = NULL;
7115 int rc;
7116
7117 mbox = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL);
7118 if (!mbox) {
7119 lpfc_printf_log(phba, KERN_WARNING, LOG_MBOX | LOG_ELS,
7120 "7105 failed to allocate mailbox memory");
7121 return 1;
7122 }
7123
7124 if (lpfc_sli4_dump_page_a0(phba, mbox))
7125 goto rdp_fail;
7126 mbox->vport = rdp_context->ndlp->vport;
7127 mbox->mbox_cmpl = lpfc_mbx_cmpl_rdp_page_a0;
7128 mbox->ctx_ndlp = (struct lpfc_rdp_context *)rdp_context;
7129 rc = lpfc_sli_issue_mbox(phba, mbox, MBX_NOWAIT);
7130 if (rc == MBX_NOT_FINISHED) {
7131 lpfc_mbox_rsrc_cleanup(phba, mbox, MBOX_THD_UNLOCKED);
7132 return 1;
7133 }
7134
7135 return 0;
7136
7137 rdp_fail:
7138 mempool_free(mbox, phba->mbox_mem_pool);
7139 return 1;
7140 }
7141
7142
7143
7144
7145
7146
7147
7148
7149
7150
7151
7152
7153
7154
7155
7156
7157
7158
7159 static int
7160 lpfc_els_rcv_rdp(struct lpfc_vport *vport, struct lpfc_iocbq *cmdiocb,
7161 struct lpfc_nodelist *ndlp)
7162 {
7163 struct lpfc_hba *phba = vport->phba;
7164 struct lpfc_dmabuf *pcmd;
7165 uint8_t rjt_err, rjt_expl = LSEXP_NOTHING_MORE;
7166 struct fc_rdp_req_frame *rdp_req;
7167 struct lpfc_rdp_context *rdp_context;
7168 union lpfc_wqe128 *cmd = NULL;
7169 struct ls_rjt stat;
7170
7171 if (phba->sli_rev < LPFC_SLI_REV4 ||
7172 bf_get(lpfc_sli_intf_if_type, &phba->sli4_hba.sli_intf) <
7173 LPFC_SLI_INTF_IF_TYPE_2) {
7174 rjt_err = LSRJT_UNABLE_TPC;
7175 rjt_expl = LSEXP_REQ_UNSUPPORTED;
7176 goto error;
7177 }
7178
7179 if (phba->sli_rev < LPFC_SLI_REV4 || (phba->hba_flag & HBA_FCOE_MODE)) {
7180 rjt_err = LSRJT_UNABLE_TPC;
7181 rjt_expl = LSEXP_REQ_UNSUPPORTED;
7182 goto error;
7183 }
7184
7185 pcmd = cmdiocb->cmd_dmabuf;
7186 rdp_req = (struct fc_rdp_req_frame *) pcmd->virt;
7187
7188 lpfc_printf_vlog(vport, KERN_INFO, LOG_ELS,
7189 "2422 ELS RDP Request "
7190 "dec len %d tag x%x port_id %d len %d\n",
7191 be32_to_cpu(rdp_req->rdp_des_length),
7192 be32_to_cpu(rdp_req->nport_id_desc.tag),
7193 be32_to_cpu(rdp_req->nport_id_desc.nport_id),
7194 be32_to_cpu(rdp_req->nport_id_desc.length));
7195
7196 if (sizeof(struct fc_rdp_nport_desc) !=
7197 be32_to_cpu(rdp_req->rdp_des_length))
7198 goto rjt_logerr;
7199 if (RDP_N_PORT_DESC_TAG != be32_to_cpu(rdp_req->nport_id_desc.tag))
7200 goto rjt_logerr;
7201 if (RDP_NPORT_ID_SIZE !=
7202 be32_to_cpu(rdp_req->nport_id_desc.length))
7203 goto rjt_logerr;
7204 rdp_context = kzalloc(sizeof(struct lpfc_rdp_context), GFP_KERNEL);
7205 if (!rdp_context) {
7206 rjt_err = LSRJT_UNABLE_TPC;
7207 goto error;
7208 }
7209
7210 cmd = &cmdiocb->wqe;
7211 rdp_context->ndlp = lpfc_nlp_get(ndlp);
7212 if (!rdp_context->ndlp) {
7213 kfree(rdp_context);
7214 rjt_err = LSRJT_UNABLE_TPC;
7215 goto error;
7216 }
7217 rdp_context->ox_id = bf_get(wqe_rcvoxid,
7218 &cmd->xmit_els_rsp.wqe_com);
7219 rdp_context->rx_id = bf_get(wqe_ctxt_tag,
7220 &cmd->xmit_els_rsp.wqe_com);
7221 rdp_context->cmpl = lpfc_els_rdp_cmpl;
7222 if (lpfc_get_rdp_info(phba, rdp_context)) {
7223 lpfc_printf_vlog(ndlp->vport, KERN_WARNING, LOG_ELS,
7224 "2423 Unable to send mailbox");
7225 kfree(rdp_context);
7226 rjt_err = LSRJT_UNABLE_TPC;
7227 lpfc_nlp_put(ndlp);
7228 goto error;
7229 }
7230
7231 return 0;
7232
7233 rjt_logerr:
7234 rjt_err = LSRJT_LOGICAL_ERR;
7235
7236 error:
7237 memset(&stat, 0, sizeof(stat));
7238 stat.un.b.lsRjtRsnCode = rjt_err;
7239 stat.un.b.lsRjtRsnCodeExp = rjt_expl;
7240 lpfc_els_rsp_reject(vport, stat.un.lsRjtError, cmdiocb, ndlp, NULL);
7241 return 1;
7242 }
7243
7244
7245 static void
7246 lpfc_els_lcb_rsp(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmb)
7247 {
7248 MAILBOX_t *mb;
7249 IOCB_t *icmd;
7250 union lpfc_wqe128 *wqe;
7251 uint8_t *pcmd;
7252 struct lpfc_iocbq *elsiocb;
7253 struct lpfc_nodelist *ndlp;
7254 struct ls_rjt *stat;
7255 union lpfc_sli4_cfg_shdr *shdr;
7256 struct lpfc_lcb_context *lcb_context;
7257 struct fc_lcb_res_frame *lcb_res;
7258 uint32_t cmdsize, shdr_status, shdr_add_status;
7259 int rc;
7260
7261 mb = &pmb->u.mb;
7262 lcb_context = (struct lpfc_lcb_context *)pmb->ctx_ndlp;
7263 ndlp = lcb_context->ndlp;
7264 pmb->ctx_ndlp = NULL;
7265 pmb->ctx_buf = NULL;
7266
7267 shdr = (union lpfc_sli4_cfg_shdr *)
7268 &pmb->u.mqe.un.beacon_config.header.cfg_shdr;
7269 shdr_status = bf_get(lpfc_mbox_hdr_status, &shdr->response);
7270 shdr_add_status = bf_get(lpfc_mbox_hdr_add_status, &shdr->response);
7271
7272 lpfc_printf_log(phba, KERN_INFO, LOG_MBOX,
7273 "0194 SET_BEACON_CONFIG mailbox "
7274 "completed with status x%x add_status x%x,"
7275 " mbx status x%x\n",
7276 shdr_status, shdr_add_status, mb->mbxStatus);
7277
7278 if ((mb->mbxStatus != MBX_SUCCESS) || shdr_status ||
7279 (shdr_add_status == ADD_STATUS_OPERATION_ALREADY_ACTIVE) ||
7280 (shdr_add_status == ADD_STATUS_INVALID_REQUEST)) {
7281 mempool_free(pmb, phba->mbox_mem_pool);
7282 goto error;
7283 }
7284
7285 mempool_free(pmb, phba->mbox_mem_pool);
7286 cmdsize = sizeof(struct fc_lcb_res_frame);
7287 elsiocb = lpfc_prep_els_iocb(phba->pport, 0, cmdsize,
7288 lpfc_max_els_tries, ndlp,
7289 ndlp->nlp_DID, ELS_CMD_ACC);
7290
7291
7292 lpfc_nlp_put(ndlp);
7293
7294 if (!elsiocb)
7295 goto free_lcb_context;
7296
7297 lcb_res = (struct fc_lcb_res_frame *)elsiocb->cmd_dmabuf->virt;
7298
7299 memset(lcb_res, 0, sizeof(struct fc_lcb_res_frame));
7300
7301 if (phba->sli_rev == LPFC_SLI_REV4) {
7302 wqe = &elsiocb->wqe;
7303 bf_set(wqe_ctxt_tag, &wqe->generic.wqe_com, lcb_context->rx_id);
7304 bf_set(wqe_rcvoxid, &wqe->xmit_els_rsp.wqe_com,
7305 lcb_context->ox_id);
7306 } else {
7307 icmd = &elsiocb->iocb;
7308 icmd->ulpContext = lcb_context->rx_id;
7309 icmd->unsli3.rcvsli3.ox_id = lcb_context->ox_id;
7310 }
7311
7312 pcmd = (uint8_t *)elsiocb->cmd_dmabuf->virt;
7313 *((uint32_t *)(pcmd)) = ELS_CMD_ACC;
7314 lcb_res->lcb_sub_command = lcb_context->sub_command;
7315 lcb_res->lcb_type = lcb_context->type;
7316 lcb_res->capability = lcb_context->capability;
7317 lcb_res->lcb_frequency = lcb_context->frequency;
7318 lcb_res->lcb_duration = lcb_context->duration;
7319 elsiocb->cmd_cmpl = lpfc_cmpl_els_rsp;
7320 phba->fc_stat.elsXmitACC++;
7321
7322 elsiocb->ndlp = lpfc_nlp_get(ndlp);
7323 if (!elsiocb->ndlp) {
7324 lpfc_els_free_iocb(phba, elsiocb);
7325 goto out;
7326 }
7327
7328 rc = lpfc_sli_issue_iocb(phba, LPFC_ELS_RING, elsiocb, 0);
7329 if (rc == IOCB_ERROR) {
7330 lpfc_els_free_iocb(phba, elsiocb);
7331 lpfc_nlp_put(ndlp);
7332 }
7333 out:
7334 kfree(lcb_context);
7335 return;
7336
7337 error:
7338 cmdsize = sizeof(struct fc_lcb_res_frame);
7339 elsiocb = lpfc_prep_els_iocb(phba->pport, 0, cmdsize,
7340 lpfc_max_els_tries, ndlp,
7341 ndlp->nlp_DID, ELS_CMD_LS_RJT);
7342 lpfc_nlp_put(ndlp);
7343 if (!elsiocb)
7344 goto free_lcb_context;
7345
7346 if (phba->sli_rev == LPFC_SLI_REV4) {
7347 wqe = &elsiocb->wqe;
7348 bf_set(wqe_ctxt_tag, &wqe->generic.wqe_com, lcb_context->rx_id);
7349 bf_set(wqe_rcvoxid, &wqe->xmit_els_rsp.wqe_com,
7350 lcb_context->ox_id);
7351 } else {
7352 icmd = &elsiocb->iocb;
7353 icmd->ulpContext = lcb_context->rx_id;
7354 icmd->unsli3.rcvsli3.ox_id = lcb_context->ox_id;
7355 }
7356
7357 pcmd = (uint8_t *)elsiocb->cmd_dmabuf->virt;
7358
7359 *((uint32_t *)(pcmd)) = ELS_CMD_LS_RJT;
7360 stat = (struct ls_rjt *)(pcmd + sizeof(uint32_t));
7361 stat->un.b.lsRjtRsnCode = LSRJT_UNABLE_TPC;
7362
7363 if (shdr_add_status == ADD_STATUS_OPERATION_ALREADY_ACTIVE)
7364 stat->un.b.lsRjtRsnCodeExp = LSEXP_CMD_IN_PROGRESS;
7365
7366 elsiocb->cmd_cmpl = lpfc_cmpl_els_rsp;
7367 phba->fc_stat.elsXmitLSRJT++;
7368 elsiocb->ndlp = lpfc_nlp_get(ndlp);
7369 if (!elsiocb->ndlp) {
7370 lpfc_els_free_iocb(phba, elsiocb);
7371 goto free_lcb_context;
7372 }
7373
7374 rc = lpfc_sli_issue_iocb(phba, LPFC_ELS_RING, elsiocb, 0);
7375 if (rc == IOCB_ERROR) {
7376 lpfc_els_free_iocb(phba, elsiocb);
7377 lpfc_nlp_put(ndlp);
7378 }
7379 free_lcb_context:
7380 kfree(lcb_context);
7381 }
7382
7383 static int
7384 lpfc_sli4_set_beacon(struct lpfc_vport *vport,
7385 struct lpfc_lcb_context *lcb_context,
7386 uint32_t beacon_state)
7387 {
7388 struct lpfc_hba *phba = vport->phba;
7389 union lpfc_sli4_cfg_shdr *cfg_shdr;
7390 LPFC_MBOXQ_t *mbox = NULL;
7391 uint32_t len;
7392 int rc;
7393
7394 mbox = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL);
7395 if (!mbox)
7396 return 1;
7397
7398 cfg_shdr = &mbox->u.mqe.un.sli4_config.header.cfg_shdr;
7399 len = sizeof(struct lpfc_mbx_set_beacon_config) -
7400 sizeof(struct lpfc_sli4_cfg_mhdr);
7401 lpfc_sli4_config(phba, mbox, LPFC_MBOX_SUBSYSTEM_COMMON,
7402 LPFC_MBOX_OPCODE_SET_BEACON_CONFIG, len,
7403 LPFC_SLI4_MBX_EMBED);
7404 mbox->ctx_ndlp = (void *)lcb_context;
7405 mbox->vport = phba->pport;
7406 mbox->mbox_cmpl = lpfc_els_lcb_rsp;
7407 bf_set(lpfc_mbx_set_beacon_port_num, &mbox->u.mqe.un.beacon_config,
7408 phba->sli4_hba.physical_port);
7409 bf_set(lpfc_mbx_set_beacon_state, &mbox->u.mqe.un.beacon_config,
7410 beacon_state);
7411 mbox->u.mqe.un.beacon_config.word5 = 0;
7412
7413
7414
7415
7416
7417
7418
7419 if (phba->sli4_hba.pc_sli4_params.bv1s) {
7420
7421 cfg_shdr->request.word9 = BEACON_VERSION_V1;
7422 lcb_context->capability |= LCB_CAPABILITY_DURATION;
7423 bf_set(lpfc_mbx_set_beacon_port_type,
7424 &mbox->u.mqe.un.beacon_config, 0);
7425 bf_set(lpfc_mbx_set_beacon_duration_v1,
7426 &mbox->u.mqe.un.beacon_config,
7427 be16_to_cpu(lcb_context->duration));
7428 } else {
7429
7430 if (be16_to_cpu(lcb_context->duration) != 0) {
7431 mempool_free(mbox, phba->mbox_mem_pool);
7432 return 1;
7433 }
7434 cfg_shdr->request.word9 = BEACON_VERSION_V0;
7435 lcb_context->capability &= ~(LCB_CAPABILITY_DURATION);
7436 bf_set(lpfc_mbx_set_beacon_state,
7437 &mbox->u.mqe.un.beacon_config, beacon_state);
7438 bf_set(lpfc_mbx_set_beacon_port_type,
7439 &mbox->u.mqe.un.beacon_config, 1);
7440 bf_set(lpfc_mbx_set_beacon_duration,
7441 &mbox->u.mqe.un.beacon_config,
7442 be16_to_cpu(lcb_context->duration));
7443 }
7444
7445 rc = lpfc_sli_issue_mbox(phba, mbox, MBX_NOWAIT);
7446 if (rc == MBX_NOT_FINISHED) {
7447 mempool_free(mbox, phba->mbox_mem_pool);
7448 return 1;
7449 }
7450
7451 return 0;
7452 }
7453
7454
7455
7456
7457
7458
7459
7460
7461
7462
7463
7464
7465
7466
7467
7468
7469 static int
7470 lpfc_els_rcv_lcb(struct lpfc_vport *vport, struct lpfc_iocbq *cmdiocb,
7471 struct lpfc_nodelist *ndlp)
7472 {
7473 struct lpfc_hba *phba = vport->phba;
7474 struct lpfc_dmabuf *pcmd;
7475 uint8_t *lp;
7476 struct fc_lcb_request_frame *beacon;
7477 struct lpfc_lcb_context *lcb_context;
7478 u8 state, rjt_err = 0;
7479 struct ls_rjt stat;
7480
7481 pcmd = cmdiocb->cmd_dmabuf;
7482 lp = (uint8_t *)pcmd->virt;
7483 beacon = (struct fc_lcb_request_frame *)pcmd->virt;
7484
7485 lpfc_printf_vlog(vport, KERN_INFO, LOG_ELS,
7486 "0192 ELS LCB Data x%x x%x x%x x%x sub x%x "
7487 "type x%x frequency %x duration x%x\n",
7488 lp[0], lp[1], lp[2],
7489 beacon->lcb_command,
7490 beacon->lcb_sub_command,
7491 beacon->lcb_type,
7492 beacon->lcb_frequency,
7493 be16_to_cpu(beacon->lcb_duration));
7494
7495 if (beacon->lcb_sub_command != LPFC_LCB_ON &&
7496 beacon->lcb_sub_command != LPFC_LCB_OFF) {
7497 rjt_err = LSRJT_CMD_UNSUPPORTED;
7498 goto rjt;
7499 }
7500
7501 if (phba->sli_rev < LPFC_SLI_REV4 ||
7502 phba->hba_flag & HBA_FCOE_MODE ||
7503 (bf_get(lpfc_sli_intf_if_type, &phba->sli4_hba.sli_intf) <
7504 LPFC_SLI_INTF_IF_TYPE_2)) {
7505 rjt_err = LSRJT_CMD_UNSUPPORTED;
7506 goto rjt;
7507 }
7508
7509 lcb_context = kmalloc(sizeof(*lcb_context), GFP_KERNEL);
7510 if (!lcb_context) {
7511 rjt_err = LSRJT_UNABLE_TPC;
7512 goto rjt;
7513 }
7514
7515 state = (beacon->lcb_sub_command == LPFC_LCB_ON) ? 1 : 0;
7516 lcb_context->sub_command = beacon->lcb_sub_command;
7517 lcb_context->capability = 0;
7518 lcb_context->type = beacon->lcb_type;
7519 lcb_context->frequency = beacon->lcb_frequency;
7520 lcb_context->duration = beacon->lcb_duration;
7521 lcb_context->ox_id = get_job_rcvoxid(phba, cmdiocb);
7522 lcb_context->rx_id = get_job_ulpcontext(phba, cmdiocb);
7523 lcb_context->ndlp = lpfc_nlp_get(ndlp);
7524 if (!lcb_context->ndlp) {
7525 rjt_err = LSRJT_UNABLE_TPC;
7526 goto rjt_free;
7527 }
7528
7529 if (lpfc_sli4_set_beacon(vport, lcb_context, state)) {
7530 lpfc_printf_vlog(ndlp->vport, KERN_ERR, LOG_TRACE_EVENT,
7531 "0193 failed to send mail box");
7532 lpfc_nlp_put(ndlp);
7533 rjt_err = LSRJT_UNABLE_TPC;
7534 goto rjt_free;
7535 }
7536 return 0;
7537
7538 rjt_free:
7539 kfree(lcb_context);
7540 rjt:
7541 memset(&stat, 0, sizeof(stat));
7542 stat.un.b.lsRjtRsnCode = rjt_err;
7543 lpfc_els_rsp_reject(vport, stat.un.lsRjtError, cmdiocb, ndlp, NULL);
7544 return 1;
7545 }
7546
7547
7548
7549
7550
7551
7552
7553
7554
7555
7556
7557 void
7558 lpfc_els_flush_rscn(struct lpfc_vport *vport)
7559 {
7560 struct Scsi_Host *shost = lpfc_shost_from_vport(vport);
7561 struct lpfc_hba *phba = vport->phba;
7562 int i;
7563
7564 spin_lock_irq(shost->host_lock);
7565 if (vport->fc_rscn_flush) {
7566
7567 spin_unlock_irq(shost->host_lock);
7568 return;
7569 }
7570
7571 vport->fc_rscn_flush = 1;
7572 spin_unlock_irq(shost->host_lock);
7573
7574 for (i = 0; i < vport->fc_rscn_id_cnt; i++) {
7575 lpfc_in_buf_free(phba, vport->fc_rscn_id_list[i]);
7576 vport->fc_rscn_id_list[i] = NULL;
7577 }
7578 spin_lock_irq(shost->host_lock);
7579 vport->fc_rscn_id_cnt = 0;
7580 vport->fc_flag &= ~(FC_RSCN_MODE | FC_RSCN_DISCOVERY);
7581 spin_unlock_irq(shost->host_lock);
7582 lpfc_can_disctmo(vport);
7583
7584 vport->fc_rscn_flush = 0;
7585 }
7586
7587
7588
7589
7590
7591
7592
7593
7594
7595
7596
7597
7598
7599 int
7600 lpfc_rscn_payload_check(struct lpfc_vport *vport, uint32_t did)
7601 {
7602 D_ID ns_did;
7603 D_ID rscn_did;
7604 uint32_t *lp;
7605 uint32_t payload_len, i;
7606 struct Scsi_Host *shost = lpfc_shost_from_vport(vport);
7607
7608 ns_did.un.word = did;
7609
7610
7611 if ((did & Fabric_DID_MASK) == Fabric_DID_MASK)
7612 return 0;
7613
7614
7615 if (vport->fc_flag & FC_RSCN_DISCOVERY)
7616 return did;
7617
7618 spin_lock_irq(shost->host_lock);
7619 if (vport->fc_rscn_flush) {
7620
7621 spin_unlock_irq(shost->host_lock);
7622 return 0;
7623 }
7624
7625 vport->fc_rscn_flush = 1;
7626 spin_unlock_irq(shost->host_lock);
7627 for (i = 0; i < vport->fc_rscn_id_cnt; i++) {
7628 lp = vport->fc_rscn_id_list[i]->virt;
7629 payload_len = be32_to_cpu(*lp++ & ~ELS_CMD_MASK);
7630 payload_len -= sizeof(uint32_t);
7631 while (payload_len) {
7632 rscn_did.un.word = be32_to_cpu(*lp++);
7633 payload_len -= sizeof(uint32_t);
7634 switch (rscn_did.un.b.resv & RSCN_ADDRESS_FORMAT_MASK) {
7635 case RSCN_ADDRESS_FORMAT_PORT:
7636 if ((ns_did.un.b.domain == rscn_did.un.b.domain)
7637 && (ns_did.un.b.area == rscn_did.un.b.area)
7638 && (ns_did.un.b.id == rscn_did.un.b.id))
7639 goto return_did_out;
7640 break;
7641 case RSCN_ADDRESS_FORMAT_AREA:
7642 if ((ns_did.un.b.domain == rscn_did.un.b.domain)
7643 && (ns_did.un.b.area == rscn_did.un.b.area))
7644 goto return_did_out;
7645 break;
7646 case RSCN_ADDRESS_FORMAT_DOMAIN:
7647 if (ns_did.un.b.domain == rscn_did.un.b.domain)
7648 goto return_did_out;
7649 break;
7650 case RSCN_ADDRESS_FORMAT_FABRIC:
7651 goto return_did_out;
7652 }
7653 }
7654 }
7655
7656 vport->fc_rscn_flush = 0;
7657 return 0;
7658 return_did_out:
7659
7660 vport->fc_rscn_flush = 0;
7661 return did;
7662 }
7663
7664
7665
7666
7667
7668
7669
7670
7671
7672
7673
7674
7675 static int
7676 lpfc_rscn_recovery_check(struct lpfc_vport *vport)
7677 {
7678 struct lpfc_nodelist *ndlp = NULL, *n;
7679
7680
7681 list_for_each_entry_safe(ndlp, n, &vport->fc_nodes, nlp_listp) {
7682 if ((ndlp->nlp_state == NLP_STE_UNUSED_NODE) ||
7683 !lpfc_rscn_payload_check(vport, ndlp->nlp_DID))
7684 continue;
7685
7686
7687 if (vport->phba->nvmet_support)
7688 continue;
7689
7690
7691
7692
7693 switch (ndlp->nlp_state) {
7694 case NLP_STE_PLOGI_ISSUE:
7695 case NLP_STE_ADISC_ISSUE:
7696 case NLP_STE_REG_LOGIN_ISSUE:
7697 case NLP_STE_PRLI_ISSUE:
7698 case NLP_STE_LOGO_ISSUE:
7699 continue;
7700 }
7701
7702 lpfc_disc_state_machine(vport, ndlp, NULL,
7703 NLP_EVT_DEVICE_RECOVERY);
7704 lpfc_cancel_retry_delay_tmo(vport, ndlp);
7705 }
7706 return 0;
7707 }
7708
7709
7710
7711
7712
7713
7714
7715
7716
7717 static void
7718 lpfc_send_rscn_event(struct lpfc_vport *vport,
7719 struct lpfc_iocbq *cmdiocb)
7720 {
7721 struct lpfc_dmabuf *pcmd;
7722 struct Scsi_Host *shost = lpfc_shost_from_vport(vport);
7723 uint32_t *payload_ptr;
7724 uint32_t payload_len;
7725 struct lpfc_rscn_event_header *rscn_event_data;
7726
7727 pcmd = cmdiocb->cmd_dmabuf;
7728 payload_ptr = (uint32_t *) pcmd->virt;
7729 payload_len = be32_to_cpu(*payload_ptr & ~ELS_CMD_MASK);
7730
7731 rscn_event_data = kmalloc(sizeof(struct lpfc_rscn_event_header) +
7732 payload_len, GFP_KERNEL);
7733 if (!rscn_event_data) {
7734 lpfc_printf_vlog(vport, KERN_ERR, LOG_TRACE_EVENT,
7735 "0147 Failed to allocate memory for RSCN event\n");
7736 return;
7737 }
7738 rscn_event_data->event_type = FC_REG_RSCN_EVENT;
7739 rscn_event_data->payload_length = payload_len;
7740 memcpy(rscn_event_data->rscn_payload, payload_ptr,
7741 payload_len);
7742
7743 fc_host_post_vendor_event(shost,
7744 fc_get_event_number(),
7745 sizeof(struct lpfc_rscn_event_header) + payload_len,
7746 (char *)rscn_event_data,
7747 LPFC_NL_VENDOR_ID);
7748
7749 kfree(rscn_event_data);
7750 }
7751
7752
7753
7754
7755
7756
7757
7758
7759
7760
7761
7762
7763
7764
7765
7766
7767
7768
7769
7770
7771
7772
7773
7774 static int
7775 lpfc_els_rcv_rscn(struct lpfc_vport *vport, struct lpfc_iocbq *cmdiocb,
7776 struct lpfc_nodelist *ndlp)
7777 {
7778 struct Scsi_Host *shost = lpfc_shost_from_vport(vport);
7779 struct lpfc_hba *phba = vport->phba;
7780 struct lpfc_dmabuf *pcmd;
7781 uint32_t *lp, *datap;
7782 uint32_t payload_len, length, nportid, *cmd;
7783 int rscn_cnt;
7784 int rscn_id = 0, hba_id = 0;
7785 int i, tmo;
7786
7787 pcmd = cmdiocb->cmd_dmabuf;
7788 lp = (uint32_t *) pcmd->virt;
7789
7790 payload_len = be32_to_cpu(*lp++ & ~ELS_CMD_MASK);
7791 payload_len -= sizeof(uint32_t);
7792
7793 lpfc_printf_vlog(vport, KERN_INFO, LOG_DISCOVERY,
7794 "0214 RSCN received Data: x%x x%x x%x x%x\n",
7795 vport->fc_flag, payload_len, *lp,
7796 vport->fc_rscn_id_cnt);
7797
7798
7799 lpfc_send_rscn_event(vport, cmdiocb);
7800
7801 for (i = 0; i < payload_len/sizeof(uint32_t); i++)
7802 fc_host_post_event(shost, fc_get_event_number(),
7803 FCH_EVT_RSCN, lp[i]);
7804
7805
7806 if (vport->fc_flag & FC_PT2PT) {
7807
7808 lpfc_printf_vlog(vport, KERN_INFO, LOG_ELS,
7809 "2024 pt2pt RSCN %08x Data: x%x x%x\n",
7810 *lp, vport->fc_flag, payload_len);
7811 lpfc_els_rsp_acc(vport, ELS_CMD_ACC, cmdiocb, ndlp, NULL);
7812
7813
7814
7815
7816 if (ndlp->nlp_fc4_type & NLP_FC4_NVME &&
7817 ndlp->nlp_type & (NLP_NVME_TARGET | NLP_NVME_DISCOVERY))
7818 lpfc_nvme_rescan_port(vport, ndlp);
7819 return 0;
7820 }
7821
7822
7823
7824
7825 if (vport->port_state <= LPFC_NS_QRY) {
7826 lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_UNSOL,
7827 "RCV RSCN ignore: did:x%x/ste:x%x flg:x%x",
7828 ndlp->nlp_DID, vport->port_state, ndlp->nlp_flag);
7829
7830 lpfc_els_rsp_acc(vport, ELS_CMD_ACC, cmdiocb, ndlp, NULL);
7831 return 0;
7832 }
7833
7834
7835
7836
7837 if ((phba->sli3_options & LPFC_SLI3_NPIV_ENABLED) &&
7838 !(vport->cfg_peer_port_login)) {
7839 i = payload_len;
7840 datap = lp;
7841 while (i > 0) {
7842 nportid = *datap++;
7843 nportid = ((be32_to_cpu(nportid)) & Mask_DID);
7844 i -= sizeof(uint32_t);
7845 rscn_id++;
7846 if (lpfc_find_vport_by_did(phba, nportid))
7847 hba_id++;
7848 }
7849 if (rscn_id == hba_id) {
7850
7851 lpfc_printf_vlog(vport, KERN_INFO, LOG_DISCOVERY,
7852 "0219 Ignore RSCN "
7853 "Data: x%x x%x x%x x%x\n",
7854 vport->fc_flag, payload_len,
7855 *lp, vport->fc_rscn_id_cnt);
7856 lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_UNSOL,
7857 "RCV RSCN vport: did:x%x/ste:x%x flg:x%x",
7858 ndlp->nlp_DID, vport->port_state,
7859 ndlp->nlp_flag);
7860
7861 lpfc_els_rsp_acc(vport, ELS_CMD_ACC, cmdiocb,
7862 ndlp, NULL);
7863
7864 if (vport->fc_flag & FC_DISC_TMO) {
7865 tmo = ((phba->fc_ratov * 3) + 3);
7866 mod_timer(&vport->fc_disctmo,
7867 jiffies +
7868 msecs_to_jiffies(1000 * tmo));
7869 }
7870 return 0;
7871 }
7872 }
7873
7874 spin_lock_irq(shost->host_lock);
7875 if (vport->fc_rscn_flush) {
7876
7877 vport->fc_flag |= FC_RSCN_DISCOVERY;
7878 spin_unlock_irq(shost->host_lock);
7879
7880 lpfc_els_rsp_acc(vport, ELS_CMD_ACC, cmdiocb, ndlp, NULL);
7881 return 0;
7882 }
7883
7884 vport->fc_rscn_flush = 1;
7885 spin_unlock_irq(shost->host_lock);
7886
7887 rscn_cnt = vport->fc_rscn_id_cnt;
7888
7889
7890
7891 if (vport->fc_flag & (FC_RSCN_MODE | FC_NDISC_ACTIVE)) {
7892 lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_UNSOL,
7893 "RCV RSCN defer: did:x%x/ste:x%x flg:x%x",
7894 ndlp->nlp_DID, vport->port_state, ndlp->nlp_flag);
7895
7896 spin_lock_irq(shost->host_lock);
7897 vport->fc_flag |= FC_RSCN_DEFERRED;
7898
7899
7900 if (vport->fc_flag & FC_DISC_TMO) {
7901 tmo = ((phba->fc_ratov * 3) + 3);
7902 mod_timer(&vport->fc_disctmo,
7903 jiffies + msecs_to_jiffies(1000 * tmo));
7904 }
7905 if ((rscn_cnt < FC_MAX_HOLD_RSCN) &&
7906 !(vport->fc_flag & FC_RSCN_DISCOVERY)) {
7907 vport->fc_flag |= FC_RSCN_MODE;
7908 spin_unlock_irq(shost->host_lock);
7909 if (rscn_cnt) {
7910 cmd = vport->fc_rscn_id_list[rscn_cnt-1]->virt;
7911 length = be32_to_cpu(*cmd & ~ELS_CMD_MASK);
7912 }
7913 if ((rscn_cnt) &&
7914 (payload_len + length <= LPFC_BPL_SIZE)) {
7915 *cmd &= ELS_CMD_MASK;
7916 *cmd |= cpu_to_be32(payload_len + length);
7917 memcpy(((uint8_t *)cmd) + length, lp,
7918 payload_len);
7919 } else {
7920 vport->fc_rscn_id_list[rscn_cnt] = pcmd;
7921 vport->fc_rscn_id_cnt++;
7922
7923
7924
7925 cmdiocb->cmd_dmabuf = NULL;
7926 }
7927
7928 lpfc_printf_vlog(vport, KERN_INFO, LOG_DISCOVERY,
7929 "0235 Deferred RSCN "
7930 "Data: x%x x%x x%x\n",
7931 vport->fc_rscn_id_cnt, vport->fc_flag,
7932 vport->port_state);
7933 } else {
7934 vport->fc_flag |= FC_RSCN_DISCOVERY;
7935 spin_unlock_irq(shost->host_lock);
7936
7937 lpfc_printf_vlog(vport, KERN_INFO, LOG_DISCOVERY,
7938 "0234 ReDiscovery RSCN "
7939 "Data: x%x x%x x%x\n",
7940 vport->fc_rscn_id_cnt, vport->fc_flag,
7941 vport->port_state);
7942 }
7943
7944 vport->fc_rscn_flush = 0;
7945
7946 lpfc_els_rsp_acc(vport, ELS_CMD_ACC, cmdiocb, ndlp, NULL);
7947
7948 lpfc_rscn_recovery_check(vport);
7949 return 0;
7950 }
7951 lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_UNSOL,
7952 "RCV RSCN: did:x%x/ste:x%x flg:x%x",
7953 ndlp->nlp_DID, vport->port_state, ndlp->nlp_flag);
7954
7955 spin_lock_irq(shost->host_lock);
7956 vport->fc_flag |= FC_RSCN_MODE;
7957 spin_unlock_irq(shost->host_lock);
7958 vport->fc_rscn_id_list[vport->fc_rscn_id_cnt++] = pcmd;
7959
7960 vport->fc_rscn_flush = 0;
7961
7962
7963
7964
7965 cmdiocb->cmd_dmabuf = NULL;
7966 lpfc_set_disctmo(vport);
7967
7968 lpfc_els_rsp_acc(vport, ELS_CMD_ACC, cmdiocb, ndlp, NULL);
7969
7970 lpfc_rscn_recovery_check(vport);
7971 return lpfc_els_handle_rscn(vport);
7972 }
7973
7974
7975
7976
7977
7978
7979
7980
7981
7982
7983
7984
7985
7986
7987
7988
7989
7990 int
7991 lpfc_els_handle_rscn(struct lpfc_vport *vport)
7992 {
7993 struct lpfc_nodelist *ndlp;
7994 struct lpfc_hba *phba = vport->phba;
7995
7996
7997 if (vport->load_flag & FC_UNLOADING) {
7998 lpfc_els_flush_rscn(vport);
7999 return 0;
8000 }
8001
8002
8003 lpfc_set_disctmo(vport);
8004
8005
8006 lpfc_printf_vlog(vport, KERN_INFO, LOG_DISCOVERY,
8007 "0215 RSCN processed Data: x%x x%x x%x x%x x%x x%x\n",
8008 vport->fc_flag, 0, vport->fc_rscn_id_cnt,
8009 vport->port_state, vport->num_disc_nodes,
8010 vport->gidft_inp);
8011
8012
8013 vport->fc_ns_retry = 0;
8014 vport->num_disc_nodes = 0;
8015
8016 ndlp = lpfc_findnode_did(vport, NameServer_DID);
8017 if (ndlp && ndlp->nlp_state == NLP_STE_UNMAPPED_NODE) {
8018
8019
8020
8021
8022
8023 if (phba->cfg_ns_query == LPFC_NS_QUERY_GID_FT) {
8024 if (lpfc_issue_gidft(vport) > 0)
8025 return 1;
8026 } else if (phba->cfg_ns_query == LPFC_NS_QUERY_GID_PT) {
8027 if (lpfc_issue_gidpt(vport) > 0)
8028 return 1;
8029 } else {
8030 return 1;
8031 }
8032 } else {
8033
8034 if (ndlp) {
8035 ndlp->nlp_prev_state = NLP_STE_UNUSED_NODE;
8036 lpfc_nlp_set_state(vport, ndlp, NLP_STE_PLOGI_ISSUE);
8037 } else {
8038 ndlp = lpfc_nlp_init(vport, NameServer_DID);
8039 if (!ndlp) {
8040 lpfc_els_flush_rscn(vport);
8041 return 0;
8042 }
8043 ndlp->nlp_prev_state = ndlp->nlp_state;
8044 lpfc_nlp_set_state(vport, ndlp, NLP_STE_PLOGI_ISSUE);
8045 }
8046 ndlp->nlp_type |= NLP_FABRIC;
8047 lpfc_issue_els_plogi(vport, NameServer_DID, 0);
8048
8049
8050
8051 return 1;
8052 }
8053
8054 lpfc_els_flush_rscn(vport);
8055 return 0;
8056 }
8057
8058
8059
8060
8061
8062
8063
8064
8065
8066
8067
8068
8069
8070
8071
8072
8073
8074
8075
8076
8077
8078
8079
8080
8081
8082
8083 static int
8084 lpfc_els_rcv_flogi(struct lpfc_vport *vport, struct lpfc_iocbq *cmdiocb,
8085 struct lpfc_nodelist *ndlp)
8086 {
8087 struct Scsi_Host *shost = lpfc_shost_from_vport(vport);
8088 struct lpfc_hba *phba = vport->phba;
8089 struct lpfc_dmabuf *pcmd = cmdiocb->cmd_dmabuf;
8090 uint32_t *lp = (uint32_t *) pcmd->virt;
8091 union lpfc_wqe128 *wqe = &cmdiocb->wqe;
8092 struct serv_parm *sp;
8093 LPFC_MBOXQ_t *mbox;
8094 uint32_t cmd, did;
8095 int rc;
8096 uint32_t fc_flag = 0;
8097 uint32_t port_state = 0;
8098
8099
8100 phba->link_flag &= ~LS_EXTERNAL_LOOPBACK;
8101
8102 cmd = *lp++;
8103 sp = (struct serv_parm *) lp;
8104
8105
8106
8107 lpfc_set_disctmo(vport);
8108
8109 if (phba->fc_topology == LPFC_TOPOLOGY_LOOP) {
8110
8111 did = bf_get(wqe_els_did, &wqe->xmit_els_rsp.wqe_dest);
8112
8113
8114
8115 lpfc_printf_vlog(vport, KERN_ERR, LOG_TRACE_EVENT,
8116 "0113 An FLOGI ELS command x%x was "
8117 "received from DID x%x in Loop Mode\n",
8118 cmd, did);
8119 return 1;
8120 }
8121
8122 (void) lpfc_check_sparm(vport, ndlp, sp, CLASS3, 1);
8123
8124
8125
8126
8127
8128
8129 rc = memcmp(&vport->fc_portname, &sp->portName,
8130 sizeof(struct lpfc_name));
8131
8132 if (!rc) {
8133 if (phba->sli_rev < LPFC_SLI_REV4) {
8134 mbox = mempool_alloc(phba->mbox_mem_pool,
8135 GFP_KERNEL);
8136 if (!mbox)
8137 return 1;
8138 lpfc_linkdown(phba);
8139 lpfc_init_link(phba, mbox,
8140 phba->cfg_topology,
8141 phba->cfg_link_speed);
8142 mbox->u.mb.un.varInitLnk.lipsr_AL_PA = 0;
8143 mbox->mbox_cmpl = lpfc_sli_def_mbox_cmpl;
8144 mbox->vport = vport;
8145 rc = lpfc_sli_issue_mbox(phba, mbox,
8146 MBX_NOWAIT);
8147 lpfc_set_loopback_flag(phba);
8148 if (rc == MBX_NOT_FINISHED)
8149 mempool_free(mbox, phba->mbox_mem_pool);
8150 return 1;
8151 }
8152
8153
8154 phba->link_flag |= LS_EXTERNAL_LOOPBACK;
8155
8156 lpfc_printf_vlog(vport, KERN_INFO, LOG_ELS | LOG_LIBDFC,
8157 "1119 External Loopback plug detected\n");
8158
8159
8160
8161
8162 lpfc_els_abort_flogi(phba);
8163 return 0;
8164
8165 } else if (rc > 0) {
8166 spin_lock_irq(shost->host_lock);
8167 vport->fc_flag |= FC_PT2PT_PLOGI;
8168 spin_unlock_irq(shost->host_lock);
8169
8170
8171
8172
8173
8174
8175 vport->fc_myDID = PT2PT_LocalID;
8176 } else {
8177 vport->fc_myDID = PT2PT_RemoteID;
8178 }
8179
8180
8181
8182
8183
8184 spin_lock_irq(shost->host_lock);
8185 fc_flag = vport->fc_flag;
8186 port_state = vport->port_state;
8187 vport->fc_flag |= FC_PT2PT;
8188 vport->fc_flag &= ~(FC_FABRIC | FC_PUBLIC_LOOP);
8189
8190
8191
8192
8193 vport->rcv_flogi_cnt++;
8194 spin_unlock_irq(shost->host_lock);
8195 lpfc_printf_vlog(vport, KERN_INFO, LOG_ELS,
8196 "3311 Rcv Flogi PS x%x new PS x%x "
8197 "fc_flag x%x new fc_flag x%x\n",
8198 port_state, vport->port_state,
8199 fc_flag, vport->fc_flag);
8200
8201
8202
8203
8204
8205
8206 did = vport->fc_myDID;
8207 vport->fc_myDID = Fabric_DID;
8208
8209 memcpy(&phba->fc_fabparam, sp, sizeof(struct serv_parm));
8210
8211
8212 if (!(phba->hba_flag & HBA_FLOGI_ISSUED)) {
8213 phba->defer_flogi_acc_rx_id = bf_get(wqe_ctxt_tag,
8214 &wqe->xmit_els_rsp.wqe_com);
8215 phba->defer_flogi_acc_ox_id = bf_get(wqe_rcvoxid,
8216 &wqe->xmit_els_rsp.wqe_com);
8217
8218 vport->fc_myDID = did;
8219
8220 lpfc_printf_vlog(vport, KERN_INFO, LOG_ELS,
8221 "3344 Deferring FLOGI ACC: rx_id: x%x,"
8222 " ox_id: x%x, hba_flag x%x\n",
8223 phba->defer_flogi_acc_rx_id,
8224 phba->defer_flogi_acc_ox_id, phba->hba_flag);
8225
8226 phba->defer_flogi_acc_flag = true;
8227
8228 return 0;
8229 }
8230
8231
8232 lpfc_els_rsp_acc(vport, ELS_CMD_FLOGI, cmdiocb, ndlp, NULL);
8233
8234
8235 vport->fc_myDID = did;
8236
8237 return 0;
8238 }
8239
8240
8241
8242
8243
8244
8245
8246
8247
8248
8249
8250
8251
8252
8253
8254
8255
8256 static int
8257 lpfc_els_rcv_rnid(struct lpfc_vport *vport, struct lpfc_iocbq *cmdiocb,
8258 struct lpfc_nodelist *ndlp)
8259 {
8260 struct lpfc_dmabuf *pcmd;
8261 uint32_t *lp;
8262 RNID *rn;
8263 struct ls_rjt stat;
8264
8265 pcmd = cmdiocb->cmd_dmabuf;
8266 lp = (uint32_t *) pcmd->virt;
8267
8268 lp++;
8269 rn = (RNID *) lp;
8270
8271
8272
8273 switch (rn->Format) {
8274 case 0:
8275 case RNID_TOPOLOGY_DISC:
8276
8277 lpfc_els_rsp_rnid_acc(vport, rn->Format, cmdiocb, ndlp);
8278 break;
8279 default:
8280
8281 stat.un.b.lsRjtRsvd0 = 0;
8282 stat.un.b.lsRjtRsnCode = LSRJT_UNABLE_TPC;
8283 stat.un.b.lsRjtRsnCodeExp = LSEXP_CANT_GIVE_DATA;
8284 stat.un.b.vendorUnique = 0;
8285 lpfc_els_rsp_reject(vport, stat.un.lsRjtError, cmdiocb, ndlp,
8286 NULL);
8287 }
8288 return 0;
8289 }
8290
8291
8292
8293
8294
8295
8296
8297
8298
8299
8300 static int
8301 lpfc_els_rcv_echo(struct lpfc_vport *vport, struct lpfc_iocbq *cmdiocb,
8302 struct lpfc_nodelist *ndlp)
8303 {
8304 uint8_t *pcmd;
8305
8306 pcmd = (uint8_t *)cmdiocb->cmd_dmabuf->virt;
8307
8308
8309 pcmd += sizeof(uint32_t);
8310
8311 lpfc_els_rsp_echo_acc(vport, pcmd, cmdiocb, ndlp);
8312 return 0;
8313 }
8314
8315
8316
8317
8318
8319
8320
8321
8322
8323
8324
8325
8326
8327
8328 static int
8329 lpfc_els_rcv_lirr(struct lpfc_vport *vport, struct lpfc_iocbq *cmdiocb,
8330 struct lpfc_nodelist *ndlp)
8331 {
8332 struct ls_rjt stat;
8333
8334
8335 stat.un.b.lsRjtRsvd0 = 0;
8336 stat.un.b.lsRjtRsnCode = LSRJT_UNABLE_TPC;
8337 stat.un.b.lsRjtRsnCodeExp = LSEXP_CANT_GIVE_DATA;
8338 stat.un.b.vendorUnique = 0;
8339 lpfc_els_rsp_reject(vport, stat.un.lsRjtError, cmdiocb, ndlp, NULL);
8340 return 0;
8341 }
8342
8343
8344
8345
8346
8347
8348
8349
8350
8351
8352
8353
8354
8355
8356
8357
8358
8359 static void
8360 lpfc_els_rcv_rrq(struct lpfc_vport *vport, struct lpfc_iocbq *cmdiocb,
8361 struct lpfc_nodelist *ndlp)
8362 {
8363 lpfc_els_rsp_acc(vport, ELS_CMD_ACC, cmdiocb, ndlp, NULL);
8364 if (vport->phba->sli_rev == LPFC_SLI_REV4)
8365 lpfc_els_clear_rrq(vport, cmdiocb, ndlp);
8366 }
8367
8368
8369
8370
8371
8372
8373
8374
8375
8376
8377
8378
8379
8380
8381
8382
8383
8384
8385
8386
8387 static void
8388 lpfc_els_rsp_rls_acc(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmb)
8389 {
8390 int rc = 0;
8391 MAILBOX_t *mb;
8392 IOCB_t *icmd;
8393 union lpfc_wqe128 *wqe;
8394 struct RLS_RSP *rls_rsp;
8395 uint8_t *pcmd;
8396 struct lpfc_iocbq *elsiocb;
8397 struct lpfc_nodelist *ndlp;
8398 uint16_t oxid;
8399 uint16_t rxid;
8400 uint32_t cmdsize;
8401 u32 ulp_context;
8402
8403 mb = &pmb->u.mb;
8404
8405 ndlp = pmb->ctx_ndlp;
8406 rxid = (uint16_t)((unsigned long)(pmb->ctx_buf) & 0xffff);
8407 oxid = (uint16_t)(((unsigned long)(pmb->ctx_buf) >> 16) & 0xffff);
8408 pmb->ctx_buf = NULL;
8409 pmb->ctx_ndlp = NULL;
8410
8411 if (mb->mbxStatus) {
8412 mempool_free(pmb, phba->mbox_mem_pool);
8413 return;
8414 }
8415
8416 cmdsize = sizeof(struct RLS_RSP) + sizeof(uint32_t);
8417 elsiocb = lpfc_prep_els_iocb(phba->pport, 0, cmdsize,
8418 lpfc_max_els_tries, ndlp,
8419 ndlp->nlp_DID, ELS_CMD_ACC);
8420
8421
8422 lpfc_nlp_put(ndlp);
8423
8424 if (!elsiocb) {
8425 mempool_free(pmb, phba->mbox_mem_pool);
8426 return;
8427 }
8428
8429 ulp_context = get_job_ulpcontext(phba, elsiocb);
8430 if (phba->sli_rev == LPFC_SLI_REV4) {
8431 wqe = &elsiocb->wqe;
8432
8433 bf_set(wqe_ctxt_tag, &wqe->generic.wqe_com, rxid);
8434 bf_set(wqe_rcvoxid, &wqe->xmit_els_rsp.wqe_com, oxid);
8435 } else {
8436 icmd = &elsiocb->iocb;
8437 icmd->ulpContext = rxid;
8438 icmd->unsli3.rcvsli3.ox_id = oxid;
8439 }
8440
8441 pcmd = (uint8_t *)elsiocb->cmd_dmabuf->virt;
8442 *((uint32_t *) (pcmd)) = ELS_CMD_ACC;
8443 pcmd += sizeof(uint32_t);
8444 rls_rsp = (struct RLS_RSP *)pcmd;
8445
8446 rls_rsp->linkFailureCnt = cpu_to_be32(mb->un.varRdLnk.linkFailureCnt);
8447 rls_rsp->lossSyncCnt = cpu_to_be32(mb->un.varRdLnk.lossSyncCnt);
8448 rls_rsp->lossSignalCnt = cpu_to_be32(mb->un.varRdLnk.lossSignalCnt);
8449 rls_rsp->primSeqErrCnt = cpu_to_be32(mb->un.varRdLnk.primSeqErrCnt);
8450 rls_rsp->invalidXmitWord = cpu_to_be32(mb->un.varRdLnk.invalidXmitWord);
8451 rls_rsp->crcCnt = cpu_to_be32(mb->un.varRdLnk.crcCnt);
8452 mempool_free(pmb, phba->mbox_mem_pool);
8453
8454 lpfc_printf_vlog(ndlp->vport, KERN_INFO, LOG_ELS,
8455 "2874 Xmit ELS RLS ACC response tag x%x xri x%x, "
8456 "did x%x, nlp_flag x%x, nlp_state x%x, rpi x%x\n",
8457 elsiocb->iotag, ulp_context,
8458 ndlp->nlp_DID, ndlp->nlp_flag, ndlp->nlp_state,
8459 ndlp->nlp_rpi);
8460 elsiocb->cmd_cmpl = lpfc_cmpl_els_rsp;
8461 phba->fc_stat.elsXmitACC++;
8462 elsiocb->ndlp = lpfc_nlp_get(ndlp);
8463 if (!elsiocb->ndlp) {
8464 lpfc_els_free_iocb(phba, elsiocb);
8465 return;
8466 }
8467
8468 rc = lpfc_sli_issue_iocb(phba, LPFC_ELS_RING, elsiocb, 0);
8469 if (rc == IOCB_ERROR) {
8470 lpfc_els_free_iocb(phba, elsiocb);
8471 lpfc_nlp_put(ndlp);
8472 }
8473 return;
8474 }
8475
8476
8477
8478
8479
8480
8481
8482
8483
8484
8485
8486
8487
8488
8489
8490
8491
8492
8493
8494 static int
8495 lpfc_els_rcv_rls(struct lpfc_vport *vport, struct lpfc_iocbq *cmdiocb,
8496 struct lpfc_nodelist *ndlp)
8497 {
8498 struct lpfc_hba *phba = vport->phba;
8499 LPFC_MBOXQ_t *mbox;
8500 struct ls_rjt stat;
8501 u32 ctx = get_job_ulpcontext(phba, cmdiocb);
8502 u32 ox_id = get_job_rcvoxid(phba, cmdiocb);
8503
8504 if ((ndlp->nlp_state != NLP_STE_UNMAPPED_NODE) &&
8505 (ndlp->nlp_state != NLP_STE_MAPPED_NODE))
8506
8507 goto reject_out;
8508
8509 mbox = mempool_alloc(phba->mbox_mem_pool, GFP_ATOMIC);
8510 if (mbox) {
8511 lpfc_read_lnk_stat(phba, mbox);
8512 mbox->ctx_buf = (void *)((unsigned long)
8513 (ox_id << 16 | ctx));
8514 mbox->ctx_ndlp = lpfc_nlp_get(ndlp);
8515 if (!mbox->ctx_ndlp)
8516 goto node_err;
8517 mbox->vport = vport;
8518 mbox->mbox_cmpl = lpfc_els_rsp_rls_acc;
8519 if (lpfc_sli_issue_mbox(phba, mbox, MBX_NOWAIT)
8520 != MBX_NOT_FINISHED)
8521
8522 return 0;
8523
8524
8525
8526 lpfc_nlp_put(ndlp);
8527 node_err:
8528 mempool_free(mbox, phba->mbox_mem_pool);
8529 }
8530 reject_out:
8531
8532 stat.un.b.lsRjtRsvd0 = 0;
8533 stat.un.b.lsRjtRsnCode = LSRJT_UNABLE_TPC;
8534 stat.un.b.lsRjtRsnCodeExp = LSEXP_CANT_GIVE_DATA;
8535 stat.un.b.vendorUnique = 0;
8536 lpfc_els_rsp_reject(vport, stat.un.lsRjtError, cmdiocb, ndlp, NULL);
8537 return 0;
8538 }
8539
8540
8541
8542
8543
8544
8545
8546
8547
8548
8549
8550
8551
8552
8553
8554
8555
8556
8557
8558
8559
8560
8561 static int
8562 lpfc_els_rcv_rtv(struct lpfc_vport *vport, struct lpfc_iocbq *cmdiocb,
8563 struct lpfc_nodelist *ndlp)
8564 {
8565 int rc = 0;
8566 IOCB_t *icmd;
8567 union lpfc_wqe128 *wqe;
8568 struct lpfc_hba *phba = vport->phba;
8569 struct ls_rjt stat;
8570 struct RTV_RSP *rtv_rsp;
8571 uint8_t *pcmd;
8572 struct lpfc_iocbq *elsiocb;
8573 uint32_t cmdsize;
8574 u32 ulp_context;
8575
8576 if ((ndlp->nlp_state != NLP_STE_UNMAPPED_NODE) &&
8577 (ndlp->nlp_state != NLP_STE_MAPPED_NODE))
8578
8579 goto reject_out;
8580
8581 cmdsize = sizeof(struct RTV_RSP) + sizeof(uint32_t);
8582 elsiocb = lpfc_prep_els_iocb(phba->pport, 0, cmdsize,
8583 lpfc_max_els_tries, ndlp,
8584 ndlp->nlp_DID, ELS_CMD_ACC);
8585
8586 if (!elsiocb)
8587 return 1;
8588
8589 pcmd = (uint8_t *)elsiocb->cmd_dmabuf->virt;
8590 *((uint32_t *) (pcmd)) = ELS_CMD_ACC;
8591 pcmd += sizeof(uint32_t);
8592
8593 ulp_context = get_job_ulpcontext(phba, elsiocb);
8594
8595 if (phba->sli_rev == LPFC_SLI_REV4) {
8596 wqe = &elsiocb->wqe;
8597 bf_set(wqe_ctxt_tag, &wqe->generic.wqe_com,
8598 get_job_ulpcontext(phba, cmdiocb));
8599 bf_set(wqe_rcvoxid, &wqe->xmit_els_rsp.wqe_com,
8600 get_job_rcvoxid(phba, cmdiocb));
8601 } else {
8602 icmd = &elsiocb->iocb;
8603 icmd->ulpContext = get_job_ulpcontext(phba, cmdiocb);
8604 icmd->unsli3.rcvsli3.ox_id = get_job_rcvoxid(phba, cmdiocb);
8605 }
8606
8607 rtv_rsp = (struct RTV_RSP *)pcmd;
8608
8609
8610 rtv_rsp->ratov = cpu_to_be32(phba->fc_ratov * 1000);
8611 rtv_rsp->edtov = cpu_to_be32(phba->fc_edtov);
8612 bf_set(qtov_edtovres, rtv_rsp, phba->fc_edtovResol ? 1 : 0);
8613 bf_set(qtov_rttov, rtv_rsp, 0);
8614 rtv_rsp->qtov = cpu_to_be32(rtv_rsp->qtov);
8615
8616
8617 lpfc_printf_vlog(ndlp->vport, KERN_INFO, LOG_ELS,
8618 "2875 Xmit ELS RTV ACC response tag x%x xri x%x, "
8619 "did x%x, nlp_flag x%x, nlp_state x%x, rpi x%x, "
8620 "Data: x%x x%x x%x\n",
8621 elsiocb->iotag, ulp_context,
8622 ndlp->nlp_DID, ndlp->nlp_flag, ndlp->nlp_state,
8623 ndlp->nlp_rpi,
8624 rtv_rsp->ratov, rtv_rsp->edtov, rtv_rsp->qtov);
8625 elsiocb->cmd_cmpl = lpfc_cmpl_els_rsp;
8626 phba->fc_stat.elsXmitACC++;
8627 elsiocb->ndlp = lpfc_nlp_get(ndlp);
8628 if (!elsiocb->ndlp) {
8629 lpfc_els_free_iocb(phba, elsiocb);
8630 return 0;
8631 }
8632
8633 rc = lpfc_sli_issue_iocb(phba, LPFC_ELS_RING, elsiocb, 0);
8634 if (rc == IOCB_ERROR) {
8635 lpfc_els_free_iocb(phba, elsiocb);
8636 lpfc_nlp_put(ndlp);
8637 }
8638 return 0;
8639
8640 reject_out:
8641
8642 stat.un.b.lsRjtRsvd0 = 0;
8643 stat.un.b.lsRjtRsnCode = LSRJT_UNABLE_TPC;
8644 stat.un.b.lsRjtRsnCodeExp = LSEXP_CANT_GIVE_DATA;
8645 stat.un.b.vendorUnique = 0;
8646 lpfc_els_rsp_reject(vport, stat.un.lsRjtError, cmdiocb, ndlp, NULL);
8647 return 0;
8648 }
8649
8650
8651
8652
8653
8654
8655
8656
8657
8658
8659
8660
8661
8662
8663 static int
8664 lpfc_issue_els_rrq(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
8665 uint32_t did, struct lpfc_node_rrq *rrq)
8666 {
8667 struct lpfc_hba *phba = vport->phba;
8668 struct RRQ *els_rrq;
8669 struct lpfc_iocbq *elsiocb;
8670 uint8_t *pcmd;
8671 uint16_t cmdsize;
8672 int ret;
8673
8674 if (!ndlp)
8675 return 1;
8676
8677
8678 cmdsize = (sizeof(uint32_t) + sizeof(struct RRQ));
8679 elsiocb = lpfc_prep_els_iocb(vport, 1, cmdsize, 0, ndlp, did,
8680 ELS_CMD_RRQ);
8681 if (!elsiocb)
8682 return 1;
8683
8684 pcmd = (uint8_t *)elsiocb->cmd_dmabuf->virt;
8685
8686
8687 *((uint32_t *) (pcmd)) = ELS_CMD_RRQ;
8688 pcmd += sizeof(uint32_t);
8689 els_rrq = (struct RRQ *) pcmd;
8690
8691 bf_set(rrq_oxid, els_rrq, phba->sli4_hba.xri_ids[rrq->xritag]);
8692 bf_set(rrq_rxid, els_rrq, rrq->rxid);
8693 bf_set(rrq_did, els_rrq, vport->fc_myDID);
8694 els_rrq->rrq = cpu_to_be32(els_rrq->rrq);
8695 els_rrq->rrq_exchg = cpu_to_be32(els_rrq->rrq_exchg);
8696
8697
8698 lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_CMD,
8699 "Issue RRQ: did:x%x",
8700 did, rrq->xritag, rrq->rxid);
8701 elsiocb->context_un.rrq = rrq;
8702 elsiocb->cmd_cmpl = lpfc_cmpl_els_rrq;
8703
8704 elsiocb->ndlp = lpfc_nlp_get(ndlp);
8705 if (!elsiocb->ndlp)
8706 goto io_err;
8707
8708 ret = lpfc_sli_issue_iocb(phba, LPFC_ELS_RING, elsiocb, 0);
8709 if (ret == IOCB_ERROR) {
8710 lpfc_nlp_put(ndlp);
8711 goto io_err;
8712 }
8713 return 0;
8714
8715 io_err:
8716 lpfc_els_free_iocb(phba, elsiocb);
8717 return 1;
8718 }
8719
8720
8721
8722
8723
8724
8725
8726
8727
8728
8729
8730
8731
8732 int
8733 lpfc_send_rrq(struct lpfc_hba *phba, struct lpfc_node_rrq *rrq)
8734 {
8735 struct lpfc_nodelist *ndlp = lpfc_findnode_did(rrq->vport,
8736 rrq->nlp_DID);
8737 if (!ndlp)
8738 return 1;
8739
8740 if (lpfc_test_rrq_active(phba, ndlp, rrq->xritag))
8741 return lpfc_issue_els_rrq(rrq->vport, ndlp,
8742 rrq->nlp_DID, rrq);
8743 else
8744 return 1;
8745 }
8746
8747
8748
8749
8750
8751
8752
8753
8754
8755
8756
8757
8758
8759
8760
8761
8762
8763
8764
8765
8766 static int
8767 lpfc_els_rsp_rpl_acc(struct lpfc_vport *vport, uint16_t cmdsize,
8768 struct lpfc_iocbq *oldiocb, struct lpfc_nodelist *ndlp)
8769 {
8770 int rc = 0;
8771 struct lpfc_hba *phba = vport->phba;
8772 IOCB_t *icmd;
8773 union lpfc_wqe128 *wqe;
8774 RPL_RSP rpl_rsp;
8775 struct lpfc_iocbq *elsiocb;
8776 uint8_t *pcmd;
8777 u32 ulp_context;
8778
8779 elsiocb = lpfc_prep_els_iocb(vport, 0, cmdsize, oldiocb->retry, ndlp,
8780 ndlp->nlp_DID, ELS_CMD_ACC);
8781
8782 if (!elsiocb)
8783 return 1;
8784
8785 ulp_context = get_job_ulpcontext(phba, elsiocb);
8786 if (phba->sli_rev == LPFC_SLI_REV4) {
8787 wqe = &elsiocb->wqe;
8788
8789 bf_set(wqe_ctxt_tag, &wqe->generic.wqe_com,
8790 get_job_ulpcontext(phba, oldiocb));
8791 bf_set(wqe_rcvoxid, &wqe->xmit_els_rsp.wqe_com,
8792 get_job_rcvoxid(phba, oldiocb));
8793 } else {
8794 icmd = &elsiocb->iocb;
8795 icmd->ulpContext = get_job_ulpcontext(phba, oldiocb);
8796 icmd->unsli3.rcvsli3.ox_id = get_job_rcvoxid(phba, oldiocb);
8797 }
8798
8799 pcmd = elsiocb->cmd_dmabuf->virt;
8800 *((uint32_t *) (pcmd)) = ELS_CMD_ACC;
8801 pcmd += sizeof(uint16_t);
8802 *((uint16_t *)(pcmd)) = be16_to_cpu(cmdsize);
8803 pcmd += sizeof(uint16_t);
8804
8805
8806 rpl_rsp.listLen = be32_to_cpu(1);
8807 rpl_rsp.index = 0;
8808 rpl_rsp.port_num_blk.portNum = 0;
8809 rpl_rsp.port_num_blk.portID = be32_to_cpu(vport->fc_myDID);
8810 memcpy(&rpl_rsp.port_num_blk.portName, &vport->fc_portname,
8811 sizeof(struct lpfc_name));
8812 memcpy(pcmd, &rpl_rsp, cmdsize - sizeof(uint32_t));
8813
8814 lpfc_printf_vlog(vport, KERN_INFO, LOG_ELS,
8815 "0120 Xmit ELS RPL ACC response tag x%x "
8816 "xri x%x, did x%x, nlp_flag x%x, nlp_state x%x, "
8817 "rpi x%x\n",
8818 elsiocb->iotag, ulp_context,
8819 ndlp->nlp_DID, ndlp->nlp_flag, ndlp->nlp_state,
8820 ndlp->nlp_rpi);
8821 elsiocb->cmd_cmpl = lpfc_cmpl_els_rsp;
8822 phba->fc_stat.elsXmitACC++;
8823 elsiocb->ndlp = lpfc_nlp_get(ndlp);
8824 if (!elsiocb->ndlp) {
8825 lpfc_els_free_iocb(phba, elsiocb);
8826 return 1;
8827 }
8828
8829 rc = lpfc_sli_issue_iocb(phba, LPFC_ELS_RING, elsiocb, 0);
8830 if (rc == IOCB_ERROR) {
8831 lpfc_els_free_iocb(phba, elsiocb);
8832 lpfc_nlp_put(ndlp);
8833 return 1;
8834 }
8835
8836 return 0;
8837 }
8838
8839
8840
8841
8842
8843
8844
8845
8846
8847
8848
8849
8850
8851
8852
8853
8854
8855 static int
8856 lpfc_els_rcv_rpl(struct lpfc_vport *vport, struct lpfc_iocbq *cmdiocb,
8857 struct lpfc_nodelist *ndlp)
8858 {
8859 struct lpfc_dmabuf *pcmd;
8860 uint32_t *lp;
8861 uint32_t maxsize;
8862 uint16_t cmdsize;
8863 RPL *rpl;
8864 struct ls_rjt stat;
8865
8866 if ((ndlp->nlp_state != NLP_STE_UNMAPPED_NODE) &&
8867 (ndlp->nlp_state != NLP_STE_MAPPED_NODE)) {
8868
8869 stat.un.b.lsRjtRsvd0 = 0;
8870 stat.un.b.lsRjtRsnCode = LSRJT_UNABLE_TPC;
8871 stat.un.b.lsRjtRsnCodeExp = LSEXP_CANT_GIVE_DATA;
8872 stat.un.b.vendorUnique = 0;
8873 lpfc_els_rsp_reject(vport, stat.un.lsRjtError, cmdiocb, ndlp,
8874 NULL);
8875
8876 return 0;
8877 }
8878
8879 pcmd = cmdiocb->cmd_dmabuf;
8880 lp = (uint32_t *) pcmd->virt;
8881 rpl = (RPL *) (lp + 1);
8882 maxsize = be32_to_cpu(rpl->maxsize);
8883
8884
8885 if ((rpl->index == 0) &&
8886 ((maxsize == 0) ||
8887 ((maxsize * sizeof(uint32_t)) >= sizeof(RPL_RSP)))) {
8888 cmdsize = sizeof(uint32_t) + sizeof(RPL_RSP);
8889 } else {
8890 cmdsize = sizeof(uint32_t) + maxsize * sizeof(uint32_t);
8891 }
8892 lpfc_els_rsp_rpl_acc(vport, cmdsize, cmdiocb, ndlp);
8893
8894 return 0;
8895 }
8896
8897
8898
8899
8900
8901
8902
8903
8904
8905
8906
8907
8908
8909
8910
8911
8912
8913
8914
8915
8916
8917
8918
8919
8920
8921 static int
8922 lpfc_els_rcv_farp(struct lpfc_vport *vport, struct lpfc_iocbq *cmdiocb,
8923 struct lpfc_nodelist *ndlp)
8924 {
8925 struct lpfc_dmabuf *pcmd;
8926 uint32_t *lp;
8927 FARP *fp;
8928 uint32_t cnt, did;
8929
8930 did = get_job_els_rsp64_did(vport->phba, cmdiocb);
8931 pcmd = cmdiocb->cmd_dmabuf;
8932 lp = (uint32_t *) pcmd->virt;
8933
8934 lp++;
8935 fp = (FARP *) lp;
8936
8937 lpfc_printf_vlog(vport, KERN_INFO, LOG_ELS,
8938 "0601 FARP-REQ received from DID x%x\n", did);
8939
8940 if (fp->Mflags & ~(FARP_MATCH_NODE | FARP_MATCH_PORT)) {
8941 return 0;
8942 }
8943
8944 cnt = 0;
8945
8946 if (fp->Mflags & FARP_MATCH_PORT) {
8947 if (memcmp(&fp->RportName, &vport->fc_portname,
8948 sizeof(struct lpfc_name)) == 0)
8949 cnt = 1;
8950 }
8951
8952
8953 if (fp->Mflags & FARP_MATCH_NODE) {
8954 if (memcmp(&fp->RnodeName, &vport->fc_nodename,
8955 sizeof(struct lpfc_name)) == 0)
8956 cnt = 1;
8957 }
8958
8959 if (cnt) {
8960 if ((ndlp->nlp_state == NLP_STE_UNMAPPED_NODE) ||
8961 (ndlp->nlp_state == NLP_STE_MAPPED_NODE)) {
8962
8963 if (fp->Rflags & FARP_REQUEST_PLOGI) {
8964 ndlp->nlp_prev_state = ndlp->nlp_state;
8965 lpfc_nlp_set_state(vport, ndlp,
8966 NLP_STE_PLOGI_ISSUE);
8967 lpfc_issue_els_plogi(vport, ndlp->nlp_DID, 0);
8968 }
8969
8970
8971 if (fp->Rflags & FARP_REQUEST_FARPR)
8972 lpfc_issue_els_farpr(vport, did, 0);
8973 }
8974 }
8975 return 0;
8976 }
8977
8978
8979
8980
8981
8982
8983
8984
8985
8986
8987
8988
8989
8990
8991
8992 static int
8993 lpfc_els_rcv_farpr(struct lpfc_vport *vport, struct lpfc_iocbq *cmdiocb,
8994 struct lpfc_nodelist *ndlp)
8995 {
8996 struct lpfc_dmabuf *pcmd;
8997 uint32_t *lp;
8998 uint32_t did;
8999
9000 did = get_job_els_rsp64_did(vport->phba, cmdiocb);
9001 pcmd = cmdiocb->cmd_dmabuf;
9002 lp = (uint32_t *)pcmd->virt;
9003
9004 lp++;
9005
9006 lpfc_printf_vlog(vport, KERN_INFO, LOG_ELS,
9007 "0600 FARP-RSP received from DID x%x\n", did);
9008
9009 lpfc_els_rsp_acc(vport, ELS_CMD_ACC, cmdiocb, ndlp, NULL);
9010
9011 return 0;
9012 }
9013
9014
9015
9016
9017
9018
9019
9020
9021
9022
9023
9024
9025
9026
9027
9028
9029
9030
9031
9032
9033 static int
9034 lpfc_els_rcv_fan(struct lpfc_vport *vport, struct lpfc_iocbq *cmdiocb,
9035 struct lpfc_nodelist *fan_ndlp)
9036 {
9037 struct lpfc_hba *phba = vport->phba;
9038 uint32_t *lp;
9039 FAN *fp;
9040
9041 lpfc_printf_vlog(vport, KERN_INFO, LOG_ELS, "0265 FAN received\n");
9042 lp = (uint32_t *)cmdiocb->cmd_dmabuf->virt;
9043 fp = (FAN *) ++lp;
9044
9045 if ((vport == phba->pport) &&
9046 (vport->port_state == LPFC_LOCAL_CFG_LINK)) {
9047 if ((memcmp(&phba->fc_fabparam.nodeName, &fp->FnodeName,
9048 sizeof(struct lpfc_name))) ||
9049 (memcmp(&phba->fc_fabparam.portName, &fp->FportName,
9050 sizeof(struct lpfc_name)))) {
9051
9052 lpfc_issue_init_vfi(vport);
9053 } else {
9054
9055 vport->fc_myDID = vport->fc_prevDID;
9056 if (phba->sli_rev < LPFC_SLI_REV4)
9057 lpfc_issue_fabric_reglogin(vport);
9058 else {
9059 lpfc_printf_vlog(vport, KERN_INFO, LOG_ELS,
9060 "3138 Need register VFI: (x%x/%x)\n",
9061 vport->fc_prevDID, vport->fc_myDID);
9062 lpfc_issue_reg_vfi(vport);
9063 }
9064 }
9065 }
9066 return 0;
9067 }
9068
9069
9070
9071
9072
9073
9074
9075
9076
9077
9078 static int
9079 lpfc_els_rcv_edc(struct lpfc_vport *vport, struct lpfc_iocbq *cmdiocb,
9080 struct lpfc_nodelist *ndlp)
9081 {
9082 struct lpfc_hba *phba = vport->phba;
9083 struct fc_els_edc *edc_req;
9084 struct fc_tlv_desc *tlv;
9085 uint8_t *payload;
9086 uint32_t *ptr, dtag;
9087 const char *dtag_nm;
9088 int desc_cnt = 0, bytes_remain;
9089 bool rcv_cap_desc = false;
9090
9091 payload = cmdiocb->cmd_dmabuf->virt;
9092
9093 edc_req = (struct fc_els_edc *)payload;
9094 bytes_remain = be32_to_cpu(edc_req->desc_len);
9095
9096 ptr = (uint32_t *)payload;
9097 lpfc_printf_vlog(vport, KERN_INFO, LOG_ELS | LOG_CGN_MGMT,
9098 "3319 Rcv EDC payload len %d: x%x x%x x%x\n",
9099 bytes_remain, be32_to_cpu(*ptr),
9100 be32_to_cpu(*(ptr + 1)), be32_to_cpu(*(ptr + 2)));
9101
9102
9103 phba->cgn_reg_signal = EDC_CG_SIG_NOTSUPPORTED;
9104 phba->cgn_sig_freq = 0;
9105 phba->cgn_reg_fpin = LPFC_CGN_FPIN_ALARM | LPFC_CGN_FPIN_WARN;
9106
9107 if (bytes_remain <= 0)
9108 goto out;
9109
9110 tlv = edc_req->desc;
9111
9112
9113
9114
9115
9116 while (bytes_remain && !rcv_cap_desc) {
9117 if (bytes_remain < FC_TLV_DESC_HDR_SZ) {
9118 lpfc_printf_log(phba, KERN_WARNING, LOG_CGN_MGMT,
9119 "6464 Truncated TLV hdr on "
9120 "Diagnostic descriptor[%d]\n",
9121 desc_cnt);
9122 goto out;
9123 }
9124
9125 dtag = be32_to_cpu(tlv->desc_tag);
9126 switch (dtag) {
9127 case ELS_DTAG_LNK_FAULT_CAP:
9128 if (bytes_remain < FC_TLV_DESC_SZ_FROM_LENGTH(tlv) ||
9129 FC_TLV_DESC_SZ_FROM_LENGTH(tlv) !=
9130 sizeof(struct fc_diag_lnkflt_desc)) {
9131 lpfc_printf_log(
9132 phba, KERN_WARNING, LOG_CGN_MGMT,
9133 "6465 Truncated Link Fault Diagnostic "
9134 "descriptor[%d]: %d vs 0x%zx 0x%zx\n",
9135 desc_cnt, bytes_remain,
9136 FC_TLV_DESC_SZ_FROM_LENGTH(tlv),
9137 sizeof(struct fc_diag_cg_sig_desc));
9138 goto out;
9139 }
9140
9141 break;
9142 case ELS_DTAG_CG_SIGNAL_CAP:
9143 if (bytes_remain < FC_TLV_DESC_SZ_FROM_LENGTH(tlv) ||
9144 FC_TLV_DESC_SZ_FROM_LENGTH(tlv) !=
9145 sizeof(struct fc_diag_cg_sig_desc)) {
9146 lpfc_printf_log(
9147 phba, KERN_WARNING, LOG_CGN_MGMT,
9148 "6466 Truncated cgn signal Diagnostic "
9149 "descriptor[%d]: %d vs 0x%zx 0x%zx\n",
9150 desc_cnt, bytes_remain,
9151 FC_TLV_DESC_SZ_FROM_LENGTH(tlv),
9152 sizeof(struct fc_diag_cg_sig_desc));
9153 goto out;
9154 }
9155
9156 phba->cgn_reg_fpin = phba->cgn_init_reg_fpin;
9157 phba->cgn_reg_signal = phba->cgn_init_reg_signal;
9158
9159
9160
9161
9162
9163 phba->cgn_sig_freq = lpfc_fabric_cgn_frequency;
9164
9165 lpfc_least_capable_settings(
9166 phba, (struct fc_diag_cg_sig_desc *)tlv);
9167 rcv_cap_desc = true;
9168 break;
9169 default:
9170 dtag_nm = lpfc_get_tlv_dtag_nm(dtag);
9171 lpfc_printf_log(phba, KERN_WARNING, LOG_CGN_MGMT,
9172 "6467 unknown Diagnostic "
9173 "Descriptor[%d]: tag x%x (%s)\n",
9174 desc_cnt, dtag, dtag_nm);
9175 }
9176 bytes_remain -= FC_TLV_DESC_SZ_FROM_LENGTH(tlv);
9177 tlv = fc_tlv_next_desc(tlv);
9178 desc_cnt++;
9179 }
9180 out:
9181
9182 lpfc_issue_els_edc_rsp(vport, cmdiocb, ndlp);
9183
9184 lpfc_config_cgn_signal(phba);
9185 return 0;
9186 }
9187
9188
9189
9190
9191
9192
9193
9194
9195
9196
9197
9198 void
9199 lpfc_els_timeout(struct timer_list *t)
9200 {
9201 struct lpfc_vport *vport = from_timer(vport, t, els_tmofunc);
9202 struct lpfc_hba *phba = vport->phba;
9203 uint32_t tmo_posted;
9204 unsigned long iflag;
9205
9206 spin_lock_irqsave(&vport->work_port_lock, iflag);
9207 tmo_posted = vport->work_port_events & WORKER_ELS_TMO;
9208 if ((!tmo_posted) && (!(vport->load_flag & FC_UNLOADING)))
9209 vport->work_port_events |= WORKER_ELS_TMO;
9210 spin_unlock_irqrestore(&vport->work_port_lock, iflag);
9211
9212 if ((!tmo_posted) && (!(vport->load_flag & FC_UNLOADING)))
9213 lpfc_worker_wake_up(phba);
9214 return;
9215 }
9216
9217
9218
9219
9220
9221
9222
9223
9224
9225
9226
9227 void
9228 lpfc_els_timeout_handler(struct lpfc_vport *vport)
9229 {
9230 struct lpfc_hba *phba = vport->phba;
9231 struct lpfc_sli_ring *pring;
9232 struct lpfc_iocbq *tmp_iocb, *piocb;
9233 IOCB_t *cmd = NULL;
9234 struct lpfc_dmabuf *pcmd;
9235 uint32_t els_command = 0;
9236 uint32_t timeout;
9237 uint32_t remote_ID = 0xffffffff;
9238 LIST_HEAD(abort_list);
9239 u32 ulp_command = 0, ulp_context = 0, did = 0, iotag = 0;
9240
9241
9242 timeout = (uint32_t)(phba->fc_ratov << 1);
9243
9244 pring = lpfc_phba_elsring(phba);
9245 if (unlikely(!pring))
9246 return;
9247
9248 if (phba->pport->load_flag & FC_UNLOADING)
9249 return;
9250
9251 spin_lock_irq(&phba->hbalock);
9252 if (phba->sli_rev == LPFC_SLI_REV4)
9253 spin_lock(&pring->ring_lock);
9254
9255 list_for_each_entry_safe(piocb, tmp_iocb, &pring->txcmplq, list) {
9256 ulp_command = get_job_cmnd(phba, piocb);
9257 ulp_context = get_job_ulpcontext(phba, piocb);
9258 did = get_job_els_rsp64_did(phba, piocb);
9259
9260 if (phba->sli_rev == LPFC_SLI_REV4) {
9261 iotag = get_wqe_reqtag(piocb);
9262 } else {
9263 cmd = &piocb->iocb;
9264 iotag = cmd->ulpIoTag;
9265 }
9266
9267 if ((piocb->cmd_flag & LPFC_IO_LIBDFC) != 0 ||
9268 ulp_command == CMD_ABORT_XRI_CX ||
9269 ulp_command == CMD_ABORT_XRI_CN ||
9270 ulp_command == CMD_CLOSE_XRI_CN)
9271 continue;
9272
9273 if (piocb->vport != vport)
9274 continue;
9275
9276 pcmd = piocb->cmd_dmabuf;
9277 if (pcmd)
9278 els_command = *(uint32_t *) (pcmd->virt);
9279
9280 if (els_command == ELS_CMD_FARP ||
9281 els_command == ELS_CMD_FARPR ||
9282 els_command == ELS_CMD_FDISC)
9283 continue;
9284
9285 if (piocb->drvrTimeout > 0) {
9286 if (piocb->drvrTimeout >= timeout)
9287 piocb->drvrTimeout -= timeout;
9288 else
9289 piocb->drvrTimeout = 0;
9290 continue;
9291 }
9292
9293 remote_ID = 0xffffffff;
9294 if (ulp_command != CMD_GEN_REQUEST64_CR) {
9295 remote_ID = did;
9296 } else {
9297 struct lpfc_nodelist *ndlp;
9298 ndlp = __lpfc_findnode_rpi(vport, ulp_context);
9299 if (ndlp)
9300 remote_ID = ndlp->nlp_DID;
9301 }
9302 list_add_tail(&piocb->dlist, &abort_list);
9303 }
9304 if (phba->sli_rev == LPFC_SLI_REV4)
9305 spin_unlock(&pring->ring_lock);
9306 spin_unlock_irq(&phba->hbalock);
9307
9308 list_for_each_entry_safe(piocb, tmp_iocb, &abort_list, dlist) {
9309 lpfc_printf_vlog(vport, KERN_ERR, LOG_TRACE_EVENT,
9310 "0127 ELS timeout Data: x%x x%x x%x "
9311 "x%x\n", els_command,
9312 remote_ID, ulp_command, iotag);
9313
9314 spin_lock_irq(&phba->hbalock);
9315 list_del_init(&piocb->dlist);
9316 lpfc_sli_issue_abort_iotag(phba, pring, piocb, NULL);
9317 spin_unlock_irq(&phba->hbalock);
9318 }
9319
9320
9321 lpfc_issue_hb_tmo(phba);
9322
9323 if (!list_empty(&pring->txcmplq))
9324 if (!(phba->pport->load_flag & FC_UNLOADING))
9325 mod_timer(&vport->els_tmofunc,
9326 jiffies + msecs_to_jiffies(1000 * timeout));
9327 }
9328
9329
9330
9331
9332
9333
9334
9335
9336
9337
9338
9339
9340
9341
9342
9343
9344
9345
9346
9347
9348
9349 void
9350 lpfc_els_flush_cmd(struct lpfc_vport *vport)
9351 {
9352 LIST_HEAD(abort_list);
9353 struct lpfc_hba *phba = vport->phba;
9354 struct lpfc_sli_ring *pring;
9355 struct lpfc_iocbq *tmp_iocb, *piocb;
9356 u32 ulp_command;
9357 unsigned long iflags = 0;
9358
9359 lpfc_fabric_abort_vport(vport);
9360
9361
9362
9363
9364
9365
9366
9367 spin_lock_irqsave(&phba->hbalock, iflags);
9368 pring = lpfc_phba_elsring(phba);
9369
9370
9371 if (unlikely(!pring)) {
9372 spin_unlock_irqrestore(&phba->hbalock, iflags);
9373 return;
9374 }
9375
9376 if (phba->sli_rev == LPFC_SLI_REV4)
9377 spin_lock(&pring->ring_lock);
9378
9379
9380 list_for_each_entry_safe(piocb, tmp_iocb, &pring->txcmplq, list) {
9381 if (piocb->cmd_flag & LPFC_IO_LIBDFC)
9382 continue;
9383
9384 if (piocb->vport != vport)
9385 continue;
9386
9387 if (piocb->cmd_flag & LPFC_DRIVER_ABORTED)
9388 continue;
9389
9390
9391
9392
9393 ulp_command = get_job_cmnd(phba, piocb);
9394 if (ulp_command == CMD_ELS_REQUEST64_CR) {
9395 list_add_tail(&piocb->dlist, &abort_list);
9396
9397
9398
9399
9400
9401
9402
9403
9404 if (phba->link_state == LPFC_LINK_DOWN)
9405 piocb->cmd_cmpl = lpfc_cmpl_els_link_down;
9406 }
9407 if (ulp_command == CMD_GEN_REQUEST64_CR)
9408 list_add_tail(&piocb->dlist, &abort_list);
9409 }
9410
9411 if (phba->sli_rev == LPFC_SLI_REV4)
9412 spin_unlock(&pring->ring_lock);
9413 spin_unlock_irqrestore(&phba->hbalock, iflags);
9414
9415
9416 list_for_each_entry_safe(piocb, tmp_iocb, &abort_list, dlist) {
9417 spin_lock_irqsave(&phba->hbalock, iflags);
9418 list_del_init(&piocb->dlist);
9419 lpfc_sli_issue_abort_iotag(phba, pring, piocb, NULL);
9420 spin_unlock_irqrestore(&phba->hbalock, iflags);
9421 }
9422
9423 lpfc_issue_hb_tmo(phba);
9424
9425 if (!list_empty(&abort_list))
9426 lpfc_printf_vlog(vport, KERN_ERR, LOG_TRACE_EVENT,
9427 "3387 abort list for txq not empty\n");
9428 INIT_LIST_HEAD(&abort_list);
9429
9430 spin_lock_irqsave(&phba->hbalock, iflags);
9431 if (phba->sli_rev == LPFC_SLI_REV4)
9432 spin_lock(&pring->ring_lock);
9433
9434
9435
9436
9437 list_for_each_entry_safe(piocb, tmp_iocb, &pring->txq, list) {
9438 ulp_command = get_job_cmnd(phba, piocb);
9439
9440 if (piocb->cmd_flag & LPFC_IO_LIBDFC)
9441 continue;
9442
9443
9444 if (ulp_command == CMD_QUE_RING_BUF_CN ||
9445 ulp_command == CMD_QUE_RING_BUF64_CN ||
9446 ulp_command == CMD_CLOSE_XRI_CN ||
9447 ulp_command == CMD_ABORT_XRI_CN ||
9448 ulp_command == CMD_ABORT_XRI_CX)
9449 continue;
9450
9451 if (piocb->vport != vport)
9452 continue;
9453
9454 list_del_init(&piocb->list);
9455 list_add_tail(&piocb->list, &abort_list);
9456 }
9457
9458
9459 if (vport == phba->pport) {
9460 list_for_each_entry_safe(piocb, tmp_iocb,
9461 &phba->fabric_iocb_list, list) {
9462 list_del_init(&piocb->list);
9463 list_add_tail(&piocb->list, &abort_list);
9464 }
9465 }
9466
9467 if (phba->sli_rev == LPFC_SLI_REV4)
9468 spin_unlock(&pring->ring_lock);
9469 spin_unlock_irqrestore(&phba->hbalock, iflags);
9470
9471
9472 lpfc_sli_cancel_iocbs(phba, &abort_list,
9473 IOSTAT_LOCAL_REJECT, IOERR_SLI_ABORTED);
9474
9475 return;
9476 }
9477
9478
9479
9480
9481
9482
9483
9484
9485
9486
9487
9488
9489
9490
9491
9492
9493
9494
9495 void
9496 lpfc_els_flush_all_cmd(struct lpfc_hba *phba)
9497 {
9498 struct lpfc_vport *vport;
9499
9500 spin_lock_irq(&phba->port_list_lock);
9501 list_for_each_entry(vport, &phba->port_list, listentry)
9502 lpfc_els_flush_cmd(vport);
9503 spin_unlock_irq(&phba->port_list_lock);
9504
9505 return;
9506 }
9507
9508
9509
9510
9511
9512
9513
9514
9515
9516
9517 void
9518 lpfc_send_els_failure_event(struct lpfc_hba *phba,
9519 struct lpfc_iocbq *cmdiocbp,
9520 struct lpfc_iocbq *rspiocbp)
9521 {
9522 struct lpfc_vport *vport = cmdiocbp->vport;
9523 struct Scsi_Host *shost = lpfc_shost_from_vport(vport);
9524 struct lpfc_lsrjt_event lsrjt_event;
9525 struct lpfc_fabric_event_header fabric_event;
9526 struct ls_rjt stat;
9527 struct lpfc_nodelist *ndlp;
9528 uint32_t *pcmd;
9529 u32 ulp_status, ulp_word4;
9530
9531 ndlp = cmdiocbp->ndlp;
9532 if (!ndlp)
9533 return;
9534
9535 ulp_status = get_job_ulpstatus(phba, rspiocbp);
9536 ulp_word4 = get_job_word4(phba, rspiocbp);
9537
9538 if (ulp_status == IOSTAT_LS_RJT) {
9539 lsrjt_event.header.event_type = FC_REG_ELS_EVENT;
9540 lsrjt_event.header.subcategory = LPFC_EVENT_LSRJT_RCV;
9541 memcpy(lsrjt_event.header.wwpn, &ndlp->nlp_portname,
9542 sizeof(struct lpfc_name));
9543 memcpy(lsrjt_event.header.wwnn, &ndlp->nlp_nodename,
9544 sizeof(struct lpfc_name));
9545 pcmd = (uint32_t *)cmdiocbp->cmd_dmabuf->virt;
9546 lsrjt_event.command = (pcmd != NULL) ? *pcmd : 0;
9547 stat.un.ls_rjt_error_be = cpu_to_be32(ulp_word4);
9548 lsrjt_event.reason_code = stat.un.b.lsRjtRsnCode;
9549 lsrjt_event.explanation = stat.un.b.lsRjtRsnCodeExp;
9550 fc_host_post_vendor_event(shost,
9551 fc_get_event_number(),
9552 sizeof(lsrjt_event),
9553 (char *)&lsrjt_event,
9554 LPFC_NL_VENDOR_ID);
9555 return;
9556 }
9557 if (ulp_status == IOSTAT_NPORT_BSY ||
9558 ulp_status == IOSTAT_FABRIC_BSY) {
9559 fabric_event.event_type = FC_REG_FABRIC_EVENT;
9560 if (ulp_status == IOSTAT_NPORT_BSY)
9561 fabric_event.subcategory = LPFC_EVENT_PORT_BUSY;
9562 else
9563 fabric_event.subcategory = LPFC_EVENT_FABRIC_BUSY;
9564 memcpy(fabric_event.wwpn, &ndlp->nlp_portname,
9565 sizeof(struct lpfc_name));
9566 memcpy(fabric_event.wwnn, &ndlp->nlp_nodename,
9567 sizeof(struct lpfc_name));
9568 fc_host_post_vendor_event(shost,
9569 fc_get_event_number(),
9570 sizeof(fabric_event),
9571 (char *)&fabric_event,
9572 LPFC_NL_VENDOR_ID);
9573 return;
9574 }
9575
9576 }
9577
9578
9579
9580
9581
9582
9583
9584
9585
9586
9587 static void
9588 lpfc_send_els_event(struct lpfc_vport *vport,
9589 struct lpfc_nodelist *ndlp,
9590 uint32_t *payload)
9591 {
9592 struct lpfc_els_event_header *els_data = NULL;
9593 struct lpfc_logo_event *logo_data = NULL;
9594 struct Scsi_Host *shost = lpfc_shost_from_vport(vport);
9595
9596 if (*payload == ELS_CMD_LOGO) {
9597 logo_data = kmalloc(sizeof(struct lpfc_logo_event), GFP_KERNEL);
9598 if (!logo_data) {
9599 lpfc_printf_vlog(vport, KERN_ERR, LOG_TRACE_EVENT,
9600 "0148 Failed to allocate memory "
9601 "for LOGO event\n");
9602 return;
9603 }
9604 els_data = &logo_data->header;
9605 } else {
9606 els_data = kmalloc(sizeof(struct lpfc_els_event_header),
9607 GFP_KERNEL);
9608 if (!els_data) {
9609 lpfc_printf_vlog(vport, KERN_ERR, LOG_TRACE_EVENT,
9610 "0149 Failed to allocate memory "
9611 "for ELS event\n");
9612 return;
9613 }
9614 }
9615 els_data->event_type = FC_REG_ELS_EVENT;
9616 switch (*payload) {
9617 case ELS_CMD_PLOGI:
9618 els_data->subcategory = LPFC_EVENT_PLOGI_RCV;
9619 break;
9620 case ELS_CMD_PRLO:
9621 els_data->subcategory = LPFC_EVENT_PRLO_RCV;
9622 break;
9623 case ELS_CMD_ADISC:
9624 els_data->subcategory = LPFC_EVENT_ADISC_RCV;
9625 break;
9626 case ELS_CMD_LOGO:
9627 els_data->subcategory = LPFC_EVENT_LOGO_RCV;
9628
9629 memcpy(logo_data->logo_wwpn, &payload[2],
9630 sizeof(struct lpfc_name));
9631 break;
9632 default:
9633 kfree(els_data);
9634 return;
9635 }
9636 memcpy(els_data->wwpn, &ndlp->nlp_portname, sizeof(struct lpfc_name));
9637 memcpy(els_data->wwnn, &ndlp->nlp_nodename, sizeof(struct lpfc_name));
9638 if (*payload == ELS_CMD_LOGO) {
9639 fc_host_post_vendor_event(shost,
9640 fc_get_event_number(),
9641 sizeof(struct lpfc_logo_event),
9642 (char *)logo_data,
9643 LPFC_NL_VENDOR_ID);
9644 kfree(logo_data);
9645 } else {
9646 fc_host_post_vendor_event(shost,
9647 fc_get_event_number(),
9648 sizeof(struct lpfc_els_event_header),
9649 (char *)els_data,
9650 LPFC_NL_VENDOR_ID);
9651 kfree(els_data);
9652 }
9653
9654 return;
9655 }
9656
9657
9658 DECLARE_ENUM2STR_LOOKUP(lpfc_get_fpin_li_event_nm, fc_fpin_li_event_types,
9659 FC_FPIN_LI_EVT_TYPES_INIT);
9660
9661 DECLARE_ENUM2STR_LOOKUP(lpfc_get_fpin_deli_event_nm, fc_fpin_deli_event_types,
9662 FC_FPIN_DELI_EVT_TYPES_INIT);
9663
9664 DECLARE_ENUM2STR_LOOKUP(lpfc_get_fpin_congn_event_nm, fc_fpin_congn_event_types,
9665 FC_FPIN_CONGN_EVT_TYPES_INIT);
9666
9667 DECLARE_ENUM2STR_LOOKUP(lpfc_get_fpin_congn_severity_nm,
9668 fc_fpin_congn_severity_types,
9669 FC_FPIN_CONGN_SEVERITY_INIT);
9670
9671
9672
9673
9674
9675
9676
9677
9678
9679
9680
9681 static void
9682 lpfc_display_fpin_wwpn(struct lpfc_hba *phba, __be64 *wwnlist, u32 cnt)
9683 {
9684 char buf[LPFC_FPIN_WWPN_LINE_SZ];
9685 __be64 wwn;
9686 u64 wwpn;
9687 int i, len;
9688 int line = 0;
9689 int wcnt = 0;
9690 bool endit = false;
9691
9692 len = scnprintf(buf, LPFC_FPIN_WWPN_LINE_SZ, "Accessible WWPNs:");
9693 for (i = 0; i < cnt; i++) {
9694
9695 if (i == (cnt - 1))
9696 endit = true;
9697
9698
9699 wwn = *wwnlist++;
9700 wwpn = be64_to_cpu(wwn);
9701 len += scnprintf(buf + len, LPFC_FPIN_WWPN_LINE_SZ - len,
9702 " %016llx", wwpn);
9703
9704
9705
9706
9707 wcnt++;
9708 if (wcnt == LPFC_FPIN_WWPN_LINE_CNT || endit) {
9709 buf[len] = 0;
9710 lpfc_printf_log(phba, KERN_INFO, LOG_ELS,
9711 "4686 %s\n", buf);
9712
9713
9714 if (endit)
9715 return;
9716
9717
9718 line++;
9719 if (line == LPFC_FPIN_WWPN_NUM_LINE) {
9720 lpfc_printf_log(phba, KERN_INFO, LOG_ELS,
9721 "4687 %d WWPNs Truncated\n",
9722 cnt - i - 1);
9723 return;
9724 }
9725
9726
9727 wcnt = 0;
9728 len = scnprintf(buf, LPFC_FPIN_WWPN_LINE_SZ,
9729 "Additional WWPNs:");
9730 }
9731 }
9732 }
9733
9734
9735
9736
9737
9738
9739
9740
9741 static void
9742 lpfc_els_rcv_fpin_li(struct lpfc_hba *phba, struct fc_tlv_desc *tlv)
9743 {
9744 struct fc_fn_li_desc *li = (struct fc_fn_li_desc *)tlv;
9745 const char *li_evt_str;
9746 u32 li_evt, cnt;
9747
9748 li_evt = be16_to_cpu(li->event_type);
9749 li_evt_str = lpfc_get_fpin_li_event_nm(li_evt);
9750 cnt = be32_to_cpu(li->pname_count);
9751
9752 lpfc_printf_log(phba, KERN_INFO, LOG_ELS,
9753 "4680 FPIN Link Integrity %s (x%x) "
9754 "Detecting PN x%016llx Attached PN x%016llx "
9755 "Duration %d mSecs Count %d Port Cnt %d\n",
9756 li_evt_str, li_evt,
9757 be64_to_cpu(li->detecting_wwpn),
9758 be64_to_cpu(li->attached_wwpn),
9759 be32_to_cpu(li->event_threshold),
9760 be32_to_cpu(li->event_count), cnt);
9761
9762 lpfc_display_fpin_wwpn(phba, (__be64 *)&li->pname_list, cnt);
9763 }
9764
9765
9766
9767
9768
9769
9770
9771
9772 static void
9773 lpfc_els_rcv_fpin_del(struct lpfc_hba *phba, struct fc_tlv_desc *tlv)
9774 {
9775 struct fc_fn_deli_desc *del = (struct fc_fn_deli_desc *)tlv;
9776 const char *del_rsn_str;
9777 u32 del_rsn;
9778 __be32 *frame;
9779
9780 del_rsn = be16_to_cpu(del->deli_reason_code);
9781 del_rsn_str = lpfc_get_fpin_deli_event_nm(del_rsn);
9782
9783
9784 frame = (__be32 *)(del + 1);
9785
9786 lpfc_printf_log(phba, KERN_INFO, LOG_ELS,
9787 "4681 FPIN Delivery %s (x%x) "
9788 "Detecting PN x%016llx Attached PN x%016llx "
9789 "DiscHdr0 x%08x "
9790 "DiscHdr1 x%08x DiscHdr2 x%08x DiscHdr3 x%08x "
9791 "DiscHdr4 x%08x DiscHdr5 x%08x\n",
9792 del_rsn_str, del_rsn,
9793 be64_to_cpu(del->detecting_wwpn),
9794 be64_to_cpu(del->attached_wwpn),
9795 be32_to_cpu(frame[0]),
9796 be32_to_cpu(frame[1]),
9797 be32_to_cpu(frame[2]),
9798 be32_to_cpu(frame[3]),
9799 be32_to_cpu(frame[4]),
9800 be32_to_cpu(frame[5]));
9801 }
9802
9803
9804
9805
9806
9807
9808
9809
9810 static void
9811 lpfc_els_rcv_fpin_peer_cgn(struct lpfc_hba *phba, struct fc_tlv_desc *tlv)
9812 {
9813 struct fc_fn_peer_congn_desc *pc = (struct fc_fn_peer_congn_desc *)tlv;
9814 const char *pc_evt_str;
9815 u32 pc_evt, cnt;
9816
9817 pc_evt = be16_to_cpu(pc->event_type);
9818 pc_evt_str = lpfc_get_fpin_congn_event_nm(pc_evt);
9819 cnt = be32_to_cpu(pc->pname_count);
9820
9821 lpfc_printf_log(phba, KERN_INFO, LOG_CGN_MGMT | LOG_ELS,
9822 "4684 FPIN Peer Congestion %s (x%x) "
9823 "Duration %d mSecs "
9824 "Detecting PN x%016llx Attached PN x%016llx "
9825 "Impacted Port Cnt %d\n",
9826 pc_evt_str, pc_evt,
9827 be32_to_cpu(pc->event_period),
9828 be64_to_cpu(pc->detecting_wwpn),
9829 be64_to_cpu(pc->attached_wwpn),
9830 cnt);
9831
9832 lpfc_display_fpin_wwpn(phba, (__be64 *)&pc->pname_list, cnt);
9833 }
9834
9835
9836
9837
9838
9839
9840
9841
9842
9843
9844
9845
9846 static int
9847 lpfc_els_rcv_fpin_cgn(struct lpfc_hba *phba, struct fc_tlv_desc *tlv)
9848 {
9849 struct lpfc_cgn_info *cp;
9850 struct fc_fn_congn_desc *cgn = (struct fc_fn_congn_desc *)tlv;
9851 const char *cgn_evt_str;
9852 u32 cgn_evt;
9853 const char *cgn_sev_str;
9854 u32 cgn_sev;
9855 uint16_t value;
9856 u32 crc;
9857 bool nm_log = false;
9858 int rc = 1;
9859
9860 cgn_evt = be16_to_cpu(cgn->event_type);
9861 cgn_evt_str = lpfc_get_fpin_congn_event_nm(cgn_evt);
9862 cgn_sev = cgn->severity;
9863 cgn_sev_str = lpfc_get_fpin_congn_severity_nm(cgn_sev);
9864
9865
9866
9867
9868
9869
9870
9871 switch (cgn_evt) {
9872 case FPIN_CONGN_LOST_CREDIT:
9873 nm_log = true;
9874 break;
9875 case FPIN_CONGN_CREDIT_STALL:
9876 nm_log = true;
9877 fallthrough;
9878 case FPIN_CONGN_OVERSUBSCRIPTION:
9879 if (cgn_evt == FPIN_CONGN_OVERSUBSCRIPTION)
9880 nm_log = false;
9881 switch (cgn_sev) {
9882 case FPIN_CONGN_SEVERITY_ERROR:
9883
9884 if (phba->cmf_active_mode != LPFC_CFG_OFF) {
9885 if (phba->cgn_reg_fpin & LPFC_CGN_FPIN_ALARM) {
9886
9887 atomic_inc(&phba->cgn_sync_alarm_cnt);
9888 }
9889
9890
9891
9892
9893 atomic_inc(&phba->cgn_fabric_alarm_cnt);
9894 goto cleanup;
9895 }
9896 break;
9897 case FPIN_CONGN_SEVERITY_WARNING:
9898
9899 if (phba->cmf_active_mode != LPFC_CFG_OFF) {
9900 if (phba->cgn_reg_fpin & LPFC_CGN_FPIN_WARN) {
9901
9902 atomic_inc(&phba->cgn_sync_warn_cnt);
9903 }
9904
9905
9906
9907
9908 atomic_inc(&phba->cgn_fabric_warn_cnt);
9909 cleanup:
9910
9911 phba->cgn_fpin_frequency =
9912 be32_to_cpu(cgn->event_period);
9913 value = phba->cgn_fpin_frequency;
9914 if (phba->cgn_i) {
9915 cp = (struct lpfc_cgn_info *)
9916 phba->cgn_i->virt;
9917 cp->cgn_alarm_freq =
9918 cpu_to_le16(value);
9919 cp->cgn_warn_freq =
9920 cpu_to_le16(value);
9921 crc = lpfc_cgn_calc_crc32
9922 (cp,
9923 LPFC_CGN_INFO_SZ,
9924 LPFC_CGN_CRC32_SEED);
9925 cp->cgn_info_crc = cpu_to_le32(crc);
9926 }
9927
9928
9929
9930
9931 rc = 0;
9932 }
9933 break;
9934 }
9935 break;
9936 }
9937
9938
9939 lpfc_printf_log(phba, (nm_log ? KERN_WARNING : KERN_INFO),
9940 LOG_CGN_MGMT | LOG_ELS,
9941 "4683 FPIN CONGESTION %s type %s (x%x) Event "
9942 "Duration %d mSecs\n",
9943 cgn_sev_str, cgn_evt_str, cgn_evt,
9944 be32_to_cpu(cgn->event_period));
9945 return rc;
9946 }
9947
9948 void
9949 lpfc_els_rcv_fpin(struct lpfc_vport *vport, void *p, u32 fpin_length)
9950 {
9951 struct lpfc_hba *phba = vport->phba;
9952 struct fc_els_fpin *fpin = (struct fc_els_fpin *)p;
9953 struct fc_tlv_desc *tlv, *first_tlv, *current_tlv;
9954 const char *dtag_nm;
9955 int desc_cnt = 0, bytes_remain, cnt;
9956 u32 dtag, deliver = 0;
9957 int len;
9958
9959
9960 if (vport->port_state < LPFC_DISC_AUTH)
9961 return;
9962
9963
9964 if (fpin_length < sizeof(struct fc_els_fpin))
9965 return;
9966
9967
9968
9969
9970 len = be32_to_cpu(fpin->desc_len);
9971 if (fpin_length < len + sizeof(struct fc_els_fpin)) {
9972 lpfc_printf_log(phba, KERN_WARNING, LOG_CGN_MGMT,
9973 "4671 Bad ELS FPIN length %d: %d\n",
9974 len, fpin_length);
9975 return;
9976 }
9977
9978 tlv = (struct fc_tlv_desc *)&fpin->fpin_desc[0];
9979 first_tlv = tlv;
9980 bytes_remain = fpin_length - offsetof(struct fc_els_fpin, fpin_desc);
9981 bytes_remain = min_t(u32, bytes_remain, be32_to_cpu(fpin->desc_len));
9982
9983
9984 while (bytes_remain >= FC_TLV_DESC_HDR_SZ &&
9985 bytes_remain >= FC_TLV_DESC_SZ_FROM_LENGTH(tlv)) {
9986 dtag = be32_to_cpu(tlv->desc_tag);
9987 switch (dtag) {
9988 case ELS_DTAG_LNK_INTEGRITY:
9989 lpfc_els_rcv_fpin_li(phba, tlv);
9990 deliver = 1;
9991 break;
9992 case ELS_DTAG_DELIVERY:
9993 lpfc_els_rcv_fpin_del(phba, tlv);
9994 deliver = 1;
9995 break;
9996 case ELS_DTAG_PEER_CONGEST:
9997 lpfc_els_rcv_fpin_peer_cgn(phba, tlv);
9998 deliver = 1;
9999 break;
10000 case ELS_DTAG_CONGESTION:
10001 deliver = lpfc_els_rcv_fpin_cgn(phba, tlv);
10002 break;
10003 default:
10004 dtag_nm = lpfc_get_tlv_dtag_nm(dtag);
10005 lpfc_printf_log(phba, KERN_WARNING, LOG_CGN_MGMT,
10006 "4678 unknown FPIN descriptor[%d]: "
10007 "tag x%x (%s)\n",
10008 desc_cnt, dtag, dtag_nm);
10009
10010
10011 return;
10012 }
10013 lpfc_cgn_update_stat(phba, dtag);
10014 cnt = be32_to_cpu(tlv->desc_len);
10015
10016
10017
10018
10019 len -= (cnt + sizeof(struct fc_tlv_desc));
10020 if (len < 0) {
10021 dtag_nm = lpfc_get_tlv_dtag_nm(dtag);
10022 lpfc_printf_log(phba, KERN_WARNING, LOG_CGN_MGMT,
10023 "4672 Bad FPIN descriptor TLV length "
10024 "%d: %d %d %s\n",
10025 cnt, len, fpin_length, dtag_nm);
10026 return;
10027 }
10028
10029 current_tlv = tlv;
10030 bytes_remain -= FC_TLV_DESC_SZ_FROM_LENGTH(tlv);
10031 tlv = fc_tlv_next_desc(tlv);
10032
10033
10034
10035
10036 if (desc_cnt)
10037 memcpy(first_tlv, current_tlv,
10038 (cnt + sizeof(struct fc_els_fpin)));
10039
10040
10041
10042
10043 fpin_length = cnt + sizeof(struct fc_els_fpin);
10044 fpin->desc_len = cpu_to_be32(fpin_length);
10045 fpin_length += sizeof(struct fc_els_fpin);
10046
10047
10048 if (deliver)
10049 fc_host_fpin_rcv(lpfc_shost_from_vport(vport),
10050 fpin_length, (char *)fpin);
10051 desc_cnt++;
10052 }
10053 }
10054
10055
10056
10057
10058
10059
10060
10061
10062
10063
10064
10065
10066
10067
10068
10069 static void
10070 lpfc_els_unsol_buffer(struct lpfc_hba *phba, struct lpfc_sli_ring *pring,
10071 struct lpfc_vport *vport, struct lpfc_iocbq *elsiocb)
10072 {
10073 struct lpfc_nodelist *ndlp;
10074 struct ls_rjt stat;
10075 u32 *payload, payload_len;
10076 u32 cmd = 0, did = 0, newnode, status = 0;
10077 uint8_t rjt_exp, rjt_err = 0, init_link = 0;
10078 struct lpfc_wcqe_complete *wcqe_cmpl = NULL;
10079 LPFC_MBOXQ_t *mbox;
10080
10081 if (!vport || !elsiocb->cmd_dmabuf)
10082 goto dropit;
10083
10084 newnode = 0;
10085 wcqe_cmpl = &elsiocb->wcqe_cmpl;
10086 payload = elsiocb->cmd_dmabuf->virt;
10087 if (phba->sli_rev == LPFC_SLI_REV4)
10088 payload_len = wcqe_cmpl->total_data_placed;
10089 else
10090 payload_len = elsiocb->iocb.unsli3.rcvsli3.acc_len;
10091 status = get_job_ulpstatus(phba, elsiocb);
10092 cmd = *payload;
10093 if ((phba->sli3_options & LPFC_SLI3_HBQ_ENABLED) == 0)
10094 lpfc_sli3_post_buffer(phba, pring, 1);
10095
10096 did = get_job_els_rsp64_did(phba, elsiocb);
10097 if (status) {
10098 lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_UNSOL,
10099 "RCV Unsol ELS: status:x%x/x%x did:x%x",
10100 status, get_job_word4(phba, elsiocb), did);
10101 goto dropit;
10102 }
10103
10104
10105 if (lpfc_els_chk_latt(vport))
10106 goto dropit;
10107
10108
10109 if (vport->load_flag & FC_UNLOADING)
10110 goto dropit;
10111
10112
10113 if ((vport->fc_flag & FC_DISC_DELAYED) &&
10114 (cmd != ELS_CMD_PLOGI))
10115 goto dropit;
10116
10117 ndlp = lpfc_findnode_did(vport, did);
10118 if (!ndlp) {
10119
10120 ndlp = lpfc_nlp_init(vport, did);
10121 if (!ndlp)
10122 goto dropit;
10123 lpfc_nlp_set_state(vport, ndlp, NLP_STE_NPR_NODE);
10124 newnode = 1;
10125 if ((did & Fabric_DID_MASK) == Fabric_DID_MASK)
10126 ndlp->nlp_type |= NLP_FABRIC;
10127 } else if (ndlp->nlp_state == NLP_STE_UNUSED_NODE) {
10128 lpfc_nlp_set_state(vport, ndlp, NLP_STE_NPR_NODE);
10129 newnode = 1;
10130 }
10131
10132 phba->fc_stat.elsRcvFrame++;
10133
10134
10135
10136
10137
10138 spin_lock_irq(&ndlp->lock);
10139 if (ndlp->nlp_flag & NLP_IN_DEV_LOSS) {
10140 spin_unlock_irq(&ndlp->lock);
10141 if (newnode)
10142 lpfc_nlp_put(ndlp);
10143 goto dropit;
10144 }
10145 spin_unlock_irq(&ndlp->lock);
10146
10147 elsiocb->ndlp = lpfc_nlp_get(ndlp);
10148 if (!elsiocb->ndlp)
10149 goto dropit;
10150 elsiocb->vport = vport;
10151
10152 if ((cmd & ELS_CMD_MASK) == ELS_CMD_RSCN) {
10153 cmd &= ELS_CMD_MASK;
10154 }
10155
10156 lpfc_printf_vlog(vport, KERN_INFO, LOG_ELS,
10157 "0112 ELS command x%x received from NPORT x%x "
10158 "refcnt %d Data: x%x x%x x%x x%x\n",
10159 cmd, did, kref_read(&ndlp->kref), vport->port_state,
10160 vport->fc_flag, vport->fc_myDID, vport->fc_prevDID);
10161
10162
10163 if ((vport->port_state < LPFC_FABRIC_CFG_LINK) &&
10164 (cmd != ELS_CMD_FLOGI) &&
10165 !((cmd == ELS_CMD_PLOGI) && (vport->fc_flag & FC_PT2PT))) {
10166 rjt_err = LSRJT_LOGICAL_BSY;
10167 rjt_exp = LSEXP_NOTHING_MORE;
10168 goto lsrjt;
10169 }
10170
10171 switch (cmd) {
10172 case ELS_CMD_PLOGI:
10173 lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_UNSOL,
10174 "RCV PLOGI: did:x%x/ste:x%x flg:x%x",
10175 did, vport->port_state, ndlp->nlp_flag);
10176
10177 phba->fc_stat.elsRcvPLOGI++;
10178 ndlp = lpfc_plogi_confirm_nport(phba, payload, ndlp);
10179 if (phba->sli_rev == LPFC_SLI_REV4 &&
10180 (phba->pport->fc_flag & FC_PT2PT)) {
10181 vport->fc_prevDID = vport->fc_myDID;
10182
10183
10184
10185
10186 vport->fc_myDID =
10187 bf_get(els_rsp64_sid,
10188 &elsiocb->wqe.xmit_els_rsp);
10189 lpfc_printf_vlog(vport, KERN_INFO, LOG_ELS,
10190 "3312 Remote port assigned DID x%x "
10191 "%x\n", vport->fc_myDID,
10192 vport->fc_prevDID);
10193 }
10194
10195 lpfc_send_els_event(vport, ndlp, payload);
10196
10197
10198 if (vport->fc_flag & FC_DISC_DELAYED) {
10199 rjt_err = LSRJT_UNABLE_TPC;
10200 rjt_exp = LSEXP_NOTHING_MORE;
10201 break;
10202 }
10203
10204 if (vport->port_state < LPFC_DISC_AUTH) {
10205 if (!(phba->pport->fc_flag & FC_PT2PT) ||
10206 (phba->pport->fc_flag & FC_PT2PT_PLOGI)) {
10207 rjt_err = LSRJT_UNABLE_TPC;
10208 rjt_exp = LSEXP_NOTHING_MORE;
10209 break;
10210 }
10211 }
10212
10213 spin_lock_irq(&ndlp->lock);
10214 ndlp->nlp_flag &= ~NLP_TARGET_REMOVE;
10215 spin_unlock_irq(&ndlp->lock);
10216
10217 lpfc_disc_state_machine(vport, ndlp, elsiocb,
10218 NLP_EVT_RCV_PLOGI);
10219
10220 break;
10221 case ELS_CMD_FLOGI:
10222 lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_UNSOL,
10223 "RCV FLOGI: did:x%x/ste:x%x flg:x%x",
10224 did, vport->port_state, ndlp->nlp_flag);
10225
10226 phba->fc_stat.elsRcvFLOGI++;
10227
10228
10229
10230
10231 if (vport->port_state >= LPFC_LOCAL_CFG_LINK &&
10232 vport->fc_flag & FC_PT2PT &&
10233 vport->rcv_flogi_cnt >= 1) {
10234 rjt_err = LSRJT_LOGICAL_BSY;
10235 rjt_exp = LSEXP_NOTHING_MORE;
10236 init_link++;
10237 goto lsrjt;
10238 }
10239
10240 lpfc_els_rcv_flogi(vport, elsiocb, ndlp);
10241
10242 if (phba->defer_flogi_acc_flag)
10243 break;
10244 if (newnode)
10245 lpfc_disc_state_machine(vport, ndlp, NULL,
10246 NLP_EVT_DEVICE_RM);
10247 break;
10248 case ELS_CMD_LOGO:
10249 lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_UNSOL,
10250 "RCV LOGO: did:x%x/ste:x%x flg:x%x",
10251 did, vport->port_state, ndlp->nlp_flag);
10252
10253 phba->fc_stat.elsRcvLOGO++;
10254 lpfc_send_els_event(vport, ndlp, payload);
10255 if (vport->port_state < LPFC_DISC_AUTH) {
10256 rjt_err = LSRJT_UNABLE_TPC;
10257 rjt_exp = LSEXP_NOTHING_MORE;
10258 break;
10259 }
10260 lpfc_disc_state_machine(vport, ndlp, elsiocb, NLP_EVT_RCV_LOGO);
10261 if (newnode)
10262 lpfc_disc_state_machine(vport, ndlp, NULL,
10263 NLP_EVT_DEVICE_RM);
10264 break;
10265 case ELS_CMD_PRLO:
10266 lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_UNSOL,
10267 "RCV PRLO: did:x%x/ste:x%x flg:x%x",
10268 did, vport->port_state, ndlp->nlp_flag);
10269
10270 phba->fc_stat.elsRcvPRLO++;
10271 lpfc_send_els_event(vport, ndlp, payload);
10272 if (vport->port_state < LPFC_DISC_AUTH) {
10273 rjt_err = LSRJT_UNABLE_TPC;
10274 rjt_exp = LSEXP_NOTHING_MORE;
10275 break;
10276 }
10277 lpfc_disc_state_machine(vport, ndlp, elsiocb, NLP_EVT_RCV_PRLO);
10278 break;
10279 case ELS_CMD_LCB:
10280 phba->fc_stat.elsRcvLCB++;
10281 lpfc_els_rcv_lcb(vport, elsiocb, ndlp);
10282 break;
10283 case ELS_CMD_RDP:
10284 phba->fc_stat.elsRcvRDP++;
10285 lpfc_els_rcv_rdp(vport, elsiocb, ndlp);
10286 break;
10287 case ELS_CMD_RSCN:
10288 phba->fc_stat.elsRcvRSCN++;
10289 lpfc_els_rcv_rscn(vport, elsiocb, ndlp);
10290 if (newnode)
10291 lpfc_disc_state_machine(vport, ndlp, NULL,
10292 NLP_EVT_DEVICE_RM);
10293 break;
10294 case ELS_CMD_ADISC:
10295 lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_UNSOL,
10296 "RCV ADISC: did:x%x/ste:x%x flg:x%x",
10297 did, vport->port_state, ndlp->nlp_flag);
10298
10299 lpfc_send_els_event(vport, ndlp, payload);
10300 phba->fc_stat.elsRcvADISC++;
10301 if (vport->port_state < LPFC_DISC_AUTH) {
10302 rjt_err = LSRJT_UNABLE_TPC;
10303 rjt_exp = LSEXP_NOTHING_MORE;
10304 break;
10305 }
10306 lpfc_disc_state_machine(vport, ndlp, elsiocb,
10307 NLP_EVT_RCV_ADISC);
10308 break;
10309 case ELS_CMD_PDISC:
10310 lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_UNSOL,
10311 "RCV PDISC: did:x%x/ste:x%x flg:x%x",
10312 did, vport->port_state, ndlp->nlp_flag);
10313
10314 phba->fc_stat.elsRcvPDISC++;
10315 if (vport->port_state < LPFC_DISC_AUTH) {
10316 rjt_err = LSRJT_UNABLE_TPC;
10317 rjt_exp = LSEXP_NOTHING_MORE;
10318 break;
10319 }
10320 lpfc_disc_state_machine(vport, ndlp, elsiocb,
10321 NLP_EVT_RCV_PDISC);
10322 break;
10323 case ELS_CMD_FARPR:
10324 lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_UNSOL,
10325 "RCV FARPR: did:x%x/ste:x%x flg:x%x",
10326 did, vport->port_state, ndlp->nlp_flag);
10327
10328 phba->fc_stat.elsRcvFARPR++;
10329 lpfc_els_rcv_farpr(vport, elsiocb, ndlp);
10330 break;
10331 case ELS_CMD_FARP:
10332 lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_UNSOL,
10333 "RCV FARP: did:x%x/ste:x%x flg:x%x",
10334 did, vport->port_state, ndlp->nlp_flag);
10335
10336 phba->fc_stat.elsRcvFARP++;
10337 lpfc_els_rcv_farp(vport, elsiocb, ndlp);
10338 break;
10339 case ELS_CMD_FAN:
10340 lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_UNSOL,
10341 "RCV FAN: did:x%x/ste:x%x flg:x%x",
10342 did, vport->port_state, ndlp->nlp_flag);
10343
10344 phba->fc_stat.elsRcvFAN++;
10345 lpfc_els_rcv_fan(vport, elsiocb, ndlp);
10346 break;
10347 case ELS_CMD_PRLI:
10348 case ELS_CMD_NVMEPRLI:
10349 lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_UNSOL,
10350 "RCV PRLI: did:x%x/ste:x%x flg:x%x",
10351 did, vport->port_state, ndlp->nlp_flag);
10352
10353 phba->fc_stat.elsRcvPRLI++;
10354 if ((vport->port_state < LPFC_DISC_AUTH) &&
10355 (vport->fc_flag & FC_FABRIC)) {
10356 rjt_err = LSRJT_UNABLE_TPC;
10357 rjt_exp = LSEXP_NOTHING_MORE;
10358 break;
10359 }
10360 lpfc_disc_state_machine(vport, ndlp, elsiocb, NLP_EVT_RCV_PRLI);
10361 break;
10362 case ELS_CMD_LIRR:
10363 lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_UNSOL,
10364 "RCV LIRR: did:x%x/ste:x%x flg:x%x",
10365 did, vport->port_state, ndlp->nlp_flag);
10366
10367 phba->fc_stat.elsRcvLIRR++;
10368 lpfc_els_rcv_lirr(vport, elsiocb, ndlp);
10369 if (newnode)
10370 lpfc_disc_state_machine(vport, ndlp, NULL,
10371 NLP_EVT_DEVICE_RM);
10372 break;
10373 case ELS_CMD_RLS:
10374 lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_UNSOL,
10375 "RCV RLS: did:x%x/ste:x%x flg:x%x",
10376 did, vport->port_state, ndlp->nlp_flag);
10377
10378 phba->fc_stat.elsRcvRLS++;
10379 lpfc_els_rcv_rls(vport, elsiocb, ndlp);
10380 if (newnode)
10381 lpfc_disc_state_machine(vport, ndlp, NULL,
10382 NLP_EVT_DEVICE_RM);
10383 break;
10384 case ELS_CMD_RPL:
10385 lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_UNSOL,
10386 "RCV RPL: did:x%x/ste:x%x flg:x%x",
10387 did, vport->port_state, ndlp->nlp_flag);
10388
10389 phba->fc_stat.elsRcvRPL++;
10390 lpfc_els_rcv_rpl(vport, elsiocb, ndlp);
10391 if (newnode)
10392 lpfc_disc_state_machine(vport, ndlp, NULL,
10393 NLP_EVT_DEVICE_RM);
10394 break;
10395 case ELS_CMD_RNID:
10396 lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_UNSOL,
10397 "RCV RNID: did:x%x/ste:x%x flg:x%x",
10398 did, vport->port_state, ndlp->nlp_flag);
10399
10400 phba->fc_stat.elsRcvRNID++;
10401 lpfc_els_rcv_rnid(vport, elsiocb, ndlp);
10402 if (newnode)
10403 lpfc_disc_state_machine(vport, ndlp, NULL,
10404 NLP_EVT_DEVICE_RM);
10405 break;
10406 case ELS_CMD_RTV:
10407 lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_UNSOL,
10408 "RCV RTV: did:x%x/ste:x%x flg:x%x",
10409 did, vport->port_state, ndlp->nlp_flag);
10410 phba->fc_stat.elsRcvRTV++;
10411 lpfc_els_rcv_rtv(vport, elsiocb, ndlp);
10412 if (newnode)
10413 lpfc_disc_state_machine(vport, ndlp, NULL,
10414 NLP_EVT_DEVICE_RM);
10415 break;
10416 case ELS_CMD_RRQ:
10417 lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_UNSOL,
10418 "RCV RRQ: did:x%x/ste:x%x flg:x%x",
10419 did, vport->port_state, ndlp->nlp_flag);
10420
10421 phba->fc_stat.elsRcvRRQ++;
10422 lpfc_els_rcv_rrq(vport, elsiocb, ndlp);
10423 if (newnode)
10424 lpfc_disc_state_machine(vport, ndlp, NULL,
10425 NLP_EVT_DEVICE_RM);
10426 break;
10427 case ELS_CMD_ECHO:
10428 lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_UNSOL,
10429 "RCV ECHO: did:x%x/ste:x%x flg:x%x",
10430 did, vport->port_state, ndlp->nlp_flag);
10431
10432 phba->fc_stat.elsRcvECHO++;
10433 lpfc_els_rcv_echo(vport, elsiocb, ndlp);
10434 if (newnode)
10435 lpfc_disc_state_machine(vport, ndlp, NULL,
10436 NLP_EVT_DEVICE_RM);
10437 break;
10438 case ELS_CMD_REC:
10439
10440 rjt_err = LSRJT_UNABLE_TPC;
10441 rjt_exp = LSEXP_INVALID_OX_RX;
10442 break;
10443 case ELS_CMD_FPIN:
10444 lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_UNSOL,
10445 "RCV FPIN: did:x%x/ste:x%x flg:x%x",
10446 did, vport->port_state, ndlp->nlp_flag);
10447
10448 lpfc_els_rcv_fpin(vport, (struct fc_els_fpin *)payload,
10449 payload_len);
10450
10451
10452 break;
10453 case ELS_CMD_EDC:
10454 lpfc_els_rcv_edc(vport, elsiocb, ndlp);
10455 break;
10456 case ELS_CMD_RDF:
10457 phba->fc_stat.elsRcvRDF++;
10458
10459 if (did != Fabric_Cntl_DID) {
10460 lpfc_printf_vlog(vport, KERN_WARNING, LOG_ELS,
10461 "1115 Received RDF from invalid DID "
10462 "x%x\n", did);
10463 rjt_err = LSRJT_PROTOCOL_ERR;
10464 rjt_exp = LSEXP_NOTHING_MORE;
10465 goto lsrjt;
10466 }
10467
10468 lpfc_els_rcv_rdf(vport, elsiocb, ndlp);
10469 break;
10470 default:
10471 lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_UNSOL,
10472 "RCV ELS cmd: cmd:x%x did:x%x/ste:x%x",
10473 cmd, did, vport->port_state);
10474
10475
10476 rjt_err = LSRJT_CMD_UNSUPPORTED;
10477 rjt_exp = LSEXP_NOTHING_MORE;
10478
10479
10480 lpfc_printf_vlog(vport, KERN_ERR, LOG_TRACE_EVENT,
10481 "0115 Unknown ELS command x%x "
10482 "received from NPORT x%x\n", cmd, did);
10483 if (newnode)
10484 lpfc_disc_state_machine(vport, ndlp, NULL,
10485 NLP_EVT_DEVICE_RM);
10486 break;
10487 }
10488
10489 lsrjt:
10490
10491 if (rjt_err) {
10492 memset(&stat, 0, sizeof(stat));
10493 stat.un.b.lsRjtRsnCode = rjt_err;
10494 stat.un.b.lsRjtRsnCodeExp = rjt_exp;
10495 lpfc_els_rsp_reject(vport, stat.un.lsRjtError, elsiocb, ndlp,
10496 NULL);
10497
10498 if (newnode)
10499 lpfc_disc_state_machine(vport, ndlp, NULL,
10500 NLP_EVT_DEVICE_RM);
10501 }
10502
10503
10504 lpfc_nlp_put(elsiocb->ndlp);
10505 elsiocb->ndlp = NULL;
10506
10507
10508
10509
10510
10511 if (init_link) {
10512 mbox = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL);
10513 if (!mbox)
10514 return;
10515 lpfc_linkdown(phba);
10516 lpfc_init_link(phba, mbox,
10517 phba->cfg_topology,
10518 phba->cfg_link_speed);
10519 mbox->u.mb.un.varInitLnk.lipsr_AL_PA = 0;
10520 mbox->mbox_cmpl = lpfc_sli_def_mbox_cmpl;
10521 mbox->vport = vport;
10522 if (lpfc_sli_issue_mbox(phba, mbox, MBX_NOWAIT) ==
10523 MBX_NOT_FINISHED)
10524 mempool_free(mbox, phba->mbox_mem_pool);
10525 }
10526
10527 return;
10528
10529 dropit:
10530 if (vport && !(vport->load_flag & FC_UNLOADING))
10531 lpfc_printf_vlog(vport, KERN_ERR, LOG_TRACE_EVENT,
10532 "0111 Dropping received ELS cmd "
10533 "Data: x%x x%x x%x x%x\n",
10534 cmd, status, get_job_word4(phba, elsiocb), did);
10535
10536 phba->fc_stat.elsRcvDrop++;
10537 }
10538
10539
10540
10541
10542
10543
10544
10545
10546
10547
10548
10549
10550
10551 void
10552 lpfc_els_unsol_event(struct lpfc_hba *phba, struct lpfc_sli_ring *pring,
10553 struct lpfc_iocbq *elsiocb)
10554 {
10555 struct lpfc_vport *vport = elsiocb->vport;
10556 u32 ulp_command, status, parameter, bde_count = 0;
10557 IOCB_t *icmd;
10558 struct lpfc_wcqe_complete *wcqe_cmpl = NULL;
10559 struct lpfc_dmabuf *bdeBuf1 = elsiocb->cmd_dmabuf;
10560 struct lpfc_dmabuf *bdeBuf2 = elsiocb->bpl_dmabuf;
10561 dma_addr_t paddr;
10562
10563 elsiocb->cmd_dmabuf = NULL;
10564 elsiocb->rsp_dmabuf = NULL;
10565 elsiocb->bpl_dmabuf = NULL;
10566
10567 wcqe_cmpl = &elsiocb->wcqe_cmpl;
10568 ulp_command = get_job_cmnd(phba, elsiocb);
10569 status = get_job_ulpstatus(phba, elsiocb);
10570 parameter = get_job_word4(phba, elsiocb);
10571 if (phba->sli_rev == LPFC_SLI_REV4)
10572 bde_count = wcqe_cmpl->word3;
10573 else
10574 bde_count = elsiocb->iocb.ulpBdeCount;
10575
10576 if (status == IOSTAT_NEED_BUFFER) {
10577 lpfc_sli_hbqbuf_add_hbqs(phba, LPFC_ELS_HBQ);
10578 } else if (status == IOSTAT_LOCAL_REJECT &&
10579 (parameter & IOERR_PARAM_MASK) ==
10580 IOERR_RCV_BUFFER_WAITING) {
10581 phba->fc_stat.NoRcvBuf++;
10582
10583 if (!(phba->sli3_options & LPFC_SLI3_HBQ_ENABLED))
10584 lpfc_sli3_post_buffer(phba, pring, 0);
10585 return;
10586 }
10587
10588 if (phba->sli_rev == LPFC_SLI_REV3) {
10589 icmd = &elsiocb->iocb;
10590 if ((phba->sli3_options & LPFC_SLI3_NPIV_ENABLED) &&
10591 (ulp_command == CMD_IOCB_RCV_ELS64_CX ||
10592 ulp_command == CMD_IOCB_RCV_SEQ64_CX)) {
10593 if (icmd->unsli3.rcvsli3.vpi == 0xffff)
10594 vport = phba->pport;
10595 else
10596 vport = lpfc_find_vport_by_vpid(phba,
10597 icmd->unsli3.rcvsli3.vpi);
10598 }
10599 }
10600
10601
10602
10603
10604 if (bde_count == 0)
10605 return;
10606
10607
10608 if (phba->sli3_options & LPFC_SLI3_HBQ_ENABLED) {
10609 elsiocb->cmd_dmabuf = bdeBuf1;
10610 if (bde_count == 2)
10611 elsiocb->bpl_dmabuf = bdeBuf2;
10612 } else {
10613 icmd = &elsiocb->iocb;
10614 paddr = getPaddr(icmd->un.cont64[0].addrHigh,
10615 icmd->un.cont64[0].addrLow);
10616 elsiocb->cmd_dmabuf = lpfc_sli_ringpostbuf_get(phba, pring,
10617 paddr);
10618 if (bde_count == 2) {
10619 paddr = getPaddr(icmd->un.cont64[1].addrHigh,
10620 icmd->un.cont64[1].addrLow);
10621 elsiocb->bpl_dmabuf = lpfc_sli_ringpostbuf_get(phba,
10622 pring,
10623 paddr);
10624 }
10625 }
10626
10627 lpfc_els_unsol_buffer(phba, pring, vport, elsiocb);
10628
10629
10630
10631
10632 if (elsiocb->cmd_dmabuf) {
10633 lpfc_in_buf_free(phba, elsiocb->cmd_dmabuf);
10634 elsiocb->cmd_dmabuf = NULL;
10635 }
10636
10637 if (elsiocb->bpl_dmabuf) {
10638 lpfc_in_buf_free(phba, elsiocb->bpl_dmabuf);
10639 elsiocb->bpl_dmabuf = NULL;
10640 }
10641
10642 }
10643
10644 static void
10645 lpfc_start_fdmi(struct lpfc_vport *vport)
10646 {
10647 struct lpfc_nodelist *ndlp;
10648
10649
10650
10651
10652
10653 ndlp = lpfc_findnode_did(vport, FDMI_DID);
10654 if (!ndlp) {
10655 ndlp = lpfc_nlp_init(vport, FDMI_DID);
10656 if (ndlp) {
10657 ndlp->nlp_type |= NLP_FABRIC;
10658 } else {
10659 return;
10660 }
10661 }
10662
10663 lpfc_nlp_set_state(vport, ndlp, NLP_STE_PLOGI_ISSUE);
10664 lpfc_issue_els_plogi(vport, ndlp->nlp_DID, 0);
10665 }
10666
10667
10668
10669
10670
10671
10672
10673
10674
10675
10676
10677
10678
10679
10680 void
10681 lpfc_do_scr_ns_plogi(struct lpfc_hba *phba, struct lpfc_vport *vport)
10682 {
10683 struct lpfc_nodelist *ndlp;
10684 struct Scsi_Host *shost = lpfc_shost_from_vport(vport);
10685
10686
10687
10688
10689
10690
10691 spin_lock_irq(shost->host_lock);
10692 if (vport->fc_flag & FC_DISC_DELAYED) {
10693 spin_unlock_irq(shost->host_lock);
10694 lpfc_printf_vlog(vport, KERN_ERR, LOG_TRACE_EVENT,
10695 "3334 Delay fc port discovery for %d secs\n",
10696 phba->fc_ratov);
10697 mod_timer(&vport->delayed_disc_tmo,
10698 jiffies + msecs_to_jiffies(1000 * phba->fc_ratov));
10699 return;
10700 }
10701 spin_unlock_irq(shost->host_lock);
10702
10703 ndlp = lpfc_findnode_did(vport, NameServer_DID);
10704 if (!ndlp) {
10705 ndlp = lpfc_nlp_init(vport, NameServer_DID);
10706 if (!ndlp) {
10707 if (phba->fc_topology == LPFC_TOPOLOGY_LOOP) {
10708 lpfc_disc_start(vport);
10709 return;
10710 }
10711 lpfc_vport_set_state(vport, FC_VPORT_FAILED);
10712 lpfc_printf_vlog(vport, KERN_ERR, LOG_TRACE_EVENT,
10713 "0251 NameServer login: no memory\n");
10714 return;
10715 }
10716 }
10717
10718 ndlp->nlp_type |= NLP_FABRIC;
10719
10720 lpfc_nlp_set_state(vport, ndlp, NLP_STE_PLOGI_ISSUE);
10721
10722 if (lpfc_issue_els_plogi(vport, ndlp->nlp_DID, 0)) {
10723 lpfc_vport_set_state(vport, FC_VPORT_FAILED);
10724 lpfc_printf_vlog(vport, KERN_ERR, LOG_TRACE_EVENT,
10725 "0252 Cannot issue NameServer login\n");
10726 return;
10727 }
10728
10729 if ((phba->cfg_enable_SmartSAN ||
10730 (phba->cfg_fdmi_on == LPFC_FDMI_SUPPORT)) &&
10731 (vport->load_flag & FC_ALLOW_FDMI))
10732 lpfc_start_fdmi(vport);
10733 }
10734
10735
10736
10737
10738
10739
10740
10741
10742
10743
10744
10745
10746
10747 static void
10748 lpfc_cmpl_reg_new_vport(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmb)
10749 {
10750 struct lpfc_vport *vport = pmb->vport;
10751 struct Scsi_Host *shost = lpfc_shost_from_vport(vport);
10752 struct lpfc_nodelist *ndlp = pmb->ctx_ndlp;
10753 MAILBOX_t *mb = &pmb->u.mb;
10754 int rc;
10755
10756 spin_lock_irq(shost->host_lock);
10757 vport->fc_flag &= ~FC_VPORT_NEEDS_REG_VPI;
10758 spin_unlock_irq(shost->host_lock);
10759
10760 if (mb->mbxStatus) {
10761 lpfc_printf_vlog(vport, KERN_ERR, LOG_TRACE_EVENT,
10762 "0915 Register VPI failed : Status: x%x"
10763 " upd bit: x%x \n", mb->mbxStatus,
10764 mb->un.varRegVpi.upd);
10765 if (phba->sli_rev == LPFC_SLI_REV4 &&
10766 mb->un.varRegVpi.upd)
10767 goto mbox_err_exit ;
10768
10769 switch (mb->mbxStatus) {
10770 case 0x11:
10771 case 0x9603:
10772 case 0x9602:
10773
10774 lpfc_vport_set_state(vport, FC_VPORT_FAILED);
10775 spin_lock_irq(shost->host_lock);
10776 vport->fc_flag &= ~(FC_FABRIC | FC_PUBLIC_LOOP);
10777 spin_unlock_irq(shost->host_lock);
10778 lpfc_can_disctmo(vport);
10779 break;
10780
10781 case 0x20:
10782 spin_lock_irq(shost->host_lock);
10783 vport->fc_flag |= FC_VPORT_NEEDS_REG_VPI;
10784 spin_unlock_irq(shost->host_lock);
10785 lpfc_init_vpi(phba, pmb, vport->vpi);
10786 pmb->vport = vport;
10787 pmb->mbox_cmpl = lpfc_init_vpi_cmpl;
10788 rc = lpfc_sli_issue_mbox(phba, pmb,
10789 MBX_NOWAIT);
10790 if (rc == MBX_NOT_FINISHED) {
10791 lpfc_printf_vlog(vport, KERN_ERR,
10792 LOG_TRACE_EVENT,
10793 "2732 Failed to issue INIT_VPI"
10794 " mailbox command\n");
10795 } else {
10796 lpfc_nlp_put(ndlp);
10797 return;
10798 }
10799 fallthrough;
10800 default:
10801
10802 if (phba->sli_rev == LPFC_SLI_REV4)
10803 lpfc_sli4_unreg_all_rpis(vport);
10804 lpfc_mbx_unreg_vpi(vport);
10805 spin_lock_irq(shost->host_lock);
10806 vport->fc_flag |= FC_VPORT_NEEDS_REG_VPI;
10807 spin_unlock_irq(shost->host_lock);
10808 if (mb->mbxStatus == MBX_NOT_FINISHED)
10809 break;
10810 if ((vport->port_type == LPFC_PHYSICAL_PORT) &&
10811 !(vport->fc_flag & FC_LOGO_RCVD_DID_CHNG)) {
10812 if (phba->sli_rev == LPFC_SLI_REV4)
10813 lpfc_issue_init_vfi(vport);
10814 else
10815 lpfc_initial_flogi(vport);
10816 } else {
10817 lpfc_initial_fdisc(vport);
10818 }
10819 break;
10820 }
10821 } else {
10822 spin_lock_irq(shost->host_lock);
10823 vport->vpi_state |= LPFC_VPI_REGISTERED;
10824 spin_unlock_irq(shost->host_lock);
10825 if (vport == phba->pport) {
10826 if (phba->sli_rev < LPFC_SLI_REV4)
10827 lpfc_issue_fabric_reglogin(vport);
10828 else {
10829
10830
10831
10832
10833 if (vport->port_state != LPFC_FDISC)
10834 lpfc_start_fdiscs(phba);
10835 lpfc_do_scr_ns_plogi(phba, vport);
10836 }
10837 } else {
10838 lpfc_do_scr_ns_plogi(phba, vport);
10839 }
10840 }
10841 mbox_err_exit:
10842
10843
10844
10845 lpfc_nlp_put(ndlp);
10846
10847 mempool_free(pmb, phba->mbox_mem_pool);
10848 return;
10849 }
10850
10851
10852
10853
10854
10855
10856
10857
10858
10859
10860 void
10861 lpfc_register_new_vport(struct lpfc_hba *phba, struct lpfc_vport *vport,
10862 struct lpfc_nodelist *ndlp)
10863 {
10864 struct Scsi_Host *shost = lpfc_shost_from_vport(vport);
10865 LPFC_MBOXQ_t *mbox;
10866
10867 mbox = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL);
10868 if (mbox) {
10869 lpfc_reg_vpi(vport, mbox);
10870 mbox->vport = vport;
10871 mbox->ctx_ndlp = lpfc_nlp_get(ndlp);
10872 if (!mbox->ctx_ndlp) {
10873 mempool_free(mbox, phba->mbox_mem_pool);
10874 goto mbox_err_exit;
10875 }
10876
10877 mbox->mbox_cmpl = lpfc_cmpl_reg_new_vport;
10878 if (lpfc_sli_issue_mbox(phba, mbox, MBX_NOWAIT)
10879 == MBX_NOT_FINISHED) {
10880
10881
10882
10883 lpfc_nlp_put(ndlp);
10884 mempool_free(mbox, phba->mbox_mem_pool);
10885
10886 lpfc_printf_vlog(vport, KERN_ERR, LOG_TRACE_EVENT,
10887 "0253 Register VPI: Can't send mbox\n");
10888 goto mbox_err_exit;
10889 }
10890 } else {
10891 lpfc_printf_vlog(vport, KERN_ERR, LOG_TRACE_EVENT,
10892 "0254 Register VPI: no memory\n");
10893 goto mbox_err_exit;
10894 }
10895 return;
10896
10897 mbox_err_exit:
10898 lpfc_vport_set_state(vport, FC_VPORT_FAILED);
10899 spin_lock_irq(shost->host_lock);
10900 vport->fc_flag &= ~FC_VPORT_NEEDS_REG_VPI;
10901 spin_unlock_irq(shost->host_lock);
10902 return;
10903 }
10904
10905
10906
10907
10908
10909
10910
10911 void
10912 lpfc_cancel_all_vport_retry_delay_timer(struct lpfc_hba *phba)
10913 {
10914 struct lpfc_vport **vports;
10915 struct lpfc_nodelist *ndlp;
10916 uint32_t link_state;
10917 int i;
10918
10919
10920 link_state = phba->link_state;
10921 lpfc_linkdown(phba);
10922 phba->link_state = link_state;
10923
10924 vports = lpfc_create_vport_work_array(phba);
10925
10926 if (vports) {
10927 for (i = 0; i <= phba->max_vports && vports[i] != NULL; i++) {
10928 ndlp = lpfc_findnode_did(vports[i], Fabric_DID);
10929 if (ndlp)
10930 lpfc_cancel_retry_delay_tmo(vports[i], ndlp);
10931 lpfc_els_flush_cmd(vports[i]);
10932 }
10933 lpfc_destroy_vport_work_array(phba, vports);
10934 }
10935 }
10936
10937
10938
10939
10940
10941
10942
10943
10944
10945 void
10946 lpfc_retry_pport_discovery(struct lpfc_hba *phba)
10947 {
10948 struct lpfc_nodelist *ndlp;
10949
10950
10951 lpfc_cancel_all_vport_retry_delay_timer(phba);
10952
10953
10954 ndlp = lpfc_findnode_did(phba->pport, Fabric_DID);
10955 if (!ndlp)
10956 return;
10957
10958 mod_timer(&ndlp->nlp_delayfunc, jiffies + msecs_to_jiffies(1000));
10959 spin_lock_irq(&ndlp->lock);
10960 ndlp->nlp_flag |= NLP_DELAY_TMO;
10961 spin_unlock_irq(&ndlp->lock);
10962 ndlp->nlp_last_elscmd = ELS_CMD_FLOGI;
10963 phba->pport->port_state = LPFC_FLOGI;
10964 return;
10965 }
10966
10967
10968
10969
10970
10971
10972
10973
10974
10975
10976 static int
10977 lpfc_fabric_login_reqd(struct lpfc_hba *phba,
10978 struct lpfc_iocbq *cmdiocb,
10979 struct lpfc_iocbq *rspiocb)
10980 {
10981 u32 ulp_status = get_job_ulpstatus(phba, rspiocb);
10982 u32 ulp_word4 = get_job_word4(phba, rspiocb);
10983
10984 if (ulp_status != IOSTAT_FABRIC_RJT ||
10985 ulp_word4 != RJT_LOGIN_REQUIRED)
10986 return 0;
10987 else
10988 return 1;
10989 }
10990
10991
10992
10993
10994
10995
10996
10997
10998
10999
11000
11001
11002
11003
11004
11005
11006
11007
11008
11009
11010
11011 static void
11012 lpfc_cmpl_els_fdisc(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
11013 struct lpfc_iocbq *rspiocb)
11014 {
11015 struct lpfc_vport *vport = cmdiocb->vport;
11016 struct Scsi_Host *shost = lpfc_shost_from_vport(vport);
11017 struct lpfc_nodelist *ndlp = cmdiocb->ndlp;
11018 struct lpfc_nodelist *np;
11019 struct lpfc_nodelist *next_np;
11020 struct lpfc_iocbq *piocb;
11021 struct lpfc_dmabuf *pcmd = cmdiocb->cmd_dmabuf, *prsp;
11022 struct serv_parm *sp;
11023 uint8_t fabric_param_changed;
11024 u32 ulp_status, ulp_word4;
11025
11026 ulp_status = get_job_ulpstatus(phba, rspiocb);
11027 ulp_word4 = get_job_word4(phba, rspiocb);
11028
11029 lpfc_printf_vlog(vport, KERN_INFO, LOG_ELS,
11030 "0123 FDISC completes. x%x/x%x prevDID: x%x\n",
11031 ulp_status, ulp_word4,
11032 vport->fc_prevDID);
11033
11034
11035
11036
11037 list_for_each_entry(piocb, &phba->fabric_iocb_list, list) {
11038 lpfc_set_disctmo(piocb->vport);
11039 }
11040
11041 lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_CMD,
11042 "FDISC cmpl: status:x%x/x%x prevdid:x%x",
11043 ulp_status, ulp_word4, vport->fc_prevDID);
11044
11045 if (ulp_status) {
11046
11047 if (lpfc_fabric_login_reqd(phba, cmdiocb, rspiocb)) {
11048 lpfc_retry_pport_discovery(phba);
11049 goto out;
11050 }
11051
11052
11053 if (lpfc_els_retry(phba, cmdiocb, rspiocb))
11054 goto out;
11055
11056 lpfc_printf_vlog(vport, KERN_ERR, LOG_TRACE_EVENT,
11057 "0126 FDISC failed. (x%x/x%x)\n",
11058 ulp_status, ulp_word4);
11059 goto fdisc_failed;
11060 }
11061
11062 lpfc_check_nlp_post_devloss(vport, ndlp);
11063
11064 spin_lock_irq(shost->host_lock);
11065 vport->fc_flag &= ~FC_VPORT_CVL_RCVD;
11066 vport->fc_flag &= ~FC_VPORT_LOGO_RCVD;
11067 vport->fc_flag |= FC_FABRIC;
11068 if (vport->phba->fc_topology == LPFC_TOPOLOGY_LOOP)
11069 vport->fc_flag |= FC_PUBLIC_LOOP;
11070 spin_unlock_irq(shost->host_lock);
11071
11072 vport->fc_myDID = ulp_word4 & Mask_DID;
11073 lpfc_vport_set_state(vport, FC_VPORT_ACTIVE);
11074 prsp = list_get_first(&pcmd->list, struct lpfc_dmabuf, list);
11075 if (!prsp)
11076 goto out;
11077 sp = prsp->virt + sizeof(uint32_t);
11078 fabric_param_changed = lpfc_check_clean_addr_bit(vport, sp);
11079 memcpy(&vport->fabric_portname, &sp->portName,
11080 sizeof(struct lpfc_name));
11081 memcpy(&vport->fabric_nodename, &sp->nodeName,
11082 sizeof(struct lpfc_name));
11083 if (fabric_param_changed &&
11084 !(vport->fc_flag & FC_VPORT_NEEDS_REG_VPI)) {
11085
11086
11087
11088
11089 list_for_each_entry_safe(np, next_np,
11090 &vport->fc_nodes, nlp_listp) {
11091 if ((np->nlp_state != NLP_STE_NPR_NODE) ||
11092 !(np->nlp_flag & NLP_NPR_ADISC))
11093 continue;
11094 spin_lock_irq(&ndlp->lock);
11095 np->nlp_flag &= ~NLP_NPR_ADISC;
11096 spin_unlock_irq(&ndlp->lock);
11097 lpfc_unreg_rpi(vport, np);
11098 }
11099 lpfc_cleanup_pending_mbox(vport);
11100
11101 if (phba->sli_rev == LPFC_SLI_REV4)
11102 lpfc_sli4_unreg_all_rpis(vport);
11103
11104 lpfc_mbx_unreg_vpi(vport);
11105 spin_lock_irq(shost->host_lock);
11106 vport->fc_flag |= FC_VPORT_NEEDS_REG_VPI;
11107 if (phba->sli_rev == LPFC_SLI_REV4)
11108 vport->fc_flag |= FC_VPORT_NEEDS_INIT_VPI;
11109 else
11110 vport->fc_flag |= FC_LOGO_RCVD_DID_CHNG;
11111 spin_unlock_irq(shost->host_lock);
11112 } else if ((phba->sli_rev == LPFC_SLI_REV4) &&
11113 !(vport->fc_flag & FC_VPORT_NEEDS_REG_VPI)) {
11114
11115
11116
11117
11118 lpfc_register_new_vport(phba, vport, ndlp);
11119 lpfc_nlp_set_state(vport, ndlp, NLP_STE_UNMAPPED_NODE);
11120 goto out;
11121 }
11122
11123 if (vport->fc_flag & FC_VPORT_NEEDS_INIT_VPI)
11124 lpfc_issue_init_vpi(vport);
11125 else if (vport->fc_flag & FC_VPORT_NEEDS_REG_VPI)
11126 lpfc_register_new_vport(phba, vport, ndlp);
11127 else
11128 lpfc_do_scr_ns_plogi(phba, vport);
11129
11130
11131
11132
11133 lpfc_nlp_set_state(vport, ndlp, NLP_STE_UNMAPPED_NODE);
11134 goto out;
11135
11136 fdisc_failed:
11137 if (vport->fc_vport &&
11138 (vport->fc_vport->vport_state != FC_VPORT_NO_FABRIC_RSCS))
11139 lpfc_vport_set_state(vport, FC_VPORT_FAILED);
11140
11141 lpfc_can_disctmo(vport);
11142 out:
11143 lpfc_els_free_iocb(phba, cmdiocb);
11144 lpfc_nlp_put(ndlp);
11145 }
11146
11147
11148
11149
11150
11151
11152
11153
11154
11155
11156
11157
11158
11159
11160
11161
11162
11163
11164
11165
11166 static int
11167 lpfc_issue_els_fdisc(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
11168 uint8_t retry)
11169 {
11170 struct lpfc_hba *phba = vport->phba;
11171 IOCB_t *icmd;
11172 union lpfc_wqe128 *wqe = NULL;
11173 struct lpfc_iocbq *elsiocb;
11174 struct serv_parm *sp;
11175 uint8_t *pcmd;
11176 uint16_t cmdsize;
11177 int did = ndlp->nlp_DID;
11178 int rc;
11179
11180 vport->port_state = LPFC_FDISC;
11181 vport->fc_myDID = 0;
11182 cmdsize = (sizeof(uint32_t) + sizeof(struct serv_parm));
11183 elsiocb = lpfc_prep_els_iocb(vport, 1, cmdsize, retry, ndlp, did,
11184 ELS_CMD_FDISC);
11185 if (!elsiocb) {
11186 lpfc_vport_set_state(vport, FC_VPORT_FAILED);
11187 lpfc_printf_vlog(vport, KERN_ERR, LOG_TRACE_EVENT,
11188 "0255 Issue FDISC: no IOCB\n");
11189 return 1;
11190 }
11191
11192 if (phba->sli_rev == LPFC_SLI_REV4) {
11193 wqe = &elsiocb->wqe;
11194 bf_set(els_req64_sid, &wqe->els_req, 0);
11195 bf_set(els_req64_sp, &wqe->els_req, 1);
11196 } else {
11197 icmd = &elsiocb->iocb;
11198 icmd->un.elsreq64.myID = 0;
11199 icmd->un.elsreq64.fl = 1;
11200 icmd->ulpCt_h = 1;
11201 icmd->ulpCt_l = 0;
11202 }
11203
11204 pcmd = (uint8_t *)elsiocb->cmd_dmabuf->virt;
11205 *((uint32_t *) (pcmd)) = ELS_CMD_FDISC;
11206 pcmd += sizeof(uint32_t);
11207 memcpy(pcmd, &vport->phba->pport->fc_sparam, sizeof(struct serv_parm));
11208 sp = (struct serv_parm *) pcmd;
11209
11210 sp->cmn.e_d_tov = 0;
11211 sp->cmn.w2.r_a_tov = 0;
11212 sp->cmn.virtual_fabric_support = 0;
11213 sp->cls1.classValid = 0;
11214 sp->cls2.seqDelivery = 1;
11215 sp->cls3.seqDelivery = 1;
11216
11217 pcmd += sizeof(uint32_t);
11218 pcmd += sizeof(uint32_t);
11219 pcmd += sizeof(uint32_t);
11220 pcmd += sizeof(uint32_t);
11221 memcpy(pcmd, &vport->fc_portname, 8);
11222 pcmd += sizeof(uint32_t);
11223 pcmd += sizeof(uint32_t);
11224 memcpy(pcmd, &vport->fc_nodename, 8);
11225 sp->cmn.valid_vendor_ver_level = 0;
11226 memset(sp->un.vendorVersion, 0, sizeof(sp->un.vendorVersion));
11227 lpfc_set_disctmo(vport);
11228
11229 phba->fc_stat.elsXmitFDISC++;
11230 elsiocb->cmd_cmpl = lpfc_cmpl_els_fdisc;
11231
11232 lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_CMD,
11233 "Issue FDISC: did:x%x",
11234 did, 0, 0);
11235
11236 elsiocb->ndlp = lpfc_nlp_get(ndlp);
11237 if (!elsiocb->ndlp)
11238 goto err_out;
11239
11240 rc = lpfc_issue_fabric_iocb(phba, elsiocb);
11241 if (rc == IOCB_ERROR) {
11242 lpfc_nlp_put(ndlp);
11243 goto err_out;
11244 }
11245
11246 lpfc_vport_set_state(vport, FC_VPORT_INITIALIZING);
11247 return 0;
11248
11249 err_out:
11250 lpfc_els_free_iocb(phba, elsiocb);
11251 lpfc_vport_set_state(vport, FC_VPORT_FAILED);
11252 lpfc_printf_vlog(vport, KERN_ERR, LOG_TRACE_EVENT,
11253 "0256 Issue FDISC: Cannot send IOCB\n");
11254 return 1;
11255 }
11256
11257
11258
11259
11260
11261
11262
11263
11264
11265
11266
11267
11268
11269
11270
11271 static void
11272 lpfc_cmpl_els_npiv_logo(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
11273 struct lpfc_iocbq *rspiocb)
11274 {
11275 struct lpfc_vport *vport = cmdiocb->vport;
11276 IOCB_t *irsp;
11277 struct lpfc_nodelist *ndlp;
11278 struct Scsi_Host *shost = lpfc_shost_from_vport(vport);
11279 u32 ulp_status, ulp_word4, did, tmo;
11280
11281 ndlp = cmdiocb->ndlp;
11282
11283 ulp_status = get_job_ulpstatus(phba, rspiocb);
11284 ulp_word4 = get_job_word4(phba, rspiocb);
11285
11286 if (phba->sli_rev == LPFC_SLI_REV4) {
11287 did = get_job_els_rsp64_did(phba, cmdiocb);
11288 tmo = get_wqe_tmo(cmdiocb);
11289 } else {
11290 irsp = &rspiocb->iocb;
11291 did = get_job_els_rsp64_did(phba, rspiocb);
11292 tmo = irsp->ulpTimeout;
11293 }
11294
11295 lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_CMD,
11296 "LOGO npiv cmpl: status:x%x/x%x did:x%x",
11297 ulp_status, ulp_word4, did);
11298
11299
11300 lpfc_printf_vlog(vport, KERN_INFO, LOG_ELS,
11301 "2928 NPIV LOGO completes to NPort x%x "
11302 "Data: x%x x%x x%x x%x x%x x%x x%x\n",
11303 ndlp->nlp_DID, ulp_status, ulp_word4,
11304 tmo, vport->num_disc_nodes,
11305 kref_read(&ndlp->kref), ndlp->nlp_flag,
11306 ndlp->fc4_xpt_flags);
11307
11308 if (ulp_status == IOSTAT_SUCCESS) {
11309 spin_lock_irq(shost->host_lock);
11310 vport->fc_flag &= ~FC_NDISC_ACTIVE;
11311 vport->fc_flag &= ~FC_FABRIC;
11312 spin_unlock_irq(shost->host_lock);
11313 lpfc_can_disctmo(vport);
11314 }
11315
11316 if (ndlp->save_flags & NLP_WAIT_FOR_LOGO) {
11317
11318 if (ndlp->logo_waitq)
11319 wake_up(ndlp->logo_waitq);
11320 spin_lock_irq(&ndlp->lock);
11321 ndlp->nlp_flag &= ~(NLP_ISSUE_LOGO | NLP_LOGO_SND);
11322 ndlp->save_flags &= ~NLP_WAIT_FOR_LOGO;
11323 spin_unlock_irq(&ndlp->lock);
11324 }
11325
11326
11327 lpfc_els_free_iocb(phba, cmdiocb);
11328 lpfc_nlp_put(ndlp);
11329 }
11330
11331
11332
11333
11334
11335
11336
11337
11338
11339
11340
11341
11342
11343
11344
11345
11346 int
11347 lpfc_issue_els_npiv_logo(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp)
11348 {
11349 int rc = 0;
11350 struct lpfc_hba *phba = vport->phba;
11351 struct lpfc_iocbq *elsiocb;
11352 uint8_t *pcmd;
11353 uint16_t cmdsize;
11354
11355 cmdsize = 2 * sizeof(uint32_t) + sizeof(struct lpfc_name);
11356 elsiocb = lpfc_prep_els_iocb(vport, 1, cmdsize, 0, ndlp, ndlp->nlp_DID,
11357 ELS_CMD_LOGO);
11358 if (!elsiocb)
11359 return 1;
11360
11361 pcmd = (uint8_t *)elsiocb->cmd_dmabuf->virt;
11362 *((uint32_t *) (pcmd)) = ELS_CMD_LOGO;
11363 pcmd += sizeof(uint32_t);
11364
11365
11366 *((uint32_t *) (pcmd)) = be32_to_cpu(vport->fc_myDID);
11367 pcmd += sizeof(uint32_t);
11368 memcpy(pcmd, &vport->fc_portname, sizeof(struct lpfc_name));
11369
11370 lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_CMD,
11371 "Issue LOGO npiv did:x%x flg:x%x",
11372 ndlp->nlp_DID, ndlp->nlp_flag, 0);
11373
11374 elsiocb->cmd_cmpl = lpfc_cmpl_els_npiv_logo;
11375 spin_lock_irq(&ndlp->lock);
11376 ndlp->nlp_flag |= NLP_LOGO_SND;
11377 spin_unlock_irq(&ndlp->lock);
11378 elsiocb->ndlp = lpfc_nlp_get(ndlp);
11379 if (!elsiocb->ndlp) {
11380 lpfc_els_free_iocb(phba, elsiocb);
11381 goto err;
11382 }
11383
11384 rc = lpfc_sli_issue_iocb(phba, LPFC_ELS_RING, elsiocb, 0);
11385 if (rc == IOCB_ERROR) {
11386 lpfc_els_free_iocb(phba, elsiocb);
11387 lpfc_nlp_put(ndlp);
11388 goto err;
11389 }
11390 return 0;
11391
11392 err:
11393 spin_lock_irq(&ndlp->lock);
11394 ndlp->nlp_flag &= ~NLP_LOGO_SND;
11395 spin_unlock_irq(&ndlp->lock);
11396 return 1;
11397 }
11398
11399
11400
11401
11402
11403
11404
11405
11406
11407
11408
11409
11410 void
11411 lpfc_fabric_block_timeout(struct timer_list *t)
11412 {
11413 struct lpfc_hba *phba = from_timer(phba, t, fabric_block_timer);
11414 unsigned long iflags;
11415 uint32_t tmo_posted;
11416
11417 spin_lock_irqsave(&phba->pport->work_port_lock, iflags);
11418 tmo_posted = phba->pport->work_port_events & WORKER_FABRIC_BLOCK_TMO;
11419 if (!tmo_posted)
11420 phba->pport->work_port_events |= WORKER_FABRIC_BLOCK_TMO;
11421 spin_unlock_irqrestore(&phba->pport->work_port_lock, iflags);
11422
11423 if (!tmo_posted)
11424 lpfc_worker_wake_up(phba);
11425 return;
11426 }
11427
11428
11429
11430
11431
11432
11433
11434
11435
11436
11437
11438 static void
11439 lpfc_resume_fabric_iocbs(struct lpfc_hba *phba)
11440 {
11441 struct lpfc_iocbq *iocb;
11442 unsigned long iflags;
11443 int ret;
11444
11445 repeat:
11446 iocb = NULL;
11447 spin_lock_irqsave(&phba->hbalock, iflags);
11448
11449 if (atomic_read(&phba->fabric_iocb_count) == 0) {
11450 list_remove_head(&phba->fabric_iocb_list, iocb, typeof(*iocb),
11451 list);
11452 if (iocb)
11453
11454 atomic_inc(&phba->fabric_iocb_count);
11455 }
11456 spin_unlock_irqrestore(&phba->hbalock, iflags);
11457 if (iocb) {
11458 iocb->fabric_cmd_cmpl = iocb->cmd_cmpl;
11459 iocb->cmd_cmpl = lpfc_cmpl_fabric_iocb;
11460 iocb->cmd_flag |= LPFC_IO_FABRIC;
11461
11462 lpfc_debugfs_disc_trc(iocb->vport, LPFC_DISC_TRC_ELS_CMD,
11463 "Fabric sched1: ste:x%x",
11464 iocb->vport->port_state, 0, 0);
11465
11466 ret = lpfc_sli_issue_iocb(phba, LPFC_ELS_RING, iocb, 0);
11467
11468 if (ret == IOCB_ERROR) {
11469 iocb->cmd_cmpl = iocb->fabric_cmd_cmpl;
11470 iocb->fabric_cmd_cmpl = NULL;
11471 iocb->cmd_flag &= ~LPFC_IO_FABRIC;
11472 set_job_ulpstatus(iocb, IOSTAT_LOCAL_REJECT);
11473 iocb->wcqe_cmpl.parameter = IOERR_SLI_ABORTED;
11474 iocb->cmd_cmpl(phba, iocb, iocb);
11475
11476 atomic_dec(&phba->fabric_iocb_count);
11477 goto repeat;
11478 }
11479 }
11480 }
11481
11482
11483
11484
11485
11486
11487
11488
11489
11490
11491 void
11492 lpfc_unblock_fabric_iocbs(struct lpfc_hba *phba)
11493 {
11494 clear_bit(FABRIC_COMANDS_BLOCKED, &phba->bit_flags);
11495
11496 lpfc_resume_fabric_iocbs(phba);
11497 return;
11498 }
11499
11500
11501
11502
11503
11504
11505
11506
11507
11508
11509 static void
11510 lpfc_block_fabric_iocbs(struct lpfc_hba *phba)
11511 {
11512 int blocked;
11513
11514 blocked = test_and_set_bit(FABRIC_COMANDS_BLOCKED, &phba->bit_flags);
11515
11516 if (!blocked)
11517 mod_timer(&phba->fabric_block_timer,
11518 jiffies + msecs_to_jiffies(100));
11519
11520 return;
11521 }
11522
11523
11524
11525
11526
11527
11528
11529
11530
11531
11532
11533
11534
11535
11536 static void
11537 lpfc_cmpl_fabric_iocb(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
11538 struct lpfc_iocbq *rspiocb)
11539 {
11540 struct ls_rjt stat;
11541 u32 ulp_status = get_job_ulpstatus(phba, rspiocb);
11542 u32 ulp_word4 = get_job_word4(phba, rspiocb);
11543
11544 WARN_ON((cmdiocb->cmd_flag & LPFC_IO_FABRIC) != LPFC_IO_FABRIC);
11545
11546 switch (ulp_status) {
11547 case IOSTAT_NPORT_RJT:
11548 case IOSTAT_FABRIC_RJT:
11549 if (ulp_word4 & RJT_UNAVAIL_TEMP)
11550 lpfc_block_fabric_iocbs(phba);
11551 break;
11552
11553 case IOSTAT_NPORT_BSY:
11554 case IOSTAT_FABRIC_BSY:
11555 lpfc_block_fabric_iocbs(phba);
11556 break;
11557
11558 case IOSTAT_LS_RJT:
11559 stat.un.ls_rjt_error_be =
11560 cpu_to_be32(ulp_word4);
11561 if ((stat.un.b.lsRjtRsnCode == LSRJT_UNABLE_TPC) ||
11562 (stat.un.b.lsRjtRsnCode == LSRJT_LOGICAL_BSY))
11563 lpfc_block_fabric_iocbs(phba);
11564 break;
11565 }
11566
11567 BUG_ON(atomic_read(&phba->fabric_iocb_count) == 0);
11568
11569 cmdiocb->cmd_cmpl = cmdiocb->fabric_cmd_cmpl;
11570 cmdiocb->fabric_cmd_cmpl = NULL;
11571 cmdiocb->cmd_flag &= ~LPFC_IO_FABRIC;
11572 cmdiocb->cmd_cmpl(phba, cmdiocb, rspiocb);
11573
11574 atomic_dec(&phba->fabric_iocb_count);
11575 if (!test_bit(FABRIC_COMANDS_BLOCKED, &phba->bit_flags)) {
11576
11577 lpfc_resume_fabric_iocbs(phba);
11578 }
11579 }
11580
11581
11582
11583
11584
11585
11586
11587
11588
11589
11590
11591
11592
11593
11594
11595
11596
11597
11598
11599
11600
11601
11602
11603
11604
11605 static int
11606 lpfc_issue_fabric_iocb(struct lpfc_hba *phba, struct lpfc_iocbq *iocb)
11607 {
11608 unsigned long iflags;
11609 int ready;
11610 int ret;
11611
11612 BUG_ON(atomic_read(&phba->fabric_iocb_count) > 1);
11613
11614 spin_lock_irqsave(&phba->hbalock, iflags);
11615 ready = atomic_read(&phba->fabric_iocb_count) == 0 &&
11616 !test_bit(FABRIC_COMANDS_BLOCKED, &phba->bit_flags);
11617
11618 if (ready)
11619
11620 atomic_inc(&phba->fabric_iocb_count);
11621 spin_unlock_irqrestore(&phba->hbalock, iflags);
11622 if (ready) {
11623 iocb->fabric_cmd_cmpl = iocb->cmd_cmpl;
11624 iocb->cmd_cmpl = lpfc_cmpl_fabric_iocb;
11625 iocb->cmd_flag |= LPFC_IO_FABRIC;
11626
11627 lpfc_debugfs_disc_trc(iocb->vport, LPFC_DISC_TRC_ELS_CMD,
11628 "Fabric sched2: ste:x%x",
11629 iocb->vport->port_state, 0, 0);
11630
11631 ret = lpfc_sli_issue_iocb(phba, LPFC_ELS_RING, iocb, 0);
11632
11633 if (ret == IOCB_ERROR) {
11634 iocb->cmd_cmpl = iocb->fabric_cmd_cmpl;
11635 iocb->fabric_cmd_cmpl = NULL;
11636 iocb->cmd_flag &= ~LPFC_IO_FABRIC;
11637 atomic_dec(&phba->fabric_iocb_count);
11638 }
11639 } else {
11640 spin_lock_irqsave(&phba->hbalock, iflags);
11641 list_add_tail(&iocb->list, &phba->fabric_iocb_list);
11642 spin_unlock_irqrestore(&phba->hbalock, iflags);
11643 ret = IOCB_SUCCESS;
11644 }
11645 return ret;
11646 }
11647
11648
11649
11650
11651
11652
11653
11654
11655
11656
11657
11658
11659 static void lpfc_fabric_abort_vport(struct lpfc_vport *vport)
11660 {
11661 LIST_HEAD(completions);
11662 struct lpfc_hba *phba = vport->phba;
11663 struct lpfc_iocbq *tmp_iocb, *piocb;
11664
11665 spin_lock_irq(&phba->hbalock);
11666 list_for_each_entry_safe(piocb, tmp_iocb, &phba->fabric_iocb_list,
11667 list) {
11668
11669 if (piocb->vport != vport)
11670 continue;
11671
11672 list_move_tail(&piocb->list, &completions);
11673 }
11674 spin_unlock_irq(&phba->hbalock);
11675
11676
11677 lpfc_sli_cancel_iocbs(phba, &completions, IOSTAT_LOCAL_REJECT,
11678 IOERR_SLI_ABORTED);
11679 }
11680
11681
11682
11683
11684
11685
11686
11687
11688
11689
11690
11691
11692 void lpfc_fabric_abort_nport(struct lpfc_nodelist *ndlp)
11693 {
11694 LIST_HEAD(completions);
11695 struct lpfc_hba *phba = ndlp->phba;
11696 struct lpfc_iocbq *tmp_iocb, *piocb;
11697 struct lpfc_sli_ring *pring;
11698
11699 pring = lpfc_phba_elsring(phba);
11700
11701 if (unlikely(!pring))
11702 return;
11703
11704 spin_lock_irq(&phba->hbalock);
11705 list_for_each_entry_safe(piocb, tmp_iocb, &phba->fabric_iocb_list,
11706 list) {
11707 if ((lpfc_check_sli_ndlp(phba, pring, piocb, ndlp))) {
11708
11709 list_move_tail(&piocb->list, &completions);
11710 }
11711 }
11712 spin_unlock_irq(&phba->hbalock);
11713
11714
11715 lpfc_sli_cancel_iocbs(phba, &completions, IOSTAT_LOCAL_REJECT,
11716 IOERR_SLI_ABORTED);
11717 }
11718
11719
11720
11721
11722
11723
11724
11725
11726
11727
11728
11729
11730 void lpfc_fabric_abort_hba(struct lpfc_hba *phba)
11731 {
11732 LIST_HEAD(completions);
11733
11734 spin_lock_irq(&phba->hbalock);
11735 list_splice_init(&phba->fabric_iocb_list, &completions);
11736 spin_unlock_irq(&phba->hbalock);
11737
11738
11739 lpfc_sli_cancel_iocbs(phba, &completions, IOSTAT_LOCAL_REJECT,
11740 IOERR_SLI_ABORTED);
11741 }
11742
11743
11744
11745
11746
11747
11748
11749
11750 void
11751 lpfc_sli4_vport_delete_els_xri_aborted(struct lpfc_vport *vport)
11752 {
11753 struct lpfc_hba *phba = vport->phba;
11754 struct lpfc_sglq *sglq_entry = NULL, *sglq_next = NULL;
11755 struct lpfc_nodelist *ndlp = NULL;
11756 unsigned long iflag = 0;
11757
11758 spin_lock_irqsave(&phba->sli4_hba.sgl_list_lock, iflag);
11759 list_for_each_entry_safe(sglq_entry, sglq_next,
11760 &phba->sli4_hba.lpfc_abts_els_sgl_list, list) {
11761 if (sglq_entry->ndlp && sglq_entry->ndlp->vport == vport) {
11762 lpfc_nlp_put(sglq_entry->ndlp);
11763 ndlp = sglq_entry->ndlp;
11764 sglq_entry->ndlp = NULL;
11765
11766
11767
11768
11769
11770 if ((vport->load_flag & FC_UNLOADING) &&
11771 ndlp->nlp_DID == Fabric_DID) {
11772 list_del(&sglq_entry->list);
11773 sglq_entry->state = SGL_FREED;
11774 list_add_tail(&sglq_entry->list,
11775 &phba->sli4_hba.lpfc_els_sgl_list);
11776 }
11777 }
11778 }
11779 spin_unlock_irqrestore(&phba->sli4_hba.sgl_list_lock, iflag);
11780 return;
11781 }
11782
11783
11784
11785
11786
11787
11788
11789
11790
11791 void
11792 lpfc_sli4_els_xri_aborted(struct lpfc_hba *phba,
11793 struct sli4_wcqe_xri_aborted *axri)
11794 {
11795 uint16_t xri = bf_get(lpfc_wcqe_xa_xri, axri);
11796 uint16_t rxid = bf_get(lpfc_wcqe_xa_remote_xid, axri);
11797 uint16_t lxri = 0;
11798
11799 struct lpfc_sglq *sglq_entry = NULL, *sglq_next = NULL;
11800 unsigned long iflag = 0;
11801 struct lpfc_nodelist *ndlp;
11802 struct lpfc_sli_ring *pring;
11803
11804 pring = lpfc_phba_elsring(phba);
11805
11806 spin_lock_irqsave(&phba->sli4_hba.sgl_list_lock, iflag);
11807 list_for_each_entry_safe(sglq_entry, sglq_next,
11808 &phba->sli4_hba.lpfc_abts_els_sgl_list, list) {
11809 if (sglq_entry->sli4_xritag == xri) {
11810 list_del(&sglq_entry->list);
11811 ndlp = sglq_entry->ndlp;
11812 sglq_entry->ndlp = NULL;
11813 list_add_tail(&sglq_entry->list,
11814 &phba->sli4_hba.lpfc_els_sgl_list);
11815 sglq_entry->state = SGL_FREED;
11816 spin_unlock_irqrestore(&phba->sli4_hba.sgl_list_lock,
11817 iflag);
11818
11819 if (ndlp) {
11820 lpfc_set_rrq_active(phba, ndlp,
11821 sglq_entry->sli4_lxritag,
11822 rxid, 1);
11823 lpfc_nlp_put(ndlp);
11824 }
11825
11826
11827 if (pring && !list_empty(&pring->txq))
11828 lpfc_worker_wake_up(phba);
11829 return;
11830 }
11831 }
11832 spin_unlock_irqrestore(&phba->sli4_hba.sgl_list_lock, iflag);
11833 lxri = lpfc_sli4_xri_inrange(phba, xri);
11834 if (lxri == NO_XRI)
11835 return;
11836
11837 spin_lock_irqsave(&phba->hbalock, iflag);
11838 sglq_entry = __lpfc_get_active_sglq(phba, lxri);
11839 if (!sglq_entry || (sglq_entry->sli4_xritag != xri)) {
11840 spin_unlock_irqrestore(&phba->hbalock, iflag);
11841 return;
11842 }
11843 sglq_entry->state = SGL_XRI_ABORTED;
11844 spin_unlock_irqrestore(&phba->hbalock, iflag);
11845 return;
11846 }
11847
11848
11849
11850
11851
11852
11853
11854
11855
11856
11857 void
11858 lpfc_sli_abts_recover_port(struct lpfc_vport *vport,
11859 struct lpfc_nodelist *ndlp)
11860 {
11861 struct Scsi_Host *shost;
11862 struct lpfc_hba *phba;
11863 unsigned long flags = 0;
11864
11865 shost = lpfc_shost_from_vport(vport);
11866 phba = vport->phba;
11867 if (ndlp->nlp_state != NLP_STE_MAPPED_NODE) {
11868 lpfc_printf_log(phba, KERN_INFO,
11869 LOG_SLI, "3093 No rport recovery needed. "
11870 "rport in state 0x%x\n", ndlp->nlp_state);
11871 return;
11872 }
11873 lpfc_printf_log(phba, KERN_ERR, LOG_TRACE_EVENT,
11874 "3094 Start rport recovery on shost id 0x%x "
11875 "fc_id 0x%06x vpi 0x%x rpi 0x%x state 0x%x "
11876 "flags 0x%x\n",
11877 shost->host_no, ndlp->nlp_DID,
11878 vport->vpi, ndlp->nlp_rpi, ndlp->nlp_state,
11879 ndlp->nlp_flag);
11880
11881
11882
11883
11884 spin_lock_irqsave(&ndlp->lock, flags);
11885 ndlp->nlp_fcp_info &= ~NLP_FCP_2_DEVICE;
11886 ndlp->nlp_flag |= NLP_ISSUE_LOGO;
11887 spin_unlock_irqrestore(&ndlp->lock, flags);
11888 lpfc_unreg_rpi(vport, ndlp);
11889 }
11890
11891 static void lpfc_init_cs_ctl_bitmap(struct lpfc_vport *vport)
11892 {
11893 bitmap_zero(vport->vmid_priority_range, LPFC_VMID_MAX_PRIORITY_RANGE);
11894 }
11895
11896 static void
11897 lpfc_vmid_set_cs_ctl_range(struct lpfc_vport *vport, u32 min, u32 max)
11898 {
11899 u32 i;
11900
11901 if ((min > max) || (max > LPFC_VMID_MAX_PRIORITY_RANGE))
11902 return;
11903
11904 for (i = min; i <= max; i++)
11905 set_bit(i, vport->vmid_priority_range);
11906 }
11907
11908 static void lpfc_vmid_put_cs_ctl(struct lpfc_vport *vport, u32 ctcl_vmid)
11909 {
11910 set_bit(ctcl_vmid, vport->vmid_priority_range);
11911 }
11912
11913 u32 lpfc_vmid_get_cs_ctl(struct lpfc_vport *vport)
11914 {
11915 u32 i;
11916
11917 i = find_first_bit(vport->vmid_priority_range,
11918 LPFC_VMID_MAX_PRIORITY_RANGE);
11919
11920 if (i == LPFC_VMID_MAX_PRIORITY_RANGE)
11921 return 0;
11922
11923 clear_bit(i, vport->vmid_priority_range);
11924 return i;
11925 }
11926
11927 #define MAX_PRIORITY_DESC 255
11928
11929 static void
11930 lpfc_cmpl_els_qfpa(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
11931 struct lpfc_iocbq *rspiocb)
11932 {
11933 struct lpfc_vport *vport = cmdiocb->vport;
11934 struct priority_range_desc *desc;
11935 struct lpfc_dmabuf *prsp = NULL;
11936 struct lpfc_vmid_priority_range *vmid_range = NULL;
11937 u32 *data;
11938 struct lpfc_dmabuf *dmabuf = cmdiocb->cmd_dmabuf;
11939 u32 ulp_status = get_job_ulpstatus(phba, rspiocb);
11940 u32 ulp_word4 = get_job_word4(phba, rspiocb);
11941 u8 *pcmd, max_desc;
11942 u32 len, i;
11943 struct lpfc_nodelist *ndlp = cmdiocb->ndlp;
11944
11945 prsp = list_get_first(&dmabuf->list, struct lpfc_dmabuf, list);
11946 if (!prsp)
11947 goto out;
11948
11949 pcmd = prsp->virt;
11950 data = (u32 *)pcmd;
11951 if (data[0] == ELS_CMD_LS_RJT) {
11952 lpfc_printf_vlog(vport, KERN_WARNING, LOG_SLI,
11953 "3277 QFPA LS_RJT x%x x%x\n",
11954 data[0], data[1]);
11955 goto out;
11956 }
11957 if (ulp_status) {
11958 lpfc_printf_vlog(vport, KERN_ERR, LOG_SLI,
11959 "6529 QFPA failed with status x%x x%x\n",
11960 ulp_status, ulp_word4);
11961 goto out;
11962 }
11963
11964 if (!vport->qfpa_res) {
11965 max_desc = FCELSSIZE / sizeof(*vport->qfpa_res);
11966 vport->qfpa_res = kcalloc(max_desc, sizeof(*vport->qfpa_res),
11967 GFP_KERNEL);
11968 if (!vport->qfpa_res)
11969 goto out;
11970 }
11971
11972 len = *((u32 *)(pcmd + 4));
11973 len = be32_to_cpu(len);
11974 memcpy(vport->qfpa_res, pcmd, len + 8);
11975 len = len / LPFC_PRIORITY_RANGE_DESC_SIZE;
11976
11977 desc = (struct priority_range_desc *)(pcmd + 8);
11978 vmid_range = vport->vmid_priority.vmid_range;
11979 if (!vmid_range) {
11980 vmid_range = kcalloc(MAX_PRIORITY_DESC, sizeof(*vmid_range),
11981 GFP_KERNEL);
11982 if (!vmid_range) {
11983 kfree(vport->qfpa_res);
11984 goto out;
11985 }
11986 vport->vmid_priority.vmid_range = vmid_range;
11987 }
11988 vport->vmid_priority.num_descriptors = len;
11989
11990 for (i = 0; i < len; i++, vmid_range++, desc++) {
11991 lpfc_printf_vlog(vport, KERN_DEBUG, LOG_ELS,
11992 "6539 vmid values low=%d, high=%d, qos=%d, "
11993 "local ve id=%d\n", desc->lo_range,
11994 desc->hi_range, desc->qos_priority,
11995 desc->local_ve_id);
11996
11997 vmid_range->low = desc->lo_range << 1;
11998 if (desc->local_ve_id == QFPA_ODD_ONLY)
11999 vmid_range->low++;
12000 if (desc->qos_priority)
12001 vport->vmid_flag |= LPFC_VMID_QOS_ENABLED;
12002 vmid_range->qos = desc->qos_priority;
12003
12004 vmid_range->high = desc->hi_range << 1;
12005 if ((desc->local_ve_id == QFPA_ODD_ONLY) ||
12006 (desc->local_ve_id == QFPA_EVEN_ODD))
12007 vmid_range->high++;
12008 }
12009 lpfc_init_cs_ctl_bitmap(vport);
12010 for (i = 0; i < vport->vmid_priority.num_descriptors; i++) {
12011 lpfc_vmid_set_cs_ctl_range(vport,
12012 vport->vmid_priority.vmid_range[i].low,
12013 vport->vmid_priority.vmid_range[i].high);
12014 }
12015
12016 vport->vmid_flag |= LPFC_VMID_QFPA_CMPL;
12017 out:
12018 lpfc_els_free_iocb(phba, cmdiocb);
12019 lpfc_nlp_put(ndlp);
12020 }
12021
12022 int lpfc_issue_els_qfpa(struct lpfc_vport *vport)
12023 {
12024 struct lpfc_hba *phba = vport->phba;
12025 struct lpfc_nodelist *ndlp;
12026 struct lpfc_iocbq *elsiocb;
12027 u8 *pcmd;
12028 int ret;
12029
12030 ndlp = lpfc_findnode_did(phba->pport, Fabric_DID);
12031 if (!ndlp || ndlp->nlp_state != NLP_STE_UNMAPPED_NODE)
12032 return -ENXIO;
12033
12034 elsiocb = lpfc_prep_els_iocb(vport, 1, LPFC_QFPA_SIZE, 2, ndlp,
12035 ndlp->nlp_DID, ELS_CMD_QFPA);
12036 if (!elsiocb)
12037 return -ENOMEM;
12038
12039 pcmd = (u8 *)elsiocb->cmd_dmabuf->virt;
12040
12041 *((u32 *)(pcmd)) = ELS_CMD_QFPA;
12042 pcmd += 4;
12043
12044 elsiocb->cmd_cmpl = lpfc_cmpl_els_qfpa;
12045
12046 elsiocb->ndlp = lpfc_nlp_get(ndlp);
12047 if (!elsiocb->ndlp) {
12048 lpfc_els_free_iocb(vport->phba, elsiocb);
12049 return -ENXIO;
12050 }
12051
12052 ret = lpfc_sli_issue_iocb(phba, LPFC_ELS_RING, elsiocb, 2);
12053 if (ret != IOCB_SUCCESS) {
12054 lpfc_els_free_iocb(phba, elsiocb);
12055 lpfc_nlp_put(ndlp);
12056 return -EIO;
12057 }
12058 vport->vmid_flag &= ~LPFC_VMID_QOS_ENABLED;
12059 return 0;
12060 }
12061
12062 int
12063 lpfc_vmid_uvem(struct lpfc_vport *vport,
12064 struct lpfc_vmid *vmid, bool instantiated)
12065 {
12066 struct lpfc_vem_id_desc *vem_id_desc;
12067 struct lpfc_nodelist *ndlp;
12068 struct lpfc_iocbq *elsiocb;
12069 struct instantiated_ve_desc *inst_desc;
12070 struct lpfc_vmid_context *vmid_context;
12071 u8 *pcmd;
12072 u32 *len;
12073 int ret = 0;
12074
12075 ndlp = lpfc_findnode_did(vport, Fabric_DID);
12076 if (!ndlp || ndlp->nlp_state != NLP_STE_UNMAPPED_NODE)
12077 return -ENXIO;
12078
12079 vmid_context = kmalloc(sizeof(*vmid_context), GFP_KERNEL);
12080 if (!vmid_context)
12081 return -ENOMEM;
12082 elsiocb = lpfc_prep_els_iocb(vport, 1, LPFC_UVEM_SIZE, 2,
12083 ndlp, Fabric_DID, ELS_CMD_UVEM);
12084 if (!elsiocb)
12085 goto out;
12086
12087 lpfc_printf_vlog(vport, KERN_DEBUG, LOG_ELS,
12088 "3427 Host vmid %s %d\n",
12089 vmid->host_vmid, instantiated);
12090 vmid_context->vmp = vmid;
12091 vmid_context->nlp = ndlp;
12092 vmid_context->instantiated = instantiated;
12093 elsiocb->vmid_tag.vmid_context = vmid_context;
12094 pcmd = (u8 *)elsiocb->cmd_dmabuf->virt;
12095
12096 if (uuid_is_null((uuid_t *)vport->lpfc_vmid_host_uuid))
12097 memcpy(vport->lpfc_vmid_host_uuid, vmid->host_vmid,
12098 LPFC_COMPRESS_VMID_SIZE);
12099
12100 *((u32 *)(pcmd)) = ELS_CMD_UVEM;
12101 len = (u32 *)(pcmd + 4);
12102 *len = cpu_to_be32(LPFC_UVEM_SIZE - 8);
12103
12104 vem_id_desc = (struct lpfc_vem_id_desc *)(pcmd + 8);
12105 vem_id_desc->tag = be32_to_cpu(VEM_ID_DESC_TAG);
12106 vem_id_desc->length = be32_to_cpu(LPFC_UVEM_VEM_ID_DESC_SIZE);
12107 memcpy(vem_id_desc->vem_id, vport->lpfc_vmid_host_uuid,
12108 LPFC_COMPRESS_VMID_SIZE);
12109
12110 inst_desc = (struct instantiated_ve_desc *)(pcmd + 32);
12111 inst_desc->tag = be32_to_cpu(INSTANTIATED_VE_DESC_TAG);
12112 inst_desc->length = be32_to_cpu(LPFC_UVEM_VE_MAP_DESC_SIZE);
12113 memcpy(inst_desc->global_vem_id, vmid->host_vmid,
12114 LPFC_COMPRESS_VMID_SIZE);
12115
12116 bf_set(lpfc_instantiated_nport_id, inst_desc, vport->fc_myDID);
12117 bf_set(lpfc_instantiated_local_id, inst_desc,
12118 vmid->un.cs_ctl_vmid);
12119 if (instantiated) {
12120 inst_desc->tag = be32_to_cpu(INSTANTIATED_VE_DESC_TAG);
12121 } else {
12122 inst_desc->tag = be32_to_cpu(DEINSTANTIATED_VE_DESC_TAG);
12123 lpfc_vmid_put_cs_ctl(vport, vmid->un.cs_ctl_vmid);
12124 }
12125 inst_desc->word6 = cpu_to_be32(inst_desc->word6);
12126
12127 elsiocb->cmd_cmpl = lpfc_cmpl_els_uvem;
12128
12129 elsiocb->ndlp = lpfc_nlp_get(ndlp);
12130 if (!elsiocb->ndlp) {
12131 lpfc_els_free_iocb(vport->phba, elsiocb);
12132 goto out;
12133 }
12134
12135 ret = lpfc_sli_issue_iocb(vport->phba, LPFC_ELS_RING, elsiocb, 0);
12136 if (ret != IOCB_SUCCESS) {
12137 lpfc_els_free_iocb(vport->phba, elsiocb);
12138 lpfc_nlp_put(ndlp);
12139 goto out;
12140 }
12141
12142 return 0;
12143 out:
12144 kfree(vmid_context);
12145 return -EIO;
12146 }
12147
12148 static void
12149 lpfc_cmpl_els_uvem(struct lpfc_hba *phba, struct lpfc_iocbq *icmdiocb,
12150 struct lpfc_iocbq *rspiocb)
12151 {
12152 struct lpfc_vport *vport = icmdiocb->vport;
12153 struct lpfc_dmabuf *prsp = NULL;
12154 struct lpfc_vmid_context *vmid_context =
12155 icmdiocb->vmid_tag.vmid_context;
12156 struct lpfc_nodelist *ndlp = icmdiocb->ndlp;
12157 u8 *pcmd;
12158 u32 *data;
12159 u32 ulp_status = get_job_ulpstatus(phba, rspiocb);
12160 u32 ulp_word4 = get_job_word4(phba, rspiocb);
12161 struct lpfc_dmabuf *dmabuf = icmdiocb->cmd_dmabuf;
12162 struct lpfc_vmid *vmid;
12163
12164 vmid = vmid_context->vmp;
12165 if (!ndlp || ndlp->nlp_state != NLP_STE_UNMAPPED_NODE)
12166 ndlp = NULL;
12167
12168 prsp = list_get_first(&dmabuf->list, struct lpfc_dmabuf, list);
12169 if (!prsp)
12170 goto out;
12171 pcmd = prsp->virt;
12172 data = (u32 *)pcmd;
12173 if (data[0] == ELS_CMD_LS_RJT) {
12174 lpfc_printf_vlog(vport, KERN_WARNING, LOG_SLI,
12175 "4532 UVEM LS_RJT %x %x\n", data[0], data[1]);
12176 goto out;
12177 }
12178 if (ulp_status) {
12179 lpfc_printf_vlog(vport, KERN_WARNING, LOG_SLI,
12180 "4533 UVEM error status %x: %x\n",
12181 ulp_status, ulp_word4);
12182 goto out;
12183 }
12184 spin_lock(&phba->hbalock);
12185
12186 vport->vmid_flag |= LPFC_VMID_IN_USE;
12187 phba->pport->vmid_flag |= LPFC_VMID_IN_USE;
12188 spin_unlock(&phba->hbalock);
12189
12190 if (vmid_context->instantiated) {
12191 write_lock(&vport->vmid_lock);
12192 vmid->flag |= LPFC_VMID_REGISTERED;
12193 vmid->flag &= ~LPFC_VMID_REQ_REGISTER;
12194 write_unlock(&vport->vmid_lock);
12195 }
12196
12197 out:
12198 kfree(vmid_context);
12199 lpfc_els_free_iocb(phba, icmdiocb);
12200 lpfc_nlp_put(ndlp);
12201 }