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