[SCSI] lpfc 8.3.27: Miscellanous logic and interface fixes
[pandora-kernel.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) 2004-2010 Emulex.  All rights reserved.           *
5  * EMULEX and SLI are trademarks of Emulex.                        *
6  * www.emulex.com                                                  *
7  *                                                                 *
8  * This program is free software; you can redistribute it and/or   *
9  * modify it under the terms of version 2 of the GNU General       *
10  * Public License as published by the Free Software Foundation.    *
11  * This program is distributed in the hope that it will be useful. *
12  * ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND          *
13  * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,  *
14  * FITNESS FOR A PARTICULAR PURPOSE, OR NON-INFRINGEMENT, ARE      *
15  * DISCLAIMED, EXCEPT TO THE EXTENT THAT SUCH DISCLAIMERS ARE HELD *
16  * TO BE LEGALLY INVALID.  See the GNU General Public License for  *
17  * more details, a copy of which can be found in the file COPYING  *
18  * included with this package.                                     *
19  *******************************************************************/
20
21 /*
22  * Fibre Channel SCSI LAN Device Driver CT support: FC Generic Services FC-GS
23  */
24
25 #include <linux/blkdev.h>
26 #include <linux/pci.h>
27 #include <linux/interrupt.h>
28 #include <linux/slab.h>
29 #include <linux/utsname.h>
30
31 #include <scsi/scsi.h>
32 #include <scsi/scsi_device.h>
33 #include <scsi/scsi_host.h>
34 #include <scsi/scsi_transport_fc.h>
35 #include <scsi/fc/fc_fs.h>
36
37 #include "lpfc_hw4.h"
38 #include "lpfc_hw.h"
39 #include "lpfc_sli.h"
40 #include "lpfc_sli4.h"
41 #include "lpfc_nl.h"
42 #include "lpfc_disc.h"
43 #include "lpfc_scsi.h"
44 #include "lpfc.h"
45 #include "lpfc_logmsg.h"
46 #include "lpfc_crtn.h"
47 #include "lpfc_version.h"
48 #include "lpfc_vport.h"
49 #include "lpfc_debugfs.h"
50
51 /* FDMI Port Speed definitions */
52 #define HBA_PORTSPEED_1GBIT             0x0001  /* 1 GBit/sec */
53 #define HBA_PORTSPEED_2GBIT             0x0002  /* 2 GBit/sec */
54 #define HBA_PORTSPEED_4GBIT             0x0008  /* 4 GBit/sec */
55 #define HBA_PORTSPEED_10GBIT            0x0004  /* 10 GBit/sec */
56 #define HBA_PORTSPEED_8GBIT             0x0010  /* 8 GBit/sec */
57 #define HBA_PORTSPEED_16GBIT            0x0020  /* 16 GBit/sec */
58 #define HBA_PORTSPEED_UNKNOWN           0x0800  /* Unknown */
59
60 #define FOURBYTES       4
61
62
63 static char *lpfc_release_version = LPFC_DRIVER_VERSION;
64
65 static void
66 lpfc_ct_ignore_hbq_buffer(struct lpfc_hba *phba, struct lpfc_iocbq *piocbq,
67                           struct lpfc_dmabuf *mp, uint32_t size)
68 {
69         if (!mp) {
70                 lpfc_printf_log(phba, KERN_INFO, LOG_ELS,
71                                 "0146 Ignoring unsolicited CT No HBQ "
72                                 "status = x%x\n",
73                                 piocbq->iocb.ulpStatus);
74         }
75         lpfc_printf_log(phba, KERN_INFO, LOG_ELS,
76                         "0145 Ignoring unsolicted CT HBQ Size:%d "
77                         "status = x%x\n",
78                         size, piocbq->iocb.ulpStatus);
79 }
80
81 static void
82 lpfc_ct_unsol_buffer(struct lpfc_hba *phba, struct lpfc_iocbq *piocbq,
83                      struct lpfc_dmabuf *mp, uint32_t size)
84 {
85         lpfc_ct_ignore_hbq_buffer(phba, piocbq, mp, size);
86 }
87
88 void
89 lpfc_ct_unsol_event(struct lpfc_hba *phba, struct lpfc_sli_ring *pring,
90                     struct lpfc_iocbq *piocbq)
91 {
92         struct lpfc_dmabuf *mp = NULL;
93         IOCB_t *icmd = &piocbq->iocb;
94         int i;
95         struct lpfc_iocbq *iocbq;
96         dma_addr_t paddr;
97         uint32_t size;
98         struct list_head head;
99         struct lpfc_dmabuf *bdeBuf;
100
101         if (lpfc_bsg_ct_unsol_event(phba, pring, piocbq) == 0)
102                 return;
103
104         if (unlikely(icmd->ulpStatus == IOSTAT_NEED_BUFFER)) {
105                 lpfc_sli_hbqbuf_add_hbqs(phba, LPFC_ELS_HBQ);
106         } else if ((icmd->ulpStatus == IOSTAT_LOCAL_REJECT) &&
107                 ((icmd->un.ulpWord[4] & 0xff) == IOERR_RCV_BUFFER_WAITING)) {
108                 /* Not enough posted buffers; Try posting more buffers */
109                 phba->fc_stat.NoRcvBuf++;
110                 if (!(phba->sli3_options & LPFC_SLI3_HBQ_ENABLED))
111                         lpfc_post_buffer(phba, pring, 2);
112                 return;
113         }
114
115         /* If there are no BDEs associated with this IOCB,
116          * there is nothing to do.
117          */
118         if (icmd->ulpBdeCount == 0)
119                 return;
120
121         if (phba->sli3_options & LPFC_SLI3_HBQ_ENABLED) {
122                 INIT_LIST_HEAD(&head);
123                 list_add_tail(&head, &piocbq->list);
124                 list_for_each_entry(iocbq, &head, list) {
125                         icmd = &iocbq->iocb;
126                         if (icmd->ulpBdeCount == 0)
127                                 continue;
128                         bdeBuf = iocbq->context2;
129                         iocbq->context2 = NULL;
130                         size  = icmd->un.cont64[0].tus.f.bdeSize;
131                         lpfc_ct_unsol_buffer(phba, piocbq, bdeBuf, size);
132                         lpfc_in_buf_free(phba, bdeBuf);
133                         if (icmd->ulpBdeCount == 2) {
134                                 bdeBuf = iocbq->context3;
135                                 iocbq->context3 = NULL;
136                                 size  = icmd->unsli3.rcvsli3.bde2.tus.f.bdeSize;
137                                 lpfc_ct_unsol_buffer(phba, piocbq, bdeBuf,
138                                                      size);
139                                 lpfc_in_buf_free(phba, bdeBuf);
140                         }
141                 }
142                 list_del(&head);
143         } else {
144                 INIT_LIST_HEAD(&head);
145                 list_add_tail(&head, &piocbq->list);
146                 list_for_each_entry(iocbq, &head, list) {
147                         icmd = &iocbq->iocb;
148                         if (icmd->ulpBdeCount == 0)
149                                 lpfc_ct_unsol_buffer(phba, iocbq, NULL, 0);
150                         for (i = 0; i < icmd->ulpBdeCount; i++) {
151                                 paddr = getPaddr(icmd->un.cont64[i].addrHigh,
152                                                  icmd->un.cont64[i].addrLow);
153                                 mp = lpfc_sli_ringpostbuf_get(phba, pring,
154                                                               paddr);
155                                 size = icmd->un.cont64[i].tus.f.bdeSize;
156                                 lpfc_ct_unsol_buffer(phba, iocbq, mp, size);
157                                 lpfc_in_buf_free(phba, mp);
158                         }
159                         lpfc_post_buffer(phba, pring, i);
160                 }
161                 list_del(&head);
162         }
163 }
164
165 /**
166  * lpfc_sli4_ct_abort_unsol_event - Default handle for sli4 unsol abort
167  * @phba: Pointer to HBA context object.
168  * @pring: Pointer to the driver internal I/O ring.
169  * @piocbq: Pointer to the IOCBQ.
170  *
171  * This function serves as the default handler for the sli4 unsolicited
172  * abort event. It shall be invoked when there is no application interface
173  * registered unsolicited abort handler. This handler does nothing but
174  * just simply releases the dma buffer used by the unsol abort event.
175  **/
176 void
177 lpfc_sli4_ct_abort_unsol_event(struct lpfc_hba *phba,
178                                struct lpfc_sli_ring *pring,
179                                struct lpfc_iocbq *piocbq)
180 {
181         IOCB_t *icmd = &piocbq->iocb;
182         struct lpfc_dmabuf *bdeBuf;
183         uint32_t size;
184
185         /* Forward abort event to any process registered to receive ct event */
186         if (lpfc_bsg_ct_unsol_event(phba, pring, piocbq) == 0)
187                 return;
188
189         /* If there is no BDE associated with IOCB, there is nothing to do */
190         if (icmd->ulpBdeCount == 0)
191                 return;
192         bdeBuf = piocbq->context2;
193         piocbq->context2 = NULL;
194         size  = icmd->un.cont64[0].tus.f.bdeSize;
195         lpfc_ct_unsol_buffer(phba, piocbq, bdeBuf, size);
196         lpfc_in_buf_free(phba, bdeBuf);
197 }
198
199 static void
200 lpfc_free_ct_rsp(struct lpfc_hba *phba, struct lpfc_dmabuf *mlist)
201 {
202         struct lpfc_dmabuf *mlast, *next_mlast;
203
204         list_for_each_entry_safe(mlast, next_mlast, &mlist->list, list) {
205                 lpfc_mbuf_free(phba, mlast->virt, mlast->phys);
206                 list_del(&mlast->list);
207                 kfree(mlast);
208         }
209         lpfc_mbuf_free(phba, mlist->virt, mlist->phys);
210         kfree(mlist);
211         return;
212 }
213
214 static struct lpfc_dmabuf *
215 lpfc_alloc_ct_rsp(struct lpfc_hba *phba, int cmdcode, struct ulp_bde64 *bpl,
216                   uint32_t size, int *entries)
217 {
218         struct lpfc_dmabuf *mlist = NULL;
219         struct lpfc_dmabuf *mp;
220         int cnt, i = 0;
221
222         /* We get chunks of FCELSSIZE */
223         cnt = size > FCELSSIZE ? FCELSSIZE: size;
224
225         while (size) {
226                 /* Allocate buffer for rsp payload */
227                 mp = kmalloc(sizeof(struct lpfc_dmabuf), GFP_KERNEL);
228                 if (!mp) {
229                         if (mlist)
230                                 lpfc_free_ct_rsp(phba, mlist);
231                         return NULL;
232                 }
233
234                 INIT_LIST_HEAD(&mp->list);
235
236                 if (cmdcode == be16_to_cpu(SLI_CTNS_GID_FT) ||
237                     cmdcode == be16_to_cpu(SLI_CTNS_GFF_ID))
238                         mp->virt = lpfc_mbuf_alloc(phba, MEM_PRI, &(mp->phys));
239                 else
240                         mp->virt = lpfc_mbuf_alloc(phba, 0, &(mp->phys));
241
242                 if (!mp->virt) {
243                         kfree(mp);
244                         if (mlist)
245                                 lpfc_free_ct_rsp(phba, mlist);
246                         return NULL;
247                 }
248
249                 /* Queue it to a linked list */
250                 if (!mlist)
251                         mlist = mp;
252                 else
253                         list_add_tail(&mp->list, &mlist->list);
254
255                 bpl->tus.f.bdeFlags = BUFF_TYPE_BDE_64I;
256                 /* build buffer ptr list for IOCB */
257                 bpl->addrLow = le32_to_cpu(putPaddrLow(mp->phys) );
258                 bpl->addrHigh = le32_to_cpu(putPaddrHigh(mp->phys) );
259                 bpl->tus.f.bdeSize = (uint16_t) cnt;
260                 bpl->tus.w = le32_to_cpu(bpl->tus.w);
261                 bpl++;
262
263                 i++;
264                 size -= cnt;
265         }
266
267         *entries = i;
268         return mlist;
269 }
270
271 int
272 lpfc_ct_free_iocb(struct lpfc_hba *phba, struct lpfc_iocbq *ctiocb)
273 {
274         struct lpfc_dmabuf *buf_ptr;
275
276         if (ctiocb->context_un.ndlp) {
277                 lpfc_nlp_put(ctiocb->context_un.ndlp);
278                 ctiocb->context_un.ndlp = NULL;
279         }
280         if (ctiocb->context1) {
281                 buf_ptr = (struct lpfc_dmabuf *) ctiocb->context1;
282                 lpfc_mbuf_free(phba, buf_ptr->virt, buf_ptr->phys);
283                 kfree(buf_ptr);
284                 ctiocb->context1 = NULL;
285         }
286         if (ctiocb->context2) {
287                 lpfc_free_ct_rsp(phba, (struct lpfc_dmabuf *) ctiocb->context2);
288                 ctiocb->context2 = NULL;
289         }
290
291         if (ctiocb->context3) {
292                 buf_ptr = (struct lpfc_dmabuf *) ctiocb->context3;
293                 lpfc_mbuf_free(phba, buf_ptr->virt, buf_ptr->phys);
294                 kfree(buf_ptr);
295                 ctiocb->context1 = NULL;
296         }
297         lpfc_sli_release_iocbq(phba, ctiocb);
298         return 0;
299 }
300
301 static int
302 lpfc_gen_req(struct lpfc_vport *vport, struct lpfc_dmabuf *bmp,
303              struct lpfc_dmabuf *inp, struct lpfc_dmabuf *outp,
304              void (*cmpl) (struct lpfc_hba *, struct lpfc_iocbq *,
305                      struct lpfc_iocbq *),
306              struct lpfc_nodelist *ndlp, uint32_t usr_flg, uint32_t num_entry,
307              uint32_t tmo, uint8_t retry)
308 {
309         struct lpfc_hba  *phba = vport->phba;
310         IOCB_t *icmd;
311         struct lpfc_iocbq *geniocb;
312         int rc;
313
314         /* Allocate buffer for  command iocb */
315         geniocb = lpfc_sli_get_iocbq(phba);
316
317         if (geniocb == NULL)
318                 return 1;
319
320         icmd = &geniocb->iocb;
321         icmd->un.genreq64.bdl.ulpIoTag32 = 0;
322         icmd->un.genreq64.bdl.addrHigh = putPaddrHigh(bmp->phys);
323         icmd->un.genreq64.bdl.addrLow = putPaddrLow(bmp->phys);
324         icmd->un.genreq64.bdl.bdeFlags = BUFF_TYPE_BLP_64;
325         icmd->un.genreq64.bdl.bdeSize = (num_entry * sizeof (struct ulp_bde64));
326
327         if (usr_flg)
328                 geniocb->context3 = NULL;
329         else
330                 geniocb->context3 = (uint8_t *) bmp;
331
332         /* Save for completion so we can release these resources */
333         geniocb->context1 = (uint8_t *) inp;
334         geniocb->context2 = (uint8_t *) outp;
335         geniocb->context_un.ndlp = lpfc_nlp_get(ndlp);
336
337         /* Fill in payload, bp points to frame payload */
338         icmd->ulpCommand = CMD_GEN_REQUEST64_CR;
339
340         /* Fill in rest of iocb */
341         icmd->un.genreq64.w5.hcsw.Fctl = (SI | LA);
342         icmd->un.genreq64.w5.hcsw.Dfctl = 0;
343         icmd->un.genreq64.w5.hcsw.Rctl = FC_RCTL_DD_UNSOL_CTL;
344         icmd->un.genreq64.w5.hcsw.Type = FC_TYPE_CT;
345
346         if (!tmo) {
347                  /* FC spec states we need 3 * ratov for CT requests */
348                 tmo = (3 * phba->fc_ratov);
349         }
350         icmd->ulpTimeout = tmo;
351         icmd->ulpBdeCount = 1;
352         icmd->ulpLe = 1;
353         icmd->ulpClass = CLASS3;
354         icmd->ulpContext = ndlp->nlp_rpi;
355         if (phba->sli_rev == LPFC_SLI_REV4)
356                 icmd->ulpContext = phba->sli4_hba.rpi_ids[ndlp->nlp_rpi];
357
358         if (phba->sli3_options & LPFC_SLI3_NPIV_ENABLED) {
359                 /* For GEN_REQUEST64_CR, use the RPI */
360                 icmd->ulpCt_h = 0;
361                 icmd->ulpCt_l = 0;
362         }
363
364         /* Issue GEN REQ IOCB for NPORT <did> */
365         lpfc_printf_vlog(vport, KERN_INFO, LOG_ELS,
366                          "0119 Issue GEN REQ IOCB to NPORT x%x "
367                          "Data: x%x x%x\n",
368                          ndlp->nlp_DID, icmd->ulpIoTag,
369                          vport->port_state);
370         geniocb->iocb_cmpl = cmpl;
371         geniocb->drvrTimeout = icmd->ulpTimeout + LPFC_DRVR_TIMEOUT;
372         geniocb->vport = vport;
373         geniocb->retry = retry;
374         rc = lpfc_sli_issue_iocb(phba, LPFC_ELS_RING, geniocb, 0);
375
376         if (rc == IOCB_ERROR) {
377                 lpfc_sli_release_iocbq(phba, geniocb);
378                 return 1;
379         }
380
381         return 0;
382 }
383
384 static int
385 lpfc_ct_cmd(struct lpfc_vport *vport, struct lpfc_dmabuf *inmp,
386             struct lpfc_dmabuf *bmp, struct lpfc_nodelist *ndlp,
387             void (*cmpl) (struct lpfc_hba *, struct lpfc_iocbq *,
388                           struct lpfc_iocbq *),
389             uint32_t rsp_size, uint8_t retry)
390 {
391         struct lpfc_hba  *phba = vport->phba;
392         struct ulp_bde64 *bpl = (struct ulp_bde64 *) bmp->virt;
393         struct lpfc_dmabuf *outmp;
394         int cnt = 0, status;
395         int cmdcode = ((struct lpfc_sli_ct_request *) inmp->virt)->
396                 CommandResponse.bits.CmdRsp;
397
398         bpl++;                  /* Skip past ct request */
399
400         /* Put buffer(s) for ct rsp in bpl */
401         outmp = lpfc_alloc_ct_rsp(phba, cmdcode, bpl, rsp_size, &cnt);
402         if (!outmp)
403                 return -ENOMEM;
404         /*
405          * Form the CT IOCB.  The total number of BDEs in this IOCB
406          * is the single command plus response count from
407          * lpfc_alloc_ct_rsp.
408          */
409         cnt += 1;
410         status = lpfc_gen_req(vport, bmp, inmp, outmp, cmpl, ndlp, 0,
411                               cnt, 0, retry);
412         if (status) {
413                 lpfc_free_ct_rsp(phba, outmp);
414                 return -ENOMEM;
415         }
416         return 0;
417 }
418
419 struct lpfc_vport *
420 lpfc_find_vport_by_did(struct lpfc_hba *phba, uint32_t did) {
421         struct lpfc_vport *vport_curr;
422         unsigned long flags;
423
424         spin_lock_irqsave(&phba->hbalock, flags);
425         list_for_each_entry(vport_curr, &phba->port_list, listentry) {
426                 if ((vport_curr->fc_myDID) && (vport_curr->fc_myDID == did)) {
427                         spin_unlock_irqrestore(&phba->hbalock, flags);
428                         return vport_curr;
429                 }
430         }
431         spin_unlock_irqrestore(&phba->hbalock, flags);
432         return NULL;
433 }
434
435 static int
436 lpfc_ns_rsp(struct lpfc_vport *vport, struct lpfc_dmabuf *mp, uint32_t Size)
437 {
438         struct lpfc_hba  *phba = vport->phba;
439         struct lpfc_sli_ct_request *Response =
440                 (struct lpfc_sli_ct_request *) mp->virt;
441         struct lpfc_nodelist *ndlp = NULL;
442         struct lpfc_dmabuf *mlast, *next_mp;
443         uint32_t *ctptr = (uint32_t *) & Response->un.gid.PortType;
444         uint32_t Did, CTentry;
445         int Cnt;
446         struct list_head head;
447
448         lpfc_set_disctmo(vport);
449         vport->num_disc_nodes = 0;
450         vport->fc_ns_retry = 0;
451
452
453         list_add_tail(&head, &mp->list);
454         list_for_each_entry_safe(mp, next_mp, &head, list) {
455                 mlast = mp;
456
457                 Cnt = Size  > FCELSSIZE ? FCELSSIZE : Size;
458
459                 Size -= Cnt;
460
461                 if (!ctptr) {
462                         ctptr = (uint32_t *) mlast->virt;
463                 } else
464                         Cnt -= 16;      /* subtract length of CT header */
465
466                 /* Loop through entire NameServer list of DIDs */
467                 while (Cnt >= sizeof (uint32_t)) {
468                         /* Get next DID from NameServer List */
469                         CTentry = *ctptr++;
470                         Did = ((be32_to_cpu(CTentry)) & Mask_DID);
471
472                         ndlp = NULL;
473
474                         /*
475                          * Check for rscn processing or not
476                          * To conserve rpi's, filter out addresses for other
477                          * vports on the same physical HBAs.
478                          */
479                         if ((Did != vport->fc_myDID) &&
480                             ((lpfc_find_vport_by_did(phba, Did) == NULL) ||
481                              vport->cfg_peer_port_login)) {
482                                 if ((vport->port_type != LPFC_NPIV_PORT) ||
483                                     (!(vport->ct_flags & FC_CT_RFF_ID)) ||
484                                     (!vport->cfg_restrict_login)) {
485                                         ndlp = lpfc_setup_disc_node(vport, Did);
486                                         if (ndlp && NLP_CHK_NODE_ACT(ndlp)) {
487                                                 lpfc_debugfs_disc_trc(vport,
488                                                 LPFC_DISC_TRC_CT,
489                                                 "Parse GID_FTrsp: "
490                                                 "did:x%x flg:x%x x%x",
491                                                 Did, ndlp->nlp_flag,
492                                                 vport->fc_flag);
493
494                                                 lpfc_printf_vlog(vport,
495                                                         KERN_INFO,
496                                                         LOG_DISCOVERY,
497                                                         "0238 Process "
498                                                         "x%x NameServer Rsp"
499                                                         "Data: x%x x%x x%x\n",
500                                                         Did, ndlp->nlp_flag,
501                                                         vport->fc_flag,
502                                                         vport->fc_rscn_id_cnt);
503                                         } else {
504                                                 lpfc_debugfs_disc_trc(vport,
505                                                 LPFC_DISC_TRC_CT,
506                                                 "Skip1 GID_FTrsp: "
507                                                 "did:x%x flg:x%x cnt:%d",
508                                                 Did, vport->fc_flag,
509                                                 vport->fc_rscn_id_cnt);
510
511                                                 lpfc_printf_vlog(vport,
512                                                         KERN_INFO,
513                                                         LOG_DISCOVERY,
514                                                         "0239 Skip x%x "
515                                                         "NameServer Rsp Data: "
516                                                         "x%x x%x\n",
517                                                         Did, vport->fc_flag,
518                                                         vport->fc_rscn_id_cnt);
519                                         }
520
521                                 } else {
522                                         if (!(vport->fc_flag & FC_RSCN_MODE) ||
523                                         (lpfc_rscn_payload_check(vport, Did))) {
524                                                 lpfc_debugfs_disc_trc(vport,
525                                                 LPFC_DISC_TRC_CT,
526                                                 "Query GID_FTrsp: "
527                                                 "did:x%x flg:x%x cnt:%d",
528                                                 Did, vport->fc_flag,
529                                                 vport->fc_rscn_id_cnt);
530
531                                                 /* This NPortID was previously
532                                                  * a FCP target, * Don't even
533                                                  * bother to send GFF_ID.
534                                                  */
535                                                 ndlp = lpfc_findnode_did(vport,
536                                                         Did);
537                                                 if (ndlp &&
538                                                     NLP_CHK_NODE_ACT(ndlp)
539                                                     && (ndlp->nlp_type &
540                                                      NLP_FCP_TARGET))
541                                                         lpfc_setup_disc_node
542                                                                 (vport, Did);
543                                                 else if (lpfc_ns_cmd(vport,
544                                                         SLI_CTNS_GFF_ID,
545                                                         0, Did) == 0)
546                                                         vport->num_disc_nodes++;
547                                                 else
548                                                         lpfc_setup_disc_node
549                                                                 (vport, Did);
550                                         }
551                                         else {
552                                                 lpfc_debugfs_disc_trc(vport,
553                                                 LPFC_DISC_TRC_CT,
554                                                 "Skip2 GID_FTrsp: "
555                                                 "did:x%x flg:x%x cnt:%d",
556                                                 Did, vport->fc_flag,
557                                                 vport->fc_rscn_id_cnt);
558
559                                                 lpfc_printf_vlog(vport,
560                                                         KERN_INFO,
561                                                         LOG_DISCOVERY,
562                                                         "0245 Skip x%x "
563                                                         "NameServer Rsp Data: "
564                                                         "x%x x%x\n",
565                                                         Did, vport->fc_flag,
566                                                         vport->fc_rscn_id_cnt);
567                                         }
568                                 }
569                         }
570                         if (CTentry & (be32_to_cpu(SLI_CT_LAST_ENTRY)))
571                                 goto nsout1;
572                         Cnt -= sizeof (uint32_t);
573                 }
574                 ctptr = NULL;
575
576         }
577
578 nsout1:
579         list_del(&head);
580         return 0;
581 }
582
583 static void
584 lpfc_cmpl_ct_cmd_gid_ft(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
585                         struct lpfc_iocbq *rspiocb)
586 {
587         struct lpfc_vport *vport = cmdiocb->vport;
588         struct Scsi_Host *shost = lpfc_shost_from_vport(vport);
589         IOCB_t *irsp;
590         struct lpfc_dmabuf *bmp;
591         struct lpfc_dmabuf *outp;
592         struct lpfc_sli_ct_request *CTrsp;
593         struct lpfc_nodelist *ndlp;
594         int rc;
595
596         /* First save ndlp, before we overwrite it */
597         ndlp = cmdiocb->context_un.ndlp;
598
599         /* we pass cmdiocb to state machine which needs rspiocb as well */
600         cmdiocb->context_un.rsp_iocb = rspiocb;
601
602         outp = (struct lpfc_dmabuf *) cmdiocb->context2;
603         bmp = (struct lpfc_dmabuf *) cmdiocb->context3;
604         irsp = &rspiocb->iocb;
605
606         lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_CT,
607                  "GID_FT cmpl:     status:x%x/x%x rtry:%d",
608                 irsp->ulpStatus, irsp->un.ulpWord[4], vport->fc_ns_retry);
609
610         /* Don't bother processing response if vport is being torn down. */
611         if (vport->load_flag & FC_UNLOADING) {
612                 if (vport->fc_flag & FC_RSCN_MODE)
613                         lpfc_els_flush_rscn(vport);
614                 goto out;
615         }
616
617         if (lpfc_els_chk_latt(vport)) {
618                 lpfc_printf_vlog(vport, KERN_INFO, LOG_DISCOVERY,
619                                  "0216 Link event during NS query\n");
620                 if (vport->fc_flag & FC_RSCN_MODE)
621                         lpfc_els_flush_rscn(vport);
622                 lpfc_vport_set_state(vport, FC_VPORT_FAILED);
623                 goto out;
624         }
625         if (lpfc_error_lost_link(irsp)) {
626                 lpfc_printf_vlog(vport, KERN_INFO, LOG_DISCOVERY,
627                                  "0226 NS query failed due to link event\n");
628                 if (vport->fc_flag & FC_RSCN_MODE)
629                         lpfc_els_flush_rscn(vport);
630                 goto out;
631         }
632         if (irsp->ulpStatus) {
633                 /* Check for retry */
634                 if (vport->fc_ns_retry < LPFC_MAX_NS_RETRY) {
635                         if (irsp->ulpStatus != IOSTAT_LOCAL_REJECT ||
636                             irsp->un.ulpWord[4] != IOERR_NO_RESOURCES)
637                                 vport->fc_ns_retry++;
638
639                         /* CT command is being retried */
640                         rc = lpfc_ns_cmd(vport, SLI_CTNS_GID_FT,
641                                          vport->fc_ns_retry, 0);
642                         if (rc == 0)
643                                 goto out;
644                 }
645                 if (vport->fc_flag & FC_RSCN_MODE)
646                         lpfc_els_flush_rscn(vport);
647                 lpfc_vport_set_state(vport, FC_VPORT_FAILED);
648                 lpfc_printf_vlog(vport, KERN_ERR, LOG_ELS,
649                                  "0257 GID_FT Query error: 0x%x 0x%x\n",
650                                  irsp->ulpStatus, vport->fc_ns_retry);
651         } else {
652                 /* Good status, continue checking */
653                 CTrsp = (struct lpfc_sli_ct_request *) outp->virt;
654                 if (CTrsp->CommandResponse.bits.CmdRsp ==
655                     be16_to_cpu(SLI_CT_RESPONSE_FS_ACC)) {
656                         lpfc_printf_vlog(vport, KERN_INFO, LOG_DISCOVERY,
657                                          "0208 NameServer Rsp Data: x%x\n",
658                                          vport->fc_flag);
659                         lpfc_ns_rsp(vport, outp,
660                                     (uint32_t) (irsp->un.genreq64.bdl.bdeSize));
661                 } else if (CTrsp->CommandResponse.bits.CmdRsp ==
662                            be16_to_cpu(SLI_CT_RESPONSE_FS_RJT)) {
663                         /* NameServer Rsp Error */
664                         if ((CTrsp->ReasonCode == SLI_CT_UNABLE_TO_PERFORM_REQ)
665                             && (CTrsp->Explanation == SLI_CT_NO_FC4_TYPES)) {
666                                 lpfc_printf_vlog(vport, KERN_INFO,
667                                         LOG_DISCOVERY,
668                                         "0269 No NameServer Entries "
669                                         "Data: x%x x%x x%x x%x\n",
670                                         CTrsp->CommandResponse.bits.CmdRsp,
671                                         (uint32_t) CTrsp->ReasonCode,
672                                         (uint32_t) CTrsp->Explanation,
673                                         vport->fc_flag);
674
675                                 lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_CT,
676                                 "GID_FT no entry  cmd:x%x rsn:x%x exp:x%x",
677                                 (uint32_t)CTrsp->CommandResponse.bits.CmdRsp,
678                                 (uint32_t) CTrsp->ReasonCode,
679                                 (uint32_t) CTrsp->Explanation);
680                         } else {
681                                 lpfc_printf_vlog(vport, KERN_INFO,
682                                         LOG_DISCOVERY,
683                                         "0240 NameServer Rsp Error "
684                                         "Data: x%x x%x x%x x%x\n",
685                                         CTrsp->CommandResponse.bits.CmdRsp,
686                                         (uint32_t) CTrsp->ReasonCode,
687                                         (uint32_t) CTrsp->Explanation,
688                                         vport->fc_flag);
689
690                                 lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_CT,
691                                 "GID_FT rsp err1  cmd:x%x rsn:x%x exp:x%x",
692                                 (uint32_t)CTrsp->CommandResponse.bits.CmdRsp,
693                                 (uint32_t) CTrsp->ReasonCode,
694                                 (uint32_t) CTrsp->Explanation);
695                         }
696
697
698                 } else {
699                         /* NameServer Rsp Error */
700                         lpfc_printf_vlog(vport, KERN_ERR, LOG_DISCOVERY,
701                                         "0241 NameServer Rsp Error "
702                                         "Data: x%x x%x x%x x%x\n",
703                                         CTrsp->CommandResponse.bits.CmdRsp,
704                                         (uint32_t) CTrsp->ReasonCode,
705                                         (uint32_t) CTrsp->Explanation,
706                                         vport->fc_flag);
707
708                         lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_CT,
709                                 "GID_FT rsp err2  cmd:x%x rsn:x%x exp:x%x",
710                                 (uint32_t)CTrsp->CommandResponse.bits.CmdRsp,
711                                 (uint32_t) CTrsp->ReasonCode,
712                                 (uint32_t) CTrsp->Explanation);
713                 }
714         }
715         /* Link up / RSCN discovery */
716         if (vport->num_disc_nodes == 0) {
717                 /*
718                  * The driver has cycled through all Nports in the RSCN payload.
719                  * Complete the handling by cleaning up and marking the
720                  * current driver state.
721                  */
722                 if (vport->port_state >= LPFC_DISC_AUTH) {
723                         if (vport->fc_flag & FC_RSCN_MODE) {
724                                 lpfc_els_flush_rscn(vport);
725                                 spin_lock_irq(shost->host_lock);
726                                 vport->fc_flag |= FC_RSCN_MODE; /* RSCN still */
727                                 spin_unlock_irq(shost->host_lock);
728                         }
729                         else
730                                 lpfc_els_flush_rscn(vport);
731                 }
732
733                 lpfc_disc_start(vport);
734         }
735 out:
736         cmdiocb->context_un.ndlp = ndlp; /* Now restore ndlp for free */
737         lpfc_ct_free_iocb(phba, cmdiocb);
738         return;
739 }
740
741 static void
742 lpfc_cmpl_ct_cmd_gff_id(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
743                         struct lpfc_iocbq *rspiocb)
744 {
745         struct lpfc_vport *vport = cmdiocb->vport;
746         struct Scsi_Host *shost = lpfc_shost_from_vport(vport);
747         IOCB_t *irsp = &rspiocb->iocb;
748         struct lpfc_dmabuf *inp = (struct lpfc_dmabuf *) cmdiocb->context1;
749         struct lpfc_dmabuf *outp = (struct lpfc_dmabuf *) cmdiocb->context2;
750         struct lpfc_sli_ct_request *CTrsp;
751         int did, rc, retry;
752         uint8_t fbits;
753         struct lpfc_nodelist *ndlp;
754
755         did = ((struct lpfc_sli_ct_request *) inp->virt)->un.gff.PortId;
756         did = be32_to_cpu(did);
757
758         lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_CT,
759                 "GFF_ID cmpl:     status:x%x/x%x did:x%x",
760                 irsp->ulpStatus, irsp->un.ulpWord[4], did);
761
762         if (irsp->ulpStatus == IOSTAT_SUCCESS) {
763                 /* Good status, continue checking */
764                 CTrsp = (struct lpfc_sli_ct_request *) outp->virt;
765                 fbits = CTrsp->un.gff_acc.fbits[FCP_TYPE_FEATURE_OFFSET];
766
767                 if (CTrsp->CommandResponse.bits.CmdRsp ==
768                     be16_to_cpu(SLI_CT_RESPONSE_FS_ACC)) {
769                         if ((fbits & FC4_FEATURE_INIT) &&
770                             !(fbits & FC4_FEATURE_TARGET)) {
771                                 lpfc_printf_vlog(vport, KERN_INFO,
772                                                  LOG_DISCOVERY,
773                                                  "0270 Skip x%x GFF "
774                                                  "NameServer Rsp Data: (init) "
775                                                  "x%x x%x\n", did, fbits,
776                                                  vport->fc_rscn_id_cnt);
777                                 goto out;
778                         }
779                 }
780         }
781         else {
782                 /* Check for retry */
783                 if (cmdiocb->retry < LPFC_MAX_NS_RETRY) {
784                         retry = 1;
785                         if (irsp->ulpStatus == IOSTAT_LOCAL_REJECT) {
786                                 switch (irsp->un.ulpWord[4]) {
787                                 case IOERR_NO_RESOURCES:
788                                         /* We don't increment the retry
789                                          * count for this case.
790                                          */
791                                         break;
792                                 case IOERR_LINK_DOWN:
793                                 case IOERR_SLI_ABORTED:
794                                 case IOERR_SLI_DOWN:
795                                         retry = 0;
796                                         break;
797                                 default:
798                                         cmdiocb->retry++;
799                                 }
800                         }
801                         else
802                                 cmdiocb->retry++;
803
804                         if (retry) {
805                                 /* CT command is being retried */
806                                 rc = lpfc_ns_cmd(vport, SLI_CTNS_GFF_ID,
807                                          cmdiocb->retry, did);
808                                 if (rc == 0) {
809                                         /* success */
810                                         lpfc_ct_free_iocb(phba, cmdiocb);
811                                         return;
812                                 }
813                         }
814                 }
815                 lpfc_printf_vlog(vport, KERN_ERR, LOG_DISCOVERY,
816                                  "0267 NameServer GFF Rsp "
817                                  "x%x Error (%d %d) Data: x%x x%x\n",
818                                  did, irsp->ulpStatus, irsp->un.ulpWord[4],
819                                  vport->fc_flag, vport->fc_rscn_id_cnt);
820         }
821
822         /* This is a target port, unregistered port, or the GFF_ID failed */
823         ndlp = lpfc_setup_disc_node(vport, did);
824         if (ndlp && NLP_CHK_NODE_ACT(ndlp)) {
825                 lpfc_printf_vlog(vport, KERN_INFO, LOG_DISCOVERY,
826                                  "0242 Process x%x GFF "
827                                  "NameServer Rsp Data: x%x x%x x%x\n",
828                                  did, ndlp->nlp_flag, vport->fc_flag,
829                                  vport->fc_rscn_id_cnt);
830         } else {
831                 lpfc_printf_vlog(vport, KERN_INFO, LOG_DISCOVERY,
832                                  "0243 Skip x%x GFF "
833                                  "NameServer Rsp Data: x%x x%x\n", did,
834                                  vport->fc_flag, vport->fc_rscn_id_cnt);
835         }
836 out:
837         /* Link up / RSCN discovery */
838         if (vport->num_disc_nodes)
839                 vport->num_disc_nodes--;
840         if (vport->num_disc_nodes == 0) {
841                 /*
842                  * The driver has cycled through all Nports in the RSCN payload.
843                  * Complete the handling by cleaning up and marking the
844                  * current driver state.
845                  */
846                 if (vport->port_state >= LPFC_DISC_AUTH) {
847                         if (vport->fc_flag & FC_RSCN_MODE) {
848                                 lpfc_els_flush_rscn(vport);
849                                 spin_lock_irq(shost->host_lock);
850                                 vport->fc_flag |= FC_RSCN_MODE; /* RSCN still */
851                                 spin_unlock_irq(shost->host_lock);
852                         }
853                         else
854                                 lpfc_els_flush_rscn(vport);
855                 }
856                 lpfc_disc_start(vport);
857         }
858         lpfc_ct_free_iocb(phba, cmdiocb);
859         return;
860 }
861
862
863 static void
864 lpfc_cmpl_ct(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
865              struct lpfc_iocbq *rspiocb)
866 {
867         struct lpfc_vport *vport = cmdiocb->vport;
868         struct lpfc_dmabuf *inp;
869         struct lpfc_dmabuf *outp;
870         IOCB_t *irsp;
871         struct lpfc_sli_ct_request *CTrsp;
872         struct lpfc_nodelist *ndlp;
873         int cmdcode, rc;
874         uint8_t retry;
875         uint32_t latt;
876
877         /* First save ndlp, before we overwrite it */
878         ndlp = cmdiocb->context_un.ndlp;
879
880         /* we pass cmdiocb to state machine which needs rspiocb as well */
881         cmdiocb->context_un.rsp_iocb = rspiocb;
882
883         inp = (struct lpfc_dmabuf *) cmdiocb->context1;
884         outp = (struct lpfc_dmabuf *) cmdiocb->context2;
885         irsp = &rspiocb->iocb;
886
887         cmdcode = be16_to_cpu(((struct lpfc_sli_ct_request *) inp->virt)->
888                                         CommandResponse.bits.CmdRsp);
889         CTrsp = (struct lpfc_sli_ct_request *) outp->virt;
890
891         latt = lpfc_els_chk_latt(vport);
892
893         /* RFT request completes status <ulpStatus> CmdRsp <CmdRsp> */
894         lpfc_printf_vlog(vport, KERN_INFO, LOG_DISCOVERY,
895                          "0209 CT Request completes, latt %d, "
896                          "ulpStatus x%x CmdRsp x%x, Context x%x, Tag x%x\n",
897                          latt, irsp->ulpStatus,
898                          CTrsp->CommandResponse.bits.CmdRsp,
899                          cmdiocb->iocb.ulpContext, cmdiocb->iocb.ulpIoTag);
900
901         lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_CT,
902                 "CT cmd cmpl:     status:x%x/x%x cmd:x%x",
903                 irsp->ulpStatus, irsp->un.ulpWord[4], cmdcode);
904
905         if (irsp->ulpStatus) {
906                 lpfc_printf_vlog(vport, KERN_ERR, LOG_DISCOVERY,
907                                  "0268 NS cmd %x Error (%d %d)\n",
908                                  cmdcode, irsp->ulpStatus, irsp->un.ulpWord[4]);
909
910                 if ((irsp->ulpStatus == IOSTAT_LOCAL_REJECT) &&
911                         ((irsp->un.ulpWord[4] == IOERR_SLI_DOWN) ||
912                          (irsp->un.ulpWord[4] == IOERR_SLI_ABORTED)))
913                         goto out;
914
915                 retry = cmdiocb->retry;
916                 if (retry >= LPFC_MAX_NS_RETRY)
917                         goto out;
918
919                 retry++;
920                 lpfc_printf_vlog(vport, KERN_INFO, LOG_DISCOVERY,
921                                  "0250 Retrying NS cmd %x\n", cmdcode);
922                 rc = lpfc_ns_cmd(vport, cmdcode, retry, 0);
923                 if (rc == 0)
924                         goto out;
925         }
926
927 out:
928         cmdiocb->context_un.ndlp = ndlp; /* Now restore ndlp for free */
929         lpfc_ct_free_iocb(phba, cmdiocb);
930         return;
931 }
932
933 static void
934 lpfc_cmpl_ct_cmd_rft_id(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
935                         struct lpfc_iocbq *rspiocb)
936 {
937         IOCB_t *irsp = &rspiocb->iocb;
938         struct lpfc_vport *vport = cmdiocb->vport;
939
940         if (irsp->ulpStatus == IOSTAT_SUCCESS) {
941                 struct lpfc_dmabuf *outp;
942                 struct lpfc_sli_ct_request *CTrsp;
943
944                 outp = (struct lpfc_dmabuf *) cmdiocb->context2;
945                 CTrsp = (struct lpfc_sli_ct_request *) outp->virt;
946                 if (CTrsp->CommandResponse.bits.CmdRsp ==
947                     be16_to_cpu(SLI_CT_RESPONSE_FS_ACC))
948                         vport->ct_flags |= FC_CT_RFT_ID;
949         }
950         lpfc_cmpl_ct(phba, cmdiocb, rspiocb);
951         return;
952 }
953
954 static void
955 lpfc_cmpl_ct_cmd_rnn_id(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
956                         struct lpfc_iocbq *rspiocb)
957 {
958         IOCB_t *irsp = &rspiocb->iocb;
959         struct lpfc_vport *vport = cmdiocb->vport;
960
961         if (irsp->ulpStatus == IOSTAT_SUCCESS) {
962                 struct lpfc_dmabuf *outp;
963                 struct lpfc_sli_ct_request *CTrsp;
964
965                 outp = (struct lpfc_dmabuf *) cmdiocb->context2;
966                 CTrsp = (struct lpfc_sli_ct_request *) outp->virt;
967                 if (CTrsp->CommandResponse.bits.CmdRsp ==
968                     be16_to_cpu(SLI_CT_RESPONSE_FS_ACC))
969                         vport->ct_flags |= FC_CT_RNN_ID;
970         }
971         lpfc_cmpl_ct(phba, cmdiocb, rspiocb);
972         return;
973 }
974
975 static void
976 lpfc_cmpl_ct_cmd_rspn_id(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
977                          struct lpfc_iocbq *rspiocb)
978 {
979         IOCB_t *irsp = &rspiocb->iocb;
980         struct lpfc_vport *vport = cmdiocb->vport;
981
982         if (irsp->ulpStatus == IOSTAT_SUCCESS) {
983                 struct lpfc_dmabuf *outp;
984                 struct lpfc_sli_ct_request *CTrsp;
985
986                 outp = (struct lpfc_dmabuf *) cmdiocb->context2;
987                 CTrsp = (struct lpfc_sli_ct_request *) outp->virt;
988                 if (CTrsp->CommandResponse.bits.CmdRsp ==
989                     be16_to_cpu(SLI_CT_RESPONSE_FS_ACC))
990                         vport->ct_flags |= FC_CT_RSPN_ID;
991         }
992         lpfc_cmpl_ct(phba, cmdiocb, rspiocb);
993         return;
994 }
995
996 static void
997 lpfc_cmpl_ct_cmd_rsnn_nn(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
998                          struct lpfc_iocbq *rspiocb)
999 {
1000         IOCB_t *irsp = &rspiocb->iocb;
1001         struct lpfc_vport *vport = cmdiocb->vport;
1002
1003         if (irsp->ulpStatus == IOSTAT_SUCCESS) {
1004                 struct lpfc_dmabuf *outp;
1005                 struct lpfc_sli_ct_request *CTrsp;
1006
1007                 outp = (struct lpfc_dmabuf *) cmdiocb->context2;
1008                 CTrsp = (struct lpfc_sli_ct_request *) outp->virt;
1009                 if (CTrsp->CommandResponse.bits.CmdRsp ==
1010                     be16_to_cpu(SLI_CT_RESPONSE_FS_ACC))
1011                         vport->ct_flags |= FC_CT_RSNN_NN;
1012         }
1013         lpfc_cmpl_ct(phba, cmdiocb, rspiocb);
1014         return;
1015 }
1016
1017 static void
1018 lpfc_cmpl_ct_cmd_da_id(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
1019  struct lpfc_iocbq *rspiocb)
1020 {
1021         struct lpfc_vport *vport = cmdiocb->vport;
1022
1023         /* even if it fails we will act as though it succeeded. */
1024         vport->ct_flags = 0;
1025         lpfc_cmpl_ct(phba, cmdiocb, rspiocb);
1026         return;
1027 }
1028
1029 static void
1030 lpfc_cmpl_ct_cmd_rff_id(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
1031                         struct lpfc_iocbq *rspiocb)
1032 {
1033         IOCB_t *irsp = &rspiocb->iocb;
1034         struct lpfc_vport *vport = cmdiocb->vport;
1035
1036         if (irsp->ulpStatus == IOSTAT_SUCCESS) {
1037                 struct lpfc_dmabuf *outp;
1038                 struct lpfc_sli_ct_request *CTrsp;
1039
1040                 outp = (struct lpfc_dmabuf *) cmdiocb->context2;
1041                 CTrsp = (struct lpfc_sli_ct_request *) outp->virt;
1042                 if (CTrsp->CommandResponse.bits.CmdRsp ==
1043                     be16_to_cpu(SLI_CT_RESPONSE_FS_ACC))
1044                         vport->ct_flags |= FC_CT_RFF_ID;
1045         }
1046         lpfc_cmpl_ct(phba, cmdiocb, rspiocb);
1047         return;
1048 }
1049
1050 int
1051 lpfc_vport_symbolic_port_name(struct lpfc_vport *vport, char *symbol,
1052         size_t size)
1053 {
1054         int n;
1055         uint8_t *wwn = vport->phba->wwpn;
1056
1057         n = snprintf(symbol, size,
1058                      "Emulex PPN-%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x",
1059                      wwn[0], wwn[1], wwn[2], wwn[3],
1060                      wwn[4], wwn[5], wwn[6], wwn[7]);
1061
1062         if (vport->port_type == LPFC_PHYSICAL_PORT)
1063                 return n;
1064
1065         if (n < size)
1066                 n += snprintf(symbol + n, size - n, " VPort-%d", vport->vpi);
1067
1068         if (n < size &&
1069             strlen(vport->fc_vport->symbolic_name))
1070                 n += snprintf(symbol + n, size - n, " VName-%s",
1071                               vport->fc_vport->symbolic_name);
1072         return n;
1073 }
1074
1075 int
1076 lpfc_vport_symbolic_node_name(struct lpfc_vport *vport, char *symbol,
1077         size_t size)
1078 {
1079         char fwrev[16];
1080         int n;
1081
1082         lpfc_decode_firmware_rev(vport->phba, fwrev, 0);
1083
1084         n = snprintf(symbol, size, "Emulex %s FV%s DV%s",
1085                 vport->phba->ModelName, fwrev, lpfc_release_version);
1086         return n;
1087 }
1088
1089 /*
1090  * lpfc_ns_cmd
1091  * Description:
1092  *    Issue Cmd to NameServer
1093  *       SLI_CTNS_GID_FT
1094  *       LI_CTNS_RFT_ID
1095  */
1096 int
1097 lpfc_ns_cmd(struct lpfc_vport *vport, int cmdcode,
1098             uint8_t retry, uint32_t context)
1099 {
1100         struct lpfc_nodelist * ndlp;
1101         struct lpfc_hba *phba = vport->phba;
1102         struct lpfc_dmabuf *mp, *bmp;
1103         struct lpfc_sli_ct_request *CtReq;
1104         struct ulp_bde64 *bpl;
1105         void (*cmpl) (struct lpfc_hba *, struct lpfc_iocbq *,
1106                       struct lpfc_iocbq *) = NULL;
1107         uint32_t rsp_size = 1024;
1108         size_t   size;
1109         int rc = 0;
1110
1111         ndlp = lpfc_findnode_did(vport, NameServer_DID);
1112         if (!ndlp || !NLP_CHK_NODE_ACT(ndlp)
1113             || ndlp->nlp_state != NLP_STE_UNMAPPED_NODE) {
1114                 rc=1;
1115                 goto ns_cmd_exit;
1116         }
1117
1118         /* fill in BDEs for command */
1119         /* Allocate buffer for command payload */
1120         mp = kmalloc(sizeof (struct lpfc_dmabuf), GFP_KERNEL);
1121         if (!mp) {
1122                 rc=2;
1123                 goto ns_cmd_exit;
1124         }
1125
1126         INIT_LIST_HEAD(&mp->list);
1127         mp->virt = lpfc_mbuf_alloc(phba, MEM_PRI, &(mp->phys));
1128         if (!mp->virt) {
1129                 rc=3;
1130                 goto ns_cmd_free_mp;
1131         }
1132
1133         /* Allocate buffer for Buffer ptr list */
1134         bmp = kmalloc(sizeof (struct lpfc_dmabuf), GFP_KERNEL);
1135         if (!bmp) {
1136                 rc=4;
1137                 goto ns_cmd_free_mpvirt;
1138         }
1139
1140         INIT_LIST_HEAD(&bmp->list);
1141         bmp->virt = lpfc_mbuf_alloc(phba, MEM_PRI, &(bmp->phys));
1142         if (!bmp->virt) {
1143                 rc=5;
1144                 goto ns_cmd_free_bmp;
1145         }
1146
1147         /* NameServer Req */
1148         lpfc_printf_vlog(vport, KERN_INFO ,LOG_DISCOVERY,
1149                          "0236 NameServer Req Data: x%x x%x x%x\n",
1150                          cmdcode, vport->fc_flag, vport->fc_rscn_id_cnt);
1151
1152         bpl = (struct ulp_bde64 *) bmp->virt;
1153         memset(bpl, 0, sizeof(struct ulp_bde64));
1154         bpl->addrHigh = le32_to_cpu(putPaddrHigh(mp->phys) );
1155         bpl->addrLow = le32_to_cpu(putPaddrLow(mp->phys) );
1156         bpl->tus.f.bdeFlags = 0;
1157         if (cmdcode == SLI_CTNS_GID_FT)
1158                 bpl->tus.f.bdeSize = GID_REQUEST_SZ;
1159         else if (cmdcode == SLI_CTNS_GFF_ID)
1160                 bpl->tus.f.bdeSize = GFF_REQUEST_SZ;
1161         else if (cmdcode == SLI_CTNS_RFT_ID)
1162                 bpl->tus.f.bdeSize = RFT_REQUEST_SZ;
1163         else if (cmdcode == SLI_CTNS_RNN_ID)
1164                 bpl->tus.f.bdeSize = RNN_REQUEST_SZ;
1165         else if (cmdcode == SLI_CTNS_RSPN_ID)
1166                 bpl->tus.f.bdeSize = RSPN_REQUEST_SZ;
1167         else if (cmdcode == SLI_CTNS_RSNN_NN)
1168                 bpl->tus.f.bdeSize = RSNN_REQUEST_SZ;
1169         else if (cmdcode == SLI_CTNS_DA_ID)
1170                 bpl->tus.f.bdeSize = DA_ID_REQUEST_SZ;
1171         else if (cmdcode == SLI_CTNS_RFF_ID)
1172                 bpl->tus.f.bdeSize = RFF_REQUEST_SZ;
1173         else
1174                 bpl->tus.f.bdeSize = 0;
1175         bpl->tus.w = le32_to_cpu(bpl->tus.w);
1176
1177         CtReq = (struct lpfc_sli_ct_request *) mp->virt;
1178         memset(CtReq, 0, sizeof (struct lpfc_sli_ct_request));
1179         CtReq->RevisionId.bits.Revision = SLI_CT_REVISION;
1180         CtReq->RevisionId.bits.InId = 0;
1181         CtReq->FsType = SLI_CT_DIRECTORY_SERVICE;
1182         CtReq->FsSubType = SLI_CT_DIRECTORY_NAME_SERVER;
1183         CtReq->CommandResponse.bits.Size = 0;
1184         switch (cmdcode) {
1185         case SLI_CTNS_GID_FT:
1186                 CtReq->CommandResponse.bits.CmdRsp =
1187                     be16_to_cpu(SLI_CTNS_GID_FT);
1188                 CtReq->un.gid.Fc4Type = SLI_CTPT_FCP;
1189                 if (vport->port_state < LPFC_NS_QRY)
1190                         vport->port_state = LPFC_NS_QRY;
1191                 lpfc_set_disctmo(vport);
1192                 cmpl = lpfc_cmpl_ct_cmd_gid_ft;
1193                 rsp_size = FC_MAX_NS_RSP;
1194                 break;
1195
1196         case SLI_CTNS_GFF_ID:
1197                 CtReq->CommandResponse.bits.CmdRsp =
1198                         be16_to_cpu(SLI_CTNS_GFF_ID);
1199                 CtReq->un.gff.PortId = cpu_to_be32(context);
1200                 cmpl = lpfc_cmpl_ct_cmd_gff_id;
1201                 break;
1202
1203         case SLI_CTNS_RFT_ID:
1204                 vport->ct_flags &= ~FC_CT_RFT_ID;
1205                 CtReq->CommandResponse.bits.CmdRsp =
1206                     be16_to_cpu(SLI_CTNS_RFT_ID);
1207                 CtReq->un.rft.PortId = cpu_to_be32(vport->fc_myDID);
1208                 CtReq->un.rft.fcpReg = 1;
1209                 cmpl = lpfc_cmpl_ct_cmd_rft_id;
1210                 break;
1211
1212         case SLI_CTNS_RNN_ID:
1213                 vport->ct_flags &= ~FC_CT_RNN_ID;
1214                 CtReq->CommandResponse.bits.CmdRsp =
1215                     be16_to_cpu(SLI_CTNS_RNN_ID);
1216                 CtReq->un.rnn.PortId = cpu_to_be32(vport->fc_myDID);
1217                 memcpy(CtReq->un.rnn.wwnn,  &vport->fc_nodename,
1218                        sizeof (struct lpfc_name));
1219                 cmpl = lpfc_cmpl_ct_cmd_rnn_id;
1220                 break;
1221
1222         case SLI_CTNS_RSPN_ID:
1223                 vport->ct_flags &= ~FC_CT_RSPN_ID;
1224                 CtReq->CommandResponse.bits.CmdRsp =
1225                     be16_to_cpu(SLI_CTNS_RSPN_ID);
1226                 CtReq->un.rspn.PortId = cpu_to_be32(vport->fc_myDID);
1227                 size = sizeof(CtReq->un.rspn.symbname);
1228                 CtReq->un.rspn.len =
1229                         lpfc_vport_symbolic_port_name(vport,
1230                         CtReq->un.rspn.symbname, size);
1231                 cmpl = lpfc_cmpl_ct_cmd_rspn_id;
1232                 break;
1233         case SLI_CTNS_RSNN_NN:
1234                 vport->ct_flags &= ~FC_CT_RSNN_NN;
1235                 CtReq->CommandResponse.bits.CmdRsp =
1236                     be16_to_cpu(SLI_CTNS_RSNN_NN);
1237                 memcpy(CtReq->un.rsnn.wwnn, &vport->fc_nodename,
1238                        sizeof (struct lpfc_name));
1239                 size = sizeof(CtReq->un.rsnn.symbname);
1240                 CtReq->un.rsnn.len =
1241                         lpfc_vport_symbolic_node_name(vport,
1242                         CtReq->un.rsnn.symbname, size);
1243                 cmpl = lpfc_cmpl_ct_cmd_rsnn_nn;
1244                 break;
1245         case SLI_CTNS_DA_ID:
1246                 /* Implement DA_ID Nameserver request */
1247                 CtReq->CommandResponse.bits.CmdRsp =
1248                         be16_to_cpu(SLI_CTNS_DA_ID);
1249                 CtReq->un.da_id.port_id = cpu_to_be32(vport->fc_myDID);
1250                 cmpl = lpfc_cmpl_ct_cmd_da_id;
1251                 break;
1252         case SLI_CTNS_RFF_ID:
1253                 vport->ct_flags &= ~FC_CT_RFF_ID;
1254                 CtReq->CommandResponse.bits.CmdRsp =
1255                     be16_to_cpu(SLI_CTNS_RFF_ID);
1256                 CtReq->un.rff.PortId = cpu_to_be32(vport->fc_myDID);
1257                 CtReq->un.rff.fbits = FC4_FEATURE_INIT;
1258                 CtReq->un.rff.type_code = FC_TYPE_FCP;
1259                 cmpl = lpfc_cmpl_ct_cmd_rff_id;
1260                 break;
1261         }
1262         /* The lpfc_ct_cmd/lpfc_get_req shall increment ndlp reference count
1263          * to hold ndlp reference for the corresponding callback function.
1264          */
1265         if (!lpfc_ct_cmd(vport, mp, bmp, ndlp, cmpl, rsp_size, retry)) {
1266                 /* On success, The cmpl function will free the buffers */
1267                 lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_CT,
1268                         "Issue CT cmd:    cmd:x%x did:x%x",
1269                         cmdcode, ndlp->nlp_DID, 0);
1270                 return 0;
1271         }
1272         rc=6;
1273
1274         /* Decrement ndlp reference count to release ndlp reference held
1275          * for the failed command's callback function.
1276          */
1277         lpfc_nlp_put(ndlp);
1278
1279         lpfc_mbuf_free(phba, bmp->virt, bmp->phys);
1280 ns_cmd_free_bmp:
1281         kfree(bmp);
1282 ns_cmd_free_mpvirt:
1283         lpfc_mbuf_free(phba, mp->virt, mp->phys);
1284 ns_cmd_free_mp:
1285         kfree(mp);
1286 ns_cmd_exit:
1287         lpfc_printf_vlog(vport, KERN_ERR, LOG_DISCOVERY,
1288                          "0266 Issue NameServer Req x%x err %d Data: x%x x%x\n",
1289                          cmdcode, rc, vport->fc_flag, vport->fc_rscn_id_cnt);
1290         return 1;
1291 }
1292
1293 static void
1294 lpfc_cmpl_ct_cmd_fdmi(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
1295                       struct lpfc_iocbq * rspiocb)
1296 {
1297         struct lpfc_dmabuf *inp = cmdiocb->context1;
1298         struct lpfc_dmabuf *outp = cmdiocb->context2;
1299         struct lpfc_sli_ct_request *CTrsp = outp->virt;
1300         struct lpfc_sli_ct_request *CTcmd = inp->virt;
1301         struct lpfc_nodelist *ndlp;
1302         uint16_t fdmi_cmd = CTcmd->CommandResponse.bits.CmdRsp;
1303         uint16_t fdmi_rsp = CTrsp->CommandResponse.bits.CmdRsp;
1304         struct lpfc_vport *vport = cmdiocb->vport;
1305         IOCB_t *irsp = &rspiocb->iocb;
1306         uint32_t latt;
1307
1308         latt = lpfc_els_chk_latt(vport);
1309
1310         lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_CT,
1311                 "FDMI cmpl:       status:x%x/x%x latt:%d",
1312                 irsp->ulpStatus, irsp->un.ulpWord[4], latt);
1313
1314         if (latt || irsp->ulpStatus) {
1315                 lpfc_printf_vlog(vport, KERN_INFO, LOG_DISCOVERY,
1316                                  "0229 FDMI cmd %04x failed, latt = %d "
1317                                  "ulpStatus: x%x, rid x%x\n",
1318                                  be16_to_cpu(fdmi_cmd), latt, irsp->ulpStatus,
1319                                  irsp->un.ulpWord[4]);
1320                 lpfc_ct_free_iocb(phba, cmdiocb);
1321                 return;
1322         }
1323
1324         ndlp = lpfc_findnode_did(vport, FDMI_DID);
1325         if (!ndlp || !NLP_CHK_NODE_ACT(ndlp))
1326                 goto fail_out;
1327
1328         if (fdmi_rsp == be16_to_cpu(SLI_CT_RESPONSE_FS_RJT)) {
1329                 /* FDMI rsp failed */
1330                 lpfc_printf_vlog(vport, KERN_INFO, LOG_DISCOVERY,
1331                                  "0220 FDMI rsp failed Data: x%x\n",
1332                                  be16_to_cpu(fdmi_cmd));
1333         }
1334
1335         switch (be16_to_cpu(fdmi_cmd)) {
1336         case SLI_MGMT_RHBA:
1337                 lpfc_fdmi_cmd(vport, ndlp, SLI_MGMT_RPA);
1338                 break;
1339
1340         case SLI_MGMT_RPA:
1341                 break;
1342
1343         case SLI_MGMT_DHBA:
1344                 lpfc_fdmi_cmd(vport, ndlp, SLI_MGMT_DPRT);
1345                 break;
1346
1347         case SLI_MGMT_DPRT:
1348                 lpfc_fdmi_cmd(vport, ndlp, SLI_MGMT_RHBA);
1349                 break;
1350         }
1351
1352 fail_out:
1353         lpfc_ct_free_iocb(phba, cmdiocb);
1354         return;
1355 }
1356
1357 int
1358 lpfc_fdmi_cmd(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp, int cmdcode)
1359 {
1360         struct lpfc_hba *phba = vport->phba;
1361         struct lpfc_dmabuf *mp, *bmp;
1362         struct lpfc_sli_ct_request *CtReq;
1363         struct ulp_bde64 *bpl;
1364         uint32_t size;
1365         REG_HBA *rh;
1366         PORT_ENTRY *pe;
1367         REG_PORT_ATTRIBUTE *pab;
1368         ATTRIBUTE_BLOCK *ab;
1369         ATTRIBUTE_ENTRY *ae;
1370         void (*cmpl) (struct lpfc_hba *, struct lpfc_iocbq *,
1371                       struct lpfc_iocbq *);
1372
1373
1374         /* fill in BDEs for command */
1375         /* Allocate buffer for command payload */
1376         mp = kmalloc(sizeof (struct lpfc_dmabuf), GFP_KERNEL);
1377         if (!mp)
1378                 goto fdmi_cmd_exit;
1379
1380         mp->virt = lpfc_mbuf_alloc(phba, 0, &(mp->phys));
1381         if (!mp->virt)
1382                 goto fdmi_cmd_free_mp;
1383
1384         /* Allocate buffer for Buffer ptr list */
1385         bmp = kmalloc(sizeof (struct lpfc_dmabuf), GFP_KERNEL);
1386         if (!bmp)
1387                 goto fdmi_cmd_free_mpvirt;
1388
1389         bmp->virt = lpfc_mbuf_alloc(phba, 0, &(bmp->phys));
1390         if (!bmp->virt)
1391                 goto fdmi_cmd_free_bmp;
1392
1393         INIT_LIST_HEAD(&mp->list);
1394         INIT_LIST_HEAD(&bmp->list);
1395
1396         /* FDMI request */
1397         lpfc_printf_vlog(vport, KERN_INFO, LOG_DISCOVERY,
1398                          "0218 FDMI Request Data: x%x x%x x%x\n",
1399                          vport->fc_flag, vport->port_state, cmdcode);
1400         CtReq = (struct lpfc_sli_ct_request *) mp->virt;
1401
1402         memset(CtReq, 0, sizeof(struct lpfc_sli_ct_request));
1403         CtReq->RevisionId.bits.Revision = SLI_CT_REVISION;
1404         CtReq->RevisionId.bits.InId = 0;
1405
1406         CtReq->FsType = SLI_CT_MANAGEMENT_SERVICE;
1407         CtReq->FsSubType = SLI_CT_FDMI_Subtypes;
1408         size = 0;
1409
1410         switch (cmdcode) {
1411         case SLI_MGMT_RHBA:
1412                 {
1413                         lpfc_vpd_t *vp = &phba->vpd;
1414                         uint32_t i, j, incr;
1415                         int len;
1416
1417                         CtReq->CommandResponse.bits.CmdRsp =
1418                             be16_to_cpu(SLI_MGMT_RHBA);
1419                         CtReq->CommandResponse.bits.Size = 0;
1420                         rh = (REG_HBA *) & CtReq->un.PortID;
1421                         memcpy(&rh->hi.PortName, &vport->fc_sparam.portName,
1422                                sizeof (struct lpfc_name));
1423                         /* One entry (port) per adapter */
1424                         rh->rpl.EntryCnt = be32_to_cpu(1);
1425                         memcpy(&rh->rpl.pe, &vport->fc_sparam.portName,
1426                                sizeof (struct lpfc_name));
1427
1428                         /* point to the HBA attribute block */
1429                         size = 2 * sizeof (struct lpfc_name) + FOURBYTES;
1430                         ab = (ATTRIBUTE_BLOCK *) ((uint8_t *) rh + size);
1431                         ab->EntryCnt = 0;
1432
1433                         /* Point to the beginning of the first HBA attribute
1434                            entry */
1435                         /* #1 HBA attribute entry */
1436                         size += FOURBYTES;
1437                         ae = (ATTRIBUTE_ENTRY *) ((uint8_t *) rh + size);
1438                         ae->ad.bits.AttrType = be16_to_cpu(NODE_NAME);
1439                         ae->ad.bits.AttrLen =  be16_to_cpu(FOURBYTES
1440                                                 + sizeof (struct lpfc_name));
1441                         memcpy(&ae->un.NodeName, &vport->fc_sparam.nodeName,
1442                                sizeof (struct lpfc_name));
1443                         ab->EntryCnt++;
1444                         size += FOURBYTES + sizeof (struct lpfc_name);
1445
1446                         /* #2 HBA attribute entry */
1447                         ae = (ATTRIBUTE_ENTRY *) ((uint8_t *) rh + size);
1448                         ae->ad.bits.AttrType = be16_to_cpu(MANUFACTURER);
1449                         strcpy(ae->un.Manufacturer, "Emulex Corporation");
1450                         len = strlen(ae->un.Manufacturer);
1451                         len += (len & 3) ? (4 - (len & 3)) : 4;
1452                         ae->ad.bits.AttrLen = be16_to_cpu(FOURBYTES + len);
1453                         ab->EntryCnt++;
1454                         size += FOURBYTES + len;
1455
1456                         /* #3 HBA attribute entry */
1457                         ae = (ATTRIBUTE_ENTRY *) ((uint8_t *) rh + size);
1458                         ae->ad.bits.AttrType = be16_to_cpu(SERIAL_NUMBER);
1459                         strcpy(ae->un.SerialNumber, phba->SerialNumber);
1460                         len = strlen(ae->un.SerialNumber);
1461                         len += (len & 3) ? (4 - (len & 3)) : 4;
1462                         ae->ad.bits.AttrLen = be16_to_cpu(FOURBYTES + len);
1463                         ab->EntryCnt++;
1464                         size += FOURBYTES + len;
1465
1466                         /* #4 HBA attribute entry */
1467                         ae = (ATTRIBUTE_ENTRY *) ((uint8_t *) rh + size);
1468                         ae->ad.bits.AttrType = be16_to_cpu(MODEL);
1469                         strcpy(ae->un.Model, phba->ModelName);
1470                         len = strlen(ae->un.Model);
1471                         len += (len & 3) ? (4 - (len & 3)) : 4;
1472                         ae->ad.bits.AttrLen = be16_to_cpu(FOURBYTES + len);
1473                         ab->EntryCnt++;
1474                         size += FOURBYTES + len;
1475
1476                         /* #5 HBA attribute entry */
1477                         ae = (ATTRIBUTE_ENTRY *) ((uint8_t *) rh + size);
1478                         ae->ad.bits.AttrType = be16_to_cpu(MODEL_DESCRIPTION);
1479                         strcpy(ae->un.ModelDescription, phba->ModelDesc);
1480                         len = strlen(ae->un.ModelDescription);
1481                         len += (len & 3) ? (4 - (len & 3)) : 4;
1482                         ae->ad.bits.AttrLen = be16_to_cpu(FOURBYTES + len);
1483                         ab->EntryCnt++;
1484                         size += FOURBYTES + len;
1485
1486                         /* #6 HBA attribute entry */
1487                         ae = (ATTRIBUTE_ENTRY *) ((uint8_t *) rh + size);
1488                         ae->ad.bits.AttrType = be16_to_cpu(HARDWARE_VERSION);
1489                         ae->ad.bits.AttrLen = be16_to_cpu(FOURBYTES + 8);
1490                         /* Convert JEDEC ID to ascii for hardware version */
1491                         incr = vp->rev.biuRev;
1492                         for (i = 0; i < 8; i++) {
1493                                 j = (incr & 0xf);
1494                                 if (j <= 9)
1495                                         ae->un.HardwareVersion[7 - i] =
1496                                             (char)((uint8_t) 0x30 +
1497                                                    (uint8_t) j);
1498                                 else
1499                                         ae->un.HardwareVersion[7 - i] =
1500                                             (char)((uint8_t) 0x61 +
1501                                                    (uint8_t) (j - 10));
1502                                 incr = (incr >> 4);
1503                         }
1504                         ab->EntryCnt++;
1505                         size += FOURBYTES + 8;
1506
1507                         /* #7 HBA attribute entry */
1508                         ae = (ATTRIBUTE_ENTRY *) ((uint8_t *) rh + size);
1509                         ae->ad.bits.AttrType = be16_to_cpu(DRIVER_VERSION);
1510                         strcpy(ae->un.DriverVersion, lpfc_release_version);
1511                         len = strlen(ae->un.DriverVersion);
1512                         len += (len & 3) ? (4 - (len & 3)) : 4;
1513                         ae->ad.bits.AttrLen = be16_to_cpu(FOURBYTES + len);
1514                         ab->EntryCnt++;
1515                         size += FOURBYTES + len;
1516
1517                         /* #8 HBA attribute entry */
1518                         ae = (ATTRIBUTE_ENTRY *) ((uint8_t *) rh + size);
1519                         ae->ad.bits.AttrType = be16_to_cpu(OPTION_ROM_VERSION);
1520                         strcpy(ae->un.OptionROMVersion, phba->OptionROMVersion);
1521                         len = strlen(ae->un.OptionROMVersion);
1522                         len += (len & 3) ? (4 - (len & 3)) : 4;
1523                         ae->ad.bits.AttrLen = be16_to_cpu(FOURBYTES + len);
1524                         ab->EntryCnt++;
1525                         size += FOURBYTES + len;
1526
1527                         /* #9 HBA attribute entry */
1528                         ae = (ATTRIBUTE_ENTRY *) ((uint8_t *) rh + size);
1529                         ae->ad.bits.AttrType = be16_to_cpu(FIRMWARE_VERSION);
1530                         lpfc_decode_firmware_rev(phba, ae->un.FirmwareVersion,
1531                                 1);
1532                         len = strlen(ae->un.FirmwareVersion);
1533                         len += (len & 3) ? (4 - (len & 3)) : 4;
1534                         ae->ad.bits.AttrLen = be16_to_cpu(FOURBYTES + len);
1535                         ab->EntryCnt++;
1536                         size += FOURBYTES + len;
1537
1538                         /* #10 HBA attribute entry */
1539                         ae = (ATTRIBUTE_ENTRY *) ((uint8_t *) rh + size);
1540                         ae->ad.bits.AttrType = be16_to_cpu(OS_NAME_VERSION);
1541                         sprintf(ae->un.OsNameVersion, "%s %s %s",
1542                                 init_utsname()->sysname,
1543                                 init_utsname()->release,
1544                                 init_utsname()->version);
1545                         len = strlen(ae->un.OsNameVersion);
1546                         len += (len & 3) ? (4 - (len & 3)) : 4;
1547                         ae->ad.bits.AttrLen = be16_to_cpu(FOURBYTES + len);
1548                         ab->EntryCnt++;
1549                         size += FOURBYTES + len;
1550
1551                         /* #11 HBA attribute entry */
1552                         ae = (ATTRIBUTE_ENTRY *) ((uint8_t *) rh + size);
1553                         ae->ad.bits.AttrType = be16_to_cpu(MAX_CT_PAYLOAD_LEN);
1554                         ae->ad.bits.AttrLen = be16_to_cpu(FOURBYTES + 4);
1555                         ae->un.MaxCTPayloadLen = (65 * 4096);
1556                         ab->EntryCnt++;
1557                         size += FOURBYTES + 4;
1558
1559                         ab->EntryCnt = be32_to_cpu(ab->EntryCnt);
1560                         /* Total size */
1561                         size = GID_REQUEST_SZ - 4 + size;
1562                 }
1563                 break;
1564
1565         case SLI_MGMT_RPA:
1566                 {
1567                         lpfc_vpd_t *vp;
1568                         struct serv_parm *hsp;
1569                         int len;
1570
1571                         vp = &phba->vpd;
1572
1573                         CtReq->CommandResponse.bits.CmdRsp =
1574                             be16_to_cpu(SLI_MGMT_RPA);
1575                         CtReq->CommandResponse.bits.Size = 0;
1576                         pab = (REG_PORT_ATTRIBUTE *) & CtReq->un.PortID;
1577                         size = sizeof (struct lpfc_name) + FOURBYTES;
1578                         memcpy((uint8_t *) & pab->PortName,
1579                                (uint8_t *) & vport->fc_sparam.portName,
1580                                sizeof (struct lpfc_name));
1581                         pab->ab.EntryCnt = 0;
1582
1583                         /* #1 Port attribute entry */
1584                         ae = (ATTRIBUTE_ENTRY *) ((uint8_t *) pab + size);
1585                         ae->ad.bits.AttrType = be16_to_cpu(SUPPORTED_FC4_TYPES);
1586                         ae->ad.bits.AttrLen = be16_to_cpu(FOURBYTES + 32);
1587                         ae->un.SupportFC4Types[2] = 1;
1588                         ae->un.SupportFC4Types[7] = 1;
1589                         pab->ab.EntryCnt++;
1590                         size += FOURBYTES + 32;
1591
1592                         /* #2 Port attribute entry */
1593                         ae = (ATTRIBUTE_ENTRY *) ((uint8_t *) pab + size);
1594                         ae->ad.bits.AttrType = be16_to_cpu(SUPPORTED_SPEED);
1595                         ae->ad.bits.AttrLen = be16_to_cpu(FOURBYTES + 4);
1596
1597                         ae->un.SupportSpeed = 0;
1598                         if (phba->lmt & LMT_16Gb)
1599                                 ae->un.SupportSpeed |= HBA_PORTSPEED_16GBIT;
1600                         if (phba->lmt & LMT_10Gb)
1601                                 ae->un.SupportSpeed |= HBA_PORTSPEED_10GBIT;
1602                         if (phba->lmt & LMT_8Gb)
1603                                 ae->un.SupportSpeed |= HBA_PORTSPEED_8GBIT;
1604                         if (phba->lmt & LMT_4Gb)
1605                                 ae->un.SupportSpeed |= HBA_PORTSPEED_4GBIT;
1606                         if (phba->lmt & LMT_2Gb)
1607                                 ae->un.SupportSpeed |= HBA_PORTSPEED_2GBIT;
1608                         if (phba->lmt & LMT_1Gb)
1609                                 ae->un.SupportSpeed |= HBA_PORTSPEED_1GBIT;
1610
1611                         pab->ab.EntryCnt++;
1612                         size += FOURBYTES + 4;
1613
1614                         /* #3 Port attribute entry */
1615                         ae = (ATTRIBUTE_ENTRY *) ((uint8_t *) pab + size);
1616                         ae->ad.bits.AttrType = be16_to_cpu(PORT_SPEED);
1617                         ae->ad.bits.AttrLen = be16_to_cpu(FOURBYTES + 4);
1618                         switch(phba->fc_linkspeed) {
1619                         case LPFC_LINK_SPEED_1GHZ:
1620                                 ae->un.PortSpeed = HBA_PORTSPEED_1GBIT;
1621                                 break;
1622                         case LPFC_LINK_SPEED_2GHZ:
1623                                 ae->un.PortSpeed = HBA_PORTSPEED_2GBIT;
1624                                 break;
1625                         case LPFC_LINK_SPEED_4GHZ:
1626                                 ae->un.PortSpeed = HBA_PORTSPEED_4GBIT;
1627                                 break;
1628                         case LPFC_LINK_SPEED_8GHZ:
1629                                 ae->un.PortSpeed = HBA_PORTSPEED_8GBIT;
1630                                 break;
1631                         case LPFC_LINK_SPEED_10GHZ:
1632                                 ae->un.PortSpeed = HBA_PORTSPEED_10GBIT;
1633                                 break;
1634                         case LPFC_LINK_SPEED_16GHZ:
1635                                 ae->un.PortSpeed = HBA_PORTSPEED_16GBIT;
1636                                 break;
1637                         default:
1638                                 ae->un.PortSpeed = HBA_PORTSPEED_UNKNOWN;
1639                                 break;
1640                         }
1641                         pab->ab.EntryCnt++;
1642                         size += FOURBYTES + 4;
1643
1644                         /* #4 Port attribute entry */
1645                         ae = (ATTRIBUTE_ENTRY *) ((uint8_t *) pab + size);
1646                         ae->ad.bits.AttrType = be16_to_cpu(MAX_FRAME_SIZE);
1647                         ae->ad.bits.AttrLen = be16_to_cpu(FOURBYTES + 4);
1648                         hsp = (struct serv_parm *) & vport->fc_sparam;
1649                         ae->un.MaxFrameSize =
1650                             (((uint32_t) hsp->cmn.
1651                               bbRcvSizeMsb) << 8) | (uint32_t) hsp->cmn.
1652                             bbRcvSizeLsb;
1653                         pab->ab.EntryCnt++;
1654                         size += FOURBYTES + 4;
1655
1656                         /* #5 Port attribute entry */
1657                         ae = (ATTRIBUTE_ENTRY *) ((uint8_t *) pab + size);
1658                         ae->ad.bits.AttrType = be16_to_cpu(OS_DEVICE_NAME);
1659                         strcpy((char *)ae->un.OsDeviceName, LPFC_DRIVER_NAME);
1660                         len = strlen((char *)ae->un.OsDeviceName);
1661                         len += (len & 3) ? (4 - (len & 3)) : 4;
1662                         ae->ad.bits.AttrLen = be16_to_cpu(FOURBYTES + len);
1663                         pab->ab.EntryCnt++;
1664                         size += FOURBYTES + len;
1665
1666                         if (vport->cfg_fdmi_on == 2) {
1667                                 /* #6 Port attribute entry */
1668                                 ae = (ATTRIBUTE_ENTRY *) ((uint8_t *) pab +
1669                                                           size);
1670                                 ae->ad.bits.AttrType = be16_to_cpu(HOST_NAME);
1671                                 sprintf(ae->un.HostName, "%s",
1672                                         init_utsname()->nodename);
1673                                 len = strlen(ae->un.HostName);
1674                                 len += (len & 3) ? (4 - (len & 3)) : 4;
1675                                 ae->ad.bits.AttrLen =
1676                                     be16_to_cpu(FOURBYTES + len);
1677                                 pab->ab.EntryCnt++;
1678                                 size += FOURBYTES + len;
1679                         }
1680
1681                         pab->ab.EntryCnt = be32_to_cpu(pab->ab.EntryCnt);
1682                         /* Total size */
1683                         size = GID_REQUEST_SZ - 4 + size;
1684                 }
1685                 break;
1686
1687         case SLI_MGMT_DHBA:
1688                 CtReq->CommandResponse.bits.CmdRsp = be16_to_cpu(SLI_MGMT_DHBA);
1689                 CtReq->CommandResponse.bits.Size = 0;
1690                 pe = (PORT_ENTRY *) & CtReq->un.PortID;
1691                 memcpy((uint8_t *) & pe->PortName,
1692                        (uint8_t *) & vport->fc_sparam.portName,
1693                        sizeof (struct lpfc_name));
1694                 size = GID_REQUEST_SZ - 4 + sizeof (struct lpfc_name);
1695                 break;
1696
1697         case SLI_MGMT_DPRT:
1698                 CtReq->CommandResponse.bits.CmdRsp = be16_to_cpu(SLI_MGMT_DPRT);
1699                 CtReq->CommandResponse.bits.Size = 0;
1700                 pe = (PORT_ENTRY *) & CtReq->un.PortID;
1701                 memcpy((uint8_t *) & pe->PortName,
1702                        (uint8_t *) & vport->fc_sparam.portName,
1703                        sizeof (struct lpfc_name));
1704                 size = GID_REQUEST_SZ - 4 + sizeof (struct lpfc_name);
1705                 break;
1706         }
1707
1708         bpl = (struct ulp_bde64 *) bmp->virt;
1709         bpl->addrHigh = le32_to_cpu(putPaddrHigh(mp->phys) );
1710         bpl->addrLow = le32_to_cpu(putPaddrLow(mp->phys) );
1711         bpl->tus.f.bdeFlags = 0;
1712         bpl->tus.f.bdeSize = size;
1713         bpl->tus.w = le32_to_cpu(bpl->tus.w);
1714
1715         cmpl = lpfc_cmpl_ct_cmd_fdmi;
1716
1717         /* The lpfc_ct_cmd/lpfc_get_req shall increment ndlp reference count
1718          * to hold ndlp reference for the corresponding callback function.
1719          */
1720         if (!lpfc_ct_cmd(vport, mp, bmp, ndlp, cmpl, FC_MAX_NS_RSP, 0))
1721                 return 0;
1722
1723         /* Decrement ndlp reference count to release ndlp reference held
1724          * for the failed command's callback function.
1725          */
1726         lpfc_nlp_put(ndlp);
1727
1728         lpfc_mbuf_free(phba, bmp->virt, bmp->phys);
1729 fdmi_cmd_free_bmp:
1730         kfree(bmp);
1731 fdmi_cmd_free_mpvirt:
1732         lpfc_mbuf_free(phba, mp->virt, mp->phys);
1733 fdmi_cmd_free_mp:
1734         kfree(mp);
1735 fdmi_cmd_exit:
1736         /* Issue FDMI request failed */
1737         lpfc_printf_vlog(vport, KERN_INFO, LOG_DISCOVERY,
1738                          "0244 Issue FDMI request failed Data: x%x\n",
1739                          cmdcode);
1740         return 1;
1741 }
1742
1743 /**
1744  * lpfc_delayed_disc_tmo - Timeout handler for delayed discovery timer.
1745  * @ptr - Context object of the timer.
1746  *
1747  * This function set the WORKER_DELAYED_DISC_TMO flag and wake up
1748  * the worker thread.
1749  **/
1750 void
1751 lpfc_delayed_disc_tmo(unsigned long ptr)
1752 {
1753         struct lpfc_vport *vport = (struct lpfc_vport *)ptr;
1754         struct lpfc_hba   *phba = vport->phba;
1755         uint32_t tmo_posted;
1756         unsigned long iflag;
1757
1758         spin_lock_irqsave(&vport->work_port_lock, iflag);
1759         tmo_posted = vport->work_port_events & WORKER_DELAYED_DISC_TMO;
1760         if (!tmo_posted)
1761                 vport->work_port_events |= WORKER_DELAYED_DISC_TMO;
1762         spin_unlock_irqrestore(&vport->work_port_lock, iflag);
1763
1764         if (!tmo_posted)
1765                 lpfc_worker_wake_up(phba);
1766         return;
1767 }
1768
1769 /**
1770  * lpfc_delayed_disc_timeout_handler - Function called by worker thread to
1771  *      handle delayed discovery.
1772  * @vport: pointer to a host virtual N_Port data structure.
1773  *
1774  * This function start nport discovery of the vport.
1775  **/
1776 void
1777 lpfc_delayed_disc_timeout_handler(struct lpfc_vport *vport)
1778 {
1779         struct Scsi_Host *shost = lpfc_shost_from_vport(vport);
1780
1781         spin_lock_irq(shost->host_lock);
1782         if (!(vport->fc_flag & FC_DISC_DELAYED)) {
1783                 spin_unlock_irq(shost->host_lock);
1784                 return;
1785         }
1786         vport->fc_flag &= ~FC_DISC_DELAYED;
1787         spin_unlock_irq(shost->host_lock);
1788
1789         lpfc_do_scr_ns_plogi(vport->phba, vport);
1790 }
1791
1792 void
1793 lpfc_fdmi_tmo(unsigned long ptr)
1794 {
1795         struct lpfc_vport *vport = (struct lpfc_vport *)ptr;
1796         struct lpfc_hba   *phba = vport->phba;
1797         uint32_t tmo_posted;
1798         unsigned long iflag;
1799
1800         spin_lock_irqsave(&vport->work_port_lock, iflag);
1801         tmo_posted = vport->work_port_events & WORKER_FDMI_TMO;
1802         if (!tmo_posted)
1803                 vport->work_port_events |= WORKER_FDMI_TMO;
1804         spin_unlock_irqrestore(&vport->work_port_lock, iflag);
1805
1806         if (!tmo_posted)
1807                 lpfc_worker_wake_up(phba);
1808         return;
1809 }
1810
1811 void
1812 lpfc_fdmi_timeout_handler(struct lpfc_vport *vport)
1813 {
1814         struct lpfc_nodelist *ndlp;
1815
1816         ndlp = lpfc_findnode_did(vport, FDMI_DID);
1817         if (ndlp && NLP_CHK_NODE_ACT(ndlp)) {
1818                 if (init_utsname()->nodename[0] != '\0')
1819                         lpfc_fdmi_cmd(vport, ndlp, SLI_MGMT_DHBA);
1820                 else
1821                         mod_timer(&vport->fc_fdmitmo, jiffies + HZ * 60);
1822         }
1823         return;
1824 }
1825
1826 void
1827 lpfc_decode_firmware_rev(struct lpfc_hba *phba, char *fwrevision, int flag)
1828 {
1829         struct lpfc_sli *psli = &phba->sli;
1830         lpfc_vpd_t *vp = &phba->vpd;
1831         uint32_t b1, b2, b3, b4, i, rev;
1832         char c;
1833         uint32_t *ptr, str[4];
1834         uint8_t *fwname;
1835
1836         if (phba->sli_rev == LPFC_SLI_REV4)
1837                 sprintf(fwrevision, "%s", vp->rev.opFwName);
1838         else if (vp->rev.rBit) {
1839                 if (psli->sli_flag & LPFC_SLI_ACTIVE)
1840                         rev = vp->rev.sli2FwRev;
1841                 else
1842                         rev = vp->rev.sli1FwRev;
1843
1844                 b1 = (rev & 0x0000f000) >> 12;
1845                 b2 = (rev & 0x00000f00) >> 8;
1846                 b3 = (rev & 0x000000c0) >> 6;
1847                 b4 = (rev & 0x00000030) >> 4;
1848
1849                 switch (b4) {
1850                 case 0:
1851                         c = 'N';
1852                         break;
1853                 case 1:
1854                         c = 'A';
1855                         break;
1856                 case 2:
1857                         c = 'B';
1858                         break;
1859                 case 3:
1860                         c = 'X';
1861                         break;
1862                 default:
1863                         c = 0;
1864                         break;
1865                 }
1866                 b4 = (rev & 0x0000000f);
1867
1868                 if (psli->sli_flag & LPFC_SLI_ACTIVE)
1869                         fwname = vp->rev.sli2FwName;
1870                 else
1871                         fwname = vp->rev.sli1FwName;
1872
1873                 for (i = 0; i < 16; i++)
1874                         if (fwname[i] == 0x20)
1875                                 fwname[i] = 0;
1876
1877                 ptr = (uint32_t*)fwname;
1878
1879                 for (i = 0; i < 3; i++)
1880                         str[i] = be32_to_cpu(*ptr++);
1881
1882                 if (c == 0) {
1883                         if (flag)
1884                                 sprintf(fwrevision, "%d.%d%d (%s)",
1885                                         b1, b2, b3, (char *)str);
1886                         else
1887                                 sprintf(fwrevision, "%d.%d%d", b1,
1888                                         b2, b3);
1889                 } else {
1890                         if (flag)
1891                                 sprintf(fwrevision, "%d.%d%d%c%d (%s)",
1892                                         b1, b2, b3, c,
1893                                         b4, (char *)str);
1894                         else
1895                                 sprintf(fwrevision, "%d.%d%d%c%d",
1896                                         b1, b2, b3, c, b4);
1897                 }
1898         } else {
1899                 rev = vp->rev.smFwRev;
1900
1901                 b1 = (rev & 0xff000000) >> 24;
1902                 b2 = (rev & 0x00f00000) >> 20;
1903                 b3 = (rev & 0x000f0000) >> 16;
1904                 c  = (rev & 0x0000ff00) >> 8;
1905                 b4 = (rev & 0x000000ff);
1906
1907                 sprintf(fwrevision, "%d.%d%d%c%d", b1, b2, b3, c, b4);
1908         }
1909         return;
1910 }