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