]> Git Repo - linux.git/blob - drivers/scsi/lpfc/lpfc_attr.c
scsi: zfcp: Trace when request remove fails after qdio send fails
[linux.git] / drivers / scsi / lpfc / lpfc_attr.c
1 /*******************************************************************
2  * This file is part of the Emulex Linux Device Driver for         *
3  * Fibre Channel Host Bus Adapters.                                *
4  * Copyright (C) 2017-2023 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  * Portions Copyright (C) 2004-2005 Christoph Hellwig              *
10  *                                                                 *
11  * This program is free software; you can redistribute it and/or   *
12  * modify it under the terms of version 2 of the GNU General       *
13  * Public License as published by the Free Software Foundation.    *
14  * This program is distributed in the hope that it will be useful. *
15  * ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND          *
16  * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,  *
17  * FITNESS FOR A PARTICULAR PURPOSE, OR NON-INFRINGEMENT, ARE      *
18  * DISCLAIMED, EXCEPT TO THE EXTENT THAT SUCH DISCLAIMERS ARE HELD *
19  * TO BE LEGALLY INVALID.  See the GNU General Public License for  *
20  * more details, a copy of which can be found in the file COPYING  *
21  * included with this package.                                     *
22  *******************************************************************/
23
24 #include <linux/ctype.h>
25 #include <linux/delay.h>
26 #include <linux/pci.h>
27 #include <linux/interrupt.h>
28 #include <linux/module.h>
29 #include <linux/aer.h>
30 #include <linux/gfp.h>
31 #include <linux/kernel.h>
32
33 #include <scsi/scsi.h>
34 #include <scsi/scsi_device.h>
35 #include <scsi/scsi_host.h>
36 #include <scsi/scsi_tcq.h>
37 #include <scsi/scsi_transport_fc.h>
38 #include <scsi/fc/fc_fs.h>
39
40 #include "lpfc_hw4.h"
41 #include "lpfc_hw.h"
42 #include "lpfc_sli.h"
43 #include "lpfc_sli4.h"
44 #include "lpfc_nl.h"
45 #include "lpfc_disc.h"
46 #include "lpfc.h"
47 #include "lpfc_scsi.h"
48 #include "lpfc_nvme.h"
49 #include "lpfc_logmsg.h"
50 #include "lpfc_version.h"
51 #include "lpfc_compat.h"
52 #include "lpfc_crtn.h"
53 #include "lpfc_vport.h"
54 #include "lpfc_attr.h"
55
56 #define LPFC_DEF_DEVLOSS_TMO    30
57 #define LPFC_MIN_DEVLOSS_TMO    1
58 #define LPFC_MAX_DEVLOSS_TMO    255
59
60 #define LPFC_MAX_INFO_TMP_LEN   100
61 #define LPFC_INFO_MORE_STR      "\nCould be more info...\n"
62 /*
63  * Write key size should be multiple of 4. If write key is changed
64  * make sure that library write key is also changed.
65  */
66 #define LPFC_REG_WRITE_KEY_SIZE 4
67 #define LPFC_REG_WRITE_KEY      "EMLX"
68
69 const char *const trunk_errmsg[] = {    /* map errcode */
70         "",     /* There is no such error code at index 0*/
71         "link negotiated speed does not match existing"
72                 " trunk - link was \"low\" speed",
73         "link negotiated speed does not match"
74                 " existing trunk - link was \"middle\" speed",
75         "link negotiated speed does not match existing"
76                 " trunk - link was \"high\" speed",
77         "Attached to non-trunking port - F_Port",
78         "Attached to non-trunking port - N_Port",
79         "FLOGI response timeout",
80         "non-FLOGI frame received",
81         "Invalid FLOGI response",
82         "Trunking initialization protocol",
83         "Trunk peer device mismatch",
84 };
85
86 /**
87  * lpfc_jedec_to_ascii - Hex to ascii convertor according to JEDEC rules
88  * @incr: integer to convert.
89  * @hdw: ascii string holding converted integer plus a string terminator.
90  *
91  * Description:
92  * JEDEC Joint Electron Device Engineering Council.
93  * Convert a 32 bit integer composed of 8 nibbles into an 8 byte ascii
94  * character string. The string is then terminated with a NULL in byte 9.
95  * Hex 0-9 becomes ascii '0' to '9'.
96  * Hex a-f becomes ascii '=' to 'B' capital B.
97  *
98  * Notes:
99  * Coded for 32 bit integers only.
100  **/
101 static void
102 lpfc_jedec_to_ascii(int incr, char hdw[])
103 {
104         int i, j;
105         for (i = 0; i < 8; i++) {
106                 j = (incr & 0xf);
107                 if (j <= 9)
108                         hdw[7 - i] = 0x30 +  j;
109                  else
110                         hdw[7 - i] = 0x61 + j - 10;
111                 incr = (incr >> 4);
112         }
113         hdw[8] = 0;
114         return;
115 }
116
117 static ssize_t
118 lpfc_cmf_info_show(struct device *dev, struct device_attribute *attr,
119                    char *buf)
120 {
121         struct Scsi_Host  *shost = class_to_shost(dev);
122         struct lpfc_vport *vport = (struct lpfc_vport *)shost->hostdata;
123         struct lpfc_hba   *phba = vport->phba;
124         struct lpfc_cgn_info *cp = NULL;
125         struct lpfc_cgn_stat *cgs;
126         int  len = 0;
127         int cpu;
128         u64 rcv, total;
129         char tmp[LPFC_MAX_INFO_TMP_LEN] = {0};
130
131         if (phba->cgn_i)
132                 cp = (struct lpfc_cgn_info *)phba->cgn_i->virt;
133
134         scnprintf(tmp, sizeof(tmp),
135                   "Congestion Mgmt Info: E2Eattr %d Ver %d "
136                   "CMF %d cnt %d\n",
137                   phba->sli4_hba.pc_sli4_params.mi_cap,
138                   cp ? cp->cgn_info_version : 0,
139                   phba->sli4_hba.pc_sli4_params.cmf, phba->cmf_timer_cnt);
140
141         if (strlcat(buf, tmp, PAGE_SIZE) >= PAGE_SIZE)
142                 goto buffer_done;
143
144         if (!phba->sli4_hba.pc_sli4_params.cmf)
145                 goto buffer_done;
146
147         switch (phba->cgn_init_reg_signal) {
148         case EDC_CG_SIG_WARN_ONLY:
149                 scnprintf(tmp, sizeof(tmp),
150                           "Register: Init:  Signal:WARN  ");
151                 break;
152         case EDC_CG_SIG_WARN_ALARM:
153                 scnprintf(tmp, sizeof(tmp),
154                           "Register: Init:  Signal:WARN|ALARM  ");
155                 break;
156         default:
157                 scnprintf(tmp, sizeof(tmp),
158                           "Register: Init:  Signal:NONE  ");
159                 break;
160         }
161         if (strlcat(buf, tmp, PAGE_SIZE) >= PAGE_SIZE)
162                 goto buffer_done;
163
164         switch (phba->cgn_init_reg_fpin) {
165         case LPFC_CGN_FPIN_WARN:
166                 scnprintf(tmp, sizeof(tmp),
167                           "FPIN:WARN\n");
168                 break;
169         case LPFC_CGN_FPIN_ALARM:
170                 scnprintf(tmp, sizeof(tmp),
171                           "FPIN:ALARM\n");
172                 break;
173         case LPFC_CGN_FPIN_BOTH:
174                 scnprintf(tmp, sizeof(tmp),
175                           "FPIN:WARN|ALARM\n");
176                 break;
177         default:
178                 scnprintf(tmp, sizeof(tmp),
179                           "FPIN:NONE\n");
180                 break;
181         }
182         if (strlcat(buf, tmp, PAGE_SIZE) >= PAGE_SIZE)
183                 goto buffer_done;
184
185         switch (phba->cgn_reg_signal) {
186         case EDC_CG_SIG_WARN_ONLY:
187                 scnprintf(tmp, sizeof(tmp),
188                           "       Current:  Signal:WARN  ");
189                 break;
190         case EDC_CG_SIG_WARN_ALARM:
191                 scnprintf(tmp, sizeof(tmp),
192                           "       Current:  Signal:WARN|ALARM  ");
193                 break;
194         default:
195                 scnprintf(tmp, sizeof(tmp),
196                           "       Current:  Signal:NONE  ");
197                 break;
198         }
199         if (strlcat(buf, tmp, PAGE_SIZE) >= PAGE_SIZE)
200                 goto buffer_done;
201
202         switch (phba->cgn_reg_fpin) {
203         case LPFC_CGN_FPIN_WARN:
204                 scnprintf(tmp, sizeof(tmp),
205                           "FPIN:WARN  ACQEcnt:%d\n", phba->cgn_acqe_cnt);
206                 break;
207         case LPFC_CGN_FPIN_ALARM:
208                 scnprintf(tmp, sizeof(tmp),
209                           "FPIN:ALARM  ACQEcnt:%d\n", phba->cgn_acqe_cnt);
210                 break;
211         case LPFC_CGN_FPIN_BOTH:
212                 scnprintf(tmp, sizeof(tmp),
213                           "FPIN:WARN|ALARM  ACQEcnt:%d\n", phba->cgn_acqe_cnt);
214                 break;
215         default:
216                 scnprintf(tmp, sizeof(tmp),
217                           "FPIN:NONE  ACQEcnt:%d\n", phba->cgn_acqe_cnt);
218                 break;
219         }
220         if (strlcat(buf, tmp, PAGE_SIZE) >= PAGE_SIZE)
221                 goto buffer_done;
222
223         if (phba->cmf_active_mode != phba->cgn_p.cgn_param_mode) {
224                 switch (phba->cmf_active_mode) {
225                 case LPFC_CFG_OFF:
226                         scnprintf(tmp, sizeof(tmp), "Active: Mode:Off\n");
227                         break;
228                 case LPFC_CFG_MANAGED:
229                         scnprintf(tmp, sizeof(tmp), "Active: Mode:Managed\n");
230                         break;
231                 case LPFC_CFG_MONITOR:
232                         scnprintf(tmp, sizeof(tmp), "Active: Mode:Monitor\n");
233                         break;
234                 default:
235                         scnprintf(tmp, sizeof(tmp), "Active: Mode:Unknown\n");
236                 }
237                 if (strlcat(buf, tmp, PAGE_SIZE) >= PAGE_SIZE)
238                         goto buffer_done;
239         }
240
241         switch (phba->cgn_p.cgn_param_mode) {
242         case LPFC_CFG_OFF:
243                 scnprintf(tmp, sizeof(tmp), "Config: Mode:Off  ");
244                 break;
245         case LPFC_CFG_MANAGED:
246                 scnprintf(tmp, sizeof(tmp), "Config: Mode:Managed ");
247                 break;
248         case LPFC_CFG_MONITOR:
249                 scnprintf(tmp, sizeof(tmp), "Config: Mode:Monitor ");
250                 break;
251         default:
252                 scnprintf(tmp, sizeof(tmp), "Config: Mode:Unknown ");
253         }
254         if (strlcat(buf, tmp, PAGE_SIZE) >= PAGE_SIZE)
255                 goto buffer_done;
256
257         total = 0;
258         rcv = 0;
259         for_each_present_cpu(cpu) {
260                 cgs = per_cpu_ptr(phba->cmf_stat, cpu);
261                 total += atomic64_read(&cgs->total_bytes);
262                 rcv += atomic64_read(&cgs->rcv_bytes);
263         }
264
265         scnprintf(tmp, sizeof(tmp),
266                   "IObusy:%d Info:%d Bytes: Rcv:x%llx Total:x%llx\n",
267                   atomic_read(&phba->cmf_busy),
268                   phba->cmf_active_info, rcv, total);
269         if (strlcat(buf, tmp, PAGE_SIZE) >= PAGE_SIZE)
270                 goto buffer_done;
271
272         scnprintf(tmp, sizeof(tmp),
273                   "Port_speed:%d  Link_byte_cnt:%ld  "
274                   "Max_byte_per_interval:%ld\n",
275                   lpfc_sli_port_speed_get(phba),
276                   (unsigned long)phba->cmf_link_byte_count,
277                   (unsigned long)phba->cmf_max_bytes_per_interval);
278         strlcat(buf, tmp, PAGE_SIZE);
279
280 buffer_done:
281         len = strnlen(buf, PAGE_SIZE);
282
283         if (unlikely(len >= (PAGE_SIZE - 1))) {
284                 lpfc_printf_log(phba, KERN_INFO, LOG_CGN_MGMT,
285                                 "6312 Catching potential buffer "
286                                 "overflow > PAGE_SIZE = %lu bytes\n",
287                                 PAGE_SIZE);
288                 strscpy(buf + PAGE_SIZE - 1 - sizeof(LPFC_INFO_MORE_STR),
289                         LPFC_INFO_MORE_STR, sizeof(LPFC_INFO_MORE_STR) + 1);
290         }
291         return len;
292 }
293
294 /**
295  * lpfc_drvr_version_show - Return the Emulex driver string with version number
296  * @dev: class unused variable.
297  * @attr: device attribute, not used.
298  * @buf: on return contains the module description text.
299  *
300  * Returns: size of formatted string.
301  **/
302 static ssize_t
303 lpfc_drvr_version_show(struct device *dev, struct device_attribute *attr,
304                        char *buf)
305 {
306         return scnprintf(buf, PAGE_SIZE, LPFC_MODULE_DESC "\n");
307 }
308
309 /**
310  * lpfc_enable_fip_show - Return the fip mode of the HBA
311  * @dev: class unused variable.
312  * @attr: device attribute, not used.
313  * @buf: on return contains the module description text.
314  *
315  * Returns: size of formatted string.
316  **/
317 static ssize_t
318 lpfc_enable_fip_show(struct device *dev, struct device_attribute *attr,
319                        char *buf)
320 {
321         struct Scsi_Host *shost = class_to_shost(dev);
322         struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata;
323         struct lpfc_hba   *phba = vport->phba;
324
325         if (phba->hba_flag & HBA_FIP_SUPPORT)
326                 return scnprintf(buf, PAGE_SIZE, "1\n");
327         else
328                 return scnprintf(buf, PAGE_SIZE, "0\n");
329 }
330
331 static ssize_t
332 lpfc_nvme_info_show(struct device *dev, struct device_attribute *attr,
333                     char *buf)
334 {
335         struct Scsi_Host *shost = class_to_shost(dev);
336         struct lpfc_vport *vport = shost_priv(shost);
337         struct lpfc_hba   *phba = vport->phba;
338         struct lpfc_nvmet_tgtport *tgtp;
339         struct nvme_fc_local_port *localport;
340         struct lpfc_nvme_lport *lport;
341         struct lpfc_nvme_rport *rport;
342         struct lpfc_nodelist *ndlp;
343         struct nvme_fc_remote_port *nrport;
344         struct lpfc_fc4_ctrl_stat *cstat;
345         uint64_t data1, data2, data3;
346         uint64_t totin, totout, tot;
347         char *statep;
348         int i;
349         int len = 0;
350         char tmp[LPFC_MAX_INFO_TMP_LEN] = {0};
351
352         if (!(vport->cfg_enable_fc4_type & LPFC_ENABLE_NVME)) {
353                 len = scnprintf(buf, PAGE_SIZE, "NVME Disabled\n");
354                 return len;
355         }
356         if (phba->nvmet_support) {
357                 if (!phba->targetport) {
358                         len = scnprintf(buf, PAGE_SIZE,
359                                         "NVME Target: x%llx is not allocated\n",
360                                         wwn_to_u64(vport->fc_portname.u.wwn));
361                         return len;
362                 }
363                 /* Port state is only one of two values for now. */
364                 if (phba->targetport->port_id)
365                         statep = "REGISTERED";
366                 else
367                         statep = "INIT";
368                 scnprintf(tmp, sizeof(tmp),
369                           "NVME Target Enabled  State %s\n",
370                           statep);
371                 if (strlcat(buf, tmp, PAGE_SIZE) >= PAGE_SIZE)
372                         goto buffer_done;
373
374                 scnprintf(tmp, sizeof(tmp),
375                           "%s%d WWPN x%llx WWNN x%llx DID x%06x\n",
376                           "NVME Target: lpfc",
377                           phba->brd_no,
378                           wwn_to_u64(vport->fc_portname.u.wwn),
379                           wwn_to_u64(vport->fc_nodename.u.wwn),
380                           phba->targetport->port_id);
381                 if (strlcat(buf, tmp, PAGE_SIZE) >= PAGE_SIZE)
382                         goto buffer_done;
383
384                 if (strlcat(buf, "\nNVME Target: Statistics\n", PAGE_SIZE)
385                     >= PAGE_SIZE)
386                         goto buffer_done;
387
388                 tgtp = (struct lpfc_nvmet_tgtport *)phba->targetport->private;
389                 scnprintf(tmp, sizeof(tmp),
390                           "LS: Rcv %08x Drop %08x Abort %08x\n",
391                           atomic_read(&tgtp->rcv_ls_req_in),
392                           atomic_read(&tgtp->rcv_ls_req_drop),
393                           atomic_read(&tgtp->xmt_ls_abort));
394                 if (strlcat(buf, tmp, PAGE_SIZE) >= PAGE_SIZE)
395                         goto buffer_done;
396
397                 if (atomic_read(&tgtp->rcv_ls_req_in) !=
398                     atomic_read(&tgtp->rcv_ls_req_out)) {
399                         scnprintf(tmp, sizeof(tmp),
400                                   "Rcv LS: in %08x != out %08x\n",
401                                   atomic_read(&tgtp->rcv_ls_req_in),
402                                   atomic_read(&tgtp->rcv_ls_req_out));
403                         if (strlcat(buf, tmp, PAGE_SIZE) >= PAGE_SIZE)
404                                 goto buffer_done;
405                 }
406
407                 scnprintf(tmp, sizeof(tmp),
408                           "LS: Xmt %08x Drop %08x Cmpl %08x\n",
409                           atomic_read(&tgtp->xmt_ls_rsp),
410                           atomic_read(&tgtp->xmt_ls_drop),
411                           atomic_read(&tgtp->xmt_ls_rsp_cmpl));
412                 if (strlcat(buf, tmp, PAGE_SIZE) >= PAGE_SIZE)
413                         goto buffer_done;
414
415                 scnprintf(tmp, sizeof(tmp),
416                           "LS: RSP Abort %08x xb %08x Err %08x\n",
417                           atomic_read(&tgtp->xmt_ls_rsp_aborted),
418                           atomic_read(&tgtp->xmt_ls_rsp_xb_set),
419                           atomic_read(&tgtp->xmt_ls_rsp_error));
420                 if (strlcat(buf, tmp, PAGE_SIZE) >= PAGE_SIZE)
421                         goto buffer_done;
422
423                 scnprintf(tmp, sizeof(tmp),
424                           "FCP: Rcv %08x Defer %08x Release %08x "
425                           "Drop %08x\n",
426                           atomic_read(&tgtp->rcv_fcp_cmd_in),
427                           atomic_read(&tgtp->rcv_fcp_cmd_defer),
428                           atomic_read(&tgtp->xmt_fcp_release),
429                           atomic_read(&tgtp->rcv_fcp_cmd_drop));
430                 if (strlcat(buf, tmp, PAGE_SIZE) >= PAGE_SIZE)
431                         goto buffer_done;
432
433                 if (atomic_read(&tgtp->rcv_fcp_cmd_in) !=
434                     atomic_read(&tgtp->rcv_fcp_cmd_out)) {
435                         scnprintf(tmp, sizeof(tmp),
436                                   "Rcv FCP: in %08x != out %08x\n",
437                                   atomic_read(&tgtp->rcv_fcp_cmd_in),
438                                   atomic_read(&tgtp->rcv_fcp_cmd_out));
439                         if (strlcat(buf, tmp, PAGE_SIZE) >= PAGE_SIZE)
440                                 goto buffer_done;
441                 }
442
443                 scnprintf(tmp, sizeof(tmp),
444                           "FCP Rsp: RD %08x rsp %08x WR %08x rsp %08x "
445                           "drop %08x\n",
446                           atomic_read(&tgtp->xmt_fcp_read),
447                           atomic_read(&tgtp->xmt_fcp_read_rsp),
448                           atomic_read(&tgtp->xmt_fcp_write),
449                           atomic_read(&tgtp->xmt_fcp_rsp),
450                           atomic_read(&tgtp->xmt_fcp_drop));
451                 if (strlcat(buf, tmp, PAGE_SIZE) >= PAGE_SIZE)
452                         goto buffer_done;
453
454                 scnprintf(tmp, sizeof(tmp),
455                           "FCP Rsp Cmpl: %08x err %08x drop %08x\n",
456                           atomic_read(&tgtp->xmt_fcp_rsp_cmpl),
457                           atomic_read(&tgtp->xmt_fcp_rsp_error),
458                           atomic_read(&tgtp->xmt_fcp_rsp_drop));
459                 if (strlcat(buf, tmp, PAGE_SIZE) >= PAGE_SIZE)
460                         goto buffer_done;
461
462                 scnprintf(tmp, sizeof(tmp),
463                           "FCP Rsp Abort: %08x xb %08x xricqe  %08x\n",
464                           atomic_read(&tgtp->xmt_fcp_rsp_aborted),
465                           atomic_read(&tgtp->xmt_fcp_rsp_xb_set),
466                           atomic_read(&tgtp->xmt_fcp_xri_abort_cqe));
467                 if (strlcat(buf, tmp, PAGE_SIZE) >= PAGE_SIZE)
468                         goto buffer_done;
469
470                 scnprintf(tmp, sizeof(tmp),
471                           "ABORT: Xmt %08x Cmpl %08x\n",
472                           atomic_read(&tgtp->xmt_fcp_abort),
473                           atomic_read(&tgtp->xmt_fcp_abort_cmpl));
474                 if (strlcat(buf, tmp, PAGE_SIZE) >= PAGE_SIZE)
475                         goto buffer_done;
476
477                 scnprintf(tmp, sizeof(tmp),
478                           "ABORT: Sol %08x  Usol %08x Err %08x Cmpl %08x\n",
479                           atomic_read(&tgtp->xmt_abort_sol),
480                           atomic_read(&tgtp->xmt_abort_unsol),
481                           atomic_read(&tgtp->xmt_abort_rsp),
482                           atomic_read(&tgtp->xmt_abort_rsp_error));
483                 if (strlcat(buf, tmp, PAGE_SIZE) >= PAGE_SIZE)
484                         goto buffer_done;
485
486                 scnprintf(tmp, sizeof(tmp),
487                           "DELAY: ctx %08x  fod %08x wqfull %08x\n",
488                           atomic_read(&tgtp->defer_ctx),
489                           atomic_read(&tgtp->defer_fod),
490                           atomic_read(&tgtp->defer_wqfull));
491                 if (strlcat(buf, tmp, PAGE_SIZE) >= PAGE_SIZE)
492                         goto buffer_done;
493
494                 /* Calculate outstanding IOs */
495                 tot = atomic_read(&tgtp->rcv_fcp_cmd_drop);
496                 tot += atomic_read(&tgtp->xmt_fcp_release);
497                 tot = atomic_read(&tgtp->rcv_fcp_cmd_in) - tot;
498
499                 scnprintf(tmp, sizeof(tmp),
500                           "IO_CTX: %08x  WAIT: cur %08x tot %08x\n"
501                           "CTX Outstanding %08llx\n\n",
502                           phba->sli4_hba.nvmet_xri_cnt,
503                           phba->sli4_hba.nvmet_io_wait_cnt,
504                           phba->sli4_hba.nvmet_io_wait_total,
505                           tot);
506                 strlcat(buf, tmp, PAGE_SIZE);
507                 goto buffer_done;
508         }
509
510         localport = vport->localport;
511         if (!localport) {
512                 len = scnprintf(buf, PAGE_SIZE,
513                                 "NVME Initiator x%llx is not allocated\n",
514                                 wwn_to_u64(vport->fc_portname.u.wwn));
515                 return len;
516         }
517         lport = (struct lpfc_nvme_lport *)localport->private;
518         if (strlcat(buf, "\nNVME Initiator Enabled\n", PAGE_SIZE) >= PAGE_SIZE)
519                 goto buffer_done;
520
521         scnprintf(tmp, sizeof(tmp),
522                   "XRI Dist lpfc%d Total %d IO %d ELS %d\n",
523                   phba->brd_no,
524                   phba->sli4_hba.max_cfg_param.max_xri,
525                   phba->sli4_hba.io_xri_max,
526                   lpfc_sli4_get_els_iocb_cnt(phba));
527         if (strlcat(buf, tmp, PAGE_SIZE) >= PAGE_SIZE)
528                 goto buffer_done;
529
530         /* Port state is only one of two values for now. */
531         if (localport->port_id)
532                 statep = "ONLINE";
533         else
534                 statep = "UNKNOWN ";
535
536         scnprintf(tmp, sizeof(tmp),
537                   "%s%d WWPN x%llx WWNN x%llx DID x%06x %s\n",
538                   "NVME LPORT lpfc",
539                   phba->brd_no,
540                   wwn_to_u64(vport->fc_portname.u.wwn),
541                   wwn_to_u64(vport->fc_nodename.u.wwn),
542                   localport->port_id, statep);
543         if (strlcat(buf, tmp, PAGE_SIZE) >= PAGE_SIZE)
544                 goto buffer_done;
545
546         spin_lock_irq(shost->host_lock);
547
548         list_for_each_entry(ndlp, &vport->fc_nodes, nlp_listp) {
549                 nrport = NULL;
550                 spin_lock(&ndlp->lock);
551                 rport = lpfc_ndlp_get_nrport(ndlp);
552                 if (rport)
553                         nrport = rport->remoteport;
554                 spin_unlock(&ndlp->lock);
555                 if (!nrport)
556                         continue;
557
558                 /* Port state is only one of two values for now. */
559                 switch (nrport->port_state) {
560                 case FC_OBJSTATE_ONLINE:
561                         statep = "ONLINE";
562                         break;
563                 case FC_OBJSTATE_UNKNOWN:
564                         statep = "UNKNOWN ";
565                         break;
566                 default:
567                         statep = "UNSUPPORTED";
568                         break;
569                 }
570
571                 /* Tab in to show lport ownership. */
572                 if (strlcat(buf, "NVME RPORT       ", PAGE_SIZE) >= PAGE_SIZE)
573                         goto unlock_buf_done;
574                 if (phba->brd_no >= 10) {
575                         if (strlcat(buf, " ", PAGE_SIZE) >= PAGE_SIZE)
576                                 goto unlock_buf_done;
577                 }
578
579                 scnprintf(tmp, sizeof(tmp), "WWPN x%llx ",
580                           nrport->port_name);
581                 if (strlcat(buf, tmp, PAGE_SIZE) >= PAGE_SIZE)
582                         goto unlock_buf_done;
583
584                 scnprintf(tmp, sizeof(tmp), "WWNN x%llx ",
585                           nrport->node_name);
586                 if (strlcat(buf, tmp, PAGE_SIZE) >= PAGE_SIZE)
587                         goto unlock_buf_done;
588
589                 scnprintf(tmp, sizeof(tmp), "DID x%06x ",
590                           nrport->port_id);
591                 if (strlcat(buf, tmp, PAGE_SIZE) >= PAGE_SIZE)
592                         goto unlock_buf_done;
593
594                 /* An NVME rport can have multiple roles. */
595                 if (nrport->port_role & FC_PORT_ROLE_NVME_INITIATOR) {
596                         if (strlcat(buf, "INITIATOR ", PAGE_SIZE) >= PAGE_SIZE)
597                                 goto unlock_buf_done;
598                 }
599                 if (nrport->port_role & FC_PORT_ROLE_NVME_TARGET) {
600                         if (strlcat(buf, "TARGET ", PAGE_SIZE) >= PAGE_SIZE)
601                                 goto unlock_buf_done;
602                 }
603                 if (nrport->port_role & FC_PORT_ROLE_NVME_DISCOVERY) {
604                         if (strlcat(buf, "DISCSRVC ", PAGE_SIZE) >= PAGE_SIZE)
605                                 goto unlock_buf_done;
606                 }
607                 if (nrport->port_role & ~(FC_PORT_ROLE_NVME_INITIATOR |
608                                           FC_PORT_ROLE_NVME_TARGET |
609                                           FC_PORT_ROLE_NVME_DISCOVERY)) {
610                         scnprintf(tmp, sizeof(tmp), "UNKNOWN ROLE x%x",
611                                   nrport->port_role);
612                         if (strlcat(buf, tmp, PAGE_SIZE) >= PAGE_SIZE)
613                                 goto unlock_buf_done;
614                 }
615
616                 scnprintf(tmp, sizeof(tmp), "%s\n", statep);
617                 if (strlcat(buf, tmp, PAGE_SIZE) >= PAGE_SIZE)
618                         goto unlock_buf_done;
619         }
620         spin_unlock_irq(shost->host_lock);
621
622         if (!lport)
623                 goto buffer_done;
624
625         if (strlcat(buf, "\nNVME Statistics\n", PAGE_SIZE) >= PAGE_SIZE)
626                 goto buffer_done;
627
628         scnprintf(tmp, sizeof(tmp),
629                   "LS: Xmt %010x Cmpl %010x Abort %08x\n",
630                   atomic_read(&lport->fc4NvmeLsRequests),
631                   atomic_read(&lport->fc4NvmeLsCmpls),
632                   atomic_read(&lport->xmt_ls_abort));
633         if (strlcat(buf, tmp, PAGE_SIZE) >= PAGE_SIZE)
634                 goto buffer_done;
635
636         scnprintf(tmp, sizeof(tmp),
637                   "LS XMIT: Err %08x  CMPL: xb %08x Err %08x\n",
638                   atomic_read(&lport->xmt_ls_err),
639                   atomic_read(&lport->cmpl_ls_xb),
640                   atomic_read(&lport->cmpl_ls_err));
641         if (strlcat(buf, tmp, PAGE_SIZE) >= PAGE_SIZE)
642                 goto buffer_done;
643
644         totin = 0;
645         totout = 0;
646         for (i = 0; i < phba->cfg_hdw_queue; i++) {
647                 cstat = &phba->sli4_hba.hdwq[i].nvme_cstat;
648                 tot = cstat->io_cmpls;
649                 totin += tot;
650                 data1 = cstat->input_requests;
651                 data2 = cstat->output_requests;
652                 data3 = cstat->control_requests;
653                 totout += (data1 + data2 + data3);
654         }
655         scnprintf(tmp, sizeof(tmp),
656                   "Total FCP Cmpl %016llx Issue %016llx "
657                   "OutIO %016llx\n",
658                   totin, totout, totout - totin);
659         if (strlcat(buf, tmp, PAGE_SIZE) >= PAGE_SIZE)
660                 goto buffer_done;
661
662         scnprintf(tmp, sizeof(tmp),
663                   "\tabort %08x noxri %08x nondlp %08x qdepth %08x "
664                   "wqerr %08x err %08x\n",
665                   atomic_read(&lport->xmt_fcp_abort),
666                   atomic_read(&lport->xmt_fcp_noxri),
667                   atomic_read(&lport->xmt_fcp_bad_ndlp),
668                   atomic_read(&lport->xmt_fcp_qdepth),
669                   atomic_read(&lport->xmt_fcp_wqerr),
670                   atomic_read(&lport->xmt_fcp_err));
671         if (strlcat(buf, tmp, PAGE_SIZE) >= PAGE_SIZE)
672                 goto buffer_done;
673
674         scnprintf(tmp, sizeof(tmp),
675                   "FCP CMPL: xb %08x Err %08x\n",
676                   atomic_read(&lport->cmpl_fcp_xb),
677                   atomic_read(&lport->cmpl_fcp_err));
678         strlcat(buf, tmp, PAGE_SIZE);
679
680         /* host_lock is already unlocked. */
681         goto buffer_done;
682
683  unlock_buf_done:
684         spin_unlock_irq(shost->host_lock);
685
686  buffer_done:
687         len = strnlen(buf, PAGE_SIZE);
688
689         if (unlikely(len >= (PAGE_SIZE - 1))) {
690                 lpfc_printf_log(phba, KERN_INFO, LOG_NVME,
691                                 "6314 Catching potential buffer "
692                                 "overflow > PAGE_SIZE = %lu bytes\n",
693                                 PAGE_SIZE);
694                 strscpy(buf + PAGE_SIZE - 1 - sizeof(LPFC_INFO_MORE_STR),
695                         LPFC_INFO_MORE_STR,
696                         sizeof(LPFC_INFO_MORE_STR) + 1);
697         }
698
699         return len;
700 }
701
702 static ssize_t
703 lpfc_scsi_stat_show(struct device *dev, struct device_attribute *attr,
704                     char *buf)
705 {
706         struct Scsi_Host *shost = class_to_shost(dev);
707         struct lpfc_vport *vport = shost_priv(shost);
708         struct lpfc_hba *phba = vport->phba;
709         int len;
710         struct lpfc_fc4_ctrl_stat *cstat;
711         u64 data1, data2, data3;
712         u64 tot, totin, totout;
713         int i;
714         char tmp[LPFC_MAX_SCSI_INFO_TMP_LEN] = {0};
715
716         if (!(vport->cfg_enable_fc4_type & LPFC_ENABLE_FCP) ||
717             (phba->sli_rev != LPFC_SLI_REV4))
718                 return 0;
719
720         scnprintf(buf, PAGE_SIZE, "SCSI HDWQ Statistics\n");
721
722         totin = 0;
723         totout = 0;
724         for (i = 0; i < phba->cfg_hdw_queue; i++) {
725                 cstat = &phba->sli4_hba.hdwq[i].scsi_cstat;
726                 tot = cstat->io_cmpls;
727                 totin += tot;
728                 data1 = cstat->input_requests;
729                 data2 = cstat->output_requests;
730                 data3 = cstat->control_requests;
731                 totout += (data1 + data2 + data3);
732
733                 scnprintf(tmp, sizeof(tmp), "HDWQ (%d): Rd %016llx Wr %016llx "
734                           "IO %016llx ", i, data1, data2, data3);
735                 if (strlcat(buf, tmp, PAGE_SIZE) >= PAGE_SIZE)
736                         goto buffer_done;
737
738                 scnprintf(tmp, sizeof(tmp), "Cmpl %016llx OutIO %016llx\n",
739                           tot, ((data1 + data2 + data3) - tot));
740                 if (strlcat(buf, tmp, PAGE_SIZE) >= PAGE_SIZE)
741                         goto buffer_done;
742         }
743         scnprintf(tmp, sizeof(tmp), "Total FCP Cmpl %016llx Issue %016llx "
744                   "OutIO %016llx\n", totin, totout, totout - totin);
745         strlcat(buf, tmp, PAGE_SIZE);
746
747 buffer_done:
748         len = strnlen(buf, PAGE_SIZE);
749
750         return len;
751 }
752
753 static ssize_t
754 lpfc_bg_info_show(struct device *dev, struct device_attribute *attr,
755                   char *buf)
756 {
757         struct Scsi_Host *shost = class_to_shost(dev);
758         struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata;
759         struct lpfc_hba   *phba = vport->phba;
760
761         if (phba->cfg_enable_bg) {
762                 if (phba->sli3_options & LPFC_SLI3_BG_ENABLED)
763                         return scnprintf(buf, PAGE_SIZE,
764                                         "BlockGuard Enabled\n");
765                 else
766                         return scnprintf(buf, PAGE_SIZE,
767                                         "BlockGuard Not Supported\n");
768         } else
769                 return scnprintf(buf, PAGE_SIZE,
770                                         "BlockGuard Disabled\n");
771 }
772
773 static ssize_t
774 lpfc_bg_guard_err_show(struct device *dev, struct device_attribute *attr,
775                        char *buf)
776 {
777         struct Scsi_Host *shost = class_to_shost(dev);
778         struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata;
779         struct lpfc_hba   *phba = vport->phba;
780
781         return scnprintf(buf, PAGE_SIZE, "%llu\n",
782                         (unsigned long long)phba->bg_guard_err_cnt);
783 }
784
785 static ssize_t
786 lpfc_bg_apptag_err_show(struct device *dev, struct device_attribute *attr,
787                         char *buf)
788 {
789         struct Scsi_Host *shost = class_to_shost(dev);
790         struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata;
791         struct lpfc_hba   *phba = vport->phba;
792
793         return scnprintf(buf, PAGE_SIZE, "%llu\n",
794                         (unsigned long long)phba->bg_apptag_err_cnt);
795 }
796
797 static ssize_t
798 lpfc_bg_reftag_err_show(struct device *dev, struct device_attribute *attr,
799                         char *buf)
800 {
801         struct Scsi_Host *shost = class_to_shost(dev);
802         struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata;
803         struct lpfc_hba   *phba = vport->phba;
804
805         return scnprintf(buf, PAGE_SIZE, "%llu\n",
806                         (unsigned long long)phba->bg_reftag_err_cnt);
807 }
808
809 /**
810  * lpfc_info_show - Return some pci info about the host in ascii
811  * @dev: class converted to a Scsi_host structure.
812  * @attr: device attribute, not used.
813  * @buf: on return contains the formatted text from lpfc_info().
814  *
815  * Returns: size of formatted string.
816  **/
817 static ssize_t
818 lpfc_info_show(struct device *dev, struct device_attribute *attr,
819                char *buf)
820 {
821         struct Scsi_Host *host = class_to_shost(dev);
822
823         return scnprintf(buf, PAGE_SIZE, "%s\n", lpfc_info(host));
824 }
825
826 /**
827  * lpfc_serialnum_show - Return the hba serial number in ascii
828  * @dev: class converted to a Scsi_host structure.
829  * @attr: device attribute, not used.
830  * @buf: on return contains the formatted text serial number.
831  *
832  * Returns: size of formatted string.
833  **/
834 static ssize_t
835 lpfc_serialnum_show(struct device *dev, struct device_attribute *attr,
836                     char *buf)
837 {
838         struct Scsi_Host  *shost = class_to_shost(dev);
839         struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata;
840         struct lpfc_hba   *phba = vport->phba;
841
842         return scnprintf(buf, PAGE_SIZE, "%s\n", phba->SerialNumber);
843 }
844
845 /**
846  * lpfc_temp_sensor_show - Return the temperature sensor level
847  * @dev: class converted to a Scsi_host structure.
848  * @attr: device attribute, not used.
849  * @buf: on return contains the formatted support level.
850  *
851  * Description:
852  * Returns a number indicating the temperature sensor level currently
853  * supported, zero or one in ascii.
854  *
855  * Returns: size of formatted string.
856  **/
857 static ssize_t
858 lpfc_temp_sensor_show(struct device *dev, struct device_attribute *attr,
859                       char *buf)
860 {
861         struct Scsi_Host *shost = class_to_shost(dev);
862         struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata;
863         struct lpfc_hba   *phba = vport->phba;
864         return scnprintf(buf, PAGE_SIZE, "%d\n", phba->temp_sensor_support);
865 }
866
867 /**
868  * lpfc_modeldesc_show - Return the model description of the hba
869  * @dev: class converted to a Scsi_host structure.
870  * @attr: device attribute, not used.
871  * @buf: on return contains the scsi vpd model description.
872  *
873  * Returns: size of formatted string.
874  **/
875 static ssize_t
876 lpfc_modeldesc_show(struct device *dev, struct device_attribute *attr,
877                     char *buf)
878 {
879         struct Scsi_Host  *shost = class_to_shost(dev);
880         struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata;
881         struct lpfc_hba   *phba = vport->phba;
882
883         return scnprintf(buf, PAGE_SIZE, "%s\n", phba->ModelDesc);
884 }
885
886 /**
887  * lpfc_modelname_show - Return the model name of the hba
888  * @dev: class converted to a Scsi_host structure.
889  * @attr: device attribute, not used.
890  * @buf: on return contains the scsi vpd model name.
891  *
892  * Returns: size of formatted string.
893  **/
894 static ssize_t
895 lpfc_modelname_show(struct device *dev, struct device_attribute *attr,
896                     char *buf)
897 {
898         struct Scsi_Host  *shost = class_to_shost(dev);
899         struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata;
900         struct lpfc_hba   *phba = vport->phba;
901
902         return scnprintf(buf, PAGE_SIZE, "%s\n", phba->ModelName);
903 }
904
905 /**
906  * lpfc_programtype_show - Return the program type of the hba
907  * @dev: class converted to a Scsi_host structure.
908  * @attr: device attribute, not used.
909  * @buf: on return contains the scsi vpd program type.
910  *
911  * Returns: size of formatted string.
912  **/
913 static ssize_t
914 lpfc_programtype_show(struct device *dev, struct device_attribute *attr,
915                       char *buf)
916 {
917         struct Scsi_Host  *shost = class_to_shost(dev);
918         struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata;
919         struct lpfc_hba   *phba = vport->phba;
920
921         return scnprintf(buf, PAGE_SIZE, "%s\n", phba->ProgramType);
922 }
923
924 /**
925  * lpfc_vportnum_show - Return the port number in ascii of the hba
926  * @dev: class converted to a Scsi_host structure.
927  * @attr: device attribute, not used.
928  * @buf: on return contains scsi vpd program type.
929  *
930  * Returns: size of formatted string.
931  **/
932 static ssize_t
933 lpfc_vportnum_show(struct device *dev, struct device_attribute *attr,
934                    char *buf)
935 {
936         struct Scsi_Host  *shost = class_to_shost(dev);
937         struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata;
938         struct lpfc_hba   *phba = vport->phba;
939
940         return scnprintf(buf, PAGE_SIZE, "%s\n", phba->Port);
941 }
942
943 /**
944  * lpfc_fwrev_show - Return the firmware rev running in the hba
945  * @dev: class converted to a Scsi_host structure.
946  * @attr: device attribute, not used.
947  * @buf: on return contains the scsi vpd program type.
948  *
949  * Returns: size of formatted string.
950  **/
951 static ssize_t
952 lpfc_fwrev_show(struct device *dev, struct device_attribute *attr,
953                 char *buf)
954 {
955         struct Scsi_Host  *shost = class_to_shost(dev);
956         struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata;
957         struct lpfc_hba   *phba = vport->phba;
958         uint32_t if_type;
959         uint8_t sli_family;
960         char fwrev[FW_REV_STR_SIZE];
961         int len;
962
963         lpfc_decode_firmware_rev(phba, fwrev, 1);
964         if_type = phba->sli4_hba.pc_sli4_params.if_type;
965         sli_family = phba->sli4_hba.pc_sli4_params.sli_family;
966
967         if (phba->sli_rev < LPFC_SLI_REV4)
968                 len = scnprintf(buf, PAGE_SIZE, "%s, sli-%d\n",
969                                fwrev, phba->sli_rev);
970         else
971                 len = scnprintf(buf, PAGE_SIZE, "%s, sli-%d:%d:%x\n",
972                                fwrev, phba->sli_rev, if_type, sli_family);
973
974         return len;
975 }
976
977 /**
978  * lpfc_hdw_show - Return the jedec information about the hba
979  * @dev: class converted to a Scsi_host structure.
980  * @attr: device attribute, not used.
981  * @buf: on return contains the scsi vpd program type.
982  *
983  * Returns: size of formatted string.
984  **/
985 static ssize_t
986 lpfc_hdw_show(struct device *dev, struct device_attribute *attr, char *buf)
987 {
988         char hdw[9];
989         struct Scsi_Host  *shost = class_to_shost(dev);
990         struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata;
991         struct lpfc_hba   *phba = vport->phba;
992         lpfc_vpd_t *vp = &phba->vpd;
993
994         lpfc_jedec_to_ascii(vp->rev.biuRev, hdw);
995         return scnprintf(buf, PAGE_SIZE, "%s %08x %08x\n", hdw,
996                          vp->rev.smRev, vp->rev.smFwRev);
997 }
998
999 /**
1000  * lpfc_option_rom_version_show - Return the adapter ROM FCode version
1001  * @dev: class converted to a Scsi_host structure.
1002  * @attr: device attribute, not used.
1003  * @buf: on return contains the ROM and FCode ascii strings.
1004  *
1005  * Returns: size of formatted string.
1006  **/
1007 static ssize_t
1008 lpfc_option_rom_version_show(struct device *dev, struct device_attribute *attr,
1009                              char *buf)
1010 {
1011         struct Scsi_Host  *shost = class_to_shost(dev);
1012         struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata;
1013         struct lpfc_hba   *phba = vport->phba;
1014         char fwrev[FW_REV_STR_SIZE];
1015
1016         if (phba->sli_rev < LPFC_SLI_REV4)
1017                 return scnprintf(buf, PAGE_SIZE, "%s\n",
1018                                 phba->OptionROMVersion);
1019
1020         lpfc_decode_firmware_rev(phba, fwrev, 1);
1021         return scnprintf(buf, PAGE_SIZE, "%s\n", fwrev);
1022 }
1023
1024 /**
1025  * lpfc_link_state_show - Return the link state of the port
1026  * @dev: class converted to a Scsi_host structure.
1027  * @attr: device attribute, not used.
1028  * @buf: on return contains text describing the state of the link.
1029  *
1030  * Notes:
1031  * The switch statement has no default so zero will be returned.
1032  *
1033  * Returns: size of formatted string.
1034  **/
1035 static ssize_t
1036 lpfc_link_state_show(struct device *dev, struct device_attribute *attr,
1037                      char *buf)
1038 {
1039         struct Scsi_Host  *shost = class_to_shost(dev);
1040         struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata;
1041         struct lpfc_hba   *phba = vport->phba;
1042         int  len = 0;
1043
1044         switch (phba->link_state) {
1045         case LPFC_LINK_UNKNOWN:
1046         case LPFC_WARM_START:
1047         case LPFC_INIT_START:
1048         case LPFC_INIT_MBX_CMDS:
1049         case LPFC_LINK_DOWN:
1050         case LPFC_HBA_ERROR:
1051                 if (phba->hba_flag & LINK_DISABLED)
1052                         len += scnprintf(buf + len, PAGE_SIZE-len,
1053                                 "Link Down - User disabled\n");
1054                 else
1055                         len += scnprintf(buf + len, PAGE_SIZE-len,
1056                                 "Link Down\n");
1057                 break;
1058         case LPFC_LINK_UP:
1059         case LPFC_CLEAR_LA:
1060         case LPFC_HBA_READY:
1061                 len += scnprintf(buf + len, PAGE_SIZE-len, "Link Up - ");
1062
1063                 switch (vport->port_state) {
1064                 case LPFC_LOCAL_CFG_LINK:
1065                         len += scnprintf(buf + len, PAGE_SIZE-len,
1066                                         "Configuring Link\n");
1067                         break;
1068                 case LPFC_FDISC:
1069                 case LPFC_FLOGI:
1070                 case LPFC_FABRIC_CFG_LINK:
1071                 case LPFC_NS_REG:
1072                 case LPFC_NS_QRY:
1073                 case LPFC_BUILD_DISC_LIST:
1074                 case LPFC_DISC_AUTH:
1075                         len += scnprintf(buf + len, PAGE_SIZE - len,
1076                                         "Discovery\n");
1077                         break;
1078                 case LPFC_VPORT_READY:
1079                         len += scnprintf(buf + len, PAGE_SIZE - len,
1080                                         "Ready\n");
1081                         break;
1082
1083                 case LPFC_VPORT_FAILED:
1084                         len += scnprintf(buf + len, PAGE_SIZE - len,
1085                                         "Failed\n");
1086                         break;
1087
1088                 case LPFC_VPORT_UNKNOWN:
1089                         len += scnprintf(buf + len, PAGE_SIZE - len,
1090                                         "Unknown\n");
1091                         break;
1092                 }
1093                 if (phba->fc_topology == LPFC_TOPOLOGY_LOOP) {
1094                         if (vport->fc_flag & FC_PUBLIC_LOOP)
1095                                 len += scnprintf(buf + len, PAGE_SIZE-len,
1096                                                 "   Public Loop\n");
1097                         else
1098                                 len += scnprintf(buf + len, PAGE_SIZE-len,
1099                                                 "   Private Loop\n");
1100                 } else {
1101                         if (vport->fc_flag & FC_FABRIC) {
1102                                 if (phba->sli_rev == LPFC_SLI_REV4 &&
1103                                     vport->port_type == LPFC_PHYSICAL_PORT &&
1104                                     phba->sli4_hba.fawwpn_flag &
1105                                         LPFC_FAWWPN_FABRIC)
1106                                         len += scnprintf(buf + len,
1107                                                          PAGE_SIZE - len,
1108                                                          "   Fabric FA-PWWN\n");
1109                                 else
1110                                         len += scnprintf(buf + len,
1111                                                          PAGE_SIZE - len,
1112                                                          "   Fabric\n");
1113                         } else {
1114                                 len += scnprintf(buf + len, PAGE_SIZE-len,
1115                                                 "   Point-2-Point\n");
1116                         }
1117                 }
1118         }
1119
1120         if ((phba->sli_rev == LPFC_SLI_REV4) &&
1121             ((bf_get(lpfc_sli_intf_if_type,
1122              &phba->sli4_hba.sli_intf) ==
1123              LPFC_SLI_INTF_IF_TYPE_6))) {
1124                 struct lpfc_trunk_link link = phba->trunk_link;
1125
1126                 if (bf_get(lpfc_conf_trunk_port0, &phba->sli4_hba))
1127                         len += scnprintf(buf + len, PAGE_SIZE - len,
1128                                 "Trunk port 0: Link %s %s\n",
1129                                 (link.link0.state == LPFC_LINK_UP) ?
1130                                  "Up" : "Down. ",
1131                                 trunk_errmsg[link.link0.fault]);
1132
1133                 if (bf_get(lpfc_conf_trunk_port1, &phba->sli4_hba))
1134                         len += scnprintf(buf + len, PAGE_SIZE - len,
1135                                 "Trunk port 1: Link %s %s\n",
1136                                 (link.link1.state == LPFC_LINK_UP) ?
1137                                  "Up" : "Down. ",
1138                                 trunk_errmsg[link.link1.fault]);
1139
1140                 if (bf_get(lpfc_conf_trunk_port2, &phba->sli4_hba))
1141                         len += scnprintf(buf + len, PAGE_SIZE - len,
1142                                 "Trunk port 2: Link %s %s\n",
1143                                 (link.link2.state == LPFC_LINK_UP) ?
1144                                  "Up" : "Down. ",
1145                                 trunk_errmsg[link.link2.fault]);
1146
1147                 if (bf_get(lpfc_conf_trunk_port3, &phba->sli4_hba))
1148                         len += scnprintf(buf + len, PAGE_SIZE - len,
1149                                 "Trunk port 3: Link %s %s\n",
1150                                 (link.link3.state == LPFC_LINK_UP) ?
1151                                  "Up" : "Down. ",
1152                                 trunk_errmsg[link.link3.fault]);
1153
1154         }
1155
1156         return len;
1157 }
1158
1159 /**
1160  * lpfc_sli4_protocol_show - Return the fip mode of the HBA
1161  * @dev: class unused variable.
1162  * @attr: device attribute, not used.
1163  * @buf: on return contains the module description text.
1164  *
1165  * Returns: size of formatted string.
1166  **/
1167 static ssize_t
1168 lpfc_sli4_protocol_show(struct device *dev, struct device_attribute *attr,
1169                         char *buf)
1170 {
1171         struct Scsi_Host *shost = class_to_shost(dev);
1172         struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata;
1173         struct lpfc_hba *phba = vport->phba;
1174
1175         if (phba->sli_rev < LPFC_SLI_REV4)
1176                 return scnprintf(buf, PAGE_SIZE, "fc\n");
1177
1178         if (phba->sli4_hba.lnk_info.lnk_dv == LPFC_LNK_DAT_VAL) {
1179                 if (phba->sli4_hba.lnk_info.lnk_tp == LPFC_LNK_TYPE_GE)
1180                         return scnprintf(buf, PAGE_SIZE, "fcoe\n");
1181                 if (phba->sli4_hba.lnk_info.lnk_tp == LPFC_LNK_TYPE_FC)
1182                         return scnprintf(buf, PAGE_SIZE, "fc\n");
1183         }
1184         return scnprintf(buf, PAGE_SIZE, "unknown\n");
1185 }
1186
1187 /**
1188  * lpfc_oas_supported_show - Return whether or not Optimized Access Storage
1189  *                          (OAS) is supported.
1190  * @dev: class unused variable.
1191  * @attr: device attribute, not used.
1192  * @buf: on return contains the module description text.
1193  *
1194  * Returns: size of formatted string.
1195  **/
1196 static ssize_t
1197 lpfc_oas_supported_show(struct device *dev, struct device_attribute *attr,
1198                         char *buf)
1199 {
1200         struct Scsi_Host *shost = class_to_shost(dev);
1201         struct lpfc_vport *vport = (struct lpfc_vport *)shost->hostdata;
1202         struct lpfc_hba *phba = vport->phba;
1203
1204         return scnprintf(buf, PAGE_SIZE, "%d\n",
1205                         phba->sli4_hba.pc_sli4_params.oas_supported);
1206 }
1207
1208 /**
1209  * lpfc_link_state_store - Transition the link_state on an HBA port
1210  * @dev: class device that is converted into a Scsi_host.
1211  * @attr: device attribute, not used.
1212  * @buf: one or more lpfc_polling_flags values.
1213  * @count: not used.
1214  *
1215  * Returns:
1216  * -EINVAL if the buffer is not "up" or "down"
1217  * return from link state change function if non-zero
1218  * length of the buf on success
1219  **/
1220 static ssize_t
1221 lpfc_link_state_store(struct device *dev, struct device_attribute *attr,
1222                 const char *buf, size_t count)
1223 {
1224         struct Scsi_Host  *shost = class_to_shost(dev);
1225         struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata;
1226         struct lpfc_hba   *phba = vport->phba;
1227
1228         int status = -EINVAL;
1229
1230         if ((strncmp(buf, "up", sizeof("up") - 1) == 0) &&
1231                         (phba->link_state == LPFC_LINK_DOWN))
1232                 status = phba->lpfc_hba_init_link(phba, MBX_NOWAIT);
1233         else if ((strncmp(buf, "down", sizeof("down") - 1) == 0) &&
1234                         (phba->link_state >= LPFC_LINK_UP))
1235                 status = phba->lpfc_hba_down_link(phba, MBX_NOWAIT);
1236
1237         if (status == 0)
1238                 return strlen(buf);
1239         else
1240                 return status;
1241 }
1242
1243 /**
1244  * lpfc_num_discovered_ports_show - Return sum of mapped and unmapped vports
1245  * @dev: class device that is converted into a Scsi_host.
1246  * @attr: device attribute, not used.
1247  * @buf: on return contains the sum of fc mapped and unmapped.
1248  *
1249  * Description:
1250  * Returns the ascii text number of the sum of the fc mapped and unmapped
1251  * vport counts.
1252  *
1253  * Returns: size of formatted string.
1254  **/
1255 static ssize_t
1256 lpfc_num_discovered_ports_show(struct device *dev,
1257                                struct device_attribute *attr, char *buf)
1258 {
1259         struct Scsi_Host  *shost = class_to_shost(dev);
1260         struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata;
1261
1262         return scnprintf(buf, PAGE_SIZE, "%d\n",
1263                         vport->fc_map_cnt + vport->fc_unmap_cnt);
1264 }
1265
1266 /**
1267  * lpfc_issue_lip - Misnomer, name carried over from long ago
1268  * @shost: Scsi_Host pointer.
1269  *
1270  * Description:
1271  * Bring the link down gracefully then re-init the link. The firmware will
1272  * re-init the fiber channel interface as required. Does not issue a LIP.
1273  *
1274  * Returns:
1275  * -EPERM port offline or management commands are being blocked
1276  * -ENOMEM cannot allocate memory for the mailbox command
1277  * -EIO error sending the mailbox command
1278  * zero for success
1279  **/
1280 static int
1281 lpfc_issue_lip(struct Scsi_Host *shost)
1282 {
1283         struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata;
1284         struct lpfc_hba   *phba = vport->phba;
1285         LPFC_MBOXQ_t *pmboxq;
1286         int mbxstatus = MBXERR_ERROR;
1287
1288         /*
1289          * If the link is offline, disabled or BLOCK_MGMT_IO
1290          * it doesn't make any sense to allow issue_lip
1291          */
1292         if ((vport->fc_flag & FC_OFFLINE_MODE) ||
1293             (phba->hba_flag & LINK_DISABLED) ||
1294             (phba->sli.sli_flag & LPFC_BLOCK_MGMT_IO))
1295                 return -EPERM;
1296
1297         pmboxq = mempool_alloc(phba->mbox_mem_pool,GFP_KERNEL);
1298
1299         if (!pmboxq)
1300                 return -ENOMEM;
1301
1302         memset((void *)pmboxq, 0, sizeof (LPFC_MBOXQ_t));
1303         pmboxq->u.mb.mbxCommand = MBX_DOWN_LINK;
1304         pmboxq->u.mb.mbxOwner = OWN_HOST;
1305
1306         if ((vport->fc_flag & FC_PT2PT) && (vport->fc_flag & FC_PT2PT_NO_NVME))
1307                 vport->fc_flag &= ~FC_PT2PT_NO_NVME;
1308
1309         mbxstatus = lpfc_sli_issue_mbox_wait(phba, pmboxq, LPFC_MBOX_TMO * 2);
1310
1311         if ((mbxstatus == MBX_SUCCESS) &&
1312             (pmboxq->u.mb.mbxStatus == 0 ||
1313              pmboxq->u.mb.mbxStatus == MBXERR_LINK_DOWN)) {
1314                 memset((void *)pmboxq, 0, sizeof (LPFC_MBOXQ_t));
1315                 lpfc_init_link(phba, pmboxq, phba->cfg_topology,
1316                                phba->cfg_link_speed);
1317                 mbxstatus = lpfc_sli_issue_mbox_wait(phba, pmboxq,
1318                                                      phba->fc_ratov * 2);
1319                 if ((mbxstatus == MBX_SUCCESS) &&
1320                     (pmboxq->u.mb.mbxStatus == MBXERR_SEC_NO_PERMISSION))
1321                         lpfc_printf_log(phba, KERN_ERR, LOG_MBOX | LOG_SLI,
1322                                         "2859 SLI authentication is required "
1323                                         "for INIT_LINK but has not done yet\n");
1324         }
1325
1326         lpfc_set_loopback_flag(phba);
1327         if (mbxstatus != MBX_TIMEOUT)
1328                 mempool_free(pmboxq, phba->mbox_mem_pool);
1329
1330         if (mbxstatus == MBXERR_ERROR)
1331                 return -EIO;
1332
1333         return 0;
1334 }
1335
1336 int
1337 lpfc_emptyq_wait(struct lpfc_hba *phba, struct list_head *q, spinlock_t *lock)
1338 {
1339         int cnt = 0;
1340
1341         spin_lock_irq(lock);
1342         while (!list_empty(q)) {
1343                 spin_unlock_irq(lock);
1344                 msleep(20);
1345                 if (cnt++ > 250) {  /* 5 secs */
1346                         lpfc_printf_log(phba, KERN_WARNING, LOG_INIT,
1347                                         "0466 Outstanding IO when "
1348                                         "bringing Adapter offline\n");
1349                                 return 0;
1350                 }
1351                 spin_lock_irq(lock);
1352         }
1353         spin_unlock_irq(lock);
1354         return 1;
1355 }
1356
1357 /**
1358  * lpfc_do_offline - Issues a mailbox command to bring the link down
1359  * @phba: lpfc_hba pointer.
1360  * @type: LPFC_EVT_OFFLINE, LPFC_EVT_WARM_START, LPFC_EVT_KILL.
1361  *
1362  * Notes:
1363  * Assumes any error from lpfc_do_offline() will be negative.
1364  * Can wait up to 5 seconds for the port ring buffers count
1365  * to reach zero, prints a warning if it is not zero and continues.
1366  * lpfc_workq_post_event() returns a non-zero return code if call fails.
1367  *
1368  * Returns:
1369  * -EIO error posting the event
1370  * zero for success
1371  **/
1372 static int
1373 lpfc_do_offline(struct lpfc_hba *phba, uint32_t type)
1374 {
1375         struct completion online_compl;
1376         struct lpfc_queue *qp = NULL;
1377         struct lpfc_sli_ring *pring;
1378         struct lpfc_sli *psli;
1379         int status = 0;
1380         int i;
1381         int rc;
1382
1383         init_completion(&online_compl);
1384         rc = lpfc_workq_post_event(phba, &status, &online_compl,
1385                               LPFC_EVT_OFFLINE_PREP);
1386         if (rc == 0)
1387                 return -ENOMEM;
1388
1389         wait_for_completion(&online_compl);
1390
1391         if (status != 0)
1392                 return -EIO;
1393
1394         psli = &phba->sli;
1395
1396         /*
1397          * If freeing the queues have already started, don't access them.
1398          * Otherwise set FREE_WAIT to indicate that queues are being used
1399          * to hold the freeing process until we finish.
1400          */
1401         spin_lock_irq(&phba->hbalock);
1402         if (!(psli->sli_flag & LPFC_QUEUE_FREE_INIT)) {
1403                 psli->sli_flag |= LPFC_QUEUE_FREE_WAIT;
1404         } else {
1405                 spin_unlock_irq(&phba->hbalock);
1406                 goto skip_wait;
1407         }
1408         spin_unlock_irq(&phba->hbalock);
1409
1410         /* Wait a little for things to settle down, but not
1411          * long enough for dev loss timeout to expire.
1412          */
1413         if (phba->sli_rev != LPFC_SLI_REV4) {
1414                 for (i = 0; i < psli->num_rings; i++) {
1415                         pring = &psli->sli3_ring[i];
1416                         if (!lpfc_emptyq_wait(phba, &pring->txcmplq,
1417                                               &phba->hbalock))
1418                                 goto out;
1419                 }
1420         } else {
1421                 list_for_each_entry(qp, &phba->sli4_hba.lpfc_wq_list, wq_list) {
1422                         pring = qp->pring;
1423                         if (!pring)
1424                                 continue;
1425                         if (!lpfc_emptyq_wait(phba, &pring->txcmplq,
1426                                               &pring->ring_lock))
1427                                 goto out;
1428                 }
1429         }
1430 out:
1431         spin_lock_irq(&phba->hbalock);
1432         psli->sli_flag &= ~LPFC_QUEUE_FREE_WAIT;
1433         spin_unlock_irq(&phba->hbalock);
1434
1435 skip_wait:
1436         init_completion(&online_compl);
1437         rc = lpfc_workq_post_event(phba, &status, &online_compl, type);
1438         if (rc == 0)
1439                 return -ENOMEM;
1440
1441         wait_for_completion(&online_compl);
1442
1443         if (status != 0)
1444                 return -EIO;
1445
1446         return 0;
1447 }
1448
1449 /**
1450  * lpfc_reset_pci_bus - resets PCI bridge controller's secondary bus of an HBA
1451  * @phba: lpfc_hba pointer.
1452  *
1453  * Description:
1454  * Issues a PCI secondary bus reset for the phba->pcidev.
1455  *
1456  * Notes:
1457  * First walks the bus_list to ensure only PCI devices with Emulex
1458  * vendor id, device ids that support hot reset, only one occurrence
1459  * of function 0, and all ports on the bus are in offline mode to ensure the
1460  * hot reset only affects one valid HBA.
1461  *
1462  * Returns:
1463  * -ENOTSUPP, cfg_enable_hba_reset must be of value 2
1464  * -ENODEV,   NULL ptr to pcidev
1465  * -EBADSLT,  detected invalid device
1466  * -EBUSY,    port is not in offline state
1467  *      0,    successful
1468  */
1469 static int
1470 lpfc_reset_pci_bus(struct lpfc_hba *phba)
1471 {
1472         struct pci_dev *pdev = phba->pcidev;
1473         struct Scsi_Host *shost = NULL;
1474         struct lpfc_hba *phba_other = NULL;
1475         struct pci_dev *ptr = NULL;
1476         int res;
1477
1478         if (phba->cfg_enable_hba_reset != 2)
1479                 return -ENOTSUPP;
1480
1481         if (!pdev) {
1482                 lpfc_printf_log(phba, KERN_INFO, LOG_INIT, "8345 pdev NULL!\n");
1483                 return -ENODEV;
1484         }
1485
1486         res = lpfc_check_pci_resettable(phba);
1487         if (res)
1488                 return res;
1489
1490         /* Walk the list of devices on the pci_dev's bus */
1491         list_for_each_entry(ptr, &pdev->bus->devices, bus_list) {
1492                 /* Check port is offline */
1493                 shost = pci_get_drvdata(ptr);
1494                 if (shost) {
1495                         phba_other =
1496                                 ((struct lpfc_vport *)shost->hostdata)->phba;
1497                         if (!(phba_other->pport->fc_flag & FC_OFFLINE_MODE)) {
1498                                 lpfc_printf_log(phba_other, KERN_INFO, LOG_INIT,
1499                                                 "8349 WWPN = 0x%02x%02x%02x%02x"
1500                                                 "%02x%02x%02x%02x is not "
1501                                                 "offline!\n",
1502                                                 phba_other->wwpn[0],
1503                                                 phba_other->wwpn[1],
1504                                                 phba_other->wwpn[2],
1505                                                 phba_other->wwpn[3],
1506                                                 phba_other->wwpn[4],
1507                                                 phba_other->wwpn[5],
1508                                                 phba_other->wwpn[6],
1509                                                 phba_other->wwpn[7]);
1510                                 return -EBUSY;
1511                         }
1512                 }
1513         }
1514
1515         /* Issue PCI bus reset */
1516         res = pci_reset_bus(pdev);
1517         if (res) {
1518                 lpfc_printf_log(phba, KERN_ERR, LOG_INIT,
1519                                 "8350 PCI reset bus failed: %d\n", res);
1520         }
1521
1522         return res;
1523 }
1524
1525 /**
1526  * lpfc_selective_reset - Offline then onlines the port
1527  * @phba: lpfc_hba pointer.
1528  *
1529  * Description:
1530  * If the port is configured to allow a reset then the hba is brought
1531  * offline then online.
1532  *
1533  * Notes:
1534  * Assumes any error from lpfc_do_offline() will be negative.
1535  * Do not make this function static.
1536  *
1537  * Returns:
1538  * lpfc_do_offline() return code if not zero
1539  * -EIO reset not configured or error posting the event
1540  * zero for success
1541  **/
1542 int
1543 lpfc_selective_reset(struct lpfc_hba *phba)
1544 {
1545         struct completion online_compl;
1546         int status = 0;
1547         int rc;
1548
1549         if (!phba->cfg_enable_hba_reset)
1550                 return -EACCES;
1551
1552         if (!(phba->pport->fc_flag & FC_OFFLINE_MODE)) {
1553                 status = lpfc_do_offline(phba, LPFC_EVT_OFFLINE);
1554
1555                 if (status != 0)
1556                         return status;
1557         }
1558
1559         init_completion(&online_compl);
1560         rc = lpfc_workq_post_event(phba, &status, &online_compl,
1561                               LPFC_EVT_ONLINE);
1562         if (rc == 0)
1563                 return -ENOMEM;
1564
1565         wait_for_completion(&online_compl);
1566
1567         if (status != 0)
1568                 return -EIO;
1569
1570         return 0;
1571 }
1572
1573 /**
1574  * lpfc_issue_reset - Selectively resets an adapter
1575  * @dev: class device that is converted into a Scsi_host.
1576  * @attr: device attribute, not used.
1577  * @buf: containing the string "selective".
1578  * @count: unused variable.
1579  *
1580  * Description:
1581  * If the buf contains the string "selective" then lpfc_selective_reset()
1582  * is called to perform the reset.
1583  *
1584  * Notes:
1585  * Assumes any error from lpfc_selective_reset() will be negative.
1586  * If lpfc_selective_reset() returns zero then the length of the buffer
1587  * is returned which indicates success
1588  *
1589  * Returns:
1590  * -EINVAL if the buffer does not contain the string "selective"
1591  * length of buf if lpfc-selective_reset() if the call succeeds
1592  * return value of lpfc_selective_reset() if the call fails
1593 **/
1594 static ssize_t
1595 lpfc_issue_reset(struct device *dev, struct device_attribute *attr,
1596                  const char *buf, size_t count)
1597 {
1598         struct Scsi_Host  *shost = class_to_shost(dev);
1599         struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata;
1600         struct lpfc_hba   *phba = vport->phba;
1601         int status = -EINVAL;
1602
1603         if (!phba->cfg_enable_hba_reset)
1604                 return -EACCES;
1605
1606         if (strncmp(buf, "selective", sizeof("selective") - 1) == 0)
1607                 status = phba->lpfc_selective_reset(phba);
1608
1609         if (status == 0)
1610                 return strlen(buf);
1611         else
1612                 return status;
1613 }
1614
1615 /**
1616  * lpfc_sli4_pdev_status_reg_wait - Wait for pdev status register for readyness
1617  * @phba: lpfc_hba pointer.
1618  *
1619  * Description:
1620  * SLI4 interface type-2 device to wait on the sliport status register for
1621  * the readyness after performing a firmware reset.
1622  *
1623  * Returns:
1624  * zero for success, -EPERM when port does not have privilege to perform the
1625  * reset, -EIO when port timeout from recovering from the reset.
1626  *
1627  * Note:
1628  * As the caller will interpret the return code by value, be careful in making
1629  * change or addition to return codes.
1630  **/
1631 int
1632 lpfc_sli4_pdev_status_reg_wait(struct lpfc_hba *phba)
1633 {
1634         struct lpfc_register portstat_reg = {0};
1635         int i;
1636
1637         msleep(100);
1638         if (lpfc_readl(phba->sli4_hba.u.if_type2.STATUSregaddr,
1639                        &portstat_reg.word0))
1640                 return -EIO;
1641
1642         /* verify if privileged for the request operation */
1643         if (!bf_get(lpfc_sliport_status_rn, &portstat_reg) &&
1644             !bf_get(lpfc_sliport_status_err, &portstat_reg))
1645                 return -EPERM;
1646
1647         /* wait for the SLI port firmware ready after firmware reset */
1648         for (i = 0; i < LPFC_FW_RESET_MAXIMUM_WAIT_10MS_CNT; i++) {
1649                 msleep(10);
1650                 if (lpfc_readl(phba->sli4_hba.u.if_type2.STATUSregaddr,
1651                                &portstat_reg.word0))
1652                         continue;
1653                 if (!bf_get(lpfc_sliport_status_err, &portstat_reg))
1654                         continue;
1655                 if (!bf_get(lpfc_sliport_status_rn, &portstat_reg))
1656                         continue;
1657                 if (!bf_get(lpfc_sliport_status_rdy, &portstat_reg))
1658                         continue;
1659                 break;
1660         }
1661
1662         if (i < LPFC_FW_RESET_MAXIMUM_WAIT_10MS_CNT)
1663                 return 0;
1664         else
1665                 return -EIO;
1666 }
1667
1668 /**
1669  * lpfc_sli4_pdev_reg_request - Request physical dev to perform a register acc
1670  * @phba: lpfc_hba pointer.
1671  * @opcode: The sli4 config command opcode.
1672  *
1673  * Description:
1674  * Request SLI4 interface type-2 device to perform a physical register set
1675  * access.
1676  *
1677  * Returns:
1678  * zero for success
1679  **/
1680 static ssize_t
1681 lpfc_sli4_pdev_reg_request(struct lpfc_hba *phba, uint32_t opcode)
1682 {
1683         struct completion online_compl;
1684         struct pci_dev *pdev = phba->pcidev;
1685         uint32_t before_fc_flag;
1686         uint32_t sriov_nr_virtfn;
1687         uint32_t reg_val;
1688         int status = 0, rc = 0;
1689         int job_posted = 1, sriov_err;
1690
1691         if (!phba->cfg_enable_hba_reset)
1692                 return -EACCES;
1693
1694         if ((phba->sli_rev < LPFC_SLI_REV4) ||
1695             (bf_get(lpfc_sli_intf_if_type, &phba->sli4_hba.sli_intf) <
1696              LPFC_SLI_INTF_IF_TYPE_2))
1697                 return -EPERM;
1698
1699         /* Keep state if we need to restore back */
1700         before_fc_flag = phba->pport->fc_flag;
1701         sriov_nr_virtfn = phba->cfg_sriov_nr_virtfn;
1702
1703         if (opcode == LPFC_FW_DUMP) {
1704                 init_completion(&online_compl);
1705                 phba->fw_dump_cmpl = &online_compl;
1706         } else {
1707                 /* Disable SR-IOV virtual functions if enabled */
1708                 if (phba->cfg_sriov_nr_virtfn) {
1709                         pci_disable_sriov(pdev);
1710                         phba->cfg_sriov_nr_virtfn = 0;
1711                 }
1712
1713                 status = lpfc_do_offline(phba, LPFC_EVT_OFFLINE);
1714
1715                 if (status != 0)
1716                         return status;
1717
1718                 /* wait for the device to be quiesced before firmware reset */
1719                 msleep(100);
1720         }
1721
1722         reg_val = readl(phba->sli4_hba.conf_regs_memmap_p +
1723                         LPFC_CTL_PDEV_CTL_OFFSET);
1724
1725         if (opcode == LPFC_FW_DUMP)
1726                 reg_val |= LPFC_FW_DUMP_REQUEST;
1727         else if (opcode == LPFC_FW_RESET)
1728                 reg_val |= LPFC_CTL_PDEV_CTL_FRST;
1729         else if (opcode == LPFC_DV_RESET)
1730                 reg_val |= LPFC_CTL_PDEV_CTL_DRST;
1731
1732         writel(reg_val, phba->sli4_hba.conf_regs_memmap_p +
1733                LPFC_CTL_PDEV_CTL_OFFSET);
1734         /* flush */
1735         readl(phba->sli4_hba.conf_regs_memmap_p + LPFC_CTL_PDEV_CTL_OFFSET);
1736
1737         /* delay driver action following IF_TYPE_2 reset */
1738         rc = lpfc_sli4_pdev_status_reg_wait(phba);
1739
1740         if (rc == -EPERM) {
1741                 /* no privilege for reset */
1742                 lpfc_printf_log(phba, KERN_ERR, LOG_SLI,
1743                                 "3150 No privilege to perform the requested "
1744                                 "access: x%x\n", reg_val);
1745         } else if (rc == -EIO) {
1746                 /* reset failed, there is nothing more we can do */
1747                 lpfc_printf_log(phba, KERN_ERR, LOG_SLI,
1748                                 "3153 Fail to perform the requested "
1749                                 "access: x%x\n", reg_val);
1750                 if (phba->fw_dump_cmpl)
1751                         phba->fw_dump_cmpl = NULL;
1752                 return rc;
1753         }
1754
1755         /* keep the original port state */
1756         if (before_fc_flag & FC_OFFLINE_MODE) {
1757                 if (phba->fw_dump_cmpl)
1758                         phba->fw_dump_cmpl = NULL;
1759                 goto out;
1760         }
1761
1762         /* Firmware dump will trigger an HA_ERATT event, and
1763          * lpfc_handle_eratt_s4 routine already handles bringing the port back
1764          * online.
1765          */
1766         if (opcode == LPFC_FW_DUMP) {
1767                 wait_for_completion(phba->fw_dump_cmpl);
1768         } else  {
1769                 init_completion(&online_compl);
1770                 job_posted = lpfc_workq_post_event(phba, &status, &online_compl,
1771                                                    LPFC_EVT_ONLINE);
1772                 if (!job_posted)
1773                         goto out;
1774
1775                 wait_for_completion(&online_compl);
1776         }
1777 out:
1778         /* in any case, restore the virtual functions enabled as before */
1779         if (sriov_nr_virtfn) {
1780                 /* If fw_dump was performed, first disable to clean up */
1781                 if (opcode == LPFC_FW_DUMP) {
1782                         pci_disable_sriov(pdev);
1783                         phba->cfg_sriov_nr_virtfn = 0;
1784                 }
1785
1786                 sriov_err =
1787                         lpfc_sli_probe_sriov_nr_virtfn(phba, sriov_nr_virtfn);
1788                 if (!sriov_err)
1789                         phba->cfg_sriov_nr_virtfn = sriov_nr_virtfn;
1790         }
1791
1792         /* return proper error code */
1793         if (!rc) {
1794                 if (!job_posted)
1795                         rc = -ENOMEM;
1796                 else if (status)
1797                         rc = -EIO;
1798         }
1799         return rc;
1800 }
1801
1802 /**
1803  * lpfc_nport_evt_cnt_show - Return the number of nport events
1804  * @dev: class device that is converted into a Scsi_host.
1805  * @attr: device attribute, not used.
1806  * @buf: on return contains the ascii number of nport events.
1807  *
1808  * Returns: size of formatted string.
1809  **/
1810 static ssize_t
1811 lpfc_nport_evt_cnt_show(struct device *dev, struct device_attribute *attr,
1812                         char *buf)
1813 {
1814         struct Scsi_Host  *shost = class_to_shost(dev);
1815         struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata;
1816         struct lpfc_hba   *phba = vport->phba;
1817
1818         return scnprintf(buf, PAGE_SIZE, "%d\n", phba->nport_event_cnt);
1819 }
1820
1821 static int
1822 lpfc_set_trunking(struct lpfc_hba *phba, char *buff_out)
1823 {
1824         LPFC_MBOXQ_t *mbox = NULL;
1825         unsigned long val = 0;
1826         char *pval = NULL;
1827         int rc = 0;
1828
1829         if (!strncmp("enable", buff_out,
1830                                  strlen("enable"))) {
1831                 pval = buff_out + strlen("enable") + 1;
1832                 rc = kstrtoul(pval, 0, &val);
1833                 if (rc)
1834                         return rc; /* Invalid  number */
1835         } else if (!strncmp("disable", buff_out,
1836                                  strlen("disable"))) {
1837                 val = 0;
1838         } else {
1839                 return -EINVAL;  /* Invalid command */
1840         }
1841
1842         switch (val) {
1843         case 0:
1844                 val = 0x0; /* Disable */
1845                 break;
1846         case 2:
1847                 val = 0x1; /* Enable two port trunk */
1848                 break;
1849         case 4:
1850                 val = 0x2; /* Enable four port trunk */
1851                 break;
1852         default:
1853                 return -EINVAL;
1854         }
1855
1856         lpfc_printf_log(phba, KERN_ERR, LOG_MBOX,
1857                         "0070 Set trunk mode with val %ld ", val);
1858
1859         mbox = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL);
1860         if (!mbox)
1861                 return -ENOMEM;
1862
1863         lpfc_sli4_config(phba, mbox, LPFC_MBOX_SUBSYSTEM_FCOE,
1864                          LPFC_MBOX_OPCODE_FCOE_FC_SET_TRUNK_MODE,
1865                          12, LPFC_SLI4_MBX_EMBED);
1866
1867         bf_set(lpfc_mbx_set_trunk_mode,
1868                &mbox->u.mqe.un.set_trunk_mode,
1869                val);
1870         rc = lpfc_sli_issue_mbox(phba, mbox, MBX_POLL);
1871         if (rc)
1872                 lpfc_printf_log(phba, KERN_ERR, LOG_MBOX,
1873                                 "0071 Set trunk mode failed with status: %d",
1874                                 rc);
1875         mempool_free(mbox, phba->mbox_mem_pool);
1876
1877         return 0;
1878 }
1879
1880 static ssize_t
1881 lpfc_xcvr_data_show(struct device *dev, struct device_attribute *attr,
1882                     char *buf)
1883 {
1884         struct Scsi_Host  *shost = class_to_shost(dev);
1885         struct lpfc_vport *vport = (struct lpfc_vport *)shost->hostdata;
1886         struct lpfc_hba   *phba = vport->phba;
1887         int rc;
1888         int len = 0;
1889         struct lpfc_rdp_context *rdp_context;
1890         u16 temperature;
1891         u16 rx_power;
1892         u16 tx_bias;
1893         u16 tx_power;
1894         u16 vcc;
1895         char chbuf[128];
1896         u16 wavelength = 0;
1897         struct sff_trasnceiver_codes_byte7 *trasn_code_byte7;
1898
1899         /* Get transceiver information */
1900         rdp_context = kmalloc(sizeof(*rdp_context), GFP_KERNEL);
1901
1902         rc = lpfc_get_sfp_info_wait(phba, rdp_context);
1903         if (rc) {
1904                 len = scnprintf(buf, PAGE_SIZE - len, "SFP info NA:\n");
1905                 goto out_free_rdp;
1906         }
1907
1908         strscpy(chbuf, &rdp_context->page_a0[SSF_VENDOR_NAME], 16);
1909
1910         len = scnprintf(buf, PAGE_SIZE - len, "VendorName:\t%s\n", chbuf);
1911         len += scnprintf(buf + len, PAGE_SIZE - len,
1912                          "VendorOUI:\t%02x-%02x-%02x\n",
1913                          (uint8_t)rdp_context->page_a0[SSF_VENDOR_OUI],
1914                          (uint8_t)rdp_context->page_a0[SSF_VENDOR_OUI + 1],
1915                          (uint8_t)rdp_context->page_a0[SSF_VENDOR_OUI + 2]);
1916         strscpy(chbuf, &rdp_context->page_a0[SSF_VENDOR_PN], 16);
1917         len += scnprintf(buf + len, PAGE_SIZE - len, "VendorPN:\t%s\n", chbuf);
1918         strscpy(chbuf, &rdp_context->page_a0[SSF_VENDOR_SN], 16);
1919         len += scnprintf(buf + len, PAGE_SIZE - len, "VendorSN:\t%s\n", chbuf);
1920         strscpy(chbuf, &rdp_context->page_a0[SSF_VENDOR_REV], 4);
1921         len += scnprintf(buf + len, PAGE_SIZE - len, "VendorRev:\t%s\n", chbuf);
1922         strscpy(chbuf, &rdp_context->page_a0[SSF_DATE_CODE], 8);
1923         len += scnprintf(buf + len, PAGE_SIZE - len, "DateCode:\t%s\n", chbuf);
1924         len += scnprintf(buf + len, PAGE_SIZE - len, "Identifier:\t%xh\n",
1925                          (uint8_t)rdp_context->page_a0[SSF_IDENTIFIER]);
1926         len += scnprintf(buf + len, PAGE_SIZE - len, "ExtIdentifier:\t%xh\n",
1927                          (uint8_t)rdp_context->page_a0[SSF_EXT_IDENTIFIER]);
1928         len += scnprintf(buf + len, PAGE_SIZE - len, "Connector:\t%xh\n",
1929                          (uint8_t)rdp_context->page_a0[SSF_CONNECTOR]);
1930         wavelength = (rdp_context->page_a0[SSF_WAVELENGTH_B1] << 8) |
1931                       rdp_context->page_a0[SSF_WAVELENGTH_B0];
1932
1933         len += scnprintf(buf + len, PAGE_SIZE - len, "Wavelength:\t%d nm\n",
1934                          wavelength);
1935         trasn_code_byte7 = (struct sff_trasnceiver_codes_byte7 *)
1936                         &rdp_context->page_a0[SSF_TRANSCEIVER_CODE_B7];
1937
1938         len += scnprintf(buf + len, PAGE_SIZE - len, "Speeds: \t");
1939         if (*(uint8_t *)trasn_code_byte7 == 0) {
1940                 len += scnprintf(buf + len, PAGE_SIZE - len, "Unknown\n");
1941         } else {
1942                 if (trasn_code_byte7->fc_sp_100MB)
1943                         len += scnprintf(buf + len, PAGE_SIZE - len, "1 ");
1944                 if (trasn_code_byte7->fc_sp_200mb)
1945                         len += scnprintf(buf + len, PAGE_SIZE - len, "2 ");
1946                 if (trasn_code_byte7->fc_sp_400MB)
1947                         len += scnprintf(buf + len, PAGE_SIZE - len, "4 ");
1948                 if (trasn_code_byte7->fc_sp_800MB)
1949                         len += scnprintf(buf + len, PAGE_SIZE - len, "8 ");
1950                 if (trasn_code_byte7->fc_sp_1600MB)
1951                         len += scnprintf(buf + len, PAGE_SIZE - len, "16 ");
1952                 if (trasn_code_byte7->fc_sp_3200MB)
1953                         len += scnprintf(buf + len, PAGE_SIZE - len, "32 ");
1954                 if (trasn_code_byte7->speed_chk_ecc)
1955                         len += scnprintf(buf + len, PAGE_SIZE - len, "64 ");
1956                 len += scnprintf(buf + len, PAGE_SIZE - len, "GB\n");
1957         }
1958         temperature = (rdp_context->page_a2[SFF_TEMPERATURE_B1] << 8 |
1959                        rdp_context->page_a2[SFF_TEMPERATURE_B0]);
1960         vcc = (rdp_context->page_a2[SFF_VCC_B1] << 8 |
1961                rdp_context->page_a2[SFF_VCC_B0]);
1962         tx_power = (rdp_context->page_a2[SFF_TXPOWER_B1] << 8 |
1963                     rdp_context->page_a2[SFF_TXPOWER_B0]);
1964         tx_bias = (rdp_context->page_a2[SFF_TX_BIAS_CURRENT_B1] << 8 |
1965                    rdp_context->page_a2[SFF_TX_BIAS_CURRENT_B0]);
1966         rx_power = (rdp_context->page_a2[SFF_RXPOWER_B1] << 8 |
1967                     rdp_context->page_a2[SFF_RXPOWER_B0]);
1968
1969         len += scnprintf(buf + len, PAGE_SIZE - len,
1970                          "Temperature:\tx%04x C\n", temperature);
1971         len += scnprintf(buf + len, PAGE_SIZE - len, "Vcc:\t\tx%04x V\n", vcc);
1972         len += scnprintf(buf + len, PAGE_SIZE - len,
1973                          "TxBiasCurrent:\tx%04x mA\n", tx_bias);
1974         len += scnprintf(buf + len, PAGE_SIZE - len, "TxPower:\tx%04x mW\n",
1975                          tx_power);
1976         len += scnprintf(buf + len, PAGE_SIZE - len, "RxPower:\tx%04x mW\n",
1977                          rx_power);
1978 out_free_rdp:
1979         kfree(rdp_context);
1980         return len;
1981 }
1982
1983 /**
1984  * lpfc_board_mode_show - Return the state of the board
1985  * @dev: class device that is converted into a Scsi_host.
1986  * @attr: device attribute, not used.
1987  * @buf: on return contains the state of the adapter.
1988  *
1989  * Returns: size of formatted string.
1990  **/
1991 static ssize_t
1992 lpfc_board_mode_show(struct device *dev, struct device_attribute *attr,
1993                      char *buf)
1994 {
1995         struct Scsi_Host  *shost = class_to_shost(dev);
1996         struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata;
1997         struct lpfc_hba   *phba = vport->phba;
1998         char  * state;
1999
2000         if (phba->link_state == LPFC_HBA_ERROR)
2001                 state = "error";
2002         else if (phba->link_state == LPFC_WARM_START)
2003                 state = "warm start";
2004         else if (phba->link_state == LPFC_INIT_START)
2005                 state = "offline";
2006         else
2007                 state = "online";
2008
2009         return scnprintf(buf, PAGE_SIZE, "%s\n", state);
2010 }
2011
2012 /**
2013  * lpfc_board_mode_store - Puts the hba in online, offline, warm or error state
2014  * @dev: class device that is converted into a Scsi_host.
2015  * @attr: device attribute, not used.
2016  * @buf: containing one of the strings "online", "offline", "warm" or "error".
2017  * @count: unused variable.
2018  *
2019  * Returns:
2020  * -EACCES if enable hba reset not enabled
2021  * -EINVAL if the buffer does not contain a valid string (see above)
2022  * -EIO if lpfc_workq_post_event() or lpfc_do_offline() fails
2023  * buf length greater than zero indicates success
2024  **/
2025 static ssize_t
2026 lpfc_board_mode_store(struct device *dev, struct device_attribute *attr,
2027                       const char *buf, size_t count)
2028 {
2029         struct Scsi_Host  *shost = class_to_shost(dev);
2030         struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata;
2031         struct lpfc_hba   *phba = vport->phba;
2032         struct completion online_compl;
2033         char *board_mode_str = NULL;
2034         int status = 0;
2035         int rc;
2036
2037         if (!phba->cfg_enable_hba_reset) {
2038                 status = -EACCES;
2039                 goto board_mode_out;
2040         }
2041
2042         lpfc_printf_vlog(vport, KERN_ERR, LOG_INIT,
2043                          "3050 lpfc_board_mode set to %s\n", buf);
2044
2045         init_completion(&online_compl);
2046
2047         if(strncmp(buf, "online", sizeof("online") - 1) == 0) {
2048                 rc = lpfc_workq_post_event(phba, &status, &online_compl,
2049                                       LPFC_EVT_ONLINE);
2050                 if (rc == 0) {
2051                         status = -ENOMEM;
2052                         goto board_mode_out;
2053                 }
2054                 wait_for_completion(&online_compl);
2055                 if (status)
2056                         status = -EIO;
2057         } else if (strncmp(buf, "offline", sizeof("offline") - 1) == 0)
2058                 status = lpfc_do_offline(phba, LPFC_EVT_OFFLINE);
2059         else if (strncmp(buf, "warm", sizeof("warm") - 1) == 0)
2060                 if (phba->sli_rev == LPFC_SLI_REV4)
2061                         status = -EINVAL;
2062                 else
2063                         status = lpfc_do_offline(phba, LPFC_EVT_WARM_START);
2064         else if (strncmp(buf, "error", sizeof("error") - 1) == 0)
2065                 if (phba->sli_rev == LPFC_SLI_REV4)
2066                         status = -EINVAL;
2067                 else
2068                         status = lpfc_do_offline(phba, LPFC_EVT_KILL);
2069         else if (strncmp(buf, "dump", sizeof("dump") - 1) == 0)
2070                 status = lpfc_sli4_pdev_reg_request(phba, LPFC_FW_DUMP);
2071         else if (strncmp(buf, "fw_reset", sizeof("fw_reset") - 1) == 0)
2072                 status = lpfc_sli4_pdev_reg_request(phba, LPFC_FW_RESET);
2073         else if (strncmp(buf, "dv_reset", sizeof("dv_reset") - 1) == 0)
2074                 status = lpfc_sli4_pdev_reg_request(phba, LPFC_DV_RESET);
2075         else if (strncmp(buf, "pci_bus_reset", sizeof("pci_bus_reset") - 1)
2076                  == 0)
2077                 status = lpfc_reset_pci_bus(phba);
2078         else if (strncmp(buf, "heartbeat", sizeof("heartbeat") - 1) == 0)
2079                 lpfc_issue_hb_tmo(phba);
2080         else if (strncmp(buf, "trunk", sizeof("trunk") - 1) == 0)
2081                 status = lpfc_set_trunking(phba, (char *)buf + sizeof("trunk"));
2082         else
2083                 status = -EINVAL;
2084
2085 board_mode_out:
2086         if (!status)
2087                 return strlen(buf);
2088         else {
2089                 board_mode_str = strchr(buf, '\n');
2090                 if (board_mode_str)
2091                         *board_mode_str = '\0';
2092                 lpfc_printf_vlog(vport, KERN_ERR, LOG_INIT,
2093                                  "3097 Failed \"%s\", status(%d), "
2094                                  "fc_flag(x%x)\n",
2095                                  buf, status, phba->pport->fc_flag);
2096                 return status;
2097         }
2098 }
2099
2100 /**
2101  * lpfc_get_hba_info - Return various bits of informaton about the adapter
2102  * @phba: pointer to the adapter structure.
2103  * @mxri: max xri count.
2104  * @axri: available xri count.
2105  * @mrpi: max rpi count.
2106  * @arpi: available rpi count.
2107  * @mvpi: max vpi count.
2108  * @avpi: available vpi count.
2109  *
2110  * Description:
2111  * If an integer pointer for an count is not null then the value for the
2112  * count is returned.
2113  *
2114  * Returns:
2115  * zero on error
2116  * one for success
2117  **/
2118 static int
2119 lpfc_get_hba_info(struct lpfc_hba *phba,
2120                   uint32_t *mxri, uint32_t *axri,
2121                   uint32_t *mrpi, uint32_t *arpi,
2122                   uint32_t *mvpi, uint32_t *avpi)
2123 {
2124         struct lpfc_mbx_read_config *rd_config;
2125         LPFC_MBOXQ_t *pmboxq;
2126         MAILBOX_t *pmb;
2127         int rc = 0;
2128         uint32_t max_vpi;
2129
2130         /*
2131          * prevent udev from issuing mailbox commands until the port is
2132          * configured.
2133          */
2134         if (phba->link_state < LPFC_LINK_DOWN ||
2135             !phba->mbox_mem_pool ||
2136             (phba->sli.sli_flag & LPFC_SLI_ACTIVE) == 0)
2137                 return 0;
2138
2139         if (phba->sli.sli_flag & LPFC_BLOCK_MGMT_IO)
2140                 return 0;
2141
2142         pmboxq = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL);
2143         if (!pmboxq)
2144                 return 0;
2145         memset(pmboxq, 0, sizeof (LPFC_MBOXQ_t));
2146
2147         pmb = &pmboxq->u.mb;
2148         pmb->mbxCommand = MBX_READ_CONFIG;
2149         pmb->mbxOwner = OWN_HOST;
2150         pmboxq->ctx_buf = NULL;
2151
2152         if (phba->pport->fc_flag & FC_OFFLINE_MODE)
2153                 rc = MBX_NOT_FINISHED;
2154         else
2155                 rc = lpfc_sli_issue_mbox_wait(phba, pmboxq, phba->fc_ratov * 2);
2156
2157         if (rc != MBX_SUCCESS) {
2158                 if (rc != MBX_TIMEOUT)
2159                         mempool_free(pmboxq, phba->mbox_mem_pool);
2160                 return 0;
2161         }
2162
2163         if (phba->sli_rev == LPFC_SLI_REV4) {
2164                 rd_config = &pmboxq->u.mqe.un.rd_config;
2165                 if (mrpi)
2166                         *mrpi = bf_get(lpfc_mbx_rd_conf_rpi_count, rd_config);
2167                 if (arpi)
2168                         *arpi = bf_get(lpfc_mbx_rd_conf_rpi_count, rd_config) -
2169                                         phba->sli4_hba.max_cfg_param.rpi_used;
2170                 if (mxri)
2171                         *mxri = bf_get(lpfc_mbx_rd_conf_xri_count, rd_config);
2172                 if (axri)
2173                         *axri = bf_get(lpfc_mbx_rd_conf_xri_count, rd_config) -
2174                                         phba->sli4_hba.max_cfg_param.xri_used;
2175
2176                 /* Account for differences with SLI-3.  Get vpi count from
2177                  * mailbox data and subtract one for max vpi value.
2178                  */
2179                 max_vpi = (bf_get(lpfc_mbx_rd_conf_vpi_count, rd_config) > 0) ?
2180                         (bf_get(lpfc_mbx_rd_conf_vpi_count, rd_config) - 1) : 0;
2181
2182                 /* Limit the max we support */
2183                 if (max_vpi > LPFC_MAX_VPI)
2184                         max_vpi = LPFC_MAX_VPI;
2185                 if (mvpi)
2186                         *mvpi = max_vpi;
2187                 if (avpi)
2188                         *avpi = max_vpi - phba->sli4_hba.max_cfg_param.vpi_used;
2189         } else {
2190                 if (mrpi)
2191                         *mrpi = pmb->un.varRdConfig.max_rpi;
2192                 if (arpi)
2193                         *arpi = pmb->un.varRdConfig.avail_rpi;
2194                 if (mxri)
2195                         *mxri = pmb->un.varRdConfig.max_xri;
2196                 if (axri)
2197                         *axri = pmb->un.varRdConfig.avail_xri;
2198                 if (mvpi)
2199                         *mvpi = pmb->un.varRdConfig.max_vpi;
2200                 if (avpi) {
2201                         /* avail_vpi is only valid if link is up and ready */
2202                         if (phba->link_state == LPFC_HBA_READY)
2203                                 *avpi = pmb->un.varRdConfig.avail_vpi;
2204                         else
2205                                 *avpi = pmb->un.varRdConfig.max_vpi;
2206                 }
2207         }
2208
2209         mempool_free(pmboxq, phba->mbox_mem_pool);
2210         return 1;
2211 }
2212
2213 /**
2214  * lpfc_max_rpi_show - Return maximum rpi
2215  * @dev: class device that is converted into a Scsi_host.
2216  * @attr: device attribute, not used.
2217  * @buf: on return contains the maximum rpi count in decimal or "Unknown".
2218  *
2219  * Description:
2220  * Calls lpfc_get_hba_info() asking for just the mrpi count.
2221  * If lpfc_get_hba_info() returns zero (failure) the buffer text is set
2222  * to "Unknown" and the buffer length is returned, therefore the caller
2223  * must check for "Unknown" in the buffer to detect a failure.
2224  *
2225  * Returns: size of formatted string.
2226  **/
2227 static ssize_t
2228 lpfc_max_rpi_show(struct device *dev, struct device_attribute *attr,
2229                   char *buf)
2230 {
2231         struct Scsi_Host  *shost = class_to_shost(dev);
2232         struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata;
2233         struct lpfc_hba   *phba = vport->phba;
2234         uint32_t cnt;
2235
2236         if (lpfc_get_hba_info(phba, NULL, NULL, &cnt, NULL, NULL, NULL))
2237                 return scnprintf(buf, PAGE_SIZE, "%d\n", cnt);
2238         return scnprintf(buf, PAGE_SIZE, "Unknown\n");
2239 }
2240
2241 /**
2242  * lpfc_used_rpi_show - Return maximum rpi minus available rpi
2243  * @dev: class device that is converted into a Scsi_host.
2244  * @attr: device attribute, not used.
2245  * @buf: containing the used rpi count in decimal or "Unknown".
2246  *
2247  * Description:
2248  * Calls lpfc_get_hba_info() asking for just the mrpi and arpi counts.
2249  * If lpfc_get_hba_info() returns zero (failure) the buffer text is set
2250  * to "Unknown" and the buffer length is returned, therefore the caller
2251  * must check for "Unknown" in the buffer to detect a failure.
2252  *
2253  * Returns: size of formatted string.
2254  **/
2255 static ssize_t
2256 lpfc_used_rpi_show(struct device *dev, struct device_attribute *attr,
2257                    char *buf)
2258 {
2259         struct Scsi_Host  *shost = class_to_shost(dev);
2260         struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata;
2261         struct lpfc_hba   *phba = vport->phba;
2262         uint32_t cnt, acnt;
2263
2264         if (lpfc_get_hba_info(phba, NULL, NULL, &cnt, &acnt, NULL, NULL))
2265                 return scnprintf(buf, PAGE_SIZE, "%d\n", (cnt - acnt));
2266         return scnprintf(buf, PAGE_SIZE, "Unknown\n");
2267 }
2268
2269 /**
2270  * lpfc_max_xri_show - Return maximum xri
2271  * @dev: class device that is converted into a Scsi_host.
2272  * @attr: device attribute, not used.
2273  * @buf: on return contains the maximum xri count in decimal or "Unknown".
2274  *
2275  * Description:
2276  * Calls lpfc_get_hba_info() asking for just the mrpi count.
2277  * If lpfc_get_hba_info() returns zero (failure) the buffer text is set
2278  * to "Unknown" and the buffer length is returned, therefore the caller
2279  * must check for "Unknown" in the buffer to detect a failure.
2280  *
2281  * Returns: size of formatted string.
2282  **/
2283 static ssize_t
2284 lpfc_max_xri_show(struct device *dev, struct device_attribute *attr,
2285                   char *buf)
2286 {
2287         struct Scsi_Host  *shost = class_to_shost(dev);
2288         struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata;
2289         struct lpfc_hba   *phba = vport->phba;
2290         uint32_t cnt;
2291
2292         if (lpfc_get_hba_info(phba, &cnt, NULL, NULL, NULL, NULL, NULL))
2293                 return scnprintf(buf, PAGE_SIZE, "%d\n", cnt);
2294         return scnprintf(buf, PAGE_SIZE, "Unknown\n");
2295 }
2296
2297 /**
2298  * lpfc_used_xri_show - Return maximum xpi minus the available xpi
2299  * @dev: class device that is converted into a Scsi_host.
2300  * @attr: device attribute, not used.
2301  * @buf: on return contains the used xri count in decimal or "Unknown".
2302  *
2303  * Description:
2304  * Calls lpfc_get_hba_info() asking for just the mxri and axri counts.
2305  * If lpfc_get_hba_info() returns zero (failure) the buffer text is set
2306  * to "Unknown" and the buffer length is returned, therefore the caller
2307  * must check for "Unknown" in the buffer to detect a failure.
2308  *
2309  * Returns: size of formatted string.
2310  **/
2311 static ssize_t
2312 lpfc_used_xri_show(struct device *dev, struct device_attribute *attr,
2313                    char *buf)
2314 {
2315         struct Scsi_Host  *shost = class_to_shost(dev);
2316         struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata;
2317         struct lpfc_hba   *phba = vport->phba;
2318         uint32_t cnt, acnt;
2319
2320         if (lpfc_get_hba_info(phba, &cnt, &acnt, NULL, NULL, NULL, NULL))
2321                 return scnprintf(buf, PAGE_SIZE, "%d\n", (cnt - acnt));
2322         return scnprintf(buf, PAGE_SIZE, "Unknown\n");
2323 }
2324
2325 /**
2326  * lpfc_max_vpi_show - Return maximum vpi
2327  * @dev: class device that is converted into a Scsi_host.
2328  * @attr: device attribute, not used.
2329  * @buf: on return contains the maximum vpi count in decimal or "Unknown".
2330  *
2331  * Description:
2332  * Calls lpfc_get_hba_info() asking for just the mvpi count.
2333  * If lpfc_get_hba_info() returns zero (failure) the buffer text is set
2334  * to "Unknown" and the buffer length is returned, therefore the caller
2335  * must check for "Unknown" in the buffer to detect a failure.
2336  *
2337  * Returns: size of formatted string.
2338  **/
2339 static ssize_t
2340 lpfc_max_vpi_show(struct device *dev, struct device_attribute *attr,
2341                   char *buf)
2342 {
2343         struct Scsi_Host  *shost = class_to_shost(dev);
2344         struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata;
2345         struct lpfc_hba   *phba = vport->phba;
2346         uint32_t cnt;
2347
2348         if (lpfc_get_hba_info(phba, NULL, NULL, NULL, NULL, &cnt, NULL))
2349                 return scnprintf(buf, PAGE_SIZE, "%d\n", cnt);
2350         return scnprintf(buf, PAGE_SIZE, "Unknown\n");
2351 }
2352
2353 /**
2354  * lpfc_used_vpi_show - Return maximum vpi minus the available vpi
2355  * @dev: class device that is converted into a Scsi_host.
2356  * @attr: device attribute, not used.
2357  * @buf: on return contains the used vpi count in decimal or "Unknown".
2358  *
2359  * Description:
2360  * Calls lpfc_get_hba_info() asking for just the mvpi and avpi counts.
2361  * If lpfc_get_hba_info() returns zero (failure) the buffer text is set
2362  * to "Unknown" and the buffer length is returned, therefore the caller
2363  * must check for "Unknown" in the buffer to detect a failure.
2364  *
2365  * Returns: size of formatted string.
2366  **/
2367 static ssize_t
2368 lpfc_used_vpi_show(struct device *dev, struct device_attribute *attr,
2369                    char *buf)
2370 {
2371         struct Scsi_Host  *shost = class_to_shost(dev);
2372         struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata;
2373         struct lpfc_hba   *phba = vport->phba;
2374         uint32_t cnt, acnt;
2375
2376         if (lpfc_get_hba_info(phba, NULL, NULL, NULL, NULL, &cnt, &acnt))
2377                 return scnprintf(buf, PAGE_SIZE, "%d\n", (cnt - acnt));
2378         return scnprintf(buf, PAGE_SIZE, "Unknown\n");
2379 }
2380
2381 /**
2382  * lpfc_npiv_info_show - Return text about NPIV support for the adapter
2383  * @dev: class device that is converted into a Scsi_host.
2384  * @attr: device attribute, not used.
2385  * @buf: text that must be interpreted to determine if npiv is supported.
2386  *
2387  * Description:
2388  * Buffer will contain text indicating npiv is not suppoerted on the port,
2389  * the port is an NPIV physical port, or it is an npiv virtual port with
2390  * the id of the vport.
2391  *
2392  * Returns: size of formatted string.
2393  **/
2394 static ssize_t
2395 lpfc_npiv_info_show(struct device *dev, struct device_attribute *attr,
2396                     char *buf)
2397 {
2398         struct Scsi_Host  *shost = class_to_shost(dev);
2399         struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata;
2400         struct lpfc_hba   *phba = vport->phba;
2401
2402         if (!(phba->max_vpi))
2403                 return scnprintf(buf, PAGE_SIZE, "NPIV Not Supported\n");
2404         if (vport->port_type == LPFC_PHYSICAL_PORT)
2405                 return scnprintf(buf, PAGE_SIZE, "NPIV Physical\n");
2406         return scnprintf(buf, PAGE_SIZE, "NPIV Virtual (VPI %d)\n", vport->vpi);
2407 }
2408
2409 /**
2410  * lpfc_poll_show - Return text about poll support for the adapter
2411  * @dev: class device that is converted into a Scsi_host.
2412  * @attr: device attribute, not used.
2413  * @buf: on return contains the cfg_poll in hex.
2414  *
2415  * Notes:
2416  * cfg_poll should be a lpfc_polling_flags type.
2417  *
2418  * Returns: size of formatted string.
2419  **/
2420 static ssize_t
2421 lpfc_poll_show(struct device *dev, struct device_attribute *attr,
2422                char *buf)
2423 {
2424         struct Scsi_Host  *shost = class_to_shost(dev);
2425         struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata;
2426         struct lpfc_hba   *phba = vport->phba;
2427
2428         return scnprintf(buf, PAGE_SIZE, "%#x\n", phba->cfg_poll);
2429 }
2430
2431 /**
2432  * lpfc_poll_store - Set the value of cfg_poll for the adapter
2433  * @dev: class device that is converted into a Scsi_host.
2434  * @attr: device attribute, not used.
2435  * @buf: one or more lpfc_polling_flags values.
2436  * @count: not used.
2437  *
2438  * Notes:
2439  * buf contents converted to integer and checked for a valid value.
2440  *
2441  * Returns:
2442  * -EINVAL if the buffer connot be converted or is out of range
2443  * length of the buf on success
2444  **/
2445 static ssize_t
2446 lpfc_poll_store(struct device *dev, struct device_attribute *attr,
2447                 const char *buf, size_t count)
2448 {
2449         struct Scsi_Host  *shost = class_to_shost(dev);
2450         struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata;
2451         struct lpfc_hba   *phba = vport->phba;
2452         uint32_t creg_val;
2453         uint32_t old_val;
2454         int val=0;
2455
2456         if (!isdigit(buf[0]))
2457                 return -EINVAL;
2458
2459         if (sscanf(buf, "%i", &val) != 1)
2460                 return -EINVAL;
2461
2462         if ((val & 0x3) != val)
2463                 return -EINVAL;
2464
2465         if (phba->sli_rev == LPFC_SLI_REV4)
2466                 val = 0;
2467
2468         lpfc_printf_vlog(vport, KERN_ERR, LOG_INIT,
2469                 "3051 lpfc_poll changed from %d to %d\n",
2470                 phba->cfg_poll, val);
2471
2472         spin_lock_irq(&phba->hbalock);
2473
2474         old_val = phba->cfg_poll;
2475
2476         if (val & ENABLE_FCP_RING_POLLING) {
2477                 if ((val & DISABLE_FCP_RING_INT) &&
2478                     !(old_val & DISABLE_FCP_RING_INT)) {
2479                         if (lpfc_readl(phba->HCregaddr, &creg_val)) {
2480                                 spin_unlock_irq(&phba->hbalock);
2481                                 return -EINVAL;
2482                         }
2483                         creg_val &= ~(HC_R0INT_ENA << LPFC_FCP_RING);
2484                         writel(creg_val, phba->HCregaddr);
2485                         readl(phba->HCregaddr); /* flush */
2486
2487                         lpfc_poll_start_timer(phba);
2488                 }
2489         } else if (val != 0x0) {
2490                 spin_unlock_irq(&phba->hbalock);
2491                 return -EINVAL;
2492         }
2493
2494         if (!(val & DISABLE_FCP_RING_INT) &&
2495             (old_val & DISABLE_FCP_RING_INT))
2496         {
2497                 spin_unlock_irq(&phba->hbalock);
2498                 del_timer(&phba->fcp_poll_timer);
2499                 spin_lock_irq(&phba->hbalock);
2500                 if (lpfc_readl(phba->HCregaddr, &creg_val)) {
2501                         spin_unlock_irq(&phba->hbalock);
2502                         return -EINVAL;
2503                 }
2504                 creg_val |= (HC_R0INT_ENA << LPFC_FCP_RING);
2505                 writel(creg_val, phba->HCregaddr);
2506                 readl(phba->HCregaddr); /* flush */
2507         }
2508
2509         phba->cfg_poll = val;
2510
2511         spin_unlock_irq(&phba->hbalock);
2512
2513         return strlen(buf);
2514 }
2515
2516 /**
2517  * lpfc_sriov_hw_max_virtfn_show - Return maximum number of virtual functions
2518  * @dev: class converted to a Scsi_host structure.
2519  * @attr: device attribute, not used.
2520  * @buf: on return contains the formatted support level.
2521  *
2522  * Description:
2523  * Returns the maximum number of virtual functions a physical function can
2524  * support, 0 will be returned if called on virtual function.
2525  *
2526  * Returns: size of formatted string.
2527  **/
2528 static ssize_t
2529 lpfc_sriov_hw_max_virtfn_show(struct device *dev,
2530                               struct device_attribute *attr,
2531                               char *buf)
2532 {
2533         struct Scsi_Host *shost = class_to_shost(dev);
2534         struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata;
2535         struct lpfc_hba *phba = vport->phba;
2536         uint16_t max_nr_virtfn;
2537
2538         max_nr_virtfn = lpfc_sli_sriov_nr_virtfn_get(phba);
2539         return scnprintf(buf, PAGE_SIZE, "%d\n", max_nr_virtfn);
2540 }
2541
2542 /**
2543  * lpfc_enable_bbcr_set: Sets an attribute value.
2544  * @phba: pointer to the adapter structure.
2545  * @val: integer attribute value.
2546  *
2547  * Description:
2548  * Validates the min and max values then sets the
2549  * adapter config field if in the valid range. prints error message
2550  * and does not set the parameter if invalid.
2551  *
2552  * Returns:
2553  * zero on success
2554  * -EINVAL if val is invalid
2555  */
2556 static ssize_t
2557 lpfc_enable_bbcr_set(struct lpfc_hba *phba, uint val)
2558 {
2559         if (lpfc_rangecheck(val, 0, 1) && phba->sli_rev == LPFC_SLI_REV4) {
2560                 lpfc_printf_log(phba, KERN_ERR, LOG_INIT,
2561                                 "3068 lpfc_enable_bbcr changed from %d to "
2562                                 "%d\n", phba->cfg_enable_bbcr, val);
2563                 phba->cfg_enable_bbcr = val;
2564                 return 0;
2565         }
2566         lpfc_printf_log(phba, KERN_ERR, LOG_INIT,
2567                         "0451 lpfc_enable_bbcr cannot set to %d, range is 0, "
2568                         "1\n", val);
2569         return -EINVAL;
2570 }
2571
2572 /*
2573  * lpfc_param_show - Return a cfg attribute value in decimal
2574  *
2575  * Description:
2576  * Macro that given an attr e.g. hba_queue_depth expands
2577  * into a function with the name lpfc_hba_queue_depth_show.
2578  *
2579  * lpfc_##attr##_show: Return the decimal value of an adapters cfg_xxx field.
2580  * @dev: class device that is converted into a Scsi_host.
2581  * @attr: device attribute, not used.
2582  * @buf: on return contains the attribute value in decimal.
2583  *
2584  * Returns: size of formatted string.
2585  **/
2586 #define lpfc_param_show(attr)   \
2587 static ssize_t \
2588 lpfc_##attr##_show(struct device *dev, struct device_attribute *attr, \
2589                    char *buf) \
2590 { \
2591         struct Scsi_Host  *shost = class_to_shost(dev);\
2592         struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata;\
2593         struct lpfc_hba   *phba = vport->phba;\
2594         return scnprintf(buf, PAGE_SIZE, "%d\n",\
2595                         phba->cfg_##attr);\
2596 }
2597
2598 /*
2599  * lpfc_param_hex_show - Return a cfg attribute value in hex
2600  *
2601  * Description:
2602  * Macro that given an attr e.g. hba_queue_depth expands
2603  * into a function with the name lpfc_hba_queue_depth_show
2604  *
2605  * lpfc_##attr##_show: Return the hex value of an adapters cfg_xxx field.
2606  * @dev: class device that is converted into a Scsi_host.
2607  * @attr: device attribute, not used.
2608  * @buf: on return contains the attribute value in hexadecimal.
2609  *
2610  * Returns: size of formatted string.
2611  **/
2612 #define lpfc_param_hex_show(attr)       \
2613 static ssize_t \
2614 lpfc_##attr##_show(struct device *dev, struct device_attribute *attr, \
2615                    char *buf) \
2616 { \
2617         struct Scsi_Host  *shost = class_to_shost(dev);\
2618         struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata;\
2619         struct lpfc_hba   *phba = vport->phba;\
2620         uint val = 0;\
2621         val = phba->cfg_##attr;\
2622         return scnprintf(buf, PAGE_SIZE, "%#x\n",\
2623                         phba->cfg_##attr);\
2624 }
2625
2626 /*
2627  * lpfc_param_init - Initializes a cfg attribute
2628  *
2629  * Description:
2630  * Macro that given an attr e.g. hba_queue_depth expands
2631  * into a function with the name lpfc_hba_queue_depth_init. The macro also
2632  * takes a default argument, a minimum and maximum argument.
2633  *
2634  * lpfc_##attr##_init: Initializes an attribute.
2635  * @phba: pointer to the adapter structure.
2636  * @val: integer attribute value.
2637  *
2638  * Validates the min and max values then sets the adapter config field
2639  * accordingly, or uses the default if out of range and prints an error message.
2640  *
2641  * Returns:
2642  * zero on success
2643  * -EINVAL if default used
2644  **/
2645 #define lpfc_param_init(attr, default, minval, maxval)  \
2646 static int \
2647 lpfc_##attr##_init(struct lpfc_hba *phba, uint val) \
2648 { \
2649         if (lpfc_rangecheck(val, minval, maxval)) {\
2650                 phba->cfg_##attr = val;\
2651                 return 0;\
2652         }\
2653         lpfc_printf_log(phba, KERN_ERR, LOG_INIT, \
2654                         "0449 lpfc_"#attr" attribute cannot be set to %d, "\
2655                         "allowed range is ["#minval", "#maxval"]\n", val); \
2656         phba->cfg_##attr = default;\
2657         return -EINVAL;\
2658 }
2659
2660 /*
2661  * lpfc_param_set - Set a cfg attribute value
2662  *
2663  * Description:
2664  * Macro that given an attr e.g. hba_queue_depth expands
2665  * into a function with the name lpfc_hba_queue_depth_set
2666  *
2667  * lpfc_##attr##_set: Sets an attribute value.
2668  * @phba: pointer to the adapter structure.
2669  * @val: integer attribute value.
2670  *
2671  * Description:
2672  * Validates the min and max values then sets the
2673  * adapter config field if in the valid range. prints error message
2674  * and does not set the parameter if invalid.
2675  *
2676  * Returns:
2677  * zero on success
2678  * -EINVAL if val is invalid
2679  **/
2680 #define lpfc_param_set(attr, default, minval, maxval)   \
2681 static int \
2682 lpfc_##attr##_set(struct lpfc_hba *phba, uint val) \
2683 { \
2684         if (lpfc_rangecheck(val, minval, maxval)) {\
2685                 lpfc_printf_log(phba, KERN_ERR, LOG_INIT, \
2686                         "3052 lpfc_" #attr " changed from %d to %d\n", \
2687                         phba->cfg_##attr, val); \
2688                 phba->cfg_##attr = val;\
2689                 return 0;\
2690         }\
2691         lpfc_printf_log(phba, KERN_ERR, LOG_INIT, \
2692                         "0450 lpfc_"#attr" attribute cannot be set to %d, "\
2693                         "allowed range is ["#minval", "#maxval"]\n", val); \
2694         return -EINVAL;\
2695 }
2696
2697 /*
2698  * lpfc_param_store - Set a vport attribute value
2699  *
2700  * Description:
2701  * Macro that given an attr e.g. hba_queue_depth expands
2702  * into a function with the name lpfc_hba_queue_depth_store.
2703  *
2704  * lpfc_##attr##_store: Set an sttribute value.
2705  * @dev: class device that is converted into a Scsi_host.
2706  * @attr: device attribute, not used.
2707  * @buf: contains the attribute value in ascii.
2708  * @count: not used.
2709  *
2710  * Description:
2711  * Convert the ascii text number to an integer, then
2712  * use the lpfc_##attr##_set function to set the value.
2713  *
2714  * Returns:
2715  * -EINVAL if val is invalid or lpfc_##attr##_set() fails
2716  * length of buffer upon success.
2717  **/
2718 #define lpfc_param_store(attr)  \
2719 static ssize_t \
2720 lpfc_##attr##_store(struct device *dev, struct device_attribute *attr, \
2721                     const char *buf, size_t count) \
2722 { \
2723         struct Scsi_Host  *shost = class_to_shost(dev);\
2724         struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata;\
2725         struct lpfc_hba   *phba = vport->phba;\
2726         uint val = 0;\
2727         if (!isdigit(buf[0]))\
2728                 return -EINVAL;\
2729         if (sscanf(buf, "%i", &val) != 1)\
2730                 return -EINVAL;\
2731         if (lpfc_##attr##_set(phba, val) == 0) \
2732                 return strlen(buf);\
2733         else \
2734                 return -EINVAL;\
2735 }
2736
2737 /*
2738  * lpfc_vport_param_show - Return decimal formatted cfg attribute value
2739  *
2740  * Description:
2741  * Macro that given an attr e.g. hba_queue_depth expands
2742  * into a function with the name lpfc_hba_queue_depth_show
2743  *
2744  * lpfc_##attr##_show: prints the attribute value in decimal.
2745  * @dev: class device that is converted into a Scsi_host.
2746  * @attr: device attribute, not used.
2747  * @buf: on return contains the attribute value in decimal.
2748  *
2749  * Returns: length of formatted string.
2750  **/
2751 #define lpfc_vport_param_show(attr)     \
2752 static ssize_t \
2753 lpfc_##attr##_show(struct device *dev, struct device_attribute *attr, \
2754                    char *buf) \
2755 { \
2756         struct Scsi_Host  *shost = class_to_shost(dev);\
2757         struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata;\
2758         return scnprintf(buf, PAGE_SIZE, "%d\n", vport->cfg_##attr);\
2759 }
2760
2761 /*
2762  * lpfc_vport_param_hex_show - Return hex formatted attribute value
2763  *
2764  * Description:
2765  * Macro that given an attr e.g.
2766  * hba_queue_depth expands into a function with the name
2767  * lpfc_hba_queue_depth_show
2768  *
2769  * lpfc_##attr##_show: prints the attribute value in hexadecimal.
2770  * @dev: class device that is converted into a Scsi_host.
2771  * @attr: device attribute, not used.
2772  * @buf: on return contains the attribute value in hexadecimal.
2773  *
2774  * Returns: length of formatted string.
2775  **/
2776 #define lpfc_vport_param_hex_show(attr) \
2777 static ssize_t \
2778 lpfc_##attr##_show(struct device *dev, struct device_attribute *attr, \
2779                    char *buf) \
2780 { \
2781         struct Scsi_Host  *shost = class_to_shost(dev);\
2782         struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata;\
2783         return scnprintf(buf, PAGE_SIZE, "%#x\n", vport->cfg_##attr);\
2784 }
2785
2786 /*
2787  * lpfc_vport_param_init - Initialize a vport cfg attribute
2788  *
2789  * Description:
2790  * Macro that given an attr e.g. hba_queue_depth expands
2791  * into a function with the name lpfc_hba_queue_depth_init. The macro also
2792  * takes a default argument, a minimum and maximum argument.
2793  *
2794  * lpfc_##attr##_init: validates the min and max values then sets the
2795  * adapter config field accordingly, or uses the default if out of range
2796  * and prints an error message.
2797  * @phba: pointer to the adapter structure.
2798  * @val: integer attribute value.
2799  *
2800  * Returns:
2801  * zero on success
2802  * -EINVAL if default used
2803  **/
2804 #define lpfc_vport_param_init(attr, default, minval, maxval)    \
2805 static int \
2806 lpfc_##attr##_init(struct lpfc_vport *vport, uint val) \
2807 { \
2808         if (lpfc_rangecheck(val, minval, maxval)) {\
2809                 vport->cfg_##attr = val;\
2810                 return 0;\
2811         }\
2812         lpfc_printf_vlog(vport, KERN_ERR, LOG_INIT, \
2813                          "0423 lpfc_"#attr" attribute cannot be set to %d, "\
2814                          "allowed range is ["#minval", "#maxval"]\n", val); \
2815         vport->cfg_##attr = default;\
2816         return -EINVAL;\
2817 }
2818
2819 /*
2820  * lpfc_vport_param_set - Set a vport cfg attribute
2821  *
2822  * Description:
2823  * Macro that given an attr e.g. hba_queue_depth expands
2824  * into a function with the name lpfc_hba_queue_depth_set
2825  *
2826  * lpfc_##attr##_set: validates the min and max values then sets the
2827  * adapter config field if in the valid range. prints error message
2828  * and does not set the parameter if invalid.
2829  * @phba: pointer to the adapter structure.
2830  * @val:        integer attribute value.
2831  *
2832  * Returns:
2833  * zero on success
2834  * -EINVAL if val is invalid
2835  **/
2836 #define lpfc_vport_param_set(attr, default, minval, maxval)     \
2837 static int \
2838 lpfc_##attr##_set(struct lpfc_vport *vport, uint val) \
2839 { \
2840         if (lpfc_rangecheck(val, minval, maxval)) {\
2841                 lpfc_printf_vlog(vport, KERN_ERR, LOG_INIT, \
2842                         "3053 lpfc_" #attr \
2843                         " changed from %d (x%x) to %d (x%x)\n", \
2844                         vport->cfg_##attr, vport->cfg_##attr, \
2845                         val, val); \
2846                 vport->cfg_##attr = val;\
2847                 return 0;\
2848         }\
2849         lpfc_printf_vlog(vport, KERN_ERR, LOG_INIT, \
2850                          "0424 lpfc_"#attr" attribute cannot be set to %d, "\
2851                          "allowed range is ["#minval", "#maxval"]\n", val); \
2852         return -EINVAL;\
2853 }
2854
2855 /*
2856  * lpfc_vport_param_store - Set a vport attribute
2857  *
2858  * Description:
2859  * Macro that given an attr e.g. hba_queue_depth
2860  * expands into a function with the name lpfc_hba_queue_depth_store
2861  *
2862  * lpfc_##attr##_store: convert the ascii text number to an integer, then
2863  * use the lpfc_##attr##_set function to set the value.
2864  * @cdev: class device that is converted into a Scsi_host.
2865  * @buf:        contains the attribute value in decimal.
2866  * @count: not used.
2867  *
2868  * Returns:
2869  * -EINVAL if val is invalid or lpfc_##attr##_set() fails
2870  * length of buffer upon success.
2871  **/
2872 #define lpfc_vport_param_store(attr)    \
2873 static ssize_t \
2874 lpfc_##attr##_store(struct device *dev, struct device_attribute *attr, \
2875                     const char *buf, size_t count) \
2876 { \
2877         struct Scsi_Host  *shost = class_to_shost(dev);\
2878         struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata;\
2879         uint val = 0;\
2880         if (!isdigit(buf[0]))\
2881                 return -EINVAL;\
2882         if (sscanf(buf, "%i", &val) != 1)\
2883                 return -EINVAL;\
2884         if (lpfc_##attr##_set(vport, val) == 0) \
2885                 return strlen(buf);\
2886         else \
2887                 return -EINVAL;\
2888 }
2889
2890
2891 static DEVICE_ATTR(nvme_info, 0444, lpfc_nvme_info_show, NULL);
2892 static DEVICE_ATTR(scsi_stat, 0444, lpfc_scsi_stat_show, NULL);
2893 static DEVICE_ATTR(bg_info, S_IRUGO, lpfc_bg_info_show, NULL);
2894 static DEVICE_ATTR(bg_guard_err, S_IRUGO, lpfc_bg_guard_err_show, NULL);
2895 static DEVICE_ATTR(bg_apptag_err, S_IRUGO, lpfc_bg_apptag_err_show, NULL);
2896 static DEVICE_ATTR(bg_reftag_err, S_IRUGO, lpfc_bg_reftag_err_show, NULL);
2897 static DEVICE_ATTR(info, S_IRUGO, lpfc_info_show, NULL);
2898 static DEVICE_ATTR(serialnum, S_IRUGO, lpfc_serialnum_show, NULL);
2899 static DEVICE_ATTR(modeldesc, S_IRUGO, lpfc_modeldesc_show, NULL);
2900 static DEVICE_ATTR(modelname, S_IRUGO, lpfc_modelname_show, NULL);
2901 static DEVICE_ATTR(programtype, S_IRUGO, lpfc_programtype_show, NULL);
2902 static DEVICE_ATTR(portnum, S_IRUGO, lpfc_vportnum_show, NULL);
2903 static DEVICE_ATTR(fwrev, S_IRUGO, lpfc_fwrev_show, NULL);
2904 static DEVICE_ATTR(hdw, S_IRUGO, lpfc_hdw_show, NULL);
2905 static DEVICE_ATTR(link_state, S_IRUGO | S_IWUSR, lpfc_link_state_show,
2906                 lpfc_link_state_store);
2907 static DEVICE_ATTR(option_rom_version, S_IRUGO,
2908                    lpfc_option_rom_version_show, NULL);
2909 static DEVICE_ATTR(num_discovered_ports, S_IRUGO,
2910                    lpfc_num_discovered_ports_show, NULL);
2911 static DEVICE_ATTR(nport_evt_cnt, S_IRUGO, lpfc_nport_evt_cnt_show, NULL);
2912 static DEVICE_ATTR_RO(lpfc_drvr_version);
2913 static DEVICE_ATTR_RO(lpfc_enable_fip);
2914 static DEVICE_ATTR(board_mode, S_IRUGO | S_IWUSR,
2915                    lpfc_board_mode_show, lpfc_board_mode_store);
2916 static DEVICE_ATTR_RO(lpfc_xcvr_data);
2917 static DEVICE_ATTR(issue_reset, S_IWUSR, NULL, lpfc_issue_reset);
2918 static DEVICE_ATTR(max_vpi, S_IRUGO, lpfc_max_vpi_show, NULL);
2919 static DEVICE_ATTR(used_vpi, S_IRUGO, lpfc_used_vpi_show, NULL);
2920 static DEVICE_ATTR(max_rpi, S_IRUGO, lpfc_max_rpi_show, NULL);
2921 static DEVICE_ATTR(used_rpi, S_IRUGO, lpfc_used_rpi_show, NULL);
2922 static DEVICE_ATTR(max_xri, S_IRUGO, lpfc_max_xri_show, NULL);
2923 static DEVICE_ATTR(used_xri, S_IRUGO, lpfc_used_xri_show, NULL);
2924 static DEVICE_ATTR(npiv_info, S_IRUGO, lpfc_npiv_info_show, NULL);
2925 static DEVICE_ATTR_RO(lpfc_temp_sensor);
2926 static DEVICE_ATTR_RO(lpfc_sriov_hw_max_virtfn);
2927 static DEVICE_ATTR(protocol, S_IRUGO, lpfc_sli4_protocol_show, NULL);
2928 static DEVICE_ATTR(lpfc_xlane_supported, S_IRUGO, lpfc_oas_supported_show,
2929                    NULL);
2930 static DEVICE_ATTR(cmf_info, 0444, lpfc_cmf_info_show, NULL);
2931
2932 #define WWN_SZ 8
2933 /**
2934  * lpfc_wwn_set - Convert string to the 8 byte WWN value.
2935  * @buf: WWN string.
2936  * @cnt: Length of string.
2937  * @wwn: Array to receive converted wwn value.
2938  *
2939  * Returns:
2940  * -EINVAL if the buffer does not contain a valid wwn
2941  * 0 success
2942  **/
2943 static size_t
2944 lpfc_wwn_set(const char *buf, size_t cnt, char wwn[])
2945 {
2946         unsigned int i, j;
2947
2948         /* Count may include a LF at end of string */
2949         if (buf[cnt-1] == '\n')
2950                 cnt--;
2951
2952         if ((cnt < 16) || (cnt > 18) || ((cnt == 17) && (*buf++ != 'x')) ||
2953             ((cnt == 18) && ((*buf++ != '0') || (*buf++ != 'x'))))
2954                 return -EINVAL;
2955
2956         memset(wwn, 0, WWN_SZ);
2957
2958         /* Validate and store the new name */
2959         for (i = 0, j = 0; i < 16; i++) {
2960                 if ((*buf >= 'a') && (*buf <= 'f'))
2961                         j = ((j << 4) | ((*buf++ - 'a') + 10));
2962                 else if ((*buf >= 'A') && (*buf <= 'F'))
2963                         j = ((j << 4) | ((*buf++ - 'A') + 10));
2964                 else if ((*buf >= '0') && (*buf <= '9'))
2965                         j = ((j << 4) | (*buf++ - '0'));
2966                 else
2967                         return -EINVAL;
2968                 if (i % 2) {
2969                         wwn[i/2] = j & 0xff;
2970                         j = 0;
2971                 }
2972         }
2973         return 0;
2974 }
2975
2976
2977 /**
2978  * lpfc_oas_tgt_show - Return wwpn of target whose luns maybe enabled for
2979  *                    Optimized Access Storage (OAS) operations.
2980  * @dev: class device that is converted into a Scsi_host.
2981  * @attr: device attribute, not used.
2982  * @buf: buffer for passing information.
2983  *
2984  * Returns:
2985  * value of count
2986  **/
2987 static ssize_t
2988 lpfc_oas_tgt_show(struct device *dev, struct device_attribute *attr,
2989                   char *buf)
2990 {
2991         struct Scsi_Host *shost = class_to_shost(dev);
2992         struct lpfc_hba *phba = ((struct lpfc_vport *)shost->hostdata)->phba;
2993
2994         return scnprintf(buf, PAGE_SIZE, "0x%llx\n",
2995                         wwn_to_u64(phba->cfg_oas_tgt_wwpn));
2996 }
2997
2998 /**
2999  * lpfc_oas_tgt_store - Store wwpn of target whose luns maybe enabled for
3000  *                    Optimized Access Storage (OAS) operations.
3001  * @dev: class device that is converted into a Scsi_host.
3002  * @attr: device attribute, not used.
3003  * @buf: buffer for passing information.
3004  * @count: Size of the data buffer.
3005  *
3006  * Returns:
3007  * -EINVAL count is invalid, invalid wwpn byte invalid
3008  * -EPERM oas is not supported by hba
3009  * value of count on success
3010  **/
3011 static ssize_t
3012 lpfc_oas_tgt_store(struct device *dev, struct device_attribute *attr,
3013                    const char *buf, size_t count)
3014 {
3015         struct Scsi_Host *shost = class_to_shost(dev);
3016         struct lpfc_hba *phba = ((struct lpfc_vport *)shost->hostdata)->phba;
3017         unsigned int cnt = count;
3018         uint8_t wwpn[WWN_SZ];
3019         int rc;
3020
3021         if (!phba->cfg_fof)
3022                 return -EPERM;
3023
3024         /* count may include a LF at end of string */
3025         if (buf[cnt-1] == '\n')
3026                 cnt--;
3027
3028         rc = lpfc_wwn_set(buf, cnt, wwpn);
3029         if (rc)
3030                 return rc;
3031
3032         memcpy(phba->cfg_oas_tgt_wwpn, wwpn, (8 * sizeof(uint8_t)));
3033         memcpy(phba->sli4_hba.oas_next_tgt_wwpn, wwpn, (8 * sizeof(uint8_t)));
3034         if (wwn_to_u64(wwpn) == 0)
3035                 phba->cfg_oas_flags |= OAS_FIND_ANY_TARGET;
3036         else
3037                 phba->cfg_oas_flags &= ~OAS_FIND_ANY_TARGET;
3038         phba->cfg_oas_flags &= ~OAS_LUN_VALID;
3039         phba->sli4_hba.oas_next_lun = FIND_FIRST_OAS_LUN;
3040         return count;
3041 }
3042 static DEVICE_ATTR(lpfc_xlane_tgt, S_IRUGO | S_IWUSR,
3043                    lpfc_oas_tgt_show, lpfc_oas_tgt_store);
3044
3045 /**
3046  * lpfc_oas_priority_show - Return wwpn of target whose luns maybe enabled for
3047  *                    Optimized Access Storage (OAS) operations.
3048  * @dev: class device that is converted into a Scsi_host.
3049  * @attr: device attribute, not used.
3050  * @buf: buffer for passing information.
3051  *
3052  * Returns:
3053  * value of count
3054  **/
3055 static ssize_t
3056 lpfc_oas_priority_show(struct device *dev, struct device_attribute *attr,
3057                        char *buf)
3058 {
3059         struct Scsi_Host *shost = class_to_shost(dev);
3060         struct lpfc_hba *phba = ((struct lpfc_vport *)shost->hostdata)->phba;
3061
3062         return scnprintf(buf, PAGE_SIZE, "%d\n", phba->cfg_oas_priority);
3063 }
3064
3065 /**
3066  * lpfc_oas_priority_store - Store wwpn of target whose luns maybe enabled for
3067  *                    Optimized Access Storage (OAS) operations.
3068  * @dev: class device that is converted into a Scsi_host.
3069  * @attr: device attribute, not used.
3070  * @buf: buffer for passing information.
3071  * @count: Size of the data buffer.
3072  *
3073  * Returns:
3074  * -EINVAL count is invalid, invalid wwpn byte invalid
3075  * -EPERM oas is not supported by hba
3076  * value of count on success
3077  **/
3078 static ssize_t
3079 lpfc_oas_priority_store(struct device *dev, struct device_attribute *attr,
3080                         const char *buf, size_t count)
3081 {
3082         struct Scsi_Host *shost = class_to_shost(dev);
3083         struct lpfc_hba *phba = ((struct lpfc_vport *)shost->hostdata)->phba;
3084         unsigned int cnt = count;
3085         unsigned long val;
3086         int ret;
3087
3088         if (!phba->cfg_fof)
3089                 return -EPERM;
3090
3091         /* count may include a LF at end of string */
3092         if (buf[cnt-1] == '\n')
3093                 cnt--;
3094
3095         ret = kstrtoul(buf, 0, &val);
3096         if (ret || (val > 0x7f))
3097                 return -EINVAL;
3098
3099         if (val)
3100                 phba->cfg_oas_priority = (uint8_t)val;
3101         else
3102                 phba->cfg_oas_priority = phba->cfg_XLanePriority;
3103         return count;
3104 }
3105 static DEVICE_ATTR(lpfc_xlane_priority, S_IRUGO | S_IWUSR,
3106                    lpfc_oas_priority_show, lpfc_oas_priority_store);
3107
3108 /**
3109  * lpfc_oas_vpt_show - Return wwpn of vport whose targets maybe enabled
3110  *                    for Optimized Access Storage (OAS) operations.
3111  * @dev: class device that is converted into a Scsi_host.
3112  * @attr: device attribute, not used.
3113  * @buf: buffer for passing information.
3114  *
3115  * Returns:
3116  * value of count on success
3117  **/
3118 static ssize_t
3119 lpfc_oas_vpt_show(struct device *dev, struct device_attribute *attr,
3120                   char *buf)
3121 {
3122         struct Scsi_Host *shost = class_to_shost(dev);
3123         struct lpfc_hba *phba = ((struct lpfc_vport *)shost->hostdata)->phba;
3124
3125         return scnprintf(buf, PAGE_SIZE, "0x%llx\n",
3126                         wwn_to_u64(phba->cfg_oas_vpt_wwpn));
3127 }
3128
3129 /**
3130  * lpfc_oas_vpt_store - Store wwpn of vport whose targets maybe enabled
3131  *                    for Optimized Access Storage (OAS) operations.
3132  * @dev: class device that is converted into a Scsi_host.
3133  * @attr: device attribute, not used.
3134  * @buf: buffer for passing information.
3135  * @count: Size of the data buffer.
3136  *
3137  * Returns:
3138  * -EINVAL count is invalid, invalid wwpn byte invalid
3139  * -EPERM oas is not supported by hba
3140  * value of count on success
3141  **/
3142 static ssize_t
3143 lpfc_oas_vpt_store(struct device *dev, struct device_attribute *attr,
3144                    const char *buf, size_t count)
3145 {
3146         struct Scsi_Host *shost = class_to_shost(dev);
3147         struct lpfc_hba *phba = ((struct lpfc_vport *)shost->hostdata)->phba;
3148         unsigned int cnt = count;
3149         uint8_t wwpn[WWN_SZ];
3150         int rc;
3151
3152         if (!phba->cfg_fof)
3153                 return -EPERM;
3154
3155         /* count may include a LF at end of string */
3156         if (buf[cnt-1] == '\n')
3157                 cnt--;
3158
3159         rc = lpfc_wwn_set(buf, cnt, wwpn);
3160         if (rc)
3161                 return rc;
3162
3163         memcpy(phba->cfg_oas_vpt_wwpn, wwpn, (8 * sizeof(uint8_t)));
3164         memcpy(phba->sli4_hba.oas_next_vpt_wwpn, wwpn, (8 * sizeof(uint8_t)));
3165         if (wwn_to_u64(wwpn) == 0)
3166                 phba->cfg_oas_flags |= OAS_FIND_ANY_VPORT;
3167         else
3168                 phba->cfg_oas_flags &= ~OAS_FIND_ANY_VPORT;
3169         phba->cfg_oas_flags &= ~OAS_LUN_VALID;
3170         if (phba->cfg_oas_priority == 0)
3171                 phba->cfg_oas_priority = phba->cfg_XLanePriority;
3172         phba->sli4_hba.oas_next_lun = FIND_FIRST_OAS_LUN;
3173         return count;
3174 }
3175 static DEVICE_ATTR(lpfc_xlane_vpt, S_IRUGO | S_IWUSR,
3176                    lpfc_oas_vpt_show, lpfc_oas_vpt_store);
3177
3178 /**
3179  * lpfc_oas_lun_state_show - Return the current state (enabled or disabled)
3180  *                          of whether luns will be enabled or disabled
3181  *                          for Optimized Access Storage (OAS) operations.
3182  * @dev: class device that is converted into a Scsi_host.
3183  * @attr: device attribute, not used.
3184  * @buf: buffer for passing information.
3185  *
3186  * Returns:
3187  * size of formatted string.
3188  **/
3189 static ssize_t
3190 lpfc_oas_lun_state_show(struct device *dev, struct device_attribute *attr,
3191                         char *buf)
3192 {
3193         struct Scsi_Host *shost = class_to_shost(dev);
3194         struct lpfc_hba *phba = ((struct lpfc_vport *)shost->hostdata)->phba;
3195
3196         return scnprintf(buf, PAGE_SIZE, "%d\n", phba->cfg_oas_lun_state);
3197 }
3198
3199 /**
3200  * lpfc_oas_lun_state_store - Store the state (enabled or disabled)
3201  *                          of whether luns will be enabled or disabled
3202  *                          for Optimized Access Storage (OAS) operations.
3203  * @dev: class device that is converted into a Scsi_host.
3204  * @attr: device attribute, not used.
3205  * @buf: buffer for passing information.
3206  * @count: Size of the data buffer.
3207  *
3208  * Returns:
3209  * -EINVAL count is invalid, invalid wwpn byte invalid
3210  * -EPERM oas is not supported by hba
3211  * value of count on success
3212  **/
3213 static ssize_t
3214 lpfc_oas_lun_state_store(struct device *dev, struct device_attribute *attr,
3215                          const char *buf, size_t count)
3216 {
3217         struct Scsi_Host *shost = class_to_shost(dev);
3218         struct lpfc_hba *phba = ((struct lpfc_vport *)shost->hostdata)->phba;
3219         int val = 0;
3220
3221         if (!phba->cfg_fof)
3222                 return -EPERM;
3223
3224         if (!isdigit(buf[0]))
3225                 return -EINVAL;
3226
3227         if (sscanf(buf, "%i", &val) != 1)
3228                 return -EINVAL;
3229
3230         if ((val != 0) && (val != 1))
3231                 return -EINVAL;
3232
3233         phba->cfg_oas_lun_state = val;
3234         return strlen(buf);
3235 }
3236 static DEVICE_ATTR(lpfc_xlane_lun_state, S_IRUGO | S_IWUSR,
3237                    lpfc_oas_lun_state_show, lpfc_oas_lun_state_store);
3238
3239 /**
3240  * lpfc_oas_lun_status_show - Return the status of the Optimized Access
3241  *                          Storage (OAS) lun returned by the
3242  *                          lpfc_oas_lun_show function.
3243  * @dev: class device that is converted into a Scsi_host.
3244  * @attr: device attribute, not used.
3245  * @buf: buffer for passing information.
3246  *
3247  * Returns:
3248  * size of formatted string.
3249  **/
3250 static ssize_t
3251 lpfc_oas_lun_status_show(struct device *dev, struct device_attribute *attr,
3252                          char *buf)
3253 {
3254         struct Scsi_Host *shost = class_to_shost(dev);
3255         struct lpfc_hba *phba = ((struct lpfc_vport *)shost->hostdata)->phba;
3256
3257         if (!(phba->cfg_oas_flags & OAS_LUN_VALID))
3258                 return -EFAULT;
3259
3260         return scnprintf(buf, PAGE_SIZE, "%d\n", phba->cfg_oas_lun_status);
3261 }
3262 static DEVICE_ATTR(lpfc_xlane_lun_status, S_IRUGO,
3263                    lpfc_oas_lun_status_show, NULL);
3264
3265
3266 /**
3267  * lpfc_oas_lun_state_set - enable or disable a lun for Optimized Access Storage
3268  *                         (OAS) operations.
3269  * @phba: lpfc_hba pointer.
3270  * @vpt_wwpn: wwpn of the vport associated with the returned lun
3271  * @tgt_wwpn: wwpn of the target associated with the returned lun
3272  * @lun: the fc lun for setting oas state.
3273  * @oas_state: the oas state to be set to the lun.
3274  * @pri: priority
3275  *
3276  * Returns:
3277  * SUCCESS : 0
3278  * -EPERM OAS is not enabled or not supported by this port.
3279  *
3280  */
3281 static size_t
3282 lpfc_oas_lun_state_set(struct lpfc_hba *phba, uint8_t vpt_wwpn[],
3283                        uint8_t tgt_wwpn[], uint64_t lun,
3284                        uint32_t oas_state, uint8_t pri)
3285 {
3286
3287         int rc = 0;
3288
3289         if (!phba->cfg_fof)
3290                 return -EPERM;
3291
3292         if (oas_state) {
3293                 if (!lpfc_enable_oas_lun(phba, (struct lpfc_name *)vpt_wwpn,
3294                                          (struct lpfc_name *)tgt_wwpn,
3295                                          lun, pri))
3296                         rc = -ENOMEM;
3297         } else {
3298                 lpfc_disable_oas_lun(phba, (struct lpfc_name *)vpt_wwpn,
3299                                      (struct lpfc_name *)tgt_wwpn, lun, pri);
3300         }
3301         return rc;
3302
3303 }
3304
3305 /**
3306  * lpfc_oas_lun_get_next - get the next lun that has been enabled for Optimized
3307  *                        Access Storage (OAS) operations.
3308  * @phba: lpfc_hba pointer.
3309  * @vpt_wwpn: wwpn of the vport associated with the returned lun
3310  * @tgt_wwpn: wwpn of the target associated with the returned lun
3311  * @lun_status: status of the lun returned lun
3312  * @lun_pri: priority of the lun returned lun
3313  *
3314  * Returns the first or next lun enabled for OAS operations for the vport/target
3315  * specified.  If a lun is found, its vport wwpn, target wwpn and status is
3316  * returned.  If the lun is not found, NOT_OAS_ENABLED_LUN is returned.
3317  *
3318  * Return:
3319  * lun that is OAS enabled for the vport/target
3320  * NOT_OAS_ENABLED_LUN when no oas enabled lun found.
3321  */
3322 static uint64_t
3323 lpfc_oas_lun_get_next(struct lpfc_hba *phba, uint8_t vpt_wwpn[],
3324                       uint8_t tgt_wwpn[], uint32_t *lun_status,
3325                       uint32_t *lun_pri)
3326 {
3327         uint64_t found_lun;
3328
3329         if (unlikely(!phba) || !vpt_wwpn || !tgt_wwpn)
3330                 return NOT_OAS_ENABLED_LUN;
3331         if (lpfc_find_next_oas_lun(phba, (struct lpfc_name *)
3332                                    phba->sli4_hba.oas_next_vpt_wwpn,
3333                                    (struct lpfc_name *)
3334                                    phba->sli4_hba.oas_next_tgt_wwpn,
3335                                    &phba->sli4_hba.oas_next_lun,
3336                                    (struct lpfc_name *)vpt_wwpn,
3337                                    (struct lpfc_name *)tgt_wwpn,
3338                                    &found_lun, lun_status, lun_pri))
3339                 return found_lun;
3340         else
3341                 return NOT_OAS_ENABLED_LUN;
3342 }
3343
3344 /**
3345  * lpfc_oas_lun_state_change - enable/disable a lun for OAS operations
3346  * @phba: lpfc_hba pointer.
3347  * @vpt_wwpn: vport wwpn by reference.
3348  * @tgt_wwpn: target wwpn by reference.
3349  * @lun: the fc lun for setting oas state.
3350  * @oas_state: the oas state to be set to the oas_lun.
3351  * @pri: priority
3352  *
3353  * This routine enables (OAS_LUN_ENABLE) or disables (OAS_LUN_DISABLE)
3354  * a lun for OAS operations.
3355  *
3356  * Return:
3357  * SUCCESS: 0
3358  * -ENOMEM: failed to enable an lun for OAS operations
3359  * -EPERM: OAS is not enabled
3360  */
3361 static ssize_t
3362 lpfc_oas_lun_state_change(struct lpfc_hba *phba, uint8_t vpt_wwpn[],
3363                           uint8_t tgt_wwpn[], uint64_t lun,
3364                           uint32_t oas_state, uint8_t pri)
3365 {
3366
3367         int rc;
3368
3369         rc = lpfc_oas_lun_state_set(phba, vpt_wwpn, tgt_wwpn, lun,
3370                                     oas_state, pri);
3371         return rc;
3372 }
3373
3374 /**
3375  * lpfc_oas_lun_show - Return oas enabled luns from a chosen target
3376  * @dev: class device that is converted into a Scsi_host.
3377  * @attr: device attribute, not used.
3378  * @buf: buffer for passing information.
3379  *
3380  * This routine returns a lun enabled for OAS each time the function
3381  * is called.
3382  *
3383  * Returns:
3384  * SUCCESS: size of formatted string.
3385  * -EFAULT: target or vport wwpn was not set properly.
3386  * -EPERM: oas is not enabled.
3387  **/
3388 static ssize_t
3389 lpfc_oas_lun_show(struct device *dev, struct device_attribute *attr,
3390                   char *buf)
3391 {
3392         struct Scsi_Host *shost = class_to_shost(dev);
3393         struct lpfc_hba *phba = ((struct lpfc_vport *)shost->hostdata)->phba;
3394
3395         uint64_t oas_lun;
3396         int len = 0;
3397
3398         if (!phba->cfg_fof)
3399                 return -EPERM;
3400
3401         if (wwn_to_u64(phba->cfg_oas_vpt_wwpn) == 0)
3402                 if (!(phba->cfg_oas_flags & OAS_FIND_ANY_VPORT))
3403                         return -EFAULT;
3404
3405         if (wwn_to_u64(phba->cfg_oas_tgt_wwpn) == 0)
3406                 if (!(phba->cfg_oas_flags & OAS_FIND_ANY_TARGET))
3407                         return -EFAULT;
3408
3409         oas_lun = lpfc_oas_lun_get_next(phba, phba->cfg_oas_vpt_wwpn,
3410                                         phba->cfg_oas_tgt_wwpn,
3411                                         &phba->cfg_oas_lun_status,
3412                                         &phba->cfg_oas_priority);
3413         if (oas_lun != NOT_OAS_ENABLED_LUN)
3414                 phba->cfg_oas_flags |= OAS_LUN_VALID;
3415
3416         len += scnprintf(buf + len, PAGE_SIZE-len, "0x%llx", oas_lun);
3417
3418         return len;
3419 }
3420
3421 /**
3422  * lpfc_oas_lun_store - Sets the OAS state for lun
3423  * @dev: class device that is converted into a Scsi_host.
3424  * @attr: device attribute, not used.
3425  * @buf: buffer for passing information.
3426  * @count: size of the formatting string
3427  *
3428  * This function sets the OAS state for lun.  Before this function is called,
3429  * the vport wwpn, target wwpn, and oas state need to be set.
3430  *
3431  * Returns:
3432  * SUCCESS: size of formatted string.
3433  * -EFAULT: target or vport wwpn was not set properly.
3434  * -EPERM: oas is not enabled.
3435  * size of formatted string.
3436  **/
3437 static ssize_t
3438 lpfc_oas_lun_store(struct device *dev, struct device_attribute *attr,
3439                    const char *buf, size_t count)
3440 {
3441         struct Scsi_Host *shost = class_to_shost(dev);
3442         struct lpfc_hba *phba = ((struct lpfc_vport *)shost->hostdata)->phba;
3443         uint64_t scsi_lun;
3444         uint32_t pri;
3445         ssize_t rc;
3446
3447         if (!phba->cfg_fof)
3448                 return -EPERM;
3449
3450         if (wwn_to_u64(phba->cfg_oas_vpt_wwpn) == 0)
3451                 return -EFAULT;
3452
3453         if (wwn_to_u64(phba->cfg_oas_tgt_wwpn) == 0)
3454                 return -EFAULT;
3455
3456         if (!isdigit(buf[0]))
3457                 return -EINVAL;
3458
3459         if (sscanf(buf, "0x%llx", &scsi_lun) != 1)
3460                 return -EINVAL;
3461
3462         pri = phba->cfg_oas_priority;
3463         if (pri == 0)
3464                 pri = phba->cfg_XLanePriority;
3465
3466         lpfc_printf_log(phba, KERN_INFO, LOG_INIT,
3467                         "3372 Try to set vport 0x%llx target 0x%llx lun:0x%llx "
3468                         "priority 0x%x with oas state %d\n",
3469                         wwn_to_u64(phba->cfg_oas_vpt_wwpn),
3470                         wwn_to_u64(phba->cfg_oas_tgt_wwpn), scsi_lun,
3471                         pri, phba->cfg_oas_lun_state);
3472
3473         rc = lpfc_oas_lun_state_change(phba, phba->cfg_oas_vpt_wwpn,
3474                                        phba->cfg_oas_tgt_wwpn, scsi_lun,
3475                                        phba->cfg_oas_lun_state, pri);
3476         if (rc)
3477                 return rc;
3478
3479         return count;
3480 }
3481 static DEVICE_ATTR(lpfc_xlane_lun, S_IRUGO | S_IWUSR,
3482                    lpfc_oas_lun_show, lpfc_oas_lun_store);
3483
3484 int lpfc_enable_nvmet_cnt;
3485 unsigned long long lpfc_enable_nvmet[LPFC_NVMET_MAX_PORTS] = {
3486         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
3487         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
3488 module_param_array(lpfc_enable_nvmet, ullong, &lpfc_enable_nvmet_cnt, 0444);
3489 MODULE_PARM_DESC(lpfc_enable_nvmet, "Enable HBA port(s) WWPN as a NVME Target");
3490
3491 static int lpfc_poll = 0;
3492 module_param(lpfc_poll, int, S_IRUGO);
3493 MODULE_PARM_DESC(lpfc_poll, "FCP ring polling mode control:"
3494                  " 0 - none,"
3495                  " 1 - poll with interrupts enabled"
3496                  " 3 - poll and disable FCP ring interrupts");
3497
3498 static DEVICE_ATTR_RW(lpfc_poll);
3499
3500 int lpfc_no_hba_reset_cnt;
3501 unsigned long lpfc_no_hba_reset[MAX_HBAS_NO_RESET] = {
3502         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
3503 module_param_array(lpfc_no_hba_reset, ulong, &lpfc_no_hba_reset_cnt, 0444);
3504 MODULE_PARM_DESC(lpfc_no_hba_reset, "WWPN of HBAs that should not be reset");
3505
3506 LPFC_ATTR(sli_mode, 3, 3, 3,
3507         "SLI mode selector: 3 - select SLI-3");
3508
3509 LPFC_ATTR_R(enable_npiv, 1, 0, 1,
3510         "Enable NPIV functionality");
3511
3512 LPFC_ATTR_R(fcf_failover_policy, 1, 1, 2,
3513         "FCF Fast failover=1 Priority failover=2");
3514
3515 /*
3516  * lpfc_fcp_wait_abts_rsp: Modifies criteria for reporting completion of
3517  * aborted IO.
3518  * The range is [0,1]. Default value is 0
3519  *      0, IO completes after ABTS issued (default).
3520  *      1, IO completes after receipt of ABTS response or timeout.
3521  */
3522 LPFC_ATTR_R(fcp_wait_abts_rsp, 0, 0, 1, "Wait for FCP ABTS completion");
3523
3524 /*
3525 # lpfc_enable_rrq: Track XRI/OXID reuse after IO failures
3526 #       0x0 = disabled, XRI/OXID use not tracked.
3527 #       0x1 = XRI/OXID reuse is timed with ratov, RRQ sent.
3528 #       0x2 = XRI/OXID reuse is timed with ratov, No RRQ sent.
3529 */
3530 LPFC_ATTR_R(enable_rrq, 2, 0, 2,
3531         "Enable RRQ functionality");
3532
3533 /*
3534 # lpfc_suppress_link_up:  Bring link up at initialization
3535 #            0x0  = bring link up (issue MBX_INIT_LINK)
3536 #            0x1  = do NOT bring link up at initialization(MBX_INIT_LINK)
3537 #            0x2  = never bring up link
3538 # Default value is 0.
3539 */
3540 LPFC_ATTR_R(suppress_link_up, LPFC_INITIALIZE_LINK, LPFC_INITIALIZE_LINK,
3541                 LPFC_DELAY_INIT_LINK_INDEFINITELY,
3542                 "Suppress Link Up at initialization");
3543
3544 static ssize_t
3545 lpfc_pls_show(struct device *dev, struct device_attribute *attr, char *buf)
3546 {
3547         struct Scsi_Host  *shost = class_to_shost(dev);
3548         struct lpfc_hba   *phba = ((struct lpfc_vport *)shost->hostdata)->phba;
3549
3550         return scnprintf(buf, PAGE_SIZE, "%d\n",
3551                          phba->sli4_hba.pc_sli4_params.pls);
3552 }
3553 static DEVICE_ATTR(pls, 0444,
3554                          lpfc_pls_show, NULL);
3555
3556 static ssize_t
3557 lpfc_pt_show(struct device *dev, struct device_attribute *attr, char *buf)
3558 {
3559         struct Scsi_Host  *shost = class_to_shost(dev);
3560         struct lpfc_hba   *phba = ((struct lpfc_vport *)shost->hostdata)->phba;
3561
3562         return scnprintf(buf, PAGE_SIZE, "%d\n",
3563                          (phba->hba_flag & HBA_PERSISTENT_TOPO) ? 1 : 0);
3564 }
3565 static DEVICE_ATTR(pt, 0444,
3566                          lpfc_pt_show, NULL);
3567
3568 /*
3569 # lpfc_cnt: Number of IOCBs allocated for ELS, CT, and ABTS
3570 #       1 - (1024)
3571 #       2 - (2048)
3572 #       3 - (3072)
3573 #       4 - (4096)
3574 #       5 - (5120)
3575 */
3576 static ssize_t
3577 lpfc_iocb_hw_show(struct device *dev, struct device_attribute *attr, char *buf)
3578 {
3579         struct Scsi_Host  *shost = class_to_shost(dev);
3580         struct lpfc_hba   *phba = ((struct lpfc_vport *) shost->hostdata)->phba;
3581
3582         return scnprintf(buf, PAGE_SIZE, "%d\n", phba->iocb_max);
3583 }
3584
3585 static DEVICE_ATTR(iocb_hw, S_IRUGO,
3586                          lpfc_iocb_hw_show, NULL);
3587 static ssize_t
3588 lpfc_txq_hw_show(struct device *dev, struct device_attribute *attr, char *buf)
3589 {
3590         struct Scsi_Host  *shost = class_to_shost(dev);
3591         struct lpfc_hba   *phba = ((struct lpfc_vport *) shost->hostdata)->phba;
3592         struct lpfc_sli_ring *pring = lpfc_phba_elsring(phba);
3593
3594         return scnprintf(buf, PAGE_SIZE, "%d\n",
3595                         pring ? pring->txq_max : 0);
3596 }
3597
3598 static DEVICE_ATTR(txq_hw, S_IRUGO,
3599                          lpfc_txq_hw_show, NULL);
3600 static ssize_t
3601 lpfc_txcmplq_hw_show(struct device *dev, struct device_attribute *attr,
3602  char *buf)
3603 {
3604         struct Scsi_Host  *shost = class_to_shost(dev);
3605         struct lpfc_hba   *phba = ((struct lpfc_vport *) shost->hostdata)->phba;
3606         struct lpfc_sli_ring *pring = lpfc_phba_elsring(phba);
3607
3608         return scnprintf(buf, PAGE_SIZE, "%d\n",
3609                         pring ? pring->txcmplq_max : 0);
3610 }
3611
3612 static DEVICE_ATTR(txcmplq_hw, S_IRUGO,
3613                          lpfc_txcmplq_hw_show, NULL);
3614
3615 /*
3616 # lpfc_nodev_tmo: If set, it will hold all I/O errors on devices that disappear
3617 # until the timer expires. Value range is [0,255]. Default value is 30.
3618 */
3619 static int lpfc_nodev_tmo = LPFC_DEF_DEVLOSS_TMO;
3620 static int lpfc_devloss_tmo = LPFC_DEF_DEVLOSS_TMO;
3621 module_param(lpfc_nodev_tmo, int, 0);
3622 MODULE_PARM_DESC(lpfc_nodev_tmo,
3623                  "Seconds driver will hold I/O waiting "
3624                  "for a device to come back");
3625
3626 /**
3627  * lpfc_nodev_tmo_show - Return the hba dev loss timeout value
3628  * @dev: class converted to a Scsi_host structure.
3629  * @attr: device attribute, not used.
3630  * @buf: on return contains the dev loss timeout in decimal.
3631  *
3632  * Returns: size of formatted string.
3633  **/
3634 static ssize_t
3635 lpfc_nodev_tmo_show(struct device *dev, struct device_attribute *attr,
3636                     char *buf)
3637 {
3638         struct Scsi_Host  *shost = class_to_shost(dev);
3639         struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata;
3640
3641         return scnprintf(buf, PAGE_SIZE, "%d\n",        vport->cfg_devloss_tmo);
3642 }
3643
3644 /**
3645  * lpfc_nodev_tmo_init - Set the hba nodev timeout value
3646  * @vport: lpfc vport structure pointer.
3647  * @val: contains the nodev timeout value.
3648  *
3649  * Description:
3650  * If the devloss tmo is already set then nodev tmo is set to devloss tmo,
3651  * a kernel error message is printed and zero is returned.
3652  * Else if val is in range then nodev tmo and devloss tmo are set to val.
3653  * Otherwise nodev tmo is set to the default value.
3654  *
3655  * Returns:
3656  * zero if already set or if val is in range
3657  * -EINVAL val out of range
3658  **/
3659 static int
3660 lpfc_nodev_tmo_init(struct lpfc_vport *vport, int val)
3661 {
3662         if (vport->cfg_devloss_tmo != LPFC_DEF_DEVLOSS_TMO) {
3663                 vport->cfg_nodev_tmo = vport->cfg_devloss_tmo;
3664                 if (val != LPFC_DEF_DEVLOSS_TMO)
3665                         lpfc_printf_vlog(vport, KERN_ERR, LOG_INIT,
3666                                          "0407 Ignoring lpfc_nodev_tmo module "
3667                                          "parameter because lpfc_devloss_tmo "
3668                                          "is set.\n");
3669                 return 0;
3670         }
3671
3672         if (val >= LPFC_MIN_DEVLOSS_TMO && val <= LPFC_MAX_DEVLOSS_TMO) {
3673                 vport->cfg_nodev_tmo = val;
3674                 vport->cfg_devloss_tmo = val;
3675                 return 0;
3676         }
3677         lpfc_printf_vlog(vport, KERN_ERR, LOG_INIT,
3678                          "0400 lpfc_nodev_tmo attribute cannot be set to"
3679                          " %d, allowed range is [%d, %d]\n",
3680                          val, LPFC_MIN_DEVLOSS_TMO, LPFC_MAX_DEVLOSS_TMO);
3681         vport->cfg_nodev_tmo = LPFC_DEF_DEVLOSS_TMO;
3682         return -EINVAL;
3683 }
3684
3685 /**
3686  * lpfc_update_rport_devloss_tmo - Update dev loss tmo value
3687  * @vport: lpfc vport structure pointer.
3688  *
3689  * Description:
3690  * Update all the ndlp's dev loss tmo with the vport devloss tmo value.
3691  **/
3692 static void
3693 lpfc_update_rport_devloss_tmo(struct lpfc_vport *vport)
3694 {
3695         struct Scsi_Host  *shost;
3696         struct lpfc_nodelist  *ndlp;
3697 #if (IS_ENABLED(CONFIG_NVME_FC))
3698         struct lpfc_nvme_rport *rport;
3699         struct nvme_fc_remote_port *remoteport = NULL;
3700 #endif
3701
3702         shost = lpfc_shost_from_vport(vport);
3703         spin_lock_irq(shost->host_lock);
3704         list_for_each_entry(ndlp, &vport->fc_nodes, nlp_listp) {
3705                 if (ndlp->rport)
3706                         ndlp->rport->dev_loss_tmo = vport->cfg_devloss_tmo;
3707 #if (IS_ENABLED(CONFIG_NVME_FC))
3708                 spin_lock(&ndlp->lock);
3709                 rport = lpfc_ndlp_get_nrport(ndlp);
3710                 if (rport)
3711                         remoteport = rport->remoteport;
3712                 spin_unlock(&ndlp->lock);
3713                 if (rport && remoteport)
3714                         nvme_fc_set_remoteport_devloss(remoteport,
3715                                                        vport->cfg_devloss_tmo);
3716 #endif
3717         }
3718         spin_unlock_irq(shost->host_lock);
3719 }
3720
3721 /**
3722  * lpfc_nodev_tmo_set - Set the vport nodev tmo and devloss tmo values
3723  * @vport: lpfc vport structure pointer.
3724  * @val: contains the tmo value.
3725  *
3726  * Description:
3727  * If the devloss tmo is already set or the vport dev loss tmo has changed
3728  * then a kernel error message is printed and zero is returned.
3729  * Else if val is in range then nodev tmo and devloss tmo are set to val.
3730  * Otherwise nodev tmo is set to the default value.
3731  *
3732  * Returns:
3733  * zero if already set or if val is in range
3734  * -EINVAL val out of range
3735  **/
3736 static int
3737 lpfc_nodev_tmo_set(struct lpfc_vport *vport, int val)
3738 {
3739         if (vport->dev_loss_tmo_changed ||
3740             (lpfc_devloss_tmo != LPFC_DEF_DEVLOSS_TMO)) {
3741                 lpfc_printf_vlog(vport, KERN_ERR, LOG_INIT,
3742                                  "0401 Ignoring change to lpfc_nodev_tmo "
3743                                  "because lpfc_devloss_tmo is set.\n");
3744                 return 0;
3745         }
3746         if (val >= LPFC_MIN_DEVLOSS_TMO && val <= LPFC_MAX_DEVLOSS_TMO) {
3747                 vport->cfg_nodev_tmo = val;
3748                 vport->cfg_devloss_tmo = val;
3749                 /*
3750                  * For compat: set the fc_host dev loss so new rports
3751                  * will get the value.
3752                  */
3753                 fc_host_dev_loss_tmo(lpfc_shost_from_vport(vport)) = val;
3754                 lpfc_update_rport_devloss_tmo(vport);
3755                 return 0;
3756         }
3757         lpfc_printf_vlog(vport, KERN_ERR, LOG_INIT,
3758                          "0403 lpfc_nodev_tmo attribute cannot be set to "
3759                          "%d, allowed range is [%d, %d]\n",
3760                          val, LPFC_MIN_DEVLOSS_TMO, LPFC_MAX_DEVLOSS_TMO);
3761         return -EINVAL;
3762 }
3763
3764 lpfc_vport_param_store(nodev_tmo)
3765
3766 static DEVICE_ATTR_RW(lpfc_nodev_tmo);
3767
3768 /*
3769 # lpfc_devloss_tmo: If set, it will hold all I/O errors on devices that
3770 # disappear until the timer expires. Value range is [0,255]. Default
3771 # value is 30.
3772 */
3773 module_param(lpfc_devloss_tmo, int, S_IRUGO);
3774 MODULE_PARM_DESC(lpfc_devloss_tmo,
3775                  "Seconds driver will hold I/O waiting "
3776                  "for a device to come back");
3777 lpfc_vport_param_init(devloss_tmo, LPFC_DEF_DEVLOSS_TMO,
3778                       LPFC_MIN_DEVLOSS_TMO, LPFC_MAX_DEVLOSS_TMO)
3779 lpfc_vport_param_show(devloss_tmo)
3780
3781 /**
3782  * lpfc_devloss_tmo_set - Sets vport nodev tmo, devloss tmo values, changed bit
3783  * @vport: lpfc vport structure pointer.
3784  * @val: contains the tmo value.
3785  *
3786  * Description:
3787  * If val is in a valid range then set the vport nodev tmo,
3788  * devloss tmo, also set the vport dev loss tmo changed flag.
3789  * Else a kernel error message is printed.
3790  *
3791  * Returns:
3792  * zero if val is in range
3793  * -EINVAL val out of range
3794  **/
3795 static int
3796 lpfc_devloss_tmo_set(struct lpfc_vport *vport, int val)
3797 {
3798         if (val >= LPFC_MIN_DEVLOSS_TMO && val <= LPFC_MAX_DEVLOSS_TMO) {
3799                 vport->cfg_nodev_tmo = val;
3800                 vport->cfg_devloss_tmo = val;
3801                 vport->dev_loss_tmo_changed = 1;
3802                 fc_host_dev_loss_tmo(lpfc_shost_from_vport(vport)) = val;
3803                 lpfc_update_rport_devloss_tmo(vport);
3804                 return 0;
3805         }
3806
3807         lpfc_printf_vlog(vport, KERN_ERR, LOG_INIT,
3808                          "0404 lpfc_devloss_tmo attribute cannot be set to "
3809                          "%d, allowed range is [%d, %d]\n",
3810                          val, LPFC_MIN_DEVLOSS_TMO, LPFC_MAX_DEVLOSS_TMO);
3811         return -EINVAL;
3812 }
3813
3814 lpfc_vport_param_store(devloss_tmo)
3815 static DEVICE_ATTR_RW(lpfc_devloss_tmo);
3816
3817 /*
3818  * lpfc_suppress_rsp: Enable suppress rsp feature is firmware supports it
3819  * lpfc_suppress_rsp = 0  Disable
3820  * lpfc_suppress_rsp = 1  Enable (default)
3821  *
3822  */
3823 LPFC_ATTR_R(suppress_rsp, 1, 0, 1,
3824             "Enable suppress rsp feature is firmware supports it");
3825
3826 /*
3827  * lpfc_nvmet_mrq: Specify number of RQ pairs for processing NVMET cmds
3828  * lpfc_nvmet_mrq = 0  driver will calcualte optimal number of RQ pairs
3829  * lpfc_nvmet_mrq = 1  use a single RQ pair
3830  * lpfc_nvmet_mrq >= 2  use specified RQ pairs for MRQ
3831  *
3832  */
3833 LPFC_ATTR_R(nvmet_mrq,
3834             LPFC_NVMET_MRQ_AUTO, LPFC_NVMET_MRQ_AUTO, LPFC_NVMET_MRQ_MAX,
3835             "Specify number of RQ pairs for processing NVMET cmds");
3836
3837 /*
3838  * lpfc_nvmet_mrq_post: Specify number of RQ buffer to initially post
3839  * to each NVMET RQ. Range 64 to 2048, default is 512.
3840  */
3841 LPFC_ATTR_R(nvmet_mrq_post,
3842             LPFC_NVMET_RQE_DEF_POST, LPFC_NVMET_RQE_MIN_POST,
3843             LPFC_NVMET_RQE_DEF_COUNT,
3844             "Specify number of RQ buffers to initially post");
3845
3846 /*
3847  * lpfc_enable_fc4_type: Defines what FC4 types are supported.
3848  * Supported Values:  1 - register just FCP
3849  *                    3 - register both FCP and NVME
3850  * Supported values are [1,3]. Default value is 3
3851  */
3852 LPFC_ATTR_R(enable_fc4_type, LPFC_DEF_ENBL_FC4_TYPE,
3853             LPFC_ENABLE_FCP, LPFC_MAX_ENBL_FC4_TYPE,
3854             "Enable FC4 Protocol support - FCP / NVME");
3855
3856 /*
3857 # lpfc_log_verbose: Only turn this flag on if you are willing to risk being
3858 # deluged with LOTS of information.
3859 # You can set a bit mask to record specific types of verbose messages:
3860 # See lpfc_logmsh.h for definitions.
3861 */
3862 LPFC_VPORT_ATTR_HEX_RW(log_verbose, 0x0, 0x0, 0xffffffff,
3863                        "Verbose logging bit-mask");
3864
3865 /*
3866 # lpfc_enable_da_id: This turns on the DA_ID CT command that deregisters
3867 # objects that have been registered with the nameserver after login.
3868 */
3869 LPFC_VPORT_ATTR_R(enable_da_id, 1, 0, 1,
3870                   "Deregister nameserver objects before LOGO");
3871
3872 /*
3873 # lun_queue_depth:  This parameter is used to limit the number of outstanding
3874 # commands per FCP LUN.
3875 */
3876 LPFC_VPORT_ATTR_R(lun_queue_depth, 64, 1, 512,
3877                   "Max number of FCP commands we can queue to a specific LUN");
3878
3879 /*
3880 # tgt_queue_depth:  This parameter is used to limit the number of outstanding
3881 # commands per target port. Value range is [10,65535]. Default value is 65535.
3882 */
3883 static uint lpfc_tgt_queue_depth = LPFC_MAX_TGT_QDEPTH;
3884 module_param(lpfc_tgt_queue_depth, uint, 0444);
3885 MODULE_PARM_DESC(lpfc_tgt_queue_depth, "Set max Target queue depth");
3886 lpfc_vport_param_show(tgt_queue_depth);
3887 lpfc_vport_param_init(tgt_queue_depth, LPFC_MAX_TGT_QDEPTH,
3888                       LPFC_MIN_TGT_QDEPTH, LPFC_MAX_TGT_QDEPTH);
3889
3890 /**
3891  * lpfc_tgt_queue_depth_set: Sets an attribute value.
3892  * @vport: lpfc vport structure pointer.
3893  * @val: integer attribute value.
3894  *
3895  * Description: Sets the parameter to the new value.
3896  *
3897  * Returns:
3898  * zero on success
3899  * -EINVAL if val is invalid
3900  */
3901 static int
3902 lpfc_tgt_queue_depth_set(struct lpfc_vport *vport, uint val)
3903 {
3904         struct Scsi_Host *shost = lpfc_shost_from_vport(vport);
3905         struct lpfc_nodelist *ndlp;
3906
3907         if (!lpfc_rangecheck(val, LPFC_MIN_TGT_QDEPTH, LPFC_MAX_TGT_QDEPTH))
3908                 return -EINVAL;
3909
3910         if (val == vport->cfg_tgt_queue_depth)
3911                 return 0;
3912
3913         spin_lock_irq(shost->host_lock);
3914         vport->cfg_tgt_queue_depth = val;
3915
3916         /* Next loop thru nodelist and change cmd_qdepth */
3917         list_for_each_entry(ndlp, &vport->fc_nodes, nlp_listp)
3918                 ndlp->cmd_qdepth = vport->cfg_tgt_queue_depth;
3919
3920         spin_unlock_irq(shost->host_lock);
3921         return 0;
3922 }
3923
3924 lpfc_vport_param_store(tgt_queue_depth);
3925 static DEVICE_ATTR_RW(lpfc_tgt_queue_depth);
3926
3927 /*
3928 # hba_queue_depth:  This parameter is used to limit the number of outstanding
3929 # commands per lpfc HBA. Value range is [32,8192]. If this parameter
3930 # value is greater than the maximum number of exchanges supported by the HBA,
3931 # then maximum number of exchanges supported by the HBA is used to determine
3932 # the hba_queue_depth.
3933 */
3934 LPFC_ATTR_R(hba_queue_depth, 8192, 32, 8192,
3935             "Max number of FCP commands we can queue to a lpfc HBA");
3936
3937 /*
3938 # peer_port_login:  This parameter allows/prevents logins
3939 # between peer ports hosted on the same physical port.
3940 # When this parameter is set 0 peer ports of same physical port
3941 # are not allowed to login to each other.
3942 # When this parameter is set 1 peer ports of same physical port
3943 # are allowed to login to each other.
3944 # Default value of this parameter is 0.
3945 */
3946 LPFC_VPORT_ATTR_R(peer_port_login, 0, 0, 1,
3947                   "Allow peer ports on the same physical port to login to each "
3948                   "other.");
3949
3950 /*
3951 # restrict_login:  This parameter allows/prevents logins
3952 # between Virtual Ports and remote initiators.
3953 # When this parameter is not set (0) Virtual Ports will accept PLOGIs from
3954 # other initiators and will attempt to PLOGI all remote ports.
3955 # When this parameter is set (1) Virtual Ports will reject PLOGIs from
3956 # remote ports and will not attempt to PLOGI to other initiators.
3957 # This parameter does not restrict to the physical port.
3958 # This parameter does not restrict logins to Fabric resident remote ports.
3959 # Default value of this parameter is 1.
3960 */
3961 static int lpfc_restrict_login = 1;
3962 module_param(lpfc_restrict_login, int, S_IRUGO);
3963 MODULE_PARM_DESC(lpfc_restrict_login,
3964                  "Restrict virtual ports login to remote initiators.");
3965 lpfc_vport_param_show(restrict_login);
3966
3967 /**
3968  * lpfc_restrict_login_init - Set the vport restrict login flag
3969  * @vport: lpfc vport structure pointer.
3970  * @val: contains the restrict login value.
3971  *
3972  * Description:
3973  * If val is not in a valid range then log a kernel error message and set
3974  * the vport restrict login to one.
3975  * If the port type is physical clear the restrict login flag and return.
3976  * Else set the restrict login flag to val.
3977  *
3978  * Returns:
3979  * zero if val is in range
3980  * -EINVAL val out of range
3981  **/
3982 static int
3983 lpfc_restrict_login_init(struct lpfc_vport *vport, int val)
3984 {
3985         if (val < 0 || val > 1) {
3986                 lpfc_printf_vlog(vport, KERN_ERR, LOG_INIT,
3987                                  "0422 lpfc_restrict_login attribute cannot "
3988                                  "be set to %d, allowed range is [0, 1]\n",
3989                                  val);
3990                 vport->cfg_restrict_login = 1;
3991                 return -EINVAL;
3992         }
3993         if (vport->port_type == LPFC_PHYSICAL_PORT) {
3994                 vport->cfg_restrict_login = 0;
3995                 return 0;
3996         }
3997         vport->cfg_restrict_login = val;
3998         return 0;
3999 }
4000
4001 /**
4002  * lpfc_restrict_login_set - Set the vport restrict login flag
4003  * @vport: lpfc vport structure pointer.
4004  * @val: contains the restrict login value.
4005  *
4006  * Description:
4007  * If val is not in a valid range then log a kernel error message and set
4008  * the vport restrict login to one.
4009  * If the port type is physical and the val is not zero log a kernel
4010  * error message, clear the restrict login flag and return zero.
4011  * Else set the restrict login flag to val.
4012  *
4013  * Returns:
4014  * zero if val is in range
4015  * -EINVAL val out of range
4016  **/
4017 static int
4018 lpfc_restrict_login_set(struct lpfc_vport *vport, int val)
4019 {
4020         if (val < 0 || val > 1) {
4021                 lpfc_printf_vlog(vport, KERN_ERR, LOG_INIT,
4022                                  "0425 lpfc_restrict_login attribute cannot "
4023                                  "be set to %d, allowed range is [0, 1]\n",
4024                                  val);
4025                 vport->cfg_restrict_login = 1;
4026                 return -EINVAL;
4027         }
4028         if (vport->port_type == LPFC_PHYSICAL_PORT && val != 0) {
4029                 lpfc_printf_vlog(vport, KERN_ERR, LOG_INIT,
4030                                  "0468 lpfc_restrict_login must be 0 for "
4031                                  "Physical ports.\n");
4032                 vport->cfg_restrict_login = 0;
4033                 return 0;
4034         }
4035         vport->cfg_restrict_login = val;
4036         return 0;
4037 }
4038 lpfc_vport_param_store(restrict_login);
4039 static DEVICE_ATTR_RW(lpfc_restrict_login);
4040
4041 /*
4042 # Some disk devices have a "select ID" or "select Target" capability.
4043 # From a protocol standpoint "select ID" usually means select the
4044 # Fibre channel "ALPA".  In the FC-AL Profile there is an "informative
4045 # annex" which contains a table that maps a "select ID" (a number
4046 # between 0 and 7F) to an ALPA.  By default, for compatibility with
4047 # older drivers, the lpfc driver scans this table from low ALPA to high
4048 # ALPA.
4049 #
4050 # Turning on the scan-down variable (on  = 1, off = 0) will
4051 # cause the lpfc driver to use an inverted table, effectively
4052 # scanning ALPAs from high to low. Value range is [0,1]. Default value is 1.
4053 #
4054 # (Note: This "select ID" functionality is a LOOP ONLY characteristic
4055 # and will not work across a fabric. Also this parameter will take
4056 # effect only in the case when ALPA map is not available.)
4057 */
4058 LPFC_VPORT_ATTR_R(scan_down, 1, 0, 1,
4059                   "Start scanning for devices from highest ALPA to lowest");
4060
4061 /*
4062 # lpfc_topology:  link topology for init link
4063 #            0x0  = attempt loop mode then point-to-point
4064 #            0x01 = internal loopback mode
4065 #            0x02 = attempt point-to-point mode only
4066 #            0x04 = attempt loop mode only
4067 #            0x06 = attempt point-to-point mode then loop
4068 # Set point-to-point mode if you want to run as an N_Port.
4069 # Set loop mode if you want to run as an NL_Port. Value range is [0,0x6].
4070 # Default value is 0.
4071 */
4072 LPFC_ATTR(topology, 0, 0, 6,
4073         "Select Fibre Channel topology");
4074
4075 /**
4076  * lpfc_topology_store - Set the adapters topology field
4077  * @dev: class device that is converted into a scsi_host.
4078  * @attr:device attribute, not used.
4079  * @buf: buffer for passing information.
4080  * @count: size of the data buffer.
4081  *
4082  * Description:
4083  * If val is in a valid range then set the adapter's topology field and
4084  * issue a lip; if the lip fails reset the topology to the old value.
4085  *
4086  * If the value is not in range log a kernel error message and return an error.
4087  *
4088  * Returns:
4089  * zero if val is in range and lip okay
4090  * non-zero return value from lpfc_issue_lip()
4091  * -EINVAL val out of range
4092  **/
4093 static ssize_t
4094 lpfc_topology_store(struct device *dev, struct device_attribute *attr,
4095                         const char *buf, size_t count)
4096 {
4097         struct Scsi_Host  *shost = class_to_shost(dev);
4098         struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata;
4099         struct lpfc_hba   *phba = vport->phba;
4100         int val = 0;
4101         int nolip = 0;
4102         const char *val_buf = buf;
4103         int err;
4104         uint32_t prev_val;
4105         u8 sli_family, if_type;
4106
4107         if (!strncmp(buf, "nolip ", strlen("nolip "))) {
4108                 nolip = 1;
4109                 val_buf = &buf[strlen("nolip ")];
4110         }
4111
4112         if (!isdigit(val_buf[0]))
4113                 return -EINVAL;
4114         if (sscanf(val_buf, "%i", &val) != 1)
4115                 return -EINVAL;
4116
4117         if (val >= 0 && val <= 6) {
4118                 prev_val = phba->cfg_topology;
4119                 if (phba->cfg_link_speed == LPFC_USER_LINK_SPEED_16G &&
4120                         val == 4) {
4121                         lpfc_printf_vlog(vport, KERN_ERR, LOG_INIT,
4122                                 "3113 Loop mode not supported at speed %d\n",
4123                                 val);
4124                         return -EINVAL;
4125                 }
4126                 /*
4127                  * The 'topology' is not a configurable parameter if :
4128                  *   - persistent topology enabled
4129                  *   - ASIC_GEN_NUM >= 0xC, with no private loop support
4130                  */
4131                 sli_family = bf_get(lpfc_sli_intf_sli_family,
4132                                     &phba->sli4_hba.sli_intf);
4133                 if_type = bf_get(lpfc_sli_intf_if_type,
4134                                  &phba->sli4_hba.sli_intf);
4135                 if ((phba->hba_flag & HBA_PERSISTENT_TOPO ||
4136                     (!phba->sli4_hba.pc_sli4_params.pls &&
4137                      (sli_family == LPFC_SLI_INTF_FAMILY_G6 ||
4138                       if_type == LPFC_SLI_INTF_IF_TYPE_6))) &&
4139                     val == 4) {
4140                         lpfc_printf_vlog(vport, KERN_ERR, LOG_INIT,
4141                                 "3114 Loop mode not supported\n");
4142                         return -EINVAL;
4143                 }
4144                 phba->cfg_topology = val;
4145                 if (nolip)
4146                         return strlen(buf);
4147
4148                 lpfc_printf_vlog(vport, KERN_ERR, LOG_INIT,
4149                         "3054 lpfc_topology changed from %d to %d\n",
4150                         prev_val, val);
4151                 if (prev_val != val && phba->sli_rev == LPFC_SLI_REV4)
4152                         phba->fc_topology_changed = 1;
4153                 err = lpfc_issue_lip(lpfc_shost_from_vport(phba->pport));
4154                 if (err) {
4155                         phba->cfg_topology = prev_val;
4156                         return -EINVAL;
4157                 } else
4158                         return strlen(buf);
4159         }
4160         lpfc_printf_log(phba, KERN_ERR, LOG_INIT,
4161                 "%d:0467 lpfc_topology attribute cannot be set to %d, "
4162                 "allowed range is [0, 6]\n",
4163                 phba->brd_no, val);
4164         return -EINVAL;
4165 }
4166
4167 lpfc_param_show(topology)
4168 static DEVICE_ATTR_RW(lpfc_topology);
4169
4170 /**
4171  * lpfc_static_vport_show: Read callback function for
4172  *   lpfc_static_vport sysfs file.
4173  * @dev: Pointer to class device object.
4174  * @attr: device attribute structure.
4175  * @buf: Data buffer.
4176  *
4177  * This function is the read call back function for
4178  * lpfc_static_vport sysfs file. The lpfc_static_vport
4179  * sysfs file report the mageability of the vport.
4180  **/
4181 static ssize_t
4182 lpfc_static_vport_show(struct device *dev, struct device_attribute *attr,
4183                          char *buf)
4184 {
4185         struct Scsi_Host  *shost = class_to_shost(dev);
4186         struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata;
4187         if (vport->vport_flag & STATIC_VPORT)
4188                 sprintf(buf, "1\n");
4189         else
4190                 sprintf(buf, "0\n");
4191
4192         return strlen(buf);
4193 }
4194
4195 /*
4196  * Sysfs attribute to control the statistical data collection.
4197  */
4198 static DEVICE_ATTR_RO(lpfc_static_vport);
4199
4200 /*
4201 # lpfc_link_speed: Link speed selection for initializing the Fibre Channel
4202 # connection.
4203 # Value range is [0,16]. Default value is 0.
4204 */
4205 /**
4206  * lpfc_link_speed_store - Set the adapters link speed
4207  * @dev: Pointer to class device.
4208  * @attr: Unused.
4209  * @buf: Data buffer.
4210  * @count: Size of the data buffer.
4211  *
4212  * Description:
4213  * If val is in a valid range then set the adapter's link speed field and
4214  * issue a lip; if the lip fails reset the link speed to the old value.
4215  *
4216  * Notes:
4217  * If the value is not in range log a kernel error message and return an error.
4218  *
4219  * Returns:
4220  * zero if val is in range and lip okay.
4221  * non-zero return value from lpfc_issue_lip()
4222  * -EINVAL val out of range
4223  **/
4224 static ssize_t
4225 lpfc_link_speed_store(struct device *dev, struct device_attribute *attr,
4226                 const char *buf, size_t count)
4227 {
4228         struct Scsi_Host  *shost = class_to_shost(dev);
4229         struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata;
4230         struct lpfc_hba   *phba = vport->phba;
4231         int val = LPFC_USER_LINK_SPEED_AUTO;
4232         int nolip = 0;
4233         const char *val_buf = buf;
4234         int err;
4235         uint32_t prev_val, if_type;
4236
4237         if_type = bf_get(lpfc_sli_intf_if_type, &phba->sli4_hba.sli_intf);
4238         if (if_type >= LPFC_SLI_INTF_IF_TYPE_2 &&
4239             phba->hba_flag & HBA_FORCED_LINK_SPEED)
4240                 return -EPERM;
4241
4242         if (!strncmp(buf, "nolip ", strlen("nolip "))) {
4243                 nolip = 1;
4244                 val_buf = &buf[strlen("nolip ")];
4245         }
4246
4247         if (!isdigit(val_buf[0]))
4248                 return -EINVAL;
4249         if (sscanf(val_buf, "%i", &val) != 1)
4250                 return -EINVAL;
4251
4252         lpfc_printf_vlog(vport, KERN_ERR, LOG_INIT,
4253                 "3055 lpfc_link_speed changed from %d to %d %s\n",
4254                 phba->cfg_link_speed, val, nolip ? "(nolip)" : "(lip)");
4255
4256         if (((val == LPFC_USER_LINK_SPEED_1G) && !(phba->lmt & LMT_1Gb)) ||
4257             ((val == LPFC_USER_LINK_SPEED_2G) && !(phba->lmt & LMT_2Gb)) ||
4258             ((val == LPFC_USER_LINK_SPEED_4G) && !(phba->lmt & LMT_4Gb)) ||
4259             ((val == LPFC_USER_LINK_SPEED_8G) && !(phba->lmt & LMT_8Gb)) ||
4260             ((val == LPFC_USER_LINK_SPEED_10G) && !(phba->lmt & LMT_10Gb)) ||
4261             ((val == LPFC_USER_LINK_SPEED_16G) && !(phba->lmt & LMT_16Gb)) ||
4262             ((val == LPFC_USER_LINK_SPEED_32G) && !(phba->lmt & LMT_32Gb)) ||
4263             ((val == LPFC_USER_LINK_SPEED_64G) && !(phba->lmt & LMT_64Gb))) {
4264                 lpfc_printf_log(phba, KERN_ERR, LOG_INIT,
4265                                 "2879 lpfc_link_speed attribute cannot be set "
4266                                 "to %d. Speed is not supported by this port.\n",
4267                                 val);
4268                 return -EINVAL;
4269         }
4270         if (val >= LPFC_USER_LINK_SPEED_16G &&
4271             phba->fc_topology == LPFC_TOPOLOGY_LOOP) {
4272                 lpfc_printf_log(phba, KERN_ERR, LOG_INIT,
4273                                 "3112 lpfc_link_speed attribute cannot be set "
4274                                 "to %d. Speed is not supported in loop mode.\n",
4275                                 val);
4276                 return -EINVAL;
4277         }
4278
4279         switch (val) {
4280         case LPFC_USER_LINK_SPEED_AUTO:
4281         case LPFC_USER_LINK_SPEED_1G:
4282         case LPFC_USER_LINK_SPEED_2G:
4283         case LPFC_USER_LINK_SPEED_4G:
4284         case LPFC_USER_LINK_SPEED_8G:
4285         case LPFC_USER_LINK_SPEED_16G:
4286         case LPFC_USER_LINK_SPEED_32G:
4287         case LPFC_USER_LINK_SPEED_64G:
4288                 prev_val = phba->cfg_link_speed;
4289                 phba->cfg_link_speed = val;
4290                 if (nolip)
4291                         return strlen(buf);
4292
4293                 err = lpfc_issue_lip(lpfc_shost_from_vport(phba->pport));
4294                 if (err) {
4295                         phba->cfg_link_speed = prev_val;
4296                         return -EINVAL;
4297                 }
4298                 return strlen(buf);
4299         default:
4300                 break;
4301         }
4302
4303         lpfc_printf_log(phba, KERN_ERR, LOG_INIT,
4304                         "0469 lpfc_link_speed attribute cannot be set to %d, "
4305                         "allowed values are [%s]\n",
4306                         val, LPFC_LINK_SPEED_STRING);
4307         return -EINVAL;
4308
4309 }
4310
4311 static int lpfc_link_speed = 0;
4312 module_param(lpfc_link_speed, int, S_IRUGO);
4313 MODULE_PARM_DESC(lpfc_link_speed, "Select link speed");
4314 lpfc_param_show(link_speed)
4315
4316 /**
4317  * lpfc_link_speed_init - Set the adapters link speed
4318  * @phba: lpfc_hba pointer.
4319  * @val: link speed value.
4320  *
4321  * Description:
4322  * If val is in a valid range then set the adapter's link speed field.
4323  *
4324  * Notes:
4325  * If the value is not in range log a kernel error message, clear the link
4326  * speed and return an error.
4327  *
4328  * Returns:
4329  * zero if val saved.
4330  * -EINVAL val out of range
4331  **/
4332 static int
4333 lpfc_link_speed_init(struct lpfc_hba *phba, int val)
4334 {
4335         if (val >= LPFC_USER_LINK_SPEED_16G && phba->cfg_topology == 4) {
4336                 lpfc_printf_log(phba, KERN_ERR, LOG_INIT,
4337                         "3111 lpfc_link_speed of %d cannot "
4338                         "support loop mode, setting topology to default.\n",
4339                          val);
4340                 phba->cfg_topology = 0;
4341         }
4342
4343         switch (val) {
4344         case LPFC_USER_LINK_SPEED_AUTO:
4345         case LPFC_USER_LINK_SPEED_1G:
4346         case LPFC_USER_LINK_SPEED_2G:
4347         case LPFC_USER_LINK_SPEED_4G:
4348         case LPFC_USER_LINK_SPEED_8G:
4349         case LPFC_USER_LINK_SPEED_16G:
4350         case LPFC_USER_LINK_SPEED_32G:
4351         case LPFC_USER_LINK_SPEED_64G:
4352                 phba->cfg_link_speed = val;
4353                 return 0;
4354         default:
4355                 lpfc_printf_log(phba, KERN_ERR, LOG_INIT,
4356                                 "0405 lpfc_link_speed attribute cannot "
4357                                 "be set to %d, allowed values are "
4358                                 "["LPFC_LINK_SPEED_STRING"]\n", val);
4359                 phba->cfg_link_speed = LPFC_USER_LINK_SPEED_AUTO;
4360                 return -EINVAL;
4361         }
4362 }
4363
4364 static DEVICE_ATTR_RW(lpfc_link_speed);
4365
4366 /*
4367 # lpfc_aer_support: Support PCIe device Advanced Error Reporting (AER)
4368 #       0  = aer disabled or not supported
4369 #       1  = aer supported and enabled (default)
4370 # Value range is [0,1]. Default value is 1.
4371 */
4372 LPFC_ATTR(aer_support, 1, 0, 1,
4373         "Enable PCIe device AER support");
4374 lpfc_param_show(aer_support)
4375
4376 /**
4377  * lpfc_aer_support_store - Set the adapter for aer support
4378  *
4379  * @dev: class device that is converted into a Scsi_host.
4380  * @attr: device attribute, not used.
4381  * @buf: containing enable or disable aer flag.
4382  * @count: unused variable.
4383  *
4384  * Description:
4385  * If the val is 1 and currently the device's AER capability was not
4386  * enabled, invoke the kernel's enable AER helper routine, trying to
4387  * enable the device's AER capability. If the helper routine enabling
4388  * AER returns success, update the device's cfg_aer_support flag to
4389  * indicate AER is supported by the device; otherwise, if the device
4390  * AER capability is already enabled to support AER, then do nothing.
4391  *
4392  * If the val is 0 and currently the device's AER support was enabled,
4393  * invoke the kernel's disable AER helper routine. After that, update
4394  * the device's cfg_aer_support flag to indicate AER is not supported
4395  * by the device; otherwise, if the device AER capability is already
4396  * disabled from supporting AER, then do nothing.
4397  *
4398  * Returns:
4399  * length of the buf on success if val is in range the intended mode
4400  * is supported.
4401  * -EINVAL if val out of range or intended mode is not supported.
4402  **/
4403 static ssize_t
4404 lpfc_aer_support_store(struct device *dev, struct device_attribute *attr,
4405                        const char *buf, size_t count)
4406 {
4407         struct Scsi_Host *shost = class_to_shost(dev);
4408         struct lpfc_vport *vport = (struct lpfc_vport *)shost->hostdata;
4409         struct lpfc_hba *phba = vport->phba;
4410         int val = 0, rc = -EINVAL;
4411
4412         if (!isdigit(buf[0]))
4413                 return -EINVAL;
4414         if (sscanf(buf, "%i", &val) != 1)
4415                 return -EINVAL;
4416
4417         switch (val) {
4418         case 0:
4419                 if (phba->hba_flag & HBA_AER_ENABLED) {
4420                         rc = pci_disable_pcie_error_reporting(phba->pcidev);
4421                         if (!rc) {
4422                                 spin_lock_irq(&phba->hbalock);
4423                                 phba->hba_flag &= ~HBA_AER_ENABLED;
4424                                 spin_unlock_irq(&phba->hbalock);
4425                                 phba->cfg_aer_support = 0;
4426                                 rc = strlen(buf);
4427                         } else
4428                                 rc = -EPERM;
4429                 } else {
4430                         phba->cfg_aer_support = 0;
4431                         rc = strlen(buf);
4432                 }
4433                 break;
4434         case 1:
4435                 if (!(phba->hba_flag & HBA_AER_ENABLED)) {
4436                         rc = pci_enable_pcie_error_reporting(phba->pcidev);
4437                         if (!rc) {
4438                                 spin_lock_irq(&phba->hbalock);
4439                                 phba->hba_flag |= HBA_AER_ENABLED;
4440                                 spin_unlock_irq(&phba->hbalock);
4441                                 phba->cfg_aer_support = 1;
4442                                 rc = strlen(buf);
4443                         } else
4444                                  rc = -EPERM;
4445                 } else {
4446                         phba->cfg_aer_support = 1;
4447                         rc = strlen(buf);
4448                 }
4449                 break;
4450         default:
4451                 rc = -EINVAL;
4452                 break;
4453         }
4454         return rc;
4455 }
4456
4457 static DEVICE_ATTR_RW(lpfc_aer_support);
4458
4459 /**
4460  * lpfc_aer_cleanup_state - Clean up aer state to the aer enabled device
4461  * @dev: class device that is converted into a Scsi_host.
4462  * @attr: device attribute, not used.
4463  * @buf: containing flag 1 for aer cleanup state.
4464  * @count: unused variable.
4465  *
4466  * Description:
4467  * If the @buf contains 1 and the device currently has the AER support
4468  * enabled, then invokes the kernel AER helper routine
4469  * pci_aer_clear_nonfatal_status() to clean up the uncorrectable
4470  * error status register.
4471  *
4472  * Notes:
4473  *
4474  * Returns:
4475  * -EINVAL if the buf does not contain the 1 or the device is not currently
4476  * enabled with the AER support.
4477  **/
4478 static ssize_t
4479 lpfc_aer_cleanup_state(struct device *dev, struct device_attribute *attr,
4480                        const char *buf, size_t count)
4481 {
4482         struct Scsi_Host  *shost = class_to_shost(dev);
4483         struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata;
4484         struct lpfc_hba   *phba = vport->phba;
4485         int val, rc = -1;
4486
4487         if (!isdigit(buf[0]))
4488                 return -EINVAL;
4489         if (sscanf(buf, "%i", &val) != 1)
4490                 return -EINVAL;
4491         if (val != 1)
4492                 return -EINVAL;
4493
4494         if (phba->hba_flag & HBA_AER_ENABLED)
4495                 rc = pci_aer_clear_nonfatal_status(phba->pcidev);
4496
4497         if (rc == 0)
4498                 return strlen(buf);
4499         else
4500                 return -EPERM;
4501 }
4502
4503 static DEVICE_ATTR(lpfc_aer_state_cleanup, S_IWUSR, NULL,
4504                    lpfc_aer_cleanup_state);
4505
4506 /**
4507  * lpfc_sriov_nr_virtfn_store - Enable the adapter for sr-iov virtual functions
4508  *
4509  * @dev: class device that is converted into a Scsi_host.
4510  * @attr: device attribute, not used.
4511  * @buf: containing the string the number of vfs to be enabled.
4512  * @count: unused variable.
4513  *
4514  * Description:
4515  * When this api is called either through user sysfs, the driver shall
4516  * try to enable or disable SR-IOV virtual functions according to the
4517  * following:
4518  *
4519  * If zero virtual function has been enabled to the physical function,
4520  * the driver shall invoke the pci enable virtual function api trying
4521  * to enable the virtual functions. If the nr_vfn provided is greater
4522  * than the maximum supported, the maximum virtual function number will
4523  * be used for invoking the api; otherwise, the nr_vfn provided shall
4524  * be used for invoking the api. If the api call returned success, the
4525  * actual number of virtual functions enabled will be set to the driver
4526  * cfg_sriov_nr_virtfn; otherwise, -EINVAL shall be returned and driver
4527  * cfg_sriov_nr_virtfn remains zero.
4528  *
4529  * If none-zero virtual functions have already been enabled to the
4530  * physical function, as reflected by the driver's cfg_sriov_nr_virtfn,
4531  * -EINVAL will be returned and the driver does nothing;
4532  *
4533  * If the nr_vfn provided is zero and none-zero virtual functions have
4534  * been enabled, as indicated by the driver's cfg_sriov_nr_virtfn, the
4535  * disabling virtual function api shall be invoded to disable all the
4536  * virtual functions and driver's cfg_sriov_nr_virtfn shall be set to
4537  * zero. Otherwise, if zero virtual function has been enabled, do
4538  * nothing.
4539  *
4540  * Returns:
4541  * length of the buf on success if val is in range the intended mode
4542  * is supported.
4543  * -EINVAL if val out of range or intended mode is not supported.
4544  **/
4545 static ssize_t
4546 lpfc_sriov_nr_virtfn_store(struct device *dev, struct device_attribute *attr,
4547                          const char *buf, size_t count)
4548 {
4549         struct Scsi_Host *shost = class_to_shost(dev);
4550         struct lpfc_vport *vport = (struct lpfc_vport *)shost->hostdata;
4551         struct lpfc_hba *phba = vport->phba;
4552         struct pci_dev *pdev = phba->pcidev;
4553         int val = 0, rc = -EINVAL;
4554
4555         /* Sanity check on user data */
4556         if (!isdigit(buf[0]))
4557                 return -EINVAL;
4558         if (sscanf(buf, "%i", &val) != 1)
4559                 return -EINVAL;
4560         if (val < 0)
4561                 return -EINVAL;
4562
4563         /* Request disabling virtual functions */
4564         if (val == 0) {
4565                 if (phba->cfg_sriov_nr_virtfn > 0) {
4566                         pci_disable_sriov(pdev);
4567                         phba->cfg_sriov_nr_virtfn = 0;
4568                 }
4569                 return strlen(buf);
4570         }
4571
4572         /* Request enabling virtual functions */
4573         if (phba->cfg_sriov_nr_virtfn > 0) {
4574                 lpfc_printf_log(phba, KERN_ERR, LOG_INIT,
4575                                 "3018 There are %d virtual functions "
4576                                 "enabled on physical function.\n",
4577                                 phba->cfg_sriov_nr_virtfn);
4578                 return -EEXIST;
4579         }
4580
4581         if (val <= LPFC_MAX_VFN_PER_PFN)
4582                 phba->cfg_sriov_nr_virtfn = val;
4583         else {
4584                 lpfc_printf_log(phba, KERN_ERR, LOG_INIT,
4585                                 "3019 Enabling %d virtual functions is not "
4586                                 "allowed.\n", val);
4587                 return -EINVAL;
4588         }
4589
4590         rc = lpfc_sli_probe_sriov_nr_virtfn(phba, phba->cfg_sriov_nr_virtfn);
4591         if (rc) {
4592                 phba->cfg_sriov_nr_virtfn = 0;
4593                 rc = -EPERM;
4594         } else
4595                 rc = strlen(buf);
4596
4597         return rc;
4598 }
4599
4600 LPFC_ATTR(sriov_nr_virtfn, LPFC_DEF_VFN_PER_PFN, 0, LPFC_MAX_VFN_PER_PFN,
4601         "Enable PCIe device SR-IOV virtual fn");
4602
4603 lpfc_param_show(sriov_nr_virtfn)
4604 static DEVICE_ATTR_RW(lpfc_sriov_nr_virtfn);
4605
4606 /**
4607  * lpfc_request_firmware_upgrade_store - Request for Linux generic firmware upgrade
4608  *
4609  * @dev: class device that is converted into a Scsi_host.
4610  * @attr: device attribute, not used.
4611  * @buf: containing the string the number of vfs to be enabled.
4612  * @count: unused variable.
4613  *
4614  * Description:
4615  *
4616  * Returns:
4617  * length of the buf on success if val is in range the intended mode
4618  * is supported.
4619  * -EINVAL if val out of range or intended mode is not supported.
4620  **/
4621 static ssize_t
4622 lpfc_request_firmware_upgrade_store(struct device *dev,
4623                                     struct device_attribute *attr,
4624                                     const char *buf, size_t count)
4625 {
4626         struct Scsi_Host *shost = class_to_shost(dev);
4627         struct lpfc_vport *vport = (struct lpfc_vport *)shost->hostdata;
4628         struct lpfc_hba *phba = vport->phba;
4629         int val = 0, rc;
4630
4631         /* Sanity check on user data */
4632         if (!isdigit(buf[0]))
4633                 return -EINVAL;
4634         if (sscanf(buf, "%i", &val) != 1)
4635                 return -EINVAL;
4636         if (val != 1)
4637                 return -EINVAL;
4638
4639         rc = lpfc_sli4_request_firmware_update(phba, RUN_FW_UPGRADE);
4640         if (rc)
4641                 rc = -EPERM;
4642         else
4643                 rc = strlen(buf);
4644         return rc;
4645 }
4646
4647 static int lpfc_req_fw_upgrade;
4648 module_param(lpfc_req_fw_upgrade, int, S_IRUGO|S_IWUSR);
4649 MODULE_PARM_DESC(lpfc_req_fw_upgrade, "Enable Linux generic firmware upgrade");
4650 lpfc_param_show(request_firmware_upgrade)
4651
4652 /**
4653  * lpfc_request_firmware_upgrade_init - Enable initial linux generic fw upgrade
4654  * @phba: lpfc_hba pointer.
4655  * @val: 0 or 1.
4656  *
4657  * Description:
4658  * Set the initial Linux generic firmware upgrade enable or disable flag.
4659  *
4660  * Returns:
4661  * zero if val saved.
4662  * -EINVAL val out of range
4663  **/
4664 static int
4665 lpfc_request_firmware_upgrade_init(struct lpfc_hba *phba, int val)
4666 {
4667         if (val >= 0 && val <= 1) {
4668                 phba->cfg_request_firmware_upgrade = val;
4669                 return 0;
4670         }
4671         return -EINVAL;
4672 }
4673 static DEVICE_ATTR(lpfc_req_fw_upgrade, S_IRUGO | S_IWUSR,
4674                    lpfc_request_firmware_upgrade_show,
4675                    lpfc_request_firmware_upgrade_store);
4676
4677 /**
4678  * lpfc_force_rscn_store
4679  *
4680  * @dev: class device that is converted into a Scsi_host.
4681  * @attr: device attribute, not used.
4682  * @buf: unused string
4683  * @count: unused variable.
4684  *
4685  * Description:
4686  * Force the switch to send a RSCN to all other NPorts in our zone
4687  * If we are direct connect pt2pt, build the RSCN command ourself
4688  * and send to the other NPort. Not supported for private loop.
4689  *
4690  * Returns:
4691  * 0      - on success
4692  * -EIO   - if command is not sent
4693  **/
4694 static ssize_t
4695 lpfc_force_rscn_store(struct device *dev, struct device_attribute *attr,
4696                       const char *buf, size_t count)
4697 {
4698         struct Scsi_Host *shost = class_to_shost(dev);
4699         struct lpfc_vport *vport = (struct lpfc_vport *)shost->hostdata;
4700         int i;
4701
4702         i = lpfc_issue_els_rscn(vport, 0);
4703         if (i)
4704                 return -EIO;
4705         return strlen(buf);
4706 }
4707
4708 /*
4709  * lpfc_force_rscn: Force an RSCN to be sent to all remote NPorts
4710  * connected to  the HBA.
4711  *
4712  * Value range is any ascii value
4713  */
4714 static int lpfc_force_rscn;
4715 module_param(lpfc_force_rscn, int, 0644);
4716 MODULE_PARM_DESC(lpfc_force_rscn,
4717                  "Force an RSCN to be sent to all remote NPorts");
4718 lpfc_param_show(force_rscn)
4719
4720 /**
4721  * lpfc_force_rscn_init - Force an RSCN to be sent to all remote NPorts
4722  * @phba: lpfc_hba pointer.
4723  * @val: unused value.
4724  *
4725  * Returns:
4726  * zero if val saved.
4727  **/
4728 static int
4729 lpfc_force_rscn_init(struct lpfc_hba *phba, int val)
4730 {
4731         return 0;
4732 }
4733 static DEVICE_ATTR_RW(lpfc_force_rscn);
4734
4735 /**
4736  * lpfc_fcp_imax_store
4737  *
4738  * @dev: class device that is converted into a Scsi_host.
4739  * @attr: device attribute, not used.
4740  * @buf: string with the number of fast-path FCP interrupts per second.
4741  * @count: unused variable.
4742  *
4743  * Description:
4744  * If val is in a valid range [636,651042], then set the adapter's
4745  * maximum number of fast-path FCP interrupts per second.
4746  *
4747  * Returns:
4748  * length of the buf on success if val is in range the intended mode
4749  * is supported.
4750  * -EINVAL if val out of range or intended mode is not supported.
4751  **/
4752 static ssize_t
4753 lpfc_fcp_imax_store(struct device *dev, struct device_attribute *attr,
4754                          const char *buf, size_t count)
4755 {
4756         struct Scsi_Host *shost = class_to_shost(dev);
4757         struct lpfc_vport *vport = (struct lpfc_vport *)shost->hostdata;
4758         struct lpfc_hba *phba = vport->phba;
4759         struct lpfc_eq_intr_info *eqi;
4760         uint32_t usdelay;
4761         int val = 0, i;
4762
4763         /* fcp_imax is only valid for SLI4 */
4764         if (phba->sli_rev != LPFC_SLI_REV4)
4765                 return -EINVAL;
4766
4767         /* Sanity check on user data */
4768         if (!isdigit(buf[0]))
4769                 return -EINVAL;
4770         if (sscanf(buf, "%i", &val) != 1)
4771                 return -EINVAL;
4772
4773         /*
4774          * Value range for the HBA is [5000,5000000]
4775          * The value for each EQ depends on how many EQs are configured.
4776          * Allow value == 0
4777          */
4778         if (val && (val < LPFC_MIN_IMAX || val > LPFC_MAX_IMAX))
4779                 return -EINVAL;
4780
4781         phba->cfg_auto_imax = (val) ? 0 : 1;
4782         if (phba->cfg_fcp_imax && !val) {
4783                 queue_delayed_work(phba->wq, &phba->eq_delay_work,
4784                                    msecs_to_jiffies(LPFC_EQ_DELAY_MSECS));
4785
4786                 for_each_present_cpu(i) {
4787                         eqi = per_cpu_ptr(phba->sli4_hba.eq_info, i);
4788                         eqi->icnt = 0;
4789                 }
4790         }
4791
4792         phba->cfg_fcp_imax = (uint32_t)val;
4793
4794         if (phba->cfg_fcp_imax)
4795                 usdelay = LPFC_SEC_TO_USEC / phba->cfg_fcp_imax;
4796         else
4797                 usdelay = 0;
4798
4799         for (i = 0; i < phba->cfg_irq_chann; i += LPFC_MAX_EQ_DELAY_EQID_CNT)
4800                 lpfc_modify_hba_eq_delay(phba, i, LPFC_MAX_EQ_DELAY_EQID_CNT,
4801                                          usdelay);
4802
4803         return strlen(buf);
4804 }
4805
4806 /*
4807 # lpfc_fcp_imax: The maximum number of fast-path FCP interrupts per second
4808 # for the HBA.
4809 #
4810 # Value range is [5,000 to 5,000,000]. Default value is 50,000.
4811 */
4812 static int lpfc_fcp_imax = LPFC_DEF_IMAX;
4813 module_param(lpfc_fcp_imax, int, S_IRUGO|S_IWUSR);
4814 MODULE_PARM_DESC(lpfc_fcp_imax,
4815             "Set the maximum number of FCP interrupts per second per HBA");
4816 lpfc_param_show(fcp_imax)
4817
4818 /**
4819  * lpfc_fcp_imax_init - Set the initial sr-iov virtual function enable
4820  * @phba: lpfc_hba pointer.
4821  * @val: link speed value.
4822  *
4823  * Description:
4824  * If val is in a valid range [636,651042], then initialize the adapter's
4825  * maximum number of fast-path FCP interrupts per second.
4826  *
4827  * Returns:
4828  * zero if val saved.
4829  * -EINVAL val out of range
4830  **/
4831 static int
4832 lpfc_fcp_imax_init(struct lpfc_hba *phba, int val)
4833 {
4834         if (phba->sli_rev != LPFC_SLI_REV4) {
4835                 phba->cfg_fcp_imax = 0;
4836                 return 0;
4837         }
4838
4839         if ((val >= LPFC_MIN_IMAX && val <= LPFC_MAX_IMAX) ||
4840             (val == 0)) {
4841                 phba->cfg_fcp_imax = val;
4842                 return 0;
4843         }
4844
4845         lpfc_printf_log(phba, KERN_ERR, LOG_INIT,
4846                         "3016 lpfc_fcp_imax: %d out of range, using default\n",
4847                         val);
4848         phba->cfg_fcp_imax = LPFC_DEF_IMAX;
4849
4850         return 0;
4851 }
4852
4853 static DEVICE_ATTR_RW(lpfc_fcp_imax);
4854
4855 /**
4856  * lpfc_cq_max_proc_limit_store
4857  *
4858  * @dev: class device that is converted into a Scsi_host.
4859  * @attr: device attribute, not used.
4860  * @buf: string with the cq max processing limit of cqes
4861  * @count: unused variable.
4862  *
4863  * Description:
4864  * If val is in a valid range, then set value on each cq
4865  *
4866  * Returns:
4867  * The length of the buf: if successful
4868  * -ERANGE: if val is not in the valid range
4869  * -EINVAL: if bad value format or intended mode is not supported.
4870  **/
4871 static ssize_t
4872 lpfc_cq_max_proc_limit_store(struct device *dev, struct device_attribute *attr,
4873                          const char *buf, size_t count)
4874 {
4875         struct Scsi_Host *shost = class_to_shost(dev);
4876         struct lpfc_vport *vport = (struct lpfc_vport *)shost->hostdata;
4877         struct lpfc_hba *phba = vport->phba;
4878         struct lpfc_queue *eq, *cq;
4879         unsigned long val;
4880         int i;
4881
4882         /* cq_max_proc_limit is only valid for SLI4 */
4883         if (phba->sli_rev != LPFC_SLI_REV4)
4884                 return -EINVAL;
4885
4886         /* Sanity check on user data */
4887         if (!isdigit(buf[0]))
4888                 return -EINVAL;
4889         if (kstrtoul(buf, 0, &val))
4890                 return -EINVAL;
4891
4892         if (val < LPFC_CQ_MIN_PROC_LIMIT || val > LPFC_CQ_MAX_PROC_LIMIT)
4893                 return -ERANGE;
4894
4895         phba->cfg_cq_max_proc_limit = (uint32_t)val;
4896
4897         /* set the values on the cq's */
4898         for (i = 0; i < phba->cfg_irq_chann; i++) {
4899                 /* Get the EQ corresponding to the IRQ vector */
4900                 eq = phba->sli4_hba.hba_eq_hdl[i].eq;
4901                 if (!eq)
4902                         continue;
4903
4904                 list_for_each_entry(cq, &eq->child_list, list)
4905                         cq->max_proc_limit = min(phba->cfg_cq_max_proc_limit,
4906                                                  cq->entry_count);
4907         }
4908
4909         return strlen(buf);
4910 }
4911
4912 /*
4913  * lpfc_cq_max_proc_limit: The maximum number CQE entries processed in an
4914  *   itteration of CQ processing.
4915  */
4916 static int lpfc_cq_max_proc_limit = LPFC_CQ_DEF_MAX_PROC_LIMIT;
4917 module_param(lpfc_cq_max_proc_limit, int, 0644);
4918 MODULE_PARM_DESC(lpfc_cq_max_proc_limit,
4919             "Set the maximum number CQEs processed in an iteration of "
4920             "CQ processing");
4921 lpfc_param_show(cq_max_proc_limit)
4922
4923 /*
4924  * lpfc_cq_poll_threshold: Set the threshold of CQE completions in a
4925  *   single handler call which should request a polled completion rather
4926  *   than re-enabling interrupts.
4927  */
4928 LPFC_ATTR_RW(cq_poll_threshold, LPFC_CQ_DEF_THRESHOLD_TO_POLL,
4929              LPFC_CQ_MIN_THRESHOLD_TO_POLL,
4930              LPFC_CQ_MAX_THRESHOLD_TO_POLL,
4931              "CQE Processing Threshold to enable Polling");
4932
4933 /**
4934  * lpfc_cq_max_proc_limit_init - Set the initial cq max_proc_limit
4935  * @phba: lpfc_hba pointer.
4936  * @val: entry limit
4937  *
4938  * Description:
4939  * If val is in a valid range, then initialize the adapter's maximum
4940  * value.
4941  *
4942  * Returns:
4943  *  Always returns 0 for success, even if value not always set to
4944  *  requested value. If value out of range or not supported, will fall
4945  *  back to default.
4946  **/
4947 static int
4948 lpfc_cq_max_proc_limit_init(struct lpfc_hba *phba, int val)
4949 {
4950         phba->cfg_cq_max_proc_limit = LPFC_CQ_DEF_MAX_PROC_LIMIT;
4951
4952         if (phba->sli_rev != LPFC_SLI_REV4)
4953                 return 0;
4954
4955         if (val >= LPFC_CQ_MIN_PROC_LIMIT && val <= LPFC_CQ_MAX_PROC_LIMIT) {
4956                 phba->cfg_cq_max_proc_limit = val;
4957                 return 0;
4958         }
4959
4960         lpfc_printf_log(phba, KERN_ERR, LOG_INIT,
4961                         "0371 lpfc_cq_max_proc_limit: %d out of range, using "
4962                         "default\n",
4963                         phba->cfg_cq_max_proc_limit);
4964
4965         return 0;
4966 }
4967
4968 static DEVICE_ATTR_RW(lpfc_cq_max_proc_limit);
4969
4970 /**
4971  * lpfc_fcp_cpu_map_show - Display current driver CPU affinity
4972  * @dev: class converted to a Scsi_host structure.
4973  * @attr: device attribute, not used.
4974  * @buf: on return contains text describing the state of the link.
4975  *
4976  * Returns: size of formatted string.
4977  **/
4978 static ssize_t
4979 lpfc_fcp_cpu_map_show(struct device *dev, struct device_attribute *attr,
4980                       char *buf)
4981 {
4982         struct Scsi_Host  *shost = class_to_shost(dev);
4983         struct lpfc_vport *vport = (struct lpfc_vport *)shost->hostdata;
4984         struct lpfc_hba   *phba = vport->phba;
4985         struct lpfc_vector_map_info *cpup;
4986         int  len = 0;
4987
4988         if ((phba->sli_rev != LPFC_SLI_REV4) ||
4989             (phba->intr_type != MSIX))
4990                 return len;
4991
4992         switch (phba->cfg_fcp_cpu_map) {
4993         case 0:
4994                 len += scnprintf(buf + len, PAGE_SIZE-len,
4995                                 "fcp_cpu_map: No mapping (%d)\n",
4996                                 phba->cfg_fcp_cpu_map);
4997                 return len;
4998         case 1:
4999                 len += scnprintf(buf + len, PAGE_SIZE-len,
5000                                 "fcp_cpu_map: HBA centric mapping (%d): "
5001                                 "%d of %d CPUs online from %d possible CPUs\n",
5002                                 phba->cfg_fcp_cpu_map, num_online_cpus(),
5003                                 num_present_cpus(),
5004                                 phba->sli4_hba.num_possible_cpu);
5005                 break;
5006         }
5007
5008         while (phba->sli4_hba.curr_disp_cpu <
5009                phba->sli4_hba.num_possible_cpu) {
5010                 cpup = &phba->sli4_hba.cpu_map[phba->sli4_hba.curr_disp_cpu];
5011
5012                 if (!cpu_present(phba->sli4_hba.curr_disp_cpu))
5013                         len += scnprintf(buf + len, PAGE_SIZE - len,
5014                                         "CPU %02d not present\n",
5015                                         phba->sli4_hba.curr_disp_cpu);
5016                 else if (cpup->eq == LPFC_VECTOR_MAP_EMPTY) {
5017                         if (cpup->hdwq == LPFC_VECTOR_MAP_EMPTY)
5018                                 len += scnprintf(
5019                                         buf + len, PAGE_SIZE - len,
5020                                         "CPU %02d hdwq None "
5021                                         "physid %d coreid %d ht %d ua %d\n",
5022                                         phba->sli4_hba.curr_disp_cpu,
5023                                         cpup->phys_id, cpup->core_id,
5024                                         (cpup->flag & LPFC_CPU_MAP_HYPER),
5025                                         (cpup->flag & LPFC_CPU_MAP_UNASSIGN));
5026                         else
5027                                 len += scnprintf(
5028                                         buf + len, PAGE_SIZE - len,
5029                                         "CPU %02d EQ None hdwq %04d "
5030                                         "physid %d coreid %d ht %d ua %d\n",
5031                                         phba->sli4_hba.curr_disp_cpu,
5032                                         cpup->hdwq, cpup->phys_id,
5033                                         cpup->core_id,
5034                                         (cpup->flag & LPFC_CPU_MAP_HYPER),
5035                                         (cpup->flag & LPFC_CPU_MAP_UNASSIGN));
5036                 } else {
5037                         if (cpup->hdwq == LPFC_VECTOR_MAP_EMPTY)
5038                                 len += scnprintf(
5039                                         buf + len, PAGE_SIZE - len,
5040                                         "CPU %02d hdwq None "
5041                                         "physid %d coreid %d ht %d ua %d IRQ %d\n",
5042                                         phba->sli4_hba.curr_disp_cpu,
5043                                         cpup->phys_id,
5044                                         cpup->core_id,
5045                                         (cpup->flag & LPFC_CPU_MAP_HYPER),
5046                                         (cpup->flag & LPFC_CPU_MAP_UNASSIGN),
5047                                         lpfc_get_irq(cpup->eq));
5048                         else
5049                                 len += scnprintf(
5050                                         buf + len, PAGE_SIZE - len,
5051                                         "CPU %02d EQ %04d hdwq %04d "
5052                                         "physid %d coreid %d ht %d ua %d IRQ %d\n",
5053                                         phba->sli4_hba.curr_disp_cpu,
5054                                         cpup->eq, cpup->hdwq, cpup->phys_id,
5055                                         cpup->core_id,
5056                                         (cpup->flag & LPFC_CPU_MAP_HYPER),
5057                                         (cpup->flag & LPFC_CPU_MAP_UNASSIGN),
5058                                         lpfc_get_irq(cpup->eq));
5059                 }
5060
5061                 phba->sli4_hba.curr_disp_cpu++;
5062
5063                 /* display max number of CPUs keeping some margin */
5064                 if (phba->sli4_hba.curr_disp_cpu <
5065                                 phba->sli4_hba.num_possible_cpu &&
5066                                 (len >= (PAGE_SIZE - 64))) {
5067                         len += scnprintf(buf + len,
5068                                         PAGE_SIZE - len, "more...\n");
5069                         break;
5070                 }
5071         }
5072
5073         if (phba->sli4_hba.curr_disp_cpu == phba->sli4_hba.num_possible_cpu)
5074                 phba->sli4_hba.curr_disp_cpu = 0;
5075
5076         return len;
5077 }
5078
5079 /**
5080  * lpfc_fcp_cpu_map_store - Change CPU affinity of driver vectors
5081  * @dev: class device that is converted into a Scsi_host.
5082  * @attr: device attribute, not used.
5083  * @buf: one or more lpfc_polling_flags values.
5084  * @count: not used.
5085  *
5086  * Returns:
5087  * -EINVAL  - Not implemented yet.
5088  **/
5089 static ssize_t
5090 lpfc_fcp_cpu_map_store(struct device *dev, struct device_attribute *attr,
5091                        const char *buf, size_t count)
5092 {
5093         return -EINVAL;
5094 }
5095
5096 /*
5097 # lpfc_fcp_cpu_map: Defines how to map CPUs to IRQ vectors
5098 # for the HBA.
5099 #
5100 # Value range is [0 to 1]. Default value is LPFC_HBA_CPU_MAP (1).
5101 #       0 - Do not affinitze IRQ vectors
5102 #       1 - Affintize HBA vectors with respect to each HBA
5103 #           (start with CPU0 for each HBA)
5104 # This also defines how Hardware Queues are mapped to specific CPUs.
5105 */
5106 static int lpfc_fcp_cpu_map = LPFC_HBA_CPU_MAP;
5107 module_param(lpfc_fcp_cpu_map, int, S_IRUGO|S_IWUSR);
5108 MODULE_PARM_DESC(lpfc_fcp_cpu_map,
5109                  "Defines how to map CPUs to IRQ vectors per HBA");
5110
5111 /**
5112  * lpfc_fcp_cpu_map_init - Set the initial sr-iov virtual function enable
5113  * @phba: lpfc_hba pointer.
5114  * @val: link speed value.
5115  *
5116  * Description:
5117  * If val is in a valid range [0-2], then affinitze the adapter's
5118  * MSIX vectors.
5119  *
5120  * Returns:
5121  * zero if val saved.
5122  * -EINVAL val out of range
5123  **/
5124 static int
5125 lpfc_fcp_cpu_map_init(struct lpfc_hba *phba, int val)
5126 {
5127         if (phba->sli_rev != LPFC_SLI_REV4) {
5128                 phba->cfg_fcp_cpu_map = 0;
5129                 return 0;
5130         }
5131
5132         if (val >= LPFC_MIN_CPU_MAP && val <= LPFC_MAX_CPU_MAP) {
5133                 phba->cfg_fcp_cpu_map = val;
5134                 return 0;
5135         }
5136
5137         lpfc_printf_log(phba, KERN_ERR, LOG_INIT,
5138                         "3326 lpfc_fcp_cpu_map: %d out of range, using "
5139                         "default\n", val);
5140         phba->cfg_fcp_cpu_map = LPFC_HBA_CPU_MAP;
5141
5142         return 0;
5143 }
5144
5145 static DEVICE_ATTR_RW(lpfc_fcp_cpu_map);
5146
5147 /*
5148 # lpfc_fcp_class:  Determines FC class to use for the FCP protocol.
5149 # Value range is [2,3]. Default value is 3.
5150 */
5151 LPFC_VPORT_ATTR_R(fcp_class, 3, 2, 3,
5152                   "Select Fibre Channel class of service for FCP sequences");
5153
5154 /*
5155 # lpfc_use_adisc: Use ADISC for FCP rediscovery instead of PLOGI. Value range
5156 # is [0,1]. Default value is 1.
5157 */
5158 LPFC_VPORT_ATTR_RW(use_adisc, 1, 0, 1,
5159                    "Use ADISC on rediscovery to authenticate FCP devices");
5160
5161 /*
5162 # lpfc_first_burst_size: First burst size to use on the NPorts
5163 # that support first burst.
5164 # Value range is [0,65536]. Default value is 0.
5165 */
5166 LPFC_VPORT_ATTR_RW(first_burst_size, 0, 0, 65536,
5167                    "First burst size for Targets that support first burst");
5168
5169 /*
5170 * lpfc_nvmet_fb_size: NVME Target mode supported first burst size.
5171 * When the driver is configured as an NVME target, this value is
5172 * communicated to the NVME initiator in the PRLI response.  It is
5173 * used only when the lpfc_nvme_enable_fb and lpfc_nvmet_support
5174 * parameters are set and the target is sending the PRLI RSP.
5175 * Parameter supported on physical port only - no NPIV support.
5176 * Value range is [0,65536]. Default value is 0.
5177 */
5178 LPFC_ATTR_RW(nvmet_fb_size, 0, 0, 65536,
5179              "NVME Target mode first burst size in 512B increments.");
5180
5181 /*
5182  * lpfc_nvme_enable_fb: Enable NVME first burst on I and T functions.
5183  * For the Initiator (I), enabling this parameter means that an NVMET
5184  * PRLI response with FBA enabled and an FB_SIZE set to a nonzero value will be
5185  * processed by the initiator for subsequent NVME FCP IO.
5186  * Currently, this feature is not supported on the NVME target
5187  * Value range is [0,1]. Default value is 0 (disabled).
5188  */
5189 LPFC_ATTR_RW(nvme_enable_fb, 0, 0, 1,
5190              "Enable First Burst feature for NVME Initiator.");
5191
5192 /*
5193 # lpfc_max_scsicmpl_time: Use scsi command completion time to control I/O queue
5194 # depth. Default value is 0. When the value of this parameter is zero the
5195 # SCSI command completion time is not used for controlling I/O queue depth. When
5196 # the parameter is set to a non-zero value, the I/O queue depth is controlled
5197 # to limit the I/O completion time to the parameter value.
5198 # The value is set in milliseconds.
5199 */
5200 LPFC_VPORT_ATTR(max_scsicmpl_time, 0, 0, 60000,
5201         "Use command completion time to control queue depth");
5202
5203 lpfc_vport_param_show(max_scsicmpl_time);
5204 static int
5205 lpfc_max_scsicmpl_time_set(struct lpfc_vport *vport, int val)
5206 {
5207         struct Scsi_Host *shost = lpfc_shost_from_vport(vport);
5208         struct lpfc_nodelist *ndlp, *next_ndlp;
5209
5210         if (val == vport->cfg_max_scsicmpl_time)
5211                 return 0;
5212         if ((val < 0) || (val > 60000))
5213                 return -EINVAL;
5214         vport->cfg_max_scsicmpl_time = val;
5215
5216         spin_lock_irq(shost->host_lock);
5217         list_for_each_entry_safe(ndlp, next_ndlp, &vport->fc_nodes, nlp_listp) {
5218                 if (ndlp->nlp_state == NLP_STE_UNUSED_NODE)
5219                         continue;
5220                 ndlp->cmd_qdepth = vport->cfg_tgt_queue_depth;
5221         }
5222         spin_unlock_irq(shost->host_lock);
5223         return 0;
5224 }
5225 lpfc_vport_param_store(max_scsicmpl_time);
5226 static DEVICE_ATTR_RW(lpfc_max_scsicmpl_time);
5227
5228 /*
5229 # lpfc_ack0: Use ACK0, instead of ACK1 for class 2 acknowledgement. Value
5230 # range is [0,1]. Default value is 0.
5231 */
5232 LPFC_ATTR_R(ack0, 0, 0, 1, "Enable ACK0 support");
5233
5234 /*
5235 # lpfc_xri_rebalancing: enable or disable XRI rebalancing feature
5236 # range is [0,1]. Default value is 1.
5237 */
5238 LPFC_ATTR_R(xri_rebalancing, 1, 0, 1, "Enable/Disable XRI rebalancing");
5239
5240 /*
5241  * lpfc_io_sched: Determine scheduling algrithmn for issuing FCP cmds
5242  * range is [0,1]. Default value is 0.
5243  * For [0], FCP commands are issued to Work Queues based on upper layer
5244  * hardware queue index.
5245  * For [1], FCP commands are issued to a Work Queue associated with the
5246  *          current CPU.
5247  *
5248  * LPFC_FCP_SCHED_BY_HDWQ == 0
5249  * LPFC_FCP_SCHED_BY_CPU == 1
5250  *
5251  * The driver dynamically sets this to 1 (BY_CPU) if it's able to set up cpu
5252  * affinity for FCP/NVME I/Os through Work Queues associated with the current
5253  * CPU. Otherwise, the default 0 (Round Robin) scheduling of FCP/NVME I/Os
5254  * through WQs will be used.
5255  */
5256 LPFC_ATTR_RW(fcp_io_sched, LPFC_FCP_SCHED_BY_CPU,
5257              LPFC_FCP_SCHED_BY_HDWQ,
5258              LPFC_FCP_SCHED_BY_CPU,
5259              "Determine scheduling algorithm for "
5260              "issuing commands [0] - Hardware Queue, [1] - Current CPU");
5261
5262 /*
5263  * lpfc_ns_query: Determine algrithmn for NameServer queries after RSCN
5264  * range is [0,1]. Default value is 0.
5265  * For [0], GID_FT is used for NameServer queries after RSCN (default)
5266  * For [1], GID_PT is used for NameServer queries after RSCN
5267  *
5268  */
5269 LPFC_ATTR_RW(ns_query, LPFC_NS_QUERY_GID_FT,
5270              LPFC_NS_QUERY_GID_FT, LPFC_NS_QUERY_GID_PT,
5271              "Determine algorithm NameServer queries after RSCN "
5272              "[0] - GID_FT, [1] - GID_PT");
5273
5274 /*
5275 # lpfc_fcp2_no_tgt_reset: Determine bus reset behavior
5276 # range is [0,1]. Default value is 0.
5277 # For [0], bus reset issues target reset to ALL devices
5278 # For [1], bus reset issues target reset to non-FCP2 devices
5279 */
5280 LPFC_ATTR_RW(fcp2_no_tgt_reset, 0, 0, 1, "Determine bus reset behavior for "
5281              "FCP2 devices [0] - issue tgt reset, [1] - no tgt reset");
5282
5283
5284 /*
5285 # lpfc_cr_delay & lpfc_cr_count: Default values for I/O colaesing
5286 # cr_delay (msec) or cr_count outstanding commands. cr_delay can take
5287 # value [0,63]. cr_count can take value [1,255]. Default value of cr_delay
5288 # is 0. Default value of cr_count is 1. The cr_count feature is disabled if
5289 # cr_delay is set to 0.
5290 */
5291 LPFC_ATTR_RW(cr_delay, 0, 0, 63, "A count of milliseconds after which an "
5292                 "interrupt response is generated");
5293
5294 LPFC_ATTR_RW(cr_count, 1, 1, 255, "A count of I/O completions after which an "
5295                 "interrupt response is generated");
5296
5297 /*
5298 # lpfc_multi_ring_support:  Determines how many rings to spread available
5299 # cmd/rsp IOCB entries across.
5300 # Value range is [1,2]. Default value is 1.
5301 */
5302 LPFC_ATTR_R(multi_ring_support, 1, 1, 2, "Determines number of primary "
5303                 "SLI rings to spread IOCB entries across");
5304
5305 /*
5306 # lpfc_multi_ring_rctl:  If lpfc_multi_ring_support is enabled, this
5307 # identifies what rctl value to configure the additional ring for.
5308 # Value range is [1,0xff]. Default value is 4 (Unsolicated Data).
5309 */
5310 LPFC_ATTR_R(multi_ring_rctl, FC_RCTL_DD_UNSOL_DATA, 1,
5311              255, "Identifies RCTL for additional ring configuration");
5312
5313 /*
5314 # lpfc_multi_ring_type:  If lpfc_multi_ring_support is enabled, this
5315 # identifies what type value to configure the additional ring for.
5316 # Value range is [1,0xff]. Default value is 5 (LLC/SNAP).
5317 */
5318 LPFC_ATTR_R(multi_ring_type, FC_TYPE_IP, 1,
5319              255, "Identifies TYPE for additional ring configuration");
5320
5321 /*
5322 # lpfc_enable_SmartSAN: Sets up FDMI support for SmartSAN
5323 #       0  = SmartSAN functionality disabled (default)
5324 #       1  = SmartSAN functionality enabled
5325 # This parameter will override the value of lpfc_fdmi_on module parameter.
5326 # Value range is [0,1]. Default value is 0.
5327 */
5328 LPFC_ATTR_R(enable_SmartSAN, 0, 0, 1, "Enable SmartSAN functionality");
5329
5330 /*
5331 # lpfc_fdmi_on: Controls FDMI support.
5332 #       0       No FDMI support
5333 #       1       Traditional FDMI support (default)
5334 # Traditional FDMI support means the driver will assume FDMI-2 support;
5335 # however, if that fails, it will fallback to FDMI-1.
5336 # If lpfc_enable_SmartSAN is set to 1, the driver ignores lpfc_fdmi_on.
5337 # If lpfc_enable_SmartSAN is set 0, the driver uses the current value of
5338 # lpfc_fdmi_on.
5339 # Value range [0,1]. Default value is 1.
5340 */
5341 LPFC_ATTR_R(fdmi_on, 1, 0, 1, "Enable FDMI support");
5342
5343 /*
5344 # Specifies the maximum number of ELS cmds we can have outstanding (for
5345 # discovery). Value range is [1,64]. Default value = 32.
5346 */
5347 LPFC_VPORT_ATTR(discovery_threads, 32, 1, 64, "Maximum number of ELS commands "
5348                  "during discovery");
5349
5350 /*
5351 # lpfc_max_luns: maximum allowed LUN ID. This is the highest LUN ID that
5352 #    will be scanned by the SCSI midlayer when sequential scanning is
5353 #    used; and is also the highest LUN ID allowed when the SCSI midlayer
5354 #    parses REPORT_LUN responses. The lpfc driver has no LUN count or
5355 #    LUN ID limit, but the SCSI midlayer requires this field for the uses
5356 #    above. The lpfc driver limits the default value to 255 for two reasons.
5357 #    As it bounds the sequential scan loop, scanning for thousands of luns
5358 #    on a target can take minutes of wall clock time.  Additionally,
5359 #    there are FC targets, such as JBODs, that only recognize 8-bits of
5360 #    LUN ID. When they receive a value greater than 8 bits, they chop off
5361 #    the high order bits. In other words, they see LUN IDs 0, 256, 512,
5362 #    and so on all as LUN ID 0. This causes the linux kernel, which sees
5363 #    valid responses at each of the LUN IDs, to believe there are multiple
5364 #    devices present, when in fact, there is only 1.
5365 #    A customer that is aware of their target behaviors, and the results as
5366 #    indicated above, is welcome to increase the lpfc_max_luns value.
5367 #    As mentioned, this value is not used by the lpfc driver, only the
5368 #    SCSI midlayer.
5369 # Value range is [0,65535]. Default value is 255.
5370 # NOTE: The SCSI layer might probe all allowed LUN on some old targets.
5371 */
5372 LPFC_VPORT_ULL_ATTR_R(max_luns, 255, 0, 65535, "Maximum allowed LUN ID");
5373
5374 /*
5375 # lpfc_poll_tmo: .Milliseconds driver will wait between polling FCP ring.
5376 # Value range is [1,255], default value is 10.
5377 */
5378 LPFC_ATTR_RW(poll_tmo, 10, 1, 255,
5379              "Milliseconds driver will wait between polling FCP ring");
5380
5381 /*
5382 # lpfc_task_mgmt_tmo: Maximum time to wait for task management commands
5383 # to complete in seconds. Value range is [5,180], default value is 60.
5384 */
5385 LPFC_ATTR_RW(task_mgmt_tmo, 60, 5, 180,
5386              "Maximum time to wait for task management commands to complete");
5387 /*
5388 # lpfc_use_msi: Use MSI (Message Signaled Interrupts) in systems that
5389 #               support this feature
5390 #       0  = MSI disabled
5391 #       1  = MSI enabled
5392 #       2  = MSI-X enabled (default)
5393 # Value range is [0,2]. Default value is 2.
5394 */
5395 LPFC_ATTR_R(use_msi, 2, 0, 2, "Use Message Signaled Interrupts (1) or "
5396             "MSI-X (2), if possible");
5397
5398 /*
5399  * lpfc_nvme_oas: Use the oas bit when sending NVME/NVMET IOs
5400  *
5401  *      0  = NVME OAS disabled
5402  *      1  = NVME OAS enabled
5403  *
5404  * Value range is [0,1]. Default value is 0.
5405  */
5406 LPFC_ATTR_RW(nvme_oas, 0, 0, 1,
5407              "Use OAS bit on NVME IOs");
5408
5409 /*
5410  * lpfc_nvme_embed_cmd: Use the oas bit when sending NVME/NVMET IOs
5411  *
5412  *      0  = Put NVME Command in SGL
5413  *      1  = Embed NVME Command in WQE (unless G7)
5414  *      2 =  Embed NVME Command in WQE (force)
5415  *
5416  * Value range is [0,2]. Default value is 1.
5417  */
5418 LPFC_ATTR_RW(nvme_embed_cmd, 1, 0, 2,
5419              "Embed NVME Command in WQE");
5420
5421 /*
5422  * lpfc_fcp_mq_threshold: Set the maximum number of Hardware Queues
5423  * the driver will advertise it supports to the SCSI layer.
5424  *
5425  *      0    = Set nr_hw_queues by the number of CPUs or HW queues.
5426  *      1,256 = Manually specify nr_hw_queue value to be advertised,
5427  *
5428  * Value range is [0,256]. Default value is 8.
5429  */
5430 LPFC_ATTR_R(fcp_mq_threshold, LPFC_FCP_MQ_THRESHOLD_DEF,
5431             LPFC_FCP_MQ_THRESHOLD_MIN, LPFC_FCP_MQ_THRESHOLD_MAX,
5432             "Set the number of SCSI Queues advertised");
5433
5434 /*
5435  * lpfc_hdw_queue: Set the number of Hardware Queues the driver
5436  * will advertise it supports to the NVME and  SCSI layers. This also
5437  * will map to the number of CQ/WQ pairs the driver will create.
5438  *
5439  * The NVME Layer will try to create this many, plus 1 administrative
5440  * hardware queue. The administrative queue will always map to WQ 0
5441  * A hardware IO queue maps (qidx) to a specific driver CQ/WQ.
5442  *
5443  *      0    = Configure the number of hdw queues to the number of active CPUs.
5444  *      1,256 = Manually specify how many hdw queues to use.
5445  *
5446  * Value range is [0,256]. Default value is 0.
5447  */
5448 LPFC_ATTR_R(hdw_queue,
5449             LPFC_HBA_HDWQ_DEF,
5450             LPFC_HBA_HDWQ_MIN, LPFC_HBA_HDWQ_MAX,
5451             "Set the number of I/O Hardware Queues");
5452
5453 #if IS_ENABLED(CONFIG_X86)
5454 /**
5455  * lpfc_cpumask_irq_mode_init - initalizes cpumask of phba based on
5456  *                              irq_chann_mode
5457  * @phba: Pointer to HBA context object.
5458  **/
5459 static void
5460 lpfc_cpumask_irq_mode_init(struct lpfc_hba *phba)
5461 {
5462         unsigned int cpu, first_cpu, numa_node = NUMA_NO_NODE;
5463         const struct cpumask *sibling_mask;
5464         struct cpumask *aff_mask = &phba->sli4_hba.irq_aff_mask;
5465
5466         cpumask_clear(aff_mask);
5467
5468         if (phba->irq_chann_mode == NUMA_MODE) {
5469                 /* Check if we're a NUMA architecture */
5470                 numa_node = dev_to_node(&phba->pcidev->dev);
5471                 if (numa_node == NUMA_NO_NODE) {
5472                         phba->irq_chann_mode = NORMAL_MODE;
5473                         return;
5474                 }
5475         }
5476
5477         for_each_possible_cpu(cpu) {
5478                 switch (phba->irq_chann_mode) {
5479                 case NUMA_MODE:
5480                         if (cpu_to_node(cpu) == numa_node)
5481                                 cpumask_set_cpu(cpu, aff_mask);
5482                         break;
5483                 case NHT_MODE:
5484                         sibling_mask = topology_sibling_cpumask(cpu);
5485                         first_cpu = cpumask_first(sibling_mask);
5486                         if (first_cpu < nr_cpu_ids)
5487                                 cpumask_set_cpu(first_cpu, aff_mask);
5488                         break;
5489                 default:
5490                         break;
5491                 }
5492         }
5493 }
5494 #endif
5495
5496 static void
5497 lpfc_assign_default_irq_chann(struct lpfc_hba *phba)
5498 {
5499 #if IS_ENABLED(CONFIG_X86)
5500         switch (boot_cpu_data.x86_vendor) {
5501         case X86_VENDOR_AMD:
5502                 /* If AMD architecture, then default is NUMA_MODE */
5503                 phba->irq_chann_mode = NUMA_MODE;
5504                 break;
5505         case X86_VENDOR_INTEL:
5506                 /* If Intel architecture, then default is no hyperthread mode */
5507                 phba->irq_chann_mode = NHT_MODE;
5508                 break;
5509         default:
5510                 phba->irq_chann_mode = NORMAL_MODE;
5511                 break;
5512         }
5513         lpfc_cpumask_irq_mode_init(phba);
5514 #else
5515         phba->irq_chann_mode = NORMAL_MODE;
5516 #endif
5517 }
5518
5519 /*
5520  * lpfc_irq_chann: Set the number of IRQ vectors that are available
5521  * for Hardware Queues to utilize.  This also will map to the number
5522  * of EQ / MSI-X vectors the driver will create. This should never be
5523  * more than the number of Hardware Queues
5524  *
5525  *      0               = Configure number of IRQ Channels to:
5526  *                        if AMD architecture, number of CPUs on HBA's NUMA node
5527  *                        if Intel architecture, number of physical CPUs.
5528  *                        otherwise, number of active CPUs.
5529  *      [1,256]         = Manually specify how many IRQ Channels to use.
5530  *
5531  * Value range is [0,256]. Default value is [0].
5532  */
5533 static uint lpfc_irq_chann = LPFC_IRQ_CHANN_DEF;
5534 module_param(lpfc_irq_chann, uint, 0444);
5535 MODULE_PARM_DESC(lpfc_irq_chann, "Set number of interrupt vectors to allocate");
5536
5537 /* lpfc_irq_chann_init - Set the hba irq_chann initial value
5538  * @phba: lpfc_hba pointer.
5539  * @val: contains the initial value
5540  *
5541  * Description:
5542  * Validates the initial value is within range and assigns it to the
5543  * adapter. If not in range, an error message is posted and the
5544  * default value is assigned.
5545  *
5546  * Returns:
5547  * zero if value is in range and is set
5548  * -EINVAL if value was out of range
5549  **/
5550 static int
5551 lpfc_irq_chann_init(struct lpfc_hba *phba, uint32_t val)
5552 {
5553         const struct cpumask *aff_mask;
5554
5555         if (phba->cfg_use_msi != 2) {
5556                 lpfc_printf_log(phba, KERN_INFO, LOG_INIT,
5557                                 "8532 use_msi = %u ignoring cfg_irq_numa\n",
5558                                 phba->cfg_use_msi);
5559                 phba->irq_chann_mode = NORMAL_MODE;
5560                 phba->cfg_irq_chann = LPFC_IRQ_CHANN_DEF;
5561                 return 0;
5562         }
5563
5564         /* Check if default setting was passed */
5565         if (val == LPFC_IRQ_CHANN_DEF &&
5566             phba->cfg_hdw_queue == LPFC_HBA_HDWQ_DEF &&
5567             phba->sli_rev == LPFC_SLI_REV4)
5568                 lpfc_assign_default_irq_chann(phba);
5569
5570         if (phba->irq_chann_mode != NORMAL_MODE) {
5571                 aff_mask = &phba->sli4_hba.irq_aff_mask;
5572
5573                 if (cpumask_empty(aff_mask)) {
5574                         lpfc_printf_log(phba, KERN_INFO, LOG_INIT,
5575                                         "8533 Could not identify CPUS for "
5576                                         "mode %d, ignoring\n",
5577                                         phba->irq_chann_mode);
5578                         phba->irq_chann_mode = NORMAL_MODE;
5579                         phba->cfg_irq_chann = LPFC_IRQ_CHANN_DEF;
5580                 } else {
5581                         phba->cfg_irq_chann = cpumask_weight(aff_mask);
5582
5583                         /* If no hyperthread mode, then set hdwq count to
5584                          * aff_mask weight as well
5585                          */
5586                         if (phba->irq_chann_mode == NHT_MODE)
5587                                 phba->cfg_hdw_queue = phba->cfg_irq_chann;
5588
5589                         lpfc_printf_log(phba, KERN_INFO, LOG_INIT,
5590                                         "8543 lpfc_irq_chann set to %u "
5591                                         "(mode: %d)\n", phba->cfg_irq_chann,
5592                                         phba->irq_chann_mode);
5593                 }
5594         } else {
5595                 if (val > LPFC_IRQ_CHANN_MAX) {
5596                         lpfc_printf_log(phba, KERN_INFO, LOG_INIT,
5597                                         "8545 lpfc_irq_chann attribute cannot "
5598                                         "be set to %u, allowed range is "
5599                                         "[%u,%u]\n",
5600                                         val,
5601                                         LPFC_IRQ_CHANN_MIN,
5602                                         LPFC_IRQ_CHANN_MAX);
5603                         phba->cfg_irq_chann = LPFC_IRQ_CHANN_DEF;
5604                         return -EINVAL;
5605                 }
5606                 if (phba->sli_rev == LPFC_SLI_REV4) {
5607                         phba->cfg_irq_chann = val;
5608                 } else {
5609                         phba->cfg_irq_chann = 2;
5610                         phba->cfg_hdw_queue = 1;
5611                 }
5612         }
5613
5614         return 0;
5615 }
5616
5617 /**
5618  * lpfc_irq_chann_show - Display value of irq_chann
5619  * @dev: class converted to a Scsi_host structure.
5620  * @attr: device attribute, not used.
5621  * @buf: on return contains a string with the list sizes
5622  *
5623  * Returns: size of formatted string.
5624  **/
5625 static ssize_t
5626 lpfc_irq_chann_show(struct device *dev, struct device_attribute *attr,
5627                     char *buf)
5628 {
5629         struct Scsi_Host *shost = class_to_shost(dev);
5630         struct lpfc_vport *vport = (struct lpfc_vport *)shost->hostdata;
5631         struct lpfc_hba *phba = vport->phba;
5632
5633         return scnprintf(buf, PAGE_SIZE, "%u\n", phba->cfg_irq_chann);
5634 }
5635
5636 static DEVICE_ATTR_RO(lpfc_irq_chann);
5637
5638 /*
5639 # lpfc_enable_hba_reset: Allow or prevent HBA resets to the hardware.
5640 #       0  = HBA resets disabled
5641 #       1  = HBA resets enabled (default)
5642 #       2  = HBA reset via PCI bus reset enabled
5643 # Value range is [0,2]. Default value is 1.
5644 */
5645 LPFC_ATTR_RW(enable_hba_reset, 1, 0, 2, "Enable HBA resets from the driver.");
5646
5647 /*
5648 # lpfc_enable_hba_heartbeat: Disable HBA heartbeat timer..
5649 #       0  = HBA Heartbeat disabled
5650 #       1  = HBA Heartbeat enabled (default)
5651 # Value range is [0,1]. Default value is 1.
5652 */
5653 LPFC_ATTR_R(enable_hba_heartbeat, 0, 0, 1, "Enable HBA Heartbeat.");
5654
5655 /*
5656 # lpfc_EnableXLane: Enable Express Lane Feature
5657 #      0x0   Express Lane Feature disabled
5658 #      0x1   Express Lane Feature enabled
5659 # Value range is [0,1]. Default value is 0.
5660 */
5661 LPFC_ATTR_R(EnableXLane, 0, 0, 1, "Enable Express Lane Feature.");
5662
5663 /*
5664 # lpfc_XLanePriority:  Define CS_CTL priority for Express Lane Feature
5665 #       0x0 - 0x7f  = CS_CTL field in FC header (high 7 bits)
5666 # Value range is [0x0,0x7f]. Default value is 0
5667 */
5668 LPFC_ATTR_RW(XLanePriority, 0, 0x0, 0x7f, "CS_CTL for Express Lane Feature.");
5669
5670 /*
5671 # lpfc_enable_bg: Enable BlockGuard (Emulex's Implementation of T10-DIF)
5672 #       0  = BlockGuard disabled (default)
5673 #       1  = BlockGuard enabled
5674 # Value range is [0,1]. Default value is 0.
5675 */
5676 LPFC_ATTR_R(enable_bg, 0, 0, 1, "Enable BlockGuard Support");
5677
5678 /*
5679 # lpfc_prot_mask:
5680 #       - Bit mask of host protection capabilities used to register with the
5681 #         SCSI mid-layer
5682 #       - Only meaningful if BG is turned on (lpfc_enable_bg=1).
5683 #       - Allows you to ultimately specify which profiles to use
5684 #       - Default will result in registering capabilities for all profiles.
5685 #       - SHOST_DIF_TYPE1_PROTECTION    1
5686 #               HBA supports T10 DIF Type 1: HBA to Target Type 1 Protection
5687 #       - SHOST_DIX_TYPE0_PROTECTION    8
5688 #               HBA supports DIX Type 0: Host to HBA protection only
5689 #       - SHOST_DIX_TYPE1_PROTECTION    16
5690 #               HBA supports DIX Type 1: Host to HBA  Type 1 protection
5691 #
5692 */
5693 LPFC_ATTR(prot_mask,
5694         (SHOST_DIF_TYPE1_PROTECTION |
5695         SHOST_DIX_TYPE0_PROTECTION |
5696         SHOST_DIX_TYPE1_PROTECTION),
5697         0,
5698         (SHOST_DIF_TYPE1_PROTECTION |
5699         SHOST_DIX_TYPE0_PROTECTION |
5700         SHOST_DIX_TYPE1_PROTECTION),
5701         "T10-DIF host protection capabilities mask");
5702
5703 /*
5704 # lpfc_prot_guard:
5705 #       - Bit mask of protection guard types to register with the SCSI mid-layer
5706 #       - Guard types are currently either 1) T10-DIF CRC 2) IP checksum
5707 #       - Allows you to ultimately specify which profiles to use
5708 #       - Default will result in registering capabilities for all guard types
5709 #
5710 */
5711 LPFC_ATTR(prot_guard,
5712         SHOST_DIX_GUARD_IP, SHOST_DIX_GUARD_CRC, SHOST_DIX_GUARD_IP,
5713         "T10-DIF host protection guard type");
5714
5715 /*
5716  * Delay initial NPort discovery when Clean Address bit is cleared in
5717  * FLOGI/FDISC accept and FCID/Fabric name/Fabric portname is changed.
5718  * This parameter can have value 0 or 1.
5719  * When this parameter is set to 0, no delay is added to the initial
5720  * discovery.
5721  * When this parameter is set to non-zero value, initial Nport discovery is
5722  * delayed by ra_tov seconds when Clean Address bit is cleared in FLOGI/FDISC
5723  * accept and FCID/Fabric name/Fabric portname is changed.
5724  * Driver always delay Nport discovery for subsequent FLOGI/FDISC completion
5725  * when Clean Address bit is cleared in FLOGI/FDISC
5726  * accept and FCID/Fabric name/Fabric portname is changed.
5727  * Default value is 0.
5728  */
5729 LPFC_ATTR(delay_discovery, 0, 0, 1,
5730         "Delay NPort discovery when Clean Address bit is cleared.");
5731
5732 /*
5733  * lpfc_sg_seg_cnt - Initial Maximum DMA Segment Count
5734  * This value can be set to values between 64 and 4096. The default value
5735  * is 64, but may be increased to allow for larger Max I/O sizes. The scsi
5736  * and nvme layers will allow I/O sizes up to (MAX_SEG_COUNT * SEG_SIZE).
5737  * Because of the additional overhead involved in setting up T10-DIF,
5738  * this parameter will be limited to 128 if BlockGuard is enabled under SLI4
5739  * and will be limited to 512 if BlockGuard is enabled under SLI3.
5740  */
5741 static uint lpfc_sg_seg_cnt = LPFC_DEFAULT_SG_SEG_CNT;
5742 module_param(lpfc_sg_seg_cnt, uint, 0444);
5743 MODULE_PARM_DESC(lpfc_sg_seg_cnt, "Max Scatter Gather Segment Count");
5744
5745 /**
5746  * lpfc_sg_seg_cnt_show - Display the scatter/gather list sizes
5747  *    configured for the adapter
5748  * @dev: class converted to a Scsi_host structure.
5749  * @attr: device attribute, not used.
5750  * @buf: on return contains a string with the list sizes
5751  *
5752  * Returns: size of formatted string.
5753  **/
5754 static ssize_t
5755 lpfc_sg_seg_cnt_show(struct device *dev, struct device_attribute *attr,
5756                      char *buf)
5757 {
5758         struct Scsi_Host  *shost = class_to_shost(dev);
5759         struct lpfc_vport *vport = (struct lpfc_vport *)shost->hostdata;
5760         struct lpfc_hba   *phba = vport->phba;
5761         int len;
5762
5763         len = scnprintf(buf, PAGE_SIZE, "SGL sz: %d  total SGEs: %d\n",
5764                        phba->cfg_sg_dma_buf_size, phba->cfg_total_seg_cnt);
5765
5766         len += scnprintf(buf + len, PAGE_SIZE - len,
5767                         "Cfg: %d  SCSI: %d  NVME: %d\n",
5768                         phba->cfg_sg_seg_cnt, phba->cfg_scsi_seg_cnt,
5769                         phba->cfg_nvme_seg_cnt);
5770         return len;
5771 }
5772
5773 static DEVICE_ATTR_RO(lpfc_sg_seg_cnt);
5774
5775 /**
5776  * lpfc_sg_seg_cnt_init - Set the hba sg_seg_cnt initial value
5777  * @phba: lpfc_hba pointer.
5778  * @val: contains the initial value
5779  *
5780  * Description:
5781  * Validates the initial value is within range and assigns it to the
5782  * adapter. If not in range, an error message is posted and the
5783  * default value is assigned.
5784  *
5785  * Returns:
5786  * zero if value is in range and is set
5787  * -EINVAL if value was out of range
5788  **/
5789 static int
5790 lpfc_sg_seg_cnt_init(struct lpfc_hba *phba, int val)
5791 {
5792         if (val >= LPFC_MIN_SG_SEG_CNT && val <= LPFC_MAX_SG_SEG_CNT) {
5793                 phba->cfg_sg_seg_cnt = val;
5794                 return 0;
5795         }
5796         lpfc_printf_log(phba, KERN_ERR, LOG_INIT,
5797                         "0409 lpfc_sg_seg_cnt attribute cannot be set to %d, "
5798                         "allowed range is [%d, %d]\n",
5799                         val, LPFC_MIN_SG_SEG_CNT, LPFC_MAX_SG_SEG_CNT);
5800         phba->cfg_sg_seg_cnt = LPFC_DEFAULT_SG_SEG_CNT;
5801         return -EINVAL;
5802 }
5803
5804 /*
5805  * lpfc_enable_mds_diags: Enable MDS Diagnostics
5806  *       0  = MDS Diagnostics disabled (default)
5807  *       1  = MDS Diagnostics enabled
5808  * Value range is [0,1]. Default value is 0.
5809  */
5810 LPFC_ATTR_RW(enable_mds_diags, 0, 0, 1, "Enable MDS Diagnostics");
5811
5812 /*
5813  * lpfc_ras_fwlog_buffsize: Firmware logging host buffer size
5814  *      0 = Disable firmware logging (default)
5815  *      [1-4] = Multiple of 1/4th Mb of host memory for FW logging
5816  * Value range [0..4]. Default value is 0
5817  */
5818 LPFC_ATTR(ras_fwlog_buffsize, 0, 0, 4, "Host memory for FW logging");
5819 lpfc_param_show(ras_fwlog_buffsize);
5820
5821 static ssize_t
5822 lpfc_ras_fwlog_buffsize_set(struct lpfc_hba  *phba, uint val)
5823 {
5824         int ret = 0;
5825         enum ras_state state;
5826
5827         if (!lpfc_rangecheck(val, 0, 4))
5828                 return -EINVAL;
5829
5830         if (phba->cfg_ras_fwlog_buffsize == val)
5831                 return 0;
5832
5833         if (phba->cfg_ras_fwlog_func != PCI_FUNC(phba->pcidev->devfn))
5834                 return -EINVAL;
5835
5836         spin_lock_irq(&phba->hbalock);
5837         state = phba->ras_fwlog.state;
5838         spin_unlock_irq(&phba->hbalock);
5839
5840         if (state == REG_INPROGRESS) {
5841                 lpfc_printf_log(phba, KERN_ERR, LOG_SLI, "6147 RAS Logging "
5842                                 "registration is in progress\n");
5843                 return -EBUSY;
5844         }
5845
5846         /* For disable logging: stop the logs and free the DMA.
5847          * For ras_fwlog_buffsize size change we still need to free and
5848          * reallocate the DMA in lpfc_sli4_ras_fwlog_init.
5849          */
5850         phba->cfg_ras_fwlog_buffsize = val;
5851         if (state == ACTIVE) {
5852                 lpfc_ras_stop_fwlog(phba);
5853                 lpfc_sli4_ras_dma_free(phba);
5854         }
5855
5856         lpfc_sli4_ras_init(phba);
5857         if (phba->ras_fwlog.ras_enabled)
5858                 ret = lpfc_sli4_ras_fwlog_init(phba, phba->cfg_ras_fwlog_level,
5859                                                LPFC_RAS_ENABLE_LOGGING);
5860         return ret;
5861 }
5862
5863 lpfc_param_store(ras_fwlog_buffsize);
5864 static DEVICE_ATTR_RW(lpfc_ras_fwlog_buffsize);
5865
5866 /*
5867  * lpfc_ras_fwlog_level: Firmware logging verbosity level
5868  * Valid only if firmware logging is enabled
5869  * 0(Least Verbosity) 4 (most verbosity)
5870  * Value range is [0..4]. Default value is 0
5871  */
5872 LPFC_ATTR_RW(ras_fwlog_level, 0, 0, 4, "Firmware Logging Level");
5873
5874 /*
5875  * lpfc_ras_fwlog_func: Firmware logging enabled on function number
5876  * Default function which has RAS support : 0
5877  * Value Range is [0..7].
5878  * FW logging is a global action and enablement is via a specific
5879  * port.
5880  */
5881 LPFC_ATTR_RW(ras_fwlog_func, 0, 0, 7, "Firmware Logging Enabled on Function");
5882
5883 /*
5884  * lpfc_enable_bbcr: Enable BB Credit Recovery
5885  *       0  = BB Credit Recovery disabled
5886  *       1  = BB Credit Recovery enabled (default)
5887  * Value range is [0,1]. Default value is 1.
5888  */
5889 LPFC_BBCR_ATTR_RW(enable_bbcr, 1, 0, 1, "Enable BBC Recovery");
5890
5891 /* Signaling module parameters */
5892 int lpfc_fabric_cgn_frequency = 100; /* 100 ms default */
5893 module_param(lpfc_fabric_cgn_frequency, int, 0444);
5894 MODULE_PARM_DESC(lpfc_fabric_cgn_frequency, "Congestion signaling fabric freq");
5895
5896 int lpfc_acqe_cgn_frequency = 10; /* 10 sec default */
5897 module_param(lpfc_acqe_cgn_frequency, int, 0444);
5898 MODULE_PARM_DESC(lpfc_acqe_cgn_frequency, "Congestion signaling ACQE freq");
5899
5900 int lpfc_use_cgn_signal = 1; /* 0 - only use FPINs, 1 - Use signals if avail  */
5901 module_param(lpfc_use_cgn_signal, int, 0444);
5902 MODULE_PARM_DESC(lpfc_use_cgn_signal, "Use Congestion signaling if available");
5903
5904 /*
5905  * lpfc_enable_dpp: Enable DPP on G7
5906  *       0  = DPP on G7 disabled
5907  *       1  = DPP on G7 enabled (default)
5908  * Value range is [0,1]. Default value is 1.
5909  */
5910 LPFC_ATTR_RW(enable_dpp, 1, 0, 1, "Enable Direct Packet Push");
5911
5912 /*
5913  * lpfc_enable_mi: Enable FDMI MIB
5914  *       0  = disabled
5915  *       1  = enabled (default)
5916  * Value range is [0,1].
5917  */
5918 LPFC_ATTR_R(enable_mi, 1, 0, 1, "Enable MI");
5919
5920 /*
5921  * lpfc_max_vmid: Maximum number of VMs to be tagged. This is valid only if
5922  * either vmid_app_header or vmid_priority_tagging is enabled.
5923  *       4 - 255  = vmid support enabled for 4-255 VMs
5924  *       Value range is [4,255].
5925  */
5926 LPFC_ATTR_RW(max_vmid, LPFC_MIN_VMID, LPFC_MIN_VMID, LPFC_MAX_VMID,
5927              "Maximum number of VMs supported");
5928
5929 /*
5930  * lpfc_vmid_inactivity_timeout: Inactivity timeout duration in hours
5931  *       0  = Timeout is disabled
5932  * Value range is [0,24].
5933  */
5934 LPFC_ATTR_RW(vmid_inactivity_timeout, 4, 0, 24,
5935              "Inactivity timeout in hours");
5936
5937 /*
5938  * lpfc_vmid_app_header: Enable App Header VMID support
5939  *       0  = Support is disabled (default)
5940  *       1  = Support is enabled
5941  * Value range is [0,1].
5942  */
5943 LPFC_ATTR_RW(vmid_app_header, LPFC_VMID_APP_HEADER_DISABLE,
5944              LPFC_VMID_APP_HEADER_DISABLE, LPFC_VMID_APP_HEADER_ENABLE,
5945              "Enable App Header VMID support");
5946
5947 /*
5948  * lpfc_vmid_priority_tagging: Enable Priority Tagging VMID support
5949  *       0  = Support is disabled (default)
5950  *       1  = Allow supported targets only
5951  *       2  = Allow all targets
5952  * Value range is [0,2].
5953  */
5954 LPFC_ATTR_RW(vmid_priority_tagging, LPFC_VMID_PRIO_TAG_DISABLE,
5955              LPFC_VMID_PRIO_TAG_DISABLE,
5956              LPFC_VMID_PRIO_TAG_ALL_TARGETS,
5957              "Enable Priority Tagging VMID support");
5958
5959 static struct attribute *lpfc_hba_attrs[] = {
5960         &dev_attr_nvme_info.attr,
5961         &dev_attr_scsi_stat.attr,
5962         &dev_attr_bg_info.attr,
5963         &dev_attr_bg_guard_err.attr,
5964         &dev_attr_bg_apptag_err.attr,
5965         &dev_attr_bg_reftag_err.attr,
5966         &dev_attr_info.attr,
5967         &dev_attr_serialnum.attr,
5968         &dev_attr_modeldesc.attr,
5969         &dev_attr_modelname.attr,
5970         &dev_attr_programtype.attr,
5971         &dev_attr_portnum.attr,
5972         &dev_attr_fwrev.attr,
5973         &dev_attr_hdw.attr,
5974         &dev_attr_option_rom_version.attr,
5975         &dev_attr_link_state.attr,
5976         &dev_attr_num_discovered_ports.attr,
5977         &dev_attr_lpfc_drvr_version.attr,
5978         &dev_attr_lpfc_enable_fip.attr,
5979         &dev_attr_lpfc_temp_sensor.attr,
5980         &dev_attr_lpfc_log_verbose.attr,
5981         &dev_attr_lpfc_lun_queue_depth.attr,
5982         &dev_attr_lpfc_tgt_queue_depth.attr,
5983         &dev_attr_lpfc_hba_queue_depth.attr,
5984         &dev_attr_lpfc_peer_port_login.attr,
5985         &dev_attr_lpfc_nodev_tmo.attr,
5986         &dev_attr_lpfc_devloss_tmo.attr,
5987         &dev_attr_lpfc_enable_fc4_type.attr,
5988         &dev_attr_lpfc_fcp_class.attr,
5989         &dev_attr_lpfc_use_adisc.attr,
5990         &dev_attr_lpfc_first_burst_size.attr,
5991         &dev_attr_lpfc_ack0.attr,
5992         &dev_attr_lpfc_xri_rebalancing.attr,
5993         &dev_attr_lpfc_topology.attr,
5994         &dev_attr_lpfc_scan_down.attr,
5995         &dev_attr_lpfc_link_speed.attr,
5996         &dev_attr_lpfc_fcp_io_sched.attr,
5997         &dev_attr_lpfc_ns_query.attr,
5998         &dev_attr_lpfc_fcp2_no_tgt_reset.attr,
5999         &dev_attr_lpfc_cr_delay.attr,
6000         &dev_attr_lpfc_cr_count.attr,
6001         &dev_attr_lpfc_multi_ring_support.attr,
6002         &dev_attr_lpfc_multi_ring_rctl.attr,
6003         &dev_attr_lpfc_multi_ring_type.attr,
6004         &dev_attr_lpfc_fdmi_on.attr,
6005         &dev_attr_lpfc_enable_SmartSAN.attr,
6006         &dev_attr_lpfc_max_luns.attr,
6007         &dev_attr_lpfc_enable_npiv.attr,
6008         &dev_attr_lpfc_fcf_failover_policy.attr,
6009         &dev_attr_lpfc_enable_rrq.attr,
6010         &dev_attr_lpfc_fcp_wait_abts_rsp.attr,
6011         &dev_attr_nport_evt_cnt.attr,
6012         &dev_attr_board_mode.attr,
6013         &dev_attr_lpfc_xcvr_data.attr,
6014         &dev_attr_max_vpi.attr,
6015         &dev_attr_used_vpi.attr,
6016         &dev_attr_max_rpi.attr,
6017         &dev_attr_used_rpi.attr,
6018         &dev_attr_max_xri.attr,
6019         &dev_attr_used_xri.attr,
6020         &dev_attr_npiv_info.attr,
6021         &dev_attr_issue_reset.attr,
6022         &dev_attr_lpfc_poll.attr,
6023         &dev_attr_lpfc_poll_tmo.attr,
6024         &dev_attr_lpfc_task_mgmt_tmo.attr,
6025         &dev_attr_lpfc_use_msi.attr,
6026         &dev_attr_lpfc_nvme_oas.attr,
6027         &dev_attr_lpfc_nvme_embed_cmd.attr,
6028         &dev_attr_lpfc_fcp_imax.attr,
6029         &dev_attr_lpfc_force_rscn.attr,
6030         &dev_attr_lpfc_cq_poll_threshold.attr,
6031         &dev_attr_lpfc_cq_max_proc_limit.attr,
6032         &dev_attr_lpfc_fcp_cpu_map.attr,
6033         &dev_attr_lpfc_fcp_mq_threshold.attr,
6034         &dev_attr_lpfc_hdw_queue.attr,
6035         &dev_attr_lpfc_irq_chann.attr,
6036         &dev_attr_lpfc_suppress_rsp.attr,
6037         &dev_attr_lpfc_nvmet_mrq.attr,
6038         &dev_attr_lpfc_nvmet_mrq_post.attr,
6039         &dev_attr_lpfc_nvme_enable_fb.attr,
6040         &dev_attr_lpfc_nvmet_fb_size.attr,
6041         &dev_attr_lpfc_enable_bg.attr,
6042         &dev_attr_lpfc_enable_hba_reset.attr,
6043         &dev_attr_lpfc_enable_hba_heartbeat.attr,
6044         &dev_attr_lpfc_EnableXLane.attr,
6045         &dev_attr_lpfc_XLanePriority.attr,
6046         &dev_attr_lpfc_xlane_lun.attr,
6047         &dev_attr_lpfc_xlane_tgt.attr,
6048         &dev_attr_lpfc_xlane_vpt.attr,
6049         &dev_attr_lpfc_xlane_lun_state.attr,
6050         &dev_attr_lpfc_xlane_lun_status.attr,
6051         &dev_attr_lpfc_xlane_priority.attr,
6052         &dev_attr_lpfc_sg_seg_cnt.attr,
6053         &dev_attr_lpfc_max_scsicmpl_time.attr,
6054         &dev_attr_lpfc_aer_support.attr,
6055         &dev_attr_lpfc_aer_state_cleanup.attr,
6056         &dev_attr_lpfc_sriov_nr_virtfn.attr,
6057         &dev_attr_lpfc_req_fw_upgrade.attr,
6058         &dev_attr_lpfc_suppress_link_up.attr,
6059         &dev_attr_iocb_hw.attr,
6060         &dev_attr_pls.attr,
6061         &dev_attr_pt.attr,
6062         &dev_attr_txq_hw.attr,
6063         &dev_attr_txcmplq_hw.attr,
6064         &dev_attr_lpfc_sriov_hw_max_virtfn.attr,
6065         &dev_attr_protocol.attr,
6066         &dev_attr_lpfc_xlane_supported.attr,
6067         &dev_attr_lpfc_enable_mds_diags.attr,
6068         &dev_attr_lpfc_ras_fwlog_buffsize.attr,
6069         &dev_attr_lpfc_ras_fwlog_level.attr,
6070         &dev_attr_lpfc_ras_fwlog_func.attr,
6071         &dev_attr_lpfc_enable_bbcr.attr,
6072         &dev_attr_lpfc_enable_dpp.attr,
6073         &dev_attr_lpfc_enable_mi.attr,
6074         &dev_attr_cmf_info.attr,
6075         &dev_attr_lpfc_max_vmid.attr,
6076         &dev_attr_lpfc_vmid_inactivity_timeout.attr,
6077         &dev_attr_lpfc_vmid_app_header.attr,
6078         &dev_attr_lpfc_vmid_priority_tagging.attr,
6079         NULL,
6080 };
6081
6082 static const struct attribute_group lpfc_hba_attr_group = {
6083         .attrs = lpfc_hba_attrs
6084 };
6085
6086 const struct attribute_group *lpfc_hba_groups[] = {
6087         &lpfc_hba_attr_group,
6088         NULL
6089 };
6090
6091 static struct attribute *lpfc_vport_attrs[] = {
6092         &dev_attr_info.attr,
6093         &dev_attr_link_state.attr,
6094         &dev_attr_num_discovered_ports.attr,
6095         &dev_attr_lpfc_drvr_version.attr,
6096         &dev_attr_lpfc_log_verbose.attr,
6097         &dev_attr_lpfc_lun_queue_depth.attr,
6098         &dev_attr_lpfc_tgt_queue_depth.attr,
6099         &dev_attr_lpfc_nodev_tmo.attr,
6100         &dev_attr_lpfc_devloss_tmo.attr,
6101         &dev_attr_lpfc_hba_queue_depth.attr,
6102         &dev_attr_lpfc_peer_port_login.attr,
6103         &dev_attr_lpfc_restrict_login.attr,
6104         &dev_attr_lpfc_fcp_class.attr,
6105         &dev_attr_lpfc_use_adisc.attr,
6106         &dev_attr_lpfc_first_burst_size.attr,
6107         &dev_attr_lpfc_max_luns.attr,
6108         &dev_attr_nport_evt_cnt.attr,
6109         &dev_attr_npiv_info.attr,
6110         &dev_attr_lpfc_enable_da_id.attr,
6111         &dev_attr_lpfc_max_scsicmpl_time.attr,
6112         &dev_attr_lpfc_static_vport.attr,
6113         &dev_attr_cmf_info.attr,
6114         NULL,
6115 };
6116
6117 static const struct attribute_group lpfc_vport_attr_group = {
6118         .attrs = lpfc_vport_attrs
6119 };
6120
6121 const struct attribute_group *lpfc_vport_groups[] = {
6122         &lpfc_vport_attr_group,
6123         NULL
6124 };
6125
6126 /**
6127  * sysfs_ctlreg_write - Write method for writing to ctlreg
6128  * @filp: open sysfs file
6129  * @kobj: kernel kobject that contains the kernel class device.
6130  * @bin_attr: kernel attributes passed to us.
6131  * @buf: contains the data to be written to the adapter IOREG space.
6132  * @off: offset into buffer to beginning of data.
6133  * @count: bytes to transfer.
6134  *
6135  * Description:
6136  * Accessed via /sys/class/scsi_host/hostxxx/ctlreg.
6137  * Uses the adapter io control registers to send buf contents to the adapter.
6138  *
6139  * Returns:
6140  * -ERANGE off and count combo out of range
6141  * -EINVAL off, count or buff address invalid
6142  * -EPERM adapter is offline
6143  * value of count, buf contents written
6144  **/
6145 static ssize_t
6146 sysfs_ctlreg_write(struct file *filp, struct kobject *kobj,
6147                    struct bin_attribute *bin_attr,
6148                    char *buf, loff_t off, size_t count)
6149 {
6150         size_t buf_off;
6151         struct device *dev = container_of(kobj, struct device, kobj);
6152         struct Scsi_Host  *shost = class_to_shost(dev);
6153         struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata;
6154         struct lpfc_hba   *phba = vport->phba;
6155
6156         if (phba->sli_rev >= LPFC_SLI_REV4)
6157                 return -EPERM;
6158
6159         if ((off + count) > FF_REG_AREA_SIZE)
6160                 return -ERANGE;
6161
6162         if (count <= LPFC_REG_WRITE_KEY_SIZE)
6163                 return 0;
6164
6165         if (off % 4 || count % 4 || (unsigned long)buf % 4)
6166                 return -EINVAL;
6167
6168         /* This is to protect HBA registers from accidental writes. */
6169         if (memcmp(buf, LPFC_REG_WRITE_KEY, LPFC_REG_WRITE_KEY_SIZE))
6170                 return -EINVAL;
6171
6172         if (!(vport->fc_flag & FC_OFFLINE_MODE))
6173                 return -EPERM;
6174
6175         spin_lock_irq(&phba->hbalock);
6176         for (buf_off = 0; buf_off < count - LPFC_REG_WRITE_KEY_SIZE;
6177                         buf_off += sizeof(uint32_t))
6178                 writel(*((uint32_t *)(buf + buf_off + LPFC_REG_WRITE_KEY_SIZE)),
6179                        phba->ctrl_regs_memmap_p + off + buf_off);
6180
6181         spin_unlock_irq(&phba->hbalock);
6182
6183         return count;
6184 }
6185
6186 /**
6187  * sysfs_ctlreg_read - Read method for reading from ctlreg
6188  * @filp: open sysfs file
6189  * @kobj: kernel kobject that contains the kernel class device.
6190  * @bin_attr: kernel attributes passed to us.
6191  * @buf: if successful contains the data from the adapter IOREG space.
6192  * @off: offset into buffer to beginning of data.
6193  * @count: bytes to transfer.
6194  *
6195  * Description:
6196  * Accessed via /sys/class/scsi_host/hostxxx/ctlreg.
6197  * Uses the adapter io control registers to read data into buf.
6198  *
6199  * Returns:
6200  * -ERANGE off and count combo out of range
6201  * -EINVAL off, count or buff address invalid
6202  * value of count, buf contents read
6203  **/
6204 static ssize_t
6205 sysfs_ctlreg_read(struct file *filp, struct kobject *kobj,
6206                   struct bin_attribute *bin_attr,
6207                   char *buf, loff_t off, size_t count)
6208 {
6209         size_t buf_off;
6210         uint32_t * tmp_ptr;
6211         struct device *dev = container_of(kobj, struct device, kobj);
6212         struct Scsi_Host  *shost = class_to_shost(dev);
6213         struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata;
6214         struct lpfc_hba   *phba = vport->phba;
6215
6216         if (phba->sli_rev >= LPFC_SLI_REV4)
6217                 return -EPERM;
6218
6219         if (off > FF_REG_AREA_SIZE)
6220                 return -ERANGE;
6221
6222         if ((off + count) > FF_REG_AREA_SIZE)
6223                 count = FF_REG_AREA_SIZE - off;
6224
6225         if (count == 0) return 0;
6226
6227         if (off % 4 || count % 4 || (unsigned long)buf % 4)
6228                 return -EINVAL;
6229
6230         spin_lock_irq(&phba->hbalock);
6231
6232         for (buf_off = 0; buf_off < count; buf_off += sizeof(uint32_t)) {
6233                 tmp_ptr = (uint32_t *)(buf + buf_off);
6234                 *tmp_ptr = readl(phba->ctrl_regs_memmap_p + off + buf_off);
6235         }
6236
6237         spin_unlock_irq(&phba->hbalock);
6238
6239         return count;
6240 }
6241
6242 static struct bin_attribute sysfs_ctlreg_attr = {
6243         .attr = {
6244                 .name = "ctlreg",
6245                 .mode = S_IRUSR | S_IWUSR,
6246         },
6247         .size = 256,
6248         .read = sysfs_ctlreg_read,
6249         .write = sysfs_ctlreg_write,
6250 };
6251
6252 /**
6253  * sysfs_mbox_write - Write method for writing information via mbox
6254  * @filp: open sysfs file
6255  * @kobj: kernel kobject that contains the kernel class device.
6256  * @bin_attr: kernel attributes passed to us.
6257  * @buf: contains the data to be written to sysfs mbox.
6258  * @off: offset into buffer to beginning of data.
6259  * @count: bytes to transfer.
6260  *
6261  * Description:
6262  * Deprecated function. All mailbox access from user space is performed via the
6263  * bsg interface.
6264  *
6265  * Returns:
6266  * -EPERM operation not permitted
6267  **/
6268 static ssize_t
6269 sysfs_mbox_write(struct file *filp, struct kobject *kobj,
6270                  struct bin_attribute *bin_attr,
6271                  char *buf, loff_t off, size_t count)
6272 {
6273         return -EPERM;
6274 }
6275
6276 /**
6277  * sysfs_mbox_read - Read method for reading information via mbox
6278  * @filp: open sysfs file
6279  * @kobj: kernel kobject that contains the kernel class device.
6280  * @bin_attr: kernel attributes passed to us.
6281  * @buf: contains the data to be read from sysfs mbox.
6282  * @off: offset into buffer to beginning of data.
6283  * @count: bytes to transfer.
6284  *
6285  * Description:
6286  * Deprecated function. All mailbox access from user space is performed via the
6287  * bsg interface.
6288  *
6289  * Returns:
6290  * -EPERM operation not permitted
6291  **/
6292 static ssize_t
6293 sysfs_mbox_read(struct file *filp, struct kobject *kobj,
6294                 struct bin_attribute *bin_attr,
6295                 char *buf, loff_t off, size_t count)
6296 {
6297         return -EPERM;
6298 }
6299
6300 static struct bin_attribute sysfs_mbox_attr = {
6301         .attr = {
6302                 .name = "mbox",
6303                 .mode = S_IRUSR | S_IWUSR,
6304         },
6305         .size = MAILBOX_SYSFS_MAX,
6306         .read = sysfs_mbox_read,
6307         .write = sysfs_mbox_write,
6308 };
6309
6310 /**
6311  * lpfc_alloc_sysfs_attr - Creates the ctlreg and mbox entries
6312  * @vport: address of lpfc vport structure.
6313  *
6314  * Return codes:
6315  * zero on success
6316  * error return code from sysfs_create_bin_file()
6317  **/
6318 int
6319 lpfc_alloc_sysfs_attr(struct lpfc_vport *vport)
6320 {
6321         struct Scsi_Host *shost = lpfc_shost_from_vport(vport);
6322         int error;
6323
6324         /* Virtual ports do not need ctrl_reg and mbox */
6325         if (vport->port_type == LPFC_NPIV_PORT)
6326                 return 0;
6327
6328         error = sysfs_create_bin_file(&shost->shost_dev.kobj,
6329                                       &sysfs_ctlreg_attr);
6330         if (error)
6331                 goto out;
6332
6333         error = sysfs_create_bin_file(&shost->shost_dev.kobj,
6334                                       &sysfs_mbox_attr);
6335         if (error)
6336                 goto out_remove_ctlreg_attr;
6337
6338         return 0;
6339 out_remove_ctlreg_attr:
6340         sysfs_remove_bin_file(&shost->shost_dev.kobj, &sysfs_ctlreg_attr);
6341 out:
6342         return error;
6343 }
6344
6345 /**
6346  * lpfc_free_sysfs_attr - Removes the ctlreg and mbox entries
6347  * @vport: address of lpfc vport structure.
6348  **/
6349 void
6350 lpfc_free_sysfs_attr(struct lpfc_vport *vport)
6351 {
6352         struct Scsi_Host *shost = lpfc_shost_from_vport(vport);
6353
6354         /* Virtual ports do not need ctrl_reg and mbox */
6355         if (vport->port_type == LPFC_NPIV_PORT)
6356                 return;
6357         sysfs_remove_bin_file(&shost->shost_dev.kobj, &sysfs_mbox_attr);
6358         sysfs_remove_bin_file(&shost->shost_dev.kobj, &sysfs_ctlreg_attr);
6359 }
6360
6361 /*
6362  * Dynamic FC Host Attributes Support
6363  */
6364
6365 /**
6366  * lpfc_get_host_symbolic_name - Copy symbolic name into the scsi host
6367  * @shost: kernel scsi host pointer.
6368  **/
6369 static void
6370 lpfc_get_host_symbolic_name(struct Scsi_Host *shost)
6371 {
6372         struct lpfc_vport *vport = (struct lpfc_vport *)shost->hostdata;
6373
6374         lpfc_vport_symbolic_node_name(vport, fc_host_symbolic_name(shost),
6375                                       sizeof fc_host_symbolic_name(shost));
6376 }
6377
6378 /**
6379  * lpfc_get_host_port_id - Copy the vport DID into the scsi host port id
6380  * @shost: kernel scsi host pointer.
6381  **/
6382 static void
6383 lpfc_get_host_port_id(struct Scsi_Host *shost)
6384 {
6385         struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata;
6386
6387         /* note: fc_myDID already in cpu endianness */
6388         fc_host_port_id(shost) = vport->fc_myDID;
6389 }
6390
6391 /**
6392  * lpfc_get_host_port_type - Set the value of the scsi host port type
6393  * @shost: kernel scsi host pointer.
6394  **/
6395 static void
6396 lpfc_get_host_port_type(struct Scsi_Host *shost)
6397 {
6398         struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata;
6399         struct lpfc_hba   *phba = vport->phba;
6400
6401         spin_lock_irq(shost->host_lock);
6402
6403         if (vport->port_type == LPFC_NPIV_PORT) {
6404                 fc_host_port_type(shost) = FC_PORTTYPE_NPIV;
6405         } else if (lpfc_is_link_up(phba)) {
6406                 if (phba->fc_topology == LPFC_TOPOLOGY_LOOP) {
6407                         if (vport->fc_flag & FC_PUBLIC_LOOP)
6408                                 fc_host_port_type(shost) = FC_PORTTYPE_NLPORT;
6409                         else
6410                                 fc_host_port_type(shost) = FC_PORTTYPE_LPORT;
6411                 } else {
6412                         if (vport->fc_flag & FC_FABRIC)
6413                                 fc_host_port_type(shost) = FC_PORTTYPE_NPORT;
6414                         else
6415                                 fc_host_port_type(shost) = FC_PORTTYPE_PTP;
6416                 }
6417         } else
6418                 fc_host_port_type(shost) = FC_PORTTYPE_UNKNOWN;
6419
6420         spin_unlock_irq(shost->host_lock);
6421 }
6422
6423 /**
6424  * lpfc_get_host_port_state - Set the value of the scsi host port state
6425  * @shost: kernel scsi host pointer.
6426  **/
6427 static void
6428 lpfc_get_host_port_state(struct Scsi_Host *shost)
6429 {
6430         struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata;
6431         struct lpfc_hba   *phba = vport->phba;
6432
6433         spin_lock_irq(shost->host_lock);
6434
6435         if (vport->fc_flag & FC_OFFLINE_MODE)
6436                 fc_host_port_state(shost) = FC_PORTSTATE_OFFLINE;
6437         else {
6438                 switch (phba->link_state) {
6439                 case LPFC_LINK_UNKNOWN:
6440                 case LPFC_LINK_DOWN:
6441                         fc_host_port_state(shost) = FC_PORTSTATE_LINKDOWN;
6442                         break;
6443                 case LPFC_LINK_UP:
6444                 case LPFC_CLEAR_LA:
6445                 case LPFC_HBA_READY:
6446                         /* Links up, reports port state accordingly */
6447                         if (vport->port_state < LPFC_VPORT_READY)
6448                                 fc_host_port_state(shost) =
6449                                                         FC_PORTSTATE_BYPASSED;
6450                         else
6451                                 fc_host_port_state(shost) =
6452                                                         FC_PORTSTATE_ONLINE;
6453                         break;
6454                 case LPFC_HBA_ERROR:
6455                         fc_host_port_state(shost) = FC_PORTSTATE_ERROR;
6456                         break;
6457                 default:
6458                         fc_host_port_state(shost) = FC_PORTSTATE_UNKNOWN;
6459                         break;
6460                 }
6461         }
6462
6463         spin_unlock_irq(shost->host_lock);
6464 }
6465
6466 /**
6467  * lpfc_get_host_speed - Set the value of the scsi host speed
6468  * @shost: kernel scsi host pointer.
6469  **/
6470 static void
6471 lpfc_get_host_speed(struct Scsi_Host *shost)
6472 {
6473         struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata;
6474         struct lpfc_hba   *phba = vport->phba;
6475
6476         spin_lock_irq(shost->host_lock);
6477
6478         if ((lpfc_is_link_up(phba)) && (!(phba->hba_flag & HBA_FCOE_MODE))) {
6479                 switch(phba->fc_linkspeed) {
6480                 case LPFC_LINK_SPEED_1GHZ:
6481                         fc_host_speed(shost) = FC_PORTSPEED_1GBIT;
6482                         break;
6483                 case LPFC_LINK_SPEED_2GHZ:
6484                         fc_host_speed(shost) = FC_PORTSPEED_2GBIT;
6485                         break;
6486                 case LPFC_LINK_SPEED_4GHZ:
6487                         fc_host_speed(shost) = FC_PORTSPEED_4GBIT;
6488                         break;
6489                 case LPFC_LINK_SPEED_8GHZ:
6490                         fc_host_speed(shost) = FC_PORTSPEED_8GBIT;
6491                         break;
6492                 case LPFC_LINK_SPEED_10GHZ:
6493                         fc_host_speed(shost) = FC_PORTSPEED_10GBIT;
6494                         break;
6495                 case LPFC_LINK_SPEED_16GHZ:
6496                         fc_host_speed(shost) = FC_PORTSPEED_16GBIT;
6497                         break;
6498                 case LPFC_LINK_SPEED_32GHZ:
6499                         fc_host_speed(shost) = FC_PORTSPEED_32GBIT;
6500                         break;
6501                 case LPFC_LINK_SPEED_64GHZ:
6502                         fc_host_speed(shost) = FC_PORTSPEED_64GBIT;
6503                         break;
6504                 case LPFC_LINK_SPEED_128GHZ:
6505                         fc_host_speed(shost) = FC_PORTSPEED_128GBIT;
6506                         break;
6507                 case LPFC_LINK_SPEED_256GHZ:
6508                         fc_host_speed(shost) = FC_PORTSPEED_256GBIT;
6509                         break;
6510                 default:
6511                         fc_host_speed(shost) = FC_PORTSPEED_UNKNOWN;
6512                         break;
6513                 }
6514         } else if (lpfc_is_link_up(phba) && (phba->hba_flag & HBA_FCOE_MODE)) {
6515                 switch (phba->fc_linkspeed) {
6516                 case LPFC_ASYNC_LINK_SPEED_1GBPS:
6517                         fc_host_speed(shost) = FC_PORTSPEED_1GBIT;
6518                         break;
6519                 case LPFC_ASYNC_LINK_SPEED_10GBPS:
6520                         fc_host_speed(shost) = FC_PORTSPEED_10GBIT;
6521                         break;
6522                 case LPFC_ASYNC_LINK_SPEED_20GBPS:
6523                         fc_host_speed(shost) = FC_PORTSPEED_20GBIT;
6524                         break;
6525                 case LPFC_ASYNC_LINK_SPEED_25GBPS:
6526                         fc_host_speed(shost) = FC_PORTSPEED_25GBIT;
6527                         break;
6528                 case LPFC_ASYNC_LINK_SPEED_40GBPS:
6529                         fc_host_speed(shost) = FC_PORTSPEED_40GBIT;
6530                         break;
6531                 case LPFC_ASYNC_LINK_SPEED_100GBPS:
6532                         fc_host_speed(shost) = FC_PORTSPEED_100GBIT;
6533                         break;
6534                 default:
6535                         fc_host_speed(shost) = FC_PORTSPEED_UNKNOWN;
6536                         break;
6537                 }
6538         } else
6539                 fc_host_speed(shost) = FC_PORTSPEED_UNKNOWN;
6540
6541         spin_unlock_irq(shost->host_lock);
6542 }
6543
6544 /**
6545  * lpfc_get_host_fabric_name - Set the value of the scsi host fabric name
6546  * @shost: kernel scsi host pointer.
6547  **/
6548 static void
6549 lpfc_get_host_fabric_name (struct Scsi_Host *shost)
6550 {
6551         struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata;
6552         struct lpfc_hba   *phba = vport->phba;
6553         u64 node_name;
6554
6555         spin_lock_irq(shost->host_lock);
6556
6557         if ((vport->port_state > LPFC_FLOGI) &&
6558             ((vport->fc_flag & FC_FABRIC) ||
6559              ((phba->fc_topology == LPFC_TOPOLOGY_LOOP) &&
6560               (vport->fc_flag & FC_PUBLIC_LOOP))))
6561                 node_name = wwn_to_u64(phba->fc_fabparam.nodeName.u.wwn);
6562         else
6563                 /* fabric is local port if there is no F/FL_Port */
6564                 node_name = 0;
6565
6566         spin_unlock_irq(shost->host_lock);
6567
6568         fc_host_fabric_name(shost) = node_name;
6569 }
6570
6571 /**
6572  * lpfc_get_stats - Return statistical information about the adapter
6573  * @shost: kernel scsi host pointer.
6574  *
6575  * Notes:
6576  * NULL on error for link down, no mbox pool, sli2 active,
6577  * management not allowed, memory allocation error, or mbox error.
6578  *
6579  * Returns:
6580  * NULL for error
6581  * address of the adapter host statistics
6582  **/
6583 static struct fc_host_statistics *
6584 lpfc_get_stats(struct Scsi_Host *shost)
6585 {
6586         struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata;
6587         struct lpfc_hba   *phba = vport->phba;
6588         struct lpfc_sli   *psli = &phba->sli;
6589         struct fc_host_statistics *hs = &phba->link_stats;
6590         struct lpfc_lnk_stat * lso = &psli->lnk_stat_offsets;
6591         LPFC_MBOXQ_t *pmboxq;
6592         MAILBOX_t *pmb;
6593         int rc = 0;
6594
6595         /*
6596          * prevent udev from issuing mailbox commands until the port is
6597          * configured.
6598          */
6599         if (phba->link_state < LPFC_LINK_DOWN ||
6600             !phba->mbox_mem_pool ||
6601             (phba->sli.sli_flag & LPFC_SLI_ACTIVE) == 0)
6602                 return NULL;
6603
6604         if (phba->sli.sli_flag & LPFC_BLOCK_MGMT_IO)
6605                 return NULL;
6606
6607         pmboxq = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL);
6608         if (!pmboxq)
6609                 return NULL;
6610         memset(pmboxq, 0, sizeof (LPFC_MBOXQ_t));
6611
6612         pmb = &pmboxq->u.mb;
6613         pmb->mbxCommand = MBX_READ_STATUS;
6614         pmb->mbxOwner = OWN_HOST;
6615         pmboxq->ctx_buf = NULL;
6616         pmboxq->vport = vport;
6617
6618         if (vport->fc_flag & FC_OFFLINE_MODE) {
6619                 rc = lpfc_sli_issue_mbox(phba, pmboxq, MBX_POLL);
6620                 if (rc != MBX_SUCCESS) {
6621                         mempool_free(pmboxq, phba->mbox_mem_pool);
6622                         return NULL;
6623                 }
6624         } else {
6625                 rc = lpfc_sli_issue_mbox_wait(phba, pmboxq, phba->fc_ratov * 2);
6626                 if (rc != MBX_SUCCESS) {
6627                         if (rc != MBX_TIMEOUT)
6628                                 mempool_free(pmboxq, phba->mbox_mem_pool);
6629                         return NULL;
6630                 }
6631         }
6632
6633         memset(hs, 0, sizeof (struct fc_host_statistics));
6634
6635         hs->tx_frames = pmb->un.varRdStatus.xmitFrameCnt;
6636         hs->rx_frames = pmb->un.varRdStatus.rcvFrameCnt;
6637
6638         /*
6639          * The MBX_READ_STATUS returns tx_k_bytes which has to be
6640          * converted to words.
6641          *
6642          * Check if extended byte flag is set, to know when to collect upper
6643          * bits of 64 bit wide statistics counter.
6644          */
6645         if (pmb->un.varRdStatus.xkb & RD_ST_XKB) {
6646                 hs->tx_words = (u64)
6647                                ((((u64)(pmb->un.varRdStatus.xmit_xkb &
6648                                         RD_ST_XMIT_XKB_MASK) << 32) |
6649                                 (u64)pmb->un.varRdStatus.xmitByteCnt) *
6650                                 (u64)256);
6651                 hs->rx_words = (u64)
6652                                ((((u64)(pmb->un.varRdStatus.rcv_xkb &
6653                                         RD_ST_RCV_XKB_MASK) << 32) |
6654                                 (u64)pmb->un.varRdStatus.rcvByteCnt) *
6655                                 (u64)256);
6656         } else {
6657                 hs->tx_words = (uint64_t)
6658                                 ((uint64_t)pmb->un.varRdStatus.xmitByteCnt
6659                                 * (uint64_t)256);
6660                 hs->rx_words = (uint64_t)
6661                                 ((uint64_t)pmb->un.varRdStatus.rcvByteCnt
6662                                  * (uint64_t)256);
6663         }
6664
6665         memset(pmboxq, 0, sizeof (LPFC_MBOXQ_t));
6666         pmb->mbxCommand = MBX_READ_LNK_STAT;
6667         pmb->mbxOwner = OWN_HOST;
6668         pmboxq->ctx_buf = NULL;
6669         pmboxq->vport = vport;
6670
6671         if (vport->fc_flag & FC_OFFLINE_MODE) {
6672                 rc = lpfc_sli_issue_mbox(phba, pmboxq, MBX_POLL);
6673                 if (rc != MBX_SUCCESS) {
6674                         mempool_free(pmboxq, phba->mbox_mem_pool);
6675                         return NULL;
6676                 }
6677         } else {
6678                 rc = lpfc_sli_issue_mbox_wait(phba, pmboxq, phba->fc_ratov * 2);
6679                 if (rc != MBX_SUCCESS) {
6680                         if (rc != MBX_TIMEOUT)
6681                                 mempool_free(pmboxq, phba->mbox_mem_pool);
6682                         return NULL;
6683                 }
6684         }
6685
6686         hs->link_failure_count = pmb->un.varRdLnk.linkFailureCnt;
6687         hs->loss_of_sync_count = pmb->un.varRdLnk.lossSyncCnt;
6688         hs->loss_of_signal_count = pmb->un.varRdLnk.lossSignalCnt;
6689         hs->prim_seq_protocol_err_count = pmb->un.varRdLnk.primSeqErrCnt;
6690         hs->invalid_tx_word_count = pmb->un.varRdLnk.invalidXmitWord;
6691         hs->invalid_crc_count = pmb->un.varRdLnk.crcCnt;
6692         hs->error_frames = pmb->un.varRdLnk.crcCnt;
6693
6694         hs->cn_sig_warn = atomic64_read(&phba->cgn_acqe_stat.warn);
6695         hs->cn_sig_alarm = atomic64_read(&phba->cgn_acqe_stat.alarm);
6696
6697         hs->link_failure_count -= lso->link_failure_count;
6698         hs->loss_of_sync_count -= lso->loss_of_sync_count;
6699         hs->loss_of_signal_count -= lso->loss_of_signal_count;
6700         hs->prim_seq_protocol_err_count -= lso->prim_seq_protocol_err_count;
6701         hs->invalid_tx_word_count -= lso->invalid_tx_word_count;
6702         hs->invalid_crc_count -= lso->invalid_crc_count;
6703         hs->error_frames -= lso->error_frames;
6704
6705         if (phba->hba_flag & HBA_FCOE_MODE) {
6706                 hs->lip_count = -1;
6707                 hs->nos_count = (phba->link_events >> 1);
6708                 hs->nos_count -= lso->link_events;
6709         } else if (phba->fc_topology == LPFC_TOPOLOGY_LOOP) {
6710                 hs->lip_count = (phba->fc_eventTag >> 1);
6711                 hs->lip_count -= lso->link_events;
6712                 hs->nos_count = -1;
6713         } else {
6714                 hs->lip_count = -1;
6715                 hs->nos_count = (phba->fc_eventTag >> 1);
6716                 hs->nos_count -= lso->link_events;
6717         }
6718
6719         hs->dumped_frames = -1;
6720
6721         hs->seconds_since_last_reset = ktime_get_seconds() - psli->stats_start;
6722
6723         mempool_free(pmboxq, phba->mbox_mem_pool);
6724
6725         return hs;
6726 }
6727
6728 /**
6729  * lpfc_reset_stats - Copy the adapter link stats information
6730  * @shost: kernel scsi host pointer.
6731  **/
6732 static void
6733 lpfc_reset_stats(struct Scsi_Host *shost)
6734 {
6735         struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata;
6736         struct lpfc_hba   *phba = vport->phba;
6737         struct lpfc_sli   *psli = &phba->sli;
6738         struct lpfc_lnk_stat *lso = &psli->lnk_stat_offsets;
6739         LPFC_MBOXQ_t *pmboxq;
6740         MAILBOX_t *pmb;
6741         int rc = 0;
6742
6743         if (phba->sli.sli_flag & LPFC_BLOCK_MGMT_IO)
6744                 return;
6745
6746         pmboxq = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL);
6747         if (!pmboxq)
6748                 return;
6749         memset(pmboxq, 0, sizeof(LPFC_MBOXQ_t));
6750
6751         pmb = &pmboxq->u.mb;
6752         pmb->mbxCommand = MBX_READ_STATUS;
6753         pmb->mbxOwner = OWN_HOST;
6754         pmb->un.varWords[0] = 0x1; /* reset request */
6755         pmboxq->ctx_buf = NULL;
6756         pmboxq->vport = vport;
6757
6758         if ((vport->fc_flag & FC_OFFLINE_MODE) ||
6759                 (!(psli->sli_flag & LPFC_SLI_ACTIVE))) {
6760                 rc = lpfc_sli_issue_mbox(phba, pmboxq, MBX_POLL);
6761                 if (rc != MBX_SUCCESS) {
6762                         mempool_free(pmboxq, phba->mbox_mem_pool);
6763                         return;
6764                 }
6765         } else {
6766                 rc = lpfc_sli_issue_mbox_wait(phba, pmboxq, phba->fc_ratov * 2);
6767                 if (rc != MBX_SUCCESS) {
6768                         if (rc != MBX_TIMEOUT)
6769                                 mempool_free(pmboxq, phba->mbox_mem_pool);
6770                         return;
6771                 }
6772         }
6773
6774         memset(pmboxq, 0, sizeof(LPFC_MBOXQ_t));
6775         pmb->mbxCommand = MBX_READ_LNK_STAT;
6776         pmb->mbxOwner = OWN_HOST;
6777         pmboxq->ctx_buf = NULL;
6778         pmboxq->vport = vport;
6779
6780         if ((vport->fc_flag & FC_OFFLINE_MODE) ||
6781             (!(psli->sli_flag & LPFC_SLI_ACTIVE))) {
6782                 rc = lpfc_sli_issue_mbox(phba, pmboxq, MBX_POLL);
6783                 if (rc != MBX_SUCCESS) {
6784                         mempool_free(pmboxq, phba->mbox_mem_pool);
6785                         return;
6786                 }
6787         } else {
6788                 rc = lpfc_sli_issue_mbox_wait(phba, pmboxq, phba->fc_ratov * 2);
6789                 if (rc != MBX_SUCCESS) {
6790                         if (rc != MBX_TIMEOUT)
6791                                 mempool_free(pmboxq, phba->mbox_mem_pool);
6792                         return;
6793                 }
6794         }
6795
6796         lso->link_failure_count = pmb->un.varRdLnk.linkFailureCnt;
6797         lso->loss_of_sync_count = pmb->un.varRdLnk.lossSyncCnt;
6798         lso->loss_of_signal_count = pmb->un.varRdLnk.lossSignalCnt;
6799         lso->prim_seq_protocol_err_count = pmb->un.varRdLnk.primSeqErrCnt;
6800         lso->invalid_tx_word_count = pmb->un.varRdLnk.invalidXmitWord;
6801         lso->invalid_crc_count = pmb->un.varRdLnk.crcCnt;
6802         lso->error_frames = pmb->un.varRdLnk.crcCnt;
6803         if (phba->hba_flag & HBA_FCOE_MODE)
6804                 lso->link_events = (phba->link_events >> 1);
6805         else
6806                 lso->link_events = (phba->fc_eventTag >> 1);
6807
6808         atomic64_set(&phba->cgn_acqe_stat.warn, 0);
6809         atomic64_set(&phba->cgn_acqe_stat.alarm, 0);
6810
6811         memset(&shost_to_fc_host(shost)->fpin_stats, 0,
6812                sizeof(shost_to_fc_host(shost)->fpin_stats));
6813
6814         psli->stats_start = ktime_get_seconds();
6815
6816         mempool_free(pmboxq, phba->mbox_mem_pool);
6817
6818         return;
6819 }
6820
6821 /*
6822  * The LPFC driver treats linkdown handling as target loss events so there
6823  * are no sysfs handlers for link_down_tmo.
6824  */
6825
6826 /**
6827  * lpfc_get_node_by_target - Return the nodelist for a target
6828  * @starget: kernel scsi target pointer.
6829  *
6830  * Returns:
6831  * address of the node list if found
6832  * NULL target not found
6833  **/
6834 static struct lpfc_nodelist *
6835 lpfc_get_node_by_target(struct scsi_target *starget)
6836 {
6837         struct Scsi_Host  *shost = dev_to_shost(starget->dev.parent);
6838         struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata;
6839         struct lpfc_nodelist *ndlp;
6840
6841         spin_lock_irq(shost->host_lock);
6842         /* Search for this, mapped, target ID */
6843         list_for_each_entry(ndlp, &vport->fc_nodes, nlp_listp) {
6844                 if (ndlp->nlp_state == NLP_STE_MAPPED_NODE &&
6845                     starget->id == ndlp->nlp_sid) {
6846                         spin_unlock_irq(shost->host_lock);
6847                         return ndlp;
6848                 }
6849         }
6850         spin_unlock_irq(shost->host_lock);
6851         return NULL;
6852 }
6853
6854 /**
6855  * lpfc_get_starget_port_id - Set the target port id to the ndlp DID or -1
6856  * @starget: kernel scsi target pointer.
6857  **/
6858 static void
6859 lpfc_get_starget_port_id(struct scsi_target *starget)
6860 {
6861         struct lpfc_nodelist *ndlp = lpfc_get_node_by_target(starget);
6862
6863         fc_starget_port_id(starget) = ndlp ? ndlp->nlp_DID : -1;
6864 }
6865
6866 /**
6867  * lpfc_get_starget_node_name - Set the target node name
6868  * @starget: kernel scsi target pointer.
6869  *
6870  * Description: Set the target node name to the ndlp node name wwn or zero.
6871  **/
6872 static void
6873 lpfc_get_starget_node_name(struct scsi_target *starget)
6874 {
6875         struct lpfc_nodelist *ndlp = lpfc_get_node_by_target(starget);
6876
6877         fc_starget_node_name(starget) =
6878                 ndlp ? wwn_to_u64(ndlp->nlp_nodename.u.wwn) : 0;
6879 }
6880
6881 /**
6882  * lpfc_get_starget_port_name - Set the target port name
6883  * @starget: kernel scsi target pointer.
6884  *
6885  * Description:  set the target port name to the ndlp port name wwn or zero.
6886  **/
6887 static void
6888 lpfc_get_starget_port_name(struct scsi_target *starget)
6889 {
6890         struct lpfc_nodelist *ndlp = lpfc_get_node_by_target(starget);
6891
6892         fc_starget_port_name(starget) =
6893                 ndlp ? wwn_to_u64(ndlp->nlp_portname.u.wwn) : 0;
6894 }
6895
6896 /**
6897  * lpfc_set_rport_loss_tmo - Set the rport dev loss tmo
6898  * @rport: fc rport address.
6899  * @timeout: new value for dev loss tmo.
6900  *
6901  * Description:
6902  * If timeout is non zero set the dev_loss_tmo to timeout, else set
6903  * dev_loss_tmo to one.
6904  **/
6905 static void
6906 lpfc_set_rport_loss_tmo(struct fc_rport *rport, uint32_t timeout)
6907 {
6908         struct lpfc_rport_data *rdata = rport->dd_data;
6909         struct lpfc_nodelist *ndlp = rdata->pnode;
6910 #if (IS_ENABLED(CONFIG_NVME_FC))
6911         struct lpfc_nvme_rport *nrport = NULL;
6912 #endif
6913
6914         if (timeout)
6915                 rport->dev_loss_tmo = timeout;
6916         else
6917                 rport->dev_loss_tmo = 1;
6918
6919         if (!ndlp) {
6920                 dev_info(&rport->dev, "Cannot find remote node to "
6921                                       "set rport dev loss tmo, port_id x%x\n",
6922                                       rport->port_id);
6923                 return;
6924         }
6925
6926 #if (IS_ENABLED(CONFIG_NVME_FC))
6927         nrport = lpfc_ndlp_get_nrport(ndlp);
6928
6929         if (nrport && nrport->remoteport)
6930                 nvme_fc_set_remoteport_devloss(nrport->remoteport,
6931                                                rport->dev_loss_tmo);
6932 #endif
6933 }
6934
6935 /*
6936  * lpfc_rport_show_function - Return rport target information
6937  *
6938  * Description:
6939  * Macro that uses field to generate a function with the name lpfc_show_rport_
6940  *
6941  * lpfc_show_rport_##field: returns the bytes formatted in buf
6942  * @cdev: class converted to an fc_rport.
6943  * @buf: on return contains the target_field or zero.
6944  *
6945  * Returns: size of formatted string.
6946  **/
6947 #define lpfc_rport_show_function(field, format_string, sz, cast)        \
6948 static ssize_t                                                          \
6949 lpfc_show_rport_##field (struct device *dev,                            \
6950                          struct device_attribute *attr,                 \
6951                          char *buf)                                     \
6952 {                                                                       \
6953         struct fc_rport *rport = transport_class_to_rport(dev);         \
6954         struct lpfc_rport_data *rdata = rport->hostdata;                \
6955         return scnprintf(buf, sz, format_string,                        \
6956                 (rdata->target) ? cast rdata->target->field : 0);       \
6957 }
6958
6959 #define lpfc_rport_rd_attr(field, format_string, sz)                    \
6960         lpfc_rport_show_function(field, format_string, sz, )            \
6961 static FC_RPORT_ATTR(field, S_IRUGO, lpfc_show_rport_##field, NULL)
6962
6963 /**
6964  * lpfc_set_vport_symbolic_name - Set the vport's symbolic name
6965  * @fc_vport: The fc_vport who's symbolic name has been changed.
6966  *
6967  * Description:
6968  * This function is called by the transport after the @fc_vport's symbolic name
6969  * has been changed. This function re-registers the symbolic name with the
6970  * switch to propagate the change into the fabric if the vport is active.
6971  **/
6972 static void
6973 lpfc_set_vport_symbolic_name(struct fc_vport *fc_vport)
6974 {
6975         struct lpfc_vport *vport = *(struct lpfc_vport **)fc_vport->dd_data;
6976
6977         if (vport->port_state == LPFC_VPORT_READY)
6978                 lpfc_ns_cmd(vport, SLI_CTNS_RSPN_ID, 0, 0);
6979 }
6980
6981 /**
6982  * lpfc_hba_log_verbose_init - Set hba's log verbose level
6983  * @phba: Pointer to lpfc_hba struct.
6984  * @verbose: Verbose level to set.
6985  *
6986  * This function is called by the lpfc_get_cfgparam() routine to set the
6987  * module lpfc_log_verbose into the @phba cfg_log_verbose for use with
6988  * log message according to the module's lpfc_log_verbose parameter setting
6989  * before hba port or vport created.
6990  **/
6991 static void
6992 lpfc_hba_log_verbose_init(struct lpfc_hba *phba, uint32_t verbose)
6993 {
6994         phba->cfg_log_verbose = verbose;
6995 }
6996
6997 struct fc_function_template lpfc_transport_functions = {
6998         /* fixed attributes the driver supports */
6999         .show_host_node_name = 1,
7000         .show_host_port_name = 1,
7001         .show_host_supported_classes = 1,
7002         .show_host_supported_fc4s = 1,
7003         .show_host_supported_speeds = 1,
7004         .show_host_maxframe_size = 1,
7005
7006         .get_host_symbolic_name = lpfc_get_host_symbolic_name,
7007         .show_host_symbolic_name = 1,
7008
7009         /* dynamic attributes the driver supports */
7010         .get_host_port_id = lpfc_get_host_port_id,
7011         .show_host_port_id = 1,
7012
7013         .get_host_port_type = lpfc_get_host_port_type,
7014         .show_host_port_type = 1,
7015
7016         .get_host_port_state = lpfc_get_host_port_state,
7017         .show_host_port_state = 1,
7018
7019         /* active_fc4s is shown but doesn't change (thus no get function) */
7020         .show_host_active_fc4s = 1,
7021
7022         .get_host_speed = lpfc_get_host_speed,
7023         .show_host_speed = 1,
7024
7025         .get_host_fabric_name = lpfc_get_host_fabric_name,
7026         .show_host_fabric_name = 1,
7027
7028         /*
7029          * The LPFC driver treats linkdown handling as target loss events
7030          * so there are no sysfs handlers for link_down_tmo.
7031          */
7032
7033         .get_fc_host_stats = lpfc_get_stats,
7034         .reset_fc_host_stats = lpfc_reset_stats,
7035
7036         .dd_fcrport_size = sizeof(struct lpfc_rport_data),
7037         .show_rport_maxframe_size = 1,
7038         .show_rport_supported_classes = 1,
7039
7040         .set_rport_dev_loss_tmo = lpfc_set_rport_loss_tmo,
7041         .show_rport_dev_loss_tmo = 1,
7042
7043         .get_starget_port_id  = lpfc_get_starget_port_id,
7044         .show_starget_port_id = 1,
7045
7046         .get_starget_node_name = lpfc_get_starget_node_name,
7047         .show_starget_node_name = 1,
7048
7049         .get_starget_port_name = lpfc_get_starget_port_name,
7050         .show_starget_port_name = 1,
7051
7052         .issue_fc_host_lip = lpfc_issue_lip,
7053         .dev_loss_tmo_callbk = lpfc_dev_loss_tmo_callbk,
7054         .terminate_rport_io = lpfc_terminate_rport_io,
7055
7056         .dd_fcvport_size = sizeof(struct lpfc_vport *),
7057
7058         .vport_disable = lpfc_vport_disable,
7059
7060         .set_vport_symbolic_name = lpfc_set_vport_symbolic_name,
7061
7062         .bsg_request = lpfc_bsg_request,
7063         .bsg_timeout = lpfc_bsg_timeout,
7064 };
7065
7066 struct fc_function_template lpfc_vport_transport_functions = {
7067         /* fixed attributes the driver supports */
7068         .show_host_node_name = 1,
7069         .show_host_port_name = 1,
7070         .show_host_supported_classes = 1,
7071         .show_host_supported_fc4s = 1,
7072         .show_host_supported_speeds = 1,
7073         .show_host_maxframe_size = 1,
7074
7075         .get_host_symbolic_name = lpfc_get_host_symbolic_name,
7076         .show_host_symbolic_name = 1,
7077
7078         /* dynamic attributes the driver supports */
7079         .get_host_port_id = lpfc_get_host_port_id,
7080         .show_host_port_id = 1,
7081
7082         .get_host_port_type = lpfc_get_host_port_type,
7083         .show_host_port_type = 1,
7084
7085         .get_host_port_state = lpfc_get_host_port_state,
7086         .show_host_port_state = 1,
7087
7088         /* active_fc4s is shown but doesn't change (thus no get function) */
7089         .show_host_active_fc4s = 1,
7090
7091         .get_host_speed = lpfc_get_host_speed,
7092         .show_host_speed = 1,
7093
7094         .get_host_fabric_name = lpfc_get_host_fabric_name,
7095         .show_host_fabric_name = 1,
7096
7097         /*
7098          * The LPFC driver treats linkdown handling as target loss events
7099          * so there are no sysfs handlers for link_down_tmo.
7100          */
7101
7102         .get_fc_host_stats = lpfc_get_stats,
7103         .reset_fc_host_stats = lpfc_reset_stats,
7104
7105         .dd_fcrport_size = sizeof(struct lpfc_rport_data),
7106         .show_rport_maxframe_size = 1,
7107         .show_rport_supported_classes = 1,
7108
7109         .set_rport_dev_loss_tmo = lpfc_set_rport_loss_tmo,
7110         .show_rport_dev_loss_tmo = 1,
7111
7112         .get_starget_port_id  = lpfc_get_starget_port_id,
7113         .show_starget_port_id = 1,
7114
7115         .get_starget_node_name = lpfc_get_starget_node_name,
7116         .show_starget_node_name = 1,
7117
7118         .get_starget_port_name = lpfc_get_starget_port_name,
7119         .show_starget_port_name = 1,
7120
7121         .dev_loss_tmo_callbk = lpfc_dev_loss_tmo_callbk,
7122         .terminate_rport_io = lpfc_terminate_rport_io,
7123
7124         .vport_disable = lpfc_vport_disable,
7125
7126         .set_vport_symbolic_name = lpfc_set_vport_symbolic_name,
7127 };
7128
7129 /**
7130  * lpfc_get_hba_function_mode - Used to determine the HBA function in FCoE
7131  * Mode
7132  * @phba: lpfc_hba pointer.
7133  **/
7134 static void
7135 lpfc_get_hba_function_mode(struct lpfc_hba *phba)
7136 {
7137         /* If the adapter supports FCoE mode */
7138         switch (phba->pcidev->device) {
7139         case PCI_DEVICE_ID_SKYHAWK:
7140         case PCI_DEVICE_ID_SKYHAWK_VF:
7141         case PCI_DEVICE_ID_LANCER_FCOE:
7142         case PCI_DEVICE_ID_LANCER_FCOE_VF:
7143         case PCI_DEVICE_ID_ZEPHYR_DCSP:
7144         case PCI_DEVICE_ID_TIGERSHARK:
7145         case PCI_DEVICE_ID_TOMCAT:
7146                 phba->hba_flag |= HBA_FCOE_MODE;
7147                 break;
7148         default:
7149         /* for others, clear the flag */
7150                 phba->hba_flag &= ~HBA_FCOE_MODE;
7151         }
7152 }
7153
7154 /**
7155  * lpfc_get_cfgparam - Used during probe_one to init the adapter structure
7156  * @phba: lpfc_hba pointer.
7157  **/
7158 void
7159 lpfc_get_cfgparam(struct lpfc_hba *phba)
7160 {
7161         lpfc_hba_log_verbose_init(phba, lpfc_log_verbose);
7162         lpfc_fcp_io_sched_init(phba, lpfc_fcp_io_sched);
7163         lpfc_ns_query_init(phba, lpfc_ns_query);
7164         lpfc_fcp2_no_tgt_reset_init(phba, lpfc_fcp2_no_tgt_reset);
7165         lpfc_cr_delay_init(phba, lpfc_cr_delay);
7166         lpfc_cr_count_init(phba, lpfc_cr_count);
7167         lpfc_multi_ring_support_init(phba, lpfc_multi_ring_support);
7168         lpfc_multi_ring_rctl_init(phba, lpfc_multi_ring_rctl);
7169         lpfc_multi_ring_type_init(phba, lpfc_multi_ring_type);
7170         lpfc_ack0_init(phba, lpfc_ack0);
7171         lpfc_xri_rebalancing_init(phba, lpfc_xri_rebalancing);
7172         lpfc_topology_init(phba, lpfc_topology);
7173         lpfc_link_speed_init(phba, lpfc_link_speed);
7174         lpfc_poll_tmo_init(phba, lpfc_poll_tmo);
7175         lpfc_task_mgmt_tmo_init(phba, lpfc_task_mgmt_tmo);
7176         lpfc_enable_npiv_init(phba, lpfc_enable_npiv);
7177         lpfc_fcf_failover_policy_init(phba, lpfc_fcf_failover_policy);
7178         lpfc_enable_rrq_init(phba, lpfc_enable_rrq);
7179         lpfc_fcp_wait_abts_rsp_init(phba, lpfc_fcp_wait_abts_rsp);
7180         lpfc_fdmi_on_init(phba, lpfc_fdmi_on);
7181         lpfc_enable_SmartSAN_init(phba, lpfc_enable_SmartSAN);
7182         lpfc_use_msi_init(phba, lpfc_use_msi);
7183         lpfc_nvme_oas_init(phba, lpfc_nvme_oas);
7184         lpfc_nvme_embed_cmd_init(phba, lpfc_nvme_embed_cmd);
7185         lpfc_fcp_imax_init(phba, lpfc_fcp_imax);
7186         lpfc_force_rscn_init(phba, lpfc_force_rscn);
7187         lpfc_cq_poll_threshold_init(phba, lpfc_cq_poll_threshold);
7188         lpfc_cq_max_proc_limit_init(phba, lpfc_cq_max_proc_limit);
7189         lpfc_fcp_cpu_map_init(phba, lpfc_fcp_cpu_map);
7190         lpfc_enable_hba_reset_init(phba, lpfc_enable_hba_reset);
7191         lpfc_enable_hba_heartbeat_init(phba, lpfc_enable_hba_heartbeat);
7192
7193         lpfc_EnableXLane_init(phba, lpfc_EnableXLane);
7194         /* VMID Inits */
7195         lpfc_max_vmid_init(phba, lpfc_max_vmid);
7196         lpfc_vmid_inactivity_timeout_init(phba, lpfc_vmid_inactivity_timeout);
7197         lpfc_vmid_app_header_init(phba, lpfc_vmid_app_header);
7198         lpfc_vmid_priority_tagging_init(phba, lpfc_vmid_priority_tagging);
7199         if (phba->sli_rev != LPFC_SLI_REV4)
7200                 phba->cfg_EnableXLane = 0;
7201         lpfc_XLanePriority_init(phba, lpfc_XLanePriority);
7202
7203         memset(phba->cfg_oas_tgt_wwpn, 0, (8 * sizeof(uint8_t)));
7204         memset(phba->cfg_oas_vpt_wwpn, 0, (8 * sizeof(uint8_t)));
7205         phba->cfg_oas_lun_state = 0;
7206         phba->cfg_oas_lun_status = 0;
7207         phba->cfg_oas_flags = 0;
7208         phba->cfg_oas_priority = 0;
7209         lpfc_enable_bg_init(phba, lpfc_enable_bg);
7210         lpfc_prot_mask_init(phba, lpfc_prot_mask);
7211         lpfc_prot_guard_init(phba, lpfc_prot_guard);
7212         if (phba->sli_rev == LPFC_SLI_REV4)
7213                 phba->cfg_poll = 0;
7214         else
7215                 phba->cfg_poll = lpfc_poll;
7216
7217         /* Get the function mode */
7218         lpfc_get_hba_function_mode(phba);
7219
7220         /* BlockGuard allowed for FC only. */
7221         if (phba->cfg_enable_bg && phba->hba_flag & HBA_FCOE_MODE) {
7222                 lpfc_printf_log(phba, KERN_INFO, LOG_INIT,
7223                                 "0581 BlockGuard feature not supported\n");
7224                 /* If set, clear the BlockGuard support param */
7225                 phba->cfg_enable_bg = 0;
7226         } else if (phba->cfg_enable_bg) {
7227                 phba->sli3_options |= LPFC_SLI3_BG_ENABLED;
7228         }
7229
7230         lpfc_suppress_rsp_init(phba, lpfc_suppress_rsp);
7231
7232         lpfc_enable_fc4_type_init(phba, lpfc_enable_fc4_type);
7233         lpfc_nvmet_mrq_init(phba, lpfc_nvmet_mrq);
7234         lpfc_nvmet_mrq_post_init(phba, lpfc_nvmet_mrq_post);
7235
7236         /* Initialize first burst. Target vs Initiator are different. */
7237         lpfc_nvme_enable_fb_init(phba, lpfc_nvme_enable_fb);
7238         lpfc_nvmet_fb_size_init(phba, lpfc_nvmet_fb_size);
7239         lpfc_fcp_mq_threshold_init(phba, lpfc_fcp_mq_threshold);
7240         lpfc_hdw_queue_init(phba, lpfc_hdw_queue);
7241         lpfc_irq_chann_init(phba, lpfc_irq_chann);
7242         lpfc_enable_bbcr_init(phba, lpfc_enable_bbcr);
7243         lpfc_enable_dpp_init(phba, lpfc_enable_dpp);
7244         lpfc_enable_mi_init(phba, lpfc_enable_mi);
7245
7246         phba->cgn_p.cgn_param_mode = LPFC_CFG_OFF;
7247         phba->cmf_active_mode = LPFC_CFG_OFF;
7248         if (lpfc_fabric_cgn_frequency > EDC_CG_SIGFREQ_CNT_MAX ||
7249            lpfc_fabric_cgn_frequency < EDC_CG_SIGFREQ_CNT_MIN)
7250                 lpfc_fabric_cgn_frequency = 100; /* 100 ms default */
7251
7252         if (phba->sli_rev != LPFC_SLI_REV4) {
7253                 /* NVME only supported on SLI4 */
7254                 phba->nvmet_support = 0;
7255                 phba->cfg_nvmet_mrq = 0;
7256                 phba->cfg_enable_fc4_type = LPFC_ENABLE_FCP;
7257                 phba->cfg_enable_bbcr = 0;
7258                 phba->cfg_xri_rebalancing = 0;
7259         } else {
7260                 /* We MUST have FCP support */
7261                 if (!(phba->cfg_enable_fc4_type & LPFC_ENABLE_FCP))
7262                         phba->cfg_enable_fc4_type |= LPFC_ENABLE_FCP;
7263         }
7264
7265         phba->cfg_auto_imax = (phba->cfg_fcp_imax) ? 0 : 1;
7266
7267         phba->cfg_enable_pbde = 0;
7268
7269         /* A value of 0 means use the number of CPUs found in the system */
7270         if (phba->cfg_hdw_queue == 0)
7271                 phba->cfg_hdw_queue = phba->sli4_hba.num_present_cpu;
7272         if (phba->cfg_irq_chann == 0)
7273                 phba->cfg_irq_chann = phba->sli4_hba.num_present_cpu;
7274         if (phba->cfg_irq_chann > phba->cfg_hdw_queue &&
7275             phba->sli_rev == LPFC_SLI_REV4)
7276                 phba->cfg_irq_chann = phba->cfg_hdw_queue;
7277
7278         lpfc_sg_seg_cnt_init(phba, lpfc_sg_seg_cnt);
7279         lpfc_hba_queue_depth_init(phba, lpfc_hba_queue_depth);
7280         lpfc_aer_support_init(phba, lpfc_aer_support);
7281         lpfc_sriov_nr_virtfn_init(phba, lpfc_sriov_nr_virtfn);
7282         lpfc_request_firmware_upgrade_init(phba, lpfc_req_fw_upgrade);
7283         lpfc_suppress_link_up_init(phba, lpfc_suppress_link_up);
7284         lpfc_delay_discovery_init(phba, lpfc_delay_discovery);
7285         lpfc_sli_mode_init(phba, lpfc_sli_mode);
7286         lpfc_enable_mds_diags_init(phba, lpfc_enable_mds_diags);
7287         lpfc_ras_fwlog_buffsize_init(phba, lpfc_ras_fwlog_buffsize);
7288         lpfc_ras_fwlog_level_init(phba, lpfc_ras_fwlog_level);
7289         lpfc_ras_fwlog_func_init(phba, lpfc_ras_fwlog_func);
7290
7291         return;
7292 }
7293
7294 /**
7295  * lpfc_nvme_mod_param_dep - Adjust module parameter value based on
7296  * dependencies between protocols and roles.
7297  * @phba: lpfc_hba pointer.
7298  **/
7299 void
7300 lpfc_nvme_mod_param_dep(struct lpfc_hba *phba)
7301 {
7302         int  logit = 0;
7303
7304         if (phba->cfg_hdw_queue > phba->sli4_hba.num_present_cpu) {
7305                 phba->cfg_hdw_queue = phba->sli4_hba.num_present_cpu;
7306                 logit = 1;
7307         }
7308         if (phba->cfg_irq_chann > phba->sli4_hba.num_present_cpu) {
7309                 phba->cfg_irq_chann = phba->sli4_hba.num_present_cpu;
7310                 logit = 1;
7311         }
7312         if (phba->cfg_irq_chann > phba->cfg_hdw_queue) {
7313                 phba->cfg_irq_chann = phba->cfg_hdw_queue;
7314                 logit = 1;
7315         }
7316         if (logit)
7317                 lpfc_printf_log(phba, KERN_ERR, LOG_SLI,
7318                                 "2006 Reducing Queues - CPU limitation: "
7319                                 "IRQ %d HDWQ %d\n",
7320                                 phba->cfg_irq_chann,
7321                                 phba->cfg_hdw_queue);
7322
7323         if (phba->cfg_enable_fc4_type & LPFC_ENABLE_NVME &&
7324             phba->nvmet_support) {
7325                 phba->cfg_enable_fc4_type &= ~LPFC_ENABLE_FCP;
7326
7327                 lpfc_printf_log(phba, KERN_INFO, LOG_NVME_DISC,
7328                                 "6013 %s x%x fb_size x%x, fb_max x%x\n",
7329                                 "NVME Target PRLI ACC enable_fb ",
7330                                 phba->cfg_nvme_enable_fb,
7331                                 phba->cfg_nvmet_fb_size,
7332                                 LPFC_NVMET_FB_SZ_MAX);
7333
7334                 if (phba->cfg_nvme_enable_fb == 0)
7335                         phba->cfg_nvmet_fb_size = 0;
7336                 else {
7337                         if (phba->cfg_nvmet_fb_size > LPFC_NVMET_FB_SZ_MAX)
7338                                 phba->cfg_nvmet_fb_size = LPFC_NVMET_FB_SZ_MAX;
7339                 }
7340
7341                 if (!phba->cfg_nvmet_mrq)
7342                         phba->cfg_nvmet_mrq = phba->cfg_hdw_queue;
7343
7344                 /* Adjust lpfc_nvmet_mrq to avoid running out of WQE slots */
7345                 if (phba->cfg_nvmet_mrq > phba->cfg_hdw_queue) {
7346                         phba->cfg_nvmet_mrq = phba->cfg_hdw_queue;
7347                         lpfc_printf_log(phba, KERN_ERR, LOG_NVME_DISC,
7348                                         "6018 Adjust lpfc_nvmet_mrq to %d\n",
7349                                         phba->cfg_nvmet_mrq);
7350                 }
7351                 if (phba->cfg_nvmet_mrq > LPFC_NVMET_MRQ_MAX)
7352                         phba->cfg_nvmet_mrq = LPFC_NVMET_MRQ_MAX;
7353
7354         } else {
7355                 /* Not NVME Target mode.  Turn off Target parameters. */
7356                 phba->nvmet_support = 0;
7357                 phba->cfg_nvmet_mrq = 0;
7358                 phba->cfg_nvmet_fb_size = 0;
7359         }
7360 }
7361
7362 /**
7363  * lpfc_get_vport_cfgparam - Used during port create, init the vport structure
7364  * @vport: lpfc_vport pointer.
7365  **/
7366 void
7367 lpfc_get_vport_cfgparam(struct lpfc_vport *vport)
7368 {
7369         lpfc_log_verbose_init(vport, lpfc_log_verbose);
7370         lpfc_lun_queue_depth_init(vport, lpfc_lun_queue_depth);
7371         lpfc_tgt_queue_depth_init(vport, lpfc_tgt_queue_depth);
7372         lpfc_devloss_tmo_init(vport, lpfc_devloss_tmo);
7373         lpfc_nodev_tmo_init(vport, lpfc_nodev_tmo);
7374         lpfc_peer_port_login_init(vport, lpfc_peer_port_login);
7375         lpfc_restrict_login_init(vport, lpfc_restrict_login);
7376         lpfc_fcp_class_init(vport, lpfc_fcp_class);
7377         lpfc_use_adisc_init(vport, lpfc_use_adisc);
7378         lpfc_first_burst_size_init(vport, lpfc_first_burst_size);
7379         lpfc_max_scsicmpl_time_init(vport, lpfc_max_scsicmpl_time);
7380         lpfc_discovery_threads_init(vport, lpfc_discovery_threads);
7381         lpfc_max_luns_init(vport, lpfc_max_luns);
7382         lpfc_scan_down_init(vport, lpfc_scan_down);
7383         lpfc_enable_da_id_init(vport, lpfc_enable_da_id);
7384         return;
7385 }
This page took 0.481513 seconds and 4 git commands to generate.