1 /*******************************************************************
2 * This file is part of the Emulex Linux Device Driver for *
3 * Fibre Channel Host Bus Adapters. *
4 * Copyright (C) 2004-2006 Emulex. All rights reserved. *
5 * EMULEX and SLI are trademarks of Emulex. *
7 * Portions Copyright (C) 2004-2005 Christoph Hellwig *
9 * This program is free software; you can redistribute it and/or *
10 * modify it under the terms of version 2 of the GNU General *
11 * Public License as published by the Free Software Foundation. *
12 * This program is distributed in the hope that it will be useful. *
13 * ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND *
14 * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, *
15 * FITNESS FOR A PARTICULAR PURPOSE, OR NON-INFRINGEMENT, ARE *
16 * DISCLAIMED, EXCEPT TO THE EXTENT THAT SUCH DISCLAIMERS ARE HELD *
17 * TO BE LEGALLY INVALID. See the GNU General Public License for *
18 * more details, a copy of which can be found in the file COPYING *
19 * included with this package. *
20 *******************************************************************/
22 #include <linux/blkdev.h>
23 #include <linux/pci.h>
24 #include <linux/interrupt.h>
26 #include <scsi/scsi.h>
27 #include <scsi/scsi_device.h>
28 #include <scsi/scsi_host.h>
29 #include <scsi/scsi_transport_fc.h>
33 #include "lpfc_disc.h"
34 #include "lpfc_scsi.h"
36 #include "lpfc_logmsg.h"
37 #include "lpfc_crtn.h"
39 static int lpfc_els_retry(struct lpfc_hba *, struct lpfc_iocbq *,
41 static int lpfc_max_els_tries = 3;
44 lpfc_els_chk_latt(struct lpfc_hba * phba)
46 struct lpfc_sli *psli;
53 if ((phba->hba_state >= LPFC_HBA_READY) ||
54 (phba->hba_state == LPFC_LINK_DOWN))
57 /* Read the HBA Host Attention Register */
58 spin_lock_irq(phba->host->host_lock);
59 ha_copy = readl(phba->HAregaddr);
60 spin_unlock_irq(phba->host->host_lock);
62 if (!(ha_copy & HA_LATT))
65 /* Pending Link Event during Discovery */
66 lpfc_printf_log(phba, KERN_WARNING, LOG_DISCOVERY,
67 "%d:0237 Pending Link Event during "
68 "Discovery: State x%x\n",
69 phba->brd_no, phba->hba_state);
71 /* CLEAR_LA should re-enable link attention events and
72 * we should then imediately take a LATT event. The
73 * LATT processing should call lpfc_linkdown() which
74 * will cleanup any left over in-progress discovery
77 spin_lock_irq(phba->host->host_lock);
78 phba->fc_flag |= FC_ABORT_DISCOVERY;
79 spin_unlock_irq(phba->host->host_lock);
81 if (phba->hba_state != LPFC_CLEAR_LA) {
82 if ((mbox = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL))) {
83 phba->hba_state = LPFC_CLEAR_LA;
84 lpfc_clear_la(phba, mbox);
85 mbox->mbox_cmpl = lpfc_mbx_cmpl_clear_la;
86 rc = lpfc_sli_issue_mbox (phba, mbox,
87 (MBX_NOWAIT | MBX_STOP_IOCB));
88 if (rc == MBX_NOT_FINISHED) {
89 mempool_free(mbox, phba->mbox_mem_pool);
90 phba->hba_state = LPFC_HBA_ERROR;
99 static struct lpfc_iocbq *
100 lpfc_prep_els_iocb(struct lpfc_hba * phba, uint8_t expectRsp,
101 uint16_t cmdSize, uint8_t retry, struct lpfc_nodelist * ndlp,
102 uint32_t did, uint32_t elscmd)
104 struct lpfc_sli_ring *pring;
105 struct lpfc_iocbq *elsiocb;
106 struct lpfc_dmabuf *pcmd, *prsp, *pbuflist;
107 struct ulp_bde64 *bpl;
110 pring = &phba->sli.ring[LPFC_ELS_RING];
112 if (phba->hba_state < LPFC_LINK_UP)
115 /* Allocate buffer for command iocb */
116 spin_lock_irq(phba->host->host_lock);
117 elsiocb = lpfc_sli_get_iocbq(phba);
118 spin_unlock_irq(phba->host->host_lock);
122 icmd = &elsiocb->iocb;
124 /* fill in BDEs for command */
125 /* Allocate buffer for command payload */
126 if (((pcmd = kmalloc(sizeof (struct lpfc_dmabuf), GFP_KERNEL)) == 0) ||
127 ((pcmd->virt = lpfc_mbuf_alloc(phba,
128 MEM_PRI, &(pcmd->phys))) == 0)) {
131 spin_lock_irq(phba->host->host_lock);
132 lpfc_sli_release_iocbq(phba, elsiocb);
133 spin_unlock_irq(phba->host->host_lock);
137 INIT_LIST_HEAD(&pcmd->list);
139 /* Allocate buffer for response payload */
141 prsp = kmalloc(sizeof (struct lpfc_dmabuf), GFP_KERNEL);
143 prsp->virt = lpfc_mbuf_alloc(phba, MEM_PRI,
145 if (prsp == 0 || prsp->virt == 0) {
147 lpfc_mbuf_free(phba, pcmd->virt, pcmd->phys);
149 spin_lock_irq(phba->host->host_lock);
150 lpfc_sli_release_iocbq(phba, elsiocb);
151 spin_unlock_irq(phba->host->host_lock);
154 INIT_LIST_HEAD(&prsp->list);
159 /* Allocate buffer for Buffer ptr list */
160 pbuflist = kmalloc(sizeof (struct lpfc_dmabuf), GFP_KERNEL);
162 pbuflist->virt = lpfc_mbuf_alloc(phba, MEM_PRI,
164 if (pbuflist == 0 || pbuflist->virt == 0) {
165 spin_lock_irq(phba->host->host_lock);
166 lpfc_sli_release_iocbq(phba, elsiocb);
167 spin_unlock_irq(phba->host->host_lock);
168 lpfc_mbuf_free(phba, pcmd->virt, pcmd->phys);
169 lpfc_mbuf_free(phba, prsp->virt, prsp->phys);
176 INIT_LIST_HEAD(&pbuflist->list);
178 icmd->un.elsreq64.bdl.addrHigh = putPaddrHigh(pbuflist->phys);
179 icmd->un.elsreq64.bdl.addrLow = putPaddrLow(pbuflist->phys);
180 icmd->un.elsreq64.bdl.bdeFlags = BUFF_TYPE_BDL;
182 icmd->un.elsreq64.bdl.bdeSize = (2 * sizeof (struct ulp_bde64));
183 icmd->un.elsreq64.remoteID = did; /* DID */
184 icmd->ulpCommand = CMD_ELS_REQUEST64_CR;
185 icmd->ulpTimeout = phba->fc_ratov * 2;
187 icmd->un.elsreq64.bdl.bdeSize = sizeof (struct ulp_bde64);
188 icmd->ulpCommand = CMD_XMIT_ELS_RSP64_CX;
191 icmd->ulpBdeCount = 1;
193 icmd->ulpClass = CLASS3;
195 bpl = (struct ulp_bde64 *) pbuflist->virt;
196 bpl->addrLow = le32_to_cpu(putPaddrLow(pcmd->phys));
197 bpl->addrHigh = le32_to_cpu(putPaddrHigh(pcmd->phys));
198 bpl->tus.f.bdeSize = cmdSize;
199 bpl->tus.f.bdeFlags = 0;
200 bpl->tus.w = le32_to_cpu(bpl->tus.w);
204 bpl->addrLow = le32_to_cpu(putPaddrLow(prsp->phys));
205 bpl->addrHigh = le32_to_cpu(putPaddrHigh(prsp->phys));
206 bpl->tus.f.bdeSize = FCELSSIZE;
207 bpl->tus.f.bdeFlags = BUFF_USE_RCV;
208 bpl->tus.w = le32_to_cpu(bpl->tus.w);
211 /* Save for completion so we can release these resources */
212 elsiocb->context1 = (uint8_t *) ndlp;
213 elsiocb->context2 = (uint8_t *) pcmd;
214 elsiocb->context3 = (uint8_t *) pbuflist;
215 elsiocb->retry = retry;
216 elsiocb->drvrTimeout = (phba->fc_ratov << 1) + LPFC_DRVR_TIMEOUT;
219 list_add(&prsp->list, &pcmd->list);
223 /* Xmit ELS command <elsCmd> to remote NPORT <did> */
224 lpfc_printf_log(phba, KERN_INFO, LOG_ELS,
225 "%d:0116 Xmit ELS command x%x to remote "
226 "NPORT x%x I/O tag: x%x, HBA state: x%x\n",
227 phba->brd_no, elscmd,
228 did, elsiocb->iotag, phba->hba_state);
230 /* Xmit ELS response <elsCmd> to remote NPORT <did> */
231 lpfc_printf_log(phba, KERN_INFO, LOG_ELS,
232 "%d:0117 Xmit ELS response x%x to remote "
233 "NPORT x%x I/O tag: x%x, size: x%x\n",
234 phba->brd_no, elscmd,
235 ndlp->nlp_DID, elsiocb->iotag, cmdSize);
243 lpfc_cmpl_els_flogi_fabric(struct lpfc_hba *phba, struct lpfc_nodelist *ndlp,
244 struct serv_parm *sp, IOCB_t *irsp)
247 struct lpfc_dmabuf *mp;
250 spin_lock_irq(phba->host->host_lock);
251 phba->fc_flag |= FC_FABRIC;
252 spin_unlock_irq(phba->host->host_lock);
254 phba->fc_edtov = be32_to_cpu(sp->cmn.e_d_tov);
255 if (sp->cmn.edtovResolution) /* E_D_TOV ticks are in nanoseconds */
256 phba->fc_edtov = (phba->fc_edtov + 999999) / 1000000;
258 phba->fc_ratov = (be32_to_cpu(sp->cmn.w2.r_a_tov) + 999) / 1000;
260 if (phba->fc_topology == TOPOLOGY_LOOP) {
261 spin_lock_irq(phba->host->host_lock);
262 phba->fc_flag |= FC_PUBLIC_LOOP;
263 spin_unlock_irq(phba->host->host_lock);
266 * If we are a N-port connected to a Fabric, fixup sparam's so
267 * logins to devices on remote loops work.
269 phba->fc_sparam.cmn.altBbCredit = 1;
272 phba->fc_myDID = irsp->un.ulpWord[4] & Mask_DID;
273 memcpy(&ndlp->nlp_portname, &sp->portName, sizeof(struct lpfc_name));
274 memcpy(&ndlp->nlp_nodename, &sp->nodeName, sizeof (struct lpfc_name));
275 ndlp->nlp_class_sup = 0;
276 if (sp->cls1.classValid)
277 ndlp->nlp_class_sup |= FC_COS_CLASS1;
278 if (sp->cls2.classValid)
279 ndlp->nlp_class_sup |= FC_COS_CLASS2;
280 if (sp->cls3.classValid)
281 ndlp->nlp_class_sup |= FC_COS_CLASS3;
282 if (sp->cls4.classValid)
283 ndlp->nlp_class_sup |= FC_COS_CLASS4;
284 ndlp->nlp_maxframe = ((sp->cmn.bbRcvSizeMsb & 0x0F) << 8) |
285 sp->cmn.bbRcvSizeLsb;
286 memcpy(&phba->fc_fabparam, sp, sizeof(struct serv_parm));
288 mbox = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL);
292 phba->hba_state = LPFC_FABRIC_CFG_LINK;
293 lpfc_config_link(phba, mbox);
294 mbox->mbox_cmpl = lpfc_sli_def_mbox_cmpl;
296 rc = lpfc_sli_issue_mbox(phba, mbox, MBX_NOWAIT | MBX_STOP_IOCB);
297 if (rc == MBX_NOT_FINISHED)
300 mbox = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL);
304 if (lpfc_reg_login(phba, Fabric_DID, (uint8_t *) sp, mbox, 0))
307 mbox->mbox_cmpl = lpfc_mbx_cmpl_fabric_reg_login;
308 mbox->context2 = ndlp;
310 rc = lpfc_sli_issue_mbox(phba, mbox, MBX_NOWAIT | MBX_STOP_IOCB);
311 if (rc == MBX_NOT_FINISHED)
312 goto fail_issue_reg_login;
316 fail_issue_reg_login:
317 mp = (struct lpfc_dmabuf *) mbox->context1;
318 lpfc_mbuf_free(phba, mp->virt, mp->phys);
321 mempool_free(mbox, phba->mbox_mem_pool);
327 * We FLOGIed into an NPort, initiate pt2pt protocol
330 lpfc_cmpl_els_flogi_nport(struct lpfc_hba *phba, struct lpfc_nodelist *ndlp,
331 struct serv_parm *sp)
336 spin_lock_irq(phba->host->host_lock);
337 phba->fc_flag &= ~(FC_FABRIC | FC_PUBLIC_LOOP);
338 spin_unlock_irq(phba->host->host_lock);
340 phba->fc_edtov = FF_DEF_EDTOV;
341 phba->fc_ratov = FF_DEF_RATOV;
342 rc = memcmp(&phba->fc_portname, &sp->portName,
343 sizeof(struct lpfc_name));
345 /* This side will initiate the PLOGI */
346 spin_lock_irq(phba->host->host_lock);
347 phba->fc_flag |= FC_PT2PT_PLOGI;
348 spin_unlock_irq(phba->host->host_lock);
351 * N_Port ID cannot be 0, set our to LocalID the other
352 * side will be RemoteID.
357 phba->fc_myDID = PT2PT_LocalID;
359 mbox = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL);
363 lpfc_config_link(phba, mbox);
365 mbox->mbox_cmpl = lpfc_sli_def_mbox_cmpl;
366 rc = lpfc_sli_issue_mbox(phba, mbox,
367 MBX_NOWAIT | MBX_STOP_IOCB);
368 if (rc == MBX_NOT_FINISHED) {
369 mempool_free(mbox, phba->mbox_mem_pool);
372 mempool_free(ndlp, phba->nlp_mem_pool);
374 ndlp = lpfc_findnode_did(phba, NLP_SEARCH_ALL, PT2PT_RemoteID);
377 * Cannot find existing Fabric ndlp, so allocate a
380 ndlp = mempool_alloc(phba->nlp_mem_pool, GFP_KERNEL);
384 lpfc_nlp_init(phba, ndlp, PT2PT_RemoteID);
387 memcpy(&ndlp->nlp_portname, &sp->portName,
388 sizeof(struct lpfc_name));
389 memcpy(&ndlp->nlp_nodename, &sp->nodeName,
390 sizeof(struct lpfc_name));
391 lpfc_nlp_set_state(phba, ndlp, NLP_STE_NPR_NODE);
392 ndlp->nlp_flag |= NLP_NPR_2B_DISC;
394 /* This side will wait for the PLOGI */
395 mempool_free( ndlp, phba->nlp_mem_pool);
398 spin_lock_irq(phba->host->host_lock);
399 phba->fc_flag |= FC_PT2PT;
400 spin_unlock_irq(phba->host->host_lock);
402 /* Start discovery - this should just do CLEAR_LA */
403 lpfc_disc_start(phba);
410 lpfc_cmpl_els_flogi(struct lpfc_hba * phba,
411 struct lpfc_iocbq * cmdiocb, struct lpfc_iocbq * rspiocb)
413 IOCB_t *irsp = &rspiocb->iocb;
414 struct lpfc_nodelist *ndlp = cmdiocb->context1;
415 struct lpfc_dmabuf *pcmd = cmdiocb->context2, *prsp;
416 struct serv_parm *sp;
419 /* Check to see if link went down during discovery */
420 if (lpfc_els_chk_latt(phba)) {
421 lpfc_nlp_remove(phba, ndlp);
425 if (irsp->ulpStatus) {
426 /* Check for retry */
427 if (lpfc_els_retry(phba, cmdiocb, rspiocb)) {
428 /* ELS command is being retried */
431 /* FLOGI failed, so there is no fabric */
432 spin_lock_irq(phba->host->host_lock);
433 phba->fc_flag &= ~(FC_FABRIC | FC_PUBLIC_LOOP);
434 spin_unlock_irq(phba->host->host_lock);
436 /* If private loop, then allow max outstandting els to be
437 * LPFC_MAX_DISC_THREADS (32). Scanning in the case of no
438 * alpa map would take too long otherwise.
440 if (phba->alpa_map[0] == 0) {
441 phba->cfg_discovery_threads =
442 LPFC_MAX_DISC_THREADS;
446 lpfc_printf_log(phba,
449 "%d:0100 FLOGI failure Data: x%x x%x x%x\n",
451 irsp->ulpStatus, irsp->un.ulpWord[4],
457 * The FLogI succeeded. Sync the data for the CPU before
460 prsp = list_get_first(&pcmd->list, struct lpfc_dmabuf, list);
462 sp = prsp->virt + sizeof(uint32_t);
464 /* FLOGI completes successfully */
465 lpfc_printf_log(phba, KERN_INFO, LOG_ELS,
466 "%d:0101 FLOGI completes sucessfully "
467 "Data: x%x x%x x%x x%x\n",
469 irsp->un.ulpWord[4], sp->cmn.e_d_tov,
470 sp->cmn.w2.r_a_tov, sp->cmn.edtovResolution);
472 if (phba->hba_state == LPFC_FLOGI) {
474 * If Common Service Parameters indicate Nport
475 * we are point to point, if Fport we are Fabric.
478 rc = lpfc_cmpl_els_flogi_fabric(phba, ndlp, sp, irsp);
480 rc = lpfc_cmpl_els_flogi_nport(phba, ndlp, sp);
487 lpfc_nlp_remove(phba, ndlp);
489 if (irsp->ulpStatus != IOSTAT_LOCAL_REJECT ||
490 (irsp->un.ulpWord[4] != IOERR_SLI_ABORTED &&
491 irsp->un.ulpWord[4] != IOERR_SLI_DOWN)) {
492 /* FLOGI failed, so just use loop map to make discovery list */
493 lpfc_disc_list_loopmap(phba);
495 /* Start discovery */
496 lpfc_disc_start(phba);
500 lpfc_els_free_iocb(phba, cmdiocb);
504 lpfc_issue_els_flogi(struct lpfc_hba * phba, struct lpfc_nodelist * ndlp,
507 struct serv_parm *sp;
509 struct lpfc_iocbq *elsiocb;
510 struct lpfc_sli_ring *pring;
516 pring = &phba->sli.ring[LPFC_ELS_RING];
518 cmdsize = (sizeof (uint32_t) + sizeof (struct serv_parm));
519 elsiocb = lpfc_prep_els_iocb(phba, 1, cmdsize, retry, ndlp,
520 ndlp->nlp_DID, ELS_CMD_FLOGI);
524 icmd = &elsiocb->iocb;
525 pcmd = (uint8_t *) (((struct lpfc_dmabuf *) elsiocb->context2)->virt);
527 /* For FLOGI request, remainder of payload is service parameters */
528 *((uint32_t *) (pcmd)) = ELS_CMD_FLOGI;
529 pcmd += sizeof (uint32_t);
530 memcpy(pcmd, &phba->fc_sparam, sizeof (struct serv_parm));
531 sp = (struct serv_parm *) pcmd;
533 /* Setup CSPs accordingly for Fabric */
535 sp->cmn.w2.r_a_tov = 0;
536 sp->cls1.classValid = 0;
537 sp->cls2.seqDelivery = 1;
538 sp->cls3.seqDelivery = 1;
539 if (sp->cmn.fcphLow < FC_PH3)
540 sp->cmn.fcphLow = FC_PH3;
541 if (sp->cmn.fcphHigh < FC_PH3)
542 sp->cmn.fcphHigh = FC_PH3;
544 tmo = phba->fc_ratov;
545 phba->fc_ratov = LPFC_DISC_FLOGI_TMO;
546 lpfc_set_disctmo(phba);
547 phba->fc_ratov = tmo;
549 phba->fc_stat.elsXmitFLOGI++;
550 elsiocb->iocb_cmpl = lpfc_cmpl_els_flogi;
551 spin_lock_irq(phba->host->host_lock);
552 rc = lpfc_sli_issue_iocb(phba, pring, elsiocb, 0);
553 spin_unlock_irq(phba->host->host_lock);
554 if (rc == IOCB_ERROR) {
555 lpfc_els_free_iocb(phba, elsiocb);
562 lpfc_els_abort_flogi(struct lpfc_hba * phba)
564 struct lpfc_sli_ring *pring;
565 struct lpfc_iocbq *iocb, *next_iocb;
566 struct lpfc_nodelist *ndlp;
569 /* Abort outstanding I/O on NPort <nlp_DID> */
570 lpfc_printf_log(phba, KERN_INFO, LOG_DISCOVERY,
571 "%d:0201 Abort outstanding I/O on NPort x%x\n",
572 phba->brd_no, Fabric_DID);
574 pring = &phba->sli.ring[LPFC_ELS_RING];
577 * Check the txcmplq for an iocb that matches the nport the driver is
580 spin_lock_irq(phba->host->host_lock);
581 list_for_each_entry_safe(iocb, next_iocb, &pring->txcmplq, list) {
583 if (icmd->ulpCommand == CMD_ELS_REQUEST64_CR) {
584 ndlp = (struct lpfc_nodelist *)(iocb->context1);
585 if (ndlp && (ndlp->nlp_DID == Fabric_DID))
586 lpfc_sli_issue_abort_iotag(phba, pring, iocb);
589 spin_unlock_irq(phba->host->host_lock);
595 lpfc_initial_flogi(struct lpfc_hba * phba)
597 struct lpfc_nodelist *ndlp;
599 /* First look for the Fabric ndlp */
600 ndlp = lpfc_findnode_did(phba, NLP_SEARCH_ALL, Fabric_DID);
602 /* Cannot find existing Fabric ndlp, so allocate a new one */
603 ndlp = mempool_alloc(phba->nlp_mem_pool, GFP_KERNEL);
606 lpfc_nlp_init(phba, ndlp, Fabric_DID);
608 lpfc_dequeue_node(phba, ndlp);
610 if (lpfc_issue_els_flogi(phba, ndlp, 0)) {
611 mempool_free( ndlp, phba->nlp_mem_pool);
617 lpfc_more_plogi(struct lpfc_hba * phba)
621 if (phba->num_disc_nodes)
622 phba->num_disc_nodes--;
624 /* Continue discovery with <num_disc_nodes> PLOGIs to go */
625 lpfc_printf_log(phba, KERN_INFO, LOG_DISCOVERY,
626 "%d:0232 Continue discovery with %d PLOGIs to go "
627 "Data: x%x x%x x%x\n",
628 phba->brd_no, phba->num_disc_nodes, phba->fc_plogi_cnt,
629 phba->fc_flag, phba->hba_state);
631 /* Check to see if there are more PLOGIs to be sent */
632 if (phba->fc_flag & FC_NLP_MORE) {
633 /* go thru NPR list and issue any remaining ELS PLOGIs */
634 sentplogi = lpfc_els_disc_plogi(phba);
639 static struct lpfc_nodelist *
640 lpfc_plogi_confirm_nport(struct lpfc_hba * phba, struct lpfc_dmabuf *prsp,
641 struct lpfc_nodelist *ndlp)
643 struct lpfc_nodelist *new_ndlp;
645 struct serv_parm *sp;
646 uint8_t name[sizeof (struct lpfc_name)];
649 /* Fabric nodes can have the same WWPN so we don't bother searching
650 * by WWPN. Just return the ndlp that was given to us.
652 if (ndlp->nlp_type & NLP_FABRIC)
655 lp = (uint32_t *) prsp->virt;
656 sp = (struct serv_parm *) ((uint8_t *) lp + sizeof (uint32_t));
657 memset(name, 0, sizeof (struct lpfc_name));
659 /* Now we to find out if the NPort we are logging into, matches the WWPN
660 * we have for that ndlp. If not, we have some work to do.
662 new_ndlp = lpfc_findnode_wwpn(phba, NLP_SEARCH_ALL, &sp->portName);
664 if (new_ndlp == ndlp)
669 memcmp(&ndlp->nlp_portname, name, sizeof(struct lpfc_name));
672 new_ndlp = mempool_alloc(phba->nlp_mem_pool, GFP_ATOMIC);
676 lpfc_nlp_init(phba, new_ndlp, ndlp->nlp_DID);
679 lpfc_unreg_rpi(phba, new_ndlp);
680 new_ndlp->nlp_DID = ndlp->nlp_DID;
681 new_ndlp->nlp_prev_state = ndlp->nlp_prev_state;
682 lpfc_nlp_set_state(phba, new_ndlp, ndlp->nlp_state);
684 /* Move this back to NPR list */
685 if (memcmp(&ndlp->nlp_portname, name, sizeof(struct lpfc_name)) == 0)
686 lpfc_drop_node(phba, ndlp);
688 lpfc_unreg_rpi(phba, ndlp);
689 ndlp->nlp_DID = 0; /* Two ndlps cannot have the same did */
690 lpfc_nlp_set_state(phba, ndlp, NLP_STE_NPR_NODE);
696 lpfc_cmpl_els_plogi(struct lpfc_hba * phba, struct lpfc_iocbq * cmdiocb,
697 struct lpfc_iocbq * rspiocb)
700 struct lpfc_nodelist *ndlp;
701 struct lpfc_dmabuf *prsp;
702 int disc, rc, did, type;
704 /* we pass cmdiocb to state machine which needs rspiocb as well */
705 cmdiocb->context_un.rsp_iocb = rspiocb;
707 irsp = &rspiocb->iocb;
708 ndlp = lpfc_findnode_did(phba, NLP_SEARCH_ALL,
709 irsp->un.elsreq64.remoteID);
713 /* Since ndlp can be freed in the disc state machine, note if this node
714 * is being used during discovery.
716 disc = (ndlp->nlp_flag & NLP_NPR_2B_DISC);
717 spin_lock_irq(phba->host->host_lock);
718 ndlp->nlp_flag &= ~NLP_NPR_2B_DISC;
719 spin_unlock_irq(phba->host->host_lock);
722 /* PLOGI completes to NPort <nlp_DID> */
723 lpfc_printf_log(phba, KERN_INFO, LOG_ELS,
724 "%d:0102 PLOGI completes to NPort x%x "
725 "Data: x%x x%x x%x x%x x%x\n",
726 phba->brd_no, ndlp->nlp_DID, irsp->ulpStatus,
727 irsp->un.ulpWord[4], irsp->ulpTimeout, disc,
728 phba->num_disc_nodes);
730 /* Check to see if link went down during discovery */
731 if (lpfc_els_chk_latt(phba)) {
732 spin_lock_irq(phba->host->host_lock);
733 ndlp->nlp_flag |= NLP_NPR_2B_DISC;
734 spin_unlock_irq(phba->host->host_lock);
738 /* ndlp could be freed in DSM, save these values now */
739 type = ndlp->nlp_type;
742 if (irsp->ulpStatus) {
743 /* Check for retry */
744 if (lpfc_els_retry(phba, cmdiocb, rspiocb)) {
745 /* ELS command is being retried */
747 spin_lock_irq(phba->host->host_lock);
748 ndlp->nlp_flag |= NLP_NPR_2B_DISC;
749 spin_unlock_irq(phba->host->host_lock);
755 /* Do not call DSM for lpfc_els_abort'ed ELS cmds */
756 if ((irsp->ulpStatus == IOSTAT_LOCAL_REJECT) &&
757 ((irsp->un.ulpWord[4] == IOERR_SLI_ABORTED) ||
758 (irsp->un.ulpWord[4] == IOERR_LINK_DOWN) ||
759 (irsp->un.ulpWord[4] == IOERR_SLI_DOWN))) {
760 rc = NLP_STE_FREED_NODE;
762 rc = lpfc_disc_state_machine(phba, ndlp, cmdiocb,
766 /* Good status, call state machine */
767 prsp = list_entry(((struct lpfc_dmabuf *)
768 cmdiocb->context2)->list.next,
769 struct lpfc_dmabuf, list);
770 ndlp = lpfc_plogi_confirm_nport(phba, prsp, ndlp);
771 rc = lpfc_disc_state_machine(phba, ndlp, cmdiocb,
775 if (disc && phba->num_disc_nodes) {
776 /* Check to see if there are more PLOGIs to be sent */
777 lpfc_more_plogi(phba);
779 if (phba->num_disc_nodes == 0) {
780 spin_lock_irq(phba->host->host_lock);
781 phba->fc_flag &= ~FC_NDISC_ACTIVE;
782 spin_unlock_irq(phba->host->host_lock);
784 lpfc_can_disctmo(phba);
785 if (phba->fc_flag & FC_RSCN_MODE) {
787 * Check to see if more RSCNs came in while
788 * we were processing this one.
790 if ((phba->fc_rscn_id_cnt == 0) &&
791 (!(phba->fc_flag & FC_RSCN_DISCOVERY))) {
792 spin_lock_irq(phba->host->host_lock);
793 phba->fc_flag &= ~FC_RSCN_MODE;
794 spin_unlock_irq(phba->host->host_lock);
796 lpfc_els_handle_rscn(phba);
803 lpfc_els_free_iocb(phba, cmdiocb);
808 lpfc_issue_els_plogi(struct lpfc_hba * phba, uint32_t did, uint8_t retry)
810 struct serv_parm *sp;
812 struct lpfc_iocbq *elsiocb;
813 struct lpfc_sli_ring *pring;
814 struct lpfc_sli *psli;
819 pring = &psli->ring[LPFC_ELS_RING]; /* ELS ring */
821 cmdsize = (sizeof (uint32_t) + sizeof (struct serv_parm));
822 elsiocb = lpfc_prep_els_iocb(phba, 1, cmdsize, retry, NULL, did,
827 icmd = &elsiocb->iocb;
828 pcmd = (uint8_t *) (((struct lpfc_dmabuf *) elsiocb->context2)->virt);
830 /* For PLOGI request, remainder of payload is service parameters */
831 *((uint32_t *) (pcmd)) = ELS_CMD_PLOGI;
832 pcmd += sizeof (uint32_t);
833 memcpy(pcmd, &phba->fc_sparam, sizeof (struct serv_parm));
834 sp = (struct serv_parm *) pcmd;
836 if (sp->cmn.fcphLow < FC_PH_4_3)
837 sp->cmn.fcphLow = FC_PH_4_3;
839 if (sp->cmn.fcphHigh < FC_PH3)
840 sp->cmn.fcphHigh = FC_PH3;
842 phba->fc_stat.elsXmitPLOGI++;
843 elsiocb->iocb_cmpl = lpfc_cmpl_els_plogi;
844 spin_lock_irq(phba->host->host_lock);
845 if (lpfc_sli_issue_iocb(phba, pring, elsiocb, 0) == IOCB_ERROR) {
846 spin_unlock_irq(phba->host->host_lock);
847 lpfc_els_free_iocb(phba, elsiocb);
850 spin_unlock_irq(phba->host->host_lock);
855 lpfc_cmpl_els_prli(struct lpfc_hba * phba, struct lpfc_iocbq * cmdiocb,
856 struct lpfc_iocbq * rspiocb)
859 struct lpfc_sli *psli;
860 struct lpfc_nodelist *ndlp;
863 /* we pass cmdiocb to state machine which needs rspiocb as well */
864 cmdiocb->context_un.rsp_iocb = rspiocb;
866 irsp = &(rspiocb->iocb);
867 ndlp = (struct lpfc_nodelist *) cmdiocb->context1;
868 spin_lock_irq(phba->host->host_lock);
869 ndlp->nlp_flag &= ~NLP_PRLI_SND;
870 spin_unlock_irq(phba->host->host_lock);
872 /* PRLI completes to NPort <nlp_DID> */
873 lpfc_printf_log(phba, KERN_INFO, LOG_ELS,
874 "%d:0103 PRLI completes to NPort x%x "
875 "Data: x%x x%x x%x x%x\n",
876 phba->brd_no, ndlp->nlp_DID, irsp->ulpStatus,
877 irsp->un.ulpWord[4], irsp->ulpTimeout,
878 phba->num_disc_nodes);
880 phba->fc_prli_sent--;
881 /* Check to see if link went down during discovery */
882 if (lpfc_els_chk_latt(phba))
885 if (irsp->ulpStatus) {
886 /* Check for retry */
887 if (lpfc_els_retry(phba, cmdiocb, rspiocb)) {
888 /* ELS command is being retried */
892 /* Do not call DSM for lpfc_els_abort'ed ELS cmds */
893 if ((irsp->ulpStatus == IOSTAT_LOCAL_REJECT) &&
894 ((irsp->un.ulpWord[4] == IOERR_SLI_ABORTED) ||
895 (irsp->un.ulpWord[4] == IOERR_LINK_DOWN) ||
896 (irsp->un.ulpWord[4] == IOERR_SLI_DOWN))) {
899 lpfc_disc_state_machine(phba, ndlp, cmdiocb,
903 /* Good status, call state machine */
904 lpfc_disc_state_machine(phba, ndlp, cmdiocb, NLP_EVT_CMPL_PRLI);
908 lpfc_els_free_iocb(phba, cmdiocb);
913 lpfc_issue_els_prli(struct lpfc_hba * phba, struct lpfc_nodelist * ndlp,
918 struct lpfc_iocbq *elsiocb;
919 struct lpfc_sli_ring *pring;
920 struct lpfc_sli *psli;
925 pring = &psli->ring[LPFC_ELS_RING]; /* ELS ring */
927 cmdsize = (sizeof (uint32_t) + sizeof (PRLI));
928 elsiocb = lpfc_prep_els_iocb(phba, 1, cmdsize, retry, ndlp,
929 ndlp->nlp_DID, ELS_CMD_PRLI);
933 icmd = &elsiocb->iocb;
934 pcmd = (uint8_t *) (((struct lpfc_dmabuf *) elsiocb->context2)->virt);
936 /* For PRLI request, remainder of payload is service parameters */
937 memset(pcmd, 0, (sizeof (PRLI) + sizeof (uint32_t)));
938 *((uint32_t *) (pcmd)) = ELS_CMD_PRLI;
939 pcmd += sizeof (uint32_t);
941 /* For PRLI, remainder of payload is PRLI parameter page */
944 * If our firmware version is 3.20 or later,
945 * set the following bits for FC-TAPE support.
947 if (phba->vpd.rev.feaLevelHigh >= 0x02) {
948 npr->ConfmComplAllowed = 1;
950 npr->TaskRetryIdReq = 1;
952 npr->estabImagePair = 1;
953 npr->readXferRdyDis = 1;
955 /* For FCP support */
956 npr->prliType = PRLI_FCP_TYPE;
957 npr->initiatorFunc = 1;
959 phba->fc_stat.elsXmitPRLI++;
960 elsiocb->iocb_cmpl = lpfc_cmpl_els_prli;
961 spin_lock_irq(phba->host->host_lock);
962 ndlp->nlp_flag |= NLP_PRLI_SND;
963 if (lpfc_sli_issue_iocb(phba, pring, elsiocb, 0) == IOCB_ERROR) {
964 ndlp->nlp_flag &= ~NLP_PRLI_SND;
965 spin_unlock_irq(phba->host->host_lock);
966 lpfc_els_free_iocb(phba, elsiocb);
969 spin_unlock_irq(phba->host->host_lock);
970 phba->fc_prli_sent++;
975 lpfc_more_adisc(struct lpfc_hba * phba)
979 if (phba->num_disc_nodes)
980 phba->num_disc_nodes--;
982 /* Continue discovery with <num_disc_nodes> ADISCs to go */
983 lpfc_printf_log(phba, KERN_INFO, LOG_DISCOVERY,
984 "%d:0210 Continue discovery with %d ADISCs to go "
985 "Data: x%x x%x x%x\n",
986 phba->brd_no, phba->num_disc_nodes, phba->fc_adisc_cnt,
987 phba->fc_flag, phba->hba_state);
989 /* Check to see if there are more ADISCs to be sent */
990 if (phba->fc_flag & FC_NLP_MORE) {
991 lpfc_set_disctmo(phba);
993 /* go thru NPR list and issue any remaining ELS ADISCs */
994 sentadisc = lpfc_els_disc_adisc(phba);
1000 lpfc_rscn_disc(struct lpfc_hba * phba)
1002 /* RSCN discovery */
1003 /* go thru NPR list and issue ELS PLOGIs */
1004 if (phba->fc_npr_cnt) {
1005 if (lpfc_els_disc_plogi(phba))
1008 if (phba->fc_flag & FC_RSCN_MODE) {
1009 /* Check to see if more RSCNs came in while we were
1010 * processing this one.
1012 if ((phba->fc_rscn_id_cnt == 0) &&
1013 (!(phba->fc_flag & FC_RSCN_DISCOVERY))) {
1014 spin_lock_irq(phba->host->host_lock);
1015 phba->fc_flag &= ~FC_RSCN_MODE;
1016 spin_unlock_irq(phba->host->host_lock);
1018 lpfc_els_handle_rscn(phba);
1024 lpfc_cmpl_els_adisc(struct lpfc_hba * phba, struct lpfc_iocbq * cmdiocb,
1025 struct lpfc_iocbq * rspiocb)
1028 struct lpfc_sli *psli;
1029 struct lpfc_nodelist *ndlp;
1035 /* we pass cmdiocb to state machine which needs rspiocb as well */
1036 cmdiocb->context_un.rsp_iocb = rspiocb;
1038 irsp = &(rspiocb->iocb);
1039 ndlp = (struct lpfc_nodelist *) cmdiocb->context1;
1041 /* Since ndlp can be freed in the disc state machine, note if this node
1042 * is being used during discovery.
1044 disc = (ndlp->nlp_flag & NLP_NPR_2B_DISC);
1045 spin_lock_irq(phba->host->host_lock);
1046 ndlp->nlp_flag &= ~(NLP_ADISC_SND | NLP_NPR_2B_DISC);
1047 spin_unlock_irq(phba->host->host_lock);
1049 /* ADISC completes to NPort <nlp_DID> */
1050 lpfc_printf_log(phba, KERN_INFO, LOG_ELS,
1051 "%d:0104 ADISC completes to NPort x%x "
1052 "Data: x%x x%x x%x x%x x%x\n",
1053 phba->brd_no, ndlp->nlp_DID, irsp->ulpStatus,
1054 irsp->un.ulpWord[4], irsp->ulpTimeout, disc,
1055 phba->num_disc_nodes);
1057 /* Check to see if link went down during discovery */
1058 if (lpfc_els_chk_latt(phba)) {
1059 spin_lock_irq(phba->host->host_lock);
1060 ndlp->nlp_flag |= NLP_NPR_2B_DISC;
1061 spin_unlock_irq(phba->host->host_lock);
1065 if (irsp->ulpStatus) {
1066 /* Check for retry */
1067 if (lpfc_els_retry(phba, cmdiocb, rspiocb)) {
1068 /* ELS command is being retried */
1070 spin_lock_irq(phba->host->host_lock);
1071 ndlp->nlp_flag |= NLP_NPR_2B_DISC;
1072 spin_unlock_irq(phba->host->host_lock);
1073 lpfc_set_disctmo(phba);
1078 /* Do not call DSM for lpfc_els_abort'ed ELS cmds */
1079 if ((irsp->ulpStatus != IOSTAT_LOCAL_REJECT) ||
1080 ((irsp->un.ulpWord[4] != IOERR_SLI_ABORTED) &&
1081 (irsp->un.ulpWord[4] != IOERR_LINK_DOWN) &&
1082 (irsp->un.ulpWord[4] != IOERR_SLI_DOWN))) {
1083 lpfc_disc_state_machine(phba, ndlp, cmdiocb,
1084 NLP_EVT_CMPL_ADISC);
1087 /* Good status, call state machine */
1088 lpfc_disc_state_machine(phba, ndlp, cmdiocb,
1089 NLP_EVT_CMPL_ADISC);
1092 if (disc && phba->num_disc_nodes) {
1093 /* Check to see if there are more ADISCs to be sent */
1094 lpfc_more_adisc(phba);
1096 /* Check to see if we are done with ADISC authentication */
1097 if (phba->num_disc_nodes == 0) {
1098 lpfc_can_disctmo(phba);
1099 /* If we get here, there is nothing left to wait for */
1100 if ((phba->hba_state < LPFC_HBA_READY) &&
1101 (phba->hba_state != LPFC_CLEAR_LA)) {
1102 /* Link up discovery */
1103 if ((mbox = mempool_alloc(phba->mbox_mem_pool,
1105 phba->hba_state = LPFC_CLEAR_LA;
1106 lpfc_clear_la(phba, mbox);
1108 lpfc_mbx_cmpl_clear_la;
1109 rc = lpfc_sli_issue_mbox
1111 (MBX_NOWAIT | MBX_STOP_IOCB));
1112 if (rc == MBX_NOT_FINISHED) {
1114 phba->mbox_mem_pool);
1115 lpfc_disc_flush_list(phba);
1116 psli->ring[(psli->extra_ring)].
1118 ~LPFC_STOP_IOCB_EVENT;
1119 psli->ring[(psli->fcp_ring)].
1121 ~LPFC_STOP_IOCB_EVENT;
1122 psli->ring[(psli->next_ring)].
1124 ~LPFC_STOP_IOCB_EVENT;
1130 lpfc_rscn_disc(phba);
1135 lpfc_els_free_iocb(phba, cmdiocb);
1140 lpfc_issue_els_adisc(struct lpfc_hba * phba, struct lpfc_nodelist * ndlp,
1145 struct lpfc_iocbq *elsiocb;
1146 struct lpfc_sli_ring *pring;
1147 struct lpfc_sli *psli;
1152 pring = &psli->ring[LPFC_ELS_RING]; /* ELS ring */
1154 cmdsize = (sizeof (uint32_t) + sizeof (ADISC));
1155 elsiocb = lpfc_prep_els_iocb(phba, 1, cmdsize, retry, ndlp,
1156 ndlp->nlp_DID, ELS_CMD_ADISC);
1160 icmd = &elsiocb->iocb;
1161 pcmd = (uint8_t *) (((struct lpfc_dmabuf *) elsiocb->context2)->virt);
1163 /* For ADISC request, remainder of payload is service parameters */
1164 *((uint32_t *) (pcmd)) = ELS_CMD_ADISC;
1165 pcmd += sizeof (uint32_t);
1167 /* Fill in ADISC payload */
1168 ap = (ADISC *) pcmd;
1169 ap->hardAL_PA = phba->fc_pref_ALPA;
1170 memcpy(&ap->portName, &phba->fc_portname, sizeof (struct lpfc_name));
1171 memcpy(&ap->nodeName, &phba->fc_nodename, sizeof (struct lpfc_name));
1172 ap->DID = be32_to_cpu(phba->fc_myDID);
1174 phba->fc_stat.elsXmitADISC++;
1175 elsiocb->iocb_cmpl = lpfc_cmpl_els_adisc;
1176 spin_lock_irq(phba->host->host_lock);
1177 ndlp->nlp_flag |= NLP_ADISC_SND;
1178 if (lpfc_sli_issue_iocb(phba, pring, elsiocb, 0) == IOCB_ERROR) {
1179 ndlp->nlp_flag &= ~NLP_ADISC_SND;
1180 spin_unlock_irq(phba->host->host_lock);
1181 lpfc_els_free_iocb(phba, elsiocb);
1184 spin_unlock_irq(phba->host->host_lock);
1189 lpfc_cmpl_els_logo(struct lpfc_hba * phba, struct lpfc_iocbq * cmdiocb,
1190 struct lpfc_iocbq * rspiocb)
1193 struct lpfc_sli *psli;
1194 struct lpfc_nodelist *ndlp;
1197 /* we pass cmdiocb to state machine which needs rspiocb as well */
1198 cmdiocb->context_un.rsp_iocb = rspiocb;
1200 irsp = &(rspiocb->iocb);
1201 ndlp = (struct lpfc_nodelist *) cmdiocb->context1;
1202 spin_lock_irq(phba->host->host_lock);
1203 ndlp->nlp_flag &= ~NLP_LOGO_SND;
1204 spin_unlock_irq(phba->host->host_lock);
1206 /* LOGO completes to NPort <nlp_DID> */
1207 lpfc_printf_log(phba, KERN_INFO, LOG_ELS,
1208 "%d:0105 LOGO completes to NPort x%x "
1209 "Data: x%x x%x x%x x%x\n",
1210 phba->brd_no, ndlp->nlp_DID, irsp->ulpStatus,
1211 irsp->un.ulpWord[4], irsp->ulpTimeout,
1212 phba->num_disc_nodes);
1214 /* Check to see if link went down during discovery */
1215 if (lpfc_els_chk_latt(phba))
1218 if (irsp->ulpStatus) {
1219 /* Check for retry */
1220 if (lpfc_els_retry(phba, cmdiocb, rspiocb)) {
1221 /* ELS command is being retried */
1225 /* Do not call DSM for lpfc_els_abort'ed ELS cmds */
1226 if ((irsp->ulpStatus == IOSTAT_LOCAL_REJECT) &&
1227 ((irsp->un.ulpWord[4] == IOERR_SLI_ABORTED) ||
1228 (irsp->un.ulpWord[4] == IOERR_LINK_DOWN) ||
1229 (irsp->un.ulpWord[4] == IOERR_SLI_DOWN))) {
1232 lpfc_disc_state_machine(phba, ndlp, cmdiocb,
1236 /* Good status, call state machine.
1237 * This will unregister the rpi if needed.
1239 lpfc_disc_state_machine(phba, ndlp, cmdiocb, NLP_EVT_CMPL_LOGO);
1243 lpfc_els_free_iocb(phba, cmdiocb);
1248 lpfc_issue_els_logo(struct lpfc_hba * phba, struct lpfc_nodelist * ndlp,
1252 struct lpfc_iocbq *elsiocb;
1253 struct lpfc_sli_ring *pring;
1254 struct lpfc_sli *psli;
1259 pring = &psli->ring[LPFC_ELS_RING];
1261 cmdsize = (2 * sizeof (uint32_t)) + sizeof (struct lpfc_name);
1262 elsiocb = lpfc_prep_els_iocb(phba, 1, cmdsize, retry, ndlp,
1263 ndlp->nlp_DID, ELS_CMD_LOGO);
1267 icmd = &elsiocb->iocb;
1268 pcmd = (uint8_t *) (((struct lpfc_dmabuf *) elsiocb->context2)->virt);
1269 *((uint32_t *) (pcmd)) = ELS_CMD_LOGO;
1270 pcmd += sizeof (uint32_t);
1272 /* Fill in LOGO payload */
1273 *((uint32_t *) (pcmd)) = be32_to_cpu(phba->fc_myDID);
1274 pcmd += sizeof (uint32_t);
1275 memcpy(pcmd, &phba->fc_portname, sizeof (struct lpfc_name));
1277 phba->fc_stat.elsXmitLOGO++;
1278 elsiocb->iocb_cmpl = lpfc_cmpl_els_logo;
1279 spin_lock_irq(phba->host->host_lock);
1280 ndlp->nlp_flag |= NLP_LOGO_SND;
1281 if (lpfc_sli_issue_iocb(phba, pring, elsiocb, 0) == IOCB_ERROR) {
1282 ndlp->nlp_flag &= ~NLP_LOGO_SND;
1283 spin_unlock_irq(phba->host->host_lock);
1284 lpfc_els_free_iocb(phba, elsiocb);
1287 spin_unlock_irq(phba->host->host_lock);
1292 lpfc_cmpl_els_cmd(struct lpfc_hba * phba, struct lpfc_iocbq * cmdiocb,
1293 struct lpfc_iocbq * rspiocb)
1297 irsp = &rspiocb->iocb;
1299 /* ELS cmd tag <ulpIoTag> completes */
1300 lpfc_printf_log(phba,
1303 "%d:0106 ELS cmd tag x%x completes Data: x%x x%x x%x\n",
1305 irsp->ulpIoTag, irsp->ulpStatus,
1306 irsp->un.ulpWord[4], irsp->ulpTimeout);
1308 /* Check to see if link went down during discovery */
1309 lpfc_els_chk_latt(phba);
1310 lpfc_els_free_iocb(phba, cmdiocb);
1315 lpfc_issue_els_scr(struct lpfc_hba * phba, uint32_t nportid, uint8_t retry)
1318 struct lpfc_iocbq *elsiocb;
1319 struct lpfc_sli_ring *pring;
1320 struct lpfc_sli *psli;
1323 struct lpfc_nodelist *ndlp;
1326 pring = &psli->ring[LPFC_ELS_RING]; /* ELS ring */
1327 cmdsize = (sizeof (uint32_t) + sizeof (SCR));
1328 ndlp = mempool_alloc(phba->nlp_mem_pool, GFP_KERNEL);
1332 lpfc_nlp_init(phba, ndlp, nportid);
1334 elsiocb = lpfc_prep_els_iocb(phba, 1, cmdsize, retry, ndlp,
1335 ndlp->nlp_DID, ELS_CMD_SCR);
1337 mempool_free( ndlp, phba->nlp_mem_pool);
1341 icmd = &elsiocb->iocb;
1342 pcmd = (uint8_t *) (((struct lpfc_dmabuf *) elsiocb->context2)->virt);
1344 *((uint32_t *) (pcmd)) = ELS_CMD_SCR;
1345 pcmd += sizeof (uint32_t);
1347 /* For SCR, remainder of payload is SCR parameter page */
1348 memset(pcmd, 0, sizeof (SCR));
1349 ((SCR *) pcmd)->Function = SCR_FUNC_FULL;
1351 phba->fc_stat.elsXmitSCR++;
1352 elsiocb->iocb_cmpl = lpfc_cmpl_els_cmd;
1353 spin_lock_irq(phba->host->host_lock);
1354 if (lpfc_sli_issue_iocb(phba, pring, elsiocb, 0) == IOCB_ERROR) {
1355 spin_unlock_irq(phba->host->host_lock);
1356 mempool_free( ndlp, phba->nlp_mem_pool);
1357 lpfc_els_free_iocb(phba, elsiocb);
1360 spin_unlock_irq(phba->host->host_lock);
1361 mempool_free( ndlp, phba->nlp_mem_pool);
1366 lpfc_issue_els_farpr(struct lpfc_hba * phba, uint32_t nportid, uint8_t retry)
1369 struct lpfc_iocbq *elsiocb;
1370 struct lpfc_sli_ring *pring;
1371 struct lpfc_sli *psli;
1376 struct lpfc_nodelist *ondlp;
1377 struct lpfc_nodelist *ndlp;
1380 pring = &psli->ring[LPFC_ELS_RING]; /* ELS ring */
1381 cmdsize = (sizeof (uint32_t) + sizeof (FARP));
1382 ndlp = mempool_alloc(phba->nlp_mem_pool, GFP_KERNEL);
1385 lpfc_nlp_init(phba, ndlp, nportid);
1387 elsiocb = lpfc_prep_els_iocb(phba, 1, cmdsize, retry, ndlp,
1388 ndlp->nlp_DID, ELS_CMD_RNID);
1390 mempool_free( ndlp, phba->nlp_mem_pool);
1394 icmd = &elsiocb->iocb;
1395 pcmd = (uint8_t *) (((struct lpfc_dmabuf *) elsiocb->context2)->virt);
1397 *((uint32_t *) (pcmd)) = ELS_CMD_FARPR;
1398 pcmd += sizeof (uint32_t);
1400 /* Fill in FARPR payload */
1401 fp = (FARP *) (pcmd);
1402 memset(fp, 0, sizeof (FARP));
1403 lp = (uint32_t *) pcmd;
1404 *lp++ = be32_to_cpu(nportid);
1405 *lp++ = be32_to_cpu(phba->fc_myDID);
1407 fp->Mflags = (FARP_MATCH_PORT | FARP_MATCH_NODE);
1409 memcpy(&fp->RportName, &phba->fc_portname, sizeof (struct lpfc_name));
1410 memcpy(&fp->RnodeName, &phba->fc_nodename, sizeof (struct lpfc_name));
1411 if ((ondlp = lpfc_findnode_did(phba, NLP_SEARCH_ALL, nportid))) {
1412 memcpy(&fp->OportName, &ondlp->nlp_portname,
1413 sizeof (struct lpfc_name));
1414 memcpy(&fp->OnodeName, &ondlp->nlp_nodename,
1415 sizeof (struct lpfc_name));
1418 phba->fc_stat.elsXmitFARPR++;
1419 elsiocb->iocb_cmpl = lpfc_cmpl_els_cmd;
1420 spin_lock_irq(phba->host->host_lock);
1421 if (lpfc_sli_issue_iocb(phba, pring, elsiocb, 0) == IOCB_ERROR) {
1422 spin_unlock_irq(phba->host->host_lock);
1423 mempool_free( ndlp, phba->nlp_mem_pool);
1424 lpfc_els_free_iocb(phba, elsiocb);
1427 spin_unlock_irq(phba->host->host_lock);
1428 mempool_free( ndlp, phba->nlp_mem_pool);
1433 lpfc_cancel_retry_delay_tmo(struct lpfc_hba *phba, struct lpfc_nodelist * nlp)
1435 nlp->nlp_flag &= ~NLP_DELAY_TMO;
1436 del_timer_sync(&nlp->nlp_delayfunc);
1437 nlp->nlp_last_elscmd = 0;
1439 if (!list_empty(&nlp->els_retry_evt.evt_listp))
1440 list_del_init(&nlp->els_retry_evt.evt_listp);
1442 if (nlp->nlp_flag & NLP_NPR_2B_DISC) {
1443 nlp->nlp_flag &= ~NLP_NPR_2B_DISC;
1444 if (phba->num_disc_nodes) {
1445 /* Check to see if there are more
1448 lpfc_more_plogi(phba);
1450 if (phba->num_disc_nodes == 0) {
1451 phba->fc_flag &= ~FC_NDISC_ACTIVE;
1452 lpfc_can_disctmo(phba);
1453 if (phba->fc_flag & FC_RSCN_MODE) {
1455 * Check to see if more RSCNs
1456 * came in while we were
1457 * processing this one.
1459 if((phba->fc_rscn_id_cnt==0) &&
1460 !(phba->fc_flag & FC_RSCN_DISCOVERY)) {
1461 phba->fc_flag &= ~FC_RSCN_MODE;
1464 lpfc_els_handle_rscn(phba);
1474 lpfc_els_retry_delay(unsigned long ptr)
1476 struct lpfc_nodelist *ndlp;
1477 struct lpfc_hba *phba;
1478 unsigned long iflag;
1479 struct lpfc_work_evt *evtp;
1481 ndlp = (struct lpfc_nodelist *)ptr;
1482 phba = ndlp->nlp_phba;
1483 evtp = &ndlp->els_retry_evt;
1485 spin_lock_irqsave(phba->host->host_lock, iflag);
1486 if (!list_empty(&evtp->evt_listp)) {
1487 spin_unlock_irqrestore(phba->host->host_lock, iflag);
1491 evtp->evt_arg1 = ndlp;
1492 evtp->evt = LPFC_EVT_ELS_RETRY;
1493 list_add_tail(&evtp->evt_listp, &phba->work_list);
1494 if (phba->work_wait)
1495 wake_up(phba->work_wait);
1497 spin_unlock_irqrestore(phba->host->host_lock, iflag);
1502 lpfc_els_retry_delay_handler(struct lpfc_nodelist *ndlp)
1504 struct lpfc_hba *phba;
1509 phba = ndlp->nlp_phba;
1510 spin_lock_irq(phba->host->host_lock);
1511 did = ndlp->nlp_DID;
1512 cmd = ndlp->nlp_last_elscmd;
1513 ndlp->nlp_last_elscmd = 0;
1515 if (!(ndlp->nlp_flag & NLP_DELAY_TMO)) {
1516 spin_unlock_irq(phba->host->host_lock);
1520 ndlp->nlp_flag &= ~NLP_DELAY_TMO;
1521 spin_unlock_irq(phba->host->host_lock);
1523 * If a discovery event readded nlp_delayfunc after timer
1524 * firing and before processing the timer, cancel the
1527 del_timer_sync(&ndlp->nlp_delayfunc);
1528 retry = ndlp->nlp_retry;
1532 lpfc_issue_els_flogi(phba, ndlp, retry);
1535 if(!lpfc_issue_els_plogi(phba, ndlp->nlp_DID, retry)) {
1536 ndlp->nlp_prev_state = ndlp->nlp_state;
1537 lpfc_nlp_set_state(phba, ndlp, NLP_STE_PLOGI_ISSUE);
1541 if (!lpfc_issue_els_adisc(phba, ndlp, retry)) {
1542 ndlp->nlp_prev_state = ndlp->nlp_state;
1543 lpfc_nlp_set_state(phba, ndlp, NLP_STE_ADISC_ISSUE);
1547 if (!lpfc_issue_els_prli(phba, ndlp, retry)) {
1548 ndlp->nlp_prev_state = ndlp->nlp_state;
1549 lpfc_nlp_set_state(phba, ndlp, NLP_STE_PRLI_ISSUE);
1553 if (!lpfc_issue_els_logo(phba, ndlp, retry)) {
1554 ndlp->nlp_prev_state = ndlp->nlp_state;
1555 lpfc_nlp_set_state(phba, ndlp, NLP_STE_NPR_NODE);
1563 lpfc_els_retry(struct lpfc_hba * phba, struct lpfc_iocbq * cmdiocb,
1564 struct lpfc_iocbq * rspiocb)
1567 struct lpfc_dmabuf *pcmd;
1568 struct lpfc_nodelist *ndlp;
1571 int retry, maxretry;
1578 maxretry = lpfc_max_els_tries;
1579 irsp = &rspiocb->iocb;
1580 ndlp = (struct lpfc_nodelist *) cmdiocb->context1;
1581 pcmd = (struct lpfc_dmabuf *) cmdiocb->context2;
1584 /* Note: context2 may be 0 for internal driver abort
1585 * of delays ELS command.
1588 if (pcmd && pcmd->virt) {
1589 elscmd = (uint32_t *) (pcmd->virt);
1594 did = ndlp->nlp_DID;
1596 /* We should only hit this case for retrying PLOGI */
1597 did = irsp->un.elsreq64.remoteID;
1598 ndlp = lpfc_findnode_did(phba, NLP_SEARCH_ALL, did);
1599 if (!ndlp && (cmd != ELS_CMD_PLOGI))
1603 switch (irsp->ulpStatus) {
1604 case IOSTAT_FCP_RSP_ERROR:
1605 case IOSTAT_REMOTE_STOP:
1608 case IOSTAT_LOCAL_REJECT:
1609 switch ((irsp->un.ulpWord[4] & 0xff)) {
1610 case IOERR_LOOP_OPEN_FAILURE:
1611 if (cmd == ELS_CMD_PLOGI) {
1612 if (cmdiocb->retry == 0) {
1619 case IOERR_SEQUENCE_TIMEOUT:
1623 case IOERR_NO_RESOURCES:
1624 if (cmd == ELS_CMD_PLOGI) {
1630 case IOERR_INVALID_RPI:
1636 case IOSTAT_NPORT_RJT:
1637 case IOSTAT_FABRIC_RJT:
1638 if (irsp->un.ulpWord[4] & RJT_UNAVAIL_TEMP) {
1644 case IOSTAT_NPORT_BSY:
1645 case IOSTAT_FABRIC_BSY:
1650 stat.un.lsRjtError = be32_to_cpu(irsp->un.ulpWord[4]);
1651 /* Added for Vendor specifc support
1652 * Just keep retrying for these Rsn / Exp codes
1654 switch (stat.un.b.lsRjtRsnCode) {
1655 case LSRJT_UNABLE_TPC:
1656 if (stat.un.b.lsRjtRsnCodeExp ==
1657 LSEXP_CMD_IN_PROGRESS) {
1658 if (cmd == ELS_CMD_PLOGI) {
1665 if (cmd == ELS_CMD_PLOGI) {
1667 maxretry = lpfc_max_els_tries + 1;
1673 case LSRJT_LOGICAL_BSY:
1674 if (cmd == ELS_CMD_PLOGI) {
1683 case IOSTAT_INTERMED_RSP:
1691 if (did == FDMI_DID)
1694 if ((++cmdiocb->retry) >= maxretry) {
1695 phba->fc_stat.elsRetryExceeded++;
1701 /* Retry ELS command <elsCmd> to remote NPORT <did> */
1702 lpfc_printf_log(phba, KERN_INFO, LOG_ELS,
1703 "%d:0107 Retry ELS command x%x to remote "
1704 "NPORT x%x Data: x%x x%x\n",
1706 cmd, did, cmdiocb->retry, delay);
1708 if ((cmd == ELS_CMD_PLOGI) || (cmd == ELS_CMD_ADISC)) {
1709 /* If discovery / RSCN timer is running, reset it */
1710 if (timer_pending(&phba->fc_disctmo) ||
1711 (phba->fc_flag & FC_RSCN_MODE)) {
1712 lpfc_set_disctmo(phba);
1716 phba->fc_stat.elsXmitRetry++;
1717 if (ndlp && delay) {
1718 phba->fc_stat.elsDelayRetry++;
1719 ndlp->nlp_retry = cmdiocb->retry;
1721 mod_timer(&ndlp->nlp_delayfunc, jiffies + HZ);
1722 ndlp->nlp_flag |= NLP_DELAY_TMO;
1724 ndlp->nlp_prev_state = ndlp->nlp_state;
1725 lpfc_nlp_set_state(phba, ndlp, NLP_STE_NPR_NODE);
1726 ndlp->nlp_last_elscmd = cmd;
1732 lpfc_issue_els_flogi(phba, ndlp, cmdiocb->retry);
1736 ndlp->nlp_prev_state = ndlp->nlp_state;
1737 lpfc_nlp_set_state(phba, ndlp,
1738 NLP_STE_PLOGI_ISSUE);
1740 lpfc_issue_els_plogi(phba, did, cmdiocb->retry);
1743 ndlp->nlp_prev_state = ndlp->nlp_state;
1744 lpfc_nlp_set_state(phba, ndlp, NLP_STE_ADISC_ISSUE);
1745 lpfc_issue_els_adisc(phba, ndlp, cmdiocb->retry);
1748 ndlp->nlp_prev_state = ndlp->nlp_state;
1749 lpfc_nlp_set_state(phba, ndlp, NLP_STE_PRLI_ISSUE);
1750 lpfc_issue_els_prli(phba, ndlp, cmdiocb->retry);
1753 ndlp->nlp_prev_state = ndlp->nlp_state;
1754 lpfc_nlp_set_state(phba, ndlp, NLP_STE_NPR_NODE);
1755 lpfc_issue_els_logo(phba, ndlp, cmdiocb->retry);
1760 /* No retry ELS command <elsCmd> to remote NPORT <did> */
1761 lpfc_printf_log(phba, KERN_INFO, LOG_ELS,
1762 "%d:0108 No retry ELS command x%x to remote NPORT x%x "
1765 cmd, did, cmdiocb->retry);
1771 lpfc_els_free_iocb(struct lpfc_hba * phba, struct lpfc_iocbq * elsiocb)
1773 struct lpfc_dmabuf *buf_ptr, *buf_ptr1;
1775 /* context2 = cmd, context2->next = rsp, context3 = bpl */
1776 if (elsiocb->context2) {
1777 buf_ptr1 = (struct lpfc_dmabuf *) elsiocb->context2;
1778 /* Free the response before processing the command. */
1779 if (!list_empty(&buf_ptr1->list)) {
1780 list_remove_head(&buf_ptr1->list, buf_ptr,
1783 lpfc_mbuf_free(phba, buf_ptr->virt, buf_ptr->phys);
1786 lpfc_mbuf_free(phba, buf_ptr1->virt, buf_ptr1->phys);
1790 if (elsiocb->context3) {
1791 buf_ptr = (struct lpfc_dmabuf *) elsiocb->context3;
1792 lpfc_mbuf_free(phba, buf_ptr->virt, buf_ptr->phys);
1795 spin_lock_irq(phba->host->host_lock);
1796 lpfc_sli_release_iocbq(phba, elsiocb);
1797 spin_unlock_irq(phba->host->host_lock);
1802 lpfc_cmpl_els_logo_acc(struct lpfc_hba * phba, struct lpfc_iocbq * cmdiocb,
1803 struct lpfc_iocbq * rspiocb)
1805 struct lpfc_nodelist *ndlp;
1807 ndlp = (struct lpfc_nodelist *) cmdiocb->context1;
1809 /* ACC to LOGO completes to NPort <nlp_DID> */
1810 lpfc_printf_log(phba, KERN_INFO, LOG_ELS,
1811 "%d:0109 ACC to LOGO completes to NPort x%x "
1812 "Data: x%x x%x x%x\n",
1813 phba->brd_no, ndlp->nlp_DID, ndlp->nlp_flag,
1814 ndlp->nlp_state, ndlp->nlp_rpi);
1816 switch (ndlp->nlp_state) {
1817 case NLP_STE_UNUSED_NODE: /* node is just allocated */
1818 lpfc_drop_node(phba, ndlp);
1820 case NLP_STE_NPR_NODE: /* NPort Recovery mode */
1821 lpfc_unreg_rpi(phba, ndlp);
1826 lpfc_els_free_iocb(phba, cmdiocb);
1831 lpfc_cmpl_els_acc(struct lpfc_hba * phba, struct lpfc_iocbq * cmdiocb,
1832 struct lpfc_iocbq * rspiocb)
1835 struct lpfc_nodelist *ndlp;
1836 LPFC_MBOXQ_t *mbox = NULL;
1837 struct lpfc_dmabuf *mp;
1839 irsp = &rspiocb->iocb;
1841 ndlp = (struct lpfc_nodelist *) cmdiocb->context1;
1842 if (cmdiocb->context_un.mbox)
1843 mbox = cmdiocb->context_un.mbox;
1846 /* Check to see if link went down during discovery */
1847 if ((lpfc_els_chk_latt(phba)) || !ndlp) {
1849 mp = (struct lpfc_dmabuf *) mbox->context1;
1851 lpfc_mbuf_free(phba, mp->virt, mp->phys);
1854 mempool_free( mbox, phba->mbox_mem_pool);
1859 /* ELS response tag <ulpIoTag> completes */
1860 lpfc_printf_log(phba, KERN_INFO, LOG_ELS,
1861 "%d:0110 ELS response tag x%x completes "
1862 "Data: x%x x%x x%x x%x x%x x%x x%x\n",
1864 cmdiocb->iocb.ulpIoTag, rspiocb->iocb.ulpStatus,
1865 rspiocb->iocb.un.ulpWord[4], rspiocb->iocb.ulpTimeout,
1866 ndlp->nlp_DID, ndlp->nlp_flag, ndlp->nlp_state,
1870 if ((rspiocb->iocb.ulpStatus == 0)
1871 && (ndlp->nlp_flag & NLP_ACC_REGLOGIN)) {
1872 lpfc_unreg_rpi(phba, ndlp);
1873 mbox->mbox_cmpl = lpfc_mbx_cmpl_reg_login;
1874 mbox->context2 = ndlp;
1875 ndlp->nlp_prev_state = ndlp->nlp_state;
1876 lpfc_nlp_set_state(phba, ndlp, NLP_STE_REG_LOGIN_ISSUE);
1877 if (lpfc_sli_issue_mbox(phba, mbox,
1878 (MBX_NOWAIT | MBX_STOP_IOCB))
1879 != MBX_NOT_FINISHED) {
1882 /* NOTE: we should have messages for unsuccessful
1885 /* Do not call NO_LIST for lpfc_els_abort'ed ELS cmds */
1886 if (!((irsp->ulpStatus == IOSTAT_LOCAL_REJECT) &&
1887 ((irsp->un.ulpWord[4] == IOERR_SLI_ABORTED) ||
1888 (irsp->un.ulpWord[4] == IOERR_LINK_DOWN) ||
1889 (irsp->un.ulpWord[4] == IOERR_SLI_DOWN)))) {
1890 if (ndlp->nlp_flag & NLP_ACC_REGLOGIN) {
1891 lpfc_drop_node(phba, ndlp);
1896 mp = (struct lpfc_dmabuf *) mbox->context1;
1898 lpfc_mbuf_free(phba, mp->virt, mp->phys);
1901 mempool_free(mbox, phba->mbox_mem_pool);
1905 spin_lock_irq(phba->host->host_lock);
1906 ndlp->nlp_flag &= ~NLP_ACC_REGLOGIN;
1907 spin_unlock_irq(phba->host->host_lock);
1909 lpfc_els_free_iocb(phba, cmdiocb);
1914 lpfc_els_rsp_acc(struct lpfc_hba * phba, uint32_t flag,
1915 struct lpfc_iocbq * oldiocb, struct lpfc_nodelist * ndlp,
1916 LPFC_MBOXQ_t * mbox, uint8_t newnode)
1920 struct lpfc_iocbq *elsiocb;
1921 struct lpfc_sli_ring *pring;
1922 struct lpfc_sli *psli;
1926 ELS_PKT *els_pkt_ptr;
1929 pring = &psli->ring[LPFC_ELS_RING]; /* ELS ring */
1930 oldcmd = &oldiocb->iocb;
1934 cmdsize = sizeof (uint32_t);
1935 elsiocb = lpfc_prep_els_iocb(phba, 0, cmdsize, oldiocb->retry,
1936 ndlp, ndlp->nlp_DID, ELS_CMD_ACC);
1938 ndlp->nlp_flag &= ~NLP_LOGO_ACC;
1941 icmd = &elsiocb->iocb;
1942 icmd->ulpContext = oldcmd->ulpContext; /* Xri */
1943 pcmd = (((struct lpfc_dmabuf *) elsiocb->context2)->virt);
1944 *((uint32_t *) (pcmd)) = ELS_CMD_ACC;
1945 pcmd += sizeof (uint32_t);
1948 cmdsize = (sizeof (struct serv_parm) + sizeof (uint32_t));
1949 elsiocb = lpfc_prep_els_iocb(phba, 0, cmdsize, oldiocb->retry,
1950 ndlp, ndlp->nlp_DID, ELS_CMD_ACC);
1954 icmd = &elsiocb->iocb;
1955 icmd->ulpContext = oldcmd->ulpContext; /* Xri */
1956 pcmd = (((struct lpfc_dmabuf *) elsiocb->context2)->virt);
1959 elsiocb->context_un.mbox = mbox;
1961 *((uint32_t *) (pcmd)) = ELS_CMD_ACC;
1962 pcmd += sizeof (uint32_t);
1963 memcpy(pcmd, &phba->fc_sparam, sizeof (struct serv_parm));
1966 cmdsize = sizeof (uint32_t) + sizeof (PRLO);
1967 elsiocb = lpfc_prep_els_iocb(phba, 0, cmdsize, oldiocb->retry,
1968 ndlp, ndlp->nlp_DID, ELS_CMD_PRLO);
1972 icmd = &elsiocb->iocb;
1973 icmd->ulpContext = oldcmd->ulpContext; /* Xri */
1974 pcmd = (((struct lpfc_dmabuf *) elsiocb->context2)->virt);
1976 memcpy(pcmd, ((struct lpfc_dmabuf *) oldiocb->context2)->virt,
1977 sizeof (uint32_t) + sizeof (PRLO));
1978 *((uint32_t *) (pcmd)) = ELS_CMD_PRLO_ACC;
1979 els_pkt_ptr = (ELS_PKT *) pcmd;
1980 els_pkt_ptr->un.prlo.acceptRspCode = PRLO_REQ_EXECUTED;
1987 elsiocb->context1 = NULL;
1989 /* Xmit ELS ACC response tag <ulpIoTag> */
1990 lpfc_printf_log(phba, KERN_INFO, LOG_ELS,
1991 "%d:0128 Xmit ELS ACC response tag x%x, XRI: x%x, "
1992 "DID: x%x, nlp_flag: x%x nlp_state: x%x RPI: x%x\n",
1993 phba->brd_no, elsiocb->iotag,
1994 elsiocb->iocb.ulpContext, ndlp->nlp_DID,
1995 ndlp->nlp_flag, ndlp->nlp_state, ndlp->nlp_rpi);
1997 if (ndlp->nlp_flag & NLP_LOGO_ACC) {
1998 spin_lock_irq(phba->host->host_lock);
1999 ndlp->nlp_flag &= ~NLP_LOGO_ACC;
2000 spin_unlock_irq(phba->host->host_lock);
2001 elsiocb->iocb_cmpl = lpfc_cmpl_els_logo_acc;
2003 elsiocb->iocb_cmpl = lpfc_cmpl_els_acc;
2006 phba->fc_stat.elsXmitACC++;
2007 spin_lock_irq(phba->host->host_lock);
2008 rc = lpfc_sli_issue_iocb(phba, pring, elsiocb, 0);
2009 spin_unlock_irq(phba->host->host_lock);
2010 if (rc == IOCB_ERROR) {
2011 lpfc_els_free_iocb(phba, elsiocb);
2018 lpfc_els_rsp_reject(struct lpfc_hba * phba, uint32_t rejectError,
2019 struct lpfc_iocbq * oldiocb, struct lpfc_nodelist * ndlp)
2023 struct lpfc_iocbq *elsiocb;
2024 struct lpfc_sli_ring *pring;
2025 struct lpfc_sli *psli;
2031 pring = &psli->ring[LPFC_ELS_RING]; /* ELS ring */
2033 cmdsize = 2 * sizeof (uint32_t);
2034 elsiocb = lpfc_prep_els_iocb(phba, 0, cmdsize, oldiocb->retry,
2035 ndlp, ndlp->nlp_DID, ELS_CMD_LS_RJT);
2039 icmd = &elsiocb->iocb;
2040 oldcmd = &oldiocb->iocb;
2041 icmd->ulpContext = oldcmd->ulpContext; /* Xri */
2042 pcmd = (uint8_t *) (((struct lpfc_dmabuf *) elsiocb->context2)->virt);
2044 *((uint32_t *) (pcmd)) = ELS_CMD_LS_RJT;
2045 pcmd += sizeof (uint32_t);
2046 *((uint32_t *) (pcmd)) = rejectError;
2048 /* Xmit ELS RJT <err> response tag <ulpIoTag> */
2049 lpfc_printf_log(phba, KERN_INFO, LOG_ELS,
2050 "%d:0129 Xmit ELS RJT x%x response tag x%x xri x%x, "
2051 "did x%x, nlp_flag x%x, nlp_state x%x, rpi x%x\n",
2052 phba->brd_no, rejectError, elsiocb->iotag,
2053 elsiocb->iocb.ulpContext, ndlp->nlp_DID,
2054 ndlp->nlp_flag, ndlp->nlp_state, ndlp->nlp_rpi);
2056 phba->fc_stat.elsXmitLSRJT++;
2057 elsiocb->iocb_cmpl = lpfc_cmpl_els_acc;
2058 spin_lock_irq(phba->host->host_lock);
2059 rc = lpfc_sli_issue_iocb(phba, pring, elsiocb, 0);
2060 spin_unlock_irq(phba->host->host_lock);
2061 if (rc == IOCB_ERROR) {
2062 lpfc_els_free_iocb(phba, elsiocb);
2069 lpfc_els_rsp_adisc_acc(struct lpfc_hba * phba,
2070 struct lpfc_iocbq * oldiocb, struct lpfc_nodelist * ndlp)
2075 struct lpfc_iocbq *elsiocb;
2076 struct lpfc_sli_ring *pring;
2077 struct lpfc_sli *psli;
2083 pring = &psli->ring[LPFC_ELS_RING]; /* ELS ring */
2085 cmdsize = sizeof (uint32_t) + sizeof (ADISC);
2086 elsiocb = lpfc_prep_els_iocb(phba, 0, cmdsize, oldiocb->retry,
2087 ndlp, ndlp->nlp_DID, ELS_CMD_ACC);
2091 icmd = &elsiocb->iocb;
2092 oldcmd = &oldiocb->iocb;
2093 icmd->ulpContext = oldcmd->ulpContext; /* Xri */
2095 /* Xmit ADISC ACC response tag <ulpIoTag> */
2096 lpfc_printf_log(phba, KERN_INFO, LOG_ELS,
2097 "%d:0130 Xmit ADISC ACC response iotag x%x xri: "
2098 "x%x, did x%x, nlp_flag x%x, nlp_state x%x rpi x%x\n",
2099 phba->brd_no, elsiocb->iotag,
2100 elsiocb->iocb.ulpContext, ndlp->nlp_DID,
2101 ndlp->nlp_flag, ndlp->nlp_state, ndlp->nlp_rpi);
2103 pcmd = (uint8_t *) (((struct lpfc_dmabuf *) elsiocb->context2)->virt);
2105 *((uint32_t *) (pcmd)) = ELS_CMD_ACC;
2106 pcmd += sizeof (uint32_t);
2108 ap = (ADISC *) (pcmd);
2109 ap->hardAL_PA = phba->fc_pref_ALPA;
2110 memcpy(&ap->portName, &phba->fc_portname, sizeof (struct lpfc_name));
2111 memcpy(&ap->nodeName, &phba->fc_nodename, sizeof (struct lpfc_name));
2112 ap->DID = be32_to_cpu(phba->fc_myDID);
2114 phba->fc_stat.elsXmitACC++;
2115 elsiocb->iocb_cmpl = lpfc_cmpl_els_acc;
2116 spin_lock_irq(phba->host->host_lock);
2117 rc = lpfc_sli_issue_iocb(phba, pring, elsiocb, 0);
2118 spin_unlock_irq(phba->host->host_lock);
2119 if (rc == IOCB_ERROR) {
2120 lpfc_els_free_iocb(phba, elsiocb);
2127 lpfc_els_rsp_prli_acc(struct lpfc_hba *phba, struct lpfc_iocbq *oldiocb,
2128 struct lpfc_nodelist *ndlp)
2134 struct lpfc_iocbq *elsiocb;
2135 struct lpfc_sli_ring *pring;
2136 struct lpfc_sli *psli;
2142 pring = &psli->ring[LPFC_ELS_RING]; /* ELS ring */
2144 cmdsize = sizeof (uint32_t) + sizeof (PRLI);
2145 elsiocb = lpfc_prep_els_iocb(phba, 0, cmdsize, oldiocb->retry, ndlp,
2146 ndlp->nlp_DID, (ELS_CMD_ACC | (ELS_CMD_PRLI & ~ELS_RSP_MASK)));
2150 icmd = &elsiocb->iocb;
2151 oldcmd = &oldiocb->iocb;
2152 icmd->ulpContext = oldcmd->ulpContext; /* Xri */
2154 /* Xmit PRLI ACC response tag <ulpIoTag> */
2155 lpfc_printf_log(phba, KERN_INFO, LOG_ELS,
2156 "%d:0131 Xmit PRLI ACC response tag x%x xri x%x, "
2157 "did x%x, nlp_flag x%x, nlp_state x%x, rpi x%x\n",
2158 phba->brd_no, elsiocb->iotag,
2159 elsiocb->iocb.ulpContext, ndlp->nlp_DID,
2160 ndlp->nlp_flag, ndlp->nlp_state, ndlp->nlp_rpi);
2162 pcmd = (uint8_t *) (((struct lpfc_dmabuf *) elsiocb->context2)->virt);
2164 *((uint32_t *) (pcmd)) = (ELS_CMD_ACC | (ELS_CMD_PRLI & ~ELS_RSP_MASK));
2165 pcmd += sizeof (uint32_t);
2167 /* For PRLI, remainder of payload is PRLI parameter page */
2168 memset(pcmd, 0, sizeof (PRLI));
2170 npr = (PRLI *) pcmd;
2173 * If our firmware version is 3.20 or later,
2174 * set the following bits for FC-TAPE support.
2176 if (vpd->rev.feaLevelHigh >= 0x02) {
2177 npr->ConfmComplAllowed = 1;
2179 npr->TaskRetryIdReq = 1;
2182 npr->acceptRspCode = PRLI_REQ_EXECUTED;
2183 npr->estabImagePair = 1;
2184 npr->readXferRdyDis = 1;
2185 npr->ConfmComplAllowed = 1;
2187 npr->prliType = PRLI_FCP_TYPE;
2188 npr->initiatorFunc = 1;
2190 phba->fc_stat.elsXmitACC++;
2191 elsiocb->iocb_cmpl = lpfc_cmpl_els_acc;
2193 spin_lock_irq(phba->host->host_lock);
2194 rc = lpfc_sli_issue_iocb(phba, pring, elsiocb, 0);
2195 spin_unlock_irq(phba->host->host_lock);
2196 if (rc == IOCB_ERROR) {
2197 lpfc_els_free_iocb(phba, elsiocb);
2204 lpfc_els_rsp_rnid_acc(struct lpfc_hba * phba,
2206 struct lpfc_iocbq * oldiocb, struct lpfc_nodelist * ndlp)
2211 struct lpfc_iocbq *elsiocb;
2212 struct lpfc_sli_ring *pring;
2213 struct lpfc_sli *psli;
2219 pring = &psli->ring[LPFC_ELS_RING];
2221 cmdsize = sizeof (uint32_t) + sizeof (uint32_t)
2222 + (2 * sizeof (struct lpfc_name));
2224 cmdsize += sizeof (RNID_TOP_DISC);
2226 elsiocb = lpfc_prep_els_iocb(phba, 0, cmdsize, oldiocb->retry,
2227 ndlp, ndlp->nlp_DID, ELS_CMD_ACC);
2231 icmd = &elsiocb->iocb;
2232 oldcmd = &oldiocb->iocb;
2233 icmd->ulpContext = oldcmd->ulpContext; /* Xri */
2235 /* Xmit RNID ACC response tag <ulpIoTag> */
2236 lpfc_printf_log(phba, KERN_INFO, LOG_ELS,
2237 "%d:0132 Xmit RNID ACC response tag x%x "
2239 phba->brd_no, elsiocb->iotag,
2240 elsiocb->iocb.ulpContext);
2242 pcmd = (uint8_t *) (((struct lpfc_dmabuf *) elsiocb->context2)->virt);
2244 *((uint32_t *) (pcmd)) = ELS_CMD_ACC;
2245 pcmd += sizeof (uint32_t);
2247 memset(pcmd, 0, sizeof (RNID));
2248 rn = (RNID *) (pcmd);
2249 rn->Format = format;
2250 rn->CommonLen = (2 * sizeof (struct lpfc_name));
2251 memcpy(&rn->portName, &phba->fc_portname, sizeof (struct lpfc_name));
2252 memcpy(&rn->nodeName, &phba->fc_nodename, sizeof (struct lpfc_name));
2255 rn->SpecificLen = 0;
2257 case RNID_TOPOLOGY_DISC:
2258 rn->SpecificLen = sizeof (RNID_TOP_DISC);
2259 memcpy(&rn->un.topologyDisc.portName,
2260 &phba->fc_portname, sizeof (struct lpfc_name));
2261 rn->un.topologyDisc.unitType = RNID_HBA;
2262 rn->un.topologyDisc.physPort = 0;
2263 rn->un.topologyDisc.attachedNodes = 0;
2267 rn->SpecificLen = 0;
2271 phba->fc_stat.elsXmitACC++;
2272 elsiocb->iocb_cmpl = lpfc_cmpl_els_acc;
2273 elsiocb->context1 = NULL; /* Don't need ndlp for cmpl,
2274 * it could be freed */
2276 spin_lock_irq(phba->host->host_lock);
2277 rc = lpfc_sli_issue_iocb(phba, pring, elsiocb, 0);
2278 spin_unlock_irq(phba->host->host_lock);
2279 if (rc == IOCB_ERROR) {
2280 lpfc_els_free_iocb(phba, elsiocb);
2287 lpfc_els_disc_adisc(struct lpfc_hba * phba)
2290 struct lpfc_nodelist *ndlp, *next_ndlp;
2293 /* go thru NPR list and issue any remaining ELS ADISCs */
2294 list_for_each_entry_safe(ndlp, next_ndlp, &phba->fc_npr_list,
2296 if (ndlp->nlp_flag & NLP_NPR_2B_DISC) {
2297 if (ndlp->nlp_flag & NLP_NPR_ADISC) {
2298 ndlp->nlp_flag &= ~NLP_NPR_ADISC;
2299 ndlp->nlp_prev_state = ndlp->nlp_state;
2300 lpfc_nlp_set_state(phba, ndlp,
2301 NLP_STE_ADISC_ISSUE);
2302 lpfc_issue_els_adisc(phba, ndlp, 0);
2304 phba->num_disc_nodes++;
2305 if (phba->num_disc_nodes >=
2306 phba->cfg_discovery_threads) {
2307 spin_lock_irq(phba->host->host_lock);
2308 phba->fc_flag |= FC_NLP_MORE;
2309 spin_unlock_irq(phba->host->host_lock);
2315 if (sentadisc == 0) {
2316 spin_lock_irq(phba->host->host_lock);
2317 phba->fc_flag &= ~FC_NLP_MORE;
2318 spin_unlock_irq(phba->host->host_lock);
2324 lpfc_els_disc_plogi(struct lpfc_hba * phba)
2327 struct lpfc_nodelist *ndlp, *next_ndlp;
2330 /* go thru NPR list and issue any remaining ELS PLOGIs */
2331 list_for_each_entry_safe(ndlp, next_ndlp, &phba->fc_npr_list,
2333 if ((ndlp->nlp_flag & NLP_NPR_2B_DISC) &&
2334 (!(ndlp->nlp_flag & NLP_DELAY_TMO))) {
2335 if (!(ndlp->nlp_flag & NLP_NPR_ADISC)) {
2336 ndlp->nlp_prev_state = ndlp->nlp_state;
2337 lpfc_nlp_set_state(phba, ndlp,
2338 NLP_STE_PLOGI_ISSUE);
2339 lpfc_issue_els_plogi(phba, ndlp->nlp_DID, 0);
2341 phba->num_disc_nodes++;
2342 if (phba->num_disc_nodes >=
2343 phba->cfg_discovery_threads) {
2344 spin_lock_irq(phba->host->host_lock);
2345 phba->fc_flag |= FC_NLP_MORE;
2346 spin_unlock_irq(phba->host->host_lock);
2352 if (sentplogi == 0) {
2353 spin_lock_irq(phba->host->host_lock);
2354 phba->fc_flag &= ~FC_NLP_MORE;
2355 spin_unlock_irq(phba->host->host_lock);
2361 lpfc_els_flush_rscn(struct lpfc_hba * phba)
2363 struct lpfc_dmabuf *mp;
2366 for (i = 0; i < phba->fc_rscn_id_cnt; i++) {
2367 mp = phba->fc_rscn_id_list[i];
2368 lpfc_mbuf_free(phba, mp->virt, mp->phys);
2370 phba->fc_rscn_id_list[i] = NULL;
2372 phba->fc_rscn_id_cnt = 0;
2373 spin_lock_irq(phba->host->host_lock);
2374 phba->fc_flag &= ~(FC_RSCN_MODE | FC_RSCN_DISCOVERY);
2375 spin_unlock_irq(phba->host->host_lock);
2376 lpfc_can_disctmo(phba);
2381 lpfc_rscn_payload_check(struct lpfc_hba * phba, uint32_t did)
2385 struct lpfc_dmabuf *mp;
2387 uint32_t payload_len, cmd, i, match;
2389 ns_did.un.word = did;
2392 /* Never match fabric nodes for RSCNs */
2393 if ((did & Fabric_DID_MASK) == Fabric_DID_MASK)
2396 /* If we are doing a FULL RSCN rediscovery, match everything */
2397 if (phba->fc_flag & FC_RSCN_DISCOVERY) {
2401 for (i = 0; i < phba->fc_rscn_id_cnt; i++) {
2402 mp = phba->fc_rscn_id_list[i];
2403 lp = (uint32_t *) mp->virt;
2405 payload_len = be32_to_cpu(cmd) & 0xffff; /* payload length */
2406 payload_len -= sizeof (uint32_t); /* take off word 0 */
2407 while (payload_len) {
2408 rscn_did.un.word = *lp++;
2409 rscn_did.un.word = be32_to_cpu(rscn_did.un.word);
2410 payload_len -= sizeof (uint32_t);
2411 switch (rscn_did.un.b.resv) {
2412 case 0: /* Single N_Port ID effected */
2413 if (ns_did.un.word == rscn_did.un.word) {
2417 case 1: /* Whole N_Port Area effected */
2418 if ((ns_did.un.b.domain == rscn_did.un.b.domain)
2419 && (ns_did.un.b.area == rscn_did.un.b.area))
2424 case 2: /* Whole N_Port Domain effected */
2425 if (ns_did.un.b.domain == rscn_did.un.b.domain)
2430 case 3: /* Whole Fabric effected */
2434 /* Unknown Identifier in RSCN list */
2435 lpfc_printf_log(phba, KERN_ERR, LOG_DISCOVERY,
2436 "%d:0217 Unknown Identifier in "
2437 "RSCN payload Data: x%x\n",
2438 phba->brd_no, rscn_did.un.word);
2450 lpfc_rscn_recovery_check(struct lpfc_hba * phba)
2452 struct lpfc_nodelist *ndlp = NULL, *next_ndlp;
2453 struct list_head *listp;
2454 struct list_head *node_list[7];
2457 /* Look at all nodes effected by pending RSCNs and move
2460 node_list[0] = &phba->fc_npr_list; /* MUST do this list first */
2461 node_list[1] = &phba->fc_nlpmap_list;
2462 node_list[2] = &phba->fc_nlpunmap_list;
2463 node_list[3] = &phba->fc_prli_list;
2464 node_list[4] = &phba->fc_reglogin_list;
2465 node_list[5] = &phba->fc_adisc_list;
2466 node_list[6] = &phba->fc_plogi_list;
2467 for (i = 0; i < 7; i++) {
2468 listp = node_list[i];
2469 if (list_empty(listp))
2472 list_for_each_entry_safe(ndlp, next_ndlp, listp, nlp_listp) {
2473 if (!(lpfc_rscn_payload_check(phba, ndlp->nlp_DID)))
2476 lpfc_disc_state_machine(phba, ndlp, NULL,
2477 NLP_EVT_DEVICE_RECOVERY);
2479 /* Make sure NLP_DELAY_TMO is NOT running
2480 * after a device recovery event.
2482 if (ndlp->nlp_flag & NLP_DELAY_TMO)
2483 lpfc_cancel_retry_delay_tmo(phba, ndlp);
2490 lpfc_els_rcv_rscn(struct lpfc_hba * phba,
2491 struct lpfc_iocbq * cmdiocb,
2492 struct lpfc_nodelist * ndlp, uint8_t newnode)
2494 struct lpfc_dmabuf *pcmd;
2497 uint32_t payload_len, cmd;
2500 icmd = &cmdiocb->iocb;
2501 pcmd = (struct lpfc_dmabuf *) cmdiocb->context2;
2502 lp = (uint32_t *) pcmd->virt;
2505 payload_len = be32_to_cpu(cmd) & 0xffff; /* payload length */
2506 payload_len -= sizeof (uint32_t); /* take off word 0 */
2507 cmd &= ELS_CMD_MASK;
2510 lpfc_printf_log(phba,
2513 "%d:0214 RSCN received Data: x%x x%x x%x x%x\n",
2515 phba->fc_flag, payload_len, *lp, phba->fc_rscn_id_cnt);
2517 for (i = 0; i < payload_len/sizeof(uint32_t); i++)
2518 fc_host_post_event(phba->host, fc_get_event_number(),
2519 FCH_EVT_RSCN, lp[i]);
2521 /* If we are about to begin discovery, just ACC the RSCN.
2522 * Discovery processing will satisfy it.
2524 if (phba->hba_state <= LPFC_NS_QRY) {
2525 lpfc_els_rsp_acc(phba, ELS_CMD_ACC, cmdiocb, ndlp, NULL,
2530 /* If we are already processing an RSCN, save the received
2531 * RSCN payload buffer, cmdiocb->context2 to process later.
2533 if (phba->fc_flag & (FC_RSCN_MODE | FC_NDISC_ACTIVE)) {
2534 if ((phba->fc_rscn_id_cnt < FC_MAX_HOLD_RSCN) &&
2535 !(phba->fc_flag & FC_RSCN_DISCOVERY)) {
2536 spin_lock_irq(phba->host->host_lock);
2537 phba->fc_flag |= FC_RSCN_MODE;
2538 spin_unlock_irq(phba->host->host_lock);
2539 phba->fc_rscn_id_list[phba->fc_rscn_id_cnt++] = pcmd;
2541 /* If we zero, cmdiocb->context2, the calling
2542 * routine will not try to free it.
2544 cmdiocb->context2 = NULL;
2547 lpfc_printf_log(phba, KERN_INFO, LOG_DISCOVERY,
2548 "%d:0235 Deferred RSCN "
2549 "Data: x%x x%x x%x\n",
2550 phba->brd_no, phba->fc_rscn_id_cnt,
2551 phba->fc_flag, phba->hba_state);
2553 spin_lock_irq(phba->host->host_lock);
2554 phba->fc_flag |= FC_RSCN_DISCOVERY;
2555 spin_unlock_irq(phba->host->host_lock);
2556 /* ReDiscovery RSCN */
2557 lpfc_printf_log(phba, KERN_INFO, LOG_DISCOVERY,
2558 "%d:0234 ReDiscovery RSCN "
2559 "Data: x%x x%x x%x\n",
2560 phba->brd_no, phba->fc_rscn_id_cnt,
2561 phba->fc_flag, phba->hba_state);
2564 lpfc_els_rsp_acc(phba, ELS_CMD_ACC, cmdiocb, ndlp, NULL,
2567 /* send RECOVERY event for ALL nodes that match RSCN payload */
2568 lpfc_rscn_recovery_check(phba);
2572 phba->fc_flag |= FC_RSCN_MODE;
2573 phba->fc_rscn_id_list[phba->fc_rscn_id_cnt++] = pcmd;
2575 * If we zero, cmdiocb->context2, the calling routine will
2576 * not try to free it.
2578 cmdiocb->context2 = NULL;
2580 lpfc_set_disctmo(phba);
2583 lpfc_els_rsp_acc(phba, ELS_CMD_ACC, cmdiocb, ndlp, NULL, newnode);
2585 /* send RECOVERY event for ALL nodes that match RSCN payload */
2586 lpfc_rscn_recovery_check(phba);
2588 return lpfc_els_handle_rscn(phba);
2592 lpfc_els_handle_rscn(struct lpfc_hba * phba)
2594 struct lpfc_nodelist *ndlp;
2596 /* Start timer for RSCN processing */
2597 lpfc_set_disctmo(phba);
2599 /* RSCN processed */
2600 lpfc_printf_log(phba,
2603 "%d:0215 RSCN processed Data: x%x x%x x%x x%x\n",
2605 phba->fc_flag, 0, phba->fc_rscn_id_cnt,
2608 /* To process RSCN, first compare RSCN data with NameServer */
2609 phba->fc_ns_retry = 0;
2610 ndlp = lpfc_findnode_did(phba, NLP_SEARCH_UNMAPPED, NameServer_DID);
2612 /* Good ndlp, issue CT Request to NameServer */
2613 if (lpfc_ns_cmd(phba, ndlp, SLI_CTNS_GID_FT) == 0) {
2614 /* Wait for NameServer query cmpl before we can
2619 /* If login to NameServer does not exist, issue one */
2620 /* Good status, issue PLOGI to NameServer */
2621 ndlp = lpfc_findnode_did(phba, NLP_SEARCH_ALL, NameServer_DID);
2623 /* Wait for NameServer login cmpl before we can
2627 ndlp = mempool_alloc(phba->nlp_mem_pool, GFP_KERNEL);
2629 lpfc_els_flush_rscn(phba);
2632 lpfc_nlp_init(phba, ndlp, NameServer_DID);
2633 ndlp->nlp_type |= NLP_FABRIC;
2634 ndlp->nlp_prev_state = ndlp->nlp_state;
2635 lpfc_nlp_set_state(phba, ndlp, NLP_STE_PLOGI_ISSUE);
2636 lpfc_issue_els_plogi(phba, NameServer_DID, 0);
2637 /* Wait for NameServer login cmpl before we can
2643 lpfc_els_flush_rscn(phba);
2648 lpfc_els_rcv_flogi(struct lpfc_hba * phba,
2649 struct lpfc_iocbq * cmdiocb,
2650 struct lpfc_nodelist * ndlp, uint8_t newnode)
2652 struct lpfc_dmabuf *pcmd = (struct lpfc_dmabuf *) cmdiocb->context2;
2653 uint32_t *lp = (uint32_t *) pcmd->virt;
2654 IOCB_t *icmd = &cmdiocb->iocb;
2655 struct serv_parm *sp;
2662 sp = (struct serv_parm *) lp;
2664 /* FLOGI received */
2666 lpfc_set_disctmo(phba);
2668 if (phba->fc_topology == TOPOLOGY_LOOP) {
2669 /* We should never receive a FLOGI in loop mode, ignore it */
2670 did = icmd->un.elsreq64.remoteID;
2672 /* An FLOGI ELS command <elsCmd> was received from DID <did> in
2674 lpfc_printf_log(phba, KERN_ERR, LOG_ELS,
2675 "%d:0113 An FLOGI ELS command x%x was received "
2676 "from DID x%x in Loop Mode\n",
2677 phba->brd_no, cmd, did);
2683 if ((lpfc_check_sparm(phba, ndlp, sp, CLASS3))) {
2684 /* For a FLOGI we accept, then if our portname is greater
2685 * then the remote portname we initiate Nport login.
2688 rc = memcmp(&phba->fc_portname, &sp->portName,
2689 sizeof (struct lpfc_name));
2692 if ((mbox = mempool_alloc(phba->mbox_mem_pool,
2693 GFP_KERNEL)) == 0) {
2696 lpfc_linkdown(phba);
2697 lpfc_init_link(phba, mbox,
2699 phba->cfg_link_speed);
2700 mbox->mb.un.varInitLnk.lipsr_AL_PA = 0;
2701 mbox->mbox_cmpl = lpfc_sli_def_mbox_cmpl;
2702 rc = lpfc_sli_issue_mbox
2703 (phba, mbox, (MBX_NOWAIT | MBX_STOP_IOCB));
2704 lpfc_set_loopback_flag(phba);
2705 if (rc == MBX_NOT_FINISHED) {
2706 mempool_free( mbox, phba->mbox_mem_pool);
2709 } else if (rc > 0) { /* greater than */
2710 spin_lock_irq(phba->host->host_lock);
2711 phba->fc_flag |= FC_PT2PT_PLOGI;
2712 spin_unlock_irq(phba->host->host_lock);
2714 phba->fc_flag |= FC_PT2PT;
2715 phba->fc_flag &= ~(FC_FABRIC | FC_PUBLIC_LOOP);
2717 /* Reject this request because invalid parameters */
2718 stat.un.b.lsRjtRsvd0 = 0;
2719 stat.un.b.lsRjtRsnCode = LSRJT_UNABLE_TPC;
2720 stat.un.b.lsRjtRsnCodeExp = LSEXP_SPARM_OPTIONS;
2721 stat.un.b.vendorUnique = 0;
2722 lpfc_els_rsp_reject(phba, stat.un.lsRjtError, cmdiocb, ndlp);
2727 lpfc_els_rsp_acc(phba, ELS_CMD_PLOGI, cmdiocb, ndlp, NULL, newnode);
2733 lpfc_els_rcv_rnid(struct lpfc_hba * phba,
2734 struct lpfc_iocbq * cmdiocb, struct lpfc_nodelist * ndlp)
2736 struct lpfc_dmabuf *pcmd;
2743 icmd = &cmdiocb->iocb;
2744 did = icmd->un.elsreq64.remoteID;
2745 pcmd = (struct lpfc_dmabuf *) cmdiocb->context2;
2746 lp = (uint32_t *) pcmd->virt;
2753 switch (rn->Format) {
2755 case RNID_TOPOLOGY_DISC:
2757 lpfc_els_rsp_rnid_acc(phba, rn->Format, cmdiocb, ndlp);
2760 /* Reject this request because format not supported */
2761 stat.un.b.lsRjtRsvd0 = 0;
2762 stat.un.b.lsRjtRsnCode = LSRJT_UNABLE_TPC;
2763 stat.un.b.lsRjtRsnCodeExp = LSEXP_CANT_GIVE_DATA;
2764 stat.un.b.vendorUnique = 0;
2765 lpfc_els_rsp_reject(phba, stat.un.lsRjtError, cmdiocb, ndlp);
2771 lpfc_els_rcv_lirr(struct lpfc_hba * phba, struct lpfc_iocbq * cmdiocb,
2772 struct lpfc_nodelist * ndlp)
2776 /* For now, unconditionally reject this command */
2777 stat.un.b.lsRjtRsvd0 = 0;
2778 stat.un.b.lsRjtRsnCode = LSRJT_UNABLE_TPC;
2779 stat.un.b.lsRjtRsnCodeExp = LSEXP_CANT_GIVE_DATA;
2780 stat.un.b.vendorUnique = 0;
2781 lpfc_els_rsp_reject(phba, stat.un.lsRjtError, cmdiocb, ndlp);
2786 lpfc_els_rsp_rps_acc(struct lpfc_hba * phba, LPFC_MBOXQ_t * pmb)
2788 struct lpfc_sli *psli;
2789 struct lpfc_sli_ring *pring;
2794 struct lpfc_iocbq *elsiocb;
2795 struct lpfc_nodelist *ndlp;
2796 uint16_t xri, status;
2800 pring = &psli->ring[LPFC_ELS_RING];
2803 ndlp = (struct lpfc_nodelist *) pmb->context2;
2804 xri = (uint16_t) ((unsigned long)(pmb->context1));
2805 pmb->context1 = NULL;
2806 pmb->context2 = NULL;
2808 if (mb->mbxStatus) {
2809 mempool_free( pmb, phba->mbox_mem_pool);
2813 cmdsize = sizeof(RPS_RSP) + sizeof(uint32_t);
2814 mempool_free( pmb, phba->mbox_mem_pool);
2815 elsiocb = lpfc_prep_els_iocb(phba, 0, cmdsize, lpfc_max_els_tries, ndlp,
2816 ndlp->nlp_DID, ELS_CMD_ACC);
2820 icmd = &elsiocb->iocb;
2821 icmd->ulpContext = xri;
2823 pcmd = (uint8_t *) (((struct lpfc_dmabuf *) elsiocb->context2)->virt);
2824 *((uint32_t *) (pcmd)) = ELS_CMD_ACC;
2825 pcmd += sizeof (uint32_t); /* Skip past command */
2826 rps_rsp = (RPS_RSP *)pcmd;
2828 if (phba->fc_topology != TOPOLOGY_LOOP)
2832 if (phba->fc_flag & FC_FABRIC)
2836 rps_rsp->portStatus = be16_to_cpu(status);
2837 rps_rsp->linkFailureCnt = be32_to_cpu(mb->un.varRdLnk.linkFailureCnt);
2838 rps_rsp->lossSyncCnt = be32_to_cpu(mb->un.varRdLnk.lossSyncCnt);
2839 rps_rsp->lossSignalCnt = be32_to_cpu(mb->un.varRdLnk.lossSignalCnt);
2840 rps_rsp->primSeqErrCnt = be32_to_cpu(mb->un.varRdLnk.primSeqErrCnt);
2841 rps_rsp->invalidXmitWord = be32_to_cpu(mb->un.varRdLnk.invalidXmitWord);
2842 rps_rsp->crcCnt = be32_to_cpu(mb->un.varRdLnk.crcCnt);
2844 /* Xmit ELS RPS ACC response tag <ulpIoTag> */
2845 lpfc_printf_log(phba, KERN_INFO, LOG_ELS,
2846 "%d:0118 Xmit ELS RPS ACC response tag x%x xri x%x, "
2847 "did x%x, nlp_flag x%x, nlp_state x%x, rpi x%x\n",
2848 phba->brd_no, elsiocb->iotag,
2849 elsiocb->iocb.ulpContext, ndlp->nlp_DID,
2850 ndlp->nlp_flag, ndlp->nlp_state, ndlp->nlp_rpi);
2852 elsiocb->iocb_cmpl = lpfc_cmpl_els_acc;
2853 phba->fc_stat.elsXmitACC++;
2854 if (lpfc_sli_issue_iocb(phba, pring, elsiocb, 0) == IOCB_ERROR) {
2855 lpfc_els_free_iocb(phba, elsiocb);
2861 lpfc_els_rcv_rps(struct lpfc_hba * phba, struct lpfc_iocbq * cmdiocb,
2862 struct lpfc_nodelist * ndlp)
2867 struct lpfc_dmabuf *pcmd;
2871 if ((ndlp->nlp_state != NLP_STE_UNMAPPED_NODE) &&
2872 (ndlp->nlp_state != NLP_STE_MAPPED_NODE)) {
2873 stat.un.b.lsRjtRsvd0 = 0;
2874 stat.un.b.lsRjtRsnCode = LSRJT_UNABLE_TPC;
2875 stat.un.b.lsRjtRsnCodeExp = LSEXP_CANT_GIVE_DATA;
2876 stat.un.b.vendorUnique = 0;
2877 lpfc_els_rsp_reject(phba, stat.un.lsRjtError, cmdiocb, ndlp);
2880 pcmd = (struct lpfc_dmabuf *) cmdiocb->context2;
2881 lp = (uint32_t *) pcmd->virt;
2882 flag = (be32_to_cpu(*lp++) & 0xf);
2886 ((flag == 1) && (be32_to_cpu(rps->un.portNum) == 0)) ||
2887 ((flag == 2) && (memcmp(&rps->un.portName, &phba->fc_portname,
2888 sizeof (struct lpfc_name)) == 0))) {
2889 if ((mbox = mempool_alloc(phba->mbox_mem_pool, GFP_ATOMIC))) {
2890 lpfc_read_lnk_stat(phba, mbox);
2892 (void *)((unsigned long)cmdiocb->iocb.ulpContext);
2893 mbox->context2 = ndlp;
2894 mbox->mbox_cmpl = lpfc_els_rsp_rps_acc;
2895 if (lpfc_sli_issue_mbox (phba, mbox,
2896 (MBX_NOWAIT | MBX_STOP_IOCB)) != MBX_NOT_FINISHED) {
2897 /* Mbox completion will send ELS Response */
2900 mempool_free(mbox, phba->mbox_mem_pool);
2903 stat.un.b.lsRjtRsvd0 = 0;
2904 stat.un.b.lsRjtRsnCode = LSRJT_UNABLE_TPC;
2905 stat.un.b.lsRjtRsnCodeExp = LSEXP_CANT_GIVE_DATA;
2906 stat.un.b.vendorUnique = 0;
2907 lpfc_els_rsp_reject(phba, stat.un.lsRjtError, cmdiocb, ndlp);
2912 lpfc_els_rsp_rpl_acc(struct lpfc_hba * phba, uint16_t cmdsize,
2913 struct lpfc_iocbq * oldiocb, struct lpfc_nodelist * ndlp)
2918 struct lpfc_iocbq *elsiocb;
2919 struct lpfc_sli_ring *pring;
2920 struct lpfc_sli *psli;
2924 pring = &psli->ring[LPFC_ELS_RING]; /* ELS ring */
2926 elsiocb = lpfc_prep_els_iocb(phba, 0, cmdsize, oldiocb->retry,
2927 ndlp, ndlp->nlp_DID, ELS_CMD_ACC);
2931 icmd = &elsiocb->iocb;
2932 oldcmd = &oldiocb->iocb;
2933 icmd->ulpContext = oldcmd->ulpContext; /* Xri */
2935 pcmd = (((struct lpfc_dmabuf *) elsiocb->context2)->virt);
2936 *((uint32_t *) (pcmd)) = ELS_CMD_ACC;
2937 pcmd += sizeof (uint16_t);
2938 *((uint16_t *)(pcmd)) = be16_to_cpu(cmdsize);
2939 pcmd += sizeof(uint16_t);
2941 /* Setup the RPL ACC payload */
2942 rpl_rsp.listLen = be32_to_cpu(1);
2944 rpl_rsp.port_num_blk.portNum = 0;
2945 rpl_rsp.port_num_blk.portID = be32_to_cpu(phba->fc_myDID);
2946 memcpy(&rpl_rsp.port_num_blk.portName, &phba->fc_portname,
2947 sizeof(struct lpfc_name));
2949 memcpy(pcmd, &rpl_rsp, cmdsize - sizeof(uint32_t));
2952 /* Xmit ELS RPL ACC response tag <ulpIoTag> */
2953 lpfc_printf_log(phba, KERN_INFO, LOG_ELS,
2954 "%d:0120 Xmit ELS RPL ACC response tag x%x xri x%x, "
2955 "did x%x, nlp_flag x%x, nlp_state x%x, rpi x%x\n",
2956 phba->brd_no, elsiocb->iotag,
2957 elsiocb->iocb.ulpContext, ndlp->nlp_DID,
2958 ndlp->nlp_flag, ndlp->nlp_state, ndlp->nlp_rpi);
2960 elsiocb->iocb_cmpl = lpfc_cmpl_els_acc;
2962 phba->fc_stat.elsXmitACC++;
2963 if (lpfc_sli_issue_iocb(phba, pring, elsiocb, 0) == IOCB_ERROR) {
2964 lpfc_els_free_iocb(phba, elsiocb);
2971 lpfc_els_rcv_rpl(struct lpfc_hba * phba, struct lpfc_iocbq * cmdiocb,
2972 struct lpfc_nodelist * ndlp)
2974 struct lpfc_dmabuf *pcmd;
2981 if ((ndlp->nlp_state != NLP_STE_UNMAPPED_NODE) &&
2982 (ndlp->nlp_state != NLP_STE_MAPPED_NODE)) {
2983 stat.un.b.lsRjtRsvd0 = 0;
2984 stat.un.b.lsRjtRsnCode = LSRJT_UNABLE_TPC;
2985 stat.un.b.lsRjtRsnCodeExp = LSEXP_CANT_GIVE_DATA;
2986 stat.un.b.vendorUnique = 0;
2987 lpfc_els_rsp_reject(phba, stat.un.lsRjtError, cmdiocb, ndlp);
2990 pcmd = (struct lpfc_dmabuf *) cmdiocb->context2;
2991 lp = (uint32_t *) pcmd->virt;
2992 rpl = (RPL *) (lp + 1);
2994 maxsize = be32_to_cpu(rpl->maxsize);
2996 /* We support only one port */
2997 if ((rpl->index == 0) &&
2999 ((maxsize * sizeof(uint32_t)) >= sizeof(RPL_RSP)))) {
3000 cmdsize = sizeof(uint32_t) + sizeof(RPL_RSP);
3002 cmdsize = sizeof(uint32_t) + maxsize * sizeof(uint32_t);
3004 lpfc_els_rsp_rpl_acc(phba, cmdsize, cmdiocb, ndlp);
3010 lpfc_els_rcv_farp(struct lpfc_hba * phba,
3011 struct lpfc_iocbq * cmdiocb, struct lpfc_nodelist * ndlp)
3013 struct lpfc_dmabuf *pcmd;
3017 uint32_t cmd, cnt, did;
3019 icmd = &cmdiocb->iocb;
3020 did = icmd->un.elsreq64.remoteID;
3021 pcmd = (struct lpfc_dmabuf *) cmdiocb->context2;
3022 lp = (uint32_t *) pcmd->virt;
3027 /* FARP-REQ received from DID <did> */
3028 lpfc_printf_log(phba,
3031 "%d:0601 FARP-REQ received from DID x%x\n",
3034 /* We will only support match on WWPN or WWNN */
3035 if (fp->Mflags & ~(FARP_MATCH_NODE | FARP_MATCH_PORT)) {
3040 /* If this FARP command is searching for my portname */
3041 if (fp->Mflags & FARP_MATCH_PORT) {
3042 if (memcmp(&fp->RportName, &phba->fc_portname,
3043 sizeof (struct lpfc_name)) == 0)
3047 /* If this FARP command is searching for my nodename */
3048 if (fp->Mflags & FARP_MATCH_NODE) {
3049 if (memcmp(&fp->RnodeName, &phba->fc_nodename,
3050 sizeof (struct lpfc_name)) == 0)
3055 if ((ndlp->nlp_state == NLP_STE_UNMAPPED_NODE) ||
3056 (ndlp->nlp_state == NLP_STE_MAPPED_NODE)) {
3057 /* Log back into the node before sending the FARP. */
3058 if (fp->Rflags & FARP_REQUEST_PLOGI) {
3059 ndlp->nlp_prev_state = ndlp->nlp_state;
3060 lpfc_nlp_set_state(phba, ndlp,
3061 NLP_STE_PLOGI_ISSUE);
3062 lpfc_issue_els_plogi(phba, ndlp->nlp_DID, 0);
3065 /* Send a FARP response to that node */
3066 if (fp->Rflags & FARP_REQUEST_FARPR) {
3067 lpfc_issue_els_farpr(phba, did, 0);
3075 lpfc_els_rcv_farpr(struct lpfc_hba * phba,
3076 struct lpfc_iocbq * cmdiocb, struct lpfc_nodelist * ndlp)
3078 struct lpfc_dmabuf *pcmd;
3083 icmd = &cmdiocb->iocb;
3084 did = icmd->un.elsreq64.remoteID;
3085 pcmd = (struct lpfc_dmabuf *) cmdiocb->context2;
3086 lp = (uint32_t *) pcmd->virt;
3089 /* FARP-RSP received from DID <did> */
3090 lpfc_printf_log(phba,
3093 "%d:0600 FARP-RSP received from DID x%x\n",
3096 /* ACCEPT the Farp resp request */
3097 lpfc_els_rsp_acc(phba, ELS_CMD_ACC, cmdiocb, ndlp, NULL, 0);
3103 lpfc_els_rcv_fan(struct lpfc_hba * phba, struct lpfc_iocbq * cmdiocb,
3104 struct lpfc_nodelist * fan_ndlp)
3106 struct lpfc_dmabuf *pcmd;
3111 struct lpfc_nodelist *ndlp, *next_ndlp;
3114 lpfc_printf_log(phba, KERN_INFO, LOG_ELS, "%d:0265 FAN received\n",
3117 icmd = &cmdiocb->iocb;
3118 did = icmd->un.elsreq64.remoteID;
3119 pcmd = (struct lpfc_dmabuf *)cmdiocb->context2;
3120 lp = (uint32_t *)pcmd->virt;
3125 /* FAN received; Fan does not have a reply sequence */
3127 if (phba->hba_state == LPFC_LOCAL_CFG_LINK) {
3128 if ((memcmp(&phba->fc_fabparam.nodeName, &fp->FnodeName,
3129 sizeof(struct lpfc_name)) != 0) ||
3130 (memcmp(&phba->fc_fabparam.portName, &fp->FportName,
3131 sizeof(struct lpfc_name)) != 0)) {
3133 * This node has switched fabrics. FLOGI is required
3134 * Clean up the old rpi's
3137 list_for_each_entry_safe(ndlp, next_ndlp,
3138 &phba->fc_npr_list, nlp_listp) {
3140 if (ndlp->nlp_type & NLP_FABRIC) {
3142 * Clean up old Fabric, Nameserver and
3143 * other NLP_FABRIC logins
3145 lpfc_drop_node(phba, ndlp);
3146 } else if (!(ndlp->nlp_flag & NLP_NPR_ADISC)) {
3147 /* Fail outstanding I/O now since this
3148 * device is marked for PLOGI
3150 lpfc_unreg_rpi(phba, ndlp);
3154 phba->hba_state = LPFC_FLOGI;
3155 lpfc_set_disctmo(phba);
3156 lpfc_initial_flogi(phba);
3159 /* Discovery not needed,
3160 * move the nodes to their original state.
3162 list_for_each_entry_safe(ndlp, next_ndlp, &phba->fc_npr_list,
3165 switch (ndlp->nlp_prev_state) {
3166 case NLP_STE_UNMAPPED_NODE:
3167 ndlp->nlp_prev_state = NLP_STE_NPR_NODE;
3168 lpfc_nlp_set_state(phba, ndlp,
3169 NLP_STE_UNMAPPED_NODE);
3172 case NLP_STE_MAPPED_NODE:
3173 ndlp->nlp_prev_state = NLP_STE_NPR_NODE;
3174 lpfc_nlp_set_state(phba, ndlp,
3175 NLP_STE_MAPPED_NODE);
3183 /* Start discovery - this should just do CLEAR_LA */
3184 lpfc_disc_start(phba);
3190 lpfc_els_timeout(unsigned long ptr)
3192 struct lpfc_hba *phba;
3193 unsigned long iflag;
3195 phba = (struct lpfc_hba *)ptr;
3198 spin_lock_irqsave(phba->host->host_lock, iflag);
3199 if (!(phba->work_hba_events & WORKER_ELS_TMO)) {
3200 phba->work_hba_events |= WORKER_ELS_TMO;
3201 if (phba->work_wait)
3202 wake_up(phba->work_wait);
3204 spin_unlock_irqrestore(phba->host->host_lock, iflag);
3209 lpfc_els_timeout_handler(struct lpfc_hba *phba)
3211 struct lpfc_sli_ring *pring;
3212 struct lpfc_iocbq *tmp_iocb, *piocb;
3214 struct lpfc_dmabuf *pcmd;
3216 uint32_t els_command=0;
3222 spin_lock_irq(phba->host->host_lock);
3223 /* If the timer is already canceled do nothing */
3224 if (!(phba->work_hba_events & WORKER_ELS_TMO)) {
3225 spin_unlock_irq(phba->host->host_lock);
3228 timeout = (uint32_t)(phba->fc_ratov << 1);
3230 pring = &phba->sli.ring[LPFC_ELS_RING];
3232 list_for_each_entry_safe(piocb, tmp_iocb, &pring->txcmplq, list) {
3235 if ((piocb->iocb_flag & LPFC_IO_LIBDFC) ||
3236 (piocb->iocb.ulpCommand == CMD_ABORT_XRI_CN) ||
3237 (piocb->iocb.ulpCommand == CMD_CLOSE_XRI_CN)) {
3240 pcmd = (struct lpfc_dmabuf *) piocb->context2;
3242 elscmd = (uint32_t *) (pcmd->virt);
3243 els_command = *elscmd;
3246 if ((els_command == ELS_CMD_FARP)
3247 || (els_command == ELS_CMD_FARPR)) {
3251 if (piocb->drvrTimeout > 0) {
3252 if (piocb->drvrTimeout >= timeout) {
3253 piocb->drvrTimeout -= timeout;
3255 piocb->drvrTimeout = 0;
3260 if (cmd->ulpCommand == CMD_GEN_REQUEST64_CR) {
3261 struct lpfc_nodelist *ndlp;
3262 ndlp = __lpfc_findnode_rpi(phba, cmd->ulpContext);
3263 remote_ID = ndlp->nlp_DID;
3265 remote_ID = cmd->un.elsreq64.remoteID;
3268 lpfc_printf_log(phba,
3271 "%d:0127 ELS timeout Data: x%x x%x x%x x%x\n",
3272 phba->brd_no, els_command,
3273 remote_ID, cmd->ulpCommand, cmd->ulpIoTag);
3275 lpfc_sli_issue_abort_iotag(phba, pring, piocb);
3277 if (phba->sli.ring[LPFC_ELS_RING].txcmplq_cnt)
3278 mod_timer(&phba->els_tmofunc, jiffies + HZ * timeout);
3280 spin_unlock_irq(phba->host->host_lock);
3284 lpfc_els_flush_cmd(struct lpfc_hba * phba)
3286 LIST_HEAD(completions);
3287 struct lpfc_sli_ring *pring;
3288 struct lpfc_iocbq *tmp_iocb, *piocb;
3291 pring = &phba->sli.ring[LPFC_ELS_RING];
3292 spin_lock_irq(phba->host->host_lock);
3293 list_for_each_entry_safe(piocb, tmp_iocb, &pring->txq, list) {
3296 if (piocb->iocb_flag & LPFC_IO_LIBDFC) {
3300 /* Do not flush out the QUE_RING and ABORT/CLOSE iocbs */
3301 if ((cmd->ulpCommand == CMD_QUE_RING_BUF_CN) ||
3302 (cmd->ulpCommand == CMD_QUE_RING_BUF64_CN) ||
3303 (cmd->ulpCommand == CMD_CLOSE_XRI_CN) ||
3304 (cmd->ulpCommand == CMD_ABORT_XRI_CN)) {
3308 list_move_tail(&piocb->list, &completions);
3313 list_for_each_entry_safe(piocb, tmp_iocb, &pring->txcmplq, list) {
3316 if (piocb->iocb_flag & LPFC_IO_LIBDFC) {
3320 lpfc_sli_issue_abort_iotag(phba, pring, piocb);
3322 spin_unlock_irq(phba->host->host_lock);
3324 while(!list_empty(&completions)) {
3325 piocb = list_get_first(&completions, struct lpfc_iocbq, list);
3327 list_del(&piocb->list);
3329 if (piocb->iocb_cmpl) {
3330 cmd->ulpStatus = IOSTAT_LOCAL_REJECT;
3331 cmd->un.ulpWord[4] = IOERR_SLI_ABORTED;
3332 (piocb->iocb_cmpl) (phba, piocb, piocb);
3334 lpfc_sli_release_iocbq(phba, piocb);
3341 lpfc_els_unsol_event(struct lpfc_hba * phba,
3342 struct lpfc_sli_ring * pring, struct lpfc_iocbq * elsiocb)
3344 struct lpfc_sli *psli;
3345 struct lpfc_nodelist *ndlp;
3346 struct lpfc_dmabuf *mp;
3353 uint32_t drop_cmd = 0; /* by default do NOT drop received cmd */
3354 uint32_t rjt_err = 0;
3357 icmd = &elsiocb->iocb;
3359 if ((icmd->ulpStatus == IOSTAT_LOCAL_REJECT) &&
3360 ((icmd->un.ulpWord[4] & 0xff) == IOERR_RCV_BUFFER_WAITING)) {
3361 /* Not enough posted buffers; Try posting more buffers */
3362 phba->fc_stat.NoRcvBuf++;
3363 lpfc_post_buffer(phba, pring, 0, 1);
3367 /* If there are no BDEs associated with this IOCB,
3368 * there is nothing to do.
3370 if (icmd->ulpBdeCount == 0)
3373 /* type of ELS cmd is first 32bit word in packet */
3374 mp = lpfc_sli_ringpostbuf_get(phba, pring, getPaddr(icmd->un.
3378 cont64[0].addrLow));
3385 lp = (uint32_t *) mp->virt;
3387 lpfc_post_buffer(phba, &psli->ring[LPFC_ELS_RING], 1, 1);
3389 if (icmd->ulpStatus) {
3390 lpfc_mbuf_free(phba, mp->virt, mp->phys);
3396 /* Check to see if link went down during discovery */
3397 if (lpfc_els_chk_latt(phba)) {
3398 lpfc_mbuf_free(phba, mp->virt, mp->phys);
3404 did = icmd->un.rcvels.remoteID;
3405 ndlp = lpfc_findnode_did(phba, NLP_SEARCH_ALL, did);
3407 /* Cannot find existing Fabric ndlp, so allocate a new one */
3408 ndlp = mempool_alloc(phba->nlp_mem_pool, GFP_KERNEL);
3410 lpfc_mbuf_free(phba, mp->virt, mp->phys);
3416 lpfc_nlp_init(phba, ndlp, did);
3418 if ((did & Fabric_DID_MASK) == Fabric_DID_MASK) {
3419 ndlp->nlp_type |= NLP_FABRIC;
3421 lpfc_nlp_set_state(phba, ndlp, NLP_STE_UNUSED_NODE);
3424 phba->fc_stat.elsRcvFrame++;
3425 elsiocb->context1 = ndlp;
3426 elsiocb->context2 = mp;
3428 if ((cmd & ELS_CMD_MASK) == ELS_CMD_RSCN) {
3429 cmd &= ELS_CMD_MASK;
3431 /* ELS command <elsCmd> received from NPORT <did> */
3432 lpfc_printf_log(phba, KERN_INFO, LOG_ELS,
3433 "%d:0112 ELS command x%x received from NPORT x%x "
3434 "Data: x%x\n", phba->brd_no, cmd, did, phba->hba_state);
3438 phba->fc_stat.elsRcvPLOGI++;
3439 if (phba->hba_state < LPFC_DISC_AUTH) {
3443 ndlp = lpfc_plogi_confirm_nport(phba, mp, ndlp);
3444 lpfc_disc_state_machine(phba, ndlp, elsiocb, NLP_EVT_RCV_PLOGI);
3447 phba->fc_stat.elsRcvFLOGI++;
3448 lpfc_els_rcv_flogi(phba, elsiocb, ndlp, newnode);
3450 lpfc_drop_node(phba, ndlp);
3453 phba->fc_stat.elsRcvLOGO++;
3454 if (phba->hba_state < LPFC_DISC_AUTH) {
3458 lpfc_disc_state_machine(phba, ndlp, elsiocb, NLP_EVT_RCV_LOGO);
3461 phba->fc_stat.elsRcvPRLO++;
3462 if (phba->hba_state < LPFC_DISC_AUTH) {
3466 lpfc_disc_state_machine(phba, ndlp, elsiocb, NLP_EVT_RCV_PRLO);
3469 phba->fc_stat.elsRcvRSCN++;
3470 lpfc_els_rcv_rscn(phba, elsiocb, ndlp, newnode);
3472 lpfc_drop_node(phba, ndlp);
3475 phba->fc_stat.elsRcvADISC++;
3476 if (phba->hba_state < LPFC_DISC_AUTH) {
3480 lpfc_disc_state_machine(phba, ndlp, elsiocb, NLP_EVT_RCV_ADISC);
3483 phba->fc_stat.elsRcvPDISC++;
3484 if (phba->hba_state < LPFC_DISC_AUTH) {
3488 lpfc_disc_state_machine(phba, ndlp, elsiocb, NLP_EVT_RCV_PDISC);
3491 phba->fc_stat.elsRcvFARPR++;
3492 lpfc_els_rcv_farpr(phba, elsiocb, ndlp);
3495 phba->fc_stat.elsRcvFARP++;
3496 lpfc_els_rcv_farp(phba, elsiocb, ndlp);
3499 phba->fc_stat.elsRcvFAN++;
3500 lpfc_els_rcv_fan(phba, elsiocb, ndlp);
3503 phba->fc_stat.elsRcvPRLI++;
3504 if (phba->hba_state < LPFC_DISC_AUTH) {
3508 lpfc_disc_state_machine(phba, ndlp, elsiocb, NLP_EVT_RCV_PRLI);
3511 phba->fc_stat.elsRcvLIRR++;
3512 lpfc_els_rcv_lirr(phba, elsiocb, ndlp);
3514 lpfc_drop_node(phba, ndlp);
3517 phba->fc_stat.elsRcvRPS++;
3518 lpfc_els_rcv_rps(phba, elsiocb, ndlp);
3520 lpfc_drop_node(phba, ndlp);
3523 phba->fc_stat.elsRcvRPL++;
3524 lpfc_els_rcv_rpl(phba, elsiocb, ndlp);
3526 lpfc_drop_node(phba, ndlp);
3529 phba->fc_stat.elsRcvRNID++;
3530 lpfc_els_rcv_rnid(phba, elsiocb, ndlp);
3532 lpfc_drop_node(phba, ndlp);
3535 /* Unsupported ELS command, reject */
3538 /* Unknown ELS command <elsCmd> received from NPORT <did> */
3539 lpfc_printf_log(phba, KERN_ERR, LOG_ELS,
3540 "%d:0115 Unknown ELS command x%x received from "
3541 "NPORT x%x\n", phba->brd_no, cmd, did);
3543 lpfc_drop_node(phba, ndlp);
3547 /* check if need to LS_RJT received ELS cmd */
3549 stat.un.b.lsRjtRsvd0 = 0;
3550 stat.un.b.lsRjtRsnCode = LSRJT_UNABLE_TPC;
3551 stat.un.b.lsRjtRsnCodeExp = LSEXP_NOTHING_MORE;
3552 stat.un.b.vendorUnique = 0;
3553 lpfc_els_rsp_reject(phba, stat.un.lsRjtError, elsiocb, ndlp);
3556 if (elsiocb->context2) {
3557 lpfc_mbuf_free(phba, mp->virt, mp->phys);
3561 /* check if need to drop received ELS cmd */
3562 if (drop_cmd == 1) {
3563 lpfc_printf_log(phba, KERN_ERR, LOG_ELS,
3564 "%d:0111 Dropping received ELS cmd "
3565 "Data: x%x x%x x%x\n", phba->brd_no,
3566 icmd->ulpStatus, icmd->un.ulpWord[4],
3568 phba->fc_stat.elsRcvDrop++;