xref: /openbmc/linux/drivers/scsi/lpfc/lpfc_els.c (revision 545e4006)
1 /*******************************************************************
2  * This file is part of the Emulex Linux Device Driver for         *
3  * Fibre Channel Host Bus Adapters.                                *
4  * Copyright (C) 2004-2008 Emulex.  All rights reserved.           *
5  * EMULEX and SLI are trademarks of Emulex.                        *
6  * www.emulex.com                                                  *
7  * Portions Copyright (C) 2004-2005 Christoph Hellwig              *
8  *                                                                 *
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  *******************************************************************/
21 /* See Fibre Channel protocol T11 FC-LS for details */
22 #include <linux/blkdev.h>
23 #include <linux/pci.h>
24 #include <linux/interrupt.h>
25 
26 #include <scsi/scsi.h>
27 #include <scsi/scsi_device.h>
28 #include <scsi/scsi_host.h>
29 #include <scsi/scsi_transport_fc.h>
30 
31 #include "lpfc_hw.h"
32 #include "lpfc_sli.h"
33 #include "lpfc_disc.h"
34 #include "lpfc_scsi.h"
35 #include "lpfc.h"
36 #include "lpfc_logmsg.h"
37 #include "lpfc_crtn.h"
38 #include "lpfc_vport.h"
39 #include "lpfc_debugfs.h"
40 
41 static int lpfc_els_retry(struct lpfc_hba *, struct lpfc_iocbq *,
42 			  struct lpfc_iocbq *);
43 static void lpfc_cmpl_fabric_iocb(struct lpfc_hba *, struct lpfc_iocbq *,
44 			struct lpfc_iocbq *);
45 static void lpfc_fabric_abort_vport(struct lpfc_vport *vport);
46 static int lpfc_issue_els_fdisc(struct lpfc_vport *vport,
47 				struct lpfc_nodelist *ndlp, uint8_t retry);
48 static int lpfc_issue_fabric_iocb(struct lpfc_hba *phba,
49 				  struct lpfc_iocbq *iocb);
50 static void lpfc_register_new_vport(struct lpfc_hba *phba,
51 				    struct lpfc_vport *vport,
52 				    struct lpfc_nodelist *ndlp);
53 
54 static int lpfc_max_els_tries = 3;
55 
56 int
57 lpfc_els_chk_latt(struct lpfc_vport *vport)
58 {
59 	struct Scsi_Host *shost = lpfc_shost_from_vport(vport);
60 	struct lpfc_hba  *phba = vport->phba;
61 	uint32_t ha_copy;
62 
63 	if (vport->port_state >= LPFC_VPORT_READY ||
64 	    phba->link_state == LPFC_LINK_DOWN)
65 		return 0;
66 
67 	/* Read the HBA Host Attention Register */
68 	ha_copy = readl(phba->HAregaddr);
69 
70 	if (!(ha_copy & HA_LATT))
71 		return 0;
72 
73 	/* Pending Link Event during Discovery */
74 	lpfc_printf_vlog(vport, KERN_ERR, LOG_DISCOVERY,
75 			 "0237 Pending Link Event during "
76 			 "Discovery: State x%x\n",
77 			 phba->pport->port_state);
78 
79 	/* CLEAR_LA should re-enable link attention events and
80 	 * we should then imediately take a LATT event. The
81 	 * LATT processing should call lpfc_linkdown() which
82 	 * will cleanup any left over in-progress discovery
83 	 * events.
84 	 */
85 	spin_lock_irq(shost->host_lock);
86 	vport->fc_flag |= FC_ABORT_DISCOVERY;
87 	spin_unlock_irq(shost->host_lock);
88 
89 	if (phba->link_state != LPFC_CLEAR_LA)
90 		lpfc_issue_clear_la(phba, vport);
91 
92 	return 1;
93 }
94 
95 static struct lpfc_iocbq *
96 lpfc_prep_els_iocb(struct lpfc_vport *vport, uint8_t expectRsp,
97 		   uint16_t cmdSize, uint8_t retry,
98 		   struct lpfc_nodelist *ndlp, uint32_t did,
99 		   uint32_t elscmd)
100 {
101 	struct lpfc_hba  *phba = vport->phba;
102 	struct lpfc_iocbq *elsiocb;
103 	struct lpfc_dmabuf *pcmd, *prsp, *pbuflist;
104 	struct ulp_bde64 *bpl;
105 	IOCB_t *icmd;
106 
107 
108 	if (!lpfc_is_link_up(phba))
109 		return NULL;
110 
111 	/* Allocate buffer for  command iocb */
112 	elsiocb = lpfc_sli_get_iocbq(phba);
113 
114 	if (elsiocb == NULL)
115 		return NULL;
116 
117 	icmd = &elsiocb->iocb;
118 
119 	/* fill in BDEs for command */
120 	/* Allocate buffer for command payload */
121 	pcmd = kmalloc(sizeof(struct lpfc_dmabuf), GFP_KERNEL);
122 	if (pcmd)
123 		pcmd->virt = lpfc_mbuf_alloc(phba, MEM_PRI, &pcmd->phys);
124 	if (!pcmd || !pcmd->virt)
125 		goto els_iocb_free_pcmb_exit;
126 
127 	INIT_LIST_HEAD(&pcmd->list);
128 
129 	/* Allocate buffer for response payload */
130 	if (expectRsp) {
131 		prsp = kmalloc(sizeof(struct lpfc_dmabuf), GFP_KERNEL);
132 		if (prsp)
133 			prsp->virt = lpfc_mbuf_alloc(phba, MEM_PRI,
134 						     &prsp->phys);
135 		if (!prsp || !prsp->virt)
136 			goto els_iocb_free_prsp_exit;
137 		INIT_LIST_HEAD(&prsp->list);
138 	} else
139 		prsp = NULL;
140 
141 	/* Allocate buffer for Buffer ptr list */
142 	pbuflist = kmalloc(sizeof(struct lpfc_dmabuf), GFP_KERNEL);
143 	if (pbuflist)
144 		pbuflist->virt = lpfc_mbuf_alloc(phba, MEM_PRI,
145 						 &pbuflist->phys);
146 	if (!pbuflist || !pbuflist->virt)
147 		goto els_iocb_free_pbuf_exit;
148 
149 	INIT_LIST_HEAD(&pbuflist->list);
150 
151 	icmd->un.elsreq64.bdl.addrHigh = putPaddrHigh(pbuflist->phys);
152 	icmd->un.elsreq64.bdl.addrLow = putPaddrLow(pbuflist->phys);
153 	icmd->un.elsreq64.bdl.bdeFlags = BUFF_TYPE_BDL;
154 	icmd->un.elsreq64.remoteID = did;	/* DID */
155 	if (expectRsp) {
156 		icmd->un.elsreq64.bdl.bdeSize = (2 * sizeof(struct ulp_bde64));
157 		icmd->ulpCommand = CMD_ELS_REQUEST64_CR;
158 		icmd->ulpTimeout = phba->fc_ratov * 2;
159 	} else {
160 		icmd->un.elsreq64.bdl.bdeSize = sizeof(struct ulp_bde64);
161 		icmd->ulpCommand = CMD_XMIT_ELS_RSP64_CX;
162 	}
163 	icmd->ulpBdeCount = 1;
164 	icmd->ulpLe = 1;
165 	icmd->ulpClass = CLASS3;
166 
167 	if (phba->sli3_options & LPFC_SLI3_NPIV_ENABLED) {
168 		icmd->un.elsreq64.myID = vport->fc_myDID;
169 
170 		/* For ELS_REQUEST64_CR, use the VPI by default */
171 		icmd->ulpContext = vport->vpi;
172 		icmd->ulpCt_h = 0;
173 		icmd->ulpCt_l = 1;
174 	}
175 
176 	bpl = (struct ulp_bde64 *) pbuflist->virt;
177 	bpl->addrLow = le32_to_cpu(putPaddrLow(pcmd->phys));
178 	bpl->addrHigh = le32_to_cpu(putPaddrHigh(pcmd->phys));
179 	bpl->tus.f.bdeSize = cmdSize;
180 	bpl->tus.f.bdeFlags = 0;
181 	bpl->tus.w = le32_to_cpu(bpl->tus.w);
182 
183 	if (expectRsp) {
184 		bpl++;
185 		bpl->addrLow = le32_to_cpu(putPaddrLow(prsp->phys));
186 		bpl->addrHigh = le32_to_cpu(putPaddrHigh(prsp->phys));
187 		bpl->tus.f.bdeSize = FCELSSIZE;
188 		bpl->tus.f.bdeFlags = BUFF_USE_RCV;
189 		bpl->tus.w = le32_to_cpu(bpl->tus.w);
190 	}
191 
192 	/* prevent preparing iocb with NULL ndlp reference */
193 	elsiocb->context1 = lpfc_nlp_get(ndlp);
194 	if (!elsiocb->context1)
195 		goto els_iocb_free_pbuf_exit;
196 	elsiocb->context2 = pcmd;
197 	elsiocb->context3 = pbuflist;
198 	elsiocb->retry = retry;
199 	elsiocb->vport = vport;
200 	elsiocb->drvrTimeout = (phba->fc_ratov << 1) + LPFC_DRVR_TIMEOUT;
201 
202 	if (prsp) {
203 		list_add(&prsp->list, &pcmd->list);
204 	}
205 	if (expectRsp) {
206 		/* Xmit ELS command <elsCmd> to remote NPORT <did> */
207 		lpfc_printf_vlog(vport, KERN_INFO, LOG_ELS,
208 				 "0116 Xmit ELS command x%x to remote "
209 				 "NPORT x%x I/O tag: x%x, port state: x%x\n",
210 				 elscmd, did, elsiocb->iotag,
211 				 vport->port_state);
212 	} else {
213 		/* Xmit ELS response <elsCmd> to remote NPORT <did> */
214 		lpfc_printf_vlog(vport, KERN_INFO, LOG_ELS,
215 				 "0117 Xmit ELS response x%x to remote "
216 				 "NPORT x%x I/O tag: x%x, size: x%x\n",
217 				 elscmd, ndlp->nlp_DID, elsiocb->iotag,
218 				 cmdSize);
219 	}
220 	return elsiocb;
221 
222 els_iocb_free_pbuf_exit:
223 	lpfc_mbuf_free(phba, prsp->virt, prsp->phys);
224 	kfree(pbuflist);
225 
226 els_iocb_free_prsp_exit:
227 	lpfc_mbuf_free(phba, pcmd->virt, pcmd->phys);
228 	kfree(prsp);
229 
230 els_iocb_free_pcmb_exit:
231 	kfree(pcmd);
232 	lpfc_sli_release_iocbq(phba, elsiocb);
233 	return NULL;
234 }
235 
236 static int
237 lpfc_issue_fabric_reglogin(struct lpfc_vport *vport)
238 {
239 	struct lpfc_hba  *phba = vport->phba;
240 	LPFC_MBOXQ_t *mbox;
241 	struct lpfc_dmabuf *mp;
242 	struct lpfc_nodelist *ndlp;
243 	struct serv_parm *sp;
244 	int rc;
245 	int err = 0;
246 
247 	sp = &phba->fc_fabparam;
248 	ndlp = lpfc_findnode_did(vport, Fabric_DID);
249 	if (!ndlp || !NLP_CHK_NODE_ACT(ndlp)) {
250 		err = 1;
251 		goto fail;
252 	}
253 
254 	mbox = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL);
255 	if (!mbox) {
256 		err = 2;
257 		goto fail;
258 	}
259 
260 	vport->port_state = LPFC_FABRIC_CFG_LINK;
261 	lpfc_config_link(phba, mbox);
262 	mbox->mbox_cmpl = lpfc_sli_def_mbox_cmpl;
263 	mbox->vport = vport;
264 
265 	rc = lpfc_sli_issue_mbox(phba, mbox, MBX_NOWAIT);
266 	if (rc == MBX_NOT_FINISHED) {
267 		err = 3;
268 		goto fail_free_mbox;
269 	}
270 
271 	mbox = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL);
272 	if (!mbox) {
273 		err = 4;
274 		goto fail;
275 	}
276 	rc = lpfc_reg_login(phba, vport->vpi, Fabric_DID, (uint8_t *)sp, mbox,
277 			    0);
278 	if (rc) {
279 		err = 5;
280 		goto fail_free_mbox;
281 	}
282 
283 	mbox->mbox_cmpl = lpfc_mbx_cmpl_fabric_reg_login;
284 	mbox->vport = vport;
285 	/* increment the reference count on ndlp to hold reference
286 	 * for the callback routine.
287 	 */
288 	mbox->context2 = lpfc_nlp_get(ndlp);
289 
290 	rc = lpfc_sli_issue_mbox(phba, mbox, MBX_NOWAIT);
291 	if (rc == MBX_NOT_FINISHED) {
292 		err = 6;
293 		goto fail_issue_reg_login;
294 	}
295 
296 	return 0;
297 
298 fail_issue_reg_login:
299 	/* decrement the reference count on ndlp just incremented
300 	 * for the failed mbox command.
301 	 */
302 	lpfc_nlp_put(ndlp);
303 	mp = (struct lpfc_dmabuf *) mbox->context1;
304 	lpfc_mbuf_free(phba, mp->virt, mp->phys);
305 	kfree(mp);
306 fail_free_mbox:
307 	mempool_free(mbox, phba->mbox_mem_pool);
308 
309 fail:
310 	lpfc_vport_set_state(vport, FC_VPORT_FAILED);
311 	lpfc_printf_vlog(vport, KERN_ERR, LOG_ELS,
312 		"0249 Cannot issue Register Fabric login: Err %d\n", err);
313 	return -ENXIO;
314 }
315 
316 static int
317 lpfc_cmpl_els_flogi_fabric(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
318 			   struct serv_parm *sp, IOCB_t *irsp)
319 {
320 	struct Scsi_Host *shost = lpfc_shost_from_vport(vport);
321 	struct lpfc_hba  *phba = vport->phba;
322 	struct lpfc_nodelist *np;
323 	struct lpfc_nodelist *next_np;
324 
325 	spin_lock_irq(shost->host_lock);
326 	vport->fc_flag |= FC_FABRIC;
327 	spin_unlock_irq(shost->host_lock);
328 
329 	phba->fc_edtov = be32_to_cpu(sp->cmn.e_d_tov);
330 	if (sp->cmn.edtovResolution)	/* E_D_TOV ticks are in nanoseconds */
331 		phba->fc_edtov = (phba->fc_edtov + 999999) / 1000000;
332 
333 	phba->fc_ratov = (be32_to_cpu(sp->cmn.w2.r_a_tov) + 999) / 1000;
334 
335 	if (phba->fc_topology == TOPOLOGY_LOOP) {
336 		spin_lock_irq(shost->host_lock);
337 		vport->fc_flag |= FC_PUBLIC_LOOP;
338 		spin_unlock_irq(shost->host_lock);
339 	} else {
340 		/*
341 		 * If we are a N-port connected to a Fabric, fixup sparam's so
342 		 * logins to devices on remote loops work.
343 		 */
344 		vport->fc_sparam.cmn.altBbCredit = 1;
345 	}
346 
347 	vport->fc_myDID = irsp->un.ulpWord[4] & Mask_DID;
348 	memcpy(&ndlp->nlp_portname, &sp->portName, sizeof(struct lpfc_name));
349 	memcpy(&ndlp->nlp_nodename, &sp->nodeName, sizeof(struct lpfc_name));
350 	ndlp->nlp_class_sup = 0;
351 	if (sp->cls1.classValid)
352 		ndlp->nlp_class_sup |= FC_COS_CLASS1;
353 	if (sp->cls2.classValid)
354 		ndlp->nlp_class_sup |= FC_COS_CLASS2;
355 	if (sp->cls3.classValid)
356 		ndlp->nlp_class_sup |= FC_COS_CLASS3;
357 	if (sp->cls4.classValid)
358 		ndlp->nlp_class_sup |= FC_COS_CLASS4;
359 	ndlp->nlp_maxframe = ((sp->cmn.bbRcvSizeMsb & 0x0F) << 8) |
360 				sp->cmn.bbRcvSizeLsb;
361 	memcpy(&phba->fc_fabparam, sp, sizeof(struct serv_parm));
362 
363 	if (phba->sli3_options & LPFC_SLI3_NPIV_ENABLED) {
364 		if (sp->cmn.response_multiple_NPort) {
365 			lpfc_printf_vlog(vport, KERN_WARNING,
366 					 LOG_ELS | LOG_VPORT,
367 					 "1816 FLOGI NPIV supported, "
368 					 "response data 0x%x\n",
369 					 sp->cmn.response_multiple_NPort);
370 			phba->link_flag |= LS_NPIV_FAB_SUPPORTED;
371 		} else {
372 			/* Because we asked f/w for NPIV it still expects us
373 			to call reg_vnpid atleast for the physcial host */
374 			lpfc_printf_vlog(vport, KERN_WARNING,
375 					 LOG_ELS | LOG_VPORT,
376 					 "1817 Fabric does not support NPIV "
377 					 "- configuring single port mode.\n");
378 			phba->link_flag &= ~LS_NPIV_FAB_SUPPORTED;
379 		}
380 	}
381 
382 	if ((vport->fc_prevDID != vport->fc_myDID) &&
383 		!(vport->fc_flag & FC_VPORT_NEEDS_REG_VPI)) {
384 
385 		/* If our NportID changed, we need to ensure all
386 		 * remaining NPORTs get unreg_login'ed.
387 		 */
388 		list_for_each_entry_safe(np, next_np,
389 					&vport->fc_nodes, nlp_listp) {
390 			if (!NLP_CHK_NODE_ACT(ndlp))
391 				continue;
392 			if ((np->nlp_state != NLP_STE_NPR_NODE) ||
393 				   !(np->nlp_flag & NLP_NPR_ADISC))
394 				continue;
395 			spin_lock_irq(shost->host_lock);
396 			np->nlp_flag &= ~NLP_NPR_ADISC;
397 			spin_unlock_irq(shost->host_lock);
398 			lpfc_unreg_rpi(vport, np);
399 		}
400 		if (phba->sli3_options & LPFC_SLI3_NPIV_ENABLED) {
401 			lpfc_mbx_unreg_vpi(vport);
402 			spin_lock_irq(shost->host_lock);
403 			vport->fc_flag |= FC_VPORT_NEEDS_REG_VPI;
404 			spin_unlock_irq(shost->host_lock);
405 		}
406 	}
407 
408 	lpfc_nlp_set_state(vport, ndlp, NLP_STE_REG_LOGIN_ISSUE);
409 
410 	if (phba->sli3_options & LPFC_SLI3_NPIV_ENABLED &&
411 	    vport->fc_flag & FC_VPORT_NEEDS_REG_VPI) {
412 		lpfc_register_new_vport(phba, vport, ndlp);
413 		return 0;
414 	}
415 	lpfc_issue_fabric_reglogin(vport);
416 	return 0;
417 }
418 
419 /*
420  * We FLOGIed into an NPort, initiate pt2pt protocol
421  */
422 static int
423 lpfc_cmpl_els_flogi_nport(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
424 			  struct serv_parm *sp)
425 {
426 	struct Scsi_Host *shost = lpfc_shost_from_vport(vport);
427 	struct lpfc_hba  *phba = vport->phba;
428 	LPFC_MBOXQ_t *mbox;
429 	int rc;
430 
431 	spin_lock_irq(shost->host_lock);
432 	vport->fc_flag &= ~(FC_FABRIC | FC_PUBLIC_LOOP);
433 	spin_unlock_irq(shost->host_lock);
434 
435 	phba->fc_edtov = FF_DEF_EDTOV;
436 	phba->fc_ratov = FF_DEF_RATOV;
437 	rc = memcmp(&vport->fc_portname, &sp->portName,
438 		    sizeof(vport->fc_portname));
439 	if (rc >= 0) {
440 		/* This side will initiate the PLOGI */
441 		spin_lock_irq(shost->host_lock);
442 		vport->fc_flag |= FC_PT2PT_PLOGI;
443 		spin_unlock_irq(shost->host_lock);
444 
445 		/*
446 		 * N_Port ID cannot be 0, set our to LocalID the other
447 		 * side will be RemoteID.
448 		 */
449 
450 		/* not equal */
451 		if (rc)
452 			vport->fc_myDID = PT2PT_LocalID;
453 
454 		mbox = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL);
455 		if (!mbox)
456 			goto fail;
457 
458 		lpfc_config_link(phba, mbox);
459 
460 		mbox->mbox_cmpl = lpfc_sli_def_mbox_cmpl;
461 		mbox->vport = vport;
462 		rc = lpfc_sli_issue_mbox(phba, mbox, MBX_NOWAIT);
463 		if (rc == MBX_NOT_FINISHED) {
464 			mempool_free(mbox, phba->mbox_mem_pool);
465 			goto fail;
466 		}
467 		/* Decrement ndlp reference count indicating that ndlp can be
468 		 * safely released when other references to it are done.
469 		 */
470 		lpfc_nlp_put(ndlp);
471 
472 		ndlp = lpfc_findnode_did(vport, PT2PT_RemoteID);
473 		if (!ndlp) {
474 			/*
475 			 * Cannot find existing Fabric ndlp, so allocate a
476 			 * new one
477 			 */
478 			ndlp = mempool_alloc(phba->nlp_mem_pool, GFP_KERNEL);
479 			if (!ndlp)
480 				goto fail;
481 			lpfc_nlp_init(vport, ndlp, PT2PT_RemoteID);
482 		} else if (!NLP_CHK_NODE_ACT(ndlp)) {
483 			ndlp = lpfc_enable_node(vport, ndlp,
484 						NLP_STE_UNUSED_NODE);
485 			if(!ndlp)
486 				goto fail;
487 		}
488 
489 		memcpy(&ndlp->nlp_portname, &sp->portName,
490 		       sizeof(struct lpfc_name));
491 		memcpy(&ndlp->nlp_nodename, &sp->nodeName,
492 		       sizeof(struct lpfc_name));
493 		/* Set state will put ndlp onto node list if not already done */
494 		lpfc_nlp_set_state(vport, ndlp, NLP_STE_NPR_NODE);
495 		spin_lock_irq(shost->host_lock);
496 		ndlp->nlp_flag |= NLP_NPR_2B_DISC;
497 		spin_unlock_irq(shost->host_lock);
498 	} else
499 		/* This side will wait for the PLOGI, decrement ndlp reference
500 		 * count indicating that ndlp can be released when other
501 		 * references to it are done.
502 		 */
503 		lpfc_nlp_put(ndlp);
504 
505 	/* If we are pt2pt with another NPort, force NPIV off! */
506 	phba->sli3_options &= ~LPFC_SLI3_NPIV_ENABLED;
507 
508 	spin_lock_irq(shost->host_lock);
509 	vport->fc_flag |= FC_PT2PT;
510 	spin_unlock_irq(shost->host_lock);
511 
512 	/* Start discovery - this should just do CLEAR_LA */
513 	lpfc_disc_start(vport);
514 	return 0;
515 fail:
516 	return -ENXIO;
517 }
518 
519 static void
520 lpfc_cmpl_els_flogi(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
521 		    struct lpfc_iocbq *rspiocb)
522 {
523 	struct lpfc_vport *vport = cmdiocb->vport;
524 	struct Scsi_Host  *shost = lpfc_shost_from_vport(vport);
525 	IOCB_t *irsp = &rspiocb->iocb;
526 	struct lpfc_nodelist *ndlp = cmdiocb->context1;
527 	struct lpfc_dmabuf *pcmd = cmdiocb->context2, *prsp;
528 	struct serv_parm *sp;
529 	int rc;
530 
531 	/* Check to see if link went down during discovery */
532 	if (lpfc_els_chk_latt(vport)) {
533 		/* One additional decrement on node reference count to
534 		 * trigger the release of the node
535 		 */
536 		lpfc_nlp_put(ndlp);
537 		goto out;
538 	}
539 
540 	lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_CMD,
541 		"FLOGI cmpl:      status:x%x/x%x state:x%x",
542 		irsp->ulpStatus, irsp->un.ulpWord[4],
543 		vport->port_state);
544 
545 	if (irsp->ulpStatus) {
546 		/* Check for retry */
547 		if (lpfc_els_retry(phba, cmdiocb, rspiocb))
548 			goto out;
549 
550 		/* FLOGI failed, so there is no fabric */
551 		spin_lock_irq(shost->host_lock);
552 		vport->fc_flag &= ~(FC_FABRIC | FC_PUBLIC_LOOP);
553 		spin_unlock_irq(shost->host_lock);
554 
555 		/* If private loop, then allow max outstanding els to be
556 		 * LPFC_MAX_DISC_THREADS (32). Scanning in the case of no
557 		 * alpa map would take too long otherwise.
558 		 */
559 		if (phba->alpa_map[0] == 0) {
560 			vport->cfg_discovery_threads = LPFC_MAX_DISC_THREADS;
561 		}
562 
563 		/* FLOGI failure */
564 		lpfc_printf_vlog(vport, KERN_INFO, LOG_ELS,
565 				 "0100 FLOGI failure Data: x%x x%x "
566 				 "x%x\n",
567 				 irsp->ulpStatus, irsp->un.ulpWord[4],
568 				 irsp->ulpTimeout);
569 		goto flogifail;
570 	}
571 
572 	/*
573 	 * The FLogI succeeded.  Sync the data for the CPU before
574 	 * accessing it.
575 	 */
576 	prsp = list_get_first(&pcmd->list, struct lpfc_dmabuf, list);
577 
578 	sp = prsp->virt + sizeof(uint32_t);
579 
580 	/* FLOGI completes successfully */
581 	lpfc_printf_vlog(vport, KERN_INFO, LOG_ELS,
582 			 "0101 FLOGI completes sucessfully "
583 			 "Data: x%x x%x x%x x%x\n",
584 			 irsp->un.ulpWord[4], sp->cmn.e_d_tov,
585 			 sp->cmn.w2.r_a_tov, sp->cmn.edtovResolution);
586 
587 	if (vport->port_state == LPFC_FLOGI) {
588 		/*
589 		 * If Common Service Parameters indicate Nport
590 		 * we are point to point, if Fport we are Fabric.
591 		 */
592 		if (sp->cmn.fPort)
593 			rc = lpfc_cmpl_els_flogi_fabric(vport, ndlp, sp, irsp);
594 		else
595 			rc = lpfc_cmpl_els_flogi_nport(vport, ndlp, sp);
596 
597 		if (!rc)
598 			goto out;
599 	}
600 
601 flogifail:
602 	lpfc_nlp_put(ndlp);
603 
604 	if (!lpfc_error_lost_link(irsp)) {
605 		/* FLOGI failed, so just use loop map to make discovery list */
606 		lpfc_disc_list_loopmap(vport);
607 
608 		/* Start discovery */
609 		lpfc_disc_start(vport);
610 	} else if (((irsp->ulpStatus != IOSTAT_LOCAL_REJECT) ||
611 			((irsp->un.ulpWord[4] != IOERR_SLI_ABORTED) &&
612 			(irsp->un.ulpWord[4] != IOERR_SLI_DOWN))) &&
613 			(phba->link_state != LPFC_CLEAR_LA)) {
614 		/* If FLOGI failed enable link interrupt. */
615 		lpfc_issue_clear_la(phba, vport);
616 	}
617 out:
618 	lpfc_els_free_iocb(phba, cmdiocb);
619 }
620 
621 static int
622 lpfc_issue_els_flogi(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
623 		     uint8_t retry)
624 {
625 	struct lpfc_hba  *phba = vport->phba;
626 	struct serv_parm *sp;
627 	IOCB_t *icmd;
628 	struct lpfc_iocbq *elsiocb;
629 	struct lpfc_sli_ring *pring;
630 	uint8_t *pcmd;
631 	uint16_t cmdsize;
632 	uint32_t tmo;
633 	int rc;
634 
635 	pring = &phba->sli.ring[LPFC_ELS_RING];
636 
637 	cmdsize = (sizeof(uint32_t) + sizeof(struct serv_parm));
638 	elsiocb = lpfc_prep_els_iocb(vport, 1, cmdsize, retry, ndlp,
639 				     ndlp->nlp_DID, ELS_CMD_FLOGI);
640 
641 	if (!elsiocb)
642 		return 1;
643 
644 	icmd = &elsiocb->iocb;
645 	pcmd = (uint8_t *) (((struct lpfc_dmabuf *) elsiocb->context2)->virt);
646 
647 	/* For FLOGI request, remainder of payload is service parameters */
648 	*((uint32_t *) (pcmd)) = ELS_CMD_FLOGI;
649 	pcmd += sizeof(uint32_t);
650 	memcpy(pcmd, &vport->fc_sparam, sizeof(struct serv_parm));
651 	sp = (struct serv_parm *) pcmd;
652 
653 	/* Setup CSPs accordingly for Fabric */
654 	sp->cmn.e_d_tov = 0;
655 	sp->cmn.w2.r_a_tov = 0;
656 	sp->cls1.classValid = 0;
657 	sp->cls2.seqDelivery = 1;
658 	sp->cls3.seqDelivery = 1;
659 	if (sp->cmn.fcphLow < FC_PH3)
660 		sp->cmn.fcphLow = FC_PH3;
661 	if (sp->cmn.fcphHigh < FC_PH3)
662 		sp->cmn.fcphHigh = FC_PH3;
663 
664 	if (phba->sli3_options & LPFC_SLI3_NPIV_ENABLED) {
665 		sp->cmn.request_multiple_Nport = 1;
666 
667 		/* For FLOGI, Let FLOGI rsp set the NPortID for VPI 0 */
668 		icmd->ulpCt_h = 1;
669 		icmd->ulpCt_l = 0;
670 	}
671 
672 	if (phba->fc_topology != TOPOLOGY_LOOP) {
673 		icmd->un.elsreq64.myID = 0;
674 		icmd->un.elsreq64.fl = 1;
675 	}
676 
677 	tmo = phba->fc_ratov;
678 	phba->fc_ratov = LPFC_DISC_FLOGI_TMO;
679 	lpfc_set_disctmo(vport);
680 	phba->fc_ratov = tmo;
681 
682 	phba->fc_stat.elsXmitFLOGI++;
683 	elsiocb->iocb_cmpl = lpfc_cmpl_els_flogi;
684 
685 	lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_CMD,
686 		"Issue FLOGI:     opt:x%x",
687 		phba->sli3_options, 0, 0);
688 
689 	rc = lpfc_issue_fabric_iocb(phba, elsiocb);
690 	if (rc == IOCB_ERROR) {
691 		lpfc_els_free_iocb(phba, elsiocb);
692 		return 1;
693 	}
694 	return 0;
695 }
696 
697 int
698 lpfc_els_abort_flogi(struct lpfc_hba *phba)
699 {
700 	struct lpfc_sli_ring *pring;
701 	struct lpfc_iocbq *iocb, *next_iocb;
702 	struct lpfc_nodelist *ndlp;
703 	IOCB_t *icmd;
704 
705 	/* Abort outstanding I/O on NPort <nlp_DID> */
706 	lpfc_printf_log(phba, KERN_INFO, LOG_DISCOVERY,
707 			"0201 Abort outstanding I/O on NPort x%x\n",
708 			Fabric_DID);
709 
710 	pring = &phba->sli.ring[LPFC_ELS_RING];
711 
712 	/*
713 	 * Check the txcmplq for an iocb that matches the nport the driver is
714 	 * searching for.
715 	 */
716 	spin_lock_irq(&phba->hbalock);
717 	list_for_each_entry_safe(iocb, next_iocb, &pring->txcmplq, list) {
718 		icmd = &iocb->iocb;
719 		if (icmd->ulpCommand == CMD_ELS_REQUEST64_CR &&
720 		    icmd->un.elsreq64.bdl.ulpIoTag32) {
721 			ndlp = (struct lpfc_nodelist *)(iocb->context1);
722 			if (ndlp && NLP_CHK_NODE_ACT(ndlp) &&
723 			    (ndlp->nlp_DID == Fabric_DID))
724 				lpfc_sli_issue_abort_iotag(phba, pring, iocb);
725 		}
726 	}
727 	spin_unlock_irq(&phba->hbalock);
728 
729 	return 0;
730 }
731 
732 int
733 lpfc_initial_flogi(struct lpfc_vport *vport)
734 {
735 	struct lpfc_hba *phba = vport->phba;
736 	struct lpfc_nodelist *ndlp;
737 
738 	vport->port_state = LPFC_FLOGI;
739 	lpfc_set_disctmo(vport);
740 
741 	/* First look for the Fabric ndlp */
742 	ndlp = lpfc_findnode_did(vport, Fabric_DID);
743 	if (!ndlp) {
744 		/* Cannot find existing Fabric ndlp, so allocate a new one */
745 		ndlp = mempool_alloc(phba->nlp_mem_pool, GFP_KERNEL);
746 		if (!ndlp)
747 			return 0;
748 		lpfc_nlp_init(vport, ndlp, Fabric_DID);
749 		/* Put ndlp onto node list */
750 		lpfc_enqueue_node(vport, ndlp);
751 	} else if (!NLP_CHK_NODE_ACT(ndlp)) {
752 		/* re-setup ndlp without removing from node list */
753 		ndlp = lpfc_enable_node(vport, ndlp, NLP_STE_UNUSED_NODE);
754 		if (!ndlp)
755 			return 0;
756 	}
757 
758 	if (lpfc_issue_els_flogi(vport, ndlp, 0))
759 		/* This decrement of reference count to node shall kick off
760 		 * the release of the node.
761 		 */
762 		lpfc_nlp_put(ndlp);
763 
764 	return 1;
765 }
766 
767 int
768 lpfc_initial_fdisc(struct lpfc_vport *vport)
769 {
770 	struct lpfc_hba *phba = vport->phba;
771 	struct lpfc_nodelist *ndlp;
772 
773 	/* First look for the Fabric ndlp */
774 	ndlp = lpfc_findnode_did(vport, Fabric_DID);
775 	if (!ndlp) {
776 		/* Cannot find existing Fabric ndlp, so allocate a new one */
777 		ndlp = mempool_alloc(phba->nlp_mem_pool, GFP_KERNEL);
778 		if (!ndlp)
779 			return 0;
780 		lpfc_nlp_init(vport, ndlp, Fabric_DID);
781 		/* Put ndlp onto node list */
782 		lpfc_enqueue_node(vport, ndlp);
783 	} else if (!NLP_CHK_NODE_ACT(ndlp)) {
784 		/* re-setup ndlp without removing from node list */
785 		ndlp = lpfc_enable_node(vport, ndlp, NLP_STE_UNUSED_NODE);
786 		if (!ndlp)
787 			return 0;
788 	}
789 
790 	if (lpfc_issue_els_fdisc(vport, ndlp, 0)) {
791 		/* decrement node reference count to trigger the release of
792 		 * the node.
793 		 */
794 		lpfc_nlp_put(ndlp);
795 		return 0;
796 	}
797 	return 1;
798 }
799 
800 void
801 lpfc_more_plogi(struct lpfc_vport *vport)
802 {
803 	int sentplogi;
804 
805 	if (vport->num_disc_nodes)
806 		vport->num_disc_nodes--;
807 
808 	/* Continue discovery with <num_disc_nodes> PLOGIs to go */
809 	lpfc_printf_vlog(vport, KERN_INFO, LOG_DISCOVERY,
810 			 "0232 Continue discovery with %d PLOGIs to go "
811 			 "Data: x%x x%x x%x\n",
812 			 vport->num_disc_nodes, vport->fc_plogi_cnt,
813 			 vport->fc_flag, vport->port_state);
814 	/* Check to see if there are more PLOGIs to be sent */
815 	if (vport->fc_flag & FC_NLP_MORE)
816 		/* go thru NPR nodes and issue any remaining ELS PLOGIs */
817 		sentplogi = lpfc_els_disc_plogi(vport);
818 
819 	return;
820 }
821 
822 static struct lpfc_nodelist *
823 lpfc_plogi_confirm_nport(struct lpfc_hba *phba, uint32_t *prsp,
824 			 struct lpfc_nodelist *ndlp)
825 {
826 	struct lpfc_vport    *vport = ndlp->vport;
827 	struct lpfc_nodelist *new_ndlp;
828 	struct lpfc_rport_data *rdata;
829 	struct fc_rport *rport;
830 	struct serv_parm *sp;
831 	uint8_t  name[sizeof(struct lpfc_name)];
832 	uint32_t rc, keepDID = 0;
833 
834 	/* Fabric nodes can have the same WWPN so we don't bother searching
835 	 * by WWPN.  Just return the ndlp that was given to us.
836 	 */
837 	if (ndlp->nlp_type & NLP_FABRIC)
838 		return ndlp;
839 
840 	sp = (struct serv_parm *) ((uint8_t *) prsp + sizeof(uint32_t));
841 	memset(name, 0, sizeof(struct lpfc_name));
842 
843 	/* Now we find out if the NPort we are logging into, matches the WWPN
844 	 * we have for that ndlp. If not, we have some work to do.
845 	 */
846 	new_ndlp = lpfc_findnode_wwpn(vport, &sp->portName);
847 
848 	if (new_ndlp == ndlp && NLP_CHK_NODE_ACT(new_ndlp))
849 		return ndlp;
850 
851 	if (!new_ndlp) {
852 		rc = memcmp(&ndlp->nlp_portname, name,
853 			    sizeof(struct lpfc_name));
854 		if (!rc)
855 			return ndlp;
856 		new_ndlp = mempool_alloc(phba->nlp_mem_pool, GFP_ATOMIC);
857 		if (!new_ndlp)
858 			return ndlp;
859 		lpfc_nlp_init(vport, new_ndlp, ndlp->nlp_DID);
860 	} else if (!NLP_CHK_NODE_ACT(new_ndlp)) {
861 		rc = memcmp(&ndlp->nlp_portname, name,
862 			    sizeof(struct lpfc_name));
863 		if (!rc)
864 			return ndlp;
865 		new_ndlp = lpfc_enable_node(vport, new_ndlp,
866 						NLP_STE_UNUSED_NODE);
867 		if (!new_ndlp)
868 			return ndlp;
869 		keepDID = new_ndlp->nlp_DID;
870 	} else
871 		keepDID = new_ndlp->nlp_DID;
872 
873 	lpfc_unreg_rpi(vport, new_ndlp);
874 	new_ndlp->nlp_DID = ndlp->nlp_DID;
875 	new_ndlp->nlp_prev_state = ndlp->nlp_prev_state;
876 
877 	if (ndlp->nlp_flag & NLP_NPR_2B_DISC)
878 		new_ndlp->nlp_flag |= NLP_NPR_2B_DISC;
879 	ndlp->nlp_flag &= ~NLP_NPR_2B_DISC;
880 
881 	/* Set state will put new_ndlp on to node list if not already done */
882 	lpfc_nlp_set_state(vport, new_ndlp, ndlp->nlp_state);
883 
884 	/* Move this back to NPR state */
885 	if (memcmp(&ndlp->nlp_portname, name, sizeof(struct lpfc_name)) == 0) {
886 		/* The new_ndlp is replacing ndlp totally, so we need
887 		 * to put ndlp on UNUSED list and try to free it.
888 		 */
889 
890 		/* Fix up the rport accordingly */
891 		rport =  ndlp->rport;
892 		if (rport) {
893 			rdata = rport->dd_data;
894 			if (rdata->pnode == ndlp) {
895 				lpfc_nlp_put(ndlp);
896 				ndlp->rport = NULL;
897 				rdata->pnode = lpfc_nlp_get(new_ndlp);
898 				new_ndlp->rport = rport;
899 			}
900 			new_ndlp->nlp_type = ndlp->nlp_type;
901 		}
902 		/* We shall actually free the ndlp with both nlp_DID and
903 		 * nlp_portname fields equals 0 to avoid any ndlp on the
904 		 * nodelist never to be used.
905 		 */
906 		if (ndlp->nlp_DID == 0) {
907 			spin_lock_irq(&phba->ndlp_lock);
908 			NLP_SET_FREE_REQ(ndlp);
909 			spin_unlock_irq(&phba->ndlp_lock);
910 		}
911 
912 		/* Two ndlps cannot have the same did on the nodelist */
913 		ndlp->nlp_DID = keepDID;
914 		lpfc_drop_node(vport, ndlp);
915 	}
916 	else {
917 		lpfc_unreg_rpi(vport, ndlp);
918 		/* Two ndlps cannot have the same did */
919 		ndlp->nlp_DID = keepDID;
920 		lpfc_nlp_set_state(vport, ndlp, NLP_STE_NPR_NODE);
921 	}
922 	return new_ndlp;
923 }
924 
925 void
926 lpfc_end_rscn(struct lpfc_vport *vport)
927 {
928 	struct Scsi_Host *shost = lpfc_shost_from_vport(vport);
929 
930 	if (vport->fc_flag & FC_RSCN_MODE) {
931 		/*
932 		 * Check to see if more RSCNs came in while we were
933 		 * processing this one.
934 		 */
935 		if (vport->fc_rscn_id_cnt ||
936 		    (vport->fc_flag & FC_RSCN_DISCOVERY) != 0)
937 			lpfc_els_handle_rscn(vport);
938 		else {
939 			spin_lock_irq(shost->host_lock);
940 			vport->fc_flag &= ~FC_RSCN_MODE;
941 			spin_unlock_irq(shost->host_lock);
942 		}
943 	}
944 }
945 
946 static void
947 lpfc_cmpl_els_plogi(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
948 		    struct lpfc_iocbq *rspiocb)
949 {
950 	struct lpfc_vport *vport = cmdiocb->vport;
951 	struct Scsi_Host  *shost = lpfc_shost_from_vport(vport);
952 	IOCB_t *irsp;
953 	struct lpfc_nodelist *ndlp;
954 	struct lpfc_dmabuf *prsp;
955 	int disc, rc, did, type;
956 
957 	/* we pass cmdiocb to state machine which needs rspiocb as well */
958 	cmdiocb->context_un.rsp_iocb = rspiocb;
959 
960 	irsp = &rspiocb->iocb;
961 	lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_CMD,
962 		"PLOGI cmpl:      status:x%x/x%x did:x%x",
963 		irsp->ulpStatus, irsp->un.ulpWord[4],
964 		irsp->un.elsreq64.remoteID);
965 
966 	ndlp = lpfc_findnode_did(vport, irsp->un.elsreq64.remoteID);
967 	if (!ndlp || !NLP_CHK_NODE_ACT(ndlp)) {
968 		lpfc_printf_vlog(vport, KERN_ERR, LOG_ELS,
969 				 "0136 PLOGI completes to NPort x%x "
970 				 "with no ndlp. Data: x%x x%x x%x\n",
971 				 irsp->un.elsreq64.remoteID,
972 				 irsp->ulpStatus, irsp->un.ulpWord[4],
973 				 irsp->ulpIoTag);
974 		goto out;
975 	}
976 
977 	/* Since ndlp can be freed in the disc state machine, note if this node
978 	 * is being used during discovery.
979 	 */
980 	spin_lock_irq(shost->host_lock);
981 	disc = (ndlp->nlp_flag & NLP_NPR_2B_DISC);
982 	ndlp->nlp_flag &= ~NLP_NPR_2B_DISC;
983 	spin_unlock_irq(shost->host_lock);
984 	rc   = 0;
985 
986 	/* PLOGI completes to NPort <nlp_DID> */
987 	lpfc_printf_vlog(vport, KERN_INFO, LOG_ELS,
988 			 "0102 PLOGI completes to NPort x%x "
989 			 "Data: x%x x%x x%x x%x x%x\n",
990 			 ndlp->nlp_DID, irsp->ulpStatus, irsp->un.ulpWord[4],
991 			 irsp->ulpTimeout, disc, vport->num_disc_nodes);
992 	/* Check to see if link went down during discovery */
993 	if (lpfc_els_chk_latt(vport)) {
994 		spin_lock_irq(shost->host_lock);
995 		ndlp->nlp_flag |= NLP_NPR_2B_DISC;
996 		spin_unlock_irq(shost->host_lock);
997 		goto out;
998 	}
999 
1000 	/* ndlp could be freed in DSM, save these values now */
1001 	type = ndlp->nlp_type;
1002 	did = ndlp->nlp_DID;
1003 
1004 	if (irsp->ulpStatus) {
1005 		/* Check for retry */
1006 		if (lpfc_els_retry(phba, cmdiocb, rspiocb)) {
1007 			/* ELS command is being retried */
1008 			if (disc) {
1009 				spin_lock_irq(shost->host_lock);
1010 				ndlp->nlp_flag |= NLP_NPR_2B_DISC;
1011 				spin_unlock_irq(shost->host_lock);
1012 			}
1013 			goto out;
1014 		}
1015 		/* PLOGI failed */
1016 		/* Do not call DSM for lpfc_els_abort'ed ELS cmds */
1017 		if (lpfc_error_lost_link(irsp))
1018 			rc = NLP_STE_FREED_NODE;
1019 		else
1020 			rc = lpfc_disc_state_machine(vport, ndlp, cmdiocb,
1021 						     NLP_EVT_CMPL_PLOGI);
1022 	} else {
1023 		/* Good status, call state machine */
1024 		prsp = list_entry(((struct lpfc_dmabuf *)
1025 				   cmdiocb->context2)->list.next,
1026 				  struct lpfc_dmabuf, list);
1027 		ndlp = lpfc_plogi_confirm_nport(phba, prsp->virt, ndlp);
1028 		rc = lpfc_disc_state_machine(vport, ndlp, cmdiocb,
1029 					     NLP_EVT_CMPL_PLOGI);
1030 	}
1031 
1032 	if (disc && vport->num_disc_nodes) {
1033 		/* Check to see if there are more PLOGIs to be sent */
1034 		lpfc_more_plogi(vport);
1035 
1036 		if (vport->num_disc_nodes == 0) {
1037 			spin_lock_irq(shost->host_lock);
1038 			vport->fc_flag &= ~FC_NDISC_ACTIVE;
1039 			spin_unlock_irq(shost->host_lock);
1040 
1041 			lpfc_can_disctmo(vport);
1042 			lpfc_end_rscn(vport);
1043 		}
1044 	}
1045 
1046 out:
1047 	lpfc_els_free_iocb(phba, cmdiocb);
1048 	return;
1049 }
1050 
1051 int
1052 lpfc_issue_els_plogi(struct lpfc_vport *vport, uint32_t did, uint8_t retry)
1053 {
1054 	struct lpfc_hba  *phba = vport->phba;
1055 	struct serv_parm *sp;
1056 	IOCB_t *icmd;
1057 	struct lpfc_nodelist *ndlp;
1058 	struct lpfc_iocbq *elsiocb;
1059 	struct lpfc_sli_ring *pring;
1060 	struct lpfc_sli *psli;
1061 	uint8_t *pcmd;
1062 	uint16_t cmdsize;
1063 	int ret;
1064 
1065 	psli = &phba->sli;
1066 	pring = &psli->ring[LPFC_ELS_RING];	/* ELS ring */
1067 
1068 	ndlp = lpfc_findnode_did(vport, did);
1069 	if (ndlp && !NLP_CHK_NODE_ACT(ndlp))
1070 		ndlp = NULL;
1071 
1072 	/* If ndlp is not NULL, we will bump the reference count on it */
1073 	cmdsize = (sizeof(uint32_t) + sizeof(struct serv_parm));
1074 	elsiocb = lpfc_prep_els_iocb(vport, 1, cmdsize, retry, ndlp, did,
1075 				     ELS_CMD_PLOGI);
1076 	if (!elsiocb)
1077 		return 1;
1078 
1079 	icmd = &elsiocb->iocb;
1080 	pcmd = (uint8_t *) (((struct lpfc_dmabuf *) elsiocb->context2)->virt);
1081 
1082 	/* For PLOGI request, remainder of payload is service parameters */
1083 	*((uint32_t *) (pcmd)) = ELS_CMD_PLOGI;
1084 	pcmd += sizeof(uint32_t);
1085 	memcpy(pcmd, &vport->fc_sparam, sizeof(struct serv_parm));
1086 	sp = (struct serv_parm *) pcmd;
1087 
1088 	if (sp->cmn.fcphLow < FC_PH_4_3)
1089 		sp->cmn.fcphLow = FC_PH_4_3;
1090 
1091 	if (sp->cmn.fcphHigh < FC_PH3)
1092 		sp->cmn.fcphHigh = FC_PH3;
1093 
1094 	lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_CMD,
1095 		"Issue PLOGI:     did:x%x",
1096 		did, 0, 0);
1097 
1098 	phba->fc_stat.elsXmitPLOGI++;
1099 	elsiocb->iocb_cmpl = lpfc_cmpl_els_plogi;
1100 	ret = lpfc_sli_issue_iocb(phba, pring, elsiocb, 0);
1101 
1102 	if (ret == IOCB_ERROR) {
1103 		lpfc_els_free_iocb(phba, elsiocb);
1104 		return 1;
1105 	}
1106 	return 0;
1107 }
1108 
1109 static void
1110 lpfc_cmpl_els_prli(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
1111 		   struct lpfc_iocbq *rspiocb)
1112 {
1113 	struct lpfc_vport *vport = cmdiocb->vport;
1114 	struct Scsi_Host  *shost = lpfc_shost_from_vport(vport);
1115 	IOCB_t *irsp;
1116 	struct lpfc_sli *psli;
1117 	struct lpfc_nodelist *ndlp;
1118 
1119 	psli = &phba->sli;
1120 	/* we pass cmdiocb to state machine which needs rspiocb as well */
1121 	cmdiocb->context_un.rsp_iocb = rspiocb;
1122 
1123 	irsp = &(rspiocb->iocb);
1124 	ndlp = (struct lpfc_nodelist *) cmdiocb->context1;
1125 	spin_lock_irq(shost->host_lock);
1126 	ndlp->nlp_flag &= ~NLP_PRLI_SND;
1127 	spin_unlock_irq(shost->host_lock);
1128 
1129 	lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_CMD,
1130 		"PRLI cmpl:       status:x%x/x%x did:x%x",
1131 		irsp->ulpStatus, irsp->un.ulpWord[4],
1132 		ndlp->nlp_DID);
1133 	/* PRLI completes to NPort <nlp_DID> */
1134 	lpfc_printf_vlog(vport, KERN_INFO, LOG_ELS,
1135 			 "0103 PRLI completes to NPort x%x "
1136 			 "Data: x%x x%x x%x x%x\n",
1137 			 ndlp->nlp_DID, irsp->ulpStatus, irsp->un.ulpWord[4],
1138 			 irsp->ulpTimeout, vport->num_disc_nodes);
1139 
1140 	vport->fc_prli_sent--;
1141 	/* Check to see if link went down during discovery */
1142 	if (lpfc_els_chk_latt(vport))
1143 		goto out;
1144 
1145 	if (irsp->ulpStatus) {
1146 		/* Check for retry */
1147 		if (lpfc_els_retry(phba, cmdiocb, rspiocb)) {
1148 			/* ELS command is being retried */
1149 			goto out;
1150 		}
1151 		/* PRLI failed */
1152 		/* Do not call DSM for lpfc_els_abort'ed ELS cmds */
1153 		if (lpfc_error_lost_link(irsp))
1154 			goto out;
1155 		else
1156 			lpfc_disc_state_machine(vport, ndlp, cmdiocb,
1157 						NLP_EVT_CMPL_PRLI);
1158 	} else
1159 		/* Good status, call state machine */
1160 		lpfc_disc_state_machine(vport, ndlp, cmdiocb,
1161 					NLP_EVT_CMPL_PRLI);
1162 out:
1163 	lpfc_els_free_iocb(phba, cmdiocb);
1164 	return;
1165 }
1166 
1167 int
1168 lpfc_issue_els_prli(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
1169 		    uint8_t retry)
1170 {
1171 	struct Scsi_Host *shost = lpfc_shost_from_vport(vport);
1172 	struct lpfc_hba *phba = vport->phba;
1173 	PRLI *npr;
1174 	IOCB_t *icmd;
1175 	struct lpfc_iocbq *elsiocb;
1176 	struct lpfc_sli_ring *pring;
1177 	struct lpfc_sli *psli;
1178 	uint8_t *pcmd;
1179 	uint16_t cmdsize;
1180 
1181 	psli = &phba->sli;
1182 	pring = &psli->ring[LPFC_ELS_RING];	/* ELS ring */
1183 
1184 	cmdsize = (sizeof(uint32_t) + sizeof(PRLI));
1185 	elsiocb = lpfc_prep_els_iocb(vport, 1, cmdsize, retry, ndlp,
1186 				     ndlp->nlp_DID, ELS_CMD_PRLI);
1187 	if (!elsiocb)
1188 		return 1;
1189 
1190 	icmd = &elsiocb->iocb;
1191 	pcmd = (uint8_t *) (((struct lpfc_dmabuf *) elsiocb->context2)->virt);
1192 
1193 	/* For PRLI request, remainder of payload is service parameters */
1194 	memset(pcmd, 0, (sizeof(PRLI) + sizeof(uint32_t)));
1195 	*((uint32_t *) (pcmd)) = ELS_CMD_PRLI;
1196 	pcmd += sizeof(uint32_t);
1197 
1198 	/* For PRLI, remainder of payload is PRLI parameter page */
1199 	npr = (PRLI *) pcmd;
1200 	/*
1201 	 * If our firmware version is 3.20 or later,
1202 	 * set the following bits for FC-TAPE support.
1203 	 */
1204 	if (phba->vpd.rev.feaLevelHigh >= 0x02) {
1205 		npr->ConfmComplAllowed = 1;
1206 		npr->Retry = 1;
1207 		npr->TaskRetryIdReq = 1;
1208 	}
1209 	npr->estabImagePair = 1;
1210 	npr->readXferRdyDis = 1;
1211 
1212 	/* For FCP support */
1213 	npr->prliType = PRLI_FCP_TYPE;
1214 	npr->initiatorFunc = 1;
1215 
1216 	lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_CMD,
1217 		"Issue PRLI:      did:x%x",
1218 		ndlp->nlp_DID, 0, 0);
1219 
1220 	phba->fc_stat.elsXmitPRLI++;
1221 	elsiocb->iocb_cmpl = lpfc_cmpl_els_prli;
1222 	spin_lock_irq(shost->host_lock);
1223 	ndlp->nlp_flag |= NLP_PRLI_SND;
1224 	spin_unlock_irq(shost->host_lock);
1225 	if (lpfc_sli_issue_iocb(phba, pring, elsiocb, 0) == IOCB_ERROR) {
1226 		spin_lock_irq(shost->host_lock);
1227 		ndlp->nlp_flag &= ~NLP_PRLI_SND;
1228 		spin_unlock_irq(shost->host_lock);
1229 		lpfc_els_free_iocb(phba, elsiocb);
1230 		return 1;
1231 	}
1232 	vport->fc_prli_sent++;
1233 	return 0;
1234 }
1235 
1236 void
1237 lpfc_more_adisc(struct lpfc_vport *vport)
1238 {
1239 	int sentadisc;
1240 
1241 	if (vport->num_disc_nodes)
1242 		vport->num_disc_nodes--;
1243 	/* Continue discovery with <num_disc_nodes> ADISCs to go */
1244 	lpfc_printf_vlog(vport, KERN_INFO, LOG_DISCOVERY,
1245 			 "0210 Continue discovery with %d ADISCs to go "
1246 			 "Data: x%x x%x x%x\n",
1247 			 vport->num_disc_nodes, vport->fc_adisc_cnt,
1248 			 vport->fc_flag, vport->port_state);
1249 	/* Check to see if there are more ADISCs to be sent */
1250 	if (vport->fc_flag & FC_NLP_MORE) {
1251 		lpfc_set_disctmo(vport);
1252 		/* go thru NPR nodes and issue any remaining ELS ADISCs */
1253 		sentadisc = lpfc_els_disc_adisc(vport);
1254 	}
1255 	return;
1256 }
1257 
1258 static void
1259 lpfc_rscn_disc(struct lpfc_vport *vport)
1260 {
1261 	lpfc_can_disctmo(vport);
1262 
1263 	/* RSCN discovery */
1264 	/* go thru NPR nodes and issue ELS PLOGIs */
1265 	if (vport->fc_npr_cnt)
1266 		if (lpfc_els_disc_plogi(vport))
1267 			return;
1268 
1269 	lpfc_end_rscn(vport);
1270 }
1271 
1272 static void
1273 lpfc_cmpl_els_adisc(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
1274 		    struct lpfc_iocbq *rspiocb)
1275 {
1276 	struct lpfc_vport *vport = cmdiocb->vport;
1277 	struct Scsi_Host  *shost = lpfc_shost_from_vport(vport);
1278 	IOCB_t *irsp;
1279 	struct lpfc_nodelist *ndlp;
1280 	int  disc;
1281 
1282 	/* we pass cmdiocb to state machine which needs rspiocb as well */
1283 	cmdiocb->context_un.rsp_iocb = rspiocb;
1284 
1285 	irsp = &(rspiocb->iocb);
1286 	ndlp = (struct lpfc_nodelist *) cmdiocb->context1;
1287 
1288 	lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_CMD,
1289 		"ADISC cmpl:      status:x%x/x%x did:x%x",
1290 		irsp->ulpStatus, irsp->un.ulpWord[4],
1291 		ndlp->nlp_DID);
1292 
1293 	/* Since ndlp can be freed in the disc state machine, note if this node
1294 	 * is being used during discovery.
1295 	 */
1296 	spin_lock_irq(shost->host_lock);
1297 	disc = (ndlp->nlp_flag & NLP_NPR_2B_DISC);
1298 	ndlp->nlp_flag &= ~(NLP_ADISC_SND | NLP_NPR_2B_DISC);
1299 	spin_unlock_irq(shost->host_lock);
1300 	/* ADISC completes to NPort <nlp_DID> */
1301 	lpfc_printf_vlog(vport, KERN_INFO, LOG_ELS,
1302 			 "0104 ADISC completes to NPort x%x "
1303 			 "Data: x%x x%x x%x x%x x%x\n",
1304 			 ndlp->nlp_DID, irsp->ulpStatus, irsp->un.ulpWord[4],
1305 			 irsp->ulpTimeout, disc, vport->num_disc_nodes);
1306 	/* Check to see if link went down during discovery */
1307 	if (lpfc_els_chk_latt(vport)) {
1308 		spin_lock_irq(shost->host_lock);
1309 		ndlp->nlp_flag |= NLP_NPR_2B_DISC;
1310 		spin_unlock_irq(shost->host_lock);
1311 		goto out;
1312 	}
1313 
1314 	if (irsp->ulpStatus) {
1315 		/* Check for retry */
1316 		if (lpfc_els_retry(phba, cmdiocb, rspiocb)) {
1317 			/* ELS command is being retried */
1318 			if (disc) {
1319 				spin_lock_irq(shost->host_lock);
1320 				ndlp->nlp_flag |= NLP_NPR_2B_DISC;
1321 				spin_unlock_irq(shost->host_lock);
1322 				lpfc_set_disctmo(vport);
1323 			}
1324 			goto out;
1325 		}
1326 		/* ADISC failed */
1327 		/* Do not call DSM for lpfc_els_abort'ed ELS cmds */
1328 		if (!lpfc_error_lost_link(irsp))
1329 			lpfc_disc_state_machine(vport, ndlp, cmdiocb,
1330 						NLP_EVT_CMPL_ADISC);
1331 	} else
1332 		/* Good status, call state machine */
1333 		lpfc_disc_state_machine(vport, ndlp, cmdiocb,
1334 					NLP_EVT_CMPL_ADISC);
1335 
1336 	if (disc && vport->num_disc_nodes) {
1337 		/* Check to see if there are more ADISCs to be sent */
1338 		lpfc_more_adisc(vport);
1339 
1340 		/* Check to see if we are done with ADISC authentication */
1341 		if (vport->num_disc_nodes == 0) {
1342 			/* If we get here, there is nothing left to ADISC */
1343 			/*
1344 			 * For NPIV, cmpl_reg_vpi will set port_state to READY,
1345 			 * and continue discovery.
1346 			 */
1347 			if ((phba->sli3_options & LPFC_SLI3_NPIV_ENABLED) &&
1348 			   !(vport->fc_flag & FC_RSCN_MODE)) {
1349 				lpfc_issue_reg_vpi(phba, vport);
1350 				goto out;
1351 			}
1352 			/*
1353 			 * For SLI2, we need to set port_state to READY
1354 			 * and continue discovery.
1355 			 */
1356 			if (vport->port_state < LPFC_VPORT_READY) {
1357 				/* If we get here, there is nothing to ADISC */
1358 				if (vport->port_type == LPFC_PHYSICAL_PORT)
1359 					lpfc_issue_clear_la(phba, vport);
1360 
1361 				if (!(vport->fc_flag & FC_ABORT_DISCOVERY)) {
1362 					vport->num_disc_nodes = 0;
1363 					/* go thru NPR list, issue ELS PLOGIs */
1364 					if (vport->fc_npr_cnt)
1365 						lpfc_els_disc_plogi(vport);
1366 
1367 					if (!vport->num_disc_nodes) {
1368 						spin_lock_irq(shost->host_lock);
1369 						vport->fc_flag &=
1370 							~FC_NDISC_ACTIVE;
1371 						spin_unlock_irq(
1372 							shost->host_lock);
1373 						lpfc_can_disctmo(vport);
1374 					}
1375 				}
1376 				vport->port_state = LPFC_VPORT_READY;
1377 			} else {
1378 				lpfc_rscn_disc(vport);
1379 			}
1380 		}
1381 	}
1382 out:
1383 	lpfc_els_free_iocb(phba, cmdiocb);
1384 	return;
1385 }
1386 
1387 int
1388 lpfc_issue_els_adisc(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
1389 		     uint8_t retry)
1390 {
1391 	struct Scsi_Host *shost = lpfc_shost_from_vport(vport);
1392 	struct lpfc_hba  *phba = vport->phba;
1393 	ADISC *ap;
1394 	IOCB_t *icmd;
1395 	struct lpfc_iocbq *elsiocb;
1396 	struct lpfc_sli *psli = &phba->sli;
1397 	struct lpfc_sli_ring *pring = &psli->ring[LPFC_ELS_RING];
1398 	uint8_t *pcmd;
1399 	uint16_t cmdsize;
1400 
1401 	cmdsize = (sizeof(uint32_t) + sizeof(ADISC));
1402 	elsiocb = lpfc_prep_els_iocb(vport, 1, cmdsize, retry, ndlp,
1403 				     ndlp->nlp_DID, ELS_CMD_ADISC);
1404 	if (!elsiocb)
1405 		return 1;
1406 
1407 	icmd = &elsiocb->iocb;
1408 	pcmd = (uint8_t *) (((struct lpfc_dmabuf *) elsiocb->context2)->virt);
1409 
1410 	/* For ADISC request, remainder of payload is service parameters */
1411 	*((uint32_t *) (pcmd)) = ELS_CMD_ADISC;
1412 	pcmd += sizeof(uint32_t);
1413 
1414 	/* Fill in ADISC payload */
1415 	ap = (ADISC *) pcmd;
1416 	ap->hardAL_PA = phba->fc_pref_ALPA;
1417 	memcpy(&ap->portName, &vport->fc_portname, sizeof(struct lpfc_name));
1418 	memcpy(&ap->nodeName, &vport->fc_nodename, sizeof(struct lpfc_name));
1419 	ap->DID = be32_to_cpu(vport->fc_myDID);
1420 
1421 	lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_CMD,
1422 		"Issue ADISC:     did:x%x",
1423 		ndlp->nlp_DID, 0, 0);
1424 
1425 	phba->fc_stat.elsXmitADISC++;
1426 	elsiocb->iocb_cmpl = lpfc_cmpl_els_adisc;
1427 	spin_lock_irq(shost->host_lock);
1428 	ndlp->nlp_flag |= NLP_ADISC_SND;
1429 	spin_unlock_irq(shost->host_lock);
1430 	if (lpfc_sli_issue_iocb(phba, pring, elsiocb, 0) == IOCB_ERROR) {
1431 		spin_lock_irq(shost->host_lock);
1432 		ndlp->nlp_flag &= ~NLP_ADISC_SND;
1433 		spin_unlock_irq(shost->host_lock);
1434 		lpfc_els_free_iocb(phba, elsiocb);
1435 		return 1;
1436 	}
1437 	return 0;
1438 }
1439 
1440 static void
1441 lpfc_cmpl_els_logo(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
1442 		   struct lpfc_iocbq *rspiocb)
1443 {
1444 	struct lpfc_nodelist *ndlp = (struct lpfc_nodelist *) cmdiocb->context1;
1445 	struct lpfc_vport *vport = ndlp->vport;
1446 	struct Scsi_Host  *shost = lpfc_shost_from_vport(vport);
1447 	IOCB_t *irsp;
1448 	struct lpfc_sli *psli;
1449 
1450 	psli = &phba->sli;
1451 	/* we pass cmdiocb to state machine which needs rspiocb as well */
1452 	cmdiocb->context_un.rsp_iocb = rspiocb;
1453 
1454 	irsp = &(rspiocb->iocb);
1455 	spin_lock_irq(shost->host_lock);
1456 	ndlp->nlp_flag &= ~NLP_LOGO_SND;
1457 	spin_unlock_irq(shost->host_lock);
1458 
1459 	lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_CMD,
1460 		"LOGO cmpl:       status:x%x/x%x did:x%x",
1461 		irsp->ulpStatus, irsp->un.ulpWord[4],
1462 		ndlp->nlp_DID);
1463 	/* LOGO completes to NPort <nlp_DID> */
1464 	lpfc_printf_vlog(vport, KERN_INFO, LOG_ELS,
1465 			 "0105 LOGO completes to NPort x%x "
1466 			 "Data: x%x x%x x%x x%x\n",
1467 			 ndlp->nlp_DID, irsp->ulpStatus, irsp->un.ulpWord[4],
1468 			 irsp->ulpTimeout, vport->num_disc_nodes);
1469 	/* Check to see if link went down during discovery */
1470 	if (lpfc_els_chk_latt(vport))
1471 		goto out;
1472 
1473 	if (ndlp->nlp_flag & NLP_TARGET_REMOVE) {
1474 	        /* NLP_EVT_DEVICE_RM should unregister the RPI
1475 		 * which should abort all outstanding IOs.
1476 		 */
1477 		lpfc_disc_state_machine(vport, ndlp, cmdiocb,
1478 					NLP_EVT_DEVICE_RM);
1479 		goto out;
1480 	}
1481 
1482 	if (irsp->ulpStatus) {
1483 		/* Check for retry */
1484 		if (lpfc_els_retry(phba, cmdiocb, rspiocb))
1485 			/* ELS command is being retried */
1486 			goto out;
1487 		/* LOGO failed */
1488 		/* Do not call DSM for lpfc_els_abort'ed ELS cmds */
1489 		if (lpfc_error_lost_link(irsp))
1490 			goto out;
1491 		else
1492 			lpfc_disc_state_machine(vport, ndlp, cmdiocb,
1493 						NLP_EVT_CMPL_LOGO);
1494 	} else
1495 		/* Good status, call state machine.
1496 		 * This will unregister the rpi if needed.
1497 		 */
1498 		lpfc_disc_state_machine(vport, ndlp, cmdiocb,
1499 					NLP_EVT_CMPL_LOGO);
1500 out:
1501 	lpfc_els_free_iocb(phba, cmdiocb);
1502 	return;
1503 }
1504 
1505 int
1506 lpfc_issue_els_logo(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
1507 		    uint8_t retry)
1508 {
1509 	struct Scsi_Host *shost = lpfc_shost_from_vport(vport);
1510 	struct lpfc_hba  *phba = vport->phba;
1511 	IOCB_t *icmd;
1512 	struct lpfc_iocbq *elsiocb;
1513 	struct lpfc_sli_ring *pring;
1514 	struct lpfc_sli *psli;
1515 	uint8_t *pcmd;
1516 	uint16_t cmdsize;
1517 	int rc;
1518 
1519 	psli = &phba->sli;
1520 	pring = &psli->ring[LPFC_ELS_RING];
1521 
1522 	spin_lock_irq(shost->host_lock);
1523 	if (ndlp->nlp_flag & NLP_LOGO_SND) {
1524 		spin_unlock_irq(shost->host_lock);
1525 		return 0;
1526 	}
1527 	spin_unlock_irq(shost->host_lock);
1528 
1529 	cmdsize = (2 * sizeof(uint32_t)) + sizeof(struct lpfc_name);
1530 	elsiocb = lpfc_prep_els_iocb(vport, 1, cmdsize, retry, ndlp,
1531 				     ndlp->nlp_DID, ELS_CMD_LOGO);
1532 	if (!elsiocb)
1533 		return 1;
1534 
1535 	icmd = &elsiocb->iocb;
1536 	pcmd = (uint8_t *) (((struct lpfc_dmabuf *) elsiocb->context2)->virt);
1537 	*((uint32_t *) (pcmd)) = ELS_CMD_LOGO;
1538 	pcmd += sizeof(uint32_t);
1539 
1540 	/* Fill in LOGO payload */
1541 	*((uint32_t *) (pcmd)) = be32_to_cpu(vport->fc_myDID);
1542 	pcmd += sizeof(uint32_t);
1543 	memcpy(pcmd, &vport->fc_portname, sizeof(struct lpfc_name));
1544 
1545 	lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_CMD,
1546 		"Issue LOGO:      did:x%x",
1547 		ndlp->nlp_DID, 0, 0);
1548 
1549 	phba->fc_stat.elsXmitLOGO++;
1550 	elsiocb->iocb_cmpl = lpfc_cmpl_els_logo;
1551 	spin_lock_irq(shost->host_lock);
1552 	ndlp->nlp_flag |= NLP_LOGO_SND;
1553 	spin_unlock_irq(shost->host_lock);
1554 	rc = lpfc_sli_issue_iocb(phba, pring, elsiocb, 0);
1555 
1556 	if (rc == IOCB_ERROR) {
1557 		spin_lock_irq(shost->host_lock);
1558 		ndlp->nlp_flag &= ~NLP_LOGO_SND;
1559 		spin_unlock_irq(shost->host_lock);
1560 		lpfc_els_free_iocb(phba, elsiocb);
1561 		return 1;
1562 	}
1563 	return 0;
1564 }
1565 
1566 static void
1567 lpfc_cmpl_els_cmd(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
1568 		  struct lpfc_iocbq *rspiocb)
1569 {
1570 	struct lpfc_vport *vport = cmdiocb->vport;
1571 	IOCB_t *irsp;
1572 
1573 	irsp = &rspiocb->iocb;
1574 
1575 	lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_CMD,
1576 		"ELS cmd cmpl:    status:x%x/x%x did:x%x",
1577 		irsp->ulpStatus, irsp->un.ulpWord[4],
1578 		irsp->un.elsreq64.remoteID);
1579 	/* ELS cmd tag <ulpIoTag> completes */
1580 	lpfc_printf_vlog(vport, KERN_INFO, LOG_ELS,
1581 			 "0106 ELS cmd tag x%x completes Data: x%x x%x x%x\n",
1582 			 irsp->ulpIoTag, irsp->ulpStatus,
1583 			 irsp->un.ulpWord[4], irsp->ulpTimeout);
1584 	/* Check to see if link went down during discovery */
1585 	lpfc_els_chk_latt(vport);
1586 	lpfc_els_free_iocb(phba, cmdiocb);
1587 	return;
1588 }
1589 
1590 int
1591 lpfc_issue_els_scr(struct lpfc_vport *vport, uint32_t nportid, uint8_t retry)
1592 {
1593 	struct lpfc_hba  *phba = vport->phba;
1594 	IOCB_t *icmd;
1595 	struct lpfc_iocbq *elsiocb;
1596 	struct lpfc_sli_ring *pring;
1597 	struct lpfc_sli *psli;
1598 	uint8_t *pcmd;
1599 	uint16_t cmdsize;
1600 	struct lpfc_nodelist *ndlp;
1601 
1602 	psli = &phba->sli;
1603 	pring = &psli->ring[LPFC_ELS_RING];	/* ELS ring */
1604 	cmdsize = (sizeof(uint32_t) + sizeof(SCR));
1605 
1606 	ndlp = lpfc_findnode_did(vport, nportid);
1607 	if (!ndlp) {
1608 		ndlp = mempool_alloc(phba->nlp_mem_pool, GFP_KERNEL);
1609 		if (!ndlp)
1610 			return 1;
1611 		lpfc_nlp_init(vport, ndlp, nportid);
1612 		lpfc_enqueue_node(vport, ndlp);
1613 	} else if (!NLP_CHK_NODE_ACT(ndlp)) {
1614 		ndlp = lpfc_enable_node(vport, ndlp, NLP_STE_UNUSED_NODE);
1615 		if (!ndlp)
1616 			return 1;
1617 	}
1618 
1619 	elsiocb = lpfc_prep_els_iocb(vport, 1, cmdsize, retry, ndlp,
1620 				     ndlp->nlp_DID, ELS_CMD_SCR);
1621 
1622 	if (!elsiocb) {
1623 		/* This will trigger the release of the node just
1624 		 * allocated
1625 		 */
1626 		lpfc_nlp_put(ndlp);
1627 		return 1;
1628 	}
1629 
1630 	icmd = &elsiocb->iocb;
1631 	pcmd = (uint8_t *) (((struct lpfc_dmabuf *) elsiocb->context2)->virt);
1632 
1633 	*((uint32_t *) (pcmd)) = ELS_CMD_SCR;
1634 	pcmd += sizeof(uint32_t);
1635 
1636 	/* For SCR, remainder of payload is SCR parameter page */
1637 	memset(pcmd, 0, sizeof(SCR));
1638 	((SCR *) pcmd)->Function = SCR_FUNC_FULL;
1639 
1640 	lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_CMD,
1641 		"Issue SCR:       did:x%x",
1642 		ndlp->nlp_DID, 0, 0);
1643 
1644 	phba->fc_stat.elsXmitSCR++;
1645 	elsiocb->iocb_cmpl = lpfc_cmpl_els_cmd;
1646 	if (lpfc_sli_issue_iocb(phba, pring, elsiocb, 0) == IOCB_ERROR) {
1647 		/* The additional lpfc_nlp_put will cause the following
1648 		 * lpfc_els_free_iocb routine to trigger the rlease of
1649 		 * the node.
1650 		 */
1651 		lpfc_nlp_put(ndlp);
1652 		lpfc_els_free_iocb(phba, elsiocb);
1653 		return 1;
1654 	}
1655 	/* This will cause the callback-function lpfc_cmpl_els_cmd to
1656 	 * trigger the release of node.
1657 	 */
1658 	lpfc_nlp_put(ndlp);
1659 	return 0;
1660 }
1661 
1662 static int
1663 lpfc_issue_els_farpr(struct lpfc_vport *vport, uint32_t nportid, uint8_t retry)
1664 {
1665 	struct lpfc_hba  *phba = vport->phba;
1666 	IOCB_t *icmd;
1667 	struct lpfc_iocbq *elsiocb;
1668 	struct lpfc_sli_ring *pring;
1669 	struct lpfc_sli *psli;
1670 	FARP *fp;
1671 	uint8_t *pcmd;
1672 	uint32_t *lp;
1673 	uint16_t cmdsize;
1674 	struct lpfc_nodelist *ondlp;
1675 	struct lpfc_nodelist *ndlp;
1676 
1677 	psli = &phba->sli;
1678 	pring = &psli->ring[LPFC_ELS_RING];	/* ELS ring */
1679 	cmdsize = (sizeof(uint32_t) + sizeof(FARP));
1680 
1681 	ndlp = lpfc_findnode_did(vport, nportid);
1682 	if (!ndlp) {
1683 		ndlp = mempool_alloc(phba->nlp_mem_pool, GFP_KERNEL);
1684 		if (!ndlp)
1685 			return 1;
1686 		lpfc_nlp_init(vport, ndlp, nportid);
1687 		lpfc_enqueue_node(vport, ndlp);
1688 	} else if (!NLP_CHK_NODE_ACT(ndlp)) {
1689 		ndlp = lpfc_enable_node(vport, ndlp, NLP_STE_UNUSED_NODE);
1690 		if (!ndlp)
1691 			return 1;
1692 	}
1693 
1694 	elsiocb = lpfc_prep_els_iocb(vport, 1, cmdsize, retry, ndlp,
1695 				     ndlp->nlp_DID, ELS_CMD_RNID);
1696 	if (!elsiocb) {
1697 		/* This will trigger the release of the node just
1698 		 * allocated
1699 		 */
1700 		lpfc_nlp_put(ndlp);
1701 		return 1;
1702 	}
1703 
1704 	icmd = &elsiocb->iocb;
1705 	pcmd = (uint8_t *) (((struct lpfc_dmabuf *) elsiocb->context2)->virt);
1706 
1707 	*((uint32_t *) (pcmd)) = ELS_CMD_FARPR;
1708 	pcmd += sizeof(uint32_t);
1709 
1710 	/* Fill in FARPR payload */
1711 	fp = (FARP *) (pcmd);
1712 	memset(fp, 0, sizeof(FARP));
1713 	lp = (uint32_t *) pcmd;
1714 	*lp++ = be32_to_cpu(nportid);
1715 	*lp++ = be32_to_cpu(vport->fc_myDID);
1716 	fp->Rflags = 0;
1717 	fp->Mflags = (FARP_MATCH_PORT | FARP_MATCH_NODE);
1718 
1719 	memcpy(&fp->RportName, &vport->fc_portname, sizeof(struct lpfc_name));
1720 	memcpy(&fp->RnodeName, &vport->fc_nodename, sizeof(struct lpfc_name));
1721 	ondlp = lpfc_findnode_did(vport, nportid);
1722 	if (ondlp && NLP_CHK_NODE_ACT(ondlp)) {
1723 		memcpy(&fp->OportName, &ondlp->nlp_portname,
1724 		       sizeof(struct lpfc_name));
1725 		memcpy(&fp->OnodeName, &ondlp->nlp_nodename,
1726 		       sizeof(struct lpfc_name));
1727 	}
1728 
1729 	lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_CMD,
1730 		"Issue FARPR:     did:x%x",
1731 		ndlp->nlp_DID, 0, 0);
1732 
1733 	phba->fc_stat.elsXmitFARPR++;
1734 	elsiocb->iocb_cmpl = lpfc_cmpl_els_cmd;
1735 	if (lpfc_sli_issue_iocb(phba, pring, elsiocb, 0) == IOCB_ERROR) {
1736 		/* The additional lpfc_nlp_put will cause the following
1737 		 * lpfc_els_free_iocb routine to trigger the release of
1738 		 * the node.
1739 		 */
1740 		lpfc_nlp_put(ndlp);
1741 		lpfc_els_free_iocb(phba, elsiocb);
1742 		return 1;
1743 	}
1744 	/* This will cause the callback-function lpfc_cmpl_els_cmd to
1745 	 * trigger the release of the node.
1746 	 */
1747 	lpfc_nlp_put(ndlp);
1748 	return 0;
1749 }
1750 
1751 void
1752 lpfc_cancel_retry_delay_tmo(struct lpfc_vport *vport, struct lpfc_nodelist *nlp)
1753 {
1754 	struct Scsi_Host *shost = lpfc_shost_from_vport(vport);
1755 	struct lpfc_work_evt *evtp;
1756 
1757 	if (!(nlp->nlp_flag & NLP_DELAY_TMO))
1758 		return;
1759 	spin_lock_irq(shost->host_lock);
1760 	nlp->nlp_flag &= ~NLP_DELAY_TMO;
1761 	spin_unlock_irq(shost->host_lock);
1762 	del_timer_sync(&nlp->nlp_delayfunc);
1763 	nlp->nlp_last_elscmd = 0;
1764 	if (!list_empty(&nlp->els_retry_evt.evt_listp)) {
1765 		list_del_init(&nlp->els_retry_evt.evt_listp);
1766 		/* Decrement nlp reference count held for the delayed retry */
1767 		evtp = &nlp->els_retry_evt;
1768 		lpfc_nlp_put((struct lpfc_nodelist *)evtp->evt_arg1);
1769 	}
1770 	if (nlp->nlp_flag & NLP_NPR_2B_DISC) {
1771 		spin_lock_irq(shost->host_lock);
1772 		nlp->nlp_flag &= ~NLP_NPR_2B_DISC;
1773 		spin_unlock_irq(shost->host_lock);
1774 		if (vport->num_disc_nodes) {
1775 			if (vport->port_state < LPFC_VPORT_READY) {
1776 				/* Check if there are more ADISCs to be sent */
1777 				lpfc_more_adisc(vport);
1778 				if ((vport->num_disc_nodes == 0) &&
1779 				    (vport->fc_npr_cnt))
1780 					lpfc_els_disc_plogi(vport);
1781 			} else {
1782 				/* Check if there are more PLOGIs to be sent */
1783 				lpfc_more_plogi(vport);
1784 			}
1785 			if (vport->num_disc_nodes == 0) {
1786 				spin_lock_irq(shost->host_lock);
1787 				vport->fc_flag &= ~FC_NDISC_ACTIVE;
1788 				spin_unlock_irq(shost->host_lock);
1789 				lpfc_can_disctmo(vport);
1790 				lpfc_end_rscn(vport);
1791 			}
1792 		}
1793 	}
1794 	return;
1795 }
1796 
1797 void
1798 lpfc_els_retry_delay(unsigned long ptr)
1799 {
1800 	struct lpfc_nodelist *ndlp = (struct lpfc_nodelist *) ptr;
1801 	struct lpfc_vport *vport = ndlp->vport;
1802 	struct lpfc_hba   *phba = vport->phba;
1803 	unsigned long flags;
1804 	struct lpfc_work_evt  *evtp = &ndlp->els_retry_evt;
1805 
1806 	spin_lock_irqsave(&phba->hbalock, flags);
1807 	if (!list_empty(&evtp->evt_listp)) {
1808 		spin_unlock_irqrestore(&phba->hbalock, flags);
1809 		return;
1810 	}
1811 
1812 	/* We need to hold the node by incrementing the reference
1813 	 * count until the queued work is done
1814 	 */
1815 	evtp->evt_arg1  = lpfc_nlp_get(ndlp);
1816 	if (evtp->evt_arg1) {
1817 		evtp->evt = LPFC_EVT_ELS_RETRY;
1818 		list_add_tail(&evtp->evt_listp, &phba->work_list);
1819 		lpfc_worker_wake_up(phba);
1820 	}
1821 	spin_unlock_irqrestore(&phba->hbalock, flags);
1822 	return;
1823 }
1824 
1825 void
1826 lpfc_els_retry_delay_handler(struct lpfc_nodelist *ndlp)
1827 {
1828 	struct lpfc_vport *vport = ndlp->vport;
1829 	struct Scsi_Host  *shost = lpfc_shost_from_vport(vport);
1830 	uint32_t cmd, did, retry;
1831 
1832 	spin_lock_irq(shost->host_lock);
1833 	did = ndlp->nlp_DID;
1834 	cmd = ndlp->nlp_last_elscmd;
1835 	ndlp->nlp_last_elscmd = 0;
1836 
1837 	if (!(ndlp->nlp_flag & NLP_DELAY_TMO)) {
1838 		spin_unlock_irq(shost->host_lock);
1839 		return;
1840 	}
1841 
1842 	ndlp->nlp_flag &= ~NLP_DELAY_TMO;
1843 	spin_unlock_irq(shost->host_lock);
1844 	/*
1845 	 * If a discovery event readded nlp_delayfunc after timer
1846 	 * firing and before processing the timer, cancel the
1847 	 * nlp_delayfunc.
1848 	 */
1849 	del_timer_sync(&ndlp->nlp_delayfunc);
1850 	retry = ndlp->nlp_retry;
1851 
1852 	switch (cmd) {
1853 	case ELS_CMD_FLOGI:
1854 		lpfc_issue_els_flogi(vport, ndlp, retry);
1855 		break;
1856 	case ELS_CMD_PLOGI:
1857 		if (!lpfc_issue_els_plogi(vport, ndlp->nlp_DID, retry)) {
1858 			ndlp->nlp_prev_state = ndlp->nlp_state;
1859 			lpfc_nlp_set_state(vport, ndlp, NLP_STE_PLOGI_ISSUE);
1860 		}
1861 		break;
1862 	case ELS_CMD_ADISC:
1863 		if (!lpfc_issue_els_adisc(vport, ndlp, retry)) {
1864 			ndlp->nlp_prev_state = ndlp->nlp_state;
1865 			lpfc_nlp_set_state(vport, ndlp, NLP_STE_ADISC_ISSUE);
1866 		}
1867 		break;
1868 	case ELS_CMD_PRLI:
1869 		if (!lpfc_issue_els_prli(vport, ndlp, retry)) {
1870 			ndlp->nlp_prev_state = ndlp->nlp_state;
1871 			lpfc_nlp_set_state(vport, ndlp, NLP_STE_PRLI_ISSUE);
1872 		}
1873 		break;
1874 	case ELS_CMD_LOGO:
1875 		if (!lpfc_issue_els_logo(vport, ndlp, retry)) {
1876 			ndlp->nlp_prev_state = ndlp->nlp_state;
1877 			lpfc_nlp_set_state(vport, ndlp, NLP_STE_NPR_NODE);
1878 		}
1879 		break;
1880 	case ELS_CMD_FDISC:
1881 		lpfc_issue_els_fdisc(vport, ndlp, retry);
1882 		break;
1883 	}
1884 	return;
1885 }
1886 
1887 static int
1888 lpfc_els_retry(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
1889 	       struct lpfc_iocbq *rspiocb)
1890 {
1891 	struct lpfc_vport *vport = cmdiocb->vport;
1892 	struct Scsi_Host  *shost = lpfc_shost_from_vport(vport);
1893 	IOCB_t *irsp = &rspiocb->iocb;
1894 	struct lpfc_nodelist *ndlp = (struct lpfc_nodelist *) cmdiocb->context1;
1895 	struct lpfc_dmabuf *pcmd = (struct lpfc_dmabuf *) cmdiocb->context2;
1896 	uint32_t *elscmd;
1897 	struct ls_rjt stat;
1898 	int retry = 0, maxretry = lpfc_max_els_tries, delay = 0;
1899 	int logerr = 0;
1900 	uint32_t cmd = 0;
1901 	uint32_t did;
1902 
1903 
1904 	/* Note: context2 may be 0 for internal driver abort
1905 	 * of delays ELS command.
1906 	 */
1907 
1908 	if (pcmd && pcmd->virt) {
1909 		elscmd = (uint32_t *) (pcmd->virt);
1910 		cmd = *elscmd++;
1911 	}
1912 
1913 	if (ndlp && NLP_CHK_NODE_ACT(ndlp))
1914 		did = ndlp->nlp_DID;
1915 	else {
1916 		/* We should only hit this case for retrying PLOGI */
1917 		did = irsp->un.elsreq64.remoteID;
1918 		ndlp = lpfc_findnode_did(vport, did);
1919 		if ((!ndlp || !NLP_CHK_NODE_ACT(ndlp))
1920 		    && (cmd != ELS_CMD_PLOGI))
1921 			return 1;
1922 	}
1923 
1924 	lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_CMD,
1925 		"Retry ELS:       wd7:x%x wd4:x%x did:x%x",
1926 		*(((uint32_t *) irsp) + 7), irsp->un.ulpWord[4], ndlp->nlp_DID);
1927 
1928 	switch (irsp->ulpStatus) {
1929 	case IOSTAT_FCP_RSP_ERROR:
1930 	case IOSTAT_REMOTE_STOP:
1931 		break;
1932 
1933 	case IOSTAT_LOCAL_REJECT:
1934 		switch ((irsp->un.ulpWord[4] & 0xff)) {
1935 		case IOERR_LOOP_OPEN_FAILURE:
1936 			if (cmd == ELS_CMD_PLOGI && cmdiocb->retry == 0)
1937 				delay = 1000;
1938 			retry = 1;
1939 			break;
1940 
1941 		case IOERR_ILLEGAL_COMMAND:
1942 			lpfc_printf_vlog(vport, KERN_ERR, LOG_ELS,
1943 					 "0124 Retry illegal cmd x%x "
1944 					 "retry:x%x delay:x%x\n",
1945 					 cmd, cmdiocb->retry, delay);
1946 			retry = 1;
1947 			/* All command's retry policy */
1948 			maxretry = 8;
1949 			if (cmdiocb->retry > 2)
1950 				delay = 1000;
1951 			break;
1952 
1953 		case IOERR_NO_RESOURCES:
1954 			logerr = 1; /* HBA out of resources */
1955 			retry = 1;
1956 			if (cmdiocb->retry > 100)
1957 				delay = 100;
1958 			maxretry = 250;
1959 			break;
1960 
1961 		case IOERR_ILLEGAL_FRAME:
1962 			delay = 100;
1963 			retry = 1;
1964 			break;
1965 
1966 		case IOERR_SEQUENCE_TIMEOUT:
1967 		case IOERR_INVALID_RPI:
1968 			retry = 1;
1969 			break;
1970 		}
1971 		break;
1972 
1973 	case IOSTAT_NPORT_RJT:
1974 	case IOSTAT_FABRIC_RJT:
1975 		if (irsp->un.ulpWord[4] & RJT_UNAVAIL_TEMP) {
1976 			retry = 1;
1977 			break;
1978 		}
1979 		break;
1980 
1981 	case IOSTAT_NPORT_BSY:
1982 	case IOSTAT_FABRIC_BSY:
1983 		logerr = 1; /* Fabric / Remote NPort out of resources */
1984 		retry = 1;
1985 		break;
1986 
1987 	case IOSTAT_LS_RJT:
1988 		stat.un.lsRjtError = be32_to_cpu(irsp->un.ulpWord[4]);
1989 		/* Added for Vendor specifc support
1990 		 * Just keep retrying for these Rsn / Exp codes
1991 		 */
1992 		switch (stat.un.b.lsRjtRsnCode) {
1993 		case LSRJT_UNABLE_TPC:
1994 			if (stat.un.b.lsRjtRsnCodeExp ==
1995 			    LSEXP_CMD_IN_PROGRESS) {
1996 				if (cmd == ELS_CMD_PLOGI) {
1997 					delay = 1000;
1998 					maxretry = 48;
1999 				}
2000 				retry = 1;
2001 				break;
2002 			}
2003 			if (cmd == ELS_CMD_PLOGI) {
2004 				delay = 1000;
2005 				maxretry = lpfc_max_els_tries + 1;
2006 				retry = 1;
2007 				break;
2008 			}
2009 			if ((phba->sli3_options & LPFC_SLI3_NPIV_ENABLED) &&
2010 			  (cmd == ELS_CMD_FDISC) &&
2011 			  (stat.un.b.lsRjtRsnCodeExp == LSEXP_OUT_OF_RESOURCE)){
2012 				lpfc_printf_vlog(vport, KERN_ERR, LOG_ELS,
2013 						 "0125 FDISC Failed (x%x). "
2014 						 "Fabric out of resources\n",
2015 						 stat.un.lsRjtError);
2016 				lpfc_vport_set_state(vport,
2017 						     FC_VPORT_NO_FABRIC_RSCS);
2018 			}
2019 			break;
2020 
2021 		case LSRJT_LOGICAL_BSY:
2022 			if ((cmd == ELS_CMD_PLOGI) ||
2023 			    (cmd == ELS_CMD_PRLI)) {
2024 				delay = 1000;
2025 				maxretry = 48;
2026 			} else if (cmd == ELS_CMD_FDISC) {
2027 				/* FDISC retry policy */
2028 				maxretry = 48;
2029 				if (cmdiocb->retry >= 32)
2030 					delay = 1000;
2031 			}
2032 			retry = 1;
2033 			break;
2034 
2035 		case LSRJT_LOGICAL_ERR:
2036 			/* There are some cases where switches return this
2037 			 * error when they are not ready and should be returning
2038 			 * Logical Busy. We should delay every time.
2039 			 */
2040 			if (cmd == ELS_CMD_FDISC &&
2041 			    stat.un.b.lsRjtRsnCodeExp == LSEXP_PORT_LOGIN_REQ) {
2042 				maxretry = 3;
2043 				delay = 1000;
2044 				retry = 1;
2045 				break;
2046 			}
2047 		case LSRJT_PROTOCOL_ERR:
2048 			if ((phba->sli3_options & LPFC_SLI3_NPIV_ENABLED) &&
2049 			  (cmd == ELS_CMD_FDISC) &&
2050 			  ((stat.un.b.lsRjtRsnCodeExp == LSEXP_INVALID_PNAME) ||
2051 			  (stat.un.b.lsRjtRsnCodeExp == LSEXP_INVALID_NPORT_ID))
2052 			  ) {
2053 				lpfc_printf_vlog(vport, KERN_ERR, LOG_ELS,
2054 						 "0123 FDISC Failed (x%x). "
2055 						 "Fabric Detected Bad WWN\n",
2056 						 stat.un.lsRjtError);
2057 				lpfc_vport_set_state(vport,
2058 						     FC_VPORT_FABRIC_REJ_WWN);
2059 			}
2060 			break;
2061 		}
2062 		break;
2063 
2064 	case IOSTAT_INTERMED_RSP:
2065 	case IOSTAT_BA_RJT:
2066 		break;
2067 
2068 	default:
2069 		break;
2070 	}
2071 
2072 	if (did == FDMI_DID)
2073 		retry = 1;
2074 
2075 	if ((cmd == ELS_CMD_FLOGI) &&
2076 	    (phba->fc_topology != TOPOLOGY_LOOP) &&
2077 	    !lpfc_error_lost_link(irsp)) {
2078 		/* FLOGI retry policy */
2079 		retry = 1;
2080 		maxretry = 48;
2081 		if (cmdiocb->retry >= 32)
2082 			delay = 1000;
2083 	}
2084 
2085 	if ((++cmdiocb->retry) >= maxretry) {
2086 		phba->fc_stat.elsRetryExceeded++;
2087 		retry = 0;
2088 	}
2089 
2090 	if ((vport->load_flag & FC_UNLOADING) != 0)
2091 		retry = 0;
2092 
2093 	if (retry) {
2094 
2095 		/* Retry ELS command <elsCmd> to remote NPORT <did> */
2096 		lpfc_printf_vlog(vport, KERN_INFO, LOG_ELS,
2097 				 "0107 Retry ELS command x%x to remote "
2098 				 "NPORT x%x Data: x%x x%x\n",
2099 				 cmd, did, cmdiocb->retry, delay);
2100 
2101 		if (((cmd == ELS_CMD_PLOGI) || (cmd == ELS_CMD_ADISC)) &&
2102 			((irsp->ulpStatus != IOSTAT_LOCAL_REJECT) ||
2103 			((irsp->un.ulpWord[4] & 0xff) != IOERR_NO_RESOURCES))) {
2104 			/* Don't reset timer for no resources */
2105 
2106 			/* If discovery / RSCN timer is running, reset it */
2107 			if (timer_pending(&vport->fc_disctmo) ||
2108 			    (vport->fc_flag & FC_RSCN_MODE))
2109 				lpfc_set_disctmo(vport);
2110 		}
2111 
2112 		phba->fc_stat.elsXmitRetry++;
2113 		if (ndlp && NLP_CHK_NODE_ACT(ndlp) && delay) {
2114 			phba->fc_stat.elsDelayRetry++;
2115 			ndlp->nlp_retry = cmdiocb->retry;
2116 
2117 			/* delay is specified in milliseconds */
2118 			mod_timer(&ndlp->nlp_delayfunc,
2119 				jiffies + msecs_to_jiffies(delay));
2120 			spin_lock_irq(shost->host_lock);
2121 			ndlp->nlp_flag |= NLP_DELAY_TMO;
2122 			spin_unlock_irq(shost->host_lock);
2123 
2124 			ndlp->nlp_prev_state = ndlp->nlp_state;
2125 			if (cmd == ELS_CMD_PRLI)
2126 				lpfc_nlp_set_state(vport, ndlp,
2127 					NLP_STE_REG_LOGIN_ISSUE);
2128 			else
2129 				lpfc_nlp_set_state(vport, ndlp,
2130 					NLP_STE_NPR_NODE);
2131 			ndlp->nlp_last_elscmd = cmd;
2132 
2133 			return 1;
2134 		}
2135 		switch (cmd) {
2136 		case ELS_CMD_FLOGI:
2137 			lpfc_issue_els_flogi(vport, ndlp, cmdiocb->retry);
2138 			return 1;
2139 		case ELS_CMD_FDISC:
2140 			lpfc_issue_els_fdisc(vport, ndlp, cmdiocb->retry);
2141 			return 1;
2142 		case ELS_CMD_PLOGI:
2143 			if (ndlp && NLP_CHK_NODE_ACT(ndlp)) {
2144 				ndlp->nlp_prev_state = ndlp->nlp_state;
2145 				lpfc_nlp_set_state(vport, ndlp,
2146 						   NLP_STE_PLOGI_ISSUE);
2147 			}
2148 			lpfc_issue_els_plogi(vport, did, cmdiocb->retry);
2149 			return 1;
2150 		case ELS_CMD_ADISC:
2151 			ndlp->nlp_prev_state = ndlp->nlp_state;
2152 			lpfc_nlp_set_state(vport, ndlp, NLP_STE_ADISC_ISSUE);
2153 			lpfc_issue_els_adisc(vport, ndlp, cmdiocb->retry);
2154 			return 1;
2155 		case ELS_CMD_PRLI:
2156 			ndlp->nlp_prev_state = ndlp->nlp_state;
2157 			lpfc_nlp_set_state(vport, ndlp, NLP_STE_PRLI_ISSUE);
2158 			lpfc_issue_els_prli(vport, ndlp, cmdiocb->retry);
2159 			return 1;
2160 		case ELS_CMD_LOGO:
2161 			ndlp->nlp_prev_state = ndlp->nlp_state;
2162 			lpfc_nlp_set_state(vport, ndlp, NLP_STE_NPR_NODE);
2163 			lpfc_issue_els_logo(vport, ndlp, cmdiocb->retry);
2164 			return 1;
2165 		}
2166 	}
2167 	/* No retry ELS command <elsCmd> to remote NPORT <did> */
2168 	if (logerr) {
2169 		lpfc_printf_vlog(vport, KERN_ERR, LOG_ELS,
2170 			 "0137 No retry ELS command x%x to remote "
2171 			 "NPORT x%x: Out of Resources: Error:x%x/%x\n",
2172 			 cmd, did, irsp->ulpStatus,
2173 			 irsp->un.ulpWord[4]);
2174 	}
2175 	else {
2176 		lpfc_printf_vlog(vport, KERN_INFO, LOG_ELS,
2177 			 "0108 No retry ELS command x%x to remote "
2178 			 "NPORT x%x Retried:%d Error:x%x/%x\n",
2179 			 cmd, did, cmdiocb->retry, irsp->ulpStatus,
2180 			 irsp->un.ulpWord[4]);
2181 	}
2182 	return 0;
2183 }
2184 
2185 static int
2186 lpfc_els_free_data(struct lpfc_hba *phba, struct lpfc_dmabuf *buf_ptr1)
2187 {
2188 	struct lpfc_dmabuf *buf_ptr;
2189 
2190 	/* Free the response before processing the command.  */
2191 	if (!list_empty(&buf_ptr1->list)) {
2192 		list_remove_head(&buf_ptr1->list, buf_ptr,
2193 				 struct lpfc_dmabuf,
2194 				 list);
2195 		lpfc_mbuf_free(phba, buf_ptr->virt, buf_ptr->phys);
2196 		kfree(buf_ptr);
2197 	}
2198 	lpfc_mbuf_free(phba, buf_ptr1->virt, buf_ptr1->phys);
2199 	kfree(buf_ptr1);
2200 	return 0;
2201 }
2202 
2203 static int
2204 lpfc_els_free_bpl(struct lpfc_hba *phba, struct lpfc_dmabuf *buf_ptr)
2205 {
2206 	lpfc_mbuf_free(phba, buf_ptr->virt, buf_ptr->phys);
2207 	kfree(buf_ptr);
2208 	return 0;
2209 }
2210 
2211 int
2212 lpfc_els_free_iocb(struct lpfc_hba *phba, struct lpfc_iocbq *elsiocb)
2213 {
2214 	struct lpfc_dmabuf *buf_ptr, *buf_ptr1;
2215 	struct lpfc_nodelist *ndlp;
2216 
2217 	ndlp = (struct lpfc_nodelist *)elsiocb->context1;
2218 	if (ndlp) {
2219 		if (ndlp->nlp_flag & NLP_DEFER_RM) {
2220 			lpfc_nlp_put(ndlp);
2221 
2222 			/* If the ndlp is not being used by another discovery
2223 			 * thread, free it.
2224 			 */
2225 			if (!lpfc_nlp_not_used(ndlp)) {
2226 				/* If ndlp is being used by another discovery
2227 				 * thread, just clear NLP_DEFER_RM
2228 				 */
2229 				ndlp->nlp_flag &= ~NLP_DEFER_RM;
2230 			}
2231 		}
2232 		else
2233 			lpfc_nlp_put(ndlp);
2234 		elsiocb->context1 = NULL;
2235 	}
2236 	/* context2  = cmd,  context2->next = rsp, context3 = bpl */
2237 	if (elsiocb->context2) {
2238 		if (elsiocb->iocb_flag & LPFC_DELAY_MEM_FREE) {
2239 			/* Firmware could still be in progress of DMAing
2240 			 * payload, so don't free data buffer till after
2241 			 * a hbeat.
2242 			 */
2243 			elsiocb->iocb_flag &= ~LPFC_DELAY_MEM_FREE;
2244 			buf_ptr = elsiocb->context2;
2245 			elsiocb->context2 = NULL;
2246 			if (buf_ptr) {
2247 				buf_ptr1 = NULL;
2248 				spin_lock_irq(&phba->hbalock);
2249 				if (!list_empty(&buf_ptr->list)) {
2250 					list_remove_head(&buf_ptr->list,
2251 						buf_ptr1, struct lpfc_dmabuf,
2252 						list);
2253 					INIT_LIST_HEAD(&buf_ptr1->list);
2254 					list_add_tail(&buf_ptr1->list,
2255 						&phba->elsbuf);
2256 					phba->elsbuf_cnt++;
2257 				}
2258 				INIT_LIST_HEAD(&buf_ptr->list);
2259 				list_add_tail(&buf_ptr->list, &phba->elsbuf);
2260 				phba->elsbuf_cnt++;
2261 				spin_unlock_irq(&phba->hbalock);
2262 			}
2263 		} else {
2264 			buf_ptr1 = (struct lpfc_dmabuf *) elsiocb->context2;
2265 			lpfc_els_free_data(phba, buf_ptr1);
2266 		}
2267 	}
2268 
2269 	if (elsiocb->context3) {
2270 		buf_ptr = (struct lpfc_dmabuf *) elsiocb->context3;
2271 		lpfc_els_free_bpl(phba, buf_ptr);
2272 	}
2273 	lpfc_sli_release_iocbq(phba, elsiocb);
2274 	return 0;
2275 }
2276 
2277 static void
2278 lpfc_cmpl_els_logo_acc(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
2279 		       struct lpfc_iocbq *rspiocb)
2280 {
2281 	struct lpfc_nodelist *ndlp = (struct lpfc_nodelist *) cmdiocb->context1;
2282 	struct lpfc_vport *vport = cmdiocb->vport;
2283 	IOCB_t *irsp;
2284 
2285 	irsp = &rspiocb->iocb;
2286 	lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_RSP,
2287 		"ACC LOGO cmpl:   status:x%x/x%x did:x%x",
2288 		irsp->ulpStatus, irsp->un.ulpWord[4], ndlp->nlp_DID);
2289 	/* ACC to LOGO completes to NPort <nlp_DID> */
2290 	lpfc_printf_vlog(vport, KERN_INFO, LOG_ELS,
2291 			 "0109 ACC to LOGO completes to NPort x%x "
2292 			 "Data: x%x x%x x%x\n",
2293 			 ndlp->nlp_DID, ndlp->nlp_flag, ndlp->nlp_state,
2294 			 ndlp->nlp_rpi);
2295 
2296 	if (ndlp->nlp_state == NLP_STE_NPR_NODE) {
2297 		/* NPort Recovery mode or node is just allocated */
2298 		if (!lpfc_nlp_not_used(ndlp)) {
2299 			/* If the ndlp is being used by another discovery
2300 			 * thread, just unregister the RPI.
2301 			 */
2302 			lpfc_unreg_rpi(vport, ndlp);
2303 		} else {
2304 			/* Indicate the node has already released, should
2305 			 * not reference to it from within lpfc_els_free_iocb.
2306 			 */
2307 			cmdiocb->context1 = NULL;
2308 		}
2309 	}
2310 	lpfc_els_free_iocb(phba, cmdiocb);
2311 	return;
2312 }
2313 
2314 void
2315 lpfc_mbx_cmpl_dflt_rpi(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmb)
2316 {
2317 	struct lpfc_dmabuf *mp = (struct lpfc_dmabuf *) (pmb->context1);
2318 	struct lpfc_nodelist *ndlp = (struct lpfc_nodelist *) pmb->context2;
2319 
2320 	pmb->context1 = NULL;
2321 	lpfc_mbuf_free(phba, mp->virt, mp->phys);
2322 	kfree(mp);
2323 	mempool_free(pmb, phba->mbox_mem_pool);
2324 	if (ndlp && NLP_CHK_NODE_ACT(ndlp)) {
2325 		lpfc_nlp_put(ndlp);
2326 		/* This is the end of the default RPI cleanup logic for this
2327 		 * ndlp. If no other discovery threads are using this ndlp.
2328 		 * we should free all resources associated with it.
2329 		 */
2330 		lpfc_nlp_not_used(ndlp);
2331 	}
2332 	return;
2333 }
2334 
2335 static void
2336 lpfc_cmpl_els_rsp(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
2337 		  struct lpfc_iocbq *rspiocb)
2338 {
2339 	struct lpfc_nodelist *ndlp = (struct lpfc_nodelist *) cmdiocb->context1;
2340 	struct lpfc_vport *vport = ndlp ? ndlp->vport : NULL;
2341 	struct Scsi_Host  *shost = vport ? lpfc_shost_from_vport(vport) : NULL;
2342 	IOCB_t  *irsp;
2343 	uint8_t *pcmd;
2344 	LPFC_MBOXQ_t *mbox = NULL;
2345 	struct lpfc_dmabuf *mp = NULL;
2346 	uint32_t ls_rjt = 0;
2347 
2348 	irsp = &rspiocb->iocb;
2349 
2350 	if (cmdiocb->context_un.mbox)
2351 		mbox = cmdiocb->context_un.mbox;
2352 
2353 	/* First determine if this is a LS_RJT cmpl. Note, this callback
2354 	 * function can have cmdiocb->contest1 (ndlp) field set to NULL.
2355 	 */
2356 	pcmd = (uint8_t *) (((struct lpfc_dmabuf *) cmdiocb->context2)->virt);
2357 	if (ndlp && NLP_CHK_NODE_ACT(ndlp) &&
2358 	    (*((uint32_t *) (pcmd)) == ELS_CMD_LS_RJT)) {
2359 		/* A LS_RJT associated with Default RPI cleanup has its own
2360 		 * seperate code path.
2361 		 */
2362 		if (!(ndlp->nlp_flag & NLP_RM_DFLT_RPI))
2363 			ls_rjt = 1;
2364 	}
2365 
2366 	/* Check to see if link went down during discovery */
2367 	if (!ndlp || !NLP_CHK_NODE_ACT(ndlp) || lpfc_els_chk_latt(vport)) {
2368 		if (mbox) {
2369 			mp = (struct lpfc_dmabuf *) mbox->context1;
2370 			if (mp) {
2371 				lpfc_mbuf_free(phba, mp->virt, mp->phys);
2372 				kfree(mp);
2373 			}
2374 			mempool_free(mbox, phba->mbox_mem_pool);
2375 		}
2376 		if (ndlp && NLP_CHK_NODE_ACT(ndlp) &&
2377 		    (ndlp->nlp_flag & NLP_RM_DFLT_RPI))
2378 			if (lpfc_nlp_not_used(ndlp)) {
2379 				ndlp = NULL;
2380 				/* Indicate the node has already released,
2381 				 * should not reference to it from within
2382 				 * the routine lpfc_els_free_iocb.
2383 				 */
2384 				cmdiocb->context1 = NULL;
2385 			}
2386 		goto out;
2387 	}
2388 
2389 	lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_RSP,
2390 		"ELS rsp cmpl:    status:x%x/x%x did:x%x",
2391 		irsp->ulpStatus, irsp->un.ulpWord[4],
2392 		cmdiocb->iocb.un.elsreq64.remoteID);
2393 	/* ELS response tag <ulpIoTag> completes */
2394 	lpfc_printf_vlog(vport, KERN_INFO, LOG_ELS,
2395 			 "0110 ELS response tag x%x completes "
2396 			 "Data: x%x x%x x%x x%x x%x x%x x%x\n",
2397 			 cmdiocb->iocb.ulpIoTag, rspiocb->iocb.ulpStatus,
2398 			 rspiocb->iocb.un.ulpWord[4], rspiocb->iocb.ulpTimeout,
2399 			 ndlp->nlp_DID, ndlp->nlp_flag, ndlp->nlp_state,
2400 			 ndlp->nlp_rpi);
2401 	if (mbox) {
2402 		if ((rspiocb->iocb.ulpStatus == 0)
2403 		    && (ndlp->nlp_flag & NLP_ACC_REGLOGIN)) {
2404 			lpfc_unreg_rpi(vport, ndlp);
2405 			/* Increment reference count to ndlp to hold the
2406 			 * reference to ndlp for the callback function.
2407 			 */
2408 			mbox->context2 = lpfc_nlp_get(ndlp);
2409 			mbox->vport = vport;
2410 			if (ndlp->nlp_flag & NLP_RM_DFLT_RPI) {
2411 				mbox->mbox_flag |= LPFC_MBX_IMED_UNREG;
2412 				mbox->mbox_cmpl = lpfc_mbx_cmpl_dflt_rpi;
2413 			}
2414 			else {
2415 				mbox->mbox_cmpl = lpfc_mbx_cmpl_reg_login;
2416 				ndlp->nlp_prev_state = ndlp->nlp_state;
2417 				lpfc_nlp_set_state(vport, ndlp,
2418 					   NLP_STE_REG_LOGIN_ISSUE);
2419 			}
2420 			if (lpfc_sli_issue_mbox(phba, mbox, MBX_NOWAIT)
2421 			    != MBX_NOT_FINISHED)
2422 				goto out;
2423 			else
2424 				/* Decrement the ndlp reference count we
2425 				 * set for this failed mailbox command.
2426 				 */
2427 				lpfc_nlp_put(ndlp);
2428 
2429 			/* ELS rsp: Cannot issue reg_login for <NPortid> */
2430 			lpfc_printf_vlog(vport, KERN_ERR, LOG_ELS,
2431 				"0138 ELS rsp: Cannot issue reg_login for x%x "
2432 				"Data: x%x x%x x%x\n",
2433 				ndlp->nlp_DID, ndlp->nlp_flag, ndlp->nlp_state,
2434 				ndlp->nlp_rpi);
2435 
2436 			if (lpfc_nlp_not_used(ndlp)) {
2437 				ndlp = NULL;
2438 				/* Indicate node has already been released,
2439 				 * should not reference to it from within
2440 				 * the routine lpfc_els_free_iocb.
2441 				 */
2442 				cmdiocb->context1 = NULL;
2443 			}
2444 		} else {
2445 			/* Do not drop node for lpfc_els_abort'ed ELS cmds */
2446 			if (!lpfc_error_lost_link(irsp) &&
2447 			    ndlp->nlp_flag & NLP_ACC_REGLOGIN) {
2448 				if (lpfc_nlp_not_used(ndlp)) {
2449 					ndlp = NULL;
2450 					/* Indicate node has already been
2451 					 * released, should not reference
2452 					 * to it from within the routine
2453 					 * lpfc_els_free_iocb.
2454 					 */
2455 					cmdiocb->context1 = NULL;
2456 				}
2457 			}
2458 		}
2459 		mp = (struct lpfc_dmabuf *) mbox->context1;
2460 		if (mp) {
2461 			lpfc_mbuf_free(phba, mp->virt, mp->phys);
2462 			kfree(mp);
2463 		}
2464 		mempool_free(mbox, phba->mbox_mem_pool);
2465 	}
2466 out:
2467 	if (ndlp && NLP_CHK_NODE_ACT(ndlp)) {
2468 		spin_lock_irq(shost->host_lock);
2469 		ndlp->nlp_flag &= ~(NLP_ACC_REGLOGIN | NLP_RM_DFLT_RPI);
2470 		spin_unlock_irq(shost->host_lock);
2471 
2472 		/* If the node is not being used by another discovery thread,
2473 		 * and we are sending a reject, we are done with it.
2474 		 * Release driver reference count here and free associated
2475 		 * resources.
2476 		 */
2477 		if (ls_rjt)
2478 			if (lpfc_nlp_not_used(ndlp))
2479 				/* Indicate node has already been released,
2480 				 * should not reference to it from within
2481 				 * the routine lpfc_els_free_iocb.
2482 				 */
2483 				cmdiocb->context1 = NULL;
2484 	}
2485 
2486 	lpfc_els_free_iocb(phba, cmdiocb);
2487 	return;
2488 }
2489 
2490 int
2491 lpfc_els_rsp_acc(struct lpfc_vport *vport, uint32_t flag,
2492 		 struct lpfc_iocbq *oldiocb, struct lpfc_nodelist *ndlp,
2493 		 LPFC_MBOXQ_t *mbox)
2494 {
2495 	struct Scsi_Host *shost = lpfc_shost_from_vport(vport);
2496 	struct lpfc_hba  *phba = vport->phba;
2497 	IOCB_t *icmd;
2498 	IOCB_t *oldcmd;
2499 	struct lpfc_iocbq *elsiocb;
2500 	struct lpfc_sli_ring *pring;
2501 	struct lpfc_sli *psli;
2502 	uint8_t *pcmd;
2503 	uint16_t cmdsize;
2504 	int rc;
2505 	ELS_PKT *els_pkt_ptr;
2506 
2507 	psli = &phba->sli;
2508 	pring = &psli->ring[LPFC_ELS_RING];	/* ELS ring */
2509 	oldcmd = &oldiocb->iocb;
2510 
2511 	switch (flag) {
2512 	case ELS_CMD_ACC:
2513 		cmdsize = sizeof(uint32_t);
2514 		elsiocb = lpfc_prep_els_iocb(vport, 0, cmdsize, oldiocb->retry,
2515 					     ndlp, ndlp->nlp_DID, ELS_CMD_ACC);
2516 		if (!elsiocb) {
2517 			spin_lock_irq(shost->host_lock);
2518 			ndlp->nlp_flag &= ~NLP_LOGO_ACC;
2519 			spin_unlock_irq(shost->host_lock);
2520 			return 1;
2521 		}
2522 
2523 		icmd = &elsiocb->iocb;
2524 		icmd->ulpContext = oldcmd->ulpContext;	/* Xri */
2525 		pcmd = (((struct lpfc_dmabuf *) elsiocb->context2)->virt);
2526 		*((uint32_t *) (pcmd)) = ELS_CMD_ACC;
2527 		pcmd += sizeof(uint32_t);
2528 
2529 		lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_RSP,
2530 			"Issue ACC:       did:x%x flg:x%x",
2531 			ndlp->nlp_DID, ndlp->nlp_flag, 0);
2532 		break;
2533 	case ELS_CMD_PLOGI:
2534 		cmdsize = (sizeof(struct serv_parm) + sizeof(uint32_t));
2535 		elsiocb = lpfc_prep_els_iocb(vport, 0, cmdsize, oldiocb->retry,
2536 					     ndlp, ndlp->nlp_DID, ELS_CMD_ACC);
2537 		if (!elsiocb)
2538 			return 1;
2539 
2540 		icmd = &elsiocb->iocb;
2541 		icmd->ulpContext = oldcmd->ulpContext;	/* Xri */
2542 		pcmd = (((struct lpfc_dmabuf *) elsiocb->context2)->virt);
2543 
2544 		if (mbox)
2545 			elsiocb->context_un.mbox = mbox;
2546 
2547 		*((uint32_t *) (pcmd)) = ELS_CMD_ACC;
2548 		pcmd += sizeof(uint32_t);
2549 		memcpy(pcmd, &vport->fc_sparam, sizeof(struct serv_parm));
2550 
2551 		lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_RSP,
2552 			"Issue ACC PLOGI: did:x%x flg:x%x",
2553 			ndlp->nlp_DID, ndlp->nlp_flag, 0);
2554 		break;
2555 	case ELS_CMD_PRLO:
2556 		cmdsize = sizeof(uint32_t) + sizeof(PRLO);
2557 		elsiocb = lpfc_prep_els_iocb(vport, 0, cmdsize, oldiocb->retry,
2558 					     ndlp, ndlp->nlp_DID, ELS_CMD_PRLO);
2559 		if (!elsiocb)
2560 			return 1;
2561 
2562 		icmd = &elsiocb->iocb;
2563 		icmd->ulpContext = oldcmd->ulpContext; /* Xri */
2564 		pcmd = (((struct lpfc_dmabuf *) elsiocb->context2)->virt);
2565 
2566 		memcpy(pcmd, ((struct lpfc_dmabuf *) oldiocb->context2)->virt,
2567 		       sizeof(uint32_t) + sizeof(PRLO));
2568 		*((uint32_t *) (pcmd)) = ELS_CMD_PRLO_ACC;
2569 		els_pkt_ptr = (ELS_PKT *) pcmd;
2570 		els_pkt_ptr->un.prlo.acceptRspCode = PRLO_REQ_EXECUTED;
2571 
2572 		lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_RSP,
2573 			"Issue ACC PRLO:  did:x%x flg:x%x",
2574 			ndlp->nlp_DID, ndlp->nlp_flag, 0);
2575 		break;
2576 	default:
2577 		return 1;
2578 	}
2579 	/* Xmit ELS ACC response tag <ulpIoTag> */
2580 	lpfc_printf_vlog(vport, KERN_INFO, LOG_ELS,
2581 			 "0128 Xmit ELS ACC response tag x%x, XRI: x%x, "
2582 			 "DID: x%x, nlp_flag: x%x nlp_state: x%x RPI: x%x\n",
2583 			 elsiocb->iotag, elsiocb->iocb.ulpContext,
2584 			 ndlp->nlp_DID, ndlp->nlp_flag, ndlp->nlp_state,
2585 			 ndlp->nlp_rpi);
2586 	if (ndlp->nlp_flag & NLP_LOGO_ACC) {
2587 		spin_lock_irq(shost->host_lock);
2588 		ndlp->nlp_flag &= ~NLP_LOGO_ACC;
2589 		spin_unlock_irq(shost->host_lock);
2590 		elsiocb->iocb_cmpl = lpfc_cmpl_els_logo_acc;
2591 	} else {
2592 		elsiocb->iocb_cmpl = lpfc_cmpl_els_rsp;
2593 	}
2594 
2595 	phba->fc_stat.elsXmitACC++;
2596 	rc = lpfc_sli_issue_iocb(phba, pring, elsiocb, 0);
2597 	if (rc == IOCB_ERROR) {
2598 		lpfc_els_free_iocb(phba, elsiocb);
2599 		return 1;
2600 	}
2601 	return 0;
2602 }
2603 
2604 int
2605 lpfc_els_rsp_reject(struct lpfc_vport *vport, uint32_t rejectError,
2606 		    struct lpfc_iocbq *oldiocb, struct lpfc_nodelist *ndlp,
2607 		    LPFC_MBOXQ_t *mbox)
2608 {
2609 	struct lpfc_hba  *phba = vport->phba;
2610 	IOCB_t *icmd;
2611 	IOCB_t *oldcmd;
2612 	struct lpfc_iocbq *elsiocb;
2613 	struct lpfc_sli_ring *pring;
2614 	struct lpfc_sli *psli;
2615 	uint8_t *pcmd;
2616 	uint16_t cmdsize;
2617 	int rc;
2618 
2619 	psli = &phba->sli;
2620 	pring = &psli->ring[LPFC_ELS_RING];	/* ELS ring */
2621 
2622 	cmdsize = 2 * sizeof(uint32_t);
2623 	elsiocb = lpfc_prep_els_iocb(vport, 0, cmdsize, oldiocb->retry, ndlp,
2624 				     ndlp->nlp_DID, ELS_CMD_LS_RJT);
2625 	if (!elsiocb)
2626 		return 1;
2627 
2628 	icmd = &elsiocb->iocb;
2629 	oldcmd = &oldiocb->iocb;
2630 	icmd->ulpContext = oldcmd->ulpContext;	/* Xri */
2631 	pcmd = (uint8_t *) (((struct lpfc_dmabuf *) elsiocb->context2)->virt);
2632 
2633 	*((uint32_t *) (pcmd)) = ELS_CMD_LS_RJT;
2634 	pcmd += sizeof(uint32_t);
2635 	*((uint32_t *) (pcmd)) = rejectError;
2636 
2637 	if (mbox)
2638 		elsiocb->context_un.mbox = mbox;
2639 
2640 	/* Xmit ELS RJT <err> response tag <ulpIoTag> */
2641 	lpfc_printf_vlog(vport, KERN_INFO, LOG_ELS,
2642 			 "0129 Xmit ELS RJT x%x response tag x%x "
2643 			 "xri x%x, did x%x, nlp_flag x%x, nlp_state x%x, "
2644 			 "rpi x%x\n",
2645 			 rejectError, elsiocb->iotag,
2646 			 elsiocb->iocb.ulpContext, ndlp->nlp_DID,
2647 			 ndlp->nlp_flag, ndlp->nlp_state, ndlp->nlp_rpi);
2648 	lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_RSP,
2649 		"Issue LS_RJT:    did:x%x flg:x%x err:x%x",
2650 		ndlp->nlp_DID, ndlp->nlp_flag, rejectError);
2651 
2652 	phba->fc_stat.elsXmitLSRJT++;
2653 	elsiocb->iocb_cmpl = lpfc_cmpl_els_rsp;
2654 	rc = lpfc_sli_issue_iocb(phba, pring, elsiocb, 0);
2655 
2656 	if (rc == IOCB_ERROR) {
2657 		lpfc_els_free_iocb(phba, elsiocb);
2658 		return 1;
2659 	}
2660 	return 0;
2661 }
2662 
2663 int
2664 lpfc_els_rsp_adisc_acc(struct lpfc_vport *vport, struct lpfc_iocbq *oldiocb,
2665 		       struct lpfc_nodelist *ndlp)
2666 {
2667 	struct lpfc_hba  *phba = vport->phba;
2668 	struct lpfc_sli  *psli = &phba->sli;
2669 	struct lpfc_sli_ring *pring = &psli->ring[LPFC_ELS_RING];
2670 	ADISC *ap;
2671 	IOCB_t *icmd, *oldcmd;
2672 	struct lpfc_iocbq *elsiocb;
2673 	uint8_t *pcmd;
2674 	uint16_t cmdsize;
2675 	int rc;
2676 
2677 	cmdsize = sizeof(uint32_t) + sizeof(ADISC);
2678 	elsiocb = lpfc_prep_els_iocb(vport, 0, cmdsize, oldiocb->retry, ndlp,
2679 				     ndlp->nlp_DID, ELS_CMD_ACC);
2680 	if (!elsiocb)
2681 		return 1;
2682 
2683 	icmd = &elsiocb->iocb;
2684 	oldcmd = &oldiocb->iocb;
2685 	icmd->ulpContext = oldcmd->ulpContext;	/* Xri */
2686 
2687 	/* Xmit ADISC ACC response tag <ulpIoTag> */
2688 	lpfc_printf_vlog(vport, KERN_INFO, LOG_ELS,
2689 			 "0130 Xmit ADISC ACC response iotag x%x xri: "
2690 			 "x%x, did x%x, nlp_flag x%x, nlp_state x%x rpi x%x\n",
2691 			 elsiocb->iotag, elsiocb->iocb.ulpContext,
2692 			 ndlp->nlp_DID, ndlp->nlp_flag, ndlp->nlp_state,
2693 			 ndlp->nlp_rpi);
2694 	pcmd = (uint8_t *) (((struct lpfc_dmabuf *) elsiocb->context2)->virt);
2695 
2696 	*((uint32_t *) (pcmd)) = ELS_CMD_ACC;
2697 	pcmd += sizeof(uint32_t);
2698 
2699 	ap = (ADISC *) (pcmd);
2700 	ap->hardAL_PA = phba->fc_pref_ALPA;
2701 	memcpy(&ap->portName, &vport->fc_portname, sizeof(struct lpfc_name));
2702 	memcpy(&ap->nodeName, &vport->fc_nodename, sizeof(struct lpfc_name));
2703 	ap->DID = be32_to_cpu(vport->fc_myDID);
2704 
2705 	lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_RSP,
2706 		"Issue ACC ADISC: did:x%x flg:x%x",
2707 		ndlp->nlp_DID, ndlp->nlp_flag, 0);
2708 
2709 	phba->fc_stat.elsXmitACC++;
2710 	elsiocb->iocb_cmpl = lpfc_cmpl_els_rsp;
2711 	rc = lpfc_sli_issue_iocb(phba, pring, elsiocb, 0);
2712 	if (rc == IOCB_ERROR) {
2713 		lpfc_els_free_iocb(phba, elsiocb);
2714 		return 1;
2715 	}
2716 	return 0;
2717 }
2718 
2719 int
2720 lpfc_els_rsp_prli_acc(struct lpfc_vport *vport, struct lpfc_iocbq *oldiocb,
2721 		      struct lpfc_nodelist *ndlp)
2722 {
2723 	struct lpfc_hba  *phba = vport->phba;
2724 	PRLI *npr;
2725 	lpfc_vpd_t *vpd;
2726 	IOCB_t *icmd;
2727 	IOCB_t *oldcmd;
2728 	struct lpfc_iocbq *elsiocb;
2729 	struct lpfc_sli_ring *pring;
2730 	struct lpfc_sli *psli;
2731 	uint8_t *pcmd;
2732 	uint16_t cmdsize;
2733 	int rc;
2734 
2735 	psli = &phba->sli;
2736 	pring = &psli->ring[LPFC_ELS_RING];	/* ELS ring */
2737 
2738 	cmdsize = sizeof(uint32_t) + sizeof(PRLI);
2739 	elsiocb = lpfc_prep_els_iocb(vport, 0, cmdsize, oldiocb->retry, ndlp,
2740 		ndlp->nlp_DID, (ELS_CMD_ACC | (ELS_CMD_PRLI & ~ELS_RSP_MASK)));
2741 	if (!elsiocb)
2742 		return 1;
2743 
2744 	icmd = &elsiocb->iocb;
2745 	oldcmd = &oldiocb->iocb;
2746 	icmd->ulpContext = oldcmd->ulpContext;	/* Xri */
2747 	/* Xmit PRLI ACC response tag <ulpIoTag> */
2748 	lpfc_printf_vlog(vport, KERN_INFO, LOG_ELS,
2749 			 "0131 Xmit PRLI ACC response tag x%x xri x%x, "
2750 			 "did x%x, nlp_flag x%x, nlp_state x%x, rpi x%x\n",
2751 			 elsiocb->iotag, elsiocb->iocb.ulpContext,
2752 			 ndlp->nlp_DID, ndlp->nlp_flag, ndlp->nlp_state,
2753 			 ndlp->nlp_rpi);
2754 	pcmd = (uint8_t *) (((struct lpfc_dmabuf *) elsiocb->context2)->virt);
2755 
2756 	*((uint32_t *) (pcmd)) = (ELS_CMD_ACC | (ELS_CMD_PRLI & ~ELS_RSP_MASK));
2757 	pcmd += sizeof(uint32_t);
2758 
2759 	/* For PRLI, remainder of payload is PRLI parameter page */
2760 	memset(pcmd, 0, sizeof(PRLI));
2761 
2762 	npr = (PRLI *) pcmd;
2763 	vpd = &phba->vpd;
2764 	/*
2765 	 * If the remote port is a target and our firmware version is 3.20 or
2766 	 * later, set the following bits for FC-TAPE support.
2767 	 */
2768 	if ((ndlp->nlp_type & NLP_FCP_TARGET) &&
2769 	    (vpd->rev.feaLevelHigh >= 0x02)) {
2770 		npr->ConfmComplAllowed = 1;
2771 		npr->Retry = 1;
2772 		npr->TaskRetryIdReq = 1;
2773 	}
2774 
2775 	npr->acceptRspCode = PRLI_REQ_EXECUTED;
2776 	npr->estabImagePair = 1;
2777 	npr->readXferRdyDis = 1;
2778 	npr->ConfmComplAllowed = 1;
2779 
2780 	npr->prliType = PRLI_FCP_TYPE;
2781 	npr->initiatorFunc = 1;
2782 
2783 	lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_RSP,
2784 		"Issue ACC PRLI:  did:x%x flg:x%x",
2785 		ndlp->nlp_DID, ndlp->nlp_flag, 0);
2786 
2787 	phba->fc_stat.elsXmitACC++;
2788 	elsiocb->iocb_cmpl = lpfc_cmpl_els_rsp;
2789 
2790 	rc = lpfc_sli_issue_iocb(phba, pring, elsiocb, 0);
2791 	if (rc == IOCB_ERROR) {
2792 		lpfc_els_free_iocb(phba, elsiocb);
2793 		return 1;
2794 	}
2795 	return 0;
2796 }
2797 
2798 static int
2799 lpfc_els_rsp_rnid_acc(struct lpfc_vport *vport, uint8_t format,
2800 		      struct lpfc_iocbq *oldiocb, struct lpfc_nodelist *ndlp)
2801 {
2802 	struct lpfc_hba  *phba = vport->phba;
2803 	RNID *rn;
2804 	IOCB_t *icmd, *oldcmd;
2805 	struct lpfc_iocbq *elsiocb;
2806 	struct lpfc_sli_ring *pring;
2807 	struct lpfc_sli *psli;
2808 	uint8_t *pcmd;
2809 	uint16_t cmdsize;
2810 	int rc;
2811 
2812 	psli = &phba->sli;
2813 	pring = &psli->ring[LPFC_ELS_RING];
2814 
2815 	cmdsize = sizeof(uint32_t) + sizeof(uint32_t)
2816 					+ (2 * sizeof(struct lpfc_name));
2817 	if (format)
2818 		cmdsize += sizeof(RNID_TOP_DISC);
2819 
2820 	elsiocb = lpfc_prep_els_iocb(vport, 0, cmdsize, oldiocb->retry, ndlp,
2821 				     ndlp->nlp_DID, ELS_CMD_ACC);
2822 	if (!elsiocb)
2823 		return 1;
2824 
2825 	icmd = &elsiocb->iocb;
2826 	oldcmd = &oldiocb->iocb;
2827 	icmd->ulpContext = oldcmd->ulpContext;	/* Xri */
2828 	/* Xmit RNID ACC response tag <ulpIoTag> */
2829 	lpfc_printf_vlog(vport, KERN_INFO, LOG_ELS,
2830 			 "0132 Xmit RNID ACC response tag x%x xri x%x\n",
2831 			 elsiocb->iotag, elsiocb->iocb.ulpContext);
2832 	pcmd = (uint8_t *) (((struct lpfc_dmabuf *) elsiocb->context2)->virt);
2833 	*((uint32_t *) (pcmd)) = ELS_CMD_ACC;
2834 	pcmd += sizeof(uint32_t);
2835 
2836 	memset(pcmd, 0, sizeof(RNID));
2837 	rn = (RNID *) (pcmd);
2838 	rn->Format = format;
2839 	rn->CommonLen = (2 * sizeof(struct lpfc_name));
2840 	memcpy(&rn->portName, &vport->fc_portname, sizeof(struct lpfc_name));
2841 	memcpy(&rn->nodeName, &vport->fc_nodename, sizeof(struct lpfc_name));
2842 	switch (format) {
2843 	case 0:
2844 		rn->SpecificLen = 0;
2845 		break;
2846 	case RNID_TOPOLOGY_DISC:
2847 		rn->SpecificLen = sizeof(RNID_TOP_DISC);
2848 		memcpy(&rn->un.topologyDisc.portName,
2849 		       &vport->fc_portname, sizeof(struct lpfc_name));
2850 		rn->un.topologyDisc.unitType = RNID_HBA;
2851 		rn->un.topologyDisc.physPort = 0;
2852 		rn->un.topologyDisc.attachedNodes = 0;
2853 		break;
2854 	default:
2855 		rn->CommonLen = 0;
2856 		rn->SpecificLen = 0;
2857 		break;
2858 	}
2859 
2860 	lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_RSP,
2861 		"Issue ACC RNID:  did:x%x flg:x%x",
2862 		ndlp->nlp_DID, ndlp->nlp_flag, 0);
2863 
2864 	phba->fc_stat.elsXmitACC++;
2865 	elsiocb->iocb_cmpl = lpfc_cmpl_els_rsp;
2866 	lpfc_nlp_put(ndlp);
2867 	elsiocb->context1 = NULL;  /* Don't need ndlp for cmpl,
2868 				    * it could be freed */
2869 
2870 	rc = lpfc_sli_issue_iocb(phba, pring, elsiocb, 0);
2871 	if (rc == IOCB_ERROR) {
2872 		lpfc_els_free_iocb(phba, elsiocb);
2873 		return 1;
2874 	}
2875 	return 0;
2876 }
2877 
2878 int
2879 lpfc_els_disc_adisc(struct lpfc_vport *vport)
2880 {
2881 	struct Scsi_Host *shost = lpfc_shost_from_vport(vport);
2882 	struct lpfc_nodelist *ndlp, *next_ndlp;
2883 	int sentadisc = 0;
2884 
2885 	/* go thru NPR nodes and issue any remaining ELS ADISCs */
2886 	list_for_each_entry_safe(ndlp, next_ndlp, &vport->fc_nodes, nlp_listp) {
2887 		if (!NLP_CHK_NODE_ACT(ndlp))
2888 			continue;
2889 		if (ndlp->nlp_state == NLP_STE_NPR_NODE &&
2890 		    (ndlp->nlp_flag & NLP_NPR_2B_DISC) != 0 &&
2891 		    (ndlp->nlp_flag & NLP_NPR_ADISC) != 0) {
2892 			spin_lock_irq(shost->host_lock);
2893 			ndlp->nlp_flag &= ~NLP_NPR_ADISC;
2894 			spin_unlock_irq(shost->host_lock);
2895 			ndlp->nlp_prev_state = ndlp->nlp_state;
2896 			lpfc_nlp_set_state(vport, ndlp, NLP_STE_ADISC_ISSUE);
2897 			lpfc_issue_els_adisc(vport, ndlp, 0);
2898 			sentadisc++;
2899 			vport->num_disc_nodes++;
2900 			if (vport->num_disc_nodes >=
2901 			    vport->cfg_discovery_threads) {
2902 				spin_lock_irq(shost->host_lock);
2903 				vport->fc_flag |= FC_NLP_MORE;
2904 				spin_unlock_irq(shost->host_lock);
2905 				break;
2906 			}
2907 		}
2908 	}
2909 	if (sentadisc == 0) {
2910 		spin_lock_irq(shost->host_lock);
2911 		vport->fc_flag &= ~FC_NLP_MORE;
2912 		spin_unlock_irq(shost->host_lock);
2913 	}
2914 	return sentadisc;
2915 }
2916 
2917 int
2918 lpfc_els_disc_plogi(struct lpfc_vport *vport)
2919 {
2920 	struct Scsi_Host *shost = lpfc_shost_from_vport(vport);
2921 	struct lpfc_nodelist *ndlp, *next_ndlp;
2922 	int sentplogi = 0;
2923 
2924 	/* go thru NPR nodes and issue any remaining ELS PLOGIs */
2925 	list_for_each_entry_safe(ndlp, next_ndlp, &vport->fc_nodes, nlp_listp) {
2926 		if (!NLP_CHK_NODE_ACT(ndlp))
2927 			continue;
2928 		if (ndlp->nlp_state == NLP_STE_NPR_NODE &&
2929 		    (ndlp->nlp_flag & NLP_NPR_2B_DISC) != 0 &&
2930 		    (ndlp->nlp_flag & NLP_DELAY_TMO) == 0 &&
2931 		    (ndlp->nlp_flag & NLP_NPR_ADISC) == 0) {
2932 			ndlp->nlp_prev_state = ndlp->nlp_state;
2933 			lpfc_nlp_set_state(vport, ndlp, NLP_STE_PLOGI_ISSUE);
2934 			lpfc_issue_els_plogi(vport, ndlp->nlp_DID, 0);
2935 			sentplogi++;
2936 			vport->num_disc_nodes++;
2937 			if (vport->num_disc_nodes >=
2938 			    vport->cfg_discovery_threads) {
2939 				spin_lock_irq(shost->host_lock);
2940 				vport->fc_flag |= FC_NLP_MORE;
2941 				spin_unlock_irq(shost->host_lock);
2942 				break;
2943 			}
2944 		}
2945 	}
2946 	if (sentplogi) {
2947 		lpfc_set_disctmo(vport);
2948 	}
2949 	else {
2950 		spin_lock_irq(shost->host_lock);
2951 		vport->fc_flag &= ~FC_NLP_MORE;
2952 		spin_unlock_irq(shost->host_lock);
2953 	}
2954 	return sentplogi;
2955 }
2956 
2957 void
2958 lpfc_els_flush_rscn(struct lpfc_vport *vport)
2959 {
2960 	struct Scsi_Host *shost = lpfc_shost_from_vport(vport);
2961 	struct lpfc_hba  *phba = vport->phba;
2962 	int i;
2963 
2964 	spin_lock_irq(shost->host_lock);
2965 	if (vport->fc_rscn_flush) {
2966 		/* Another thread is walking fc_rscn_id_list on this vport */
2967 		spin_unlock_irq(shost->host_lock);
2968 		return;
2969 	}
2970 	/* Indicate we are walking lpfc_els_flush_rscn on this vport */
2971 	vport->fc_rscn_flush = 1;
2972 	spin_unlock_irq(shost->host_lock);
2973 
2974 	for (i = 0; i < vport->fc_rscn_id_cnt; i++) {
2975 		lpfc_in_buf_free(phba, vport->fc_rscn_id_list[i]);
2976 		vport->fc_rscn_id_list[i] = NULL;
2977 	}
2978 	spin_lock_irq(shost->host_lock);
2979 	vport->fc_rscn_id_cnt = 0;
2980 	vport->fc_flag &= ~(FC_RSCN_MODE | FC_RSCN_DISCOVERY);
2981 	spin_unlock_irq(shost->host_lock);
2982 	lpfc_can_disctmo(vport);
2983 	/* Indicate we are done walking this fc_rscn_id_list */
2984 	vport->fc_rscn_flush = 0;
2985 }
2986 
2987 int
2988 lpfc_rscn_payload_check(struct lpfc_vport *vport, uint32_t did)
2989 {
2990 	D_ID ns_did;
2991 	D_ID rscn_did;
2992 	uint32_t *lp;
2993 	uint32_t payload_len, i;
2994 	struct Scsi_Host *shost = lpfc_shost_from_vport(vport);
2995 
2996 	ns_did.un.word = did;
2997 
2998 	/* Never match fabric nodes for RSCNs */
2999 	if ((did & Fabric_DID_MASK) == Fabric_DID_MASK)
3000 		return 0;
3001 
3002 	/* If we are doing a FULL RSCN rediscovery, match everything */
3003 	if (vport->fc_flag & FC_RSCN_DISCOVERY)
3004 		return did;
3005 
3006 	spin_lock_irq(shost->host_lock);
3007 	if (vport->fc_rscn_flush) {
3008 		/* Another thread is walking fc_rscn_id_list on this vport */
3009 		spin_unlock_irq(shost->host_lock);
3010 		return 0;
3011 	}
3012 	/* Indicate we are walking fc_rscn_id_list on this vport */
3013 	vport->fc_rscn_flush = 1;
3014 	spin_unlock_irq(shost->host_lock);
3015 	for (i = 0; i < vport->fc_rscn_id_cnt; i++) {
3016 		lp = vport->fc_rscn_id_list[i]->virt;
3017 		payload_len = be32_to_cpu(*lp++ & ~ELS_CMD_MASK);
3018 		payload_len -= sizeof(uint32_t);	/* take off word 0 */
3019 		while (payload_len) {
3020 			rscn_did.un.word = be32_to_cpu(*lp++);
3021 			payload_len -= sizeof(uint32_t);
3022 			switch (rscn_did.un.b.resv) {
3023 			case 0:	/* Single N_Port ID effected */
3024 				if (ns_did.un.word == rscn_did.un.word)
3025 					goto return_did_out;
3026 				break;
3027 			case 1:	/* Whole N_Port Area effected */
3028 				if ((ns_did.un.b.domain == rscn_did.un.b.domain)
3029 				    && (ns_did.un.b.area == rscn_did.un.b.area))
3030 					goto return_did_out;
3031 				break;
3032 			case 2:	/* Whole N_Port Domain effected */
3033 				if (ns_did.un.b.domain == rscn_did.un.b.domain)
3034 					goto return_did_out;
3035 				break;
3036 			default:
3037 				/* Unknown Identifier in RSCN node */
3038 				lpfc_printf_vlog(vport, KERN_ERR, LOG_DISCOVERY,
3039 						 "0217 Unknown Identifier in "
3040 						 "RSCN payload Data: x%x\n",
3041 						 rscn_did.un.word);
3042 			case 3:	/* Whole Fabric effected */
3043 				goto return_did_out;
3044 			}
3045 		}
3046 	}
3047 	/* Indicate we are done with walking fc_rscn_id_list on this vport */
3048 	vport->fc_rscn_flush = 0;
3049 	return 0;
3050 return_did_out:
3051 	/* Indicate we are done with walking fc_rscn_id_list on this vport */
3052 	vport->fc_rscn_flush = 0;
3053 	return did;
3054 }
3055 
3056 static int
3057 lpfc_rscn_recovery_check(struct lpfc_vport *vport)
3058 {
3059 	struct lpfc_nodelist *ndlp = NULL;
3060 
3061 	/* Move all affected nodes by pending RSCNs to NPR state. */
3062 	list_for_each_entry(ndlp, &vport->fc_nodes, nlp_listp) {
3063 		if (!NLP_CHK_NODE_ACT(ndlp) ||
3064 		    (ndlp->nlp_state == NLP_STE_UNUSED_NODE) ||
3065 		    !lpfc_rscn_payload_check(vport, ndlp->nlp_DID))
3066 			continue;
3067 		lpfc_disc_state_machine(vport, ndlp, NULL,
3068 					NLP_EVT_DEVICE_RECOVERY);
3069 		lpfc_cancel_retry_delay_tmo(vport, ndlp);
3070 	}
3071 	return 0;
3072 }
3073 
3074 static int
3075 lpfc_els_rcv_rscn(struct lpfc_vport *vport, struct lpfc_iocbq *cmdiocb,
3076 		  struct lpfc_nodelist *ndlp)
3077 {
3078 	struct Scsi_Host *shost = lpfc_shost_from_vport(vport);
3079 	struct lpfc_hba  *phba = vport->phba;
3080 	struct lpfc_dmabuf *pcmd;
3081 	uint32_t *lp, *datap;
3082 	IOCB_t *icmd;
3083 	uint32_t payload_len, length, nportid, *cmd;
3084 	int rscn_cnt;
3085 	int rscn_id = 0, hba_id = 0;
3086 	int i;
3087 
3088 	icmd = &cmdiocb->iocb;
3089 	pcmd = (struct lpfc_dmabuf *) cmdiocb->context2;
3090 	lp = (uint32_t *) pcmd->virt;
3091 
3092 	payload_len = be32_to_cpu(*lp++ & ~ELS_CMD_MASK);
3093 	payload_len -= sizeof(uint32_t);	/* take off word 0 */
3094 	/* RSCN received */
3095 	lpfc_printf_vlog(vport, KERN_INFO, LOG_DISCOVERY,
3096 			 "0214 RSCN received Data: x%x x%x x%x x%x\n",
3097 			 vport->fc_flag, payload_len, *lp,
3098 			 vport->fc_rscn_id_cnt);
3099 	for (i = 0; i < payload_len/sizeof(uint32_t); i++)
3100 		fc_host_post_event(shost, fc_get_event_number(),
3101 			FCH_EVT_RSCN, lp[i]);
3102 
3103 	/* If we are about to begin discovery, just ACC the RSCN.
3104 	 * Discovery processing will satisfy it.
3105 	 */
3106 	if (vport->port_state <= LPFC_NS_QRY) {
3107 		lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_UNSOL,
3108 			"RCV RSCN ignore: did:x%x/ste:x%x flg:x%x",
3109 			ndlp->nlp_DID, vport->port_state, ndlp->nlp_flag);
3110 
3111 		lpfc_els_rsp_acc(vport, ELS_CMD_ACC, cmdiocb, ndlp, NULL);
3112 		return 0;
3113 	}
3114 
3115 	/* If this RSCN just contains NPortIDs for other vports on this HBA,
3116 	 * just ACC and ignore it.
3117 	 */
3118 	if ((phba->sli3_options & LPFC_SLI3_NPIV_ENABLED) &&
3119 		!(vport->cfg_peer_port_login)) {
3120 		i = payload_len;
3121 		datap = lp;
3122 		while (i > 0) {
3123 			nportid = *datap++;
3124 			nportid = ((be32_to_cpu(nportid)) & Mask_DID);
3125 			i -= sizeof(uint32_t);
3126 			rscn_id++;
3127 			if (lpfc_find_vport_by_did(phba, nportid))
3128 				hba_id++;
3129 		}
3130 		if (rscn_id == hba_id) {
3131 			/* ALL NPortIDs in RSCN are on HBA */
3132 			lpfc_printf_vlog(vport, KERN_INFO, LOG_DISCOVERY,
3133 					 "0214 Ignore RSCN "
3134 					 "Data: x%x x%x x%x x%x\n",
3135 					 vport->fc_flag, payload_len,
3136 					 *lp, vport->fc_rscn_id_cnt);
3137 			lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_UNSOL,
3138 				"RCV RSCN vport:  did:x%x/ste:x%x flg:x%x",
3139 				ndlp->nlp_DID, vport->port_state,
3140 				ndlp->nlp_flag);
3141 
3142 			lpfc_els_rsp_acc(vport, ELS_CMD_ACC, cmdiocb,
3143 				ndlp, NULL);
3144 			return 0;
3145 		}
3146 	}
3147 
3148 	spin_lock_irq(shost->host_lock);
3149 	if (vport->fc_rscn_flush) {
3150 		/* Another thread is walking fc_rscn_id_list on this vport */
3151 		spin_unlock_irq(shost->host_lock);
3152 		vport->fc_flag |= FC_RSCN_DISCOVERY;
3153 		/* Send back ACC */
3154 		lpfc_els_rsp_acc(vport, ELS_CMD_ACC, cmdiocb, ndlp, NULL);
3155 		return 0;
3156 	}
3157 	/* Indicate we are walking fc_rscn_id_list on this vport */
3158 	vport->fc_rscn_flush = 1;
3159 	spin_unlock_irq(shost->host_lock);
3160 	/* Get the array count after sucessfully have the token */
3161 	rscn_cnt = vport->fc_rscn_id_cnt;
3162 	/* If we are already processing an RSCN, save the received
3163 	 * RSCN payload buffer, cmdiocb->context2 to process later.
3164 	 */
3165 	if (vport->fc_flag & (FC_RSCN_MODE | FC_NDISC_ACTIVE)) {
3166 		lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_UNSOL,
3167 			"RCV RSCN defer:  did:x%x/ste:x%x flg:x%x",
3168 			ndlp->nlp_DID, vport->port_state, ndlp->nlp_flag);
3169 
3170 		spin_lock_irq(shost->host_lock);
3171 		vport->fc_flag |= FC_RSCN_DEFERRED;
3172 		if ((rscn_cnt < FC_MAX_HOLD_RSCN) &&
3173 		    !(vport->fc_flag & FC_RSCN_DISCOVERY)) {
3174 			vport->fc_flag |= FC_RSCN_MODE;
3175 			spin_unlock_irq(shost->host_lock);
3176 			if (rscn_cnt) {
3177 				cmd = vport->fc_rscn_id_list[rscn_cnt-1]->virt;
3178 				length = be32_to_cpu(*cmd & ~ELS_CMD_MASK);
3179 			}
3180 			if ((rscn_cnt) &&
3181 			    (payload_len + length <= LPFC_BPL_SIZE)) {
3182 				*cmd &= ELS_CMD_MASK;
3183 				*cmd |= cpu_to_be32(payload_len + length);
3184 				memcpy(((uint8_t *)cmd) + length, lp,
3185 				       payload_len);
3186 			} else {
3187 				vport->fc_rscn_id_list[rscn_cnt] = pcmd;
3188 				vport->fc_rscn_id_cnt++;
3189 				/* If we zero, cmdiocb->context2, the calling
3190 				 * routine will not try to free it.
3191 				 */
3192 				cmdiocb->context2 = NULL;
3193 			}
3194 			/* Deferred RSCN */
3195 			lpfc_printf_vlog(vport, KERN_INFO, LOG_DISCOVERY,
3196 					 "0235 Deferred RSCN "
3197 					 "Data: x%x x%x x%x\n",
3198 					 vport->fc_rscn_id_cnt, vport->fc_flag,
3199 					 vport->port_state);
3200 		} else {
3201 			vport->fc_flag |= FC_RSCN_DISCOVERY;
3202 			spin_unlock_irq(shost->host_lock);
3203 			/* ReDiscovery RSCN */
3204 			lpfc_printf_vlog(vport, KERN_INFO, LOG_DISCOVERY,
3205 					 "0234 ReDiscovery RSCN "
3206 					 "Data: x%x x%x x%x\n",
3207 					 vport->fc_rscn_id_cnt, vport->fc_flag,
3208 					 vport->port_state);
3209 		}
3210 		/* Indicate we are done walking fc_rscn_id_list on this vport */
3211 		vport->fc_rscn_flush = 0;
3212 		/* Send back ACC */
3213 		lpfc_els_rsp_acc(vport, ELS_CMD_ACC, cmdiocb, ndlp, NULL);
3214 		/* send RECOVERY event for ALL nodes that match RSCN payload */
3215 		lpfc_rscn_recovery_check(vport);
3216 		spin_lock_irq(shost->host_lock);
3217 		vport->fc_flag &= ~FC_RSCN_DEFERRED;
3218 		spin_unlock_irq(shost->host_lock);
3219 		return 0;
3220 	}
3221 	lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_UNSOL,
3222 		"RCV RSCN:        did:x%x/ste:x%x flg:x%x",
3223 		ndlp->nlp_DID, vport->port_state, ndlp->nlp_flag);
3224 
3225 	spin_lock_irq(shost->host_lock);
3226 	vport->fc_flag |= FC_RSCN_MODE;
3227 	spin_unlock_irq(shost->host_lock);
3228 	vport->fc_rscn_id_list[vport->fc_rscn_id_cnt++] = pcmd;
3229 	/* Indicate we are done walking fc_rscn_id_list on this vport */
3230 	vport->fc_rscn_flush = 0;
3231 	/*
3232 	 * If we zero, cmdiocb->context2, the calling routine will
3233 	 * not try to free it.
3234 	 */
3235 	cmdiocb->context2 = NULL;
3236 	lpfc_set_disctmo(vport);
3237 	/* Send back ACC */
3238 	lpfc_els_rsp_acc(vport, ELS_CMD_ACC, cmdiocb, ndlp, NULL);
3239 	/* send RECOVERY event for ALL nodes that match RSCN payload */
3240 	lpfc_rscn_recovery_check(vport);
3241 	return lpfc_els_handle_rscn(vport);
3242 }
3243 
3244 int
3245 lpfc_els_handle_rscn(struct lpfc_vport *vport)
3246 {
3247 	struct lpfc_nodelist *ndlp;
3248 	struct lpfc_hba *phba = vport->phba;
3249 
3250 	/* Ignore RSCN if the port is being torn down. */
3251 	if (vport->load_flag & FC_UNLOADING) {
3252 		lpfc_els_flush_rscn(vport);
3253 		return 0;
3254 	}
3255 
3256 	/* Start timer for RSCN processing */
3257 	lpfc_set_disctmo(vport);
3258 
3259 	/* RSCN processed */
3260 	lpfc_printf_vlog(vport, KERN_INFO, LOG_DISCOVERY,
3261 			 "0215 RSCN processed Data: x%x x%x x%x x%x\n",
3262 			 vport->fc_flag, 0, vport->fc_rscn_id_cnt,
3263 			 vport->port_state);
3264 
3265 	/* To process RSCN, first compare RSCN data with NameServer */
3266 	vport->fc_ns_retry = 0;
3267 	vport->num_disc_nodes = 0;
3268 
3269 	ndlp = lpfc_findnode_did(vport, NameServer_DID);
3270 	if (ndlp && NLP_CHK_NODE_ACT(ndlp)
3271 	    && ndlp->nlp_state == NLP_STE_UNMAPPED_NODE) {
3272 		/* Good ndlp, issue CT Request to NameServer */
3273 		if (lpfc_ns_cmd(vport, SLI_CTNS_GID_FT, 0, 0) == 0)
3274 			/* Wait for NameServer query cmpl before we can
3275 			   continue */
3276 			return 1;
3277 	} else {
3278 		/* If login to NameServer does not exist, issue one */
3279 		/* Good status, issue PLOGI to NameServer */
3280 		ndlp = lpfc_findnode_did(vport, NameServer_DID);
3281 		if (ndlp && NLP_CHK_NODE_ACT(ndlp))
3282 			/* Wait for NameServer login cmpl before we can
3283 			   continue */
3284 			return 1;
3285 
3286 		if (ndlp) {
3287 			ndlp = lpfc_enable_node(vport, ndlp,
3288 						NLP_STE_PLOGI_ISSUE);
3289 			if (!ndlp) {
3290 				lpfc_els_flush_rscn(vport);
3291 				return 0;
3292 			}
3293 			ndlp->nlp_prev_state = NLP_STE_UNUSED_NODE;
3294 		} else {
3295 			ndlp = mempool_alloc(phba->nlp_mem_pool, GFP_KERNEL);
3296 			if (!ndlp) {
3297 				lpfc_els_flush_rscn(vport);
3298 				return 0;
3299 			}
3300 			lpfc_nlp_init(vport, ndlp, NameServer_DID);
3301 			ndlp->nlp_prev_state = ndlp->nlp_state;
3302 			lpfc_nlp_set_state(vport, ndlp, NLP_STE_PLOGI_ISSUE);
3303 		}
3304 		ndlp->nlp_type |= NLP_FABRIC;
3305 		lpfc_issue_els_plogi(vport, NameServer_DID, 0);
3306 		/* Wait for NameServer login cmpl before we can
3307 		 * continue
3308 		 */
3309 		return 1;
3310 	}
3311 
3312 	lpfc_els_flush_rscn(vport);
3313 	return 0;
3314 }
3315 
3316 static int
3317 lpfc_els_rcv_flogi(struct lpfc_vport *vport, struct lpfc_iocbq *cmdiocb,
3318 		   struct lpfc_nodelist *ndlp)
3319 {
3320 	struct Scsi_Host *shost = lpfc_shost_from_vport(vport);
3321 	struct lpfc_hba  *phba = vport->phba;
3322 	struct lpfc_dmabuf *pcmd = (struct lpfc_dmabuf *) cmdiocb->context2;
3323 	uint32_t *lp = (uint32_t *) pcmd->virt;
3324 	IOCB_t *icmd = &cmdiocb->iocb;
3325 	struct serv_parm *sp;
3326 	LPFC_MBOXQ_t *mbox;
3327 	struct ls_rjt stat;
3328 	uint32_t cmd, did;
3329 	int rc;
3330 
3331 	cmd = *lp++;
3332 	sp = (struct serv_parm *) lp;
3333 
3334 	/* FLOGI received */
3335 
3336 	lpfc_set_disctmo(vport);
3337 
3338 	if (phba->fc_topology == TOPOLOGY_LOOP) {
3339 		/* We should never receive a FLOGI in loop mode, ignore it */
3340 		did = icmd->un.elsreq64.remoteID;
3341 
3342 		/* An FLOGI ELS command <elsCmd> was received from DID <did> in
3343 		   Loop Mode */
3344 		lpfc_printf_vlog(vport, KERN_ERR, LOG_ELS,
3345 				 "0113 An FLOGI ELS command x%x was "
3346 				 "received from DID x%x in Loop Mode\n",
3347 				 cmd, did);
3348 		return 1;
3349 	}
3350 
3351 	did = Fabric_DID;
3352 
3353 	if ((lpfc_check_sparm(vport, ndlp, sp, CLASS3))) {
3354 		/* For a FLOGI we accept, then if our portname is greater
3355 		 * then the remote portname we initiate Nport login.
3356 		 */
3357 
3358 		rc = memcmp(&vport->fc_portname, &sp->portName,
3359 			    sizeof(struct lpfc_name));
3360 
3361 		if (!rc) {
3362 			mbox = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL);
3363 			if (!mbox)
3364 				return 1;
3365 
3366 			lpfc_linkdown(phba);
3367 			lpfc_init_link(phba, mbox,
3368 				       phba->cfg_topology,
3369 				       phba->cfg_link_speed);
3370 			mbox->mb.un.varInitLnk.lipsr_AL_PA = 0;
3371 			mbox->mbox_cmpl = lpfc_sli_def_mbox_cmpl;
3372 			mbox->vport = vport;
3373 			rc = lpfc_sli_issue_mbox(phba, mbox, MBX_NOWAIT);
3374 			lpfc_set_loopback_flag(phba);
3375 			if (rc == MBX_NOT_FINISHED) {
3376 				mempool_free(mbox, phba->mbox_mem_pool);
3377 			}
3378 			return 1;
3379 		} else if (rc > 0) {	/* greater than */
3380 			spin_lock_irq(shost->host_lock);
3381 			vport->fc_flag |= FC_PT2PT_PLOGI;
3382 			spin_unlock_irq(shost->host_lock);
3383 		}
3384 		spin_lock_irq(shost->host_lock);
3385 		vport->fc_flag |= FC_PT2PT;
3386 		vport->fc_flag &= ~(FC_FABRIC | FC_PUBLIC_LOOP);
3387 		spin_unlock_irq(shost->host_lock);
3388 	} else {
3389 		/* Reject this request because invalid parameters */
3390 		stat.un.b.lsRjtRsvd0 = 0;
3391 		stat.un.b.lsRjtRsnCode = LSRJT_UNABLE_TPC;
3392 		stat.un.b.lsRjtRsnCodeExp = LSEXP_SPARM_OPTIONS;
3393 		stat.un.b.vendorUnique = 0;
3394 		lpfc_els_rsp_reject(vport, stat.un.lsRjtError, cmdiocb, ndlp,
3395 			NULL);
3396 		return 1;
3397 	}
3398 
3399 	/* Send back ACC */
3400 	lpfc_els_rsp_acc(vport, ELS_CMD_PLOGI, cmdiocb, ndlp, NULL);
3401 
3402 	return 0;
3403 }
3404 
3405 static int
3406 lpfc_els_rcv_rnid(struct lpfc_vport *vport, struct lpfc_iocbq *cmdiocb,
3407 		  struct lpfc_nodelist *ndlp)
3408 {
3409 	struct lpfc_dmabuf *pcmd;
3410 	uint32_t *lp;
3411 	IOCB_t *icmd;
3412 	RNID *rn;
3413 	struct ls_rjt stat;
3414 	uint32_t cmd, did;
3415 
3416 	icmd = &cmdiocb->iocb;
3417 	did = icmd->un.elsreq64.remoteID;
3418 	pcmd = (struct lpfc_dmabuf *) cmdiocb->context2;
3419 	lp = (uint32_t *) pcmd->virt;
3420 
3421 	cmd = *lp++;
3422 	rn = (RNID *) lp;
3423 
3424 	/* RNID received */
3425 
3426 	switch (rn->Format) {
3427 	case 0:
3428 	case RNID_TOPOLOGY_DISC:
3429 		/* Send back ACC */
3430 		lpfc_els_rsp_rnid_acc(vport, rn->Format, cmdiocb, ndlp);
3431 		break;
3432 	default:
3433 		/* Reject this request because format not supported */
3434 		stat.un.b.lsRjtRsvd0 = 0;
3435 		stat.un.b.lsRjtRsnCode = LSRJT_UNABLE_TPC;
3436 		stat.un.b.lsRjtRsnCodeExp = LSEXP_CANT_GIVE_DATA;
3437 		stat.un.b.vendorUnique = 0;
3438 		lpfc_els_rsp_reject(vport, stat.un.lsRjtError, cmdiocb, ndlp,
3439 			NULL);
3440 	}
3441 	return 0;
3442 }
3443 
3444 static int
3445 lpfc_els_rcv_lirr(struct lpfc_vport *vport, struct lpfc_iocbq *cmdiocb,
3446 		  struct lpfc_nodelist *ndlp)
3447 {
3448 	struct ls_rjt stat;
3449 
3450 	/* For now, unconditionally reject this command */
3451 	stat.un.b.lsRjtRsvd0 = 0;
3452 	stat.un.b.lsRjtRsnCode = LSRJT_UNABLE_TPC;
3453 	stat.un.b.lsRjtRsnCodeExp = LSEXP_CANT_GIVE_DATA;
3454 	stat.un.b.vendorUnique = 0;
3455 	lpfc_els_rsp_reject(vport, stat.un.lsRjtError, cmdiocb, ndlp, NULL);
3456 	return 0;
3457 }
3458 
3459 static void
3460 lpfc_els_rsp_rps_acc(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmb)
3461 {
3462 	struct lpfc_sli *psli = &phba->sli;
3463 	struct lpfc_sli_ring *pring = &psli->ring[LPFC_ELS_RING];
3464 	MAILBOX_t *mb;
3465 	IOCB_t *icmd;
3466 	RPS_RSP *rps_rsp;
3467 	uint8_t *pcmd;
3468 	struct lpfc_iocbq *elsiocb;
3469 	struct lpfc_nodelist *ndlp;
3470 	uint16_t xri, status;
3471 	uint32_t cmdsize;
3472 
3473 	mb = &pmb->mb;
3474 
3475 	ndlp = (struct lpfc_nodelist *) pmb->context2;
3476 	xri = (uint16_t) ((unsigned long)(pmb->context1));
3477 	pmb->context1 = NULL;
3478 	pmb->context2 = NULL;
3479 
3480 	if (mb->mbxStatus) {
3481 		mempool_free(pmb, phba->mbox_mem_pool);
3482 		return;
3483 	}
3484 
3485 	cmdsize = sizeof(RPS_RSP) + sizeof(uint32_t);
3486 	mempool_free(pmb, phba->mbox_mem_pool);
3487 	elsiocb = lpfc_prep_els_iocb(phba->pport, 0, cmdsize,
3488 				     lpfc_max_els_tries, ndlp,
3489 				     ndlp->nlp_DID, ELS_CMD_ACC);
3490 
3491 	/* Decrement the ndlp reference count from previous mbox command */
3492 	lpfc_nlp_put(ndlp);
3493 
3494 	if (!elsiocb)
3495 		return;
3496 
3497 	icmd = &elsiocb->iocb;
3498 	icmd->ulpContext = xri;
3499 
3500 	pcmd = (uint8_t *) (((struct lpfc_dmabuf *) elsiocb->context2)->virt);
3501 	*((uint32_t *) (pcmd)) = ELS_CMD_ACC;
3502 	pcmd += sizeof(uint32_t); /* Skip past command */
3503 	rps_rsp = (RPS_RSP *)pcmd;
3504 
3505 	if (phba->fc_topology != TOPOLOGY_LOOP)
3506 		status = 0x10;
3507 	else
3508 		status = 0x8;
3509 	if (phba->pport->fc_flag & FC_FABRIC)
3510 		status |= 0x4;
3511 
3512 	rps_rsp->rsvd1 = 0;
3513 	rps_rsp->portStatus = cpu_to_be16(status);
3514 	rps_rsp->linkFailureCnt = cpu_to_be32(mb->un.varRdLnk.linkFailureCnt);
3515 	rps_rsp->lossSyncCnt = cpu_to_be32(mb->un.varRdLnk.lossSyncCnt);
3516 	rps_rsp->lossSignalCnt = cpu_to_be32(mb->un.varRdLnk.lossSignalCnt);
3517 	rps_rsp->primSeqErrCnt = cpu_to_be32(mb->un.varRdLnk.primSeqErrCnt);
3518 	rps_rsp->invalidXmitWord = cpu_to_be32(mb->un.varRdLnk.invalidXmitWord);
3519 	rps_rsp->crcCnt = cpu_to_be32(mb->un.varRdLnk.crcCnt);
3520 	/* Xmit ELS RPS ACC response tag <ulpIoTag> */
3521 	lpfc_printf_vlog(ndlp->vport, KERN_INFO, LOG_ELS,
3522 			 "0118 Xmit ELS RPS ACC response tag x%x xri x%x, "
3523 			 "did x%x, nlp_flag x%x, nlp_state x%x, rpi x%x\n",
3524 			 elsiocb->iotag, elsiocb->iocb.ulpContext,
3525 			 ndlp->nlp_DID, ndlp->nlp_flag, ndlp->nlp_state,
3526 			 ndlp->nlp_rpi);
3527 	elsiocb->iocb_cmpl = lpfc_cmpl_els_rsp;
3528 	phba->fc_stat.elsXmitACC++;
3529 	if (lpfc_sli_issue_iocb(phba, pring, elsiocb, 0) == IOCB_ERROR)
3530 		lpfc_els_free_iocb(phba, elsiocb);
3531 	return;
3532 }
3533 
3534 static int
3535 lpfc_els_rcv_rps(struct lpfc_vport *vport, struct lpfc_iocbq *cmdiocb,
3536 		 struct lpfc_nodelist *ndlp)
3537 {
3538 	struct lpfc_hba *phba = vport->phba;
3539 	uint32_t *lp;
3540 	uint8_t flag;
3541 	LPFC_MBOXQ_t *mbox;
3542 	struct lpfc_dmabuf *pcmd;
3543 	RPS *rps;
3544 	struct ls_rjt stat;
3545 
3546 	if ((ndlp->nlp_state != NLP_STE_UNMAPPED_NODE) &&
3547 	    (ndlp->nlp_state != NLP_STE_MAPPED_NODE)) {
3548 		stat.un.b.lsRjtRsvd0 = 0;
3549 		stat.un.b.lsRjtRsnCode = LSRJT_UNABLE_TPC;
3550 		stat.un.b.lsRjtRsnCodeExp = LSEXP_CANT_GIVE_DATA;
3551 		stat.un.b.vendorUnique = 0;
3552 		lpfc_els_rsp_reject(vport, stat.un.lsRjtError, cmdiocb, ndlp,
3553 			NULL);
3554 	}
3555 
3556 	pcmd = (struct lpfc_dmabuf *) cmdiocb->context2;
3557 	lp = (uint32_t *) pcmd->virt;
3558 	flag = (be32_to_cpu(*lp++) & 0xf);
3559 	rps = (RPS *) lp;
3560 
3561 	if ((flag == 0) ||
3562 	    ((flag == 1) && (be32_to_cpu(rps->un.portNum) == 0)) ||
3563 	    ((flag == 2) && (memcmp(&rps->un.portName, &vport->fc_portname,
3564 				    sizeof(struct lpfc_name)) == 0))) {
3565 
3566 		printk("Fix me....\n");
3567 		dump_stack();
3568 		mbox = mempool_alloc(phba->mbox_mem_pool, GFP_ATOMIC);
3569 		if (mbox) {
3570 			lpfc_read_lnk_stat(phba, mbox);
3571 			mbox->context1 =
3572 			    (void *)((unsigned long) cmdiocb->iocb.ulpContext);
3573 			mbox->context2 = lpfc_nlp_get(ndlp);
3574 			mbox->vport = vport;
3575 			mbox->mbox_cmpl = lpfc_els_rsp_rps_acc;
3576 			if (lpfc_sli_issue_mbox(phba, mbox, MBX_NOWAIT)
3577 				!= MBX_NOT_FINISHED)
3578 				/* Mbox completion will send ELS Response */
3579 				return 0;
3580 			/* Decrement reference count used for the failed mbox
3581 			 * command.
3582 			 */
3583 			lpfc_nlp_put(ndlp);
3584 			mempool_free(mbox, phba->mbox_mem_pool);
3585 		}
3586 	}
3587 	stat.un.b.lsRjtRsvd0 = 0;
3588 	stat.un.b.lsRjtRsnCode = LSRJT_UNABLE_TPC;
3589 	stat.un.b.lsRjtRsnCodeExp = LSEXP_CANT_GIVE_DATA;
3590 	stat.un.b.vendorUnique = 0;
3591 	lpfc_els_rsp_reject(vport, stat.un.lsRjtError, cmdiocb, ndlp, NULL);
3592 	return 0;
3593 }
3594 
3595 static int
3596 lpfc_els_rsp_rpl_acc(struct lpfc_vport *vport, uint16_t cmdsize,
3597 		     struct lpfc_iocbq *oldiocb, struct lpfc_nodelist *ndlp)
3598 {
3599 	struct lpfc_hba *phba = vport->phba;
3600 	IOCB_t *icmd, *oldcmd;
3601 	RPL_RSP rpl_rsp;
3602 	struct lpfc_iocbq *elsiocb;
3603 	struct lpfc_sli *psli = &phba->sli;
3604 	struct lpfc_sli_ring *pring = &psli->ring[LPFC_ELS_RING];
3605 	uint8_t *pcmd;
3606 
3607 	elsiocb = lpfc_prep_els_iocb(vport, 0, cmdsize, oldiocb->retry, ndlp,
3608 				     ndlp->nlp_DID, ELS_CMD_ACC);
3609 
3610 	if (!elsiocb)
3611 		return 1;
3612 
3613 	icmd = &elsiocb->iocb;
3614 	oldcmd = &oldiocb->iocb;
3615 	icmd->ulpContext = oldcmd->ulpContext;	/* Xri */
3616 
3617 	pcmd = (((struct lpfc_dmabuf *) elsiocb->context2)->virt);
3618 	*((uint32_t *) (pcmd)) = ELS_CMD_ACC;
3619 	pcmd += sizeof(uint16_t);
3620 	*((uint16_t *)(pcmd)) = be16_to_cpu(cmdsize);
3621 	pcmd += sizeof(uint16_t);
3622 
3623 	/* Setup the RPL ACC payload */
3624 	rpl_rsp.listLen = be32_to_cpu(1);
3625 	rpl_rsp.index = 0;
3626 	rpl_rsp.port_num_blk.portNum = 0;
3627 	rpl_rsp.port_num_blk.portID = be32_to_cpu(vport->fc_myDID);
3628 	memcpy(&rpl_rsp.port_num_blk.portName, &vport->fc_portname,
3629 	    sizeof(struct lpfc_name));
3630 	memcpy(pcmd, &rpl_rsp, cmdsize - sizeof(uint32_t));
3631 	/* Xmit ELS RPL ACC response tag <ulpIoTag> */
3632 	lpfc_printf_vlog(vport, KERN_INFO, LOG_ELS,
3633 			 "0120 Xmit ELS RPL ACC response tag x%x "
3634 			 "xri x%x, did x%x, nlp_flag x%x, nlp_state x%x, "
3635 			 "rpi x%x\n",
3636 			 elsiocb->iotag, elsiocb->iocb.ulpContext,
3637 			 ndlp->nlp_DID, ndlp->nlp_flag, ndlp->nlp_state,
3638 			 ndlp->nlp_rpi);
3639 	elsiocb->iocb_cmpl = lpfc_cmpl_els_rsp;
3640 	phba->fc_stat.elsXmitACC++;
3641 	if (lpfc_sli_issue_iocb(phba, pring, elsiocb, 0) == IOCB_ERROR) {
3642 		lpfc_els_free_iocb(phba, elsiocb);
3643 		return 1;
3644 	}
3645 	return 0;
3646 }
3647 
3648 static int
3649 lpfc_els_rcv_rpl(struct lpfc_vport *vport, struct lpfc_iocbq *cmdiocb,
3650 		 struct lpfc_nodelist *ndlp)
3651 {
3652 	struct lpfc_dmabuf *pcmd;
3653 	uint32_t *lp;
3654 	uint32_t maxsize;
3655 	uint16_t cmdsize;
3656 	RPL *rpl;
3657 	struct ls_rjt stat;
3658 
3659 	if ((ndlp->nlp_state != NLP_STE_UNMAPPED_NODE) &&
3660 	    (ndlp->nlp_state != NLP_STE_MAPPED_NODE)) {
3661 		stat.un.b.lsRjtRsvd0 = 0;
3662 		stat.un.b.lsRjtRsnCode = LSRJT_UNABLE_TPC;
3663 		stat.un.b.lsRjtRsnCodeExp = LSEXP_CANT_GIVE_DATA;
3664 		stat.un.b.vendorUnique = 0;
3665 		lpfc_els_rsp_reject(vport, stat.un.lsRjtError, cmdiocb, ndlp,
3666 			NULL);
3667 	}
3668 
3669 	pcmd = (struct lpfc_dmabuf *) cmdiocb->context2;
3670 	lp = (uint32_t *) pcmd->virt;
3671 	rpl = (RPL *) (lp + 1);
3672 
3673 	maxsize = be32_to_cpu(rpl->maxsize);
3674 
3675 	/* We support only one port */
3676 	if ((rpl->index == 0) &&
3677 	    ((maxsize == 0) ||
3678 	     ((maxsize * sizeof(uint32_t)) >= sizeof(RPL_RSP)))) {
3679 		cmdsize = sizeof(uint32_t) + sizeof(RPL_RSP);
3680 	} else {
3681 		cmdsize = sizeof(uint32_t) + maxsize * sizeof(uint32_t);
3682 	}
3683 	lpfc_els_rsp_rpl_acc(vport, cmdsize, cmdiocb, ndlp);
3684 
3685 	return 0;
3686 }
3687 
3688 static int
3689 lpfc_els_rcv_farp(struct lpfc_vport *vport, struct lpfc_iocbq *cmdiocb,
3690 		  struct lpfc_nodelist *ndlp)
3691 {
3692 	struct lpfc_dmabuf *pcmd;
3693 	uint32_t *lp;
3694 	IOCB_t *icmd;
3695 	FARP *fp;
3696 	uint32_t cmd, cnt, did;
3697 
3698 	icmd = &cmdiocb->iocb;
3699 	did = icmd->un.elsreq64.remoteID;
3700 	pcmd = (struct lpfc_dmabuf *) cmdiocb->context2;
3701 	lp = (uint32_t *) pcmd->virt;
3702 
3703 	cmd = *lp++;
3704 	fp = (FARP *) lp;
3705 	/* FARP-REQ received from DID <did> */
3706 	lpfc_printf_vlog(vport, KERN_INFO, LOG_ELS,
3707 			 "0601 FARP-REQ received from DID x%x\n", did);
3708 	/* We will only support match on WWPN or WWNN */
3709 	if (fp->Mflags & ~(FARP_MATCH_NODE | FARP_MATCH_PORT)) {
3710 		return 0;
3711 	}
3712 
3713 	cnt = 0;
3714 	/* If this FARP command is searching for my portname */
3715 	if (fp->Mflags & FARP_MATCH_PORT) {
3716 		if (memcmp(&fp->RportName, &vport->fc_portname,
3717 			   sizeof(struct lpfc_name)) == 0)
3718 			cnt = 1;
3719 	}
3720 
3721 	/* If this FARP command is searching for my nodename */
3722 	if (fp->Mflags & FARP_MATCH_NODE) {
3723 		if (memcmp(&fp->RnodeName, &vport->fc_nodename,
3724 			   sizeof(struct lpfc_name)) == 0)
3725 			cnt = 1;
3726 	}
3727 
3728 	if (cnt) {
3729 		if ((ndlp->nlp_state == NLP_STE_UNMAPPED_NODE) ||
3730 		   (ndlp->nlp_state == NLP_STE_MAPPED_NODE)) {
3731 			/* Log back into the node before sending the FARP. */
3732 			if (fp->Rflags & FARP_REQUEST_PLOGI) {
3733 				ndlp->nlp_prev_state = ndlp->nlp_state;
3734 				lpfc_nlp_set_state(vport, ndlp,
3735 						   NLP_STE_PLOGI_ISSUE);
3736 				lpfc_issue_els_plogi(vport, ndlp->nlp_DID, 0);
3737 			}
3738 
3739 			/* Send a FARP response to that node */
3740 			if (fp->Rflags & FARP_REQUEST_FARPR)
3741 				lpfc_issue_els_farpr(vport, did, 0);
3742 		}
3743 	}
3744 	return 0;
3745 }
3746 
3747 static int
3748 lpfc_els_rcv_farpr(struct lpfc_vport *vport, struct lpfc_iocbq *cmdiocb,
3749 		   struct lpfc_nodelist  *ndlp)
3750 {
3751 	struct lpfc_dmabuf *pcmd;
3752 	uint32_t *lp;
3753 	IOCB_t *icmd;
3754 	uint32_t cmd, did;
3755 
3756 	icmd = &cmdiocb->iocb;
3757 	did = icmd->un.elsreq64.remoteID;
3758 	pcmd = (struct lpfc_dmabuf *) cmdiocb->context2;
3759 	lp = (uint32_t *) pcmd->virt;
3760 
3761 	cmd = *lp++;
3762 	/* FARP-RSP received from DID <did> */
3763 	lpfc_printf_vlog(vport, KERN_INFO, LOG_ELS,
3764 			 "0600 FARP-RSP received from DID x%x\n", did);
3765 	/* ACCEPT the Farp resp request */
3766 	lpfc_els_rsp_acc(vport, ELS_CMD_ACC, cmdiocb, ndlp, NULL);
3767 
3768 	return 0;
3769 }
3770 
3771 static int
3772 lpfc_els_rcv_fan(struct lpfc_vport *vport, struct lpfc_iocbq *cmdiocb,
3773 		 struct lpfc_nodelist *fan_ndlp)
3774 {
3775 	struct lpfc_hba *phba = vport->phba;
3776 	uint32_t *lp;
3777 	FAN *fp;
3778 
3779 	lpfc_printf_vlog(vport, KERN_INFO, LOG_ELS, "0265 FAN received\n");
3780 	lp = (uint32_t *)((struct lpfc_dmabuf *)cmdiocb->context2)->virt;
3781 	fp = (FAN *) ++lp;
3782 	/* FAN received; Fan does not have a reply sequence */
3783 	if ((vport == phba->pport) &&
3784 	    (vport->port_state == LPFC_LOCAL_CFG_LINK)) {
3785 		if ((memcmp(&phba->fc_fabparam.nodeName, &fp->FnodeName,
3786 			    sizeof(struct lpfc_name))) ||
3787 		    (memcmp(&phba->fc_fabparam.portName, &fp->FportName,
3788 			    sizeof(struct lpfc_name)))) {
3789 			/* This port has switched fabrics. FLOGI is required */
3790 			lpfc_initial_flogi(vport);
3791 		} else {
3792 			/* FAN verified - skip FLOGI */
3793 			vport->fc_myDID = vport->fc_prevDID;
3794 			lpfc_issue_fabric_reglogin(vport);
3795 		}
3796 	}
3797 	return 0;
3798 }
3799 
3800 void
3801 lpfc_els_timeout(unsigned long ptr)
3802 {
3803 	struct lpfc_vport *vport = (struct lpfc_vport *) ptr;
3804 	struct lpfc_hba   *phba = vport->phba;
3805 	uint32_t tmo_posted;
3806 	unsigned long iflag;
3807 
3808 	spin_lock_irqsave(&vport->work_port_lock, iflag);
3809 	tmo_posted = vport->work_port_events & WORKER_ELS_TMO;
3810 	if (!tmo_posted)
3811 		vport->work_port_events |= WORKER_ELS_TMO;
3812 	spin_unlock_irqrestore(&vport->work_port_lock, iflag);
3813 
3814 	if (!tmo_posted)
3815 		lpfc_worker_wake_up(phba);
3816 	return;
3817 }
3818 
3819 void
3820 lpfc_els_timeout_handler(struct lpfc_vport *vport)
3821 {
3822 	struct lpfc_hba  *phba = vport->phba;
3823 	struct lpfc_sli_ring *pring;
3824 	struct lpfc_iocbq *tmp_iocb, *piocb;
3825 	IOCB_t *cmd = NULL;
3826 	struct lpfc_dmabuf *pcmd;
3827 	uint32_t els_command = 0;
3828 	uint32_t timeout;
3829 	uint32_t remote_ID = 0xffffffff;
3830 
3831 	/* If the timer is already canceled do nothing */
3832 	if ((vport->work_port_events & WORKER_ELS_TMO) == 0) {
3833 		return;
3834 	}
3835 	spin_lock_irq(&phba->hbalock);
3836 	timeout = (uint32_t)(phba->fc_ratov << 1);
3837 
3838 	pring = &phba->sli.ring[LPFC_ELS_RING];
3839 
3840 	list_for_each_entry_safe(piocb, tmp_iocb, &pring->txcmplq, list) {
3841 		cmd = &piocb->iocb;
3842 
3843 		if ((piocb->iocb_flag & LPFC_IO_LIBDFC) != 0 ||
3844 		    piocb->iocb.ulpCommand == CMD_ABORT_XRI_CN ||
3845 		    piocb->iocb.ulpCommand == CMD_CLOSE_XRI_CN)
3846 			continue;
3847 
3848 		if (piocb->vport != vport)
3849 			continue;
3850 
3851 		pcmd = (struct lpfc_dmabuf *) piocb->context2;
3852 		if (pcmd)
3853 			els_command = *(uint32_t *) (pcmd->virt);
3854 
3855 		if (els_command == ELS_CMD_FARP ||
3856 		    els_command == ELS_CMD_FARPR ||
3857 		    els_command == ELS_CMD_FDISC)
3858 			continue;
3859 
3860 		if (piocb->drvrTimeout > 0) {
3861 			if (piocb->drvrTimeout >= timeout)
3862 				piocb->drvrTimeout -= timeout;
3863 			else
3864 				piocb->drvrTimeout = 0;
3865 			continue;
3866 		}
3867 
3868 		remote_ID = 0xffffffff;
3869 		if (cmd->ulpCommand != CMD_GEN_REQUEST64_CR)
3870 			remote_ID = cmd->un.elsreq64.remoteID;
3871 		else {
3872 			struct lpfc_nodelist *ndlp;
3873 			ndlp = __lpfc_findnode_rpi(vport, cmd->ulpContext);
3874 			if (ndlp && NLP_CHK_NODE_ACT(ndlp))
3875 				remote_ID = ndlp->nlp_DID;
3876 		}
3877 		lpfc_printf_vlog(vport, KERN_ERR, LOG_ELS,
3878 				 "0127 ELS timeout Data: x%x x%x x%x "
3879 				 "x%x\n", els_command,
3880 				 remote_ID, cmd->ulpCommand, cmd->ulpIoTag);
3881 		lpfc_sli_issue_abort_iotag(phba, pring, piocb);
3882 	}
3883 	spin_unlock_irq(&phba->hbalock);
3884 
3885 	if (phba->sli.ring[LPFC_ELS_RING].txcmplq_cnt)
3886 		mod_timer(&vport->els_tmofunc, jiffies + HZ * timeout);
3887 }
3888 
3889 void
3890 lpfc_els_flush_cmd(struct lpfc_vport *vport)
3891 {
3892 	LIST_HEAD(completions);
3893 	struct lpfc_hba  *phba = vport->phba;
3894 	struct lpfc_sli_ring *pring = &phba->sli.ring[LPFC_ELS_RING];
3895 	struct lpfc_iocbq *tmp_iocb, *piocb;
3896 	IOCB_t *cmd = NULL;
3897 
3898 	lpfc_fabric_abort_vport(vport);
3899 
3900 	spin_lock_irq(&phba->hbalock);
3901 	list_for_each_entry_safe(piocb, tmp_iocb, &pring->txq, list) {
3902 		cmd = &piocb->iocb;
3903 
3904 		if (piocb->iocb_flag & LPFC_IO_LIBDFC) {
3905 			continue;
3906 		}
3907 
3908 		/* Do not flush out the QUE_RING and ABORT/CLOSE iocbs */
3909 		if (cmd->ulpCommand == CMD_QUE_RING_BUF_CN ||
3910 		    cmd->ulpCommand == CMD_QUE_RING_BUF64_CN ||
3911 		    cmd->ulpCommand == CMD_CLOSE_XRI_CN ||
3912 		    cmd->ulpCommand == CMD_ABORT_XRI_CN)
3913 			continue;
3914 
3915 		if (piocb->vport != vport)
3916 			continue;
3917 
3918 		list_move_tail(&piocb->list, &completions);
3919 		pring->txq_cnt--;
3920 	}
3921 
3922 	list_for_each_entry_safe(piocb, tmp_iocb, &pring->txcmplq, list) {
3923 		if (piocb->iocb_flag & LPFC_IO_LIBDFC) {
3924 			continue;
3925 		}
3926 
3927 		if (piocb->vport != vport)
3928 			continue;
3929 
3930 		lpfc_sli_issue_abort_iotag(phba, pring, piocb);
3931 	}
3932 	spin_unlock_irq(&phba->hbalock);
3933 
3934 	while (!list_empty(&completions)) {
3935 		piocb = list_get_first(&completions, struct lpfc_iocbq, list);
3936 		cmd = &piocb->iocb;
3937 		list_del_init(&piocb->list);
3938 
3939 		if (!piocb->iocb_cmpl)
3940 			lpfc_sli_release_iocbq(phba, piocb);
3941 		else {
3942 			cmd->ulpStatus = IOSTAT_LOCAL_REJECT;
3943 			cmd->un.ulpWord[4] = IOERR_SLI_ABORTED;
3944 			(piocb->iocb_cmpl) (phba, piocb, piocb);
3945 		}
3946 	}
3947 
3948 	return;
3949 }
3950 
3951 void
3952 lpfc_els_flush_all_cmd(struct lpfc_hba  *phba)
3953 {
3954 	LIST_HEAD(completions);
3955 	struct lpfc_sli_ring *pring = &phba->sli.ring[LPFC_ELS_RING];
3956 	struct lpfc_iocbq *tmp_iocb, *piocb;
3957 	IOCB_t *cmd = NULL;
3958 
3959 	lpfc_fabric_abort_hba(phba);
3960 	spin_lock_irq(&phba->hbalock);
3961 	list_for_each_entry_safe(piocb, tmp_iocb, &pring->txq, list) {
3962 		cmd = &piocb->iocb;
3963 		if (piocb->iocb_flag & LPFC_IO_LIBDFC)
3964 			continue;
3965 		/* Do not flush out the QUE_RING and ABORT/CLOSE iocbs */
3966 		if (cmd->ulpCommand == CMD_QUE_RING_BUF_CN ||
3967 		    cmd->ulpCommand == CMD_QUE_RING_BUF64_CN ||
3968 		    cmd->ulpCommand == CMD_CLOSE_XRI_CN ||
3969 		    cmd->ulpCommand == CMD_ABORT_XRI_CN)
3970 			continue;
3971 		list_move_tail(&piocb->list, &completions);
3972 		pring->txq_cnt--;
3973 	}
3974 	list_for_each_entry_safe(piocb, tmp_iocb, &pring->txcmplq, list) {
3975 		if (piocb->iocb_flag & LPFC_IO_LIBDFC)
3976 			continue;
3977 		lpfc_sli_issue_abort_iotag(phba, pring, piocb);
3978 	}
3979 	spin_unlock_irq(&phba->hbalock);
3980 	while (!list_empty(&completions)) {
3981 		piocb = list_get_first(&completions, struct lpfc_iocbq, list);
3982 		cmd = &piocb->iocb;
3983 		list_del_init(&piocb->list);
3984 		if (!piocb->iocb_cmpl)
3985 			lpfc_sli_release_iocbq(phba, piocb);
3986 		else {
3987 			cmd->ulpStatus = IOSTAT_LOCAL_REJECT;
3988 			cmd->un.ulpWord[4] = IOERR_SLI_ABORTED;
3989 			(piocb->iocb_cmpl) (phba, piocb, piocb);
3990 		}
3991 	}
3992 	return;
3993 }
3994 
3995 static void
3996 lpfc_els_unsol_buffer(struct lpfc_hba *phba, struct lpfc_sli_ring *pring,
3997 		      struct lpfc_vport *vport, struct lpfc_iocbq *elsiocb)
3998 {
3999 	struct Scsi_Host  *shost;
4000 	struct lpfc_nodelist *ndlp;
4001 	struct ls_rjt stat;
4002 	uint32_t *payload;
4003 	uint32_t cmd, did, newnode, rjt_err = 0;
4004 	IOCB_t *icmd = &elsiocb->iocb;
4005 
4006 	if (!vport || !(elsiocb->context2))
4007 		goto dropit;
4008 
4009 	newnode = 0;
4010 	payload = ((struct lpfc_dmabuf *)elsiocb->context2)->virt;
4011 	cmd = *payload;
4012 	if ((phba->sli3_options & LPFC_SLI3_HBQ_ENABLED) == 0)
4013 		lpfc_post_buffer(phba, pring, 1);
4014 
4015 	did = icmd->un.rcvels.remoteID;
4016 	if (icmd->ulpStatus) {
4017 		lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_UNSOL,
4018 			"RCV Unsol ELS:  status:x%x/x%x did:x%x",
4019 			icmd->ulpStatus, icmd->un.ulpWord[4], did);
4020 		goto dropit;
4021 	}
4022 
4023 	/* Check to see if link went down during discovery */
4024 	if (lpfc_els_chk_latt(vport))
4025 		goto dropit;
4026 
4027 	/* Ignore traffic recevied during vport shutdown. */
4028 	if (vport->load_flag & FC_UNLOADING)
4029 		goto dropit;
4030 
4031 	ndlp = lpfc_findnode_did(vport, did);
4032 	if (!ndlp) {
4033 		/* Cannot find existing Fabric ndlp, so allocate a new one */
4034 		ndlp = mempool_alloc(phba->nlp_mem_pool, GFP_KERNEL);
4035 		if (!ndlp)
4036 			goto dropit;
4037 
4038 		lpfc_nlp_init(vport, ndlp, did);
4039 		lpfc_nlp_set_state(vport, ndlp, NLP_STE_NPR_NODE);
4040 		newnode = 1;
4041 		if ((did & Fabric_DID_MASK) == Fabric_DID_MASK)
4042 			ndlp->nlp_type |= NLP_FABRIC;
4043 	} else if (!NLP_CHK_NODE_ACT(ndlp)) {
4044 		ndlp = lpfc_enable_node(vport, ndlp,
4045 					NLP_STE_UNUSED_NODE);
4046 		if (!ndlp)
4047 			goto dropit;
4048 		lpfc_nlp_set_state(vport, ndlp, NLP_STE_NPR_NODE);
4049 		newnode = 1;
4050 		if ((did & Fabric_DID_MASK) == Fabric_DID_MASK)
4051 			ndlp->nlp_type |= NLP_FABRIC;
4052 	} else if (ndlp->nlp_state == NLP_STE_UNUSED_NODE) {
4053 		/* This is similar to the new node path */
4054 		ndlp = lpfc_nlp_get(ndlp);
4055 		if (!ndlp)
4056 			goto dropit;
4057 		lpfc_nlp_set_state(vport, ndlp, NLP_STE_NPR_NODE);
4058 		newnode = 1;
4059 	}
4060 
4061 	phba->fc_stat.elsRcvFrame++;
4062 	if (elsiocb->context1)
4063 		lpfc_nlp_put(elsiocb->context1);
4064 
4065 	elsiocb->context1 = lpfc_nlp_get(ndlp);
4066 	elsiocb->vport = vport;
4067 
4068 	if ((cmd & ELS_CMD_MASK) == ELS_CMD_RSCN) {
4069 		cmd &= ELS_CMD_MASK;
4070 	}
4071 	/* ELS command <elsCmd> received from NPORT <did> */
4072 	lpfc_printf_vlog(vport, KERN_INFO, LOG_ELS,
4073 			 "0112 ELS command x%x received from NPORT x%x "
4074 			 "Data: x%x\n", cmd, did, vport->port_state);
4075 	switch (cmd) {
4076 	case ELS_CMD_PLOGI:
4077 		lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_UNSOL,
4078 			"RCV PLOGI:       did:x%x/ste:x%x flg:x%x",
4079 			did, vport->port_state, ndlp->nlp_flag);
4080 
4081 		phba->fc_stat.elsRcvPLOGI++;
4082 		ndlp = lpfc_plogi_confirm_nport(phba, payload, ndlp);
4083 
4084 		if (vport->port_state < LPFC_DISC_AUTH) {
4085 			if (!(phba->pport->fc_flag & FC_PT2PT) ||
4086 				(phba->pport->fc_flag & FC_PT2PT_PLOGI)) {
4087 				rjt_err = LSRJT_UNABLE_TPC;
4088 				break;
4089 			}
4090 			/* We get here, and drop thru, if we are PT2PT with
4091 			 * another NPort and the other side has initiated
4092 			 * the PLOGI before responding to our FLOGI.
4093 			 */
4094 		}
4095 
4096 		shost = lpfc_shost_from_vport(vport);
4097 		spin_lock_irq(shost->host_lock);
4098 		ndlp->nlp_flag &= ~NLP_TARGET_REMOVE;
4099 		spin_unlock_irq(shost->host_lock);
4100 
4101 		lpfc_disc_state_machine(vport, ndlp, elsiocb,
4102 					NLP_EVT_RCV_PLOGI);
4103 
4104 		break;
4105 	case ELS_CMD_FLOGI:
4106 		lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_UNSOL,
4107 			"RCV FLOGI:       did:x%x/ste:x%x flg:x%x",
4108 			did, vport->port_state, ndlp->nlp_flag);
4109 
4110 		phba->fc_stat.elsRcvFLOGI++;
4111 		lpfc_els_rcv_flogi(vport, elsiocb, ndlp);
4112 		if (newnode)
4113 			lpfc_nlp_put(ndlp);
4114 		break;
4115 	case ELS_CMD_LOGO:
4116 		lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_UNSOL,
4117 			"RCV LOGO:        did:x%x/ste:x%x flg:x%x",
4118 			did, vport->port_state, ndlp->nlp_flag);
4119 
4120 		phba->fc_stat.elsRcvLOGO++;
4121 		if (vport->port_state < LPFC_DISC_AUTH) {
4122 			rjt_err = LSRJT_UNABLE_TPC;
4123 			break;
4124 		}
4125 		lpfc_disc_state_machine(vport, ndlp, elsiocb, NLP_EVT_RCV_LOGO);
4126 		break;
4127 	case ELS_CMD_PRLO:
4128 		lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_UNSOL,
4129 			"RCV PRLO:        did:x%x/ste:x%x flg:x%x",
4130 			did, vport->port_state, ndlp->nlp_flag);
4131 
4132 		phba->fc_stat.elsRcvPRLO++;
4133 		if (vport->port_state < LPFC_DISC_AUTH) {
4134 			rjt_err = LSRJT_UNABLE_TPC;
4135 			break;
4136 		}
4137 		lpfc_disc_state_machine(vport, ndlp, elsiocb, NLP_EVT_RCV_PRLO);
4138 		break;
4139 	case ELS_CMD_RSCN:
4140 		phba->fc_stat.elsRcvRSCN++;
4141 		lpfc_els_rcv_rscn(vport, elsiocb, ndlp);
4142 		if (newnode)
4143 			lpfc_nlp_put(ndlp);
4144 		break;
4145 	case ELS_CMD_ADISC:
4146 		lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_UNSOL,
4147 			"RCV ADISC:       did:x%x/ste:x%x flg:x%x",
4148 			did, vport->port_state, ndlp->nlp_flag);
4149 
4150 		phba->fc_stat.elsRcvADISC++;
4151 		if (vport->port_state < LPFC_DISC_AUTH) {
4152 			rjt_err = LSRJT_UNABLE_TPC;
4153 			break;
4154 		}
4155 		lpfc_disc_state_machine(vport, ndlp, elsiocb,
4156 					NLP_EVT_RCV_ADISC);
4157 		break;
4158 	case ELS_CMD_PDISC:
4159 		lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_UNSOL,
4160 			"RCV PDISC:       did:x%x/ste:x%x flg:x%x",
4161 			did, vport->port_state, ndlp->nlp_flag);
4162 
4163 		phba->fc_stat.elsRcvPDISC++;
4164 		if (vport->port_state < LPFC_DISC_AUTH) {
4165 			rjt_err = LSRJT_UNABLE_TPC;
4166 			break;
4167 		}
4168 		lpfc_disc_state_machine(vport, ndlp, elsiocb,
4169 					NLP_EVT_RCV_PDISC);
4170 		break;
4171 	case ELS_CMD_FARPR:
4172 		lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_UNSOL,
4173 			"RCV FARPR:       did:x%x/ste:x%x flg:x%x",
4174 			did, vport->port_state, ndlp->nlp_flag);
4175 
4176 		phba->fc_stat.elsRcvFARPR++;
4177 		lpfc_els_rcv_farpr(vport, elsiocb, ndlp);
4178 		break;
4179 	case ELS_CMD_FARP:
4180 		lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_UNSOL,
4181 			"RCV FARP:        did:x%x/ste:x%x flg:x%x",
4182 			did, vport->port_state, ndlp->nlp_flag);
4183 
4184 		phba->fc_stat.elsRcvFARP++;
4185 		lpfc_els_rcv_farp(vport, elsiocb, ndlp);
4186 		break;
4187 	case ELS_CMD_FAN:
4188 		lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_UNSOL,
4189 			"RCV FAN:         did:x%x/ste:x%x flg:x%x",
4190 			did, vport->port_state, ndlp->nlp_flag);
4191 
4192 		phba->fc_stat.elsRcvFAN++;
4193 		lpfc_els_rcv_fan(vport, elsiocb, ndlp);
4194 		break;
4195 	case ELS_CMD_PRLI:
4196 		lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_UNSOL,
4197 			"RCV PRLI:        did:x%x/ste:x%x flg:x%x",
4198 			did, vport->port_state, ndlp->nlp_flag);
4199 
4200 		phba->fc_stat.elsRcvPRLI++;
4201 		if (vport->port_state < LPFC_DISC_AUTH) {
4202 			rjt_err = LSRJT_UNABLE_TPC;
4203 			break;
4204 		}
4205 		lpfc_disc_state_machine(vport, ndlp, elsiocb, NLP_EVT_RCV_PRLI);
4206 		break;
4207 	case ELS_CMD_LIRR:
4208 		lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_UNSOL,
4209 			"RCV LIRR:        did:x%x/ste:x%x flg:x%x",
4210 			did, vport->port_state, ndlp->nlp_flag);
4211 
4212 		phba->fc_stat.elsRcvLIRR++;
4213 		lpfc_els_rcv_lirr(vport, elsiocb, ndlp);
4214 		if (newnode)
4215 			lpfc_nlp_put(ndlp);
4216 		break;
4217 	case ELS_CMD_RPS:
4218 		lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_UNSOL,
4219 			"RCV RPS:         did:x%x/ste:x%x flg:x%x",
4220 			did, vport->port_state, ndlp->nlp_flag);
4221 
4222 		phba->fc_stat.elsRcvRPS++;
4223 		lpfc_els_rcv_rps(vport, elsiocb, ndlp);
4224 		if (newnode)
4225 			lpfc_nlp_put(ndlp);
4226 		break;
4227 	case ELS_CMD_RPL:
4228 		lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_UNSOL,
4229 			"RCV RPL:         did:x%x/ste:x%x flg:x%x",
4230 			did, vport->port_state, ndlp->nlp_flag);
4231 
4232 		phba->fc_stat.elsRcvRPL++;
4233 		lpfc_els_rcv_rpl(vport, elsiocb, ndlp);
4234 		if (newnode)
4235 			lpfc_nlp_put(ndlp);
4236 		break;
4237 	case ELS_CMD_RNID:
4238 		lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_UNSOL,
4239 			"RCV RNID:        did:x%x/ste:x%x flg:x%x",
4240 			did, vport->port_state, ndlp->nlp_flag);
4241 
4242 		phba->fc_stat.elsRcvRNID++;
4243 		lpfc_els_rcv_rnid(vport, elsiocb, ndlp);
4244 		if (newnode)
4245 			lpfc_nlp_put(ndlp);
4246 		break;
4247 	default:
4248 		lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_UNSOL,
4249 			"RCV ELS cmd:     cmd:x%x did:x%x/ste:x%x",
4250 			cmd, did, vport->port_state);
4251 
4252 		/* Unsupported ELS command, reject */
4253 		rjt_err = LSRJT_INVALID_CMD;
4254 
4255 		/* Unknown ELS command <elsCmd> received from NPORT <did> */
4256 		lpfc_printf_vlog(vport, KERN_ERR, LOG_ELS,
4257 				 "0115 Unknown ELS command x%x "
4258 				 "received from NPORT x%x\n", cmd, did);
4259 		if (newnode)
4260 			lpfc_nlp_put(ndlp);
4261 		break;
4262 	}
4263 
4264 	/* check if need to LS_RJT received ELS cmd */
4265 	if (rjt_err) {
4266 		memset(&stat, 0, sizeof(stat));
4267 		stat.un.b.lsRjtRsnCode = rjt_err;
4268 		stat.un.b.lsRjtRsnCodeExp = LSEXP_NOTHING_MORE;
4269 		lpfc_els_rsp_reject(vport, stat.un.lsRjtError, elsiocb, ndlp,
4270 			NULL);
4271 	}
4272 
4273 	return;
4274 
4275 dropit:
4276 	if (vport && !(vport->load_flag & FC_UNLOADING))
4277 		lpfc_printf_log(phba, KERN_ERR, LOG_ELS,
4278 			"(%d):0111 Dropping received ELS cmd "
4279 			"Data: x%x x%x x%x\n",
4280 			vport->vpi, icmd->ulpStatus,
4281 			icmd->un.ulpWord[4], icmd->ulpTimeout);
4282 	phba->fc_stat.elsRcvDrop++;
4283 }
4284 
4285 static struct lpfc_vport *
4286 lpfc_find_vport_by_vpid(struct lpfc_hba *phba, uint16_t vpi)
4287 {
4288 	struct lpfc_vport *vport;
4289 	unsigned long flags;
4290 
4291 	spin_lock_irqsave(&phba->hbalock, flags);
4292 	list_for_each_entry(vport, &phba->port_list, listentry) {
4293 		if (vport->vpi == vpi) {
4294 			spin_unlock_irqrestore(&phba->hbalock, flags);
4295 			return vport;
4296 		}
4297 	}
4298 	spin_unlock_irqrestore(&phba->hbalock, flags);
4299 	return NULL;
4300 }
4301 
4302 void
4303 lpfc_els_unsol_event(struct lpfc_hba *phba, struct lpfc_sli_ring *pring,
4304 		     struct lpfc_iocbq *elsiocb)
4305 {
4306 	struct lpfc_vport *vport = phba->pport;
4307 	IOCB_t *icmd = &elsiocb->iocb;
4308 	dma_addr_t paddr;
4309 	struct lpfc_dmabuf *bdeBuf1 = elsiocb->context2;
4310 	struct lpfc_dmabuf *bdeBuf2 = elsiocb->context3;
4311 
4312 	elsiocb->context2 = NULL;
4313 	elsiocb->context3 = NULL;
4314 
4315 	if (icmd->ulpStatus == IOSTAT_NEED_BUFFER) {
4316 		lpfc_sli_hbqbuf_add_hbqs(phba, LPFC_ELS_HBQ);
4317 	} else if (icmd->ulpStatus == IOSTAT_LOCAL_REJECT &&
4318 	    (icmd->un.ulpWord[4] & 0xff) == IOERR_RCV_BUFFER_WAITING) {
4319 		phba->fc_stat.NoRcvBuf++;
4320 		/* Not enough posted buffers; Try posting more buffers */
4321 		if (!(phba->sli3_options & LPFC_SLI3_HBQ_ENABLED))
4322 			lpfc_post_buffer(phba, pring, 0);
4323 		return;
4324 	}
4325 
4326 	if ((phba->sli3_options & LPFC_SLI3_NPIV_ENABLED) &&
4327 	    (icmd->ulpCommand == CMD_IOCB_RCV_ELS64_CX ||
4328 	     icmd->ulpCommand == CMD_IOCB_RCV_SEQ64_CX)) {
4329 		if (icmd->unsli3.rcvsli3.vpi == 0xffff)
4330 			vport = phba->pport;
4331 		else {
4332 			uint16_t vpi = icmd->unsli3.rcvsli3.vpi;
4333 			vport = lpfc_find_vport_by_vpid(phba, vpi);
4334 		}
4335 	}
4336 	/* If there are no BDEs associated
4337 	 * with this IOCB, there is nothing to do.
4338 	 */
4339 	if (icmd->ulpBdeCount == 0)
4340 		return;
4341 
4342 	/* type of ELS cmd is first 32bit word
4343 	 * in packet
4344 	 */
4345 	if (phba->sli3_options & LPFC_SLI3_HBQ_ENABLED) {
4346 		elsiocb->context2 = bdeBuf1;
4347 	} else {
4348 		paddr = getPaddr(icmd->un.cont64[0].addrHigh,
4349 				 icmd->un.cont64[0].addrLow);
4350 		elsiocb->context2 = lpfc_sli_ringpostbuf_get(phba, pring,
4351 							     paddr);
4352 	}
4353 
4354 	lpfc_els_unsol_buffer(phba, pring, vport, elsiocb);
4355 	/*
4356 	 * The different unsolicited event handlers would tell us
4357 	 * if they are done with "mp" by setting context2 to NULL.
4358 	 */
4359 	lpfc_nlp_put(elsiocb->context1);
4360 	elsiocb->context1 = NULL;
4361 	if (elsiocb->context2) {
4362 		lpfc_in_buf_free(phba, (struct lpfc_dmabuf *)elsiocb->context2);
4363 		elsiocb->context2 = NULL;
4364 	}
4365 
4366 	/* RCV_ELS64_CX provide for 2 BDEs - process 2nd if included */
4367 	if ((phba->sli3_options & LPFC_SLI3_HBQ_ENABLED) &&
4368 	    icmd->ulpBdeCount == 2) {
4369 		elsiocb->context2 = bdeBuf2;
4370 		lpfc_els_unsol_buffer(phba, pring, vport, elsiocb);
4371 		/* free mp if we are done with it */
4372 		if (elsiocb->context2) {
4373 			lpfc_in_buf_free(phba, elsiocb->context2);
4374 			elsiocb->context2 = NULL;
4375 		}
4376 	}
4377 }
4378 
4379 void
4380 lpfc_do_scr_ns_plogi(struct lpfc_hba *phba, struct lpfc_vport *vport)
4381 {
4382 	struct lpfc_nodelist *ndlp, *ndlp_fdmi;
4383 
4384 	ndlp = lpfc_findnode_did(vport, NameServer_DID);
4385 	if (!ndlp) {
4386 		ndlp = mempool_alloc(phba->nlp_mem_pool, GFP_KERNEL);
4387 		if (!ndlp) {
4388 			if (phba->fc_topology == TOPOLOGY_LOOP) {
4389 				lpfc_disc_start(vport);
4390 				return;
4391 			}
4392 			lpfc_vport_set_state(vport, FC_VPORT_FAILED);
4393 			lpfc_printf_vlog(vport, KERN_ERR, LOG_ELS,
4394 					 "0251 NameServer login: no memory\n");
4395 			return;
4396 		}
4397 		lpfc_nlp_init(vport, ndlp, NameServer_DID);
4398 	} else if (!NLP_CHK_NODE_ACT(ndlp)) {
4399 		ndlp = lpfc_enable_node(vport, ndlp, NLP_STE_UNUSED_NODE);
4400 		if (!ndlp) {
4401 			if (phba->fc_topology == TOPOLOGY_LOOP) {
4402 				lpfc_disc_start(vport);
4403 				return;
4404 			}
4405 			lpfc_vport_set_state(vport, FC_VPORT_FAILED);
4406 			lpfc_printf_vlog(vport, KERN_ERR, LOG_ELS,
4407 					"0348 NameServer login: node freed\n");
4408 			return;
4409 		}
4410 	}
4411 	ndlp->nlp_type |= NLP_FABRIC;
4412 
4413 	lpfc_nlp_set_state(vport, ndlp, NLP_STE_PLOGI_ISSUE);
4414 
4415 	if (lpfc_issue_els_plogi(vport, ndlp->nlp_DID, 0)) {
4416 		lpfc_vport_set_state(vport, FC_VPORT_FAILED);
4417 		lpfc_printf_vlog(vport, KERN_ERR, LOG_ELS,
4418 				 "0252 Cannot issue NameServer login\n");
4419 		return;
4420 	}
4421 
4422 	if (vport->cfg_fdmi_on) {
4423 		ndlp_fdmi = mempool_alloc(phba->nlp_mem_pool,
4424 					  GFP_KERNEL);
4425 		if (ndlp_fdmi) {
4426 			lpfc_nlp_init(vport, ndlp_fdmi, FDMI_DID);
4427 			ndlp_fdmi->nlp_type |= NLP_FABRIC;
4428 			lpfc_nlp_set_state(vport, ndlp_fdmi,
4429 				NLP_STE_PLOGI_ISSUE);
4430 			lpfc_issue_els_plogi(vport, ndlp_fdmi->nlp_DID,
4431 					     0);
4432 		}
4433 	}
4434 	return;
4435 }
4436 
4437 static void
4438 lpfc_cmpl_reg_new_vport(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmb)
4439 {
4440 	struct lpfc_vport *vport = pmb->vport;
4441 	struct Scsi_Host  *shost = lpfc_shost_from_vport(vport);
4442 	struct lpfc_nodelist *ndlp = (struct lpfc_nodelist *) pmb->context2;
4443 	MAILBOX_t *mb = &pmb->mb;
4444 
4445 	spin_lock_irq(shost->host_lock);
4446 	vport->fc_flag &= ~FC_VPORT_NEEDS_REG_VPI;
4447 	spin_unlock_irq(shost->host_lock);
4448 
4449 	if (mb->mbxStatus) {
4450 		lpfc_printf_vlog(vport, KERN_ERR, LOG_MBOX,
4451 				 "0915 Register VPI failed: 0x%x\n",
4452 				 mb->mbxStatus);
4453 
4454 		switch (mb->mbxStatus) {
4455 		case 0x11:	/* unsupported feature */
4456 		case 0x9603:	/* max_vpi exceeded */
4457 		case 0x9602:	/* Link event since CLEAR_LA */
4458 			/* giving up on vport registration */
4459 			lpfc_vport_set_state(vport, FC_VPORT_FAILED);
4460 			spin_lock_irq(shost->host_lock);
4461 			vport->fc_flag &= ~(FC_FABRIC | FC_PUBLIC_LOOP);
4462 			spin_unlock_irq(shost->host_lock);
4463 			lpfc_can_disctmo(vport);
4464 			break;
4465 		default:
4466 			/* Try to recover from this error */
4467 			lpfc_mbx_unreg_vpi(vport);
4468 			spin_lock_irq(shost->host_lock);
4469 			vport->fc_flag |= FC_VPORT_NEEDS_REG_VPI;
4470 			spin_unlock_irq(shost->host_lock);
4471 			if (vport->port_type == LPFC_PHYSICAL_PORT)
4472 				lpfc_initial_flogi(vport);
4473 			else
4474 				lpfc_initial_fdisc(vport);
4475 			break;
4476 		}
4477 
4478 	} else {
4479 		if (vport == phba->pport)
4480 			lpfc_issue_fabric_reglogin(vport);
4481 		else
4482 			lpfc_do_scr_ns_plogi(phba, vport);
4483 	}
4484 
4485 	/* Now, we decrement the ndlp reference count held for this
4486 	 * callback function
4487 	 */
4488 	lpfc_nlp_put(ndlp);
4489 
4490 	mempool_free(pmb, phba->mbox_mem_pool);
4491 	return;
4492 }
4493 
4494 static void
4495 lpfc_register_new_vport(struct lpfc_hba *phba, struct lpfc_vport *vport,
4496 			struct lpfc_nodelist *ndlp)
4497 {
4498 	struct Scsi_Host *shost = lpfc_shost_from_vport(vport);
4499 	LPFC_MBOXQ_t *mbox;
4500 
4501 	mbox = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL);
4502 	if (mbox) {
4503 		lpfc_reg_vpi(phba, vport->vpi, vport->fc_myDID, mbox);
4504 		mbox->vport = vport;
4505 		mbox->context2 = lpfc_nlp_get(ndlp);
4506 		mbox->mbox_cmpl = lpfc_cmpl_reg_new_vport;
4507 		if (lpfc_sli_issue_mbox(phba, mbox, MBX_NOWAIT)
4508 		    == MBX_NOT_FINISHED) {
4509 			/* mailbox command not success, decrement ndlp
4510 			 * reference count for this command
4511 			 */
4512 			lpfc_nlp_put(ndlp);
4513 			mempool_free(mbox, phba->mbox_mem_pool);
4514 
4515 			lpfc_printf_vlog(vport, KERN_ERR, LOG_MBOX,
4516 				"0253 Register VPI: Can't send mbox\n");
4517 			goto mbox_err_exit;
4518 		}
4519 	} else {
4520 		lpfc_printf_vlog(vport, KERN_ERR, LOG_MBOX,
4521 				 "0254 Register VPI: no memory\n");
4522 		goto mbox_err_exit;
4523 	}
4524 	return;
4525 
4526 mbox_err_exit:
4527 	lpfc_vport_set_state(vport, FC_VPORT_FAILED);
4528 	spin_lock_irq(shost->host_lock);
4529 	vport->fc_flag &= ~FC_VPORT_NEEDS_REG_VPI;
4530 	spin_unlock_irq(shost->host_lock);
4531 	return;
4532 }
4533 
4534 static void
4535 lpfc_cmpl_els_fdisc(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
4536 		    struct lpfc_iocbq *rspiocb)
4537 {
4538 	struct lpfc_vport *vport = cmdiocb->vport;
4539 	struct Scsi_Host  *shost = lpfc_shost_from_vport(vport);
4540 	struct lpfc_nodelist *ndlp = (struct lpfc_nodelist *) cmdiocb->context1;
4541 	struct lpfc_nodelist *np;
4542 	struct lpfc_nodelist *next_np;
4543 	IOCB_t *irsp = &rspiocb->iocb;
4544 	struct lpfc_iocbq *piocb;
4545 
4546 	lpfc_printf_vlog(vport, KERN_INFO, LOG_ELS,
4547 			 "0123 FDISC completes. x%x/x%x prevDID: x%x\n",
4548 			 irsp->ulpStatus, irsp->un.ulpWord[4],
4549 			 vport->fc_prevDID);
4550 	/* Since all FDISCs are being single threaded, we
4551 	 * must reset the discovery timer for ALL vports
4552 	 * waiting to send FDISC when one completes.
4553 	 */
4554 	list_for_each_entry(piocb, &phba->fabric_iocb_list, list) {
4555 		lpfc_set_disctmo(piocb->vport);
4556 	}
4557 
4558 	lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_CMD,
4559 		"FDISC cmpl:      status:x%x/x%x prevdid:x%x",
4560 		irsp->ulpStatus, irsp->un.ulpWord[4], vport->fc_prevDID);
4561 
4562 	if (irsp->ulpStatus) {
4563 		/* Check for retry */
4564 		if (lpfc_els_retry(phba, cmdiocb, rspiocb))
4565 			goto out;
4566 		/* FDISC failed */
4567 		lpfc_printf_vlog(vport, KERN_ERR, LOG_ELS,
4568 				 "0124 FDISC failed. (%d/%d)\n",
4569 				 irsp->ulpStatus, irsp->un.ulpWord[4]);
4570 		if (vport->fc_vport->vport_state == FC_VPORT_INITIALIZING)
4571 			lpfc_vport_set_state(vport, FC_VPORT_FAILED);
4572 		lpfc_nlp_put(ndlp);
4573 		/* giving up on FDISC. Cancel discovery timer */
4574 		lpfc_can_disctmo(vport);
4575 	} else {
4576 		spin_lock_irq(shost->host_lock);
4577 		vport->fc_flag |= FC_FABRIC;
4578 		if (vport->phba->fc_topology == TOPOLOGY_LOOP)
4579 			vport->fc_flag |=  FC_PUBLIC_LOOP;
4580 		spin_unlock_irq(shost->host_lock);
4581 
4582 		vport->fc_myDID = irsp->un.ulpWord[4] & Mask_DID;
4583 		lpfc_vport_set_state(vport, FC_VPORT_ACTIVE);
4584 		if ((vport->fc_prevDID != vport->fc_myDID) &&
4585 			!(vport->fc_flag & FC_VPORT_NEEDS_REG_VPI)) {
4586 			/* If our NportID changed, we need to ensure all
4587 			 * remaining NPORTs get unreg_login'ed so we can
4588 			 * issue unreg_vpi.
4589 			 */
4590 			list_for_each_entry_safe(np, next_np,
4591 				&vport->fc_nodes, nlp_listp) {
4592 				if (!NLP_CHK_NODE_ACT(ndlp) ||
4593 				    (np->nlp_state != NLP_STE_NPR_NODE) ||
4594 				    !(np->nlp_flag & NLP_NPR_ADISC))
4595 					continue;
4596 				spin_lock_irq(shost->host_lock);
4597 				np->nlp_flag &= ~NLP_NPR_ADISC;
4598 				spin_unlock_irq(shost->host_lock);
4599 				lpfc_unreg_rpi(vport, np);
4600 			}
4601 			lpfc_mbx_unreg_vpi(vport);
4602 			spin_lock_irq(shost->host_lock);
4603 			vport->fc_flag |= FC_VPORT_NEEDS_REG_VPI;
4604 			spin_unlock_irq(shost->host_lock);
4605 		}
4606 
4607 		if (vport->fc_flag & FC_VPORT_NEEDS_REG_VPI)
4608 			lpfc_register_new_vport(phba, vport, ndlp);
4609 		else
4610 			lpfc_do_scr_ns_plogi(phba, vport);
4611 
4612 		/* Unconditionaly kick off releasing fabric node for vports */
4613 		lpfc_nlp_put(ndlp);
4614 	}
4615 
4616 out:
4617 	lpfc_els_free_iocb(phba, cmdiocb);
4618 }
4619 
4620 static int
4621 lpfc_issue_els_fdisc(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
4622 		     uint8_t retry)
4623 {
4624 	struct lpfc_hba *phba = vport->phba;
4625 	IOCB_t *icmd;
4626 	struct lpfc_iocbq *elsiocb;
4627 	struct serv_parm *sp;
4628 	uint8_t *pcmd;
4629 	uint16_t cmdsize;
4630 	int did = ndlp->nlp_DID;
4631 	int rc;
4632 
4633 	cmdsize = (sizeof(uint32_t) + sizeof(struct serv_parm));
4634 	elsiocb = lpfc_prep_els_iocb(vport, 1, cmdsize, retry, ndlp, did,
4635 				     ELS_CMD_FDISC);
4636 	if (!elsiocb) {
4637 		lpfc_vport_set_state(vport, FC_VPORT_FAILED);
4638 		lpfc_printf_vlog(vport, KERN_ERR, LOG_ELS,
4639 				 "0255 Issue FDISC: no IOCB\n");
4640 		return 1;
4641 	}
4642 
4643 	icmd = &elsiocb->iocb;
4644 	icmd->un.elsreq64.myID = 0;
4645 	icmd->un.elsreq64.fl = 1;
4646 
4647 	/* For FDISC, Let FDISC rsp set the NPortID for this VPI */
4648 	icmd->ulpCt_h = 1;
4649 	icmd->ulpCt_l = 0;
4650 
4651 	pcmd = (uint8_t *) (((struct lpfc_dmabuf *) elsiocb->context2)->virt);
4652 	*((uint32_t *) (pcmd)) = ELS_CMD_FDISC;
4653 	pcmd += sizeof(uint32_t); /* CSP Word 1 */
4654 	memcpy(pcmd, &vport->phba->pport->fc_sparam, sizeof(struct serv_parm));
4655 	sp = (struct serv_parm *) pcmd;
4656 	/* Setup CSPs accordingly for Fabric */
4657 	sp->cmn.e_d_tov = 0;
4658 	sp->cmn.w2.r_a_tov = 0;
4659 	sp->cls1.classValid = 0;
4660 	sp->cls2.seqDelivery = 1;
4661 	sp->cls3.seqDelivery = 1;
4662 
4663 	pcmd += sizeof(uint32_t); /* CSP Word 2 */
4664 	pcmd += sizeof(uint32_t); /* CSP Word 3 */
4665 	pcmd += sizeof(uint32_t); /* CSP Word 4 */
4666 	pcmd += sizeof(uint32_t); /* Port Name */
4667 	memcpy(pcmd, &vport->fc_portname, 8);
4668 	pcmd += sizeof(uint32_t); /* Node Name */
4669 	pcmd += sizeof(uint32_t); /* Node Name */
4670 	memcpy(pcmd, &vport->fc_nodename, 8);
4671 
4672 	lpfc_set_disctmo(vport);
4673 
4674 	phba->fc_stat.elsXmitFDISC++;
4675 	elsiocb->iocb_cmpl = lpfc_cmpl_els_fdisc;
4676 
4677 	lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_CMD,
4678 		"Issue FDISC:     did:x%x",
4679 		did, 0, 0);
4680 
4681 	rc = lpfc_issue_fabric_iocb(phba, elsiocb);
4682 	if (rc == IOCB_ERROR) {
4683 		lpfc_els_free_iocb(phba, elsiocb);
4684 		lpfc_vport_set_state(vport, FC_VPORT_FAILED);
4685 		lpfc_printf_vlog(vport, KERN_ERR, LOG_ELS,
4686 				 "0256 Issue FDISC: Cannot send IOCB\n");
4687 		return 1;
4688 	}
4689 	lpfc_vport_set_state(vport, FC_VPORT_INITIALIZING);
4690 	vport->port_state = LPFC_FDISC;
4691 	return 0;
4692 }
4693 
4694 static void
4695 lpfc_cmpl_els_npiv_logo(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
4696 			struct lpfc_iocbq *rspiocb)
4697 {
4698 	struct lpfc_vport *vport = cmdiocb->vport;
4699 	IOCB_t *irsp;
4700 	struct lpfc_nodelist *ndlp;
4701 	ndlp = (struct lpfc_nodelist *)cmdiocb->context1;
4702 
4703 	irsp = &rspiocb->iocb;
4704 	lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_CMD,
4705 		"LOGO npiv cmpl:  status:x%x/x%x did:x%x",
4706 		irsp->ulpStatus, irsp->un.ulpWord[4], irsp->un.rcvels.remoteID);
4707 
4708 	lpfc_els_free_iocb(phba, cmdiocb);
4709 	vport->unreg_vpi_cmpl = VPORT_ERROR;
4710 
4711 	/* Trigger the release of the ndlp after logo */
4712 	lpfc_nlp_put(ndlp);
4713 }
4714 
4715 int
4716 lpfc_issue_els_npiv_logo(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp)
4717 {
4718 	struct Scsi_Host *shost = lpfc_shost_from_vport(vport);
4719 	struct lpfc_hba  *phba = vport->phba;
4720 	struct lpfc_sli_ring *pring = &phba->sli.ring[LPFC_ELS_RING];
4721 	IOCB_t *icmd;
4722 	struct lpfc_iocbq *elsiocb;
4723 	uint8_t *pcmd;
4724 	uint16_t cmdsize;
4725 
4726 	cmdsize = 2 * sizeof(uint32_t) + sizeof(struct lpfc_name);
4727 	elsiocb = lpfc_prep_els_iocb(vport, 1, cmdsize, 0, ndlp, ndlp->nlp_DID,
4728 				     ELS_CMD_LOGO);
4729 	if (!elsiocb)
4730 		return 1;
4731 
4732 	icmd = &elsiocb->iocb;
4733 	pcmd = (uint8_t *) (((struct lpfc_dmabuf *) elsiocb->context2)->virt);
4734 	*((uint32_t *) (pcmd)) = ELS_CMD_LOGO;
4735 	pcmd += sizeof(uint32_t);
4736 
4737 	/* Fill in LOGO payload */
4738 	*((uint32_t *) (pcmd)) = be32_to_cpu(vport->fc_myDID);
4739 	pcmd += sizeof(uint32_t);
4740 	memcpy(pcmd, &vport->fc_portname, sizeof(struct lpfc_name));
4741 
4742 	lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_CMD,
4743 		"Issue LOGO npiv  did:x%x flg:x%x",
4744 		ndlp->nlp_DID, ndlp->nlp_flag, 0);
4745 
4746 	elsiocb->iocb_cmpl = lpfc_cmpl_els_npiv_logo;
4747 	spin_lock_irq(shost->host_lock);
4748 	ndlp->nlp_flag |= NLP_LOGO_SND;
4749 	spin_unlock_irq(shost->host_lock);
4750 	if (lpfc_sli_issue_iocb(phba, pring, elsiocb, 0) == IOCB_ERROR) {
4751 		spin_lock_irq(shost->host_lock);
4752 		ndlp->nlp_flag &= ~NLP_LOGO_SND;
4753 		spin_unlock_irq(shost->host_lock);
4754 		lpfc_els_free_iocb(phba, elsiocb);
4755 		return 1;
4756 	}
4757 	return 0;
4758 }
4759 
4760 void
4761 lpfc_fabric_block_timeout(unsigned long ptr)
4762 {
4763 	struct lpfc_hba  *phba = (struct lpfc_hba *) ptr;
4764 	unsigned long iflags;
4765 	uint32_t tmo_posted;
4766 
4767 	spin_lock_irqsave(&phba->pport->work_port_lock, iflags);
4768 	tmo_posted = phba->pport->work_port_events & WORKER_FABRIC_BLOCK_TMO;
4769 	if (!tmo_posted)
4770 		phba->pport->work_port_events |= WORKER_FABRIC_BLOCK_TMO;
4771 	spin_unlock_irqrestore(&phba->pport->work_port_lock, iflags);
4772 
4773 	if (!tmo_posted)
4774 		lpfc_worker_wake_up(phba);
4775 	return;
4776 }
4777 
4778 static void
4779 lpfc_resume_fabric_iocbs(struct lpfc_hba *phba)
4780 {
4781 	struct lpfc_iocbq *iocb;
4782 	unsigned long iflags;
4783 	int ret;
4784 	struct lpfc_sli_ring *pring = &phba->sli.ring[LPFC_ELS_RING];
4785 	IOCB_t *cmd;
4786 
4787 repeat:
4788 	iocb = NULL;
4789 	spin_lock_irqsave(&phba->hbalock, iflags);
4790 	/* Post any pending iocb to the SLI layer */
4791 	if (atomic_read(&phba->fabric_iocb_count) == 0) {
4792 		list_remove_head(&phba->fabric_iocb_list, iocb, typeof(*iocb),
4793 				 list);
4794 		if (iocb)
4795 			/* Increment fabric iocb count to hold the position */
4796 			atomic_inc(&phba->fabric_iocb_count);
4797 	}
4798 	spin_unlock_irqrestore(&phba->hbalock, iflags);
4799 	if (iocb) {
4800 		iocb->fabric_iocb_cmpl = iocb->iocb_cmpl;
4801 		iocb->iocb_cmpl = lpfc_cmpl_fabric_iocb;
4802 		iocb->iocb_flag |= LPFC_IO_FABRIC;
4803 
4804 		lpfc_debugfs_disc_trc(iocb->vport, LPFC_DISC_TRC_ELS_CMD,
4805 			"Fabric sched1:   ste:x%x",
4806 			iocb->vport->port_state, 0, 0);
4807 
4808 		ret = lpfc_sli_issue_iocb(phba, pring, iocb, 0);
4809 
4810 		if (ret == IOCB_ERROR) {
4811 			iocb->iocb_cmpl = iocb->fabric_iocb_cmpl;
4812 			iocb->fabric_iocb_cmpl = NULL;
4813 			iocb->iocb_flag &= ~LPFC_IO_FABRIC;
4814 			cmd = &iocb->iocb;
4815 			cmd->ulpStatus = IOSTAT_LOCAL_REJECT;
4816 			cmd->un.ulpWord[4] = IOERR_SLI_ABORTED;
4817 			iocb->iocb_cmpl(phba, iocb, iocb);
4818 
4819 			atomic_dec(&phba->fabric_iocb_count);
4820 			goto repeat;
4821 		}
4822 	}
4823 
4824 	return;
4825 }
4826 
4827 void
4828 lpfc_unblock_fabric_iocbs(struct lpfc_hba *phba)
4829 {
4830 	clear_bit(FABRIC_COMANDS_BLOCKED, &phba->bit_flags);
4831 
4832 	lpfc_resume_fabric_iocbs(phba);
4833 	return;
4834 }
4835 
4836 static void
4837 lpfc_block_fabric_iocbs(struct lpfc_hba *phba)
4838 {
4839 	int blocked;
4840 
4841 	blocked = test_and_set_bit(FABRIC_COMANDS_BLOCKED, &phba->bit_flags);
4842 	/* Start a timer to unblock fabric iocbs after 100ms */
4843 	if (!blocked)
4844 		mod_timer(&phba->fabric_block_timer, jiffies + HZ/10 );
4845 
4846 	return;
4847 }
4848 
4849 static void
4850 lpfc_cmpl_fabric_iocb(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
4851 	struct lpfc_iocbq *rspiocb)
4852 {
4853 	struct ls_rjt stat;
4854 
4855 	if ((cmdiocb->iocb_flag & LPFC_IO_FABRIC) != LPFC_IO_FABRIC)
4856 		BUG();
4857 
4858 	switch (rspiocb->iocb.ulpStatus) {
4859 		case IOSTAT_NPORT_RJT:
4860 		case IOSTAT_FABRIC_RJT:
4861 			if (rspiocb->iocb.un.ulpWord[4] & RJT_UNAVAIL_TEMP) {
4862 				lpfc_block_fabric_iocbs(phba);
4863 			}
4864 			break;
4865 
4866 		case IOSTAT_NPORT_BSY:
4867 		case IOSTAT_FABRIC_BSY:
4868 			lpfc_block_fabric_iocbs(phba);
4869 			break;
4870 
4871 		case IOSTAT_LS_RJT:
4872 			stat.un.lsRjtError =
4873 				be32_to_cpu(rspiocb->iocb.un.ulpWord[4]);
4874 			if ((stat.un.b.lsRjtRsnCode == LSRJT_UNABLE_TPC) ||
4875 				(stat.un.b.lsRjtRsnCode == LSRJT_LOGICAL_BSY))
4876 				lpfc_block_fabric_iocbs(phba);
4877 			break;
4878 	}
4879 
4880 	if (atomic_read(&phba->fabric_iocb_count) == 0)
4881 		BUG();
4882 
4883 	cmdiocb->iocb_cmpl = cmdiocb->fabric_iocb_cmpl;
4884 	cmdiocb->fabric_iocb_cmpl = NULL;
4885 	cmdiocb->iocb_flag &= ~LPFC_IO_FABRIC;
4886 	cmdiocb->iocb_cmpl(phba, cmdiocb, rspiocb);
4887 
4888 	atomic_dec(&phba->fabric_iocb_count);
4889 	if (!test_bit(FABRIC_COMANDS_BLOCKED, &phba->bit_flags)) {
4890 		/* Post any pending iocbs to HBA */
4891 		lpfc_resume_fabric_iocbs(phba);
4892 	}
4893 }
4894 
4895 static int
4896 lpfc_issue_fabric_iocb(struct lpfc_hba *phba, struct lpfc_iocbq *iocb)
4897 {
4898 	unsigned long iflags;
4899 	struct lpfc_sli_ring *pring = &phba->sli.ring[LPFC_ELS_RING];
4900 	int ready;
4901 	int ret;
4902 
4903 	if (atomic_read(&phba->fabric_iocb_count) > 1)
4904 		BUG();
4905 
4906 	spin_lock_irqsave(&phba->hbalock, iflags);
4907 	ready = atomic_read(&phba->fabric_iocb_count) == 0 &&
4908 		!test_bit(FABRIC_COMANDS_BLOCKED, &phba->bit_flags);
4909 
4910 	if (ready)
4911 		/* Increment fabric iocb count to hold the position */
4912 		atomic_inc(&phba->fabric_iocb_count);
4913 	spin_unlock_irqrestore(&phba->hbalock, iflags);
4914 	if (ready) {
4915 		iocb->fabric_iocb_cmpl = iocb->iocb_cmpl;
4916 		iocb->iocb_cmpl = lpfc_cmpl_fabric_iocb;
4917 		iocb->iocb_flag |= LPFC_IO_FABRIC;
4918 
4919 		lpfc_debugfs_disc_trc(iocb->vport, LPFC_DISC_TRC_ELS_CMD,
4920 			"Fabric sched2:   ste:x%x",
4921 			iocb->vport->port_state, 0, 0);
4922 
4923 		ret = lpfc_sli_issue_iocb(phba, pring, iocb, 0);
4924 
4925 		if (ret == IOCB_ERROR) {
4926 			iocb->iocb_cmpl = iocb->fabric_iocb_cmpl;
4927 			iocb->fabric_iocb_cmpl = NULL;
4928 			iocb->iocb_flag &= ~LPFC_IO_FABRIC;
4929 			atomic_dec(&phba->fabric_iocb_count);
4930 		}
4931 	} else {
4932 		spin_lock_irqsave(&phba->hbalock, iflags);
4933 		list_add_tail(&iocb->list, &phba->fabric_iocb_list);
4934 		spin_unlock_irqrestore(&phba->hbalock, iflags);
4935 		ret = IOCB_SUCCESS;
4936 	}
4937 	return ret;
4938 }
4939 
4940 
4941 static void lpfc_fabric_abort_vport(struct lpfc_vport *vport)
4942 {
4943 	LIST_HEAD(completions);
4944 	struct lpfc_hba  *phba = vport->phba;
4945 	struct lpfc_iocbq *tmp_iocb, *piocb;
4946 	IOCB_t *cmd;
4947 
4948 	spin_lock_irq(&phba->hbalock);
4949 	list_for_each_entry_safe(piocb, tmp_iocb, &phba->fabric_iocb_list,
4950 				 list) {
4951 
4952 		if (piocb->vport != vport)
4953 			continue;
4954 
4955 		list_move_tail(&piocb->list, &completions);
4956 	}
4957 	spin_unlock_irq(&phba->hbalock);
4958 
4959 	while (!list_empty(&completions)) {
4960 		piocb = list_get_first(&completions, struct lpfc_iocbq, list);
4961 		list_del_init(&piocb->list);
4962 
4963 		cmd = &piocb->iocb;
4964 		cmd->ulpStatus = IOSTAT_LOCAL_REJECT;
4965 		cmd->un.ulpWord[4] = IOERR_SLI_ABORTED;
4966 		(piocb->iocb_cmpl) (phba, piocb, piocb);
4967 	}
4968 }
4969 
4970 void lpfc_fabric_abort_nport(struct lpfc_nodelist *ndlp)
4971 {
4972 	LIST_HEAD(completions);
4973 	struct lpfc_hba  *phba = ndlp->vport->phba;
4974 	struct lpfc_iocbq *tmp_iocb, *piocb;
4975 	struct lpfc_sli_ring *pring = &phba->sli.ring[LPFC_ELS_RING];
4976 	IOCB_t *cmd;
4977 
4978 	spin_lock_irq(&phba->hbalock);
4979 	list_for_each_entry_safe(piocb, tmp_iocb, &phba->fabric_iocb_list,
4980 				 list) {
4981 		if ((lpfc_check_sli_ndlp(phba, pring, piocb, ndlp))) {
4982 
4983 			list_move_tail(&piocb->list, &completions);
4984 		}
4985 	}
4986 	spin_unlock_irq(&phba->hbalock);
4987 
4988 	while (!list_empty(&completions)) {
4989 		piocb = list_get_first(&completions, struct lpfc_iocbq, list);
4990 		list_del_init(&piocb->list);
4991 
4992 		cmd = &piocb->iocb;
4993 		cmd->ulpStatus = IOSTAT_LOCAL_REJECT;
4994 		cmd->un.ulpWord[4] = IOERR_SLI_ABORTED;
4995 		(piocb->iocb_cmpl) (phba, piocb, piocb);
4996 	}
4997 }
4998 
4999 void lpfc_fabric_abort_hba(struct lpfc_hba *phba)
5000 {
5001 	LIST_HEAD(completions);
5002 	struct lpfc_iocbq *piocb;
5003 	IOCB_t *cmd;
5004 
5005 	spin_lock_irq(&phba->hbalock);
5006 	list_splice_init(&phba->fabric_iocb_list, &completions);
5007 	spin_unlock_irq(&phba->hbalock);
5008 
5009 	while (!list_empty(&completions)) {
5010 		piocb = list_get_first(&completions, struct lpfc_iocbq, list);
5011 		list_del_init(&piocb->list);
5012 
5013 		cmd = &piocb->iocb;
5014 		cmd->ulpStatus = IOSTAT_LOCAL_REJECT;
5015 		cmd->un.ulpWord[4] = IOERR_SLI_ABORTED;
5016 		(piocb->iocb_cmpl) (phba, piocb, piocb);
5017 	}
5018 }
5019