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