xref: /openbmc/linux/drivers/scsi/lpfc/lpfc_ct.c (revision 95db3b25)
1 /*******************************************************************
2  * This file is part of the Emulex Linux Device Driver for         *
3  * Fibre Channel Host Bus Adapters.                                *
4  * Copyright (C) 2004-2016 Emulex.  All rights reserved.           *
5  * EMULEX and SLI are trademarks of Emulex.                        *
6  * www.emulex.com                                                  *
7  *                                                                 *
8  * This program is free software; you can redistribute it and/or   *
9  * modify it under the terms of version 2 of the GNU General       *
10  * Public License as published by the Free Software Foundation.    *
11  * This program is distributed in the hope that it will be useful. *
12  * ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND          *
13  * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,  *
14  * FITNESS FOR A PARTICULAR PURPOSE, OR NON-INFRINGEMENT, ARE      *
15  * DISCLAIMED, EXCEPT TO THE EXTENT THAT SUCH DISCLAIMERS ARE HELD *
16  * TO BE LEGALLY INVALID.  See the GNU General Public License for  *
17  * more details, a copy of which can be found in the file COPYING  *
18  * included with this package.                                     *
19  *******************************************************************/
20 
21 /*
22  * Fibre Channel SCSI LAN Device Driver CT support: FC Generic Services FC-GS
23  */
24 
25 #include <linux/blkdev.h>
26 #include <linux/pci.h>
27 #include <linux/interrupt.h>
28 #include <linux/slab.h>
29 #include <linux/utsname.h>
30 
31 #include <scsi/scsi.h>
32 #include <scsi/scsi_device.h>
33 #include <scsi/scsi_host.h>
34 #include <scsi/scsi_transport_fc.h>
35 #include <scsi/fc/fc_fs.h>
36 
37 #include "lpfc_hw4.h"
38 #include "lpfc_hw.h"
39 #include "lpfc_sli.h"
40 #include "lpfc_sli4.h"
41 #include "lpfc_nl.h"
42 #include "lpfc_disc.h"
43 #include "lpfc_scsi.h"
44 #include "lpfc.h"
45 #include "lpfc_logmsg.h"
46 #include "lpfc_crtn.h"
47 #include "lpfc_version.h"
48 #include "lpfc_vport.h"
49 #include "lpfc_debugfs.h"
50 
51 /* FDMI Port Speed definitions - FC-GS-7 */
52 #define HBA_PORTSPEED_1GFC		0x00000001	/* 1G FC */
53 #define HBA_PORTSPEED_2GFC		0x00000002	/* 2G FC */
54 #define HBA_PORTSPEED_4GFC		0x00000008	/* 4G FC */
55 #define HBA_PORTSPEED_10GFC		0x00000004	/* 10G FC */
56 #define HBA_PORTSPEED_8GFC		0x00000010	/* 8G FC */
57 #define HBA_PORTSPEED_16GFC		0x00000020	/* 16G FC */
58 #define HBA_PORTSPEED_32GFC		0x00000040	/* 32G FC */
59 #define HBA_PORTSPEED_20GFC		0x00000080	/* 20G FC */
60 #define HBA_PORTSPEED_40GFC		0x00000100	/* 40G FC */
61 #define HBA_PORTSPEED_128GFC		0x00000200	/* 128G FC */
62 #define HBA_PORTSPEED_64GFC		0x00000400	/* 64G FC */
63 #define HBA_PORTSPEED_256GFC		0x00000800	/* 256G FC */
64 #define HBA_PORTSPEED_UNKNOWN		0x00008000	/* Unknown */
65 #define HBA_PORTSPEED_10GE		0x00010000	/* 10G E */
66 #define HBA_PORTSPEED_40GE		0x00020000	/* 40G E */
67 #define HBA_PORTSPEED_100GE		0x00040000	/* 100G E */
68 #define HBA_PORTSPEED_25GE		0x00080000	/* 25G E */
69 #define HBA_PORTSPEED_50GE		0x00100000	/* 50G E */
70 #define HBA_PORTSPEED_400GE		0x00200000	/* 400G E */
71 
72 #define FOURBYTES	4
73 
74 
75 static char *lpfc_release_version = LPFC_DRIVER_VERSION;
76 
77 static void
78 lpfc_ct_ignore_hbq_buffer(struct lpfc_hba *phba, struct lpfc_iocbq *piocbq,
79 			  struct lpfc_dmabuf *mp, uint32_t size)
80 {
81 	if (!mp) {
82 		lpfc_printf_log(phba, KERN_INFO, LOG_ELS,
83 				"0146 Ignoring unsolicited CT No HBQ "
84 				"status = x%x\n",
85 				piocbq->iocb.ulpStatus);
86 	}
87 	lpfc_printf_log(phba, KERN_INFO, LOG_ELS,
88 			"0145 Ignoring unsolicted CT HBQ Size:%d "
89 			"status = x%x\n",
90 			size, piocbq->iocb.ulpStatus);
91 }
92 
93 static void
94 lpfc_ct_unsol_buffer(struct lpfc_hba *phba, struct lpfc_iocbq *piocbq,
95 		     struct lpfc_dmabuf *mp, uint32_t size)
96 {
97 	lpfc_ct_ignore_hbq_buffer(phba, piocbq, mp, size);
98 }
99 
100 void
101 lpfc_ct_unsol_event(struct lpfc_hba *phba, struct lpfc_sli_ring *pring,
102 		    struct lpfc_iocbq *piocbq)
103 {
104 	struct lpfc_dmabuf *mp = NULL;
105 	IOCB_t *icmd = &piocbq->iocb;
106 	int i;
107 	struct lpfc_iocbq *iocbq;
108 	dma_addr_t paddr;
109 	uint32_t size;
110 	struct list_head head;
111 	struct lpfc_dmabuf *bdeBuf;
112 
113 	if (lpfc_bsg_ct_unsol_event(phba, pring, piocbq) == 0)
114 		return;
115 
116 	if (unlikely(icmd->ulpStatus == IOSTAT_NEED_BUFFER)) {
117 		lpfc_sli_hbqbuf_add_hbqs(phba, LPFC_ELS_HBQ);
118 	} else if ((icmd->ulpStatus == IOSTAT_LOCAL_REJECT) &&
119 		   ((icmd->un.ulpWord[4] & IOERR_PARAM_MASK) ==
120 		   IOERR_RCV_BUFFER_WAITING)) {
121 		/* Not enough posted buffers; Try posting more buffers */
122 		phba->fc_stat.NoRcvBuf++;
123 		if (!(phba->sli3_options & LPFC_SLI3_HBQ_ENABLED))
124 			lpfc_post_buffer(phba, pring, 2);
125 		return;
126 	}
127 
128 	/* If there are no BDEs associated with this IOCB,
129 	 * there is nothing to do.
130 	 */
131 	if (icmd->ulpBdeCount == 0)
132 		return;
133 
134 	if (phba->sli3_options & LPFC_SLI3_HBQ_ENABLED) {
135 		INIT_LIST_HEAD(&head);
136 		list_add_tail(&head, &piocbq->list);
137 		list_for_each_entry(iocbq, &head, list) {
138 			icmd = &iocbq->iocb;
139 			if (icmd->ulpBdeCount == 0)
140 				continue;
141 			bdeBuf = iocbq->context2;
142 			iocbq->context2 = NULL;
143 			size  = icmd->un.cont64[0].tus.f.bdeSize;
144 			lpfc_ct_unsol_buffer(phba, piocbq, bdeBuf, size);
145 			lpfc_in_buf_free(phba, bdeBuf);
146 			if (icmd->ulpBdeCount == 2) {
147 				bdeBuf = iocbq->context3;
148 				iocbq->context3 = NULL;
149 				size  = icmd->unsli3.rcvsli3.bde2.tus.f.bdeSize;
150 				lpfc_ct_unsol_buffer(phba, piocbq, bdeBuf,
151 						     size);
152 				lpfc_in_buf_free(phba, bdeBuf);
153 			}
154 		}
155 		list_del(&head);
156 	} else {
157 		INIT_LIST_HEAD(&head);
158 		list_add_tail(&head, &piocbq->list);
159 		list_for_each_entry(iocbq, &head, list) {
160 			icmd = &iocbq->iocb;
161 			if (icmd->ulpBdeCount == 0)
162 				lpfc_ct_unsol_buffer(phba, iocbq, NULL, 0);
163 			for (i = 0; i < icmd->ulpBdeCount; i++) {
164 				paddr = getPaddr(icmd->un.cont64[i].addrHigh,
165 						 icmd->un.cont64[i].addrLow);
166 				mp = lpfc_sli_ringpostbuf_get(phba, pring,
167 							      paddr);
168 				size = icmd->un.cont64[i].tus.f.bdeSize;
169 				lpfc_ct_unsol_buffer(phba, iocbq, mp, size);
170 				lpfc_in_buf_free(phba, mp);
171 			}
172 			lpfc_post_buffer(phba, pring, i);
173 		}
174 		list_del(&head);
175 	}
176 }
177 
178 /**
179  * lpfc_ct_handle_unsol_abort - ct upper level protocol abort handler
180  * @phba: Pointer to HBA context object.
181  * @dmabuf: pointer to a dmabuf that describes the FC sequence
182  *
183  * This function serves as the upper level protocol abort handler for CT
184  * protocol.
185  *
186  * Return 1 if abort has been handled, 0 otherwise.
187  **/
188 int
189 lpfc_ct_handle_unsol_abort(struct lpfc_hba *phba, struct hbq_dmabuf *dmabuf)
190 {
191 	int handled;
192 
193 	/* CT upper level goes through BSG */
194 	handled = lpfc_bsg_ct_unsol_abort(phba, dmabuf);
195 
196 	return handled;
197 }
198 
199 static void
200 lpfc_free_ct_rsp(struct lpfc_hba *phba, struct lpfc_dmabuf *mlist)
201 {
202 	struct lpfc_dmabuf *mlast, *next_mlast;
203 
204 	list_for_each_entry_safe(mlast, next_mlast, &mlist->list, list) {
205 		lpfc_mbuf_free(phba, mlast->virt, mlast->phys);
206 		list_del(&mlast->list);
207 		kfree(mlast);
208 	}
209 	lpfc_mbuf_free(phba, mlist->virt, mlist->phys);
210 	kfree(mlist);
211 	return;
212 }
213 
214 static struct lpfc_dmabuf *
215 lpfc_alloc_ct_rsp(struct lpfc_hba *phba, int cmdcode, struct ulp_bde64 *bpl,
216 		  uint32_t size, int *entries)
217 {
218 	struct lpfc_dmabuf *mlist = NULL;
219 	struct lpfc_dmabuf *mp;
220 	int cnt, i = 0;
221 
222 	/* We get chunks of FCELSSIZE */
223 	cnt = size > FCELSSIZE ? FCELSSIZE: size;
224 
225 	while (size) {
226 		/* Allocate buffer for rsp payload */
227 		mp = kmalloc(sizeof(struct lpfc_dmabuf), GFP_KERNEL);
228 		if (!mp) {
229 			if (mlist)
230 				lpfc_free_ct_rsp(phba, mlist);
231 			return NULL;
232 		}
233 
234 		INIT_LIST_HEAD(&mp->list);
235 
236 		if (cmdcode == be16_to_cpu(SLI_CTNS_GID_FT) ||
237 		    cmdcode == be16_to_cpu(SLI_CTNS_GFF_ID))
238 			mp->virt = lpfc_mbuf_alloc(phba, MEM_PRI, &(mp->phys));
239 		else
240 			mp->virt = lpfc_mbuf_alloc(phba, 0, &(mp->phys));
241 
242 		if (!mp->virt) {
243 			kfree(mp);
244 			if (mlist)
245 				lpfc_free_ct_rsp(phba, mlist);
246 			return NULL;
247 		}
248 
249 		/* Queue it to a linked list */
250 		if (!mlist)
251 			mlist = mp;
252 		else
253 			list_add_tail(&mp->list, &mlist->list);
254 
255 		bpl->tus.f.bdeFlags = BUFF_TYPE_BDE_64I;
256 		/* build buffer ptr list for IOCB */
257 		bpl->addrLow = le32_to_cpu(putPaddrLow(mp->phys) );
258 		bpl->addrHigh = le32_to_cpu(putPaddrHigh(mp->phys) );
259 		bpl->tus.f.bdeSize = (uint16_t) cnt;
260 		bpl->tus.w = le32_to_cpu(bpl->tus.w);
261 		bpl++;
262 
263 		i++;
264 		size -= cnt;
265 	}
266 
267 	*entries = i;
268 	return mlist;
269 }
270 
271 int
272 lpfc_ct_free_iocb(struct lpfc_hba *phba, struct lpfc_iocbq *ctiocb)
273 {
274 	struct lpfc_dmabuf *buf_ptr;
275 
276 	if (ctiocb->context_un.ndlp) {
277 		lpfc_nlp_put(ctiocb->context_un.ndlp);
278 		ctiocb->context_un.ndlp = NULL;
279 	}
280 	if (ctiocb->context1) {
281 		buf_ptr = (struct lpfc_dmabuf *) ctiocb->context1;
282 		lpfc_mbuf_free(phba, buf_ptr->virt, buf_ptr->phys);
283 		kfree(buf_ptr);
284 		ctiocb->context1 = NULL;
285 	}
286 	if (ctiocb->context2) {
287 		lpfc_free_ct_rsp(phba, (struct lpfc_dmabuf *) ctiocb->context2);
288 		ctiocb->context2 = NULL;
289 	}
290 
291 	if (ctiocb->context3) {
292 		buf_ptr = (struct lpfc_dmabuf *) ctiocb->context3;
293 		lpfc_mbuf_free(phba, buf_ptr->virt, buf_ptr->phys);
294 		kfree(buf_ptr);
295 		ctiocb->context3 = NULL;
296 	}
297 	lpfc_sli_release_iocbq(phba, ctiocb);
298 	return 0;
299 }
300 
301 /**
302  * lpfc_gen_req - Build and issue a GEN_REQUEST command  to the SLI Layer
303  * @vport: pointer to a host virtual N_Port data structure.
304  * @bmp: Pointer to BPL for SLI command
305  * @inp: Pointer to data buffer for response data.
306  * @outp: Pointer to data buffer that hold the CT command.
307  * @cmpl: completion routine to call when command completes
308  * @ndlp: Destination NPort nodelist entry
309  *
310  * This function as the final part for issuing a CT command.
311  */
312 static int
313 lpfc_gen_req(struct lpfc_vport *vport, struct lpfc_dmabuf *bmp,
314 	     struct lpfc_dmabuf *inp, struct lpfc_dmabuf *outp,
315 	     void (*cmpl) (struct lpfc_hba *, struct lpfc_iocbq *,
316 		     struct lpfc_iocbq *),
317 	     struct lpfc_nodelist *ndlp, uint32_t usr_flg, uint32_t num_entry,
318 	     uint32_t tmo, uint8_t retry)
319 {
320 	struct lpfc_hba  *phba = vport->phba;
321 	IOCB_t *icmd;
322 	struct lpfc_iocbq *geniocb;
323 	int rc;
324 
325 	/* Allocate buffer for  command iocb */
326 	geniocb = lpfc_sli_get_iocbq(phba);
327 
328 	if (geniocb == NULL)
329 		return 1;
330 
331 	icmd = &geniocb->iocb;
332 	icmd->un.genreq64.bdl.ulpIoTag32 = 0;
333 	icmd->un.genreq64.bdl.addrHigh = putPaddrHigh(bmp->phys);
334 	icmd->un.genreq64.bdl.addrLow = putPaddrLow(bmp->phys);
335 	icmd->un.genreq64.bdl.bdeFlags = BUFF_TYPE_BLP_64;
336 	icmd->un.genreq64.bdl.bdeSize = (num_entry * sizeof(struct ulp_bde64));
337 
338 	if (usr_flg)
339 		geniocb->context3 = NULL;
340 	else
341 		geniocb->context3 = (uint8_t *) bmp;
342 
343 	/* Save for completion so we can release these resources */
344 	geniocb->context1 = (uint8_t *) inp;
345 	geniocb->context2 = (uint8_t *) outp;
346 	geniocb->context_un.ndlp = lpfc_nlp_get(ndlp);
347 
348 	/* Fill in payload, bp points to frame payload */
349 	icmd->ulpCommand = CMD_GEN_REQUEST64_CR;
350 
351 	/* Fill in rest of iocb */
352 	icmd->un.genreq64.w5.hcsw.Fctl = (SI | LA);
353 	icmd->un.genreq64.w5.hcsw.Dfctl = 0;
354 	icmd->un.genreq64.w5.hcsw.Rctl = FC_RCTL_DD_UNSOL_CTL;
355 	icmd->un.genreq64.w5.hcsw.Type = FC_TYPE_CT;
356 
357 	if (!tmo) {
358 		 /* FC spec states we need 3 * ratov for CT requests */
359 		tmo = (3 * phba->fc_ratov);
360 	}
361 	icmd->ulpTimeout = tmo;
362 	icmd->ulpBdeCount = 1;
363 	icmd->ulpLe = 1;
364 	icmd->ulpClass = CLASS3;
365 	icmd->ulpContext = ndlp->nlp_rpi;
366 	if (phba->sli_rev == LPFC_SLI_REV4)
367 		icmd->ulpContext = phba->sli4_hba.rpi_ids[ndlp->nlp_rpi];
368 
369 	if (phba->sli3_options & LPFC_SLI3_NPIV_ENABLED) {
370 		/* For GEN_REQUEST64_CR, use the RPI */
371 		icmd->ulpCt_h = 0;
372 		icmd->ulpCt_l = 0;
373 	}
374 
375 	/* Issue GEN REQ IOCB for NPORT <did> */
376 	lpfc_printf_vlog(vport, KERN_INFO, LOG_ELS,
377 			 "0119 Issue GEN REQ IOCB to NPORT x%x "
378 			 "Data: x%x x%x\n",
379 			 ndlp->nlp_DID, icmd->ulpIoTag,
380 			 vport->port_state);
381 	geniocb->iocb_cmpl = cmpl;
382 	geniocb->drvrTimeout = icmd->ulpTimeout + LPFC_DRVR_TIMEOUT;
383 	geniocb->vport = vport;
384 	geniocb->retry = retry;
385 	rc = lpfc_sli_issue_iocb(phba, LPFC_ELS_RING, geniocb, 0);
386 
387 	if (rc == IOCB_ERROR) {
388 		lpfc_sli_release_iocbq(phba, geniocb);
389 		return 1;
390 	}
391 
392 	return 0;
393 }
394 
395 /**
396  * lpfc_ct_cmd - Build and issue a CT command
397  * @vport: pointer to a host virtual N_Port data structure.
398  * @inmp: Pointer to data buffer for response data.
399  * @bmp: Pointer to BPL for SLI command
400  * @ndlp: Destination NPort nodelist entry
401  * @cmpl: completion routine to call when command completes
402  *
403  * This function is called for issuing a CT command.
404  */
405 static int
406 lpfc_ct_cmd(struct lpfc_vport *vport, struct lpfc_dmabuf *inmp,
407 	    struct lpfc_dmabuf *bmp, struct lpfc_nodelist *ndlp,
408 	    void (*cmpl) (struct lpfc_hba *, struct lpfc_iocbq *,
409 			  struct lpfc_iocbq *),
410 	    uint32_t rsp_size, uint8_t retry)
411 {
412 	struct lpfc_hba  *phba = vport->phba;
413 	struct ulp_bde64 *bpl = (struct ulp_bde64 *) bmp->virt;
414 	struct lpfc_dmabuf *outmp;
415 	int cnt = 0, status;
416 	int cmdcode = ((struct lpfc_sli_ct_request *) inmp->virt)->
417 		CommandResponse.bits.CmdRsp;
418 
419 	bpl++;			/* Skip past ct request */
420 
421 	/* Put buffer(s) for ct rsp in bpl */
422 	outmp = lpfc_alloc_ct_rsp(phba, cmdcode, bpl, rsp_size, &cnt);
423 	if (!outmp)
424 		return -ENOMEM;
425 	/*
426 	 * Form the CT IOCB.  The total number of BDEs in this IOCB
427 	 * is the single command plus response count from
428 	 * lpfc_alloc_ct_rsp.
429 	 */
430 	cnt += 1;
431 	status = lpfc_gen_req(vport, bmp, inmp, outmp, cmpl, ndlp, 0,
432 			      cnt, 0, retry);
433 	if (status) {
434 		lpfc_free_ct_rsp(phba, outmp);
435 		return -ENOMEM;
436 	}
437 	return 0;
438 }
439 
440 struct lpfc_vport *
441 lpfc_find_vport_by_did(struct lpfc_hba *phba, uint32_t did) {
442 	struct lpfc_vport *vport_curr;
443 	unsigned long flags;
444 
445 	spin_lock_irqsave(&phba->hbalock, flags);
446 	list_for_each_entry(vport_curr, &phba->port_list, listentry) {
447 		if ((vport_curr->fc_myDID) && (vport_curr->fc_myDID == did)) {
448 			spin_unlock_irqrestore(&phba->hbalock, flags);
449 			return vport_curr;
450 		}
451 	}
452 	spin_unlock_irqrestore(&phba->hbalock, flags);
453 	return NULL;
454 }
455 
456 static int
457 lpfc_ns_rsp(struct lpfc_vport *vport, struct lpfc_dmabuf *mp, uint32_t Size)
458 {
459 	struct lpfc_hba  *phba = vport->phba;
460 	struct lpfc_sli_ct_request *Response =
461 		(struct lpfc_sli_ct_request *) mp->virt;
462 	struct lpfc_nodelist *ndlp = NULL;
463 	struct lpfc_dmabuf *mlast, *next_mp;
464 	uint32_t *ctptr = (uint32_t *) & Response->un.gid.PortType;
465 	uint32_t Did, CTentry;
466 	int Cnt;
467 	struct list_head head;
468 
469 	lpfc_set_disctmo(vport);
470 	vport->num_disc_nodes = 0;
471 	vport->fc_ns_retry = 0;
472 
473 
474 	list_add_tail(&head, &mp->list);
475 	list_for_each_entry_safe(mp, next_mp, &head, list) {
476 		mlast = mp;
477 
478 		Cnt = Size  > FCELSSIZE ? FCELSSIZE : Size;
479 
480 		Size -= Cnt;
481 
482 		if (!ctptr) {
483 			ctptr = (uint32_t *) mlast->virt;
484 		} else
485 			Cnt -= 16;	/* subtract length of CT header */
486 
487 		/* Loop through entire NameServer list of DIDs */
488 		while (Cnt >= sizeof(uint32_t)) {
489 			/* Get next DID from NameServer List */
490 			CTentry = *ctptr++;
491 			Did = ((be32_to_cpu(CTentry)) & Mask_DID);
492 
493 			ndlp = NULL;
494 
495 			/*
496 			 * Check for rscn processing or not
497 			 * To conserve rpi's, filter out addresses for other
498 			 * vports on the same physical HBAs.
499 			 */
500 			if ((Did != vport->fc_myDID) &&
501 			    ((lpfc_find_vport_by_did(phba, Did) == NULL) ||
502 			     vport->cfg_peer_port_login)) {
503 				if ((vport->port_type != LPFC_NPIV_PORT) ||
504 				    (!(vport->ct_flags & FC_CT_RFF_ID)) ||
505 				    (!vport->cfg_restrict_login)) {
506 					ndlp = lpfc_setup_disc_node(vport, Did);
507 					if (ndlp && NLP_CHK_NODE_ACT(ndlp)) {
508 						lpfc_debugfs_disc_trc(vport,
509 						LPFC_DISC_TRC_CT,
510 						"Parse GID_FTrsp: "
511 						"did:x%x flg:x%x x%x",
512 						Did, ndlp->nlp_flag,
513 						vport->fc_flag);
514 
515 						lpfc_printf_vlog(vport,
516 							KERN_INFO,
517 							LOG_DISCOVERY,
518 							"0238 Process "
519 							"x%x NameServer Rsp"
520 							"Data: x%x x%x x%x\n",
521 							Did, ndlp->nlp_flag,
522 							vport->fc_flag,
523 							vport->fc_rscn_id_cnt);
524 					} else {
525 						lpfc_debugfs_disc_trc(vport,
526 						LPFC_DISC_TRC_CT,
527 						"Skip1 GID_FTrsp: "
528 						"did:x%x flg:x%x cnt:%d",
529 						Did, vport->fc_flag,
530 						vport->fc_rscn_id_cnt);
531 
532 						lpfc_printf_vlog(vport,
533 							KERN_INFO,
534 							LOG_DISCOVERY,
535 							"0239 Skip x%x "
536 							"NameServer Rsp Data: "
537 							"x%x x%x\n",
538 							Did, vport->fc_flag,
539 							vport->fc_rscn_id_cnt);
540 					}
541 
542 				} else {
543 					if (!(vport->fc_flag & FC_RSCN_MODE) ||
544 					(lpfc_rscn_payload_check(vport, Did))) {
545 						lpfc_debugfs_disc_trc(vport,
546 						LPFC_DISC_TRC_CT,
547 						"Query GID_FTrsp: "
548 						"did:x%x flg:x%x cnt:%d",
549 						Did, vport->fc_flag,
550 						vport->fc_rscn_id_cnt);
551 
552 						/* This NPortID was previously
553 						 * a FCP target, * Don't even
554 						 * bother to send GFF_ID.
555 						 */
556 						ndlp = lpfc_findnode_did(vport,
557 							Did);
558 						if (ndlp &&
559 						    NLP_CHK_NODE_ACT(ndlp)
560 						    && (ndlp->nlp_type &
561 						     NLP_FCP_TARGET))
562 							lpfc_setup_disc_node
563 								(vport, Did);
564 						else if (lpfc_ns_cmd(vport,
565 							SLI_CTNS_GFF_ID,
566 							0, Did) == 0)
567 							vport->num_disc_nodes++;
568 						else
569 							lpfc_setup_disc_node
570 								(vport, Did);
571 					}
572 					else {
573 						lpfc_debugfs_disc_trc(vport,
574 						LPFC_DISC_TRC_CT,
575 						"Skip2 GID_FTrsp: "
576 						"did:x%x flg:x%x cnt:%d",
577 						Did, vport->fc_flag,
578 						vport->fc_rscn_id_cnt);
579 
580 						lpfc_printf_vlog(vport,
581 							KERN_INFO,
582 							LOG_DISCOVERY,
583 							"0245 Skip x%x "
584 							"NameServer Rsp Data: "
585 							"x%x x%x\n",
586 							Did, vport->fc_flag,
587 							vport->fc_rscn_id_cnt);
588 					}
589 				}
590 			}
591 			if (CTentry & (cpu_to_be32(SLI_CT_LAST_ENTRY)))
592 				goto nsout1;
593 			Cnt -= sizeof(uint32_t);
594 		}
595 		ctptr = NULL;
596 
597 	}
598 
599 nsout1:
600 	list_del(&head);
601 	return 0;
602 }
603 
604 static void
605 lpfc_cmpl_ct_cmd_gid_ft(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
606 			struct lpfc_iocbq *rspiocb)
607 {
608 	struct lpfc_vport *vport = cmdiocb->vport;
609 	struct Scsi_Host *shost = lpfc_shost_from_vport(vport);
610 	IOCB_t *irsp;
611 	struct lpfc_dmabuf *outp;
612 	struct lpfc_sli_ct_request *CTrsp;
613 	struct lpfc_nodelist *ndlp;
614 	int rc;
615 
616 	/* First save ndlp, before we overwrite it */
617 	ndlp = cmdiocb->context_un.ndlp;
618 
619 	/* we pass cmdiocb to state machine which needs rspiocb as well */
620 	cmdiocb->context_un.rsp_iocb = rspiocb;
621 
622 	outp = (struct lpfc_dmabuf *) cmdiocb->context2;
623 	irsp = &rspiocb->iocb;
624 
625 	lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_CT,
626 		 "GID_FT cmpl:     status:x%x/x%x rtry:%d",
627 		irsp->ulpStatus, irsp->un.ulpWord[4], vport->fc_ns_retry);
628 
629 	/* Don't bother processing response if vport is being torn down. */
630 	if (vport->load_flag & FC_UNLOADING) {
631 		if (vport->fc_flag & FC_RSCN_MODE)
632 			lpfc_els_flush_rscn(vport);
633 		goto out;
634 	}
635 
636 	if (lpfc_els_chk_latt(vport)) {
637 		lpfc_printf_vlog(vport, KERN_INFO, LOG_DISCOVERY,
638 				 "0216 Link event during NS query\n");
639 		if (vport->fc_flag & FC_RSCN_MODE)
640 			lpfc_els_flush_rscn(vport);
641 		lpfc_vport_set_state(vport, FC_VPORT_FAILED);
642 		goto out;
643 	}
644 	if (lpfc_error_lost_link(irsp)) {
645 		lpfc_printf_vlog(vport, KERN_INFO, LOG_DISCOVERY,
646 				 "0226 NS query failed due to link event\n");
647 		if (vport->fc_flag & FC_RSCN_MODE)
648 			lpfc_els_flush_rscn(vport);
649 		goto out;
650 	}
651 	if (irsp->ulpStatus) {
652 		/* Check for retry */
653 		if (vport->fc_ns_retry < LPFC_MAX_NS_RETRY) {
654 			if (irsp->ulpStatus != IOSTAT_LOCAL_REJECT ||
655 			    (irsp->un.ulpWord[4] & IOERR_PARAM_MASK) !=
656 			    IOERR_NO_RESOURCES)
657 				vport->fc_ns_retry++;
658 
659 			/* CT command is being retried */
660 			rc = lpfc_ns_cmd(vport, SLI_CTNS_GID_FT,
661 					 vport->fc_ns_retry, 0);
662 			if (rc == 0)
663 				goto out;
664 		}
665 		if (vport->fc_flag & FC_RSCN_MODE)
666 			lpfc_els_flush_rscn(vport);
667 		lpfc_vport_set_state(vport, FC_VPORT_FAILED);
668 		lpfc_printf_vlog(vport, KERN_ERR, LOG_ELS,
669 				 "0257 GID_FT Query error: 0x%x 0x%x\n",
670 				 irsp->ulpStatus, vport->fc_ns_retry);
671 	} else {
672 		/* Good status, continue checking */
673 		CTrsp = (struct lpfc_sli_ct_request *) outp->virt;
674 		if (CTrsp->CommandResponse.bits.CmdRsp ==
675 		    cpu_to_be16(SLI_CT_RESPONSE_FS_ACC)) {
676 			lpfc_printf_vlog(vport, KERN_INFO, LOG_DISCOVERY,
677 					 "0208 NameServer Rsp Data: x%x\n",
678 					 vport->fc_flag);
679 			lpfc_ns_rsp(vport, outp,
680 				    (uint32_t) (irsp->un.genreq64.bdl.bdeSize));
681 		} else if (CTrsp->CommandResponse.bits.CmdRsp ==
682 			   be16_to_cpu(SLI_CT_RESPONSE_FS_RJT)) {
683 			/* NameServer Rsp Error */
684 			if ((CTrsp->ReasonCode == SLI_CT_UNABLE_TO_PERFORM_REQ)
685 			    && (CTrsp->Explanation == SLI_CT_NO_FC4_TYPES)) {
686 				lpfc_printf_vlog(vport, KERN_INFO,
687 					LOG_DISCOVERY,
688 					"0269 No NameServer Entries "
689 					"Data: x%x x%x x%x x%x\n",
690 					CTrsp->CommandResponse.bits.CmdRsp,
691 					(uint32_t) CTrsp->ReasonCode,
692 					(uint32_t) CTrsp->Explanation,
693 					vport->fc_flag);
694 
695 				lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_CT,
696 				"GID_FT no entry  cmd:x%x rsn:x%x exp:x%x",
697 				(uint32_t)CTrsp->CommandResponse.bits.CmdRsp,
698 				(uint32_t) CTrsp->ReasonCode,
699 				(uint32_t) CTrsp->Explanation);
700 			} else {
701 				lpfc_printf_vlog(vport, KERN_INFO,
702 					LOG_DISCOVERY,
703 					"0240 NameServer Rsp Error "
704 					"Data: x%x x%x x%x x%x\n",
705 					CTrsp->CommandResponse.bits.CmdRsp,
706 					(uint32_t) CTrsp->ReasonCode,
707 					(uint32_t) CTrsp->Explanation,
708 					vport->fc_flag);
709 
710 				lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_CT,
711 				"GID_FT rsp err1  cmd:x%x rsn:x%x exp:x%x",
712 				(uint32_t)CTrsp->CommandResponse.bits.CmdRsp,
713 				(uint32_t) CTrsp->ReasonCode,
714 				(uint32_t) CTrsp->Explanation);
715 			}
716 
717 
718 		} else {
719 			/* NameServer Rsp Error */
720 			lpfc_printf_vlog(vport, KERN_ERR, LOG_DISCOVERY,
721 					"0241 NameServer Rsp Error "
722 					"Data: x%x x%x x%x x%x\n",
723 					CTrsp->CommandResponse.bits.CmdRsp,
724 					(uint32_t) CTrsp->ReasonCode,
725 					(uint32_t) CTrsp->Explanation,
726 					vport->fc_flag);
727 
728 			lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_CT,
729 				"GID_FT rsp err2  cmd:x%x rsn:x%x exp:x%x",
730 				(uint32_t)CTrsp->CommandResponse.bits.CmdRsp,
731 				(uint32_t) CTrsp->ReasonCode,
732 				(uint32_t) CTrsp->Explanation);
733 		}
734 	}
735 	/* Link up / RSCN discovery */
736 	if (vport->num_disc_nodes == 0) {
737 		/*
738 		 * The driver has cycled through all Nports in the RSCN payload.
739 		 * Complete the handling by cleaning up and marking the
740 		 * current driver state.
741 		 */
742 		if (vport->port_state >= LPFC_DISC_AUTH) {
743 			if (vport->fc_flag & FC_RSCN_MODE) {
744 				lpfc_els_flush_rscn(vport);
745 				spin_lock_irq(shost->host_lock);
746 				vport->fc_flag |= FC_RSCN_MODE; /* RSCN still */
747 				spin_unlock_irq(shost->host_lock);
748 			}
749 			else
750 				lpfc_els_flush_rscn(vport);
751 		}
752 
753 		lpfc_disc_start(vport);
754 	}
755 out:
756 	cmdiocb->context_un.ndlp = ndlp; /* Now restore ndlp for free */
757 	lpfc_ct_free_iocb(phba, cmdiocb);
758 	return;
759 }
760 
761 static void
762 lpfc_cmpl_ct_cmd_gff_id(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
763 			struct lpfc_iocbq *rspiocb)
764 {
765 	struct lpfc_vport *vport = cmdiocb->vport;
766 	struct Scsi_Host *shost = lpfc_shost_from_vport(vport);
767 	IOCB_t *irsp = &rspiocb->iocb;
768 	struct lpfc_dmabuf *inp = (struct lpfc_dmabuf *) cmdiocb->context1;
769 	struct lpfc_dmabuf *outp = (struct lpfc_dmabuf *) cmdiocb->context2;
770 	struct lpfc_sli_ct_request *CTrsp;
771 	int did, rc, retry;
772 	uint8_t fbits;
773 	struct lpfc_nodelist *ndlp;
774 
775 	did = ((struct lpfc_sli_ct_request *) inp->virt)->un.gff.PortId;
776 	did = be32_to_cpu(did);
777 
778 	lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_CT,
779 		"GFF_ID cmpl:     status:x%x/x%x did:x%x",
780 		irsp->ulpStatus, irsp->un.ulpWord[4], did);
781 
782 	if (irsp->ulpStatus == IOSTAT_SUCCESS) {
783 		/* Good status, continue checking */
784 		CTrsp = (struct lpfc_sli_ct_request *) outp->virt;
785 		fbits = CTrsp->un.gff_acc.fbits[FCP_TYPE_FEATURE_OFFSET];
786 
787 		if (CTrsp->CommandResponse.bits.CmdRsp ==
788 		    be16_to_cpu(SLI_CT_RESPONSE_FS_ACC)) {
789 			if ((fbits & FC4_FEATURE_INIT) &&
790 			    !(fbits & FC4_FEATURE_TARGET)) {
791 				lpfc_printf_vlog(vport, KERN_INFO,
792 						 LOG_DISCOVERY,
793 						 "0270 Skip x%x GFF "
794 						 "NameServer Rsp Data: (init) "
795 						 "x%x x%x\n", did, fbits,
796 						 vport->fc_rscn_id_cnt);
797 				goto out;
798 			}
799 		}
800 	}
801 	else {
802 		/* Check for retry */
803 		if (cmdiocb->retry < LPFC_MAX_NS_RETRY) {
804 			retry = 1;
805 			if (irsp->ulpStatus == IOSTAT_LOCAL_REJECT) {
806 				switch ((irsp->un.ulpWord[4] &
807 					IOERR_PARAM_MASK)) {
808 
809 				case IOERR_NO_RESOURCES:
810 					/* We don't increment the retry
811 					 * count for this case.
812 					 */
813 					break;
814 				case IOERR_LINK_DOWN:
815 				case IOERR_SLI_ABORTED:
816 				case IOERR_SLI_DOWN:
817 					retry = 0;
818 					break;
819 				default:
820 					cmdiocb->retry++;
821 				}
822 			}
823 			else
824 				cmdiocb->retry++;
825 
826 			if (retry) {
827 				/* CT command is being retried */
828 				rc = lpfc_ns_cmd(vport, SLI_CTNS_GFF_ID,
829 					 cmdiocb->retry, did);
830 				if (rc == 0) {
831 					/* success */
832 					lpfc_ct_free_iocb(phba, cmdiocb);
833 					return;
834 				}
835 			}
836 		}
837 		lpfc_printf_vlog(vport, KERN_ERR, LOG_DISCOVERY,
838 				 "0267 NameServer GFF Rsp "
839 				 "x%x Error (%d %d) Data: x%x x%x\n",
840 				 did, irsp->ulpStatus, irsp->un.ulpWord[4],
841 				 vport->fc_flag, vport->fc_rscn_id_cnt);
842 	}
843 
844 	/* This is a target port, unregistered port, or the GFF_ID failed */
845 	ndlp = lpfc_setup_disc_node(vport, did);
846 	if (ndlp && NLP_CHK_NODE_ACT(ndlp)) {
847 		lpfc_printf_vlog(vport, KERN_INFO, LOG_DISCOVERY,
848 				 "0242 Process x%x GFF "
849 				 "NameServer Rsp Data: x%x x%x x%x\n",
850 				 did, ndlp->nlp_flag, vport->fc_flag,
851 				 vport->fc_rscn_id_cnt);
852 	} else {
853 		lpfc_printf_vlog(vport, KERN_INFO, LOG_DISCOVERY,
854 				 "0243 Skip x%x GFF "
855 				 "NameServer Rsp Data: x%x x%x\n", did,
856 				 vport->fc_flag, vport->fc_rscn_id_cnt);
857 	}
858 out:
859 	/* Link up / RSCN discovery */
860 	if (vport->num_disc_nodes)
861 		vport->num_disc_nodes--;
862 	if (vport->num_disc_nodes == 0) {
863 		/*
864 		 * The driver has cycled through all Nports in the RSCN payload.
865 		 * Complete the handling by cleaning up and marking the
866 		 * current driver state.
867 		 */
868 		if (vport->port_state >= LPFC_DISC_AUTH) {
869 			if (vport->fc_flag & FC_RSCN_MODE) {
870 				lpfc_els_flush_rscn(vport);
871 				spin_lock_irq(shost->host_lock);
872 				vport->fc_flag |= FC_RSCN_MODE; /* RSCN still */
873 				spin_unlock_irq(shost->host_lock);
874 			}
875 			else
876 				lpfc_els_flush_rscn(vport);
877 		}
878 		lpfc_disc_start(vport);
879 	}
880 	lpfc_ct_free_iocb(phba, cmdiocb);
881 	return;
882 }
883 
884 
885 static void
886 lpfc_cmpl_ct(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
887 	     struct lpfc_iocbq *rspiocb)
888 {
889 	struct lpfc_vport *vport = cmdiocb->vport;
890 	struct lpfc_dmabuf *inp;
891 	struct lpfc_dmabuf *outp;
892 	IOCB_t *irsp;
893 	struct lpfc_sli_ct_request *CTrsp;
894 	struct lpfc_nodelist *ndlp;
895 	int cmdcode, rc;
896 	uint8_t retry;
897 	uint32_t latt;
898 
899 	/* First save ndlp, before we overwrite it */
900 	ndlp = cmdiocb->context_un.ndlp;
901 
902 	/* we pass cmdiocb to state machine which needs rspiocb as well */
903 	cmdiocb->context_un.rsp_iocb = rspiocb;
904 
905 	inp = (struct lpfc_dmabuf *) cmdiocb->context1;
906 	outp = (struct lpfc_dmabuf *) cmdiocb->context2;
907 	irsp = &rspiocb->iocb;
908 
909 	cmdcode = be16_to_cpu(((struct lpfc_sli_ct_request *) inp->virt)->
910 					CommandResponse.bits.CmdRsp);
911 	CTrsp = (struct lpfc_sli_ct_request *) outp->virt;
912 
913 	latt = lpfc_els_chk_latt(vport);
914 
915 	/* RFT request completes status <ulpStatus> CmdRsp <CmdRsp> */
916 	lpfc_printf_vlog(vport, KERN_INFO, LOG_DISCOVERY,
917 			 "0209 CT Request completes, latt %d, "
918 			 "ulpStatus x%x CmdRsp x%x, Context x%x, Tag x%x\n",
919 			 latt, irsp->ulpStatus,
920 			 CTrsp->CommandResponse.bits.CmdRsp,
921 			 cmdiocb->iocb.ulpContext, cmdiocb->iocb.ulpIoTag);
922 
923 	lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_CT,
924 		"CT cmd cmpl:     status:x%x/x%x cmd:x%x",
925 		irsp->ulpStatus, irsp->un.ulpWord[4], cmdcode);
926 
927 	if (irsp->ulpStatus) {
928 		lpfc_printf_vlog(vport, KERN_ERR, LOG_DISCOVERY,
929 				 "0268 NS cmd x%x Error (x%x x%x)\n",
930 				 cmdcode, irsp->ulpStatus, irsp->un.ulpWord[4]);
931 
932 		if ((irsp->ulpStatus == IOSTAT_LOCAL_REJECT) &&
933 			(((irsp->un.ulpWord[4] & IOERR_PARAM_MASK) ==
934 			  IOERR_SLI_DOWN) ||
935 			 ((irsp->un.ulpWord[4] & IOERR_PARAM_MASK) ==
936 			  IOERR_SLI_ABORTED)))
937 			goto out;
938 
939 		retry = cmdiocb->retry;
940 		if (retry >= LPFC_MAX_NS_RETRY)
941 			goto out;
942 
943 		retry++;
944 		lpfc_printf_vlog(vport, KERN_INFO, LOG_DISCOVERY,
945 				 "0250 Retrying NS cmd %x\n", cmdcode);
946 		rc = lpfc_ns_cmd(vport, cmdcode, retry, 0);
947 		if (rc == 0)
948 			goto out;
949 	}
950 
951 out:
952 	cmdiocb->context_un.ndlp = ndlp; /* Now restore ndlp for free */
953 	lpfc_ct_free_iocb(phba, cmdiocb);
954 	return;
955 }
956 
957 static void
958 lpfc_cmpl_ct_cmd_rft_id(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
959 			struct lpfc_iocbq *rspiocb)
960 {
961 	IOCB_t *irsp = &rspiocb->iocb;
962 	struct lpfc_vport *vport = cmdiocb->vport;
963 
964 	if (irsp->ulpStatus == IOSTAT_SUCCESS) {
965 		struct lpfc_dmabuf *outp;
966 		struct lpfc_sli_ct_request *CTrsp;
967 
968 		outp = (struct lpfc_dmabuf *) cmdiocb->context2;
969 		CTrsp = (struct lpfc_sli_ct_request *) outp->virt;
970 		if (CTrsp->CommandResponse.bits.CmdRsp ==
971 		    be16_to_cpu(SLI_CT_RESPONSE_FS_ACC))
972 			vport->ct_flags |= FC_CT_RFT_ID;
973 	}
974 	lpfc_cmpl_ct(phba, cmdiocb, rspiocb);
975 	return;
976 }
977 
978 static void
979 lpfc_cmpl_ct_cmd_rnn_id(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
980 			struct lpfc_iocbq *rspiocb)
981 {
982 	IOCB_t *irsp = &rspiocb->iocb;
983 	struct lpfc_vport *vport = cmdiocb->vport;
984 
985 	if (irsp->ulpStatus == IOSTAT_SUCCESS) {
986 		struct lpfc_dmabuf *outp;
987 		struct lpfc_sli_ct_request *CTrsp;
988 
989 		outp = (struct lpfc_dmabuf *) cmdiocb->context2;
990 		CTrsp = (struct lpfc_sli_ct_request *) outp->virt;
991 		if (CTrsp->CommandResponse.bits.CmdRsp ==
992 		    be16_to_cpu(SLI_CT_RESPONSE_FS_ACC))
993 			vport->ct_flags |= FC_CT_RNN_ID;
994 	}
995 	lpfc_cmpl_ct(phba, cmdiocb, rspiocb);
996 	return;
997 }
998 
999 static void
1000 lpfc_cmpl_ct_cmd_rspn_id(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
1001 			 struct lpfc_iocbq *rspiocb)
1002 {
1003 	IOCB_t *irsp = &rspiocb->iocb;
1004 	struct lpfc_vport *vport = cmdiocb->vport;
1005 
1006 	if (irsp->ulpStatus == IOSTAT_SUCCESS) {
1007 		struct lpfc_dmabuf *outp;
1008 		struct lpfc_sli_ct_request *CTrsp;
1009 
1010 		outp = (struct lpfc_dmabuf *) cmdiocb->context2;
1011 		CTrsp = (struct lpfc_sli_ct_request *) outp->virt;
1012 		if (CTrsp->CommandResponse.bits.CmdRsp ==
1013 		    be16_to_cpu(SLI_CT_RESPONSE_FS_ACC))
1014 			vport->ct_flags |= FC_CT_RSPN_ID;
1015 	}
1016 	lpfc_cmpl_ct(phba, cmdiocb, rspiocb);
1017 	return;
1018 }
1019 
1020 static void
1021 lpfc_cmpl_ct_cmd_rsnn_nn(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
1022 			 struct lpfc_iocbq *rspiocb)
1023 {
1024 	IOCB_t *irsp = &rspiocb->iocb;
1025 	struct lpfc_vport *vport = cmdiocb->vport;
1026 
1027 	if (irsp->ulpStatus == IOSTAT_SUCCESS) {
1028 		struct lpfc_dmabuf *outp;
1029 		struct lpfc_sli_ct_request *CTrsp;
1030 
1031 		outp = (struct lpfc_dmabuf *) cmdiocb->context2;
1032 		CTrsp = (struct lpfc_sli_ct_request *) outp->virt;
1033 		if (CTrsp->CommandResponse.bits.CmdRsp ==
1034 		    be16_to_cpu(SLI_CT_RESPONSE_FS_ACC))
1035 			vport->ct_flags |= FC_CT_RSNN_NN;
1036 	}
1037 	lpfc_cmpl_ct(phba, cmdiocb, rspiocb);
1038 	return;
1039 }
1040 
1041 static void
1042 lpfc_cmpl_ct_cmd_da_id(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
1043  struct lpfc_iocbq *rspiocb)
1044 {
1045 	struct lpfc_vport *vport = cmdiocb->vport;
1046 
1047 	/* even if it fails we will act as though it succeeded. */
1048 	vport->ct_flags = 0;
1049 	lpfc_cmpl_ct(phba, cmdiocb, rspiocb);
1050 	return;
1051 }
1052 
1053 static void
1054 lpfc_cmpl_ct_cmd_rff_id(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
1055 			struct lpfc_iocbq *rspiocb)
1056 {
1057 	IOCB_t *irsp = &rspiocb->iocb;
1058 	struct lpfc_vport *vport = cmdiocb->vport;
1059 
1060 	if (irsp->ulpStatus == IOSTAT_SUCCESS) {
1061 		struct lpfc_dmabuf *outp;
1062 		struct lpfc_sli_ct_request *CTrsp;
1063 
1064 		outp = (struct lpfc_dmabuf *) cmdiocb->context2;
1065 		CTrsp = (struct lpfc_sli_ct_request *) outp->virt;
1066 		if (CTrsp->CommandResponse.bits.CmdRsp ==
1067 		    be16_to_cpu(SLI_CT_RESPONSE_FS_ACC))
1068 			vport->ct_flags |= FC_CT_RFF_ID;
1069 	}
1070 	lpfc_cmpl_ct(phba, cmdiocb, rspiocb);
1071 	return;
1072 }
1073 
1074 int
1075 lpfc_vport_symbolic_port_name(struct lpfc_vport *vport, char *symbol,
1076 	size_t size)
1077 {
1078 	int n;
1079 	uint8_t *wwn = vport->phba->wwpn;
1080 
1081 	n = snprintf(symbol, size,
1082 		     "Emulex PPN-%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x",
1083 		     wwn[0], wwn[1], wwn[2], wwn[3],
1084 		     wwn[4], wwn[5], wwn[6], wwn[7]);
1085 
1086 	if (vport->port_type == LPFC_PHYSICAL_PORT)
1087 		return n;
1088 
1089 	if (n < size)
1090 		n += snprintf(symbol + n, size - n, " VPort-%d", vport->vpi);
1091 
1092 	if (n < size &&
1093 	    strlen(vport->fc_vport->symbolic_name))
1094 		n += snprintf(symbol + n, size - n, " VName-%s",
1095 			      vport->fc_vport->symbolic_name);
1096 	return n;
1097 }
1098 
1099 int
1100 lpfc_vport_symbolic_node_name(struct lpfc_vport *vport, char *symbol,
1101 	size_t size)
1102 {
1103 	char fwrev[FW_REV_STR_SIZE];
1104 	int n;
1105 
1106 	lpfc_decode_firmware_rev(vport->phba, fwrev, 0);
1107 
1108 	n = snprintf(symbol, size, "Emulex %s", vport->phba->ModelName);
1109 
1110 	if (size < n)
1111 		return n;
1112 	n += snprintf(symbol + n, size - n, " FV%s", fwrev);
1113 
1114 	if (size < n)
1115 		return n;
1116 	n += snprintf(symbol + n, size - n, " DV%s", lpfc_release_version);
1117 
1118 	if (size < n)
1119 		return n;
1120 	n += snprintf(symbol + n, size - n, " HN:%s", init_utsname()->nodename);
1121 
1122 	/* Note :- OS name is "Linux" */
1123 	if (size < n)
1124 		return n;
1125 	n += snprintf(symbol + n, size - n, " OS:%s", init_utsname()->sysname);
1126 
1127 	return n;
1128 }
1129 
1130 static uint32_t
1131 lpfc_find_map_node(struct lpfc_vport *vport)
1132 {
1133 	struct lpfc_nodelist *ndlp, *next_ndlp;
1134 	struct Scsi_Host  *shost;
1135 	uint32_t cnt = 0;
1136 
1137 	shost = lpfc_shost_from_vport(vport);
1138 	spin_lock_irq(shost->host_lock);
1139 	list_for_each_entry_safe(ndlp, next_ndlp, &vport->fc_nodes, nlp_listp) {
1140 		if (ndlp->nlp_type & NLP_FABRIC)
1141 			continue;
1142 		if ((ndlp->nlp_state == NLP_STE_MAPPED_NODE) ||
1143 		    (ndlp->nlp_state == NLP_STE_UNMAPPED_NODE))
1144 			cnt++;
1145 	}
1146 	spin_unlock_irq(shost->host_lock);
1147 	return cnt;
1148 }
1149 
1150 /*
1151  * lpfc_ns_cmd
1152  * Description:
1153  *    Issue Cmd to NameServer
1154  *       SLI_CTNS_GID_FT
1155  *       LI_CTNS_RFT_ID
1156  */
1157 int
1158 lpfc_ns_cmd(struct lpfc_vport *vport, int cmdcode,
1159 	    uint8_t retry, uint32_t context)
1160 {
1161 	struct lpfc_nodelist * ndlp;
1162 	struct lpfc_hba *phba = vport->phba;
1163 	struct lpfc_dmabuf *mp, *bmp;
1164 	struct lpfc_sli_ct_request *CtReq;
1165 	struct ulp_bde64 *bpl;
1166 	void (*cmpl) (struct lpfc_hba *, struct lpfc_iocbq *,
1167 		      struct lpfc_iocbq *) = NULL;
1168 	uint32_t rsp_size = 1024;
1169 	size_t   size;
1170 	int rc = 0;
1171 
1172 	ndlp = lpfc_findnode_did(vport, NameServer_DID);
1173 	if (!ndlp || !NLP_CHK_NODE_ACT(ndlp)
1174 	    || ndlp->nlp_state != NLP_STE_UNMAPPED_NODE) {
1175 		rc=1;
1176 		goto ns_cmd_exit;
1177 	}
1178 
1179 	/* fill in BDEs for command */
1180 	/* Allocate buffer for command payload */
1181 	mp = kmalloc(sizeof(struct lpfc_dmabuf), GFP_KERNEL);
1182 	if (!mp) {
1183 		rc=2;
1184 		goto ns_cmd_exit;
1185 	}
1186 
1187 	INIT_LIST_HEAD(&mp->list);
1188 	mp->virt = lpfc_mbuf_alloc(phba, MEM_PRI, &(mp->phys));
1189 	if (!mp->virt) {
1190 		rc=3;
1191 		goto ns_cmd_free_mp;
1192 	}
1193 
1194 	/* Allocate buffer for Buffer ptr list */
1195 	bmp = kmalloc(sizeof(struct lpfc_dmabuf), GFP_KERNEL);
1196 	if (!bmp) {
1197 		rc=4;
1198 		goto ns_cmd_free_mpvirt;
1199 	}
1200 
1201 	INIT_LIST_HEAD(&bmp->list);
1202 	bmp->virt = lpfc_mbuf_alloc(phba, MEM_PRI, &(bmp->phys));
1203 	if (!bmp->virt) {
1204 		rc=5;
1205 		goto ns_cmd_free_bmp;
1206 	}
1207 
1208 	/* NameServer Req */
1209 	lpfc_printf_vlog(vport, KERN_INFO ,LOG_DISCOVERY,
1210 			 "0236 NameServer Req Data: x%x x%x x%x\n",
1211 			 cmdcode, vport->fc_flag, vport->fc_rscn_id_cnt);
1212 
1213 	bpl = (struct ulp_bde64 *) bmp->virt;
1214 	memset(bpl, 0, sizeof(struct ulp_bde64));
1215 	bpl->addrHigh = le32_to_cpu(putPaddrHigh(mp->phys) );
1216 	bpl->addrLow = le32_to_cpu(putPaddrLow(mp->phys) );
1217 	bpl->tus.f.bdeFlags = 0;
1218 	if (cmdcode == SLI_CTNS_GID_FT)
1219 		bpl->tus.f.bdeSize = GID_REQUEST_SZ;
1220 	else if (cmdcode == SLI_CTNS_GFF_ID)
1221 		bpl->tus.f.bdeSize = GFF_REQUEST_SZ;
1222 	else if (cmdcode == SLI_CTNS_RFT_ID)
1223 		bpl->tus.f.bdeSize = RFT_REQUEST_SZ;
1224 	else if (cmdcode == SLI_CTNS_RNN_ID)
1225 		bpl->tus.f.bdeSize = RNN_REQUEST_SZ;
1226 	else if (cmdcode == SLI_CTNS_RSPN_ID)
1227 		bpl->tus.f.bdeSize = RSPN_REQUEST_SZ;
1228 	else if (cmdcode == SLI_CTNS_RSNN_NN)
1229 		bpl->tus.f.bdeSize = RSNN_REQUEST_SZ;
1230 	else if (cmdcode == SLI_CTNS_DA_ID)
1231 		bpl->tus.f.bdeSize = DA_ID_REQUEST_SZ;
1232 	else if (cmdcode == SLI_CTNS_RFF_ID)
1233 		bpl->tus.f.bdeSize = RFF_REQUEST_SZ;
1234 	else
1235 		bpl->tus.f.bdeSize = 0;
1236 	bpl->tus.w = le32_to_cpu(bpl->tus.w);
1237 
1238 	CtReq = (struct lpfc_sli_ct_request *) mp->virt;
1239 	memset(CtReq, 0, sizeof(struct lpfc_sli_ct_request));
1240 	CtReq->RevisionId.bits.Revision = SLI_CT_REVISION;
1241 	CtReq->RevisionId.bits.InId = 0;
1242 	CtReq->FsType = SLI_CT_DIRECTORY_SERVICE;
1243 	CtReq->FsSubType = SLI_CT_DIRECTORY_NAME_SERVER;
1244 	CtReq->CommandResponse.bits.Size = 0;
1245 	switch (cmdcode) {
1246 	case SLI_CTNS_GID_FT:
1247 		CtReq->CommandResponse.bits.CmdRsp =
1248 		    cpu_to_be16(SLI_CTNS_GID_FT);
1249 		CtReq->un.gid.Fc4Type = SLI_CTPT_FCP;
1250 		if (vport->port_state < LPFC_NS_QRY)
1251 			vport->port_state = LPFC_NS_QRY;
1252 		lpfc_set_disctmo(vport);
1253 		cmpl = lpfc_cmpl_ct_cmd_gid_ft;
1254 		rsp_size = FC_MAX_NS_RSP;
1255 		break;
1256 
1257 	case SLI_CTNS_GFF_ID:
1258 		CtReq->CommandResponse.bits.CmdRsp =
1259 			cpu_to_be16(SLI_CTNS_GFF_ID);
1260 		CtReq->un.gff.PortId = cpu_to_be32(context);
1261 		cmpl = lpfc_cmpl_ct_cmd_gff_id;
1262 		break;
1263 
1264 	case SLI_CTNS_RFT_ID:
1265 		vport->ct_flags &= ~FC_CT_RFT_ID;
1266 		CtReq->CommandResponse.bits.CmdRsp =
1267 		    cpu_to_be16(SLI_CTNS_RFT_ID);
1268 		CtReq->un.rft.PortId = cpu_to_be32(vport->fc_myDID);
1269 		CtReq->un.rft.fcpReg = 1;
1270 		cmpl = lpfc_cmpl_ct_cmd_rft_id;
1271 		break;
1272 
1273 	case SLI_CTNS_RNN_ID:
1274 		vport->ct_flags &= ~FC_CT_RNN_ID;
1275 		CtReq->CommandResponse.bits.CmdRsp =
1276 		    cpu_to_be16(SLI_CTNS_RNN_ID);
1277 		CtReq->un.rnn.PortId = cpu_to_be32(vport->fc_myDID);
1278 		memcpy(CtReq->un.rnn.wwnn,  &vport->fc_nodename,
1279 		       sizeof(struct lpfc_name));
1280 		cmpl = lpfc_cmpl_ct_cmd_rnn_id;
1281 		break;
1282 
1283 	case SLI_CTNS_RSPN_ID:
1284 		vport->ct_flags &= ~FC_CT_RSPN_ID;
1285 		CtReq->CommandResponse.bits.CmdRsp =
1286 		    cpu_to_be16(SLI_CTNS_RSPN_ID);
1287 		CtReq->un.rspn.PortId = cpu_to_be32(vport->fc_myDID);
1288 		size = sizeof(CtReq->un.rspn.symbname);
1289 		CtReq->un.rspn.len =
1290 			lpfc_vport_symbolic_port_name(vport,
1291 			CtReq->un.rspn.symbname, size);
1292 		cmpl = lpfc_cmpl_ct_cmd_rspn_id;
1293 		break;
1294 	case SLI_CTNS_RSNN_NN:
1295 		vport->ct_flags &= ~FC_CT_RSNN_NN;
1296 		CtReq->CommandResponse.bits.CmdRsp =
1297 		    cpu_to_be16(SLI_CTNS_RSNN_NN);
1298 		memcpy(CtReq->un.rsnn.wwnn, &vport->fc_nodename,
1299 		       sizeof(struct lpfc_name));
1300 		size = sizeof(CtReq->un.rsnn.symbname);
1301 		CtReq->un.rsnn.len =
1302 			lpfc_vport_symbolic_node_name(vport,
1303 			CtReq->un.rsnn.symbname, size);
1304 		cmpl = lpfc_cmpl_ct_cmd_rsnn_nn;
1305 		break;
1306 	case SLI_CTNS_DA_ID:
1307 		/* Implement DA_ID Nameserver request */
1308 		CtReq->CommandResponse.bits.CmdRsp =
1309 			cpu_to_be16(SLI_CTNS_DA_ID);
1310 		CtReq->un.da_id.port_id = cpu_to_be32(vport->fc_myDID);
1311 		cmpl = lpfc_cmpl_ct_cmd_da_id;
1312 		break;
1313 	case SLI_CTNS_RFF_ID:
1314 		vport->ct_flags &= ~FC_CT_RFF_ID;
1315 		CtReq->CommandResponse.bits.CmdRsp =
1316 		    cpu_to_be16(SLI_CTNS_RFF_ID);
1317 		CtReq->un.rff.PortId = cpu_to_be32(vport->fc_myDID);
1318 		CtReq->un.rff.fbits = FC4_FEATURE_INIT;
1319 		CtReq->un.rff.type_code = FC_TYPE_FCP;
1320 		cmpl = lpfc_cmpl_ct_cmd_rff_id;
1321 		break;
1322 	}
1323 	/* The lpfc_ct_cmd/lpfc_get_req shall increment ndlp reference count
1324 	 * to hold ndlp reference for the corresponding callback function.
1325 	 */
1326 	if (!lpfc_ct_cmd(vport, mp, bmp, ndlp, cmpl, rsp_size, retry)) {
1327 		/* On success, The cmpl function will free the buffers */
1328 		lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_CT,
1329 			"Issue CT cmd:    cmd:x%x did:x%x",
1330 			cmdcode, ndlp->nlp_DID, 0);
1331 		return 0;
1332 	}
1333 	rc=6;
1334 
1335 	/* Decrement ndlp reference count to release ndlp reference held
1336 	 * for the failed command's callback function.
1337 	 */
1338 	lpfc_nlp_put(ndlp);
1339 
1340 	lpfc_mbuf_free(phba, bmp->virt, bmp->phys);
1341 ns_cmd_free_bmp:
1342 	kfree(bmp);
1343 ns_cmd_free_mpvirt:
1344 	lpfc_mbuf_free(phba, mp->virt, mp->phys);
1345 ns_cmd_free_mp:
1346 	kfree(mp);
1347 ns_cmd_exit:
1348 	lpfc_printf_vlog(vport, KERN_ERR, LOG_DISCOVERY,
1349 			 "0266 Issue NameServer Req x%x err %d Data: x%x x%x\n",
1350 			 cmdcode, rc, vport->fc_flag, vport->fc_rscn_id_cnt);
1351 	return 1;
1352 }
1353 
1354 /**
1355  * lpfc_cmpl_ct_disc_fdmi - Handle a discovery FDMI completion
1356  * @phba: Pointer to HBA context object.
1357  * @cmdiocb: Pointer to the command IOCBQ.
1358  * @rspiocb: Pointer to the response IOCBQ.
1359  *
1360  * This function to handle the completion of a driver initiated FDMI
1361  * CT command issued during discovery.
1362  */
1363 static void
1364 lpfc_cmpl_ct_disc_fdmi(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
1365 		       struct lpfc_iocbq *rspiocb)
1366 {
1367 	struct lpfc_vport *vport = cmdiocb->vport;
1368 	struct lpfc_dmabuf *inp = cmdiocb->context1;
1369 	struct lpfc_dmabuf *outp = cmdiocb->context2;
1370 	struct lpfc_sli_ct_request *CTcmd = inp->virt;
1371 	struct lpfc_sli_ct_request *CTrsp = outp->virt;
1372 	uint16_t fdmi_cmd = CTcmd->CommandResponse.bits.CmdRsp;
1373 	uint16_t fdmi_rsp = CTrsp->CommandResponse.bits.CmdRsp;
1374 	IOCB_t *irsp = &rspiocb->iocb;
1375 	struct lpfc_nodelist *ndlp;
1376 	uint32_t latt, cmd, err;
1377 
1378 	latt = lpfc_els_chk_latt(vport);
1379 	lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_CT,
1380 		"FDMI cmpl:       status:x%x/x%x latt:%d",
1381 		irsp->ulpStatus, irsp->un.ulpWord[4], latt);
1382 
1383 	if (latt || irsp->ulpStatus) {
1384 
1385 		/* Look for a retryable error */
1386 		if (irsp->ulpStatus == IOSTAT_LOCAL_REJECT) {
1387 			switch ((irsp->un.ulpWord[4] & IOERR_PARAM_MASK)) {
1388 			case IOERR_SLI_ABORTED:
1389 			case IOERR_ABORT_IN_PROGRESS:
1390 			case IOERR_SEQUENCE_TIMEOUT:
1391 			case IOERR_ILLEGAL_FRAME:
1392 			case IOERR_NO_RESOURCES:
1393 			case IOERR_ILLEGAL_COMMAND:
1394 				cmdiocb->retry++;
1395 				if (cmdiocb->retry >= LPFC_FDMI_MAX_RETRY)
1396 					break;
1397 
1398 				/* Retry the same FDMI command */
1399 				err = lpfc_sli_issue_iocb(phba, LPFC_ELS_RING,
1400 							  cmdiocb, 0);
1401 				if (err == IOCB_ERROR)
1402 					break;
1403 				return;
1404 			default:
1405 				break;
1406 			}
1407 		}
1408 
1409 		lpfc_printf_vlog(vport, KERN_INFO, LOG_DISCOVERY,
1410 				 "0229 FDMI cmd %04x failed, latt = %d "
1411 				 "ulpStatus: x%x, rid x%x\n",
1412 				 be16_to_cpu(fdmi_cmd), latt, irsp->ulpStatus,
1413 				 irsp->un.ulpWord[4]);
1414 	}
1415 	lpfc_ct_free_iocb(phba, cmdiocb);
1416 
1417 	ndlp = lpfc_findnode_did(vport, FDMI_DID);
1418 	if (!ndlp || !NLP_CHK_NODE_ACT(ndlp))
1419 		return;
1420 
1421 	/* Check for a CT LS_RJT response */
1422 	cmd =  be16_to_cpu(fdmi_cmd);
1423 	if (fdmi_rsp == cpu_to_be16(SLI_CT_RESPONSE_FS_RJT)) {
1424 		/* FDMI rsp failed */
1425 		lpfc_printf_vlog(vport, KERN_INFO, LOG_DISCOVERY,
1426 				 "0220 FDMI cmd failed FS_RJT Data: x%x", cmd);
1427 
1428 		/* Should we fallback to FDMI-2 / FDMI-1 ? */
1429 		switch (cmd) {
1430 		case SLI_MGMT_RHBA:
1431 			if (vport->fdmi_hba_mask == LPFC_FDMI2_HBA_ATTR) {
1432 				/* Fallback to FDMI-1 */
1433 				vport->fdmi_hba_mask = LPFC_FDMI1_HBA_ATTR;
1434 				vport->fdmi_port_mask = LPFC_FDMI1_PORT_ATTR;
1435 				/* Start over */
1436 				lpfc_fdmi_cmd(vport, ndlp, SLI_MGMT_DHBA, 0);
1437 			}
1438 			return;
1439 
1440 		case SLI_MGMT_RPRT:
1441 			if (vport->fdmi_port_mask == LPFC_FDMI2_PORT_ATTR) {
1442 				/* Fallback to FDMI-1 */
1443 				vport->fdmi_port_mask = LPFC_FDMI1_PORT_ATTR;
1444 				/* Start over */
1445 				lpfc_fdmi_cmd(vport, ndlp, cmd, 0);
1446 			}
1447 			if (vport->fdmi_port_mask == LPFC_FDMI2_SMART_ATTR) {
1448 				vport->fdmi_port_mask = LPFC_FDMI2_PORT_ATTR;
1449 				/* Retry the same command */
1450 				lpfc_fdmi_cmd(vport, ndlp, cmd, 0);
1451 			}
1452 			return;
1453 
1454 		case SLI_MGMT_RPA:
1455 			if (vport->fdmi_port_mask == LPFC_FDMI2_PORT_ATTR) {
1456 				/* Fallback to FDMI-1 */
1457 				vport->fdmi_hba_mask = LPFC_FDMI1_HBA_ATTR;
1458 				vport->fdmi_port_mask = LPFC_FDMI1_PORT_ATTR;
1459 				/* Start over */
1460 				lpfc_fdmi_cmd(vport, ndlp, SLI_MGMT_DHBA, 0);
1461 			}
1462 			if (vport->fdmi_port_mask == LPFC_FDMI2_SMART_ATTR) {
1463 				vport->fdmi_port_mask = LPFC_FDMI2_PORT_ATTR;
1464 				/* Retry the same command */
1465 				lpfc_fdmi_cmd(vport, ndlp, cmd, 0);
1466 			}
1467 			return;
1468 		}
1469 	}
1470 
1471 	/*
1472 	 * On success, need to cycle thru FDMI registration for discovery
1473 	 * DHBA -> DPRT -> RHBA -> RPA  (physical port)
1474 	 * DPRT -> RPRT (vports)
1475 	 */
1476 	switch (cmd) {
1477 	case SLI_MGMT_RHBA:
1478 		lpfc_fdmi_cmd(vport, ndlp, SLI_MGMT_RPA, 0);
1479 		break;
1480 
1481 	case SLI_MGMT_DHBA:
1482 		lpfc_fdmi_cmd(vport, ndlp, SLI_MGMT_DPRT, 0);
1483 		break;
1484 
1485 	case SLI_MGMT_DPRT:
1486 		if (vport->port_type == LPFC_PHYSICAL_PORT)
1487 			lpfc_fdmi_cmd(vport, ndlp, SLI_MGMT_RHBA, 0);
1488 		else
1489 			lpfc_fdmi_cmd(vport, ndlp, SLI_MGMT_RPRT, 0);
1490 		break;
1491 	}
1492 	return;
1493 }
1494 
1495 
1496 /**
1497  * lpfc_fdmi_num_disc_check - Check how many mapped NPorts we are connected to
1498  * @vport: pointer to a host virtual N_Port data structure.
1499  *
1500  * Called from hbeat timeout routine to check if the number of discovered
1501  * ports has changed. If so, re-register thar port Attribute.
1502  */
1503 void
1504 lpfc_fdmi_num_disc_check(struct lpfc_vport *vport)
1505 {
1506 	struct lpfc_hba *phba = vport->phba;
1507 	struct lpfc_nodelist *ndlp;
1508 	uint16_t cnt;
1509 
1510 	if (!lpfc_is_link_up(phba))
1511 		return;
1512 
1513 	if (!(vport->fdmi_port_mask & LPFC_FDMI_PORT_ATTR_num_disc))
1514 		return;
1515 
1516 	cnt = lpfc_find_map_node(vport);
1517 	if (cnt == vport->fdmi_num_disc)
1518 		return;
1519 
1520 	ndlp = lpfc_findnode_did(vport, FDMI_DID);
1521 	if (!ndlp || !NLP_CHK_NODE_ACT(ndlp))
1522 		return;
1523 
1524 	if (vport->port_type == LPFC_PHYSICAL_PORT) {
1525 		lpfc_fdmi_cmd(vport, ndlp, SLI_MGMT_RPA,
1526 			      LPFC_FDMI_PORT_ATTR_num_disc);
1527 	} else {
1528 		lpfc_fdmi_cmd(vport, ndlp, SLI_MGMT_RPRT,
1529 			      LPFC_FDMI_PORT_ATTR_num_disc);
1530 	}
1531 }
1532 
1533 /* Routines for all individual HBA attributes */
1534 int
1535 lpfc_fdmi_hba_attr_wwnn(struct lpfc_vport *vport, struct lpfc_fdmi_attr_def *ad)
1536 {
1537 	struct lpfc_fdmi_attr_entry *ae;
1538 	uint32_t size;
1539 
1540 	ae = (struct lpfc_fdmi_attr_entry *)&ad->AttrValue;
1541 	memset(ae, 0, sizeof(struct lpfc_name));
1542 
1543 	memcpy(&ae->un.AttrWWN, &vport->fc_sparam.nodeName,
1544 	       sizeof(struct lpfc_name));
1545 	size = FOURBYTES + sizeof(struct lpfc_name);
1546 	ad->AttrLen = cpu_to_be16(size);
1547 	ad->AttrType = cpu_to_be16(RHBA_NODENAME);
1548 	return size;
1549 }
1550 int
1551 lpfc_fdmi_hba_attr_manufacturer(struct lpfc_vport *vport,
1552 				struct lpfc_fdmi_attr_def *ad)
1553 {
1554 	struct lpfc_fdmi_attr_entry *ae;
1555 	uint32_t len, size;
1556 
1557 	ae = (struct lpfc_fdmi_attr_entry *)&ad->AttrValue;
1558 	memset(ae, 0, 256);
1559 
1560 	strncpy(ae->un.AttrString,
1561 		"Emulex Corporation",
1562 		       sizeof(ae->un.AttrString));
1563 	len = strnlen(ae->un.AttrString,
1564 			  sizeof(ae->un.AttrString));
1565 	len += (len & 3) ? (4 - (len & 3)) : 4;
1566 	size = FOURBYTES + len;
1567 	ad->AttrLen = cpu_to_be16(size);
1568 	ad->AttrType = cpu_to_be16(RHBA_MANUFACTURER);
1569 	return size;
1570 }
1571 
1572 int
1573 lpfc_fdmi_hba_attr_sn(struct lpfc_vport *vport, struct lpfc_fdmi_attr_def *ad)
1574 {
1575 	struct lpfc_hba *phba = vport->phba;
1576 	struct lpfc_fdmi_attr_entry *ae;
1577 	uint32_t len, size;
1578 
1579 	ae = (struct lpfc_fdmi_attr_entry *)&ad->AttrValue;
1580 	memset(ae, 0, 256);
1581 
1582 	strncpy(ae->un.AttrString, phba->SerialNumber,
1583 		sizeof(ae->un.AttrString));
1584 	len = strnlen(ae->un.AttrString,
1585 			  sizeof(ae->un.AttrString));
1586 	len += (len & 3) ? (4 - (len & 3)) : 4;
1587 	size = FOURBYTES + len;
1588 	ad->AttrLen = cpu_to_be16(size);
1589 	ad->AttrType = cpu_to_be16(RHBA_SERIAL_NUMBER);
1590 	return size;
1591 }
1592 
1593 int
1594 lpfc_fdmi_hba_attr_model(struct lpfc_vport *vport,
1595 			 struct lpfc_fdmi_attr_def *ad)
1596 {
1597 	struct lpfc_hba *phba = vport->phba;
1598 	struct lpfc_fdmi_attr_entry *ae;
1599 	uint32_t len, size;
1600 
1601 	ae = (struct lpfc_fdmi_attr_entry *)&ad->AttrValue;
1602 	memset(ae, 0, 256);
1603 
1604 	strncpy(ae->un.AttrString, phba->ModelName,
1605 		sizeof(ae->un.AttrString));
1606 	len = strnlen(ae->un.AttrString, sizeof(ae->un.AttrString));
1607 	len += (len & 3) ? (4 - (len & 3)) : 4;
1608 	size = FOURBYTES + len;
1609 	ad->AttrLen = cpu_to_be16(size);
1610 	ad->AttrType = cpu_to_be16(RHBA_MODEL);
1611 	return size;
1612 }
1613 
1614 int
1615 lpfc_fdmi_hba_attr_description(struct lpfc_vport *vport,
1616 			       struct lpfc_fdmi_attr_def *ad)
1617 {
1618 	struct lpfc_hba *phba = vport->phba;
1619 	struct lpfc_fdmi_attr_entry *ae;
1620 	uint32_t len, size;
1621 
1622 	ae = (struct lpfc_fdmi_attr_entry *)&ad->AttrValue;
1623 	memset(ae, 0, 256);
1624 
1625 	strncpy(ae->un.AttrString, phba->ModelDesc,
1626 		sizeof(ae->un.AttrString));
1627 	len = strnlen(ae->un.AttrString,
1628 				  sizeof(ae->un.AttrString));
1629 	len += (len & 3) ? (4 - (len & 3)) : 4;
1630 	size = FOURBYTES + len;
1631 	ad->AttrLen = cpu_to_be16(size);
1632 	ad->AttrType = cpu_to_be16(RHBA_MODEL_DESCRIPTION);
1633 	return size;
1634 }
1635 
1636 int
1637 lpfc_fdmi_hba_attr_hdw_ver(struct lpfc_vport *vport,
1638 			   struct lpfc_fdmi_attr_def *ad)
1639 {
1640 	struct lpfc_hba *phba = vport->phba;
1641 	lpfc_vpd_t *vp = &phba->vpd;
1642 	struct lpfc_fdmi_attr_entry *ae;
1643 	uint32_t i, j, incr, size;
1644 
1645 	ae = (struct lpfc_fdmi_attr_entry *)&ad->AttrValue;
1646 	memset(ae, 0, 256);
1647 
1648 	/* Convert JEDEC ID to ascii for hardware version */
1649 	incr = vp->rev.biuRev;
1650 	for (i = 0; i < 8; i++) {
1651 		j = (incr & 0xf);
1652 		if (j <= 9)
1653 			ae->un.AttrString[7 - i] =
1654 			    (char)((uint8_t) 0x30 +
1655 				   (uint8_t) j);
1656 		else
1657 			ae->un.AttrString[7 - i] =
1658 			    (char)((uint8_t) 0x61 +
1659 				   (uint8_t) (j - 10));
1660 		incr = (incr >> 4);
1661 	}
1662 	size = FOURBYTES + 8;
1663 	ad->AttrLen = cpu_to_be16(size);
1664 	ad->AttrType = cpu_to_be16(RHBA_HARDWARE_VERSION);
1665 	return size;
1666 }
1667 
1668 int
1669 lpfc_fdmi_hba_attr_drvr_ver(struct lpfc_vport *vport,
1670 			    struct lpfc_fdmi_attr_def *ad)
1671 {
1672 	struct lpfc_fdmi_attr_entry *ae;
1673 	uint32_t len, size;
1674 
1675 	ae = (struct lpfc_fdmi_attr_entry *)&ad->AttrValue;
1676 	memset(ae, 0, 256);
1677 
1678 	strncpy(ae->un.AttrString, lpfc_release_version,
1679 		sizeof(ae->un.AttrString));
1680 	len = strnlen(ae->un.AttrString,
1681 			  sizeof(ae->un.AttrString));
1682 	len += (len & 3) ? (4 - (len & 3)) : 4;
1683 	size = FOURBYTES + len;
1684 	ad->AttrLen = cpu_to_be16(size);
1685 	ad->AttrType = cpu_to_be16(RHBA_DRIVER_VERSION);
1686 	return size;
1687 }
1688 
1689 int
1690 lpfc_fdmi_hba_attr_rom_ver(struct lpfc_vport *vport,
1691 			   struct lpfc_fdmi_attr_def *ad)
1692 {
1693 	struct lpfc_hba *phba = vport->phba;
1694 	struct lpfc_fdmi_attr_entry *ae;
1695 	uint32_t len, size;
1696 
1697 	ae = (struct lpfc_fdmi_attr_entry *)&ad->AttrValue;
1698 	memset(ae, 0, 256);
1699 
1700 	if (phba->sli_rev == LPFC_SLI_REV4)
1701 		lpfc_decode_firmware_rev(phba, ae->un.AttrString, 1);
1702 	else
1703 		strncpy(ae->un.AttrString, phba->OptionROMVersion,
1704 			sizeof(ae->un.AttrString));
1705 	len = strnlen(ae->un.AttrString,
1706 			  sizeof(ae->un.AttrString));
1707 	len += (len & 3) ? (4 - (len & 3)) : 4;
1708 	size = FOURBYTES + len;
1709 	ad->AttrLen = cpu_to_be16(size);
1710 	ad->AttrType = cpu_to_be16(RHBA_OPTION_ROM_VERSION);
1711 	return size;
1712 }
1713 
1714 int
1715 lpfc_fdmi_hba_attr_fmw_ver(struct lpfc_vport *vport,
1716 			   struct lpfc_fdmi_attr_def *ad)
1717 {
1718 	struct lpfc_hba *phba = vport->phba;
1719 	struct lpfc_fdmi_attr_entry *ae;
1720 	uint32_t len, size;
1721 
1722 	ae = (struct lpfc_fdmi_attr_entry *)&ad->AttrValue;
1723 	memset(ae, 0, 256);
1724 
1725 	lpfc_decode_firmware_rev(phba, ae->un.AttrString, 1);
1726 	len = strnlen(ae->un.AttrString,
1727 			  sizeof(ae->un.AttrString));
1728 	len += (len & 3) ? (4 - (len & 3)) : 4;
1729 	size = FOURBYTES + len;
1730 	ad->AttrLen = cpu_to_be16(size);
1731 	ad->AttrType = cpu_to_be16(RHBA_FIRMWARE_VERSION);
1732 	return size;
1733 }
1734 
1735 int
1736 lpfc_fdmi_hba_attr_os_ver(struct lpfc_vport *vport,
1737 			  struct lpfc_fdmi_attr_def *ad)
1738 {
1739 	struct lpfc_fdmi_attr_entry *ae;
1740 	uint32_t len, size;
1741 
1742 	ae = (struct lpfc_fdmi_attr_entry *)&ad->AttrValue;
1743 	memset(ae, 0, 256);
1744 
1745 	snprintf(ae->un.AttrString, sizeof(ae->un.AttrString), "%s %s %s",
1746 		 init_utsname()->sysname,
1747 		 init_utsname()->release,
1748 		 init_utsname()->version);
1749 
1750 	len = strnlen(ae->un.AttrString, sizeof(ae->un.AttrString));
1751 	len += (len & 3) ? (4 - (len & 3)) : 4;
1752 	size = FOURBYTES + len;
1753 	ad->AttrLen = cpu_to_be16(size);
1754 	ad->AttrType = cpu_to_be16(RHBA_OS_NAME_VERSION);
1755 	return size;
1756 }
1757 
1758 int
1759 lpfc_fdmi_hba_attr_ct_len(struct lpfc_vport *vport,
1760 			  struct lpfc_fdmi_attr_def *ad)
1761 {
1762 	struct lpfc_fdmi_attr_entry *ae;
1763 	uint32_t size;
1764 
1765 	ae = (struct lpfc_fdmi_attr_entry *)&ad->AttrValue;
1766 
1767 	ae->un.AttrInt =  cpu_to_be32(LPFC_MAX_CT_SIZE);
1768 	size = FOURBYTES + sizeof(uint32_t);
1769 	ad->AttrLen = cpu_to_be16(size);
1770 	ad->AttrType = cpu_to_be16(RHBA_MAX_CT_PAYLOAD_LEN);
1771 	return size;
1772 }
1773 
1774 int
1775 lpfc_fdmi_hba_attr_symbolic_name(struct lpfc_vport *vport,
1776 				 struct lpfc_fdmi_attr_def *ad)
1777 {
1778 	struct lpfc_fdmi_attr_entry *ae;
1779 	uint32_t len, size;
1780 
1781 	ae = (struct lpfc_fdmi_attr_entry *)&ad->AttrValue;
1782 	memset(ae, 0, 256);
1783 
1784 	len = lpfc_vport_symbolic_node_name(vport,
1785 				ae->un.AttrString, 256);
1786 	len += (len & 3) ? (4 - (len & 3)) : 4;
1787 	size = FOURBYTES + len;
1788 	ad->AttrLen = cpu_to_be16(size);
1789 	ad->AttrType = cpu_to_be16(RHBA_SYM_NODENAME);
1790 	return size;
1791 }
1792 
1793 int
1794 lpfc_fdmi_hba_attr_vendor_info(struct lpfc_vport *vport,
1795 			       struct lpfc_fdmi_attr_def *ad)
1796 {
1797 	struct lpfc_fdmi_attr_entry *ae;
1798 	uint32_t size;
1799 
1800 	ae = (struct lpfc_fdmi_attr_entry *)&ad->AttrValue;
1801 
1802 	/* Nothing is defined for this currently */
1803 	ae->un.AttrInt =  cpu_to_be32(0);
1804 	size = FOURBYTES + sizeof(uint32_t);
1805 	ad->AttrLen = cpu_to_be16(size);
1806 	ad->AttrType = cpu_to_be16(RHBA_VENDOR_INFO);
1807 	return size;
1808 }
1809 
1810 int
1811 lpfc_fdmi_hba_attr_num_ports(struct lpfc_vport *vport,
1812 			     struct lpfc_fdmi_attr_def *ad)
1813 {
1814 	struct lpfc_fdmi_attr_entry *ae;
1815 	uint32_t size;
1816 
1817 	ae = (struct lpfc_fdmi_attr_entry *)&ad->AttrValue;
1818 
1819 	/* Each driver instance corresponds to a single port */
1820 	ae->un.AttrInt =  cpu_to_be32(1);
1821 	size = FOURBYTES + sizeof(uint32_t);
1822 	ad->AttrLen = cpu_to_be16(size);
1823 	ad->AttrType = cpu_to_be16(RHBA_NUM_PORTS);
1824 	return size;
1825 }
1826 
1827 int
1828 lpfc_fdmi_hba_attr_fabric_wwnn(struct lpfc_vport *vport,
1829 			       struct lpfc_fdmi_attr_def *ad)
1830 {
1831 	struct lpfc_fdmi_attr_entry *ae;
1832 	uint32_t size;
1833 
1834 	ae = (struct lpfc_fdmi_attr_entry *)&ad->AttrValue;
1835 	memset(ae, 0, sizeof(struct lpfc_name));
1836 
1837 	memcpy(&ae->un.AttrWWN, &vport->fabric_nodename,
1838 	       sizeof(struct lpfc_name));
1839 	size = FOURBYTES + sizeof(struct lpfc_name);
1840 	ad->AttrLen = cpu_to_be16(size);
1841 	ad->AttrType = cpu_to_be16(RHBA_FABRIC_WWNN);
1842 	return size;
1843 }
1844 
1845 int
1846 lpfc_fdmi_hba_attr_bios_ver(struct lpfc_vport *vport,
1847 			    struct lpfc_fdmi_attr_def *ad)
1848 {
1849 	struct lpfc_hba *phba = vport->phba;
1850 	struct lpfc_fdmi_attr_entry *ae;
1851 	uint32_t len, size;
1852 
1853 	ae = (struct lpfc_fdmi_attr_entry *)&ad->AttrValue;
1854 	memset(ae, 0, 256);
1855 
1856 	lpfc_decode_firmware_rev(phba, ae->un.AttrString, 1);
1857 	len = strnlen(ae->un.AttrString,
1858 			  sizeof(ae->un.AttrString));
1859 	len += (len & 3) ? (4 - (len & 3)) : 4;
1860 	size = FOURBYTES + len;
1861 	ad->AttrLen = cpu_to_be16(size);
1862 	ad->AttrType = cpu_to_be16(RHBA_BIOS_VERSION);
1863 	return size;
1864 }
1865 
1866 int
1867 lpfc_fdmi_hba_attr_bios_state(struct lpfc_vport *vport,
1868 			      struct lpfc_fdmi_attr_def *ad)
1869 {
1870 	struct lpfc_fdmi_attr_entry *ae;
1871 	uint32_t size;
1872 
1873 	ae = (struct lpfc_fdmi_attr_entry *)&ad->AttrValue;
1874 
1875 	/* Driver doesn't have access to this information */
1876 	ae->un.AttrInt =  cpu_to_be32(0);
1877 	size = FOURBYTES + sizeof(uint32_t);
1878 	ad->AttrLen = cpu_to_be16(size);
1879 	ad->AttrType = cpu_to_be16(RHBA_BIOS_STATE);
1880 	return size;
1881 }
1882 
1883 int
1884 lpfc_fdmi_hba_attr_vendor_id(struct lpfc_vport *vport,
1885 			     struct lpfc_fdmi_attr_def *ad)
1886 {
1887 	struct lpfc_fdmi_attr_entry *ae;
1888 	uint32_t len, size;
1889 
1890 	ae = (struct lpfc_fdmi_attr_entry *)&ad->AttrValue;
1891 	memset(ae, 0, 256);
1892 
1893 	strncpy(ae->un.AttrString, "EMULEX",
1894 		sizeof(ae->un.AttrString));
1895 	len = strnlen(ae->un.AttrString,
1896 			  sizeof(ae->un.AttrString));
1897 	len += (len & 3) ? (4 - (len & 3)) : 4;
1898 	size = FOURBYTES + len;
1899 	ad->AttrLen = cpu_to_be16(size);
1900 	ad->AttrType = cpu_to_be16(RHBA_VENDOR_ID);
1901 	return size;
1902 }
1903 
1904 /* Routines for all individual PORT attributes */
1905 int
1906 lpfc_fdmi_port_attr_fc4type(struct lpfc_vport *vport,
1907 			    struct lpfc_fdmi_attr_def *ad)
1908 {
1909 	struct lpfc_fdmi_attr_entry *ae;
1910 	uint32_t size;
1911 
1912 	ae = (struct lpfc_fdmi_attr_entry *)&ad->AttrValue;
1913 	memset(ae, 0, 32);
1914 
1915 	ae->un.AttrTypes[3] = 0x02; /* Type 1 - ELS */
1916 	ae->un.AttrTypes[2] = 0x01; /* Type 8 - FCP */
1917 	ae->un.AttrTypes[7] = 0x01; /* Type 32 - CT */
1918 	size = FOURBYTES + 32;
1919 	ad->AttrLen = cpu_to_be16(size);
1920 	ad->AttrType = cpu_to_be16(RPRT_SUPPORTED_FC4_TYPES);
1921 	return size;
1922 }
1923 
1924 int
1925 lpfc_fdmi_port_attr_support_speed(struct lpfc_vport *vport,
1926 				  struct lpfc_fdmi_attr_def *ad)
1927 {
1928 	struct lpfc_hba   *phba = vport->phba;
1929 	struct lpfc_fdmi_attr_entry *ae;
1930 	uint32_t size;
1931 
1932 	ae = (struct lpfc_fdmi_attr_entry *)&ad->AttrValue;
1933 
1934 	ae->un.AttrInt = 0;
1935 	if (!(phba->hba_flag & HBA_FCOE_MODE)) {
1936 		if (phba->lmt & LMT_32Gb)
1937 			ae->un.AttrInt |= HBA_PORTSPEED_32GFC;
1938 		if (phba->lmt & LMT_16Gb)
1939 			ae->un.AttrInt |= HBA_PORTSPEED_16GFC;
1940 		if (phba->lmt & LMT_10Gb)
1941 			ae->un.AttrInt |= HBA_PORTSPEED_10GFC;
1942 		if (phba->lmt & LMT_8Gb)
1943 			ae->un.AttrInt |= HBA_PORTSPEED_8GFC;
1944 		if (phba->lmt & LMT_4Gb)
1945 			ae->un.AttrInt |= HBA_PORTSPEED_4GFC;
1946 		if (phba->lmt & LMT_2Gb)
1947 			ae->un.AttrInt |= HBA_PORTSPEED_2GFC;
1948 		if (phba->lmt & LMT_1Gb)
1949 			ae->un.AttrInt |= HBA_PORTSPEED_1GFC;
1950 	} else {
1951 		/* FCoE links support only one speed */
1952 		switch (phba->fc_linkspeed) {
1953 		case LPFC_ASYNC_LINK_SPEED_10GBPS:
1954 			ae->un.AttrInt = HBA_PORTSPEED_10GE;
1955 			break;
1956 		case LPFC_ASYNC_LINK_SPEED_25GBPS:
1957 			ae->un.AttrInt = HBA_PORTSPEED_25GE;
1958 			break;
1959 		case LPFC_ASYNC_LINK_SPEED_40GBPS:
1960 			ae->un.AttrInt = HBA_PORTSPEED_40GE;
1961 			break;
1962 		case LPFC_ASYNC_LINK_SPEED_100GBPS:
1963 			ae->un.AttrInt = HBA_PORTSPEED_100GE;
1964 			break;
1965 		}
1966 	}
1967 	ae->un.AttrInt = cpu_to_be32(ae->un.AttrInt);
1968 	size = FOURBYTES + sizeof(uint32_t);
1969 	ad->AttrLen = cpu_to_be16(size);
1970 	ad->AttrType = cpu_to_be16(RPRT_SUPPORTED_SPEED);
1971 	return size;
1972 }
1973 
1974 int
1975 lpfc_fdmi_port_attr_speed(struct lpfc_vport *vport,
1976 			  struct lpfc_fdmi_attr_def *ad)
1977 {
1978 	struct lpfc_hba   *phba = vport->phba;
1979 	struct lpfc_fdmi_attr_entry *ae;
1980 	uint32_t size;
1981 
1982 	ae = (struct lpfc_fdmi_attr_entry *)&ad->AttrValue;
1983 
1984 	if (!(phba->hba_flag & HBA_FCOE_MODE)) {
1985 		switch (phba->fc_linkspeed) {
1986 		case LPFC_LINK_SPEED_1GHZ:
1987 			ae->un.AttrInt = HBA_PORTSPEED_1GFC;
1988 			break;
1989 		case LPFC_LINK_SPEED_2GHZ:
1990 			ae->un.AttrInt = HBA_PORTSPEED_2GFC;
1991 			break;
1992 		case LPFC_LINK_SPEED_4GHZ:
1993 			ae->un.AttrInt = HBA_PORTSPEED_4GFC;
1994 			break;
1995 		case LPFC_LINK_SPEED_8GHZ:
1996 			ae->un.AttrInt = HBA_PORTSPEED_8GFC;
1997 			break;
1998 		case LPFC_LINK_SPEED_10GHZ:
1999 			ae->un.AttrInt = HBA_PORTSPEED_10GFC;
2000 			break;
2001 		case LPFC_LINK_SPEED_16GHZ:
2002 			ae->un.AttrInt = HBA_PORTSPEED_16GFC;
2003 			break;
2004 		case LPFC_LINK_SPEED_32GHZ:
2005 			ae->un.AttrInt = HBA_PORTSPEED_32GFC;
2006 			break;
2007 		default:
2008 			ae->un.AttrInt = HBA_PORTSPEED_UNKNOWN;
2009 			break;
2010 		}
2011 	} else {
2012 		switch (phba->fc_linkspeed) {
2013 		case LPFC_ASYNC_LINK_SPEED_10GBPS:
2014 			ae->un.AttrInt = HBA_PORTSPEED_10GE;
2015 			break;
2016 		case LPFC_ASYNC_LINK_SPEED_25GBPS:
2017 			ae->un.AttrInt = HBA_PORTSPEED_25GE;
2018 			break;
2019 		case LPFC_ASYNC_LINK_SPEED_40GBPS:
2020 			ae->un.AttrInt = HBA_PORTSPEED_40GE;
2021 			break;
2022 		case LPFC_ASYNC_LINK_SPEED_100GBPS:
2023 			ae->un.AttrInt = HBA_PORTSPEED_100GE;
2024 			break;
2025 		default:
2026 			ae->un.AttrInt = HBA_PORTSPEED_UNKNOWN;
2027 			break;
2028 		}
2029 	}
2030 
2031 	ae->un.AttrInt = cpu_to_be32(ae->un.AttrInt);
2032 	size = FOURBYTES + sizeof(uint32_t);
2033 	ad->AttrLen = cpu_to_be16(size);
2034 	ad->AttrType = cpu_to_be16(RPRT_PORT_SPEED);
2035 	return size;
2036 }
2037 
2038 int
2039 lpfc_fdmi_port_attr_max_frame(struct lpfc_vport *vport,
2040 			      struct lpfc_fdmi_attr_def *ad)
2041 {
2042 	struct serv_parm *hsp;
2043 	struct lpfc_fdmi_attr_entry *ae;
2044 	uint32_t size;
2045 
2046 	ae = (struct lpfc_fdmi_attr_entry *)&ad->AttrValue;
2047 
2048 	hsp = (struct serv_parm *)&vport->fc_sparam;
2049 	ae->un.AttrInt = (((uint32_t) hsp->cmn.bbRcvSizeMsb) << 8) |
2050 			  (uint32_t) hsp->cmn.bbRcvSizeLsb;
2051 	ae->un.AttrInt = cpu_to_be32(ae->un.AttrInt);
2052 	size = FOURBYTES + sizeof(uint32_t);
2053 	ad->AttrLen = cpu_to_be16(size);
2054 	ad->AttrType = cpu_to_be16(RPRT_MAX_FRAME_SIZE);
2055 	return size;
2056 }
2057 
2058 int
2059 lpfc_fdmi_port_attr_os_devname(struct lpfc_vport *vport,
2060 			       struct lpfc_fdmi_attr_def *ad)
2061 {
2062 	struct Scsi_Host *shost = lpfc_shost_from_vport(vport);
2063 	struct lpfc_fdmi_attr_entry *ae;
2064 	uint32_t len, size;
2065 
2066 	ae = (struct lpfc_fdmi_attr_entry *)&ad->AttrValue;
2067 	memset(ae, 0, 256);
2068 
2069 	snprintf(ae->un.AttrString, sizeof(ae->un.AttrString),
2070 		 "/sys/class/scsi_host/host%d", shost->host_no);
2071 	len = strnlen((char *)ae->un.AttrString,
2072 			  sizeof(ae->un.AttrString));
2073 	len += (len & 3) ? (4 - (len & 3)) : 4;
2074 	size = FOURBYTES + len;
2075 	ad->AttrLen = cpu_to_be16(size);
2076 	ad->AttrType = cpu_to_be16(RPRT_OS_DEVICE_NAME);
2077 	return size;
2078 }
2079 
2080 int
2081 lpfc_fdmi_port_attr_host_name(struct lpfc_vport *vport,
2082 			      struct lpfc_fdmi_attr_def *ad)
2083 {
2084 	struct lpfc_fdmi_attr_entry *ae;
2085 	uint32_t len, size;
2086 
2087 	ae = (struct lpfc_fdmi_attr_entry *)&ad->AttrValue;
2088 	memset(ae, 0, 256);
2089 
2090 	snprintf(ae->un.AttrString, sizeof(ae->un.AttrString), "%s",
2091 		 init_utsname()->nodename);
2092 
2093 	len = strnlen(ae->un.AttrString, sizeof(ae->un.AttrString));
2094 	len += (len & 3) ? (4 - (len & 3)) : 4;
2095 	size = FOURBYTES + len;
2096 	ad->AttrLen = cpu_to_be16(size);
2097 	ad->AttrType = cpu_to_be16(RPRT_HOST_NAME);
2098 	return size;
2099 }
2100 
2101 int
2102 lpfc_fdmi_port_attr_wwnn(struct lpfc_vport *vport,
2103 			 struct lpfc_fdmi_attr_def *ad)
2104 {
2105 	struct lpfc_fdmi_attr_entry *ae;
2106 	uint32_t size;
2107 
2108 	ae = (struct lpfc_fdmi_attr_entry *)&ad->AttrValue;
2109 	memset(ae, 0,  sizeof(struct lpfc_name));
2110 
2111 	memcpy(&ae->un.AttrWWN, &vport->fc_sparam.nodeName,
2112 	       sizeof(struct lpfc_name));
2113 	size = FOURBYTES + sizeof(struct lpfc_name);
2114 	ad->AttrLen = cpu_to_be16(size);
2115 	ad->AttrType = cpu_to_be16(RPRT_NODENAME);
2116 	return size;
2117 }
2118 
2119 int
2120 lpfc_fdmi_port_attr_wwpn(struct lpfc_vport *vport,
2121 			 struct lpfc_fdmi_attr_def *ad)
2122 {
2123 	struct lpfc_fdmi_attr_entry *ae;
2124 	uint32_t size;
2125 
2126 	ae = (struct lpfc_fdmi_attr_entry *)&ad->AttrValue;
2127 	memset(ae, 0,  sizeof(struct lpfc_name));
2128 
2129 	memcpy(&ae->un.AttrWWN, &vport->fc_sparam.portName,
2130 	       sizeof(struct lpfc_name));
2131 	size = FOURBYTES + sizeof(struct lpfc_name);
2132 	ad->AttrLen = cpu_to_be16(size);
2133 	ad->AttrType = cpu_to_be16(RPRT_PORTNAME);
2134 	return size;
2135 }
2136 
2137 int
2138 lpfc_fdmi_port_attr_symbolic_name(struct lpfc_vport *vport,
2139 				  struct lpfc_fdmi_attr_def *ad)
2140 {
2141 	struct lpfc_fdmi_attr_entry *ae;
2142 	uint32_t len, size;
2143 
2144 	ae = (struct lpfc_fdmi_attr_entry *)&ad->AttrValue;
2145 	memset(ae, 0, 256);
2146 
2147 	len = lpfc_vport_symbolic_port_name(vport, ae->un.AttrString, 256);
2148 	len += (len & 3) ? (4 - (len & 3)) : 4;
2149 	size = FOURBYTES + len;
2150 	ad->AttrLen = cpu_to_be16(size);
2151 	ad->AttrType = cpu_to_be16(RPRT_SYM_PORTNAME);
2152 	return size;
2153 }
2154 
2155 int
2156 lpfc_fdmi_port_attr_port_type(struct lpfc_vport *vport,
2157 			      struct lpfc_fdmi_attr_def *ad)
2158 {
2159 	struct lpfc_hba *phba = vport->phba;
2160 	struct lpfc_fdmi_attr_entry *ae;
2161 	uint32_t size;
2162 
2163 	ae = (struct lpfc_fdmi_attr_entry *)&ad->AttrValue;
2164 	if (phba->fc_topology == LPFC_TOPOLOGY_LOOP)
2165 		ae->un.AttrInt =  cpu_to_be32(LPFC_FDMI_PORTTYPE_NLPORT);
2166 	else
2167 		ae->un.AttrInt =  cpu_to_be32(LPFC_FDMI_PORTTYPE_NPORT);
2168 	size = FOURBYTES + sizeof(uint32_t);
2169 	ad->AttrLen = cpu_to_be16(size);
2170 	ad->AttrType = cpu_to_be16(RPRT_PORT_TYPE);
2171 	return size;
2172 }
2173 
2174 int
2175 lpfc_fdmi_port_attr_class(struct lpfc_vport *vport,
2176 			  struct lpfc_fdmi_attr_def *ad)
2177 {
2178 	struct lpfc_fdmi_attr_entry *ae;
2179 	uint32_t size;
2180 
2181 	ae = (struct lpfc_fdmi_attr_entry *)&ad->AttrValue;
2182 	ae->un.AttrInt = cpu_to_be32(FC_COS_CLASS2 | FC_COS_CLASS3);
2183 	size = FOURBYTES + sizeof(uint32_t);
2184 	ad->AttrLen = cpu_to_be16(size);
2185 	ad->AttrType = cpu_to_be16(RPRT_SUPPORTED_CLASS);
2186 	return size;
2187 }
2188 
2189 int
2190 lpfc_fdmi_port_attr_fabric_wwpn(struct lpfc_vport *vport,
2191 				struct lpfc_fdmi_attr_def *ad)
2192 {
2193 	struct lpfc_fdmi_attr_entry *ae;
2194 	uint32_t size;
2195 
2196 	ae = (struct lpfc_fdmi_attr_entry *)&ad->AttrValue;
2197 	memset(ae, 0,  sizeof(struct lpfc_name));
2198 
2199 	memcpy(&ae->un.AttrWWN, &vport->fabric_portname,
2200 	       sizeof(struct lpfc_name));
2201 	size = FOURBYTES + sizeof(struct lpfc_name);
2202 	ad->AttrLen = cpu_to_be16(size);
2203 	ad->AttrType = cpu_to_be16(RPRT_FABRICNAME);
2204 	return size;
2205 }
2206 
2207 int
2208 lpfc_fdmi_port_attr_active_fc4type(struct lpfc_vport *vport,
2209 				   struct lpfc_fdmi_attr_def *ad)
2210 {
2211 	struct lpfc_fdmi_attr_entry *ae;
2212 	uint32_t size;
2213 
2214 	ae = (struct lpfc_fdmi_attr_entry *)&ad->AttrValue;
2215 	memset(ae, 0, 32);
2216 
2217 	ae->un.AttrTypes[3] = 0x02; /* Type 1 - ELS */
2218 	ae->un.AttrTypes[2] = 0x01; /* Type 8 - FCP */
2219 	ae->un.AttrTypes[7] = 0x01; /* Type 32 - CT */
2220 	size = FOURBYTES + 32;
2221 	ad->AttrLen = cpu_to_be16(size);
2222 	ad->AttrType = cpu_to_be16(RPRT_ACTIVE_FC4_TYPES);
2223 	return size;
2224 }
2225 
2226 int
2227 lpfc_fdmi_port_attr_port_state(struct lpfc_vport *vport,
2228 			       struct lpfc_fdmi_attr_def *ad)
2229 {
2230 	struct lpfc_fdmi_attr_entry *ae;
2231 	uint32_t size;
2232 
2233 	ae = (struct lpfc_fdmi_attr_entry *)&ad->AttrValue;
2234 	/* Link Up - operational */
2235 	ae->un.AttrInt =  cpu_to_be32(LPFC_FDMI_PORTSTATE_ONLINE);
2236 	size = FOURBYTES + sizeof(uint32_t);
2237 	ad->AttrLen = cpu_to_be16(size);
2238 	ad->AttrType = cpu_to_be16(RPRT_PORT_STATE);
2239 	return size;
2240 }
2241 
2242 int
2243 lpfc_fdmi_port_attr_num_disc(struct lpfc_vport *vport,
2244 			     struct lpfc_fdmi_attr_def *ad)
2245 {
2246 	struct lpfc_fdmi_attr_entry *ae;
2247 	uint32_t size;
2248 
2249 	ae = (struct lpfc_fdmi_attr_entry *)&ad->AttrValue;
2250 	vport->fdmi_num_disc = lpfc_find_map_node(vport);
2251 	ae->un.AttrInt = cpu_to_be32(vport->fdmi_num_disc);
2252 	size = FOURBYTES + sizeof(uint32_t);
2253 	ad->AttrLen = cpu_to_be16(size);
2254 	ad->AttrType = cpu_to_be16(RPRT_DISC_PORT);
2255 	return size;
2256 }
2257 
2258 int
2259 lpfc_fdmi_port_attr_nportid(struct lpfc_vport *vport,
2260 			    struct lpfc_fdmi_attr_def *ad)
2261 {
2262 	struct lpfc_fdmi_attr_entry *ae;
2263 	uint32_t size;
2264 
2265 	ae = (struct lpfc_fdmi_attr_entry *)&ad->AttrValue;
2266 	ae->un.AttrInt =  cpu_to_be32(vport->fc_myDID);
2267 	size = FOURBYTES + sizeof(uint32_t);
2268 	ad->AttrLen = cpu_to_be16(size);
2269 	ad->AttrType = cpu_to_be16(RPRT_PORT_ID);
2270 	return size;
2271 }
2272 
2273 int
2274 lpfc_fdmi_smart_attr_service(struct lpfc_vport *vport,
2275 			     struct lpfc_fdmi_attr_def *ad)
2276 {
2277 	struct lpfc_fdmi_attr_entry *ae;
2278 	uint32_t len, size;
2279 
2280 	ae = (struct lpfc_fdmi_attr_entry *)&ad->AttrValue;
2281 	memset(ae, 0, 256);
2282 
2283 	strncpy(ae->un.AttrString, "Smart SAN Initiator",
2284 		sizeof(ae->un.AttrString));
2285 	len = strnlen(ae->un.AttrString,
2286 			  sizeof(ae->un.AttrString));
2287 	len += (len & 3) ? (4 - (len & 3)) : 4;
2288 	size = FOURBYTES + len;
2289 	ad->AttrLen = cpu_to_be16(size);
2290 	ad->AttrType = cpu_to_be16(RPRT_SMART_SERVICE);
2291 	return size;
2292 }
2293 
2294 int
2295 lpfc_fdmi_smart_attr_guid(struct lpfc_vport *vport,
2296 			  struct lpfc_fdmi_attr_def *ad)
2297 {
2298 	struct lpfc_fdmi_attr_entry *ae;
2299 	uint32_t size;
2300 
2301 	ae = (struct lpfc_fdmi_attr_entry *)&ad->AttrValue;
2302 	memset(ae, 0, 256);
2303 
2304 	memcpy(&ae->un.AttrString, &vport->fc_sparam.nodeName,
2305 	       sizeof(struct lpfc_name));
2306 	memcpy((((uint8_t *)&ae->un.AttrString) +
2307 		sizeof(struct lpfc_name)),
2308 		&vport->fc_sparam.portName, sizeof(struct lpfc_name));
2309 	size = FOURBYTES + (2 * sizeof(struct lpfc_name));
2310 	ad->AttrLen =  cpu_to_be16(size);
2311 	ad->AttrType = cpu_to_be16(RPRT_SMART_GUID);
2312 	return size;
2313 }
2314 
2315 int
2316 lpfc_fdmi_smart_attr_version(struct lpfc_vport *vport,
2317 			     struct lpfc_fdmi_attr_def *ad)
2318 {
2319 	struct lpfc_fdmi_attr_entry *ae;
2320 	uint32_t len, size;
2321 
2322 	ae = (struct lpfc_fdmi_attr_entry *)&ad->AttrValue;
2323 	memset(ae, 0, 256);
2324 
2325 	strncpy(ae->un.AttrString, "Smart SAN Version 2.0",
2326 		sizeof(ae->un.AttrString));
2327 	len = strnlen(ae->un.AttrString,
2328 			  sizeof(ae->un.AttrString));
2329 	len += (len & 3) ? (4 - (len & 3)) : 4;
2330 	size = FOURBYTES + len;
2331 	ad->AttrLen =  cpu_to_be16(size);
2332 	ad->AttrType = cpu_to_be16(RPRT_SMART_VERSION);
2333 	return size;
2334 }
2335 
2336 int
2337 lpfc_fdmi_smart_attr_model(struct lpfc_vport *vport,
2338 			   struct lpfc_fdmi_attr_def *ad)
2339 {
2340 	struct lpfc_hba *phba = vport->phba;
2341 	struct lpfc_fdmi_attr_entry *ae;
2342 	uint32_t len, size;
2343 
2344 	ae = (struct lpfc_fdmi_attr_entry *)&ad->AttrValue;
2345 	memset(ae, 0, 256);
2346 
2347 	strncpy(ae->un.AttrString, phba->ModelName,
2348 		sizeof(ae->un.AttrString));
2349 	len = strnlen(ae->un.AttrString, sizeof(ae->un.AttrString));
2350 	len += (len & 3) ? (4 - (len & 3)) : 4;
2351 	size = FOURBYTES + len;
2352 	ad->AttrLen = cpu_to_be16(size);
2353 	ad->AttrType = cpu_to_be16(RPRT_SMART_MODEL);
2354 	return size;
2355 }
2356 
2357 int
2358 lpfc_fdmi_smart_attr_port_info(struct lpfc_vport *vport,
2359 			       struct lpfc_fdmi_attr_def *ad)
2360 {
2361 	struct lpfc_fdmi_attr_entry *ae;
2362 	uint32_t size;
2363 
2364 	ae = (struct lpfc_fdmi_attr_entry *)&ad->AttrValue;
2365 
2366 	/* SRIOV (type 3) is not supported */
2367 	if (vport->vpi)
2368 		ae->un.AttrInt =  cpu_to_be32(2);  /* NPIV */
2369 	else
2370 		ae->un.AttrInt =  cpu_to_be32(1);  /* Physical */
2371 	size = FOURBYTES + sizeof(uint32_t);
2372 	ad->AttrLen = cpu_to_be16(size);
2373 	ad->AttrType = cpu_to_be16(RPRT_SMART_PORT_INFO);
2374 	return size;
2375 }
2376 
2377 int
2378 lpfc_fdmi_smart_attr_qos(struct lpfc_vport *vport,
2379 			 struct lpfc_fdmi_attr_def *ad)
2380 {
2381 	struct lpfc_fdmi_attr_entry *ae;
2382 	uint32_t size;
2383 
2384 	ae = (struct lpfc_fdmi_attr_entry *)&ad->AttrValue;
2385 	ae->un.AttrInt =  cpu_to_be32(0);
2386 	size = FOURBYTES + sizeof(uint32_t);
2387 	ad->AttrLen = cpu_to_be16(size);
2388 	ad->AttrType = cpu_to_be16(RPRT_SMART_QOS);
2389 	return size;
2390 }
2391 
2392 int
2393 lpfc_fdmi_smart_attr_security(struct lpfc_vport *vport,
2394 			      struct lpfc_fdmi_attr_def *ad)
2395 {
2396 	struct lpfc_fdmi_attr_entry *ae;
2397 	uint32_t size;
2398 
2399 	ae = (struct lpfc_fdmi_attr_entry *)&ad->AttrValue;
2400 	ae->un.AttrInt =  cpu_to_be32(1);
2401 	size = FOURBYTES + sizeof(uint32_t);
2402 	ad->AttrLen = cpu_to_be16(size);
2403 	ad->AttrType = cpu_to_be16(RPRT_SMART_SECURITY);
2404 	return size;
2405 }
2406 
2407 /* RHBA attribute jump table */
2408 int (*lpfc_fdmi_hba_action[])
2409 	(struct lpfc_vport *vport, struct lpfc_fdmi_attr_def *ad) = {
2410 	/* Action routine                 Mask bit     Attribute type */
2411 	lpfc_fdmi_hba_attr_wwnn,	  /* bit0     RHBA_NODENAME           */
2412 	lpfc_fdmi_hba_attr_manufacturer,  /* bit1     RHBA_MANUFACTURER       */
2413 	lpfc_fdmi_hba_attr_sn,		  /* bit2     RHBA_SERIAL_NUMBER      */
2414 	lpfc_fdmi_hba_attr_model,	  /* bit3     RHBA_MODEL              */
2415 	lpfc_fdmi_hba_attr_description,	  /* bit4     RHBA_MODEL_DESCRIPTION  */
2416 	lpfc_fdmi_hba_attr_hdw_ver,	  /* bit5     RHBA_HARDWARE_VERSION   */
2417 	lpfc_fdmi_hba_attr_drvr_ver,	  /* bit6     RHBA_DRIVER_VERSION     */
2418 	lpfc_fdmi_hba_attr_rom_ver,	  /* bit7     RHBA_OPTION_ROM_VERSION */
2419 	lpfc_fdmi_hba_attr_fmw_ver,	  /* bit8     RHBA_FIRMWARE_VERSION   */
2420 	lpfc_fdmi_hba_attr_os_ver,	  /* bit9     RHBA_OS_NAME_VERSION    */
2421 	lpfc_fdmi_hba_attr_ct_len,	  /* bit10    RHBA_MAX_CT_PAYLOAD_LEN */
2422 	lpfc_fdmi_hba_attr_symbolic_name, /* bit11    RHBA_SYM_NODENAME       */
2423 	lpfc_fdmi_hba_attr_vendor_info,	  /* bit12    RHBA_VENDOR_INFO        */
2424 	lpfc_fdmi_hba_attr_num_ports,	  /* bit13    RHBA_NUM_PORTS          */
2425 	lpfc_fdmi_hba_attr_fabric_wwnn,	  /* bit14    RHBA_FABRIC_WWNN        */
2426 	lpfc_fdmi_hba_attr_bios_ver,	  /* bit15    RHBA_BIOS_VERSION       */
2427 	lpfc_fdmi_hba_attr_bios_state,	  /* bit16    RHBA_BIOS_STATE         */
2428 	lpfc_fdmi_hba_attr_vendor_id,	  /* bit17    RHBA_VENDOR_ID          */
2429 };
2430 
2431 /* RPA / RPRT attribute jump table */
2432 int (*lpfc_fdmi_port_action[])
2433 	(struct lpfc_vport *vport, struct lpfc_fdmi_attr_def *ad) = {
2434 	/* Action routine                   Mask bit   Attribute type */
2435 	lpfc_fdmi_port_attr_fc4type,        /* bit0   RPRT_SUPPORT_FC4_TYPES  */
2436 	lpfc_fdmi_port_attr_support_speed,  /* bit1   RPRT_SUPPORTED_SPEED    */
2437 	lpfc_fdmi_port_attr_speed,          /* bit2   RPRT_PORT_SPEED         */
2438 	lpfc_fdmi_port_attr_max_frame,      /* bit3   RPRT_MAX_FRAME_SIZE     */
2439 	lpfc_fdmi_port_attr_os_devname,     /* bit4   RPRT_OS_DEVICE_NAME     */
2440 	lpfc_fdmi_port_attr_host_name,      /* bit5   RPRT_HOST_NAME          */
2441 	lpfc_fdmi_port_attr_wwnn,           /* bit6   RPRT_NODENAME           */
2442 	lpfc_fdmi_port_attr_wwpn,           /* bit7   RPRT_PORTNAME           */
2443 	lpfc_fdmi_port_attr_symbolic_name,  /* bit8   RPRT_SYM_PORTNAME       */
2444 	lpfc_fdmi_port_attr_port_type,      /* bit9   RPRT_PORT_TYPE          */
2445 	lpfc_fdmi_port_attr_class,          /* bit10  RPRT_SUPPORTED_CLASS    */
2446 	lpfc_fdmi_port_attr_fabric_wwpn,    /* bit11  RPRT_FABRICNAME         */
2447 	lpfc_fdmi_port_attr_active_fc4type, /* bit12  RPRT_ACTIVE_FC4_TYPES   */
2448 	lpfc_fdmi_port_attr_port_state,     /* bit13  RPRT_PORT_STATE         */
2449 	lpfc_fdmi_port_attr_num_disc,       /* bit14  RPRT_DISC_PORT          */
2450 	lpfc_fdmi_port_attr_nportid,        /* bit15  RPRT_PORT_ID            */
2451 	lpfc_fdmi_smart_attr_service,       /* bit16  RPRT_SMART_SERVICE      */
2452 	lpfc_fdmi_smart_attr_guid,          /* bit17  RPRT_SMART_GUID         */
2453 	lpfc_fdmi_smart_attr_version,       /* bit18  RPRT_SMART_VERSION      */
2454 	lpfc_fdmi_smart_attr_model,         /* bit19  RPRT_SMART_MODEL        */
2455 	lpfc_fdmi_smart_attr_port_info,     /* bit20  RPRT_SMART_PORT_INFO    */
2456 	lpfc_fdmi_smart_attr_qos,           /* bit21  RPRT_SMART_QOS          */
2457 	lpfc_fdmi_smart_attr_security,      /* bit22  RPRT_SMART_SECURITY     */
2458 };
2459 
2460 /**
2461  * lpfc_fdmi_cmd - Build and send a FDMI cmd to the specified NPort
2462  * @vport: pointer to a host virtual N_Port data structure.
2463  * @ndlp: ndlp to send FDMI cmd to (if NULL use FDMI_DID)
2464  * cmdcode: FDMI command to send
2465  * mask: Mask of HBA or PORT Attributes to send
2466  *
2467  * Builds and sends a FDMI command using the CT subsystem.
2468  */
2469 int
2470 lpfc_fdmi_cmd(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
2471 	      int cmdcode, uint32_t new_mask)
2472 {
2473 	struct lpfc_hba *phba = vport->phba;
2474 	struct lpfc_dmabuf *mp, *bmp;
2475 	struct lpfc_sli_ct_request *CtReq;
2476 	struct ulp_bde64 *bpl;
2477 	uint32_t bit_pos;
2478 	uint32_t size;
2479 	uint32_t rsp_size;
2480 	uint32_t mask;
2481 	struct lpfc_fdmi_reg_hba *rh;
2482 	struct lpfc_fdmi_port_entry *pe;
2483 	struct lpfc_fdmi_reg_portattr *pab = NULL;
2484 	struct lpfc_fdmi_attr_block *ab = NULL;
2485 	int  (*func)(struct lpfc_vport *vport, struct lpfc_fdmi_attr_def *ad);
2486 	void (*cmpl)(struct lpfc_hba *, struct lpfc_iocbq *,
2487 		     struct lpfc_iocbq *);
2488 
2489 	if (!ndlp || !NLP_CHK_NODE_ACT(ndlp))
2490 		return 0;
2491 
2492 	cmpl = lpfc_cmpl_ct_disc_fdmi; /* called from discovery */
2493 
2494 	/* fill in BDEs for command */
2495 	/* Allocate buffer for command payload */
2496 	mp = kmalloc(sizeof(struct lpfc_dmabuf), GFP_KERNEL);
2497 	if (!mp)
2498 		goto fdmi_cmd_exit;
2499 
2500 	mp->virt = lpfc_mbuf_alloc(phba, 0, &(mp->phys));
2501 	if (!mp->virt)
2502 		goto fdmi_cmd_free_mp;
2503 
2504 	/* Allocate buffer for Buffer ptr list */
2505 	bmp = kmalloc(sizeof(struct lpfc_dmabuf), GFP_KERNEL);
2506 	if (!bmp)
2507 		goto fdmi_cmd_free_mpvirt;
2508 
2509 	bmp->virt = lpfc_mbuf_alloc(phba, 0, &(bmp->phys));
2510 	if (!bmp->virt)
2511 		goto fdmi_cmd_free_bmp;
2512 
2513 	INIT_LIST_HEAD(&mp->list);
2514 	INIT_LIST_HEAD(&bmp->list);
2515 
2516 	/* FDMI request */
2517 	lpfc_printf_vlog(vport, KERN_INFO, LOG_DISCOVERY,
2518 			 "0218 FDMI Request Data: x%x x%x x%x\n",
2519 			 vport->fc_flag, vport->port_state, cmdcode);
2520 	CtReq = (struct lpfc_sli_ct_request *)mp->virt;
2521 
2522 	/* First populate the CT_IU preamble */
2523 	memset(CtReq, 0, sizeof(struct lpfc_sli_ct_request));
2524 	CtReq->RevisionId.bits.Revision = SLI_CT_REVISION;
2525 	CtReq->RevisionId.bits.InId = 0;
2526 
2527 	CtReq->FsType = SLI_CT_MANAGEMENT_SERVICE;
2528 	CtReq->FsSubType = SLI_CT_FDMI_Subtypes;
2529 
2530 	CtReq->CommandResponse.bits.CmdRsp = cpu_to_be16(cmdcode);
2531 	rsp_size = LPFC_BPL_SIZE;
2532 	size = 0;
2533 
2534 	/* Next fill in the specific FDMI cmd information */
2535 	switch (cmdcode) {
2536 	case SLI_MGMT_RHAT:
2537 	case SLI_MGMT_RHBA:
2538 		rh = (struct lpfc_fdmi_reg_hba *)&CtReq->un.PortID;
2539 		/* HBA Identifier */
2540 		memcpy(&rh->hi.PortName, &phba->pport->fc_sparam.portName,
2541 		       sizeof(struct lpfc_name));
2542 
2543 		if (cmdcode == SLI_MGMT_RHBA) {
2544 			/* Registered Port List */
2545 			/* One entry (port) per adapter */
2546 			rh->rpl.EntryCnt = cpu_to_be32(1);
2547 			memcpy(&rh->rpl.pe, &phba->pport->fc_sparam.portName,
2548 			       sizeof(struct lpfc_name));
2549 
2550 			/* point to the HBA attribute block */
2551 			size = 2 * sizeof(struct lpfc_name) +
2552 				FOURBYTES;
2553 		} else {
2554 			size = sizeof(struct lpfc_name);
2555 		}
2556 		ab = (struct lpfc_fdmi_attr_block *)((uint8_t *)rh + size);
2557 		ab->EntryCnt = 0;
2558 		size += FOURBYTES;
2559 		bit_pos = 0;
2560 		if (new_mask)
2561 			mask = new_mask;
2562 		else
2563 			mask = vport->fdmi_hba_mask;
2564 
2565 		/* Mask will dictate what attributes to build in the request */
2566 		while (mask) {
2567 			if (mask & 0x1) {
2568 				func = lpfc_fdmi_hba_action[bit_pos];
2569 				size += func(vport,
2570 					     (struct lpfc_fdmi_attr_def *)
2571 					     ((uint8_t *)rh + size));
2572 				ab->EntryCnt++;
2573 				if ((size + 256) >
2574 				    (LPFC_BPL_SIZE - LPFC_CT_PREAMBLE))
2575 					goto hba_out;
2576 			}
2577 			mask = mask >> 1;
2578 			bit_pos++;
2579 		}
2580 hba_out:
2581 		ab->EntryCnt = cpu_to_be32(ab->EntryCnt);
2582 		/* Total size */
2583 		size = GID_REQUEST_SZ - 4 + size;
2584 		break;
2585 
2586 	case SLI_MGMT_RPRT:
2587 	case SLI_MGMT_RPA:
2588 		pab = (struct lpfc_fdmi_reg_portattr *)&CtReq->un.PortID;
2589 		if (cmdcode == SLI_MGMT_RPRT) {
2590 			rh = (struct lpfc_fdmi_reg_hba *)pab;
2591 			/* HBA Identifier */
2592 			memcpy(&rh->hi.PortName,
2593 			       &phba->pport->fc_sparam.portName,
2594 			       sizeof(struct lpfc_name));
2595 			pab = (struct lpfc_fdmi_reg_portattr *)
2596 				((uint8_t *)pab +  sizeof(struct lpfc_name));
2597 		}
2598 
2599 		memcpy((uint8_t *)&pab->PortName,
2600 		       (uint8_t *)&vport->fc_sparam.portName,
2601 		       sizeof(struct lpfc_name));
2602 		size += sizeof(struct lpfc_name) + FOURBYTES;
2603 		pab->ab.EntryCnt = 0;
2604 		bit_pos = 0;
2605 		if (new_mask)
2606 			mask = new_mask;
2607 		else
2608 			mask = vport->fdmi_port_mask;
2609 
2610 		/* Mask will dictate what attributes to build in the request */
2611 		while (mask) {
2612 			if (mask & 0x1) {
2613 				func = lpfc_fdmi_port_action[bit_pos];
2614 				size += func(vport,
2615 					     (struct lpfc_fdmi_attr_def *)
2616 					     ((uint8_t *)pab + size));
2617 				pab->ab.EntryCnt++;
2618 				if ((size + 256) >
2619 				    (LPFC_BPL_SIZE - LPFC_CT_PREAMBLE))
2620 					goto port_out;
2621 			}
2622 			mask = mask >> 1;
2623 			bit_pos++;
2624 		}
2625 port_out:
2626 		pab->ab.EntryCnt = cpu_to_be32(pab->ab.EntryCnt);
2627 		/* Total size */
2628 		if (cmdcode == SLI_MGMT_RPRT)
2629 			size += sizeof(struct lpfc_name);
2630 		size = GID_REQUEST_SZ - 4 + size;
2631 		break;
2632 
2633 	case SLI_MGMT_GHAT:
2634 	case SLI_MGMT_GRPL:
2635 		rsp_size = FC_MAX_NS_RSP;
2636 	case SLI_MGMT_DHBA:
2637 	case SLI_MGMT_DHAT:
2638 		pe = (struct lpfc_fdmi_port_entry *)&CtReq->un.PortID;
2639 		memcpy((uint8_t *)&pe->PortName,
2640 		       (uint8_t *)&vport->fc_sparam.portName,
2641 		       sizeof(struct lpfc_name));
2642 		size = GID_REQUEST_SZ - 4 + sizeof(struct lpfc_name);
2643 		break;
2644 
2645 	case SLI_MGMT_GPAT:
2646 	case SLI_MGMT_GPAS:
2647 		rsp_size = FC_MAX_NS_RSP;
2648 	case SLI_MGMT_DPRT:
2649 	case SLI_MGMT_DPA:
2650 		pe = (struct lpfc_fdmi_port_entry *)&CtReq->un.PortID;
2651 		memcpy((uint8_t *)&pe->PortName,
2652 		       (uint8_t *)&vport->fc_sparam.portName,
2653 		       sizeof(struct lpfc_name));
2654 		size = GID_REQUEST_SZ - 4 + sizeof(struct lpfc_name);
2655 		break;
2656 	case SLI_MGMT_GRHL:
2657 		size = GID_REQUEST_SZ - 4;
2658 		break;
2659 	default:
2660 		lpfc_printf_vlog(vport, KERN_WARNING, LOG_DISCOVERY,
2661 				 "0298 FDMI cmdcode x%x not supported\n",
2662 				 cmdcode);
2663 		goto fdmi_cmd_free_bmpvirt;
2664 	}
2665 	CtReq->CommandResponse.bits.Size = cpu_to_be16(rsp_size);
2666 
2667 	bpl = (struct ulp_bde64 *)bmp->virt;
2668 	bpl->addrHigh = le32_to_cpu(putPaddrHigh(mp->phys));
2669 	bpl->addrLow = le32_to_cpu(putPaddrLow(mp->phys));
2670 	bpl->tus.f.bdeFlags = 0;
2671 	bpl->tus.f.bdeSize = size;
2672 
2673 	/*
2674 	 * The lpfc_ct_cmd/lpfc_get_req shall increment ndlp reference count
2675 	 * to hold ndlp reference for the corresponding callback function.
2676 	 */
2677 	if (!lpfc_ct_cmd(vport, mp, bmp, ndlp, cmpl, rsp_size, 0))
2678 		return 0;
2679 
2680 	/*
2681 	 * Decrement ndlp reference count to release ndlp reference held
2682 	 * for the failed command's callback function.
2683 	 */
2684 	lpfc_nlp_put(ndlp);
2685 
2686 fdmi_cmd_free_bmpvirt:
2687 	lpfc_mbuf_free(phba, bmp->virt, bmp->phys);
2688 fdmi_cmd_free_bmp:
2689 	kfree(bmp);
2690 fdmi_cmd_free_mpvirt:
2691 	lpfc_mbuf_free(phba, mp->virt, mp->phys);
2692 fdmi_cmd_free_mp:
2693 	kfree(mp);
2694 fdmi_cmd_exit:
2695 	/* Issue FDMI request failed */
2696 	lpfc_printf_vlog(vport, KERN_INFO, LOG_DISCOVERY,
2697 			 "0244 Issue FDMI request failed Data: x%x\n",
2698 			 cmdcode);
2699 	return 1;
2700 }
2701 
2702 /**
2703  * lpfc_delayed_disc_tmo - Timeout handler for delayed discovery timer.
2704  * @ptr - Context object of the timer.
2705  *
2706  * This function set the WORKER_DELAYED_DISC_TMO flag and wake up
2707  * the worker thread.
2708  **/
2709 void
2710 lpfc_delayed_disc_tmo(unsigned long ptr)
2711 {
2712 	struct lpfc_vport *vport = (struct lpfc_vport *)ptr;
2713 	struct lpfc_hba   *phba = vport->phba;
2714 	uint32_t tmo_posted;
2715 	unsigned long iflag;
2716 
2717 	spin_lock_irqsave(&vport->work_port_lock, iflag);
2718 	tmo_posted = vport->work_port_events & WORKER_DELAYED_DISC_TMO;
2719 	if (!tmo_posted)
2720 		vport->work_port_events |= WORKER_DELAYED_DISC_TMO;
2721 	spin_unlock_irqrestore(&vport->work_port_lock, iflag);
2722 
2723 	if (!tmo_posted)
2724 		lpfc_worker_wake_up(phba);
2725 	return;
2726 }
2727 
2728 /**
2729  * lpfc_delayed_disc_timeout_handler - Function called by worker thread to
2730  *      handle delayed discovery.
2731  * @vport: pointer to a host virtual N_Port data structure.
2732  *
2733  * This function start nport discovery of the vport.
2734  **/
2735 void
2736 lpfc_delayed_disc_timeout_handler(struct lpfc_vport *vport)
2737 {
2738 	struct Scsi_Host *shost = lpfc_shost_from_vport(vport);
2739 
2740 	spin_lock_irq(shost->host_lock);
2741 	if (!(vport->fc_flag & FC_DISC_DELAYED)) {
2742 		spin_unlock_irq(shost->host_lock);
2743 		return;
2744 	}
2745 	vport->fc_flag &= ~FC_DISC_DELAYED;
2746 	spin_unlock_irq(shost->host_lock);
2747 
2748 	lpfc_do_scr_ns_plogi(vport->phba, vport);
2749 }
2750 
2751 void
2752 lpfc_decode_firmware_rev(struct lpfc_hba *phba, char *fwrevision, int flag)
2753 {
2754 	struct lpfc_sli *psli = &phba->sli;
2755 	lpfc_vpd_t *vp = &phba->vpd;
2756 	uint32_t b1, b2, b3, b4, i, rev;
2757 	char c;
2758 	uint32_t *ptr, str[4];
2759 	uint8_t *fwname;
2760 
2761 	if (phba->sli_rev == LPFC_SLI_REV4)
2762 		snprintf(fwrevision, FW_REV_STR_SIZE, "%s", vp->rev.opFwName);
2763 	else if (vp->rev.rBit) {
2764 		if (psli->sli_flag & LPFC_SLI_ACTIVE)
2765 			rev = vp->rev.sli2FwRev;
2766 		else
2767 			rev = vp->rev.sli1FwRev;
2768 
2769 		b1 = (rev & 0x0000f000) >> 12;
2770 		b2 = (rev & 0x00000f00) >> 8;
2771 		b3 = (rev & 0x000000c0) >> 6;
2772 		b4 = (rev & 0x00000030) >> 4;
2773 
2774 		switch (b4) {
2775 		case 0:
2776 			c = 'N';
2777 			break;
2778 		case 1:
2779 			c = 'A';
2780 			break;
2781 		case 2:
2782 			c = 'B';
2783 			break;
2784 		case 3:
2785 			c = 'X';
2786 			break;
2787 		default:
2788 			c = 0;
2789 			break;
2790 		}
2791 		b4 = (rev & 0x0000000f);
2792 
2793 		if (psli->sli_flag & LPFC_SLI_ACTIVE)
2794 			fwname = vp->rev.sli2FwName;
2795 		else
2796 			fwname = vp->rev.sli1FwName;
2797 
2798 		for (i = 0; i < 16; i++)
2799 			if (fwname[i] == 0x20)
2800 				fwname[i] = 0;
2801 
2802 		ptr = (uint32_t*)fwname;
2803 
2804 		for (i = 0; i < 3; i++)
2805 			str[i] = be32_to_cpu(*ptr++);
2806 
2807 		if (c == 0) {
2808 			if (flag)
2809 				sprintf(fwrevision, "%d.%d%d (%s)",
2810 					b1, b2, b3, (char *)str);
2811 			else
2812 				sprintf(fwrevision, "%d.%d%d", b1,
2813 					b2, b3);
2814 		} else {
2815 			if (flag)
2816 				sprintf(fwrevision, "%d.%d%d%c%d (%s)",
2817 					b1, b2, b3, c,
2818 					b4, (char *)str);
2819 			else
2820 				sprintf(fwrevision, "%d.%d%d%c%d",
2821 					b1, b2, b3, c, b4);
2822 		}
2823 	} else {
2824 		rev = vp->rev.smFwRev;
2825 
2826 		b1 = (rev & 0xff000000) >> 24;
2827 		b2 = (rev & 0x00f00000) >> 20;
2828 		b3 = (rev & 0x000f0000) >> 16;
2829 		c  = (rev & 0x0000ff00) >> 8;
2830 		b4 = (rev & 0x000000ff);
2831 
2832 		sprintf(fwrevision, "%d.%d%d%c%d", b1, b2, b3, c, b4);
2833 	}
2834 	return;
2835 }
2836