linux/drivers/scsi/lpfc/lpfc_els.c
<<
>>
Prefs
   1/*******************************************************************
   2 * This file is part of the Emulex Linux Device Driver for         *
   3 * Fibre Channel Host Bus Adapters.                                *
   4 * Copyright (C) 2017-2021 Broadcom. All Rights Reserved. The term *
   5 * “Broadcom” refers to Broadcom Inc. and/or its subsidiaries.     *
   6 * Copyright (C) 2004-2016 Emulex.  All rights reserved.           *
   7 * EMULEX and SLI are trademarks of Emulex.                        *
   8 * www.broadcom.com                                                *
   9 * Portions Copyright (C) 2004-2005 Christoph Hellwig              *
  10 *                                                                 *
  11 * This program is free software; you can redistribute it and/or   *
  12 * modify it under the terms of version 2 of the GNU General       *
  13 * Public License as published by the Free Software Foundation.    *
  14 * This program is distributed in the hope that it will be useful. *
  15 * ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND          *
  16 * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,  *
  17 * FITNESS FOR A PARTICULAR PURPOSE, OR NON-INFRINGEMENT, ARE      *
  18 * DISCLAIMED, EXCEPT TO THE EXTENT THAT SUCH DISCLAIMERS ARE HELD *
  19 * TO BE LEGALLY INVALID.  See the GNU General Public License for  *
  20 * more details, a copy of which can be found in the file COPYING  *
  21 * included with this package.                                     *
  22 *******************************************************************/
  23/* See Fibre Channel protocol T11 FC-LS for details */
  24#include <linux/blkdev.h>
  25#include <linux/pci.h>
  26#include <linux/slab.h>
  27#include <linux/interrupt.h>
  28#include <linux/delay.h>
  29
  30#include <scsi/scsi.h>
  31#include <scsi/scsi_device.h>
  32#include <scsi/scsi_host.h>
  33#include <scsi/scsi_transport_fc.h>
  34#include <uapi/scsi/fc/fc_fs.h>
  35#include <uapi/scsi/fc/fc_els.h>
  36
  37#include "lpfc_hw4.h"
  38#include "lpfc_hw.h"
  39#include "lpfc_sli.h"
  40#include "lpfc_sli4.h"
  41#include "lpfc_nl.h"
  42#include "lpfc_disc.h"
  43#include "lpfc_scsi.h"
  44#include "lpfc.h"
  45#include "lpfc_logmsg.h"
  46#include "lpfc_crtn.h"
  47#include "lpfc_vport.h"
  48#include "lpfc_debugfs.h"
  49
  50static int lpfc_els_retry(struct lpfc_hba *, struct lpfc_iocbq *,
  51                          struct lpfc_iocbq *);
  52static void lpfc_cmpl_fabric_iocb(struct lpfc_hba *, struct lpfc_iocbq *,
  53                        struct lpfc_iocbq *);
  54static void lpfc_fabric_abort_vport(struct lpfc_vport *vport);
  55static int lpfc_issue_els_fdisc(struct lpfc_vport *vport,
  56                                struct lpfc_nodelist *ndlp, uint8_t retry);
  57static int lpfc_issue_fabric_iocb(struct lpfc_hba *phba,
  58                                  struct lpfc_iocbq *iocb);
  59static void lpfc_cmpl_els_edc(struct lpfc_hba *phba,
  60                              struct lpfc_iocbq *cmdiocb,
  61                              struct lpfc_iocbq *rspiocb);
  62static void lpfc_cmpl_els_uvem(struct lpfc_hba *, struct lpfc_iocbq *,
  63                               struct lpfc_iocbq *);
  64
  65static int lpfc_max_els_tries = 3;
  66
  67static void lpfc_init_cs_ctl_bitmap(struct lpfc_vport *vport);
  68static void lpfc_vmid_set_cs_ctl_range(struct lpfc_vport *vport, u32 min, u32 max);
  69static void lpfc_vmid_put_cs_ctl(struct lpfc_vport *vport, u32 ctcl_vmid);
  70
  71/**
  72 * lpfc_els_chk_latt - Check host link attention event for a vport
  73 * @vport: pointer to a host virtual N_Port data structure.
  74 *
  75 * This routine checks whether there is an outstanding host link
  76 * attention event during the discovery process with the @vport. It is done
  77 * by reading the HBA's Host Attention (HA) register. If there is any host
  78 * link attention events during this @vport's discovery process, the @vport
  79 * shall be marked as FC_ABORT_DISCOVERY, a host link attention clear shall
  80 * be issued if the link state is not already in host link cleared state,
  81 * and a return code shall indicate whether the host link attention event
  82 * had happened.
  83 *
  84 * Note that, if either the host link is in state LPFC_LINK_DOWN or @vport
  85 * state in LPFC_VPORT_READY, the request for checking host link attention
  86 * event will be ignored and a return code shall indicate no host link
  87 * attention event had happened.
  88 *
  89 * Return codes
  90 *   0 - no host link attention event happened
  91 *   1 - host link attention event happened
  92 **/
  93int
  94lpfc_els_chk_latt(struct lpfc_vport *vport)
  95{
  96        struct Scsi_Host *shost = lpfc_shost_from_vport(vport);
  97        struct lpfc_hba  *phba = vport->phba;
  98        uint32_t ha_copy;
  99
 100        if (vport->port_state >= LPFC_VPORT_READY ||
 101            phba->link_state == LPFC_LINK_DOWN ||
 102            phba->sli_rev > LPFC_SLI_REV3)
 103                return 0;
 104
 105        /* Read the HBA Host Attention Register */
 106        if (lpfc_readl(phba->HAregaddr, &ha_copy))
 107                return 1;
 108
 109        if (!(ha_copy & HA_LATT))
 110                return 0;
 111
 112        /* Pending Link Event during Discovery */
 113        lpfc_printf_vlog(vport, KERN_ERR, LOG_TRACE_EVENT,
 114                         "0237 Pending Link Event during "
 115                         "Discovery: State x%x\n",
 116                         phba->pport->port_state);
 117
 118        /* CLEAR_LA should re-enable link attention events and
 119         * we should then immediately take a LATT event. The
 120         * LATT processing should call lpfc_linkdown() which
 121         * will cleanup any left over in-progress discovery
 122         * events.
 123         */
 124        spin_lock_irq(shost->host_lock);
 125        vport->fc_flag |= FC_ABORT_DISCOVERY;
 126        spin_unlock_irq(shost->host_lock);
 127
 128        if (phba->link_state != LPFC_CLEAR_LA)
 129                lpfc_issue_clear_la(phba, vport);
 130
 131        return 1;
 132}
 133
 134/**
 135 * lpfc_prep_els_iocb - Allocate and prepare a lpfc iocb data structure
 136 * @vport: pointer to a host virtual N_Port data structure.
 137 * @expectRsp: flag indicating whether response is expected.
 138 * @cmdSize: size of the ELS command.
 139 * @retry: number of retries to the command IOCB when it fails.
 140 * @ndlp: pointer to a node-list data structure.
 141 * @did: destination identifier.
 142 * @elscmd: the ELS command code.
 143 *
 144 * This routine is used for allocating a lpfc-IOCB data structure from
 145 * the driver lpfc-IOCB free-list and prepare the IOCB with the parameters
 146 * passed into the routine for discovery state machine to issue an Extended
 147 * Link Service (ELS) commands. It is a generic lpfc-IOCB allocation
 148 * and preparation routine that is used by all the discovery state machine
 149 * routines and the ELS command-specific fields will be later set up by
 150 * the individual discovery machine routines after calling this routine
 151 * allocating and preparing a generic IOCB data structure. It fills in the
 152 * Buffer Descriptor Entries (BDEs), allocates buffers for both command
 153 * payload and response payload (if expected). The reference count on the
 154 * ndlp is incremented by 1 and the reference to the ndlp is put into
 155 * context1 of the IOCB data structure for this IOCB to hold the ndlp
 156 * reference for the command's callback function to access later.
 157 *
 158 * Return code
 159 *   Pointer to the newly allocated/prepared els iocb data structure
 160 *   NULL - when els iocb data structure allocation/preparation failed
 161 **/
 162struct lpfc_iocbq *
 163lpfc_prep_els_iocb(struct lpfc_vport *vport, uint8_t expectRsp,
 164                   uint16_t cmdSize, uint8_t retry,
 165                   struct lpfc_nodelist *ndlp, uint32_t did,
 166                   uint32_t elscmd)
 167{
 168        struct lpfc_hba  *phba = vport->phba;
 169        struct lpfc_iocbq *elsiocb;
 170        struct lpfc_dmabuf *pcmd, *prsp, *pbuflist;
 171        struct ulp_bde64 *bpl;
 172        IOCB_t *icmd;
 173
 174
 175        if (!lpfc_is_link_up(phba))
 176                return NULL;
 177
 178        /* Allocate buffer for  command iocb */
 179        elsiocb = lpfc_sli_get_iocbq(phba);
 180
 181        if (elsiocb == NULL)
 182                return NULL;
 183
 184        /*
 185         * If this command is for fabric controller and HBA running
 186         * in FIP mode send FLOGI, FDISC and LOGO as FIP frames.
 187         */
 188        if ((did == Fabric_DID) &&
 189                (phba->hba_flag & HBA_FIP_SUPPORT) &&
 190                ((elscmd == ELS_CMD_FLOGI) ||
 191                 (elscmd == ELS_CMD_FDISC) ||
 192                 (elscmd == ELS_CMD_LOGO)))
 193                switch (elscmd) {
 194                case ELS_CMD_FLOGI:
 195                elsiocb->iocb_flag |=
 196                        ((LPFC_ELS_ID_FLOGI << LPFC_FIP_ELS_ID_SHIFT)
 197                                        & LPFC_FIP_ELS_ID_MASK);
 198                break;
 199                case ELS_CMD_FDISC:
 200                elsiocb->iocb_flag |=
 201                        ((LPFC_ELS_ID_FDISC << LPFC_FIP_ELS_ID_SHIFT)
 202                                        & LPFC_FIP_ELS_ID_MASK);
 203                break;
 204                case ELS_CMD_LOGO:
 205                elsiocb->iocb_flag |=
 206                        ((LPFC_ELS_ID_LOGO << LPFC_FIP_ELS_ID_SHIFT)
 207                                        & LPFC_FIP_ELS_ID_MASK);
 208                break;
 209                }
 210        else
 211                elsiocb->iocb_flag &= ~LPFC_FIP_ELS_ID_MASK;
 212
 213        icmd = &elsiocb->iocb;
 214
 215        /* fill in BDEs for command */
 216        /* Allocate buffer for command payload */
 217        pcmd = kmalloc(sizeof(struct lpfc_dmabuf), GFP_KERNEL);
 218        if (pcmd)
 219                pcmd->virt = lpfc_mbuf_alloc(phba, MEM_PRI, &pcmd->phys);
 220        if (!pcmd || !pcmd->virt)
 221                goto els_iocb_free_pcmb_exit;
 222
 223        INIT_LIST_HEAD(&pcmd->list);
 224
 225        /* Allocate buffer for response payload */
 226        if (expectRsp) {
 227                prsp = kmalloc(sizeof(struct lpfc_dmabuf), GFP_KERNEL);
 228                if (prsp)
 229                        prsp->virt = lpfc_mbuf_alloc(phba, MEM_PRI,
 230                                                     &prsp->phys);
 231                if (!prsp || !prsp->virt)
 232                        goto els_iocb_free_prsp_exit;
 233                INIT_LIST_HEAD(&prsp->list);
 234        } else
 235                prsp = NULL;
 236
 237        /* Allocate buffer for Buffer ptr list */
 238        pbuflist = kmalloc(sizeof(struct lpfc_dmabuf), GFP_KERNEL);
 239        if (pbuflist)
 240                pbuflist->virt = lpfc_mbuf_alloc(phba, MEM_PRI,
 241                                                 &pbuflist->phys);
 242        if (!pbuflist || !pbuflist->virt)
 243                goto els_iocb_free_pbuf_exit;
 244
 245        INIT_LIST_HEAD(&pbuflist->list);
 246
 247        if (expectRsp) {
 248                icmd->un.elsreq64.bdl.addrHigh = putPaddrHigh(pbuflist->phys);
 249                icmd->un.elsreq64.bdl.addrLow = putPaddrLow(pbuflist->phys);
 250                icmd->un.elsreq64.bdl.bdeFlags = BUFF_TYPE_BLP_64;
 251                icmd->un.elsreq64.bdl.bdeSize = (2 * sizeof(struct ulp_bde64));
 252
 253                icmd->un.elsreq64.remoteID = did;               /* DID */
 254                icmd->ulpCommand = CMD_ELS_REQUEST64_CR;
 255                if (elscmd == ELS_CMD_FLOGI)
 256                        icmd->ulpTimeout = FF_DEF_RATOV * 2;
 257                else if (elscmd == ELS_CMD_LOGO)
 258                        icmd->ulpTimeout = phba->fc_ratov;
 259                else
 260                        icmd->ulpTimeout = phba->fc_ratov * 2;
 261        } else {
 262                icmd->un.xseq64.bdl.addrHigh = putPaddrHigh(pbuflist->phys);
 263                icmd->un.xseq64.bdl.addrLow = putPaddrLow(pbuflist->phys);
 264                icmd->un.xseq64.bdl.bdeFlags = BUFF_TYPE_BLP_64;
 265                icmd->un.xseq64.bdl.bdeSize = sizeof(struct ulp_bde64);
 266                icmd->un.xseq64.xmit_els_remoteID = did;        /* DID */
 267                icmd->ulpCommand = CMD_XMIT_ELS_RSP64_CX;
 268        }
 269        icmd->ulpBdeCount = 1;
 270        icmd->ulpLe = 1;
 271        icmd->ulpClass = CLASS3;
 272
 273        /*
 274         * If we have NPIV enabled, we want to send ELS traffic by VPI.
 275         * For SLI4, since the driver controls VPIs we also want to include
 276         * all ELS pt2pt protocol traffic as well.
 277         */
 278        if ((phba->sli3_options & LPFC_SLI3_NPIV_ENABLED) ||
 279                ((phba->sli_rev == LPFC_SLI_REV4) &&
 280                    (vport->fc_flag & FC_PT2PT))) {
 281
 282                if (expectRsp) {
 283                        icmd->un.elsreq64.myID = vport->fc_myDID;
 284
 285                        /* For ELS_REQUEST64_CR, use the VPI by default */
 286                        icmd->ulpContext = phba->vpi_ids[vport->vpi];
 287                }
 288
 289                icmd->ulpCt_h = 0;
 290                /* The CT field must be 0=INVALID_RPI for the ECHO cmd */
 291                if (elscmd == ELS_CMD_ECHO)
 292                        icmd->ulpCt_l = 0; /* context = invalid RPI */
 293                else
 294                        icmd->ulpCt_l = 1; /* context = VPI */
 295        }
 296
 297        bpl = (struct ulp_bde64 *) pbuflist->virt;
 298        bpl->addrLow = le32_to_cpu(putPaddrLow(pcmd->phys));
 299        bpl->addrHigh = le32_to_cpu(putPaddrHigh(pcmd->phys));
 300        bpl->tus.f.bdeSize = cmdSize;
 301        bpl->tus.f.bdeFlags = 0;
 302        bpl->tus.w = le32_to_cpu(bpl->tus.w);
 303
 304        if (expectRsp) {
 305                bpl++;
 306                bpl->addrLow = le32_to_cpu(putPaddrLow(prsp->phys));
 307                bpl->addrHigh = le32_to_cpu(putPaddrHigh(prsp->phys));
 308                bpl->tus.f.bdeSize = FCELSSIZE;
 309                bpl->tus.f.bdeFlags = BUFF_TYPE_BDE_64;
 310                bpl->tus.w = le32_to_cpu(bpl->tus.w);
 311        }
 312
 313        elsiocb->context2 = pcmd;
 314        elsiocb->context3 = pbuflist;
 315        elsiocb->retry = retry;
 316        elsiocb->vport = vport;
 317        elsiocb->drvrTimeout = (phba->fc_ratov << 1) + LPFC_DRVR_TIMEOUT;
 318
 319        if (prsp) {
 320                list_add(&prsp->list, &pcmd->list);
 321        }
 322        if (expectRsp) {
 323                /* Xmit ELS command <elsCmd> to remote NPORT <did> */
 324                lpfc_printf_vlog(vport, KERN_INFO, LOG_ELS,
 325                                 "0116 Xmit ELS command x%x to remote "
 326                                 "NPORT x%x I/O tag: x%x, port state:x%x "
 327                                 "rpi x%x fc_flag:x%x nlp_flag:x%x vport:x%p\n",
 328                                 elscmd, did, elsiocb->iotag,
 329                                 vport->port_state, ndlp->nlp_rpi,
 330                                 vport->fc_flag, ndlp->nlp_flag, vport);
 331        } else {
 332                /* Xmit ELS response <elsCmd> to remote NPORT <did> */
 333                lpfc_printf_vlog(vport, KERN_INFO, LOG_ELS,
 334                                 "0117 Xmit ELS response x%x to remote "
 335                                 "NPORT x%x I/O tag: x%x, size: x%x "
 336                                 "port_state x%x  rpi x%x fc_flag x%x\n",
 337                                 elscmd, ndlp->nlp_DID, elsiocb->iotag,
 338                                 cmdSize, vport->port_state,
 339                                 ndlp->nlp_rpi, vport->fc_flag);
 340        }
 341        return elsiocb;
 342
 343els_iocb_free_pbuf_exit:
 344        if (expectRsp)
 345                lpfc_mbuf_free(phba, prsp->virt, prsp->phys);
 346        kfree(pbuflist);
 347
 348els_iocb_free_prsp_exit:
 349        lpfc_mbuf_free(phba, pcmd->virt, pcmd->phys);
 350        kfree(prsp);
 351
 352els_iocb_free_pcmb_exit:
 353        kfree(pcmd);
 354        lpfc_sli_release_iocbq(phba, elsiocb);
 355        return NULL;
 356}
 357
 358/**
 359 * lpfc_issue_fabric_reglogin - Issue fabric registration login for a vport
 360 * @vport: pointer to a host virtual N_Port data structure.
 361 *
 362 * This routine issues a fabric registration login for a @vport. An
 363 * active ndlp node with Fabric_DID must already exist for this @vport.
 364 * The routine invokes two mailbox commands to carry out fabric registration
 365 * login through the HBA firmware: the first mailbox command requests the
 366 * HBA to perform link configuration for the @vport; and the second mailbox
 367 * command requests the HBA to perform the actual fabric registration login
 368 * with the @vport.
 369 *
 370 * Return code
 371 *   0 - successfully issued fabric registration login for @vport
 372 *   -ENXIO -- failed to issue fabric registration login for @vport
 373 **/
 374int
 375lpfc_issue_fabric_reglogin(struct lpfc_vport *vport)
 376{
 377        struct lpfc_hba  *phba = vport->phba;
 378        LPFC_MBOXQ_t *mbox;
 379        struct lpfc_dmabuf *mp;
 380        struct lpfc_nodelist *ndlp;
 381        struct serv_parm *sp;
 382        int rc;
 383        int err = 0;
 384
 385        sp = &phba->fc_fabparam;
 386        ndlp = lpfc_findnode_did(vport, Fabric_DID);
 387        if (!ndlp) {
 388                err = 1;
 389                goto fail;
 390        }
 391
 392        mbox = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL);
 393        if (!mbox) {
 394                err = 2;
 395                goto fail;
 396        }
 397
 398        vport->port_state = LPFC_FABRIC_CFG_LINK;
 399        lpfc_config_link(phba, mbox);
 400        mbox->mbox_cmpl = lpfc_sli_def_mbox_cmpl;
 401        mbox->vport = vport;
 402
 403        rc = lpfc_sli_issue_mbox(phba, mbox, MBX_NOWAIT);
 404        if (rc == MBX_NOT_FINISHED) {
 405                err = 3;
 406                goto fail_free_mbox;
 407        }
 408
 409        mbox = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL);
 410        if (!mbox) {
 411                err = 4;
 412                goto fail;
 413        }
 414        rc = lpfc_reg_rpi(phba, vport->vpi, Fabric_DID, (uint8_t *)sp, mbox,
 415                          ndlp->nlp_rpi);
 416        if (rc) {
 417                err = 5;
 418                goto fail_free_mbox;
 419        }
 420
 421        mbox->mbox_cmpl = lpfc_mbx_cmpl_fabric_reg_login;
 422        mbox->vport = vport;
 423        /* increment the reference count on ndlp to hold reference
 424         * for the callback routine.
 425         */
 426        mbox->ctx_ndlp = lpfc_nlp_get(ndlp);
 427        if (!mbox->ctx_ndlp) {
 428                err = 6;
 429                goto fail_no_ndlp;
 430        }
 431
 432        rc = lpfc_sli_issue_mbox(phba, mbox, MBX_NOWAIT);
 433        if (rc == MBX_NOT_FINISHED) {
 434                err = 7;
 435                goto fail_issue_reg_login;
 436        }
 437
 438        return 0;
 439
 440fail_issue_reg_login:
 441        /* decrement the reference count on ndlp just incremented
 442         * for the failed mbox command.
 443         */
 444        lpfc_nlp_put(ndlp);
 445fail_no_ndlp:
 446        mp = (struct lpfc_dmabuf *)mbox->ctx_buf;
 447        lpfc_mbuf_free(phba, mp->virt, mp->phys);
 448        kfree(mp);
 449fail_free_mbox:
 450        mempool_free(mbox, phba->mbox_mem_pool);
 451
 452fail:
 453        lpfc_vport_set_state(vport, FC_VPORT_FAILED);
 454        lpfc_printf_vlog(vport, KERN_ERR, LOG_TRACE_EVENT,
 455                         "0249 Cannot issue Register Fabric login: Err %d\n",
 456                         err);
 457        return -ENXIO;
 458}
 459
 460/**
 461 * lpfc_issue_reg_vfi - Register VFI for this vport's fabric login
 462 * @vport: pointer to a host virtual N_Port data structure.
 463 *
 464 * This routine issues a REG_VFI mailbox for the vfi, vpi, fcfi triplet for
 465 * the @vport. This mailbox command is necessary for SLI4 port only.
 466 *
 467 * Return code
 468 *   0 - successfully issued REG_VFI for @vport
 469 *   A failure code otherwise.
 470 **/
 471int
 472lpfc_issue_reg_vfi(struct lpfc_vport *vport)
 473{
 474        struct lpfc_hba  *phba = vport->phba;
 475        LPFC_MBOXQ_t *mboxq = NULL;
 476        struct lpfc_nodelist *ndlp;
 477        struct lpfc_dmabuf *dmabuf = NULL;
 478        int rc = 0;
 479
 480        /* move forward in case of SLI4 FC port loopback test and pt2pt mode */
 481        if ((phba->sli_rev == LPFC_SLI_REV4) &&
 482            !(phba->link_flag & LS_LOOPBACK_MODE) &&
 483            !(vport->fc_flag & FC_PT2PT)) {
 484                ndlp = lpfc_findnode_did(vport, Fabric_DID);
 485                if (!ndlp) {
 486                        rc = -ENODEV;
 487                        goto fail;
 488                }
 489        }
 490
 491        mboxq = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL);
 492        if (!mboxq) {
 493                rc = -ENOMEM;
 494                goto fail;
 495        }
 496
 497        /* Supply CSP's only if we are fabric connect or pt-to-pt connect */
 498        if ((vport->fc_flag & FC_FABRIC) || (vport->fc_flag & FC_PT2PT)) {
 499                dmabuf = kzalloc(sizeof(struct lpfc_dmabuf), GFP_KERNEL);
 500                if (!dmabuf) {
 501                        rc = -ENOMEM;
 502                        goto fail;
 503                }
 504                dmabuf->virt = lpfc_mbuf_alloc(phba, MEM_PRI, &dmabuf->phys);
 505                if (!dmabuf->virt) {
 506                        rc = -ENOMEM;
 507                        goto fail;
 508                }
 509                memcpy(dmabuf->virt, &phba->fc_fabparam,
 510                       sizeof(struct serv_parm));
 511        }
 512
 513        vport->port_state = LPFC_FABRIC_CFG_LINK;
 514        if (dmabuf)
 515                lpfc_reg_vfi(mboxq, vport, dmabuf->phys);
 516        else
 517                lpfc_reg_vfi(mboxq, vport, 0);
 518
 519        mboxq->mbox_cmpl = lpfc_mbx_cmpl_reg_vfi;
 520        mboxq->vport = vport;
 521        mboxq->ctx_buf = dmabuf;
 522        rc = lpfc_sli_issue_mbox(phba, mboxq, MBX_NOWAIT);
 523        if (rc == MBX_NOT_FINISHED) {
 524                rc = -ENXIO;
 525                goto fail;
 526        }
 527        return 0;
 528
 529fail:
 530        if (mboxq)
 531                mempool_free(mboxq, phba->mbox_mem_pool);
 532        if (dmabuf) {
 533                if (dmabuf->virt)
 534                        lpfc_mbuf_free(phba, dmabuf->virt, dmabuf->phys);
 535                kfree(dmabuf);
 536        }
 537
 538        lpfc_vport_set_state(vport, FC_VPORT_FAILED);
 539        lpfc_printf_vlog(vport, KERN_ERR, LOG_TRACE_EVENT,
 540                         "0289 Issue Register VFI failed: Err %d\n", rc);
 541        return rc;
 542}
 543
 544/**
 545 * lpfc_issue_unreg_vfi - Unregister VFI for this vport's fabric login
 546 * @vport: pointer to a host virtual N_Port data structure.
 547 *
 548 * This routine issues a UNREG_VFI mailbox with the vfi, vpi, fcfi triplet for
 549 * the @vport. This mailbox command is necessary for SLI4 port only.
 550 *
 551 * Return code
 552 *   0 - successfully issued REG_VFI for @vport
 553 *   A failure code otherwise.
 554 **/
 555int
 556lpfc_issue_unreg_vfi(struct lpfc_vport *vport)
 557{
 558        struct lpfc_hba *phba = vport->phba;
 559        struct Scsi_Host *shost;
 560        LPFC_MBOXQ_t *mboxq;
 561        int rc;
 562
 563        mboxq = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL);
 564        if (!mboxq) {
 565                lpfc_printf_log(phba, KERN_ERR, LOG_TRACE_EVENT,
 566                                "2556 UNREG_VFI mbox allocation failed"
 567                                "HBA state x%x\n", phba->pport->port_state);
 568                return -ENOMEM;
 569        }
 570
 571        lpfc_unreg_vfi(mboxq, vport);
 572        mboxq->vport = vport;
 573        mboxq->mbox_cmpl = lpfc_unregister_vfi_cmpl;
 574
 575        rc = lpfc_sli_issue_mbox(phba, mboxq, MBX_NOWAIT);
 576        if (rc == MBX_NOT_FINISHED) {
 577                lpfc_printf_log(phba, KERN_ERR, LOG_TRACE_EVENT,
 578                                "2557 UNREG_VFI issue mbox failed rc x%x "
 579                                "HBA state x%x\n",
 580                                rc, phba->pport->port_state);
 581                mempool_free(mboxq, phba->mbox_mem_pool);
 582                return -EIO;
 583        }
 584
 585        shost = lpfc_shost_from_vport(vport);
 586        spin_lock_irq(shost->host_lock);
 587        vport->fc_flag &= ~FC_VFI_REGISTERED;
 588        spin_unlock_irq(shost->host_lock);
 589        return 0;
 590}
 591
 592/**
 593 * lpfc_check_clean_addr_bit - Check whether assigned FCID is clean.
 594 * @vport: pointer to a host virtual N_Port data structure.
 595 * @sp: pointer to service parameter data structure.
 596 *
 597 * This routine is called from FLOGI/FDISC completion handler functions.
 598 * lpfc_check_clean_addr_bit return 1 when FCID/Fabric portname/ Fabric
 599 * node nodename is changed in the completion service parameter else return
 600 * 0. This function also set flag in the vport data structure to delay
 601 * NP_Port discovery after the FLOGI/FDISC completion if Clean address bit
 602 * in FLOGI/FDISC response is cleared and FCID/Fabric portname/ Fabric
 603 * node nodename is changed in the completion service parameter.
 604 *
 605 * Return code
 606 *   0 - FCID and Fabric Nodename and Fabric portname is not changed.
 607 *   1 - FCID or Fabric Nodename or Fabric portname is changed.
 608 *
 609 **/
 610static uint8_t
 611lpfc_check_clean_addr_bit(struct lpfc_vport *vport,
 612                struct serv_parm *sp)
 613{
 614        struct lpfc_hba *phba = vport->phba;
 615        uint8_t fabric_param_changed = 0;
 616        struct Scsi_Host *shost = lpfc_shost_from_vport(vport);
 617
 618        if ((vport->fc_prevDID != vport->fc_myDID) ||
 619                memcmp(&vport->fabric_portname, &sp->portName,
 620                        sizeof(struct lpfc_name)) ||
 621                memcmp(&vport->fabric_nodename, &sp->nodeName,
 622                        sizeof(struct lpfc_name)) ||
 623                (vport->vport_flag & FAWWPN_PARAM_CHG)) {
 624                fabric_param_changed = 1;
 625                vport->vport_flag &= ~FAWWPN_PARAM_CHG;
 626        }
 627        /*
 628         * Word 1 Bit 31 in common service parameter is overloaded.
 629         * Word 1 Bit 31 in FLOGI request is multiple NPort request
 630         * Word 1 Bit 31 in FLOGI response is clean address bit
 631         *
 632         * If fabric parameter is changed and clean address bit is
 633         * cleared delay nport discovery if
 634         * - vport->fc_prevDID != 0 (not initial discovery) OR
 635         * - lpfc_delay_discovery module parameter is set.
 636         */
 637        if (fabric_param_changed && !sp->cmn.clean_address_bit &&
 638            (vport->fc_prevDID || phba->cfg_delay_discovery)) {
 639                spin_lock_irq(shost->host_lock);
 640                vport->fc_flag |= FC_DISC_DELAYED;
 641                spin_unlock_irq(shost->host_lock);
 642        }
 643
 644        return fabric_param_changed;
 645}
 646
 647
 648/**
 649 * lpfc_cmpl_els_flogi_fabric - Completion function for flogi to a fabric port
 650 * @vport: pointer to a host virtual N_Port data structure.
 651 * @ndlp: pointer to a node-list data structure.
 652 * @sp: pointer to service parameter data structure.
 653 * @irsp: pointer to the IOCB within the lpfc response IOCB.
 654 *
 655 * This routine is invoked by the lpfc_cmpl_els_flogi() completion callback
 656 * function to handle the completion of a Fabric Login (FLOGI) into a fabric
 657 * port in a fabric topology. It properly sets up the parameters to the @ndlp
 658 * from the IOCB response. It also check the newly assigned N_Port ID to the
 659 * @vport against the previously assigned N_Port ID. If it is different from
 660 * the previously assigned Destination ID (DID), the lpfc_unreg_rpi() routine
 661 * is invoked on all the remaining nodes with the @vport to unregister the
 662 * Remote Port Indicators (RPIs). Finally, the lpfc_issue_fabric_reglogin()
 663 * is invoked to register login to the fabric.
 664 *
 665 * Return code
 666 *   0 - Success (currently, always return 0)
 667 **/
 668static int
 669lpfc_cmpl_els_flogi_fabric(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
 670                           struct serv_parm *sp, IOCB_t *irsp)
 671{
 672        struct Scsi_Host *shost = lpfc_shost_from_vport(vport);
 673        struct lpfc_hba  *phba = vport->phba;
 674        struct lpfc_nodelist *np;
 675        struct lpfc_nodelist *next_np;
 676        uint8_t fabric_param_changed;
 677
 678        spin_lock_irq(shost->host_lock);
 679        vport->fc_flag |= FC_FABRIC;
 680        spin_unlock_irq(shost->host_lock);
 681
 682        phba->fc_edtov = be32_to_cpu(sp->cmn.e_d_tov);
 683        if (sp->cmn.edtovResolution)    /* E_D_TOV ticks are in nanoseconds */
 684                phba->fc_edtov = (phba->fc_edtov + 999999) / 1000000;
 685
 686        phba->fc_edtovResol = sp->cmn.edtovResolution;
 687        phba->fc_ratov = (be32_to_cpu(sp->cmn.w2.r_a_tov) + 999) / 1000;
 688
 689        if (phba->fc_topology == LPFC_TOPOLOGY_LOOP) {
 690                spin_lock_irq(shost->host_lock);
 691                vport->fc_flag |= FC_PUBLIC_LOOP;
 692                spin_unlock_irq(shost->host_lock);
 693        }
 694
 695        vport->fc_myDID = irsp->un.ulpWord[4] & Mask_DID;
 696        memcpy(&ndlp->nlp_portname, &sp->portName, sizeof(struct lpfc_name));
 697        memcpy(&ndlp->nlp_nodename, &sp->nodeName, sizeof(struct lpfc_name));
 698        ndlp->nlp_class_sup = 0;
 699        if (sp->cls1.classValid)
 700                ndlp->nlp_class_sup |= FC_COS_CLASS1;
 701        if (sp->cls2.classValid)
 702                ndlp->nlp_class_sup |= FC_COS_CLASS2;
 703        if (sp->cls3.classValid)
 704                ndlp->nlp_class_sup |= FC_COS_CLASS3;
 705        if (sp->cls4.classValid)
 706                ndlp->nlp_class_sup |= FC_COS_CLASS4;
 707        ndlp->nlp_maxframe = ((sp->cmn.bbRcvSizeMsb & 0x0F) << 8) |
 708                                sp->cmn.bbRcvSizeLsb;
 709
 710        fabric_param_changed = lpfc_check_clean_addr_bit(vport, sp);
 711        if (fabric_param_changed) {
 712                /* Reset FDMI attribute masks based on config parameter */
 713                if (phba->cfg_enable_SmartSAN ||
 714                    (phba->cfg_fdmi_on == LPFC_FDMI_SUPPORT)) {
 715                        /* Setup appropriate attribute masks */
 716                        vport->fdmi_hba_mask = LPFC_FDMI2_HBA_ATTR;
 717                        if (phba->cfg_enable_SmartSAN)
 718                                vport->fdmi_port_mask = LPFC_FDMI2_SMART_ATTR;
 719                        else
 720                                vport->fdmi_port_mask = LPFC_FDMI2_PORT_ATTR;
 721                } else {
 722                        vport->fdmi_hba_mask = 0;
 723                        vport->fdmi_port_mask = 0;
 724                }
 725
 726        }
 727        memcpy(&vport->fabric_portname, &sp->portName,
 728                        sizeof(struct lpfc_name));
 729        memcpy(&vport->fabric_nodename, &sp->nodeName,
 730                        sizeof(struct lpfc_name));
 731        memcpy(&phba->fc_fabparam, sp, sizeof(struct serv_parm));
 732
 733        if (phba->sli3_options & LPFC_SLI3_NPIV_ENABLED) {
 734                if (sp->cmn.response_multiple_NPort) {
 735                        lpfc_printf_vlog(vport, KERN_WARNING,
 736                                         LOG_ELS | LOG_VPORT,
 737                                         "1816 FLOGI NPIV supported, "
 738                                         "response data 0x%x\n",
 739                                         sp->cmn.response_multiple_NPort);
 740                        spin_lock_irq(&phba->hbalock);
 741                        phba->link_flag |= LS_NPIV_FAB_SUPPORTED;
 742                        spin_unlock_irq(&phba->hbalock);
 743                } else {
 744                        /* Because we asked f/w for NPIV it still expects us
 745                        to call reg_vnpid at least for the physical host */
 746                        lpfc_printf_vlog(vport, KERN_WARNING,
 747                                         LOG_ELS | LOG_VPORT,
 748                                         "1817 Fabric does not support NPIV "
 749                                         "- configuring single port mode.\n");
 750                        spin_lock_irq(&phba->hbalock);
 751                        phba->link_flag &= ~LS_NPIV_FAB_SUPPORTED;
 752                        spin_unlock_irq(&phba->hbalock);
 753                }
 754        }
 755
 756        /*
 757         * For FC we need to do some special processing because of the SLI
 758         * Port's default settings of the Common Service Parameters.
 759         */
 760        if ((phba->sli_rev == LPFC_SLI_REV4) &&
 761            (phba->sli4_hba.lnk_info.lnk_tp == LPFC_LNK_TYPE_FC)) {
 762                /* If physical FC port changed, unreg VFI and ALL VPIs / RPIs */
 763                if (fabric_param_changed)
 764                        lpfc_unregister_fcf_prep(phba);
 765
 766                /* This should just update the VFI CSPs*/
 767                if (vport->fc_flag & FC_VFI_REGISTERED)
 768                        lpfc_issue_reg_vfi(vport);
 769        }
 770
 771        if (fabric_param_changed &&
 772                !(vport->fc_flag & FC_VPORT_NEEDS_REG_VPI)) {
 773
 774                /* If our NportID changed, we need to ensure all
 775                 * remaining NPORTs get unreg_login'ed.
 776                 */
 777                list_for_each_entry_safe(np, next_np,
 778                                        &vport->fc_nodes, nlp_listp) {
 779                        if ((np->nlp_state != NLP_STE_NPR_NODE) ||
 780                                   !(np->nlp_flag & NLP_NPR_ADISC))
 781                                continue;
 782                        spin_lock_irq(&np->lock);
 783                        np->nlp_flag &= ~NLP_NPR_ADISC;
 784                        spin_unlock_irq(&np->lock);
 785                        lpfc_unreg_rpi(vport, np);
 786                }
 787                lpfc_cleanup_pending_mbox(vport);
 788
 789                if (phba->sli_rev == LPFC_SLI_REV4) {
 790                        lpfc_sli4_unreg_all_rpis(vport);
 791                        lpfc_mbx_unreg_vpi(vport);
 792                        spin_lock_irq(shost->host_lock);
 793                        vport->fc_flag |= FC_VPORT_NEEDS_INIT_VPI;
 794                        spin_unlock_irq(shost->host_lock);
 795                }
 796
 797                /*
 798                 * For SLI3 and SLI4, the VPI needs to be reregistered in
 799                 * response to this fabric parameter change event.
 800                 */
 801                spin_lock_irq(shost->host_lock);
 802                vport->fc_flag |= FC_VPORT_NEEDS_REG_VPI;
 803                spin_unlock_irq(shost->host_lock);
 804        } else if ((phba->sli_rev == LPFC_SLI_REV4) &&
 805                !(vport->fc_flag & FC_VPORT_NEEDS_REG_VPI)) {
 806                        /*
 807                         * Driver needs to re-reg VPI in order for f/w
 808                         * to update the MAC address.
 809                         */
 810                        lpfc_nlp_set_state(vport, ndlp, NLP_STE_UNMAPPED_NODE);
 811                        lpfc_register_new_vport(phba, vport, ndlp);
 812                        return 0;
 813        }
 814
 815        if (phba->sli_rev < LPFC_SLI_REV4) {
 816                lpfc_nlp_set_state(vport, ndlp, NLP_STE_REG_LOGIN_ISSUE);
 817                if (phba->sli3_options & LPFC_SLI3_NPIV_ENABLED &&
 818                    vport->fc_flag & FC_VPORT_NEEDS_REG_VPI)
 819                        lpfc_register_new_vport(phba, vport, ndlp);
 820                else
 821                        lpfc_issue_fabric_reglogin(vport);
 822        } else {
 823                ndlp->nlp_type |= NLP_FABRIC;
 824                lpfc_nlp_set_state(vport, ndlp, NLP_STE_UNMAPPED_NODE);
 825                if ((!(vport->fc_flag & FC_VPORT_NEEDS_REG_VPI)) &&
 826                        (vport->vpi_state & LPFC_VPI_REGISTERED)) {
 827                        lpfc_start_fdiscs(phba);
 828                        lpfc_do_scr_ns_plogi(phba, vport);
 829                } else if (vport->fc_flag & FC_VFI_REGISTERED)
 830                        lpfc_issue_init_vpi(vport);
 831                else {
 832                        lpfc_printf_vlog(vport, KERN_INFO, LOG_ELS,
 833                                        "3135 Need register VFI: (x%x/%x)\n",
 834                                        vport->fc_prevDID, vport->fc_myDID);
 835                        lpfc_issue_reg_vfi(vport);
 836                }
 837        }
 838        return 0;
 839}
 840
 841/**
 842 * lpfc_cmpl_els_flogi_nport - Completion function for flogi to an N_Port
 843 * @vport: pointer to a host virtual N_Port data structure.
 844 * @ndlp: pointer to a node-list data structure.
 845 * @sp: pointer to service parameter data structure.
 846 *
 847 * This routine is invoked by the lpfc_cmpl_els_flogi() completion callback
 848 * function to handle the completion of a Fabric Login (FLOGI) into an N_Port
 849 * in a point-to-point topology. First, the @vport's N_Port Name is compared
 850 * with the received N_Port Name: if the @vport's N_Port Name is greater than
 851 * the received N_Port Name lexicographically, this node shall assign local
 852 * N_Port ID (PT2PT_LocalID: 1) and remote N_Port ID (PT2PT_RemoteID: 2) and
 853 * will send out Port Login (PLOGI) with the N_Port IDs assigned. Otherwise,
 854 * this node shall just wait for the remote node to issue PLOGI and assign
 855 * N_Port IDs.
 856 *
 857 * Return code
 858 *   0 - Success
 859 *   -ENXIO - Fail
 860 **/
 861static int
 862lpfc_cmpl_els_flogi_nport(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
 863                          struct serv_parm *sp)
 864{
 865        struct Scsi_Host *shost = lpfc_shost_from_vport(vport);
 866        struct lpfc_hba  *phba = vport->phba;
 867        LPFC_MBOXQ_t *mbox;
 868        int rc;
 869
 870        spin_lock_irq(shost->host_lock);
 871        vport->fc_flag &= ~(FC_FABRIC | FC_PUBLIC_LOOP);
 872        vport->fc_flag |= FC_PT2PT;
 873        spin_unlock_irq(shost->host_lock);
 874
 875        /* If we are pt2pt with another NPort, force NPIV off! */
 876        phba->sli3_options &= ~LPFC_SLI3_NPIV_ENABLED;
 877
 878        /* If physical FC port changed, unreg VFI and ALL VPIs / RPIs */
 879        if ((phba->sli_rev == LPFC_SLI_REV4) && phba->fc_topology_changed) {
 880                lpfc_unregister_fcf_prep(phba);
 881
 882                spin_lock_irq(shost->host_lock);
 883                vport->fc_flag &= ~FC_VFI_REGISTERED;
 884                spin_unlock_irq(shost->host_lock);
 885                phba->fc_topology_changed = 0;
 886        }
 887
 888        rc = memcmp(&vport->fc_portname, &sp->portName,
 889                    sizeof(vport->fc_portname));
 890
 891        if (rc >= 0) {
 892                /* This side will initiate the PLOGI */
 893                spin_lock_irq(shost->host_lock);
 894                vport->fc_flag |= FC_PT2PT_PLOGI;
 895                spin_unlock_irq(shost->host_lock);
 896
 897                /*
 898                 * N_Port ID cannot be 0, set our Id to LocalID
 899                 * the other side will be RemoteID.
 900                 */
 901
 902                /* not equal */
 903                if (rc)
 904                        vport->fc_myDID = PT2PT_LocalID;
 905
 906                /* Decrement ndlp reference count indicating that ndlp can be
 907                 * safely released when other references to it are done.
 908                 */
 909                lpfc_nlp_put(ndlp);
 910
 911                ndlp = lpfc_findnode_did(vport, PT2PT_RemoteID);
 912                if (!ndlp) {
 913                        /*
 914                         * Cannot find existing Fabric ndlp, so allocate a
 915                         * new one
 916                         */
 917                        ndlp = lpfc_nlp_init(vport, PT2PT_RemoteID);
 918                        if (!ndlp)
 919                                goto fail;
 920                }
 921
 922                memcpy(&ndlp->nlp_portname, &sp->portName,
 923                       sizeof(struct lpfc_name));
 924                memcpy(&ndlp->nlp_nodename, &sp->nodeName,
 925                       sizeof(struct lpfc_name));
 926                /* Set state will put ndlp onto node list if not already done */
 927                lpfc_nlp_set_state(vport, ndlp, NLP_STE_NPR_NODE);
 928                spin_lock_irq(&ndlp->lock);
 929                ndlp->nlp_flag |= NLP_NPR_2B_DISC;
 930                spin_unlock_irq(&ndlp->lock);
 931
 932                mbox = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL);
 933                if (!mbox)
 934                        goto fail;
 935
 936                lpfc_config_link(phba, mbox);
 937
 938                mbox->mbox_cmpl = lpfc_mbx_cmpl_local_config_link;
 939                mbox->vport = vport;
 940                rc = lpfc_sli_issue_mbox(phba, mbox, MBX_NOWAIT);
 941                if (rc == MBX_NOT_FINISHED) {
 942                        mempool_free(mbox, phba->mbox_mem_pool);
 943                        goto fail;
 944                }
 945        } else {
 946                /* This side will wait for the PLOGI, decrement ndlp reference
 947                 * count indicating that ndlp can be released when other
 948                 * references to it are done.
 949                 */
 950                lpfc_nlp_put(ndlp);
 951
 952                /* Start discovery - this should just do CLEAR_LA */
 953                lpfc_disc_start(vport);
 954        }
 955
 956        return 0;
 957fail:
 958        return -ENXIO;
 959}
 960
 961/**
 962 * lpfc_cmpl_els_flogi - Completion callback function for flogi
 963 * @phba: pointer to lpfc hba data structure.
 964 * @cmdiocb: pointer to lpfc command iocb data structure.
 965 * @rspiocb: pointer to lpfc response iocb data structure.
 966 *
 967 * This routine is the top-level completion callback function for issuing
 968 * a Fabric Login (FLOGI) command. If the response IOCB reported error,
 969 * the lpfc_els_retry() routine shall be invoked to retry the FLOGI. If
 970 * retry has been made (either immediately or delayed with lpfc_els_retry()
 971 * returning 1), the command IOCB will be released and function returned.
 972 * If the retry attempt has been given up (possibly reach the maximum
 973 * number of retries), one additional decrement of ndlp reference shall be
 974 * invoked before going out after releasing the command IOCB. This will
 975 * actually release the remote node (Note, lpfc_els_free_iocb() will also
 976 * invoke one decrement of ndlp reference count). If no error reported in
 977 * the IOCB status, the command Port ID field is used to determine whether
 978 * this is a point-to-point topology or a fabric topology: if the Port ID
 979 * field is assigned, it is a fabric topology; otherwise, it is a
 980 * point-to-point topology. The routine lpfc_cmpl_els_flogi_fabric() or
 981 * lpfc_cmpl_els_flogi_nport() shall be invoked accordingly to handle the
 982 * specific topology completion conditions.
 983 **/
 984static void
 985lpfc_cmpl_els_flogi(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
 986                    struct lpfc_iocbq *rspiocb)
 987{
 988        struct lpfc_vport *vport = cmdiocb->vport;
 989        struct Scsi_Host  *shost = lpfc_shost_from_vport(vport);
 990        IOCB_t *irsp = &rspiocb->iocb;
 991        struct lpfc_nodelist *ndlp = cmdiocb->context1;
 992        struct lpfc_dmabuf *pcmd = cmdiocb->context2, *prsp;
 993        struct serv_parm *sp;
 994        uint16_t fcf_index;
 995        int rc;
 996
 997        /* Check to see if link went down during discovery */
 998        if (lpfc_els_chk_latt(vport)) {
 999                /* One additional decrement on node reference count to
1000                 * trigger the release of the node
1001                 */
1002                lpfc_nlp_put(ndlp);
1003                goto out;
1004        }
1005
1006        lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_CMD,
1007                "FLOGI cmpl:      status:x%x/x%x state:x%x",
1008                irsp->ulpStatus, irsp->un.ulpWord[4],
1009                vport->port_state);
1010
1011        if (irsp->ulpStatus) {
1012                /*
1013                 * In case of FIP mode, perform roundrobin FCF failover
1014                 * due to new FCF discovery
1015                 */
1016                if ((phba->hba_flag & HBA_FIP_SUPPORT) &&
1017                    (phba->fcf.fcf_flag & FCF_DISCOVERY)) {
1018                        if (phba->link_state < LPFC_LINK_UP)
1019                                goto stop_rr_fcf_flogi;
1020                        if ((phba->fcoe_cvl_eventtag_attn ==
1021                             phba->fcoe_cvl_eventtag) &&
1022                            (irsp->ulpStatus == IOSTAT_LOCAL_REJECT) &&
1023                            ((irsp->un.ulpWord[4] & IOERR_PARAM_MASK) ==
1024                            IOERR_SLI_ABORTED))
1025                                goto stop_rr_fcf_flogi;
1026                        else
1027                                phba->fcoe_cvl_eventtag_attn =
1028                                        phba->fcoe_cvl_eventtag;
1029                        lpfc_printf_log(phba, KERN_WARNING, LOG_FIP | LOG_ELS,
1030                                        "2611 FLOGI failed on FCF (x%x), "
1031                                        "status:x%x/x%x, tmo:x%x, perform "
1032                                        "roundrobin FCF failover\n",
1033                                        phba->fcf.current_rec.fcf_indx,
1034                                        irsp->ulpStatus, irsp->un.ulpWord[4],
1035                                        irsp->ulpTimeout);
1036                        lpfc_sli4_set_fcf_flogi_fail(phba,
1037                                        phba->fcf.current_rec.fcf_indx);
1038                        fcf_index = lpfc_sli4_fcf_rr_next_index_get(phba);
1039                        rc = lpfc_sli4_fcf_rr_next_proc(vport, fcf_index);
1040                        if (rc)
1041                                goto out;
1042                }
1043
1044stop_rr_fcf_flogi:
1045                /* FLOGI failure */
1046                if (!(irsp->ulpStatus == IOSTAT_LOCAL_REJECT &&
1047                      ((irsp->un.ulpWord[4] & IOERR_PARAM_MASK) ==
1048                                        IOERR_LOOP_OPEN_FAILURE)))
1049                        lpfc_printf_vlog(vport, KERN_ERR, LOG_TRACE_EVENT,
1050                                         "2858 FLOGI failure Status:x%x/x%x TMO"
1051                                         ":x%x Data x%x x%x\n",
1052                                         irsp->ulpStatus, irsp->un.ulpWord[4],
1053                                         irsp->ulpTimeout, phba->hba_flag,
1054                                         phba->fcf.fcf_flag);
1055
1056                /* Check for retry */
1057                if (lpfc_els_retry(phba, cmdiocb, rspiocb))
1058                        goto out;
1059
1060                lpfc_printf_vlog(vport, KERN_WARNING, LOG_TRACE_EVENT,
1061                                 "0150 FLOGI failure Status:x%x/x%x "
1062                                 "xri x%x TMO:x%x\n",
1063                                 irsp->ulpStatus, irsp->un.ulpWord[4],
1064                                 cmdiocb->sli4_xritag, irsp->ulpTimeout);
1065
1066                /* If this is not a loop open failure, bail out */
1067                if (!(irsp->ulpStatus == IOSTAT_LOCAL_REJECT &&
1068                      ((irsp->un.ulpWord[4] & IOERR_PARAM_MASK) ==
1069                                        IOERR_LOOP_OPEN_FAILURE)))
1070                        goto flogifail;
1071
1072                /* FLOGI failed, so there is no fabric */
1073                spin_lock_irq(shost->host_lock);
1074                vport->fc_flag &= ~(FC_FABRIC | FC_PUBLIC_LOOP);
1075                spin_unlock_irq(shost->host_lock);
1076
1077                /* If private loop, then allow max outstanding els to be
1078                 * LPFC_MAX_DISC_THREADS (32). Scanning in the case of no
1079                 * alpa map would take too long otherwise.
1080                 */
1081                if (phba->alpa_map[0] == 0)
1082                        vport->cfg_discovery_threads = LPFC_MAX_DISC_THREADS;
1083                if ((phba->sli_rev == LPFC_SLI_REV4) &&
1084                    (!(vport->fc_flag & FC_VFI_REGISTERED) ||
1085                     (vport->fc_prevDID != vport->fc_myDID) ||
1086                        phba->fc_topology_changed)) {
1087                        if (vport->fc_flag & FC_VFI_REGISTERED) {
1088                                if (phba->fc_topology_changed) {
1089                                        lpfc_unregister_fcf_prep(phba);
1090                                        spin_lock_irq(shost->host_lock);
1091                                        vport->fc_flag &= ~FC_VFI_REGISTERED;
1092                                        spin_unlock_irq(shost->host_lock);
1093                                        phba->fc_topology_changed = 0;
1094                                } else {
1095                                        lpfc_sli4_unreg_all_rpis(vport);
1096                                }
1097                        }
1098
1099                        /* Do not register VFI if the driver aborted FLOGI */
1100                        if (!lpfc_error_lost_link(irsp))
1101                                lpfc_issue_reg_vfi(vport);
1102
1103                        lpfc_nlp_put(ndlp);
1104                        goto out;
1105                }
1106                goto flogifail;
1107        }
1108        spin_lock_irq(shost->host_lock);
1109        vport->fc_flag &= ~FC_VPORT_CVL_RCVD;
1110        vport->fc_flag &= ~FC_VPORT_LOGO_RCVD;
1111        spin_unlock_irq(shost->host_lock);
1112
1113        /*
1114         * The FLogI succeeded.  Sync the data for the CPU before
1115         * accessing it.
1116         */
1117        prsp = list_get_first(&pcmd->list, struct lpfc_dmabuf, list);
1118        if (!prsp)
1119                goto out;
1120        sp = prsp->virt + sizeof(uint32_t);
1121
1122        /* FLOGI completes successfully */
1123        lpfc_printf_vlog(vport, KERN_INFO, LOG_ELS,
1124                         "0101 FLOGI completes successfully, I/O tag:x%x, "
1125                         "xri x%x Data: x%x x%x x%x x%x x%x x%x x%x\n",
1126                         cmdiocb->iotag, cmdiocb->sli4_xritag,
1127                         irsp->un.ulpWord[4], sp->cmn.e_d_tov,
1128                         sp->cmn.w2.r_a_tov, sp->cmn.edtovResolution,
1129                         vport->port_state, vport->fc_flag,
1130                         sp->cmn.priority_tagging);
1131
1132        if (sp->cmn.priority_tagging)
1133                vport->vmid_flag |= LPFC_VMID_ISSUE_QFPA;
1134
1135        if (vport->port_state == LPFC_FLOGI) {
1136                /*
1137                 * If Common Service Parameters indicate Nport
1138                 * we are point to point, if Fport we are Fabric.
1139                 */
1140                if (sp->cmn.fPort)
1141                        rc = lpfc_cmpl_els_flogi_fabric(vport, ndlp, sp, irsp);
1142                else if (!(phba->hba_flag & HBA_FCOE_MODE))
1143                        rc = lpfc_cmpl_els_flogi_nport(vport, ndlp, sp);
1144                else {
1145                        lpfc_printf_vlog(vport, KERN_ERR, LOG_TRACE_EVENT,
1146                                "2831 FLOGI response with cleared Fabric "
1147                                "bit fcf_index 0x%x "
1148                                "Switch Name %02x%02x%02x%02x%02x%02x%02x%02x "
1149                                "Fabric Name "
1150                                "%02x%02x%02x%02x%02x%02x%02x%02x\n",
1151                                phba->fcf.current_rec.fcf_indx,
1152                                phba->fcf.current_rec.switch_name[0],
1153                                phba->fcf.current_rec.switch_name[1],
1154                                phba->fcf.current_rec.switch_name[2],
1155                                phba->fcf.current_rec.switch_name[3],
1156                                phba->fcf.current_rec.switch_name[4],
1157                                phba->fcf.current_rec.switch_name[5],
1158                                phba->fcf.current_rec.switch_name[6],
1159                                phba->fcf.current_rec.switch_name[7],
1160                                phba->fcf.current_rec.fabric_name[0],
1161                                phba->fcf.current_rec.fabric_name[1],
1162                                phba->fcf.current_rec.fabric_name[2],
1163                                phba->fcf.current_rec.fabric_name[3],
1164                                phba->fcf.current_rec.fabric_name[4],
1165                                phba->fcf.current_rec.fabric_name[5],
1166                                phba->fcf.current_rec.fabric_name[6],
1167                                phba->fcf.current_rec.fabric_name[7]);
1168
1169                        lpfc_nlp_put(ndlp);
1170                        spin_lock_irq(&phba->hbalock);
1171                        phba->fcf.fcf_flag &= ~FCF_DISCOVERY;
1172                        phba->hba_flag &= ~(FCF_RR_INPROG | HBA_DEVLOSS_TMO);
1173                        spin_unlock_irq(&phba->hbalock);
1174                        phba->fcf.fcf_redisc_attempted = 0; /* reset */
1175                        goto out;
1176                }
1177                if (!rc) {
1178                        /* Mark the FCF discovery process done */
1179                        if (phba->hba_flag & HBA_FIP_SUPPORT)
1180                                lpfc_printf_vlog(vport, KERN_INFO, LOG_FIP |
1181                                                LOG_ELS,
1182                                                "2769 FLOGI to FCF (x%x) "
1183                                                "completed successfully\n",
1184                                                phba->fcf.current_rec.fcf_indx);
1185                        spin_lock_irq(&phba->hbalock);
1186                        phba->fcf.fcf_flag &= ~FCF_DISCOVERY;
1187                        phba->hba_flag &= ~(FCF_RR_INPROG | HBA_DEVLOSS_TMO);
1188                        spin_unlock_irq(&phba->hbalock);
1189                        phba->fcf.fcf_redisc_attempted = 0; /* reset */
1190                        goto out;
1191                }
1192        } else if (vport->port_state > LPFC_FLOGI &&
1193                   vport->fc_flag & FC_PT2PT) {
1194                /*
1195                 * In a p2p topology, it is possible that discovery has
1196                 * already progressed, and this completion can be ignored.
1197                 * Recheck the indicated topology.
1198                 */
1199                if (!sp->cmn.fPort)
1200                        goto out;
1201        }
1202
1203flogifail:
1204        spin_lock_irq(&phba->hbalock);
1205        phba->fcf.fcf_flag &= ~FCF_DISCOVERY;
1206        spin_unlock_irq(&phba->hbalock);
1207
1208        if (!(ndlp->fc4_xpt_flags & (SCSI_XPT_REGD | NVME_XPT_REGD)))
1209                lpfc_nlp_put(ndlp);
1210        if (!lpfc_error_lost_link(irsp)) {
1211                /* FLOGI failed, so just use loop map to make discovery list */
1212                lpfc_disc_list_loopmap(vport);
1213
1214                /* Start discovery */
1215                lpfc_disc_start(vport);
1216        } else if (((irsp->ulpStatus != IOSTAT_LOCAL_REJECT) ||
1217                        (((irsp->un.ulpWord[4] & IOERR_PARAM_MASK) !=
1218                         IOERR_SLI_ABORTED) &&
1219                        ((irsp->un.ulpWord[4] & IOERR_PARAM_MASK) !=
1220                         IOERR_SLI_DOWN))) &&
1221                        (phba->link_state != LPFC_CLEAR_LA)) {
1222                /* If FLOGI failed enable link interrupt. */
1223                lpfc_issue_clear_la(phba, vport);
1224        }
1225out:
1226        phba->hba_flag &= ~HBA_FLOGI_OUTSTANDING;
1227        lpfc_els_free_iocb(phba, cmdiocb);
1228        lpfc_nlp_put(ndlp);
1229}
1230
1231/**
1232 * lpfc_cmpl_els_link_down - Completion callback function for ELS command
1233 *                           aborted during a link down
1234 * @phba: pointer to lpfc hba data structure.
1235 * @cmdiocb: pointer to lpfc command iocb data structure.
1236 * @rspiocb: pointer to lpfc response iocb data structure.
1237 *
1238 */
1239static void
1240lpfc_cmpl_els_link_down(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
1241                        struct lpfc_iocbq *rspiocb)
1242{
1243        IOCB_t *irsp;
1244        uint32_t *pcmd;
1245        uint32_t cmd;
1246
1247        pcmd = (uint32_t *)(((struct lpfc_dmabuf *)cmdiocb->context2)->virt);
1248        cmd = *pcmd;
1249        irsp = &rspiocb->iocb;
1250
1251        lpfc_printf_log(phba, KERN_INFO, LOG_ELS,
1252                        "6445 ELS completes after LINK_DOWN: "
1253                        " Status %x/%x cmd x%x flg x%x\n",
1254                        irsp->ulpStatus, irsp->un.ulpWord[4], cmd,
1255                        cmdiocb->iocb_flag);
1256
1257        if (cmdiocb->iocb_flag & LPFC_IO_FABRIC) {
1258                cmdiocb->iocb_flag &= ~LPFC_IO_FABRIC;
1259                atomic_dec(&phba->fabric_iocb_count);
1260        }
1261        lpfc_els_free_iocb(phba, cmdiocb);
1262}
1263
1264/**
1265 * lpfc_issue_els_flogi - Issue an flogi iocb command for a vport
1266 * @vport: pointer to a host virtual N_Port data structure.
1267 * @ndlp: pointer to a node-list data structure.
1268 * @retry: number of retries to the command IOCB.
1269 *
1270 * This routine issues a Fabric Login (FLOGI) Request ELS command
1271 * for a @vport. The initiator service parameters are put into the payload
1272 * of the FLOGI Request IOCB and the top-level callback function pointer
1273 * to lpfc_cmpl_els_flogi() routine is put to the IOCB completion callback
1274 * function field. The lpfc_issue_fabric_iocb routine is invoked to send
1275 * out FLOGI ELS command with one outstanding fabric IOCB at a time.
1276 *
1277 * Note that the ndlp reference count will be incremented by 1 for holding the
1278 * ndlp and the reference to ndlp will be stored into the context1 field of
1279 * the IOCB for the completion callback function to the FLOGI ELS command.
1280 *
1281 * Return code
1282 *   0 - successfully issued flogi iocb for @vport
1283 *   1 - failed to issue flogi iocb for @vport
1284 **/
1285static int
1286lpfc_issue_els_flogi(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
1287                     uint8_t retry)
1288{
1289        struct lpfc_hba  *phba = vport->phba;
1290        struct serv_parm *sp;
1291        IOCB_t *icmd;
1292        struct lpfc_iocbq *elsiocb;
1293        struct lpfc_iocbq defer_flogi_acc;
1294        uint8_t *pcmd;
1295        uint16_t cmdsize;
1296        uint32_t tmo, did;
1297        int rc;
1298
1299        cmdsize = (sizeof(uint32_t) + sizeof(struct serv_parm));
1300        elsiocb = lpfc_prep_els_iocb(vport, 1, cmdsize, retry, ndlp,
1301                                     ndlp->nlp_DID, ELS_CMD_FLOGI);
1302
1303        if (!elsiocb)
1304                return 1;
1305
1306        icmd = &elsiocb->iocb;
1307        pcmd = (uint8_t *) (((struct lpfc_dmabuf *) elsiocb->context2)->virt);
1308
1309        /* For FLOGI request, remainder of payload is service parameters */
1310        *((uint32_t *) (pcmd)) = ELS_CMD_FLOGI;
1311        pcmd += sizeof(uint32_t);
1312        memcpy(pcmd, &vport->fc_sparam, sizeof(struct serv_parm));
1313        sp = (struct serv_parm *) pcmd;
1314
1315        /* Setup CSPs accordingly for Fabric */
1316        sp->cmn.e_d_tov = 0;
1317        sp->cmn.w2.r_a_tov = 0;
1318        sp->cmn.virtual_fabric_support = 0;
1319        sp->cls1.classValid = 0;
1320        if (sp->cmn.fcphLow < FC_PH3)
1321                sp->cmn.fcphLow = FC_PH3;
1322        if (sp->cmn.fcphHigh < FC_PH3)
1323                sp->cmn.fcphHigh = FC_PH3;
1324
1325        /* Determine if switch supports priority tagging */
1326        if (phba->cfg_vmid_priority_tagging) {
1327                sp->cmn.priority_tagging = 1;
1328                /* lpfc_vmid_host_uuid is combination of wwpn and wwnn */
1329                if (uuid_is_null((uuid_t *)vport->lpfc_vmid_host_uuid)) {
1330                        memcpy(vport->lpfc_vmid_host_uuid, phba->wwpn,
1331                               sizeof(phba->wwpn));
1332                        memcpy(&vport->lpfc_vmid_host_uuid[8], phba->wwnn,
1333                               sizeof(phba->wwnn));
1334                }
1335        }
1336
1337        if  (phba->sli_rev == LPFC_SLI_REV4) {
1338                if (bf_get(lpfc_sli_intf_if_type, &phba->sli4_hba.sli_intf) ==
1339                    LPFC_SLI_INTF_IF_TYPE_0) {
1340                        elsiocb->iocb.ulpCt_h = ((SLI4_CT_FCFI >> 1) & 1);
1341                        elsiocb->iocb.ulpCt_l = (SLI4_CT_FCFI & 1);
1342                        /* FLOGI needs to be 3 for WQE FCFI */
1343                        /* Set the fcfi to the fcfi we registered with */
1344                        elsiocb->iocb.ulpContext = phba->fcf.fcfi;
1345                }
1346                /* Can't do SLI4 class2 without support sequence coalescing */
1347                sp->cls2.classValid = 0;
1348                sp->cls2.seqDelivery = 0;
1349        } else {
1350                /* Historical, setting sequential-delivery bit for SLI3 */
1351                sp->cls2.seqDelivery = (sp->cls2.classValid) ? 1 : 0;
1352                sp->cls3.seqDelivery = (sp->cls3.classValid) ? 1 : 0;
1353                if (phba->sli3_options & LPFC_SLI3_NPIV_ENABLED) {
1354                        sp->cmn.request_multiple_Nport = 1;
1355                        /* For FLOGI, Let FLOGI rsp set the NPortID for VPI 0 */
1356                        icmd->ulpCt_h = 1;
1357                        icmd->ulpCt_l = 0;
1358                } else
1359                        sp->cmn.request_multiple_Nport = 0;
1360        }
1361
1362        if (phba->fc_topology != LPFC_TOPOLOGY_LOOP) {
1363                icmd->un.elsreq64.myID = 0;
1364                icmd->un.elsreq64.fl = 1;
1365        }
1366
1367        tmo = phba->fc_ratov;
1368        phba->fc_ratov = LPFC_DISC_FLOGI_TMO;
1369        lpfc_set_disctmo(vport);
1370        phba->fc_ratov = tmo;
1371
1372        phba->fc_stat.elsXmitFLOGI++;
1373        elsiocb->iocb_cmpl = lpfc_cmpl_els_flogi;
1374
1375        lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_CMD,
1376                "Issue FLOGI:     opt:x%x",
1377                phba->sli3_options, 0, 0);
1378
1379        elsiocb->context1 = lpfc_nlp_get(ndlp);
1380        if (!elsiocb->context1) {
1381                lpfc_els_free_iocb(phba, elsiocb);
1382                return 1;
1383        }
1384
1385        rc = lpfc_issue_fabric_iocb(phba, elsiocb);
1386        if (rc == IOCB_ERROR) {
1387                lpfc_els_free_iocb(phba, elsiocb);
1388                lpfc_nlp_put(ndlp);
1389                return 1;
1390        }
1391
1392        phba->hba_flag |= (HBA_FLOGI_ISSUED | HBA_FLOGI_OUTSTANDING);
1393
1394        /* Check for a deferred FLOGI ACC condition */
1395        if (phba->defer_flogi_acc_flag) {
1396                did = vport->fc_myDID;
1397                vport->fc_myDID = Fabric_DID;
1398
1399                memset(&defer_flogi_acc, 0, sizeof(struct lpfc_iocbq));
1400
1401                defer_flogi_acc.iocb.ulpContext = phba->defer_flogi_acc_rx_id;
1402                defer_flogi_acc.iocb.unsli3.rcvsli3.ox_id =
1403                                                phba->defer_flogi_acc_ox_id;
1404
1405                lpfc_printf_vlog(vport, KERN_INFO, LOG_ELS,
1406                                 "3354 Xmit deferred FLOGI ACC: rx_id: x%x,"
1407                                 " ox_id: x%x, hba_flag x%x\n",
1408                                 phba->defer_flogi_acc_rx_id,
1409                                 phba->defer_flogi_acc_ox_id, phba->hba_flag);
1410
1411                /* Send deferred FLOGI ACC */
1412                lpfc_els_rsp_acc(vport, ELS_CMD_FLOGI, &defer_flogi_acc,
1413                                 ndlp, NULL);
1414
1415                phba->defer_flogi_acc_flag = false;
1416
1417                vport->fc_myDID = did;
1418        }
1419
1420        return 0;
1421}
1422
1423/**
1424 * lpfc_els_abort_flogi - Abort all outstanding flogi iocbs
1425 * @phba: pointer to lpfc hba data structure.
1426 *
1427 * This routine aborts all the outstanding Fabric Login (FLOGI) IOCBs
1428 * with a @phba. This routine walks all the outstanding IOCBs on the txcmplq
1429 * list and issues an abort IOCB commond on each outstanding IOCB that
1430 * contains a active Fabric_DID ndlp. Note that this function is to issue
1431 * the abort IOCB command on all the outstanding IOCBs, thus when this
1432 * function returns, it does not guarantee all the IOCBs are actually aborted.
1433 *
1434 * Return code
1435 *   0 - Successfully issued abort iocb on all outstanding flogis (Always 0)
1436 **/
1437int
1438lpfc_els_abort_flogi(struct lpfc_hba *phba)
1439{
1440        struct lpfc_sli_ring *pring;
1441        struct lpfc_iocbq *iocb, *next_iocb;
1442        struct lpfc_nodelist *ndlp;
1443        IOCB_t *icmd;
1444
1445        /* Abort outstanding I/O on NPort <nlp_DID> */
1446        lpfc_printf_log(phba, KERN_INFO, LOG_DISCOVERY,
1447                        "0201 Abort outstanding I/O on NPort x%x\n",
1448                        Fabric_DID);
1449
1450        pring = lpfc_phba_elsring(phba);
1451        if (unlikely(!pring))
1452                return -EIO;
1453
1454        /*
1455         * Check the txcmplq for an iocb that matches the nport the driver is
1456         * searching for.
1457         */
1458        spin_lock_irq(&phba->hbalock);
1459        list_for_each_entry_safe(iocb, next_iocb, &pring->txcmplq, list) {
1460                icmd = &iocb->iocb;
1461                if (icmd->ulpCommand == CMD_ELS_REQUEST64_CR) {
1462                        ndlp = (struct lpfc_nodelist *)(iocb->context1);
1463                        if (ndlp && ndlp->nlp_DID == Fabric_DID) {
1464                                if ((phba->pport->fc_flag & FC_PT2PT) &&
1465                                    !(phba->pport->fc_flag & FC_PT2PT_PLOGI))
1466                                        iocb->fabric_iocb_cmpl =
1467                                                lpfc_ignore_els_cmpl;
1468                                lpfc_sli_issue_abort_iotag(phba, pring, iocb,
1469                                                           NULL);
1470                        }
1471                }
1472        }
1473        /* Make sure HBA is alive */
1474        lpfc_issue_hb_tmo(phba);
1475
1476        spin_unlock_irq(&phba->hbalock);
1477
1478        return 0;
1479}
1480
1481/**
1482 * lpfc_initial_flogi - Issue an initial fabric login for a vport
1483 * @vport: pointer to a host virtual N_Port data structure.
1484 *
1485 * This routine issues an initial Fabric Login (FLOGI) for the @vport
1486 * specified. It first searches the ndlp with the Fabric_DID (0xfffffe) from
1487 * the @vport's ndlp list. If no such ndlp found, it will create an ndlp and
1488 * put it into the @vport's ndlp list. If an inactive ndlp found on the list,
1489 * it will just be enabled and made active. The lpfc_issue_els_flogi() routine
1490 * is then invoked with the @vport and the ndlp to perform the FLOGI for the
1491 * @vport.
1492 *
1493 * Return code
1494 *   0 - failed to issue initial flogi for @vport
1495 *   1 - successfully issued initial flogi for @vport
1496 **/
1497int
1498lpfc_initial_flogi(struct lpfc_vport *vport)
1499{
1500        struct lpfc_nodelist *ndlp;
1501
1502        vport->port_state = LPFC_FLOGI;
1503        lpfc_set_disctmo(vport);
1504
1505        /* First look for the Fabric ndlp */
1506        ndlp = lpfc_findnode_did(vport, Fabric_DID);
1507        if (!ndlp) {
1508                /* Cannot find existing Fabric ndlp, so allocate a new one */
1509                ndlp = lpfc_nlp_init(vport, Fabric_DID);
1510                if (!ndlp)
1511                        return 0;
1512                /* Set the node type */
1513                ndlp->nlp_type |= NLP_FABRIC;
1514
1515                /* Put ndlp onto node list */
1516                lpfc_enqueue_node(vport, ndlp);
1517        }
1518
1519        if (lpfc_issue_els_flogi(vport, ndlp, 0)) {
1520                /* This decrement of reference count to node shall kick off
1521                 * the release of the node.
1522                 */
1523                lpfc_nlp_put(ndlp);
1524                return 0;
1525        }
1526        return 1;
1527}
1528
1529/**
1530 * lpfc_initial_fdisc - Issue an initial fabric discovery for a vport
1531 * @vport: pointer to a host virtual N_Port data structure.
1532 *
1533 * This routine issues an initial Fabric Discover (FDISC) for the @vport
1534 * specified. It first searches the ndlp with the Fabric_DID (0xfffffe) from
1535 * the @vport's ndlp list. If no such ndlp found, it will create an ndlp and
1536 * put it into the @vport's ndlp list. If an inactive ndlp found on the list,
1537 * it will just be enabled and made active. The lpfc_issue_els_fdisc() routine
1538 * is then invoked with the @vport and the ndlp to perform the FDISC for the
1539 * @vport.
1540 *
1541 * Return code
1542 *   0 - failed to issue initial fdisc for @vport
1543 *   1 - successfully issued initial fdisc for @vport
1544 **/
1545int
1546lpfc_initial_fdisc(struct lpfc_vport *vport)
1547{
1548        struct lpfc_nodelist *ndlp;
1549
1550        /* First look for the Fabric ndlp */
1551        ndlp = lpfc_findnode_did(vport, Fabric_DID);
1552        if (!ndlp) {
1553                /* Cannot find existing Fabric ndlp, so allocate a new one */
1554                ndlp = lpfc_nlp_init(vport, Fabric_DID);
1555                if (!ndlp)
1556                        return 0;
1557
1558                /* NPIV is only supported in Fabrics. */
1559                ndlp->nlp_type |= NLP_FABRIC;
1560
1561                /* Put ndlp onto node list */
1562                lpfc_enqueue_node(vport, ndlp);
1563        }
1564
1565        if (lpfc_issue_els_fdisc(vport, ndlp, 0)) {
1566                /* decrement node reference count to trigger the release of
1567                 * the node.
1568                 */
1569                lpfc_nlp_put(ndlp);
1570                return 0;
1571        }
1572        return 1;
1573}
1574
1575/**
1576 * lpfc_more_plogi - Check and issue remaining plogis for a vport
1577 * @vport: pointer to a host virtual N_Port data structure.
1578 *
1579 * This routine checks whether there are more remaining Port Logins
1580 * (PLOGI) to be issued for the @vport. If so, it will invoke the routine
1581 * lpfc_els_disc_plogi() to go through the Node Port Recovery (NPR) nodes
1582 * to issue ELS PLOGIs up to the configured discover threads with the
1583 * @vport (@vport->cfg_discovery_threads). The function also decrement
1584 * the @vport's num_disc_node by 1 if it is not already 0.
1585 **/
1586void
1587lpfc_more_plogi(struct lpfc_vport *vport)
1588{
1589        if (vport->num_disc_nodes)
1590                vport->num_disc_nodes--;
1591
1592        /* Continue discovery with <num_disc_nodes> PLOGIs to go */
1593        lpfc_printf_vlog(vport, KERN_INFO, LOG_DISCOVERY,
1594                         "0232 Continue discovery with %d PLOGIs to go "
1595                         "Data: x%x x%x x%x\n",
1596                         vport->num_disc_nodes, vport->fc_plogi_cnt,
1597                         vport->fc_flag, vport->port_state);
1598        /* Check to see if there are more PLOGIs to be sent */
1599        if (vport->fc_flag & FC_NLP_MORE)
1600                /* go thru NPR nodes and issue any remaining ELS PLOGIs */
1601                lpfc_els_disc_plogi(vport);
1602
1603        return;
1604}
1605
1606/**
1607 * lpfc_plogi_confirm_nport - Confirm plogi wwpn matches stored ndlp
1608 * @phba: pointer to lpfc hba data structure.
1609 * @prsp: pointer to response IOCB payload.
1610 * @ndlp: pointer to a node-list data structure.
1611 *
1612 * This routine checks and indicates whether the WWPN of an N_Port, retrieved
1613 * from a PLOGI, matches the WWPN that is stored in the @ndlp for that N_POrt.
1614 * The following cases are considered N_Port confirmed:
1615 * 1) The N_Port is a Fabric ndlp; 2) The @ndlp is on vport list and matches
1616 * the WWPN of the N_Port logged into; 3) The @ndlp is not on vport list but
1617 * it does not have WWPN assigned either. If the WWPN is confirmed, the
1618 * pointer to the @ndlp will be returned. If the WWPN is not confirmed:
1619 * 1) if there is a node on vport list other than the @ndlp with the same
1620 * WWPN of the N_Port PLOGI logged into, the lpfc_unreg_rpi() will be invoked
1621 * on that node to release the RPI associated with the node; 2) if there is
1622 * no node found on vport list with the same WWPN of the N_Port PLOGI logged
1623 * into, a new node shall be allocated (or activated). In either case, the
1624 * parameters of the @ndlp shall be copied to the new_ndlp, the @ndlp shall
1625 * be released and the new_ndlp shall be put on to the vport node list and
1626 * its pointer returned as the confirmed node.
1627 *
1628 * Note that before the @ndlp got "released", the keepDID from not-matching
1629 * or inactive "new_ndlp" on the vport node list is assigned to the nlp_DID
1630 * of the @ndlp. This is because the release of @ndlp is actually to put it
1631 * into an inactive state on the vport node list and the vport node list
1632 * management algorithm does not allow two node with a same DID.
1633 *
1634 * Return code
1635 *   pointer to the PLOGI N_Port @ndlp
1636 **/
1637static struct lpfc_nodelist *
1638lpfc_plogi_confirm_nport(struct lpfc_hba *phba, uint32_t *prsp,
1639                         struct lpfc_nodelist *ndlp)
1640{
1641        struct lpfc_vport *vport = ndlp->vport;
1642        struct lpfc_nodelist *new_ndlp;
1643        struct serv_parm *sp;
1644        uint8_t  name[sizeof(struct lpfc_name)];
1645        uint32_t keepDID = 0, keep_nlp_flag = 0;
1646        uint32_t keep_new_nlp_flag = 0;
1647        uint16_t keep_nlp_state;
1648        u32 keep_nlp_fc4_type = 0;
1649        struct lpfc_nvme_rport *keep_nrport = NULL;
1650        unsigned long *active_rrqs_xri_bitmap = NULL;
1651
1652        /* Fabric nodes can have the same WWPN so we don't bother searching
1653         * by WWPN.  Just return the ndlp that was given to us.
1654         */
1655        if (ndlp->nlp_type & NLP_FABRIC)
1656                return ndlp;
1657
1658        sp = (struct serv_parm *) ((uint8_t *) prsp + sizeof(uint32_t));
1659        memset(name, 0, sizeof(struct lpfc_name));
1660
1661        /* Now we find out if the NPort we are logging into, matches the WWPN
1662         * we have for that ndlp. If not, we have some work to do.
1663         */
1664        new_ndlp = lpfc_findnode_wwpn(vport, &sp->portName);
1665
1666        /* return immediately if the WWPN matches ndlp */
1667        if (!new_ndlp || (new_ndlp == ndlp))
1668                return ndlp;
1669
1670        /*
1671         * Unregister from backend if not done yet. Could have been skipped
1672         * due to ADISC
1673         */
1674        lpfc_nlp_unreg_node(vport, new_ndlp);
1675
1676        if (phba->sli_rev == LPFC_SLI_REV4) {
1677                active_rrqs_xri_bitmap = mempool_alloc(phba->active_rrq_pool,
1678                                                       GFP_KERNEL);
1679                if (active_rrqs_xri_bitmap)
1680                        memset(active_rrqs_xri_bitmap, 0,
1681                               phba->cfg_rrq_xri_bitmap_sz);
1682        }
1683
1684        lpfc_printf_vlog(vport, KERN_INFO, LOG_ELS | LOG_NODE,
1685                         "3178 PLOGI confirm: ndlp x%x x%x x%x: "
1686                         "new_ndlp x%x x%x x%x\n",
1687                         ndlp->nlp_DID, ndlp->nlp_flag,  ndlp->nlp_fc4_type,
1688                         (new_ndlp ? new_ndlp->nlp_DID : 0),
1689                         (new_ndlp ? new_ndlp->nlp_flag : 0),
1690                         (new_ndlp ? new_ndlp->nlp_fc4_type : 0));
1691
1692        keepDID = new_ndlp->nlp_DID;
1693
1694        if (phba->sli_rev == LPFC_SLI_REV4 && active_rrqs_xri_bitmap)
1695                memcpy(active_rrqs_xri_bitmap, new_ndlp->active_rrqs_xri_bitmap,
1696                       phba->cfg_rrq_xri_bitmap_sz);
1697
1698        /* At this point in this routine, we know new_ndlp will be
1699         * returned. however, any previous GID_FTs that were done
1700         * would have updated nlp_fc4_type in ndlp, so we must ensure
1701         * new_ndlp has the right value.
1702         */
1703        if (vport->fc_flag & FC_FABRIC) {
1704                keep_nlp_fc4_type = new_ndlp->nlp_fc4_type;
1705                new_ndlp->nlp_fc4_type = ndlp->nlp_fc4_type;
1706        }
1707
1708        lpfc_unreg_rpi(vport, new_ndlp);
1709        new_ndlp->nlp_DID = ndlp->nlp_DID;
1710        new_ndlp->nlp_prev_state = ndlp->nlp_prev_state;
1711        if (phba->sli_rev == LPFC_SLI_REV4)
1712                memcpy(new_ndlp->active_rrqs_xri_bitmap,
1713                       ndlp->active_rrqs_xri_bitmap,
1714                       phba->cfg_rrq_xri_bitmap_sz);
1715
1716        /* Lock both ndlps */
1717        spin_lock_irq(&ndlp->lock);
1718        spin_lock_irq(&new_ndlp->lock);
1719        keep_new_nlp_flag = new_ndlp->nlp_flag;
1720        keep_nlp_flag = ndlp->nlp_flag;
1721        new_ndlp->nlp_flag = ndlp->nlp_flag;
1722
1723        /* if new_ndlp had NLP_UNREG_INP set, keep it */
1724        if (keep_new_nlp_flag & NLP_UNREG_INP)
1725                new_ndlp->nlp_flag |= NLP_UNREG_INP;
1726        else
1727                new_ndlp->nlp_flag &= ~NLP_UNREG_INP;
1728
1729        /* if new_ndlp had NLP_RPI_REGISTERED set, keep it */
1730        if (keep_new_nlp_flag & NLP_RPI_REGISTERED)
1731                new_ndlp->nlp_flag |= NLP_RPI_REGISTERED;
1732        else
1733                new_ndlp->nlp_flag &= ~NLP_RPI_REGISTERED;
1734
1735        /*
1736         * Retain the DROPPED flag. This will take care of the init
1737         * refcount when affecting the state change
1738         */
1739        if (keep_new_nlp_flag & NLP_DROPPED)
1740                new_ndlp->nlp_flag |= NLP_DROPPED;
1741        else
1742                new_ndlp->nlp_flag &= ~NLP_DROPPED;
1743
1744        ndlp->nlp_flag = keep_new_nlp_flag;
1745
1746        /* if ndlp had NLP_UNREG_INP set, keep it */
1747        if (keep_nlp_flag & NLP_UNREG_INP)
1748                ndlp->nlp_flag |= NLP_UNREG_INP;
1749        else
1750                ndlp->nlp_flag &= ~NLP_UNREG_INP;
1751
1752        /* if ndlp had NLP_RPI_REGISTERED set, keep it */
1753        if (keep_nlp_flag & NLP_RPI_REGISTERED)
1754                ndlp->nlp_flag |= NLP_RPI_REGISTERED;
1755        else
1756                ndlp->nlp_flag &= ~NLP_RPI_REGISTERED;
1757
1758        /*
1759         * Retain the DROPPED flag. This will take care of the init
1760         * refcount when affecting the state change
1761         */
1762        if (keep_nlp_flag & NLP_DROPPED)
1763                ndlp->nlp_flag |= NLP_DROPPED;
1764        else
1765                ndlp->nlp_flag &= ~NLP_DROPPED;
1766
1767        spin_unlock_irq(&new_ndlp->lock);
1768        spin_unlock_irq(&ndlp->lock);
1769
1770        /* Set nlp_states accordingly */
1771        keep_nlp_state = new_ndlp->nlp_state;
1772        lpfc_nlp_set_state(vport, new_ndlp, ndlp->nlp_state);
1773
1774        /* interchange the nvme remoteport structs */
1775        keep_nrport = new_ndlp->nrport;
1776        new_ndlp->nrport = ndlp->nrport;
1777
1778        /* Move this back to NPR state */
1779        if (memcmp(&ndlp->nlp_portname, name, sizeof(struct lpfc_name)) == 0) {
1780                /* The new_ndlp is replacing ndlp totally, so we need
1781                 * to put ndlp on UNUSED list and try to free it.
1782                 */
1783                lpfc_printf_vlog(vport, KERN_INFO, LOG_ELS,
1784                         "3179 PLOGI confirm NEW: %x %x\n",
1785                         new_ndlp->nlp_DID, keepDID);
1786
1787                /* Two ndlps cannot have the same did on the nodelist.
1788                 * Note: for this case, ndlp has a NULL WWPN so setting
1789                 * the nlp_fc4_type isn't required.
1790                 */
1791                ndlp->nlp_DID = keepDID;
1792                lpfc_nlp_set_state(vport, ndlp, keep_nlp_state);
1793                if (phba->sli_rev == LPFC_SLI_REV4 &&
1794                    active_rrqs_xri_bitmap)
1795                        memcpy(ndlp->active_rrqs_xri_bitmap,
1796                               active_rrqs_xri_bitmap,
1797                               phba->cfg_rrq_xri_bitmap_sz);
1798
1799        } else {
1800                lpfc_printf_vlog(vport, KERN_INFO, LOG_ELS,
1801                         "3180 PLOGI confirm SWAP: %x %x\n",
1802                         new_ndlp->nlp_DID, keepDID);
1803
1804                lpfc_unreg_rpi(vport, ndlp);
1805
1806                /* Two ndlps cannot have the same did and the fc4
1807                 * type must be transferred because the ndlp is in
1808                 * flight.
1809                 */
1810                ndlp->nlp_DID = keepDID;
1811                ndlp->nlp_fc4_type = keep_nlp_fc4_type;
1812
1813                if (phba->sli_rev == LPFC_SLI_REV4 &&
1814                    active_rrqs_xri_bitmap)
1815                        memcpy(ndlp->active_rrqs_xri_bitmap,
1816                               active_rrqs_xri_bitmap,
1817                               phba->cfg_rrq_xri_bitmap_sz);
1818
1819                /* Since we are switching over to the new_ndlp,
1820                 * reset the old ndlp state
1821                 */
1822                if ((ndlp->nlp_state == NLP_STE_UNMAPPED_NODE) ||
1823                    (ndlp->nlp_state == NLP_STE_MAPPED_NODE))
1824                        keep_nlp_state = NLP_STE_NPR_NODE;
1825                lpfc_nlp_set_state(vport, ndlp, keep_nlp_state);
1826                ndlp->nrport = keep_nrport;
1827        }
1828
1829        /*
1830         * If ndlp is not associated with any rport we can drop it here else
1831         * let dev_loss_tmo_callbk trigger DEVICE_RM event
1832         */
1833        if (!ndlp->rport && (ndlp->nlp_state == NLP_STE_NPR_NODE))
1834                lpfc_disc_state_machine(vport, ndlp, NULL, NLP_EVT_DEVICE_RM);
1835
1836        if (phba->sli_rev == LPFC_SLI_REV4 &&
1837            active_rrqs_xri_bitmap)
1838                mempool_free(active_rrqs_xri_bitmap,
1839                             phba->active_rrq_pool);
1840
1841        lpfc_printf_vlog(vport, KERN_INFO, LOG_ELS | LOG_NODE,
1842                         "3173 PLOGI confirm exit: new_ndlp x%x x%x x%x\n",
1843                         new_ndlp->nlp_DID, new_ndlp->nlp_flag,
1844                         new_ndlp->nlp_fc4_type);
1845
1846        return new_ndlp;
1847}
1848
1849/**
1850 * lpfc_end_rscn - Check and handle more rscn for a vport
1851 * @vport: pointer to a host virtual N_Port data structure.
1852 *
1853 * This routine checks whether more Registration State Change
1854 * Notifications (RSCNs) came in while the discovery state machine was in
1855 * the FC_RSCN_MODE. If so, the lpfc_els_handle_rscn() routine will be
1856 * invoked to handle the additional RSCNs for the @vport. Otherwise, the
1857 * FC_RSCN_MODE bit will be cleared with the @vport to mark as the end of
1858 * handling the RSCNs.
1859 **/
1860void
1861lpfc_end_rscn(struct lpfc_vport *vport)
1862{
1863        struct Scsi_Host *shost = lpfc_shost_from_vport(vport);
1864
1865        if (vport->fc_flag & FC_RSCN_MODE) {
1866                /*
1867                 * Check to see if more RSCNs came in while we were
1868                 * processing this one.
1869                 */
1870                if (vport->fc_rscn_id_cnt ||
1871                    (vport->fc_flag & FC_RSCN_DISCOVERY) != 0)
1872                        lpfc_els_handle_rscn(vport);
1873                else {
1874                        spin_lock_irq(shost->host_lock);
1875                        vport->fc_flag &= ~FC_RSCN_MODE;
1876                        spin_unlock_irq(shost->host_lock);
1877                }
1878        }
1879}
1880
1881/**
1882 * lpfc_cmpl_els_rrq - Completion handled for els RRQs.
1883 * @phba: pointer to lpfc hba data structure.
1884 * @cmdiocb: pointer to lpfc command iocb data structure.
1885 * @rspiocb: pointer to lpfc response iocb data structure.
1886 *
1887 * This routine will call the clear rrq function to free the rrq and
1888 * clear the xri's bit in the ndlp's xri_bitmap. If the ndlp does not
1889 * exist then the clear_rrq is still called because the rrq needs to
1890 * be freed.
1891 **/
1892
1893static void
1894lpfc_cmpl_els_rrq(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
1895                    struct lpfc_iocbq *rspiocb)
1896{
1897        struct lpfc_vport *vport = cmdiocb->vport;
1898        IOCB_t *irsp;
1899        struct lpfc_nodelist *ndlp = cmdiocb->context1;
1900        struct lpfc_node_rrq *rrq;
1901
1902        /* we pass cmdiocb to state machine which needs rspiocb as well */
1903        rrq = cmdiocb->context_un.rrq;
1904        cmdiocb->context_un.rsp_iocb = rspiocb;
1905
1906        irsp = &rspiocb->iocb;
1907        lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_CMD,
1908                "RRQ cmpl:      status:x%x/x%x did:x%x",
1909                irsp->ulpStatus, irsp->un.ulpWord[4],
1910                irsp->un.elsreq64.remoteID);
1911
1912        /* rrq completes to NPort <nlp_DID> */
1913        lpfc_printf_vlog(vport, KERN_INFO, LOG_ELS,
1914                         "2880 RRQ completes to DID x%x "
1915                         "Data: x%x x%x x%x x%x x%x\n",
1916                         irsp->un.elsreq64.remoteID,
1917                         irsp->ulpStatus, irsp->un.ulpWord[4],
1918                         irsp->ulpTimeout, rrq->xritag, rrq->rxid);
1919
1920        if (irsp->ulpStatus) {
1921                /* Check for retry */
1922                /* RRQ failed Don't print the vport to vport rjts */
1923                if (irsp->ulpStatus != IOSTAT_LS_RJT ||
1924                        (((irsp->un.ulpWord[4]) >> 16 != LSRJT_INVALID_CMD) &&
1925                        ((irsp->un.ulpWord[4]) >> 16 != LSRJT_UNABLE_TPC)) ||
1926                        (phba)->pport->cfg_log_verbose & LOG_ELS)
1927                        lpfc_printf_vlog(vport, KERN_ERR, LOG_TRACE_EVENT,
1928                                         "2881 RRQ failure DID:%06X Status:"
1929                                         "x%x/x%x\n",
1930                                         ndlp->nlp_DID, irsp->ulpStatus,
1931                                         irsp->un.ulpWord[4]);
1932        }
1933
1934        lpfc_clr_rrq_active(phba, rrq->xritag, rrq);
1935        lpfc_els_free_iocb(phba, cmdiocb);
1936        lpfc_nlp_put(ndlp);
1937        return;
1938}
1939/**
1940 * lpfc_cmpl_els_plogi - Completion callback function for plogi
1941 * @phba: pointer to lpfc hba data structure.
1942 * @cmdiocb: pointer to lpfc command iocb data structure.
1943 * @rspiocb: pointer to lpfc response iocb data structure.
1944 *
1945 * This routine is the completion callback function for issuing the Port
1946 * Login (PLOGI) command. For PLOGI completion, there must be an active
1947 * ndlp on the vport node list that matches the remote node ID from the
1948 * PLOGI response IOCB. If such ndlp does not exist, the PLOGI is simply
1949 * ignored and command IOCB released. The PLOGI response IOCB status is
1950 * checked for error conditions. If there is error status reported, PLOGI
1951 * retry shall be attempted by invoking the lpfc_els_retry() routine.
1952 * Otherwise, the lpfc_plogi_confirm_nport() routine shall be invoked on
1953 * the ndlp and the NLP_EVT_CMPL_PLOGI state to the Discover State Machine
1954 * (DSM) is set for this PLOGI completion. Finally, it checks whether
1955 * there are additional N_Port nodes with the vport that need to perform
1956 * PLOGI. If so, the lpfc_more_plogi() routine is invoked to issue addition
1957 * PLOGIs.
1958 **/
1959static void
1960lpfc_cmpl_els_plogi(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
1961                    struct lpfc_iocbq *rspiocb)
1962{
1963        struct lpfc_vport *vport = cmdiocb->vport;
1964        struct Scsi_Host  *shost = lpfc_shost_from_vport(vport);
1965        IOCB_t *irsp;
1966        struct lpfc_nodelist *ndlp, *free_ndlp;
1967        struct lpfc_dmabuf *prsp;
1968        int disc;
1969        struct serv_parm *sp = NULL;
1970
1971        /* we pass cmdiocb to state machine which needs rspiocb as well */
1972        cmdiocb->context_un.rsp_iocb = rspiocb;
1973
1974        irsp = &rspiocb->iocb;
1975        lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_CMD,
1976                "PLOGI cmpl:      status:x%x/x%x did:x%x",
1977                irsp->ulpStatus, irsp->un.ulpWord[4],
1978                irsp->un.elsreq64.remoteID);
1979
1980        ndlp = lpfc_findnode_did(vport, irsp->un.elsreq64.remoteID);
1981        if (!ndlp) {
1982                lpfc_printf_vlog(vport, KERN_ERR, LOG_TRACE_EVENT,
1983                                 "0136 PLOGI completes to NPort x%x "
1984                                 "with no ndlp. Data: x%x x%x x%x\n",
1985                                 irsp->un.elsreq64.remoteID,
1986                                 irsp->ulpStatus, irsp->un.ulpWord[4],
1987                                 irsp->ulpIoTag);
1988                goto out_freeiocb;
1989        }
1990
1991        /* Since ndlp can be freed in the disc state machine, note if this node
1992         * is being used during discovery.
1993         */
1994        spin_lock_irq(&ndlp->lock);
1995        disc = (ndlp->nlp_flag & NLP_NPR_2B_DISC);
1996        ndlp->nlp_flag &= ~NLP_NPR_2B_DISC;
1997        spin_unlock_irq(&ndlp->lock);
1998
1999        /* PLOGI completes to NPort <nlp_DID> */
2000        lpfc_printf_vlog(vport, KERN_INFO, LOG_ELS,
2001                         "0102 PLOGI completes to NPort x%06x "
2002                         "Data: x%x x%x x%x x%x x%x\n",
2003                         ndlp->nlp_DID, ndlp->nlp_fc4_type,
2004                         irsp->ulpStatus, irsp->un.ulpWord[4],
2005                         disc, vport->num_disc_nodes);
2006
2007        /* Check to see if link went down during discovery */
2008        if (lpfc_els_chk_latt(vport)) {
2009                spin_lock_irq(&ndlp->lock);
2010                ndlp->nlp_flag |= NLP_NPR_2B_DISC;
2011                spin_unlock_irq(&ndlp->lock);
2012                goto out;
2013        }
2014
2015        if (irsp->ulpStatus) {
2016                /* Check for retry */
2017                if (lpfc_els_retry(phba, cmdiocb, rspiocb)) {
2018                        /* ELS command is being retried */
2019                        if (disc) {
2020                                spin_lock_irq(&ndlp->lock);
2021                                ndlp->nlp_flag |= NLP_NPR_2B_DISC;
2022                                spin_unlock_irq(&ndlp->lock);
2023                        }
2024                        goto out;
2025                }
2026                /* PLOGI failed Don't print the vport to vport rjts */
2027                if (irsp->ulpStatus != IOSTAT_LS_RJT ||
2028                        (((irsp->un.ulpWord[4]) >> 16 != LSRJT_INVALID_CMD) &&
2029                        ((irsp->un.ulpWord[4]) >> 16 != LSRJT_UNABLE_TPC)) ||
2030                        (phba)->pport->cfg_log_verbose & LOG_ELS)
2031                        lpfc_printf_vlog(vport, KERN_ERR, LOG_TRACE_EVENT,
2032                                 "2753 PLOGI failure DID:%06X Status:x%x/x%x\n",
2033                                 ndlp->nlp_DID, irsp->ulpStatus,
2034                                 irsp->un.ulpWord[4]);
2035
2036                /* Do not call DSM for lpfc_els_abort'ed ELS cmds */
2037                if (!lpfc_error_lost_link(irsp))
2038                        lpfc_disc_state_machine(vport, ndlp, cmdiocb,
2039                                                NLP_EVT_CMPL_PLOGI);
2040
2041                /* If a PLOGI collision occurred, the node needs to continue
2042                 * with the reglogin process.
2043                 */
2044                spin_lock_irq(&ndlp->lock);
2045                if ((ndlp->nlp_flag & (NLP_ACC_REGLOGIN | NLP_RCV_PLOGI)) &&
2046                    ndlp->nlp_state == NLP_STE_REG_LOGIN_ISSUE) {
2047                        spin_unlock_irq(&ndlp->lock);
2048                        goto out;
2049                }
2050                spin_unlock_irq(&ndlp->lock);
2051
2052                /* No PLOGI collision and the node is not registered with the
2053                 * scsi or nvme transport. It is no longer an active node. Just
2054                 * start the device remove process.
2055                 */
2056                if (!(ndlp->fc4_xpt_flags & (SCSI_XPT_REGD | NVME_XPT_REGD))) {
2057                        spin_lock_irq(&ndlp->lock);
2058                        ndlp->nlp_flag &= ~NLP_NPR_2B_DISC;
2059                        spin_unlock_irq(&ndlp->lock);
2060                        lpfc_disc_state_machine(vport, ndlp, cmdiocb,
2061                                                NLP_EVT_DEVICE_RM);
2062                }
2063        } else {
2064                /* Good status, call state machine */
2065                prsp = list_entry(((struct lpfc_dmabuf *)
2066                                   cmdiocb->context2)->list.next,
2067                                  struct lpfc_dmabuf, list);
2068                ndlp = lpfc_plogi_confirm_nport(phba, prsp->virt, ndlp);
2069
2070                sp = (struct serv_parm *)((u8 *)prsp->virt +
2071                                          sizeof(u32));
2072
2073                ndlp->vmid_support = 0;
2074                if ((phba->cfg_vmid_app_header && sp->cmn.app_hdr_support) ||
2075                    (phba->cfg_vmid_priority_tagging &&
2076                     sp->cmn.priority_tagging)) {
2077                        lpfc_printf_log(phba, KERN_DEBUG, LOG_ELS,
2078                                        "4018 app_hdr_support %d tagging %d DID x%x\n",
2079                                        sp->cmn.app_hdr_support,
2080                                        sp->cmn.priority_tagging,
2081                                        ndlp->nlp_DID);
2082                        /* if the dest port supports VMID, mark it in ndlp */
2083                        ndlp->vmid_support = 1;
2084                }
2085
2086                lpfc_disc_state_machine(vport, ndlp, cmdiocb,
2087                                        NLP_EVT_CMPL_PLOGI);
2088        }
2089
2090        if (disc && vport->num_disc_nodes) {
2091                /* Check to see if there are more PLOGIs to be sent */
2092                lpfc_more_plogi(vport);
2093
2094                if (vport->num_disc_nodes == 0) {
2095                        spin_lock_irq(shost->host_lock);
2096                        vport->fc_flag &= ~FC_NDISC_ACTIVE;
2097                        spin_unlock_irq(shost->host_lock);
2098
2099                        lpfc_can_disctmo(vport);
2100                        lpfc_end_rscn(vport);
2101                }
2102        }
2103
2104out:
2105        lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_NODE,
2106                              "PLOGI Cmpl PUT:     did:x%x refcnt %d",
2107                              ndlp->nlp_DID, kref_read(&ndlp->kref), 0);
2108
2109out_freeiocb:
2110        /* Release the reference on the original I/O request. */
2111        free_ndlp = (struct lpfc_nodelist *)cmdiocb->context1;
2112
2113        lpfc_els_free_iocb(phba, cmdiocb);
2114        lpfc_nlp_put(free_ndlp);
2115        return;
2116}
2117
2118/**
2119 * lpfc_issue_els_plogi - Issue an plogi iocb command for a vport
2120 * @vport: pointer to a host virtual N_Port data structure.
2121 * @did: destination port identifier.
2122 * @retry: number of retries to the command IOCB.
2123 *
2124 * This routine issues a Port Login (PLOGI) command to a remote N_Port
2125 * (with the @did) for a @vport. Before issuing a PLOGI to a remote N_Port,
2126 * the ndlp with the remote N_Port DID must exist on the @vport's ndlp list.
2127 * This routine constructs the proper fields of the PLOGI IOCB and invokes
2128 * the lpfc_sli_issue_iocb() routine to send out PLOGI ELS command.
2129 *
2130 * Note that the ndlp reference count will be incremented by 1 for holding
2131 * the ndlp and the reference to ndlp will be stored into the context1 field
2132 * of the IOCB for the completion callback function to the PLOGI ELS command.
2133 *
2134 * Return code
2135 *   0 - Successfully issued a plogi for @vport
2136 *   1 - failed to issue a plogi for @vport
2137 **/
2138int
2139lpfc_issue_els_plogi(struct lpfc_vport *vport, uint32_t did, uint8_t retry)
2140{
2141        struct lpfc_hba  *phba = vport->phba;
2142        struct serv_parm *sp;
2143        struct lpfc_nodelist *ndlp;
2144        struct lpfc_iocbq *elsiocb;
2145        uint8_t *pcmd;
2146        uint16_t cmdsize;
2147        int ret;
2148
2149        ndlp = lpfc_findnode_did(vport, did);
2150        if (!ndlp)
2151                return 1;
2152
2153        /* Defer the processing of the issue PLOGI until after the
2154         * outstanding UNREG_RPI mbox command completes, unless we
2155         * are going offline. This logic does not apply for Fabric DIDs
2156         */
2157        if ((ndlp->nlp_flag & NLP_UNREG_INP) &&
2158            ((ndlp->nlp_DID & Fabric_DID_MASK) != Fabric_DID_MASK) &&
2159            !(vport->fc_flag & FC_OFFLINE_MODE)) {
2160                lpfc_printf_vlog(vport, KERN_INFO, LOG_DISCOVERY,
2161                                 "4110 Issue PLOGI x%x deferred "
2162                                 "on NPort x%x rpi x%x Data: x%px\n",
2163                                 ndlp->nlp_defer_did, ndlp->nlp_DID,
2164                                 ndlp->nlp_rpi, ndlp);
2165
2166                /* We can only defer 1st PLOGI */
2167                if (ndlp->nlp_defer_did == NLP_EVT_NOTHING_PENDING)
2168                        ndlp->nlp_defer_did = did;
2169                return 0;
2170        }
2171
2172        cmdsize = (sizeof(uint32_t) + sizeof(struct serv_parm));
2173        elsiocb = lpfc_prep_els_iocb(vport, 1, cmdsize, retry, ndlp, did,
2174                                     ELS_CMD_PLOGI);
2175        if (!elsiocb)
2176                return 1;
2177
2178        spin_lock_irq(&ndlp->lock);
2179        ndlp->nlp_flag &= ~NLP_FCP_PRLI_RJT;
2180        spin_unlock_irq(&ndlp->lock);
2181
2182        pcmd = (uint8_t *) (((struct lpfc_dmabuf *) elsiocb->context2)->virt);
2183
2184        /* For PLOGI request, remainder of payload is service parameters */
2185        *((uint32_t *) (pcmd)) = ELS_CMD_PLOGI;
2186        pcmd += sizeof(uint32_t);
2187        memcpy(pcmd, &vport->fc_sparam, sizeof(struct serv_parm));
2188        sp = (struct serv_parm *) pcmd;
2189
2190        /*
2191         * If we are a N-port connected to a Fabric, fix-up paramm's so logins
2192         * to device on remote loops work.
2193         */
2194        if ((vport->fc_flag & FC_FABRIC) && !(vport->fc_flag & FC_PUBLIC_LOOP))
2195                sp->cmn.altBbCredit = 1;
2196
2197        if (sp->cmn.fcphLow < FC_PH_4_3)
2198                sp->cmn.fcphLow = FC_PH_4_3;
2199
2200        if (sp->cmn.fcphHigh < FC_PH3)
2201                sp->cmn.fcphHigh = FC_PH3;
2202
2203        sp->cmn.valid_vendor_ver_level = 0;
2204        memset(sp->un.vendorVersion, 0, sizeof(sp->un.vendorVersion));
2205        sp->cmn.bbRcvSizeMsb &= 0xF;
2206
2207        /* Check if the destination port supports VMID */
2208        ndlp->vmid_support = 0;
2209        if (vport->vmid_priority_tagging)
2210                sp->cmn.priority_tagging = 1;
2211        else if (phba->cfg_vmid_app_header &&
2212                 bf_get(lpfc_ftr_ashdr, &phba->sli4_hba.sli4_flags))
2213                sp->cmn.app_hdr_support = 1;
2214
2215        lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_CMD,
2216                "Issue PLOGI:     did:x%x",
2217                did, 0, 0);
2218
2219        /* If our firmware supports this feature, convey that
2220         * information to the target using the vendor specific field.
2221         */
2222        if (phba->sli.sli_flag & LPFC_SLI_SUPPRESS_RSP) {
2223                sp->cmn.valid_vendor_ver_level = 1;
2224                sp->un.vv.vid = cpu_to_be32(LPFC_VV_EMLX_ID);
2225                sp->un.vv.flags = cpu_to_be32(LPFC_VV_SUPPRESS_RSP);
2226        }
2227
2228        phba->fc_stat.elsXmitPLOGI++;
2229        elsiocb->iocb_cmpl = lpfc_cmpl_els_plogi;
2230
2231        lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_CMD,
2232                              "Issue PLOGI:     did:x%x refcnt %d",
2233                              did, kref_read(&ndlp->kref), 0);
2234        elsiocb->context1 = lpfc_nlp_get(ndlp);
2235        if (!elsiocb->context1) {
2236                lpfc_els_free_iocb(phba, elsiocb);
2237                return 1;
2238        }
2239
2240        ret = lpfc_sli_issue_iocb(phba, LPFC_ELS_RING, elsiocb, 0);
2241        if (ret) {
2242                lpfc_els_free_iocb(phba, elsiocb);
2243                lpfc_nlp_put(ndlp);
2244                return 1;
2245        }
2246
2247        return 0;
2248}
2249
2250/**
2251 * lpfc_cmpl_els_prli - Completion callback function for prli
2252 * @phba: pointer to lpfc hba data structure.
2253 * @cmdiocb: pointer to lpfc command iocb data structure.
2254 * @rspiocb: pointer to lpfc response iocb data structure.
2255 *
2256 * This routine is the completion callback function for a Process Login
2257 * (PRLI) ELS command. The PRLI response IOCB status is checked for error
2258 * status. If there is error status reported, PRLI retry shall be attempted
2259 * by invoking the lpfc_els_retry() routine. Otherwise, the state
2260 * NLP_EVT_CMPL_PRLI is sent to the Discover State Machine (DSM) for this
2261 * ndlp to mark the PRLI completion.
2262 **/
2263static void
2264lpfc_cmpl_els_prli(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
2265                   struct lpfc_iocbq *rspiocb)
2266{
2267        struct lpfc_vport *vport = cmdiocb->vport;
2268        IOCB_t *irsp;
2269        struct lpfc_nodelist *ndlp;
2270        char *mode;
2271        u32 loglevel;
2272
2273        /* we pass cmdiocb to state machine which needs rspiocb as well */
2274        cmdiocb->context_un.rsp_iocb = rspiocb;
2275
2276        irsp = &(rspiocb->iocb);
2277        ndlp = (struct lpfc_nodelist *) cmdiocb->context1;
2278        spin_lock_irq(&ndlp->lock);
2279        ndlp->nlp_flag &= ~NLP_PRLI_SND;
2280
2281        /* Driver supports multiple FC4 types.  Counters matter. */
2282        vport->fc_prli_sent--;
2283        ndlp->fc4_prli_sent--;
2284        spin_unlock_irq(&ndlp->lock);
2285
2286        lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_CMD,
2287                "PRLI cmpl:       status:x%x/x%x did:x%x",
2288                irsp->ulpStatus, irsp->un.ulpWord[4],
2289                ndlp->nlp_DID);
2290
2291        /* PRLI completes to NPort <nlp_DID> */
2292        lpfc_printf_vlog(vport, KERN_INFO, LOG_ELS,
2293                         "0103 PRLI completes to NPort x%06x "
2294                         "Data: x%x x%x x%x x%x\n",
2295                         ndlp->nlp_DID, irsp->ulpStatus, irsp->un.ulpWord[4],
2296                         vport->num_disc_nodes, ndlp->fc4_prli_sent);
2297
2298        /* Check to see if link went down during discovery */
2299        if (lpfc_els_chk_latt(vport))
2300                goto out;
2301
2302        if (irsp->ulpStatus) {
2303                /* Check for retry */
2304                if (lpfc_els_retry(phba, cmdiocb, rspiocb)) {
2305                        /* ELS command is being retried */
2306                        goto out;
2307                }
2308
2309                /* If we don't send GFT_ID to Fabric, a PRLI error
2310                 * could be expected.
2311                 */
2312                if ((vport->fc_flag & FC_FABRIC) ||
2313                    (vport->cfg_enable_fc4_type != LPFC_ENABLE_BOTH)) {
2314                        mode = KERN_ERR;
2315                        loglevel =  LOG_TRACE_EVENT;
2316                } else {
2317                        mode = KERN_INFO;
2318                        loglevel =  LOG_ELS;
2319                }
2320
2321                /* PRLI failed */
2322                lpfc_printf_vlog(vport, mode, loglevel,
2323                                 "2754 PRLI failure DID:%06X Status:x%x/x%x, "
2324                                 "data: x%x\n",
2325                                 ndlp->nlp_DID, irsp->ulpStatus,
2326                                 irsp->un.ulpWord[4], ndlp->fc4_prli_sent);
2327
2328                /* Do not call DSM for lpfc_els_abort'ed ELS cmds */
2329                if (!lpfc_error_lost_link(irsp))
2330                        lpfc_disc_state_machine(vport, ndlp, cmdiocb,
2331                                                NLP_EVT_CMPL_PRLI);
2332
2333                /* As long as this node is not registered with the SCSI
2334                 * or NVMe transport and no other PRLIs are outstanding,
2335                 * it is no longer an active node.  Otherwise devloss
2336                 * handles the final cleanup.
2337                 */
2338                if (!(ndlp->fc4_xpt_flags & (SCSI_XPT_REGD | NVME_XPT_REGD)) &&
2339                    !ndlp->fc4_prli_sent) {
2340                        spin_lock_irq(&ndlp->lock);
2341                        ndlp->nlp_flag &= ~NLP_NPR_2B_DISC;
2342                        spin_unlock_irq(&ndlp->lock);
2343                        lpfc_disc_state_machine(vport, ndlp, cmdiocb,
2344                                                NLP_EVT_DEVICE_RM);
2345                }
2346        } else {
2347                /* Good status, call state machine.  However, if another
2348                 * PRLI is outstanding, don't call the state machine
2349                 * because final disposition to Mapped or Unmapped is
2350                 * completed there.
2351                 */
2352                lpfc_disc_state_machine(vport, ndlp, cmdiocb,
2353                                        NLP_EVT_CMPL_PRLI);
2354        }
2355
2356out:
2357        lpfc_els_free_iocb(phba, cmdiocb);
2358        lpfc_nlp_put(ndlp);
2359        return;
2360}
2361
2362/**
2363 * lpfc_issue_els_prli - Issue a prli iocb command for a vport
2364 * @vport: pointer to a host virtual N_Port data structure.
2365 * @ndlp: pointer to a node-list data structure.
2366 * @retry: number of retries to the command IOCB.
2367 *
2368 * This routine issues a Process Login (PRLI) ELS command for the
2369 * @vport. The PRLI service parameters are set up in the payload of the
2370 * PRLI Request command and the pointer to lpfc_cmpl_els_prli() routine
2371 * is put to the IOCB completion callback func field before invoking the
2372 * routine lpfc_sli_issue_iocb() to send out PRLI command.
2373 *
2374 * Note that the ndlp reference count will be incremented by 1 for holding the
2375 * ndlp and the reference to ndlp will be stored into the context1 field of
2376 * the IOCB for the completion callback function to the PRLI ELS command.
2377 *
2378 * Return code
2379 *   0 - successfully issued prli iocb command for @vport
2380 *   1 - failed to issue prli iocb command for @vport
2381 **/
2382int
2383lpfc_issue_els_prli(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
2384                    uint8_t retry)
2385{
2386        int rc = 0;
2387        struct lpfc_hba *phba = vport->phba;
2388        PRLI *npr;
2389        struct lpfc_nvme_prli *npr_nvme;
2390        struct lpfc_iocbq *elsiocb;
2391        uint8_t *pcmd;
2392        uint16_t cmdsize;
2393        u32 local_nlp_type, elscmd;
2394
2395        /*
2396         * If we are in RSCN mode, the FC4 types supported from a
2397         * previous GFT_ID command may not be accurate. So, if we
2398         * are a NVME Initiator, always look for the possibility of
2399         * the remote NPort beng a NVME Target.
2400         */
2401        if (phba->sli_rev == LPFC_SLI_REV4 &&
2402            vport->fc_flag & FC_RSCN_MODE &&
2403            vport->nvmei_support)
2404                ndlp->nlp_fc4_type |= NLP_FC4_NVME;
2405        local_nlp_type = ndlp->nlp_fc4_type;
2406
2407        /* This routine will issue 1 or 2 PRLIs, so zero all the ndlp
2408         * fields here before any of them can complete.
2409         */
2410        ndlp->nlp_type &= ~(NLP_FCP_TARGET | NLP_FCP_INITIATOR);
2411        ndlp->nlp_type &= ~(NLP_NVME_TARGET | NLP_NVME_INITIATOR);
2412        ndlp->nlp_fcp_info &= ~NLP_FCP_2_DEVICE;
2413        ndlp->nlp_flag &= ~(NLP_FIRSTBURST | NLP_NPR_2B_DISC);
2414        ndlp->nvme_fb_size = 0;
2415
2416 send_next_prli:
2417        if (local_nlp_type & NLP_FC4_FCP) {
2418                /* Payload is 4 + 16 = 20 x14 bytes. */
2419                cmdsize = (sizeof(uint32_t) + sizeof(PRLI));
2420                elscmd = ELS_CMD_PRLI;
2421        } else if (local_nlp_type & NLP_FC4_NVME) {
2422                /* Payload is 4 + 20 = 24 x18 bytes. */
2423                cmdsize = (sizeof(uint32_t) + sizeof(struct lpfc_nvme_prli));
2424                elscmd = ELS_CMD_NVMEPRLI;
2425        } else {
2426                lpfc_printf_vlog(vport, KERN_INFO, LOG_DISCOVERY,
2427                                 "3083 Unknown FC_TYPE x%x ndlp x%06x\n",
2428                                 ndlp->nlp_fc4_type, ndlp->nlp_DID);
2429                return 1;
2430        }
2431
2432        /* SLI3 ports don't support NVME.  If this rport is a strict NVME
2433         * FC4 type, implicitly LOGO.
2434         */
2435        if (phba->sli_rev == LPFC_SLI_REV3 &&
2436            ndlp->nlp_fc4_type == NLP_FC4_NVME) {
2437                lpfc_printf_vlog(vport, KERN_INFO, LOG_DISCOVERY,
2438                                 "3088 Rport fc4 type 0x%x not supported by SLI3 adapter\n",
2439                                 ndlp->nlp_type);
2440                lpfc_disc_state_machine(vport, ndlp, NULL, NLP_EVT_DEVICE_RM);
2441                return 1;
2442        }
2443
2444        elsiocb = lpfc_prep_els_iocb(vport, 1, cmdsize, retry, ndlp,
2445                                     ndlp->nlp_DID, elscmd);
2446        if (!elsiocb)
2447                return 1;
2448
2449        pcmd = (uint8_t *) (((struct lpfc_dmabuf *) elsiocb->context2)->virt);
2450
2451        /* For PRLI request, remainder of payload is service parameters */
2452        memset(pcmd, 0, cmdsize);
2453
2454        if (local_nlp_type & NLP_FC4_FCP) {
2455                /* Remainder of payload is FCP PRLI parameter page.
2456                 * Note: this data structure is defined as
2457                 * BE/LE in the structure definition so no
2458                 * byte swap call is made.
2459                 */
2460                *((uint32_t *)(pcmd)) = ELS_CMD_PRLI;
2461                pcmd += sizeof(uint32_t);
2462                npr = (PRLI *)pcmd;
2463
2464                /*
2465                 * If our firmware version is 3.20 or later,
2466                 * set the following bits for FC-TAPE support.
2467                 */
2468                if (phba->vpd.rev.feaLevelHigh >= 0x02) {
2469                        npr->ConfmComplAllowed = 1;
2470                        npr->Retry = 1;
2471                        npr->TaskRetryIdReq = 1;
2472                }
2473                npr->estabImagePair = 1;
2474                npr->readXferRdyDis = 1;
2475                if (vport->cfg_first_burst_size)
2476                        npr->writeXferRdyDis = 1;
2477
2478                /* For FCP support */
2479                npr->prliType = PRLI_FCP_TYPE;
2480                npr->initiatorFunc = 1;
2481                elsiocb->iocb_flag |= LPFC_PRLI_FCP_REQ;
2482
2483                /* Remove FCP type - processed. */
2484                local_nlp_type &= ~NLP_FC4_FCP;
2485        } else if (local_nlp_type & NLP_FC4_NVME) {
2486                /* Remainder of payload is NVME PRLI parameter page.
2487                 * This data structure is the newer definition that
2488                 * uses bf macros so a byte swap is required.
2489                 */
2490                *((uint32_t *)(pcmd)) = ELS_CMD_NVMEPRLI;
2491                pcmd += sizeof(uint32_t);
2492                npr_nvme = (struct lpfc_nvme_prli *)pcmd;
2493                bf_set(prli_type_code, npr_nvme, PRLI_NVME_TYPE);
2494                bf_set(prli_estabImagePair, npr_nvme, 0);  /* Should be 0 */
2495                if (phba->nsler) {
2496                        bf_set(prli_nsler, npr_nvme, 1);
2497                        bf_set(prli_conf, npr_nvme, 1);
2498                }
2499
2500                /* Only initiators request first burst. */
2501                if ((phba->cfg_nvme_enable_fb) &&
2502                    !phba->nvmet_support)
2503                        bf_set(prli_fba, npr_nvme, 1);
2504
2505                if (phba->nvmet_support) {
2506                        bf_set(prli_tgt, npr_nvme, 1);
2507                        bf_set(prli_disc, npr_nvme, 1);
2508                } else {
2509                        bf_set(prli_init, npr_nvme, 1);
2510                        bf_set(prli_conf, npr_nvme, 1);
2511                }
2512
2513                npr_nvme->word1 = cpu_to_be32(npr_nvme->word1);
2514                npr_nvme->word4 = cpu_to_be32(npr_nvme->word4);
2515                elsiocb->iocb_flag |= LPFC_PRLI_NVME_REQ;
2516
2517                /* Remove NVME type - processed. */
2518                local_nlp_type &= ~NLP_FC4_NVME;
2519        }
2520
2521        phba->fc_stat.elsXmitPRLI++;
2522        elsiocb->iocb_cmpl = lpfc_cmpl_els_prli;
2523        spin_lock_irq(&ndlp->lock);
2524        ndlp->nlp_flag |= NLP_PRLI_SND;
2525
2526        /* The vport counters are used for lpfc_scan_finished, but
2527         * the ndlp is used to track outstanding PRLIs for different
2528         * FC4 types.
2529         */
2530        vport->fc_prli_sent++;
2531        ndlp->fc4_prli_sent++;
2532        spin_unlock_irq(&ndlp->lock);
2533
2534        lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_CMD,
2535                              "Issue PRLI:  did:x%x refcnt %d",
2536                              ndlp->nlp_DID, kref_read(&ndlp->kref), 0);
2537        elsiocb->context1 = lpfc_nlp_get(ndlp);
2538        if (!elsiocb->context1) {
2539                lpfc_els_free_iocb(phba, elsiocb);
2540                goto err;
2541        }
2542
2543        rc = lpfc_sli_issue_iocb(phba, LPFC_ELS_RING, elsiocb, 0);
2544        if (rc == IOCB_ERROR) {
2545                lpfc_els_free_iocb(phba, elsiocb);
2546                lpfc_nlp_put(ndlp);
2547                goto err;
2548        }
2549
2550
2551        /* The driver supports 2 FC4 types.  Make sure
2552         * a PRLI is issued for all types before exiting.
2553         */
2554        if (phba->sli_rev == LPFC_SLI_REV4 &&
2555            local_nlp_type & (NLP_FC4_FCP | NLP_FC4_NVME))
2556                goto send_next_prli;
2557        else
2558                return 0;
2559
2560err:
2561        spin_lock_irq(&ndlp->lock);
2562        ndlp->nlp_flag &= ~NLP_PRLI_SND;
2563        spin_unlock_irq(&ndlp->lock);
2564        return 1;
2565}
2566
2567/**
2568 * lpfc_rscn_disc - Perform rscn discovery for a vport
2569 * @vport: pointer to a host virtual N_Port data structure.
2570 *
2571 * This routine performs Registration State Change Notification (RSCN)
2572 * discovery for a @vport. If the @vport's node port recovery count is not
2573 * zero, it will invoke the lpfc_els_disc_plogi() to perform PLOGI for all
2574 * the nodes that need recovery. If none of the PLOGI were needed through
2575 * the lpfc_els_disc_plogi() routine, the lpfc_end_rscn() routine shall be
2576 * invoked to check and handle possible more RSCN came in during the period
2577 * of processing the current ones.
2578 **/
2579static void
2580lpfc_rscn_disc(struct lpfc_vport *vport)
2581{
2582        lpfc_can_disctmo(vport);
2583
2584        /* RSCN discovery */
2585        /* go thru NPR nodes and issue ELS PLOGIs */
2586        if (vport->fc_npr_cnt)
2587                if (lpfc_els_disc_plogi(vport))
2588                        return;
2589
2590        lpfc_end_rscn(vport);
2591}
2592
2593/**
2594 * lpfc_adisc_done - Complete the adisc phase of discovery
2595 * @vport: pointer to lpfc_vport hba data structure that finished all ADISCs.
2596 *
2597 * This function is called when the final ADISC is completed during discovery.
2598 * This function handles clearing link attention or issuing reg_vpi depending
2599 * on whether npiv is enabled. This function also kicks off the PLOGI phase of
2600 * discovery.
2601 * This function is called with no locks held.
2602 **/
2603static void
2604lpfc_adisc_done(struct lpfc_vport *vport)
2605{
2606        struct Scsi_Host   *shost = lpfc_shost_from_vport(vport);
2607        struct lpfc_hba   *phba = vport->phba;
2608
2609        /*
2610         * For NPIV, cmpl_reg_vpi will set port_state to READY,
2611         * and continue discovery.
2612         */
2613        if ((phba->sli3_options & LPFC_SLI3_NPIV_ENABLED) &&
2614            !(vport->fc_flag & FC_RSCN_MODE) &&
2615            (phba->sli_rev < LPFC_SLI_REV4)) {
2616
2617                /*
2618                 * If link is down, clear_la and reg_vpi will be done after
2619                 * flogi following a link up event
2620                 */
2621                if (!lpfc_is_link_up(phba))
2622                        return;
2623
2624                /* The ADISCs are complete.  Doesn't matter if they
2625                 * succeeded or failed because the ADISC completion
2626                 * routine guarantees to call the state machine and
2627                 * the RPI is either unregistered (failed ADISC response)
2628                 * or the RPI is still valid and the node is marked
2629                 * mapped for a target.  The exchanges should be in the
2630                 * correct state. This code is specific to SLI3.
2631                 */
2632                lpfc_issue_clear_la(phba, vport);
2633                lpfc_issue_reg_vpi(phba, vport);
2634                return;
2635        }
2636        /*
2637        * For SLI2, we need to set port_state to READY
2638        * and continue discovery.
2639        */
2640        if (vport->port_state < LPFC_VPORT_READY) {
2641                /* If we get here, there is nothing to ADISC */
2642                lpfc_issue_clear_la(phba, vport);
2643                if (!(vport->fc_flag & FC_ABORT_DISCOVERY)) {
2644                        vport->num_disc_nodes = 0;
2645                        /* go thru NPR list, issue ELS PLOGIs */
2646                        if (vport->fc_npr_cnt)
2647                                lpfc_els_disc_plogi(vport);
2648                        if (!vport->num_disc_nodes) {
2649                                spin_lock_irq(shost->host_lock);
2650                                vport->fc_flag &= ~FC_NDISC_ACTIVE;
2651                                spin_unlock_irq(shost->host_lock);
2652                                lpfc_can_disctmo(vport);
2653                                lpfc_end_rscn(vport);
2654                        }
2655                }
2656                vport->port_state = LPFC_VPORT_READY;
2657        } else
2658                lpfc_rscn_disc(vport);
2659}
2660
2661/**
2662 * lpfc_more_adisc - Issue more adisc as needed
2663 * @vport: pointer to a host virtual N_Port data structure.
2664 *
2665 * This routine determines whether there are more ndlps on a @vport
2666 * node list need to have Address Discover (ADISC) issued. If so, it will
2667 * invoke the lpfc_els_disc_adisc() routine to issue ADISC on the @vport's
2668 * remaining nodes which need to have ADISC sent.
2669 **/
2670void
2671lpfc_more_adisc(struct lpfc_vport *vport)
2672{
2673        if (vport->num_disc_nodes)
2674                vport->num_disc_nodes--;
2675        /* Continue discovery with <num_disc_nodes> ADISCs to go */
2676        lpfc_printf_vlog(vport, KERN_INFO, LOG_DISCOVERY,
2677                         "0210 Continue discovery with %d ADISCs to go "
2678                         "Data: x%x x%x x%x\n",
2679                         vport->num_disc_nodes, vport->fc_adisc_cnt,
2680                         vport->fc_flag, vport->port_state);
2681        /* Check to see if there are more ADISCs to be sent */
2682        if (vport->fc_flag & FC_NLP_MORE) {
2683                lpfc_set_disctmo(vport);
2684                /* go thru NPR nodes and issue any remaining ELS ADISCs */
2685                lpfc_els_disc_adisc(vport);
2686        }
2687        if (!vport->num_disc_nodes)
2688                lpfc_adisc_done(vport);
2689        return;
2690}
2691
2692/**
2693 * lpfc_cmpl_els_adisc - Completion callback function for adisc
2694 * @phba: pointer to lpfc hba data structure.
2695 * @cmdiocb: pointer to lpfc command iocb data structure.
2696 * @rspiocb: pointer to lpfc response iocb data structure.
2697 *
2698 * This routine is the completion function for issuing the Address Discover
2699 * (ADISC) command. It first checks to see whether link went down during
2700 * the discovery process. If so, the node will be marked as node port
2701 * recovery for issuing discover IOCB by the link attention handler and
2702 * exit. Otherwise, the response status is checked. If error was reported
2703 * in the response status, the ADISC command shall be retried by invoking
2704 * the lpfc_els_retry() routine. Otherwise, if no error was reported in
2705 * the response status, the state machine is invoked to set transition
2706 * with respect to NLP_EVT_CMPL_ADISC event.
2707 **/
2708static void
2709lpfc_cmpl_els_adisc(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
2710                    struct lpfc_iocbq *rspiocb)
2711{
2712        struct lpfc_vport *vport = cmdiocb->vport;
2713        IOCB_t *irsp;
2714        struct lpfc_nodelist *ndlp;
2715        int  disc;
2716
2717        /* we pass cmdiocb to state machine which needs rspiocb as well */
2718        cmdiocb->context_un.rsp_iocb = rspiocb;
2719
2720        irsp = &(rspiocb->iocb);
2721        ndlp = (struct lpfc_nodelist *) cmdiocb->context1;
2722
2723        lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_CMD,
2724                "ADISC cmpl:      status:x%x/x%x did:x%x",
2725                irsp->ulpStatus, irsp->un.ulpWord[4],
2726                ndlp->nlp_DID);
2727
2728        /* Since ndlp can be freed in the disc state machine, note if this node
2729         * is being used during discovery.
2730         */
2731        spin_lock_irq(&ndlp->lock);
2732        disc = (ndlp->nlp_flag & NLP_NPR_2B_DISC);
2733        ndlp->nlp_flag &= ~(NLP_ADISC_SND | NLP_NPR_2B_DISC);
2734        spin_unlock_irq(&ndlp->lock);
2735        /* ADISC completes to NPort <nlp_DID> */
2736        lpfc_printf_vlog(vport, KERN_INFO, LOG_ELS,
2737                         "0104 ADISC completes to NPort x%x "
2738                         "Data: x%x x%x x%x x%x x%x\n",
2739                         ndlp->nlp_DID, irsp->ulpStatus, irsp->un.ulpWord[4],
2740                         irsp->ulpTimeout, disc, vport->num_disc_nodes);
2741        /* Check to see if link went down during discovery */
2742        if (lpfc_els_chk_latt(vport)) {
2743                spin_lock_irq(&ndlp->lock);
2744                ndlp->nlp_flag |= NLP_NPR_2B_DISC;
2745                spin_unlock_irq(&ndlp->lock);
2746                goto out;
2747        }
2748
2749        if (irsp->ulpStatus) {
2750                /* Check for retry */
2751                if (lpfc_els_retry(phba, cmdiocb, rspiocb)) {
2752                        /* ELS command is being retried */
2753                        if (disc) {
2754                                spin_lock_irq(&ndlp->lock);
2755                                ndlp->nlp_flag |= NLP_NPR_2B_DISC;
2756                                spin_unlock_irq(&ndlp->lock);
2757                                lpfc_set_disctmo(vport);
2758                        }
2759                        goto out;
2760                }
2761                /* ADISC failed */
2762                lpfc_printf_vlog(vport, KERN_ERR, LOG_TRACE_EVENT,
2763                                 "2755 ADISC failure DID:%06X Status:x%x/x%x\n",
2764                                 ndlp->nlp_DID, irsp->ulpStatus,
2765                                 irsp->un.ulpWord[4]);
2766
2767                lpfc_disc_state_machine(vport, ndlp, cmdiocb,
2768                                NLP_EVT_CMPL_ADISC);
2769
2770                /* As long as this node is not registered with the SCSI or NVMe
2771                 * transport, it is no longer an active node. Otherwise
2772                 * devloss handles the final cleanup.
2773                 */
2774                if (!(ndlp->fc4_xpt_flags & (SCSI_XPT_REGD | NVME_XPT_REGD))) {
2775                        spin_lock_irq(&ndlp->lock);
2776                        ndlp->nlp_flag &= ~NLP_NPR_2B_DISC;
2777                        spin_unlock_irq(&ndlp->lock);
2778                        lpfc_disc_state_machine(vport, ndlp, cmdiocb,
2779                                                NLP_EVT_DEVICE_RM);
2780                }
2781        } else
2782                /* Good status, call state machine */
2783                lpfc_disc_state_machine(vport, ndlp, cmdiocb,
2784                                        NLP_EVT_CMPL_ADISC);
2785
2786        /* Check to see if there are more ADISCs to be sent */
2787        if (disc && vport->num_disc_nodes)
2788                lpfc_more_adisc(vport);
2789out:
2790        lpfc_els_free_iocb(phba, cmdiocb);
2791        lpfc_nlp_put(ndlp);
2792        return;
2793}
2794
2795/**
2796 * lpfc_issue_els_adisc - Issue an address discover iocb to an node on a vport
2797 * @vport: pointer to a virtual N_Port data structure.
2798 * @ndlp: pointer to a node-list data structure.
2799 * @retry: number of retries to the command IOCB.
2800 *
2801 * This routine issues an Address Discover (ADISC) for an @ndlp on a
2802 * @vport. It prepares the payload of the ADISC ELS command, updates the
2803 * and states of the ndlp, and invokes the lpfc_sli_issue_iocb() routine
2804 * to issue the ADISC ELS command.
2805 *
2806 * Note that the ndlp reference count will be incremented by 1 for holding the
2807 * ndlp and the reference to ndlp will be stored into the context1 field of
2808 * the IOCB for the completion callback function to the ADISC ELS command.
2809 *
2810 * Return code
2811 *   0 - successfully issued adisc
2812 *   1 - failed to issue adisc
2813 **/
2814int
2815lpfc_issue_els_adisc(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
2816                     uint8_t retry)
2817{
2818        int rc = 0;
2819        struct lpfc_hba  *phba = vport->phba;
2820        ADISC *ap;
2821        struct lpfc_iocbq *elsiocb;
2822        uint8_t *pcmd;
2823        uint16_t cmdsize;
2824
2825        cmdsize = (sizeof(uint32_t) + sizeof(ADISC));
2826        elsiocb = lpfc_prep_els_iocb(vport, 1, cmdsize, retry, ndlp,
2827                                     ndlp->nlp_DID, ELS_CMD_ADISC);
2828        if (!elsiocb)
2829                return 1;
2830
2831        pcmd = (uint8_t *) (((struct lpfc_dmabuf *) elsiocb->context2)->virt);
2832
2833        /* For ADISC request, remainder of payload is service parameters */
2834        *((uint32_t *) (pcmd)) = ELS_CMD_ADISC;
2835        pcmd += sizeof(uint32_t);
2836
2837        /* Fill in ADISC payload */
2838        ap = (ADISC *) pcmd;
2839        ap->hardAL_PA = phba->fc_pref_ALPA;
2840        memcpy(&ap->portName, &vport->fc_portname, sizeof(struct lpfc_name));
2841        memcpy(&ap->nodeName, &vport->fc_nodename, sizeof(struct lpfc_name));
2842        ap->DID = be32_to_cpu(vport->fc_myDID);
2843
2844        phba->fc_stat.elsXmitADISC++;
2845        elsiocb->iocb_cmpl = lpfc_cmpl_els_adisc;
2846        spin_lock_irq(&ndlp->lock);
2847        ndlp->nlp_flag |= NLP_ADISC_SND;
2848        spin_unlock_irq(&ndlp->lock);
2849        elsiocb->context1 = lpfc_nlp_get(ndlp);
2850        if (!elsiocb->context1) {
2851                lpfc_els_free_iocb(phba, elsiocb);
2852                goto err;
2853        }
2854
2855        lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_CMD,
2856                              "Issue ADISC:   did:x%x refcnt %d",
2857                              ndlp->nlp_DID, kref_read(&ndlp->kref), 0);
2858        rc = lpfc_sli_issue_iocb(phba, LPFC_ELS_RING, elsiocb, 0);
2859        if (rc == IOCB_ERROR) {
2860                lpfc_els_free_iocb(phba, elsiocb);
2861                lpfc_nlp_put(ndlp);
2862                goto err;
2863        }
2864
2865        return 0;
2866
2867err:
2868        spin_lock_irq(&ndlp->lock);
2869        ndlp->nlp_flag &= ~NLP_ADISC_SND;
2870        spin_unlock_irq(&ndlp->lock);
2871        return 1;
2872}
2873
2874/**
2875 * lpfc_cmpl_els_logo - Completion callback function for logo
2876 * @phba: pointer to lpfc hba data structure.
2877 * @cmdiocb: pointer to lpfc command iocb data structure.
2878 * @rspiocb: pointer to lpfc response iocb data structure.
2879 *
2880 * This routine is the completion function for issuing the ELS Logout (LOGO)
2881 * command. If no error status was reported from the LOGO response, the
2882 * state machine of the associated ndlp shall be invoked for transition with
2883 * respect to NLP_EVT_CMPL_LOGO event.
2884 **/
2885static void
2886lpfc_cmpl_els_logo(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
2887                   struct lpfc_iocbq *rspiocb)
2888{
2889        struct lpfc_nodelist *ndlp = (struct lpfc_nodelist *) cmdiocb->context1;
2890        struct lpfc_vport *vport = ndlp->vport;
2891        IOCB_t *irsp;
2892        unsigned long flags;
2893        uint32_t skip_recovery = 0;
2894        int wake_up_waiter = 0;
2895
2896        /* we pass cmdiocb to state machine which needs rspiocb as well */
2897        cmdiocb->context_un.rsp_iocb = rspiocb;
2898
2899        irsp = &(rspiocb->iocb);
2900        spin_lock_irq(&ndlp->lock);
2901        ndlp->nlp_flag &= ~NLP_LOGO_SND;
2902        if (ndlp->upcall_flags & NLP_WAIT_FOR_LOGO) {
2903                wake_up_waiter = 1;
2904                ndlp->upcall_flags &= ~NLP_WAIT_FOR_LOGO;
2905        }
2906        spin_unlock_irq(&ndlp->lock);
2907
2908        lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_CMD,
2909                "LOGO cmpl:       status:x%x/x%x did:x%x",
2910                irsp->ulpStatus, irsp->un.ulpWord[4],
2911                ndlp->nlp_DID);
2912
2913        /* LOGO completes to NPort <nlp_DID> */
2914        lpfc_printf_vlog(vport, KERN_INFO, LOG_ELS,
2915                         "0105 LOGO completes to NPort x%x "
2916                         "refcnt %d nflags x%x Data: x%x x%x x%x x%x\n",
2917                         ndlp->nlp_DID, kref_read(&ndlp->kref), ndlp->nlp_flag,
2918                         irsp->ulpStatus, irsp->un.ulpWord[4],
2919                         irsp->ulpTimeout, vport->num_disc_nodes);
2920
2921        if (lpfc_els_chk_latt(vport)) {
2922                skip_recovery = 1;
2923                goto out;
2924        }
2925
2926        /* The LOGO will not be retried on failure.  A LOGO was
2927         * issued to the remote rport and a ACC or RJT or no Answer are
2928         * all acceptable.  Note the failure and move forward with
2929         * discovery.  The PLOGI will retry.
2930         */
2931        if (irsp->ulpStatus) {
2932                /* LOGO failed */
2933                lpfc_printf_vlog(vport, KERN_ERR, LOG_TRACE_EVENT,
2934                                 "2756 LOGO failure, No Retry DID:%06X Status:x%x/x%x\n",
2935                                 ndlp->nlp_DID, irsp->ulpStatus,
2936                                 irsp->un.ulpWord[4]);
2937                /* Do not call DSM for lpfc_els_abort'ed ELS cmds */
2938                if (lpfc_error_lost_link(irsp)) {
2939                        skip_recovery = 1;
2940                        goto out;
2941                }
2942        }
2943
2944        /* Call state machine. This will unregister the rpi if needed. */
2945        lpfc_disc_state_machine(vport, ndlp, cmdiocb, NLP_EVT_CMPL_LOGO);
2946
2947        /* The driver sets this flag for an NPIV instance that doesn't want to
2948         * log into the remote port.
2949         */
2950        if (ndlp->nlp_flag & NLP_TARGET_REMOVE) {
2951                spin_lock_irq(&ndlp->lock);
2952                if (phba->sli_rev == LPFC_SLI_REV4)
2953                        ndlp->nlp_flag |= NLP_RELEASE_RPI;
2954                ndlp->nlp_flag &= ~NLP_NPR_2B_DISC;
2955                spin_unlock_irq(&ndlp->lock);
2956                lpfc_disc_state_machine(vport, ndlp, cmdiocb,
2957                                        NLP_EVT_DEVICE_RM);
2958                lpfc_els_free_iocb(phba, cmdiocb);
2959                lpfc_nlp_put(ndlp);
2960
2961                /* Presume the node was released. */
2962                return;
2963        }
2964
2965out:
2966        /* Driver is done with the IO.  */
2967        lpfc_els_free_iocb(phba, cmdiocb);
2968        lpfc_nlp_put(ndlp);
2969
2970        /* At this point, the LOGO processing is complete. NOTE: For a
2971         * pt2pt topology, we are assuming the NPortID will only change
2972         * on link up processing. For a LOGO / PLOGI initiated by the
2973         * Initiator, we are assuming the NPortID is not going to change.
2974         */
2975
2976        if (wake_up_waiter && ndlp->logo_waitq)
2977                wake_up(ndlp->logo_waitq);
2978        /*
2979         * If the node is a target, the handling attempts to recover the port.
2980         * For any other port type, the rpi is unregistered as an implicit
2981         * LOGO.
2982         */
2983        if (ndlp->nlp_type & (NLP_FCP_TARGET | NLP_NVME_TARGET) &&
2984            skip_recovery == 0) {
2985                lpfc_cancel_retry_delay_tmo(vport, ndlp);
2986                spin_lock_irqsave(&ndlp->lock, flags);
2987                ndlp->nlp_flag |= NLP_NPR_2B_DISC;
2988                spin_unlock_irqrestore(&ndlp->lock, flags);
2989
2990                lpfc_printf_vlog(vport, KERN_INFO, LOG_ELS,
2991                                 "3187 LOGO completes to NPort x%x: Start "
2992                                 "Recovery Data: x%x x%x x%x x%x\n",
2993                                 ndlp->nlp_DID, irsp->ulpStatus,
2994                                 irsp->un.ulpWord[4], irsp->ulpTimeout,
2995                                 vport->num_disc_nodes);
2996                lpfc_disc_start(vport);
2997                return;
2998        }
2999
3000        /* Cleanup path for failed REG_RPI handling. If REG_RPI fails, the
3001         * driver sends a LOGO to the rport to cleanup.  For fabric and
3002         * initiator ports cleanup the node as long as it the node is not
3003         * register with the transport.
3004         */
3005        if (!(ndlp->fc4_xpt_flags & (SCSI_XPT_REGD | NVME_XPT_REGD))) {
3006                spin_lock_irq(&ndlp->lock);
3007                ndlp->nlp_flag &= ~NLP_NPR_2B_DISC;
3008                spin_unlock_irq(&ndlp->lock);
3009                lpfc_disc_state_machine(vport, ndlp, cmdiocb,
3010                                        NLP_EVT_DEVICE_RM);
3011        }
3012}
3013
3014/**
3015 * lpfc_issue_els_logo - Issue a logo to an node on a vport
3016 * @vport: pointer to a virtual N_Port data structure.
3017 * @ndlp: pointer to a node-list data structure.
3018 * @retry: number of retries to the command IOCB.
3019 *
3020 * This routine constructs and issues an ELS Logout (LOGO) iocb command
3021 * to a remote node, referred by an @ndlp on a @vport. It constructs the
3022 * payload of the IOCB, properly sets up the @ndlp state, and invokes the
3023 * lpfc_sli_issue_iocb() routine to send out the LOGO ELS command.
3024 *
3025 * Note that the ndlp reference count will be incremented by 1 for holding the
3026 * ndlp and the reference to ndlp will be stored into the context1 field of
3027 * the IOCB for the completion callback function to the LOGO ELS command.
3028 *
3029 * Callers of this routine are expected to unregister the RPI first
3030 *
3031 * Return code
3032 *   0 - successfully issued logo
3033 *   1 - failed to issue logo
3034 **/
3035int
3036lpfc_issue_els_logo(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
3037                    uint8_t retry)
3038{
3039        struct lpfc_hba  *phba = vport->phba;
3040        struct lpfc_iocbq *elsiocb;
3041        uint8_t *pcmd;
3042        uint16_t cmdsize;
3043        int rc;
3044
3045        spin_lock_irq(&ndlp->lock);
3046        if (ndlp->nlp_flag & NLP_LOGO_SND) {
3047                spin_unlock_irq(&ndlp->lock);
3048                return 0;
3049        }
3050        spin_unlock_irq(&ndlp->lock);
3051
3052        cmdsize = (2 * sizeof(uint32_t)) + sizeof(struct lpfc_name);
3053        elsiocb = lpfc_prep_els_iocb(vport, 1, cmdsize, retry, ndlp,
3054                                     ndlp->nlp_DID, ELS_CMD_LOGO);
3055        if (!elsiocb)
3056                return 1;
3057
3058        pcmd = (uint8_t *) (((struct lpfc_dmabuf *) elsiocb->context2)->virt);
3059        *((uint32_t *) (pcmd)) = ELS_CMD_LOGO;
3060        pcmd += sizeof(uint32_t);
3061
3062        /* Fill in LOGO payload */
3063        *((uint32_t *) (pcmd)) = be32_to_cpu(vport->fc_myDID);
3064        pcmd += sizeof(uint32_t);
3065        memcpy(pcmd, &vport->fc_portname, sizeof(struct lpfc_name));
3066
3067        phba->fc_stat.elsXmitLOGO++;
3068        elsiocb->iocb_cmpl = lpfc_cmpl_els_logo;
3069        spin_lock_irq(&ndlp->lock);
3070        ndlp->nlp_flag |= NLP_LOGO_SND;
3071        ndlp->nlp_flag &= ~NLP_ISSUE_LOGO;
3072        spin_unlock_irq(&ndlp->lock);
3073        elsiocb->context1 = lpfc_nlp_get(ndlp);
3074        if (!elsiocb->context1) {
3075                lpfc_els_free_iocb(phba, elsiocb);
3076                goto err;
3077        }
3078
3079        lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_CMD,
3080                              "Issue LOGO:      did:x%x refcnt %d",
3081                              ndlp->nlp_DID, kref_read(&ndlp->kref), 0);
3082        rc = lpfc_sli_issue_iocb(phba, LPFC_ELS_RING, elsiocb, 0);
3083        if (rc == IOCB_ERROR) {
3084                lpfc_els_free_iocb(phba, elsiocb);
3085                lpfc_nlp_put(ndlp);
3086                goto err;
3087        }
3088
3089        spin_lock_irq(&ndlp->lock);
3090        ndlp->nlp_prev_state = ndlp->nlp_state;
3091        spin_unlock_irq(&ndlp->lock);
3092        lpfc_nlp_set_state(vport, ndlp, NLP_STE_LOGO_ISSUE);
3093        return 0;
3094
3095err:
3096        spin_lock_irq(&ndlp->lock);
3097        ndlp->nlp_flag &= ~NLP_LOGO_SND;
3098        spin_unlock_irq(&ndlp->lock);
3099        return 1;
3100}
3101
3102/**
3103 * lpfc_cmpl_els_cmd - Completion callback function for generic els command
3104 * @phba: pointer to lpfc hba data structure.
3105 * @cmdiocb: pointer to lpfc command iocb data structure.
3106 * @rspiocb: pointer to lpfc response iocb data structure.
3107 *
3108 * This routine is a generic completion callback function for ELS commands.
3109 * Specifically, it is the callback function which does not need to perform
3110 * any command specific operations. It is currently used by the ELS command
3111 * issuing routines for RSCN, lpfc_issue_els_rscn, and the ELS Fibre Channel
3112 * Address Resolution Protocol Response (FARPR) routine, lpfc_issue_els_farpr().
3113 * Other than certain debug loggings, this callback function simply invokes the
3114 * lpfc_els_chk_latt() routine to check whether link went down during the
3115 * discovery process.
3116 **/
3117static void
3118lpfc_cmpl_els_cmd(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
3119                  struct lpfc_iocbq *rspiocb)
3120{
3121        struct lpfc_vport *vport = cmdiocb->vport;
3122        struct lpfc_nodelist *free_ndlp;
3123        IOCB_t *irsp;
3124
3125        irsp = &rspiocb->iocb;
3126
3127        lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_CMD,
3128                              "ELS cmd cmpl:    status:x%x/x%x did:x%x",
3129                              irsp->ulpStatus, irsp->un.ulpWord[4],
3130                              irsp->un.elsreq64.remoteID);
3131
3132        /* ELS cmd tag <ulpIoTag> completes */
3133        lpfc_printf_vlog(vport, KERN_INFO, LOG_ELS,
3134                         "0106 ELS cmd tag x%x completes Data: x%x x%x x%x\n",
3135                         irsp->ulpIoTag, irsp->ulpStatus,
3136                         irsp->un.ulpWord[4], irsp->ulpTimeout);
3137
3138        /* Check to see if link went down during discovery */
3139        lpfc_els_chk_latt(vport);
3140
3141        free_ndlp = (struct lpfc_nodelist *)cmdiocb->context1;
3142
3143        lpfc_els_free_iocb(phba, cmdiocb);
3144        lpfc_nlp_put(free_ndlp);
3145}
3146
3147/**
3148 * lpfc_reg_fab_ctrl_node - RPI register the fabric controller node.
3149 * @vport: pointer to lpfc_vport data structure.
3150 * @fc_ndlp: pointer to the fabric controller (0xfffffd) node.
3151 *
3152 * This routine registers the rpi assigned to the fabric controller
3153 * NPort_ID (0xfffffd) with the port and moves the node to UNMAPPED
3154 * state triggering a registration with the SCSI transport.
3155 *
3156 * This routine is single out because the fabric controller node
3157 * does not receive a PLOGI.  This routine is consumed by the
3158 * SCR and RDF ELS commands.  Callers are expected to qualify
3159 * with SLI4 first.
3160 **/
3161static int
3162lpfc_reg_fab_ctrl_node(struct lpfc_vport *vport, struct lpfc_nodelist *fc_ndlp)
3163{
3164        int rc = 0;
3165        struct lpfc_hba *phba = vport->phba;
3166        struct lpfc_nodelist *ns_ndlp;
3167        LPFC_MBOXQ_t *mbox;
3168        struct lpfc_dmabuf *mp;
3169
3170        if (fc_ndlp->nlp_flag & NLP_RPI_REGISTERED)
3171                return rc;
3172
3173        ns_ndlp = lpfc_findnode_did(vport, NameServer_DID);
3174        if (!ns_ndlp)
3175                return -ENODEV;
3176
3177        lpfc_printf_vlog(vport, KERN_INFO, LOG_NODE,
3178                         "0935 %s: Reg FC RPI x%x on FC DID x%x NSSte: x%x\n",
3179                         __func__, fc_ndlp->nlp_rpi, fc_ndlp->nlp_DID,
3180                         ns_ndlp->nlp_state);
3181        if (ns_ndlp->nlp_state != NLP_STE_UNMAPPED_NODE)
3182                return -ENODEV;
3183
3184        mbox = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL);
3185        if (!mbox) {
3186                lpfc_printf_vlog(vport, KERN_ERR, LOG_NODE,
3187                                 "0936 %s: no memory for reg_login "
3188                                 "Data: x%x x%x x%x x%x\n", __func__,
3189                                 fc_ndlp->nlp_DID, fc_ndlp->nlp_state,
3190                                 fc_ndlp->nlp_flag, fc_ndlp->nlp_rpi);
3191                return -ENOMEM;
3192        }
3193        rc = lpfc_reg_rpi(phba, vport->vpi, fc_ndlp->nlp_DID,
3194                          (u8 *)&vport->fc_sparam, mbox, fc_ndlp->nlp_rpi);
3195        if (rc) {
3196                rc = -EACCES;
3197                goto out;
3198        }
3199
3200        fc_ndlp->nlp_flag |= NLP_REG_LOGIN_SEND;
3201        mbox->mbox_cmpl = lpfc_mbx_cmpl_fc_reg_login;
3202        mbox->ctx_ndlp = lpfc_nlp_get(fc_ndlp);
3203        if (!mbox->ctx_ndlp) {
3204                rc = -ENOMEM;
3205                goto out_mem;
3206        }
3207
3208        mbox->vport = vport;
3209        rc = lpfc_sli_issue_mbox(phba, mbox, MBX_NOWAIT);
3210        if (rc == MBX_NOT_FINISHED) {
3211                rc = -ENODEV;
3212                lpfc_nlp_put(fc_ndlp);
3213                goto out_mem;
3214        }
3215        /* Success path. Exit. */
3216        lpfc_nlp_set_state(vport, fc_ndlp,
3217                           NLP_STE_REG_LOGIN_ISSUE);
3218        return 0;
3219
3220 out_mem:
3221        fc_ndlp->nlp_flag &= ~NLP_REG_LOGIN_SEND;
3222        mp = (struct lpfc_dmabuf *)mbox->ctx_buf;
3223        lpfc_mbuf_free(phba, mp->virt, mp->phys);
3224        kfree(mp);
3225
3226 out:
3227        mempool_free(mbox, phba->mbox_mem_pool);
3228        lpfc_printf_vlog(vport, KERN_ERR, LOG_NODE,
3229                         "0938 %s: failed to format reg_login "
3230                         "Data: x%x x%x x%x x%x\n", __func__,
3231                         fc_ndlp->nlp_DID, fc_ndlp->nlp_state,
3232                         fc_ndlp->nlp_flag, fc_ndlp->nlp_rpi);
3233        return rc;
3234}
3235
3236/**
3237 * lpfc_cmpl_els_disc_cmd - Completion callback function for Discovery ELS cmd
3238 * @phba: pointer to lpfc hba data structure.
3239 * @cmdiocb: pointer to lpfc command iocb data structure.
3240 * @rspiocb: pointer to lpfc response iocb data structure.
3241 *
3242 * This routine is a generic completion callback function for Discovery ELS cmd.
3243 * Currently used by the ELS command issuing routines for the ELS State Change
3244 * Request (SCR), lpfc_issue_els_scr() and the ELS RDF, lpfc_issue_els_rdf().
3245 * These commands will be retried once only for ELS timeout errors.
3246 **/
3247static void
3248lpfc_cmpl_els_disc_cmd(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
3249                       struct lpfc_iocbq *rspiocb)
3250{
3251        struct lpfc_vport *vport = cmdiocb->vport;
3252        IOCB_t *irsp;
3253        struct lpfc_els_rdf_rsp *prdf;
3254        struct lpfc_dmabuf *pcmd, *prsp;
3255        u32 *pdata;
3256        u32 cmd;
3257        struct lpfc_nodelist *ndlp = cmdiocb->context1;
3258
3259        irsp = &rspiocb->iocb;
3260
3261        lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_CMD,
3262                "ELS cmd cmpl:    status:x%x/x%x did:x%x",
3263                irsp->ulpStatus, irsp->un.ulpWord[4],
3264                irsp->un.elsreq64.remoteID);
3265        /* ELS cmd tag <ulpIoTag> completes */
3266        lpfc_printf_vlog(vport, KERN_INFO, LOG_ELS | LOG_CGN_MGMT,
3267                         "0217 ELS cmd tag x%x completes Data: x%x x%x x%x "
3268                         "x%x\n",
3269                         irsp->ulpIoTag, irsp->ulpStatus,
3270                         irsp->un.ulpWord[4], irsp->ulpTimeout,
3271                         cmdiocb->retry);
3272
3273        pcmd = (struct lpfc_dmabuf *)cmdiocb->context2;
3274        if (!pcmd)
3275                goto out;
3276
3277        pdata = (u32 *)pcmd->virt;
3278        if (!pdata)
3279                goto out;
3280        cmd = *pdata;
3281
3282        /* Only 1 retry for ELS Timeout only */
3283        if (irsp->ulpStatus == IOSTAT_LOCAL_REJECT &&
3284            ((irsp->un.ulpWord[4] & IOERR_PARAM_MASK) ==
3285            IOERR_SEQUENCE_TIMEOUT)) {
3286                cmdiocb->retry++;
3287                if (cmdiocb->retry <= 1) {
3288                        switch (cmd) {
3289                        case ELS_CMD_SCR:
3290                                lpfc_issue_els_scr(vport, cmdiocb->retry);
3291                                break;
3292                        case ELS_CMD_EDC:
3293                                lpfc_issue_els_edc(vport, cmdiocb->retry);
3294                                break;
3295                        case ELS_CMD_RDF:
3296                                cmdiocb->context1 = NULL; /* save ndlp refcnt */
3297                                lpfc_issue_els_rdf(vport, cmdiocb->retry);
3298                                break;
3299                        }
3300                        goto out;
3301                }
3302                phba->fc_stat.elsRetryExceeded++;
3303        }
3304        if (cmd == ELS_CMD_EDC) {
3305                /* must be called before checking uplStatus and returning */
3306                lpfc_cmpl_els_edc(phba, cmdiocb, rspiocb);
3307                return;
3308        }
3309        if (irsp->ulpStatus) {
3310                /* ELS discovery cmd completes with error */
3311                lpfc_printf_vlog(vport, KERN_WARNING, LOG_ELS,
3312                                 "4203 ELS cmd x%x error: x%x x%X\n", cmd,
3313                                 irsp->ulpStatus, irsp->un.ulpWord[4]);
3314                goto out;
3315        }
3316
3317        /* The RDF response doesn't have any impact on the running driver
3318         * but the notification descriptors are dumped here for support.
3319         */
3320        if (cmd == ELS_CMD_RDF) {
3321                int i;
3322
3323                prsp = list_get_first(&pcmd->list, struct lpfc_dmabuf, list);
3324                if (!prsp)
3325                        goto out;
3326
3327                prdf = (struct lpfc_els_rdf_rsp *)prsp->virt;
3328                if (!prdf)
3329                        goto out;
3330
3331                for (i = 0; i < ELS_RDF_REG_TAG_CNT &&
3332                            i < be32_to_cpu(prdf->reg_d1.reg_desc.count); i++)
3333                        lpfc_printf_vlog(vport, KERN_INFO,
3334                                         LOG_ELS | LOG_CGN_MGMT,
3335                                         "4677 Fabric RDF Notification Grant "
3336                                         "Data: 0x%08x Reg: %x %x\n",
3337                                         be32_to_cpu(
3338                                                prdf->reg_d1.desc_tags[i]),
3339                                         phba->cgn_reg_signal,
3340                                         phba->cgn_reg_fpin);
3341        }
3342
3343out:
3344        /* Check to see if link went down during discovery */
3345        lpfc_els_chk_latt(vport);
3346        lpfc_els_free_iocb(phba, cmdiocb);
3347        lpfc_nlp_put(ndlp);
3348        return;
3349}
3350
3351/**
3352 * lpfc_issue_els_scr - Issue a scr to an node on a vport
3353 * @vport: pointer to a host virtual N_Port data structure.
3354 * @retry: retry counter for the command IOCB.
3355 *
3356 * This routine issues a State Change Request (SCR) to a fabric node
3357 * on a @vport. The remote node is Fabric Controller (0xfffffd). It
3358 * first search the @vport node list to find the matching ndlp. If no such
3359 * ndlp is found, a new ndlp shall be created for this (SCR) purpose. An
3360 * IOCB is allocated, payload prepared, and the lpfc_sli_issue_iocb()
3361 * routine is invoked to send the SCR IOCB.
3362 *
3363 * Note that the ndlp reference count will be incremented by 1 for holding the
3364 * ndlp and the reference to ndlp will be stored into the context1 field of
3365 * the IOCB for the completion callback function to the SCR ELS command.
3366 *
3367 * Return code
3368 *   0 - Successfully issued scr command
3369 *   1 - Failed to issue scr command
3370 **/
3371int
3372lpfc_issue_els_scr(struct lpfc_vport *vport, uint8_t retry)
3373{
3374        int rc = 0;
3375        struct lpfc_hba  *phba = vport->phba;
3376        struct lpfc_iocbq *elsiocb;
3377        uint8_t *pcmd;
3378        uint16_t cmdsize;
3379        struct lpfc_nodelist *ndlp;
3380
3381        cmdsize = (sizeof(uint32_t) + sizeof(SCR));
3382
3383        ndlp = lpfc_findnode_did(vport, Fabric_Cntl_DID);
3384        if (!ndlp) {
3385                ndlp = lpfc_nlp_init(vport, Fabric_Cntl_DID);
3386                if (!ndlp)
3387                        return 1;
3388                lpfc_enqueue_node(vport, ndlp);
3389        }
3390
3391        elsiocb = lpfc_prep_els_iocb(vport, 1, cmdsize, retry, ndlp,
3392                                     ndlp->nlp_DID, ELS_CMD_SCR);
3393        if (!elsiocb)
3394                return 1;
3395
3396        if (phba->sli_rev == LPFC_SLI_REV4) {
3397                rc = lpfc_reg_fab_ctrl_node(vport, ndlp);
3398                if (rc) {
3399                        lpfc_els_free_iocb(phba, elsiocb);
3400                        lpfc_printf_vlog(vport, KERN_ERR, LOG_NODE,
3401                                         "0937 %s: Failed to reg fc node, rc %d\n",
3402                                         __func__, rc);
3403                        return 1;
3404                }
3405        }
3406        pcmd = (uint8_t *) (((struct lpfc_dmabuf *) elsiocb->context2)->virt);
3407
3408        *((uint32_t *) (pcmd)) = ELS_CMD_SCR;
3409        pcmd += sizeof(uint32_t);
3410
3411        /* For SCR, remainder of payload is SCR parameter page */
3412        memset(pcmd, 0, sizeof(SCR));
3413        ((SCR *) pcmd)->Function = SCR_FUNC_FULL;
3414
3415        lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_CMD,
3416                "Issue SCR:       did:x%x",
3417                ndlp->nlp_DID, 0, 0);
3418
3419        phba->fc_stat.elsXmitSCR++;
3420        elsiocb->iocb_cmpl = lpfc_cmpl_els_disc_cmd;
3421        elsiocb->context1 = lpfc_nlp_get(ndlp);
3422        if (!elsiocb->context1) {
3423                lpfc_els_free_iocb(phba, elsiocb);
3424                return 1;
3425        }
3426
3427        lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_CMD,
3428                              "Issue SCR:     did:x%x refcnt %d",
3429                              ndlp->nlp_DID, kref_read(&ndlp->kref), 0);
3430
3431        rc = lpfc_sli_issue_iocb(phba, LPFC_ELS_RING, elsiocb, 0);
3432        if (rc == IOCB_ERROR) {
3433                lpfc_els_free_iocb(phba, elsiocb);
3434                lpfc_nlp_put(ndlp);
3435                return 1;
3436        }
3437
3438        return 0;
3439}
3440
3441/**
3442 * lpfc_issue_els_rscn - Issue an RSCN to the Fabric Controller (Fabric)
3443 *   or the other nport (pt2pt).
3444 * @vport: pointer to a host virtual N_Port data structure.
3445 * @retry: number of retries to the command IOCB.
3446 *
3447 * This routine issues a RSCN to the Fabric Controller (DID 0xFFFFFD)
3448 *  when connected to a fabric, or to the remote port when connected
3449 *  in point-to-point mode. When sent to the Fabric Controller, it will
3450 *  replay the RSCN to registered recipients.
3451 *
3452 * Note that the ndlp reference count will be incremented by 1 for holding the
3453 * ndlp and the reference to ndlp will be stored into the context1 field of
3454 * the IOCB for the completion callback function to the RSCN ELS command.
3455 *
3456 * Return code
3457 *   0 - Successfully issued RSCN command
3458 *   1 - Failed to issue RSCN command
3459 **/
3460int
3461lpfc_issue_els_rscn(struct lpfc_vport *vport, uint8_t retry)
3462{
3463        int rc = 0;
3464        struct lpfc_hba *phba = vport->phba;
3465        struct lpfc_iocbq *elsiocb;
3466        struct lpfc_nodelist *ndlp;
3467        struct {
3468                struct fc_els_rscn rscn;
3469                struct fc_els_rscn_page portid;
3470        } *event;
3471        uint32_t nportid;
3472        uint16_t cmdsize = sizeof(*event);
3473
3474        /* Not supported for private loop */
3475        if (phba->fc_topology == LPFC_TOPOLOGY_LOOP &&
3476            !(vport->fc_flag & FC_PUBLIC_LOOP))
3477                return 1;
3478
3479        if (vport->fc_flag & FC_PT2PT) {
3480                /* find any mapped nport - that would be the other nport */
3481                ndlp = lpfc_findnode_mapped(vport);
3482                if (!ndlp)
3483                        return 1;
3484        } else {
3485                nportid = FC_FID_FCTRL;
3486                /* find the fabric controller node */
3487                ndlp = lpfc_findnode_did(vport, nportid);
3488                if (!ndlp) {
3489                        /* if one didn't exist, make one */
3490                        ndlp = lpfc_nlp_init(vport, nportid);
3491                        if (!ndlp)
3492                                return 1;
3493                        lpfc_enqueue_node(vport, ndlp);
3494                }
3495        }
3496
3497        elsiocb = lpfc_prep_els_iocb(vport, 1, cmdsize, retry, ndlp,
3498                                     ndlp->nlp_DID, ELS_CMD_RSCN_XMT);
3499
3500        if (!elsiocb)
3501                return 1;
3502
3503        event = ((struct lpfc_dmabuf *)elsiocb->context2)->virt;
3504
3505        event->rscn.rscn_cmd = ELS_RSCN;
3506        event->rscn.rscn_page_len = sizeof(struct fc_els_rscn_page);
3507        event->rscn.rscn_plen = cpu_to_be16(cmdsize);
3508
3509        nportid = vport->fc_myDID;
3510        /* appears that page flags must be 0 for fabric to broadcast RSCN */
3511        event->portid.rscn_page_flags = 0;
3512        event->portid.rscn_fid[0] = (nportid & 0x00FF0000) >> 16;
3513        event->portid.rscn_fid[1] = (nportid & 0x0000FF00) >> 8;
3514        event->portid.rscn_fid[2] = nportid & 0x000000FF;
3515
3516        phba->fc_stat.elsXmitRSCN++;
3517        elsiocb->iocb_cmpl = lpfc_cmpl_els_cmd;
3518        elsiocb->context1 = lpfc_nlp_get(ndlp);
3519        if (!elsiocb->context1) {
3520                lpfc_els_free_iocb(phba, elsiocb);
3521                return 1;
3522        }
3523
3524        lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_CMD,
3525                              "Issue RSCN:       did:x%x",
3526                              ndlp->nlp_DID, 0, 0);
3527
3528        rc = lpfc_sli_issue_iocb(phba, LPFC_ELS_RING, elsiocb, 0);
3529        if (rc == IOCB_ERROR) {
3530                lpfc_els_free_iocb(phba, elsiocb);
3531                lpfc_nlp_put(ndlp);
3532                return 1;
3533        }
3534
3535        /* This will cause the callback-function lpfc_cmpl_els_cmd to
3536         * trigger the release of node.
3537         */
3538        if (!(vport->fc_flag & FC_PT2PT))
3539                lpfc_nlp_put(ndlp);
3540        return 0;
3541}
3542
3543/**
3544 * lpfc_issue_els_farpr - Issue a farp to an node on a vport
3545 * @vport: pointer to a host virtual N_Port data structure.
3546 * @nportid: N_Port identifier to the remote node.
3547 * @retry: number of retries to the command IOCB.
3548 *
3549 * This routine issues a Fibre Channel Address Resolution Response
3550 * (FARPR) to a node on a vport. The remote node N_Port identifier (@nportid)
3551 * is passed into the function. It first search the @vport node list to find
3552 * the matching ndlp. If no such ndlp is found, a new ndlp shall be created
3553 * for this (FARPR) purpose. An IOCB is allocated, payload prepared, and the
3554 * lpfc_sli_issue_iocb() routine is invoked to send the FARPR ELS command.
3555 *
3556 * Note that the ndlp reference count will be incremented by 1 for holding the
3557 * ndlp and the reference to ndlp will be stored into the context1 field of
3558 * the IOCB for the completion callback function to the FARPR ELS command.
3559 *
3560 * Return code
3561 *   0 - Successfully issued farpr command
3562 *   1 - Failed to issue farpr command
3563 **/
3564static int
3565lpfc_issue_els_farpr(struct lpfc_vport *vport, uint32_t nportid, uint8_t retry)
3566{
3567        int rc = 0;
3568        struct lpfc_hba  *phba = vport->phba;
3569        struct lpfc_iocbq *elsiocb;
3570        FARP *fp;
3571        uint8_t *pcmd;
3572        uint32_t *lp;
3573        uint16_t cmdsize;
3574        struct lpfc_nodelist *ondlp;
3575        struct lpfc_nodelist *ndlp;
3576
3577        cmdsize = (sizeof(uint32_t) + sizeof(FARP));
3578
3579        ndlp = lpfc_findnode_did(vport, nportid);
3580        if (!ndlp) {
3581                ndlp = lpfc_nlp_init(vport, nportid);
3582                if (!ndlp)
3583                        return 1;
3584                lpfc_enqueue_node(vport, ndlp);
3585        }
3586
3587        elsiocb = lpfc_prep_els_iocb(vport, 1, cmdsize, retry, ndlp,
3588                                     ndlp->nlp_DID, ELS_CMD_RNID);
3589        if (!elsiocb)
3590                return 1;
3591
3592        pcmd = (uint8_t *) (((struct lpfc_dmabuf *) elsiocb->context2)->virt);
3593
3594        *((uint32_t *) (pcmd)) = ELS_CMD_FARPR;
3595        pcmd += sizeof(uint32_t);
3596
3597        /* Fill in FARPR payload */
3598        fp = (FARP *) (pcmd);
3599        memset(fp, 0, sizeof(FARP));
3600        lp = (uint32_t *) pcmd;
3601        *lp++ = be32_to_cpu(nportid);
3602        *lp++ = be32_to_cpu(vport->fc_myDID);
3603        fp->Rflags = 0;
3604        fp->Mflags = (FARP_MATCH_PORT | FARP_MATCH_NODE);
3605
3606        memcpy(&fp->RportName, &vport->fc_portname, sizeof(struct lpfc_name));
3607        memcpy(&fp->RnodeName, &vport->fc_nodename, sizeof(struct lpfc_name));
3608        ondlp = lpfc_findnode_did(vport, nportid);
3609        if (ondlp) {
3610                memcpy(&fp->OportName, &ondlp->nlp_portname,
3611                       sizeof(struct lpfc_name));
3612                memcpy(&fp->OnodeName, &ondlp->nlp_nodename,
3613                       sizeof(struct lpfc_name));
3614        }
3615
3616        lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_CMD,
3617                "Issue FARPR:     did:x%x",
3618                ndlp->nlp_DID, 0, 0);
3619
3620        phba->fc_stat.elsXmitFARPR++;
3621        elsiocb->iocb_cmpl = lpfc_cmpl_els_cmd;
3622        elsiocb->context1 = lpfc_nlp_get(ndlp);
3623        if (!elsiocb->context1) {
3624                lpfc_els_free_iocb(phba, elsiocb);
3625                return 1;
3626        }
3627
3628        rc = lpfc_sli_issue_iocb(phba, LPFC_ELS_RING, elsiocb, 0);
3629        if (rc == IOCB_ERROR) {
3630                /* The additional lpfc_nlp_put will cause the following
3631                 * lpfc_els_free_iocb routine to trigger the release of
3632                 * the node.
3633                 */
3634                lpfc_els_free_iocb(phba, elsiocb);
3635                lpfc_nlp_put(ndlp);
3636                return 1;
3637        }
3638        /* This will cause the callback-function lpfc_cmpl_els_cmd to
3639         * trigger the release of the node.
3640         */
3641        /* Don't release reference count as RDF is likely outstanding */
3642        return 0;
3643}
3644
3645/**
3646 * lpfc_issue_els_rdf - Register for diagnostic functions from the fabric.
3647 * @vport: pointer to a host virtual N_Port data structure.
3648 * @retry: retry counter for the command IOCB.
3649 *
3650 * This routine issues an ELS RDF to the Fabric Controller to register
3651 * for diagnostic functions.
3652 *
3653 * Note that the ndlp reference count will be incremented by 1 for holding the
3654 * ndlp and the reference to ndlp will be stored into the context1 field of
3655 * the IOCB for the completion callback function to the RDF ELS command.
3656 *
3657 * Return code
3658 *   0 - Successfully issued rdf command
3659 *   1 - Failed to issue rdf command
3660 **/
3661int
3662lpfc_issue_els_rdf(struct lpfc_vport *vport, uint8_t retry)
3663{
3664        struct lpfc_hba *phba = vport->phba;
3665        struct lpfc_iocbq *elsiocb;
3666        struct lpfc_els_rdf_req *prdf;
3667        struct lpfc_nodelist *ndlp;
3668        uint16_t cmdsize;
3669        int rc;
3670
3671        cmdsize = sizeof(*prdf);
3672
3673        ndlp = lpfc_findnode_did(vport, Fabric_Cntl_DID);
3674        if (!ndlp) {
3675                ndlp = lpfc_nlp_init(vport, Fabric_Cntl_DID);
3676                if (!ndlp)
3677                        return -ENODEV;
3678                lpfc_enqueue_node(vport, ndlp);
3679        }
3680
3681        /* RDF ELS is not required on an NPIV VN_Port. */
3682        if (vport->port_type == LPFC_NPIV_PORT)
3683                return -EACCES;
3684
3685        elsiocb = lpfc_prep_els_iocb(vport, 1, cmdsize, retry, ndlp,
3686                                     ndlp->nlp_DID, ELS_CMD_RDF);
3687        if (!elsiocb)
3688                return -ENOMEM;
3689
3690        /* Configure the payload for the supported FPIN events. */
3691        prdf = (struct lpfc_els_rdf_req *)
3692                (((struct lpfc_dmabuf *)elsiocb->context2)->virt);
3693        memset(prdf, 0, cmdsize);
3694        prdf->rdf.fpin_cmd = ELS_RDF;
3695        prdf->rdf.desc_len = cpu_to_be32(sizeof(struct lpfc_els_rdf_req) -
3696                                         sizeof(struct fc_els_rdf));
3697        prdf->reg_d1.reg_desc.desc_tag = cpu_to_be32(ELS_DTAG_FPIN_REGISTER);
3698        prdf->reg_d1.reg_desc.desc_len = cpu_to_be32(
3699                                FC_TLV_DESC_LENGTH_FROM_SZ(prdf->reg_d1));
3700        prdf->reg_d1.reg_desc.count = cpu_to_be32(ELS_RDF_REG_TAG_CNT);
3701        prdf->reg_d1.desc_tags[0] = cpu_to_be32(ELS_DTAG_LNK_INTEGRITY);
3702        prdf->reg_d1.desc_tags[1] = cpu_to_be32(ELS_DTAG_DELIVERY);
3703        prdf->reg_d1.desc_tags[2] = cpu_to_be32(ELS_DTAG_PEER_CONGEST);
3704        prdf->reg_d1.desc_tags[3] = cpu_to_be32(ELS_DTAG_CONGESTION);
3705
3706        lpfc_printf_vlog(vport, KERN_INFO, LOG_ELS | LOG_CGN_MGMT,
3707                         "6444 Xmit RDF to remote NPORT x%x Reg: %x %x\n",
3708                         ndlp->nlp_DID, phba->cgn_reg_signal,
3709                         phba->cgn_reg_fpin);
3710
3711        phba->cgn_fpin_frequency = LPFC_FPIN_INIT_FREQ;
3712        elsiocb->iocb_cmpl = lpfc_cmpl_els_disc_cmd;
3713        elsiocb->context1 = lpfc_nlp_get(ndlp);
3714        if (!elsiocb->context1) {
3715                lpfc_els_free_iocb(phba, elsiocb);
3716                return -EIO;
3717        }
3718
3719        lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_CMD,
3720                              "Issue RDF:     did:x%x refcnt %d",
3721                              ndlp->nlp_DID, kref_read(&ndlp->kref), 0);
3722
3723        rc = lpfc_sli_issue_iocb(phba, LPFC_ELS_RING, elsiocb, 0);
3724        if (rc == IOCB_ERROR) {
3725                lpfc_els_free_iocb(phba, elsiocb);
3726                lpfc_nlp_put(ndlp);
3727                return -EIO;
3728        }
3729        return 0;
3730}
3731
3732 /**
3733  * lpfc_els_rcv_rdf - Receive RDF ELS request from the fabric.
3734  * @vport: pointer to a host virtual N_Port data structure.
3735  * @cmdiocb: pointer to lpfc command iocb data structure.
3736  * @ndlp: pointer to a node-list data structure.
3737  *
3738  * A received RDF implies a possible change to fabric supported diagnostic
3739  * functions.  This routine sends LS_ACC and then has the Nx_Port issue a new
3740  * RDF request to reregister for supported diagnostic functions.
3741  *
3742  * Return code
3743  *   0 - Success
3744  *   -EIO - Failed to process received RDF
3745  **/
3746static int
3747lpfc_els_rcv_rdf(struct lpfc_vport *vport, struct lpfc_iocbq *cmdiocb,
3748                 struct lpfc_nodelist *ndlp)
3749{
3750        /* Send LS_ACC */
3751        if (lpfc_els_rsp_acc(vport, ELS_CMD_RDF, cmdiocb, ndlp, NULL)) {
3752                lpfc_printf_vlog(vport, KERN_INFO, LOG_ELS | LOG_CGN_MGMT,
3753                                 "1623 Failed to RDF_ACC from x%x for x%x\n",
3754                                 ndlp->nlp_DID, vport->fc_myDID);
3755                return -EIO;
3756        }
3757
3758        /* Issue new RDF for reregistering */
3759        if (lpfc_issue_els_rdf(vport, 0)) {
3760                lpfc_printf_vlog(vport, KERN_INFO, LOG_ELS | LOG_CGN_MGMT,
3761                                 "2623 Failed to re register RDF for x%x\n",
3762                                 vport->fc_myDID);
3763                return -EIO;
3764        }
3765
3766        return 0;
3767}
3768
3769/**
3770 * lpfc_least_capable_settings - helper function for EDC rsp processing
3771 * @phba: pointer to lpfc hba data structure.
3772 * @pcgd: pointer to congestion detection descriptor in EDC rsp.
3773 *
3774 * This helper routine determines the least capable setting for
3775 * congestion signals, signal freq, including scale, from the
3776 * congestion detection descriptor in the EDC rsp.  The routine
3777 * sets @phba values in preparation for a set_featues mailbox.
3778 **/
3779static void
3780lpfc_least_capable_settings(struct lpfc_hba *phba,
3781                            struct fc_diag_cg_sig_desc *pcgd)
3782{
3783        u32 rsp_sig_cap = 0, drv_sig_cap = 0;
3784        u32 rsp_sig_freq_cyc = 0, rsp_sig_freq_scale = 0;
3785        struct lpfc_cgn_info *cp;
3786        u32 crc;
3787        u16 sig_freq;
3788
3789        /* Get rsp signal and frequency capabilities.  */
3790        rsp_sig_cap = be32_to_cpu(pcgd->xmt_signal_capability);
3791        rsp_sig_freq_cyc = be16_to_cpu(pcgd->xmt_signal_frequency.count);
3792        rsp_sig_freq_scale = be16_to_cpu(pcgd->xmt_signal_frequency.units);
3793
3794        /* If the Fport does not support signals. Set FPIN only */
3795        if (rsp_sig_cap == EDC_CG_SIG_NOTSUPPORTED)
3796                goto out_no_support;
3797
3798        /* Apply the xmt scale to the xmt cycle to get the correct frequency.
3799         * Adapter default is 100 millisSeconds.  Convert all xmt cycle values
3800         * to milliSeconds.
3801         */
3802        switch (rsp_sig_freq_scale) {
3803        case EDC_CG_SIGFREQ_SEC:
3804                rsp_sig_freq_cyc *= MSEC_PER_SEC;
3805                break;
3806        case EDC_CG_SIGFREQ_MSEC:
3807                rsp_sig_freq_cyc = 1;
3808                break;
3809        default:
3810                goto out_no_support;
3811        }
3812
3813        /* Convenient shorthand. */
3814        drv_sig_cap = phba->cgn_reg_signal;
3815
3816        /* Choose the least capable frequency. */
3817        if (rsp_sig_freq_cyc > phba->cgn_sig_freq)
3818                phba->cgn_sig_freq = rsp_sig_freq_cyc;
3819
3820        /* Should be some common signals support. Settle on least capable
3821         * signal and adjust FPIN values. Initialize defaults to ease the
3822         * decision.
3823         */
3824        phba->cgn_reg_fpin = LPFC_CGN_FPIN_WARN | LPFC_CGN_FPIN_ALARM;
3825        phba->cgn_reg_signal = EDC_CG_SIG_NOTSUPPORTED;
3826        if (rsp_sig_cap == EDC_CG_SIG_WARN_ONLY &&
3827            (drv_sig_cap == EDC_CG_SIG_WARN_ONLY ||
3828             drv_sig_cap == EDC_CG_SIG_WARN_ALARM)) {
3829                phba->cgn_reg_signal = EDC_CG_SIG_WARN_ONLY;
3830                phba->cgn_reg_fpin &= ~LPFC_CGN_FPIN_WARN;
3831        }
3832        if (rsp_sig_cap == EDC_CG_SIG_WARN_ALARM) {
3833                if (drv_sig_cap == EDC_CG_SIG_WARN_ALARM) {
3834                        phba->cgn_reg_signal = EDC_CG_SIG_WARN_ALARM;
3835                        phba->cgn_reg_fpin = LPFC_CGN_FPIN_NONE;
3836                }
3837                if (drv_sig_cap == EDC_CG_SIG_WARN_ONLY) {
3838                        phba->cgn_reg_signal = EDC_CG_SIG_WARN_ONLY;
3839                        phba->cgn_reg_fpin &= ~LPFC_CGN_FPIN_WARN;
3840                }
3841        }
3842
3843        if (!phba->cgn_i)
3844                return;
3845
3846        /* Update signal frequency in congestion info buffer */
3847        cp = (struct lpfc_cgn_info *)phba->cgn_i->virt;
3848
3849        /* Frequency (in ms) Signal Warning/Signal Congestion Notifications
3850         * are received by the HBA
3851         */
3852        sig_freq = phba->cgn_sig_freq;
3853
3854        if (phba->cgn_reg_signal == EDC_CG_SIG_WARN_ONLY)
3855                cp->cgn_warn_freq = cpu_to_le16(sig_freq);
3856        if (phba->cgn_reg_signal == EDC_CG_SIG_WARN_ALARM) {
3857                cp->cgn_alarm_freq = cpu_to_le16(sig_freq);
3858                cp->cgn_warn_freq = cpu_to_le16(sig_freq);
3859        }
3860        crc = lpfc_cgn_calc_crc32(cp, LPFC_CGN_INFO_SZ, LPFC_CGN_CRC32_SEED);
3861        cp->cgn_info_crc = cpu_to_le32(crc);
3862        return;
3863
3864out_no_support:
3865        phba->cgn_reg_signal = EDC_CG_SIG_NOTSUPPORTED;
3866        phba->cgn_sig_freq = 0;
3867        phba->cgn_reg_fpin = LPFC_CGN_FPIN_ALARM | LPFC_CGN_FPIN_WARN;
3868}
3869
3870DECLARE_ENUM2STR_LOOKUP(lpfc_get_tlv_dtag_nm, fc_ls_tlv_dtag,
3871                        FC_LS_TLV_DTAG_INIT);
3872
3873/**
3874 * lpfc_cmpl_els_edc - Completion callback function for EDC
3875 * @phba: pointer to lpfc hba data structure.
3876 * @cmdiocb: pointer to lpfc command iocb data structure.
3877 * @rspiocb: pointer to lpfc response iocb data structure.
3878 *
3879 * This routine is the completion callback function for issuing the Exchange
3880 * Diagnostic Capabilities (EDC) command. The driver issues an EDC to
3881 * notify the FPort of its Congestion and Link Fault capabilities.  This
3882 * routine parses the FPort's response and decides on the least common
3883 * values applicable to both FPort and NPort for Warnings and Alarms that
3884 * are communicated via hardware signals.
3885 **/
3886static void
3887lpfc_cmpl_els_edc(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
3888                  struct lpfc_iocbq *rspiocb)
3889{
3890        IOCB_t *irsp;
3891        struct fc_els_edc_resp *edc_rsp;
3892        struct fc_tlv_desc *tlv;
3893        struct fc_diag_cg_sig_desc *pcgd;
3894        struct fc_diag_lnkflt_desc *plnkflt;
3895        struct lpfc_dmabuf *pcmd, *prsp;
3896        const char *dtag_nm;
3897        u32 *pdata, dtag;
3898        int desc_cnt = 0, bytes_remain;
3899        bool rcv_cap_desc = false;
3900        struct lpfc_nodelist *ndlp;
3901
3902        irsp = &rspiocb->iocb;
3903        ndlp = cmdiocb->context1;
3904
3905        lpfc_debugfs_disc_trc(phba->pport, LPFC_DISC_TRC_ELS_CMD,
3906                              "EDC cmpl:    status:x%x/x%x did:x%x",
3907                              irsp->ulpStatus, irsp->un.ulpWord[4],
3908                              irsp->un.elsreq64.remoteID);
3909
3910        /* ELS cmd tag <ulpIoTag> completes */
3911        lpfc_printf_log(phba, KERN_INFO, LOG_ELS | LOG_CGN_MGMT,
3912                        "4201 EDC cmd tag x%x completes Data: x%x x%x x%x\n",
3913                        irsp->ulpIoTag, irsp->ulpStatus,
3914                        irsp->un.ulpWord[4], irsp->ulpTimeout);
3915
3916        pcmd = (struct lpfc_dmabuf *)cmdiocb->context2;
3917        if (!pcmd)
3918                goto out;
3919
3920        pdata = (u32 *)pcmd->virt;
3921        if (!pdata)
3922                goto out;
3923
3924        /* Need to clear signal values, send features MB and RDF with FPIN. */
3925        if (irsp->ulpStatus)
3926                goto out;
3927
3928        prsp = list_get_first(&pcmd->list, struct lpfc_dmabuf, list);
3929        if (!prsp)
3930                goto out;
3931
3932        edc_rsp = prsp->virt;
3933        if (!edc_rsp)
3934                goto out;
3935
3936        /* ELS cmd tag <ulpIoTag> completes */
3937        lpfc_printf_log(phba, KERN_INFO, LOG_ELS | LOG_CGN_MGMT,
3938                        "4676 Fabric EDC Rsp: "
3939                        "0x%02x, 0x%08x\n",
3940                        edc_rsp->acc_hdr.la_cmd,
3941                        be32_to_cpu(edc_rsp->desc_list_len));
3942
3943        /*
3944         * Payload length in bytes is the response descriptor list
3945         * length minus the 12 bytes of Link Service Request
3946         * Information descriptor in the reply.
3947         */
3948        bytes_remain = be32_to_cpu(edc_rsp->desc_list_len) -
3949                                   sizeof(struct fc_els_lsri_desc);
3950        if (bytes_remain <= 0)
3951                goto out;
3952
3953        tlv = edc_rsp->desc;
3954
3955        /*
3956         * cycle through EDC diagnostic descriptors to find the
3957         * congestion signaling capability descriptor
3958         */
3959        while (bytes_remain) {
3960                if (bytes_remain < FC_TLV_DESC_HDR_SZ) {
3961                        lpfc_printf_log(phba, KERN_WARNING, LOG_CGN_MGMT,
3962                                        "6461 Truncated TLV hdr on "
3963                                        "Diagnostic descriptor[%d]\n",
3964                                        desc_cnt);
3965                        goto out;
3966                }
3967
3968                dtag = be32_to_cpu(tlv->desc_tag);
3969                switch (dtag) {
3970                case ELS_DTAG_LNK_FAULT_CAP:
3971                        if (bytes_remain < FC_TLV_DESC_SZ_FROM_LENGTH(tlv) ||
3972                            FC_TLV_DESC_SZ_FROM_LENGTH(tlv) !=
3973                                        sizeof(struct fc_diag_lnkflt_desc)) {
3974                                lpfc_printf_log(
3975                                        phba, KERN_WARNING, LOG_CGN_MGMT,
3976                                        "6462 Truncated Link Fault Diagnostic "
3977                                        "descriptor[%d]: %d vs 0x%zx 0x%zx\n",
3978                                        desc_cnt, bytes_remain,
3979                                        FC_TLV_DESC_SZ_FROM_LENGTH(tlv),
3980                                        sizeof(struct fc_diag_cg_sig_desc));
3981                                goto out;
3982                        }
3983                        plnkflt = (struct fc_diag_lnkflt_desc *)tlv;
3984                        lpfc_printf_log(
3985                                phba, KERN_INFO, LOG_ELS | LOG_CGN_MGMT,
3986                                "4617 Link Fault Desc Data: 0x%08x 0x%08x "
3987                                "0x%08x 0x%08x 0x%08x\n",
3988                                be32_to_cpu(plnkflt->desc_tag),
3989                                be32_to_cpu(plnkflt->desc_len),
3990                                be32_to_cpu(
3991                                        plnkflt->degrade_activate_threshold),
3992                                be32_to_cpu(
3993                                        plnkflt->degrade_deactivate_threshold),
3994                                be32_to_cpu(plnkflt->fec_degrade_interval));
3995                        break;
3996                case ELS_DTAG_CG_SIGNAL_CAP:
3997                        if (bytes_remain < FC_TLV_DESC_SZ_FROM_LENGTH(tlv) ||
3998                            FC_TLV_DESC_SZ_FROM_LENGTH(tlv) !=
3999                                        sizeof(struct fc_diag_cg_sig_desc)) {
4000                                lpfc_printf_log(
4001                                        phba, KERN_WARNING, LOG_CGN_MGMT,
4002                                        "6463 Truncated Cgn Signal Diagnostic "
4003                                        "descriptor[%d]: %d vs 0x%zx 0x%zx\n",
4004                                        desc_cnt, bytes_remain,
4005                                        FC_TLV_DESC_SZ_FROM_LENGTH(tlv),
4006                                        sizeof(struct fc_diag_cg_sig_desc));
4007                                goto out;
4008                        }
4009
4010                        pcgd = (struct fc_diag_cg_sig_desc *)tlv;
4011                        lpfc_printf_log(
4012                                phba, KERN_INFO, LOG_ELS | LOG_CGN_MGMT,
4013                                "4616 CGN Desc Data: 0x%08x 0x%08x "
4014                                "0x%08x 0x%04x 0x%04x 0x%08x 0x%04x 0x%04x\n",
4015                                be32_to_cpu(pcgd->desc_tag),
4016                                be32_to_cpu(pcgd->desc_len),
4017                                be32_to_cpu(pcgd->xmt_signal_capability),
4018                                be16_to_cpu(pcgd->xmt_signal_frequency.count),
4019                                be16_to_cpu(pcgd->xmt_signal_frequency.units),
4020                                be32_to_cpu(pcgd->rcv_signal_capability),
4021                                be16_to_cpu(pcgd->rcv_signal_frequency.count),
4022                                be16_to_cpu(pcgd->rcv_signal_frequency.units));
4023
4024                        /* Compare driver and Fport capabilities and choose
4025                         * least common.
4026                         */
4027                        lpfc_least_capable_settings(phba, pcgd);
4028                        rcv_cap_desc = true;
4029                        break;
4030                default:
4031                        dtag_nm = lpfc_get_tlv_dtag_nm(dtag);
4032                        lpfc_printf_log(phba, KERN_WARNING, LOG_CGN_MGMT,
4033                                        "4919 unknown Diagnostic "
4034                                        "Descriptor[%d]: tag x%x (%s)\n",
4035                                        desc_cnt, dtag, dtag_nm);
4036                }
4037
4038                bytes_remain -= FC_TLV_DESC_SZ_FROM_LENGTH(tlv);
4039                tlv = fc_tlv_next_desc(tlv);
4040                desc_cnt++;
4041        }
4042
4043out:
4044        if (!rcv_cap_desc) {
4045                phba->cgn_reg_fpin = LPFC_CGN_FPIN_ALARM | LPFC_CGN_FPIN_WARN;
4046                phba->cgn_reg_signal = EDC_CG_SIG_NOTSUPPORTED;
4047                phba->cgn_sig_freq = 0;
4048                lpfc_printf_log(phba, KERN_WARNING, LOG_ELS | LOG_CGN_MGMT,
4049                                "4202 EDC rsp error - sending RDF "
4050                                "for FPIN only.\n");
4051        }
4052
4053        lpfc_config_cgn_signal(phba);
4054
4055        /* Check to see if link went down during discovery */
4056        lpfc_els_chk_latt(phba->pport);
4057        lpfc_debugfs_disc_trc(phba->pport, LPFC_DISC_TRC_ELS_CMD,
4058                              "EDC Cmpl:     did:x%x refcnt %d",
4059                              ndlp->nlp_DID, kref_read(&ndlp->kref), 0);
4060        lpfc_els_free_iocb(phba, cmdiocb);
4061        lpfc_nlp_put(ndlp);
4062}
4063
4064static void
4065lpfc_format_edc_cgn_desc(struct lpfc_hba *phba, struct fc_diag_cg_sig_desc *cgd)
4066{
4067        /* We are assuming cgd was zero'ed before calling this routine */
4068
4069        /* Configure the congestion detection capability */
4070        cgd->desc_tag = cpu_to_be32(ELS_DTAG_CG_SIGNAL_CAP);
4071
4072        /* Descriptor len doesn't include the tag or len fields. */
4073        cgd->desc_len = cpu_to_be32(
4074                FC_TLV_DESC_LENGTH_FROM_SZ(struct fc_diag_cg_sig_desc));
4075
4076        /* xmt_signal_capability already set to EDC_CG_SIG_NOTSUPPORTED.
4077         * xmt_signal_frequency.count already set to 0.
4078         * xmt_signal_frequency.units already set to 0.
4079         */
4080
4081        if (phba->cmf_active_mode == LPFC_CFG_OFF) {
4082                /* rcv_signal_capability already set to EDC_CG_SIG_NOTSUPPORTED.
4083                 * rcv_signal_frequency.count already set to 0.
4084                 * rcv_signal_frequency.units already set to 0.
4085                 */
4086                phba->cgn_sig_freq = 0;
4087                return;
4088        }
4089        switch (phba->cgn_reg_signal) {
4090        case EDC_CG_SIG_WARN_ONLY:
4091                cgd->rcv_signal_capability = cpu_to_be32(EDC_CG_SIG_WARN_ONLY);
4092                break;
4093        case EDC_CG_SIG_WARN_ALARM:
4094                cgd->rcv_signal_capability = cpu_to_be32(EDC_CG_SIG_WARN_ALARM);
4095                break;
4096        default:
4097                /* rcv_signal_capability left 0 thus no support */
4098                break;
4099        }
4100
4101        /* We start negotiation with lpfc_fabric_cgn_frequency, after
4102         * the completion we settle on the higher frequency.
4103         */
4104        cgd->rcv_signal_frequency.count =
4105                cpu_to_be16(lpfc_fabric_cgn_frequency);
4106        cgd->rcv_signal_frequency.units =
4107                cpu_to_be16(EDC_CG_SIGFREQ_MSEC);
4108}
4109
4110 /**
4111  * lpfc_issue_els_edc - Exchange Diagnostic Capabilities with the fabric.
4112  * @vport: pointer to a host virtual N_Port data structure.
4113  * @retry: retry counter for the command iocb.
4114  *
4115  * This routine issues an ELS EDC to the F-Port Controller to communicate
4116  * this N_Port's support of hardware signals in its Congestion
4117  * Capabilities Descriptor.
4118  *
4119  * Note: This routine does not check if one or more signals are
4120  * set in the cgn_reg_signal parameter.  The caller makes the
4121  * decision to enforce cgn_reg_signal as nonzero or zero depending
4122  * on the conditions.  During Fabric requests, the driver
4123  * requires cgn_reg_signals to be nonzero.  But a dynamic request
4124  * to set the congestion mode to OFF from Monitor or Manage
4125  * would correctly issue an EDC with no signals enabled to
4126  * turn off switch functionality and then update the FW.
4127  *
4128  * Return code
4129  *   0 - Successfully issued edc command
4130  *   1 - Failed to issue edc command
4131  **/
4132int
4133lpfc_issue_els_edc(struct lpfc_vport *vport, uint8_t retry)
4134{
4135        struct lpfc_hba  *phba = vport->phba;
4136        struct lpfc_iocbq *elsiocb;
4137        struct lpfc_els_edc_req *edc_req;
4138        struct fc_diag_cg_sig_desc *cgn_desc;
4139        u16 cmdsize;
4140        struct lpfc_nodelist *ndlp;
4141        u8 *pcmd = NULL;
4142        u32 edc_req_size, cgn_desc_size;
4143        int rc;
4144
4145        if (vport->port_type == LPFC_NPIV_PORT)
4146                return -EACCES;
4147
4148        ndlp = lpfc_findnode_did(vport, Fabric_DID);
4149        if (!ndlp || ndlp->nlp_state != NLP_STE_UNMAPPED_NODE)
4150                return -ENODEV;
4151
4152        /* If HBA doesn't support signals, drop into RDF */
4153        if (!phba->cgn_init_reg_signal)
4154                goto try_rdf;
4155
4156        edc_req_size = sizeof(struct fc_els_edc);
4157        cgn_desc_size = sizeof(struct fc_diag_cg_sig_desc);
4158        cmdsize = edc_req_size + cgn_desc_size;
4159        elsiocb = lpfc_prep_els_iocb(vport, 1, cmdsize, retry, ndlp,
4160                                     ndlp->nlp_DID, ELS_CMD_EDC);
4161        if (!elsiocb)
4162                goto try_rdf;
4163
4164        /* Configure the payload for the supported Diagnostics capabilities. */
4165        pcmd = (u8 *)(((struct lpfc_dmabuf *)elsiocb->context2)->virt);
4166        memset(pcmd, 0, cmdsize);
4167        edc_req = (struct lpfc_els_edc_req *)pcmd;
4168        edc_req->edc.desc_len = cpu_to_be32(cgn_desc_size);
4169        edc_req->edc.edc_cmd = ELS_EDC;
4170
4171        cgn_desc = &edc_req->cgn_desc;
4172
4173        lpfc_format_edc_cgn_desc(phba, cgn_desc);
4174
4175        phba->cgn_sig_freq = lpfc_fabric_cgn_frequency;
4176
4177        lpfc_printf_vlog(vport, KERN_INFO, LOG_CGN_MGMT,
4178                         "4623 Xmit EDC to remote "
4179                         "NPORT x%x reg_sig x%x reg_fpin:x%x\n",
4180                         ndlp->nlp_DID, phba->cgn_reg_signal,
4181                         phba->cgn_reg_fpin);
4182
4183        elsiocb->iocb_cmpl = lpfc_cmpl_els_disc_cmd;
4184        elsiocb->context1 = lpfc_nlp_get(ndlp);
4185        if (!elsiocb->context1) {
4186                lpfc_els_free_iocb(phba, elsiocb);
4187                return -EIO;
4188        }
4189
4190        lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_CMD,
4191                              "Issue EDC:     did:x%x refcnt %d",
4192                              ndlp->nlp_DID, kref_read(&ndlp->kref), 0);
4193        rc = lpfc_sli_issue_iocb(phba, LPFC_ELS_RING, elsiocb, 0);
4194        if (rc == IOCB_ERROR) {
4195                /* The additional lpfc_nlp_put will cause the following
4196                 * lpfc_els_free_iocb routine to trigger the rlease of
4197                 * the node.
4198                 */
4199                lpfc_els_free_iocb(phba, elsiocb);
4200                lpfc_nlp_put(ndlp);
4201                goto try_rdf;
4202        }
4203        return 0;
4204try_rdf:
4205        phba->cgn_reg_fpin = LPFC_CGN_FPIN_WARN | LPFC_CGN_FPIN_ALARM;
4206        phba->cgn_reg_signal = EDC_CG_SIG_NOTSUPPORTED;
4207        rc = lpfc_issue_els_rdf(vport, 0);
4208        return rc;
4209}
4210
4211/**
4212 * lpfc_cancel_retry_delay_tmo - Cancel the timer with delayed iocb-cmd retry
4213 * @vport: pointer to a host virtual N_Port data structure.
4214 * @nlp: pointer to a node-list data structure.
4215 *
4216 * This routine cancels the timer with a delayed IOCB-command retry for
4217 * a @vport's @ndlp. It stops the timer for the delayed function retrial and
4218 * removes the ELS retry event if it presents. In addition, if the
4219 * NLP_NPR_2B_DISC bit is set in the @nlp's nlp_flag bitmap, ADISC IOCB
4220 * commands are sent for the @vport's nodes that require issuing discovery
4221 * ADISC.
4222 **/
4223void
4224lpfc_cancel_retry_delay_tmo(struct lpfc_vport *vport, struct lpfc_nodelist *nlp)
4225{
4226        struct Scsi_Host *shost = lpfc_shost_from_vport(vport);
4227        struct lpfc_work_evt *evtp;
4228
4229        if (!(nlp->nlp_flag & NLP_DELAY_TMO))
4230                return;
4231        spin_lock_irq(&nlp->lock);
4232        nlp->nlp_flag &= ~NLP_DELAY_TMO;
4233        spin_unlock_irq(&nlp->lock);
4234        del_timer_sync(&nlp->nlp_delayfunc);
4235        nlp->nlp_last_elscmd = 0;
4236        if (!list_empty(&nlp->els_retry_evt.evt_listp)) {
4237                list_del_init(&nlp->els_retry_evt.evt_listp);
4238                /* Decrement nlp reference count held for the delayed retry */
4239                evtp = &nlp->els_retry_evt;
4240                lpfc_nlp_put((struct lpfc_nodelist *)evtp->evt_arg1);
4241        }
4242        if (nlp->nlp_flag & NLP_NPR_2B_DISC) {
4243                spin_lock_irq(&nlp->lock);
4244                nlp->nlp_flag &= ~NLP_NPR_2B_DISC;
4245                spin_unlock_irq(&nlp->lock);
4246                if (vport->num_disc_nodes) {
4247                        if (vport->port_state < LPFC_VPORT_READY) {
4248                                /* Check if there are more ADISCs to be sent */
4249                                lpfc_more_adisc(vport);
4250                        } else {
4251                                /* Check if there are more PLOGIs to be sent */
4252                                lpfc_more_plogi(vport);
4253                                if (vport->num_disc_nodes == 0) {
4254                                        spin_lock_irq(shost->host_lock);
4255                                        vport->fc_flag &= ~FC_NDISC_ACTIVE;
4256                                        spin_unlock_irq(shost->host_lock);
4257                                        lpfc_can_disctmo(vport);
4258                                        lpfc_end_rscn(vport);
4259                                }
4260                        }
4261                }
4262        }
4263        return;
4264}
4265
4266/**
4267 * lpfc_els_retry_delay - Timer function with a ndlp delayed function timer
4268 * @t: pointer to the timer function associated data (ndlp).
4269 *
4270 * This routine is invoked by the ndlp delayed-function timer to check
4271 * whether there is any pending ELS retry event(s) with the node. If not, it
4272 * simply returns. Otherwise, if there is at least one ELS delayed event, it
4273 * adds the delayed events to the HBA work list and invokes the
4274 * lpfc_worker_wake_up() routine to wake up worker thread to process the
4275 * event. Note that lpfc_nlp_get() is called before posting the event to
4276 * the work list to hold reference count of ndlp so that it guarantees the
4277 * reference to ndlp will still be available when the worker thread gets
4278 * to the event associated with the ndlp.
4279 **/
4280void
4281lpfc_els_retry_delay(struct timer_list *t)
4282{
4283        struct lpfc_nodelist *ndlp = from_timer(ndlp, t, nlp_delayfunc);
4284        struct lpfc_vport *vport = ndlp->vport;
4285        struct lpfc_hba   *phba = vport->phba;
4286        unsigned long flags;
4287        struct lpfc_work_evt  *evtp = &ndlp->els_retry_evt;
4288
4289        spin_lock_irqsave(&phba->hbalock, flags);
4290        if (!list_empty(&evtp->evt_listp)) {
4291                spin_unlock_irqrestore(&phba->hbalock, flags);
4292                return;
4293        }
4294
4295        /* We need to hold the node by incrementing the reference
4296         * count until the queued work is done
4297         */
4298        evtp->evt_arg1  = lpfc_nlp_get(ndlp);
4299        if (evtp->evt_arg1) {
4300                evtp->evt = LPFC_EVT_ELS_RETRY;
4301                list_add_tail(&evtp->evt_listp, &phba->work_list);
4302                lpfc_worker_wake_up(phba);
4303        }
4304        spin_unlock_irqrestore(&phba->hbalock, flags);
4305        return;
4306}
4307
4308/**
4309 * lpfc_els_retry_delay_handler - Work thread handler for ndlp delayed function
4310 * @ndlp: pointer to a node-list data structure.
4311 *
4312 * This routine is the worker-thread handler for processing the @ndlp delayed
4313 * event(s), posted by the lpfc_els_retry_delay() routine. It simply retrieves
4314 * the last ELS command from the associated ndlp and invokes the proper ELS
4315 * function according to the delayed ELS command to retry the command.
4316 **/
4317void
4318lpfc_els_retry_delay_handler(struct lpfc_nodelist *ndlp)
4319{
4320        struct lpfc_vport *vport = ndlp->vport;
4321        uint32_t cmd, retry;
4322
4323        spin_lock_irq(&ndlp->lock);
4324        cmd = ndlp->nlp_last_elscmd;
4325        ndlp->nlp_last_elscmd = 0;
4326
4327        if (!(ndlp->nlp_flag & NLP_DELAY_TMO)) {
4328                spin_unlock_irq(&ndlp->lock);
4329                return;
4330        }
4331
4332        ndlp->nlp_flag &= ~NLP_DELAY_TMO;
4333        spin_unlock_irq(&ndlp->lock);
4334        /*
4335         * If a discovery event readded nlp_delayfunc after timer
4336         * firing and before processing the timer, cancel the
4337         * nlp_delayfunc.
4338         */
4339        del_timer_sync(&ndlp->nlp_delayfunc);
4340        retry = ndlp->nlp_retry;
4341        ndlp->nlp_retry = 0;
4342
4343        switch (cmd) {
4344        case ELS_CMD_FLOGI:
4345                lpfc_issue_els_flogi(vport, ndlp, retry);
4346                break;
4347        case ELS_CMD_PLOGI:
4348                if (!lpfc_issue_els_plogi(vport, ndlp->nlp_DID, retry)) {
4349                        ndlp->nlp_prev_state = ndlp->nlp_state;
4350                        lpfc_nlp_set_state(vport, ndlp, NLP_STE_PLOGI_ISSUE);
4351                }
4352                break;
4353        case ELS_CMD_ADISC:
4354                if (!lpfc_issue_els_adisc(vport, ndlp, retry)) {
4355                        ndlp->nlp_prev_state = ndlp->nlp_state;
4356                        lpfc_nlp_set_state(vport, ndlp, NLP_STE_ADISC_ISSUE);
4357                }
4358                break;
4359        case ELS_CMD_PRLI:
4360        case ELS_CMD_NVMEPRLI:
4361                if (!lpfc_issue_els_prli(vport, ndlp, retry)) {
4362                        ndlp->nlp_prev_state = ndlp->nlp_state;
4363                        lpfc_nlp_set_state(vport, ndlp, NLP_STE_PRLI_ISSUE);
4364                }
4365                break;
4366        case ELS_CMD_LOGO:
4367                if (!lpfc_issue_els_logo(vport, ndlp, retry)) {
4368                        ndlp->nlp_prev_state = ndlp->nlp_state;
4369                        lpfc_nlp_set_state(vport, ndlp, NLP_STE_LOGO_ISSUE);
4370                }
4371                break;
4372        case ELS_CMD_FDISC:
4373                if (!(vport->fc_flag & FC_VPORT_NEEDS_INIT_VPI))
4374                        lpfc_issue_els_fdisc(vport, ndlp, retry);
4375                break;
4376        }
4377        return;
4378}
4379
4380/**
4381 * lpfc_link_reset - Issue link reset
4382 * @vport: pointer to a virtual N_Port data structure.
4383 *
4384 * This routine performs link reset by sending INIT_LINK mailbox command.
4385 * For SLI-3 adapter, link attention interrupt is enabled before issuing
4386 * INIT_LINK mailbox command.
4387 *
4388 * Return code
4389 *   0 - Link reset initiated successfully
4390 *   1 - Failed to initiate link reset
4391 **/
4392int
4393lpfc_link_reset(struct lpfc_vport *vport)
4394{
4395        struct lpfc_hba *phba = vport->phba;
4396        LPFC_MBOXQ_t *mbox;
4397        uint32_t control;
4398        int rc;
4399
4400        lpfc_printf_vlog(vport, KERN_ERR, LOG_ELS,
4401                         "2851 Attempt link reset\n");
4402        mbox = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL);
4403        if (!mbox) {
4404                lpfc_printf_log(phba, KERN_ERR, LOG_TRACE_EVENT,
4405                                "2852 Failed to allocate mbox memory");
4406                return 1;
4407        }
4408
4409        /* Enable Link attention interrupts */
4410        if (phba->sli_rev <= LPFC_SLI_REV3) {
4411                spin_lock_irq(&phba->hbalock);
4412                phba->sli.sli_flag |= LPFC_PROCESS_LA;
4413                control = readl(phba->HCregaddr);
4414                control |= HC_LAINT_ENA;
4415                writel(control, phba->HCregaddr);
4416                readl(phba->HCregaddr); /* flush */
4417                spin_unlock_irq(&phba->hbalock);
4418        }
4419
4420        lpfc_init_link(phba, mbox, phba->cfg_topology,
4421                       phba->cfg_link_speed);
4422        mbox->mbox_cmpl = lpfc_sli_def_mbox_cmpl;
4423        mbox->vport = vport;
4424        rc = lpfc_sli_issue_mbox(phba, mbox, MBX_NOWAIT);
4425        if ((rc != MBX_BUSY) && (rc != MBX_SUCCESS)) {
4426                lpfc_printf_log(phba, KERN_ERR, LOG_TRACE_EVENT,
4427                                "2853 Failed to issue INIT_LINK "
4428                                "mbox command, rc:x%x\n", rc);
4429                mempool_free(mbox, phba->mbox_mem_pool);
4430                return 1;
4431        }
4432
4433        return 0;
4434}
4435
4436/**
4437 * lpfc_els_retry - Make retry decision on an els command iocb
4438 * @phba: pointer to lpfc hba data structure.
4439 * @cmdiocb: pointer to lpfc command iocb data structure.
4440 * @rspiocb: pointer to lpfc response iocb data structure.
4441 *
4442 * This routine makes a retry decision on an ELS command IOCB, which has
4443 * failed. The following ELS IOCBs use this function for retrying the command
4444 * when previously issued command responsed with error status: FLOGI, PLOGI,
4445 * PRLI, ADISC and FDISC. Based on the ELS command type and the
4446 * returned error status, it makes the decision whether a retry shall be
4447 * issued for the command, and whether a retry shall be made immediately or
4448 * delayed. In the former case, the corresponding ELS command issuing-function
4449 * is called to retry the command. In the later case, the ELS command shall
4450 * be posted to the ndlp delayed event and delayed function timer set to the
4451 * ndlp for the delayed command issusing.
4452 *
4453 * Return code
4454 *   0 - No retry of els command is made
4455 *   1 - Immediate or delayed retry of els command is made
4456 **/
4457static int
4458lpfc_els_retry(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
4459               struct lpfc_iocbq *rspiocb)
4460{
4461        struct lpfc_vport *vport = cmdiocb->vport;
4462        IOCB_t *irsp = &rspiocb->iocb;
4463        struct lpfc_nodelist *ndlp = (struct lpfc_nodelist *) cmdiocb->context1;
4464        struct lpfc_dmabuf *pcmd = (struct lpfc_dmabuf *) cmdiocb->context2;
4465        uint32_t *elscmd;
4466        struct ls_rjt stat;
4467        int retry = 0, maxretry = lpfc_max_els_tries, delay = 0;
4468        int logerr = 0;
4469        uint32_t cmd = 0;
4470        uint32_t did;
4471        int link_reset = 0, rc;
4472
4473
4474        /* Note: context2 may be 0 for internal driver abort
4475         * of delays ELS command.
4476         */
4477
4478        if (pcmd && pcmd->virt) {
4479                elscmd = (uint32_t *) (pcmd->virt);
4480                cmd = *elscmd++;
4481        }
4482
4483        if (ndlp)
4484                did = ndlp->nlp_DID;
4485        else {
4486                /* We should only hit this case for retrying PLOGI */
4487                did = irsp->un.elsreq64.remoteID;
4488                ndlp = lpfc_findnode_did(vport, did);
4489                if (!ndlp && (cmd != ELS_CMD_PLOGI))
4490                        return 0;
4491        }
4492
4493        lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_CMD,
4494                "Retry ELS:       wd7:x%x wd4:x%x did:x%x",
4495                *(((uint32_t *)irsp) + 7), irsp->un.ulpWord[4], did);
4496
4497        switch (irsp->ulpStatus) {
4498        case IOSTAT_FCP_RSP_ERROR:
4499                break;
4500        case IOSTAT_REMOTE_STOP:
4501                if (phba->sli_rev == LPFC_SLI_REV4) {
4502                        /* This IO was aborted by the target, we don't
4503                         * know the rxid and because we did not send the
4504                         * ABTS we cannot generate and RRQ.
4505                         */
4506                        lpfc_set_rrq_active(phba, ndlp,
4507                                         cmdiocb->sli4_lxritag, 0, 0);
4508                }
4509                break;
4510        case IOSTAT_LOCAL_REJECT:
4511                switch ((irsp->un.ulpWord[4] & IOERR_PARAM_MASK)) {
4512                case IOERR_LOOP_OPEN_FAILURE:
4513                        if (cmd == ELS_CMD_FLOGI) {
4514                                if (PCI_DEVICE_ID_HORNET ==
4515                                        phba->pcidev->device) {
4516                                        phba->fc_topology = LPFC_TOPOLOGY_LOOP;
4517                                        phba->pport->fc_myDID = 0;
4518                                        phba->alpa_map[0] = 0;
4519                                        phba->alpa_map[1] = 0;
4520                                }
4521                        }
4522                        if (cmd == ELS_CMD_PLOGI && cmdiocb->retry == 0)
4523                                delay = 1000;
4524                        retry = 1;
4525                        break;
4526
4527                case IOERR_ILLEGAL_COMMAND:
4528                        lpfc_printf_vlog(vport, KERN_ERR, LOG_TRACE_EVENT,
4529                                         "0124 Retry illegal cmd x%x "
4530                                         "retry:x%x delay:x%x\n",
4531                                         cmd, cmdiocb->retry, delay);
4532                        retry = 1;
4533                        /* All command's retry policy */
4534                        maxretry = 8;
4535                        if (cmdiocb->retry > 2)
4536                                delay = 1000;
4537                        break;
4538
4539                case IOERR_NO_RESOURCES:
4540                        logerr = 1; /* HBA out of resources */
4541                        retry = 1;
4542                        if (cmdiocb->retry > 100)
4543                                delay = 100;
4544                        maxretry = 250;
4545                        break;
4546
4547                case IOERR_ILLEGAL_FRAME:
4548                        delay = 100;
4549                        retry = 1;
4550                        break;
4551
4552                case IOERR_INVALID_RPI:
4553                        if (cmd == ELS_CMD_PLOGI &&
4554                            did == NameServer_DID) {
4555                                /* Continue forever if plogi to */
4556                                /* the nameserver fails */
4557                                maxretry = 0;
4558                                delay = 100;
4559                        }
4560                        retry = 1;
4561                        break;
4562
4563                case IOERR_SEQUENCE_TIMEOUT:
4564                        if (cmd == ELS_CMD_PLOGI &&
4565                            did == NameServer_DID &&
4566                            (cmdiocb->retry + 1) == maxretry) {
4567                                /* Reset the Link */
4568                                link_reset = 1;
4569                                break;
4570                        }
4571                        retry = 1;
4572                        delay = 100;
4573                        break;
4574                }
4575                break;
4576
4577        case IOSTAT_NPORT_RJT:
4578        case IOSTAT_FABRIC_RJT:
4579                if (irsp->un.ulpWord[4] & RJT_UNAVAIL_TEMP) {
4580                        retry = 1;
4581                        break;
4582                }
4583                break;
4584
4585        case IOSTAT_NPORT_BSY:
4586        case IOSTAT_FABRIC_BSY:
4587                logerr = 1; /* Fabric / Remote NPort out of resources */
4588                retry = 1;
4589                break;
4590
4591        case IOSTAT_LS_RJT:
4592                stat.un.lsRjtError = be32_to_cpu(irsp->un.ulpWord[4]);
4593                /* Added for Vendor specifc support
4594                 * Just keep retrying for these Rsn / Exp codes
4595                 */
4596                switch (stat.un.b.lsRjtRsnCode) {
4597                case LSRJT_UNABLE_TPC:
4598                        /* The driver has a VALID PLOGI but the rport has
4599                         * rejected the PRLI - can't do it now.  Delay
4600                         * for 1 second and try again.
4601                         *
4602                         * However, if explanation is REQ_UNSUPPORTED there's
4603                         * no point to retry PRLI.
4604                         */
4605                        if ((cmd == ELS_CMD_PRLI || cmd == ELS_CMD_NVMEPRLI) &&
4606                            stat.un.b.lsRjtRsnCodeExp !=
4607                            LSEXP_REQ_UNSUPPORTED) {
4608                                delay = 1000;
4609                                maxretry = lpfc_max_els_tries + 1;
4610                                retry = 1;
4611                                break;
4612                        }
4613
4614                        /* Legacy bug fix code for targets with PLOGI delays. */
4615                        if (stat.un.b.lsRjtRsnCodeExp ==
4616                            LSEXP_CMD_IN_PROGRESS) {
4617                                if (cmd == ELS_CMD_PLOGI) {
4618                                        delay = 1000;
4619                                        maxretry = 48;
4620                                }
4621                                retry = 1;
4622                                break;
4623                        }
4624                        if (stat.un.b.lsRjtRsnCodeExp ==
4625                            LSEXP_CANT_GIVE_DATA) {
4626                                if (cmd == ELS_CMD_PLOGI) {
4627                                        delay = 1000;
4628                                        maxretry = 48;
4629                                }
4630                                retry = 1;
4631                                break;
4632                        }
4633                        if (cmd == ELS_CMD_PLOGI) {
4634                                delay = 1000;
4635                                maxretry = lpfc_max_els_tries + 1;
4636                                retry = 1;
4637                                break;
4638                        }
4639                        if ((phba->sli3_options & LPFC_SLI3_NPIV_ENABLED) &&
4640                          (cmd == ELS_CMD_FDISC) &&
4641                          (stat.un.b.lsRjtRsnCodeExp == LSEXP_OUT_OF_RESOURCE)){
4642                                lpfc_printf_vlog(vport, KERN_ERR,
4643                                                 LOG_TRACE_EVENT,
4644                                                 "0125 FDISC Failed (x%x). "
4645                                                 "Fabric out of resources\n",
4646                                                 stat.un.lsRjtError);
4647                                lpfc_vport_set_state(vport,
4648                                                     FC_VPORT_NO_FABRIC_RSCS);
4649                        }
4650                        break;
4651
4652                case LSRJT_LOGICAL_BSY:
4653                        if ((cmd == ELS_CMD_PLOGI) ||
4654                            (cmd == ELS_CMD_PRLI) ||
4655                            (cmd == ELS_CMD_NVMEPRLI)) {
4656                                delay = 1000;
4657                                maxretry = 48;
4658                        } else if (cmd == ELS_CMD_FDISC) {
4659                                /* FDISC retry policy */
4660                                maxretry = 48;
4661                                if (cmdiocb->retry >= 32)
4662                                        delay = 1000;
4663                        }
4664                        retry = 1;
4665                        break;
4666
4667                case LSRJT_LOGICAL_ERR:
4668                        /* There are some cases where switches return this
4669                         * error when they are not ready and should be returning
4670                         * Logical Busy. We should delay every time.
4671                         */
4672                        if (cmd == ELS_CMD_FDISC &&
4673                            stat.un.b.lsRjtRsnCodeExp == LSEXP_PORT_LOGIN_REQ) {
4674                                maxretry = 3;
4675                                delay = 1000;
4676                                retry = 1;
4677                        } else if (cmd == ELS_CMD_FLOGI &&
4678                                   stat.un.b.lsRjtRsnCodeExp ==
4679                                                LSEXP_NOTHING_MORE) {
4680                                vport->fc_sparam.cmn.bbRcvSizeMsb &= 0xf;
4681                                retry = 1;
4682                                lpfc_printf_vlog(vport, KERN_ERR,
4683                                                 LOG_TRACE_EVENT,
4684                                                 "0820 FLOGI Failed (x%x). "
4685                                                 "BBCredit Not Supported\n",
4686                                                 stat.un.lsRjtError);
4687                        }
4688                        break;
4689
4690                case LSRJT_PROTOCOL_ERR:
4691                        if ((phba->sli3_options & LPFC_SLI3_NPIV_ENABLED) &&
4692                          (cmd == ELS_CMD_FDISC) &&
4693                          ((stat.un.b.lsRjtRsnCodeExp == LSEXP_INVALID_PNAME) ||
4694                          (stat.un.b.lsRjtRsnCodeExp == LSEXP_INVALID_NPORT_ID))
4695                          ) {
4696                                lpfc_printf_vlog(vport, KERN_ERR,
4697                                                 LOG_TRACE_EVENT,
4698                                                 "0122 FDISC Failed (x%x). "
4699                                                 "Fabric Detected Bad WWN\n",
4700                                                 stat.un.lsRjtError);
4701                                lpfc_vport_set_state(vport,
4702                                                     FC_VPORT_FABRIC_REJ_WWN);
4703                        }
4704                        break;
4705                case LSRJT_VENDOR_UNIQUE:
4706                        if ((stat.un.b.vendorUnique == 0x45) &&
4707                            (cmd == ELS_CMD_FLOGI)) {
4708                                goto out_retry;
4709                        }
4710                        break;
4711                case LSRJT_CMD_UNSUPPORTED:
4712                        /* lpfc nvmet returns this type of LS_RJT when it
4713                         * receives an FCP PRLI because lpfc nvmet only
4714                         * support NVME.  ELS request is terminated for FCP4
4715                         * on this rport.
4716                         */
4717                        if (stat.un.b.lsRjtRsnCodeExp ==
4718                            LSEXP_REQ_UNSUPPORTED && cmd == ELS_CMD_PRLI) {
4719                                spin_lock_irq(&ndlp->lock);
4720                                ndlp->nlp_flag |= NLP_FCP_PRLI_RJT;
4721                                spin_unlock_irq(&ndlp->lock);
4722                                retry = 0;
4723                                goto out_retry;
4724                        }
4725                        break;
4726                }
4727                break;
4728
4729        case IOSTAT_INTERMED_RSP:
4730        case IOSTAT_BA_RJT:
4731                break;
4732
4733        default:
4734                break;
4735        }
4736
4737        if (link_reset) {
4738                rc = lpfc_link_reset(vport);
4739                if (rc) {
4740                        /* Do not give up. Retry PLOGI one more time and attempt
4741                         * link reset if PLOGI fails again.
4742                         */
4743                        retry = 1;
4744                        delay = 100;
4745                        goto out_retry;
4746                }
4747                return 1;
4748        }
4749
4750        if (did == FDMI_DID)
4751                retry = 1;
4752
4753        if ((cmd == ELS_CMD_FLOGI) &&
4754            (phba->fc_topology != LPFC_TOPOLOGY_LOOP) &&
4755            !lpfc_error_lost_link(irsp)) {
4756                /* FLOGI retry policy */
4757                retry = 1;
4758                /* retry FLOGI forever */
4759                if (phba->link_flag != LS_LOOPBACK_MODE)
4760                        maxretry = 0;
4761                else
4762                        maxretry = 2;
4763
4764                if (cmdiocb->retry >= 100)
4765                        delay = 5000;
4766                else if (cmdiocb->retry >= 32)
4767                        delay = 1000;
4768        } else if ((cmd == ELS_CMD_FDISC) && !lpfc_error_lost_link(irsp)) {
4769                /* retry FDISCs every second up to devloss */
4770                retry = 1;
4771                maxretry = vport->cfg_devloss_tmo;
4772                delay = 1000;
4773        }
4774
4775        cmdiocb->retry++;
4776        if (maxretry && (cmdiocb->retry >= maxretry)) {
4777                phba->fc_stat.elsRetryExceeded++;
4778                retry = 0;
4779        }
4780
4781        if ((vport->load_flag & FC_UNLOADING) != 0)
4782                retry = 0;
4783
4784out_retry:
4785        if (retry) {
4786                if ((cmd == ELS_CMD_PLOGI) || (cmd == ELS_CMD_FDISC)) {
4787                        /* Stop retrying PLOGI and FDISC if in FCF discovery */
4788                        if (phba->fcf.fcf_flag & FCF_DISCOVERY) {
4789                                lpfc_printf_vlog(vport, KERN_INFO, LOG_ELS,
4790                                                 "2849 Stop retry ELS command "
4791                                                 "x%x to remote NPORT x%x, "
4792                                                 "Data: x%x x%x\n", cmd, did,
4793                                                 cmdiocb->retry, delay);
4794                                return 0;
4795                        }
4796                }
4797
4798                /* Retry ELS command <elsCmd> to remote NPORT <did> */
4799                lpfc_printf_vlog(vport, KERN_INFO, LOG_ELS,
4800                                 "0107 Retry ELS command x%x to remote "
4801                                 "NPORT x%x Data: x%x x%x\n",
4802                                 cmd, did, cmdiocb->retry, delay);
4803
4804                if (((cmd == ELS_CMD_PLOGI) || (cmd == ELS_CMD_ADISC)) &&
4805                        ((irsp->ulpStatus != IOSTAT_LOCAL_REJECT) ||
4806                        ((irsp->un.ulpWord[4] & IOERR_PARAM_MASK) !=
4807                        IOERR_NO_RESOURCES))) {
4808                        /* Don't reset timer for no resources */
4809
4810                        /* If discovery / RSCN timer is running, reset it */
4811                        if (timer_pending(&vport->fc_disctmo) ||
4812                            (vport->fc_flag & FC_RSCN_MODE))
4813                                lpfc_set_disctmo(vport);
4814                }
4815
4816                phba->fc_stat.elsXmitRetry++;
4817                if (ndlp && delay) {
4818                        phba->fc_stat.elsDelayRetry++;
4819                        ndlp->nlp_retry = cmdiocb->retry;
4820
4821                        /* delay is specified in milliseconds */
4822                        mod_timer(&ndlp->nlp_delayfunc,
4823                                jiffies + msecs_to_jiffies(delay));
4824                        spin_lock_irq(&ndlp->lock);
4825                        ndlp->nlp_flag |= NLP_DELAY_TMO;
4826                        spin_unlock_irq(&ndlp->lock);
4827
4828                        ndlp->nlp_prev_state = ndlp->nlp_state;
4829                        if ((cmd == ELS_CMD_PRLI) ||
4830                            (cmd == ELS_CMD_NVMEPRLI))
4831                                lpfc_nlp_set_state(vport, ndlp,
4832                                        NLP_STE_PRLI_ISSUE);
4833                        else if (cmd != ELS_CMD_ADISC)
4834                                lpfc_nlp_set_state(vport, ndlp,
4835                                        NLP_STE_NPR_NODE);
4836                        ndlp->nlp_last_elscmd = cmd;
4837
4838                        return 1;
4839                }
4840                switch (cmd) {
4841                case ELS_CMD_FLOGI:
4842                        lpfc_issue_els_flogi(vport, ndlp, cmdiocb->retry);
4843                        return 1;
4844                case ELS_CMD_FDISC:
4845                        lpfc_issue_els_fdisc(vport, ndlp, cmdiocb->retry);
4846                        return 1;
4847                case ELS_CMD_PLOGI:
4848                        if (ndlp) {
4849                                ndlp->nlp_prev_state = ndlp->nlp_state;
4850                                lpfc_nlp_set_state(vport, ndlp,
4851                                                   NLP_STE_PLOGI_ISSUE);
4852                        }
4853                        lpfc_issue_els_plogi(vport, did, cmdiocb->retry);
4854                        return 1;
4855                case ELS_CMD_ADISC:
4856                        ndlp->nlp_prev_state = ndlp->nlp_state;
4857                        lpfc_nlp_set_state(vport, ndlp, NLP_STE_ADISC_ISSUE);
4858                        lpfc_issue_els_adisc(vport, ndlp, cmdiocb->retry);
4859                        return 1;
4860                case ELS_CMD_PRLI:
4861                case ELS_CMD_NVMEPRLI:
4862                        ndlp->nlp_prev_state = ndlp->nlp_state;
4863                        lpfc_nlp_set_state(vport, ndlp, NLP_STE_PRLI_ISSUE);
4864                        lpfc_issue_els_prli(vport, ndlp, cmdiocb->retry);
4865                        return 1;
4866                case ELS_CMD_LOGO:
4867                        ndlp->nlp_prev_state = ndlp->nlp_state;
4868                        lpfc_nlp_set_state(vport, ndlp, NLP_STE_LOGO_ISSUE);
4869                        lpfc_issue_els_logo(vport, ndlp, cmdiocb->retry);
4870                        return 1;
4871                }
4872        }
4873        /* No retry ELS command <elsCmd> to remote NPORT <did> */
4874        if (logerr) {
4875                lpfc_printf_vlog(vport, KERN_ERR, LOG_TRACE_EVENT,
4876                         "0137 No retry ELS command x%x to remote "
4877                         "NPORT x%x: Out of Resources: Error:x%x/%x\n",
4878                         cmd, did, irsp->ulpStatus,
4879                         irsp->un.ulpWord[4]);
4880        }
4881        else {
4882                lpfc_printf_vlog(vport, KERN_INFO, LOG_ELS,
4883                         "0108 No retry ELS command x%x to remote "
4884                         "NPORT x%x Retried:%d Error:x%x/%x\n",
4885                         cmd, did, cmdiocb->retry, irsp->ulpStatus,
4886                         irsp->un.ulpWord[4]);
4887        }
4888        return 0;
4889}
4890
4891/**
4892 * lpfc_els_free_data - Free lpfc dma buffer and data structure with an iocb
4893 * @phba: pointer to lpfc hba data structure.
4894 * @buf_ptr1: pointer to the lpfc DMA buffer data structure.
4895 *
4896 * This routine releases the lpfc DMA (Direct Memory Access) buffer(s)
4897 * associated with a command IOCB back to the lpfc DMA buffer pool. It first
4898 * checks to see whether there is a lpfc DMA buffer associated with the
4899 * response of the command IOCB. If so, it will be released before releasing
4900 * the lpfc DMA buffer associated with the IOCB itself.
4901 *
4902 * Return code
4903 *   0 - Successfully released lpfc DMA buffer (currently, always return 0)
4904 **/
4905static int
4906lpfc_els_free_data(struct lpfc_hba *phba, struct lpfc_dmabuf *buf_ptr1)
4907{
4908        struct lpfc_dmabuf *buf_ptr;
4909
4910        /* Free the response before processing the command. */
4911        if (!list_empty(&buf_ptr1->list)) {
4912                list_remove_head(&buf_ptr1->list, buf_ptr,
4913                                 struct lpfc_dmabuf,
4914                                 list);
4915                lpfc_mbuf_free(phba, buf_ptr->virt, buf_ptr->phys);
4916                kfree(buf_ptr);
4917        }
4918        lpfc_mbuf_free(phba, buf_ptr1->virt, buf_ptr1->phys);
4919        kfree(buf_ptr1);
4920        return 0;
4921}
4922
4923/**
4924 * lpfc_els_free_bpl - Free lpfc dma buffer and data structure with bpl
4925 * @phba: pointer to lpfc hba data structure.
4926 * @buf_ptr: pointer to the lpfc dma buffer data structure.
4927 *
4928 * This routine releases the lpfc Direct Memory Access (DMA) buffer
4929 * associated with a Buffer Pointer List (BPL) back to the lpfc DMA buffer
4930 * pool.
4931 *
4932 * Return code
4933 *   0 - Successfully released lpfc DMA buffer (currently, always return 0)
4934 **/
4935static int
4936lpfc_els_free_bpl(struct lpfc_hba *phba, struct lpfc_dmabuf *buf_ptr)
4937{
4938        lpfc_mbuf_free(phba, buf_ptr->virt, buf_ptr->phys);
4939        kfree(buf_ptr);
4940        return 0;
4941}
4942
4943/**
4944 * lpfc_els_free_iocb - Free a command iocb and its associated resources
4945 * @phba: pointer to lpfc hba data structure.
4946 * @elsiocb: pointer to lpfc els command iocb data structure.
4947 *
4948 * This routine frees a command IOCB and its associated resources. The
4949 * command IOCB data structure contains the reference to various associated
4950 * resources, these fields must be set to NULL if the associated reference
4951 * not present:
4952 *   context1 - reference to ndlp
4953 *   context2 - reference to cmd
4954 *   context2->next - reference to rsp
4955 *   context3 - reference to bpl
4956 *
4957 * It first properly decrements the reference count held on ndlp for the
4958 * IOCB completion callback function. If LPFC_DELAY_MEM_FREE flag is not
4959 * set, it invokes the lpfc_els_free_data() routine to release the Direct
4960 * Memory Access (DMA) buffers associated with the IOCB. Otherwise, it
4961 * adds the DMA buffer the @phba data structure for the delayed release.
4962 * If reference to the Buffer Pointer List (BPL) is present, the
4963 * lpfc_els_free_bpl() routine is invoked to release the DMA memory
4964 * associated with BPL. Finally, the lpfc_sli_release_iocbq() routine is
4965 * invoked to release the IOCB data structure back to @phba IOCBQ list.
4966 *
4967 * Return code
4968 *   0 - Success (currently, always return 0)
4969 **/
4970int
4971lpfc_els_free_iocb(struct lpfc_hba *phba, struct lpfc_iocbq *elsiocb)
4972{
4973        struct lpfc_dmabuf *buf_ptr, *buf_ptr1;
4974
4975        /* The I/O iocb is complete.  Clear the context1 data. */
4976        elsiocb->context1 = NULL;
4977
4978        /* context2  = cmd,  context2->next = rsp, context3 = bpl */
4979        if (elsiocb->context2) {
4980                if (elsiocb->iocb_flag & LPFC_DELAY_MEM_FREE) {
4981                        /* Firmware could still be in progress of DMAing
4982                         * payload, so don't free data buffer till after
4983                         * a hbeat.
4984                         */
4985                        elsiocb->iocb_flag &= ~LPFC_DELAY_MEM_FREE;
4986                        buf_ptr = elsiocb->context2;
4987                        elsiocb->context2 = NULL;
4988                        if (buf_ptr) {
4989                                buf_ptr1 = NULL;
4990                                spin_lock_irq(&phba->hbalock);
4991                                if (!list_empty(&buf_ptr->list)) {
4992                                        list_remove_head(&buf_ptr->list,
4993                                                buf_ptr1, struct lpfc_dmabuf,
4994                                                list);
4995                                        INIT_LIST_HEAD(&buf_ptr1->list);
4996                                        list_add_tail(&buf_ptr1->list,
4997                                                &phba->elsbuf);
4998                                        phba->elsbuf_cnt++;
4999                                }
5000                                INIT_LIST_HEAD(&buf_ptr->list);
5001                                list_add_tail(&buf_ptr->list, &phba->elsbuf);
5002                                phba->elsbuf_cnt++;
5003                                spin_unlock_irq(&phba->hbalock);
5004                        }
5005                } else {
5006                        buf_ptr1 = (struct lpfc_dmabuf *) elsiocb->context2;
5007                        lpfc_els_free_data(phba, buf_ptr1);
5008                        elsiocb->context2 = NULL;
5009                }
5010        }
5011
5012        if (elsiocb->context3) {
5013                buf_ptr = (struct lpfc_dmabuf *) elsiocb->context3;
5014                lpfc_els_free_bpl(phba, buf_ptr);
5015                elsiocb->context3 = NULL;
5016        }
5017        lpfc_sli_release_iocbq(phba, elsiocb);
5018        return 0;
5019}
5020
5021/**
5022 * lpfc_cmpl_els_logo_acc - Completion callback function to logo acc response
5023 * @phba: pointer to lpfc hba data structure.
5024 * @cmdiocb: pointer to lpfc command iocb data structure.
5025 * @rspiocb: pointer to lpfc response iocb data structure.
5026 *
5027 * This routine is the completion callback function to the Logout (LOGO)
5028 * Accept (ACC) Response ELS command. This routine is invoked to indicate
5029 * the completion of the LOGO process. It invokes the lpfc_nlp_not_used() to
5030 * release the ndlp if it has the last reference remaining (reference count
5031 * is 1). If succeeded (meaning ndlp released), it sets the IOCB context1
5032 * field to NULL to inform the following lpfc_els_free_iocb() routine no
5033 * ndlp reference count needs to be decremented. Otherwise, the ndlp
5034 * reference use-count shall be decremented by the lpfc_els_free_iocb()
5035 * routine. Finally, the lpfc_els_free_iocb() is invoked to release the
5036 * IOCB data structure.
5037 **/
5038static void
5039lpfc_cmpl_els_logo_acc(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
5040                       struct lpfc_iocbq *rspiocb)
5041{
5042        struct lpfc_nodelist *ndlp = (struct lpfc_nodelist *) cmdiocb->context1;
5043        struct lpfc_vport *vport = cmdiocb->vport;
5044        IOCB_t *irsp;
5045
5046        irsp = &rspiocb->iocb;
5047        lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_RSP,
5048                "ACC LOGO cmpl:   status:x%x/x%x did:x%x",
5049                irsp->ulpStatus, irsp->un.ulpWord[4], ndlp->nlp_DID);
5050        /* ACC to LOGO completes to NPort <nlp_DID> */
5051        lpfc_printf_vlog(vport, KERN_INFO, LOG_ELS,
5052                         "0109 ACC to LOGO completes to NPort x%x refcnt %d "
5053                         "Data: x%x x%x x%x\n",
5054                         ndlp->nlp_DID, kref_read(&ndlp->kref), ndlp->nlp_flag,
5055                         ndlp->nlp_state, ndlp->nlp_rpi);
5056
5057        /* This clause allows the LOGO ACC to complete and free resources
5058         * for the Fabric Domain Controller.  It does deliberately skip
5059         * the unreg_rpi and release rpi because some fabrics send RDP
5060         * requests after logging out from the initiator.
5061         */
5062        if (ndlp->nlp_type & NLP_FABRIC &&
5063            ((ndlp->nlp_DID & WELL_KNOWN_DID_MASK) != WELL_KNOWN_DID_MASK))
5064                goto out;
5065
5066        if (ndlp->nlp_state == NLP_STE_NPR_NODE) {
5067
5068                /* If PLOGI is being retried, PLOGI completion will cleanup the
5069                 * node. The NLP_NPR_2B_DISC flag needs to be retained to make
5070                 * progress on nodes discovered from last RSCN.
5071                 */
5072                if ((ndlp->nlp_flag & NLP_DELAY_TMO) &&
5073                    (ndlp->nlp_last_elscmd == ELS_CMD_PLOGI))
5074                        goto out;
5075
5076                /* NPort Recovery mode or node is just allocated */
5077                if (!lpfc_nlp_not_used(ndlp)) {
5078                        /* A LOGO is completing and the node is in NPR state.
5079                         * If this a fabric node that cleared its transport
5080                         * registration, release the rpi.
5081                         */
5082                        spin_lock_irq(&ndlp->lock);
5083                        ndlp->nlp_flag &= ~NLP_NPR_2B_DISC;
5084                        if (phba->sli_rev == LPFC_SLI_REV4)
5085                                ndlp->nlp_flag |= NLP_RELEASE_RPI;
5086                        spin_unlock_irq(&ndlp->lock);
5087                        lpfc_unreg_rpi(vport, ndlp);
5088                } else {
5089                        /* Indicate the node has already released, should
5090                         * not reference to it from within lpfc_els_free_iocb.
5091                         */
5092                        cmdiocb->context1 = NULL;
5093                }
5094        }
5095 out:
5096        /*
5097         * The driver received a LOGO from the rport and has ACK'd it.
5098         * At this point, the driver is done so release the IOCB
5099         */
5100        lpfc_els_free_iocb(phba, cmdiocb);
5101        lpfc_nlp_put(ndlp);
5102}
5103
5104/**
5105 * lpfc_mbx_cmpl_dflt_rpi - Completion callbk func for unreg dflt rpi mbox cmd
5106 * @phba: pointer to lpfc hba data structure.
5107 * @pmb: pointer to the driver internal queue element for mailbox command.
5108 *
5109 * This routine is the completion callback function for unregister default
5110 * RPI (Remote Port Index) mailbox command to the @phba. It simply releases
5111 * the associated lpfc Direct Memory Access (DMA) buffer back to the pool and
5112 * decrements the ndlp reference count held for this completion callback
5113 * function. After that, it invokes the lpfc_nlp_not_used() to check
5114 * whether there is only one reference left on the ndlp. If so, it will
5115 * perform one more decrement and trigger the release of the ndlp.
5116 **/
5117void
5118lpfc_mbx_cmpl_dflt_rpi(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmb)
5119{
5120        struct lpfc_dmabuf *mp = (struct lpfc_dmabuf *)(pmb->ctx_buf);
5121        struct lpfc_nodelist *ndlp = (struct lpfc_nodelist *)pmb->ctx_ndlp;
5122        u32 mbx_flag = pmb->mbox_flag;
5123        u32 mbx_cmd = pmb->u.mb.mbxCommand;
5124
5125        pmb->ctx_buf = NULL;
5126        pmb->ctx_ndlp = NULL;
5127
5128        if (ndlp) {
5129                lpfc_printf_vlog(ndlp->vport, KERN_INFO, LOG_NODE,
5130                                 "0006 rpi x%x DID:%x flg:%x %d x%px "
5131                                 "mbx_cmd x%x mbx_flag x%x x%px\n",
5132                                 ndlp->nlp_rpi, ndlp->nlp_DID, ndlp->nlp_flag,
5133                                 kref_read(&ndlp->kref), ndlp, mbx_cmd,
5134                                 mbx_flag, pmb);
5135
5136                /* This ends the default/temporary RPI cleanup logic for this
5137                 * ndlp and the node and rpi needs to be released. Free the rpi
5138                 * first on an UNREG_LOGIN and then release the final
5139                 * references.
5140                 */
5141                spin_lock_irq(&ndlp->lock);
5142                ndlp->nlp_flag &= ~NLP_REG_LOGIN_SEND;
5143                if (mbx_cmd == MBX_UNREG_LOGIN)
5144                        ndlp->nlp_flag &= ~NLP_UNREG_INP;
5145                spin_unlock_irq(&ndlp->lock);
5146                lpfc_nlp_put(ndlp);
5147                lpfc_drop_node(ndlp->vport, ndlp);
5148        }
5149
5150        lpfc_mbuf_free(phba, mp->virt, mp->phys);
5151        kfree(mp);
5152        mempool_free(pmb, phba->mbox_mem_pool);
5153        return;
5154}
5155
5156/**
5157 * lpfc_cmpl_els_rsp - Completion callback function for els response iocb cmd
5158 * @phba: pointer to lpfc hba data structure.
5159 * @cmdiocb: pointer to lpfc command iocb data structure.
5160 * @rspiocb: pointer to lpfc response iocb data structure.
5161 *
5162 * This routine is the completion callback function for ELS Response IOCB
5163 * command. In normal case, this callback function just properly sets the
5164 * nlp_flag bitmap in the ndlp data structure, if the mbox command reference
5165 * field in the command IOCB is not NULL, the referred mailbox command will
5166 * be send out, and then invokes the lpfc_els_free_iocb() routine to release
5167 * the IOCB.
5168 **/
5169static void
5170lpfc_cmpl_els_rsp(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
5171                  struct lpfc_iocbq *rspiocb)
5172{
5173        struct lpfc_nodelist *ndlp = (struct lpfc_nodelist *) cmdiocb->context1;
5174        struct lpfc_vport *vport = ndlp ? ndlp->vport : NULL;
5175        struct Scsi_Host  *shost = vport ? lpfc_shost_from_vport(vport) : NULL;
5176        IOCB_t  *irsp;
5177        LPFC_MBOXQ_t *mbox = NULL;
5178        struct lpfc_dmabuf *mp = NULL;
5179
5180        irsp = &rspiocb->iocb;
5181
5182        if (!vport) {
5183                lpfc_printf_log(phba, KERN_ERR, LOG_TRACE_EVENT,
5184                                "3177 ELS response failed\n");
5185                goto out;
5186        }
5187        if (cmdiocb->context_un.mbox)
5188                mbox = cmdiocb->context_un.mbox;
5189
5190        /* Check to see if link went down during discovery */
5191        if (!ndlp || lpfc_els_chk_latt(vport)) {
5192                if (mbox) {
5193                        mp = (struct lpfc_dmabuf *)mbox->ctx_buf;
5194                        if (mp) {
5195                                lpfc_mbuf_free(phba, mp->virt, mp->phys);
5196                                kfree(mp);
5197                        }
5198                        mempool_free(mbox, phba->mbox_mem_pool);
5199                }
5200                goto out;
5201        }
5202
5203        lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_RSP,
5204                "ELS rsp cmpl:    status:x%x/x%x did:x%x",
5205                irsp->ulpStatus, irsp->un.ulpWord[4],
5206                cmdiocb->iocb.un.elsreq64.remoteID);
5207        /* ELS response tag <ulpIoTag> completes */
5208        lpfc_printf_vlog(vport, KERN_INFO, LOG_ELS,
5209                         "0110 ELS response tag x%x completes "
5210                         "Data: x%x x%x x%x x%x x%x x%x x%x x%x x%px\n",
5211                         cmdiocb->iocb.ulpIoTag, rspiocb->iocb.ulpStatus,
5212                         rspiocb->iocb.un.ulpWord[4], rspiocb->iocb.ulpTimeout,
5213                         ndlp->nlp_DID, ndlp->nlp_flag, ndlp->nlp_state,
5214                         ndlp->nlp_rpi, kref_read(&ndlp->kref), mbox);
5215        if (mbox) {
5216                if ((rspiocb->iocb.ulpStatus == 0) &&
5217                    (ndlp->nlp_flag & NLP_ACC_REGLOGIN)) {
5218                        if (!lpfc_unreg_rpi(vport, ndlp) &&
5219                            (!(vport->fc_flag & FC_PT2PT))) {
5220                                if (ndlp->nlp_state == NLP_STE_REG_LOGIN_ISSUE) {
5221                                        lpfc_printf_vlog(vport, KERN_INFO,
5222                                                         LOG_DISCOVERY,
5223                                                         "0314 PLOGI recov "
5224                                                         "DID x%x "
5225                                                         "Data: x%x x%x x%x\n",
5226                                                         ndlp->nlp_DID,
5227                                                         ndlp->nlp_state,
5228                                                         ndlp->nlp_rpi,
5229                                                         ndlp->nlp_flag);
5230                                        mp = mbox->ctx_buf;
5231                                        if (mp) {
5232                                                lpfc_mbuf_free(phba, mp->virt,
5233                                                               mp->phys);
5234                                                kfree(mp);
5235                                        }
5236                                        mempool_free(mbox, phba->mbox_mem_pool);
5237                                        goto out;
5238                                }
5239                        }
5240
5241                        /* Increment reference count to ndlp to hold the
5242                         * reference to ndlp for the callback function.
5243                         */
5244                        mbox->ctx_ndlp = lpfc_nlp_get(ndlp);
5245                        if (!mbox->ctx_ndlp)
5246                                goto out;
5247
5248                        mbox->vport = vport;
5249                        if (ndlp->nlp_flag & NLP_RM_DFLT_RPI) {
5250                                mbox->mbox_flag |= LPFC_MBX_IMED_UNREG;
5251                                mbox->mbox_cmpl = lpfc_mbx_cmpl_dflt_rpi;
5252                        }
5253                        else {
5254                                mbox->mbox_cmpl = lpfc_mbx_cmpl_reg_login;
5255                                ndlp->nlp_prev_state = ndlp->nlp_state;
5256                                lpfc_nlp_set_state(vport, ndlp,
5257                                           NLP_STE_REG_LOGIN_ISSUE);
5258                        }
5259
5260                        ndlp->nlp_flag |= NLP_REG_LOGIN_SEND;
5261                        if (lpfc_sli_issue_mbox(phba, mbox, MBX_NOWAIT)
5262                            != MBX_NOT_FINISHED)
5263                                goto out;
5264
5265                        /* Decrement the ndlp reference count we
5266                         * set for this failed mailbox command.
5267                         */
5268                        lpfc_nlp_put(ndlp);
5269                        ndlp->nlp_flag &= ~NLP_REG_LOGIN_SEND;
5270
5271                        /* ELS rsp: Cannot issue reg_login for <NPortid> */
5272                        lpfc_printf_vlog(vport, KERN_ERR, LOG_TRACE_EVENT,
5273                                "0138 ELS rsp: Cannot issue reg_login for x%x "
5274                                "Data: x%x x%x x%x\n",
5275                                ndlp->nlp_DID, ndlp->nlp_flag, ndlp->nlp_state,
5276                                ndlp->nlp_rpi);
5277                }
5278                mp = (struct lpfc_dmabuf *)mbox->ctx_buf;
5279                if (mp) {
5280                        lpfc_mbuf_free(phba, mp->virt, mp->phys);
5281                        kfree(mp);
5282                }
5283                mempool_free(mbox, phba->mbox_mem_pool);
5284        }
5285out:
5286        if (ndlp && shost) {
5287                spin_lock_irq(&ndlp->lock);
5288                if (mbox)
5289                        ndlp->nlp_flag &= ~NLP_ACC_REGLOGIN;
5290                ndlp->nlp_flag &= ~NLP_RM_DFLT_RPI;
5291                spin_unlock_irq(&ndlp->lock);
5292        }
5293
5294        /* An SLI4 NPIV instance wants to drop the node at this point under
5295         * these conditions and release the RPI.
5296         */
5297        if (phba->sli_rev == LPFC_SLI_REV4 &&
5298            (vport && vport->port_type == LPFC_NPIV_PORT) &&
5299            ndlp->nlp_flag & NLP_RELEASE_RPI) {
5300                lpfc_sli4_free_rpi(phba, ndlp->nlp_rpi);
5301                spin_lock_irq(&ndlp->lock);
5302                ndlp->nlp_rpi = LPFC_RPI_ALLOC_ERROR;
5303                ndlp->nlp_flag &= ~NLP_RELEASE_RPI;
5304                spin_unlock_irq(&ndlp->lock);
5305                lpfc_drop_node(vport, ndlp);
5306        }
5307
5308        /* Release the originating I/O reference. */
5309        lpfc_els_free_iocb(phba, cmdiocb);
5310        lpfc_nlp_put(ndlp);
5311        return;
5312}
5313
5314/**
5315 * lpfc_els_rsp_acc - Prepare and issue an acc response iocb command
5316 * @vport: pointer to a host virtual N_Port data structure.
5317 * @flag: the els command code to be accepted.
5318 * @oldiocb: pointer to the original lpfc command iocb data structure.
5319 * @ndlp: pointer to a node-list data structure.
5320 * @mbox: pointer to the driver internal queue element for mailbox command.
5321 *
5322 * This routine prepares and issues an Accept (ACC) response IOCB
5323 * command. It uses the @flag to properly set up the IOCB field for the
5324 * specific ACC response command to be issued and invokes the
5325 * lpfc_sli_issue_iocb() routine to send out ACC response IOCB. If a
5326 * @mbox pointer is passed in, it will be put into the context_un.mbox
5327 * field of the IOCB for the completion callback function to issue the
5328 * mailbox command to the HBA later when callback is invoked.
5329 *
5330 * Note that the ndlp reference count will be incremented by 1 for holding the
5331 * ndlp and the reference to ndlp will be stored into the context1 field of
5332 * the IOCB for the completion callback function to the corresponding
5333 * response ELS IOCB command.
5334 *
5335 * Return code
5336 *   0 - Successfully issued acc response
5337 *   1 - Failed to issue acc response
5338 **/
5339int
5340lpfc_els_rsp_acc(struct lpfc_vport *vport, uint32_t flag,
5341                 struct lpfc_iocbq *oldiocb, struct lpfc_nodelist *ndlp,
5342                 LPFC_MBOXQ_t *mbox)
5343{
5344        struct lpfc_hba  *phba = vport->phba;
5345        IOCB_t *icmd;
5346        IOCB_t *oldcmd;
5347        struct lpfc_iocbq *elsiocb;
5348        uint8_t *pcmd;
5349        struct serv_parm *sp;
5350        uint16_t cmdsize;
5351        int rc;
5352        ELS_PKT *els_pkt_ptr;
5353        struct fc_els_rdf_resp *rdf_resp;
5354
5355        oldcmd = &oldiocb->iocb;
5356
5357        switch (flag) {
5358        case ELS_CMD_ACC:
5359                cmdsize = sizeof(uint32_t);
5360                elsiocb = lpfc_prep_els_iocb(vport, 0, cmdsize, oldiocb->retry,
5361                                             ndlp, ndlp->nlp_DID, ELS_CMD_ACC);
5362                if (!elsiocb) {
5363                        spin_lock_irq(&ndlp->lock);
5364                        ndlp->nlp_flag &= ~NLP_LOGO_ACC;
5365                        spin_unlock_irq(&ndlp->lock);
5366                        return 1;
5367                }
5368
5369                icmd = &elsiocb->iocb;
5370                icmd->ulpContext = oldcmd->ulpContext;  /* Xri / rx_id */
5371                icmd->unsli3.rcvsli3.ox_id = oldcmd->unsli3.rcvsli3.ox_id;
5372                pcmd = (((struct lpfc_dmabuf *) elsiocb->context2)->virt);
5373                *((uint32_t *) (pcmd)) = ELS_CMD_ACC;
5374                pcmd += sizeof(uint32_t);
5375
5376                lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_RSP,
5377                        "Issue ACC:       did:x%x flg:x%x",
5378                        ndlp->nlp_DID, ndlp->nlp_flag, 0);
5379                break;
5380        case ELS_CMD_FLOGI:
5381        case ELS_CMD_PLOGI:
5382                cmdsize = (sizeof(struct serv_parm) + sizeof(uint32_t));
5383                elsiocb = lpfc_prep_els_iocb(vport, 0, cmdsize, oldiocb->retry,
5384                                             ndlp, ndlp->nlp_DID, ELS_CMD_ACC);
5385                if (!elsiocb)
5386                        return 1;
5387
5388                icmd = &elsiocb->iocb;
5389                icmd->ulpContext = oldcmd->ulpContext;  /* Xri / rx_id */
5390                icmd->unsli3.rcvsli3.ox_id = oldcmd->unsli3.rcvsli3.ox_id;
5391                pcmd = (((struct lpfc_dmabuf *) elsiocb->context2)->virt);
5392
5393                if (mbox)
5394                        elsiocb->context_un.mbox = mbox;
5395
5396                *((uint32_t *) (pcmd)) = ELS_CMD_ACC;
5397                pcmd += sizeof(uint32_t);
5398                sp = (struct serv_parm *)pcmd;
5399
5400                if (flag == ELS_CMD_FLOGI) {
5401                        /* Copy the received service parameters back */
5402                        memcpy(sp, &phba->fc_fabparam,
5403                               sizeof(struct serv_parm));
5404
5405                        /* Clear the F_Port bit */
5406                        sp->cmn.fPort = 0;
5407
5408                        /* Mark all class service parameters as invalid */
5409                        sp->cls1.classValid = 0;
5410                        sp->cls2.classValid = 0;
5411                        sp->cls3.classValid = 0;
5412                        sp->cls4.classValid = 0;
5413
5414                        /* Copy our worldwide names */
5415                        memcpy(&sp->portName, &vport->fc_sparam.portName,
5416                               sizeof(struct lpfc_name));
5417                        memcpy(&sp->nodeName, &vport->fc_sparam.nodeName,
5418                               sizeof(struct lpfc_name));
5419                } else {
5420                        memcpy(pcmd, &vport->fc_sparam,
5421                               sizeof(struct serv_parm));
5422
5423                        sp->cmn.valid_vendor_ver_level = 0;
5424                        memset(sp->un.vendorVersion, 0,
5425                               sizeof(sp->un.vendorVersion));
5426                        sp->cmn.bbRcvSizeMsb &= 0xF;
5427
5428                        /* If our firmware supports this feature, convey that
5429                         * info to the target using the vendor specific field.
5430                         */
5431                        if (phba->sli.sli_flag & LPFC_SLI_SUPPRESS_RSP) {
5432                                sp->cmn.valid_vendor_ver_level = 1;
5433                                sp->un.vv.vid = cpu_to_be32(LPFC_VV_EMLX_ID);
5434                                sp->un.vv.flags =
5435                                        cpu_to_be32(LPFC_VV_SUPPRESS_RSP);
5436                        }
5437                }
5438
5439                lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_RSP,
5440                        "Issue ACC FLOGI/PLOGI: did:x%x flg:x%x",
5441                        ndlp->nlp_DID, ndlp->nlp_flag, 0);
5442                break;
5443        case ELS_CMD_PRLO:
5444                cmdsize = sizeof(uint32_t) + sizeof(PRLO);
5445                elsiocb = lpfc_prep_els_iocb(vport, 0, cmdsize, oldiocb->retry,
5446                                             ndlp, ndlp->nlp_DID, ELS_CMD_PRLO);
5447                if (!elsiocb)
5448                        return 1;
5449
5450                icmd = &elsiocb->iocb;
5451                icmd->ulpContext = oldcmd->ulpContext;  /* Xri / rx_id */
5452                icmd->unsli3.rcvsli3.ox_id = oldcmd->unsli3.rcvsli3.ox_id;
5453                pcmd = (((struct lpfc_dmabuf *) elsiocb->context2)->virt);
5454
5455                memcpy(pcmd, ((struct lpfc_dmabuf *) oldiocb->context2)->virt,
5456                       sizeof(uint32_t) + sizeof(PRLO));
5457                *((uint32_t *) (pcmd)) = ELS_CMD_PRLO_ACC;
5458                els_pkt_ptr = (ELS_PKT *) pcmd;
5459                els_pkt_ptr->un.prlo.acceptRspCode = PRLO_REQ_EXECUTED;
5460
5461                lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_RSP,
5462                        "Issue ACC PRLO:  did:x%x flg:x%x",
5463                        ndlp->nlp_DID, ndlp->nlp_flag, 0);
5464                break;
5465        case ELS_CMD_RDF:
5466                cmdsize = sizeof(*rdf_resp);
5467                elsiocb = lpfc_prep_els_iocb(vport, 0, cmdsize, oldiocb->retry,
5468                                             ndlp, ndlp->nlp_DID, ELS_CMD_ACC);
5469                if (!elsiocb)
5470                        return 1;
5471
5472                icmd = &elsiocb->iocb;
5473                icmd->ulpContext = oldcmd->ulpContext;  /* Xri / rx_id */
5474                icmd->unsli3.rcvsli3.ox_id = oldcmd->unsli3.rcvsli3.ox_id;
5475                pcmd = (((struct lpfc_dmabuf *)elsiocb->context2)->virt);
5476                rdf_resp = (struct fc_els_rdf_resp *)pcmd;
5477                memset(rdf_resp, 0, sizeof(*rdf_resp));
5478                rdf_resp->acc_hdr.la_cmd = ELS_LS_ACC;
5479
5480                /* FC-LS-5 specifies desc_list_len shall be set to 12 */
5481                rdf_resp->desc_list_len = cpu_to_be32(12);
5482
5483                /* FC-LS-5 specifies LS REQ Information descriptor */
5484                rdf_resp->lsri.desc_tag = cpu_to_be32(1);
5485                rdf_resp->lsri.desc_len = cpu_to_be32(sizeof(u32));
5486                rdf_resp->lsri.rqst_w0.cmd = ELS_RDF;
5487                break;
5488        default:
5489                return 1;
5490        }
5491        if (ndlp->nlp_flag & NLP_LOGO_ACC) {
5492                spin_lock_irq(&ndlp->lock);
5493                if (!(ndlp->nlp_flag & NLP_RPI_REGISTERED ||
5494                        ndlp->nlp_flag & NLP_REG_LOGIN_SEND))
5495                        ndlp->nlp_flag &= ~NLP_LOGO_ACC;
5496                spin_unlock_irq(&ndlp->lock);
5497                elsiocb->iocb_cmpl = lpfc_cmpl_els_logo_acc;
5498        } else {
5499                elsiocb->iocb_cmpl = lpfc_cmpl_els_rsp;
5500        }
5501
5502        phba->fc_stat.elsXmitACC++;
5503        elsiocb->context1 = lpfc_nlp_get(ndlp);
5504        if (!elsiocb->context1) {
5505                lpfc_els_free_iocb(phba, elsiocb);
5506                return 1;
5507        }
5508
5509        rc = lpfc_sli_issue_iocb(phba, LPFC_ELS_RING, elsiocb, 0);
5510        if (rc == IOCB_ERROR) {
5511                lpfc_els_free_iocb(phba, elsiocb);
5512                lpfc_nlp_put(ndlp);
5513                return 1;
5514        }
5515
5516        /* Xmit ELS ACC response tag <ulpIoTag> */
5517        lpfc_printf_vlog(vport, KERN_INFO, LOG_ELS,
5518                         "0128 Xmit ELS ACC response Status: x%x, IoTag: x%x, "
5519                         "XRI: x%x, DID: x%x, nlp_flag: x%x nlp_state: x%x "
5520                         "RPI: x%x, fc_flag x%x refcnt %d\n",
5521                         rc, elsiocb->iotag, elsiocb->sli4_xritag,
5522                         ndlp->nlp_DID, ndlp->nlp_flag, ndlp->nlp_state,
5523                         ndlp->nlp_rpi, vport->fc_flag, kref_read(&ndlp->kref));
5524        return 0;
5525}
5526
5527/**
5528 * lpfc_els_rsp_reject - Prepare and issue a rjt response iocb command
5529 * @vport: pointer to a virtual N_Port data structure.
5530 * @rejectError: reject response to issue
5531 * @oldiocb: pointer to the original lpfc command iocb data structure.
5532 * @ndlp: pointer to a node-list data structure.
5533 * @mbox: pointer to the driver internal queue element for mailbox command.
5534 *
5535 * This routine prepares and issue an Reject (RJT) response IOCB
5536 * command. If a @mbox pointer is passed in, it will be put into the
5537 * context_un.mbox field of the IOCB for the completion callback function
5538 * to issue to the HBA later.
5539 *
5540 * Note that the ndlp reference count will be incremented by 1 for holding the
5541 * ndlp and the reference to ndlp will be stored into the context1 field of
5542 * the IOCB for the completion callback function to the reject response
5543 * ELS IOCB command.
5544 *
5545 * Return code
5546 *   0 - Successfully issued reject response
5547 *   1 - Failed to issue reject response
5548 **/
5549int
5550lpfc_els_rsp_reject(struct lpfc_vport *vport, uint32_t rejectError,
5551                    struct lpfc_iocbq *oldiocb, struct lpfc_nodelist *ndlp,
5552                    LPFC_MBOXQ_t *mbox)
5553{
5554        int rc;
5555        struct lpfc_hba  *phba = vport->phba;
5556        IOCB_t *icmd;
5557        IOCB_t *oldcmd;
5558        struct lpfc_iocbq *elsiocb;
5559        uint8_t *pcmd;
5560        uint16_t cmdsize;
5561
5562        cmdsize = 2 * sizeof(uint32_t);
5563        elsiocb = lpfc_prep_els_iocb(vport, 0, cmdsize, oldiocb->retry, ndlp,
5564                                     ndlp->nlp_DID, ELS_CMD_LS_RJT);
5565        if (!elsiocb)
5566                return 1;
5567
5568        icmd = &elsiocb->iocb;
5569        oldcmd = &oldiocb->iocb;
5570        icmd->ulpContext = oldcmd->ulpContext;  /* Xri / rx_id */
5571        icmd->unsli3.rcvsli3.ox_id = oldcmd->unsli3.rcvsli3.ox_id;
5572        pcmd = (uint8_t *) (((struct lpfc_dmabuf *) elsiocb->context2)->virt);
5573
5574        *((uint32_t *) (pcmd)) = ELS_CMD_LS_RJT;
5575        pcmd += sizeof(uint32_t);
5576        *((uint32_t *) (pcmd)) = rejectError;
5577
5578        if (mbox)
5579                elsiocb->context_un.mbox = mbox;
5580
5581        /* Xmit ELS RJT <err> response tag <ulpIoTag> */
5582        lpfc_printf_vlog(vport, KERN_INFO, LOG_ELS,
5583                         "0129 Xmit ELS RJT x%x response tag x%x "
5584                         "xri x%x, did x%x, nlp_flag x%x, nlp_state x%x, "
5585                         "rpi x%x\n",
5586                         rejectError, elsiocb->iotag,
5587                         elsiocb->iocb.ulpContext, ndlp->nlp_DID,
5588                         ndlp->nlp_flag, ndlp->nlp_state, ndlp->nlp_rpi);
5589        lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_RSP,
5590                "Issue LS_RJT:    did:x%x flg:x%x err:x%x",
5591                ndlp->nlp_DID, ndlp->nlp_flag, rejectError);
5592
5593        phba->fc_stat.elsXmitLSRJT++;
5594        elsiocb->iocb_cmpl = lpfc_cmpl_els_rsp;
5595        elsiocb->context1 = lpfc_nlp_get(ndlp);
5596        if (!elsiocb->context1) {
5597                lpfc_els_free_iocb(phba, elsiocb);
5598                return 1;
5599        }
5600
5601        /* The NPIV instance is rejecting this unsolicited ELS. Make sure the
5602         * node's assigned RPI needs to be released as this node will get
5603         * freed.
5604         */
5605        if (phba->sli_rev == LPFC_SLI_REV4 &&
5606            vport->port_type == LPFC_NPIV_PORT) {
5607                spin_lock_irq(&ndlp->lock);
5608                ndlp->nlp_flag |= NLP_RELEASE_RPI;
5609                spin_unlock_irq(&ndlp->lock);
5610        }
5611
5612        rc = lpfc_sli_issue_iocb(phba, LPFC_ELS_RING, elsiocb, 0);
5613        if (rc == IOCB_ERROR) {
5614                lpfc_els_free_iocb(phba, elsiocb);
5615                lpfc_nlp_put(ndlp);
5616                return 1;
5617        }
5618
5619        return 0;
5620}
5621
5622 /**
5623  * lpfc_issue_els_edc_rsp - Exchange Diagnostic Capabilities with the fabric.
5624  * @vport: pointer to a host virtual N_Port data structure.
5625  * @cmdiocb: pointer to the original lpfc command iocb data structure.
5626  * @ndlp: NPort to where rsp is directed
5627  *
5628  * This routine issues an EDC ACC RSP to the F-Port Controller to communicate
5629  * this N_Port's support of hardware signals in its Congestion
5630  * Capabilities Descriptor.
5631  *
5632  * Return code
5633  *   0 - Successfully issued edc rsp command
5634  *   1 - Failed to issue edc rsp command
5635  **/
5636static int
5637lpfc_issue_els_edc_rsp(struct lpfc_vport *vport, struct lpfc_iocbq *cmdiocb,
5638                       struct lpfc_nodelist *ndlp)
5639{
5640        struct lpfc_hba  *phba = vport->phba;
5641        struct lpfc_els_edc_rsp *edc_rsp;
5642        struct lpfc_iocbq *elsiocb;
5643        IOCB_t *icmd, *cmd;
5644        uint8_t *pcmd;
5645        int cmdsize, rc;
5646
5647        cmdsize = sizeof(struct lpfc_els_edc_rsp);
5648        elsiocb = lpfc_prep_els_iocb(vport, 0, cmdsize, cmdiocb->retry,
5649                                     ndlp, ndlp->nlp_DID, ELS_CMD_ACC);
5650        if (!elsiocb)
5651                return 1;
5652
5653        icmd = &elsiocb->iocb;
5654        cmd = &cmdiocb->iocb;
5655        icmd->ulpContext = cmd->ulpContext;     /* Xri / rx_id */
5656        icmd->unsli3.rcvsli3.ox_id = cmd->unsli3.rcvsli3.ox_id;
5657        pcmd = (((struct lpfc_dmabuf *)elsiocb->context2)->virt);
5658        memset(pcmd, 0, cmdsize);
5659
5660        edc_rsp = (struct lpfc_els_edc_rsp *)pcmd;
5661        edc_rsp->edc_rsp.acc_hdr.la_cmd = ELS_LS_ACC;
5662        edc_rsp->edc_rsp.desc_list_len = cpu_to_be32(
5663                FC_TLV_DESC_LENGTH_FROM_SZ(struct lpfc_els_edc_rsp));
5664        edc_rsp->edc_rsp.lsri.desc_tag = cpu_to_be32(ELS_DTAG_LS_REQ_INFO);
5665        edc_rsp->edc_rsp.lsri.desc_len = cpu_to_be32(
5666                FC_TLV_DESC_LENGTH_FROM_SZ(struct fc_els_lsri_desc));
5667        edc_rsp->edc_rsp.lsri.rqst_w0.cmd = ELS_EDC;
5668        lpfc_format_edc_cgn_desc(phba, &edc_rsp->cgn_desc);
5669
5670        lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_RSP,
5671                              "Issue EDC ACC:      did:x%x flg:x%x refcnt %d",
5672                              ndlp->nlp_DID, ndlp->nlp_flag,
5673                              kref_read(&ndlp->kref));
5674        elsiocb->iocb_cmpl = lpfc_cmpl_els_rsp;
5675
5676        phba->fc_stat.elsXmitACC++;
5677        elsiocb->context1 = lpfc_nlp_get(ndlp);
5678        if (!elsiocb->context1) {
5679                lpfc_els_free_iocb(phba, elsiocb);
5680                return 1;
5681        }
5682
5683        rc = lpfc_sli_issue_iocb(phba, LPFC_ELS_RING, elsiocb, 0);
5684        if (rc == IOCB_ERROR) {
5685                lpfc_els_free_iocb(phba, elsiocb);
5686                lpfc_nlp_put(ndlp);
5687                return 1;
5688        }
5689
5690        /* Xmit ELS ACC response tag <ulpIoTag> */
5691        lpfc_printf_vlog(vport, KERN_INFO, LOG_ELS,
5692                         "0152 Xmit EDC ACC response Status: x%x, IoTag: x%x, "
5693                         "XRI: x%x, DID: x%x, nlp_flag: x%x nlp_state: x%x "
5694                         "RPI: x%x, fc_flag x%x\n",
5695                         rc, elsiocb->iotag, elsiocb->sli4_xritag,
5696                         ndlp->nlp_DID, ndlp->nlp_flag, ndlp->nlp_state,
5697                         ndlp->nlp_rpi, vport->fc_flag);
5698
5699        return 0;
5700}
5701
5702/**
5703 * lpfc_els_rsp_adisc_acc - Prepare and issue acc response to adisc iocb cmd
5704 * @vport: pointer to a virtual N_Port data structure.
5705 * @oldiocb: pointer to the original lpfc command iocb data structure.
5706 * @ndlp: pointer to a node-list data structure.
5707 *
5708 * This routine prepares and issues an Accept (ACC) response to Address
5709 * Discover (ADISC) ELS command. It simply prepares the payload of the IOCB
5710 * and invokes the lpfc_sli_issue_iocb() routine to send out the command.
5711 *
5712 * Note that the ndlp reference count will be incremented by 1 for holding the
5713 * ndlp and the reference to ndlp will be stored into the context1 field of
5714 * the IOCB for the completion callback function to the ADISC Accept response
5715 * ELS IOCB command.
5716 *
5717 * Return code
5718 *   0 - Successfully issued acc adisc response
5719 *   1 - Failed to issue adisc acc response
5720 **/
5721int
5722lpfc_els_rsp_adisc_acc(struct lpfc_vport *vport, struct lpfc_iocbq *oldiocb,
5723                       struct lpfc_nodelist *ndlp)
5724{
5725        struct lpfc_hba  *phba = vport->phba;
5726        ADISC *ap;
5727        IOCB_t *icmd, *oldcmd;
5728        struct lpfc_iocbq *elsiocb;
5729        uint8_t *pcmd;
5730        uint16_t cmdsize;
5731        int rc;
5732
5733        cmdsize = sizeof(uint32_t) + sizeof(ADISC);
5734        elsiocb = lpfc_prep_els_iocb(vport, 0, cmdsize, oldiocb->retry, ndlp,
5735                                     ndlp->nlp_DID, ELS_CMD_ACC);
5736        if (!elsiocb)
5737                return 1;
5738
5739        icmd = &elsiocb->iocb;
5740        oldcmd = &oldiocb->iocb;
5741        icmd->ulpContext = oldcmd->ulpContext;  /* Xri / rx_id */
5742        icmd->unsli3.rcvsli3.ox_id = oldcmd->unsli3.rcvsli3.ox_id;
5743
5744        /* Xmit ADISC ACC response tag <ulpIoTag> */
5745        lpfc_printf_vlog(vport, KERN_INFO, LOG_ELS,
5746                         "0130 Xmit ADISC ACC response iotag x%x xri: "
5747                         "x%x, did x%x, nlp_flag x%x, nlp_state x%x rpi x%x\n",
5748                         elsiocb->iotag, elsiocb->iocb.ulpContext,
5749                         ndlp->nlp_DID, ndlp->nlp_flag, ndlp->nlp_state,
5750                         ndlp->nlp_rpi);
5751        pcmd = (uint8_t *) (((struct lpfc_dmabuf *) elsiocb->context2)->virt);
5752
5753        *((uint32_t *) (pcmd)) = ELS_CMD_ACC;
5754        pcmd += sizeof(uint32_t);
5755
5756        ap = (ADISC *) (pcmd);
5757        ap->hardAL_PA = phba->fc_pref_ALPA;
5758        memcpy(&ap->portName, &vport->fc_portname, sizeof(struct lpfc_name));
5759        memcpy(&ap->nodeName, &vport->fc_nodename, sizeof(struct lpfc_name));
5760        ap->DID = be32_to_cpu(vport->fc_myDID);
5761
5762        lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_RSP,
5763                      "Issue ACC ADISC: did:x%x flg:x%x refcnt %d",
5764                      ndlp->nlp_DID, ndlp->nlp_flag, kref_read(&ndlp->kref));
5765
5766        phba->fc_stat.elsXmitACC++;
5767        elsiocb->iocb_cmpl = lpfc_cmpl_els_rsp;
5768        elsiocb->context1 = lpfc_nlp_get(ndlp);
5769        if (!elsiocb->context1) {
5770                lpfc_els_free_iocb(phba, elsiocb);
5771                return 1;
5772        }
5773
5774        rc = lpfc_sli_issue_iocb(phba, LPFC_ELS_RING, elsiocb, 0);
5775        if (rc == IOCB_ERROR) {
5776                lpfc_els_free_iocb(phba, elsiocb);
5777                lpfc_nlp_put(ndlp);
5778                return 1;
5779        }
5780
5781        /* Xmit ELS ACC response tag <ulpIoTag> */
5782        lpfc_printf_vlog(vport, KERN_INFO, LOG_ELS,
5783                         "0128 Xmit ELS ACC response Status: x%x, IoTag: x%x, "
5784                         "XRI: x%x, DID: x%x, nlp_flag: x%x nlp_state: x%x "
5785                         "RPI: x%x, fc_flag x%x\n",
5786                         rc, elsiocb->iotag, elsiocb->sli4_xritag,
5787                         ndlp->nlp_DID, ndlp->nlp_flag, ndlp->nlp_state,
5788                         ndlp->nlp_rpi, vport->fc_flag);
5789        return 0;
5790}
5791
5792/**
5793 * lpfc_els_rsp_prli_acc - Prepare and issue acc response to prli iocb cmd
5794 * @vport: pointer to a virtual N_Port data structure.
5795 * @oldiocb: pointer to the original lpfc command iocb data structure.
5796 * @ndlp: pointer to a node-list data structure.
5797 *
5798 * This routine prepares and issues an Accept (ACC) response to Process
5799 * Login (PRLI) ELS command. It simply prepares the payload of the IOCB
5800 * and invokes the lpfc_sli_issue_iocb() routine to send out the command.
5801 *
5802 * Note that the ndlp reference count will be incremented by 1 for holding the
5803 * ndlp and the reference to ndlp will be stored into the context1 field of
5804 * the IOCB for the completion callback function to the PRLI Accept response
5805 * ELS IOCB command.
5806 *
5807 * Return code
5808 *   0 - Successfully issued acc prli response
5809 *   1 - Failed to issue acc prli response
5810 **/
5811int
5812lpfc_els_rsp_prli_acc(struct lpfc_vport *vport, struct lpfc_iocbq *oldiocb,
5813                      struct lpfc_nodelist *ndlp)
5814{
5815        struct lpfc_hba  *phba = vport->phba;
5816        PRLI *npr;
5817        struct lpfc_nvme_prli *npr_nvme;
5818        lpfc_vpd_t *vpd;
5819        IOCB_t *icmd;
5820        IOCB_t *oldcmd;
5821        struct lpfc_iocbq *elsiocb;
5822        uint8_t *pcmd;
5823        uint16_t cmdsize;
5824        uint32_t prli_fc4_req, *req_payload;
5825        struct lpfc_dmabuf *req_buf;
5826        int rc;
5827        u32 elsrspcmd;
5828
5829        /* Need the incoming PRLI payload to determine if the ACC is for an
5830         * FC4 or NVME PRLI type.  The PRLI type is at word 1.
5831         */
5832        req_buf = (struct lpfc_dmabuf *)oldiocb->context2;
5833        req_payload = (((uint32_t *)req_buf->virt) + 1);
5834
5835        /* PRLI type payload is at byte 3 for FCP or NVME. */
5836        prli_fc4_req = be32_to_cpu(*req_payload);
5837        prli_fc4_req = (prli_fc4_req >> 24) & 0xff;
5838        lpfc_printf_vlog(vport, KERN_INFO, LOG_ELS,
5839                         "6127 PRLI_ACC:  Req Type x%x, Word1 x%08x\n",
5840                         prli_fc4_req, *((uint32_t *)req_payload));
5841
5842        if (prli_fc4_req == PRLI_FCP_TYPE) {
5843                cmdsize = sizeof(uint32_t) + sizeof(PRLI);
5844                elsrspcmd = (ELS_CMD_ACC | (ELS_CMD_PRLI & ~ELS_RSP_MASK));
5845        } else if (prli_fc4_req & PRLI_NVME_TYPE) {
5846                cmdsize = sizeof(uint32_t) + sizeof(struct lpfc_nvme_prli);
5847                elsrspcmd = (ELS_CMD_ACC | (ELS_CMD_NVMEPRLI & ~ELS_RSP_MASK));
5848        } else {
5849                return 1;
5850        }
5851
5852        elsiocb = lpfc_prep_els_iocb(vport, 0, cmdsize, oldiocb->retry, ndlp,
5853                ndlp->nlp_DID, elsrspcmd);
5854        if (!elsiocb)
5855                return 1;
5856
5857        icmd = &elsiocb->iocb;
5858        oldcmd = &oldiocb->iocb;
5859        icmd->ulpContext = oldcmd->ulpContext;  /* Xri / rx_id */
5860        icmd->unsli3.rcvsli3.ox_id = oldcmd->unsli3.rcvsli3.ox_id;
5861
5862        /* Xmit PRLI ACC response tag <ulpIoTag> */
5863        lpfc_printf_vlog(vport, KERN_INFO, LOG_ELS,
5864                         "0131 Xmit PRLI ACC response tag x%x xri x%x, "
5865                         "did x%x, nlp_flag x%x, nlp_state x%x, rpi x%x\n",
5866                         elsiocb->iotag, elsiocb->iocb.ulpContext,
5867                         ndlp->nlp_DID, ndlp->nlp_flag, ndlp->nlp_state,
5868                         ndlp->nlp_rpi);
5869        pcmd = (uint8_t *) (((struct lpfc_dmabuf *) elsiocb->context2)->virt);
5870        memset(pcmd, 0, cmdsize);
5871
5872        *((uint32_t *)(pcmd)) = elsrspcmd;
5873        pcmd += sizeof(uint32_t);
5874
5875        /* For PRLI, remainder of payload is PRLI parameter page */
5876        vpd = &phba->vpd;
5877
5878        if (prli_fc4_req == PRLI_FCP_TYPE) {
5879                /*
5880                 * If the remote port is a target and our firmware version
5881                 * is 3.20 or later, set the following bits for FC-TAPE
5882                 * support.
5883                 */
5884                npr = (PRLI *) pcmd;
5885                if ((ndlp->nlp_type & NLP_FCP_TARGET) &&
5886                    (vpd->rev.feaLevelHigh >= 0x02)) {
5887                        npr->ConfmComplAllowed = 1;
5888                        npr->Retry = 1;
5889                        npr->TaskRetryIdReq = 1;
5890                }
5891                npr->acceptRspCode = PRLI_REQ_EXECUTED;
5892                npr->estabImagePair = 1;
5893                npr->readXferRdyDis = 1;
5894                npr->ConfmComplAllowed = 1;
5895                npr->prliType = PRLI_FCP_TYPE;
5896                npr->initiatorFunc = 1;
5897        } else if (prli_fc4_req & PRLI_NVME_TYPE) {
5898                /* Respond with an NVME PRLI Type */
5899                npr_nvme = (struct lpfc_nvme_prli *) pcmd;
5900                bf_set(prli_type_code, npr_nvme, PRLI_NVME_TYPE);
5901                bf_set(prli_estabImagePair, npr_nvme, 0);  /* Should be 0 */
5902                bf_set(prli_acc_rsp_code, npr_nvme, PRLI_REQ_EXECUTED);
5903                if (phba->nvmet_support) {
5904                        bf_set(prli_tgt, npr_nvme, 1);
5905                        bf_set(prli_disc, npr_nvme, 1);
5906                        if (phba->cfg_nvme_enable_fb) {
5907                                bf_set(prli_fba, npr_nvme, 1);
5908
5909                                /* TBD.  Target mode needs to post buffers
5910                                 * that support the configured first burst
5911                                 * byte size.
5912                                 */
5913                                bf_set(prli_fb_sz, npr_nvme,
5914                                       phba->cfg_nvmet_fb_size);
5915                        }
5916                } else {
5917                        bf_set(prli_init, npr_nvme, 1);
5918                }
5919
5920                lpfc_printf_vlog(vport, KERN_INFO, LOG_NVME_DISC,
5921                                 "6015 NVME issue PRLI ACC word1 x%08x "
5922                                 "word4 x%08x word5 x%08x flag x%x, "
5923                                 "fcp_info x%x nlp_type x%x\n",
5924                                 npr_nvme->word1, npr_nvme->word4,
5925                                 npr_nvme->word5, ndlp->nlp_flag,
5926                                 ndlp->nlp_fcp_info, ndlp->nlp_type);
5927                npr_nvme->word1 = cpu_to_be32(npr_nvme->word1);
5928                npr_nvme->word4 = cpu_to_be32(npr_nvme->word4);
5929                npr_nvme->word5 = cpu_to_be32(npr_nvme->word5);
5930        } else
5931                lpfc_printf_vlog(vport, KERN_INFO, LOG_DISCOVERY,
5932                                 "6128 Unknown FC_TYPE x%x x%x ndlp x%06x\n",
5933                                 prli_fc4_req, ndlp->nlp_fc4_type,
5934                                 ndlp->nlp_DID);
5935
5936        lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_RSP,
5937                      "Issue ACC PRLI:  did:x%x flg:x%x",
5938                      ndlp->nlp_DID, ndlp->nlp_flag, kref_read(&ndlp->kref));
5939
5940        phba->fc_stat.elsXmitACC++;
5941        elsiocb->iocb_cmpl = lpfc_cmpl_els_rsp;
5942        elsiocb->context1 =  lpfc_nlp_get(ndlp);
5943        if (!elsiocb->context1) {
5944                lpfc_els_free_iocb(phba, elsiocb);
5945                return 1;
5946        }
5947
5948        rc = lpfc_sli_issue_iocb(phba, LPFC_ELS_RING, elsiocb, 0);
5949        if (rc == IOCB_ERROR) {
5950                lpfc_els_free_iocb(phba, elsiocb);
5951                lpfc_nlp_put(ndlp);
5952                return 1;
5953        }
5954
5955        return 0;
5956}
5957
5958/**
5959 * lpfc_els_rsp_rnid_acc - Issue rnid acc response iocb command
5960 * @vport: pointer to a virtual N_Port data structure.
5961 * @format: rnid command format.
5962 * @oldiocb: pointer to the original lpfc command iocb data structure.
5963 * @ndlp: pointer to a node-list data structure.
5964 *
5965 * This routine issues a Request Node Identification Data (RNID) Accept
5966 * (ACC) response. It constructs the RNID ACC response command according to
5967 * the proper @format and then calls the lpfc_sli_issue_iocb() routine to
5968 * issue the response.
5969 *
5970 * Note that the ndlp reference count will be incremented by 1 for holding the
5971 * ndlp and the reference to ndlp will be stored into the context1 field of
5972 * the IOCB for the completion callback function.
5973 *
5974 * Return code
5975 *   0 - Successfully issued acc rnid response
5976 *   1 - Failed to issue acc rnid response
5977 **/
5978static int
5979lpfc_els_rsp_rnid_acc(struct lpfc_vport *vport, uint8_t format,
5980                      struct lpfc_iocbq *oldiocb, struct lpfc_nodelist *ndlp)
5981{
5982        struct lpfc_hba  *phba = vport->phba;
5983        RNID *rn;
5984        IOCB_t *icmd, *oldcmd;
5985        struct lpfc_iocbq *elsiocb;
5986        uint8_t *pcmd;
5987        uint16_t cmdsize;
5988        int rc;
5989
5990        cmdsize = sizeof(uint32_t) + sizeof(uint32_t)
5991                                        + (2 * sizeof(struct lpfc_name));
5992        if (format)
5993                cmdsize += sizeof(RNID_TOP_DISC);
5994
5995        elsiocb = lpfc_prep_els_iocb(vport, 0, cmdsize, oldiocb->retry, ndlp,
5996                                     ndlp->nlp_DID, ELS_CMD_ACC);
5997        if (!elsiocb)
5998                return 1;
5999
6000        icmd = &elsiocb->iocb;
6001        oldcmd = &oldiocb->iocb;
6002        icmd->ulpContext = oldcmd->ulpContext;  /* Xri / rx_id */
6003        icmd->unsli3.rcvsli3.ox_id = oldcmd->unsli3.rcvsli3.ox_id;
6004
6005        /* Xmit RNID ACC response tag <ulpIoTag> */
6006        lpfc_printf_vlog(vport, KERN_INFO, LOG_ELS,
6007                         "0132 Xmit RNID ACC response tag x%x xri x%x\n",
6008                         elsiocb->iotag, elsiocb->iocb.ulpContext);
6009        pcmd = (uint8_t *) (((struct lpfc_dmabuf *) elsiocb->context2)->virt);
6010        *((uint32_t *) (pcmd)) = ELS_CMD_ACC;
6011        pcmd += sizeof(uint32_t);
6012
6013        memset(pcmd, 0, sizeof(RNID));
6014        rn = (RNID *) (pcmd);
6015        rn->Format = format;
6016        rn->CommonLen = (2 * sizeof(struct lpfc_name));
6017        memcpy(&rn->portName, &vport->fc_portname, sizeof(struct lpfc_name));
6018        memcpy(&rn->nodeName, &vport->fc_nodename, sizeof(struct lpfc_name));
6019        switch (format) {
6020        case 0:
6021                rn->SpecificLen = 0;
6022                break;
6023        case RNID_TOPOLOGY_DISC:
6024                rn->SpecificLen = sizeof(RNID_TOP_DISC);
6025                memcpy(&rn->un.topologyDisc.portName,
6026                       &vport->fc_portname, sizeof(struct lpfc_name));
6027                rn->un.topologyDisc.unitType = RNID_HBA;
6028                rn->un.topologyDisc.physPort = 0;
6029                rn->un.topologyDisc.attachedNodes = 0;
6030                break;
6031        default:
6032                rn->CommonLen = 0;
6033                rn->SpecificLen = 0;
6034                break;
6035        }
6036
6037        lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_RSP,
6038                      "Issue ACC RNID:  did:x%x flg:x%x refcnt %d",
6039                      ndlp->nlp_DID, ndlp->nlp_flag, kref_read(&ndlp->kref));
6040
6041        phba->fc_stat.elsXmitACC++;
6042        elsiocb->iocb_cmpl = lpfc_cmpl_els_rsp;
6043        elsiocb->context1 = lpfc_nlp_get(ndlp);
6044        if (!elsiocb->context1) {
6045                lpfc_els_free_iocb(phba, elsiocb);
6046                return 1;
6047        }
6048
6049        rc = lpfc_sli_issue_iocb(phba, LPFC_ELS_RING, elsiocb, 0);
6050        if (rc == IOCB_ERROR) {
6051                lpfc_els_free_iocb(phba, elsiocb);
6052                lpfc_nlp_put(ndlp);
6053                return 1;
6054        }
6055
6056        return 0;
6057}
6058
6059/**
6060 * lpfc_els_clear_rrq - Clear the rq that this rrq describes.
6061 * @vport: pointer to a virtual N_Port data structure.
6062 * @iocb: pointer to the lpfc command iocb data structure.
6063 * @ndlp: pointer to a node-list data structure.
6064 *
6065 * Return
6066 **/
6067static void
6068lpfc_els_clear_rrq(struct lpfc_vport *vport,
6069                   struct lpfc_iocbq *iocb, struct lpfc_nodelist *ndlp)
6070{
6071        struct lpfc_hba  *phba = vport->phba;
6072        uint8_t *pcmd;
6073        struct RRQ *rrq;
6074        uint16_t rxid;
6075        uint16_t xri;
6076        struct lpfc_node_rrq *prrq;
6077
6078
6079        pcmd = (uint8_t *) (((struct lpfc_dmabuf *) iocb->context2)->virt);
6080        pcmd += sizeof(uint32_t);
6081        rrq = (struct RRQ *)pcmd;
6082        rrq->rrq_exchg = be32_to_cpu(rrq->rrq_exchg);
6083        rxid = bf_get(rrq_rxid, rrq);
6084
6085        lpfc_printf_vlog(vport, KERN_INFO, LOG_ELS,
6086                        "2883 Clear RRQ for SID:x%x OXID:x%x RXID:x%x"
6087                        " x%x x%x\n",
6088                        be32_to_cpu(bf_get(rrq_did, rrq)),
6089                        bf_get(rrq_oxid, rrq),
6090                        rxid,
6091                        iocb->iotag, iocb->iocb.ulpContext);
6092
6093        lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_RSP,
6094                "Clear RRQ:  did:x%x flg:x%x exchg:x%.08x",
6095                ndlp->nlp_DID, ndlp->nlp_flag, rrq->rrq_exchg);
6096        if (vport->fc_myDID == be32_to_cpu(bf_get(rrq_did, rrq)))
6097                xri = bf_get(rrq_oxid, rrq);
6098        else
6099                xri = rxid;
6100        prrq = lpfc_get_active_rrq(vport, xri, ndlp->nlp_DID);
6101        if (prrq)
6102                lpfc_clr_rrq_active(phba, xri, prrq);
6103        return;
6104}
6105
6106/**
6107 * lpfc_els_rsp_echo_acc - Issue echo acc response
6108 * @vport: pointer to a virtual N_Port data structure.
6109 * @data: pointer to echo data to return in the accept.
6110 * @oldiocb: pointer to the original lpfc command iocb data structure.
6111 * @ndlp: pointer to a node-list data structure.
6112 *
6113 * Return code
6114 *   0 - Successfully issued acc echo response
6115 *   1 - Failed to issue acc echo response
6116 **/
6117static int
6118lpfc_els_rsp_echo_acc(struct lpfc_vport *vport, uint8_t *data,
6119                      struct lpfc_iocbq *oldiocb, struct lpfc_nodelist *ndlp)
6120{
6121        struct lpfc_hba  *phba = vport->phba;
6122        struct lpfc_iocbq *elsiocb;
6123        uint8_t *pcmd;
6124        uint16_t cmdsize;
6125        int rc;
6126
6127        cmdsize = oldiocb->iocb.unsli3.rcvsli3.acc_len;
6128
6129        /* The accumulated length can exceed the BPL_SIZE.  For
6130         * now, use this as the limit
6131         */
6132        if (cmdsize > LPFC_BPL_SIZE)
6133                cmdsize = LPFC_BPL_SIZE;
6134        elsiocb = lpfc_prep_els_iocb(vport, 0, cmdsize, oldiocb->retry, ndlp,
6135                                     ndlp->nlp_DID, ELS_CMD_ACC);
6136        if (!elsiocb)
6137                return 1;
6138
6139        elsiocb->iocb.ulpContext = oldiocb->iocb.ulpContext;  /* Xri / rx_id */
6140        elsiocb->iocb.unsli3.rcvsli3.ox_id = oldiocb->iocb.unsli3.rcvsli3.ox_id;
6141
6142        /* Xmit ECHO ACC response tag <ulpIoTag> */
6143        lpfc_printf_vlog(vport, KERN_INFO, LOG_ELS,
6144                         "2876 Xmit ECHO ACC response tag x%x xri x%x\n",
6145                         elsiocb->iotag, elsiocb->iocb.ulpContext);
6146        pcmd = (uint8_t *) (((struct lpfc_dmabuf *) elsiocb->context2)->virt);
6147        *((uint32_t *) (pcmd)) = ELS_CMD_ACC;
6148        pcmd += sizeof(uint32_t);
6149        memcpy(pcmd, data, cmdsize - sizeof(uint32_t));
6150
6151        lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_RSP,
6152                      "Issue ACC ECHO:  did:x%x flg:x%x refcnt %d",
6153                      ndlp->nlp_DID, ndlp->nlp_flag, kref_read(&ndlp->kref));
6154
6155        phba->fc_stat.elsXmitACC++;
6156        elsiocb->iocb_cmpl = lpfc_cmpl_els_rsp;
6157        elsiocb->context1 =  lpfc_nlp_get(ndlp);
6158        if (!elsiocb->context1) {
6159                lpfc_els_free_iocb(phba, elsiocb);
6160                return 1;
6161        }
6162
6163        rc = lpfc_sli_issue_iocb(phba, LPFC_ELS_RING, elsiocb, 0);
6164        if (rc == IOCB_ERROR) {
6165                lpfc_els_free_iocb(phba, elsiocb);
6166                lpfc_nlp_put(ndlp);
6167                return 1;
6168        }
6169
6170        return 0;
6171}
6172
6173/**
6174 * lpfc_els_disc_adisc - Issue remaining adisc iocbs to npr nodes of a vport
6175 * @vport: pointer to a host virtual N_Port data structure.
6176 *
6177 * This routine issues Address Discover (ADISC) ELS commands to those
6178 * N_Ports which are in node port recovery state and ADISC has not been issued
6179 * for the @vport. Each time an ELS ADISC IOCB is issued by invoking the
6180 * lpfc_issue_els_adisc() routine, the per @vport number of discover count
6181 * (num_disc_nodes) shall be incremented. If the num_disc_nodes reaches a
6182 * pre-configured threshold (cfg_discovery_threads), the @vport fc_flag will
6183 * be marked with FC_NLP_MORE bit and the process of issuing remaining ADISC
6184 * IOCBs quit for later pick up. On the other hand, after walking through
6185 * all the ndlps with the @vport and there is none ADISC IOCB issued, the
6186 * @vport fc_flag shall be cleared with FC_NLP_MORE bit indicating there is
6187 * no more ADISC need to be sent.
6188 *
6189 * Return code
6190 *    The number of N_Ports with adisc issued.
6191 **/
6192int
6193lpfc_els_disc_adisc(struct lpfc_vport *vport)
6194{
6195        struct Scsi_Host *shost = lpfc_shost_from_vport(vport);
6196        struct lpfc_nodelist *ndlp, *next_ndlp;
6197        int sentadisc = 0;
6198
6199        /* go thru NPR nodes and issue any remaining ELS ADISCs */
6200        list_for_each_entry_safe(ndlp, next_ndlp, &vport->fc_nodes, nlp_listp) {
6201
6202                if (ndlp->nlp_state != NLP_STE_NPR_NODE ||
6203                    !(ndlp->nlp_flag & NLP_NPR_ADISC))
6204                        continue;
6205
6206                spin_lock_irq(&ndlp->lock);
6207                ndlp->nlp_flag &= ~NLP_NPR_ADISC;
6208                spin_unlock_irq(&ndlp->lock);
6209
6210                if (!(ndlp->nlp_flag & NLP_NPR_2B_DISC)) {
6211                        /* This node was marked for ADISC but was not picked
6212                         * for discovery. This is possible if the node was
6213                         * missing in gidft response.
6214                         *
6215                         * At time of marking node for ADISC, we skipped unreg
6216                         * from backend
6217                         */
6218                        lpfc_nlp_unreg_node(vport, ndlp);
6219                        continue;
6220                }
6221
6222                ndlp->nlp_prev_state = ndlp->nlp_state;
6223                lpfc_nlp_set_state(vport, ndlp, NLP_STE_ADISC_ISSUE);
6224                lpfc_issue_els_adisc(vport, ndlp, 0);
6225                sentadisc++;
6226                vport->num_disc_nodes++;
6227                if (vport->num_disc_nodes >=
6228                                vport->cfg_discovery_threads) {
6229                        spin_lock_irq(shost->host_lock);
6230                        vport->fc_flag |= FC_NLP_MORE;
6231                        spin_unlock_irq(shost->host_lock);
6232                        break;
6233                }
6234
6235        }
6236        if (sentadisc == 0) {
6237                spin_lock_irq(shost->host_lock);
6238                vport->fc_flag &= ~FC_NLP_MORE;
6239                spin_unlock_irq(shost->host_lock);
6240        }
6241        return sentadisc;
6242}
6243
6244/**
6245 * lpfc_els_disc_plogi - Issue plogi for all npr nodes of a vport before adisc
6246 * @vport: pointer to a host virtual N_Port data structure.
6247 *
6248 * This routine issues Port Login (PLOGI) ELS commands to all the N_Ports
6249 * which are in node port recovery state, with a @vport. Each time an ELS
6250 * ADISC PLOGI IOCB is issued by invoking the lpfc_issue_els_plogi() routine,
6251 * the per @vport number of discover count (num_disc_nodes) shall be
6252 * incremented. If the num_disc_nodes reaches a pre-configured threshold
6253 * (cfg_discovery_threads), the @vport fc_flag will be marked with FC_NLP_MORE
6254 * bit set and quit the process of issuing remaining ADISC PLOGIN IOCBs for
6255 * later pick up. On the other hand, after walking through all the ndlps with
6256 * the @vport and there is none ADISC PLOGI IOCB issued, the @vport fc_flag
6257 * shall be cleared with the FC_NLP_MORE bit indicating there is no more ADISC
6258 * PLOGI need to be sent.
6259 *
6260 * Return code
6261 *   The number of N_Ports with plogi issued.
6262 **/
6263int
6264lpfc_els_disc_plogi(struct lpfc_vport *vport)
6265{
6266        struct Scsi_Host *shost = lpfc_shost_from_vport(vport);
6267        struct lpfc_nodelist *ndlp, *next_ndlp;
6268        int sentplogi = 0;
6269
6270        /* go thru NPR nodes and issue any remaining ELS PLOGIs */
6271        list_for_each_entry_safe(ndlp, next_ndlp, &vport->fc_nodes, nlp_listp) {
6272                if (ndlp->nlp_state == NLP_STE_NPR_NODE &&
6273                                (ndlp->nlp_flag & NLP_NPR_2B_DISC) != 0 &&
6274                                (ndlp->nlp_flag & NLP_DELAY_TMO) == 0 &&
6275                                (ndlp->nlp_flag & NLP_NPR_ADISC) == 0) {
6276                        ndlp->nlp_prev_state = ndlp->nlp_state;
6277                        lpfc_nlp_set_state(vport, ndlp, NLP_STE_PLOGI_ISSUE);
6278                        lpfc_issue_els_plogi(vport, ndlp->nlp_DID, 0);
6279                        sentplogi++;
6280                        vport->num_disc_nodes++;
6281                        if (vport->num_disc_nodes >=
6282                                        vport->cfg_discovery_threads) {
6283                                spin_lock_irq(shost->host_lock);
6284                                vport->fc_flag |= FC_NLP_MORE;
6285                                spin_unlock_irq(shost->host_lock);
6286                                break;
6287                        }
6288                }
6289        }
6290
6291        lpfc_printf_vlog(vport, KERN_INFO, LOG_DISCOVERY,
6292                         "6452 Discover PLOGI %d flag x%x\n",
6293                         sentplogi, vport->fc_flag);
6294
6295        if (sentplogi) {
6296                lpfc_set_disctmo(vport);
6297        }
6298        else {
6299                spin_lock_irq(shost->host_lock);
6300                vport->fc_flag &= ~FC_NLP_MORE;
6301                spin_unlock_irq(shost->host_lock);
6302        }
6303        return sentplogi;
6304}
6305
6306static uint32_t
6307lpfc_rdp_res_link_service(struct fc_rdp_link_service_desc *desc,
6308                uint32_t word0)
6309{
6310
6311        desc->tag = cpu_to_be32(RDP_LINK_SERVICE_DESC_TAG);
6312        desc->payload.els_req = word0;
6313        desc->length = cpu_to_be32(sizeof(desc->payload));
6314
6315        return sizeof(struct fc_rdp_link_service_desc);
6316}
6317
6318static uint32_t
6319lpfc_rdp_res_sfp_desc(struct fc_rdp_sfp_desc *desc,
6320                uint8_t *page_a0, uint8_t *page_a2)
6321{
6322        uint16_t wavelength;
6323        uint16_t temperature;
6324        uint16_t rx_power;
6325        uint16_t tx_bias;
6326        uint16_t tx_power;
6327        uint16_t vcc;
6328        uint16_t flag = 0;
6329        struct sff_trasnceiver_codes_byte4 *trasn_code_byte4;
6330        struct sff_trasnceiver_codes_byte5 *trasn_code_byte5;
6331
6332        desc->tag = cpu_to_be32(RDP_SFP_DESC_TAG);
6333
6334        trasn_code_byte4 = (struct sff_trasnceiver_codes_byte4 *)
6335                        &page_a0[SSF_TRANSCEIVER_CODE_B4];
6336        trasn_code_byte5 = (struct sff_trasnceiver_codes_byte5 *)
6337                        &page_a0[SSF_TRANSCEIVER_CODE_B5];
6338
6339        if ((trasn_code_byte4->fc_sw_laser) ||
6340            (trasn_code_byte5->fc_sw_laser_sl) ||
6341            (trasn_code_byte5->fc_sw_laser_sn)) {  /* check if its short WL */
6342                flag |= (SFP_FLAG_PT_SWLASER << SFP_FLAG_PT_SHIFT);
6343        } else if (trasn_code_byte4->fc_lw_laser) {
6344                wavelength = (page_a0[SSF_WAVELENGTH_B1] << 8) |
6345                        page_a0[SSF_WAVELENGTH_B0];
6346                if (wavelength == SFP_WAVELENGTH_LC1310)
6347                        flag |= SFP_FLAG_PT_LWLASER_LC1310 << SFP_FLAG_PT_SHIFT;
6348                if (wavelength == SFP_WAVELENGTH_LL1550)
6349                        flag |= SFP_FLAG_PT_LWLASER_LL1550 << SFP_FLAG_PT_SHIFT;
6350        }
6351        /* check if its SFP+ */
6352        flag |= ((page_a0[SSF_IDENTIFIER] == SFF_PG0_IDENT_SFP) ?
6353                        SFP_FLAG_CT_SFP_PLUS : SFP_FLAG_CT_UNKNOWN)
6354                                        << SFP_FLAG_CT_SHIFT;
6355
6356        /* check if its OPTICAL */
6357        flag |= ((page_a0[SSF_CONNECTOR] == SFF_PG0_CONNECTOR_LC) ?
6358                        SFP_FLAG_IS_OPTICAL_PORT : 0)
6359                                        << SFP_FLAG_IS_OPTICAL_SHIFT;
6360
6361        temperature = (page_a2[SFF_TEMPERATURE_B1] << 8 |
6362                page_a2[SFF_TEMPERATURE_B0]);
6363        vcc = (page_a2[SFF_VCC_B1] << 8 |
6364                page_a2[SFF_VCC_B0]);
6365        tx_power = (page_a2[SFF_TXPOWER_B1] << 8 |
6366                page_a2[SFF_TXPOWER_B0]);
6367        tx_bias = (page_a2[SFF_TX_BIAS_CURRENT_B1] << 8 |
6368                page_a2[SFF_TX_BIAS_CURRENT_B0]);
6369        rx_power = (page_a2[SFF_RXPOWER_B1] << 8 |
6370                page_a2[SFF_RXPOWER_B0]);
6371        desc->sfp_info.temperature = cpu_to_be16(temperature);
6372        desc->sfp_info.rx_power = cpu_to_be16(rx_power);
6373        desc->sfp_info.tx_bias = cpu_to_be16(tx_bias);
6374        desc->sfp_info.tx_power = cpu_to_be16(tx_power);
6375        desc->sfp_info.vcc = cpu_to_be16(vcc);
6376
6377        desc->sfp_info.flags = cpu_to_be16(flag);
6378        desc->length = cpu_to_be32(sizeof(desc->sfp_info));
6379
6380        return sizeof(struct fc_rdp_sfp_desc);
6381}
6382
6383static uint32_t
6384lpfc_rdp_res_link_error(struct fc_rdp_link_error_status_desc *desc,
6385                READ_LNK_VAR *stat)
6386{
6387        uint32_t type;
6388
6389        desc->tag = cpu_to_be32(RDP_LINK_ERROR_STATUS_DESC_TAG);
6390
6391        type = VN_PT_PHY_PF_PORT << VN_PT_PHY_SHIFT;
6392
6393        desc->info.port_type = cpu_to_be32(type);
6394
6395        desc->info.link_status.link_failure_cnt =
6396                cpu_to_be32(stat->linkFailureCnt);
6397        desc->info.link_status.loss_of_synch_cnt =
6398                cpu_to_be32(stat->lossSyncCnt);
6399        desc->info.link_status.loss_of_signal_cnt =
6400                cpu_to_be32(stat->lossSignalCnt);
6401        desc->info.link_status.primitive_seq_proto_err =
6402                cpu_to_be32(stat->primSeqErrCnt);
6403        desc->info.link_status.invalid_trans_word =
6404                cpu_to_be32(stat->invalidXmitWord);
6405        desc->info.link_status.invalid_crc_cnt = cpu_to_be32(stat->crcCnt);
6406
6407        desc->length = cpu_to_be32(sizeof(desc->info));
6408
6409        return sizeof(struct fc_rdp_link_error_status_desc);
6410}
6411
6412static uint32_t
6413lpfc_rdp_res_bbc_desc(struct fc_rdp_bbc_desc *desc, READ_LNK_VAR *stat,
6414                      struct lpfc_vport *vport)
6415{
6416        uint32_t bbCredit;
6417
6418        desc->tag = cpu_to_be32(RDP_BBC_DESC_TAG);
6419
6420        bbCredit = vport->fc_sparam.cmn.bbCreditLsb |
6421                        (vport->fc_sparam.cmn.bbCreditMsb << 8);
6422        desc->bbc_info.port_bbc = cpu_to_be32(bbCredit);
6423        if (vport->phba->fc_topology != LPFC_TOPOLOGY_LOOP) {
6424                bbCredit = vport->phba->fc_fabparam.cmn.bbCreditLsb |
6425                        (vport->phba->fc_fabparam.cmn.bbCreditMsb << 8);
6426                desc->bbc_info.attached_port_bbc = cpu_to_be32(bbCredit);
6427        } else {
6428                desc->bbc_info.attached_port_bbc = 0;
6429        }
6430
6431        desc->bbc_info.rtt = 0;
6432        desc->length = cpu_to_be32(sizeof(desc->bbc_info));
6433
6434        return sizeof(struct fc_rdp_bbc_desc);
6435}
6436
6437static uint32_t
6438lpfc_rdp_res_oed_temp_desc(struct lpfc_hba *phba,
6439                           struct fc_rdp_oed_sfp_desc *desc, uint8_t *page_a2)
6440{
6441        uint32_t flags = 0;
6442
6443        desc->tag = cpu_to_be32(RDP_OED_DESC_TAG);
6444
6445        desc->oed_info.hi_alarm = page_a2[SSF_TEMP_HIGH_ALARM];
6446        desc->oed_info.lo_alarm = page_a2[SSF_TEMP_LOW_ALARM];
6447        desc->oed_info.hi_warning = page_a2[SSF_TEMP_HIGH_WARNING];
6448        desc->oed_info.lo_warning = page_a2[SSF_TEMP_LOW_WARNING];
6449
6450        if (phba->sfp_alarm & LPFC_TRANSGRESSION_HIGH_TEMPERATURE)
6451                flags |= RDP_OET_HIGH_ALARM;
6452        if (phba->sfp_alarm & LPFC_TRANSGRESSION_LOW_TEMPERATURE)
6453                flags |= RDP_OET_LOW_ALARM;
6454        if (phba->sfp_warning & LPFC_TRANSGRESSION_HIGH_TEMPERATURE)
6455                flags |= RDP_OET_HIGH_WARNING;
6456        if (phba->sfp_warning & LPFC_TRANSGRESSION_LOW_TEMPERATURE)
6457                flags |= RDP_OET_LOW_WARNING;
6458
6459        flags |= ((0xf & RDP_OED_TEMPERATURE) << RDP_OED_TYPE_SHIFT);
6460        desc->oed_info.function_flags = cpu_to_be32(flags);
6461        desc->length = cpu_to_be32(sizeof(desc->oed_info));
6462        return sizeof(struct fc_rdp_oed_sfp_desc);
6463}
6464
6465static uint32_t
6466lpfc_rdp_res_oed_voltage_desc(struct lpfc_hba *phba,
6467                              struct fc_rdp_oed_sfp_desc *desc,
6468                              uint8_t *page_a2)
6469{
6470        uint32_t flags = 0;
6471
6472        desc->tag = cpu_to_be32(RDP_OED_DESC_TAG);
6473
6474        desc->oed_info.hi_alarm = page_a2[SSF_VOLTAGE_HIGH_ALARM];
6475        desc->oed_info.lo_alarm = page_a2[SSF_VOLTAGE_LOW_ALARM];
6476        desc->oed_info.hi_warning = page_a2[SSF_VOLTAGE_HIGH_WARNING];
6477        desc->oed_info.lo_warning = page_a2[SSF_VOLTAGE_LOW_WARNING];
6478
6479        if (phba->sfp_alarm & LPFC_TRANSGRESSION_HIGH_VOLTAGE)
6480                flags |= RDP_OET_HIGH_ALARM;
6481        if (phba->sfp_alarm & LPFC_TRANSGRESSION_LOW_VOLTAGE)
6482                flags |= RDP_OET_LOW_ALARM;
6483        if (phba->sfp_warning & LPFC_TRANSGRESSION_HIGH_VOLTAGE)
6484                flags |= RDP_OET_HIGH_WARNING;
6485        if (phba->sfp_warning & LPFC_TRANSGRESSION_LOW_VOLTAGE)
6486                flags |= RDP_OET_LOW_WARNING;
6487
6488        flags |= ((0xf & RDP_OED_VOLTAGE) << RDP_OED_TYPE_SHIFT);
6489        desc->oed_info.function_flags = cpu_to_be32(flags);
6490        desc->length = cpu_to_be32(sizeof(desc->oed_info));
6491        return sizeof(struct fc_rdp_oed_sfp_desc);
6492}
6493
6494static uint32_t
6495lpfc_rdp_res_oed_txbias_desc(struct lpfc_hba *phba,
6496                             struct fc_rdp_oed_sfp_desc *desc,
6497                             uint8_t *page_a2)
6498{
6499        uint32_t flags = 0;
6500
6501        desc->tag = cpu_to_be32(RDP_OED_DESC_TAG);
6502
6503        desc->oed_info.hi_alarm = page_a2[SSF_BIAS_HIGH_ALARM];
6504        desc->oed_info.lo_alarm = page_a2[SSF_BIAS_LOW_ALARM];
6505        desc->oed_info.hi_warning = page_a2[SSF_BIAS_HIGH_WARNING];
6506        desc->oed_info.lo_warning = page_a2[SSF_BIAS_LOW_WARNING];
6507
6508        if (phba->sfp_alarm & LPFC_TRANSGRESSION_HIGH_TXBIAS)
6509                flags |= RDP_OET_HIGH_ALARM;
6510        if (phba->sfp_alarm & LPFC_TRANSGRESSION_LOW_TXBIAS)
6511                flags |= RDP_OET_LOW_ALARM;
6512        if (phba->sfp_warning & LPFC_TRANSGRESSION_HIGH_TXBIAS)
6513                flags |= RDP_OET_HIGH_WARNING;
6514        if (phba->sfp_warning & LPFC_TRANSGRESSION_LOW_TXBIAS)
6515                flags |= RDP_OET_LOW_WARNING;
6516
6517        flags |= ((0xf & RDP_OED_TXBIAS) << RDP_OED_TYPE_SHIFT);
6518        desc->oed_info.function_flags = cpu_to_be32(flags);
6519        desc->length = cpu_to_be32(sizeof(desc->oed_info));
6520        return sizeof(struct fc_rdp_oed_sfp_desc);
6521}
6522
6523static uint32_t
6524lpfc_rdp_res_oed_txpower_desc(struct lpfc_hba *phba,
6525                              struct fc_rdp_oed_sfp_desc *desc,
6526                              uint8_t *page_a2)
6527{
6528        uint32_t flags = 0;
6529
6530        desc->tag = cpu_to_be32(RDP_OED_DESC_TAG);
6531
6532        desc->oed_info.hi_alarm = page_a2[SSF_TXPOWER_HIGH_ALARM];
6533        desc->oed_info.lo_alarm = page_a2[SSF_TXPOWER_LOW_ALARM];
6534        desc->oed_info.hi_warning = page_a2[SSF_TXPOWER_HIGH_WARNING];
6535        desc->oed_info.lo_warning = page_a2[SSF_TXPOWER_LOW_WARNING];
6536
6537        if (phba->sfp_alarm & LPFC_TRANSGRESSION_HIGH_TXPOWER)
6538                flags |= RDP_OET_HIGH_ALARM;
6539        if (phba->sfp_alarm & LPFC_TRANSGRESSION_LOW_TXPOWER)
6540                flags |= RDP_OET_LOW_ALARM;
6541        if (phba->sfp_warning & LPFC_TRANSGRESSION_HIGH_TXPOWER)
6542                flags |= RDP_OET_HIGH_WARNING;
6543        if (phba->sfp_warning & LPFC_TRANSGRESSION_LOW_TXPOWER)
6544                flags |= RDP_OET_LOW_WARNING;
6545
6546        flags |= ((0xf & RDP_OED_TXPOWER) << RDP_OED_TYPE_SHIFT);
6547        desc->oed_info.function_flags = cpu_to_be32(flags);
6548        desc->length = cpu_to_be32(sizeof(desc->oed_info));
6549        return sizeof(struct fc_rdp_oed_sfp_desc);
6550}
6551
6552
6553static uint32_t
6554lpfc_rdp_res_oed_rxpower_desc(struct lpfc_hba *phba,
6555                              struct fc_rdp_oed_sfp_desc *desc,
6556                              uint8_t *page_a2)
6557{
6558        uint32_t flags = 0;
6559
6560        desc->tag = cpu_to_be32(RDP_OED_DESC_TAG);
6561
6562        desc->oed_info.hi_alarm = page_a2[SSF_RXPOWER_HIGH_ALARM];
6563        desc->oed_info.lo_alarm = page_a2[SSF_RXPOWER_LOW_ALARM];
6564        desc->oed_info.hi_warning = page_a2[SSF_RXPOWER_HIGH_WARNING];
6565        desc->oed_info.lo_warning = page_a2[SSF_RXPOWER_LOW_WARNING];
6566
6567        if (phba->sfp_alarm & LPFC_TRANSGRESSION_HIGH_RXPOWER)
6568                flags |= RDP_OET_HIGH_ALARM;
6569        if (phba->sfp_alarm & LPFC_TRANSGRESSION_LOW_RXPOWER)
6570                flags |= RDP_OET_LOW_ALARM;
6571        if (phba->sfp_warning & LPFC_TRANSGRESSION_HIGH_RXPOWER)
6572                flags |= RDP_OET_HIGH_WARNING;
6573        if (phba->sfp_warning & LPFC_TRANSGRESSION_LOW_RXPOWER)
6574                flags |= RDP_OET_LOW_WARNING;
6575
6576        flags |= ((0xf & RDP_OED_RXPOWER) << RDP_OED_TYPE_SHIFT);
6577        desc->oed_info.function_flags = cpu_to_be32(flags);
6578        desc->length = cpu_to_be32(sizeof(desc->oed_info));
6579        return sizeof(struct fc_rdp_oed_sfp_desc);
6580}
6581
6582static uint32_t
6583lpfc_rdp_res_opd_desc(struct fc_rdp_opd_sfp_desc *desc,
6584                      uint8_t *page_a0, struct lpfc_vport *vport)
6585{
6586        desc->tag = cpu_to_be32(RDP_OPD_DESC_TAG);
6587        memcpy(desc->opd_info.vendor_name, &page_a0[SSF_VENDOR_NAME], 16);
6588        memcpy(desc->opd_info.model_number, &page_a0[SSF_VENDOR_PN], 16);
6589        memcpy(desc->opd_info.serial_number, &page_a0[SSF_VENDOR_SN], 16);
6590        memcpy(desc->opd_info.revision, &page_a0[SSF_VENDOR_REV], 4);
6591        memcpy(desc->opd_info.date, &page_a0[SSF_DATE_CODE], 8);
6592        desc->length = cpu_to_be32(sizeof(desc->opd_info));
6593        return sizeof(struct fc_rdp_opd_sfp_desc);
6594}
6595
6596static uint32_t
6597lpfc_rdp_res_fec_desc(struct fc_fec_rdp_desc *desc, READ_LNK_VAR *stat)
6598{
6599        if (bf_get(lpfc_read_link_stat_gec2, stat) == 0)
6600                return 0;
6601        desc->tag = cpu_to_be32(RDP_FEC_DESC_TAG);
6602
6603        desc->info.CorrectedBlocks =
6604                cpu_to_be32(stat->fecCorrBlkCount);
6605        desc->info.UncorrectableBlocks =
6606                cpu_to_be32(stat->fecUncorrBlkCount);
6607
6608        desc->length = cpu_to_be32(sizeof(desc->info));
6609
6610        return sizeof(struct fc_fec_rdp_desc);
6611}
6612
6613static uint32_t
6614lpfc_rdp_res_speed(struct fc_rdp_port_speed_desc *desc, struct lpfc_hba *phba)
6615{
6616        uint16_t rdp_cap = 0;
6617        uint16_t rdp_speed;
6618
6619        desc->tag = cpu_to_be32(RDP_PORT_SPEED_DESC_TAG);
6620
6621        switch (phba->fc_linkspeed) {
6622        case LPFC_LINK_SPEED_1GHZ:
6623                rdp_speed = RDP_PS_1GB;
6624                break;
6625        case LPFC_LINK_SPEED_2GHZ:
6626                rdp_speed = RDP_PS_2GB;
6627                break;
6628        case LPFC_LINK_SPEED_4GHZ:
6629                rdp_speed = RDP_PS_4GB;
6630                break;
6631        case LPFC_LINK_SPEED_8GHZ:
6632                rdp_speed = RDP_PS_8GB;
6633                break;
6634        case LPFC_LINK_SPEED_10GHZ:
6635                rdp_speed = RDP_PS_10GB;
6636                break;
6637        case LPFC_LINK_SPEED_16GHZ:
6638                rdp_speed = RDP_PS_16GB;
6639                break;
6640        case LPFC_LINK_SPEED_32GHZ:
6641                rdp_speed = RDP_PS_32GB;
6642                break;
6643        case LPFC_LINK_SPEED_64GHZ:
6644                rdp_speed = RDP_PS_64GB;
6645                break;
6646        case LPFC_LINK_SPEED_128GHZ:
6647                rdp_speed = RDP_PS_128GB;
6648                break;
6649        case LPFC_LINK_SPEED_256GHZ:
6650                rdp_speed = RDP_PS_256GB;
6651                break;
6652        default:
6653                rdp_speed = RDP_PS_UNKNOWN;
6654                break;
6655        }
6656
6657        desc->info.port_speed.speed = cpu_to_be16(rdp_speed);
6658
6659        if (phba->lmt & LMT_256Gb)
6660                rdp_cap |= RDP_PS_256GB;
6661        if (phba->lmt & LMT_128Gb)
6662                rdp_cap |= RDP_PS_128GB;
6663        if (phba->lmt & LMT_64Gb)
6664                rdp_cap |= RDP_PS_64GB;
6665        if (phba->lmt & LMT_32Gb)
6666                rdp_cap |= RDP_PS_32GB;
6667        if (phba->lmt & LMT_16Gb)
6668                rdp_cap |= RDP_PS_16GB;
6669        if (phba->lmt & LMT_10Gb)
6670                rdp_cap |= RDP_PS_10GB;
6671        if (phba->lmt & LMT_8Gb)
6672                rdp_cap |= RDP_PS_8GB;
6673        if (phba->lmt & LMT_4Gb)
6674                rdp_cap |= RDP_PS_4GB;
6675        if (phba->lmt & LMT_2Gb)
6676                rdp_cap |= RDP_PS_2GB;
6677        if (phba->lmt & LMT_1Gb)
6678                rdp_cap |= RDP_PS_1GB;
6679
6680        if (rdp_cap == 0)
6681                rdp_cap = RDP_CAP_UNKNOWN;
6682        if (phba->cfg_link_speed != LPFC_USER_LINK_SPEED_AUTO)
6683                rdp_cap |= RDP_CAP_USER_CONFIGURED;
6684
6685        desc->info.port_speed.capabilities = cpu_to_be16(rdp_cap);
6686        desc->length = cpu_to_be32(sizeof(desc->info));
6687        return sizeof(struct fc_rdp_port_speed_desc);
6688}
6689
6690static uint32_t
6691lpfc_rdp_res_diag_port_names(struct fc_rdp_port_name_desc *desc,
6692                struct lpfc_vport *vport)
6693{
6694
6695        desc->tag = cpu_to_be32(RDP_PORT_NAMES_DESC_TAG);
6696
6697        memcpy(desc->port_names.wwnn, &vport->fc_nodename,
6698                        sizeof(desc->port_names.wwnn));
6699
6700        memcpy(desc->port_names.wwpn, &vport->fc_portname,
6701                        sizeof(desc->port_names.wwpn));
6702
6703        desc->length = cpu_to_be32(sizeof(desc->port_names));
6704        return sizeof(struct fc_rdp_port_name_desc);
6705}
6706
6707static uint32_t
6708lpfc_rdp_res_attach_port_names(struct fc_rdp_port_name_desc *desc,
6709                struct lpfc_vport *vport, struct lpfc_nodelist *ndlp)
6710{
6711
6712        desc->tag = cpu_to_be32(RDP_PORT_NAMES_DESC_TAG);
6713        if (vport->fc_flag & FC_FABRIC) {
6714                memcpy(desc->port_names.wwnn, &vport->fabric_nodename,
6715                       sizeof(desc->port_names.wwnn));
6716
6717                memcpy(desc->port_names.wwpn, &vport->fabric_portname,
6718                       sizeof(desc->port_names.wwpn));
6719        } else {  /* Point to Point */
6720                memcpy(desc->port_names.wwnn, &ndlp->nlp_nodename,
6721                       sizeof(desc->port_names.wwnn));
6722
6723                memcpy(desc->port_names.wwpn, &ndlp->nlp_portname,
6724                       sizeof(desc->port_names.wwpn));
6725        }
6726
6727        desc->length = cpu_to_be32(sizeof(desc->port_names));
6728        return sizeof(struct fc_rdp_port_name_desc);
6729}
6730
6731static void
6732lpfc_els_rdp_cmpl(struct lpfc_hba *phba, struct lpfc_rdp_context *rdp_context,
6733                int status)
6734{
6735        struct lpfc_nodelist *ndlp = rdp_context->ndlp;
6736        struct lpfc_vport *vport = ndlp->vport;
6737        struct lpfc_iocbq *elsiocb;
6738        struct ulp_bde64 *bpl;
6739        IOCB_t *icmd;
6740        uint8_t *pcmd;
6741        struct ls_rjt *stat;
6742        struct fc_rdp_res_frame *rdp_res;
6743        uint32_t cmdsize, len;
6744        uint16_t *flag_ptr;
6745        int rc;
6746
6747        if (status != SUCCESS)
6748                goto error;
6749
6750        /* This will change once we know the true size of the RDP payload */
6751        cmdsize = sizeof(struct fc_rdp_res_frame);
6752
6753        elsiocb = lpfc_prep_els_iocb(vport, 0, cmdsize,
6754                        lpfc_max_els_tries, rdp_context->ndlp,
6755                        rdp_context->ndlp->nlp_DID, ELS_CMD_ACC);
6756        if (!elsiocb)
6757                goto free_rdp_context;
6758
6759        icmd = &elsiocb->iocb;
6760        icmd->ulpContext = rdp_context->rx_id;
6761        icmd->unsli3.rcvsli3.ox_id = rdp_context->ox_id;
6762
6763        lpfc_printf_vlog(vport, KERN_INFO, LOG_ELS,
6764                        "2171 Xmit RDP response tag x%x xri x%x, "
6765                        "did x%x, nlp_flag x%x, nlp_state x%x, rpi x%x",
6766                        elsiocb->iotag, elsiocb->iocb.ulpContext,
6767                        ndlp->nlp_DID, ndlp->nlp_flag, ndlp->nlp_state,
6768                        ndlp->nlp_rpi);
6769        rdp_res = (struct fc_rdp_res_frame *)
6770                (((struct lpfc_dmabuf *) elsiocb->context2)->virt);
6771        pcmd = (uint8_t *) (((struct lpfc_dmabuf *) elsiocb->context2)->virt);
6772        memset(pcmd, 0, sizeof(struct fc_rdp_res_frame));
6773        *((uint32_t *) (pcmd)) = ELS_CMD_ACC;
6774
6775        /* Update Alarm and Warning */
6776        flag_ptr = (uint16_t *)(rdp_context->page_a2 + SSF_ALARM_FLAGS);
6777        phba->sfp_alarm |= *flag_ptr;
6778        flag_ptr = (uint16_t *)(rdp_context->page_a2 + SSF_WARNING_FLAGS);
6779        phba->sfp_warning |= *flag_ptr;
6780
6781        /* For RDP payload */
6782        len = 8;
6783        len += lpfc_rdp_res_link_service((struct fc_rdp_link_service_desc *)
6784                                         (len + pcmd), ELS_CMD_RDP);
6785
6786        len += lpfc_rdp_res_sfp_desc((struct fc_rdp_sfp_desc *)(len + pcmd),
6787                        rdp_context->page_a0, rdp_context->page_a2);
6788        len += lpfc_rdp_res_speed((struct fc_rdp_port_speed_desc *)(len + pcmd),
6789                                  phba);
6790        len += lpfc_rdp_res_link_error((struct fc_rdp_link_error_status_desc *)
6791                                       (len + pcmd), &rdp_context->link_stat);
6792        len += lpfc_rdp_res_diag_port_names((struct fc_rdp_port_name_desc *)
6793                                             (len + pcmd), vport);
6794        len += lpfc_rdp_res_attach_port_names((struct fc_rdp_port_name_desc *)
6795                                        (len + pcmd), vport, ndlp);
6796        len += lpfc_rdp_res_fec_desc((struct fc_fec_rdp_desc *)(len + pcmd),
6797                        &rdp_context->link_stat);
6798        len += lpfc_rdp_res_bbc_desc((struct fc_rdp_bbc_desc *)(len + pcmd),
6799                                     &rdp_context->link_stat, vport);
6800        len += lpfc_rdp_res_oed_temp_desc(phba,
6801                                (struct fc_rdp_oed_sfp_desc *)(len + pcmd),
6802                                rdp_context->page_a2);
6803        len += lpfc_rdp_res_oed_voltage_desc(phba,
6804                                (struct fc_rdp_oed_sfp_desc *)(len + pcmd),
6805                                rdp_context->page_a2);
6806        len += lpfc_rdp_res_oed_txbias_desc(phba,
6807                                (struct fc_rdp_oed_sfp_desc *)(len + pcmd),
6808                                rdp_context->page_a2);
6809        len += lpfc_rdp_res_oed_txpower_desc(phba,
6810                                (struct fc_rdp_oed_sfp_desc *)(len + pcmd),
6811                                rdp_context->page_a2);
6812        len += lpfc_rdp_res_oed_rxpower_desc(phba,
6813                                (struct fc_rdp_oed_sfp_desc *)(len + pcmd),
6814                                rdp_context->page_a2);
6815        len += lpfc_rdp_res_opd_desc((struct fc_rdp_opd_sfp_desc *)(len + pcmd),
6816                                     rdp_context->page_a0, vport);
6817
6818        rdp_res->length = cpu_to_be32(len - 8);
6819        elsiocb->iocb_cmpl = lpfc_cmpl_els_rsp;
6820
6821        /* Now that we know the true size of the payload, update the BPL */
6822        bpl = (struct ulp_bde64 *)
6823                (((struct lpfc_dmabuf *)(elsiocb->context3))->virt);
6824        bpl->tus.f.bdeSize = len;
6825        bpl->tus.f.bdeFlags = 0;
6826        bpl->tus.w = le32_to_cpu(bpl->tus.w);
6827
6828        phba->fc_stat.elsXmitACC++;
6829        elsiocb->context1 = lpfc_nlp_get(ndlp);
6830        if (!elsiocb->context1) {
6831                lpfc_els_free_iocb(phba, elsiocb);
6832                goto free_rdp_context;
6833        }
6834
6835        rc = lpfc_sli_issue_iocb(phba, LPFC_ELS_RING, elsiocb, 0);
6836        if (rc == IOCB_ERROR) {
6837                lpfc_els_free_iocb(phba, elsiocb);
6838                lpfc_nlp_put(ndlp);
6839        }
6840
6841        goto free_rdp_context;
6842
6843error:
6844        cmdsize = 2 * sizeof(uint32_t);
6845        elsiocb = lpfc_prep_els_iocb(vport, 0, cmdsize, lpfc_max_els_tries,
6846                        ndlp, ndlp->nlp_DID, ELS_CMD_LS_RJT);
6847        if (!elsiocb)
6848                goto free_rdp_context;
6849
6850        icmd = &elsiocb->iocb;
6851        icmd->ulpContext = rdp_context->rx_id;
6852        icmd->unsli3.rcvsli3.ox_id = rdp_context->ox_id;
6853        pcmd = (uint8_t *) (((struct lpfc_dmabuf *) elsiocb->context2)->virt);
6854
6855        *((uint32_t *) (pcmd)) = ELS_CMD_LS_RJT;
6856        stat = (struct ls_rjt *)(pcmd + sizeof(uint32_t));
6857        stat->un.b.lsRjtRsnCode = LSRJT_UNABLE_TPC;
6858
6859        phba->fc_stat.elsXmitLSRJT++;
6860        elsiocb->iocb_cmpl = lpfc_cmpl_els_rsp;
6861        elsiocb->context1 = lpfc_nlp_get(ndlp);
6862        if (!elsiocb->context1) {
6863                lpfc_els_free_iocb(phba, elsiocb);
6864                goto free_rdp_context;
6865        }
6866
6867        rc = lpfc_sli_issue_iocb(phba, LPFC_ELS_RING, elsiocb, 0);
6868        if (rc == IOCB_ERROR) {
6869                lpfc_els_free_iocb(phba, elsiocb);
6870                lpfc_nlp_put(ndlp);
6871        }
6872
6873free_rdp_context:
6874        /* This reference put is for the original unsolicited RDP. If the
6875         * iocb prep failed, there is no reference to remove.
6876         */
6877        lpfc_nlp_put(ndlp);
6878        kfree(rdp_context);
6879}
6880
6881static int
6882lpfc_get_rdp_info(struct lpfc_hba *phba, struct lpfc_rdp_context *rdp_context)
6883{
6884        LPFC_MBOXQ_t *mbox = NULL;
6885        int rc;
6886
6887        mbox = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL);
6888        if (!mbox) {
6889                lpfc_printf_log(phba, KERN_WARNING, LOG_MBOX | LOG_ELS,
6890                                "7105 failed to allocate mailbox memory");
6891                return 1;
6892        }
6893
6894        if (lpfc_sli4_dump_page_a0(phba, mbox))
6895                goto prep_mbox_fail;
6896        mbox->vport = rdp_context->ndlp->vport;
6897        mbox->mbox_cmpl = lpfc_mbx_cmpl_rdp_page_a0;
6898        mbox->ctx_ndlp = (struct lpfc_rdp_context *)rdp_context;
6899        rc = lpfc_sli_issue_mbox(phba, mbox, MBX_NOWAIT);
6900        if (rc == MBX_NOT_FINISHED)
6901                goto issue_mbox_fail;
6902
6903        return 0;
6904
6905prep_mbox_fail:
6906issue_mbox_fail:
6907        mempool_free(mbox, phba->mbox_mem_pool);
6908        return 1;
6909}
6910
6911/*
6912 * lpfc_els_rcv_rdp - Process an unsolicited RDP ELS.
6913 * @vport: pointer to a host virtual N_Port data structure.
6914 * @cmdiocb: pointer to lpfc command iocb data structure.
6915 * @ndlp: pointer to a node-list data structure.
6916 *
6917 * This routine processes an unsolicited RDP(Read Diagnostic Parameters)
6918 * IOCB. First, the payload of the unsolicited RDP is checked.
6919 * Then it will (1) send MBX_DUMP_MEMORY, Embedded DMP_LMSD sub command TYPE-3
6920 * for Page A0, (2) send MBX_DUMP_MEMORY, DMP_LMSD for Page A2,
6921 * (3) send MBX_READ_LNK_STAT to get link stat, (4) Call lpfc_els_rdp_cmpl
6922 * gather all data and send RDP response.
6923 *
6924 * Return code
6925 *   0 - Sent the acc response
6926 *   1 - Sent the reject response.
6927 */
6928static int
6929lpfc_els_rcv_rdp(struct lpfc_vport *vport, struct lpfc_iocbq *cmdiocb,
6930                struct lpfc_nodelist *ndlp)
6931{
6932        struct lpfc_hba *phba = vport->phba;
6933        struct lpfc_dmabuf *pcmd;
6934        uint8_t rjt_err, rjt_expl = LSEXP_NOTHING_MORE;
6935        struct fc_rdp_req_frame *rdp_req;
6936        struct lpfc_rdp_context *rdp_context;
6937        IOCB_t *cmd = NULL;
6938        struct ls_rjt stat;
6939
6940        if (phba->sli_rev < LPFC_SLI_REV4 ||
6941            bf_get(lpfc_sli_intf_if_type, &phba->sli4_hba.sli_intf) <
6942                                                LPFC_SLI_INTF_IF_TYPE_2) {
6943                rjt_err = LSRJT_UNABLE_TPC;
6944                rjt_expl = LSEXP_REQ_UNSUPPORTED;
6945                goto error;
6946        }
6947
6948        if (phba->sli_rev < LPFC_SLI_REV4 || (phba->hba_flag & HBA_FCOE_MODE)) {
6949                rjt_err = LSRJT_UNABLE_TPC;
6950                rjt_expl = LSEXP_REQ_UNSUPPORTED;
6951                goto error;
6952        }
6953
6954        pcmd = (struct lpfc_dmabuf *) cmdiocb->context2;
6955        rdp_req = (struct fc_rdp_req_frame *) pcmd->virt;
6956
6957        lpfc_printf_vlog(vport, KERN_INFO, LOG_ELS,
6958                         "2422 ELS RDP Request "
6959                         "dec len %d tag x%x port_id %d len %d\n",
6960                         be32_to_cpu(rdp_req->rdp_des_length),
6961                         be32_to_cpu(rdp_req->nport_id_desc.tag),
6962                         be32_to_cpu(rdp_req->nport_id_desc.nport_id),
6963                         be32_to_cpu(rdp_req->nport_id_desc.length));
6964
6965        if (sizeof(struct fc_rdp_nport_desc) !=
6966                        be32_to_cpu(rdp_req->rdp_des_length))
6967                goto rjt_logerr;
6968        if (RDP_N_PORT_DESC_TAG != be32_to_cpu(rdp_req->nport_id_desc.tag))
6969                goto rjt_logerr;
6970        if (RDP_NPORT_ID_SIZE !=
6971                        be32_to_cpu(rdp_req->nport_id_desc.length))
6972                goto rjt_logerr;
6973        rdp_context = kzalloc(sizeof(struct lpfc_rdp_context), GFP_KERNEL);
6974        if (!rdp_context) {
6975                rjt_err = LSRJT_UNABLE_TPC;
6976                goto error;
6977        }
6978
6979        cmd = &cmdiocb->iocb;
6980        rdp_context->ndlp = lpfc_nlp_get(ndlp);
6981        if (!rdp_context->ndlp) {
6982                kfree(rdp_context);
6983                rjt_err = LSRJT_UNABLE_TPC;
6984                goto error;
6985        }
6986        rdp_context->ox_id = cmd->unsli3.rcvsli3.ox_id;
6987        rdp_context->rx_id = cmd->ulpContext;
6988        rdp_context->cmpl = lpfc_els_rdp_cmpl;
6989        if (lpfc_get_rdp_info(phba, rdp_context)) {
6990                lpfc_printf_vlog(ndlp->vport, KERN_WARNING, LOG_ELS,
6991                                 "2423 Unable to send mailbox");
6992                kfree(rdp_context);
6993                rjt_err = LSRJT_UNABLE_TPC;
6994                lpfc_nlp_put(ndlp);
6995                goto error;
6996        }
6997
6998        return 0;
6999
7000rjt_logerr:
7001        rjt_err = LSRJT_LOGICAL_ERR;
7002
7003error:
7004        memset(&stat, 0, sizeof(stat));
7005        stat.un.b.lsRjtRsnCode = rjt_err;
7006        stat.un.b.lsRjtRsnCodeExp = rjt_expl;
7007        lpfc_els_rsp_reject(vport, stat.un.lsRjtError, cmdiocb, ndlp, NULL);
7008        return 1;
7009}
7010
7011
7012static void
7013lpfc_els_lcb_rsp(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmb)
7014{
7015        MAILBOX_t *mb;
7016        IOCB_t *icmd;
7017        uint8_t *pcmd;
7018        struct lpfc_iocbq *elsiocb;
7019        struct lpfc_nodelist *ndlp;
7020        struct ls_rjt *stat;
7021        union lpfc_sli4_cfg_shdr *shdr;
7022        struct lpfc_lcb_context *lcb_context;
7023        struct fc_lcb_res_frame *lcb_res;
7024        uint32_t cmdsize, shdr_status, shdr_add_status;
7025        int rc;
7026
7027        mb = &pmb->u.mb;
7028        lcb_context = (struct lpfc_lcb_context *)pmb->ctx_ndlp;
7029        ndlp = lcb_context->ndlp;
7030        pmb->ctx_ndlp = NULL;
7031        pmb->ctx_buf = NULL;
7032
7033        shdr = (union lpfc_sli4_cfg_shdr *)
7034                        &pmb->u.mqe.un.beacon_config.header.cfg_shdr;
7035        shdr_status = bf_get(lpfc_mbox_hdr_status, &shdr->response);
7036        shdr_add_status = bf_get(lpfc_mbox_hdr_add_status, &shdr->response);
7037
7038        lpfc_printf_log(phba, KERN_INFO, LOG_MBOX,
7039                                "0194 SET_BEACON_CONFIG mailbox "
7040                                "completed with status x%x add_status x%x,"
7041                                " mbx status x%x\n",
7042                                shdr_status, shdr_add_status, mb->mbxStatus);
7043
7044        if ((mb->mbxStatus != MBX_SUCCESS) || shdr_status ||
7045            (shdr_add_status == ADD_STATUS_OPERATION_ALREADY_ACTIVE) ||
7046            (shdr_add_status == ADD_STATUS_INVALID_REQUEST)) {
7047                mempool_free(pmb, phba->mbox_mem_pool);
7048                goto error;
7049        }
7050
7051        mempool_free(pmb, phba->mbox_mem_pool);
7052        cmdsize = sizeof(struct fc_lcb_res_frame);
7053        elsiocb = lpfc_prep_els_iocb(phba->pport, 0, cmdsize,
7054                        lpfc_max_els_tries, ndlp,
7055                        ndlp->nlp_DID, ELS_CMD_ACC);
7056
7057        /* Decrement the ndlp reference count from previous mbox command */
7058        lpfc_nlp_put(ndlp);
7059
7060        if (!elsiocb)
7061                goto free_lcb_context;
7062
7063        lcb_res = (struct fc_lcb_res_frame *)
7064                (((struct lpfc_dmabuf *)elsiocb->context2)->virt);
7065
7066        memset(lcb_res, 0, sizeof(struct fc_lcb_res_frame));
7067        icmd = &elsiocb->iocb;
7068        icmd->ulpContext = lcb_context->rx_id;
7069        icmd->unsli3.rcvsli3.ox_id = lcb_context->ox_id;
7070
7071        pcmd = (uint8_t *)(((struct lpfc_dmabuf *)elsiocb->context2)->virt);
7072        *((uint32_t *)(pcmd)) = ELS_CMD_ACC;
7073        lcb_res->lcb_sub_command = lcb_context->sub_command;
7074        lcb_res->lcb_type = lcb_context->type;
7075        lcb_res->capability = lcb_context->capability;
7076        lcb_res->lcb_frequency = lcb_context->frequency;
7077        lcb_res->lcb_duration = lcb_context->duration;
7078        elsiocb->iocb_cmpl = lpfc_cmpl_els_rsp;
7079        phba->fc_stat.elsXmitACC++;
7080
7081        elsiocb->context1 = lpfc_nlp_get(ndlp);
7082        if (!elsiocb->context1) {
7083                lpfc_els_free_iocb(phba, elsiocb);
7084                goto out;
7085        }
7086
7087        rc = lpfc_sli_issue_iocb(phba, LPFC_ELS_RING, elsiocb, 0);
7088        if (rc == IOCB_ERROR) {
7089                lpfc_els_free_iocb(phba, elsiocb);
7090                lpfc_nlp_put(ndlp);
7091        }
7092 out:
7093        kfree(lcb_context);
7094        return;
7095
7096error:
7097        cmdsize = sizeof(struct fc_lcb_res_frame);
7098        elsiocb = lpfc_prep_els_iocb(phba->pport, 0, cmdsize,
7099                        lpfc_max_els_tries, ndlp,
7100                        ndlp->nlp_DID, ELS_CMD_LS_RJT);
7101        lpfc_nlp_put(ndlp);
7102        if (!elsiocb)
7103                goto free_lcb_context;
7104
7105        icmd = &elsiocb->iocb;
7106        icmd->ulpContext = lcb_context->rx_id;
7107        icmd->unsli3.rcvsli3.ox_id = lcb_context->ox_id;
7108        pcmd = (uint8_t *)(((struct lpfc_dmabuf *)elsiocb->context2)->virt);
7109
7110        *((uint32_t *)(pcmd)) = ELS_CMD_LS_RJT;
7111        stat = (struct ls_rjt *)(pcmd + sizeof(uint32_t));
7112        stat->un.b.lsRjtRsnCode = LSRJT_UNABLE_TPC;
7113
7114        if (shdr_add_status == ADD_STATUS_OPERATION_ALREADY_ACTIVE)
7115                stat->un.b.lsRjtRsnCodeExp = LSEXP_CMD_IN_PROGRESS;
7116
7117        elsiocb->iocb_cmpl = lpfc_cmpl_els_rsp;
7118        phba->fc_stat.elsXmitLSRJT++;
7119        elsiocb->context1 = lpfc_nlp_get(ndlp);
7120        if (!elsiocb->context1) {
7121                lpfc_els_free_iocb(phba, elsiocb);
7122                goto free_lcb_context;
7123        }
7124
7125        rc = lpfc_sli_issue_iocb(phba, LPFC_ELS_RING, elsiocb, 0);
7126        if (rc == IOCB_ERROR) {
7127                lpfc_els_free_iocb(phba, elsiocb);
7128                lpfc_nlp_put(ndlp);
7129        }
7130free_lcb_context:
7131        kfree(lcb_context);
7132}
7133
7134static int
7135lpfc_sli4_set_beacon(struct lpfc_vport *vport,
7136                     struct lpfc_lcb_context *lcb_context,
7137                     uint32_t beacon_state)
7138{
7139        struct lpfc_hba *phba = vport->phba;
7140        union lpfc_sli4_cfg_shdr *cfg_shdr;
7141        LPFC_MBOXQ_t *mbox = NULL;
7142        uint32_t len;
7143        int rc;
7144
7145        mbox = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL);
7146        if (!mbox)
7147                return 1;
7148
7149        cfg_shdr = &mbox->u.mqe.un.sli4_config.header.cfg_shdr;
7150        len = sizeof(struct lpfc_mbx_set_beacon_config) -
7151                sizeof(struct lpfc_sli4_cfg_mhdr);
7152        lpfc_sli4_config(phba, mbox, LPFC_MBOX_SUBSYSTEM_COMMON,
7153                         LPFC_MBOX_OPCODE_SET_BEACON_CONFIG, len,
7154                         LPFC_SLI4_MBX_EMBED);
7155        mbox->ctx_ndlp = (void *)lcb_context;
7156        mbox->vport = phba->pport;
7157        mbox->mbox_cmpl = lpfc_els_lcb_rsp;
7158        bf_set(lpfc_mbx_set_beacon_port_num, &mbox->u.mqe.un.beacon_config,
7159               phba->sli4_hba.physical_port);
7160        bf_set(lpfc_mbx_set_beacon_state, &mbox->u.mqe.un.beacon_config,
7161               beacon_state);
7162        mbox->u.mqe.un.beacon_config.word5 = 0;         /* Reserved */
7163
7164        /*
7165         *      Check bv1s bit before issuing the mailbox
7166         *      if bv1s == 1, LCB V1 supported
7167         *      else, LCB V0 supported
7168         */
7169
7170        if (phba->sli4_hba.pc_sli4_params.bv1s) {
7171                /* COMMON_SET_BEACON_CONFIG_V1 */
7172                cfg_shdr->request.word9 = BEACON_VERSION_V1;
7173                lcb_context->capability |= LCB_CAPABILITY_DURATION;
7174                bf_set(lpfc_mbx_set_beacon_port_type,
7175                       &mbox->u.mqe.un.beacon_config, 0);
7176                bf_set(lpfc_mbx_set_beacon_duration_v1,
7177                       &mbox->u.mqe.un.beacon_config,
7178                       be16_to_cpu(lcb_context->duration));
7179        } else {
7180                /* COMMON_SET_BEACON_CONFIG_V0 */
7181                if (be16_to_cpu(lcb_context->duration) != 0) {
7182                        mempool_free(mbox, phba->mbox_mem_pool);
7183                        return 1;
7184                }
7185                cfg_shdr->request.word9 = BEACON_VERSION_V0;
7186                lcb_context->capability &=  ~(LCB_CAPABILITY_DURATION);
7187                bf_set(lpfc_mbx_set_beacon_state,
7188                       &mbox->u.mqe.un.beacon_config, beacon_state);
7189                bf_set(lpfc_mbx_set_beacon_port_type,
7190                       &mbox->u.mqe.un.beacon_config, 1);
7191                bf_set(lpfc_mbx_set_beacon_duration,
7192                       &mbox->u.mqe.un.beacon_config,
7193                       be16_to_cpu(lcb_context->duration));
7194        }
7195
7196        rc = lpfc_sli_issue_mbox(phba, mbox, MBX_NOWAIT);
7197        if (rc == MBX_NOT_FINISHED) {
7198                mempool_free(mbox, phba->mbox_mem_pool);
7199                return 1;
7200        }
7201
7202        return 0;
7203}
7204
7205
7206/**
7207 * lpfc_els_rcv_lcb - Process an unsolicited LCB
7208 * @vport: pointer to a host virtual N_Port data structure.
7209 * @cmdiocb: pointer to lpfc command iocb data structure.
7210 * @ndlp: pointer to a node-list data structure.
7211 *
7212 * This routine processes an unsolicited LCB(LINK CABLE BEACON) IOCB.
7213 * First, the payload of the unsolicited LCB is checked.
7214 * Then based on Subcommand beacon will either turn on or off.
7215 *
7216 * Return code
7217 * 0 - Sent the acc response
7218 * 1 - Sent the reject response.
7219 **/
7220static int
7221lpfc_els_rcv_lcb(struct lpfc_vport *vport, struct lpfc_iocbq *cmdiocb,
7222                 struct lpfc_nodelist *ndlp)
7223{
7224        struct lpfc_hba *phba = vport->phba;
7225        struct lpfc_dmabuf *pcmd;
7226        uint8_t *lp;
7227        struct fc_lcb_request_frame *beacon;
7228        struct lpfc_lcb_context *lcb_context;
7229        u8 state, rjt_err = 0;
7230        struct ls_rjt stat;
7231
7232        pcmd = (struct lpfc_dmabuf *)cmdiocb->context2;
7233        lp = (uint8_t *)pcmd->virt;
7234        beacon = (struct fc_lcb_request_frame *)pcmd->virt;
7235
7236        lpfc_printf_vlog(vport, KERN_INFO, LOG_ELS,
7237                        "0192 ELS LCB Data x%x x%x x%x x%x sub x%x "
7238                        "type x%x frequency %x duration x%x\n",
7239                        lp[0], lp[1], lp[2],
7240                        beacon->lcb_command,
7241                        beacon->lcb_sub_command,
7242                        beacon->lcb_type,
7243                        beacon->lcb_frequency,
7244                        be16_to_cpu(beacon->lcb_duration));
7245
7246        if (beacon->lcb_sub_command != LPFC_LCB_ON &&
7247            beacon->lcb_sub_command != LPFC_LCB_OFF) {
7248                rjt_err = LSRJT_CMD_UNSUPPORTED;
7249                goto rjt;
7250        }
7251
7252        if (phba->sli_rev < LPFC_SLI_REV4  ||
7253            phba->hba_flag & HBA_FCOE_MODE ||
7254            (bf_get(lpfc_sli_intf_if_type, &phba->sli4_hba.sli_intf) <
7255            LPFC_SLI_INTF_IF_TYPE_2)) {
7256                rjt_err = LSRJT_CMD_UNSUPPORTED;
7257                goto rjt;
7258        }
7259
7260        lcb_context = kmalloc(sizeof(*lcb_context), GFP_KERNEL);
7261        if (!lcb_context) {
7262                rjt_err = LSRJT_UNABLE_TPC;
7263                goto rjt;
7264        }
7265
7266        state = (beacon->lcb_sub_command == LPFC_LCB_ON) ? 1 : 0;
7267        lcb_context->sub_command = beacon->lcb_sub_command;
7268        lcb_context->capability = 0;
7269        lcb_context->type = beacon->lcb_type;
7270        lcb_context->frequency = beacon->lcb_frequency;
7271        lcb_context->duration = beacon->lcb_duration;
7272        lcb_context->ox_id = cmdiocb->iocb.unsli3.rcvsli3.ox_id;
7273        lcb_context->rx_id = cmdiocb->iocb.ulpContext;
7274        lcb_context->ndlp = lpfc_nlp_get(ndlp);
7275        if (!lcb_context->ndlp) {
7276                rjt_err = LSRJT_UNABLE_TPC;
7277                goto rjt_free;
7278        }
7279
7280        if (lpfc_sli4_set_beacon(vport, lcb_context, state)) {
7281                lpfc_printf_vlog(ndlp->vport, KERN_ERR, LOG_TRACE_EVENT,
7282                                 "0193 failed to send mail box");
7283                lpfc_nlp_put(ndlp);
7284                rjt_err = LSRJT_UNABLE_TPC;
7285                goto rjt_free;
7286        }
7287        return 0;
7288
7289rjt_free:
7290        kfree(lcb_context);
7291rjt:
7292        memset(&stat, 0, sizeof(stat));
7293        stat.un.b.lsRjtRsnCode = rjt_err;
7294        lpfc_els_rsp_reject(vport, stat.un.lsRjtError, cmdiocb, ndlp, NULL);
7295        return 1;
7296}
7297
7298
7299/**
7300 * lpfc_els_flush_rscn - Clean up any rscn activities with a vport
7301 * @vport: pointer to a host virtual N_Port data structure.
7302 *
7303 * This routine cleans up any Registration State Change Notification
7304 * (RSCN) activity with a @vport. Note that the fc_rscn_flush flag of the
7305 * @vport together with the host_lock is used to prevent multiple thread
7306 * trying to access the RSCN array on a same @vport at the same time.
7307 **/
7308void
7309lpfc_els_flush_rscn(struct lpfc_vport *vport)
7310{
7311        struct Scsi_Host *shost = lpfc_shost_from_vport(vport);
7312        struct lpfc_hba  *phba = vport->phba;
7313        int i;
7314
7315        spin_lock_irq(shost->host_lock);
7316        if (vport->fc_rscn_flush) {
7317                /* Another thread is walking fc_rscn_id_list on this vport */
7318                spin_unlock_irq(shost->host_lock);
7319                return;
7320        }
7321        /* Indicate we are walking lpfc_els_flush_rscn on this vport */
7322        vport->fc_rscn_flush = 1;
7323        spin_unlock_irq(shost->host_lock);
7324
7325        for (i = 0; i < vport->fc_rscn_id_cnt; i++) {
7326                lpfc_in_buf_free(phba, vport->fc_rscn_id_list[i]);
7327                vport->fc_rscn_id_list[i] = NULL;
7328        }
7329        spin_lock_irq(shost->host_lock);
7330        vport->fc_rscn_id_cnt = 0;
7331        vport->fc_flag &= ~(FC_RSCN_MODE | FC_RSCN_DISCOVERY);
7332        spin_unlock_irq(shost->host_lock);
7333        lpfc_can_disctmo(vport);
7334        /* Indicate we are done walking this fc_rscn_id_list */
7335        vport->fc_rscn_flush = 0;
7336}
7337
7338/**
7339 * lpfc_rscn_payload_check - Check whether there is a pending rscn to a did
7340 * @vport: pointer to a host virtual N_Port data structure.
7341 * @did: remote destination port identifier.
7342 *
7343 * This routine checks whether there is any pending Registration State
7344 * Configuration Notification (RSCN) to a @did on @vport.
7345 *
7346 * Return code
7347 *   None zero - The @did matched with a pending rscn
7348 *   0 - not able to match @did with a pending rscn
7349 **/
7350int
7351lpfc_rscn_payload_check(struct lpfc_vport *vport, uint32_t did)
7352{
7353        D_ID ns_did;
7354        D_ID rscn_did;
7355        uint32_t *lp;
7356        uint32_t payload_len, i;
7357        struct Scsi_Host *shost = lpfc_shost_from_vport(vport);
7358
7359        ns_did.un.word = did;
7360
7361        /* Never match fabric nodes for RSCNs */
7362        if ((did & Fabric_DID_MASK) == Fabric_DID_MASK)
7363                return 0;
7364
7365        /* If we are doing a FULL RSCN rediscovery, match everything */
7366        if (vport->fc_flag & FC_RSCN_DISCOVERY)
7367                return did;
7368
7369        spin_lock_irq(shost->host_lock);
7370        if (vport->fc_rscn_flush) {
7371                /* Another thread is walking fc_rscn_id_list on this vport */
7372                spin_unlock_irq(shost->host_lock);
7373                return 0;
7374        }
7375        /* Indicate we are walking fc_rscn_id_list on this vport */
7376        vport->fc_rscn_flush = 1;
7377        spin_unlock_irq(shost->host_lock);
7378        for (i = 0; i < vport->fc_rscn_id_cnt; i++) {
7379                lp = vport->fc_rscn_id_list[i]->virt;
7380                payload_len = be32_to_cpu(*lp++ & ~ELS_CMD_MASK);
7381                payload_len -= sizeof(uint32_t);        /* take off word 0 */
7382                while (payload_len) {
7383                        rscn_did.un.word = be32_to_cpu(*lp++);
7384                        payload_len -= sizeof(uint32_t);
7385                        switch (rscn_did.un.b.resv & RSCN_ADDRESS_FORMAT_MASK) {
7386                        case RSCN_ADDRESS_FORMAT_PORT:
7387                                if ((ns_did.un.b.domain == rscn_did.un.b.domain)
7388                                    && (ns_did.un.b.area == rscn_did.un.b.area)
7389                                    && (ns_did.un.b.id == rscn_did.un.b.id))
7390                                        goto return_did_out;
7391                                break;
7392                        case RSCN_ADDRESS_FORMAT_AREA:
7393                                if ((ns_did.un.b.domain == rscn_did.un.b.domain)
7394                                    && (ns_did.un.b.area == rscn_did.un.b.area))
7395                                        goto return_did_out;
7396                                break;
7397                        case RSCN_ADDRESS_FORMAT_DOMAIN:
7398                                if (ns_did.un.b.domain == rscn_did.un.b.domain)
7399                                        goto return_did_out;
7400                                break;
7401                        case RSCN_ADDRESS_FORMAT_FABRIC:
7402                                goto return_did_out;
7403                        }
7404                }
7405        }
7406        /* Indicate we are done with walking fc_rscn_id_list on this vport */
7407        vport->fc_rscn_flush = 0;
7408        return 0;
7409return_did_out:
7410        /* Indicate we are done with walking fc_rscn_id_list on this vport */
7411        vport->fc_rscn_flush = 0;
7412        return did;
7413}
7414
7415/**
7416 * lpfc_rscn_recovery_check - Send recovery event to vport nodes matching rscn
7417 * @vport: pointer to a host virtual N_Port data structure.
7418 *
7419 * This routine sends recovery (NLP_EVT_DEVICE_RECOVERY) event to the
7420 * state machine for a @vport's nodes that are with pending RSCN (Registration
7421 * State Change Notification).
7422 *
7423 * Return code
7424 *   0 - Successful (currently alway return 0)
7425 **/
7426static int
7427lpfc_rscn_recovery_check(struct lpfc_vport *vport)
7428{
7429        struct lpfc_nodelist *ndlp = NULL;
7430
7431        /* Move all affected nodes by pending RSCNs to NPR state. */
7432        list_for_each_entry(ndlp, &vport->fc_nodes, nlp_listp) {
7433                if ((ndlp->nlp_state == NLP_STE_UNUSED_NODE) ||
7434                    !lpfc_rscn_payload_check(vport, ndlp->nlp_DID))
7435                        continue;
7436
7437                /* NVME Target mode does not do RSCN Recovery. */
7438                if (vport->phba->nvmet_support)
7439                        continue;
7440
7441                /* If we are in the process of doing discovery on this
7442                 * NPort, let it continue on its own.
7443                 */
7444                switch (ndlp->nlp_state) {
7445                case  NLP_STE_PLOGI_ISSUE:
7446                case  NLP_STE_ADISC_ISSUE:
7447                case  NLP_STE_REG_LOGIN_ISSUE:
7448                case  NLP_STE_PRLI_ISSUE:
7449                case  NLP_STE_LOGO_ISSUE:
7450                        continue;
7451                }
7452
7453                lpfc_disc_state_machine(vport, ndlp, NULL,
7454                                        NLP_EVT_DEVICE_RECOVERY);
7455                lpfc_cancel_retry_delay_tmo(vport, ndlp);
7456        }
7457        return 0;
7458}
7459
7460/**
7461 * lpfc_send_rscn_event - Send an RSCN event to management application
7462 * @vport: pointer to a host virtual N_Port data structure.
7463 * @cmdiocb: pointer to lpfc command iocb data structure.
7464 *
7465 * lpfc_send_rscn_event sends an RSCN netlink event to management
7466 * applications.
7467 */
7468static void
7469lpfc_send_rscn_event(struct lpfc_vport *vport,
7470                struct lpfc_iocbq *cmdiocb)
7471{
7472        struct lpfc_dmabuf *pcmd;
7473        struct Scsi_Host *shost = lpfc_shost_from_vport(vport);
7474        uint32_t *payload_ptr;
7475        uint32_t payload_len;
7476        struct lpfc_rscn_event_header *rscn_event_data;
7477
7478        pcmd = (struct lpfc_dmabuf *) cmdiocb->context2;
7479        payload_ptr = (uint32_t *) pcmd->virt;
7480        payload_len = be32_to_cpu(*payload_ptr & ~ELS_CMD_MASK);
7481
7482        rscn_event_data = kmalloc(sizeof(struct lpfc_rscn_event_header) +
7483                payload_len, GFP_KERNEL);
7484        if (!rscn_event_data) {
7485                lpfc_printf_vlog(vport, KERN_ERR, LOG_TRACE_EVENT,
7486                        "0147 Failed to allocate memory for RSCN event\n");
7487                return;
7488        }
7489        rscn_event_data->event_type = FC_REG_RSCN_EVENT;
7490        rscn_event_data->payload_length = payload_len;
7491        memcpy(rscn_event_data->rscn_payload, payload_ptr,
7492                payload_len);
7493
7494        fc_host_post_vendor_event(shost,
7495                fc_get_event_number(),
7496                sizeof(struct lpfc_rscn_event_header) + payload_len,
7497                (char *)rscn_event_data,
7498                LPFC_NL_VENDOR_ID);
7499
7500        kfree(rscn_event_data);
7501}
7502
7503/**
7504 * lpfc_els_rcv_rscn - Process an unsolicited rscn iocb
7505 * @vport: pointer to a host virtual N_Port data structure.
7506 * @cmdiocb: pointer to lpfc command iocb data structure.
7507 * @ndlp: pointer to a node-list data structure.
7508 *
7509 * This routine processes an unsolicited RSCN (Registration State Change
7510 * Notification) IOCB. First, the payload of the unsolicited RSCN is walked
7511 * to invoke fc_host_post_event() routine to the FC transport layer. If the
7512 * discover state machine is about to begin discovery, it just accepts the
7513 * RSCN and the discovery process will satisfy the RSCN. If this RSCN only
7514 * contains N_Port IDs for other vports on this HBA, it just accepts the
7515 * RSCN and ignore processing it. If the state machine is in the recovery
7516 * state, the fc_rscn_id_list of this @vport is walked and the
7517 * lpfc_rscn_recovery_check() routine is invoked to send recovery event for
7518 * all nodes that match RSCN payload. Otherwise, the lpfc_els_handle_rscn()
7519 * routine is invoked to handle the RSCN event.
7520 *
7521 * Return code
7522 *   0 - Just sent the acc response
7523 *   1 - Sent the acc response and waited for name server completion
7524 **/
7525static int
7526lpfc_els_rcv_rscn(struct lpfc_vport *vport, struct lpfc_iocbq *cmdiocb,
7527                  struct lpfc_nodelist *ndlp)
7528{
7529        struct Scsi_Host *shost = lpfc_shost_from_vport(vport);
7530        struct lpfc_hba  *phba = vport->phba;
7531        struct lpfc_dmabuf *pcmd;
7532        uint32_t *lp, *datap;
7533        uint32_t payload_len, length, nportid, *cmd;
7534        int rscn_cnt;
7535        int rscn_id = 0, hba_id = 0;
7536        int i, tmo;
7537
7538        pcmd = (struct lpfc_dmabuf *) cmdiocb->context2;
7539        lp = (uint32_t *) pcmd->virt;
7540
7541        payload_len = be32_to_cpu(*lp++ & ~ELS_CMD_MASK);
7542        payload_len -= sizeof(uint32_t);        /* take off word 0 */
7543        /* RSCN received */
7544        lpfc_printf_vlog(vport, KERN_INFO, LOG_DISCOVERY,
7545                         "0214 RSCN received Data: x%x x%x x%x x%x\n",
7546                         vport->fc_flag, payload_len, *lp,
7547                         vport->fc_rscn_id_cnt);
7548
7549        /* Send an RSCN event to the management application */
7550        lpfc_send_rscn_event(vport, cmdiocb);
7551
7552        for (i = 0; i < payload_len/sizeof(uint32_t); i++)
7553                fc_host_post_event(shost, fc_get_event_number(),
7554                        FCH_EVT_RSCN, lp[i]);
7555
7556        /* Check if RSCN is coming from a direct-connected remote NPort */
7557        if (vport->fc_flag & FC_PT2PT) {
7558                /* If so, just ACC it, no other action needed for now */
7559                lpfc_printf_vlog(vport, KERN_INFO, LOG_ELS,
7560                                 "2024 pt2pt RSCN %08x Data: x%x x%x\n",
7561                                 *lp, vport->fc_flag, payload_len);
7562                lpfc_els_rsp_acc(vport, ELS_CMD_ACC, cmdiocb, ndlp, NULL);
7563
7564                /* Check to see if we need to NVME rescan this target
7565                 * remoteport.
7566                 */
7567                if (ndlp->nlp_fc4_type & NLP_FC4_NVME &&
7568                    ndlp->nlp_type & (NLP_NVME_TARGET | NLP_NVME_DISCOVERY))
7569                        lpfc_nvme_rescan_port(vport, ndlp);
7570                return 0;
7571        }
7572
7573        /* If we are about to begin discovery, just ACC the RSCN.
7574         * Discovery processing will satisfy it.
7575         */
7576        if (vport->port_state <= LPFC_NS_QRY) {
7577                lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_UNSOL,
7578                        "RCV RSCN ignore: did:x%x/ste:x%x flg:x%x",
7579                        ndlp->nlp_DID, vport->port_state, ndlp->nlp_flag);
7580
7581                lpfc_els_rsp_acc(vport, ELS_CMD_ACC, cmdiocb, ndlp, NULL);
7582                return 0;
7583        }
7584
7585        /* If this RSCN just contains NPortIDs for other vports on this HBA,
7586         * just ACC and ignore it.
7587         */
7588        if ((phba->sli3_options & LPFC_SLI3_NPIV_ENABLED) &&
7589                !(vport->cfg_peer_port_login)) {
7590                i = payload_len;
7591                datap = lp;
7592                while (i > 0) {
7593                        nportid = *datap++;
7594                        nportid = ((be32_to_cpu(nportid)) & Mask_DID);
7595                        i -= sizeof(uint32_t);
7596                        rscn_id++;
7597                        if (lpfc_find_vport_by_did(phba, nportid))
7598                                hba_id++;
7599                }
7600                if (rscn_id == hba_id) {
7601                        /* ALL NPortIDs in RSCN are on HBA */
7602                        lpfc_printf_vlog(vport, KERN_INFO, LOG_DISCOVERY,
7603                                         "0219 Ignore RSCN "
7604                                         "Data: x%x x%x x%x x%x\n",
7605                                         vport->fc_flag, payload_len,
7606                                         *lp, vport->fc_rscn_id_cnt);
7607                        lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_UNSOL,
7608                                "RCV RSCN vport:  did:x%x/ste:x%x flg:x%x",
7609                                ndlp->nlp_DID, vport->port_state,
7610                                ndlp->nlp_flag);
7611
7612                        lpfc_els_rsp_acc(vport, ELS_CMD_ACC, cmdiocb,
7613                                ndlp, NULL);
7614                        return 0;
7615                }
7616        }
7617
7618        spin_lock_irq(shost->host_lock);
7619        if (vport->fc_rscn_flush) {
7620                /* Another thread is walking fc_rscn_id_list on this vport */
7621                vport->fc_flag |= FC_RSCN_DISCOVERY;
7622                spin_unlock_irq(shost->host_lock);
7623                /* Send back ACC */
7624                lpfc_els_rsp_acc(vport, ELS_CMD_ACC, cmdiocb, ndlp, NULL);
7625                return 0;
7626        }
7627        /* Indicate we are walking fc_rscn_id_list on this vport */
7628        vport->fc_rscn_flush = 1;
7629        spin_unlock_irq(shost->host_lock);
7630        /* Get the array count after successfully have the token */
7631        rscn_cnt = vport->fc_rscn_id_cnt;
7632        /* If we are already processing an RSCN, save the received
7633         * RSCN payload buffer, cmdiocb->context2 to process later.
7634         */
7635        if (vport->fc_flag & (FC_RSCN_MODE | FC_NDISC_ACTIVE)) {
7636                lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_UNSOL,
7637                        "RCV RSCN defer:  did:x%x/ste:x%x flg:x%x",
7638                        ndlp->nlp_DID, vport->port_state, ndlp->nlp_flag);
7639
7640                spin_lock_irq(shost->host_lock);
7641                vport->fc_flag |= FC_RSCN_DEFERRED;
7642
7643                /* Restart disctmo if its already running */
7644                if (vport->fc_flag & FC_DISC_TMO) {
7645                        tmo = ((phba->fc_ratov * 3) + 3);
7646                        mod_timer(&vport->fc_disctmo,
7647                                  jiffies + msecs_to_jiffies(1000 * tmo));
7648                }
7649                if ((rscn_cnt < FC_MAX_HOLD_RSCN) &&
7650                    !(vport->fc_flag & FC_RSCN_DISCOVERY)) {
7651                        vport->fc_flag |= FC_RSCN_MODE;
7652                        spin_unlock_irq(shost->host_lock);
7653                        if (rscn_cnt) {
7654                                cmd = vport->fc_rscn_id_list[rscn_cnt-1]->virt;
7655                                length = be32_to_cpu(*cmd & ~ELS_CMD_MASK);
7656                        }
7657                        if ((rscn_cnt) &&
7658                            (payload_len + length <= LPFC_BPL_SIZE)) {
7659                                *cmd &= ELS_CMD_MASK;
7660                                *cmd |= cpu_to_be32(payload_len + length);
7661                                memcpy(((uint8_t *)cmd) + length, lp,
7662                                       payload_len);
7663                        } else {
7664                                vport->fc_rscn_id_list[rscn_cnt] = pcmd;
7665                                vport->fc_rscn_id_cnt++;
7666                                /* If we zero, cmdiocb->context2, the calling
7667                                 * routine will not try to free it.
7668                                 */
7669                                cmdiocb->context2 = NULL;
7670                        }
7671                        /* Deferred RSCN */
7672                        lpfc_printf_vlog(vport, KERN_INFO, LOG_DISCOVERY,
7673                                         "0235 Deferred RSCN "
7674                                         "Data: x%x x%x x%x\n",
7675                                         vport->fc_rscn_id_cnt, vport->fc_flag,
7676                                         vport->port_state);
7677                } else {
7678                        vport->fc_flag |= FC_RSCN_DISCOVERY;
7679                        spin_unlock_irq(shost->host_lock);
7680                        /* ReDiscovery RSCN */
7681                        lpfc_printf_vlog(vport, KERN_INFO, LOG_DISCOVERY,
7682                                         "0234 ReDiscovery RSCN "
7683                                         "Data: x%x x%x x%x\n",
7684                                         vport->fc_rscn_id_cnt, vport->fc_flag,
7685                                         vport->port_state);
7686                }
7687                /* Indicate we are done walking fc_rscn_id_list on this vport */
7688                vport->fc_rscn_flush = 0;
7689                /* Send back ACC */
7690                lpfc_els_rsp_acc(vport, ELS_CMD_ACC, cmdiocb, ndlp, NULL);
7691                /* send RECOVERY event for ALL nodes that match RSCN payload */
7692                lpfc_rscn_recovery_check(vport);
7693                return 0;
7694        }
7695        lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_UNSOL,
7696                "RCV RSCN:        did:x%x/ste:x%x flg:x%x",
7697                ndlp->nlp_DID, vport->port_state, ndlp->nlp_flag);
7698
7699        spin_lock_irq(shost->host_lock);
7700        vport->fc_flag |= FC_RSCN_MODE;
7701        spin_unlock_irq(shost->host_lock);
7702        vport->fc_rscn_id_list[vport->fc_rscn_id_cnt++] = pcmd;
7703        /* Indicate we are done walking fc_rscn_id_list on this vport */
7704        vport->fc_rscn_flush = 0;
7705        /*
7706         * If we zero, cmdiocb->context2, the calling routine will
7707         * not try to free it.
7708         */
7709        cmdiocb->context2 = NULL;
7710        lpfc_set_disctmo(vport);
7711        /* Send back ACC */
7712        lpfc_els_rsp_acc(vport, ELS_CMD_ACC, cmdiocb, ndlp, NULL);
7713        /* send RECOVERY event for ALL nodes that match RSCN payload */
7714        lpfc_rscn_recovery_check(vport);
7715        return lpfc_els_handle_rscn(vport);
7716}
7717
7718/**
7719 * lpfc_els_handle_rscn - Handle rscn for a vport
7720 * @vport: pointer to a host virtual N_Port data structure.
7721 *
7722 * This routine handles the Registration State Configuration Notification
7723 * (RSCN) for a @vport. If login to NameServer does not exist, a new ndlp shall
7724 * be created and a Port Login (PLOGI) to the NameServer is issued. Otherwise,
7725 * if the ndlp to NameServer exists, a Common Transport (CT) command to the
7726 * NameServer shall be issued. If CT command to the NameServer fails to be
7727 * issued, the lpfc_els_flush_rscn() routine shall be invoked to clean up any
7728 * RSCN activities with the @vport.
7729 *
7730 * Return code
7731 *   0 - Cleaned up rscn on the @vport
7732 *   1 - Wait for plogi to name server before proceed
7733 **/
7734int
7735lpfc_els_handle_rscn(struct lpfc_vport *vport)
7736{
7737        struct lpfc_nodelist *ndlp;
7738        struct lpfc_hba  *phba = vport->phba;
7739
7740        /* Ignore RSCN if the port is being torn down. */
7741        if (vport->load_flag & FC_UNLOADING) {
7742                lpfc_els_flush_rscn(vport);
7743                return 0;
7744        }
7745
7746        /* Start timer for RSCN processing */
7747        lpfc_set_disctmo(vport);
7748
7749        /* RSCN processed */
7750        lpfc_printf_vlog(vport, KERN_INFO, LOG_DISCOVERY,
7751                         "0215 RSCN processed Data: x%x x%x x%x x%x x%x x%x\n",
7752                         vport->fc_flag, 0, vport->fc_rscn_id_cnt,
7753                         vport->port_state, vport->num_disc_nodes,
7754                         vport->gidft_inp);
7755
7756        /* To process RSCN, first compare RSCN data with NameServer */
7757        vport->fc_ns_retry = 0;
7758        vport->num_disc_nodes = 0;
7759
7760        ndlp = lpfc_findnode_did(vport, NameServer_DID);
7761        if (ndlp && ndlp->nlp_state == NLP_STE_UNMAPPED_NODE) {
7762                /* Good ndlp, issue CT Request to NameServer.  Need to
7763                 * know how many gidfts were issued.  If none, then just
7764                 * flush the RSCN.  Otherwise, the outstanding requests
7765                 * need to complete.
7766                 */
7767                if (phba->cfg_ns_query == LPFC_NS_QUERY_GID_FT) {
7768                        if (lpfc_issue_gidft(vport) > 0)
7769                                return 1;
7770                } else if (phba->cfg_ns_query == LPFC_NS_QUERY_GID_PT) {
7771                        if (lpfc_issue_gidpt(vport) > 0)
7772                                return 1;
7773                } else {
7774                        return 1;
7775                }
7776        } else {
7777                /* Nameserver login in question.  Revalidate. */
7778                if (ndlp) {
7779                        ndlp->nlp_prev_state = NLP_STE_UNUSED_NODE;
7780                        lpfc_nlp_set_state(vport, ndlp, NLP_STE_PLOGI_ISSUE);
7781                } else {
7782                        ndlp = lpfc_nlp_init(vport, NameServer_DID);
7783                        if (!ndlp) {
7784                                lpfc_els_flush_rscn(vport);
7785                                return 0;
7786                        }
7787                        ndlp->nlp_prev_state = ndlp->nlp_state;
7788                        lpfc_nlp_set_state(vport, ndlp, NLP_STE_PLOGI_ISSUE);
7789                }
7790                ndlp->nlp_type |= NLP_FABRIC;
7791                lpfc_issue_els_plogi(vport, NameServer_DID, 0);
7792                /* Wait for NameServer login cmpl before we can
7793                 * continue
7794                 */
7795                return 1;
7796        }
7797
7798        lpfc_els_flush_rscn(vport);
7799        return 0;
7800}
7801
7802/**
7803 * lpfc_els_rcv_flogi - Process an unsolicited flogi iocb
7804 * @vport: pointer to a host virtual N_Port data structure.
7805 * @cmdiocb: pointer to lpfc command iocb data structure.
7806 * @ndlp: pointer to a node-list data structure.
7807 *
7808 * This routine processes Fabric Login (FLOGI) IOCB received as an ELS
7809 * unsolicited event. An unsolicited FLOGI can be received in a point-to-
7810 * point topology. As an unsolicited FLOGI should not be received in a loop
7811 * mode, any unsolicited FLOGI received in loop mode shall be ignored. The
7812 * lpfc_check_sparm() routine is invoked to check the parameters in the
7813 * unsolicited FLOGI. If parameters validation failed, the routine
7814 * lpfc_els_rsp_reject() shall be called with reject reason code set to
7815 * LSEXP_SPARM_OPTIONS to reject the FLOGI. Otherwise, the Port WWN in the
7816 * FLOGI shall be compared with the Port WWN of the @vport to determine who
7817 * will initiate PLOGI. The higher lexicographical value party shall has
7818 * higher priority (as the winning port) and will initiate PLOGI and
7819 * communicate Port_IDs (Addresses) for both nodes in PLOGI. The result
7820 * of this will be marked in the @vport fc_flag field with FC_PT2PT_PLOGI
7821 * and then the lpfc_els_rsp_acc() routine is invoked to accept the FLOGI.
7822 *
7823 * Return code
7824 *   0 - Successfully processed the unsolicited flogi
7825 *   1 - Failed to process the unsolicited flogi
7826 **/
7827static int
7828lpfc_els_rcv_flogi(struct lpfc_vport *vport, struct lpfc_iocbq *cmdiocb,
7829                   struct lpfc_nodelist *ndlp)
7830{
7831        struct Scsi_Host *shost = lpfc_shost_from_vport(vport);
7832        struct lpfc_hba  *phba = vport->phba;
7833        struct lpfc_dmabuf *pcmd = (struct lpfc_dmabuf *) cmdiocb->context2;
7834        uint32_t *lp = (uint32_t *) pcmd->virt;
7835        IOCB_t *icmd = &cmdiocb->iocb;
7836        struct serv_parm *sp;
7837        LPFC_MBOXQ_t *mbox;
7838        uint32_t cmd, did;
7839        int rc;
7840        uint32_t fc_flag = 0;
7841        uint32_t port_state = 0;
7842
7843        cmd = *lp++;
7844        sp = (struct serv_parm *) lp;
7845
7846        /* FLOGI received */
7847
7848        lpfc_set_disctmo(vport);
7849
7850        if (phba->fc_topology == LPFC_TOPOLOGY_LOOP) {
7851                /* We should never receive a FLOGI in loop mode, ignore it */
7852                did = icmd->un.elsreq64.remoteID;
7853
7854                /* An FLOGI ELS command <elsCmd> was received from DID <did> in
7855                   Loop Mode */
7856                lpfc_printf_vlog(vport, KERN_ERR, LOG_TRACE_EVENT,
7857                                 "0113 An FLOGI ELS command x%x was "
7858                                 "received from DID x%x in Loop Mode\n",
7859                                 cmd, did);
7860                return 1;
7861        }
7862
7863        (void) lpfc_check_sparm(vport, ndlp, sp, CLASS3, 1);
7864
7865        /*
7866         * If our portname is greater than the remote portname,
7867         * then we initiate Nport login.
7868         */
7869
7870        rc = memcmp(&vport->fc_portname, &sp->portName,
7871                    sizeof(struct lpfc_name));
7872
7873        if (!rc) {
7874                if (phba->sli_rev < LPFC_SLI_REV4) {
7875                        mbox = mempool_alloc(phba->mbox_mem_pool,
7876                                             GFP_KERNEL);
7877                        if (!mbox)
7878                                return 1;
7879                        lpfc_linkdown(phba);
7880                        lpfc_init_link(phba, mbox,
7881                                       phba->cfg_topology,
7882                                       phba->cfg_link_speed);
7883                        mbox->u.mb.un.varInitLnk.lipsr_AL_PA = 0;
7884                        mbox->mbox_cmpl = lpfc_sli_def_mbox_cmpl;
7885                        mbox->vport = vport;
7886                        rc = lpfc_sli_issue_mbox(phba, mbox,
7887                                                 MBX_NOWAIT);
7888                        lpfc_set_loopback_flag(phba);
7889                        if (rc == MBX_NOT_FINISHED)
7890                                mempool_free(mbox, phba->mbox_mem_pool);
7891                        return 1;
7892                }
7893
7894                /* abort the flogi coming back to ourselves
7895                 * due to external loopback on the port.
7896                 */
7897                lpfc_els_abort_flogi(phba);
7898                return 0;
7899
7900        } else if (rc > 0) {    /* greater than */
7901                spin_lock_irq(shost->host_lock);
7902                vport->fc_flag |= FC_PT2PT_PLOGI;
7903                spin_unlock_irq(shost->host_lock);
7904
7905                /* If we have the high WWPN we can assign our own
7906                 * myDID; otherwise, we have to WAIT for a PLOGI
7907                 * from the remote NPort to find out what it
7908                 * will be.
7909                 */
7910                vport->fc_myDID = PT2PT_LocalID;
7911        } else {
7912                vport->fc_myDID = PT2PT_RemoteID;
7913        }
7914
7915        /*
7916         * The vport state should go to LPFC_FLOGI only
7917         * AFTER we issue a FLOGI, not receive one.
7918         */
7919        spin_lock_irq(shost->host_lock);
7920        fc_flag = vport->fc_flag;
7921        port_state = vport->port_state;
7922        vport->fc_flag |= FC_PT2PT;
7923        vport->fc_flag &= ~(FC_FABRIC | FC_PUBLIC_LOOP);
7924
7925        /* Acking an unsol FLOGI.  Count 1 for link bounce
7926         * work-around.
7927         */
7928        vport->rcv_flogi_cnt++;
7929        spin_unlock_irq(shost->host_lock);
7930        lpfc_printf_vlog(vport, KERN_INFO, LOG_ELS,
7931                         "3311 Rcv Flogi PS x%x new PS x%x "
7932                         "fc_flag x%x new fc_flag x%x\n",
7933                         port_state, vport->port_state,
7934                         fc_flag, vport->fc_flag);
7935
7936        /*
7937         * We temporarily set fc_myDID to make it look like we are
7938         * a Fabric. This is done just so we end up with the right
7939         * did / sid on the FLOGI ACC rsp.
7940         */
7941        did = vport->fc_myDID;
7942        vport->fc_myDID = Fabric_DID;
7943
7944        memcpy(&phba->fc_fabparam, sp, sizeof(struct serv_parm));
7945
7946        /* Defer ACC response until AFTER we issue a FLOGI */
7947        if (!(phba->hba_flag & HBA_FLOGI_ISSUED)) {
7948                phba->defer_flogi_acc_rx_id = cmdiocb->iocb.ulpContext;
7949                phba->defer_flogi_acc_ox_id =
7950                                        cmdiocb->iocb.unsli3.rcvsli3.ox_id;
7951
7952                vport->fc_myDID = did;
7953
7954                lpfc_printf_vlog(vport, KERN_INFO, LOG_ELS,
7955                                 "3344 Deferring FLOGI ACC: rx_id: x%x,"
7956                                 " ox_id: x%x, hba_flag x%x\n",
7957                                 phba->defer_flogi_acc_rx_id,
7958                                 phba->defer_flogi_acc_ox_id, phba->hba_flag);
7959
7960                phba->defer_flogi_acc_flag = true;
7961
7962                return 0;
7963        }
7964
7965        /* Send back ACC */
7966        lpfc_els_rsp_acc(vport, ELS_CMD_FLOGI, cmdiocb, ndlp, NULL);
7967
7968        /* Now lets put fc_myDID back to what its supposed to be */
7969        vport->fc_myDID = did;
7970
7971        return 0;
7972}
7973
7974/**
7975 * lpfc_els_rcv_rnid - Process an unsolicited rnid iocb
7976 * @vport: pointer to a host virtual N_Port data structure.
7977 * @cmdiocb: pointer to lpfc command iocb data structure.
7978 * @ndlp: pointer to a node-list data structure.
7979 *
7980 * This routine processes Request Node Identification Data (RNID) IOCB
7981 * received as an ELS unsolicited event. Only when the RNID specified format
7982 * 0x0 or 0xDF (Topology Discovery Specific Node Identification Data)
7983 * present, this routine will invoke the lpfc_els_rsp_rnid_acc() routine to
7984 * Accept (ACC) the RNID ELS command. All the other RNID formats are
7985 * rejected by invoking the lpfc_els_rsp_reject() routine.
7986 *
7987 * Return code
7988 *   0 - Successfully processed rnid iocb (currently always return 0)
7989 **/
7990static int
7991lpfc_els_rcv_rnid(struct lpfc_vport *vport, struct lpfc_iocbq *cmdiocb,
7992                  struct lpfc_nodelist *ndlp)
7993{
7994        struct lpfc_dmabuf *pcmd;
7995        uint32_t *lp;
7996        RNID *rn;
7997        struct ls_rjt stat;
7998
7999        pcmd = (struct lpfc_dmabuf *) cmdiocb->context2;
8000        lp = (uint32_t *) pcmd->virt;
8001
8002        lp++;
8003        rn = (RNID *) lp;
8004
8005        /* RNID received */
8006
8007        switch (rn->Format) {
8008        case 0:
8009        case RNID_TOPOLOGY_DISC:
8010                /* Send back ACC */
8011                lpfc_els_rsp_rnid_acc(vport, rn->Format, cmdiocb, ndlp);
8012                break;
8013        default:
8014                /* Reject this request because format not supported */
8015                stat.un.b.lsRjtRsvd0 = 0;
8016                stat.un.b.lsRjtRsnCode = LSRJT_UNABLE_TPC;
8017                stat.un.b.lsRjtRsnCodeExp = LSEXP_CANT_GIVE_DATA;
8018                stat.un.b.vendorUnique = 0;
8019                lpfc_els_rsp_reject(vport, stat.un.lsRjtError, cmdiocb, ndlp,
8020                        NULL);
8021        }
8022        return 0;
8023}
8024
8025/**
8026 * lpfc_els_rcv_echo - Process an unsolicited echo iocb
8027 * @vport: pointer to a host virtual N_Port data structure.
8028 * @cmdiocb: pointer to lpfc command iocb data structure.
8029 * @ndlp: pointer to a node-list data structure.
8030 *
8031 * Return code
8032 *   0 - Successfully processed echo iocb (currently always return 0)
8033 **/
8034static int
8035lpfc_els_rcv_echo(struct lpfc_vport *vport, struct lpfc_iocbq *cmdiocb,
8036                  struct lpfc_nodelist *ndlp)
8037{
8038        uint8_t *pcmd;
8039
8040        pcmd = (uint8_t *) (((struct lpfc_dmabuf *) cmdiocb->context2)->virt);
8041
8042        /* skip over first word of echo command to find echo data */
8043        pcmd += sizeof(uint32_t);
8044
8045        lpfc_els_rsp_echo_acc(vport, pcmd, cmdiocb, ndlp);
8046        return 0;
8047}
8048
8049/**
8050 * lpfc_els_rcv_lirr - Process an unsolicited lirr iocb
8051 * @vport: pointer to a host virtual N_Port data structure.
8052 * @cmdiocb: pointer to lpfc command iocb data structure.
8053 * @ndlp: pointer to a node-list data structure.
8054 *
8055 * This routine processes a Link Incident Report Registration(LIRR) IOCB
8056 * received as an ELS unsolicited event. Currently, this function just invokes
8057 * the lpfc_els_rsp_reject() routine to reject the LIRR IOCB unconditionally.
8058 *
8059 * Return code
8060 *   0 - Successfully processed lirr iocb (currently always return 0)
8061 **/
8062static int
8063lpfc_els_rcv_lirr(struct lpfc_vport *vport, struct lpfc_iocbq *cmdiocb,
8064                  struct lpfc_nodelist *ndlp)
8065{
8066        struct ls_rjt stat;
8067
8068        /* For now, unconditionally reject this command */
8069        stat.un.b.lsRjtRsvd0 = 0;
8070        stat.un.b.lsRjtRsnCode = LSRJT_UNABLE_TPC;
8071        stat.un.b.lsRjtRsnCodeExp = LSEXP_CANT_GIVE_DATA;
8072        stat.un.b.vendorUnique = 0;
8073        lpfc_els_rsp_reject(vport, stat.un.lsRjtError, cmdiocb, ndlp, NULL);
8074        return 0;
8075}
8076
8077/**
8078 * lpfc_els_rcv_rrq - Process an unsolicited rrq iocb
8079 * @vport: pointer to a host virtual N_Port data structure.
8080 * @cmdiocb: pointer to lpfc command iocb data structure.
8081 * @ndlp: pointer to a node-list data structure.
8082 *
8083 * This routine processes a Reinstate Recovery Qualifier (RRQ) IOCB
8084 * received as an ELS unsolicited event. A request to RRQ shall only
8085 * be accepted if the Originator Nx_Port N_Port_ID or the Responder
8086 * Nx_Port N_Port_ID of the target Exchange is the same as the
8087 * N_Port_ID of the Nx_Port that makes the request. If the RRQ is
8088 * not accepted, an LS_RJT with reason code "Unable to perform
8089 * command request" and reason code explanation "Invalid Originator
8090 * S_ID" shall be returned. For now, we just unconditionally accept
8091 * RRQ from the target.
8092 **/
8093static void
8094lpfc_els_rcv_rrq(struct lpfc_vport *vport, struct lpfc_iocbq *cmdiocb,
8095                 struct lpfc_nodelist *ndlp)
8096{
8097        lpfc_els_rsp_acc(vport, ELS_CMD_ACC, cmdiocb, ndlp, NULL);
8098        if (vport->phba->sli_rev == LPFC_SLI_REV4)
8099                lpfc_els_clear_rrq(vport, cmdiocb, ndlp);
8100}
8101
8102/**
8103 * lpfc_els_rsp_rls_acc - Completion callbk func for MBX_READ_LNK_STAT mbox cmd
8104 * @phba: pointer to lpfc hba data structure.
8105 * @pmb: pointer to the driver internal queue element for mailbox command.
8106 *
8107 * This routine is the completion callback function for the MBX_READ_LNK_STAT
8108 * mailbox command. This callback function is to actually send the Accept
8109 * (ACC) response to a Read Link Status (RLS) unsolicited IOCB event. It
8110 * collects the link statistics from the completion of the MBX_READ_LNK_STAT
8111 * mailbox command, constructs the RLS response with the link statistics
8112 * collected, and then invokes the lpfc_sli_issue_iocb() routine to send ACC
8113 * response to the RLS.
8114 *
8115 * Note that the ndlp reference count will be incremented by 1 for holding the
8116 * ndlp and the reference to ndlp will be stored into the context1 field of
8117 * the IOCB for the completion callback function to the RLS Accept Response
8118 * ELS IOCB command.
8119 *
8120 **/
8121static void
8122lpfc_els_rsp_rls_acc(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmb)
8123{
8124        int rc = 0;
8125        MAILBOX_t *mb;
8126        IOCB_t *icmd;
8127        struct RLS_RSP *rls_rsp;
8128        uint8_t *pcmd;
8129        struct lpfc_iocbq *elsiocb;
8130        struct lpfc_nodelist *ndlp;
8131        uint16_t oxid;
8132        uint16_t rxid;
8133        uint32_t cmdsize;
8134
8135        mb = &pmb->u.mb;
8136
8137        ndlp = (struct lpfc_nodelist *)pmb->ctx_ndlp;
8138        rxid = (uint16_t)((unsigned long)(pmb->ctx_buf) & 0xffff);
8139        oxid = (uint16_t)(((unsigned long)(pmb->ctx_buf) >> 16) & 0xffff);
8140        pmb->ctx_buf = NULL;
8141        pmb->ctx_ndlp = NULL;
8142
8143        if (mb->mbxStatus) {
8144                mempool_free(pmb, phba->mbox_mem_pool);
8145                return;
8146        }
8147
8148        cmdsize = sizeof(struct RLS_RSP) + sizeof(uint32_t);
8149        elsiocb = lpfc_prep_els_iocb(phba->pport, 0, cmdsize,
8150                                     lpfc_max_els_tries, ndlp,
8151                                     ndlp->nlp_DID, ELS_CMD_ACC);
8152
8153        /* Decrement the ndlp reference count from previous mbox command */
8154        lpfc_nlp_put(ndlp);
8155
8156        if (!elsiocb) {
8157                mempool_free(pmb, phba->mbox_mem_pool);
8158                return;
8159        }
8160
8161        icmd = &elsiocb->iocb;
8162        icmd->ulpContext = rxid;
8163        icmd->unsli3.rcvsli3.ox_id = oxid;
8164
8165        pcmd = (uint8_t *) (((struct lpfc_dmabuf *) elsiocb->context2)->virt);
8166        *((uint32_t *) (pcmd)) = ELS_CMD_ACC;
8167        pcmd += sizeof(uint32_t); /* Skip past command */
8168        rls_rsp = (struct RLS_RSP *)pcmd;
8169
8170        rls_rsp->linkFailureCnt = cpu_to_be32(mb->un.varRdLnk.linkFailureCnt);
8171        rls_rsp->lossSyncCnt = cpu_to_be32(mb->un.varRdLnk.lossSyncCnt);
8172        rls_rsp->lossSignalCnt = cpu_to_be32(mb->un.varRdLnk.lossSignalCnt);
8173        rls_rsp->primSeqErrCnt = cpu_to_be32(mb->un.varRdLnk.primSeqErrCnt);
8174        rls_rsp->invalidXmitWord = cpu_to_be32(mb->un.varRdLnk.invalidXmitWord);
8175        rls_rsp->crcCnt = cpu_to_be32(mb->un.varRdLnk.crcCnt);
8176        mempool_free(pmb, phba->mbox_mem_pool);
8177        /* Xmit ELS RLS ACC response tag <ulpIoTag> */
8178        lpfc_printf_vlog(ndlp->vport, KERN_INFO, LOG_ELS,
8179                         "2874 Xmit ELS RLS ACC response tag x%x xri x%x, "
8180                         "did x%x, nlp_flag x%x, nlp_state x%x, rpi x%x\n",
8181                         elsiocb->iotag, elsiocb->iocb.ulpContext,
8182                         ndlp->nlp_DID, ndlp->nlp_flag, ndlp->nlp_state,
8183                         ndlp->nlp_rpi);
8184        elsiocb->iocb_cmpl = lpfc_cmpl_els_rsp;
8185        phba->fc_stat.elsXmitACC++;
8186        elsiocb->context1 = lpfc_nlp_get(ndlp);
8187        if (!elsiocb->context1) {
8188                lpfc_els_free_iocb(phba, elsiocb);
8189                return;
8190        }
8191
8192        rc = lpfc_sli_issue_iocb(phba, LPFC_ELS_RING, elsiocb, 0);
8193        if (rc == IOCB_ERROR) {
8194                lpfc_els_free_iocb(phba, elsiocb);
8195                lpfc_nlp_put(ndlp);
8196        }
8197        return;
8198}
8199
8200/**
8201 * lpfc_els_rcv_rls - Process an unsolicited rls iocb
8202 * @vport: pointer to a host virtual N_Port data structure.
8203 * @cmdiocb: pointer to lpfc command iocb data structure.
8204 * @ndlp: pointer to a node-list data structure.
8205 *
8206 * This routine processes Read Link Status (RLS) IOCB received as an
8207 * ELS unsolicited event. It first checks the remote port state. If the
8208 * remote port is not in NLP_STE_UNMAPPED_NODE state or NLP_STE_MAPPED_NODE
8209 * state, it invokes the lpfc_els_rsl_reject() routine to send the reject
8210 * response. Otherwise, it issue the MBX_READ_LNK_STAT mailbox command
8211 * for reading the HBA link statistics. It is for the callback function,
8212 * lpfc_els_rsp_rls_acc(), set to the MBX_READ_LNK_STAT mailbox command
8213 * to actually sending out RPL Accept (ACC) response.
8214 *
8215 * Return codes
8216 *   0 - Successfully processed rls iocb (currently always return 0)
8217 **/
8218static int
8219lpfc_els_rcv_rls(struct lpfc_vport *vport, struct lpfc_iocbq *cmdiocb,
8220                 struct lpfc_nodelist *ndlp)
8221{
8222        struct lpfc_hba *phba = vport->phba;
8223        LPFC_MBOXQ_t *mbox;
8224        struct ls_rjt stat;
8225
8226        if ((ndlp->nlp_state != NLP_STE_UNMAPPED_NODE) &&
8227            (ndlp->nlp_state != NLP_STE_MAPPED_NODE))
8228                /* reject the unsolicited RLS request and done with it */
8229                goto reject_out;
8230
8231        mbox = mempool_alloc(phba->mbox_mem_pool, GFP_ATOMIC);
8232        if (mbox) {
8233                lpfc_read_lnk_stat(phba, mbox);
8234                mbox->ctx_buf = (void *)((unsigned long)
8235                        ((cmdiocb->iocb.unsli3.rcvsli3.ox_id << 16) |
8236                        cmdiocb->iocb.ulpContext)); /* rx_id */
8237                mbox->ctx_ndlp = lpfc_nlp_get(ndlp);
8238                if (!mbox->ctx_ndlp)
8239                        goto node_err;
8240                mbox->vport = vport;
8241                mbox->mbox_cmpl = lpfc_els_rsp_rls_acc;
8242                if (lpfc_sli_issue_mbox(phba, mbox, MBX_NOWAIT)
8243                        != MBX_NOT_FINISHED)
8244                        /* Mbox completion will send ELS Response */
8245                        return 0;
8246                /* Decrement reference count used for the failed mbox
8247                 * command.
8248                 */
8249                lpfc_nlp_put(ndlp);
8250node_err:
8251                mempool_free(mbox, phba->mbox_mem_pool);
8252        }
8253reject_out:
8254        /* issue rejection response */
8255        stat.un.b.lsRjtRsvd0 = 0;
8256        stat.un.b.lsRjtRsnCode = LSRJT_UNABLE_TPC;
8257        stat.un.b.lsRjtRsnCodeExp = LSEXP_CANT_GIVE_DATA;
8258        stat.un.b.vendorUnique = 0;
8259        lpfc_els_rsp_reject(vport, stat.un.lsRjtError, cmdiocb, ndlp, NULL);
8260        return 0;
8261}
8262
8263/**
8264 * lpfc_els_rcv_rtv - Process an unsolicited rtv iocb
8265 * @vport: pointer to a host virtual N_Port data structure.
8266 * @cmdiocb: pointer to lpfc command iocb data structure.
8267 * @ndlp: pointer to a node-list data structure.
8268 *
8269 * This routine processes Read Timout Value (RTV) IOCB received as an
8270 * ELS unsolicited event. It first checks the remote port state. If the
8271 * remote port is not in NLP_STE_UNMAPPED_NODE state or NLP_STE_MAPPED_NODE
8272 * state, it invokes the lpfc_els_rsl_reject() routine to send the reject
8273 * response. Otherwise, it sends the Accept(ACC) response to a Read Timeout
8274 * Value (RTV) unsolicited IOCB event.
8275 *
8276 * Note that the ndlp reference count will be incremented by 1 for holding the
8277 * ndlp and the reference to ndlp will be stored into the context1 field of
8278 * the IOCB for the completion callback function to the RTV Accept Response
8279 * ELS IOCB command.
8280 *
8281 * Return codes
8282 *   0 - Successfully processed rtv iocb (currently always return 0)
8283 **/
8284static int
8285lpfc_els_rcv_rtv(struct lpfc_vport *vport, struct lpfc_iocbq *cmdiocb,
8286                 struct lpfc_nodelist *ndlp)
8287{
8288        int rc = 0;
8289        struct lpfc_hba *phba = vport->phba;
8290        struct ls_rjt stat;
8291        struct RTV_RSP *rtv_rsp;
8292        uint8_t *pcmd;
8293        struct lpfc_iocbq *elsiocb;
8294        uint32_t cmdsize;
8295
8296
8297        if ((ndlp->nlp_state != NLP_STE_UNMAPPED_NODE) &&
8298            (ndlp->nlp_state != NLP_STE_MAPPED_NODE))
8299                /* reject the unsolicited RTV request and done with it */
8300                goto reject_out;
8301
8302        cmdsize = sizeof(struct RTV_RSP) + sizeof(uint32_t);
8303        elsiocb = lpfc_prep_els_iocb(phba->pport, 0, cmdsize,
8304                                     lpfc_max_els_tries, ndlp,
8305                                     ndlp->nlp_DID, ELS_CMD_ACC);
8306
8307        if (!elsiocb)
8308                return 1;
8309
8310        pcmd = (uint8_t *) (((struct lpfc_dmabuf *) elsiocb->context2)->virt);
8311        *((uint32_t *) (pcmd)) = ELS_CMD_ACC;
8312        pcmd += sizeof(uint32_t); /* Skip past command */
8313
8314        /* use the command's xri in the response */
8315        elsiocb->iocb.ulpContext = cmdiocb->iocb.ulpContext;  /* Xri / rx_id */
8316        elsiocb->iocb.unsli3.rcvsli3.ox_id = cmdiocb->iocb.unsli3.rcvsli3.ox_id;
8317
8318        rtv_rsp = (struct RTV_RSP *)pcmd;
8319
8320        /* populate RTV payload */
8321        rtv_rsp->ratov = cpu_to_be32(phba->fc_ratov * 1000); /* report msecs */
8322        rtv_rsp->edtov = cpu_to_be32(phba->fc_edtov);
8323        bf_set(qtov_edtovres, rtv_rsp, phba->fc_edtovResol ? 1 : 0);
8324        bf_set(qtov_rttov, rtv_rsp, 0); /* Field is for FC ONLY */
8325        rtv_rsp->qtov = cpu_to_be32(rtv_rsp->qtov);
8326
8327        /* Xmit ELS RLS ACC response tag <ulpIoTag> */
8328        lpfc_printf_vlog(ndlp->vport, KERN_INFO, LOG_ELS,
8329                         "2875 Xmit ELS RTV ACC response tag x%x xri x%x, "
8330                         "did x%x, nlp_flag x%x, nlp_state x%x, rpi x%x, "
8331                         "Data: x%x x%x x%x\n",
8332                         elsiocb->iotag, elsiocb->iocb.ulpContext,
8333                         ndlp->nlp_DID, ndlp->nlp_flag, ndlp->nlp_state,
8334                         ndlp->nlp_rpi,
8335                        rtv_rsp->ratov, rtv_rsp->edtov, rtv_rsp->qtov);
8336        elsiocb->iocb_cmpl = lpfc_cmpl_els_rsp;
8337        phba->fc_stat.elsXmitACC++;
8338        elsiocb->context1 = lpfc_nlp_get(ndlp);
8339        if (!elsiocb->context1) {
8340                lpfc_els_free_iocb(phba, elsiocb);
8341                return 0;
8342        }
8343
8344        rc = lpfc_sli_issue_iocb(phba, LPFC_ELS_RING, elsiocb, 0);
8345        if (rc == IOCB_ERROR) {
8346                lpfc_els_free_iocb(phba, elsiocb);
8347                lpfc_nlp_put(ndlp);
8348        }
8349        return 0;
8350
8351reject_out:
8352        /* issue rejection response */
8353        stat.un.b.lsRjtRsvd0 = 0;
8354        stat.un.b.lsRjtRsnCode = LSRJT_UNABLE_TPC;
8355        stat.un.b.lsRjtRsnCodeExp = LSEXP_CANT_GIVE_DATA;
8356        stat.un.b.vendorUnique = 0;
8357        lpfc_els_rsp_reject(vport, stat.un.lsRjtError, cmdiocb, ndlp, NULL);
8358        return 0;
8359}
8360
8361/* lpfc_issue_els_rrq - Process an unsolicited rrq iocb
8362 * @vport: pointer to a host virtual N_Port data structure.
8363 * @ndlp: pointer to a node-list data structure.
8364 * @did: DID of the target.
8365 * @rrq: Pointer to the rrq struct.
8366 *
8367 * Build a ELS RRQ command and send it to the target. If the issue_iocb is
8368 * Successful the the completion handler will clear the RRQ.
8369 *
8370 * Return codes
8371 *   0 - Successfully sent rrq els iocb.
8372 *   1 - Failed to send rrq els iocb.
8373 **/
8374static int
8375lpfc_issue_els_rrq(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
8376                        uint32_t did, struct lpfc_node_rrq *rrq)
8377{
8378        struct lpfc_hba  *phba = vport->phba;
8379        struct RRQ *els_rrq;
8380        struct lpfc_iocbq *elsiocb;
8381        uint8_t *pcmd;
8382        uint16_t cmdsize;
8383        int ret;
8384
8385        if (!ndlp)
8386                return 1;
8387
8388        /* If ndlp is not NULL, we will bump the reference count on it */
8389        cmdsize = (sizeof(uint32_t) + sizeof(struct RRQ));
8390        elsiocb = lpfc_prep_els_iocb(vport, 1, cmdsize, 0, ndlp, did,
8391                                     ELS_CMD_RRQ);
8392        if (!elsiocb)
8393                return 1;
8394
8395        pcmd = (uint8_t *) (((struct lpfc_dmabuf *) elsiocb->context2)->virt);
8396
8397        /* For RRQ request, remainder of payload is Exchange IDs */
8398        *((uint32_t *) (pcmd)) = ELS_CMD_RRQ;
8399        pcmd += sizeof(uint32_t);
8400        els_rrq = (struct RRQ *) pcmd;
8401
8402        bf_set(rrq_oxid, els_rrq, phba->sli4_hba.xri_ids[rrq->xritag]);
8403        bf_set(rrq_rxid, els_rrq, rrq->rxid);
8404        bf_set(rrq_did, els_rrq, vport->fc_myDID);
8405        els_rrq->rrq = cpu_to_be32(els_rrq->rrq);
8406        els_rrq->rrq_exchg = cpu_to_be32(els_rrq->rrq_exchg);
8407
8408
8409        lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_CMD,
8410                "Issue RRQ:     did:x%x",
8411                did, rrq->xritag, rrq->rxid);
8412        elsiocb->context_un.rrq = rrq;
8413        elsiocb->iocb_cmpl = lpfc_cmpl_els_rrq;
8414
8415        lpfc_nlp_get(ndlp);
8416        elsiocb->context1 = ndlp;
8417
8418        ret = lpfc_sli_issue_iocb(phba, LPFC_ELS_RING, elsiocb, 0);
8419        if (ret == IOCB_ERROR)
8420                goto io_err;
8421        return 0;
8422
8423 io_err:
8424        lpfc_els_free_iocb(phba, elsiocb);
8425        lpfc_nlp_put(ndlp);
8426        return 1;
8427}
8428
8429/**
8430 * lpfc_send_rrq - Sends ELS RRQ if needed.
8431 * @phba: pointer to lpfc hba data structure.
8432 * @rrq: pointer to the active rrq.
8433 *
8434 * This routine will call the lpfc_issue_els_rrq if the rrq is
8435 * still active for the xri. If this function returns a failure then
8436 * the caller needs to clean up the RRQ by calling lpfc_clr_active_rrq.
8437 *
8438 * Returns 0 Success.
8439 *         1 Failure.
8440 **/
8441int
8442lpfc_send_rrq(struct lpfc_hba *phba, struct lpfc_node_rrq *rrq)
8443{
8444        struct lpfc_nodelist *ndlp = lpfc_findnode_did(rrq->vport,
8445                                                       rrq->nlp_DID);
8446        if (!ndlp)
8447                return 1;
8448
8449        if (lpfc_test_rrq_active(phba, ndlp, rrq->xritag))
8450                return lpfc_issue_els_rrq(rrq->vport, ndlp,
8451                                         rrq->nlp_DID, rrq);
8452        else
8453                return 1;
8454}
8455
8456/**
8457 * lpfc_els_rsp_rpl_acc - Issue an accept rpl els command
8458 * @vport: pointer to a host virtual N_Port data structure.
8459 * @cmdsize: size of the ELS command.
8460 * @oldiocb: pointer to the original lpfc command iocb data structure.
8461 * @ndlp: pointer to a node-list data structure.
8462 *
8463 * This routine issuees an Accept (ACC) Read Port List (RPL) ELS command.
8464 * It is to be called by the lpfc_els_rcv_rpl() routine to accept the RPL.
8465 *
8466 * Note that the ndlp reference count will be incremented by 1 for holding the
8467 * ndlp and the reference to ndlp will be stored into the context1 field of
8468 * the IOCB for the completion callback function to the RPL Accept Response
8469 * ELS command.
8470 *
8471 * Return code
8472 *   0 - Successfully issued ACC RPL ELS command
8473 *   1 - Failed to issue ACC RPL ELS command
8474 **/
8475static int
8476lpfc_els_rsp_rpl_acc(struct lpfc_vport *vport, uint16_t cmdsize,
8477                     struct lpfc_iocbq *oldiocb, struct lpfc_nodelist *ndlp)
8478{
8479        int rc = 0;
8480        struct lpfc_hba *phba = vport->phba;
8481        IOCB_t *icmd, *oldcmd;
8482        RPL_RSP rpl_rsp;
8483        struct lpfc_iocbq *elsiocb;
8484        uint8_t *pcmd;
8485
8486        elsiocb = lpfc_prep_els_iocb(vport, 0, cmdsize, oldiocb->retry, ndlp,
8487                                     ndlp->nlp_DID, ELS_CMD_ACC);
8488
8489        if (!elsiocb)
8490                return 1;
8491
8492        icmd = &elsiocb->iocb;
8493        oldcmd = &oldiocb->iocb;
8494        icmd->ulpContext = oldcmd->ulpContext;  /* Xri / rx_id */
8495        icmd->unsli3.rcvsli3.ox_id = oldcmd->unsli3.rcvsli3.ox_id;
8496
8497        pcmd = (((struct lpfc_dmabuf *) elsiocb->context2)->virt);
8498        *((uint32_t *) (pcmd)) = ELS_CMD_ACC;
8499        pcmd += sizeof(uint16_t);
8500        *((uint16_t *)(pcmd)) = be16_to_cpu(cmdsize);
8501        pcmd += sizeof(uint16_t);
8502
8503        /* Setup the RPL ACC payload */
8504        rpl_rsp.listLen = be32_to_cpu(1);
8505        rpl_rsp.index = 0;
8506        rpl_rsp.port_num_blk.portNum = 0;
8507        rpl_rsp.port_num_blk.portID = be32_to_cpu(vport->fc_myDID);
8508        memcpy(&rpl_rsp.port_num_blk.portName, &vport->fc_portname,
8509            sizeof(struct lpfc_name));
8510        memcpy(pcmd, &rpl_rsp, cmdsize - sizeof(uint32_t));
8511        /* Xmit ELS RPL ACC response tag <ulpIoTag> */
8512        lpfc_printf_vlog(vport, KERN_INFO, LOG_ELS,
8513                         "0120 Xmit ELS RPL ACC response tag x%x "
8514                         "xri x%x, did x%x, nlp_flag x%x, nlp_state x%x, "
8515                         "rpi x%x\n",
8516                         elsiocb->iotag, elsiocb->iocb.ulpContext,
8517                         ndlp->nlp_DID, ndlp->nlp_flag, ndlp->nlp_state,
8518                         ndlp->nlp_rpi);
8519        elsiocb->iocb_cmpl = lpfc_cmpl_els_rsp;
8520        phba->fc_stat.elsXmitACC++;
8521        elsiocb->context1 = lpfc_nlp_get(ndlp);
8522        if (!elsiocb->context1) {
8523                lpfc_els_free_iocb(phba, elsiocb);
8524                return 1;
8525        }
8526
8527        rc = lpfc_sli_issue_iocb(phba, LPFC_ELS_RING, elsiocb, 0);
8528        if (rc == IOCB_ERROR) {
8529                lpfc_els_free_iocb(phba, elsiocb);
8530                lpfc_nlp_put(ndlp);
8531                return 1;
8532        }
8533
8534        return 0;
8535}
8536
8537/**
8538 * lpfc_els_rcv_rpl - Process an unsolicited rpl iocb
8539 * @vport: pointer to a host virtual N_Port data structure.
8540 * @cmdiocb: pointer to lpfc command iocb data structure.
8541 * @ndlp: pointer to a node-list data structure.
8542 *
8543 * This routine processes Read Port List (RPL) IOCB received as an ELS
8544 * unsolicited event. It first checks the remote port state. If the remote
8545 * port is not in NLP_STE_UNMAPPED_NODE and NLP_STE_MAPPED_NODE states, it
8546 * invokes the lpfc_els_rsp_reject() routine to send reject response.
8547 * Otherwise, this routine then invokes the lpfc_els_rsp_rpl_acc() routine
8548 * to accept the RPL.
8549 *
8550 * Return code
8551 *   0 - Successfully processed rpl iocb (currently always return 0)
8552 **/
8553static int
8554lpfc_els_rcv_rpl(struct lpfc_vport *vport, struct lpfc_iocbq *cmdiocb,
8555                 struct lpfc_nodelist *ndlp)
8556{
8557        struct lpfc_dmabuf *pcmd;
8558        uint32_t *lp;
8559        uint32_t maxsize;
8560        uint16_t cmdsize;
8561        RPL *rpl;
8562        struct ls_rjt stat;
8563
8564        if ((ndlp->nlp_state != NLP_STE_UNMAPPED_NODE) &&
8565            (ndlp->nlp_state != NLP_STE_MAPPED_NODE)) {
8566                /* issue rejection response */
8567                stat.un.b.lsRjtRsvd0 = 0;
8568                stat.un.b.lsRjtRsnCode = LSRJT_UNABLE_TPC;
8569                stat.un.b.lsRjtRsnCodeExp = LSEXP_CANT_GIVE_DATA;
8570                stat.un.b.vendorUnique = 0;
8571                lpfc_els_rsp_reject(vport, stat.un.lsRjtError, cmdiocb, ndlp,
8572                        NULL);
8573                /* rejected the unsolicited RPL request and done with it */
8574                return 0;
8575        }
8576
8577        pcmd = (struct lpfc_dmabuf *) cmdiocb->context2;
8578        lp = (uint32_t *) pcmd->virt;
8579        rpl = (RPL *) (lp + 1);
8580        maxsize = be32_to_cpu(rpl->maxsize);
8581
8582        /* We support only one port */
8583        if ((rpl->index == 0) &&
8584            ((maxsize == 0) ||
8585             ((maxsize * sizeof(uint32_t)) >= sizeof(RPL_RSP)))) {
8586                cmdsize = sizeof(uint32_t) + sizeof(RPL_RSP);
8587        } else {
8588                cmdsize = sizeof(uint32_t) + maxsize * sizeof(uint32_t);
8589        }
8590        lpfc_els_rsp_rpl_acc(vport, cmdsize, cmdiocb, ndlp);
8591
8592        return 0;
8593}
8594
8595/**
8596 * lpfc_els_rcv_farp - Process an unsolicited farp request els command
8597 * @vport: pointer to a virtual N_Port data structure.
8598 * @cmdiocb: pointer to lpfc command iocb data structure.
8599 * @ndlp: pointer to a node-list data structure.
8600 *
8601 * This routine processes Fibre Channel Address Resolution Protocol
8602 * (FARP) Request IOCB received as an ELS unsolicited event. Currently,
8603 * the lpfc driver only supports matching on WWPN or WWNN for FARP. As such,
8604 * FARP_MATCH_PORT flag and FARP_MATCH_NODE flag are checked against the
8605 * Match Flag in the FARP request IOCB: if FARP_MATCH_PORT flag is set, the
8606 * remote PortName is compared against the FC PortName stored in the @vport
8607 * data structure; if FARP_MATCH_NODE flag is set, the remote NodeName is
8608 * compared against the FC NodeName stored in the @vport data structure.
8609 * If any of these matches and the FARP_REQUEST_FARPR flag is set in the
8610 * FARP request IOCB Response Flag, the lpfc_issue_els_farpr() routine is
8611 * invoked to send out FARP Response to the remote node. Before sending the
8612 * FARP Response, however, the FARP_REQUEST_PLOGI flag is check in the FARP
8613 * request IOCB Response Flag and, if it is set, the lpfc_issue_els_plogi()
8614 * routine is invoked to log into the remote port first.
8615 *
8616 * Return code
8617 *   0 - Either the FARP Match Mode not supported or successfully processed
8618 **/
8619static int
8620lpfc_els_rcv_farp(struct lpfc_vport *vport, struct lpfc_iocbq *cmdiocb,
8621                  struct lpfc_nodelist *ndlp)
8622{
8623        struct lpfc_dmabuf *pcmd;
8624        uint32_t *lp;
8625        IOCB_t *icmd;
8626        FARP *fp;
8627        uint32_t cnt, did;
8628
8629        icmd = &cmdiocb->iocb;
8630        did = icmd->un.elsreq64.remoteID;
8631        pcmd = (struct lpfc_dmabuf *) cmdiocb->context2;
8632        lp = (uint32_t *) pcmd->virt;
8633
8634        lp++;
8635        fp = (FARP *) lp;
8636        /* FARP-REQ received from DID <did> */
8637        lpfc_printf_vlog(vport, KERN_INFO, LOG_ELS,
8638                         "0601 FARP-REQ received from DID x%x\n", did);
8639        /* We will only support match on WWPN or WWNN */
8640        if (fp->Mflags & ~(FARP_MATCH_NODE | FARP_MATCH_PORT)) {
8641                return 0;
8642        }
8643
8644        cnt = 0;
8645        /* If this FARP command is searching for my portname */
8646        if (fp->Mflags & FARP_MATCH_PORT) {
8647                if (memcmp(&fp->RportName, &vport->fc_portname,
8648                           sizeof(struct lpfc_name)) == 0)
8649                        cnt = 1;
8650        }
8651
8652        /* If this FARP command is searching for my nodename */
8653        if (fp->Mflags & FARP_MATCH_NODE) {
8654                if (memcmp(&fp->RnodeName, &vport->fc_nodename,
8655                           sizeof(struct lpfc_name)) == 0)
8656                        cnt = 1;
8657        }
8658
8659        if (cnt) {
8660                if ((ndlp->nlp_state == NLP_STE_UNMAPPED_NODE) ||
8661                   (ndlp->nlp_state == NLP_STE_MAPPED_NODE)) {
8662                        /* Log back into the node before sending the FARP. */
8663                        if (fp->Rflags & FARP_REQUEST_PLOGI) {
8664                                ndlp->nlp_prev_state = ndlp->nlp_state;
8665                                lpfc_nlp_set_state(vport, ndlp,
8666                                                   NLP_STE_PLOGI_ISSUE);
8667                                lpfc_issue_els_plogi(vport, ndlp->nlp_DID, 0);
8668                        }
8669
8670                        /* Send a FARP response to that node */
8671                        if (fp->Rflags & FARP_REQUEST_FARPR)
8672                                lpfc_issue_els_farpr(vport, did, 0);
8673                }
8674        }
8675        return 0;
8676}
8677
8678/**
8679 * lpfc_els_rcv_farpr - Process an unsolicited farp response iocb
8680 * @vport: pointer to a host virtual N_Port data structure.
8681 * @cmdiocb: pointer to lpfc command iocb data structure.
8682 * @ndlp: pointer to a node-list data structure.
8683 *
8684 * This routine processes Fibre Channel Address Resolution Protocol
8685 * Response (FARPR) IOCB received as an ELS unsolicited event. It simply
8686 * invokes the lpfc_els_rsp_acc() routine to the remote node to accept
8687 * the FARP response request.
8688 *
8689 * Return code
8690 *   0 - Successfully processed FARPR IOCB (currently always return 0)
8691 **/
8692static int
8693lpfc_els_rcv_farpr(struct lpfc_vport *vport, struct lpfc_iocbq *cmdiocb,
8694                   struct lpfc_nodelist  *ndlp)
8695{
8696        struct lpfc_dmabuf *pcmd;
8697        uint32_t *lp;
8698        IOCB_t *icmd;
8699        uint32_t did;
8700
8701        icmd = &cmdiocb->iocb;
8702        did = icmd->un.elsreq64.remoteID;
8703        pcmd = (struct lpfc_dmabuf *) cmdiocb->context2;
8704        lp = (uint32_t *) pcmd->virt;
8705
8706        lp++;
8707        /* FARP-RSP received from DID <did> */
8708        lpfc_printf_vlog(vport, KERN_INFO, LOG_ELS,
8709                         "0600 FARP-RSP received from DID x%x\n", did);
8710        /* ACCEPT the Farp resp request */
8711        lpfc_els_rsp_acc(vport, ELS_CMD_ACC, cmdiocb, ndlp, NULL);
8712
8713        return 0;
8714}
8715
8716/**
8717 * lpfc_els_rcv_fan - Process an unsolicited fan iocb command
8718 * @vport: pointer to a host virtual N_Port data structure.
8719 * @cmdiocb: pointer to lpfc command iocb data structure.
8720 * @fan_ndlp: pointer to a node-list data structure.
8721 *
8722 * This routine processes a Fabric Address Notification (FAN) IOCB
8723 * command received as an ELS unsolicited event. The FAN ELS command will
8724 * only be processed on a physical port (i.e., the @vport represents the
8725 * physical port). The fabric NodeName and PortName from the FAN IOCB are
8726 * compared against those in the phba data structure. If any of those is
8727 * different, the lpfc_initial_flogi() routine is invoked to initialize
8728 * Fabric Login (FLOGI) to the fabric to start the discover over. Otherwise,
8729 * if both of those are identical, the lpfc_issue_fabric_reglogin() routine
8730 * is invoked to register login to the fabric.
8731 *
8732 * Return code
8733 *   0 - Successfully processed fan iocb (currently always return 0).
8734 **/
8735static int
8736lpfc_els_rcv_fan(struct lpfc_vport *vport, struct lpfc_iocbq *cmdiocb,
8737                 struct lpfc_nodelist *fan_ndlp)
8738{
8739        struct lpfc_hba *phba = vport->phba;
8740        uint32_t *lp;
8741        FAN *fp;
8742
8743        lpfc_printf_vlog(vport, KERN_INFO, LOG_ELS, "0265 FAN received\n");
8744        lp = (uint32_t *)((struct lpfc_dmabuf *)cmdiocb->context2)->virt;
8745        fp = (FAN *) ++lp;
8746        /* FAN received; Fan does not have a reply sequence */
8747        if ((vport == phba->pport) &&
8748            (vport->port_state == LPFC_LOCAL_CFG_LINK)) {
8749                if ((memcmp(&phba->fc_fabparam.nodeName, &fp->FnodeName,
8750                            sizeof(struct lpfc_name))) ||
8751                    (memcmp(&phba->fc_fabparam.portName, &fp->FportName,
8752                            sizeof(struct lpfc_name)))) {
8753                        /* This port has switched fabrics. FLOGI is required */
8754                        lpfc_issue_init_vfi(vport);
8755                } else {
8756                        /* FAN verified - skip FLOGI */
8757                        vport->fc_myDID = vport->fc_prevDID;
8758                        if (phba->sli_rev < LPFC_SLI_REV4)
8759                                lpfc_issue_fabric_reglogin(vport);
8760                        else {
8761                                lpfc_printf_vlog(vport, KERN_INFO, LOG_ELS,
8762                                        "3138 Need register VFI: (x%x/%x)\n",
8763                                        vport->fc_prevDID, vport->fc_myDID);
8764                                lpfc_issue_reg_vfi(vport);
8765                        }
8766                }
8767        }
8768        return 0;
8769}
8770
8771/**
8772 * lpfc_els_rcv_edc - Process an unsolicited EDC iocb
8773 * @vport: pointer to a host virtual N_Port data structure.
8774 * @cmdiocb: pointer to lpfc command iocb data structure.
8775 * @ndlp: pointer to a node-list data structure.
8776 *
8777 * Return code
8778 *   0 - Successfully processed echo iocb (currently always return 0)
8779 **/
8780static int
8781lpfc_els_rcv_edc(struct lpfc_vport *vport, struct lpfc_iocbq *cmdiocb,
8782                 struct lpfc_nodelist *ndlp)
8783{
8784        struct lpfc_hba  *phba = vport->phba;
8785        struct fc_els_edc *edc_req;
8786        struct fc_tlv_desc *tlv;
8787        uint8_t *payload;
8788        uint32_t *ptr, dtag;
8789        const char *dtag_nm;
8790        int desc_cnt = 0, bytes_remain;
8791        bool rcv_cap_desc = false;
8792
8793        payload = ((struct lpfc_dmabuf *)cmdiocb->context2)->virt;
8794
8795        edc_req = (struct fc_els_edc *)payload;
8796        bytes_remain = be32_to_cpu(edc_req->desc_len);
8797
8798        ptr = (uint32_t *)payload;
8799        lpfc_printf_vlog(vport, KERN_INFO, LOG_ELS | LOG_CGN_MGMT,
8800                         "3319 Rcv EDC payload len %d: x%x x%x x%x\n",
8801                         bytes_remain, be32_to_cpu(*ptr),
8802                         be32_to_cpu(*(ptr + 1)), be32_to_cpu(*(ptr + 2)));
8803
8804        /* No signal support unless there is a congestion descriptor */
8805        phba->cgn_reg_signal = EDC_CG_SIG_NOTSUPPORTED;
8806        phba->cgn_sig_freq = 0;
8807        phba->cgn_reg_fpin = LPFC_CGN_FPIN_ALARM | LPFC_CGN_FPIN_WARN;
8808
8809        if (bytes_remain <= 0)
8810                goto out;
8811
8812        tlv = edc_req->desc;
8813
8814        /*
8815         * cycle through EDC diagnostic descriptors to find the
8816         * congestion signaling capability descriptor
8817         */
8818        while (bytes_remain && !rcv_cap_desc) {
8819                if (bytes_remain < FC_TLV_DESC_HDR_SZ) {
8820                        lpfc_printf_log(phba, KERN_WARNING, LOG_CGN_MGMT,
8821                                        "6464 Truncated TLV hdr on "
8822                                        "Diagnostic descriptor[%d]\n",
8823                                        desc_cnt);
8824                        goto out;
8825                }
8826
8827                dtag = be32_to_cpu(tlv->desc_tag);
8828                switch (dtag) {
8829                case ELS_DTAG_LNK_FAULT_CAP:
8830                        if (bytes_remain < FC_TLV_DESC_SZ_FROM_LENGTH(tlv) ||
8831                            FC_TLV_DESC_SZ_FROM_LENGTH(tlv) !=
8832                                sizeof(struct fc_diag_lnkflt_desc)) {
8833                                lpfc_printf_log(
8834                                        phba, KERN_WARNING, LOG_CGN_MGMT,
8835                                        "6465 Truncated Link Fault Diagnostic "
8836                                        "descriptor[%d]: %d vs 0x%zx 0x%zx\n",
8837                                        desc_cnt, bytes_remain,
8838                                        FC_TLV_DESC_SZ_FROM_LENGTH(tlv),
8839                                        sizeof(struct fc_diag_cg_sig_desc));
8840                                goto out;
8841                        }
8842                        /* No action for Link Fault descriptor for now */
8843                        break;
8844                case ELS_DTAG_CG_SIGNAL_CAP:
8845                        if (bytes_remain < FC_TLV_DESC_SZ_FROM_LENGTH(tlv) ||
8846                            FC_TLV_DESC_SZ_FROM_LENGTH(tlv) !=
8847                                sizeof(struct fc_diag_cg_sig_desc)) {
8848                                lpfc_printf_log(
8849                                        phba, KERN_WARNING, LOG_CGN_MGMT,
8850                                        "6466 Truncated cgn signal Diagnostic "
8851                                        "descriptor[%d]: %d vs 0x%zx 0x%zx\n",
8852                                        desc_cnt, bytes_remain,
8853                                        FC_TLV_DESC_SZ_FROM_LENGTH(tlv),
8854                                        sizeof(struct fc_diag_cg_sig_desc));
8855                                goto out;
8856                        }
8857
8858                        phba->cgn_reg_fpin = phba->cgn_init_reg_fpin;
8859                        phba->cgn_reg_signal = phba->cgn_init_reg_signal;
8860
8861                        /* We start negotiation with lpfc_fabric_cgn_frequency.
8862                         * When we process the EDC, we will settle on the
8863                         * higher frequency.
8864                         */
8865                        phba->cgn_sig_freq = lpfc_fabric_cgn_frequency;
8866
8867                        lpfc_least_capable_settings(
8868                                phba, (struct fc_diag_cg_sig_desc *)tlv);
8869                        rcv_cap_desc = true;
8870                        break;
8871                default:
8872                        dtag_nm = lpfc_get_tlv_dtag_nm(dtag);
8873                        lpfc_printf_log(phba, KERN_WARNING, LOG_CGN_MGMT,
8874                                        "6467 unknown Diagnostic "
8875                                        "Descriptor[%d]: tag x%x (%s)\n",
8876                                        desc_cnt, dtag, dtag_nm);
8877                }
8878                bytes_remain -= FC_TLV_DESC_SZ_FROM_LENGTH(tlv);
8879                tlv = fc_tlv_next_desc(tlv);
8880                desc_cnt++;
8881        }
8882out:
8883        /* Need to send back an ACC */
8884        lpfc_issue_els_edc_rsp(vport, cmdiocb, ndlp);
8885
8886        lpfc_config_cgn_signal(phba);
8887        return 0;
8888}
8889
8890/**
8891 * lpfc_els_timeout - Handler funciton to the els timer
8892 * @t: timer context used to obtain the vport.
8893 *
8894 * This routine is invoked by the ELS timer after timeout. It posts the ELS
8895 * timer timeout event by setting the WORKER_ELS_TMO bit to the work port
8896 * event bitmap and then invokes the lpfc_worker_wake_up() routine to wake
8897 * up the worker thread. It is for the worker thread to invoke the routine
8898 * lpfc_els_timeout_handler() to work on the posted event WORKER_ELS_TMO.
8899 **/
8900void
8901lpfc_els_timeout(struct timer_list *t)
8902{
8903        struct lpfc_vport *vport = from_timer(vport, t, els_tmofunc);
8904        struct lpfc_hba   *phba = vport->phba;
8905        uint32_t tmo_posted;
8906        unsigned long iflag;
8907
8908        spin_lock_irqsave(&vport->work_port_lock, iflag);
8909        tmo_posted = vport->work_port_events & WORKER_ELS_TMO;
8910        if ((!tmo_posted) && (!(vport->load_flag & FC_UNLOADING)))
8911                vport->work_port_events |= WORKER_ELS_TMO;
8912        spin_unlock_irqrestore(&vport->work_port_lock, iflag);
8913
8914        if ((!tmo_posted) && (!(vport->load_flag & FC_UNLOADING)))
8915                lpfc_worker_wake_up(phba);
8916        return;
8917}
8918
8919
8920/**
8921 * lpfc_els_timeout_handler - Process an els timeout event
8922 * @vport: pointer to a virtual N_Port data structure.
8923 *
8924 * This routine is the actual handler function that processes an ELS timeout
8925 * event. It walks the ELS ring to get and abort all the IOCBs (except the
8926 * ABORT/CLOSE/FARP/FARPR/FDISC), which are associated with the @vport by
8927 * invoking the lpfc_sli_issue_abort_iotag() routine.
8928 **/
8929void
8930lpfc_els_timeout_handler(struct lpfc_vport *vport)
8931{
8932        struct lpfc_hba  *phba = vport->phba;
8933        struct lpfc_sli_ring *pring;
8934        struct lpfc_iocbq *tmp_iocb, *piocb;
8935        IOCB_t *cmd = NULL;
8936        struct lpfc_dmabuf *pcmd;
8937        uint32_t els_command = 0;
8938        uint32_t timeout;
8939        uint32_t remote_ID = 0xffffffff;
8940        LIST_HEAD(abort_list);
8941
8942
8943        timeout = (uint32_t)(phba->fc_ratov << 1);
8944
8945        pring = lpfc_phba_elsring(phba);
8946        if (unlikely(!pring))
8947                return;
8948
8949        if (phba->pport->load_flag & FC_UNLOADING)
8950                return;
8951
8952        spin_lock_irq(&phba->hbalock);
8953        if (phba->sli_rev == LPFC_SLI_REV4)
8954                spin_lock(&pring->ring_lock);
8955
8956        list_for_each_entry_safe(piocb, tmp_iocb, &pring->txcmplq, list) {
8957                cmd = &piocb->iocb;
8958
8959                if ((piocb->iocb_flag & LPFC_IO_LIBDFC) != 0 ||
8960                    piocb->iocb.ulpCommand == CMD_ABORT_XRI_CN ||
8961                    piocb->iocb.ulpCommand == CMD_CLOSE_XRI_CN)
8962                        continue;
8963
8964                if (piocb->vport != vport)
8965                        continue;
8966
8967                pcmd = (struct lpfc_dmabuf *) piocb->context2;
8968                if (pcmd)
8969                        els_command = *(uint32_t *) (pcmd->virt);
8970
8971                if (els_command == ELS_CMD_FARP ||
8972                    els_command == ELS_CMD_FARPR ||
8973                    els_command == ELS_CMD_FDISC)
8974                        continue;
8975
8976                if (piocb->drvrTimeout > 0) {
8977                        if (piocb->drvrTimeout >= timeout)
8978                                piocb->drvrTimeout -= timeout;
8979                        else
8980                                piocb->drvrTimeout = 0;
8981                        continue;
8982                }
8983
8984                remote_ID = 0xffffffff;
8985                if (cmd->ulpCommand != CMD_GEN_REQUEST64_CR)
8986                        remote_ID = cmd->un.elsreq64.remoteID;
8987                else {
8988                        struct lpfc_nodelist *ndlp;
8989                        ndlp = __lpfc_findnode_rpi(vport, cmd->ulpContext);
8990                        if (ndlp)
8991                                remote_ID = ndlp->nlp_DID;
8992                }
8993                list_add_tail(&piocb->dlist, &abort_list);
8994        }
8995        if (phba->sli_rev == LPFC_SLI_REV4)
8996                spin_unlock(&pring->ring_lock);
8997        spin_unlock_irq(&phba->hbalock);
8998
8999        list_for_each_entry_safe(piocb, tmp_iocb, &abort_list, dlist) {
9000                cmd = &piocb->iocb;
9001                lpfc_printf_vlog(vport, KERN_ERR, LOG_TRACE_EVENT,
9002                         "0127 ELS timeout Data: x%x x%x x%x "
9003                         "x%x\n", els_command,
9004                         remote_ID, cmd->ulpCommand, cmd->ulpIoTag);
9005                spin_lock_irq(&phba->hbalock);
9006                list_del_init(&piocb->dlist);
9007                lpfc_sli_issue_abort_iotag(phba, pring, piocb, NULL);
9008                spin_unlock_irq(&phba->hbalock);
9009        }
9010
9011        /* Make sure HBA is alive */
9012        lpfc_issue_hb_tmo(phba);
9013
9014        if (!list_empty(&pring->txcmplq))
9015                if (!(phba->pport->load_flag & FC_UNLOADING))
9016                        mod_timer(&vport->els_tmofunc,
9017                                  jiffies + msecs_to_jiffies(1000 * timeout));
9018}
9019
9020/**
9021 * lpfc_els_flush_cmd - Clean up the outstanding els commands to a vport
9022 * @vport: pointer to a host virtual N_Port data structure.
9023 *
9024 * This routine is used to clean up all the outstanding ELS commands on a
9025 * @vport. It first aborts the @vport by invoking lpfc_fabric_abort_vport()
9026 * routine. After that, it walks the ELS transmit queue to remove all the
9027 * IOCBs with the @vport other than the QUE_RING and ABORT/CLOSE IOCBs. For
9028 * the IOCBs with a non-NULL completion callback function, the callback
9029 * function will be invoked with the status set to IOSTAT_LOCAL_REJECT and
9030 * un.ulpWord[4] set to IOERR_SLI_ABORTED. For IOCBs with a NULL completion
9031 * callback function, the IOCB will simply be released. Finally, it walks
9032 * the ELS transmit completion queue to issue an abort IOCB to any transmit
9033 * completion queue IOCB that is associated with the @vport and is not
9034 * an IOCB from libdfc (i.e., the management plane IOCBs that are not
9035 * part of the discovery state machine) out to HBA by invoking the
9036 * lpfc_sli_issue_abort_iotag() routine. Note that this function issues the
9037 * abort IOCB to any transmit completion queueed IOCB, it does not guarantee
9038 * the IOCBs are aborted when this function returns.
9039 **/
9040void
9041lpfc_els_flush_cmd(struct lpfc_vport *vport)
9042{
9043        LIST_HEAD(abort_list);
9044        struct lpfc_hba  *phba = vport->phba;
9045        struct lpfc_sli_ring *pring;
9046        struct lpfc_iocbq *tmp_iocb, *piocb;
9047        IOCB_t *cmd = NULL;
9048        unsigned long iflags = 0;
9049
9050        lpfc_fabric_abort_vport(vport);
9051
9052        /*
9053         * For SLI3, only the hbalock is required.  But SLI4 needs to coordinate
9054         * with the ring insert operation.  Because lpfc_sli_issue_abort_iotag
9055         * ultimately grabs the ring_lock, the driver must splice the list into
9056         * a working list and release the locks before calling the abort.
9057         */
9058        spin_lock_irqsave(&phba->hbalock, iflags);
9059        pring = lpfc_phba_elsring(phba);
9060
9061        /* Bail out if we've no ELS wq, like in PCI error recovery case. */
9062        if (unlikely(!pring)) {
9063                spin_unlock_irqrestore(&phba->hbalock, iflags);
9064                return;
9065        }
9066
9067        if (phba->sli_rev == LPFC_SLI_REV4)
9068                spin_lock(&pring->ring_lock);
9069
9070        /* First we need to issue aborts to outstanding cmds on txcmpl */
9071        list_for_each_entry_safe(piocb, tmp_iocb, &pring->txcmplq, list) {
9072                if (piocb->iocb_flag & LPFC_IO_LIBDFC)
9073                        continue;
9074
9075                if (piocb->vport != vport)
9076                        continue;
9077
9078                if (piocb->iocb_flag & LPFC_DRIVER_ABORTED)
9079                        continue;
9080
9081                /* On the ELS ring we can have ELS_REQUESTs or
9082                 * GEN_REQUESTs waiting for a response.
9083                 */
9084                cmd = &piocb->iocb;
9085                if (cmd->ulpCommand == CMD_ELS_REQUEST64_CR) {
9086                        list_add_tail(&piocb->dlist, &abort_list);
9087
9088                        /* If the link is down when flushing ELS commands
9089                         * the firmware will not complete them till after
9090                         * the link comes back up. This may confuse
9091                         * discovery for the new link up, so we need to
9092                         * change the compl routine to just clean up the iocb
9093                         * and avoid any retry logic.
9094                         */
9095                        if (phba->link_state == LPFC_LINK_DOWN)
9096                                piocb->iocb_cmpl = lpfc_cmpl_els_link_down;
9097                }
9098                if (cmd->ulpCommand == CMD_GEN_REQUEST64_CR)
9099                        list_add_tail(&piocb->dlist, &abort_list);
9100        }
9101
9102        if (phba->sli_rev == LPFC_SLI_REV4)
9103                spin_unlock(&pring->ring_lock);
9104        spin_unlock_irqrestore(&phba->hbalock, iflags);
9105
9106        /* Abort each txcmpl iocb on aborted list and remove the dlist links. */
9107        list_for_each_entry_safe(piocb, tmp_iocb, &abort_list, dlist) {
9108                spin_lock_irqsave(&phba->hbalock, iflags);
9109                list_del_init(&piocb->dlist);
9110                lpfc_sli_issue_abort_iotag(phba, pring, piocb, NULL);
9111                spin_unlock_irqrestore(&phba->hbalock, iflags);
9112        }
9113        /* Make sure HBA is alive */
9114        lpfc_issue_hb_tmo(phba);
9115
9116        if (!list_empty(&abort_list))
9117                lpfc_printf_vlog(vport, KERN_ERR, LOG_TRACE_EVENT,
9118                                 "3387 abort list for txq not empty\n");
9119        INIT_LIST_HEAD(&abort_list);
9120
9121        spin_lock_irqsave(&phba->hbalock, iflags);
9122        if (phba->sli_rev == LPFC_SLI_REV4)
9123                spin_lock(&pring->ring_lock);
9124
9125        /* No need to abort the txq list,
9126         * just queue them up for lpfc_sli_cancel_iocbs
9127         */
9128        list_for_each_entry_safe(piocb, tmp_iocb, &pring->txq, list) {
9129                cmd = &piocb->iocb;
9130
9131                if (piocb->iocb_flag & LPFC_IO_LIBDFC) {
9132                        continue;
9133                }
9134
9135                /* Do not flush out the QUE_RING and ABORT/CLOSE iocbs */
9136                if (cmd->ulpCommand == CMD_QUE_RING_BUF_CN ||
9137                    cmd->ulpCommand == CMD_QUE_RING_BUF64_CN ||
9138                    cmd->ulpCommand == CMD_CLOSE_XRI_CN ||
9139                    cmd->ulpCommand == CMD_ABORT_XRI_CN)
9140                        continue;
9141
9142                if (piocb->vport != vport)
9143                        continue;
9144
9145                list_del_init(&piocb->list);
9146                list_add_tail(&piocb->list, &abort_list);
9147        }
9148
9149        /* The same holds true for any FLOGI/FDISC on the fabric_iocb_list */
9150        if (vport == phba->pport) {
9151                list_for_each_entry_safe(piocb, tmp_iocb,
9152                                         &phba->fabric_iocb_list, list) {
9153                        cmd = &piocb->iocb;
9154                        list_del_init(&piocb->list);
9155                        list_add_tail(&piocb->list, &abort_list);
9156                }
9157        }
9158
9159        if (phba->sli_rev == LPFC_SLI_REV4)
9160                spin_unlock(&pring->ring_lock);
9161        spin_unlock_irqrestore(&phba->hbalock, iflags);
9162
9163        /* Cancel all the IOCBs from the completions list */
9164        lpfc_sli_cancel_iocbs(phba, &abort_list,
9165                              IOSTAT_LOCAL_REJECT, IOERR_SLI_ABORTED);
9166
9167        return;
9168}
9169
9170/**
9171 * lpfc_els_flush_all_cmd - Clean up all the outstanding els commands to a HBA
9172 * @phba: pointer to lpfc hba data structure.
9173 *
9174 * This routine is used to clean up all the outstanding ELS commands on a
9175 * @phba. It first aborts the @phba by invoking the lpfc_fabric_abort_hba()
9176 * routine. After that, it walks the ELS transmit queue to remove all the
9177 * IOCBs to the @phba other than the QUE_RING and ABORT/CLOSE IOCBs. For
9178 * the IOCBs with the completion callback function associated, the callback
9179 * function will be invoked with the status set to IOSTAT_LOCAL_REJECT and
9180 * un.ulpWord[4] set to IOERR_SLI_ABORTED. For IOCBs without the completion
9181 * callback function associated, the IOCB will simply be released. Finally,
9182 * it walks the ELS transmit completion queue to issue an abort IOCB to any
9183 * transmit completion queue IOCB that is not an IOCB from libdfc (i.e., the
9184 * management plane IOCBs that are not part of the discovery state machine)
9185 * out to HBA by invoking the lpfc_sli_issue_abort_iotag() routine.
9186 **/
9187void
9188lpfc_els_flush_all_cmd(struct lpfc_hba  *phba)
9189{
9190        struct lpfc_vport *vport;
9191
9192        spin_lock_irq(&phba->port_list_lock);
9193        list_for_each_entry(vport, &phba->port_list, listentry)
9194                lpfc_els_flush_cmd(vport);
9195        spin_unlock_irq(&phba->port_list_lock);
9196
9197        return;
9198}
9199
9200/**
9201 * lpfc_send_els_failure_event - Posts an ELS command failure event
9202 * @phba: Pointer to hba context object.
9203 * @cmdiocbp: Pointer to command iocb which reported error.
9204 * @rspiocbp: Pointer to response iocb which reported error.
9205 *
9206 * This function sends an event when there is an ELS command
9207 * failure.
9208 **/
9209void
9210lpfc_send_els_failure_event(struct lpfc_hba *phba,
9211                        struct lpfc_iocbq *cmdiocbp,
9212                        struct lpfc_iocbq *rspiocbp)
9213{
9214        struct lpfc_vport *vport = cmdiocbp->vport;
9215        struct Scsi_Host *shost = lpfc_shost_from_vport(vport);
9216        struct lpfc_lsrjt_event lsrjt_event;
9217        struct lpfc_fabric_event_header fabric_event;
9218        struct ls_rjt stat;
9219        struct lpfc_nodelist *ndlp;
9220        uint32_t *pcmd;
9221
9222        ndlp = cmdiocbp->context1;
9223        if (!ndlp)
9224                return;
9225
9226        if (rspiocbp->iocb.ulpStatus == IOSTAT_LS_RJT) {
9227                lsrjt_event.header.event_type = FC_REG_ELS_EVENT;
9228                lsrjt_event.header.subcategory = LPFC_EVENT_LSRJT_RCV;
9229                memcpy(lsrjt_event.header.wwpn, &ndlp->nlp_portname,
9230                        sizeof(struct lpfc_name));
9231                memcpy(lsrjt_event.header.wwnn, &ndlp->nlp_nodename,
9232                        sizeof(struct lpfc_name));
9233                pcmd = (uint32_t *) (((struct lpfc_dmabuf *)
9234                        cmdiocbp->context2)->virt);
9235                lsrjt_event.command = (pcmd != NULL) ? *pcmd : 0;
9236                stat.un.lsRjtError = be32_to_cpu(rspiocbp->iocb.un.ulpWord[4]);
9237                lsrjt_event.reason_code = stat.un.b.lsRjtRsnCode;
9238                lsrjt_event.explanation = stat.un.b.lsRjtRsnCodeExp;
9239                fc_host_post_vendor_event(shost,
9240                        fc_get_event_number(),
9241                        sizeof(lsrjt_event),
9242                        (char *)&lsrjt_event,
9243                        LPFC_NL_VENDOR_ID);
9244                return;
9245        }
9246        if ((rspiocbp->iocb.ulpStatus == IOSTAT_NPORT_BSY) ||
9247                (rspiocbp->iocb.ulpStatus == IOSTAT_FABRIC_BSY)) {
9248                fabric_event.event_type = FC_REG_FABRIC_EVENT;
9249                if (rspiocbp->iocb.ulpStatus == IOSTAT_NPORT_BSY)
9250                        fabric_event.subcategory = LPFC_EVENT_PORT_BUSY;
9251                else
9252                        fabric_event.subcategory = LPFC_EVENT_FABRIC_BUSY;
9253                memcpy(fabric_event.wwpn, &ndlp->nlp_portname,
9254                        sizeof(struct lpfc_name));
9255                memcpy(fabric_event.wwnn, &ndlp->nlp_nodename,
9256                        sizeof(struct lpfc_name));
9257                fc_host_post_vendor_event(shost,
9258                        fc_get_event_number(),
9259                        sizeof(fabric_event),
9260                        (char *)&fabric_event,
9261                        LPFC_NL_VENDOR_ID);
9262                return;
9263        }
9264
9265}
9266
9267/**
9268 * lpfc_send_els_event - Posts unsolicited els event
9269 * @vport: Pointer to vport object.
9270 * @ndlp: Pointer FC node object.
9271 * @payload: ELS command code type.
9272 *
9273 * This function posts an event when there is an incoming
9274 * unsolicited ELS command.
9275 **/
9276static void
9277lpfc_send_els_event(struct lpfc_vport *vport,
9278                    struct lpfc_nodelist *ndlp,
9279                    uint32_t *payload)
9280{
9281        struct lpfc_els_event_header *els_data = NULL;
9282        struct lpfc_logo_event *logo_data = NULL;
9283        struct Scsi_Host *shost = lpfc_shost_from_vport(vport);
9284
9285        if (*payload == ELS_CMD_LOGO) {
9286                logo_data = kmalloc(sizeof(struct lpfc_logo_event), GFP_KERNEL);
9287                if (!logo_data) {
9288                        lpfc_printf_vlog(vport, KERN_ERR, LOG_TRACE_EVENT,
9289                                "0148 Failed to allocate memory "
9290                                "for LOGO event\n");
9291                        return;
9292                }
9293                els_data = &logo_data->header;
9294        } else {
9295                els_data = kmalloc(sizeof(struct lpfc_els_event_header),
9296                        GFP_KERNEL);
9297                if (!els_data) {
9298                        lpfc_printf_vlog(vport, KERN_ERR, LOG_TRACE_EVENT,
9299                                "0149 Failed to allocate memory "
9300                                "for ELS event\n");
9301                        return;
9302                }
9303        }
9304        els_data->event_type = FC_REG_ELS_EVENT;
9305        switch (*payload) {
9306        case ELS_CMD_PLOGI:
9307                els_data->subcategory = LPFC_EVENT_PLOGI_RCV;
9308                break;
9309        case ELS_CMD_PRLO:
9310                els_data->subcategory = LPFC_EVENT_PRLO_RCV;
9311                break;
9312        case ELS_CMD_ADISC:
9313                els_data->subcategory = LPFC_EVENT_ADISC_RCV;
9314                break;
9315        case ELS_CMD_LOGO:
9316                els_data->subcategory = LPFC_EVENT_LOGO_RCV;
9317                /* Copy the WWPN in the LOGO payload */
9318                memcpy(logo_data->logo_wwpn, &payload[2],
9319                        sizeof(struct lpfc_name));
9320                break;
9321        default:
9322                kfree(els_data);
9323                return;
9324        }
9325        memcpy(els_data->wwpn, &ndlp->nlp_portname, sizeof(struct lpfc_name));
9326        memcpy(els_data->wwnn, &ndlp->nlp_nodename, sizeof(struct lpfc_name));
9327        if (*payload == ELS_CMD_LOGO) {
9328                fc_host_post_vendor_event(shost,
9329                        fc_get_event_number(),
9330                        sizeof(struct lpfc_logo_event),
9331                        (char *)logo_data,
9332                        LPFC_NL_VENDOR_ID);
9333                kfree(logo_data);
9334        } else {
9335                fc_host_post_vendor_event(shost,
9336                        fc_get_event_number(),
9337                        sizeof(struct lpfc_els_event_header),
9338                        (char *)els_data,
9339                        LPFC_NL_VENDOR_ID);
9340                kfree(els_data);
9341        }
9342
9343        return;
9344}
9345
9346
9347DECLARE_ENUM2STR_LOOKUP(lpfc_get_fpin_li_event_nm, fc_fpin_li_event_types,
9348                        FC_FPIN_LI_EVT_TYPES_INIT);
9349
9350DECLARE_ENUM2STR_LOOKUP(lpfc_get_fpin_deli_event_nm, fc_fpin_deli_event_types,
9351                        FC_FPIN_DELI_EVT_TYPES_INIT);
9352
9353DECLARE_ENUM2STR_LOOKUP(lpfc_get_fpin_congn_event_nm, fc_fpin_congn_event_types,
9354                        FC_FPIN_CONGN_EVT_TYPES_INIT);
9355
9356DECLARE_ENUM2STR_LOOKUP(lpfc_get_fpin_congn_severity_nm,
9357                        fc_fpin_congn_severity_types,
9358                        FC_FPIN_CONGN_SEVERITY_INIT);
9359
9360
9361/**
9362 * lpfc_display_fpin_wwpn - Display WWPNs accessible by the attached port
9363 * @phba: Pointer to phba object.
9364 * @wwnlist: Pointer to list of WWPNs in FPIN payload
9365 * @cnt: count of WWPNs in FPIN payload
9366 *
9367 * This routine is called by LI and PC descriptors.
9368 * Limit the number of WWPNs displayed to 6 log messages, 6 per log message
9369 */
9370static void
9371lpfc_display_fpin_wwpn(struct lpfc_hba *phba, __be64 *wwnlist, u32 cnt)
9372{
9373        char buf[LPFC_FPIN_WWPN_LINE_SZ];
9374        __be64 wwn;
9375        u64 wwpn;
9376        int i, len;
9377        int line = 0;
9378        int wcnt = 0;
9379        bool endit = false;
9380
9381        len = scnprintf(buf, LPFC_FPIN_WWPN_LINE_SZ, "Accessible WWPNs:");
9382        for (i = 0; i < cnt; i++) {
9383                /* Are we on the last WWPN */
9384                if (i == (cnt - 1))
9385                        endit = true;
9386
9387                /* Extract the next WWPN from the payload */
9388                wwn = *wwnlist++;
9389                wwpn = be64_to_cpu(wwn);
9390                len += scnprintf(buf + len, LPFC_FPIN_WWPN_LINE_SZ - len,
9391                                 " %016llx", wwpn);
9392
9393                /* Log a message if we are on the last WWPN
9394                 * or if we hit the max allowed per message.
9395                 */
9396                wcnt++;
9397                if (wcnt == LPFC_FPIN_WWPN_LINE_CNT || endit) {
9398                        buf[len] = 0;
9399                        lpfc_printf_log(phba, KERN_INFO, LOG_ELS,
9400                                        "4686 %s\n", buf);
9401
9402                        /* Check if we reached the last WWPN */
9403                        if (endit)
9404                                return;
9405
9406                        /* Limit the number of log message displayed per FPIN */
9407                        line++;
9408                        if (line == LPFC_FPIN_WWPN_NUM_LINE) {
9409                                lpfc_printf_log(phba, KERN_INFO, LOG_ELS,
9410                                                "4687 %d WWPNs Truncated\n",
9411                                                cnt - i - 1);
9412                                return;
9413                        }
9414
9415                        /* Start over with next log message */
9416                        wcnt = 0;
9417                        len = scnprintf(buf, LPFC_FPIN_WWPN_LINE_SZ,
9418                                        "Additional WWPNs:");
9419                }
9420        }
9421}
9422
9423/**
9424 * lpfc_els_rcv_fpin_li - Process an FPIN Link Integrity Event.
9425 * @phba: Pointer to phba object.
9426 * @tlv:  Pointer to the Link Integrity Notification Descriptor.
9427 *
9428 * This function processes a Link Integrity FPIN event by logging a message.
9429 **/
9430static void
9431lpfc_els_rcv_fpin_li(struct lpfc_hba *phba, struct fc_tlv_desc *tlv)
9432{
9433        struct fc_fn_li_desc *li = (struct fc_fn_li_desc *)tlv;
9434        const char *li_evt_str;
9435        u32 li_evt, cnt;
9436
9437        li_evt = be16_to_cpu(li->event_type);
9438        li_evt_str = lpfc_get_fpin_li_event_nm(li_evt);
9439        cnt = be32_to_cpu(li->pname_count);
9440
9441        lpfc_printf_log(phba, KERN_INFO, LOG_ELS,
9442                        "4680 FPIN Link Integrity %s (x%x) "
9443                        "Detecting PN x%016llx Attached PN x%016llx "
9444                        "Duration %d mSecs Count %d Port Cnt %d\n",
9445                        li_evt_str, li_evt,
9446                        be64_to_cpu(li->detecting_wwpn),
9447                        be64_to_cpu(li->attached_wwpn),
9448                        be32_to_cpu(li->event_threshold),
9449                        be32_to_cpu(li->event_count), cnt);
9450
9451        lpfc_display_fpin_wwpn(phba, (__be64 *)&li->pname_list, cnt);
9452}
9453
9454/**
9455 * lpfc_els_rcv_fpin_del - Process an FPIN Delivery Event.
9456 * @phba: Pointer to hba object.
9457 * @tlv:  Pointer to the Delivery Notification Descriptor TLV
9458 *
9459 * This function processes a Delivery FPIN event by logging a message.
9460 **/
9461static void
9462lpfc_els_rcv_fpin_del(struct lpfc_hba *phba, struct fc_tlv_desc *tlv)
9463{
9464        struct fc_fn_deli_desc *del = (struct fc_fn_deli_desc *)tlv;
9465        const char *del_rsn_str;
9466        u32 del_rsn;
9467        __be32 *frame;
9468
9469        del_rsn = be16_to_cpu(del->deli_reason_code);
9470        del_rsn_str = lpfc_get_fpin_deli_event_nm(del_rsn);
9471
9472        /* Skip over desc_tag/desc_len header to payload */
9473        frame = (__be32 *)(del + 1);
9474
9475        lpfc_printf_log(phba, KERN_INFO, LOG_ELS,
9476                        "4681 FPIN Delivery %s (x%x) "
9477                        "Detecting PN x%016llx Attached PN x%016llx "
9478                        "DiscHdr0  x%08x "
9479                        "DiscHdr1 x%08x DiscHdr2 x%08x DiscHdr3 x%08x "
9480                        "DiscHdr4 x%08x DiscHdr5 x%08x\n",
9481                        del_rsn_str, del_rsn,
9482                        be64_to_cpu(del->detecting_wwpn),
9483                        be64_to_cpu(del->attached_wwpn),
9484                        be32_to_cpu(frame[0]),
9485                        be32_to_cpu(frame[1]),
9486                        be32_to_cpu(frame[2]),
9487                        be32_to_cpu(frame[3]),
9488                        be32_to_cpu(frame[4]),
9489                        be32_to_cpu(frame[5]));
9490}
9491
9492/**
9493 * lpfc_els_rcv_fpin_peer_cgn - Process a FPIN Peer Congestion Event.
9494 * @phba: Pointer to hba object.
9495 * @tlv:  Pointer to the Peer Congestion Notification Descriptor TLV
9496 *
9497 * This function processes a Peer Congestion FPIN event by logging a message.
9498 **/
9499static void
9500lpfc_els_rcv_fpin_peer_cgn(struct lpfc_hba *phba, struct fc_tlv_desc *tlv)
9501{
9502        struct fc_fn_peer_congn_desc *pc = (struct fc_fn_peer_congn_desc *)tlv;
9503        const char *pc_evt_str;
9504        u32 pc_evt, cnt;
9505
9506        pc_evt = be16_to_cpu(pc->event_type);
9507        pc_evt_str = lpfc_get_fpin_congn_event_nm(pc_evt);
9508        cnt = be32_to_cpu(pc->pname_count);
9509
9510        lpfc_printf_log(phba, KERN_INFO, LOG_CGN_MGMT | LOG_ELS,
9511                        "4684 FPIN Peer Congestion %s (x%x) "
9512                        "Duration %d mSecs "
9513                        "Detecting PN x%016llx Attached PN x%016llx "
9514                        "Impacted Port Cnt %d\n",
9515                        pc_evt_str, pc_evt,
9516                        be32_to_cpu(pc->event_period),
9517                        be64_to_cpu(pc->detecting_wwpn),
9518                        be64_to_cpu(pc->attached_wwpn),
9519                        cnt);
9520
9521        lpfc_display_fpin_wwpn(phba, (__be64 *)&pc->pname_list, cnt);
9522}
9523
9524/**
9525 * lpfc_els_rcv_fpin_cgn - Process an FPIN Congestion notification
9526 * @phba: Pointer to hba object.
9527 * @tlv:  Pointer to the Congestion Notification Descriptor TLV
9528 *
9529 * This function processes an FPIN Congestion Notifiction.  The notification
9530 * could be an Alarm or Warning.  This routine feeds that data into driver's
9531 * running congestion algorithm. It also processes the FPIN by
9532 * logging a message. It returns 1 to indicate deliver this message
9533 * to the upper layer or 0 to indicate don't deliver it.
9534 **/
9535static int
9536lpfc_els_rcv_fpin_cgn(struct lpfc_hba *phba, struct fc_tlv_desc *tlv)
9537{
9538        struct lpfc_cgn_info *cp;
9539        struct fc_fn_congn_desc *cgn = (struct fc_fn_congn_desc *)tlv;
9540        const char *cgn_evt_str;
9541        u32 cgn_evt;
9542        const char *cgn_sev_str;
9543        u32 cgn_sev;
9544        uint16_t value;
9545        u32 crc;
9546        bool nm_log = false;
9547        int rc = 1;
9548
9549        cgn_evt = be16_to_cpu(cgn->event_type);
9550        cgn_evt_str = lpfc_get_fpin_congn_event_nm(cgn_evt);
9551        cgn_sev = cgn->severity;
9552        cgn_sev_str = lpfc_get_fpin_congn_severity_nm(cgn_sev);
9553
9554        /* The driver only takes action on a Credit Stall or Oversubscription
9555         * event type to engage the IO algorithm.  The driver prints an
9556         * unmaskable message only for Lost Credit and Credit Stall.
9557         * TODO: Still need to have definition of host action on clear,
9558         *       lost credit and device specific event types.
9559         */
9560        switch (cgn_evt) {
9561        case FPIN_CONGN_LOST_CREDIT:
9562                nm_log = true;
9563                break;
9564        case FPIN_CONGN_CREDIT_STALL:
9565                nm_log = true;
9566                fallthrough;
9567        case FPIN_CONGN_OVERSUBSCRIPTION:
9568                if (cgn_evt == FPIN_CONGN_OVERSUBSCRIPTION)
9569                        nm_log = false;
9570                switch (cgn_sev) {
9571                case FPIN_CONGN_SEVERITY_ERROR:
9572                        /* Take action here for an Alarm event */
9573                        if (phba->cmf_active_mode != LPFC_CFG_OFF) {
9574                                if (phba->cgn_reg_fpin & LPFC_CGN_FPIN_ALARM) {
9575                                        /* Track of alarm cnt for cgn_info */
9576                                        atomic_inc(&phba->cgn_fabric_alarm_cnt);
9577                                        /* Track of alarm cnt for SYNC_WQE */
9578                                        atomic_inc(&phba->cgn_sync_alarm_cnt);
9579                                }
9580                                goto cleanup;
9581                        }
9582                        break;
9583                case FPIN_CONGN_SEVERITY_WARNING:
9584                        /* Take action here for a Warning event */
9585                        if (phba->cmf_active_mode != LPFC_CFG_OFF) {
9586                                if (phba->cgn_reg_fpin & LPFC_CGN_FPIN_WARN) {
9587                                        /* Track of warning cnt for cgn_info */
9588                                        atomic_inc(&phba->cgn_fabric_warn_cnt);
9589                                        /* Track of warning cnt for SYNC_WQE */
9590                                        atomic_inc(&phba->cgn_sync_warn_cnt);
9591                                }
9592cleanup:
9593                                /* Save frequency in ms */
9594                                phba->cgn_fpin_frequency =
9595                                        be32_to_cpu(cgn->event_period);
9596                                value = phba->cgn_fpin_frequency;
9597                                if (phba->cgn_i) {
9598                                        cp = (struct lpfc_cgn_info *)
9599                                                phba->cgn_i->virt;
9600                                        if (phba->cgn_reg_fpin &
9601                                                LPFC_CGN_FPIN_ALARM)
9602                                                cp->cgn_alarm_freq =
9603                                                        cpu_to_le16(value);
9604                                        if (phba->cgn_reg_fpin &
9605                                                LPFC_CGN_FPIN_WARN)
9606                                                cp->cgn_warn_freq =
9607                                                        cpu_to_le16(value);
9608                                        crc = lpfc_cgn_calc_crc32
9609                                                (cp,
9610                                                LPFC_CGN_INFO_SZ,
9611                                                LPFC_CGN_CRC32_SEED);
9612                                        cp->cgn_info_crc = cpu_to_le32(crc);
9613                                }
9614
9615                                /* Don't deliver to upper layer since
9616                                 * driver took action on this tlv.
9617                                 */
9618                                rc = 0;
9619                        }
9620                        break;
9621                }
9622                break;
9623        }
9624
9625        /* Change the log level to unmaskable for the following event types. */
9626        lpfc_printf_log(phba, (nm_log ? KERN_WARNING : KERN_INFO),
9627                        LOG_CGN_MGMT | LOG_ELS,
9628                        "4683 FPIN CONGESTION %s type %s (x%x) Event "
9629                        "Duration %d mSecs\n",
9630                        cgn_sev_str, cgn_evt_str, cgn_evt,
9631                        be32_to_cpu(cgn->event_period));
9632        return rc;
9633}
9634
9635void
9636lpfc_els_rcv_fpin(struct lpfc_vport *vport, void *p, u32 fpin_length)
9637{
9638        struct lpfc_hba *phba = vport->phba;
9639        struct fc_els_fpin *fpin = (struct fc_els_fpin *)p;
9640        struct fc_tlv_desc *tlv, *first_tlv, *current_tlv;
9641        const char *dtag_nm;
9642        int desc_cnt = 0, bytes_remain, cnt;
9643        u32 dtag, deliver = 0;
9644        int len;
9645
9646        /* FPINs handled only if we are in the right discovery state */
9647        if (vport->port_state < LPFC_DISC_AUTH)
9648                return;
9649
9650        /* make sure there is the full fpin header */
9651        if (fpin_length < sizeof(struct fc_els_fpin))
9652                return;
9653
9654        /* Sanity check descriptor length. The desc_len value does not
9655         * include space for the ELS command and the desc_len fields.
9656         */
9657        len = be32_to_cpu(fpin->desc_len);
9658        if (fpin_length < len + sizeof(struct fc_els_fpin)) {
9659                lpfc_printf_log(phba, KERN_WARNING, LOG_CGN_MGMT,
9660                                "4671 Bad ELS FPIN length %d: %d\n",
9661                                len, fpin_length);
9662                return;
9663        }
9664
9665        tlv = (struct fc_tlv_desc *)&fpin->fpin_desc[0];
9666        first_tlv = tlv;
9667        bytes_remain = fpin_length - offsetof(struct fc_els_fpin, fpin_desc);
9668        bytes_remain = min_t(u32, bytes_remain, be32_to_cpu(fpin->desc_len));
9669
9670        /* process each descriptor separately */
9671        while (bytes_remain >= FC_TLV_DESC_HDR_SZ &&
9672               bytes_remain >= FC_TLV_DESC_SZ_FROM_LENGTH(tlv)) {
9673                dtag = be32_to_cpu(tlv->desc_tag);
9674                switch (dtag) {
9675                case ELS_DTAG_LNK_INTEGRITY:
9676                        lpfc_els_rcv_fpin_li(phba, tlv);
9677                        deliver = 1;
9678                        break;
9679                case ELS_DTAG_DELIVERY:
9680                        lpfc_els_rcv_fpin_del(phba, tlv);
9681                        deliver = 1;
9682                        break;
9683                case ELS_DTAG_PEER_CONGEST:
9684                        lpfc_els_rcv_fpin_peer_cgn(phba, tlv);
9685                        deliver = 1;
9686                        break;
9687                case ELS_DTAG_CONGESTION:
9688                        deliver = lpfc_els_rcv_fpin_cgn(phba, tlv);
9689                        break;
9690                default:
9691                        dtag_nm = lpfc_get_tlv_dtag_nm(dtag);
9692                        lpfc_printf_log(phba, KERN_WARNING, LOG_CGN_MGMT,
9693                                        "4678 unknown FPIN descriptor[%d]: "
9694                                        "tag x%x (%s)\n",
9695                                        desc_cnt, dtag, dtag_nm);
9696
9697                        /* If descriptor is bad, drop the rest of the data */
9698                        return;
9699                }
9700                lpfc_cgn_update_stat(phba, dtag);
9701                cnt = be32_to_cpu(tlv->desc_len);
9702
9703                /* Sanity check descriptor length. The desc_len value does not
9704                 * include space for the desc_tag and the desc_len fields.
9705                 */
9706                len -= (cnt + sizeof(struct fc_tlv_desc));
9707                if (len < 0) {
9708                        dtag_nm = lpfc_get_tlv_dtag_nm(dtag);
9709                        lpfc_printf_log(phba, KERN_WARNING, LOG_CGN_MGMT,
9710                                        "4672 Bad FPIN descriptor TLV length "
9711                                        "%d: %d %d %s\n",
9712                                        cnt, len, fpin_length, dtag_nm);
9713                        return;
9714                }
9715
9716                current_tlv = tlv;
9717                bytes_remain -= FC_TLV_DESC_SZ_FROM_LENGTH(tlv);
9718                tlv = fc_tlv_next_desc(tlv);
9719
9720                /* Format payload such that the FPIN delivered to the
9721                 * upper layer is a single descriptor FPIN.
9722                 */
9723                if (desc_cnt)
9724                        memcpy(first_tlv, current_tlv,
9725                               (cnt + sizeof(struct fc_els_fpin)));
9726
9727                /* Adjust the length so that it only reflects a
9728                 * single descriptor FPIN.
9729                 */
9730                fpin_length = cnt + sizeof(struct fc_els_fpin);
9731                fpin->desc_len = cpu_to_be32(fpin_length);
9732                fpin_length += sizeof(struct fc_els_fpin); /* the entire FPIN */
9733
9734                /* Send every descriptor individually to the upper layer */
9735                if (deliver)
9736                        fc_host_fpin_rcv(lpfc_shost_from_vport(vport),
9737                                         fpin_length, (char *)fpin);
9738                desc_cnt++;
9739        }
9740}
9741
9742/**
9743 * lpfc_els_unsol_buffer - Process an unsolicited event data buffer
9744 * @phba: pointer to lpfc hba data structure.
9745 * @pring: pointer to a SLI ring.
9746 * @vport: pointer to a host virtual N_Port data structure.
9747 * @elsiocb: pointer to lpfc els command iocb data structure.
9748 *
9749 * This routine is used for processing the IOCB associated with a unsolicited
9750 * event. It first determines whether there is an existing ndlp that matches
9751 * the DID from the unsolicited IOCB. If not, it will create a new one with
9752 * the DID from the unsolicited IOCB. The ELS command from the unsolicited
9753 * IOCB is then used to invoke the proper routine and to set up proper state
9754 * of the discovery state machine.
9755 **/
9756static void
9757lpfc_els_unsol_buffer(struct lpfc_hba *phba, struct lpfc_sli_ring *pring,
9758                      struct lpfc_vport *vport, struct lpfc_iocbq *elsiocb)
9759{
9760        struct lpfc_nodelist *ndlp;
9761        struct ls_rjt stat;
9762        uint32_t *payload, payload_len;
9763        uint32_t cmd, did, newnode;
9764        uint8_t rjt_exp, rjt_err = 0, init_link = 0;
9765        IOCB_t *icmd = &elsiocb->iocb;
9766        LPFC_MBOXQ_t *mbox;
9767
9768        if (!vport || !(elsiocb->context2))
9769                goto dropit;
9770
9771        newnode = 0;
9772        payload = ((struct lpfc_dmabuf *)elsiocb->context2)->virt;
9773        payload_len = elsiocb->iocb.unsli3.rcvsli3.acc_len;
9774        cmd = *payload;
9775        if ((phba->sli3_options & LPFC_SLI3_HBQ_ENABLED) == 0)
9776                lpfc_post_buffer(phba, pring, 1);
9777
9778        did = icmd->un.rcvels.remoteID;
9779        if (icmd->ulpStatus) {
9780                lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_UNSOL,
9781                        "RCV Unsol ELS:  status:x%x/x%x did:x%x",
9782                        icmd->ulpStatus, icmd->un.ulpWord[4], did);
9783                goto dropit;
9784        }
9785
9786        /* Check to see if link went down during discovery */
9787        if (lpfc_els_chk_latt(vport))
9788                goto dropit;
9789
9790        /* Ignore traffic received during vport shutdown. */
9791        if (vport->load_flag & FC_UNLOADING)
9792                goto dropit;
9793
9794        /* If NPort discovery is delayed drop incoming ELS */
9795        if ((vport->fc_flag & FC_DISC_DELAYED) &&
9796                        (cmd != ELS_CMD_PLOGI))
9797                goto dropit;
9798
9799        ndlp = lpfc_findnode_did(vport, did);
9800        if (!ndlp) {
9801                /* Cannot find existing Fabric ndlp, so allocate a new one */
9802                ndlp = lpfc_nlp_init(vport, did);
9803                if (!ndlp)
9804                        goto dropit;
9805                lpfc_nlp_set_state(vport, ndlp, NLP_STE_NPR_NODE);
9806                newnode = 1;
9807                if ((did & Fabric_DID_MASK) == Fabric_DID_MASK)
9808                        ndlp->nlp_type |= NLP_FABRIC;
9809        } else if (ndlp->nlp_state == NLP_STE_UNUSED_NODE) {
9810                lpfc_nlp_set_state(vport, ndlp, NLP_STE_NPR_NODE);
9811                newnode = 1;
9812        }
9813
9814        phba->fc_stat.elsRcvFrame++;
9815
9816        /*
9817         * Do not process any unsolicited ELS commands
9818         * if the ndlp is in DEV_LOSS
9819         */
9820        spin_lock_irq(&ndlp->lock);
9821        if (ndlp->nlp_flag & NLP_IN_DEV_LOSS) {
9822                spin_unlock_irq(&ndlp->lock);
9823                if (newnode)
9824                        lpfc_nlp_put(ndlp);
9825                goto dropit;
9826        }
9827        spin_unlock_irq(&ndlp->lock);
9828
9829        elsiocb->context1 = lpfc_nlp_get(ndlp);
9830        if (!elsiocb->context1)
9831                goto dropit;
9832        elsiocb->vport = vport;
9833
9834        if ((cmd & ELS_CMD_MASK) == ELS_CMD_RSCN) {
9835                cmd &= ELS_CMD_MASK;
9836        }
9837        /* ELS command <elsCmd> received from NPORT <did> */
9838        lpfc_printf_vlog(vport, KERN_INFO, LOG_ELS,
9839                         "0112 ELS command x%x received from NPORT x%x "
9840                         "refcnt %d Data: x%x x%x x%x x%x\n",
9841                         cmd, did, kref_read(&ndlp->kref), vport->port_state,
9842                         vport->fc_flag, vport->fc_myDID, vport->fc_prevDID);
9843
9844        /* reject till our FLOGI completes or PLOGI assigned DID via PT2PT */
9845        if ((vport->port_state < LPFC_FABRIC_CFG_LINK) &&
9846            (cmd != ELS_CMD_FLOGI) &&
9847            !((cmd == ELS_CMD_PLOGI) && (vport->fc_flag & FC_PT2PT))) {
9848                rjt_err = LSRJT_LOGICAL_BSY;
9849                rjt_exp = LSEXP_NOTHING_MORE;
9850                goto lsrjt;
9851        }
9852
9853        switch (cmd) {
9854        case ELS_CMD_PLOGI:
9855                lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_UNSOL,
9856                        "RCV PLOGI:       did:x%x/ste:x%x flg:x%x",
9857                        did, vport->port_state, ndlp->nlp_flag);
9858
9859                phba->fc_stat.elsRcvPLOGI++;
9860                ndlp = lpfc_plogi_confirm_nport(phba, payload, ndlp);
9861                if (phba->sli_rev == LPFC_SLI_REV4 &&
9862                    (phba->pport->fc_flag & FC_PT2PT)) {
9863                        vport->fc_prevDID = vport->fc_myDID;
9864                        /* Our DID needs to be updated before registering
9865                         * the vfi. This is done in lpfc_rcv_plogi but
9866                         * that is called after the reg_vfi.
9867                         */
9868                        vport->fc_myDID = elsiocb->iocb.un.rcvels.parmRo;
9869                        lpfc_printf_vlog(vport, KERN_INFO, LOG_ELS,
9870                                         "3312 Remote port assigned DID x%x "
9871                                         "%x\n", vport->fc_myDID,
9872                                         vport->fc_prevDID);
9873                }
9874
9875                lpfc_send_els_event(vport, ndlp, payload);
9876
9877                /* If Nport discovery is delayed, reject PLOGIs */
9878                if (vport->fc_flag & FC_DISC_DELAYED) {
9879                        rjt_err = LSRJT_UNABLE_TPC;
9880                        rjt_exp = LSEXP_NOTHING_MORE;
9881                        break;
9882                }
9883
9884                if (vport->port_state < LPFC_DISC_AUTH) {
9885                        if (!(phba->pport->fc_flag & FC_PT2PT) ||
9886                                (phba->pport->fc_flag & FC_PT2PT_PLOGI)) {
9887                                rjt_err = LSRJT_UNABLE_TPC;
9888                                rjt_exp = LSEXP_NOTHING_MORE;
9889                                break;
9890                        }
9891                }
9892
9893                spin_lock_irq(&ndlp->lock);
9894                ndlp->nlp_flag &= ~NLP_TARGET_REMOVE;
9895                spin_unlock_irq(&ndlp->lock);
9896
9897                lpfc_disc_state_machine(vport, ndlp, elsiocb,
9898                                        NLP_EVT_RCV_PLOGI);
9899
9900                break;
9901        case ELS_CMD_FLOGI:
9902                lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_UNSOL,
9903                        "RCV FLOGI:       did:x%x/ste:x%x flg:x%x",
9904                        did, vport->port_state, ndlp->nlp_flag);
9905
9906                phba->fc_stat.elsRcvFLOGI++;
9907
9908                /* If the driver believes fabric discovery is done and is ready,
9909                 * bounce the link.  There is some descrepancy.
9910                 */
9911                if (vport->port_state >= LPFC_LOCAL_CFG_LINK &&
9912                    vport->fc_flag & FC_PT2PT &&
9913                    vport->rcv_flogi_cnt >= 1) {
9914                        rjt_err = LSRJT_LOGICAL_BSY;
9915                        rjt_exp = LSEXP_NOTHING_MORE;
9916                        init_link++;
9917                        goto lsrjt;
9918                }
9919
9920                lpfc_els_rcv_flogi(vport, elsiocb, ndlp);
9921                if (newnode)
9922                        lpfc_disc_state_machine(vport, ndlp, NULL,
9923                                        NLP_EVT_DEVICE_RM);
9924                break;
9925        case ELS_CMD_LOGO:
9926                lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_UNSOL,
9927                        "RCV LOGO:        did:x%x/ste:x%x flg:x%x",
9928                        did, vport->port_state, ndlp->nlp_flag);
9929
9930                phba->fc_stat.elsRcvLOGO++;
9931                lpfc_send_els_event(vport, ndlp, payload);
9932                if (vport->port_state < LPFC_DISC_AUTH) {
9933                        rjt_err = LSRJT_UNABLE_TPC;
9934                        rjt_exp = LSEXP_NOTHING_MORE;
9935                        break;
9936                }
9937                lpfc_disc_state_machine(vport, ndlp, elsiocb, NLP_EVT_RCV_LOGO);
9938                if (newnode)
9939                        lpfc_disc_state_machine(vport, ndlp, NULL,
9940                                        NLP_EVT_DEVICE_RM);
9941                break;
9942        case ELS_CMD_PRLO:
9943                lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_UNSOL,
9944                        "RCV PRLO:        did:x%x/ste:x%x flg:x%x",
9945                        did, vport->port_state, ndlp->nlp_flag);
9946
9947                phba->fc_stat.elsRcvPRLO++;
9948                lpfc_send_els_event(vport, ndlp, payload);
9949                if (vport->port_state < LPFC_DISC_AUTH) {
9950                        rjt_err = LSRJT_UNABLE_TPC;
9951                        rjt_exp = LSEXP_NOTHING_MORE;
9952                        break;
9953                }
9954                lpfc_disc_state_machine(vport, ndlp, elsiocb, NLP_EVT_RCV_PRLO);
9955                break;
9956        case ELS_CMD_LCB:
9957                phba->fc_stat.elsRcvLCB++;
9958                lpfc_els_rcv_lcb(vport, elsiocb, ndlp);
9959                break;
9960        case ELS_CMD_RDP:
9961                phba->fc_stat.elsRcvRDP++;
9962                lpfc_els_rcv_rdp(vport, elsiocb, ndlp);
9963                break;
9964        case ELS_CMD_RSCN:
9965                phba->fc_stat.elsRcvRSCN++;
9966                lpfc_els_rcv_rscn(vport, elsiocb, ndlp);
9967                if (newnode)
9968                        lpfc_disc_state_machine(vport, ndlp, NULL,
9969                                        NLP_EVT_DEVICE_RM);
9970                break;
9971        case ELS_CMD_ADISC:
9972                lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_UNSOL,
9973                        "RCV ADISC:       did:x%x/ste:x%x flg:x%x",
9974                        did, vport->port_state, ndlp->nlp_flag);
9975
9976                lpfc_send_els_event(vport, ndlp, payload);
9977                phba->fc_stat.elsRcvADISC++;
9978                if (vport->port_state < LPFC_DISC_AUTH) {
9979                        rjt_err = LSRJT_UNABLE_TPC;
9980                        rjt_exp = LSEXP_NOTHING_MORE;
9981                        break;
9982                }
9983                lpfc_disc_state_machine(vport, ndlp, elsiocb,
9984                                        NLP_EVT_RCV_ADISC);
9985                break;
9986        case ELS_CMD_PDISC:
9987                lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_UNSOL,
9988                        "RCV PDISC:       did:x%x/ste:x%x flg:x%x",
9989                        did, vport->port_state, ndlp->nlp_flag);
9990
9991                phba->fc_stat.elsRcvPDISC++;
9992                if (vport->port_state < LPFC_DISC_AUTH) {
9993                        rjt_err = LSRJT_UNABLE_TPC;
9994                        rjt_exp = LSEXP_NOTHING_MORE;
9995                        break;
9996                }
9997                lpfc_disc_state_machine(vport, ndlp, elsiocb,
9998                                        NLP_EVT_RCV_PDISC);
9999                break;
10000        case ELS_CMD_FARPR:
10001                lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_UNSOL,
10002                        "RCV FARPR:       did:x%x/ste:x%x flg:x%x",
10003                        did, vport->port_state, ndlp->nlp_flag);
10004
10005                phba->fc_stat.elsRcvFARPR++;
10006                lpfc_els_rcv_farpr(vport, elsiocb, ndlp);
10007                break;
10008        case ELS_CMD_FARP:
10009                lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_UNSOL,
10010                        "RCV FARP:        did:x%x/ste:x%x flg:x%x",
10011                        did, vport->port_state, ndlp->nlp_flag);
10012
10013                phba->fc_stat.elsRcvFARP++;
10014                lpfc_els_rcv_farp(vport, elsiocb, ndlp);
10015                break;
10016        case ELS_CMD_FAN:
10017                lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_UNSOL,
10018                        "RCV FAN:         did:x%x/ste:x%x flg:x%x",
10019                        did, vport->port_state, ndlp->nlp_flag);
10020
10021                phba->fc_stat.elsRcvFAN++;
10022                lpfc_els_rcv_fan(vport, elsiocb, ndlp);
10023                break;
10024        case ELS_CMD_PRLI:
10025        case ELS_CMD_NVMEPRLI:
10026                lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_UNSOL,
10027                        "RCV PRLI:        did:x%x/ste:x%x flg:x%x",
10028                        did, vport->port_state, ndlp->nlp_flag);
10029
10030                phba->fc_stat.elsRcvPRLI++;
10031                if ((vport->port_state < LPFC_DISC_AUTH) &&
10032                    (vport->fc_flag & FC_FABRIC)) {
10033                        rjt_err = LSRJT_UNABLE_TPC;
10034                        rjt_exp = LSEXP_NOTHING_MORE;
10035                        break;
10036                }
10037                lpfc_disc_state_machine(vport, ndlp, elsiocb, NLP_EVT_RCV_PRLI);
10038                break;
10039        case ELS_CMD_LIRR:
10040                lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_UNSOL,
10041                        "RCV LIRR:        did:x%x/ste:x%x flg:x%x",
10042                        did, vport->port_state, ndlp->nlp_flag);
10043
10044                phba->fc_stat.elsRcvLIRR++;
10045                lpfc_els_rcv_lirr(vport, elsiocb, ndlp);
10046                if (newnode)
10047                        lpfc_disc_state_machine(vport, ndlp, NULL,
10048                                        NLP_EVT_DEVICE_RM);
10049                break;
10050        case ELS_CMD_RLS:
10051                lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_UNSOL,
10052                        "RCV RLS:         did:x%x/ste:x%x flg:x%x",
10053                        did, vport->port_state, ndlp->nlp_flag);
10054
10055                phba->fc_stat.elsRcvRLS++;
10056                lpfc_els_rcv_rls(vport, elsiocb, ndlp);
10057                if (newnode)
10058                        lpfc_disc_state_machine(vport, ndlp, NULL,
10059                                        NLP_EVT_DEVICE_RM);
10060                break;
10061        case ELS_CMD_RPL:
10062                lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_UNSOL,
10063                        "RCV RPL:         did:x%x/ste:x%x flg:x%x",
10064                        did, vport->port_state, ndlp->nlp_flag);
10065
10066                phba->fc_stat.elsRcvRPL++;
10067                lpfc_els_rcv_rpl(vport, elsiocb, ndlp);
10068                if (newnode)
10069                        lpfc_disc_state_machine(vport, ndlp, NULL,
10070                                        NLP_EVT_DEVICE_RM);
10071                break;
10072        case ELS_CMD_RNID:
10073                lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_UNSOL,
10074                        "RCV RNID:        did:x%x/ste:x%x flg:x%x",
10075                        did, vport->port_state, ndlp->nlp_flag);
10076
10077                phba->fc_stat.elsRcvRNID++;
10078                lpfc_els_rcv_rnid(vport, elsiocb, ndlp);
10079                if (newnode)
10080                        lpfc_disc_state_machine(vport, ndlp, NULL,
10081                                        NLP_EVT_DEVICE_RM);
10082                break;
10083        case ELS_CMD_RTV:
10084                lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_UNSOL,
10085                        "RCV RTV:        did:x%x/ste:x%x flg:x%x",
10086                        did, vport->port_state, ndlp->nlp_flag);
10087                phba->fc_stat.elsRcvRTV++;
10088                lpfc_els_rcv_rtv(vport, elsiocb, ndlp);
10089                if (newnode)
10090                        lpfc_disc_state_machine(vport, ndlp, NULL,
10091                                        NLP_EVT_DEVICE_RM);
10092                break;
10093        case ELS_CMD_RRQ:
10094                lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_UNSOL,
10095                        "RCV RRQ:         did:x%x/ste:x%x flg:x%x",
10096                        did, vport->port_state, ndlp->nlp_flag);
10097
10098                phba->fc_stat.elsRcvRRQ++;
10099                lpfc_els_rcv_rrq(vport, elsiocb, ndlp);
10100                if (newnode)
10101                        lpfc_disc_state_machine(vport, ndlp, NULL,
10102                                        NLP_EVT_DEVICE_RM);
10103                break;
10104        case ELS_CMD_ECHO:
10105                lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_UNSOL,
10106                        "RCV ECHO:        did:x%x/ste:x%x flg:x%x",
10107                        did, vport->port_state, ndlp->nlp_flag);
10108
10109                phba->fc_stat.elsRcvECHO++;
10110                lpfc_els_rcv_echo(vport, elsiocb, ndlp);
10111                if (newnode)
10112                        lpfc_disc_state_machine(vport, ndlp, NULL,
10113                                        NLP_EVT_DEVICE_RM);
10114                break;
10115        case ELS_CMD_REC:
10116                /* receive this due to exchange closed */
10117                rjt_err = LSRJT_UNABLE_TPC;
10118                rjt_exp = LSEXP_INVALID_OX_RX;
10119                break;
10120        case ELS_CMD_FPIN:
10121                lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_UNSOL,
10122                                      "RCV FPIN:       did:x%x/ste:x%x flg:x%x",
10123                                      did, vport->port_state, ndlp->nlp_flag);
10124
10125                lpfc_els_rcv_fpin(vport, (struct fc_els_fpin *)payload,
10126                                  payload_len);
10127
10128                /* There are no replies, so no rjt codes */
10129                break;
10130        case ELS_CMD_EDC:
10131                lpfc_els_rcv_edc(vport, elsiocb, ndlp);
10132                break;
10133        case ELS_CMD_RDF:
10134                phba->fc_stat.elsRcvRDF++;
10135                /* Accept RDF only from fabric controller */
10136                if (did != Fabric_Cntl_DID) {
10137                        lpfc_printf_vlog(vport, KERN_WARNING, LOG_ELS,
10138                                         "1115 Received RDF from invalid DID "
10139                                         "x%x\n", did);
10140                        rjt_err = LSRJT_PROTOCOL_ERR;
10141                        rjt_exp = LSEXP_NOTHING_MORE;
10142                        goto lsrjt;
10143                }
10144
10145                lpfc_els_rcv_rdf(vport, elsiocb, ndlp);
10146                break;
10147        default:
10148                lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_UNSOL,
10149                        "RCV ELS cmd:     cmd:x%x did:x%x/ste:x%x",
10150                        cmd, did, vport->port_state);
10151
10152                /* Unsupported ELS command, reject */
10153                rjt_err = LSRJT_CMD_UNSUPPORTED;
10154                rjt_exp = LSEXP_NOTHING_MORE;
10155
10156                /* Unknown ELS command <elsCmd> received from NPORT <did> */
10157                lpfc_printf_vlog(vport, KERN_ERR, LOG_TRACE_EVENT,
10158                                 "0115 Unknown ELS command x%x "
10159                                 "received from NPORT x%x\n", cmd, did);
10160                if (newnode)
10161                        lpfc_disc_state_machine(vport, ndlp, NULL,
10162                                        NLP_EVT_DEVICE_RM);
10163                break;
10164        }
10165
10166lsrjt:
10167        /* check if need to LS_RJT received ELS cmd */
10168        if (rjt_err) {
10169                memset(&stat, 0, sizeof(stat));
10170                stat.un.b.lsRjtRsnCode = rjt_err;
10171                stat.un.b.lsRjtRsnCodeExp = rjt_exp;
10172                lpfc_els_rsp_reject(vport, stat.un.lsRjtError, elsiocb, ndlp,
10173                                    NULL);
10174                /* Remove the reference from above for new nodes. */
10175                if (newnode)
10176                        lpfc_disc_state_machine(vport, ndlp, NULL,
10177                                        NLP_EVT_DEVICE_RM);
10178        }
10179
10180        /* Release the reference on this elsiocb, not the ndlp. */
10181        lpfc_nlp_put(elsiocb->context1);
10182        elsiocb->context1 = NULL;
10183
10184        /* Special case.  Driver received an unsolicited command that
10185         * unsupportable given the driver's current state.  Reset the
10186         * link and start over.
10187         */
10188        if (init_link) {
10189                mbox = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL);
10190                if (!mbox)
10191                        return;
10192                lpfc_linkdown(phba);
10193                lpfc_init_link(phba, mbox,
10194                               phba->cfg_topology,
10195                               phba->cfg_link_speed);
10196                mbox->u.mb.un.varInitLnk.lipsr_AL_PA = 0;
10197                mbox->mbox_cmpl = lpfc_sli_def_mbox_cmpl;
10198                mbox->vport = vport;
10199                if (lpfc_sli_issue_mbox(phba, mbox, MBX_NOWAIT) ==
10200                    MBX_NOT_FINISHED)
10201                        mempool_free(mbox, phba->mbox_mem_pool);
10202        }
10203
10204        return;
10205
10206dropit:
10207        if (vport && !(vport->load_flag & FC_UNLOADING))
10208                lpfc_printf_vlog(vport, KERN_ERR, LOG_TRACE_EVENT,
10209                        "0111 Dropping received ELS cmd "
10210                        "Data: x%x x%x x%x\n",
10211                        icmd->ulpStatus, icmd->un.ulpWord[4], icmd->ulpTimeout);
10212        phba->fc_stat.elsRcvDrop++;
10213}
10214
10215/**
10216 * lpfc_els_unsol_event - Process an unsolicited event from an els sli ring
10217 * @phba: pointer to lpfc hba data structure.
10218 * @pring: pointer to a SLI ring.
10219 * @elsiocb: pointer to lpfc els iocb data structure.
10220 *
10221 * This routine is used to process an unsolicited event received from a SLI
10222 * (Service Level Interface) ring. The actual processing of the data buffer
10223 * associated with the unsolicited event is done by invoking the routine
10224 * lpfc_els_unsol_buffer() after properly set up the iocb buffer from the
10225 * SLI ring on which the unsolicited event was received.
10226 **/
10227void
10228lpfc_els_unsol_event(struct lpfc_hba *phba, struct lpfc_sli_ring *pring,
10229                     struct lpfc_iocbq *elsiocb)
10230{
10231        struct lpfc_vport *vport = phba->pport;
10232        IOCB_t *icmd = &elsiocb->iocb;
10233        dma_addr_t paddr;
10234        struct lpfc_dmabuf *bdeBuf1 = elsiocb->context2;
10235        struct lpfc_dmabuf *bdeBuf2 = elsiocb->context3;
10236
10237        elsiocb->context1 = NULL;
10238        elsiocb->context2 = NULL;
10239        elsiocb->context3 = NULL;
10240
10241        if (icmd->ulpStatus == IOSTAT_NEED_BUFFER) {
10242                lpfc_sli_hbqbuf_add_hbqs(phba, LPFC_ELS_HBQ);
10243        } else if (icmd->ulpStatus == IOSTAT_LOCAL_REJECT &&
10244                   (icmd->un.ulpWord[4] & IOERR_PARAM_MASK) ==
10245                   IOERR_RCV_BUFFER_WAITING) {
10246                phba->fc_stat.NoRcvBuf++;
10247                /* Not enough posted buffers; Try posting more buffers */
10248                if (!(phba->sli3_options & LPFC_SLI3_HBQ_ENABLED))
10249                        lpfc_post_buffer(phba, pring, 0);
10250                return;
10251        }
10252
10253        if ((phba->sli3_options & LPFC_SLI3_NPIV_ENABLED) &&
10254            (icmd->ulpCommand == CMD_IOCB_RCV_ELS64_CX ||
10255             icmd->ulpCommand == CMD_IOCB_RCV_SEQ64_CX)) {
10256                if (icmd->unsli3.rcvsli3.vpi == 0xffff)
10257                        vport = phba->pport;
10258                else
10259                        vport = lpfc_find_vport_by_vpid(phba,
10260                                                icmd->unsli3.rcvsli3.vpi);
10261        }
10262
10263        /* If there are no BDEs associated
10264         * with this IOCB, there is nothing to do.
10265         */
10266        if (icmd->ulpBdeCount == 0)
10267                return;
10268
10269        /* type of ELS cmd is first 32bit word
10270         * in packet
10271         */
10272        if (phba->sli3_options & LPFC_SLI3_HBQ_ENABLED) {
10273                elsiocb->context2 = bdeBuf1;
10274        } else {
10275                paddr = getPaddr(icmd->un.cont64[0].addrHigh,
10276                                 icmd->un.cont64[0].addrLow);
10277                elsiocb->context2 = lpfc_sli_ringpostbuf_get(phba, pring,
10278                                                             paddr);
10279        }
10280
10281        lpfc_els_unsol_buffer(phba, pring, vport, elsiocb);
10282        /*
10283         * The different unsolicited event handlers would tell us
10284         * if they are done with "mp" by setting context2 to NULL.
10285         */
10286        if (elsiocb->context2) {
10287                lpfc_in_buf_free(phba, (struct lpfc_dmabuf *)elsiocb->context2);
10288                elsiocb->context2 = NULL;
10289        }
10290
10291        /* RCV_ELS64_CX provide for 2 BDEs - process 2nd if included */
10292        if ((phba->sli3_options & LPFC_SLI3_HBQ_ENABLED) &&
10293            icmd->ulpBdeCount == 2) {
10294                elsiocb->context2 = bdeBuf2;
10295                lpfc_els_unsol_buffer(phba, pring, vport, elsiocb);
10296                /* free mp if we are done with it */
10297                if (elsiocb->context2) {
10298                        lpfc_in_buf_free(phba, elsiocb->context2);
10299                        elsiocb->context2 = NULL;
10300                }
10301        }
10302}
10303
10304static void
10305lpfc_start_fdmi(struct lpfc_vport *vport)
10306{
10307        struct lpfc_nodelist *ndlp;
10308
10309        /* If this is the first time, allocate an ndlp and initialize
10310         * it. Otherwise, make sure the node is enabled and then do the
10311         * login.
10312         */
10313        ndlp = lpfc_findnode_did(vport, FDMI_DID);
10314        if (!ndlp) {
10315                ndlp = lpfc_nlp_init(vport, FDMI_DID);
10316                if (ndlp) {
10317                        ndlp->nlp_type |= NLP_FABRIC;
10318                } else {
10319                        return;
10320                }
10321        }
10322
10323        lpfc_nlp_set_state(vport, ndlp, NLP_STE_PLOGI_ISSUE);
10324        lpfc_issue_els_plogi(vport, ndlp->nlp_DID, 0);
10325}
10326
10327/**
10328 * lpfc_do_scr_ns_plogi - Issue a plogi to the name server for scr
10329 * @phba: pointer to lpfc hba data structure.
10330 * @vport: pointer to a virtual N_Port data structure.
10331 *
10332 * This routine issues a Port Login (PLOGI) to the Name Server with
10333 * State Change Request (SCR) for a @vport. This routine will create an
10334 * ndlp for the Name Server associated to the @vport if such node does
10335 * not already exist. The PLOGI to Name Server is issued by invoking the
10336 * lpfc_issue_els_plogi() routine. If Fabric-Device Management Interface
10337 * (FDMI) is configured to the @vport, a FDMI node will be created and
10338 * the PLOGI to FDMI is issued by invoking lpfc_issue_els_plogi() routine.
10339 **/
10340void
10341lpfc_do_scr_ns_plogi(struct lpfc_hba *phba, struct lpfc_vport *vport)
10342{
10343        struct lpfc_nodelist *ndlp;
10344        struct Scsi_Host *shost = lpfc_shost_from_vport(vport);
10345
10346        /*
10347         * If lpfc_delay_discovery parameter is set and the clean address
10348         * bit is cleared and fc fabric parameters chenged, delay FC NPort
10349         * discovery.
10350         */
10351        spin_lock_irq(shost->host_lock);
10352        if (vport->fc_flag & FC_DISC_DELAYED) {
10353                spin_unlock_irq(shost->host_lock);
10354                lpfc_printf_vlog(vport, KERN_ERR, LOG_TRACE_EVENT,
10355                                 "3334 Delay fc port discovery for %d secs\n",
10356                                 phba->fc_ratov);
10357                mod_timer(&vport->delayed_disc_tmo,
10358                        jiffies + msecs_to_jiffies(1000 * phba->fc_ratov));
10359                return;
10360        }
10361        spin_unlock_irq(shost->host_lock);
10362
10363        ndlp = lpfc_findnode_did(vport, NameServer_DID);
10364        if (!ndlp) {
10365                ndlp = lpfc_nlp_init(vport, NameServer_DID);
10366                if (!ndlp) {
10367                        if (phba->fc_topology == LPFC_TOPOLOGY_LOOP) {
10368                                lpfc_disc_start(vport);
10369                                return;
10370                        }
10371                        lpfc_vport_set_state(vport, FC_VPORT_FAILED);
10372                        lpfc_printf_vlog(vport, KERN_ERR, LOG_TRACE_EVENT,
10373                                         "0251 NameServer login: no memory\n");
10374                        return;
10375                }
10376        }
10377
10378        ndlp->nlp_type |= NLP_FABRIC;
10379
10380        lpfc_nlp_set_state(vport, ndlp, NLP_STE_PLOGI_ISSUE);
10381
10382        if (lpfc_issue_els_plogi(vport, ndlp->nlp_DID, 0)) {
10383                lpfc_vport_set_state(vport, FC_VPORT_FAILED);
10384                lpfc_printf_vlog(vport, KERN_ERR, LOG_TRACE_EVENT,
10385                                 "0252 Cannot issue NameServer login\n");
10386                return;
10387        }
10388
10389        if ((phba->cfg_enable_SmartSAN ||
10390             (phba->cfg_fdmi_on == LPFC_FDMI_SUPPORT)) &&
10391             (vport->load_flag & FC_ALLOW_FDMI))
10392                lpfc_start_fdmi(vport);
10393}
10394
10395/**
10396 * lpfc_cmpl_reg_new_vport - Completion callback function to register new vport
10397 * @phba: pointer to lpfc hba data structure.
10398 * @pmb: pointer to the driver internal queue element for mailbox command.
10399 *
10400 * This routine is the completion callback function to register new vport
10401 * mailbox command. If the new vport mailbox command completes successfully,
10402 * the fabric registration login shall be performed on physical port (the
10403 * new vport created is actually a physical port, with VPI 0) or the port
10404 * login to Name Server for State Change Request (SCR) will be performed
10405 * on virtual port (real virtual port, with VPI greater than 0).
10406 **/
10407static void
10408lpfc_cmpl_reg_new_vport(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmb)
10409{
10410        struct lpfc_vport *vport = pmb->vport;
10411        struct Scsi_Host  *shost = lpfc_shost_from_vport(vport);
10412        struct lpfc_nodelist *ndlp = (struct lpfc_nodelist *)pmb->ctx_ndlp;
10413        MAILBOX_t *mb = &pmb->u.mb;
10414        int rc;
10415
10416        spin_lock_irq(shost->host_lock);
10417        vport->fc_flag &= ~FC_VPORT_NEEDS_REG_VPI;
10418        spin_unlock_irq(shost->host_lock);
10419
10420        if (mb->mbxStatus) {
10421                lpfc_printf_vlog(vport, KERN_ERR, LOG_TRACE_EVENT,
10422                                "0915 Register VPI failed : Status: x%x"
10423                                " upd bit: x%x \n", mb->mbxStatus,
10424                                 mb->un.varRegVpi.upd);
10425                if (phba->sli_rev == LPFC_SLI_REV4 &&
10426                        mb->un.varRegVpi.upd)
10427                        goto mbox_err_exit ;
10428
10429                switch (mb->mbxStatus) {
10430                case 0x11:      /* unsupported feature */
10431                case 0x9603:    /* max_vpi exceeded */
10432                case 0x9602:    /* Link event since CLEAR_LA */
10433                        /* giving up on vport registration */
10434                        lpfc_vport_set_state(vport, FC_VPORT_FAILED);
10435                        spin_lock_irq(shost->host_lock);
10436                        vport->fc_flag &= ~(FC_FABRIC | FC_PUBLIC_LOOP);
10437                        spin_unlock_irq(shost->host_lock);
10438                        lpfc_can_disctmo(vport);
10439                        break;
10440                /* If reg_vpi fail with invalid VPI status, re-init VPI */
10441                case 0x20:
10442                        spin_lock_irq(shost->host_lock);
10443                        vport->fc_flag |= FC_VPORT_NEEDS_REG_VPI;
10444                        spin_unlock_irq(shost->host_lock);
10445                        lpfc_init_vpi(phba, pmb, vport->vpi);
10446                        pmb->vport = vport;
10447                        pmb->mbox_cmpl = lpfc_init_vpi_cmpl;
10448                        rc = lpfc_sli_issue_mbox(phba, pmb,
10449                                MBX_NOWAIT);
10450                        if (rc == MBX_NOT_FINISHED) {
10451                                lpfc_printf_vlog(vport, KERN_ERR,
10452                                                 LOG_TRACE_EVENT,
10453                                        "2732 Failed to issue INIT_VPI"
10454                                        " mailbox command\n");
10455                        } else {
10456                                lpfc_nlp_put(ndlp);
10457                                return;
10458                        }
10459                        fallthrough;
10460                default:
10461                        /* Try to recover from this error */
10462                        if (phba->sli_rev == LPFC_SLI_REV4)
10463                                lpfc_sli4_unreg_all_rpis(vport);
10464                        lpfc_mbx_unreg_vpi(vport);
10465                        spin_lock_irq(shost->host_lock);
10466                        vport->fc_flag |= FC_VPORT_NEEDS_REG_VPI;
10467                        spin_unlock_irq(shost->host_lock);
10468                        if (mb->mbxStatus == MBX_NOT_FINISHED)
10469                                break;
10470                        if ((vport->port_type == LPFC_PHYSICAL_PORT) &&
10471                            !(vport->fc_flag & FC_LOGO_RCVD_DID_CHNG)) {
10472                                if (phba->sli_rev == LPFC_SLI_REV4)
10473                                        lpfc_issue_init_vfi(vport);
10474                                else
10475                                        lpfc_initial_flogi(vport);
10476                        } else {
10477                                lpfc_initial_fdisc(vport);
10478                        }
10479                        break;
10480                }
10481        } else {
10482                spin_lock_irq(shost->host_lock);
10483                vport->vpi_state |= LPFC_VPI_REGISTERED;
10484                spin_unlock_irq(shost->host_lock);
10485                if (vport == phba->pport) {
10486                        if (phba->sli_rev < LPFC_SLI_REV4)
10487                                lpfc_issue_fabric_reglogin(vport);
10488                        else {
10489                                /*
10490                                 * If the physical port is instantiated using
10491                                 * FDISC, do not start vport discovery.
10492                                 */
10493                                if (vport->port_state != LPFC_FDISC)
10494                                        lpfc_start_fdiscs(phba);
10495                                lpfc_do_scr_ns_plogi(phba, vport);
10496                        }
10497                } else {
10498                        lpfc_do_scr_ns_plogi(phba, vport);
10499                }
10500        }
10501mbox_err_exit:
10502        /* Now, we decrement the ndlp reference count held for this
10503         * callback function
10504         */
10505        lpfc_nlp_put(ndlp);
10506
10507        mempool_free(pmb, phba->mbox_mem_pool);
10508        return;
10509}
10510
10511/**
10512 * lpfc_register_new_vport - Register a new vport with a HBA
10513 * @phba: pointer to lpfc hba data structure.
10514 * @vport: pointer to a host virtual N_Port data structure.
10515 * @ndlp: pointer to a node-list data structure.
10516 *
10517 * This routine registers the @vport as a new virtual port with a HBA.
10518 * It is done through a registering vpi mailbox command.
10519 **/
10520void
10521lpfc_register_new_vport(struct lpfc_hba *phba, struct lpfc_vport *vport,
10522                        struct lpfc_nodelist *ndlp)
10523{
10524        struct Scsi_Host *shost = lpfc_shost_from_vport(vport);
10525        LPFC_MBOXQ_t *mbox;
10526
10527        mbox = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL);
10528        if (mbox) {
10529                lpfc_reg_vpi(vport, mbox);
10530                mbox->vport = vport;
10531                mbox->ctx_ndlp = lpfc_nlp_get(ndlp);
10532                if (!mbox->ctx_ndlp) {
10533                        mempool_free(mbox, phba->mbox_mem_pool);
10534                        goto mbox_err_exit;
10535                }
10536
10537                mbox->mbox_cmpl = lpfc_cmpl_reg_new_vport;
10538                if (lpfc_sli_issue_mbox(phba, mbox, MBX_NOWAIT)
10539                    == MBX_NOT_FINISHED) {
10540                        /* mailbox command not success, decrement ndlp
10541                         * reference count for this command
10542                         */
10543                        lpfc_nlp_put(ndlp);
10544                        mempool_free(mbox, phba->mbox_mem_pool);
10545
10546                        lpfc_printf_vlog(vport, KERN_ERR, LOG_TRACE_EVENT,
10547                                "0253 Register VPI: Can't send mbox\n");
10548                        goto mbox_err_exit;
10549                }
10550        } else {
10551                lpfc_printf_vlog(vport, KERN_ERR, LOG_TRACE_EVENT,
10552                                 "0254 Register VPI: no memory\n");
10553                goto mbox_err_exit;
10554        }
10555        return;
10556
10557mbox_err_exit:
10558        lpfc_vport_set_state(vport, FC_VPORT_FAILED);
10559        spin_lock_irq(shost->host_lock);
10560        vport->fc_flag &= ~FC_VPORT_NEEDS_REG_VPI;
10561        spin_unlock_irq(shost->host_lock);
10562        return;
10563}
10564
10565/**
10566 * lpfc_cancel_all_vport_retry_delay_timer - Cancel all vport retry delay timer
10567 * @phba: pointer to lpfc hba data structure.
10568 *
10569 * This routine cancels the retry delay timers to all the vports.
10570 **/
10571void
10572lpfc_cancel_all_vport_retry_delay_timer(struct lpfc_hba *phba)
10573{
10574        struct lpfc_vport **vports;
10575        struct lpfc_nodelist *ndlp;
10576        uint32_t link_state;
10577        int i;
10578
10579        /* Treat this failure as linkdown for all vports */
10580        link_state = phba->link_state;
10581        lpfc_linkdown(phba);
10582        phba->link_state = link_state;
10583
10584        vports = lpfc_create_vport_work_array(phba);
10585
10586        if (vports) {
10587                for (i = 0; i <= phba->max_vports && vports[i] != NULL; i++) {
10588                        ndlp = lpfc_findnode_did(vports[i], Fabric_DID);
10589                        if (ndlp)
10590                                lpfc_cancel_retry_delay_tmo(vports[i], ndlp);
10591                        lpfc_els_flush_cmd(vports[i]);
10592                }
10593                lpfc_destroy_vport_work_array(phba, vports);
10594        }
10595}
10596
10597/**
10598 * lpfc_retry_pport_discovery - Start timer to retry FLOGI.
10599 * @phba: pointer to lpfc hba data structure.
10600 *
10601 * This routine abort all pending discovery commands and
10602 * start a timer to retry FLOGI for the physical port
10603 * discovery.
10604 **/
10605void
10606lpfc_retry_pport_discovery(struct lpfc_hba *phba)
10607{
10608        struct lpfc_nodelist *ndlp;
10609
10610        /* Cancel the all vports retry delay retry timers */
10611        lpfc_cancel_all_vport_retry_delay_timer(phba);
10612
10613        /* If fabric require FLOGI, then re-instantiate physical login */
10614        ndlp = lpfc_findnode_did(phba->pport, Fabric_DID);
10615        if (!ndlp)
10616                return;
10617
10618        mod_timer(&ndlp->nlp_delayfunc, jiffies + msecs_to_jiffies(1000));
10619        spin_lock_irq(&ndlp->lock);
10620        ndlp->nlp_flag |= NLP_DELAY_TMO;
10621        spin_unlock_irq(&ndlp->lock);
10622        ndlp->nlp_last_elscmd = ELS_CMD_FLOGI;
10623        phba->pport->port_state = LPFC_FLOGI;
10624        return;
10625}
10626
10627/**
10628 * lpfc_fabric_login_reqd - Check if FLOGI required.
10629 * @phba: pointer to lpfc hba data structure.
10630 * @cmdiocb: pointer to FDISC command iocb.
10631 * @rspiocb: pointer to FDISC response iocb.
10632 *
10633 * This routine checks if a FLOGI is reguired for FDISC
10634 * to succeed.
10635 **/
10636static int
10637lpfc_fabric_login_reqd(struct lpfc_hba *phba,
10638                struct lpfc_iocbq *cmdiocb,
10639                struct lpfc_iocbq *rspiocb)
10640{
10641
10642        if ((rspiocb->iocb.ulpStatus != IOSTAT_FABRIC_RJT) ||
10643                (rspiocb->iocb.un.ulpWord[4] != RJT_LOGIN_REQUIRED))
10644                return 0;
10645        else
10646                return 1;
10647}
10648
10649/**
10650 * lpfc_cmpl_els_fdisc - Completion function for fdisc iocb command
10651 * @phba: pointer to lpfc hba data structure.
10652 * @cmdiocb: pointer to lpfc command iocb data structure.
10653 * @rspiocb: pointer to lpfc response iocb data structure.
10654 *
10655 * This routine is the completion callback function to a Fabric Discover
10656 * (FDISC) ELS command. Since all the FDISC ELS commands are issued
10657 * single threaded, each FDISC completion callback function will reset
10658 * the discovery timer for all vports such that the timers will not get
10659 * unnecessary timeout. The function checks the FDISC IOCB status. If error
10660 * detected, the vport will be set to FC_VPORT_FAILED state. Otherwise,the
10661 * vport will set to FC_VPORT_ACTIVE state. It then checks whether the DID
10662 * assigned to the vport has been changed with the completion of the FDISC
10663 * command. If so, both RPI (Remote Port Index) and VPI (Virtual Port Index)
10664 * are unregistered from the HBA, and then the lpfc_register_new_vport()
10665 * routine is invoked to register new vport with the HBA. Otherwise, the
10666 * lpfc_do_scr_ns_plogi() routine is invoked to issue a PLOGI to the Name
10667 * Server for State Change Request (SCR).
10668 **/
10669static void
10670lpfc_cmpl_els_fdisc(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
10671                    struct lpfc_iocbq *rspiocb)
10672{
10673        struct lpfc_vport *vport = cmdiocb->vport;
10674        struct Scsi_Host  *shost = lpfc_shost_from_vport(vport);
10675        struct lpfc_nodelist *ndlp = (struct lpfc_nodelist *) cmdiocb->context1;
10676        struct lpfc_nodelist *np;
10677        struct lpfc_nodelist *next_np;
10678        IOCB_t *irsp = &rspiocb->iocb;
10679        struct lpfc_iocbq *piocb;
10680        struct lpfc_dmabuf *pcmd = cmdiocb->context2, *prsp;
10681        struct serv_parm *sp;
10682        uint8_t fabric_param_changed;
10683
10684        lpfc_printf_vlog(vport, KERN_INFO, LOG_ELS,
10685                         "0123 FDISC completes. x%x/x%x prevDID: x%x\n",
10686                         irsp->ulpStatus, irsp->un.ulpWord[4],
10687                         vport->fc_prevDID);
10688        /* Since all FDISCs are being single threaded, we
10689         * must reset the discovery timer for ALL vports
10690         * waiting to send FDISC when one completes.
10691         */
10692        list_for_each_entry(piocb, &phba->fabric_iocb_list, list) {
10693                lpfc_set_disctmo(piocb->vport);
10694        }
10695
10696        lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_CMD,
10697                "FDISC cmpl:      status:x%x/x%x prevdid:x%x",
10698                irsp->ulpStatus, irsp->un.ulpWord[4], vport->fc_prevDID);
10699
10700        if (irsp->ulpStatus) {
10701
10702                if (lpfc_fabric_login_reqd(phba, cmdiocb, rspiocb)) {
10703                        lpfc_retry_pport_discovery(phba);
10704                        goto out;
10705                }
10706
10707                /* Check for retry */
10708                if (lpfc_els_retry(phba, cmdiocb, rspiocb))
10709                        goto out;
10710                /* FDISC failed */
10711                lpfc_printf_vlog(vport, KERN_ERR, LOG_TRACE_EVENT,
10712                                 "0126 FDISC failed. (x%x/x%x)\n",
10713                                 irsp->ulpStatus, irsp->un.ulpWord[4]);
10714                goto fdisc_failed;
10715        }
10716        spin_lock_irq(shost->host_lock);
10717        vport->fc_flag &= ~FC_VPORT_CVL_RCVD;
10718        vport->fc_flag &= ~FC_VPORT_LOGO_RCVD;
10719        vport->fc_flag |= FC_FABRIC;
10720        if (vport->phba->fc_topology == LPFC_TOPOLOGY_LOOP)
10721                vport->fc_flag |=  FC_PUBLIC_LOOP;
10722        spin_unlock_irq(shost->host_lock);
10723
10724        vport->fc_myDID = irsp->un.ulpWord[4] & Mask_DID;
10725        lpfc_vport_set_state(vport, FC_VPORT_ACTIVE);
10726        prsp = list_get_first(&pcmd->list, struct lpfc_dmabuf, list);
10727        if (!prsp)
10728                goto out;
10729        sp = prsp->virt + sizeof(uint32_t);
10730        fabric_param_changed = lpfc_check_clean_addr_bit(vport, sp);
10731        memcpy(&vport->fabric_portname, &sp->portName,
10732                sizeof(struct lpfc_name));
10733        memcpy(&vport->fabric_nodename, &sp->nodeName,
10734                sizeof(struct lpfc_name));
10735        if (fabric_param_changed &&
10736                !(vport->fc_flag & FC_VPORT_NEEDS_REG_VPI)) {
10737                /* If our NportID changed, we need to ensure all
10738                 * remaining NPORTs get unreg_login'ed so we can
10739                 * issue unreg_vpi.
10740                 */
10741                list_for_each_entry_safe(np, next_np,
10742                        &vport->fc_nodes, nlp_listp) {
10743                        if ((np->nlp_state != NLP_STE_NPR_NODE) ||
10744                            !(np->nlp_flag & NLP_NPR_ADISC))
10745                                continue;
10746                        spin_lock_irq(&ndlp->lock);
10747                        np->nlp_flag &= ~NLP_NPR_ADISC;
10748                        spin_unlock_irq(&ndlp->lock);
10749                        lpfc_unreg_rpi(vport, np);
10750                }
10751                lpfc_cleanup_pending_mbox(vport);
10752
10753                if (phba->sli_rev == LPFC_SLI_REV4)
10754                        lpfc_sli4_unreg_all_rpis(vport);
10755
10756                lpfc_mbx_unreg_vpi(vport);
10757                spin_lock_irq(shost->host_lock);
10758                vport->fc_flag |= FC_VPORT_NEEDS_REG_VPI;
10759                if (phba->sli_rev == LPFC_SLI_REV4)
10760                        vport->fc_flag |= FC_VPORT_NEEDS_INIT_VPI;
10761                else
10762                        vport->fc_flag |= FC_LOGO_RCVD_DID_CHNG;
10763                spin_unlock_irq(shost->host_lock);
10764        } else if ((phba->sli_rev == LPFC_SLI_REV4) &&
10765                !(vport->fc_flag & FC_VPORT_NEEDS_REG_VPI)) {
10766                /*
10767                 * Driver needs to re-reg VPI in order for f/w
10768                 * to update the MAC address.
10769                 */
10770                lpfc_register_new_vport(phba, vport, ndlp);
10771                lpfc_nlp_set_state(vport, ndlp, NLP_STE_UNMAPPED_NODE);
10772                goto out;
10773        }
10774
10775        if (vport->fc_flag & FC_VPORT_NEEDS_INIT_VPI)
10776                lpfc_issue_init_vpi(vport);
10777        else if (vport->fc_flag & FC_VPORT_NEEDS_REG_VPI)
10778                lpfc_register_new_vport(phba, vport, ndlp);
10779        else
10780                lpfc_do_scr_ns_plogi(phba, vport);
10781
10782        /* The FDISC completed successfully. Move the fabric ndlp to
10783         * UNMAPPED state and register with the transport.
10784         */
10785        lpfc_nlp_set_state(vport, ndlp, NLP_STE_UNMAPPED_NODE);
10786        goto out;
10787
10788fdisc_failed:
10789        if (vport->fc_vport &&
10790            (vport->fc_vport->vport_state != FC_VPORT_NO_FABRIC_RSCS))
10791                lpfc_vport_set_state(vport, FC_VPORT_FAILED);
10792        /* Cancel discovery timer */
10793        lpfc_can_disctmo(vport);
10794out:
10795        lpfc_els_free_iocb(phba, cmdiocb);
10796        lpfc_nlp_put(ndlp);
10797}
10798
10799/**
10800 * lpfc_issue_els_fdisc - Issue a fdisc iocb command
10801 * @vport: pointer to a virtual N_Port data structure.
10802 * @ndlp: pointer to a node-list data structure.
10803 * @retry: number of retries to the command IOCB.
10804 *
10805 * This routine prepares and issues a Fabric Discover (FDISC) IOCB to
10806 * a remote node (@ndlp) off a @vport. It uses the lpfc_issue_fabric_iocb()
10807 * routine to issue the IOCB, which makes sure only one outstanding fabric
10808 * IOCB will be sent off HBA at any given time.
10809 *
10810 * Note that the ndlp reference count will be incremented by 1 for holding the
10811 * ndlp and the reference to ndlp will be stored into the context1 field of
10812 * the IOCB for the completion callback function to the FDISC ELS command.
10813 *
10814 * Return code
10815 *   0 - Successfully issued fdisc iocb command
10816 *   1 - Failed to issue fdisc iocb command
10817 **/
10818static int
10819lpfc_issue_els_fdisc(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
10820                     uint8_t retry)
10821{
10822        struct lpfc_hba *phba = vport->phba;
10823        IOCB_t *icmd;
10824        struct lpfc_iocbq *elsiocb;
10825        struct serv_parm *sp;
10826        uint8_t *pcmd;
10827        uint16_t cmdsize;
10828        int did = ndlp->nlp_DID;
10829        int rc;
10830
10831        vport->port_state = LPFC_FDISC;
10832        vport->fc_myDID = 0;
10833        cmdsize = (sizeof(uint32_t) + sizeof(struct serv_parm));
10834        elsiocb = lpfc_prep_els_iocb(vport, 1, cmdsize, retry, ndlp, did,
10835                                     ELS_CMD_FDISC);
10836        if (!elsiocb) {
10837                lpfc_vport_set_state(vport, FC_VPORT_FAILED);
10838                lpfc_printf_vlog(vport, KERN_ERR, LOG_TRACE_EVENT,
10839                                 "0255 Issue FDISC: no IOCB\n");
10840                return 1;
10841        }
10842
10843        icmd = &elsiocb->iocb;
10844        icmd->un.elsreq64.myID = 0;
10845        icmd->un.elsreq64.fl = 1;
10846
10847        /*
10848         * SLI3 ports require a different context type value than SLI4.
10849         * Catch SLI3 ports here and override the prep.
10850         */
10851        if (phba->sli_rev == LPFC_SLI_REV3) {
10852                icmd->ulpCt_h = 1;
10853                icmd->ulpCt_l = 0;
10854        }
10855
10856        pcmd = (uint8_t *) (((struct lpfc_dmabuf *) elsiocb->context2)->virt);
10857        *((uint32_t *) (pcmd)) = ELS_CMD_FDISC;
10858        pcmd += sizeof(uint32_t); /* CSP Word 1 */
10859        memcpy(pcmd, &vport->phba->pport->fc_sparam, sizeof(struct serv_parm));
10860        sp = (struct serv_parm *) pcmd;
10861        /* Setup CSPs accordingly for Fabric */
10862        sp->cmn.e_d_tov = 0;
10863        sp->cmn.w2.r_a_tov = 0;
10864        sp->cmn.virtual_fabric_support = 0;
10865        sp->cls1.classValid = 0;
10866        sp->cls2.seqDelivery = 1;
10867        sp->cls3.seqDelivery = 1;
10868
10869        pcmd += sizeof(uint32_t); /* CSP Word 2 */
10870        pcmd += sizeof(uint32_t); /* CSP Word 3 */
10871        pcmd += sizeof(uint32_t); /* CSP Word 4 */
10872        pcmd += sizeof(uint32_t); /* Port Name */
10873        memcpy(pcmd, &vport->fc_portname, 8);
10874        pcmd += sizeof(uint32_t); /* Node Name */
10875        pcmd += sizeof(uint32_t); /* Node Name */
10876        memcpy(pcmd, &vport->fc_nodename, 8);
10877        sp->cmn.valid_vendor_ver_level = 0;
10878        memset(sp->un.vendorVersion, 0, sizeof(sp->un.vendorVersion));
10879        lpfc_set_disctmo(vport);
10880
10881        phba->fc_stat.elsXmitFDISC++;
10882        elsiocb->iocb_cmpl = lpfc_cmpl_els_fdisc;
10883
10884        lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_CMD,
10885                "Issue FDISC:     did:x%x",
10886                did, 0, 0);
10887
10888        elsiocb->context1 = lpfc_nlp_get(ndlp);
10889        if (!elsiocb->context1) {
10890                lpfc_els_free_iocb(phba, elsiocb);
10891                goto err_out;
10892        }
10893
10894        rc = lpfc_issue_fabric_iocb(phba, elsiocb);
10895        if (rc == IOCB_ERROR) {
10896                lpfc_els_free_iocb(phba, elsiocb);
10897                lpfc_nlp_put(ndlp);
10898                goto err_out;
10899        }
10900
10901        lpfc_vport_set_state(vport, FC_VPORT_INITIALIZING);
10902        return 0;
10903
10904 err_out:
10905        lpfc_vport_set_state(vport, FC_VPORT_FAILED);
10906        lpfc_printf_vlog(vport, KERN_ERR, LOG_TRACE_EVENT,
10907                         "0256 Issue FDISC: Cannot send IOCB\n");
10908        return 1;
10909}
10910
10911/**
10912 * lpfc_cmpl_els_npiv_logo - Completion function with vport logo
10913 * @phba: pointer to lpfc hba data structure.
10914 * @cmdiocb: pointer to lpfc command iocb data structure.
10915 * @rspiocb: pointer to lpfc response iocb data structure.
10916 *
10917 * This routine is the completion callback function to the issuing of a LOGO
10918 * ELS command off a vport. It frees the command IOCB and then decrement the
10919 * reference count held on ndlp for this completion function, indicating that
10920 * the reference to the ndlp is no long needed. Note that the
10921 * lpfc_els_free_iocb() routine decrements the ndlp reference held for this
10922 * callback function and an additional explicit ndlp reference decrementation
10923 * will trigger the actual release of the ndlp.
10924 **/
10925static void
10926lpfc_cmpl_els_npiv_logo(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
10927                        struct lpfc_iocbq *rspiocb)
10928{
10929        struct lpfc_vport *vport = cmdiocb->vport;
10930        IOCB_t *irsp;
10931        struct lpfc_nodelist *ndlp;
10932        struct Scsi_Host *shost = lpfc_shost_from_vport(vport);
10933
10934        ndlp = (struct lpfc_nodelist *)cmdiocb->context1;
10935        irsp = &rspiocb->iocb;
10936        lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_CMD,
10937                "LOGO npiv cmpl:  status:x%x/x%x did:x%x",
10938                irsp->ulpStatus, irsp->un.ulpWord[4], irsp->un.rcvels.remoteID);
10939
10940        /* NPIV LOGO completes to NPort <nlp_DID> */
10941        lpfc_printf_vlog(vport, KERN_INFO, LOG_ELS,
10942                         "2928 NPIV LOGO completes to NPort x%x "
10943                         "Data: x%x x%x x%x x%x x%x x%x x%x\n",
10944                         ndlp->nlp_DID, irsp->ulpStatus, irsp->un.ulpWord[4],
10945                         irsp->ulpTimeout, vport->num_disc_nodes,
10946                         kref_read(&ndlp->kref), ndlp->nlp_flag,
10947                         ndlp->fc4_xpt_flags);
10948
10949        if (irsp->ulpStatus == IOSTAT_SUCCESS) {
10950                spin_lock_irq(shost->host_lock);
10951                vport->fc_flag &= ~FC_NDISC_ACTIVE;
10952                vport->fc_flag &= ~FC_FABRIC;
10953                spin_unlock_irq(shost->host_lock);
10954                lpfc_can_disctmo(vport);
10955        }
10956
10957        /* Safe to release resources now. */
10958        lpfc_els_free_iocb(phba, cmdiocb);
10959        lpfc_nlp_put(ndlp);
10960        vport->unreg_vpi_cmpl = VPORT_ERROR;
10961}
10962
10963/**
10964 * lpfc_issue_els_npiv_logo - Issue a logo off a vport
10965 * @vport: pointer to a virtual N_Port data structure.
10966 * @ndlp: pointer to a node-list data structure.
10967 *
10968 * This routine issues a LOGO ELS command to an @ndlp off a @vport.
10969 *
10970 * Note that the ndlp reference count will be incremented by 1 for holding the
10971 * ndlp and the reference to ndlp will be stored into the context1 field of
10972 * the IOCB for the completion callback function to the LOGO ELS command.
10973 *
10974 * Return codes
10975 *   0 - Successfully issued logo off the @vport
10976 *   1 - Failed to issue logo off the @vport
10977 **/
10978int
10979lpfc_issue_els_npiv_logo(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp)
10980{
10981        int rc = 0;
10982        struct lpfc_hba  *phba = vport->phba;
10983        struct lpfc_iocbq *elsiocb;
10984        uint8_t *pcmd;
10985        uint16_t cmdsize;
10986
10987        cmdsize = 2 * sizeof(uint32_t) + sizeof(struct lpfc_name);
10988        elsiocb = lpfc_prep_els_iocb(vport, 1, cmdsize, 0, ndlp, ndlp->nlp_DID,
10989                                     ELS_CMD_LOGO);
10990        if (!elsiocb)
10991                return 1;
10992
10993        pcmd = (uint8_t *) (((struct lpfc_dmabuf *) elsiocb->context2)->virt);
10994        *((uint32_t *) (pcmd)) = ELS_CMD_LOGO;
10995        pcmd += sizeof(uint32_t);
10996
10997        /* Fill in LOGO payload */
10998        *((uint32_t *) (pcmd)) = be32_to_cpu(vport->fc_myDID);
10999        pcmd += sizeof(uint32_t);
11000        memcpy(pcmd, &vport->fc_portname, sizeof(struct lpfc_name));
11001
11002        lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_CMD,
11003                "Issue LOGO npiv  did:x%x flg:x%x",
11004                ndlp->nlp_DID, ndlp->nlp_flag, 0);
11005
11006        elsiocb->iocb_cmpl = lpfc_cmpl_els_npiv_logo;
11007        spin_lock_irq(&ndlp->lock);
11008        ndlp->nlp_flag |= NLP_LOGO_SND;
11009        spin_unlock_irq(&ndlp->lock);
11010        elsiocb->context1 = lpfc_nlp_get(ndlp);
11011        if (!elsiocb->context1) {
11012                lpfc_els_free_iocb(phba, elsiocb);
11013                goto err;
11014        }
11015
11016        rc = lpfc_sli_issue_iocb(phba, LPFC_ELS_RING, elsiocb, 0);
11017        if (rc == IOCB_ERROR) {
11018                lpfc_els_free_iocb(phba, elsiocb);
11019                lpfc_nlp_put(ndlp);
11020                goto err;
11021        }
11022        return 0;
11023
11024err:
11025        spin_lock_irq(&ndlp->lock);
11026        ndlp->nlp_flag &= ~NLP_LOGO_SND;
11027        spin_unlock_irq(&ndlp->lock);
11028        return 1;
11029}
11030
11031/**
11032 * lpfc_fabric_block_timeout - Handler function to the fabric block timer
11033 * @t: timer context used to obtain the lpfc hba.
11034 *
11035 * This routine is invoked by the fabric iocb block timer after
11036 * timeout. It posts the fabric iocb block timeout event by setting the
11037 * WORKER_FABRIC_BLOCK_TMO bit to work port event bitmap and then invokes
11038 * lpfc_worker_wake_up() routine to wake up the worker thread. It is for
11039 * the worker thread to invoke the lpfc_unblock_fabric_iocbs() on the
11040 * posted event WORKER_FABRIC_BLOCK_TMO.
11041 **/
11042void
11043lpfc_fabric_block_timeout(struct timer_list *t)
11044{
11045        struct lpfc_hba  *phba = from_timer(phba, t, fabric_block_timer);
11046        unsigned long iflags;
11047        uint32_t tmo_posted;
11048
11049        spin_lock_irqsave(&phba->pport->work_port_lock, iflags);
11050        tmo_posted = phba->pport->work_port_events & WORKER_FABRIC_BLOCK_TMO;
11051        if (!tmo_posted)
11052                phba->pport->work_port_events |= WORKER_FABRIC_BLOCK_TMO;
11053        spin_unlock_irqrestore(&phba->pport->work_port_lock, iflags);
11054
11055        if (!tmo_posted)
11056                lpfc_worker_wake_up(phba);
11057        return;
11058}
11059
11060/**
11061 * lpfc_resume_fabric_iocbs - Issue a fabric iocb from driver internal list
11062 * @phba: pointer to lpfc hba data structure.
11063 *
11064 * This routine issues one fabric iocb from the driver internal list to
11065 * the HBA. It first checks whether it's ready to issue one fabric iocb to
11066 * the HBA (whether there is no outstanding fabric iocb). If so, it shall
11067 * remove one pending fabric iocb from the driver internal list and invokes
11068 * lpfc_sli_issue_iocb() routine to send the fabric iocb to the HBA.
11069 **/
11070static void
11071lpfc_resume_fabric_iocbs(struct lpfc_hba *phba)
11072{
11073        struct lpfc_iocbq *iocb;
11074        unsigned long iflags;
11075        int ret;
11076        IOCB_t *cmd;
11077
11078repeat:
11079        iocb = NULL;
11080        spin_lock_irqsave(&phba->hbalock, iflags);
11081        /* Post any pending iocb to the SLI layer */
11082        if (atomic_read(&phba->fabric_iocb_count) == 0) {
11083                list_remove_head(&phba->fabric_iocb_list, iocb, typeof(*iocb),
11084                                 list);
11085                if (iocb)
11086                        /* Increment fabric iocb count to hold the position */
11087                        atomic_inc(&phba->fabric_iocb_count);
11088        }
11089        spin_unlock_irqrestore(&phba->hbalock, iflags);
11090        if (iocb) {
11091                iocb->fabric_iocb_cmpl = iocb->iocb_cmpl;
11092                iocb->iocb_cmpl = lpfc_cmpl_fabric_iocb;
11093                iocb->iocb_flag |= LPFC_IO_FABRIC;
11094
11095                lpfc_debugfs_disc_trc(iocb->vport, LPFC_DISC_TRC_ELS_CMD,
11096                        "Fabric sched1:   ste:x%x",
11097                        iocb->vport->port_state, 0, 0);
11098
11099                ret = lpfc_sli_issue_iocb(phba, LPFC_ELS_RING, iocb, 0);
11100
11101                if (ret == IOCB_ERROR) {
11102                        iocb->iocb_cmpl = iocb->fabric_iocb_cmpl;
11103                        iocb->fabric_iocb_cmpl = NULL;
11104                        iocb->iocb_flag &= ~LPFC_IO_FABRIC;
11105                        cmd = &iocb->iocb;
11106                        cmd->ulpStatus = IOSTAT_LOCAL_REJECT;
11107                        cmd->un.ulpWord[4] = IOERR_SLI_ABORTED;
11108                        iocb->iocb_cmpl(phba, iocb, iocb);
11109
11110                        atomic_dec(&phba->fabric_iocb_count);
11111                        goto repeat;
11112                }
11113        }
11114}
11115
11116/**
11117 * lpfc_unblock_fabric_iocbs - Unblock issuing fabric iocb command
11118 * @phba: pointer to lpfc hba data structure.
11119 *
11120 * This routine unblocks the  issuing fabric iocb command. The function
11121 * will clear the fabric iocb block bit and then invoke the routine
11122 * lpfc_resume_fabric_iocbs() to issue one of the pending fabric iocb
11123 * from the driver internal fabric iocb list.
11124 **/
11125void
11126lpfc_unblock_fabric_iocbs(struct lpfc_hba *phba)
11127{
11128        clear_bit(FABRIC_COMANDS_BLOCKED, &phba->bit_flags);
11129
11130        lpfc_resume_fabric_iocbs(phba);
11131        return;
11132}
11133
11134/**
11135 * lpfc_block_fabric_iocbs - Block issuing fabric iocb command
11136 * @phba: pointer to lpfc hba data structure.
11137 *
11138 * This routine blocks the issuing fabric iocb for a specified amount of
11139 * time (currently 100 ms). This is done by set the fabric iocb block bit
11140 * and set up a timeout timer for 100ms. When the block bit is set, no more
11141 * fabric iocb will be issued out of the HBA.
11142 **/
11143static void
11144lpfc_block_fabric_iocbs(struct lpfc_hba *phba)
11145{
11146        int blocked;
11147
11148        blocked = test_and_set_bit(FABRIC_COMANDS_BLOCKED, &phba->bit_flags);
11149        /* Start a timer to unblock fabric iocbs after 100ms */
11150        if (!blocked)
11151                mod_timer(&phba->fabric_block_timer,
11152                          jiffies + msecs_to_jiffies(100));
11153
11154        return;
11155}
11156
11157/**
11158 * lpfc_cmpl_fabric_iocb - Completion callback function for fabric iocb
11159 * @phba: pointer to lpfc hba data structure.
11160 * @cmdiocb: pointer to lpfc command iocb data structure.
11161 * @rspiocb: pointer to lpfc response iocb data structure.
11162 *
11163 * This routine is the callback function that is put to the fabric iocb's
11164 * callback function pointer (iocb->iocb_cmpl). The original iocb's callback
11165 * function pointer has been stored in iocb->fabric_iocb_cmpl. This callback
11166 * function first restores and invokes the original iocb's callback function
11167 * and then invokes the lpfc_resume_fabric_iocbs() routine to issue the next
11168 * fabric bound iocb from the driver internal fabric iocb list onto the wire.
11169 **/
11170static void
11171lpfc_cmpl_fabric_iocb(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
11172        struct lpfc_iocbq *rspiocb)
11173{
11174        struct ls_rjt stat;
11175
11176        BUG_ON((cmdiocb->iocb_flag & LPFC_IO_FABRIC) != LPFC_IO_FABRIC);
11177
11178        switch (rspiocb->iocb.ulpStatus) {
11179                case IOSTAT_NPORT_RJT:
11180                case IOSTAT_FABRIC_RJT:
11181                        if (rspiocb->iocb.un.ulpWord[4] & RJT_UNAVAIL_TEMP) {
11182                                lpfc_block_fabric_iocbs(phba);
11183                        }
11184                        break;
11185
11186                case IOSTAT_NPORT_BSY:
11187                case IOSTAT_FABRIC_BSY:
11188                        lpfc_block_fabric_iocbs(phba);
11189                        break;
11190
11191                case IOSTAT_LS_RJT:
11192                        stat.un.lsRjtError =
11193                                be32_to_cpu(rspiocb->iocb.un.ulpWord[4]);
11194                        if ((stat.un.b.lsRjtRsnCode == LSRJT_UNABLE_TPC) ||
11195                                (stat.un.b.lsRjtRsnCode == LSRJT_LOGICAL_BSY))
11196                                lpfc_block_fabric_iocbs(phba);
11197                        break;
11198        }
11199
11200        BUG_ON(atomic_read(&phba->fabric_iocb_count) == 0);
11201
11202        cmdiocb->iocb_cmpl = cmdiocb->fabric_iocb_cmpl;
11203        cmdiocb->fabric_iocb_cmpl = NULL;
11204        cmdiocb->iocb_flag &= ~LPFC_IO_FABRIC;
11205        cmdiocb->iocb_cmpl(phba, cmdiocb, rspiocb);
11206
11207        atomic_dec(&phba->fabric_iocb_count);
11208        if (!test_bit(FABRIC_COMANDS_BLOCKED, &phba->bit_flags)) {
11209                /* Post any pending iocbs to HBA */
11210                lpfc_resume_fabric_iocbs(phba);
11211        }
11212}
11213
11214/**
11215 * lpfc_issue_fabric_iocb - Issue a fabric iocb command
11216 * @phba: pointer to lpfc hba data structure.
11217 * @iocb: pointer to lpfc command iocb data structure.
11218 *
11219 * This routine is used as the top-level API for issuing a fabric iocb command
11220 * such as FLOGI and FDISC. To accommodate certain switch fabric, this driver
11221 * function makes sure that only one fabric bound iocb will be outstanding at
11222 * any given time. As such, this function will first check to see whether there
11223 * is already an outstanding fabric iocb on the wire. If so, it will put the
11224 * newly issued iocb onto the driver internal fabric iocb list, waiting to be
11225 * issued later. Otherwise, it will issue the iocb on the wire and update the
11226 * fabric iocb count it indicate that there is one fabric iocb on the wire.
11227 *
11228 * Note, this implementation has a potential sending out fabric IOCBs out of
11229 * order. The problem is caused by the construction of the "ready" boolen does
11230 * not include the condition that the internal fabric IOCB list is empty. As
11231 * such, it is possible a fabric IOCB issued by this routine might be "jump"
11232 * ahead of the fabric IOCBs in the internal list.
11233 *
11234 * Return code
11235 *   IOCB_SUCCESS - either fabric iocb put on the list or issued successfully
11236 *   IOCB_ERROR - failed to issue fabric iocb
11237 **/
11238static int
11239lpfc_issue_fabric_iocb(struct lpfc_hba *phba, struct lpfc_iocbq *iocb)
11240{
11241        unsigned long iflags;
11242        int ready;
11243        int ret;
11244
11245        BUG_ON(atomic_read(&phba->fabric_iocb_count) > 1);
11246
11247        spin_lock_irqsave(&phba->hbalock, iflags);
11248        ready = atomic_read(&phba->fabric_iocb_count) == 0 &&
11249                !test_bit(FABRIC_COMANDS_BLOCKED, &phba->bit_flags);
11250
11251        if (ready)
11252                /* Increment fabric iocb count to hold the position */
11253                atomic_inc(&phba->fabric_iocb_count);
11254        spin_unlock_irqrestore(&phba->hbalock, iflags);
11255        if (ready) {
11256                iocb->fabric_iocb_cmpl = iocb->iocb_cmpl;
11257                iocb->iocb_cmpl = lpfc_cmpl_fabric_iocb;
11258                iocb->iocb_flag |= LPFC_IO_FABRIC;
11259
11260                lpfc_debugfs_disc_trc(iocb->vport, LPFC_DISC_TRC_ELS_CMD,
11261                        "Fabric sched2:   ste:x%x",
11262                        iocb->vport->port_state, 0, 0);
11263
11264                ret = lpfc_sli_issue_iocb(phba, LPFC_ELS_RING, iocb, 0);
11265
11266                if (ret == IOCB_ERROR) {
11267                        iocb->iocb_cmpl = iocb->fabric_iocb_cmpl;
11268                        iocb->fabric_iocb_cmpl = NULL;
11269                        iocb->iocb_flag &= ~LPFC_IO_FABRIC;
11270                        atomic_dec(&phba->fabric_iocb_count);
11271                }
11272        } else {
11273                spin_lock_irqsave(&phba->hbalock, iflags);
11274                list_add_tail(&iocb->list, &phba->fabric_iocb_list);
11275                spin_unlock_irqrestore(&phba->hbalock, iflags);
11276                ret = IOCB_SUCCESS;
11277        }
11278        return ret;
11279}
11280
11281/**
11282 * lpfc_fabric_abort_vport - Abort a vport's iocbs from driver fabric iocb list
11283 * @vport: pointer to a virtual N_Port data structure.
11284 *
11285 * This routine aborts all the IOCBs associated with a @vport from the
11286 * driver internal fabric IOCB list. The list contains fabric IOCBs to be
11287 * issued to the ELS IOCB ring. This abort function walks the fabric IOCB
11288 * list, removes each IOCB associated with the @vport off the list, set the
11289 * status field to IOSTAT_LOCAL_REJECT, and invokes the callback function
11290 * associated with the IOCB.
11291 **/
11292static void lpfc_fabric_abort_vport(struct lpfc_vport *vport)
11293{
11294        LIST_HEAD(completions);
11295        struct lpfc_hba  *phba = vport->phba;
11296        struct lpfc_iocbq *tmp_iocb, *piocb;
11297
11298        spin_lock_irq(&phba->hbalock);
11299        list_for_each_entry_safe(piocb, tmp_iocb, &phba->fabric_iocb_list,
11300                                 list) {
11301
11302                if (piocb->vport != vport)
11303                        continue;
11304
11305                list_move_tail(&piocb->list, &completions);
11306        }
11307        spin_unlock_irq(&phba->hbalock);
11308
11309        /* Cancel all the IOCBs from the completions list */
11310        lpfc_sli_cancel_iocbs(phba, &completions, IOSTAT_LOCAL_REJECT,
11311                              IOERR_SLI_ABORTED);
11312}
11313
11314/**
11315 * lpfc_fabric_abort_nport - Abort a ndlp's iocbs from driver fabric iocb list
11316 * @ndlp: pointer to a node-list data structure.
11317 *
11318 * This routine aborts all the IOCBs associated with an @ndlp from the
11319 * driver internal fabric IOCB list. The list contains fabric IOCBs to be
11320 * issued to the ELS IOCB ring. This abort function walks the fabric IOCB
11321 * list, removes each IOCB associated with the @ndlp off the list, set the
11322 * status field to IOSTAT_LOCAL_REJECT, and invokes the callback function
11323 * associated with the IOCB.
11324 **/
11325void lpfc_fabric_abort_nport(struct lpfc_nodelist *ndlp)
11326{
11327        LIST_HEAD(completions);
11328        struct lpfc_hba  *phba = ndlp->phba;
11329        struct lpfc_iocbq *tmp_iocb, *piocb;
11330        struct lpfc_sli_ring *pring;
11331
11332        pring = lpfc_phba_elsring(phba);
11333
11334        if (unlikely(!pring))
11335                return;
11336
11337        spin_lock_irq(&phba->hbalock);
11338        list_for_each_entry_safe(piocb, tmp_iocb, &phba->fabric_iocb_list,
11339                                 list) {
11340                if ((lpfc_check_sli_ndlp(phba, pring, piocb, ndlp))) {
11341
11342                        list_move_tail(&piocb->list, &completions);
11343                }
11344        }
11345        spin_unlock_irq(&phba->hbalock);
11346
11347        /* Cancel all the IOCBs from the completions list */
11348        lpfc_sli_cancel_iocbs(phba, &completions, IOSTAT_LOCAL_REJECT,
11349                              IOERR_SLI_ABORTED);
11350}
11351
11352/**
11353 * lpfc_fabric_abort_hba - Abort all iocbs on driver fabric iocb list
11354 * @phba: pointer to lpfc hba data structure.
11355 *
11356 * This routine aborts all the IOCBs currently on the driver internal
11357 * fabric IOCB list. The list contains fabric IOCBs to be issued to the ELS
11358 * IOCB ring. This function takes the entire IOCB list off the fabric IOCB
11359 * list, removes IOCBs off the list, set the status field to
11360 * IOSTAT_LOCAL_REJECT, and invokes the callback function associated with
11361 * the IOCB.
11362 **/
11363void lpfc_fabric_abort_hba(struct lpfc_hba *phba)
11364{
11365        LIST_HEAD(completions);
11366
11367        spin_lock_irq(&phba->hbalock);
11368        list_splice_init(&phba->fabric_iocb_list, &completions);
11369        spin_unlock_irq(&phba->hbalock);
11370
11371        /* Cancel all the IOCBs from the completions list */
11372        lpfc_sli_cancel_iocbs(phba, &completions, IOSTAT_LOCAL_REJECT,
11373                              IOERR_SLI_ABORTED);
11374}
11375
11376/**
11377 * lpfc_sli4_vport_delete_els_xri_aborted -Remove all ndlp references for vport
11378 * @vport: pointer to lpfc vport data structure.
11379 *
11380 * This routine is invoked by the vport cleanup for deletions and the cleanup
11381 * for an ndlp on removal.
11382 **/
11383void
11384lpfc_sli4_vport_delete_els_xri_aborted(struct lpfc_vport *vport)
11385{
11386        struct lpfc_hba *phba = vport->phba;
11387        struct lpfc_sglq *sglq_entry = NULL, *sglq_next = NULL;
11388        unsigned long iflag = 0;
11389
11390        spin_lock_irqsave(&phba->sli4_hba.sgl_list_lock, iflag);
11391        list_for_each_entry_safe(sglq_entry, sglq_next,
11392                        &phba->sli4_hba.lpfc_abts_els_sgl_list, list) {
11393                if (sglq_entry->ndlp && sglq_entry->ndlp->vport == vport) {
11394                        lpfc_nlp_put(sglq_entry->ndlp);
11395                        sglq_entry->ndlp = NULL;
11396                }
11397        }
11398        spin_unlock_irqrestore(&phba->sli4_hba.sgl_list_lock, iflag);
11399        return;
11400}
11401
11402/**
11403 * lpfc_sli4_els_xri_aborted - Slow-path process of els xri abort
11404 * @phba: pointer to lpfc hba data structure.
11405 * @axri: pointer to the els xri abort wcqe structure.
11406 *
11407 * This routine is invoked by the worker thread to process a SLI4 slow-path
11408 * ELS aborted xri.
11409 **/
11410void
11411lpfc_sli4_els_xri_aborted(struct lpfc_hba *phba,
11412                          struct sli4_wcqe_xri_aborted *axri)
11413{
11414        uint16_t xri = bf_get(lpfc_wcqe_xa_xri, axri);
11415        uint16_t rxid = bf_get(lpfc_wcqe_xa_remote_xid, axri);
11416        uint16_t lxri = 0;
11417
11418        struct lpfc_sglq *sglq_entry = NULL, *sglq_next = NULL;
11419        unsigned long iflag = 0;
11420        struct lpfc_nodelist *ndlp;
11421        struct lpfc_sli_ring *pring;
11422
11423        pring = lpfc_phba_elsring(phba);
11424
11425        spin_lock_irqsave(&phba->sli4_hba.sgl_list_lock, iflag);
11426        list_for_each_entry_safe(sglq_entry, sglq_next,
11427                        &phba->sli4_hba.lpfc_abts_els_sgl_list, list) {
11428                if (sglq_entry->sli4_xritag == xri) {
11429                        list_del(&sglq_entry->list);
11430                        ndlp = sglq_entry->ndlp;
11431                        sglq_entry->ndlp = NULL;
11432                        list_add_tail(&sglq_entry->list,
11433                                &phba->sli4_hba.lpfc_els_sgl_list);
11434                        sglq_entry->state = SGL_FREED;
11435                        spin_unlock_irqrestore(&phba->sli4_hba.sgl_list_lock,
11436                                               iflag);
11437
11438                        if (ndlp) {
11439                                lpfc_set_rrq_active(phba, ndlp,
11440                                        sglq_entry->sli4_lxritag,
11441                                        rxid, 1);
11442                                lpfc_nlp_put(ndlp);
11443                        }
11444
11445                        /* Check if TXQ queue needs to be serviced */
11446                        if (pring && !list_empty(&pring->txq))
11447                                lpfc_worker_wake_up(phba);
11448                        return;
11449                }
11450        }
11451        spin_unlock_irqrestore(&phba->sli4_hba.sgl_list_lock, iflag);
11452        lxri = lpfc_sli4_xri_inrange(phba, xri);
11453        if (lxri == NO_XRI)
11454                return;
11455
11456        spin_lock_irqsave(&phba->hbalock, iflag);
11457        sglq_entry = __lpfc_get_active_sglq(phba, lxri);
11458        if (!sglq_entry || (sglq_entry->sli4_xritag != xri)) {
11459                spin_unlock_irqrestore(&phba->hbalock, iflag);
11460                return;
11461        }
11462        sglq_entry->state = SGL_XRI_ABORTED;
11463        spin_unlock_irqrestore(&phba->hbalock, iflag);
11464        return;
11465}
11466
11467/* lpfc_sli_abts_recover_port - Recover a port that failed a BLS_ABORT req.
11468 * @vport: pointer to virtual port object.
11469 * @ndlp: nodelist pointer for the impacted node.
11470 *
11471 * The driver calls this routine in response to an SLI4 XRI ABORT CQE
11472 * or an SLI3 ASYNC_STATUS_CN event from the port.  For either event,
11473 * the driver is required to send a LOGO to the remote node before it
11474 * attempts to recover its login to the remote node.
11475 */
11476void
11477lpfc_sli_abts_recover_port(struct lpfc_vport *vport,
11478                           struct lpfc_nodelist *ndlp)
11479{
11480        struct Scsi_Host *shost;
11481        struct lpfc_hba *phba;
11482        unsigned long flags = 0;
11483
11484        shost = lpfc_shost_from_vport(vport);
11485        phba = vport->phba;
11486        if (ndlp->nlp_state != NLP_STE_MAPPED_NODE) {
11487                lpfc_printf_log(phba, KERN_INFO,
11488                                LOG_SLI, "3093 No rport recovery needed. "
11489                                "rport in state 0x%x\n", ndlp->nlp_state);
11490                return;
11491        }
11492        lpfc_printf_log(phba, KERN_ERR, LOG_TRACE_EVENT,
11493                        "3094 Start rport recovery on shost id 0x%x "
11494                        "fc_id 0x%06x vpi 0x%x rpi 0x%x state 0x%x "
11495                        "flags 0x%x\n",
11496                        shost->host_no, ndlp->nlp_DID,
11497                        vport->vpi, ndlp->nlp_rpi, ndlp->nlp_state,
11498                        ndlp->nlp_flag);
11499        /*
11500         * The rport is not responding.  Remove the FCP-2 flag to prevent
11501         * an ADISC in the follow-up recovery code.
11502         */
11503        spin_lock_irqsave(&ndlp->lock, flags);
11504        ndlp->nlp_fcp_info &= ~NLP_FCP_2_DEVICE;
11505        ndlp->nlp_flag |= NLP_ISSUE_LOGO;
11506        spin_unlock_irqrestore(&ndlp->lock, flags);
11507        lpfc_unreg_rpi(vport, ndlp);
11508}
11509
11510static void lpfc_init_cs_ctl_bitmap(struct lpfc_vport *vport)
11511{
11512        bitmap_zero(vport->vmid_priority_range, LPFC_VMID_MAX_PRIORITY_RANGE);
11513}
11514
11515static void
11516lpfc_vmid_set_cs_ctl_range(struct lpfc_vport *vport, u32 min, u32 max)
11517{
11518        u32 i;
11519
11520        if ((min > max) || (max > LPFC_VMID_MAX_PRIORITY_RANGE))
11521                return;
11522
11523        for (i = min; i <= max; i++)
11524                set_bit(i, vport->vmid_priority_range);
11525}
11526
11527static void lpfc_vmid_put_cs_ctl(struct lpfc_vport *vport, u32 ctcl_vmid)
11528{
11529        set_bit(ctcl_vmid, vport->vmid_priority_range);
11530}
11531
11532u32 lpfc_vmid_get_cs_ctl(struct lpfc_vport *vport)
11533{
11534        u32 i;
11535
11536        i = find_first_bit(vport->vmid_priority_range,
11537                           LPFC_VMID_MAX_PRIORITY_RANGE);
11538
11539        if (i == LPFC_VMID_MAX_PRIORITY_RANGE)
11540                return 0;
11541
11542        clear_bit(i, vport->vmid_priority_range);
11543        return i;
11544}
11545
11546#define MAX_PRIORITY_DESC       255
11547
11548static void
11549lpfc_cmpl_els_qfpa(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
11550                   struct lpfc_iocbq *rspiocb)
11551{
11552        struct lpfc_vport *vport = cmdiocb->vport;
11553        struct priority_range_desc *desc;
11554        struct lpfc_dmabuf *prsp = NULL;
11555        struct lpfc_vmid_priority_range *vmid_range = NULL;
11556        u32 *data;
11557        struct lpfc_dmabuf *dmabuf = cmdiocb->context2;
11558        IOCB_t *irsp = &rspiocb->iocb;
11559        u8 *pcmd, max_desc;
11560        u32 len, i;
11561        struct lpfc_nodelist *ndlp = (struct lpfc_nodelist *)cmdiocb->context1;
11562
11563        prsp = list_get_first(&dmabuf->list, struct lpfc_dmabuf, list);
11564        if (!prsp)
11565                goto out;
11566
11567        pcmd = prsp->virt;
11568        data = (u32 *)pcmd;
11569        if (data[0] == ELS_CMD_LS_RJT) {
11570                lpfc_printf_vlog(vport, KERN_WARNING, LOG_SLI,
11571                                 "3277 QFPA LS_RJT x%x  x%x\n",
11572                                 data[0], data[1]);
11573                goto out;
11574        }
11575        if (irsp->ulpStatus) {
11576                lpfc_printf_vlog(vport, KERN_ERR, LOG_SLI,
11577                                 "6529 QFPA failed with status x%x  x%x\n",
11578                                 irsp->ulpStatus, irsp->un.ulpWord[4]);
11579                goto out;
11580        }
11581
11582        if (!vport->qfpa_res) {
11583                max_desc = FCELSSIZE / sizeof(*vport->qfpa_res);
11584                vport->qfpa_res = kcalloc(max_desc, sizeof(*vport->qfpa_res),
11585                                          GFP_KERNEL);
11586                if (!vport->qfpa_res)
11587                        goto out;
11588        }
11589
11590        len = *((u32 *)(pcmd + 4));
11591        len = be32_to_cpu(len);
11592        memcpy(vport->qfpa_res, pcmd, len + 8);
11593        len = len / LPFC_PRIORITY_RANGE_DESC_SIZE;
11594
11595        desc = (struct priority_range_desc *)(pcmd + 8);
11596        vmid_range = vport->vmid_priority.vmid_range;
11597        if (!vmid_range) {
11598                vmid_range = kcalloc(MAX_PRIORITY_DESC, sizeof(*vmid_range),
11599                                     GFP_KERNEL);
11600                if (!vmid_range) {
11601                        kfree(vport->qfpa_res);
11602                        goto out;
11603                }
11604                vport->vmid_priority.vmid_range = vmid_range;
11605        }
11606        vport->vmid_priority.num_descriptors = len;
11607
11608        for (i = 0; i < len; i++, vmid_range++, desc++) {
11609                lpfc_printf_vlog(vport, KERN_DEBUG, LOG_ELS,
11610                                 "6539 vmid values low=%d, high=%d, qos=%d, "
11611                                 "local ve id=%d\n", desc->lo_range,
11612                                 desc->hi_range, desc->qos_priority,
11613                                 desc->local_ve_id);
11614
11615                vmid_range->low = desc->lo_range << 1;
11616                if (desc->local_ve_id == QFPA_ODD_ONLY)
11617                        vmid_range->low++;
11618                if (desc->qos_priority)
11619                        vport->vmid_flag |= LPFC_VMID_QOS_ENABLED;
11620                vmid_range->qos = desc->qos_priority;
11621
11622                vmid_range->high = desc->hi_range << 1;
11623                if ((desc->local_ve_id == QFPA_ODD_ONLY) ||
11624                    (desc->local_ve_id == QFPA_EVEN_ODD))
11625                        vmid_range->high++;
11626        }
11627        lpfc_init_cs_ctl_bitmap(vport);
11628        for (i = 0; i < vport->vmid_priority.num_descriptors; i++) {
11629                lpfc_vmid_set_cs_ctl_range(vport,
11630                                vport->vmid_priority.vmid_range[i].low,
11631                                vport->vmid_priority.vmid_range[i].high);
11632        }
11633
11634        vport->vmid_flag |= LPFC_VMID_QFPA_CMPL;
11635 out:
11636        lpfc_els_free_iocb(phba, cmdiocb);
11637        lpfc_nlp_put(ndlp);
11638}
11639
11640int lpfc_issue_els_qfpa(struct lpfc_vport *vport)
11641{
11642        struct lpfc_hba *phba = vport->phba;
11643        struct lpfc_nodelist *ndlp;
11644        struct lpfc_iocbq *elsiocb;
11645        u8 *pcmd;
11646        int ret;
11647
11648        ndlp = lpfc_findnode_did(phba->pport, Fabric_DID);
11649        if (!ndlp || ndlp->nlp_state != NLP_STE_UNMAPPED_NODE)
11650                return -ENXIO;
11651
11652        elsiocb = lpfc_prep_els_iocb(vport, 1, LPFC_QFPA_SIZE, 2, ndlp,
11653                                     ndlp->nlp_DID, ELS_CMD_QFPA);
11654        if (!elsiocb)
11655                return -ENOMEM;
11656
11657        pcmd = (u8 *)(((struct lpfc_dmabuf *)elsiocb->context2)->virt);
11658
11659        *((u32 *)(pcmd)) = ELS_CMD_QFPA;
11660        pcmd += 4;
11661
11662        elsiocb->iocb_cmpl = lpfc_cmpl_els_qfpa;
11663
11664        elsiocb->context1 = lpfc_nlp_get(ndlp);
11665        if (!elsiocb->context1) {
11666                lpfc_els_free_iocb(vport->phba, elsiocb);
11667                return -ENXIO;
11668        }
11669
11670        ret = lpfc_sli_issue_iocb(phba, LPFC_ELS_RING, elsiocb, 2);
11671        if (ret != IOCB_SUCCESS) {
11672                lpfc_els_free_iocb(phba, elsiocb);
11673                lpfc_nlp_put(ndlp);
11674                return -EIO;
11675        }
11676        vport->vmid_flag &= ~LPFC_VMID_QOS_ENABLED;
11677        return 0;
11678}
11679
11680int
11681lpfc_vmid_uvem(struct lpfc_vport *vport,
11682               struct lpfc_vmid *vmid, bool instantiated)
11683{
11684        struct lpfc_vem_id_desc *vem_id_desc;
11685        struct lpfc_nodelist *ndlp;
11686        struct lpfc_iocbq *elsiocb;
11687        struct instantiated_ve_desc *inst_desc;
11688        struct lpfc_vmid_context *vmid_context;
11689        u8 *pcmd;
11690        u32 *len;
11691        int ret = 0;
11692
11693        ndlp = lpfc_findnode_did(vport, Fabric_DID);
11694        if (!ndlp || ndlp->nlp_state != NLP_STE_UNMAPPED_NODE)
11695                return -ENXIO;
11696
11697        vmid_context = kmalloc(sizeof(*vmid_context), GFP_KERNEL);
11698        if (!vmid_context)
11699                return -ENOMEM;
11700        elsiocb = lpfc_prep_els_iocb(vport, 1, LPFC_UVEM_SIZE, 2,
11701                                     ndlp, Fabric_DID, ELS_CMD_UVEM);
11702        if (!elsiocb)
11703                goto out;
11704
11705        lpfc_printf_vlog(vport, KERN_DEBUG, LOG_ELS,
11706                         "3427 Host vmid %s %d\n",
11707                         vmid->host_vmid, instantiated);
11708        vmid_context->vmp = vmid;
11709        vmid_context->nlp = ndlp;
11710        vmid_context->instantiated = instantiated;
11711        elsiocb->vmid_tag.vmid_context = vmid_context;
11712        pcmd = (u8 *)(((struct lpfc_dmabuf *)elsiocb->context2)->virt);
11713
11714        if (uuid_is_null((uuid_t *)vport->lpfc_vmid_host_uuid))
11715                memcpy(vport->lpfc_vmid_host_uuid, vmid->host_vmid,
11716                       LPFC_COMPRESS_VMID_SIZE);
11717
11718        *((u32 *)(pcmd)) = ELS_CMD_UVEM;
11719        len = (u32 *)(pcmd + 4);
11720        *len = cpu_to_be32(LPFC_UVEM_SIZE - 8);
11721
11722        vem_id_desc = (struct lpfc_vem_id_desc *)(pcmd + 8);
11723        vem_id_desc->tag = be32_to_cpu(VEM_ID_DESC_TAG);
11724        vem_id_desc->length = be32_to_cpu(LPFC_UVEM_VEM_ID_DESC_SIZE);
11725        memcpy(vem_id_desc->vem_id, vport->lpfc_vmid_host_uuid,
11726               LPFC_COMPRESS_VMID_SIZE);
11727
11728        inst_desc = (struct instantiated_ve_desc *)(pcmd + 32);
11729        inst_desc->tag = be32_to_cpu(INSTANTIATED_VE_DESC_TAG);
11730        inst_desc->length = be32_to_cpu(LPFC_UVEM_VE_MAP_DESC_SIZE);
11731        memcpy(inst_desc->global_vem_id, vmid->host_vmid,
11732               LPFC_COMPRESS_VMID_SIZE);
11733
11734        bf_set(lpfc_instantiated_nport_id, inst_desc, vport->fc_myDID);
11735        bf_set(lpfc_instantiated_local_id, inst_desc,
11736               vmid->un.cs_ctl_vmid);
11737        if (instantiated) {
11738                inst_desc->tag = be32_to_cpu(INSTANTIATED_VE_DESC_TAG);
11739        } else {
11740                inst_desc->tag = be32_to_cpu(DEINSTANTIATED_VE_DESC_TAG);
11741                lpfc_vmid_put_cs_ctl(vport, vmid->un.cs_ctl_vmid);
11742        }
11743        inst_desc->word6 = cpu_to_be32(inst_desc->word6);
11744
11745        elsiocb->iocb_cmpl = lpfc_cmpl_els_uvem;
11746
11747        elsiocb->context1 = lpfc_nlp_get(ndlp);
11748        if (!elsiocb->context1) {
11749                lpfc_els_free_iocb(vport->phba, elsiocb);
11750                goto out;
11751        }
11752
11753        ret = lpfc_sli_issue_iocb(vport->phba, LPFC_ELS_RING, elsiocb, 0);
11754        if (ret != IOCB_SUCCESS) {
11755                lpfc_els_free_iocb(vport->phba, elsiocb);
11756                lpfc_nlp_put(ndlp);
11757                goto out;
11758        }
11759
11760        return 0;
11761 out:
11762        kfree(vmid_context);
11763        return -EIO;
11764}
11765
11766static void
11767lpfc_cmpl_els_uvem(struct lpfc_hba *phba, struct lpfc_iocbq *icmdiocb,
11768                   struct lpfc_iocbq *rspiocb)
11769{
11770        struct lpfc_vport *vport = icmdiocb->vport;
11771        struct lpfc_dmabuf *prsp = NULL;
11772        struct lpfc_vmid_context *vmid_context =
11773            icmdiocb->vmid_tag.vmid_context;
11774        struct lpfc_nodelist *ndlp = icmdiocb->context1;
11775        u8 *pcmd;
11776        u32 *data;
11777        IOCB_t *irsp = &rspiocb->iocb;
11778        struct lpfc_dmabuf *dmabuf = icmdiocb->context2;
11779        struct lpfc_vmid *vmid;
11780
11781        vmid = vmid_context->vmp;
11782        if (!ndlp || ndlp->nlp_state != NLP_STE_UNMAPPED_NODE)
11783                ndlp = NULL;
11784
11785        prsp = list_get_first(&dmabuf->list, struct lpfc_dmabuf, list);
11786        if (!prsp)
11787                goto out;
11788        pcmd = prsp->virt;
11789        data = (u32 *)pcmd;
11790        if (data[0] == ELS_CMD_LS_RJT) {
11791                lpfc_printf_vlog(vport, KERN_WARNING, LOG_SLI,
11792                                 "4532 UVEM LS_RJT %x %x\n", data[0], data[1]);
11793                goto out;
11794        }
11795        if (irsp->ulpStatus) {
11796                lpfc_printf_vlog(vport, KERN_WARNING, LOG_SLI,
11797                                 "4533 UVEM error status %x: %x\n",
11798                                 irsp->ulpStatus, irsp->un.ulpWord[4]);
11799                goto out;
11800        }
11801        spin_lock(&phba->hbalock);
11802        /* Set IN USE flag */
11803        vport->vmid_flag |= LPFC_VMID_IN_USE;
11804        phba->pport->vmid_flag |= LPFC_VMID_IN_USE;
11805        spin_unlock(&phba->hbalock);
11806
11807        if (vmid_context->instantiated) {
11808                write_lock(&vport->vmid_lock);
11809                vmid->flag |= LPFC_VMID_REGISTERED;
11810                vmid->flag &= ~LPFC_VMID_REQ_REGISTER;
11811                write_unlock(&vport->vmid_lock);
11812        }
11813
11814 out:
11815        kfree(vmid_context);
11816        lpfc_els_free_iocb(phba, icmdiocb);
11817        lpfc_nlp_put(ndlp);
11818}
11819