xref: /openbmc/linux/drivers/scsi/lpfc/lpfc_els.c (revision 64c70b1c)
1 /*******************************************************************
2  * This file is part of the Emulex Linux Device Driver for         *
3  * Fibre Channel Host Bus Adapters.                                *
4  * Copyright (C) 2004-2007 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 
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 
39 static int lpfc_els_retry(struct lpfc_hba *, struct lpfc_iocbq *,
40 			  struct lpfc_iocbq *);
41 static int lpfc_max_els_tries = 3;
42 
43 static int
44 lpfc_els_chk_latt(struct lpfc_hba * phba)
45 {
46 	struct lpfc_sli *psli;
47 	LPFC_MBOXQ_t *mbox;
48 	uint32_t ha_copy;
49 	int rc;
50 
51 	psli = &phba->sli;
52 
53 	if ((phba->hba_state >= LPFC_HBA_READY) ||
54 	    (phba->hba_state == LPFC_LINK_DOWN))
55 		return 0;
56 
57 	/* Read the HBA Host Attention Register */
58 	spin_lock_irq(phba->host->host_lock);
59 	ha_copy = readl(phba->HAregaddr);
60 	spin_unlock_irq(phba->host->host_lock);
61 
62 	if (!(ha_copy & HA_LATT))
63 		return 0;
64 
65 	/* Pending Link Event during Discovery */
66 	lpfc_printf_log(phba, KERN_WARNING, LOG_DISCOVERY,
67 			"%d:0237 Pending Link Event during "
68 			"Discovery: State x%x\n",
69 			phba->brd_no, phba->hba_state);
70 
71 	/* CLEAR_LA should re-enable link attention events and
72 	 * we should then imediately take a LATT event. The
73 	 * LATT processing should call lpfc_linkdown() which
74 	 * will cleanup any left over in-progress discovery
75 	 * events.
76 	 */
77 	spin_lock_irq(phba->host->host_lock);
78 	phba->fc_flag |= FC_ABORT_DISCOVERY;
79 	spin_unlock_irq(phba->host->host_lock);
80 
81 	if (phba->hba_state != LPFC_CLEAR_LA) {
82 		if ((mbox = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL))) {
83 			phba->hba_state = LPFC_CLEAR_LA;
84 			lpfc_clear_la(phba, mbox);
85 			mbox->mbox_cmpl = lpfc_mbx_cmpl_clear_la;
86 			rc = lpfc_sli_issue_mbox (phba, mbox,
87 						  (MBX_NOWAIT | MBX_STOP_IOCB));
88 			if (rc == MBX_NOT_FINISHED) {
89 				mempool_free(mbox, phba->mbox_mem_pool);
90 				phba->hba_state = LPFC_HBA_ERROR;
91 			}
92 		}
93 	}
94 
95 	return 1;
96 
97 }
98 
99 static struct lpfc_iocbq *
100 lpfc_prep_els_iocb(struct lpfc_hba * phba, uint8_t expectRsp,
101 		   uint16_t cmdSize, uint8_t retry, struct lpfc_nodelist * ndlp,
102 		   uint32_t did, uint32_t elscmd)
103 {
104 	struct lpfc_sli_ring *pring;
105 	struct lpfc_iocbq *elsiocb;
106 	struct lpfc_dmabuf *pcmd, *prsp, *pbuflist;
107 	struct ulp_bde64 *bpl;
108 	IOCB_t *icmd;
109 
110 	pring = &phba->sli.ring[LPFC_ELS_RING];
111 
112 	if (phba->hba_state < LPFC_LINK_UP)
113 		return  NULL;
114 
115 	/* Allocate buffer for  command iocb */
116 	spin_lock_irq(phba->host->host_lock);
117 	elsiocb = lpfc_sli_get_iocbq(phba);
118 	spin_unlock_irq(phba->host->host_lock);
119 
120 	if (elsiocb == NULL)
121 		return NULL;
122 	icmd = &elsiocb->iocb;
123 
124 	/* fill in BDEs for command */
125 	/* Allocate buffer for command payload */
126 	if (((pcmd = kmalloc(sizeof (struct lpfc_dmabuf), GFP_KERNEL)) == 0) ||
127 	    ((pcmd->virt = lpfc_mbuf_alloc(phba,
128 					   MEM_PRI, &(pcmd->phys))) == 0)) {
129 		kfree(pcmd);
130 
131 		spin_lock_irq(phba->host->host_lock);
132 		lpfc_sli_release_iocbq(phba, elsiocb);
133 		spin_unlock_irq(phba->host->host_lock);
134 		return NULL;
135 	}
136 
137 	INIT_LIST_HEAD(&pcmd->list);
138 
139 	/* Allocate buffer for response payload */
140 	if (expectRsp) {
141 		prsp = kmalloc(sizeof (struct lpfc_dmabuf), GFP_KERNEL);
142 		if (prsp)
143 			prsp->virt = lpfc_mbuf_alloc(phba, MEM_PRI,
144 						     &prsp->phys);
145 		if (prsp == 0 || prsp->virt == 0) {
146 			kfree(prsp);
147 			lpfc_mbuf_free(phba, pcmd->virt, pcmd->phys);
148 			kfree(pcmd);
149 			spin_lock_irq(phba->host->host_lock);
150 			lpfc_sli_release_iocbq(phba, elsiocb);
151 			spin_unlock_irq(phba->host->host_lock);
152 			return NULL;
153 		}
154 		INIT_LIST_HEAD(&prsp->list);
155 	} else {
156 		prsp = NULL;
157 	}
158 
159 	/* Allocate buffer for Buffer ptr list */
160 	pbuflist = kmalloc(sizeof (struct lpfc_dmabuf), GFP_KERNEL);
161 	if (pbuflist)
162 	    pbuflist->virt = lpfc_mbuf_alloc(phba, MEM_PRI,
163 					     &pbuflist->phys);
164 	if (pbuflist == 0 || pbuflist->virt == 0) {
165 		spin_lock_irq(phba->host->host_lock);
166 		lpfc_sli_release_iocbq(phba, elsiocb);
167 		spin_unlock_irq(phba->host->host_lock);
168 		lpfc_mbuf_free(phba, pcmd->virt, pcmd->phys);
169 		lpfc_mbuf_free(phba, prsp->virt, prsp->phys);
170 		kfree(pcmd);
171 		kfree(prsp);
172 		kfree(pbuflist);
173 		return NULL;
174 	}
175 
176 	INIT_LIST_HEAD(&pbuflist->list);
177 
178 	icmd->un.elsreq64.bdl.addrHigh = putPaddrHigh(pbuflist->phys);
179 	icmd->un.elsreq64.bdl.addrLow = putPaddrLow(pbuflist->phys);
180 	icmd->un.elsreq64.bdl.bdeFlags = BUFF_TYPE_BDL;
181 	if (expectRsp) {
182 		icmd->un.elsreq64.bdl.bdeSize = (2 * sizeof (struct ulp_bde64));
183 		icmd->un.elsreq64.remoteID = did;	/* DID */
184 		icmd->ulpCommand = CMD_ELS_REQUEST64_CR;
185 		icmd->ulpTimeout = phba->fc_ratov * 2;
186 	} else {
187 		icmd->un.elsreq64.bdl.bdeSize = sizeof (struct ulp_bde64);
188 		icmd->ulpCommand = CMD_XMIT_ELS_RSP64_CX;
189 	}
190 
191 	icmd->ulpBdeCount = 1;
192 	icmd->ulpLe = 1;
193 	icmd->ulpClass = CLASS3;
194 
195 	bpl = (struct ulp_bde64 *) pbuflist->virt;
196 	bpl->addrLow = le32_to_cpu(putPaddrLow(pcmd->phys));
197 	bpl->addrHigh = le32_to_cpu(putPaddrHigh(pcmd->phys));
198 	bpl->tus.f.bdeSize = cmdSize;
199 	bpl->tus.f.bdeFlags = 0;
200 	bpl->tus.w = le32_to_cpu(bpl->tus.w);
201 
202 	if (expectRsp) {
203 		bpl++;
204 		bpl->addrLow = le32_to_cpu(putPaddrLow(prsp->phys));
205 		bpl->addrHigh = le32_to_cpu(putPaddrHigh(prsp->phys));
206 		bpl->tus.f.bdeSize = FCELSSIZE;
207 		bpl->tus.f.bdeFlags = BUFF_USE_RCV;
208 		bpl->tus.w = le32_to_cpu(bpl->tus.w);
209 	}
210 
211 	/* Save for completion so we can release these resources */
212 	elsiocb->context1 = lpfc_nlp_get(ndlp);
213 	elsiocb->context2 = pcmd;
214 	elsiocb->context3 = pbuflist;
215 	elsiocb->retry = retry;
216 	elsiocb->drvrTimeout = (phba->fc_ratov << 1) + LPFC_DRVR_TIMEOUT;
217 
218 	if (prsp) {
219 		list_add(&prsp->list, &pcmd->list);
220 	}
221 
222 	if (expectRsp) {
223 		/* Xmit ELS command <elsCmd> to remote NPORT <did> */
224 		lpfc_printf_log(phba, KERN_INFO, LOG_ELS,
225 				"%d:0116 Xmit ELS command x%x to remote "
226 				"NPORT x%x I/O tag: x%x, HBA state: x%x\n",
227 				phba->brd_no, elscmd,
228 				did, elsiocb->iotag, phba->hba_state);
229 	} else {
230 		/* Xmit ELS response <elsCmd> to remote NPORT <did> */
231 		lpfc_printf_log(phba, KERN_INFO, LOG_ELS,
232 				"%d:0117 Xmit ELS response x%x to remote "
233 				"NPORT x%x I/O tag: x%x, size: x%x\n",
234 				phba->brd_no, elscmd,
235 				ndlp->nlp_DID, elsiocb->iotag, cmdSize);
236 	}
237 
238 	return elsiocb;
239 }
240 
241 
242 static int
243 lpfc_cmpl_els_flogi_fabric(struct lpfc_hba *phba, struct lpfc_nodelist *ndlp,
244 		struct serv_parm *sp, IOCB_t *irsp)
245 {
246 	LPFC_MBOXQ_t *mbox;
247 	struct lpfc_dmabuf *mp;
248 	int rc;
249 
250 	spin_lock_irq(phba->host->host_lock);
251 	phba->fc_flag |= FC_FABRIC;
252 	spin_unlock_irq(phba->host->host_lock);
253 
254 	phba->fc_edtov = be32_to_cpu(sp->cmn.e_d_tov);
255 	if (sp->cmn.edtovResolution)	/* E_D_TOV ticks are in nanoseconds */
256 		phba->fc_edtov = (phba->fc_edtov + 999999) / 1000000;
257 
258 	phba->fc_ratov = (be32_to_cpu(sp->cmn.w2.r_a_tov) + 999) / 1000;
259 
260 	if (phba->fc_topology == TOPOLOGY_LOOP) {
261 		spin_lock_irq(phba->host->host_lock);
262 		phba->fc_flag |= FC_PUBLIC_LOOP;
263 		spin_unlock_irq(phba->host->host_lock);
264 	} else {
265 		/*
266 		 * If we are a N-port connected to a Fabric, fixup sparam's so
267 		 * logins to devices on remote loops work.
268 		 */
269 		phba->fc_sparam.cmn.altBbCredit = 1;
270 	}
271 
272 	phba->fc_myDID = irsp->un.ulpWord[4] & Mask_DID;
273 	memcpy(&ndlp->nlp_portname, &sp->portName, sizeof(struct lpfc_name));
274 	memcpy(&ndlp->nlp_nodename, &sp->nodeName, sizeof (struct lpfc_name));
275 	ndlp->nlp_class_sup = 0;
276 	if (sp->cls1.classValid)
277 		ndlp->nlp_class_sup |= FC_COS_CLASS1;
278 	if (sp->cls2.classValid)
279 		ndlp->nlp_class_sup |= FC_COS_CLASS2;
280 	if (sp->cls3.classValid)
281 		ndlp->nlp_class_sup |= FC_COS_CLASS3;
282 	if (sp->cls4.classValid)
283 		ndlp->nlp_class_sup |= FC_COS_CLASS4;
284 	ndlp->nlp_maxframe = ((sp->cmn.bbRcvSizeMsb & 0x0F) << 8) |
285 				sp->cmn.bbRcvSizeLsb;
286 	memcpy(&phba->fc_fabparam, sp, sizeof(struct serv_parm));
287 
288 	mbox = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL);
289 	if (!mbox)
290 		goto fail;
291 
292 	phba->hba_state = LPFC_FABRIC_CFG_LINK;
293 	lpfc_config_link(phba, mbox);
294 	mbox->mbox_cmpl = lpfc_sli_def_mbox_cmpl;
295 
296 	rc = lpfc_sli_issue_mbox(phba, mbox, MBX_NOWAIT | MBX_STOP_IOCB);
297 	if (rc == MBX_NOT_FINISHED)
298 		goto fail_free_mbox;
299 
300 	mbox = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL);
301 	if (!mbox)
302 		goto fail;
303 
304 	if (lpfc_reg_login(phba, Fabric_DID, (uint8_t *) sp, mbox, 0))
305 		goto fail_free_mbox;
306 
307 	mbox->mbox_cmpl = lpfc_mbx_cmpl_fabric_reg_login;
308 	mbox->context2 = lpfc_nlp_get(ndlp);
309 
310 	rc = lpfc_sli_issue_mbox(phba, mbox, MBX_NOWAIT | MBX_STOP_IOCB);
311 	if (rc == MBX_NOT_FINISHED)
312 		goto fail_issue_reg_login;
313 
314 	return 0;
315 
316  fail_issue_reg_login:
317 	lpfc_nlp_put(ndlp);
318 	mp = (struct lpfc_dmabuf *) mbox->context1;
319 	lpfc_mbuf_free(phba, mp->virt, mp->phys);
320 	kfree(mp);
321  fail_free_mbox:
322 	mempool_free(mbox, phba->mbox_mem_pool);
323  fail:
324 	return -ENXIO;
325 }
326 
327 /*
328  * We FLOGIed into an NPort, initiate pt2pt protocol
329  */
330 static int
331 lpfc_cmpl_els_flogi_nport(struct lpfc_hba *phba, struct lpfc_nodelist *ndlp,
332 		struct serv_parm *sp)
333 {
334 	LPFC_MBOXQ_t *mbox;
335 	int rc;
336 
337 	spin_lock_irq(phba->host->host_lock);
338 	phba->fc_flag &= ~(FC_FABRIC | FC_PUBLIC_LOOP);
339 	spin_unlock_irq(phba->host->host_lock);
340 
341 	phba->fc_edtov = FF_DEF_EDTOV;
342 	phba->fc_ratov = FF_DEF_RATOV;
343 	rc = memcmp(&phba->fc_portname, &sp->portName,
344 			sizeof(struct lpfc_name));
345 	if (rc >= 0) {
346 		/* This side will initiate the PLOGI */
347 		spin_lock_irq(phba->host->host_lock);
348 		phba->fc_flag |= FC_PT2PT_PLOGI;
349 		spin_unlock_irq(phba->host->host_lock);
350 
351 		/*
352 		 * N_Port ID cannot be 0, set our to LocalID the other
353 		 * side will be RemoteID.
354 		 */
355 
356 		/* not equal */
357 		if (rc)
358 			phba->fc_myDID = PT2PT_LocalID;
359 
360 		mbox = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL);
361 		if (!mbox)
362 			goto fail;
363 
364 		lpfc_config_link(phba, mbox);
365 
366 		mbox->mbox_cmpl = lpfc_sli_def_mbox_cmpl;
367 		rc = lpfc_sli_issue_mbox(phba, mbox,
368 				MBX_NOWAIT | MBX_STOP_IOCB);
369 		if (rc == MBX_NOT_FINISHED) {
370 			mempool_free(mbox, phba->mbox_mem_pool);
371 			goto fail;
372 		}
373 		lpfc_nlp_put(ndlp);
374 
375 		ndlp = lpfc_findnode_did(phba, PT2PT_RemoteID);
376 		if (!ndlp) {
377 			/*
378 			 * Cannot find existing Fabric ndlp, so allocate a
379 			 * new one
380 			 */
381 			ndlp = mempool_alloc(phba->nlp_mem_pool, GFP_KERNEL);
382 			if (!ndlp)
383 				goto fail;
384 
385 			lpfc_nlp_init(phba, ndlp, PT2PT_RemoteID);
386 		}
387 
388 		memcpy(&ndlp->nlp_portname, &sp->portName,
389 				sizeof(struct lpfc_name));
390 		memcpy(&ndlp->nlp_nodename, &sp->nodeName,
391 				sizeof(struct lpfc_name));
392 		lpfc_nlp_set_state(phba, ndlp, NLP_STE_NPR_NODE);
393 		ndlp->nlp_flag |= NLP_NPR_2B_DISC;
394 	} else {
395 		/* This side will wait for the PLOGI */
396 		lpfc_nlp_put(ndlp);
397 	}
398 
399 	spin_lock_irq(phba->host->host_lock);
400 	phba->fc_flag |= FC_PT2PT;
401 	spin_unlock_irq(phba->host->host_lock);
402 
403 	/* Start discovery - this should just do CLEAR_LA */
404 	lpfc_disc_start(phba);
405 	return 0;
406  fail:
407 	return -ENXIO;
408 }
409 
410 static void
411 lpfc_cmpl_els_flogi(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
412 		    struct lpfc_iocbq *rspiocb)
413 {
414 	IOCB_t *irsp = &rspiocb->iocb;
415 	struct lpfc_nodelist *ndlp = cmdiocb->context1;
416 	struct lpfc_dmabuf *pcmd = cmdiocb->context2, *prsp;
417 	struct serv_parm *sp;
418 	int rc;
419 
420 	/* Check to see if link went down during discovery */
421 	if (lpfc_els_chk_latt(phba)) {
422 		lpfc_nlp_put(ndlp);
423 		goto out;
424 	}
425 
426 	if (irsp->ulpStatus) {
427 		/* Check for retry */
428 		if (lpfc_els_retry(phba, cmdiocb, rspiocb)) {
429 			/* ELS command is being retried */
430 			goto out;
431 		}
432 		/* FLOGI failed, so there is no fabric */
433 		spin_lock_irq(phba->host->host_lock);
434 		phba->fc_flag &= ~(FC_FABRIC | FC_PUBLIC_LOOP);
435 		spin_unlock_irq(phba->host->host_lock);
436 
437 		/* If private loop, then allow max outstanding els to be
438 		 * LPFC_MAX_DISC_THREADS (32). Scanning in the case of no
439 		 * alpa map would take too long otherwise.
440 		 */
441 		if (phba->alpa_map[0] == 0) {
442 			phba->cfg_discovery_threads = LPFC_MAX_DISC_THREADS;
443 		}
444 
445 		/* FLOGI failure */
446 		lpfc_printf_log(phba,
447 				KERN_INFO,
448 				LOG_ELS,
449 				"%d:0100 FLOGI failure Data: x%x x%x x%x\n",
450 				phba->brd_no,
451 				irsp->ulpStatus, irsp->un.ulpWord[4],
452 				irsp->ulpTimeout);
453 		goto flogifail;
454 	}
455 
456 	/*
457 	 * The FLogI succeeded.  Sync the data for the CPU before
458 	 * accessing it.
459 	 */
460 	prsp = list_get_first(&pcmd->list, struct lpfc_dmabuf, list);
461 
462 	sp = prsp->virt + sizeof(uint32_t);
463 
464 	/* FLOGI completes successfully */
465 	lpfc_printf_log(phba, KERN_INFO, LOG_ELS,
466 			"%d:0101 FLOGI completes sucessfully "
467 			"Data: x%x x%x x%x x%x\n",
468 			phba->brd_no,
469 			irsp->un.ulpWord[4], sp->cmn.e_d_tov,
470 			sp->cmn.w2.r_a_tov, sp->cmn.edtovResolution);
471 
472 	if (phba->hba_state == LPFC_FLOGI) {
473 		/*
474 		 * If Common Service Parameters indicate Nport
475 		 * we are point to point, if Fport we are Fabric.
476 		 */
477 		if (sp->cmn.fPort)
478 			rc = lpfc_cmpl_els_flogi_fabric(phba, ndlp, sp, irsp);
479 		else
480 			rc = lpfc_cmpl_els_flogi_nport(phba, ndlp, sp);
481 
482 		if (!rc)
483 			goto out;
484 	}
485 
486 flogifail:
487 	lpfc_nlp_put(ndlp);
488 
489 	if (irsp->ulpStatus != IOSTAT_LOCAL_REJECT ||
490 	    (irsp->un.ulpWord[4] != IOERR_SLI_ABORTED &&
491 	     irsp->un.ulpWord[4] != IOERR_SLI_DOWN)) {
492 		/* FLOGI failed, so just use loop map to make discovery list */
493 		lpfc_disc_list_loopmap(phba);
494 
495 		/* Start discovery */
496 		lpfc_disc_start(phba);
497 	}
498 
499 out:
500 	lpfc_els_free_iocb(phba, cmdiocb);
501 }
502 
503 static int
504 lpfc_issue_els_flogi(struct lpfc_hba * phba, struct lpfc_nodelist * ndlp,
505 		     uint8_t retry)
506 {
507 	struct serv_parm *sp;
508 	IOCB_t *icmd;
509 	struct lpfc_iocbq *elsiocb;
510 	struct lpfc_sli_ring *pring;
511 	uint8_t *pcmd;
512 	uint16_t cmdsize;
513 	uint32_t tmo;
514 	int rc;
515 
516 	pring = &phba->sli.ring[LPFC_ELS_RING];
517 
518 	cmdsize = (sizeof (uint32_t) + sizeof (struct serv_parm));
519 	elsiocb = lpfc_prep_els_iocb(phba, 1, cmdsize, retry, ndlp,
520 						 ndlp->nlp_DID, ELS_CMD_FLOGI);
521 	if (!elsiocb)
522 		return 1;
523 
524 	icmd = &elsiocb->iocb;
525 	pcmd = (uint8_t *) (((struct lpfc_dmabuf *) elsiocb->context2)->virt);
526 
527 	/* For FLOGI request, remainder of payload is service parameters */
528 	*((uint32_t *) (pcmd)) = ELS_CMD_FLOGI;
529 	pcmd += sizeof (uint32_t);
530 	memcpy(pcmd, &phba->fc_sparam, sizeof (struct serv_parm));
531 	sp = (struct serv_parm *) pcmd;
532 
533 	/* Setup CSPs accordingly for Fabric */
534 	sp->cmn.e_d_tov = 0;
535 	sp->cmn.w2.r_a_tov = 0;
536 	sp->cls1.classValid = 0;
537 	sp->cls2.seqDelivery = 1;
538 	sp->cls3.seqDelivery = 1;
539 	if (sp->cmn.fcphLow < FC_PH3)
540 		sp->cmn.fcphLow = FC_PH3;
541 	if (sp->cmn.fcphHigh < FC_PH3)
542 		sp->cmn.fcphHigh = FC_PH3;
543 
544 	tmo = phba->fc_ratov;
545 	phba->fc_ratov = LPFC_DISC_FLOGI_TMO;
546 	lpfc_set_disctmo(phba);
547 	phba->fc_ratov = tmo;
548 
549 	phba->fc_stat.elsXmitFLOGI++;
550 	elsiocb->iocb_cmpl = lpfc_cmpl_els_flogi;
551 	spin_lock_irq(phba->host->host_lock);
552 	rc = lpfc_sli_issue_iocb(phba, pring, elsiocb, 0);
553 	spin_unlock_irq(phba->host->host_lock);
554 	if (rc == IOCB_ERROR) {
555 		lpfc_els_free_iocb(phba, elsiocb);
556 		return 1;
557 	}
558 	return 0;
559 }
560 
561 int
562 lpfc_els_abort_flogi(struct lpfc_hba * phba)
563 {
564 	struct lpfc_sli_ring *pring;
565 	struct lpfc_iocbq *iocb, *next_iocb;
566 	struct lpfc_nodelist *ndlp;
567 	IOCB_t *icmd;
568 
569 	/* Abort outstanding I/O on NPort <nlp_DID> */
570 	lpfc_printf_log(phba, KERN_INFO, LOG_DISCOVERY,
571 			"%d:0201 Abort outstanding I/O on NPort x%x\n",
572 			phba->brd_no, Fabric_DID);
573 
574 	pring = &phba->sli.ring[LPFC_ELS_RING];
575 
576 	/*
577 	 * Check the txcmplq for an iocb that matches the nport the driver is
578 	 * searching for.
579 	 */
580 	spin_lock_irq(phba->host->host_lock);
581 	list_for_each_entry_safe(iocb, next_iocb, &pring->txcmplq, list) {
582 		icmd = &iocb->iocb;
583 		if (icmd->ulpCommand == CMD_ELS_REQUEST64_CR) {
584 			ndlp = (struct lpfc_nodelist *)(iocb->context1);
585 			if (ndlp && (ndlp->nlp_DID == Fabric_DID))
586 				lpfc_sli_issue_abort_iotag(phba, pring, iocb);
587 		}
588 	}
589 	spin_unlock_irq(phba->host->host_lock);
590 
591 	return 0;
592 }
593 
594 int
595 lpfc_initial_flogi(struct lpfc_hba *phba)
596 {
597 	struct lpfc_nodelist *ndlp;
598 
599 	/* First look for the Fabric ndlp */
600 	ndlp = lpfc_findnode_did(phba, Fabric_DID);
601 	if (!ndlp) {
602 		/* Cannot find existing Fabric ndlp, so allocate a new one */
603 		ndlp = mempool_alloc(phba->nlp_mem_pool, GFP_KERNEL);
604 		if (!ndlp)
605 			return 0;
606 		lpfc_nlp_init(phba, ndlp, Fabric_DID);
607 	} else {
608 		lpfc_dequeue_node(phba, ndlp);
609 	}
610 	if (lpfc_issue_els_flogi(phba, ndlp, 0)) {
611 		lpfc_nlp_put(ndlp);
612 	}
613 	return 1;
614 }
615 
616 static void
617 lpfc_more_plogi(struct lpfc_hba * phba)
618 {
619 	int sentplogi;
620 
621 	if (phba->num_disc_nodes)
622 		phba->num_disc_nodes--;
623 
624 	/* Continue discovery with <num_disc_nodes> PLOGIs to go */
625 	lpfc_printf_log(phba, KERN_INFO, LOG_DISCOVERY,
626 			"%d:0232 Continue discovery with %d PLOGIs to go "
627 			"Data: x%x x%x x%x\n",
628 			phba->brd_no, phba->num_disc_nodes, phba->fc_plogi_cnt,
629 			phba->fc_flag, phba->hba_state);
630 
631 	/* Check to see if there are more PLOGIs to be sent */
632 	if (phba->fc_flag & FC_NLP_MORE) {
633 		/* go thru NPR list and issue any remaining ELS PLOGIs */
634 		sentplogi = lpfc_els_disc_plogi(phba);
635 	}
636 	return;
637 }
638 
639 static struct lpfc_nodelist *
640 lpfc_plogi_confirm_nport(struct lpfc_hba *phba, struct lpfc_dmabuf *prsp,
641 			 struct lpfc_nodelist *ndlp)
642 {
643 	struct lpfc_nodelist *new_ndlp;
644 	uint32_t *lp;
645 	struct serv_parm *sp;
646 	uint8_t name[sizeof (struct lpfc_name)];
647 	uint32_t rc;
648 
649 	/* Fabric nodes can have the same WWPN so we don't bother searching
650 	 * by WWPN.  Just return the ndlp that was given to us.
651 	 */
652 	if (ndlp->nlp_type & NLP_FABRIC)
653 		return ndlp;
654 
655 	lp = (uint32_t *) prsp->virt;
656 	sp = (struct serv_parm *) ((uint8_t *) lp + sizeof (uint32_t));
657 	memset(name, 0, sizeof(struct lpfc_name));
658 
659 	/* Now we find out if the NPort we are logging into, matches the WWPN
660 	 * we have for that ndlp. If not, we have some work to do.
661 	 */
662 	new_ndlp = lpfc_findnode_wwpn(phba, &sp->portName);
663 
664 	if (new_ndlp == ndlp)
665 		return ndlp;
666 
667 	if (!new_ndlp) {
668 		rc =
669 		   memcmp(&ndlp->nlp_portname, name, sizeof(struct lpfc_name));
670 		if (!rc)
671 			return ndlp;
672 		new_ndlp = mempool_alloc(phba->nlp_mem_pool, GFP_ATOMIC);
673 		if (!new_ndlp)
674 			return ndlp;
675 
676 		lpfc_nlp_init(phba, new_ndlp, ndlp->nlp_DID);
677 	}
678 
679 	lpfc_unreg_rpi(phba, new_ndlp);
680 	new_ndlp->nlp_DID = ndlp->nlp_DID;
681 	new_ndlp->nlp_prev_state = ndlp->nlp_prev_state;
682 	lpfc_nlp_set_state(phba, new_ndlp, ndlp->nlp_state);
683 
684 	/* Move this back to NPR list */
685 	if (memcmp(&ndlp->nlp_portname, name, sizeof(struct lpfc_name)) == 0)
686 		lpfc_drop_node(phba, ndlp);
687 	else {
688 		lpfc_unreg_rpi(phba, ndlp);
689 		ndlp->nlp_DID = 0; /* Two ndlps cannot have the same did */
690 		lpfc_nlp_set_state(phba, ndlp, NLP_STE_NPR_NODE);
691 	}
692 	return new_ndlp;
693 }
694 
695 static void
696 lpfc_cmpl_els_plogi(struct lpfc_hba * phba, struct lpfc_iocbq * cmdiocb,
697 		    struct lpfc_iocbq * rspiocb)
698 {
699 	IOCB_t *irsp;
700 	struct lpfc_nodelist *ndlp;
701 	struct lpfc_dmabuf *prsp;
702 	int disc, rc, did, type;
703 
704 	/* we pass cmdiocb to state machine which needs rspiocb as well */
705 	cmdiocb->context_un.rsp_iocb = rspiocb;
706 
707 	irsp = &rspiocb->iocb;
708 	ndlp = lpfc_findnode_did(phba, irsp->un.elsreq64.remoteID);
709 	if (!ndlp)
710 		goto out;
711 
712 	/* Since ndlp can be freed in the disc state machine, note if this node
713 	 * is being used during discovery.
714 	 */
715 	disc = (ndlp->nlp_flag & NLP_NPR_2B_DISC);
716 	spin_lock_irq(phba->host->host_lock);
717 	ndlp->nlp_flag &= ~NLP_NPR_2B_DISC;
718 	spin_unlock_irq(phba->host->host_lock);
719 	rc   = 0;
720 
721 	/* PLOGI completes to NPort <nlp_DID> */
722 	lpfc_printf_log(phba, KERN_INFO, LOG_ELS,
723 			"%d:0102 PLOGI completes to NPort x%x "
724 			"Data: x%x x%x x%x x%x x%x\n",
725 			phba->brd_no, ndlp->nlp_DID, irsp->ulpStatus,
726 			irsp->un.ulpWord[4], irsp->ulpTimeout, disc,
727 			phba->num_disc_nodes);
728 
729 	/* Check to see if link went down during discovery */
730 	if (lpfc_els_chk_latt(phba)) {
731 		spin_lock_irq(phba->host->host_lock);
732 		ndlp->nlp_flag |= NLP_NPR_2B_DISC;
733 		spin_unlock_irq(phba->host->host_lock);
734 		goto out;
735 	}
736 
737 	/* ndlp could be freed in DSM, save these values now */
738 	type = ndlp->nlp_type;
739 	did = ndlp->nlp_DID;
740 
741 	if (irsp->ulpStatus) {
742 		/* Check for retry */
743 		if (lpfc_els_retry(phba, cmdiocb, rspiocb)) {
744 			/* ELS command is being retried */
745 			if (disc) {
746 				spin_lock_irq(phba->host->host_lock);
747 				ndlp->nlp_flag |= NLP_NPR_2B_DISC;
748 				spin_unlock_irq(phba->host->host_lock);
749 			}
750 			goto out;
751 		}
752 
753 		/* PLOGI failed */
754 		/* Do not call DSM for lpfc_els_abort'ed ELS cmds */
755 		if ((irsp->ulpStatus == IOSTAT_LOCAL_REJECT) &&
756 		   ((irsp->un.ulpWord[4] == IOERR_SLI_ABORTED) ||
757 		   (irsp->un.ulpWord[4] == IOERR_LINK_DOWN) ||
758 		   (irsp->un.ulpWord[4] == IOERR_SLI_DOWN))) {
759 			rc = NLP_STE_FREED_NODE;
760 		} else {
761 			rc = lpfc_disc_state_machine(phba, ndlp, cmdiocb,
762 					NLP_EVT_CMPL_PLOGI);
763 		}
764 	} else {
765 		/* Good status, call state machine */
766 		prsp = list_entry(((struct lpfc_dmabuf *)
767 			cmdiocb->context2)->list.next,
768 			struct lpfc_dmabuf, list);
769 		ndlp = lpfc_plogi_confirm_nport(phba, prsp, ndlp);
770 		rc = lpfc_disc_state_machine(phba, ndlp, cmdiocb,
771 					NLP_EVT_CMPL_PLOGI);
772 	}
773 
774 	if (disc && phba->num_disc_nodes) {
775 		/* Check to see if there are more PLOGIs to be sent */
776 		lpfc_more_plogi(phba);
777 
778 		if (phba->num_disc_nodes == 0) {
779 			spin_lock_irq(phba->host->host_lock);
780 			phba->fc_flag &= ~FC_NDISC_ACTIVE;
781 			spin_unlock_irq(phba->host->host_lock);
782 
783 			lpfc_can_disctmo(phba);
784 			if (phba->fc_flag & FC_RSCN_MODE) {
785 				/*
786 				 * Check to see if more RSCNs came in while
787 				 * we were processing this one.
788 				 */
789 				if ((phba->fc_rscn_id_cnt == 0) &&
790 			    	(!(phba->fc_flag & FC_RSCN_DISCOVERY))) {
791 					spin_lock_irq(phba->host->host_lock);
792 					phba->fc_flag &= ~FC_RSCN_MODE;
793 					spin_unlock_irq(phba->host->host_lock);
794 				} else {
795 					lpfc_els_handle_rscn(phba);
796 				}
797 			}
798 		}
799 	}
800 
801 out:
802 	lpfc_els_free_iocb(phba, cmdiocb);
803 	return;
804 }
805 
806 int
807 lpfc_issue_els_plogi(struct lpfc_hba * phba, uint32_t did, uint8_t retry)
808 {
809 	struct serv_parm *sp;
810 	IOCB_t *icmd;
811 	struct lpfc_iocbq *elsiocb;
812 	struct lpfc_sli_ring *pring;
813 	struct lpfc_sli *psli;
814 	uint8_t *pcmd;
815 	uint16_t cmdsize;
816 
817 	psli = &phba->sli;
818 	pring = &psli->ring[LPFC_ELS_RING];	/* ELS ring */
819 
820 	cmdsize = (sizeof (uint32_t) + sizeof (struct serv_parm));
821 	elsiocb = lpfc_prep_els_iocb(phba, 1, cmdsize, retry, NULL, did,
822 								ELS_CMD_PLOGI);
823 	if (!elsiocb)
824 		return 1;
825 
826 	icmd = &elsiocb->iocb;
827 	pcmd = (uint8_t *) (((struct lpfc_dmabuf *) elsiocb->context2)->virt);
828 
829 	/* For PLOGI request, remainder of payload is service parameters */
830 	*((uint32_t *) (pcmd)) = ELS_CMD_PLOGI;
831 	pcmd += sizeof (uint32_t);
832 	memcpy(pcmd, &phba->fc_sparam, sizeof (struct serv_parm));
833 	sp = (struct serv_parm *) pcmd;
834 
835 	if (sp->cmn.fcphLow < FC_PH_4_3)
836 		sp->cmn.fcphLow = FC_PH_4_3;
837 
838 	if (sp->cmn.fcphHigh < FC_PH3)
839 		sp->cmn.fcphHigh = FC_PH3;
840 
841 	phba->fc_stat.elsXmitPLOGI++;
842 	elsiocb->iocb_cmpl = lpfc_cmpl_els_plogi;
843 	spin_lock_irq(phba->host->host_lock);
844 	if (lpfc_sli_issue_iocb(phba, pring, elsiocb, 0) == IOCB_ERROR) {
845 		spin_unlock_irq(phba->host->host_lock);
846 		lpfc_els_free_iocb(phba, elsiocb);
847 		return 1;
848 	}
849 	spin_unlock_irq(phba->host->host_lock);
850 	return 0;
851 }
852 
853 static void
854 lpfc_cmpl_els_prli(struct lpfc_hba * phba, struct lpfc_iocbq * cmdiocb,
855 		   struct lpfc_iocbq * rspiocb)
856 {
857 	IOCB_t *irsp;
858 	struct lpfc_sli *psli;
859 	struct lpfc_nodelist *ndlp;
860 
861 	psli = &phba->sli;
862 	/* we pass cmdiocb to state machine which needs rspiocb as well */
863 	cmdiocb->context_un.rsp_iocb = rspiocb;
864 
865 	irsp = &(rspiocb->iocb);
866 	ndlp = (struct lpfc_nodelist *) cmdiocb->context1;
867 	spin_lock_irq(phba->host->host_lock);
868 	ndlp->nlp_flag &= ~NLP_PRLI_SND;
869 	spin_unlock_irq(phba->host->host_lock);
870 
871 	/* PRLI completes to NPort <nlp_DID> */
872 	lpfc_printf_log(phba, KERN_INFO, LOG_ELS,
873 			"%d:0103 PRLI completes to NPort x%x "
874 			"Data: x%x x%x x%x x%x\n",
875 			phba->brd_no, ndlp->nlp_DID, irsp->ulpStatus,
876 			irsp->un.ulpWord[4], irsp->ulpTimeout,
877 			phba->num_disc_nodes);
878 
879 	phba->fc_prli_sent--;
880 	/* Check to see if link went down during discovery */
881 	if (lpfc_els_chk_latt(phba))
882 		goto out;
883 
884 	if (irsp->ulpStatus) {
885 		/* Check for retry */
886 		if (lpfc_els_retry(phba, cmdiocb, rspiocb)) {
887 			/* ELS command is being retried */
888 			goto out;
889 		}
890 		/* PRLI failed */
891 		/* Do not call DSM for lpfc_els_abort'ed ELS cmds */
892 		if ((irsp->ulpStatus == IOSTAT_LOCAL_REJECT) &&
893 		   ((irsp->un.ulpWord[4] == IOERR_SLI_ABORTED) ||
894 		   (irsp->un.ulpWord[4] == IOERR_LINK_DOWN) ||
895 		   (irsp->un.ulpWord[4] == IOERR_SLI_DOWN))) {
896 			goto out;
897 		} else {
898 			lpfc_disc_state_machine(phba, ndlp, cmdiocb,
899 					NLP_EVT_CMPL_PRLI);
900 		}
901 	} else {
902 		/* Good status, call state machine */
903 		lpfc_disc_state_machine(phba, ndlp, cmdiocb, NLP_EVT_CMPL_PRLI);
904 	}
905 
906 out:
907 	lpfc_els_free_iocb(phba, cmdiocb);
908 	return;
909 }
910 
911 int
912 lpfc_issue_els_prli(struct lpfc_hba * phba, struct lpfc_nodelist * ndlp,
913 		    uint8_t retry)
914 {
915 	PRLI *npr;
916 	IOCB_t *icmd;
917 	struct lpfc_iocbq *elsiocb;
918 	struct lpfc_sli_ring *pring;
919 	struct lpfc_sli *psli;
920 	uint8_t *pcmd;
921 	uint16_t cmdsize;
922 
923 	psli = &phba->sli;
924 	pring = &psli->ring[LPFC_ELS_RING];	/* ELS ring */
925 
926 	cmdsize = (sizeof (uint32_t) + sizeof (PRLI));
927 	elsiocb = lpfc_prep_els_iocb(phba, 1, cmdsize, retry, ndlp,
928 					ndlp->nlp_DID, ELS_CMD_PRLI);
929 	if (!elsiocb)
930 		return 1;
931 
932 	icmd = &elsiocb->iocb;
933 	pcmd = (uint8_t *) (((struct lpfc_dmabuf *) elsiocb->context2)->virt);
934 
935 	/* For PRLI request, remainder of payload is service parameters */
936 	memset(pcmd, 0, (sizeof (PRLI) + sizeof (uint32_t)));
937 	*((uint32_t *) (pcmd)) = ELS_CMD_PRLI;
938 	pcmd += sizeof (uint32_t);
939 
940 	/* For PRLI, remainder of payload is PRLI parameter page */
941 	npr = (PRLI *) pcmd;
942 	/*
943 	 * If our firmware version is 3.20 or later,
944 	 * set the following bits for FC-TAPE support.
945 	 */
946 	if (phba->vpd.rev.feaLevelHigh >= 0x02) {
947 		npr->ConfmComplAllowed = 1;
948 		npr->Retry = 1;
949 		npr->TaskRetryIdReq = 1;
950 	}
951 	npr->estabImagePair = 1;
952 	npr->readXferRdyDis = 1;
953 
954 	/* For FCP support */
955 	npr->prliType = PRLI_FCP_TYPE;
956 	npr->initiatorFunc = 1;
957 
958 	phba->fc_stat.elsXmitPRLI++;
959 	elsiocb->iocb_cmpl = lpfc_cmpl_els_prli;
960 	spin_lock_irq(phba->host->host_lock);
961 	ndlp->nlp_flag |= NLP_PRLI_SND;
962 	if (lpfc_sli_issue_iocb(phba, pring, elsiocb, 0) == IOCB_ERROR) {
963 		ndlp->nlp_flag &= ~NLP_PRLI_SND;
964 		spin_unlock_irq(phba->host->host_lock);
965 		lpfc_els_free_iocb(phba, elsiocb);
966 		return 1;
967 	}
968 	spin_unlock_irq(phba->host->host_lock);
969 	phba->fc_prli_sent++;
970 	return 0;
971 }
972 
973 static void
974 lpfc_more_adisc(struct lpfc_hba * phba)
975 {
976 	int sentadisc;
977 
978 	if (phba->num_disc_nodes)
979 		phba->num_disc_nodes--;
980 
981 	/* Continue discovery with <num_disc_nodes> ADISCs to go */
982 	lpfc_printf_log(phba, KERN_INFO, LOG_DISCOVERY,
983 			"%d:0210 Continue discovery with %d ADISCs to go "
984 			"Data: x%x x%x x%x\n",
985 			phba->brd_no, phba->num_disc_nodes, phba->fc_adisc_cnt,
986 			phba->fc_flag, phba->hba_state);
987 
988 	/* Check to see if there are more ADISCs to be sent */
989 	if (phba->fc_flag & FC_NLP_MORE) {
990 		lpfc_set_disctmo(phba);
991 
992 		/* go thru NPR list and issue any remaining ELS ADISCs */
993 		sentadisc = lpfc_els_disc_adisc(phba);
994 	}
995 	return;
996 }
997 
998 static void
999 lpfc_rscn_disc(struct lpfc_hba * phba)
1000 {
1001 	/* RSCN discovery */
1002 	/* go thru NPR list and issue ELS PLOGIs */
1003 	if (phba->fc_npr_cnt) {
1004 		if (lpfc_els_disc_plogi(phba))
1005 			return;
1006 	}
1007 	if (phba->fc_flag & FC_RSCN_MODE) {
1008 		/* Check to see if more RSCNs came in while we were
1009 		 * processing this one.
1010 		 */
1011 		if ((phba->fc_rscn_id_cnt == 0) &&
1012 		    (!(phba->fc_flag & FC_RSCN_DISCOVERY))) {
1013 			spin_lock_irq(phba->host->host_lock);
1014 			phba->fc_flag &= ~FC_RSCN_MODE;
1015 			spin_unlock_irq(phba->host->host_lock);
1016 		} else {
1017 			lpfc_els_handle_rscn(phba);
1018 		}
1019 	}
1020 }
1021 
1022 static void
1023 lpfc_cmpl_els_adisc(struct lpfc_hba * phba, struct lpfc_iocbq * cmdiocb,
1024 		    struct lpfc_iocbq * rspiocb)
1025 {
1026 	IOCB_t *irsp;
1027 	struct lpfc_sli *psli;
1028 	struct lpfc_nodelist *ndlp;
1029 	LPFC_MBOXQ_t *mbox;
1030 	int disc, rc;
1031 
1032 	psli = &phba->sli;
1033 
1034 	/* we pass cmdiocb to state machine which needs rspiocb as well */
1035 	cmdiocb->context_un.rsp_iocb = rspiocb;
1036 
1037 	irsp = &(rspiocb->iocb);
1038 	ndlp = (struct lpfc_nodelist *) cmdiocb->context1;
1039 
1040 	/* Since ndlp can be freed in the disc state machine, note if this node
1041 	 * is being used during discovery.
1042 	 */
1043 	disc = (ndlp->nlp_flag & NLP_NPR_2B_DISC);
1044 	spin_lock_irq(phba->host->host_lock);
1045 	ndlp->nlp_flag &= ~(NLP_ADISC_SND | NLP_NPR_2B_DISC);
1046 	spin_unlock_irq(phba->host->host_lock);
1047 
1048 	/* ADISC completes to NPort <nlp_DID> */
1049 	lpfc_printf_log(phba, KERN_INFO, LOG_ELS,
1050 			"%d:0104 ADISC completes to NPort x%x "
1051 			"Data: x%x x%x x%x x%x x%x\n",
1052 			phba->brd_no, ndlp->nlp_DID, irsp->ulpStatus,
1053 			irsp->un.ulpWord[4], irsp->ulpTimeout, disc,
1054 			phba->num_disc_nodes);
1055 
1056 	/* Check to see if link went down during discovery */
1057 	if (lpfc_els_chk_latt(phba)) {
1058 		spin_lock_irq(phba->host->host_lock);
1059 		ndlp->nlp_flag |= NLP_NPR_2B_DISC;
1060 		spin_unlock_irq(phba->host->host_lock);
1061 		goto out;
1062 	}
1063 
1064 	if (irsp->ulpStatus) {
1065 		/* Check for retry */
1066 		if (lpfc_els_retry(phba, cmdiocb, rspiocb)) {
1067 			/* ELS command is being retried */
1068 			if (disc) {
1069 				spin_lock_irq(phba->host->host_lock);
1070 				ndlp->nlp_flag |= NLP_NPR_2B_DISC;
1071 				spin_unlock_irq(phba->host->host_lock);
1072 				lpfc_set_disctmo(phba);
1073 			}
1074 			goto out;
1075 		}
1076 		/* ADISC failed */
1077 		/* Do not call DSM for lpfc_els_abort'ed ELS cmds */
1078 		if ((irsp->ulpStatus != IOSTAT_LOCAL_REJECT) ||
1079 		   ((irsp->un.ulpWord[4] != IOERR_SLI_ABORTED) &&
1080 		   (irsp->un.ulpWord[4] != IOERR_LINK_DOWN) &&
1081 		   (irsp->un.ulpWord[4] != IOERR_SLI_DOWN))) {
1082 			lpfc_disc_state_machine(phba, ndlp, cmdiocb,
1083 					NLP_EVT_CMPL_ADISC);
1084 		}
1085 	} else {
1086 		/* Good status, call state machine */
1087 		lpfc_disc_state_machine(phba, ndlp, cmdiocb,
1088 					NLP_EVT_CMPL_ADISC);
1089 	}
1090 
1091 	if (disc && phba->num_disc_nodes) {
1092 		/* Check to see if there are more ADISCs to be sent */
1093 		lpfc_more_adisc(phba);
1094 
1095 		/* Check to see if we are done with ADISC authentication */
1096 		if (phba->num_disc_nodes == 0) {
1097 			lpfc_can_disctmo(phba);
1098 			/* If we get here, there is nothing left to wait for */
1099 			if ((phba->hba_state < LPFC_HBA_READY) &&
1100 			    (phba->hba_state != LPFC_CLEAR_LA)) {
1101 				/* Link up discovery */
1102 				if ((mbox = mempool_alloc(phba->mbox_mem_pool,
1103 							  GFP_KERNEL))) {
1104 					phba->hba_state = LPFC_CLEAR_LA;
1105 					lpfc_clear_la(phba, mbox);
1106 					mbox->mbox_cmpl =
1107 					    lpfc_mbx_cmpl_clear_la;
1108 					rc = lpfc_sli_issue_mbox
1109 						(phba, mbox,
1110 						 (MBX_NOWAIT | MBX_STOP_IOCB));
1111 					if (rc == MBX_NOT_FINISHED) {
1112 						mempool_free(mbox,
1113 						     phba->mbox_mem_pool);
1114 						lpfc_disc_flush_list(phba);
1115 						psli->ring[(psli->extra_ring)].
1116 						    flag &=
1117 						    ~LPFC_STOP_IOCB_EVENT;
1118 						psli->ring[(psli->fcp_ring)].
1119 						    flag &=
1120 						    ~LPFC_STOP_IOCB_EVENT;
1121 						psli->ring[(psli->next_ring)].
1122 						    flag &=
1123 						    ~LPFC_STOP_IOCB_EVENT;
1124 						phba->hba_state =
1125 						    LPFC_HBA_READY;
1126 					}
1127 				}
1128 			} else {
1129 				lpfc_rscn_disc(phba);
1130 			}
1131 		}
1132 	}
1133 out:
1134 	lpfc_els_free_iocb(phba, cmdiocb);
1135 	return;
1136 }
1137 
1138 int
1139 lpfc_issue_els_adisc(struct lpfc_hba * phba, struct lpfc_nodelist * ndlp,
1140 		     uint8_t retry)
1141 {
1142 	ADISC *ap;
1143 	IOCB_t *icmd;
1144 	struct lpfc_iocbq *elsiocb;
1145 	struct lpfc_sli_ring *pring;
1146 	struct lpfc_sli *psli;
1147 	uint8_t *pcmd;
1148 	uint16_t cmdsize;
1149 
1150 	psli = &phba->sli;
1151 	pring = &psli->ring[LPFC_ELS_RING];	/* ELS ring */
1152 
1153 	cmdsize = (sizeof (uint32_t) + sizeof (ADISC));
1154 	elsiocb = lpfc_prep_els_iocb(phba, 1, cmdsize, retry, ndlp,
1155 						ndlp->nlp_DID, ELS_CMD_ADISC);
1156 	if (!elsiocb)
1157 		return 1;
1158 
1159 	icmd = &elsiocb->iocb;
1160 	pcmd = (uint8_t *) (((struct lpfc_dmabuf *) elsiocb->context2)->virt);
1161 
1162 	/* For ADISC request, remainder of payload is service parameters */
1163 	*((uint32_t *) (pcmd)) = ELS_CMD_ADISC;
1164 	pcmd += sizeof (uint32_t);
1165 
1166 	/* Fill in ADISC payload */
1167 	ap = (ADISC *) pcmd;
1168 	ap->hardAL_PA = phba->fc_pref_ALPA;
1169 	memcpy(&ap->portName, &phba->fc_portname, sizeof (struct lpfc_name));
1170 	memcpy(&ap->nodeName, &phba->fc_nodename, sizeof (struct lpfc_name));
1171 	ap->DID = be32_to_cpu(phba->fc_myDID);
1172 
1173 	phba->fc_stat.elsXmitADISC++;
1174 	elsiocb->iocb_cmpl = lpfc_cmpl_els_adisc;
1175 	spin_lock_irq(phba->host->host_lock);
1176 	ndlp->nlp_flag |= NLP_ADISC_SND;
1177 	if (lpfc_sli_issue_iocb(phba, pring, elsiocb, 0) == IOCB_ERROR) {
1178 		ndlp->nlp_flag &= ~NLP_ADISC_SND;
1179 		spin_unlock_irq(phba->host->host_lock);
1180 		lpfc_els_free_iocb(phba, elsiocb);
1181 		return 1;
1182 	}
1183 	spin_unlock_irq(phba->host->host_lock);
1184 	return 0;
1185 }
1186 
1187 static void
1188 lpfc_cmpl_els_logo(struct lpfc_hba * phba, struct lpfc_iocbq * cmdiocb,
1189 		   struct lpfc_iocbq * rspiocb)
1190 {
1191 	IOCB_t *irsp;
1192 	struct lpfc_sli *psli;
1193 	struct lpfc_nodelist *ndlp;
1194 
1195 	psli = &phba->sli;
1196 	/* we pass cmdiocb to state machine which needs rspiocb as well */
1197 	cmdiocb->context_un.rsp_iocb = rspiocb;
1198 
1199 	irsp = &(rspiocb->iocb);
1200 	ndlp = (struct lpfc_nodelist *) cmdiocb->context1;
1201 	spin_lock_irq(phba->host->host_lock);
1202 	ndlp->nlp_flag &= ~NLP_LOGO_SND;
1203 	spin_unlock_irq(phba->host->host_lock);
1204 
1205 	/* LOGO completes to NPort <nlp_DID> */
1206 	lpfc_printf_log(phba, KERN_INFO, LOG_ELS,
1207 			"%d:0105 LOGO completes to NPort x%x "
1208 			"Data: x%x x%x x%x x%x\n",
1209 			phba->brd_no, ndlp->nlp_DID, irsp->ulpStatus,
1210 			irsp->un.ulpWord[4], irsp->ulpTimeout,
1211 			phba->num_disc_nodes);
1212 
1213 	/* Check to see if link went down during discovery */
1214 	if (lpfc_els_chk_latt(phba))
1215 		goto out;
1216 
1217 	if (irsp->ulpStatus) {
1218 		/* Check for retry */
1219 		if (lpfc_els_retry(phba, cmdiocb, rspiocb)) {
1220 			/* ELS command is being retried */
1221 			goto out;
1222 		}
1223 		/* LOGO failed */
1224 		/* Do not call DSM for lpfc_els_abort'ed ELS cmds */
1225 		if ((irsp->ulpStatus == IOSTAT_LOCAL_REJECT) &&
1226 		   ((irsp->un.ulpWord[4] == IOERR_SLI_ABORTED) ||
1227 		   (irsp->un.ulpWord[4] == IOERR_LINK_DOWN) ||
1228 		   (irsp->un.ulpWord[4] == IOERR_SLI_DOWN))) {
1229 			goto out;
1230 		} else {
1231 			lpfc_disc_state_machine(phba, ndlp, cmdiocb,
1232 					NLP_EVT_CMPL_LOGO);
1233 		}
1234 	} else {
1235 		/* Good status, call state machine.
1236 		 * This will unregister the rpi if needed.
1237 		 */
1238 		lpfc_disc_state_machine(phba, ndlp, cmdiocb, NLP_EVT_CMPL_LOGO);
1239 	}
1240 
1241 out:
1242 	lpfc_els_free_iocb(phba, cmdiocb);
1243 	return;
1244 }
1245 
1246 int
1247 lpfc_issue_els_logo(struct lpfc_hba * phba, struct lpfc_nodelist * ndlp,
1248 		    uint8_t retry)
1249 {
1250 	IOCB_t *icmd;
1251 	struct lpfc_iocbq *elsiocb;
1252 	struct lpfc_sli_ring *pring;
1253 	struct lpfc_sli *psli;
1254 	uint8_t *pcmd;
1255 	uint16_t cmdsize;
1256 
1257 	psli = &phba->sli;
1258 	pring = &psli->ring[LPFC_ELS_RING];
1259 
1260 	cmdsize = (2 * sizeof (uint32_t)) + sizeof (struct lpfc_name);
1261 	elsiocb = lpfc_prep_els_iocb(phba, 1, cmdsize, retry, ndlp,
1262 						ndlp->nlp_DID, ELS_CMD_LOGO);
1263 	if (!elsiocb)
1264 		return 1;
1265 
1266 	icmd = &elsiocb->iocb;
1267 	pcmd = (uint8_t *) (((struct lpfc_dmabuf *) elsiocb->context2)->virt);
1268 	*((uint32_t *) (pcmd)) = ELS_CMD_LOGO;
1269 	pcmd += sizeof (uint32_t);
1270 
1271 	/* Fill in LOGO payload */
1272 	*((uint32_t *) (pcmd)) = be32_to_cpu(phba->fc_myDID);
1273 	pcmd += sizeof (uint32_t);
1274 	memcpy(pcmd, &phba->fc_portname, sizeof (struct lpfc_name));
1275 
1276 	phba->fc_stat.elsXmitLOGO++;
1277 	elsiocb->iocb_cmpl = lpfc_cmpl_els_logo;
1278 	spin_lock_irq(phba->host->host_lock);
1279 	ndlp->nlp_flag |= NLP_LOGO_SND;
1280 	if (lpfc_sli_issue_iocb(phba, pring, elsiocb, 0) == IOCB_ERROR) {
1281 		ndlp->nlp_flag &= ~NLP_LOGO_SND;
1282 		spin_unlock_irq(phba->host->host_lock);
1283 		lpfc_els_free_iocb(phba, elsiocb);
1284 		return 1;
1285 	}
1286 	spin_unlock_irq(phba->host->host_lock);
1287 	return 0;
1288 }
1289 
1290 static void
1291 lpfc_cmpl_els_cmd(struct lpfc_hba * phba, struct lpfc_iocbq * cmdiocb,
1292 		  struct lpfc_iocbq * rspiocb)
1293 {
1294 	IOCB_t *irsp;
1295 
1296 	irsp = &rspiocb->iocb;
1297 
1298 	/* ELS cmd tag <ulpIoTag> completes */
1299 	lpfc_printf_log(phba,
1300 			KERN_INFO,
1301 			LOG_ELS,
1302 			"%d:0106 ELS cmd tag x%x completes Data: x%x x%x x%x\n",
1303 			phba->brd_no,
1304 			irsp->ulpIoTag, irsp->ulpStatus,
1305 			irsp->un.ulpWord[4], irsp->ulpTimeout);
1306 
1307 	/* Check to see if link went down during discovery */
1308 	lpfc_els_chk_latt(phba);
1309 	lpfc_els_free_iocb(phba, cmdiocb);
1310 	return;
1311 }
1312 
1313 int
1314 lpfc_issue_els_scr(struct lpfc_hba * phba, uint32_t nportid, uint8_t retry)
1315 {
1316 	IOCB_t *icmd;
1317 	struct lpfc_iocbq *elsiocb;
1318 	struct lpfc_sli_ring *pring;
1319 	struct lpfc_sli *psli;
1320 	uint8_t *pcmd;
1321 	uint16_t cmdsize;
1322 	struct lpfc_nodelist *ndlp;
1323 
1324 	psli = &phba->sli;
1325 	pring = &psli->ring[LPFC_ELS_RING];	/* ELS ring */
1326 	cmdsize = (sizeof (uint32_t) + sizeof (SCR));
1327 	ndlp = mempool_alloc(phba->nlp_mem_pool, GFP_KERNEL);
1328 	if (!ndlp)
1329 		return 1;
1330 
1331 	lpfc_nlp_init(phba, ndlp, nportid);
1332 
1333 	elsiocb = lpfc_prep_els_iocb(phba, 1, cmdsize, retry, ndlp,
1334 						ndlp->nlp_DID, ELS_CMD_SCR);
1335 	if (!elsiocb) {
1336 		lpfc_nlp_put(ndlp);
1337 		return 1;
1338 	}
1339 
1340 	icmd = &elsiocb->iocb;
1341 	pcmd = (uint8_t *) (((struct lpfc_dmabuf *) elsiocb->context2)->virt);
1342 
1343 	*((uint32_t *) (pcmd)) = ELS_CMD_SCR;
1344 	pcmd += sizeof (uint32_t);
1345 
1346 	/* For SCR, remainder of payload is SCR parameter page */
1347 	memset(pcmd, 0, sizeof (SCR));
1348 	((SCR *) pcmd)->Function = SCR_FUNC_FULL;
1349 
1350 	phba->fc_stat.elsXmitSCR++;
1351 	elsiocb->iocb_cmpl = lpfc_cmpl_els_cmd;
1352 	spin_lock_irq(phba->host->host_lock);
1353 	if (lpfc_sli_issue_iocb(phba, pring, elsiocb, 0) == IOCB_ERROR) {
1354 		spin_unlock_irq(phba->host->host_lock);
1355 		lpfc_nlp_put(ndlp);
1356 		lpfc_els_free_iocb(phba, elsiocb);
1357 		return 1;
1358 	}
1359 	spin_unlock_irq(phba->host->host_lock);
1360 	lpfc_nlp_put(ndlp);
1361 	return 0;
1362 }
1363 
1364 static int
1365 lpfc_issue_els_farpr(struct lpfc_hba * phba, uint32_t nportid, uint8_t retry)
1366 {
1367 	IOCB_t *icmd;
1368 	struct lpfc_iocbq *elsiocb;
1369 	struct lpfc_sli_ring *pring;
1370 	struct lpfc_sli *psli;
1371 	FARP *fp;
1372 	uint8_t *pcmd;
1373 	uint32_t *lp;
1374 	uint16_t cmdsize;
1375 	struct lpfc_nodelist *ondlp;
1376 	struct lpfc_nodelist *ndlp;
1377 
1378 	psli = &phba->sli;
1379 	pring = &psli->ring[LPFC_ELS_RING];	/* ELS ring */
1380 	cmdsize = (sizeof (uint32_t) + sizeof (FARP));
1381 	ndlp = mempool_alloc(phba->nlp_mem_pool, GFP_KERNEL);
1382 	if (!ndlp)
1383 		return 1;
1384 	lpfc_nlp_init(phba, ndlp, nportid);
1385 
1386 	elsiocb = lpfc_prep_els_iocb(phba, 1, cmdsize, retry, ndlp,
1387 						ndlp->nlp_DID, ELS_CMD_RNID);
1388 	if (!elsiocb) {
1389 		lpfc_nlp_put(ndlp);
1390 		return 1;
1391 	}
1392 
1393 	icmd = &elsiocb->iocb;
1394 	pcmd = (uint8_t *) (((struct lpfc_dmabuf *) elsiocb->context2)->virt);
1395 
1396 	*((uint32_t *) (pcmd)) = ELS_CMD_FARPR;
1397 	pcmd += sizeof (uint32_t);
1398 
1399 	/* Fill in FARPR payload */
1400 	fp = (FARP *) (pcmd);
1401 	memset(fp, 0, sizeof (FARP));
1402 	lp = (uint32_t *) pcmd;
1403 	*lp++ = be32_to_cpu(nportid);
1404 	*lp++ = be32_to_cpu(phba->fc_myDID);
1405 	fp->Rflags = 0;
1406 	fp->Mflags = (FARP_MATCH_PORT | FARP_MATCH_NODE);
1407 
1408 	memcpy(&fp->RportName, &phba->fc_portname, sizeof (struct lpfc_name));
1409 	memcpy(&fp->RnodeName, &phba->fc_nodename, sizeof (struct lpfc_name));
1410 	if ((ondlp = lpfc_findnode_did(phba, nportid))) {
1411 		memcpy(&fp->OportName, &ondlp->nlp_portname,
1412 		       sizeof (struct lpfc_name));
1413 		memcpy(&fp->OnodeName, &ondlp->nlp_nodename,
1414 		       sizeof (struct lpfc_name));
1415 	}
1416 
1417 	phba->fc_stat.elsXmitFARPR++;
1418 	elsiocb->iocb_cmpl = lpfc_cmpl_els_cmd;
1419 	spin_lock_irq(phba->host->host_lock);
1420 	if (lpfc_sli_issue_iocb(phba, pring, elsiocb, 0) == IOCB_ERROR) {
1421 		spin_unlock_irq(phba->host->host_lock);
1422 		lpfc_nlp_put(ndlp);
1423 		lpfc_els_free_iocb(phba, elsiocb);
1424 		return 1;
1425 	}
1426 	spin_unlock_irq(phba->host->host_lock);
1427 	lpfc_nlp_put(ndlp);
1428 	return 0;
1429 }
1430 
1431 void
1432 lpfc_cancel_retry_delay_tmo(struct lpfc_hba *phba, struct lpfc_nodelist * nlp)
1433 {
1434 	nlp->nlp_flag &= ~NLP_DELAY_TMO;
1435 	del_timer_sync(&nlp->nlp_delayfunc);
1436 	nlp->nlp_last_elscmd = 0;
1437 
1438 	if (!list_empty(&nlp->els_retry_evt.evt_listp))
1439 		list_del_init(&nlp->els_retry_evt.evt_listp);
1440 
1441 	if (nlp->nlp_flag & NLP_NPR_2B_DISC) {
1442 		nlp->nlp_flag &= ~NLP_NPR_2B_DISC;
1443 		if (phba->num_disc_nodes) {
1444 			/* Check to see if there are more
1445 			 * PLOGIs to be sent
1446 			 */
1447 			lpfc_more_plogi(phba);
1448 
1449 			if (phba->num_disc_nodes == 0) {
1450 				phba->fc_flag &= ~FC_NDISC_ACTIVE;
1451 				lpfc_can_disctmo(phba);
1452 				if (phba->fc_flag & FC_RSCN_MODE) {
1453 					/*
1454 					 * Check to see if more RSCNs
1455 					 * came in while we were
1456 					 * processing this one.
1457 					 */
1458 					if((phba->fc_rscn_id_cnt==0) &&
1459 					 !(phba->fc_flag & FC_RSCN_DISCOVERY)) {
1460 						phba->fc_flag &= ~FC_RSCN_MODE;
1461 					}
1462 					else {
1463 						lpfc_els_handle_rscn(phba);
1464 					}
1465 				}
1466 			}
1467 		}
1468 	}
1469 	return;
1470 }
1471 
1472 void
1473 lpfc_els_retry_delay(unsigned long ptr)
1474 {
1475 	struct lpfc_nodelist *ndlp;
1476 	struct lpfc_hba *phba;
1477 	unsigned long iflag;
1478 	struct lpfc_work_evt  *evtp;
1479 
1480 	ndlp = (struct lpfc_nodelist *)ptr;
1481 	phba = ndlp->nlp_phba;
1482 	evtp = &ndlp->els_retry_evt;
1483 
1484 	spin_lock_irqsave(phba->host->host_lock, iflag);
1485 	if (!list_empty(&evtp->evt_listp)) {
1486 		spin_unlock_irqrestore(phba->host->host_lock, iflag);
1487 		return;
1488 	}
1489 
1490 	evtp->evt_arg1  = ndlp;
1491 	evtp->evt       = LPFC_EVT_ELS_RETRY;
1492 	list_add_tail(&evtp->evt_listp, &phba->work_list);
1493 	if (phba->work_wait)
1494 		wake_up(phba->work_wait);
1495 
1496 	spin_unlock_irqrestore(phba->host->host_lock, iflag);
1497 	return;
1498 }
1499 
1500 void
1501 lpfc_els_retry_delay_handler(struct lpfc_nodelist *ndlp)
1502 {
1503 	struct lpfc_hba *phba;
1504 	uint32_t cmd;
1505 	uint32_t did;
1506 	uint8_t retry;
1507 
1508 	phba = ndlp->nlp_phba;
1509 	spin_lock_irq(phba->host->host_lock);
1510 	did = ndlp->nlp_DID;
1511 	cmd = ndlp->nlp_last_elscmd;
1512 	ndlp->nlp_last_elscmd = 0;
1513 
1514 	if (!(ndlp->nlp_flag & NLP_DELAY_TMO)) {
1515 		spin_unlock_irq(phba->host->host_lock);
1516 		return;
1517 	}
1518 
1519 	ndlp->nlp_flag &= ~NLP_DELAY_TMO;
1520 	spin_unlock_irq(phba->host->host_lock);
1521 	/*
1522 	 * If a discovery event readded nlp_delayfunc after timer
1523 	 * firing and before processing the timer, cancel the
1524 	 * nlp_delayfunc.
1525 	 */
1526 	del_timer_sync(&ndlp->nlp_delayfunc);
1527 	retry = ndlp->nlp_retry;
1528 
1529 	switch (cmd) {
1530 	case ELS_CMD_FLOGI:
1531 		lpfc_issue_els_flogi(phba, ndlp, retry);
1532 		break;
1533 	case ELS_CMD_PLOGI:
1534 		if(!lpfc_issue_els_plogi(phba, ndlp->nlp_DID, retry)) {
1535 			ndlp->nlp_prev_state = ndlp->nlp_state;
1536 			lpfc_nlp_set_state(phba, ndlp, NLP_STE_PLOGI_ISSUE);
1537 		}
1538 		break;
1539 	case ELS_CMD_ADISC:
1540 		if (!lpfc_issue_els_adisc(phba, ndlp, retry)) {
1541 			ndlp->nlp_prev_state = ndlp->nlp_state;
1542 			lpfc_nlp_set_state(phba, ndlp, NLP_STE_ADISC_ISSUE);
1543 		}
1544 		break;
1545 	case ELS_CMD_PRLI:
1546 		if (!lpfc_issue_els_prli(phba, ndlp, retry)) {
1547 			ndlp->nlp_prev_state = ndlp->nlp_state;
1548 			lpfc_nlp_set_state(phba, ndlp, NLP_STE_PRLI_ISSUE);
1549 		}
1550 		break;
1551 	case ELS_CMD_LOGO:
1552 		if (!lpfc_issue_els_logo(phba, ndlp, retry)) {
1553 			ndlp->nlp_prev_state = ndlp->nlp_state;
1554 			lpfc_nlp_set_state(phba, ndlp, NLP_STE_NPR_NODE);
1555 		}
1556 		break;
1557 	}
1558 	return;
1559 }
1560 
1561 static int
1562 lpfc_els_retry(struct lpfc_hba * phba, struct lpfc_iocbq * cmdiocb,
1563 	       struct lpfc_iocbq * rspiocb)
1564 {
1565 	IOCB_t *irsp;
1566 	struct lpfc_dmabuf *pcmd;
1567 	struct lpfc_nodelist *ndlp;
1568 	uint32_t *elscmd;
1569 	struct ls_rjt stat;
1570 	int retry, maxretry;
1571 	int delay;
1572 	uint32_t cmd;
1573 	uint32_t did;
1574 
1575 	retry = 0;
1576 	delay = 0;
1577 	maxretry = lpfc_max_els_tries;
1578 	irsp = &rspiocb->iocb;
1579 	ndlp = (struct lpfc_nodelist *) cmdiocb->context1;
1580 	pcmd = (struct lpfc_dmabuf *) cmdiocb->context2;
1581 	cmd = 0;
1582 
1583 	/* Note: context2 may be 0 for internal driver abort
1584 	 * of delays ELS command.
1585 	 */
1586 
1587 	if (pcmd && pcmd->virt) {
1588 		elscmd = (uint32_t *) (pcmd->virt);
1589 		cmd = *elscmd++;
1590 	}
1591 
1592 	if (ndlp)
1593 		did = ndlp->nlp_DID;
1594 	else {
1595 		/* We should only hit this case for retrying PLOGI */
1596 		did = irsp->un.elsreq64.remoteID;
1597 		ndlp = lpfc_findnode_did(phba, did);
1598 		if (!ndlp && (cmd != ELS_CMD_PLOGI))
1599 			return 1;
1600 	}
1601 
1602 	switch (irsp->ulpStatus) {
1603 	case IOSTAT_FCP_RSP_ERROR:
1604 	case IOSTAT_REMOTE_STOP:
1605 		break;
1606 
1607 	case IOSTAT_LOCAL_REJECT:
1608 		switch ((irsp->un.ulpWord[4] & 0xff)) {
1609 		case IOERR_LOOP_OPEN_FAILURE:
1610 			if (cmd == ELS_CMD_PLOGI) {
1611 				if (cmdiocb->retry == 0) {
1612 					delay = 1;
1613 				}
1614 			}
1615 			retry = 1;
1616 			break;
1617 
1618 		case IOERR_SEQUENCE_TIMEOUT:
1619 			retry = 1;
1620 			break;
1621 
1622 		case IOERR_NO_RESOURCES:
1623 			if (cmd == ELS_CMD_PLOGI) {
1624 				delay = 1;
1625 			}
1626 			retry = 1;
1627 			break;
1628 
1629 		case IOERR_INVALID_RPI:
1630 			retry = 1;
1631 			break;
1632 		}
1633 		break;
1634 
1635 	case IOSTAT_NPORT_RJT:
1636 	case IOSTAT_FABRIC_RJT:
1637 		if (irsp->un.ulpWord[4] & RJT_UNAVAIL_TEMP) {
1638 			retry = 1;
1639 			break;
1640 		}
1641 		break;
1642 
1643 	case IOSTAT_NPORT_BSY:
1644 	case IOSTAT_FABRIC_BSY:
1645 		retry = 1;
1646 		break;
1647 
1648 	case IOSTAT_LS_RJT:
1649 		stat.un.lsRjtError = be32_to_cpu(irsp->un.ulpWord[4]);
1650 		/* Added for Vendor specifc support
1651 		 * Just keep retrying for these Rsn / Exp codes
1652 		 */
1653 		switch (stat.un.b.lsRjtRsnCode) {
1654 		case LSRJT_UNABLE_TPC:
1655 			if (stat.un.b.lsRjtRsnCodeExp ==
1656 			    LSEXP_CMD_IN_PROGRESS) {
1657 				if (cmd == ELS_CMD_PLOGI) {
1658 					delay = 1;
1659 					maxretry = 48;
1660 				}
1661 				retry = 1;
1662 				break;
1663 			}
1664 			if (cmd == ELS_CMD_PLOGI) {
1665 				delay = 1;
1666 				maxretry = lpfc_max_els_tries + 1;
1667 				retry = 1;
1668 				break;
1669 			}
1670 			break;
1671 
1672 		case LSRJT_LOGICAL_BSY:
1673 			if (cmd == ELS_CMD_PLOGI) {
1674 				delay = 1;
1675 				maxretry = 48;
1676 			}
1677 			retry = 1;
1678 			break;
1679 		}
1680 		break;
1681 
1682 	case IOSTAT_INTERMED_RSP:
1683 	case IOSTAT_BA_RJT:
1684 		break;
1685 
1686 	default:
1687 		break;
1688 	}
1689 
1690 	if (did == FDMI_DID)
1691 		retry = 1;
1692 
1693 	if ((++cmdiocb->retry) >= maxretry) {
1694 		phba->fc_stat.elsRetryExceeded++;
1695 		retry = 0;
1696 	}
1697 
1698 	if (retry) {
1699 
1700 		/* Retry ELS command <elsCmd> to remote NPORT <did> */
1701 		lpfc_printf_log(phba, KERN_INFO, LOG_ELS,
1702 				"%d:0107 Retry ELS command x%x to remote "
1703 				"NPORT x%x Data: x%x x%x\n",
1704 				phba->brd_no,
1705 				cmd, did, cmdiocb->retry, delay);
1706 
1707 		if ((cmd == ELS_CMD_PLOGI) || (cmd == ELS_CMD_ADISC)) {
1708 			/* If discovery / RSCN timer is running, reset it */
1709 			if (timer_pending(&phba->fc_disctmo) ||
1710 			      (phba->fc_flag & FC_RSCN_MODE)) {
1711 				lpfc_set_disctmo(phba);
1712 			}
1713 		}
1714 
1715 		phba->fc_stat.elsXmitRetry++;
1716 		if (ndlp && delay) {
1717 			phba->fc_stat.elsDelayRetry++;
1718 			ndlp->nlp_retry = cmdiocb->retry;
1719 
1720 			mod_timer(&ndlp->nlp_delayfunc, jiffies + HZ);
1721 			ndlp->nlp_flag |= NLP_DELAY_TMO;
1722 
1723 			ndlp->nlp_prev_state = ndlp->nlp_state;
1724 			lpfc_nlp_set_state(phba, ndlp, NLP_STE_NPR_NODE);
1725 			ndlp->nlp_last_elscmd = cmd;
1726 
1727 			return 1;
1728 		}
1729 		switch (cmd) {
1730 		case ELS_CMD_FLOGI:
1731 			lpfc_issue_els_flogi(phba, ndlp, cmdiocb->retry);
1732 			return 1;
1733 		case ELS_CMD_PLOGI:
1734 			if (ndlp) {
1735 				ndlp->nlp_prev_state = ndlp->nlp_state;
1736 				lpfc_nlp_set_state(phba, ndlp,
1737 						   NLP_STE_PLOGI_ISSUE);
1738 			}
1739 			lpfc_issue_els_plogi(phba, did, cmdiocb->retry);
1740 			return 1;
1741 		case ELS_CMD_ADISC:
1742 			ndlp->nlp_prev_state = ndlp->nlp_state;
1743 			lpfc_nlp_set_state(phba, ndlp, NLP_STE_ADISC_ISSUE);
1744 			lpfc_issue_els_adisc(phba, ndlp, cmdiocb->retry);
1745 			return 1;
1746 		case ELS_CMD_PRLI:
1747 			ndlp->nlp_prev_state = ndlp->nlp_state;
1748 			lpfc_nlp_set_state(phba, ndlp, NLP_STE_PRLI_ISSUE);
1749 			lpfc_issue_els_prli(phba, ndlp, cmdiocb->retry);
1750 			return 1;
1751 		case ELS_CMD_LOGO:
1752 			ndlp->nlp_prev_state = ndlp->nlp_state;
1753 			lpfc_nlp_set_state(phba, ndlp, NLP_STE_NPR_NODE);
1754 			lpfc_issue_els_logo(phba, ndlp, cmdiocb->retry);
1755 			return 1;
1756 		}
1757 	}
1758 
1759 	/* No retry ELS command <elsCmd> to remote NPORT <did> */
1760 	lpfc_printf_log(phba, KERN_INFO, LOG_ELS,
1761 			"%d:0108 No retry ELS command x%x to remote NPORT x%x "
1762 			"Data: x%x\n",
1763 			phba->brd_no,
1764 			cmd, did, cmdiocb->retry);
1765 
1766 	return 0;
1767 }
1768 
1769 int
1770 lpfc_els_free_iocb(struct lpfc_hba *phba, struct lpfc_iocbq *elsiocb)
1771 {
1772 	struct lpfc_dmabuf *buf_ptr, *buf_ptr1;
1773 
1774 	if (elsiocb->context1) {
1775 		lpfc_nlp_put(elsiocb->context1);
1776 		elsiocb->context1 = NULL;
1777 	}
1778 	/* context2  = cmd,  context2->next = rsp, context3 = bpl */
1779 	if (elsiocb->context2) {
1780 		buf_ptr1 = (struct lpfc_dmabuf *) elsiocb->context2;
1781 		/* Free the response before processing the command.  */
1782 		if (!list_empty(&buf_ptr1->list)) {
1783 			list_remove_head(&buf_ptr1->list, buf_ptr,
1784 					 struct lpfc_dmabuf,
1785 					 list);
1786 			lpfc_mbuf_free(phba, buf_ptr->virt, buf_ptr->phys);
1787 			kfree(buf_ptr);
1788 		}
1789 		lpfc_mbuf_free(phba, buf_ptr1->virt, buf_ptr1->phys);
1790 		kfree(buf_ptr1);
1791 	}
1792 
1793 	if (elsiocb->context3) {
1794 		buf_ptr = (struct lpfc_dmabuf *) elsiocb->context3;
1795 		lpfc_mbuf_free(phba, buf_ptr->virt, buf_ptr->phys);
1796 		kfree(buf_ptr);
1797 	}
1798 	spin_lock_irq(phba->host->host_lock);
1799 	lpfc_sli_release_iocbq(phba, elsiocb);
1800 	spin_unlock_irq(phba->host->host_lock);
1801 	return 0;
1802 }
1803 
1804 static void
1805 lpfc_cmpl_els_logo_acc(struct lpfc_hba * phba, struct lpfc_iocbq * cmdiocb,
1806 		       struct lpfc_iocbq * rspiocb)
1807 {
1808 	struct lpfc_nodelist *ndlp;
1809 
1810 	ndlp = (struct lpfc_nodelist *) cmdiocb->context1;
1811 
1812 	/* ACC to LOGO completes to NPort <nlp_DID> */
1813 	lpfc_printf_log(phba, KERN_INFO, LOG_ELS,
1814 			"%d:0109 ACC to LOGO completes to NPort x%x "
1815 			"Data: x%x x%x x%x\n",
1816 			phba->brd_no, ndlp->nlp_DID, ndlp->nlp_flag,
1817 			ndlp->nlp_state, ndlp->nlp_rpi);
1818 
1819 	switch (ndlp->nlp_state) {
1820 	case NLP_STE_UNUSED_NODE:	/* node is just allocated */
1821 		lpfc_drop_node(phba, ndlp);
1822 		break;
1823 	case NLP_STE_NPR_NODE:		/* NPort Recovery mode */
1824 		lpfc_unreg_rpi(phba, ndlp);
1825 		break;
1826 	default:
1827 		break;
1828 	}
1829 	lpfc_els_free_iocb(phba, cmdiocb);
1830 	return;
1831 }
1832 
1833 static void
1834 lpfc_cmpl_els_acc(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
1835 		  struct lpfc_iocbq *rspiocb)
1836 {
1837 	IOCB_t *irsp;
1838 	struct lpfc_nodelist *ndlp;
1839 	LPFC_MBOXQ_t *mbox = NULL;
1840 	struct lpfc_dmabuf *mp;
1841 
1842 	irsp = &rspiocb->iocb;
1843 
1844 	ndlp = (struct lpfc_nodelist *) cmdiocb->context1;
1845 	if (cmdiocb->context_un.mbox)
1846 		mbox = cmdiocb->context_un.mbox;
1847 
1848 
1849 	/* Check to see if link went down during discovery */
1850 	if (lpfc_els_chk_latt(phba) || !ndlp) {
1851 		if (mbox) {
1852 			mp = (struct lpfc_dmabuf *) mbox->context1;
1853 			if (mp) {
1854 				lpfc_mbuf_free(phba, mp->virt, mp->phys);
1855 				kfree(mp);
1856 			}
1857 			mempool_free(mbox, phba->mbox_mem_pool);
1858 		}
1859 		goto out;
1860 	}
1861 
1862 	/* ELS response tag <ulpIoTag> completes */
1863 	lpfc_printf_log(phba, KERN_INFO, LOG_ELS,
1864 			"%d:0110 ELS response tag x%x completes "
1865 			"Data: x%x x%x x%x x%x x%x x%x x%x\n",
1866 			phba->brd_no,
1867 			cmdiocb->iocb.ulpIoTag, rspiocb->iocb.ulpStatus,
1868 			rspiocb->iocb.un.ulpWord[4], rspiocb->iocb.ulpTimeout,
1869  			ndlp->nlp_DID, ndlp->nlp_flag, ndlp->nlp_state,
1870 			ndlp->nlp_rpi);
1871 
1872 	if (mbox) {
1873 		if ((rspiocb->iocb.ulpStatus == 0)
1874 		    && (ndlp->nlp_flag & NLP_ACC_REGLOGIN)) {
1875 			lpfc_unreg_rpi(phba, ndlp);
1876 			mbox->mbox_cmpl = lpfc_mbx_cmpl_reg_login;
1877 			mbox->context2 = lpfc_nlp_get(ndlp);
1878 			ndlp->nlp_prev_state = ndlp->nlp_state;
1879 			lpfc_nlp_set_state(phba, ndlp, NLP_STE_REG_LOGIN_ISSUE);
1880 			if (lpfc_sli_issue_mbox(phba, mbox,
1881 						(MBX_NOWAIT | MBX_STOP_IOCB))
1882 			    != MBX_NOT_FINISHED) {
1883 				goto out;
1884 			}
1885 			lpfc_nlp_put(ndlp);
1886 			/* NOTE: we should have messages for unsuccessful
1887 			   reglogin */
1888 		} else {
1889 			/* Do not call NO_LIST for lpfc_els_abort'ed ELS cmds */
1890 			if (!((irsp->ulpStatus == IOSTAT_LOCAL_REJECT) &&
1891 			      ((irsp->un.ulpWord[4] == IOERR_SLI_ABORTED) ||
1892 			       (irsp->un.ulpWord[4] == IOERR_LINK_DOWN) ||
1893 			       (irsp->un.ulpWord[4] == IOERR_SLI_DOWN)))) {
1894 				if (ndlp->nlp_flag & NLP_ACC_REGLOGIN) {
1895 					lpfc_drop_node(phba, ndlp);
1896 					ndlp = NULL;
1897 				}
1898 			}
1899 		}
1900 		mp = (struct lpfc_dmabuf *) mbox->context1;
1901 		if (mp) {
1902 			lpfc_mbuf_free(phba, mp->virt, mp->phys);
1903 			kfree(mp);
1904 		}
1905 		mempool_free(mbox, phba->mbox_mem_pool);
1906 	}
1907 out:
1908 	if (ndlp) {
1909 		spin_lock_irq(phba->host->host_lock);
1910 		ndlp->nlp_flag &= ~NLP_ACC_REGLOGIN;
1911 		spin_unlock_irq(phba->host->host_lock);
1912 	}
1913 	lpfc_els_free_iocb(phba, cmdiocb);
1914 	return;
1915 }
1916 
1917 int
1918 lpfc_els_rsp_acc(struct lpfc_hba * phba, uint32_t flag,
1919 		 struct lpfc_iocbq * oldiocb, struct lpfc_nodelist * ndlp,
1920 		 LPFC_MBOXQ_t * mbox, uint8_t newnode)
1921 {
1922 	IOCB_t *icmd;
1923 	IOCB_t *oldcmd;
1924 	struct lpfc_iocbq *elsiocb;
1925 	struct lpfc_sli_ring *pring;
1926 	struct lpfc_sli *psli;
1927 	uint8_t *pcmd;
1928 	uint16_t cmdsize;
1929 	int rc;
1930 	ELS_PKT *els_pkt_ptr;
1931 
1932 	psli = &phba->sli;
1933 	pring = &psli->ring[LPFC_ELS_RING];	/* ELS ring */
1934 	oldcmd = &oldiocb->iocb;
1935 
1936 	switch (flag) {
1937 	case ELS_CMD_ACC:
1938 		cmdsize = sizeof (uint32_t);
1939 		elsiocb = lpfc_prep_els_iocb(phba, 0, cmdsize, oldiocb->retry,
1940 					ndlp, ndlp->nlp_DID, ELS_CMD_ACC);
1941 		if (!elsiocb) {
1942 			ndlp->nlp_flag &= ~NLP_LOGO_ACC;
1943 			return 1;
1944 		}
1945 		icmd = &elsiocb->iocb;
1946 		icmd->ulpContext = oldcmd->ulpContext;	/* Xri */
1947 		pcmd = (((struct lpfc_dmabuf *) elsiocb->context2)->virt);
1948 		*((uint32_t *) (pcmd)) = ELS_CMD_ACC;
1949 		pcmd += sizeof (uint32_t);
1950 		break;
1951 	case ELS_CMD_PLOGI:
1952 		cmdsize = (sizeof (struct serv_parm) + sizeof (uint32_t));
1953 		elsiocb = lpfc_prep_els_iocb(phba, 0, cmdsize, oldiocb->retry,
1954 					ndlp, ndlp->nlp_DID, ELS_CMD_ACC);
1955 		if (!elsiocb)
1956 			return 1;
1957 
1958 		icmd = &elsiocb->iocb;
1959 		icmd->ulpContext = oldcmd->ulpContext;	/* Xri */
1960 		pcmd = (((struct lpfc_dmabuf *) elsiocb->context2)->virt);
1961 
1962 		if (mbox)
1963 			elsiocb->context_un.mbox = mbox;
1964 
1965 		*((uint32_t *) (pcmd)) = ELS_CMD_ACC;
1966 		pcmd += sizeof (uint32_t);
1967 		memcpy(pcmd, &phba->fc_sparam, sizeof (struct serv_parm));
1968 		break;
1969 	case ELS_CMD_PRLO:
1970 		cmdsize = sizeof (uint32_t) + sizeof (PRLO);
1971 		elsiocb = lpfc_prep_els_iocb(phba, 0, cmdsize, oldiocb->retry,
1972 					     ndlp, ndlp->nlp_DID, ELS_CMD_PRLO);
1973 		if (!elsiocb)
1974 			return 1;
1975 
1976 		icmd = &elsiocb->iocb;
1977 		icmd->ulpContext = oldcmd->ulpContext; /* Xri */
1978 		pcmd = (((struct lpfc_dmabuf *) elsiocb->context2)->virt);
1979 
1980 		memcpy(pcmd, ((struct lpfc_dmabuf *) oldiocb->context2)->virt,
1981 		       sizeof (uint32_t) + sizeof (PRLO));
1982 		*((uint32_t *) (pcmd)) = ELS_CMD_PRLO_ACC;
1983 		els_pkt_ptr = (ELS_PKT *) pcmd;
1984 		els_pkt_ptr->un.prlo.acceptRspCode = PRLO_REQ_EXECUTED;
1985 		break;
1986 	default:
1987 		return 1;
1988 	}
1989 
1990 	if (newnode) {
1991 		lpfc_nlp_put(ndlp);
1992 		elsiocb->context1 = NULL;
1993 	}
1994 
1995 	/* Xmit ELS ACC response tag <ulpIoTag> */
1996 	lpfc_printf_log(phba, KERN_INFO, LOG_ELS,
1997 			"%d:0128 Xmit ELS ACC response tag x%x, XRI: x%x, "
1998 			"DID: x%x, nlp_flag: x%x nlp_state: x%x RPI: x%x\n",
1999 			phba->brd_no, elsiocb->iotag,
2000 			elsiocb->iocb.ulpContext, ndlp->nlp_DID,
2001 			ndlp->nlp_flag, ndlp->nlp_state, ndlp->nlp_rpi);
2002 
2003 	if (ndlp->nlp_flag & NLP_LOGO_ACC) {
2004 		spin_lock_irq(phba->host->host_lock);
2005 		ndlp->nlp_flag &= ~NLP_LOGO_ACC;
2006 		spin_unlock_irq(phba->host->host_lock);
2007 		elsiocb->iocb_cmpl = lpfc_cmpl_els_logo_acc;
2008 	} else {
2009 		elsiocb->iocb_cmpl = lpfc_cmpl_els_acc;
2010 	}
2011 
2012 	phba->fc_stat.elsXmitACC++;
2013 	spin_lock_irq(phba->host->host_lock);
2014 	rc = lpfc_sli_issue_iocb(phba, pring, elsiocb, 0);
2015 	spin_unlock_irq(phba->host->host_lock);
2016 	if (rc == IOCB_ERROR) {
2017 		lpfc_els_free_iocb(phba, elsiocb);
2018 		return 1;
2019 	}
2020 	return 0;
2021 }
2022 
2023 int
2024 lpfc_els_rsp_reject(struct lpfc_hba * phba, uint32_t rejectError,
2025 		    struct lpfc_iocbq * oldiocb, struct lpfc_nodelist * ndlp)
2026 {
2027 	IOCB_t *icmd;
2028 	IOCB_t *oldcmd;
2029 	struct lpfc_iocbq *elsiocb;
2030 	struct lpfc_sli_ring *pring;
2031 	struct lpfc_sli *psli;
2032 	uint8_t *pcmd;
2033 	uint16_t cmdsize;
2034 	int rc;
2035 
2036 	psli = &phba->sli;
2037 	pring = &psli->ring[LPFC_ELS_RING];	/* ELS ring */
2038 
2039 	cmdsize = 2 * sizeof (uint32_t);
2040 	elsiocb = lpfc_prep_els_iocb(phba, 0, cmdsize, oldiocb->retry,
2041 					ndlp, ndlp->nlp_DID, ELS_CMD_LS_RJT);
2042 	if (!elsiocb)
2043 		return 1;
2044 
2045 	icmd = &elsiocb->iocb;
2046 	oldcmd = &oldiocb->iocb;
2047 	icmd->ulpContext = oldcmd->ulpContext;	/* Xri */
2048 	pcmd = (uint8_t *) (((struct lpfc_dmabuf *) elsiocb->context2)->virt);
2049 
2050 	*((uint32_t *) (pcmd)) = ELS_CMD_LS_RJT;
2051 	pcmd += sizeof (uint32_t);
2052 	*((uint32_t *) (pcmd)) = rejectError;
2053 
2054 	/* Xmit ELS RJT <err> response tag <ulpIoTag> */
2055 	lpfc_printf_log(phba, KERN_INFO, LOG_ELS,
2056 			"%d:0129 Xmit ELS RJT x%x response tag x%x xri x%x, "
2057 			"did x%x, nlp_flag x%x, nlp_state x%x, rpi x%x\n",
2058 			phba->brd_no, rejectError, elsiocb->iotag,
2059 			elsiocb->iocb.ulpContext, ndlp->nlp_DID,
2060 			ndlp->nlp_flag, ndlp->nlp_state, ndlp->nlp_rpi);
2061 
2062 	phba->fc_stat.elsXmitLSRJT++;
2063 	elsiocb->iocb_cmpl = lpfc_cmpl_els_acc;
2064 	spin_lock_irq(phba->host->host_lock);
2065 	rc = lpfc_sli_issue_iocb(phba, pring, elsiocb, 0);
2066 	spin_unlock_irq(phba->host->host_lock);
2067 	if (rc == IOCB_ERROR) {
2068 		lpfc_els_free_iocb(phba, elsiocb);
2069 		return 1;
2070 	}
2071 	return 0;
2072 }
2073 
2074 int
2075 lpfc_els_rsp_adisc_acc(struct lpfc_hba * phba,
2076 		       struct lpfc_iocbq * oldiocb, struct lpfc_nodelist * ndlp)
2077 {
2078 	ADISC *ap;
2079 	IOCB_t *icmd;
2080 	IOCB_t *oldcmd;
2081 	struct lpfc_iocbq *elsiocb;
2082 	struct lpfc_sli_ring *pring;
2083 	struct lpfc_sli *psli;
2084 	uint8_t *pcmd;
2085 	uint16_t cmdsize;
2086 	int rc;
2087 
2088 	psli = &phba->sli;
2089 	pring = &psli->ring[LPFC_ELS_RING];	/* ELS ring */
2090 
2091 	cmdsize = sizeof (uint32_t) + sizeof (ADISC);
2092 	elsiocb = lpfc_prep_els_iocb(phba, 0, cmdsize, oldiocb->retry,
2093 					ndlp, ndlp->nlp_DID, ELS_CMD_ACC);
2094 	if (!elsiocb)
2095 		return 1;
2096 
2097 	icmd = &elsiocb->iocb;
2098 	oldcmd = &oldiocb->iocb;
2099 	icmd->ulpContext = oldcmd->ulpContext;	/* Xri */
2100 
2101 	/* Xmit ADISC ACC response tag <ulpIoTag> */
2102 	lpfc_printf_log(phba, KERN_INFO, LOG_ELS,
2103 			"%d:0130 Xmit ADISC ACC response iotag x%x xri: "
2104 			"x%x, did x%x, nlp_flag x%x, nlp_state x%x rpi x%x\n",
2105 			phba->brd_no, elsiocb->iotag,
2106 			elsiocb->iocb.ulpContext, ndlp->nlp_DID,
2107 			ndlp->nlp_flag, ndlp->nlp_state, ndlp->nlp_rpi);
2108 
2109 	pcmd = (uint8_t *) (((struct lpfc_dmabuf *) elsiocb->context2)->virt);
2110 
2111 	*((uint32_t *) (pcmd)) = ELS_CMD_ACC;
2112 	pcmd += sizeof (uint32_t);
2113 
2114 	ap = (ADISC *) (pcmd);
2115 	ap->hardAL_PA = phba->fc_pref_ALPA;
2116 	memcpy(&ap->portName, &phba->fc_portname, sizeof (struct lpfc_name));
2117 	memcpy(&ap->nodeName, &phba->fc_nodename, sizeof (struct lpfc_name));
2118 	ap->DID = be32_to_cpu(phba->fc_myDID);
2119 
2120 	phba->fc_stat.elsXmitACC++;
2121 	elsiocb->iocb_cmpl = lpfc_cmpl_els_acc;
2122 	spin_lock_irq(phba->host->host_lock);
2123 	rc = lpfc_sli_issue_iocb(phba, pring, elsiocb, 0);
2124 	spin_unlock_irq(phba->host->host_lock);
2125 	if (rc == IOCB_ERROR) {
2126 		lpfc_els_free_iocb(phba, elsiocb);
2127 		return 1;
2128 	}
2129 	return 0;
2130 }
2131 
2132 int
2133 lpfc_els_rsp_prli_acc(struct lpfc_hba *phba, struct lpfc_iocbq *oldiocb,
2134 		      struct lpfc_nodelist *ndlp)
2135 {
2136 	PRLI *npr;
2137 	lpfc_vpd_t *vpd;
2138 	IOCB_t *icmd;
2139 	IOCB_t *oldcmd;
2140 	struct lpfc_iocbq *elsiocb;
2141 	struct lpfc_sli_ring *pring;
2142 	struct lpfc_sli *psli;
2143 	uint8_t *pcmd;
2144 	uint16_t cmdsize;
2145 	int rc;
2146 
2147 	psli = &phba->sli;
2148 	pring = &psli->ring[LPFC_ELS_RING];	/* ELS ring */
2149 
2150 	cmdsize = sizeof (uint32_t) + sizeof (PRLI);
2151 	elsiocb = lpfc_prep_els_iocb(phba, 0, cmdsize, oldiocb->retry, ndlp,
2152 		ndlp->nlp_DID, (ELS_CMD_ACC | (ELS_CMD_PRLI & ~ELS_RSP_MASK)));
2153 	if (!elsiocb)
2154 		return 1;
2155 
2156 	icmd = &elsiocb->iocb;
2157 	oldcmd = &oldiocb->iocb;
2158 	icmd->ulpContext = oldcmd->ulpContext;	/* Xri */
2159 
2160 	/* Xmit PRLI ACC response tag <ulpIoTag> */
2161 	lpfc_printf_log(phba, KERN_INFO, LOG_ELS,
2162 			"%d:0131 Xmit PRLI ACC response tag x%x xri x%x, "
2163 			"did x%x, nlp_flag x%x, nlp_state x%x, rpi x%x\n",
2164 			phba->brd_no, elsiocb->iotag,
2165 			elsiocb->iocb.ulpContext, ndlp->nlp_DID,
2166 			ndlp->nlp_flag, ndlp->nlp_state, ndlp->nlp_rpi);
2167 
2168 	pcmd = (uint8_t *) (((struct lpfc_dmabuf *) elsiocb->context2)->virt);
2169 
2170 	*((uint32_t *) (pcmd)) = (ELS_CMD_ACC | (ELS_CMD_PRLI & ~ELS_RSP_MASK));
2171 	pcmd += sizeof (uint32_t);
2172 
2173 	/* For PRLI, remainder of payload is PRLI parameter page */
2174 	memset(pcmd, 0, sizeof (PRLI));
2175 
2176 	npr = (PRLI *) pcmd;
2177 	vpd = &phba->vpd;
2178 	/*
2179 	 * If our firmware version is 3.20 or later,
2180 	 * set the following bits for FC-TAPE support.
2181 	 */
2182 	if (vpd->rev.feaLevelHigh >= 0x02) {
2183 		npr->ConfmComplAllowed = 1;
2184 		npr->Retry = 1;
2185 		npr->TaskRetryIdReq = 1;
2186 	}
2187 
2188 	npr->acceptRspCode = PRLI_REQ_EXECUTED;
2189 	npr->estabImagePair = 1;
2190 	npr->readXferRdyDis = 1;
2191 	npr->ConfmComplAllowed = 1;
2192 
2193 	npr->prliType = PRLI_FCP_TYPE;
2194 	npr->initiatorFunc = 1;
2195 
2196 	phba->fc_stat.elsXmitACC++;
2197 	elsiocb->iocb_cmpl = lpfc_cmpl_els_acc;
2198 
2199 	spin_lock_irq(phba->host->host_lock);
2200 	rc = lpfc_sli_issue_iocb(phba, pring, elsiocb, 0);
2201 	spin_unlock_irq(phba->host->host_lock);
2202 	if (rc == IOCB_ERROR) {
2203 		lpfc_els_free_iocb(phba, elsiocb);
2204 		return 1;
2205 	}
2206 	return 0;
2207 }
2208 
2209 static int
2210 lpfc_els_rsp_rnid_acc(struct lpfc_hba *phba, uint8_t format,
2211 		      struct lpfc_iocbq *oldiocb, struct lpfc_nodelist *ndlp)
2212 {
2213 	RNID *rn;
2214 	IOCB_t *icmd;
2215 	IOCB_t *oldcmd;
2216 	struct lpfc_iocbq *elsiocb;
2217 	struct lpfc_sli_ring *pring;
2218 	struct lpfc_sli *psli;
2219 	uint8_t *pcmd;
2220 	uint16_t cmdsize;
2221 	int rc;
2222 
2223 	psli = &phba->sli;
2224 	pring = &psli->ring[LPFC_ELS_RING];
2225 
2226 	cmdsize = sizeof (uint32_t) + sizeof (uint32_t)
2227 		+ (2 * sizeof (struct lpfc_name));
2228 	if (format)
2229 		cmdsize += sizeof (RNID_TOP_DISC);
2230 
2231 	elsiocb = lpfc_prep_els_iocb(phba, 0, cmdsize, oldiocb->retry,
2232 					ndlp, ndlp->nlp_DID, ELS_CMD_ACC);
2233 	if (!elsiocb)
2234 		return 1;
2235 
2236 	icmd = &elsiocb->iocb;
2237 	oldcmd = &oldiocb->iocb;
2238 	icmd->ulpContext = oldcmd->ulpContext;	/* Xri */
2239 
2240 	/* Xmit RNID ACC response tag <ulpIoTag> */
2241 	lpfc_printf_log(phba, KERN_INFO, LOG_ELS,
2242 			"%d:0132 Xmit RNID ACC response tag x%x "
2243 			"xri x%x\n",
2244 			phba->brd_no, elsiocb->iotag,
2245 			elsiocb->iocb.ulpContext);
2246 
2247 	pcmd = (uint8_t *) (((struct lpfc_dmabuf *) elsiocb->context2)->virt);
2248 
2249 	*((uint32_t *) (pcmd)) = ELS_CMD_ACC;
2250 	pcmd += sizeof (uint32_t);
2251 
2252 	memset(pcmd, 0, sizeof (RNID));
2253 	rn = (RNID *) (pcmd);
2254 	rn->Format = format;
2255 	rn->CommonLen = (2 * sizeof (struct lpfc_name));
2256 	memcpy(&rn->portName, &phba->fc_portname, sizeof (struct lpfc_name));
2257 	memcpy(&rn->nodeName, &phba->fc_nodename, sizeof (struct lpfc_name));
2258 	switch (format) {
2259 	case 0:
2260 		rn->SpecificLen = 0;
2261 		break;
2262 	case RNID_TOPOLOGY_DISC:
2263 		rn->SpecificLen = sizeof (RNID_TOP_DISC);
2264 		memcpy(&rn->un.topologyDisc.portName,
2265 		       &phba->fc_portname, sizeof (struct lpfc_name));
2266 		rn->un.topologyDisc.unitType = RNID_HBA;
2267 		rn->un.topologyDisc.physPort = 0;
2268 		rn->un.topologyDisc.attachedNodes = 0;
2269 		break;
2270 	default:
2271 		rn->CommonLen = 0;
2272 		rn->SpecificLen = 0;
2273 		break;
2274 	}
2275 
2276 	phba->fc_stat.elsXmitACC++;
2277 	elsiocb->iocb_cmpl = lpfc_cmpl_els_acc;
2278 	lpfc_nlp_put(ndlp);
2279 	elsiocb->context1 = NULL;  /* Don't need ndlp for cmpl,
2280 				    * it could be freed */
2281 
2282 	spin_lock_irq(phba->host->host_lock);
2283 	rc = lpfc_sli_issue_iocb(phba, pring, elsiocb, 0);
2284 	spin_unlock_irq(phba->host->host_lock);
2285 	if (rc == IOCB_ERROR) {
2286 		lpfc_els_free_iocb(phba, elsiocb);
2287 		return 1;
2288 	}
2289 	return 0;
2290 }
2291 
2292 int
2293 lpfc_els_disc_adisc(struct lpfc_hba *phba)
2294 {
2295 	int sentadisc;
2296 	struct lpfc_nodelist *ndlp, *next_ndlp;
2297 
2298 	sentadisc = 0;
2299 	/* go thru NPR nodes and issue any remaining ELS ADISCs */
2300 	list_for_each_entry_safe(ndlp, next_ndlp, &phba->fc_nodes, nlp_listp) {
2301 		if (ndlp->nlp_state == NLP_STE_NPR_NODE &&
2302 		    (ndlp->nlp_flag & NLP_NPR_2B_DISC) != 0 &&
2303 		    (ndlp->nlp_flag & NLP_NPR_ADISC) != 0) {
2304 			spin_lock_irq(phba->host->host_lock);
2305 			ndlp->nlp_flag &= ~NLP_NPR_ADISC;
2306 			spin_unlock_irq(phba->host->host_lock);
2307 			ndlp->nlp_prev_state = ndlp->nlp_state;
2308 			lpfc_nlp_set_state(phba, ndlp, NLP_STE_ADISC_ISSUE);
2309 			lpfc_issue_els_adisc(phba, ndlp, 0);
2310 			sentadisc++;
2311 			phba->num_disc_nodes++;
2312 			if (phba->num_disc_nodes >=
2313 			    phba->cfg_discovery_threads) {
2314 				spin_lock_irq(phba->host->host_lock);
2315 				phba->fc_flag |= FC_NLP_MORE;
2316 				spin_unlock_irq(phba->host->host_lock);
2317 				break;
2318 			}
2319 		}
2320 	}
2321 	if (sentadisc == 0) {
2322 		spin_lock_irq(phba->host->host_lock);
2323 		phba->fc_flag &= ~FC_NLP_MORE;
2324 		spin_unlock_irq(phba->host->host_lock);
2325 	}
2326 	return sentadisc;
2327 }
2328 
2329 int
2330 lpfc_els_disc_plogi(struct lpfc_hba * phba)
2331 {
2332 	int sentplogi;
2333 	struct lpfc_nodelist *ndlp, *next_ndlp;
2334 
2335 	sentplogi = 0;
2336 	/* go thru NPR list and issue any remaining ELS PLOGIs */
2337 	list_for_each_entry_safe(ndlp, next_ndlp, &phba->fc_nodes, nlp_listp) {
2338 		if (ndlp->nlp_state == NLP_STE_NPR_NODE &&
2339 		    (ndlp->nlp_flag & NLP_NPR_2B_DISC) != 0 &&
2340 		    (ndlp->nlp_flag & NLP_DELAY_TMO) == 0 &&
2341 		    (ndlp->nlp_flag & NLP_NPR_ADISC) == 0) {
2342 			ndlp->nlp_prev_state = ndlp->nlp_state;
2343 			lpfc_nlp_set_state(phba, ndlp, NLP_STE_PLOGI_ISSUE);
2344 			lpfc_issue_els_plogi(phba, ndlp->nlp_DID, 0);
2345 			sentplogi++;
2346 			phba->num_disc_nodes++;
2347 			if (phba->num_disc_nodes >=
2348 			    phba->cfg_discovery_threads) {
2349 				spin_lock_irq(phba->host->host_lock);
2350 				phba->fc_flag |= FC_NLP_MORE;
2351 				spin_unlock_irq(phba->host->host_lock);
2352 				break;
2353 			}
2354 		}
2355 	}
2356 	if (sentplogi == 0) {
2357 		spin_lock_irq(phba->host->host_lock);
2358 		phba->fc_flag &= ~FC_NLP_MORE;
2359 		spin_unlock_irq(phba->host->host_lock);
2360 	}
2361 	return sentplogi;
2362 }
2363 
2364 int
2365 lpfc_els_flush_rscn(struct lpfc_hba * phba)
2366 {
2367 	struct lpfc_dmabuf *mp;
2368 	int i;
2369 
2370 	for (i = 0; i < phba->fc_rscn_id_cnt; i++) {
2371 		mp = phba->fc_rscn_id_list[i];
2372 		lpfc_mbuf_free(phba, mp->virt, mp->phys);
2373 		kfree(mp);
2374 		phba->fc_rscn_id_list[i] = NULL;
2375 	}
2376 	phba->fc_rscn_id_cnt = 0;
2377 	spin_lock_irq(phba->host->host_lock);
2378 	phba->fc_flag &= ~(FC_RSCN_MODE | FC_RSCN_DISCOVERY);
2379 	spin_unlock_irq(phba->host->host_lock);
2380 	lpfc_can_disctmo(phba);
2381 	return 0;
2382 }
2383 
2384 int
2385 lpfc_rscn_payload_check(struct lpfc_hba * phba, uint32_t did)
2386 {
2387 	D_ID ns_did;
2388 	D_ID rscn_did;
2389 	struct lpfc_dmabuf *mp;
2390 	uint32_t *lp;
2391 	uint32_t payload_len, cmd, i, match;
2392 
2393 	ns_did.un.word = did;
2394 	match = 0;
2395 
2396 	/* Never match fabric nodes for RSCNs */
2397 	if ((did & Fabric_DID_MASK) == Fabric_DID_MASK)
2398 		return(0);
2399 
2400 	/* If we are doing a FULL RSCN rediscovery, match everything */
2401 	if (phba->fc_flag & FC_RSCN_DISCOVERY) {
2402 		return did;
2403 	}
2404 
2405 	for (i = 0; i < phba->fc_rscn_id_cnt; i++) {
2406 		mp = phba->fc_rscn_id_list[i];
2407 		lp = (uint32_t *) mp->virt;
2408 		cmd = *lp++;
2409 		payload_len = be32_to_cpu(cmd) & 0xffff; /* payload length */
2410 		payload_len -= sizeof (uint32_t);	/* take off word 0 */
2411 		while (payload_len) {
2412 			rscn_did.un.word = *lp++;
2413 			rscn_did.un.word = be32_to_cpu(rscn_did.un.word);
2414 			payload_len -= sizeof (uint32_t);
2415 			switch (rscn_did.un.b.resv) {
2416 			case 0:	/* Single N_Port ID effected */
2417 				if (ns_did.un.word == rscn_did.un.word) {
2418 					match = did;
2419 				}
2420 				break;
2421 			case 1:	/* Whole N_Port Area effected */
2422 				if ((ns_did.un.b.domain == rscn_did.un.b.domain)
2423 				    && (ns_did.un.b.area == rscn_did.un.b.area))
2424 					{
2425 						match = did;
2426 					}
2427 				break;
2428 			case 2:	/* Whole N_Port Domain effected */
2429 				if (ns_did.un.b.domain == rscn_did.un.b.domain)
2430 					{
2431 						match = did;
2432 					}
2433 				break;
2434 			case 3:	/* Whole Fabric effected */
2435 				match = did;
2436 				break;
2437 			default:
2438 				/* Unknown Identifier in RSCN list */
2439 				lpfc_printf_log(phba, KERN_ERR, LOG_DISCOVERY,
2440 						"%d:0217 Unknown Identifier in "
2441 						"RSCN payload Data: x%x\n",
2442 						phba->brd_no, rscn_did.un.word);
2443 				break;
2444 			}
2445 			if (match) {
2446 				break;
2447 			}
2448 		}
2449 	}
2450 	return match;
2451 }
2452 
2453 static int
2454 lpfc_rscn_recovery_check(struct lpfc_hba *phba)
2455 {
2456 	struct lpfc_nodelist *ndlp = NULL;
2457 
2458 	/* Look at all nodes effected by pending RSCNs and move
2459 	 * them to NPR state.
2460 	 */
2461 
2462 	list_for_each_entry(ndlp, &phba->fc_nodes, nlp_listp) {
2463 		if (ndlp->nlp_state == NLP_STE_UNUSED_NODE ||
2464 		    lpfc_rscn_payload_check(phba, ndlp->nlp_DID) == 0)
2465 			continue;
2466 
2467 		lpfc_disc_state_machine(phba, ndlp, NULL,
2468 					NLP_EVT_DEVICE_RECOVERY);
2469 
2470 		/*
2471 		 * Make sure NLP_DELAY_TMO is NOT running after a device
2472 		 * recovery event.
2473 		 */
2474 		if (ndlp->nlp_flag & NLP_DELAY_TMO)
2475 			lpfc_cancel_retry_delay_tmo(phba, ndlp);
2476 	}
2477 
2478 	return 0;
2479 }
2480 
2481 static int
2482 lpfc_els_rcv_rscn(struct lpfc_hba * phba,
2483 		  struct lpfc_iocbq * cmdiocb,
2484 		  struct lpfc_nodelist * ndlp, uint8_t newnode)
2485 {
2486 	struct lpfc_dmabuf *pcmd;
2487 	uint32_t *lp;
2488 	IOCB_t *icmd;
2489 	uint32_t payload_len, cmd;
2490 	int i;
2491 
2492 	icmd = &cmdiocb->iocb;
2493 	pcmd = (struct lpfc_dmabuf *) cmdiocb->context2;
2494 	lp = (uint32_t *) pcmd->virt;
2495 
2496 	cmd = *lp++;
2497 	payload_len = be32_to_cpu(cmd) & 0xffff;	/* payload length */
2498 	payload_len -= sizeof (uint32_t);	/* take off word 0 */
2499 	cmd &= ELS_CMD_MASK;
2500 
2501 	/* RSCN received */
2502 	lpfc_printf_log(phba,
2503 			KERN_INFO,
2504 			LOG_DISCOVERY,
2505 			"%d:0214 RSCN received Data: x%x x%x x%x x%x\n",
2506 			phba->brd_no,
2507 			phba->fc_flag, payload_len, *lp, phba->fc_rscn_id_cnt);
2508 
2509 	for (i = 0; i < payload_len/sizeof(uint32_t); i++)
2510 		fc_host_post_event(phba->host, fc_get_event_number(),
2511 			FCH_EVT_RSCN, lp[i]);
2512 
2513 	/* If we are about to begin discovery, just ACC the RSCN.
2514 	 * Discovery processing will satisfy it.
2515 	 */
2516 	if (phba->hba_state <= LPFC_NS_QRY) {
2517 		lpfc_els_rsp_acc(phba, ELS_CMD_ACC, cmdiocb, ndlp, NULL,
2518 								newnode);
2519 		return 0;
2520 	}
2521 
2522 	/* If we are already processing an RSCN, save the received
2523 	 * RSCN payload buffer, cmdiocb->context2 to process later.
2524 	 */
2525 	if (phba->fc_flag & (FC_RSCN_MODE | FC_NDISC_ACTIVE)) {
2526 		if ((phba->fc_rscn_id_cnt < FC_MAX_HOLD_RSCN) &&
2527 		    !(phba->fc_flag & FC_RSCN_DISCOVERY)) {
2528 			spin_lock_irq(phba->host->host_lock);
2529 			phba->fc_flag |= FC_RSCN_MODE;
2530 			spin_unlock_irq(phba->host->host_lock);
2531 			phba->fc_rscn_id_list[phba->fc_rscn_id_cnt++] = pcmd;
2532 
2533 			/* If we zero, cmdiocb->context2, the calling
2534 			 * routine will not try to free it.
2535 			 */
2536 			cmdiocb->context2 = NULL;
2537 
2538 			/* Deferred RSCN */
2539 			lpfc_printf_log(phba, KERN_INFO, LOG_DISCOVERY,
2540 					"%d:0235 Deferred RSCN "
2541 					"Data: x%x x%x x%x\n",
2542 					phba->brd_no, phba->fc_rscn_id_cnt,
2543 					phba->fc_flag, phba->hba_state);
2544 		} else {
2545 			spin_lock_irq(phba->host->host_lock);
2546 			phba->fc_flag |= FC_RSCN_DISCOVERY;
2547 			spin_unlock_irq(phba->host->host_lock);
2548 			/* ReDiscovery RSCN */
2549 			lpfc_printf_log(phba, KERN_INFO, LOG_DISCOVERY,
2550 					"%d:0234 ReDiscovery RSCN "
2551 					"Data: x%x x%x x%x\n",
2552 					phba->brd_no, phba->fc_rscn_id_cnt,
2553 					phba->fc_flag, phba->hba_state);
2554 		}
2555 		/* Send back ACC */
2556 		lpfc_els_rsp_acc(phba, ELS_CMD_ACC, cmdiocb, ndlp, NULL,
2557 								newnode);
2558 
2559 		/* send RECOVERY event for ALL nodes that match RSCN payload */
2560 		lpfc_rscn_recovery_check(phba);
2561 		return 0;
2562 	}
2563 
2564 	phba->fc_flag |= FC_RSCN_MODE;
2565 	phba->fc_rscn_id_list[phba->fc_rscn_id_cnt++] = pcmd;
2566 	/*
2567 	 * If we zero, cmdiocb->context2, the calling routine will
2568 	 * not try to free it.
2569 	 */
2570 	cmdiocb->context2 = NULL;
2571 
2572 	lpfc_set_disctmo(phba);
2573 
2574 	/* Send back ACC */
2575 	lpfc_els_rsp_acc(phba, ELS_CMD_ACC, cmdiocb, ndlp, NULL, newnode);
2576 
2577 	/* send RECOVERY event for ALL nodes that match RSCN payload */
2578 	lpfc_rscn_recovery_check(phba);
2579 
2580 	return lpfc_els_handle_rscn(phba);
2581 }
2582 
2583 int
2584 lpfc_els_handle_rscn(struct lpfc_hba * phba)
2585 {
2586 	struct lpfc_nodelist *ndlp;
2587 
2588 	/* Start timer for RSCN processing */
2589 	lpfc_set_disctmo(phba);
2590 
2591 	/* RSCN processed */
2592 	lpfc_printf_log(phba,
2593 			KERN_INFO,
2594 			LOG_DISCOVERY,
2595 			"%d:0215 RSCN processed Data: x%x x%x x%x x%x\n",
2596 			phba->brd_no,
2597 			phba->fc_flag, 0, phba->fc_rscn_id_cnt,
2598 			phba->hba_state);
2599 
2600 	/* To process RSCN, first compare RSCN data with NameServer */
2601 	phba->fc_ns_retry = 0;
2602 	ndlp = lpfc_findnode_did(phba, NameServer_DID);
2603 	if (ndlp && ndlp->nlp_state == NLP_STE_UNMAPPED_NODE) {
2604 		/* Good ndlp, issue CT Request to NameServer */
2605 		if (lpfc_ns_cmd(phba, ndlp, SLI_CTNS_GID_FT) == 0) {
2606 			/* Wait for NameServer query cmpl before we can
2607 			   continue */
2608 			return 1;
2609 		}
2610 	} else {
2611 		/* If login to NameServer does not exist, issue one */
2612 		/* Good status, issue PLOGI to NameServer */
2613 		ndlp = lpfc_findnode_did(phba, NameServer_DID);
2614 		if (ndlp) {
2615 			/* Wait for NameServer login cmpl before we can
2616 			   continue */
2617 			return 1;
2618 		}
2619 		ndlp = mempool_alloc(phba->nlp_mem_pool, GFP_KERNEL);
2620 		if (!ndlp) {
2621 			lpfc_els_flush_rscn(phba);
2622 			return 0;
2623 		} else {
2624 			lpfc_nlp_init(phba, ndlp, NameServer_DID);
2625 			ndlp->nlp_type |= NLP_FABRIC;
2626 			ndlp->nlp_prev_state = ndlp->nlp_state;
2627 			lpfc_nlp_set_state(phba, ndlp, NLP_STE_PLOGI_ISSUE);
2628 			lpfc_issue_els_plogi(phba, NameServer_DID, 0);
2629 			/* Wait for NameServer login cmpl before we can
2630 			   continue */
2631 			return 1;
2632 		}
2633 	}
2634 
2635 	lpfc_els_flush_rscn(phba);
2636 	return 0;
2637 }
2638 
2639 static int
2640 lpfc_els_rcv_flogi(struct lpfc_hba * phba,
2641 		   struct lpfc_iocbq * cmdiocb,
2642 		   struct lpfc_nodelist * ndlp, uint8_t newnode)
2643 {
2644 	struct lpfc_dmabuf *pcmd = (struct lpfc_dmabuf *) cmdiocb->context2;
2645 	uint32_t *lp = (uint32_t *) pcmd->virt;
2646 	IOCB_t *icmd = &cmdiocb->iocb;
2647 	struct serv_parm *sp;
2648 	LPFC_MBOXQ_t *mbox;
2649 	struct ls_rjt stat;
2650 	uint32_t cmd, did;
2651 	int rc;
2652 
2653 	cmd = *lp++;
2654 	sp = (struct serv_parm *) lp;
2655 
2656 	/* FLOGI received */
2657 
2658 	lpfc_set_disctmo(phba);
2659 
2660 	if (phba->fc_topology == TOPOLOGY_LOOP) {
2661 		/* We should never receive a FLOGI in loop mode, ignore it */
2662 		did = icmd->un.elsreq64.remoteID;
2663 
2664 		/* An FLOGI ELS command <elsCmd> was received from DID <did> in
2665 		   Loop Mode */
2666 		lpfc_printf_log(phba, KERN_ERR, LOG_ELS,
2667 				"%d:0113 An FLOGI ELS command x%x was received "
2668 				"from DID x%x in Loop Mode\n",
2669 				phba->brd_no, cmd, did);
2670 		return 1;
2671 	}
2672 
2673 	did = Fabric_DID;
2674 
2675 	if ((lpfc_check_sparm(phba, ndlp, sp, CLASS3))) {
2676 		/* For a FLOGI we accept, then if our portname is greater
2677 		 * then the remote portname we initiate Nport login.
2678 		 */
2679 
2680 		rc = memcmp(&phba->fc_portname, &sp->portName,
2681 			    sizeof (struct lpfc_name));
2682 
2683 		if (!rc) {
2684 			if ((mbox = mempool_alloc(phba->mbox_mem_pool,
2685 						  GFP_KERNEL)) == 0) {
2686 				return 1;
2687 			}
2688 			lpfc_linkdown(phba);
2689 			lpfc_init_link(phba, mbox,
2690 				       phba->cfg_topology,
2691 				       phba->cfg_link_speed);
2692 			mbox->mb.un.varInitLnk.lipsr_AL_PA = 0;
2693 			mbox->mbox_cmpl = lpfc_sli_def_mbox_cmpl;
2694 			rc = lpfc_sli_issue_mbox
2695 				(phba, mbox, (MBX_NOWAIT | MBX_STOP_IOCB));
2696 			lpfc_set_loopback_flag(phba);
2697 			if (rc == MBX_NOT_FINISHED) {
2698 				mempool_free(mbox, phba->mbox_mem_pool);
2699 			}
2700 			return 1;
2701 		} else if (rc > 0) {	/* greater than */
2702 			spin_lock_irq(phba->host->host_lock);
2703 			phba->fc_flag |= FC_PT2PT_PLOGI;
2704 			spin_unlock_irq(phba->host->host_lock);
2705 		}
2706 		phba->fc_flag |= FC_PT2PT;
2707 		phba->fc_flag &= ~(FC_FABRIC | FC_PUBLIC_LOOP);
2708 	} else {
2709 		/* Reject this request because invalid parameters */
2710 		stat.un.b.lsRjtRsvd0 = 0;
2711 		stat.un.b.lsRjtRsnCode = LSRJT_UNABLE_TPC;
2712 		stat.un.b.lsRjtRsnCodeExp = LSEXP_SPARM_OPTIONS;
2713 		stat.un.b.vendorUnique = 0;
2714 		lpfc_els_rsp_reject(phba, stat.un.lsRjtError, cmdiocb, ndlp);
2715 		return 1;
2716 	}
2717 
2718 	/* Send back ACC */
2719 	lpfc_els_rsp_acc(phba, ELS_CMD_PLOGI, cmdiocb, ndlp, NULL, newnode);
2720 
2721 	return 0;
2722 }
2723 
2724 static int
2725 lpfc_els_rcv_rnid(struct lpfc_hba * phba,
2726 		  struct lpfc_iocbq * cmdiocb, struct lpfc_nodelist * ndlp)
2727 {
2728 	struct lpfc_dmabuf *pcmd;
2729 	uint32_t *lp;
2730 	IOCB_t *icmd;
2731 	RNID *rn;
2732 	struct ls_rjt stat;
2733 	uint32_t cmd, did;
2734 
2735 	icmd = &cmdiocb->iocb;
2736 	did = icmd->un.elsreq64.remoteID;
2737 	pcmd = (struct lpfc_dmabuf *) cmdiocb->context2;
2738 	lp = (uint32_t *) pcmd->virt;
2739 
2740 	cmd = *lp++;
2741 	rn = (RNID *) lp;
2742 
2743 	/* RNID received */
2744 
2745 	switch (rn->Format) {
2746 	case 0:
2747 	case RNID_TOPOLOGY_DISC:
2748 		/* Send back ACC */
2749 		lpfc_els_rsp_rnid_acc(phba, rn->Format, cmdiocb, ndlp);
2750 		break;
2751 	default:
2752 		/* Reject this request because format not supported */
2753 		stat.un.b.lsRjtRsvd0 = 0;
2754 		stat.un.b.lsRjtRsnCode = LSRJT_UNABLE_TPC;
2755 		stat.un.b.lsRjtRsnCodeExp = LSEXP_CANT_GIVE_DATA;
2756 		stat.un.b.vendorUnique = 0;
2757 		lpfc_els_rsp_reject(phba, stat.un.lsRjtError, cmdiocb, ndlp);
2758 	}
2759 	return 0;
2760 }
2761 
2762 static int
2763 lpfc_els_rcv_lirr(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
2764 		 struct lpfc_nodelist *ndlp)
2765 {
2766 	struct ls_rjt stat;
2767 
2768 	/* For now, unconditionally reject this command */
2769 	stat.un.b.lsRjtRsvd0 = 0;
2770 	stat.un.b.lsRjtRsnCode = LSRJT_UNABLE_TPC;
2771 	stat.un.b.lsRjtRsnCodeExp = LSEXP_CANT_GIVE_DATA;
2772 	stat.un.b.vendorUnique = 0;
2773 	lpfc_els_rsp_reject(phba, stat.un.lsRjtError, cmdiocb, ndlp);
2774 	return 0;
2775 }
2776 
2777 static void
2778 lpfc_els_rsp_rps_acc(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmb)
2779 {
2780 	struct lpfc_sli *psli;
2781 	struct lpfc_sli_ring *pring;
2782 	MAILBOX_t *mb;
2783 	IOCB_t *icmd;
2784 	RPS_RSP *rps_rsp;
2785 	uint8_t *pcmd;
2786 	struct lpfc_iocbq *elsiocb;
2787 	struct lpfc_nodelist *ndlp;
2788 	uint16_t xri, status;
2789 	uint32_t cmdsize;
2790 
2791 	psli = &phba->sli;
2792 	pring = &psli->ring[LPFC_ELS_RING];
2793 	mb = &pmb->mb;
2794 
2795 	ndlp = (struct lpfc_nodelist *) pmb->context2;
2796 	xri = (uint16_t) ((unsigned long)(pmb->context1));
2797 	pmb->context1 = NULL;
2798 	pmb->context2 = NULL;
2799 
2800 	if (mb->mbxStatus) {
2801 		mempool_free(pmb, phba->mbox_mem_pool);
2802 		return;
2803 	}
2804 
2805 	cmdsize = sizeof(RPS_RSP) + sizeof(uint32_t);
2806 	mempool_free(pmb, phba->mbox_mem_pool);
2807 	elsiocb = lpfc_prep_els_iocb(phba, 0, cmdsize, lpfc_max_els_tries, ndlp,
2808 						ndlp->nlp_DID, ELS_CMD_ACC);
2809 	lpfc_nlp_put(ndlp);
2810 	if (!elsiocb)
2811 		return;
2812 
2813 	icmd = &elsiocb->iocb;
2814 	icmd->ulpContext = xri;
2815 
2816 	pcmd = (uint8_t *) (((struct lpfc_dmabuf *) elsiocb->context2)->virt);
2817 	*((uint32_t *) (pcmd)) = ELS_CMD_ACC;
2818 	pcmd += sizeof (uint32_t); /* Skip past command */
2819 	rps_rsp = (RPS_RSP *)pcmd;
2820 
2821 	if (phba->fc_topology != TOPOLOGY_LOOP)
2822 		status = 0x10;
2823 	else
2824 		status = 0x8;
2825 	if (phba->fc_flag & FC_FABRIC)
2826 		status |= 0x4;
2827 
2828 	rps_rsp->rsvd1 = 0;
2829 	rps_rsp->portStatus = be16_to_cpu(status);
2830 	rps_rsp->linkFailureCnt = be32_to_cpu(mb->un.varRdLnk.linkFailureCnt);
2831 	rps_rsp->lossSyncCnt = be32_to_cpu(mb->un.varRdLnk.lossSyncCnt);
2832 	rps_rsp->lossSignalCnt = be32_to_cpu(mb->un.varRdLnk.lossSignalCnt);
2833 	rps_rsp->primSeqErrCnt = be32_to_cpu(mb->un.varRdLnk.primSeqErrCnt);
2834 	rps_rsp->invalidXmitWord = be32_to_cpu(mb->un.varRdLnk.invalidXmitWord);
2835 	rps_rsp->crcCnt = be32_to_cpu(mb->un.varRdLnk.crcCnt);
2836 
2837 	/* Xmit ELS RPS ACC response tag <ulpIoTag> */
2838 	lpfc_printf_log(phba, KERN_INFO, LOG_ELS,
2839 			"%d:0118 Xmit ELS RPS ACC response tag x%x xri x%x, "
2840 			"did x%x, nlp_flag x%x, nlp_state x%x, rpi x%x\n",
2841 			phba->brd_no, elsiocb->iotag,
2842 			elsiocb->iocb.ulpContext, ndlp->nlp_DID,
2843 			ndlp->nlp_flag, ndlp->nlp_state, ndlp->nlp_rpi);
2844 
2845 	elsiocb->iocb_cmpl = lpfc_cmpl_els_acc;
2846 	phba->fc_stat.elsXmitACC++;
2847 
2848 	if (lpfc_sli_issue_iocb(phba, pring, elsiocb, 0) == IOCB_ERROR) {
2849 		lpfc_els_free_iocb(phba, elsiocb);
2850 	}
2851 	return;
2852 }
2853 
2854 static int
2855 lpfc_els_rcv_rps(struct lpfc_hba * phba, struct lpfc_iocbq * cmdiocb,
2856 		 struct lpfc_nodelist * ndlp)
2857 {
2858 	uint32_t *lp;
2859 	uint8_t flag;
2860 	LPFC_MBOXQ_t *mbox;
2861 	struct lpfc_dmabuf *pcmd;
2862 	RPS *rps;
2863 	struct ls_rjt stat;
2864 
2865 	if ((ndlp->nlp_state != NLP_STE_UNMAPPED_NODE) &&
2866 	    (ndlp->nlp_state != NLP_STE_MAPPED_NODE)) {
2867 		stat.un.b.lsRjtRsvd0 = 0;
2868 		stat.un.b.lsRjtRsnCode = LSRJT_UNABLE_TPC;
2869 		stat.un.b.lsRjtRsnCodeExp = LSEXP_CANT_GIVE_DATA;
2870 		stat.un.b.vendorUnique = 0;
2871 		lpfc_els_rsp_reject(phba, stat.un.lsRjtError, cmdiocb, ndlp);
2872 	}
2873 
2874 	pcmd = (struct lpfc_dmabuf *) cmdiocb->context2;
2875 	lp = (uint32_t *) pcmd->virt;
2876 	flag = (be32_to_cpu(*lp++) & 0xf);
2877 	rps = (RPS *) lp;
2878 
2879 	if ((flag == 0) ||
2880 	    ((flag == 1) && (be32_to_cpu(rps->un.portNum) == 0)) ||
2881 	    ((flag == 2) && (memcmp(&rps->un.portName, &phba->fc_portname,
2882 			   sizeof (struct lpfc_name)) == 0))) {
2883 		if ((mbox = mempool_alloc(phba->mbox_mem_pool, GFP_ATOMIC))) {
2884 			lpfc_read_lnk_stat(phba, mbox);
2885 			mbox->context1 =
2886 			    (void *)((unsigned long)cmdiocb->iocb.ulpContext);
2887 			mbox->context2 = lpfc_nlp_get(ndlp);
2888 			mbox->mbox_cmpl = lpfc_els_rsp_rps_acc;
2889 			if (lpfc_sli_issue_mbox (phba, mbox,
2890 			    (MBX_NOWAIT | MBX_STOP_IOCB)) != MBX_NOT_FINISHED) {
2891 				/* Mbox completion will send ELS Response */
2892 				return 0;
2893 			}
2894 			lpfc_nlp_put(ndlp);
2895 			mempool_free(mbox, phba->mbox_mem_pool);
2896 		}
2897 	}
2898 	stat.un.b.lsRjtRsvd0 = 0;
2899 	stat.un.b.lsRjtRsnCode = LSRJT_UNABLE_TPC;
2900 	stat.un.b.lsRjtRsnCodeExp = LSEXP_CANT_GIVE_DATA;
2901 	stat.un.b.vendorUnique = 0;
2902 	lpfc_els_rsp_reject(phba, stat.un.lsRjtError, cmdiocb, ndlp);
2903 	return 0;
2904 }
2905 
2906 static int
2907 lpfc_els_rsp_rpl_acc(struct lpfc_hba * phba, uint16_t cmdsize,
2908 		 struct lpfc_iocbq * oldiocb, struct lpfc_nodelist * ndlp)
2909 {
2910 	IOCB_t *icmd;
2911 	IOCB_t *oldcmd;
2912 	RPL_RSP rpl_rsp;
2913 	struct lpfc_iocbq *elsiocb;
2914 	struct lpfc_sli_ring *pring;
2915 	struct lpfc_sli *psli;
2916 	uint8_t *pcmd;
2917 
2918 	psli = &phba->sli;
2919 	pring = &psli->ring[LPFC_ELS_RING];	/* ELS ring */
2920 
2921 	elsiocb = lpfc_prep_els_iocb(phba, 0, cmdsize, oldiocb->retry,
2922 					ndlp, ndlp->nlp_DID, ELS_CMD_ACC);
2923 	if (!elsiocb)
2924 		return 1;
2925 
2926 	icmd = &elsiocb->iocb;
2927 	oldcmd = &oldiocb->iocb;
2928 	icmd->ulpContext = oldcmd->ulpContext;	/* Xri */
2929 
2930 	pcmd = (((struct lpfc_dmabuf *) elsiocb->context2)->virt);
2931 	*((uint32_t *) (pcmd)) = ELS_CMD_ACC;
2932 	pcmd += sizeof (uint16_t);
2933 	*((uint16_t *)(pcmd)) = be16_to_cpu(cmdsize);
2934 	pcmd += sizeof(uint16_t);
2935 
2936 	/* Setup the RPL ACC payload */
2937 	rpl_rsp.listLen = be32_to_cpu(1);
2938 	rpl_rsp.index = 0;
2939 	rpl_rsp.port_num_blk.portNum = 0;
2940 	rpl_rsp.port_num_blk.portID = be32_to_cpu(phba->fc_myDID);
2941 	memcpy(&rpl_rsp.port_num_blk.portName, &phba->fc_portname,
2942 	    sizeof(struct lpfc_name));
2943 
2944 	memcpy(pcmd, &rpl_rsp, cmdsize - sizeof(uint32_t));
2945 
2946 
2947 	/* Xmit ELS RPL ACC response tag <ulpIoTag> */
2948 	lpfc_printf_log(phba, KERN_INFO, LOG_ELS,
2949 			"%d:0120 Xmit ELS RPL ACC response tag x%x xri x%x, "
2950 			"did x%x, nlp_flag x%x, nlp_state x%x, rpi x%x\n",
2951 			phba->brd_no, elsiocb->iotag,
2952 			elsiocb->iocb.ulpContext, ndlp->nlp_DID,
2953 			ndlp->nlp_flag, ndlp->nlp_state, ndlp->nlp_rpi);
2954 
2955 	elsiocb->iocb_cmpl = lpfc_cmpl_els_acc;
2956 
2957 	phba->fc_stat.elsXmitACC++;
2958 	if (lpfc_sli_issue_iocb(phba, pring, elsiocb, 0) == IOCB_ERROR) {
2959 		lpfc_els_free_iocb(phba, elsiocb);
2960 		return 1;
2961 	}
2962 	return 0;
2963 }
2964 
2965 static int
2966 lpfc_els_rcv_rpl(struct lpfc_hba * phba, struct lpfc_iocbq * cmdiocb,
2967 		 struct lpfc_nodelist * ndlp)
2968 {
2969 	struct lpfc_dmabuf *pcmd;
2970 	uint32_t *lp;
2971 	uint32_t maxsize;
2972 	uint16_t cmdsize;
2973 	RPL *rpl;
2974 	struct ls_rjt stat;
2975 
2976 	if ((ndlp->nlp_state != NLP_STE_UNMAPPED_NODE) &&
2977 	    (ndlp->nlp_state != NLP_STE_MAPPED_NODE)) {
2978 		stat.un.b.lsRjtRsvd0 = 0;
2979 		stat.un.b.lsRjtRsnCode = LSRJT_UNABLE_TPC;
2980 		stat.un.b.lsRjtRsnCodeExp = LSEXP_CANT_GIVE_DATA;
2981 		stat.un.b.vendorUnique = 0;
2982 		lpfc_els_rsp_reject(phba, stat.un.lsRjtError, cmdiocb, ndlp);
2983 	}
2984 
2985 	pcmd = (struct lpfc_dmabuf *) cmdiocb->context2;
2986 	lp = (uint32_t *) pcmd->virt;
2987 	rpl = (RPL *) (lp + 1);
2988 
2989 	maxsize = be32_to_cpu(rpl->maxsize);
2990 
2991 	/* We support only one port */
2992 	if ((rpl->index == 0) &&
2993 	    ((maxsize == 0) ||
2994 	     ((maxsize * sizeof(uint32_t)) >= sizeof(RPL_RSP)))) {
2995 		cmdsize = sizeof(uint32_t) + sizeof(RPL_RSP);
2996 	} else {
2997 		cmdsize = sizeof(uint32_t) + maxsize * sizeof(uint32_t);
2998 	}
2999 	lpfc_els_rsp_rpl_acc(phba, cmdsize, cmdiocb, ndlp);
3000 
3001 	return 0;
3002 }
3003 
3004 static int
3005 lpfc_els_rcv_farp(struct lpfc_hba * phba,
3006 		  struct lpfc_iocbq * cmdiocb, struct lpfc_nodelist * ndlp)
3007 {
3008 	struct lpfc_dmabuf *pcmd;
3009 	uint32_t *lp;
3010 	IOCB_t *icmd;
3011 	FARP *fp;
3012 	uint32_t cmd, cnt, did;
3013 
3014 	icmd = &cmdiocb->iocb;
3015 	did = icmd->un.elsreq64.remoteID;
3016 	pcmd = (struct lpfc_dmabuf *) cmdiocb->context2;
3017 	lp = (uint32_t *) pcmd->virt;
3018 
3019 	cmd = *lp++;
3020 	fp = (FARP *) lp;
3021 
3022 	/* FARP-REQ received from DID <did> */
3023 	lpfc_printf_log(phba,
3024 			 KERN_INFO,
3025 			 LOG_ELS,
3026 			 "%d:0601 FARP-REQ received from DID x%x\n",
3027 			 phba->brd_no, did);
3028 
3029 	/* We will only support match on WWPN or WWNN */
3030 	if (fp->Mflags & ~(FARP_MATCH_NODE | FARP_MATCH_PORT)) {
3031 		return 0;
3032 	}
3033 
3034 	cnt = 0;
3035 	/* If this FARP command is searching for my portname */
3036 	if (fp->Mflags & FARP_MATCH_PORT) {
3037 		if (memcmp(&fp->RportName, &phba->fc_portname,
3038 			   sizeof (struct lpfc_name)) == 0)
3039 			cnt = 1;
3040 	}
3041 
3042 	/* If this FARP command is searching for my nodename */
3043 	if (fp->Mflags & FARP_MATCH_NODE) {
3044 		if (memcmp(&fp->RnodeName, &phba->fc_nodename,
3045 			   sizeof (struct lpfc_name)) == 0)
3046 			cnt = 1;
3047 	}
3048 
3049 	if (cnt) {
3050 		if ((ndlp->nlp_state == NLP_STE_UNMAPPED_NODE) ||
3051 		   (ndlp->nlp_state == NLP_STE_MAPPED_NODE)) {
3052 			/* Log back into the node before sending the FARP. */
3053 			if (fp->Rflags & FARP_REQUEST_PLOGI) {
3054 				ndlp->nlp_prev_state = ndlp->nlp_state;
3055 				lpfc_nlp_set_state(phba, ndlp,
3056 						   NLP_STE_PLOGI_ISSUE);
3057 				lpfc_issue_els_plogi(phba, ndlp->nlp_DID, 0);
3058 			}
3059 
3060 			/* Send a FARP response to that node */
3061 			if (fp->Rflags & FARP_REQUEST_FARPR) {
3062 				lpfc_issue_els_farpr(phba, did, 0);
3063 			}
3064 		}
3065 	}
3066 	return 0;
3067 }
3068 
3069 static int
3070 lpfc_els_rcv_farpr(struct lpfc_hba * phba,
3071 		   struct lpfc_iocbq * cmdiocb, struct lpfc_nodelist * ndlp)
3072 {
3073 	struct lpfc_dmabuf *pcmd;
3074 	uint32_t *lp;
3075 	IOCB_t *icmd;
3076 	uint32_t cmd, did;
3077 
3078 	icmd = &cmdiocb->iocb;
3079 	did = icmd->un.elsreq64.remoteID;
3080 	pcmd = (struct lpfc_dmabuf *) cmdiocb->context2;
3081 	lp = (uint32_t *) pcmd->virt;
3082 
3083 	cmd = *lp++;
3084 	/* FARP-RSP received from DID <did> */
3085 	lpfc_printf_log(phba,
3086 			 KERN_INFO,
3087 			 LOG_ELS,
3088 			 "%d:0600 FARP-RSP received from DID x%x\n",
3089 			 phba->brd_no, did);
3090 
3091 	/* ACCEPT the Farp resp request */
3092 	lpfc_els_rsp_acc(phba, ELS_CMD_ACC, cmdiocb, ndlp, NULL, 0);
3093 
3094 	return 0;
3095 }
3096 
3097 static int
3098 lpfc_els_rcv_fan(struct lpfc_hba * phba, struct lpfc_iocbq * cmdiocb,
3099 		 struct lpfc_nodelist * fan_ndlp)
3100 {
3101 	struct lpfc_dmabuf *pcmd;
3102 	uint32_t *lp;
3103 	IOCB_t *icmd;
3104 	uint32_t cmd, did;
3105 	FAN *fp;
3106 	struct lpfc_nodelist *ndlp, *next_ndlp;
3107 
3108 	/* FAN received */
3109 	lpfc_printf_log(phba, KERN_INFO, LOG_ELS, "%d:0265 FAN received\n",
3110 								phba->brd_no);
3111 
3112 	icmd = &cmdiocb->iocb;
3113 	did = icmd->un.elsreq64.remoteID;
3114 	pcmd = (struct lpfc_dmabuf *)cmdiocb->context2;
3115 	lp = (uint32_t *)pcmd->virt;
3116 
3117 	cmd = *lp++;
3118 	fp = (FAN *)lp;
3119 
3120 	/* FAN received; Fan does not have a reply sequence */
3121 
3122 	if (phba->hba_state == LPFC_LOCAL_CFG_LINK) {
3123 		if ((memcmp(&phba->fc_fabparam.nodeName, &fp->FnodeName,
3124 			sizeof(struct lpfc_name)) != 0) ||
3125 		    (memcmp(&phba->fc_fabparam.portName, &fp->FportName,
3126 			sizeof(struct lpfc_name)) != 0)) {
3127 			/*
3128 			 * This node has switched fabrics.  FLOGI is required
3129 			 * Clean up the old rpi's
3130 			 */
3131 
3132 			list_for_each_entry_safe(ndlp, next_ndlp,
3133 						 &phba->fc_nodes, nlp_listp) {
3134 				if (ndlp->nlp_state != NLP_STE_NPR_NODE)
3135 					continue;
3136 				if (ndlp->nlp_type & NLP_FABRIC) {
3137 					/*
3138 					 * Clean up old Fabric, Nameserver and
3139 					 * other NLP_FABRIC logins
3140 					 */
3141 					lpfc_drop_node(phba, ndlp);
3142 				} else if (!(ndlp->nlp_flag & NLP_NPR_ADISC)) {
3143 					/* Fail outstanding I/O now since this
3144 					 * device is marked for PLOGI
3145 					 */
3146 					lpfc_unreg_rpi(phba, ndlp);
3147 				}
3148 			}
3149 
3150 			phba->hba_state = LPFC_FLOGI;
3151 			lpfc_set_disctmo(phba);
3152 			lpfc_initial_flogi(phba);
3153 			return 0;
3154 		}
3155 		/* Discovery not needed,
3156 		 * move the nodes to their original state.
3157 		 */
3158 		list_for_each_entry_safe(ndlp, next_ndlp, &phba->fc_nodes,
3159 					 nlp_listp) {
3160 			if (ndlp->nlp_state != NLP_STE_NPR_NODE)
3161 				continue;
3162 
3163 			switch (ndlp->nlp_prev_state) {
3164 			case NLP_STE_UNMAPPED_NODE:
3165 				ndlp->nlp_prev_state = NLP_STE_NPR_NODE;
3166 				lpfc_nlp_set_state(phba, ndlp,
3167 						   NLP_STE_UNMAPPED_NODE);
3168 				break;
3169 
3170 			case NLP_STE_MAPPED_NODE:
3171 				ndlp->nlp_prev_state = NLP_STE_NPR_NODE;
3172 				lpfc_nlp_set_state(phba, ndlp,
3173 						   NLP_STE_MAPPED_NODE);
3174 				break;
3175 
3176 			default:
3177 				break;
3178 			}
3179 		}
3180 
3181 		/* Start discovery - this should just do CLEAR_LA */
3182 		lpfc_disc_start(phba);
3183 	}
3184 	return 0;
3185 }
3186 
3187 void
3188 lpfc_els_timeout(unsigned long ptr)
3189 {
3190 	struct lpfc_hba *phba;
3191 	unsigned long iflag;
3192 
3193 	phba = (struct lpfc_hba *)ptr;
3194 	if (phba == 0)
3195 		return;
3196 	spin_lock_irqsave(phba->host->host_lock, iflag);
3197 	if (!(phba->work_hba_events & WORKER_ELS_TMO)) {
3198 		phba->work_hba_events |= WORKER_ELS_TMO;
3199 		if (phba->work_wait)
3200 			wake_up(phba->work_wait);
3201 	}
3202 	spin_unlock_irqrestore(phba->host->host_lock, iflag);
3203 	return;
3204 }
3205 
3206 void
3207 lpfc_els_timeout_handler(struct lpfc_hba *phba)
3208 {
3209 	struct lpfc_sli_ring *pring;
3210 	struct lpfc_iocbq *tmp_iocb, *piocb;
3211 	IOCB_t *cmd = NULL;
3212 	struct lpfc_dmabuf *pcmd;
3213 	uint32_t *elscmd;
3214 	uint32_t els_command=0;
3215 	uint32_t timeout;
3216 	uint32_t remote_ID;
3217 
3218 	if (phba == 0)
3219 		return;
3220 	spin_lock_irq(phba->host->host_lock);
3221 	/* If the timer is already canceled do nothing */
3222 	if (!(phba->work_hba_events & WORKER_ELS_TMO)) {
3223 		spin_unlock_irq(phba->host->host_lock);
3224 		return;
3225 	}
3226 	timeout = (uint32_t)(phba->fc_ratov << 1);
3227 
3228 	pring = &phba->sli.ring[LPFC_ELS_RING];
3229 
3230 	list_for_each_entry_safe(piocb, tmp_iocb, &pring->txcmplq, list) {
3231 		cmd = &piocb->iocb;
3232 
3233 		if ((piocb->iocb_flag & LPFC_IO_LIBDFC) ||
3234 			(piocb->iocb.ulpCommand == CMD_ABORT_XRI_CN) ||
3235 			(piocb->iocb.ulpCommand == CMD_CLOSE_XRI_CN)) {
3236 			continue;
3237 		}
3238 		pcmd = (struct lpfc_dmabuf *) piocb->context2;
3239 		if (pcmd) {
3240 			elscmd = (uint32_t *) (pcmd->virt);
3241 			els_command = *elscmd;
3242 		}
3243 
3244 		if ((els_command == ELS_CMD_FARP)
3245 		    || (els_command == ELS_CMD_FARPR)) {
3246 			continue;
3247 		}
3248 
3249 		if (piocb->drvrTimeout > 0) {
3250 			if (piocb->drvrTimeout >= timeout) {
3251 				piocb->drvrTimeout -= timeout;
3252 			} else {
3253 				piocb->drvrTimeout = 0;
3254 			}
3255 			continue;
3256 		}
3257 
3258 		if (cmd->ulpCommand == CMD_GEN_REQUEST64_CR) {
3259 			struct lpfc_nodelist *ndlp;
3260 			ndlp = __lpfc_findnode_rpi(phba, cmd->ulpContext);
3261 			remote_ID = ndlp->nlp_DID;
3262 		} else {
3263 			remote_ID = cmd->un.elsreq64.remoteID;
3264 		}
3265 
3266 		lpfc_printf_log(phba,
3267 				KERN_ERR,
3268 				LOG_ELS,
3269 				"%d:0127 ELS timeout Data: x%x x%x x%x x%x\n",
3270 				phba->brd_no, els_command,
3271 				remote_ID, cmd->ulpCommand, cmd->ulpIoTag);
3272 
3273 		lpfc_sli_issue_abort_iotag(phba, pring, piocb);
3274 	}
3275 	if (phba->sli.ring[LPFC_ELS_RING].txcmplq_cnt)
3276 		mod_timer(&phba->els_tmofunc, jiffies + HZ * timeout);
3277 
3278 	spin_unlock_irq(phba->host->host_lock);
3279 }
3280 
3281 void
3282 lpfc_els_flush_cmd(struct lpfc_hba *phba)
3283 {
3284 	LIST_HEAD(completions);
3285 	struct lpfc_sli_ring *pring = &phba->sli.ring[LPFC_ELS_RING];
3286 	struct lpfc_iocbq *tmp_iocb, *piocb;
3287 	IOCB_t *cmd = NULL;
3288 
3289 	spin_lock_irq(phba->host->host_lock);
3290 	list_for_each_entry_safe(piocb, tmp_iocb, &pring->txq, list) {
3291 		cmd = &piocb->iocb;
3292 
3293 		if (piocb->iocb_flag & LPFC_IO_LIBDFC) {
3294 			continue;
3295 		}
3296 
3297 		/* Do not flush out the QUE_RING and ABORT/CLOSE iocbs */
3298 		if (cmd->ulpCommand == CMD_QUE_RING_BUF_CN ||
3299 		    cmd->ulpCommand == CMD_QUE_RING_BUF64_CN ||
3300 		    cmd->ulpCommand == CMD_CLOSE_XRI_CN ||
3301 		    cmd->ulpCommand == CMD_ABORT_XRI_CN)
3302 			continue;
3303 
3304 		list_move_tail(&piocb->list, &completions);
3305 		pring->txq_cnt--;
3306 
3307 	}
3308 
3309 	list_for_each_entry_safe(piocb, tmp_iocb, &pring->txcmplq, list) {
3310 		cmd = &piocb->iocb;
3311 
3312 		if (piocb->iocb_flag & LPFC_IO_LIBDFC) {
3313 			continue;
3314 		}
3315 
3316 		lpfc_sli_issue_abort_iotag(phba, pring, piocb);
3317 	}
3318 	spin_unlock_irq(phba->host->host_lock);
3319 
3320 	while(!list_empty(&completions)) {
3321 		piocb = list_get_first(&completions, struct lpfc_iocbq, list);
3322 		cmd = &piocb->iocb;
3323 		list_del(&piocb->list);
3324 
3325 		if (piocb->iocb_cmpl) {
3326 			cmd->ulpStatus = IOSTAT_LOCAL_REJECT;
3327 			cmd->un.ulpWord[4] = IOERR_SLI_ABORTED;
3328 			(piocb->iocb_cmpl) (phba, piocb, piocb);
3329 		} else
3330 			lpfc_sli_release_iocbq(phba, piocb);
3331 	}
3332 
3333 	return;
3334 }
3335 
3336 void
3337 lpfc_els_unsol_event(struct lpfc_hba * phba,
3338 		     struct lpfc_sli_ring * pring, struct lpfc_iocbq * elsiocb)
3339 {
3340 	struct lpfc_sli *psli;
3341 	struct lpfc_nodelist *ndlp;
3342 	struct lpfc_dmabuf *mp;
3343 	uint32_t *lp;
3344 	IOCB_t *icmd;
3345 	struct ls_rjt stat;
3346 	uint32_t cmd;
3347 	uint32_t did;
3348 	uint32_t newnode;
3349 	uint32_t drop_cmd = 0;	/* by default do NOT drop received cmd */
3350 	uint32_t rjt_err = 0;
3351 
3352 	psli = &phba->sli;
3353 	icmd = &elsiocb->iocb;
3354 
3355 	if ((icmd->ulpStatus == IOSTAT_LOCAL_REJECT) &&
3356 		((icmd->un.ulpWord[4] & 0xff) == IOERR_RCV_BUFFER_WAITING)) {
3357 		/* Not enough posted buffers; Try posting more buffers */
3358 		phba->fc_stat.NoRcvBuf++;
3359 		lpfc_post_buffer(phba, pring, 0, 1);
3360 		return;
3361 	}
3362 
3363 	/* If there are no BDEs associated with this IOCB,
3364 	 * there is nothing to do.
3365 	 */
3366 	if (icmd->ulpBdeCount == 0)
3367 		return;
3368 
3369 	/* type of ELS cmd is first 32bit word in packet */
3370 	mp = lpfc_sli_ringpostbuf_get(phba, pring, getPaddr(icmd->un.
3371 							    cont64[0].
3372 							    addrHigh,
3373 							    icmd->un.
3374 							    cont64[0].addrLow));
3375 	if (mp == 0) {
3376 		drop_cmd = 1;
3377 		goto dropit;
3378 	}
3379 
3380 	newnode = 0;
3381 	lp = (uint32_t *) mp->virt;
3382 	cmd = *lp++;
3383 	lpfc_post_buffer(phba, &psli->ring[LPFC_ELS_RING], 1, 1);
3384 
3385 	if (icmd->ulpStatus) {
3386 		lpfc_mbuf_free(phba, mp->virt, mp->phys);
3387 		kfree(mp);
3388 		drop_cmd = 1;
3389 		goto dropit;
3390 	}
3391 
3392 	/* Check to see if link went down during discovery */
3393 	if (lpfc_els_chk_latt(phba)) {
3394 		lpfc_mbuf_free(phba, mp->virt, mp->phys);
3395 		kfree(mp);
3396 		drop_cmd = 1;
3397 		goto dropit;
3398 	}
3399 
3400 	did = icmd->un.rcvels.remoteID;
3401 	ndlp = lpfc_findnode_did(phba, did);
3402 	if (!ndlp) {
3403 		/* Cannot find existing Fabric ndlp, so allocate a new one */
3404 		ndlp = mempool_alloc(phba->nlp_mem_pool, GFP_KERNEL);
3405 		if (!ndlp) {
3406 			lpfc_mbuf_free(phba, mp->virt, mp->phys);
3407 			kfree(mp);
3408 			drop_cmd = 1;
3409 			goto dropit;
3410 		}
3411 
3412 		lpfc_nlp_init(phba, ndlp, did);
3413 		newnode = 1;
3414 		if ((did & Fabric_DID_MASK) == Fabric_DID_MASK) {
3415 			ndlp->nlp_type |= NLP_FABRIC;
3416 		}
3417 		lpfc_nlp_set_state(phba, ndlp, NLP_STE_UNUSED_NODE);
3418 	}
3419 
3420 	phba->fc_stat.elsRcvFrame++;
3421 	if (elsiocb->context1)
3422 		lpfc_nlp_put(elsiocb->context1);
3423 	elsiocb->context1 = lpfc_nlp_get(ndlp);
3424 	elsiocb->context2 = mp;
3425 
3426 	if ((cmd & ELS_CMD_MASK) == ELS_CMD_RSCN) {
3427 		cmd &= ELS_CMD_MASK;
3428 	}
3429 	/* ELS command <elsCmd> received from NPORT <did> */
3430 	lpfc_printf_log(phba, KERN_INFO, LOG_ELS,
3431 			"%d:0112 ELS command x%x received from NPORT x%x "
3432 			"Data: x%x\n", phba->brd_no, cmd, did, phba->hba_state);
3433 
3434 	switch (cmd) {
3435 	case ELS_CMD_PLOGI:
3436 		phba->fc_stat.elsRcvPLOGI++;
3437 		if (phba->hba_state < LPFC_DISC_AUTH) {
3438 			rjt_err = 1;
3439 			break;
3440 		}
3441 		ndlp = lpfc_plogi_confirm_nport(phba, mp, ndlp);
3442 		lpfc_disc_state_machine(phba, ndlp, elsiocb, NLP_EVT_RCV_PLOGI);
3443 		break;
3444 	case ELS_CMD_FLOGI:
3445 		phba->fc_stat.elsRcvFLOGI++;
3446 		lpfc_els_rcv_flogi(phba, elsiocb, ndlp, newnode);
3447 		if (newnode)
3448 			lpfc_drop_node(phba, ndlp);
3449 		break;
3450 	case ELS_CMD_LOGO:
3451 		phba->fc_stat.elsRcvLOGO++;
3452 		if (phba->hba_state < LPFC_DISC_AUTH) {
3453 			rjt_err = 1;
3454 			break;
3455 		}
3456 		lpfc_disc_state_machine(phba, ndlp, elsiocb, NLP_EVT_RCV_LOGO);
3457 		break;
3458 	case ELS_CMD_PRLO:
3459 		phba->fc_stat.elsRcvPRLO++;
3460 		if (phba->hba_state < LPFC_DISC_AUTH) {
3461 			rjt_err = 1;
3462 			break;
3463 		}
3464 		lpfc_disc_state_machine(phba, ndlp, elsiocb, NLP_EVT_RCV_PRLO);
3465 		break;
3466 	case ELS_CMD_RSCN:
3467 		phba->fc_stat.elsRcvRSCN++;
3468 		lpfc_els_rcv_rscn(phba, elsiocb, ndlp, newnode);
3469 		if (newnode)
3470 			lpfc_drop_node(phba, ndlp);
3471 		break;
3472 	case ELS_CMD_ADISC:
3473 		phba->fc_stat.elsRcvADISC++;
3474 		if (phba->hba_state < LPFC_DISC_AUTH) {
3475 			rjt_err = 1;
3476 			break;
3477 		}
3478 		lpfc_disc_state_machine(phba, ndlp, elsiocb, NLP_EVT_RCV_ADISC);
3479 		break;
3480 	case ELS_CMD_PDISC:
3481 		phba->fc_stat.elsRcvPDISC++;
3482 		if (phba->hba_state < LPFC_DISC_AUTH) {
3483 			rjt_err = 1;
3484 			break;
3485 		}
3486 		lpfc_disc_state_machine(phba, ndlp, elsiocb, NLP_EVT_RCV_PDISC);
3487 		break;
3488 	case ELS_CMD_FARPR:
3489 		phba->fc_stat.elsRcvFARPR++;
3490 		lpfc_els_rcv_farpr(phba, elsiocb, ndlp);
3491 		break;
3492 	case ELS_CMD_FARP:
3493 		phba->fc_stat.elsRcvFARP++;
3494 		lpfc_els_rcv_farp(phba, elsiocb, ndlp);
3495 		break;
3496 	case ELS_CMD_FAN:
3497 		phba->fc_stat.elsRcvFAN++;
3498 		lpfc_els_rcv_fan(phba, elsiocb, ndlp);
3499 		break;
3500 	case ELS_CMD_PRLI:
3501 		phba->fc_stat.elsRcvPRLI++;
3502 		if (phba->hba_state < LPFC_DISC_AUTH) {
3503 			rjt_err = 1;
3504 			break;
3505 		}
3506 		lpfc_disc_state_machine(phba, ndlp, elsiocb, NLP_EVT_RCV_PRLI);
3507 		break;
3508 	case ELS_CMD_LIRR:
3509 		phba->fc_stat.elsRcvLIRR++;
3510 		lpfc_els_rcv_lirr(phba, elsiocb, ndlp);
3511 		if (newnode)
3512 			lpfc_drop_node(phba, ndlp);
3513 		break;
3514 	case ELS_CMD_RPS:
3515 		phba->fc_stat.elsRcvRPS++;
3516 		lpfc_els_rcv_rps(phba, elsiocb, ndlp);
3517 		if (newnode)
3518 			lpfc_drop_node(phba, ndlp);
3519 		break;
3520 	case ELS_CMD_RPL:
3521 		phba->fc_stat.elsRcvRPL++;
3522 		lpfc_els_rcv_rpl(phba, elsiocb, ndlp);
3523 		if (newnode)
3524 			lpfc_drop_node(phba, ndlp);
3525 		break;
3526 	case ELS_CMD_RNID:
3527 		phba->fc_stat.elsRcvRNID++;
3528 		lpfc_els_rcv_rnid(phba, elsiocb, ndlp);
3529 		if (newnode)
3530 			lpfc_drop_node(phba, ndlp);
3531 		break;
3532 	default:
3533 		/* Unsupported ELS command, reject */
3534 		rjt_err = 1;
3535 
3536 		/* Unknown ELS command <elsCmd> received from NPORT <did> */
3537 		lpfc_printf_log(phba, KERN_ERR, LOG_ELS,
3538 				"%d:0115 Unknown ELS command x%x received from "
3539 				"NPORT x%x\n", phba->brd_no, cmd, did);
3540 		if (newnode)
3541 			lpfc_drop_node(phba, ndlp);
3542 		break;
3543 	}
3544 
3545 	/* check if need to LS_RJT received ELS cmd */
3546 	if (rjt_err) {
3547 		stat.un.b.lsRjtRsvd0 = 0;
3548 		stat.un.b.lsRjtRsnCode = LSRJT_UNABLE_TPC;
3549 		stat.un.b.lsRjtRsnCodeExp = LSEXP_NOTHING_MORE;
3550 		stat.un.b.vendorUnique = 0;
3551 		lpfc_els_rsp_reject(phba, stat.un.lsRjtError, elsiocb, ndlp);
3552 	}
3553 
3554 	lpfc_nlp_put(elsiocb->context1);
3555 	elsiocb->context1 = NULL;
3556 	if (elsiocb->context2) {
3557 		lpfc_mbuf_free(phba, mp->virt, mp->phys);
3558 		kfree(mp);
3559 	}
3560 dropit:
3561 	/* check if need to drop received ELS cmd */
3562 	if (drop_cmd == 1) {
3563 		lpfc_printf_log(phba, KERN_ERR, LOG_ELS,
3564 				"%d:0111 Dropping received ELS cmd "
3565 				"Data: x%x x%x x%x\n", phba->brd_no,
3566 				icmd->ulpStatus, icmd->un.ulpWord[4],
3567 				icmd->ulpTimeout);
3568 		phba->fc_stat.elsRcvDrop++;
3569 	}
3570 	return;
3571 }
3572