blob: 514513f837a8928f116990033380335f030e9106 [file] [log] [blame]
dea31012005-04-17 16:05:31 -05001/*******************************************************************
2 * This file is part of the Emulex Linux Device Driver for *
James.Smart@Emulex.Comc44ce172005-06-25 10:34:39 -04003 * Fibre Channel Host Bus Adapters. *
James Smart128bdda2018-01-30 15:59:03 -08004 * Copyright (C) 2017-2018 Broadcom. All Rights Reserved. The term *
James Smart3e21d1c2018-05-04 20:37:59 -07005 * “Broadcom” refers to Broadcom Inc. and/or its subsidiaries. *
James Smart50611572016-03-31 14:12:34 -07006 * Copyright (C) 2004-2016 Emulex. All rights reserved. *
James.Smart@Emulex.Comc44ce172005-06-25 10:34:39 -04007 * EMULEX and SLI are trademarks of Emulex. *
James Smartd080abe2017-02-12 13:52:39 -08008 * www.broadcom.com *
James.Smart@Emulex.Comc44ce172005-06-25 10:34:39 -04009 * Portions Copyright (C) 2004-2005 Christoph Hellwig *
dea31012005-04-17 16:05:31 -050010 * *
11 * This program is free software; you can redistribute it and/or *
James.Smart@Emulex.Comc44ce172005-06-25 10:34:39 -040012 * 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. *
dea31012005-04-17 16:05:31 -050022 *******************************************************************/
23
dea31012005-04-17 16:05:31 -050024#include <linux/ctype.h>
James Smart46fa3112007-04-25 09:51:45 -040025#include <linux/delay.h>
dea31012005-04-17 16:05:31 -050026#include <linux/pci.h>
27#include <linux/interrupt.h>
Paul Gortmakeracf3368f2011-05-27 09:47:43 -040028#include <linux/module.h>
James Smart0d878412009-10-02 15:16:56 -040029#include <linux/aer.h>
Tejun Heo5a0e3ad2010-03-24 17:04:11 +090030#include <linux/gfp.h>
Andy Shevchenkoecc30992010-08-10 18:01:27 -070031#include <linux/kernel.h>
dea31012005-04-17 16:05:31 -050032
James.Smart@Emulex.Com91886522005-08-10 15:03:09 -040033#include <scsi/scsi.h>
dea31012005-04-17 16:05:31 -050034#include <scsi/scsi_device.h>
35#include <scsi/scsi_host.h>
36#include <scsi/scsi_tcq.h>
37#include <scsi/scsi_transport_fc.h>
James Smart6a9c52c2009-10-02 15:16:51 -040038#include <scsi/fc/fc_fs.h>
dea31012005-04-17 16:05:31 -050039
James Smart895427b2017-02-12 13:52:30 -080040#include <linux/nvme-fc-driver.h>
41
James Smartda0436e2009-05-22 14:51:39 -040042#include "lpfc_hw4.h"
dea31012005-04-17 16:05:31 -050043#include "lpfc_hw.h"
44#include "lpfc_sli.h"
James Smartda0436e2009-05-22 14:51:39 -040045#include "lpfc_sli4.h"
James Smartea2151b2008-09-07 11:52:10 -040046#include "lpfc_nl.h"
dea31012005-04-17 16:05:31 -050047#include "lpfc_disc.h"
dea31012005-04-17 16:05:31 -050048#include "lpfc.h"
James Smart895427b2017-02-12 13:52:30 -080049#include "lpfc_scsi.h"
50#include "lpfc_nvme.h"
James Smartf358dd02017-02-12 13:52:34 -080051#include "lpfc_nvmet.h"
dea31012005-04-17 16:05:31 -050052#include "lpfc_logmsg.h"
53#include "lpfc_version.h"
54#include "lpfc_compat.h"
55#include "lpfc_crtn.h"
James Smart92d7f7b2007-06-17 19:56:38 -050056#include "lpfc_vport.h"
James Smart93dd1912016-07-06 12:36:10 -070057#include "lpfc_attr.h"
dea31012005-04-17 16:05:31 -050058
James Smart2ea259e2017-02-12 13:52:27 -080059#define LPFC_DEF_DEVLOSS_TMO 30
60#define LPFC_MIN_DEVLOSS_TMO 1
61#define LPFC_MAX_DEVLOSS_TMO 255
dea31012005-04-17 16:05:31 -050062
James Smart61f3d4b2017-05-15 15:20:41 -070063#define LPFC_DEF_MRQ_POST 512
64#define LPFC_MIN_MRQ_POST 512
65#define LPFC_MAX_MRQ_POST 2048
dea31012005-04-17 16:05:31 -050066
James Smartafff0d22018-06-26 08:24:22 -070067#define LPFC_MAX_NVME_INFO_TMP_LEN 100
68#define LPFC_NVME_INFO_MORE_STR "\nCould be more info...\n"
69
James Smartf7a919b2011-08-21 21:49:16 -040070/*
71 * Write key size should be multiple of 4. If write key is changed
72 * make sure that library write key is also changed.
73 */
74#define LPFC_REG_WRITE_KEY_SIZE 4
75#define LPFC_REG_WRITE_KEY "EMLX"
76
James Smarte59058c2008-08-24 21:49:00 -040077/**
James Smart3621a712009-04-06 18:47:14 -040078 * lpfc_jedec_to_ascii - Hex to ascii convertor according to JEDEC rules
James Smarte59058c2008-08-24 21:49:00 -040079 * @incr: integer to convert.
80 * @hdw: ascii string holding converted integer plus a string terminator.
81 *
82 * Description:
83 * JEDEC Joint Electron Device Engineering Council.
84 * Convert a 32 bit integer composed of 8 nibbles into an 8 byte ascii
85 * character string. The string is then terminated with a NULL in byte 9.
86 * Hex 0-9 becomes ascii '0' to '9'.
87 * Hex a-f becomes ascii '=' to 'B' capital B.
88 *
89 * Notes:
90 * Coded for 32 bit integers only.
91 **/
dea31012005-04-17 16:05:31 -050092static void
93lpfc_jedec_to_ascii(int incr, char hdw[])
94{
95 int i, j;
96 for (i = 0; i < 8; i++) {
97 j = (incr & 0xf);
98 if (j <= 9)
99 hdw[7 - i] = 0x30 + j;
100 else
101 hdw[7 - i] = 0x61 + j - 10;
102 incr = (incr >> 4);
103 }
104 hdw[8] = 0;
105 return;
106}
107
James Smarte59058c2008-08-24 21:49:00 -0400108/**
James Smart3621a712009-04-06 18:47:14 -0400109 * lpfc_drvr_version_show - Return the Emulex driver string with version number
James Smarte59058c2008-08-24 21:49:00 -0400110 * @dev: class unused variable.
111 * @attr: device attribute, not used.
112 * @buf: on return contains the module description text.
113 *
114 * Returns: size of formatted string.
115 **/
dea31012005-04-17 16:05:31 -0500116static ssize_t
Tony Jonesee959b02008-02-22 00:13:36 +0100117lpfc_drvr_version_show(struct device *dev, struct device_attribute *attr,
118 char *buf)
dea31012005-04-17 16:05:31 -0500119{
120 return snprintf(buf, PAGE_SIZE, LPFC_MODULE_DESC "\n");
121}
122
James Smart45ed1192009-10-02 15:17:02 -0400123/**
124 * lpfc_enable_fip_show - Return the fip mode of the HBA
125 * @dev: class unused variable.
126 * @attr: device attribute, not used.
127 * @buf: on return contains the module description text.
128 *
129 * Returns: size of formatted string.
130 **/
131static ssize_t
132lpfc_enable_fip_show(struct device *dev, struct device_attribute *attr,
133 char *buf)
134{
135 struct Scsi_Host *shost = class_to_shost(dev);
136 struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata;
137 struct lpfc_hba *phba = vport->phba;
138
139 if (phba->hba_flag & HBA_FIP_SUPPORT)
140 return snprintf(buf, PAGE_SIZE, "1\n");
141 else
142 return snprintf(buf, PAGE_SIZE, "0\n");
143}
144
James Smart81301a92008-12-04 22:39:46 -0500145static ssize_t
James Smart895427b2017-02-12 13:52:30 -0800146lpfc_nvme_info_show(struct device *dev, struct device_attribute *attr,
147 char *buf)
148{
149 struct Scsi_Host *shost = class_to_shost(dev);
150 struct lpfc_vport *vport = shost_priv(shost);
151 struct lpfc_hba *phba = vport->phba;
James Smartf358dd02017-02-12 13:52:34 -0800152 struct lpfc_nvmet_tgtport *tgtp;
James Smart895427b2017-02-12 13:52:30 -0800153 struct nvme_fc_local_port *localport;
James Smart4b056682017-12-08 17:18:10 -0800154 struct lpfc_nvme_lport *lport;
James Smart01466022018-04-09 14:24:27 -0700155 struct lpfc_nvme_rport *rport;
James Smart80cc0042017-06-01 21:06:56 -0700156 struct lpfc_nodelist *ndlp;
James Smart895427b2017-02-12 13:52:30 -0800157 struct nvme_fc_remote_port *nrport;
James Smart66a210f2018-04-09 14:24:23 -0700158 struct lpfc_nvme_ctrl_stat *cstat;
159 uint64_t data1, data2, data3;
160 uint64_t totin, totout, tot;
James Smart895427b2017-02-12 13:52:30 -0800161 char *statep;
James Smart66a210f2018-04-09 14:24:23 -0700162 int i;
James Smart895427b2017-02-12 13:52:30 -0800163 int len = 0;
James Smartafff0d22018-06-26 08:24:22 -0700164 char tmp[LPFC_MAX_NVME_INFO_TMP_LEN] = {0};
James Smart895427b2017-02-12 13:52:30 -0800165
166 if (!(phba->cfg_enable_fc4_type & LPFC_ENABLE_NVME)) {
James Smartafff0d22018-06-26 08:24:22 -0700167 len = scnprintf(buf, PAGE_SIZE, "NVME Disabled\n");
James Smart895427b2017-02-12 13:52:30 -0800168 return len;
169 }
James Smartf358dd02017-02-12 13:52:34 -0800170 if (phba->nvmet_support) {
171 if (!phba->targetport) {
James Smartafff0d22018-06-26 08:24:22 -0700172 len = scnprintf(buf, PAGE_SIZE,
James Smartf358dd02017-02-12 13:52:34 -0800173 "NVME Target: x%llx is not allocated\n",
174 wwn_to_u64(vport->fc_portname.u.wwn));
175 return len;
176 }
177 /* Port state is only one of two values for now. */
178 if (phba->targetport->port_id)
179 statep = "REGISTERED";
180 else
181 statep = "INIT";
James Smartafff0d22018-06-26 08:24:22 -0700182 scnprintf(tmp, sizeof(tmp),
183 "NVME Target Enabled State %s\n",
184 statep);
185 if (strlcat(buf, tmp, PAGE_SIZE) >= PAGE_SIZE)
186 goto buffer_done;
James Smartf358dd02017-02-12 13:52:34 -0800187
James Smartafff0d22018-06-26 08:24:22 -0700188 scnprintf(tmp, sizeof(tmp),
189 "%s%d WWPN x%llx WWNN x%llx DID x%06x\n",
190 "NVME Target: lpfc",
191 phba->brd_no,
192 wwn_to_u64(vport->fc_portname.u.wwn),
193 wwn_to_u64(vport->fc_nodename.u.wwn),
194 phba->targetport->port_id);
195 if (strlcat(buf, tmp, PAGE_SIZE) >= PAGE_SIZE)
196 goto buffer_done;
197
198 if (strlcat(buf, "\nNVME Target: Statistics\n", PAGE_SIZE)
199 >= PAGE_SIZE)
200 goto buffer_done;
201
James Smartf358dd02017-02-12 13:52:34 -0800202 tgtp = (struct lpfc_nvmet_tgtport *)phba->targetport->private;
James Smartafff0d22018-06-26 08:24:22 -0700203 scnprintf(tmp, sizeof(tmp),
204 "LS: Rcv %08x Drop %08x Abort %08x\n",
205 atomic_read(&tgtp->rcv_ls_req_in),
206 atomic_read(&tgtp->rcv_ls_req_drop),
207 atomic_read(&tgtp->xmt_ls_abort));
208 if (strlcat(buf, tmp, PAGE_SIZE) >= PAGE_SIZE)
209 goto buffer_done;
210
James Smartf358dd02017-02-12 13:52:34 -0800211 if (atomic_read(&tgtp->rcv_ls_req_in) !=
212 atomic_read(&tgtp->rcv_ls_req_out)) {
James Smartafff0d22018-06-26 08:24:22 -0700213 scnprintf(tmp, sizeof(tmp),
214 "Rcv LS: in %08x != out %08x\n",
215 atomic_read(&tgtp->rcv_ls_req_in),
216 atomic_read(&tgtp->rcv_ls_req_out));
217 if (strlcat(buf, tmp, PAGE_SIZE) >= PAGE_SIZE)
218 goto buffer_done;
James Smartf358dd02017-02-12 13:52:34 -0800219 }
220
James Smartafff0d22018-06-26 08:24:22 -0700221 scnprintf(tmp, sizeof(tmp),
222 "LS: Xmt %08x Drop %08x Cmpl %08x\n",
223 atomic_read(&tgtp->xmt_ls_rsp),
224 atomic_read(&tgtp->xmt_ls_drop),
225 atomic_read(&tgtp->xmt_ls_rsp_cmpl));
226 if (strlcat(buf, tmp, PAGE_SIZE) >= PAGE_SIZE)
227 goto buffer_done;
James Smart4b056682017-12-08 17:18:10 -0800228
James Smartafff0d22018-06-26 08:24:22 -0700229 scnprintf(tmp, sizeof(tmp),
230 "LS: RSP Abort %08x xb %08x Err %08x\n",
231 atomic_read(&tgtp->xmt_ls_rsp_aborted),
232 atomic_read(&tgtp->xmt_ls_rsp_xb_set),
233 atomic_read(&tgtp->xmt_ls_rsp_error));
234 if (strlcat(buf, tmp, PAGE_SIZE) >= PAGE_SIZE)
235 goto buffer_done;
James Smartf358dd02017-02-12 13:52:34 -0800236
James Smartafff0d22018-06-26 08:24:22 -0700237 scnprintf(tmp, sizeof(tmp),
238 "FCP: Rcv %08x Defer %08x Release %08x "
239 "Drop %08x\n",
240 atomic_read(&tgtp->rcv_fcp_cmd_in),
241 atomic_read(&tgtp->rcv_fcp_cmd_defer),
242 atomic_read(&tgtp->xmt_fcp_release),
243 atomic_read(&tgtp->rcv_fcp_cmd_drop));
244 if (strlcat(buf, tmp, PAGE_SIZE) >= PAGE_SIZE)
245 goto buffer_done;
James Smartf358dd02017-02-12 13:52:34 -0800246
247 if (atomic_read(&tgtp->rcv_fcp_cmd_in) !=
248 atomic_read(&tgtp->rcv_fcp_cmd_out)) {
James Smartafff0d22018-06-26 08:24:22 -0700249 scnprintf(tmp, sizeof(tmp),
250 "Rcv FCP: in %08x != out %08x\n",
251 atomic_read(&tgtp->rcv_fcp_cmd_in),
252 atomic_read(&tgtp->rcv_fcp_cmd_out));
253 if (strlcat(buf, tmp, PAGE_SIZE) >= PAGE_SIZE)
254 goto buffer_done;
James Smartf358dd02017-02-12 13:52:34 -0800255 }
256
James Smartafff0d22018-06-26 08:24:22 -0700257 scnprintf(tmp, sizeof(tmp),
258 "FCP Rsp: RD %08x rsp %08x WR %08x rsp %08x "
259 "drop %08x\n",
260 atomic_read(&tgtp->xmt_fcp_read),
261 atomic_read(&tgtp->xmt_fcp_read_rsp),
262 atomic_read(&tgtp->xmt_fcp_write),
263 atomic_read(&tgtp->xmt_fcp_rsp),
264 atomic_read(&tgtp->xmt_fcp_drop));
265 if (strlcat(buf, tmp, PAGE_SIZE) >= PAGE_SIZE)
266 goto buffer_done;
James Smartf358dd02017-02-12 13:52:34 -0800267
James Smartafff0d22018-06-26 08:24:22 -0700268 scnprintf(tmp, sizeof(tmp),
269 "FCP Rsp Cmpl: %08x err %08x drop %08x\n",
270 atomic_read(&tgtp->xmt_fcp_rsp_cmpl),
271 atomic_read(&tgtp->xmt_fcp_rsp_error),
272 atomic_read(&tgtp->xmt_fcp_rsp_drop));
273 if (strlcat(buf, tmp, PAGE_SIZE) >= PAGE_SIZE)
274 goto buffer_done;
James Smartf358dd02017-02-12 13:52:34 -0800275
James Smartafff0d22018-06-26 08:24:22 -0700276 scnprintf(tmp, sizeof(tmp),
277 "FCP Rsp Abort: %08x xb %08x xricqe %08x\n",
278 atomic_read(&tgtp->xmt_fcp_rsp_aborted),
279 atomic_read(&tgtp->xmt_fcp_rsp_xb_set),
280 atomic_read(&tgtp->xmt_fcp_xri_abort_cqe));
281 if (strlcat(buf, tmp, PAGE_SIZE) >= PAGE_SIZE)
282 goto buffer_done;
James Smart4b056682017-12-08 17:18:10 -0800283
James Smartafff0d22018-06-26 08:24:22 -0700284 scnprintf(tmp, sizeof(tmp),
285 "ABORT: Xmt %08x Cmpl %08x\n",
286 atomic_read(&tgtp->xmt_fcp_abort),
287 atomic_read(&tgtp->xmt_fcp_abort_cmpl));
288 if (strlcat(buf, tmp, PAGE_SIZE) >= PAGE_SIZE)
289 goto buffer_done;
James Smart547077a2017-05-15 15:20:40 -0700290
James Smartafff0d22018-06-26 08:24:22 -0700291 scnprintf(tmp, sizeof(tmp),
292 "ABORT: Sol %08x Usol %08x Err %08x Cmpl %08x\n",
293 atomic_read(&tgtp->xmt_abort_sol),
294 atomic_read(&tgtp->xmt_abort_unsol),
295 atomic_read(&tgtp->xmt_abort_rsp),
296 atomic_read(&tgtp->xmt_abort_rsp_error));
297 if (strlcat(buf, tmp, PAGE_SIZE) >= PAGE_SIZE)
298 goto buffer_done;
James Smartf358dd02017-02-12 13:52:34 -0800299
James Smartafff0d22018-06-26 08:24:22 -0700300 scnprintf(tmp, sizeof(tmp),
301 "DELAY: ctx %08x fod %08x wqfull %08x\n",
302 atomic_read(&tgtp->defer_ctx),
303 atomic_read(&tgtp->defer_fod),
304 atomic_read(&tgtp->defer_wqfull));
305 if (strlcat(buf, tmp, PAGE_SIZE) >= PAGE_SIZE)
306 goto buffer_done;
James Smart411de512018-01-30 15:58:52 -0800307
Dick Kennedy66d7ce92017-08-23 16:55:42 -0700308 /* Calculate outstanding IOs */
309 tot = atomic_read(&tgtp->rcv_fcp_cmd_drop);
310 tot += atomic_read(&tgtp->xmt_fcp_release);
311 tot = atomic_read(&tgtp->rcv_fcp_cmd_in) - tot;
James Smart2cee7802017-06-01 21:07:02 -0700312
James Smartafff0d22018-06-26 08:24:22 -0700313 scnprintf(tmp, sizeof(tmp),
314 "IO_CTX: %08x WAIT: cur %08x tot %08x\n"
315 "CTX Outstanding %08llx\n\n",
316 phba->sli4_hba.nvmet_xri_cnt,
317 phba->sli4_hba.nvmet_io_wait_cnt,
318 phba->sli4_hba.nvmet_io_wait_total,
319 tot);
320 strlcat(buf, tmp, PAGE_SIZE);
321 goto buffer_done;
James Smartf358dd02017-02-12 13:52:34 -0800322 }
James Smart895427b2017-02-12 13:52:30 -0800323
324 localport = vport->localport;
325 if (!localport) {
James Smartafff0d22018-06-26 08:24:22 -0700326 len = scnprintf(buf, PAGE_SIZE,
James Smart895427b2017-02-12 13:52:30 -0800327 "NVME Initiator x%llx is not allocated\n",
328 wwn_to_u64(vport->fc_portname.u.wwn));
329 return len;
330 }
Colin Ian King5c665ae2017-12-22 00:28:52 +0000331 lport = (struct lpfc_nvme_lport *)localport->private;
James Smartafff0d22018-06-26 08:24:22 -0700332 if (strlcat(buf, "\nNVME Initiator Enabled\n", PAGE_SIZE) >= PAGE_SIZE)
333 goto buffer_done;
James Smart895427b2017-02-12 13:52:30 -0800334
James Smartafff0d22018-06-26 08:24:22 -0700335 rcu_read_lock();
336 scnprintf(tmp, sizeof(tmp),
337 "XRI Dist lpfc%d Total %d NVME %d SCSI %d ELS %d\n",
338 phba->brd_no,
339 phba->sli4_hba.max_cfg_param.max_xri,
340 phba->sli4_hba.nvme_xri_max,
341 phba->sli4_hba.scsi_xri_max,
342 lpfc_sli4_get_els_iocb_cnt(phba));
343 if (strlcat(buf, tmp, PAGE_SIZE) >= PAGE_SIZE)
344 goto buffer_done;
James Smart895427b2017-02-12 13:52:30 -0800345
346 /* Port state is only one of two values for now. */
347 if (localport->port_id)
348 statep = "ONLINE";
349 else
350 statep = "UNKNOWN ";
351
James Smartafff0d22018-06-26 08:24:22 -0700352 scnprintf(tmp, sizeof(tmp),
353 "%s%d WWPN x%llx WWNN x%llx DID x%06x %s\n",
354 "NVME LPORT lpfc",
355 phba->brd_no,
356 wwn_to_u64(vport->fc_portname.u.wwn),
357 wwn_to_u64(vport->fc_nodename.u.wwn),
358 localport->port_id, statep);
359 if (strlcat(buf, tmp, PAGE_SIZE) >= PAGE_SIZE)
360 goto buffer_done;
James Smart895427b2017-02-12 13:52:30 -0800361
James Smart80cc0042017-06-01 21:06:56 -0700362 list_for_each_entry(ndlp, &vport->fc_nodes, nlp_listp) {
James Smart01466022018-04-09 14:24:27 -0700363 rport = lpfc_ndlp_get_nrport(ndlp);
364 if (!rport)
James Smart80cc0042017-06-01 21:06:56 -0700365 continue;
366
James Smart895427b2017-02-12 13:52:30 -0800367 /* local short-hand pointer. */
James Smart01466022018-04-09 14:24:27 -0700368 nrport = rport->remoteport;
369 if (!nrport)
370 continue;
James Smart895427b2017-02-12 13:52:30 -0800371
372 /* Port state is only one of two values for now. */
373 switch (nrport->port_state) {
374 case FC_OBJSTATE_ONLINE:
375 statep = "ONLINE";
376 break;
377 case FC_OBJSTATE_UNKNOWN:
378 statep = "UNKNOWN ";
379 break;
380 default:
381 statep = "UNSUPPORTED";
382 break;
383 }
384
385 /* Tab in to show lport ownership. */
James Smartafff0d22018-06-26 08:24:22 -0700386 if (strlcat(buf, "NVME RPORT ", PAGE_SIZE) >= PAGE_SIZE)
387 goto buffer_done;
388 if (phba->brd_no >= 10) {
389 if (strlcat(buf, " ", PAGE_SIZE) >= PAGE_SIZE)
390 goto buffer_done;
391 }
James Smart895427b2017-02-12 13:52:30 -0800392
James Smartafff0d22018-06-26 08:24:22 -0700393 scnprintf(tmp, sizeof(tmp), "WWPN x%llx ",
394 nrport->port_name);
395 if (strlcat(buf, tmp, PAGE_SIZE) >= PAGE_SIZE)
396 goto buffer_done;
397
398 scnprintf(tmp, sizeof(tmp), "WWNN x%llx ",
399 nrport->node_name);
400 if (strlcat(buf, tmp, PAGE_SIZE) >= PAGE_SIZE)
401 goto buffer_done;
402
403 scnprintf(tmp, sizeof(tmp), "DID x%06x ",
404 nrport->port_id);
405 if (strlcat(buf, tmp, PAGE_SIZE) >= PAGE_SIZE)
406 goto buffer_done;
James Smart895427b2017-02-12 13:52:30 -0800407
James Smart7d790f02017-06-01 21:06:57 -0700408 /* An NVME rport can have multiple roles. */
James Smartafff0d22018-06-26 08:24:22 -0700409 if (nrport->port_role & FC_PORT_ROLE_NVME_INITIATOR) {
410 if (strlcat(buf, "INITIATOR ", PAGE_SIZE) >= PAGE_SIZE)
411 goto buffer_done;
412 }
413 if (nrport->port_role & FC_PORT_ROLE_NVME_TARGET) {
414 if (strlcat(buf, "TARGET ", PAGE_SIZE) >= PAGE_SIZE)
415 goto buffer_done;
416 }
417 if (nrport->port_role & FC_PORT_ROLE_NVME_DISCOVERY) {
418 if (strlcat(buf, "DISCSRVC ", PAGE_SIZE) >= PAGE_SIZE)
419 goto buffer_done;
420 }
James Smart7d790f02017-06-01 21:06:57 -0700421 if (nrport->port_role & ~(FC_PORT_ROLE_NVME_INITIATOR |
422 FC_PORT_ROLE_NVME_TARGET |
James Smartafff0d22018-06-26 08:24:22 -0700423 FC_PORT_ROLE_NVME_DISCOVERY)) {
424 scnprintf(tmp, sizeof(tmp), "UNKNOWN ROLE x%x",
425 nrport->port_role);
426 if (strlcat(buf, tmp, PAGE_SIZE) >= PAGE_SIZE)
427 goto buffer_done;
428 }
James Smart7d790f02017-06-01 21:06:57 -0700429
James Smartafff0d22018-06-26 08:24:22 -0700430 scnprintf(tmp, sizeof(tmp), "%s\n", statep);
431 if (strlcat(buf, tmp, PAGE_SIZE) >= PAGE_SIZE)
432 goto buffer_done;
James Smart895427b2017-02-12 13:52:30 -0800433 }
James Smartafff0d22018-06-26 08:24:22 -0700434 rcu_read_unlock();
James Smart895427b2017-02-12 13:52:30 -0800435
James Smart66a210f2018-04-09 14:24:23 -0700436 if (!lport)
James Smartafff0d22018-06-26 08:24:22 -0700437 goto buffer_done;
James Smart66a210f2018-04-09 14:24:23 -0700438
James Smartafff0d22018-06-26 08:24:22 -0700439 if (strlcat(buf, "\nNVME Statistics\n", PAGE_SIZE) >= PAGE_SIZE)
440 goto buffer_done;
James Smart4b056682017-12-08 17:18:10 -0800441
James Smartafff0d22018-06-26 08:24:22 -0700442 scnprintf(tmp, sizeof(tmp),
443 "LS: Xmt %010x Cmpl %010x Abort %08x\n",
444 atomic_read(&lport->fc4NvmeLsRequests),
445 atomic_read(&lport->fc4NvmeLsCmpls),
446 atomic_read(&lport->xmt_ls_abort));
447 if (strlcat(buf, tmp, PAGE_SIZE) >= PAGE_SIZE)
448 goto buffer_done;
449
450 scnprintf(tmp, sizeof(tmp),
451 "LS XMIT: Err %08x CMPL: xb %08x Err %08x\n",
452 atomic_read(&lport->xmt_ls_err),
453 atomic_read(&lport->cmpl_ls_xb),
454 atomic_read(&lport->cmpl_ls_err));
455 if (strlcat(buf, tmp, PAGE_SIZE) >= PAGE_SIZE)
456 goto buffer_done;
James Smart895427b2017-02-12 13:52:30 -0800457
James Smart66a210f2018-04-09 14:24:23 -0700458 totin = 0;
459 totout = 0;
460 for (i = 0; i < phba->cfg_nvme_io_channel; i++) {
461 cstat = &lport->cstat[i];
462 tot = atomic_read(&cstat->fc4NvmeIoCmpls);
463 totin += tot;
464 data1 = atomic_read(&cstat->fc4NvmeInputRequests);
465 data2 = atomic_read(&cstat->fc4NvmeOutputRequests);
466 data3 = atomic_read(&cstat->fc4NvmeControlRequests);
467 totout += (data1 + data2 + data3);
468 }
James Smartafff0d22018-06-26 08:24:22 -0700469 scnprintf(tmp, sizeof(tmp),
470 "Total FCP Cmpl %016llx Issue %016llx "
471 "OutIO %016llx\n",
472 totin, totout, totout - totin);
473 if (strlcat(buf, tmp, PAGE_SIZE) >= PAGE_SIZE)
474 goto buffer_done;
James Smart895427b2017-02-12 13:52:30 -0800475
James Smartafff0d22018-06-26 08:24:22 -0700476 scnprintf(tmp, sizeof(tmp),
477 "\tabort %08x noxri %08x nondlp %08x qdepth %08x "
478 "wqerr %08x err %08x\n",
479 atomic_read(&lport->xmt_fcp_abort),
480 atomic_read(&lport->xmt_fcp_noxri),
481 atomic_read(&lport->xmt_fcp_bad_ndlp),
482 atomic_read(&lport->xmt_fcp_qdepth),
483 atomic_read(&lport->xmt_fcp_err),
484 atomic_read(&lport->xmt_fcp_wqerr));
485 if (strlcat(buf, tmp, PAGE_SIZE) >= PAGE_SIZE)
486 goto buffer_done;
James Smart4b056682017-12-08 17:18:10 -0800487
James Smartafff0d22018-06-26 08:24:22 -0700488 scnprintf(tmp, sizeof(tmp),
489 "FCP CMPL: xb %08x Err %08x\n",
490 atomic_read(&lport->cmpl_fcp_xb),
491 atomic_read(&lport->cmpl_fcp_err));
492 strlcat(buf, tmp, PAGE_SIZE);
493
494buffer_done:
495 len = strnlen(buf, PAGE_SIZE);
496
497 if (unlikely(len >= (PAGE_SIZE - 1))) {
498 lpfc_printf_log(phba, KERN_INFO, LOG_NVME,
499 "6314 Catching potential buffer "
500 "overflow > PAGE_SIZE = %lu bytes\n",
501 PAGE_SIZE);
502 strlcpy(buf + PAGE_SIZE - 1 -
503 strnlen(LPFC_NVME_INFO_MORE_STR, PAGE_SIZE - 1),
504 LPFC_NVME_INFO_MORE_STR,
505 strnlen(LPFC_NVME_INFO_MORE_STR, PAGE_SIZE - 1)
506 + 1);
507 }
508
James Smart895427b2017-02-12 13:52:30 -0800509 return len;
510}
511
512static ssize_t
James Smart81301a92008-12-04 22:39:46 -0500513lpfc_bg_info_show(struct device *dev, struct device_attribute *attr,
514 char *buf)
515{
516 struct Scsi_Host *shost = class_to_shost(dev);
517 struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata;
518 struct lpfc_hba *phba = vport->phba;
519
520 if (phba->cfg_enable_bg)
521 if (phba->sli3_options & LPFC_SLI3_BG_ENABLED)
522 return snprintf(buf, PAGE_SIZE, "BlockGuard Enabled\n");
523 else
524 return snprintf(buf, PAGE_SIZE,
525 "BlockGuard Not Supported\n");
526 else
527 return snprintf(buf, PAGE_SIZE,
528 "BlockGuard Disabled\n");
529}
530
531static ssize_t
532lpfc_bg_guard_err_show(struct device *dev, struct device_attribute *attr,
533 char *buf)
534{
535 struct Scsi_Host *shost = class_to_shost(dev);
536 struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata;
537 struct lpfc_hba *phba = vport->phba;
538
James Smart87b5c322008-12-16 10:34:09 -0500539 return snprintf(buf, PAGE_SIZE, "%llu\n",
540 (unsigned long long)phba->bg_guard_err_cnt);
James Smart81301a92008-12-04 22:39:46 -0500541}
542
543static ssize_t
544lpfc_bg_apptag_err_show(struct device *dev, struct device_attribute *attr,
545 char *buf)
546{
547 struct Scsi_Host *shost = class_to_shost(dev);
548 struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata;
549 struct lpfc_hba *phba = vport->phba;
550
James Smart87b5c322008-12-16 10:34:09 -0500551 return snprintf(buf, PAGE_SIZE, "%llu\n",
552 (unsigned long long)phba->bg_apptag_err_cnt);
James Smart81301a92008-12-04 22:39:46 -0500553}
554
555static ssize_t
556lpfc_bg_reftag_err_show(struct device *dev, struct device_attribute *attr,
557 char *buf)
558{
559 struct Scsi_Host *shost = class_to_shost(dev);
560 struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata;
561 struct lpfc_hba *phba = vport->phba;
562
James Smart87b5c322008-12-16 10:34:09 -0500563 return snprintf(buf, PAGE_SIZE, "%llu\n",
564 (unsigned long long)phba->bg_reftag_err_cnt);
James Smart81301a92008-12-04 22:39:46 -0500565}
566
James Smarte59058c2008-08-24 21:49:00 -0400567/**
James Smart3621a712009-04-06 18:47:14 -0400568 * lpfc_info_show - Return some pci info about the host in ascii
James Smarte59058c2008-08-24 21:49:00 -0400569 * @dev: class converted to a Scsi_host structure.
570 * @attr: device attribute, not used.
571 * @buf: on return contains the formatted text from lpfc_info().
572 *
573 * Returns: size of formatted string.
574 **/
dea31012005-04-17 16:05:31 -0500575static ssize_t
Tony Jonesee959b02008-02-22 00:13:36 +0100576lpfc_info_show(struct device *dev, struct device_attribute *attr,
577 char *buf)
dea31012005-04-17 16:05:31 -0500578{
Tony Jonesee959b02008-02-22 00:13:36 +0100579 struct Scsi_Host *host = class_to_shost(dev);
James Smart2e0fef82007-06-17 19:56:36 -0500580
dea31012005-04-17 16:05:31 -0500581 return snprintf(buf, PAGE_SIZE, "%s\n",lpfc_info(host));
582}
583
James Smarte59058c2008-08-24 21:49:00 -0400584/**
James Smart3621a712009-04-06 18:47:14 -0400585 * lpfc_serialnum_show - Return the hba serial number in ascii
James Smarte59058c2008-08-24 21:49:00 -0400586 * @dev: class converted to a Scsi_host structure.
587 * @attr: device attribute, not used.
588 * @buf: on return contains the formatted text serial number.
589 *
590 * Returns: size of formatted string.
591 **/
dea31012005-04-17 16:05:31 -0500592static ssize_t
Tony Jonesee959b02008-02-22 00:13:36 +0100593lpfc_serialnum_show(struct device *dev, struct device_attribute *attr,
594 char *buf)
dea31012005-04-17 16:05:31 -0500595{
Tony Jonesee959b02008-02-22 00:13:36 +0100596 struct Scsi_Host *shost = class_to_shost(dev);
James Smart2e0fef82007-06-17 19:56:36 -0500597 struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata;
598 struct lpfc_hba *phba = vport->phba;
599
dea31012005-04-17 16:05:31 -0500600 return snprintf(buf, PAGE_SIZE, "%s\n",phba->SerialNumber);
601}
602
James Smarte59058c2008-08-24 21:49:00 -0400603/**
James Smart3621a712009-04-06 18:47:14 -0400604 * lpfc_temp_sensor_show - Return the temperature sensor level
James Smarte59058c2008-08-24 21:49:00 -0400605 * @dev: class converted to a Scsi_host structure.
606 * @attr: device attribute, not used.
607 * @buf: on return contains the formatted support level.
608 *
609 * Description:
610 * Returns a number indicating the temperature sensor level currently
611 * supported, zero or one in ascii.
612 *
613 * Returns: size of formatted string.
614 **/
dea31012005-04-17 16:05:31 -0500615static ssize_t
Tony Jonesee959b02008-02-22 00:13:36 +0100616lpfc_temp_sensor_show(struct device *dev, struct device_attribute *attr,
617 char *buf)
James Smart57127f12007-10-27 13:37:05 -0400618{
Tony Jonesee959b02008-02-22 00:13:36 +0100619 struct Scsi_Host *shost = class_to_shost(dev);
James Smart57127f12007-10-27 13:37:05 -0400620 struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata;
621 struct lpfc_hba *phba = vport->phba;
622 return snprintf(buf, PAGE_SIZE, "%d\n",phba->temp_sensor_support);
623}
624
James Smarte59058c2008-08-24 21:49:00 -0400625/**
James Smart3621a712009-04-06 18:47:14 -0400626 * lpfc_modeldesc_show - Return the model description of the hba
James Smarte59058c2008-08-24 21:49:00 -0400627 * @dev: class converted to a Scsi_host structure.
628 * @attr: device attribute, not used.
629 * @buf: on return contains the scsi vpd model description.
630 *
631 * Returns: size of formatted string.
632 **/
James Smart57127f12007-10-27 13:37:05 -0400633static ssize_t
Tony Jonesee959b02008-02-22 00:13:36 +0100634lpfc_modeldesc_show(struct device *dev, struct device_attribute *attr,
635 char *buf)
dea31012005-04-17 16:05:31 -0500636{
Tony Jonesee959b02008-02-22 00:13:36 +0100637 struct Scsi_Host *shost = class_to_shost(dev);
James Smart2e0fef82007-06-17 19:56:36 -0500638 struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata;
639 struct lpfc_hba *phba = vport->phba;
640
dea31012005-04-17 16:05:31 -0500641 return snprintf(buf, PAGE_SIZE, "%s\n",phba->ModelDesc);
642}
643
James Smarte59058c2008-08-24 21:49:00 -0400644/**
James Smart3621a712009-04-06 18:47:14 -0400645 * lpfc_modelname_show - Return the model name of the hba
James Smarte59058c2008-08-24 21:49:00 -0400646 * @dev: class converted to a Scsi_host structure.
647 * @attr: device attribute, not used.
648 * @buf: on return contains the scsi vpd model name.
649 *
650 * Returns: size of formatted string.
651 **/
dea31012005-04-17 16:05:31 -0500652static ssize_t
Tony Jonesee959b02008-02-22 00:13:36 +0100653lpfc_modelname_show(struct device *dev, struct device_attribute *attr,
654 char *buf)
dea31012005-04-17 16:05:31 -0500655{
Tony Jonesee959b02008-02-22 00:13:36 +0100656 struct Scsi_Host *shost = class_to_shost(dev);
James Smart2e0fef82007-06-17 19:56:36 -0500657 struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata;
658 struct lpfc_hba *phba = vport->phba;
659
dea31012005-04-17 16:05:31 -0500660 return snprintf(buf, PAGE_SIZE, "%s\n",phba->ModelName);
661}
662
James Smarte59058c2008-08-24 21:49:00 -0400663/**
James Smart3621a712009-04-06 18:47:14 -0400664 * lpfc_programtype_show - Return the program type of the hba
James Smarte59058c2008-08-24 21:49:00 -0400665 * @dev: class converted to a Scsi_host structure.
666 * @attr: device attribute, not used.
667 * @buf: on return contains the scsi vpd program type.
668 *
669 * Returns: size of formatted string.
670 **/
dea31012005-04-17 16:05:31 -0500671static ssize_t
Tony Jonesee959b02008-02-22 00:13:36 +0100672lpfc_programtype_show(struct device *dev, struct device_attribute *attr,
673 char *buf)
dea31012005-04-17 16:05:31 -0500674{
Tony Jonesee959b02008-02-22 00:13:36 +0100675 struct Scsi_Host *shost = class_to_shost(dev);
James Smart2e0fef82007-06-17 19:56:36 -0500676 struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata;
677 struct lpfc_hba *phba = vport->phba;
678
dea31012005-04-17 16:05:31 -0500679 return snprintf(buf, PAGE_SIZE, "%s\n",phba->ProgramType);
680}
681
James Smarte59058c2008-08-24 21:49:00 -0400682/**
James Smart3621a712009-04-06 18:47:14 -0400683 * lpfc_mlomgmt_show - Return the Menlo Maintenance sli flag
James Smart84774a42008-08-24 21:50:06 -0400684 * @dev: class converted to a Scsi_host structure.
685 * @attr: device attribute, not used.
686 * @buf: on return contains the Menlo Maintenance sli flag.
687 *
688 * Returns: size of formatted string.
689 **/
690static ssize_t
691lpfc_mlomgmt_show(struct device *dev, struct device_attribute *attr, char *buf)
692{
693 struct Scsi_Host *shost = class_to_shost(dev);
694 struct lpfc_vport *vport = (struct lpfc_vport *)shost->hostdata;
695 struct lpfc_hba *phba = vport->phba;
696
697 return snprintf(buf, PAGE_SIZE, "%d\n",
698 (phba->sli.sli_flag & LPFC_MENLO_MAINT));
699}
700
701/**
James Smart3621a712009-04-06 18:47:14 -0400702 * lpfc_vportnum_show - Return the port number in ascii of the hba
James Smarte59058c2008-08-24 21:49:00 -0400703 * @dev: class converted to a Scsi_host structure.
704 * @attr: device attribute, not used.
705 * @buf: on return contains scsi vpd program type.
706 *
707 * Returns: size of formatted string.
708 **/
dea31012005-04-17 16:05:31 -0500709static ssize_t
Tony Jonesee959b02008-02-22 00:13:36 +0100710lpfc_vportnum_show(struct device *dev, struct device_attribute *attr,
711 char *buf)
dea31012005-04-17 16:05:31 -0500712{
Tony Jonesee959b02008-02-22 00:13:36 +0100713 struct Scsi_Host *shost = class_to_shost(dev);
James Smart2e0fef82007-06-17 19:56:36 -0500714 struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata;
715 struct lpfc_hba *phba = vport->phba;
716
dea31012005-04-17 16:05:31 -0500717 return snprintf(buf, PAGE_SIZE, "%s\n",phba->Port);
718}
719
James Smarte59058c2008-08-24 21:49:00 -0400720/**
James Smart3621a712009-04-06 18:47:14 -0400721 * lpfc_fwrev_show - Return the firmware rev running in the hba
James Smarte59058c2008-08-24 21:49:00 -0400722 * @dev: class converted to a Scsi_host structure.
723 * @attr: device attribute, not used.
724 * @buf: on return contains the scsi vpd program type.
725 *
726 * Returns: size of formatted string.
727 **/
dea31012005-04-17 16:05:31 -0500728static ssize_t
Tony Jonesee959b02008-02-22 00:13:36 +0100729lpfc_fwrev_show(struct device *dev, struct device_attribute *attr,
730 char *buf)
dea31012005-04-17 16:05:31 -0500731{
Tony Jonesee959b02008-02-22 00:13:36 +0100732 struct Scsi_Host *shost = class_to_shost(dev);
James Smart2e0fef82007-06-17 19:56:36 -0500733 struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata;
734 struct lpfc_hba *phba = vport->phba;
James Smart026abb82011-12-13 13:20:45 -0500735 uint32_t if_type;
736 uint8_t sli_family;
James Smart6b5151f2012-01-18 16:24:06 -0500737 char fwrev[FW_REV_STR_SIZE];
James Smart026abb82011-12-13 13:20:45 -0500738 int len;
James Smart2e0fef82007-06-17 19:56:36 -0500739
dea31012005-04-17 16:05:31 -0500740 lpfc_decode_firmware_rev(phba, fwrev, 1);
James Smart026abb82011-12-13 13:20:45 -0500741 if_type = phba->sli4_hba.pc_sli4_params.if_type;
742 sli_family = phba->sli4_hba.pc_sli4_params.sli_family;
743
744 if (phba->sli_rev < LPFC_SLI_REV4)
745 len = snprintf(buf, PAGE_SIZE, "%s, sli-%d\n",
746 fwrev, phba->sli_rev);
747 else
748 len = snprintf(buf, PAGE_SIZE, "%s, sli-%d:%d:%x\n",
749 fwrev, phba->sli_rev, if_type, sli_family);
750
751 return len;
dea31012005-04-17 16:05:31 -0500752}
753
James Smarte59058c2008-08-24 21:49:00 -0400754/**
James Smart3621a712009-04-06 18:47:14 -0400755 * lpfc_hdw_show - Return the jedec information about the hba
James Smarte59058c2008-08-24 21:49:00 -0400756 * @dev: class converted to a Scsi_host structure.
757 * @attr: device attribute, not used.
758 * @buf: on return contains the scsi vpd program type.
759 *
760 * Returns: size of formatted string.
761 **/
dea31012005-04-17 16:05:31 -0500762static ssize_t
Tony Jonesee959b02008-02-22 00:13:36 +0100763lpfc_hdw_show(struct device *dev, struct device_attribute *attr, char *buf)
dea31012005-04-17 16:05:31 -0500764{
765 char hdw[9];
Tony Jonesee959b02008-02-22 00:13:36 +0100766 struct Scsi_Host *shost = class_to_shost(dev);
James Smart2e0fef82007-06-17 19:56:36 -0500767 struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata;
768 struct lpfc_hba *phba = vport->phba;
dea31012005-04-17 16:05:31 -0500769 lpfc_vpd_t *vp = &phba->vpd;
James Smart2e0fef82007-06-17 19:56:36 -0500770
dea31012005-04-17 16:05:31 -0500771 lpfc_jedec_to_ascii(vp->rev.biuRev, hdw);
772 return snprintf(buf, PAGE_SIZE, "%s\n", hdw);
773}
James Smarte59058c2008-08-24 21:49:00 -0400774
775/**
James Smart3621a712009-04-06 18:47:14 -0400776 * lpfc_option_rom_version_show - Return the adapter ROM FCode version
James Smarte59058c2008-08-24 21:49:00 -0400777 * @dev: class converted to a Scsi_host structure.
778 * @attr: device attribute, not used.
779 * @buf: on return contains the ROM and FCode ascii strings.
780 *
781 * Returns: size of formatted string.
782 **/
dea31012005-04-17 16:05:31 -0500783static ssize_t
Tony Jonesee959b02008-02-22 00:13:36 +0100784lpfc_option_rom_version_show(struct device *dev, struct device_attribute *attr,
785 char *buf)
dea31012005-04-17 16:05:31 -0500786{
Tony Jonesee959b02008-02-22 00:13:36 +0100787 struct Scsi_Host *shost = class_to_shost(dev);
James Smart2e0fef82007-06-17 19:56:36 -0500788 struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata;
789 struct lpfc_hba *phba = vport->phba;
James Smarta0683bf2015-04-07 15:07:16 -0400790 char fwrev[FW_REV_STR_SIZE];
James Smart2e0fef82007-06-17 19:56:36 -0500791
James Smarta0683bf2015-04-07 15:07:16 -0400792 if (phba->sli_rev < LPFC_SLI_REV4)
793 return snprintf(buf, PAGE_SIZE, "%s\n", phba->OptionROMVersion);
794
795 lpfc_decode_firmware_rev(phba, fwrev, 1);
796 return snprintf(buf, PAGE_SIZE, "%s\n", fwrev);
dea31012005-04-17 16:05:31 -0500797}
James Smarte59058c2008-08-24 21:49:00 -0400798
799/**
James Smart3621a712009-04-06 18:47:14 -0400800 * lpfc_state_show - Return the link state of the port
James Smarte59058c2008-08-24 21:49:00 -0400801 * @dev: class converted to a Scsi_host structure.
802 * @attr: device attribute, not used.
803 * @buf: on return contains text describing the state of the link.
804 *
805 * Notes:
806 * The switch statement has no default so zero will be returned.
807 *
808 * Returns: size of formatted string.
809 **/
dea31012005-04-17 16:05:31 -0500810static ssize_t
Hannes Reineckebbd1ae42008-03-18 14:32:28 +0100811lpfc_link_state_show(struct device *dev, struct device_attribute *attr,
812 char *buf)
dea31012005-04-17 16:05:31 -0500813{
Tony Jonesee959b02008-02-22 00:13:36 +0100814 struct Scsi_Host *shost = class_to_shost(dev);
James Smart2e0fef82007-06-17 19:56:36 -0500815 struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata;
816 struct lpfc_hba *phba = vport->phba;
817 int len = 0;
818
819 switch (phba->link_state) {
820 case LPFC_LINK_UNKNOWN:
Jamie Wellnitz41415862006-02-28 19:25:27 -0500821 case LPFC_WARM_START:
dea31012005-04-17 16:05:31 -0500822 case LPFC_INIT_START:
823 case LPFC_INIT_MBX_CMDS:
824 case LPFC_LINK_DOWN:
James Smart2e0fef82007-06-17 19:56:36 -0500825 case LPFC_HBA_ERROR:
James Smarta0c87cb2009-07-19 10:01:10 -0400826 if (phba->hba_flag & LINK_DISABLED)
827 len += snprintf(buf + len, PAGE_SIZE-len,
828 "Link Down - User disabled\n");
829 else
830 len += snprintf(buf + len, PAGE_SIZE-len,
831 "Link Down\n");
dea31012005-04-17 16:05:31 -0500832 break;
833 case LPFC_LINK_UP:
dea31012005-04-17 16:05:31 -0500834 case LPFC_CLEAR_LA:
dea31012005-04-17 16:05:31 -0500835 case LPFC_HBA_READY:
James Smarta8adb832007-10-27 13:37:53 -0400836 len += snprintf(buf + len, PAGE_SIZE-len, "Link Up - ");
James Smart2e0fef82007-06-17 19:56:36 -0500837
838 switch (vport->port_state) {
James Smart2e0fef82007-06-17 19:56:36 -0500839 case LPFC_LOCAL_CFG_LINK:
840 len += snprintf(buf + len, PAGE_SIZE-len,
James Smart92d7f7b2007-06-17 19:56:38 -0500841 "Configuring Link\n");
James Smart2e0fef82007-06-17 19:56:36 -0500842 break;
James Smart92d7f7b2007-06-17 19:56:38 -0500843 case LPFC_FDISC:
James Smart2e0fef82007-06-17 19:56:36 -0500844 case LPFC_FLOGI:
845 case LPFC_FABRIC_CFG_LINK:
846 case LPFC_NS_REG:
847 case LPFC_NS_QRY:
848 case LPFC_BUILD_DISC_LIST:
849 case LPFC_DISC_AUTH:
850 len += snprintf(buf + len, PAGE_SIZE - len,
851 "Discovery\n");
852 break;
853 case LPFC_VPORT_READY:
854 len += snprintf(buf + len, PAGE_SIZE - len, "Ready\n");
855 break;
856
James Smart92d7f7b2007-06-17 19:56:38 -0500857 case LPFC_VPORT_FAILED:
858 len += snprintf(buf + len, PAGE_SIZE - len, "Failed\n");
859 break;
860
861 case LPFC_VPORT_UNKNOWN:
James Smart2e0fef82007-06-17 19:56:36 -0500862 len += snprintf(buf + len, PAGE_SIZE - len,
863 "Unknown\n");
864 break;
865 }
James Smart84774a42008-08-24 21:50:06 -0400866 if (phba->sli.sli_flag & LPFC_MENLO_MAINT)
867 len += snprintf(buf + len, PAGE_SIZE-len,
868 " Menlo Maint Mode\n");
James Smart76a95d72010-11-20 23:11:48 -0500869 else if (phba->fc_topology == LPFC_TOPOLOGY_LOOP) {
James Smart2e0fef82007-06-17 19:56:36 -0500870 if (vport->fc_flag & FC_PUBLIC_LOOP)
dea31012005-04-17 16:05:31 -0500871 len += snprintf(buf + len, PAGE_SIZE-len,
872 " Public Loop\n");
873 else
874 len += snprintf(buf + len, PAGE_SIZE-len,
875 " Private Loop\n");
876 } else {
James Smart2e0fef82007-06-17 19:56:36 -0500877 if (vport->fc_flag & FC_FABRIC)
dea31012005-04-17 16:05:31 -0500878 len += snprintf(buf + len, PAGE_SIZE-len,
879 " Fabric\n");
880 else
881 len += snprintf(buf + len, PAGE_SIZE-len,
882 " Point-2-Point\n");
883 }
884 }
James Smart2e0fef82007-06-17 19:56:36 -0500885
dea31012005-04-17 16:05:31 -0500886 return len;
887}
888
James Smarte59058c2008-08-24 21:49:00 -0400889/**
James Smart026abb82011-12-13 13:20:45 -0500890 * lpfc_sli4_protocol_show - Return the fip mode of the HBA
891 * @dev: class unused variable.
892 * @attr: device attribute, not used.
893 * @buf: on return contains the module description text.
894 *
895 * Returns: size of formatted string.
896 **/
897static ssize_t
898lpfc_sli4_protocol_show(struct device *dev, struct device_attribute *attr,
899 char *buf)
900{
901 struct Scsi_Host *shost = class_to_shost(dev);
902 struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata;
903 struct lpfc_hba *phba = vport->phba;
904
905 if (phba->sli_rev < LPFC_SLI_REV4)
906 return snprintf(buf, PAGE_SIZE, "fc\n");
907
908 if (phba->sli4_hba.lnk_info.lnk_dv == LPFC_LNK_DAT_VAL) {
909 if (phba->sli4_hba.lnk_info.lnk_tp == LPFC_LNK_TYPE_GE)
910 return snprintf(buf, PAGE_SIZE, "fcoe\n");
911 if (phba->sli4_hba.lnk_info.lnk_tp == LPFC_LNK_TYPE_FC)
912 return snprintf(buf, PAGE_SIZE, "fc\n");
913 }
914 return snprintf(buf, PAGE_SIZE, "unknown\n");
915}
916
917/**
James Smart1ba981f2014-02-20 09:56:45 -0500918 * lpfc_oas_supported_show - Return whether or not Optimized Access Storage
919 * (OAS) is supported.
920 * @dev: class unused variable.
921 * @attr: device attribute, not used.
922 * @buf: on return contains the module description text.
923 *
924 * Returns: size of formatted string.
925 **/
926static ssize_t
927lpfc_oas_supported_show(struct device *dev, struct device_attribute *attr,
928 char *buf)
929{
930 struct Scsi_Host *shost = class_to_shost(dev);
931 struct lpfc_vport *vport = (struct lpfc_vport *)shost->hostdata;
932 struct lpfc_hba *phba = vport->phba;
933
934 return snprintf(buf, PAGE_SIZE, "%d\n",
935 phba->sli4_hba.pc_sli4_params.oas_supported);
936}
937
938/**
James Smart84d1b002010-02-12 14:42:33 -0500939 * lpfc_link_state_store - Transition the link_state on an HBA port
940 * @dev: class device that is converted into a Scsi_host.
941 * @attr: device attribute, not used.
942 * @buf: one or more lpfc_polling_flags values.
943 * @count: not used.
944 *
945 * Returns:
946 * -EINVAL if the buffer is not "up" or "down"
947 * return from link state change function if non-zero
948 * length of the buf on success
949 **/
950static ssize_t
951lpfc_link_state_store(struct device *dev, struct device_attribute *attr,
952 const char *buf, size_t count)
953{
954 struct Scsi_Host *shost = class_to_shost(dev);
955 struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata;
956 struct lpfc_hba *phba = vport->phba;
957
958 int status = -EINVAL;
959
960 if ((strncmp(buf, "up", sizeof("up") - 1) == 0) &&
961 (phba->link_state == LPFC_LINK_DOWN))
James Smart6e7288d2010-06-07 15:23:35 -0400962 status = phba->lpfc_hba_init_link(phba, MBX_NOWAIT);
James Smart84d1b002010-02-12 14:42:33 -0500963 else if ((strncmp(buf, "down", sizeof("down") - 1) == 0) &&
964 (phba->link_state >= LPFC_LINK_UP))
James Smart6e7288d2010-06-07 15:23:35 -0400965 status = phba->lpfc_hba_down_link(phba, MBX_NOWAIT);
James Smart84d1b002010-02-12 14:42:33 -0500966
967 if (status == 0)
968 return strlen(buf);
969 else
970 return status;
971}
972
973/**
James Smart3621a712009-04-06 18:47:14 -0400974 * lpfc_num_discovered_ports_show - Return sum of mapped and unmapped vports
James Smarte59058c2008-08-24 21:49:00 -0400975 * @dev: class device that is converted into a Scsi_host.
976 * @attr: device attribute, not used.
977 * @buf: on return contains the sum of fc mapped and unmapped.
978 *
979 * Description:
980 * Returns the ascii text number of the sum of the fc mapped and unmapped
981 * vport counts.
982 *
983 * Returns: size of formatted string.
984 **/
dea31012005-04-17 16:05:31 -0500985static ssize_t
Tony Jonesee959b02008-02-22 00:13:36 +0100986lpfc_num_discovered_ports_show(struct device *dev,
987 struct device_attribute *attr, char *buf)
dea31012005-04-17 16:05:31 -0500988{
Tony Jonesee959b02008-02-22 00:13:36 +0100989 struct Scsi_Host *shost = class_to_shost(dev);
James Smart2e0fef82007-06-17 19:56:36 -0500990 struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata;
991
992 return snprintf(buf, PAGE_SIZE, "%d\n",
993 vport->fc_map_cnt + vport->fc_unmap_cnt);
dea31012005-04-17 16:05:31 -0500994}
995
James Smarte59058c2008-08-24 21:49:00 -0400996/**
James Smart3621a712009-04-06 18:47:14 -0400997 * lpfc_issue_lip - Misnomer, name carried over from long ago
James Smarte59058c2008-08-24 21:49:00 -0400998 * @shost: Scsi_Host pointer.
999 *
1000 * Description:
1001 * Bring the link down gracefully then re-init the link. The firmware will
1002 * re-init the fiber channel interface as required. Does not issue a LIP.
1003 *
1004 * Returns:
1005 * -EPERM port offline or management commands are being blocked
1006 * -ENOMEM cannot allocate memory for the mailbox command
1007 * -EIO error sending the mailbox command
1008 * zero for success
1009 **/
Andrew Vasquez91ca7b02005-10-27 16:03:37 -07001010static int
James Smart2e0fef82007-06-17 19:56:36 -05001011lpfc_issue_lip(struct Scsi_Host *shost)
dea31012005-04-17 16:05:31 -05001012{
James Smart2e0fef82007-06-17 19:56:36 -05001013 struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata;
1014 struct lpfc_hba *phba = vport->phba;
dea31012005-04-17 16:05:31 -05001015 LPFC_MBOXQ_t *pmboxq;
1016 int mbxstatus = MBXERR_ERROR;
1017
James Smart2289e952018-01-30 15:58:55 -08001018 /*
1019 * If the link is offline, disabled or BLOCK_MGMT_IO
1020 * it doesn't make any sense to allow issue_lip
1021 */
James Smart2e0fef82007-06-17 19:56:36 -05001022 if ((vport->fc_flag & FC_OFFLINE_MODE) ||
James Smart2289e952018-01-30 15:58:55 -08001023 (phba->hba_flag & LINK_DISABLED) ||
James Smart83108bd2008-01-11 01:53:09 -05001024 (phba->sli.sli_flag & LPFC_BLOCK_MGMT_IO))
dea31012005-04-17 16:05:31 -05001025 return -EPERM;
1026
1027 pmboxq = mempool_alloc(phba->mbox_mem_pool,GFP_KERNEL);
1028
1029 if (!pmboxq)
1030 return -ENOMEM;
1031
1032 memset((void *)pmboxq, 0, sizeof (LPFC_MBOXQ_t));
James Smart04c68492009-05-22 14:52:52 -04001033 pmboxq->u.mb.mbxCommand = MBX_DOWN_LINK;
1034 pmboxq->u.mb.mbxOwner = OWN_HOST;
James Smart4db621e2006-07-06 15:49:49 -04001035
James Smart33ccf8d2006-08-17 11:57:58 -04001036 mbxstatus = lpfc_sli_issue_mbox_wait(phba, pmboxq, LPFC_MBOX_TMO * 2);
dea31012005-04-17 16:05:31 -05001037
James Smart04c68492009-05-22 14:52:52 -04001038 if ((mbxstatus == MBX_SUCCESS) &&
1039 (pmboxq->u.mb.mbxStatus == 0 ||
1040 pmboxq->u.mb.mbxStatus == MBXERR_LINK_DOWN)) {
James Smart4db621e2006-07-06 15:49:49 -04001041 memset((void *)pmboxq, 0, sizeof (LPFC_MBOXQ_t));
1042 lpfc_init_link(phba, pmboxq, phba->cfg_topology,
1043 phba->cfg_link_speed);
1044 mbxstatus = lpfc_sli_issue_mbox_wait(phba, pmboxq,
1045 phba->fc_ratov * 2);
James Smartdcf2a4e2010-09-29 11:18:53 -04001046 if ((mbxstatus == MBX_SUCCESS) &&
1047 (pmboxq->u.mb.mbxStatus == MBXERR_SEC_NO_PERMISSION))
1048 lpfc_printf_log(phba, KERN_ERR, LOG_MBOX | LOG_SLI,
1049 "2859 SLI authentication is required "
1050 "for INIT_LINK but has not done yet\n");
James Smart4db621e2006-07-06 15:49:49 -04001051 }
1052
James Smart5b8bd0c2007-04-25 09:52:49 -04001053 lpfc_set_loopback_flag(phba);
James Smart858c9f62007-06-17 19:56:39 -05001054 if (mbxstatus != MBX_TIMEOUT)
James.Smart@Emulex.Com433c3572005-10-28 20:28:56 -04001055 mempool_free(pmboxq, phba->mbox_mem_pool);
dea31012005-04-17 16:05:31 -05001056
1057 if (mbxstatus == MBXERR_ERROR)
1058 return -EIO;
1059
Andrew Vasquez91ca7b02005-10-27 16:03:37 -07001060 return 0;
dea31012005-04-17 16:05:31 -05001061}
1062
James Smart895427b2017-02-12 13:52:30 -08001063int
1064lpfc_emptyq_wait(struct lpfc_hba *phba, struct list_head *q, spinlock_t *lock)
1065{
1066 int cnt = 0;
1067
1068 spin_lock_irq(lock);
1069 while (!list_empty(q)) {
1070 spin_unlock_irq(lock);
1071 msleep(20);
1072 if (cnt++ > 250) { /* 5 secs */
1073 lpfc_printf_log(phba, KERN_WARNING, LOG_INIT,
1074 "0466 %s %s\n",
1075 "Outstanding IO when ",
1076 "bringing Adapter offline\n");
1077 return 0;
1078 }
1079 spin_lock_irq(lock);
1080 }
1081 spin_unlock_irq(lock);
1082 return 1;
1083}
1084
James Smarte59058c2008-08-24 21:49:00 -04001085/**
James Smart3621a712009-04-06 18:47:14 -04001086 * lpfc_do_offline - Issues a mailbox command to bring the link down
James Smarte59058c2008-08-24 21:49:00 -04001087 * @phba: lpfc_hba pointer.
1088 * @type: LPFC_EVT_OFFLINE, LPFC_EVT_WARM_START, LPFC_EVT_KILL.
1089 *
1090 * Notes:
1091 * Assumes any error from lpfc_do_offline() will be negative.
1092 * Can wait up to 5 seconds for the port ring buffers count
1093 * to reach zero, prints a warning if it is not zero and continues.
James Smart3621a712009-04-06 18:47:14 -04001094 * lpfc_workq_post_event() returns a non-zero return code if call fails.
James Smarte59058c2008-08-24 21:49:00 -04001095 *
1096 * Returns:
1097 * -EIO error posting the event
1098 * zero for success
1099 **/
James Smart40496f02006-07-06 15:50:22 -04001100static int
James Smart46fa3112007-04-25 09:51:45 -04001101lpfc_do_offline(struct lpfc_hba *phba, uint32_t type)
1102{
1103 struct completion online_compl;
James Smart895427b2017-02-12 13:52:30 -08001104 struct lpfc_queue *qp = NULL;
James Smart46fa3112007-04-25 09:51:45 -04001105 struct lpfc_sli_ring *pring;
1106 struct lpfc_sli *psli;
1107 int status = 0;
James Smart46fa3112007-04-25 09:51:45 -04001108 int i;
James Smartfedd3b72011-02-16 12:39:24 -05001109 int rc;
James Smart46fa3112007-04-25 09:51:45 -04001110
1111 init_completion(&online_compl);
James Smartfedd3b72011-02-16 12:39:24 -05001112 rc = lpfc_workq_post_event(phba, &status, &online_compl,
James Smart46fa3112007-04-25 09:51:45 -04001113 LPFC_EVT_OFFLINE_PREP);
James Smartfedd3b72011-02-16 12:39:24 -05001114 if (rc == 0)
1115 return -ENOMEM;
1116
James Smart46fa3112007-04-25 09:51:45 -04001117 wait_for_completion(&online_compl);
1118
1119 if (status != 0)
1120 return -EIO;
1121
1122 psli = &phba->sli;
1123
James Smart09372822008-01-11 01:52:54 -05001124 /* Wait a little for things to settle down, but not
1125 * long enough for dev loss timeout to expire.
1126 */
James Smart895427b2017-02-12 13:52:30 -08001127 if (phba->sli_rev != LPFC_SLI_REV4) {
1128 for (i = 0; i < psli->num_rings; i++) {
1129 pring = &psli->sli3_ring[i];
1130 if (!lpfc_emptyq_wait(phba, &pring->txcmplq,
1131 &phba->hbalock))
1132 goto out;
1133 }
1134 } else {
1135 list_for_each_entry(qp, &phba->sli4_hba.lpfc_wq_list, wq_list) {
1136 pring = qp->pring;
1137 if (!pring)
1138 continue;
1139 if (!lpfc_emptyq_wait(phba, &pring->txcmplq,
1140 &pring->ring_lock))
1141 goto out;
James Smart46fa3112007-04-25 09:51:45 -04001142 }
1143 }
James Smart895427b2017-02-12 13:52:30 -08001144out:
James Smart46fa3112007-04-25 09:51:45 -04001145 init_completion(&online_compl);
James Smartfedd3b72011-02-16 12:39:24 -05001146 rc = lpfc_workq_post_event(phba, &status, &online_compl, type);
1147 if (rc == 0)
1148 return -ENOMEM;
1149
James Smart46fa3112007-04-25 09:51:45 -04001150 wait_for_completion(&online_compl);
1151
1152 if (status != 0)
1153 return -EIO;
1154
1155 return 0;
1156}
1157
James Smarte59058c2008-08-24 21:49:00 -04001158/**
James Smart3621a712009-04-06 18:47:14 -04001159 * lpfc_selective_reset - Offline then onlines the port
James Smarte59058c2008-08-24 21:49:00 -04001160 * @phba: lpfc_hba pointer.
1161 *
1162 * Description:
1163 * If the port is configured to allow a reset then the hba is brought
1164 * offline then online.
1165 *
1166 * Notes:
1167 * Assumes any error from lpfc_do_offline() will be negative.
James Smartab56dc22011-02-16 12:39:57 -05001168 * Do not make this function static.
James Smarte59058c2008-08-24 21:49:00 -04001169 *
1170 * Returns:
1171 * lpfc_do_offline() return code if not zero
1172 * -EIO reset not configured or error posting the event
1173 * zero for success
1174 **/
James Smart7f860592011-03-11 16:05:52 -05001175int
James Smart40496f02006-07-06 15:50:22 -04001176lpfc_selective_reset(struct lpfc_hba *phba)
1177{
1178 struct completion online_compl;
1179 int status = 0;
James Smartfedd3b72011-02-16 12:39:24 -05001180 int rc;
James Smart40496f02006-07-06 15:50:22 -04001181
James Smart71157c92013-07-15 18:34:36 -04001182 if (!phba->cfg_enable_hba_reset)
James Smartf7a919b2011-08-21 21:49:16 -04001183 return -EACCES;
James Smart13815c82008-01-11 01:52:48 -05001184
James Smart71157c92013-07-15 18:34:36 -04001185 if (!(phba->pport->fc_flag & FC_OFFLINE_MODE)) {
1186 status = lpfc_do_offline(phba, LPFC_EVT_OFFLINE);
James Smart40496f02006-07-06 15:50:22 -04001187
James Smart71157c92013-07-15 18:34:36 -04001188 if (status != 0)
1189 return status;
1190 }
James Smart40496f02006-07-06 15:50:22 -04001191
1192 init_completion(&online_compl);
James Smartfedd3b72011-02-16 12:39:24 -05001193 rc = lpfc_workq_post_event(phba, &status, &online_compl,
James Smart40496f02006-07-06 15:50:22 -04001194 LPFC_EVT_ONLINE);
James Smartfedd3b72011-02-16 12:39:24 -05001195 if (rc == 0)
1196 return -ENOMEM;
1197
James Smart40496f02006-07-06 15:50:22 -04001198 wait_for_completion(&online_compl);
1199
1200 if (status != 0)
1201 return -EIO;
1202
1203 return 0;
1204}
1205
James Smarte59058c2008-08-24 21:49:00 -04001206/**
James Smart3621a712009-04-06 18:47:14 -04001207 * lpfc_issue_reset - Selectively resets an adapter
James Smarte59058c2008-08-24 21:49:00 -04001208 * @dev: class device that is converted into a Scsi_host.
1209 * @attr: device attribute, not used.
1210 * @buf: containing the string "selective".
1211 * @count: unused variable.
1212 *
1213 * Description:
1214 * If the buf contains the string "selective" then lpfc_selective_reset()
1215 * is called to perform the reset.
1216 *
1217 * Notes:
1218 * Assumes any error from lpfc_selective_reset() will be negative.
1219 * If lpfc_selective_reset() returns zero then the length of the buffer
André Goddard Rosaaf901ca2009-11-14 13:09:05 -02001220 * is returned which indicates success
James Smarte59058c2008-08-24 21:49:00 -04001221 *
1222 * Returns:
1223 * -EINVAL if the buffer does not contain the string "selective"
1224 * length of buf if lpfc-selective_reset() if the call succeeds
1225 * return value of lpfc_selective_reset() if the call fails
1226**/
James Smart40496f02006-07-06 15:50:22 -04001227static ssize_t
Tony Jonesee959b02008-02-22 00:13:36 +01001228lpfc_issue_reset(struct device *dev, struct device_attribute *attr,
1229 const char *buf, size_t count)
James Smart40496f02006-07-06 15:50:22 -04001230{
Tony Jonesee959b02008-02-22 00:13:36 +01001231 struct Scsi_Host *shost = class_to_shost(dev);
James Smart2e0fef82007-06-17 19:56:36 -05001232 struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata;
1233 struct lpfc_hba *phba = vport->phba;
James Smart40496f02006-07-06 15:50:22 -04001234 int status = -EINVAL;
1235
James Smart73d91e52011-10-10 21:32:10 -04001236 if (!phba->cfg_enable_hba_reset)
1237 return -EACCES;
1238
James Smart40496f02006-07-06 15:50:22 -04001239 if (strncmp(buf, "selective", sizeof("selective") - 1) == 0)
James Smart7f860592011-03-11 16:05:52 -05001240 status = phba->lpfc_selective_reset(phba);
James Smart40496f02006-07-06 15:50:22 -04001241
1242 if (status == 0)
1243 return strlen(buf);
1244 else
1245 return status;
1246}
1247
James Smarte59058c2008-08-24 21:49:00 -04001248/**
James Smart88a2cfb2011-07-22 18:36:33 -04001249 * lpfc_sli4_pdev_status_reg_wait - Wait for pdev status register for readyness
1250 * @phba: lpfc_hba pointer.
1251 *
1252 * Description:
1253 * SLI4 interface type-2 device to wait on the sliport status register for
1254 * the readyness after performing a firmware reset.
1255 *
1256 * Returns:
Masanari Iida0b1587b2013-07-17 04:37:44 +09001257 * zero for success, -EPERM when port does not have privilege to perform the
James Smart026abb82011-12-13 13:20:45 -05001258 * reset, -EIO when port timeout from recovering from the reset.
1259 *
1260 * Note:
1261 * As the caller will interpret the return code by value, be careful in making
1262 * change or addition to return codes.
James Smart88a2cfb2011-07-22 18:36:33 -04001263 **/
James Smart73d91e52011-10-10 21:32:10 -04001264int
James Smart88a2cfb2011-07-22 18:36:33 -04001265lpfc_sli4_pdev_status_reg_wait(struct lpfc_hba *phba)
1266{
James Smartf7a919b2011-08-21 21:49:16 -04001267 struct lpfc_register portstat_reg = {0};
James Smart88a2cfb2011-07-22 18:36:33 -04001268 int i;
1269
James Smartf7a919b2011-08-21 21:49:16 -04001270 msleep(100);
James Smart88a2cfb2011-07-22 18:36:33 -04001271 lpfc_readl(phba->sli4_hba.u.if_type2.STATUSregaddr,
1272 &portstat_reg.word0);
1273
Masanari Iida0b1587b2013-07-17 04:37:44 +09001274 /* verify if privileged for the request operation */
James Smartf7a919b2011-08-21 21:49:16 -04001275 if (!bf_get(lpfc_sliport_status_rn, &portstat_reg) &&
1276 !bf_get(lpfc_sliport_status_err, &portstat_reg))
1277 return -EPERM;
1278
James Smart88a2cfb2011-07-22 18:36:33 -04001279 /* wait for the SLI port firmware ready after firmware reset */
1280 for (i = 0; i < LPFC_FW_RESET_MAXIMUM_WAIT_10MS_CNT; i++) {
1281 msleep(10);
1282 lpfc_readl(phba->sli4_hba.u.if_type2.STATUSregaddr,
1283 &portstat_reg.word0);
1284 if (!bf_get(lpfc_sliport_status_err, &portstat_reg))
1285 continue;
1286 if (!bf_get(lpfc_sliport_status_rn, &portstat_reg))
1287 continue;
1288 if (!bf_get(lpfc_sliport_status_rdy, &portstat_reg))
1289 continue;
1290 break;
1291 }
1292
1293 if (i < LPFC_FW_RESET_MAXIMUM_WAIT_10MS_CNT)
1294 return 0;
1295 else
1296 return -EIO;
1297}
1298
1299/**
James Smart52d52442011-05-24 11:42:45 -04001300 * lpfc_sli4_pdev_reg_request - Request physical dev to perform a register acc
James Smartc0c11512011-05-24 11:41:34 -04001301 * @phba: lpfc_hba pointer.
1302 *
1303 * Description:
James Smart52d52442011-05-24 11:42:45 -04001304 * Request SLI4 interface type-2 device to perform a physical register set
1305 * access.
James Smartc0c11512011-05-24 11:41:34 -04001306 *
1307 * Returns:
1308 * zero for success
1309 **/
1310static ssize_t
James Smart52d52442011-05-24 11:42:45 -04001311lpfc_sli4_pdev_reg_request(struct lpfc_hba *phba, uint32_t opcode)
James Smartc0c11512011-05-24 11:41:34 -04001312{
1313 struct completion online_compl;
James Smartb76f2dc2011-07-22 18:37:42 -04001314 struct pci_dev *pdev = phba->pcidev;
James Smart026abb82011-12-13 13:20:45 -05001315 uint32_t before_fc_flag;
1316 uint32_t sriov_nr_virtfn;
James Smartc0c11512011-05-24 11:41:34 -04001317 uint32_t reg_val;
James Smart026abb82011-12-13 13:20:45 -05001318 int status = 0, rc = 0;
1319 int job_posted = 1, sriov_err;
James Smartc0c11512011-05-24 11:41:34 -04001320
1321 if (!phba->cfg_enable_hba_reset)
James Smartf7a919b2011-08-21 21:49:16 -04001322 return -EACCES;
James Smartc0c11512011-05-24 11:41:34 -04001323
James Smart52d52442011-05-24 11:42:45 -04001324 if ((phba->sli_rev < LPFC_SLI_REV4) ||
1325 (bf_get(lpfc_sli_intf_if_type, &phba->sli4_hba.sli_intf) !=
1326 LPFC_SLI_INTF_IF_TYPE_2))
1327 return -EPERM;
1328
James Smart026abb82011-12-13 13:20:45 -05001329 /* Keep state if we need to restore back */
1330 before_fc_flag = phba->pport->fc_flag;
1331 sriov_nr_virtfn = phba->cfg_sriov_nr_virtfn;
1332
James Smartb76f2dc2011-07-22 18:37:42 -04001333 /* Disable SR-IOV virtual functions if enabled */
1334 if (phba->cfg_sriov_nr_virtfn) {
1335 pci_disable_sriov(pdev);
1336 phba->cfg_sriov_nr_virtfn = 0;
1337 }
James Smart229adb02013-04-17 20:16:51 -04001338
James Smart02936352014-04-04 13:52:12 -04001339 if (opcode == LPFC_FW_DUMP)
1340 phba->hba_flag |= HBA_FW_DUMP_OP;
1341
James Smartc0c11512011-05-24 11:41:34 -04001342 status = lpfc_do_offline(phba, LPFC_EVT_OFFLINE);
1343
James Smart02936352014-04-04 13:52:12 -04001344 if (status != 0) {
1345 phba->hba_flag &= ~HBA_FW_DUMP_OP;
James Smartc0c11512011-05-24 11:41:34 -04001346 return status;
James Smart02936352014-04-04 13:52:12 -04001347 }
James Smartc0c11512011-05-24 11:41:34 -04001348
1349 /* wait for the device to be quiesced before firmware reset */
1350 msleep(100);
1351
1352 reg_val = readl(phba->sli4_hba.conf_regs_memmap_p +
1353 LPFC_CTL_PDEV_CTL_OFFSET);
James Smart52d52442011-05-24 11:42:45 -04001354
1355 if (opcode == LPFC_FW_DUMP)
1356 reg_val |= LPFC_FW_DUMP_REQUEST;
1357 else if (opcode == LPFC_FW_RESET)
1358 reg_val |= LPFC_CTL_PDEV_CTL_FRST;
1359 else if (opcode == LPFC_DV_RESET)
1360 reg_val |= LPFC_CTL_PDEV_CTL_DRST;
1361
James Smartc0c11512011-05-24 11:41:34 -04001362 writel(reg_val, phba->sli4_hba.conf_regs_memmap_p +
1363 LPFC_CTL_PDEV_CTL_OFFSET);
1364 /* flush */
1365 readl(phba->sli4_hba.conf_regs_memmap_p + LPFC_CTL_PDEV_CTL_OFFSET);
1366
1367 /* delay driver action following IF_TYPE_2 reset */
James Smart88a2cfb2011-07-22 18:36:33 -04001368 rc = lpfc_sli4_pdev_status_reg_wait(phba);
1369
James Smart026abb82011-12-13 13:20:45 -05001370 if (rc == -EPERM) {
Masanari Iida0b1587b2013-07-17 04:37:44 +09001371 /* no privilege for reset */
James Smart6b5151f2012-01-18 16:24:06 -05001372 lpfc_printf_log(phba, KERN_ERR, LOG_SLI,
Masanari Iida0b1587b2013-07-17 04:37:44 +09001373 "3150 No privilege to perform the requested "
James Smart6b5151f2012-01-18 16:24:06 -05001374 "access: x%x\n", reg_val);
James Smart026abb82011-12-13 13:20:45 -05001375 } else if (rc == -EIO) {
1376 /* reset failed, there is nothing more we can do */
James Smart6b5151f2012-01-18 16:24:06 -05001377 lpfc_printf_log(phba, KERN_ERR, LOG_SLI,
1378 "3153 Fail to perform the requested "
1379 "access: x%x\n", reg_val);
James Smartf7a919b2011-08-21 21:49:16 -04001380 return rc;
James Smart026abb82011-12-13 13:20:45 -05001381 }
1382
1383 /* keep the original port state */
1384 if (before_fc_flag & FC_OFFLINE_MODE)
1385 goto out;
James Smartc0c11512011-05-24 11:41:34 -04001386
1387 init_completion(&online_compl);
James Smart026abb82011-12-13 13:20:45 -05001388 job_posted = lpfc_workq_post_event(phba, &status, &online_compl,
1389 LPFC_EVT_ONLINE);
1390 if (!job_posted)
1391 goto out;
James Smartc0c11512011-05-24 11:41:34 -04001392
1393 wait_for_completion(&online_compl);
1394
James Smart026abb82011-12-13 13:20:45 -05001395out:
1396 /* in any case, restore the virtual functions enabled as before */
1397 if (sriov_nr_virtfn) {
1398 sriov_err =
1399 lpfc_sli_probe_sriov_nr_virtfn(phba, sriov_nr_virtfn);
1400 if (!sriov_err)
1401 phba->cfg_sriov_nr_virtfn = sriov_nr_virtfn;
1402 }
James Smartc0c11512011-05-24 11:41:34 -04001403
James Smart026abb82011-12-13 13:20:45 -05001404 /* return proper error code */
1405 if (!rc) {
1406 if (!job_posted)
1407 rc = -ENOMEM;
1408 else if (status)
1409 rc = -EIO;
1410 }
1411 return rc;
James Smartc0c11512011-05-24 11:41:34 -04001412}
1413
1414/**
James Smart3621a712009-04-06 18:47:14 -04001415 * lpfc_nport_evt_cnt_show - Return the number of nport events
James Smarte59058c2008-08-24 21:49:00 -04001416 * @dev: class device that is converted into a Scsi_host.
1417 * @attr: device attribute, not used.
1418 * @buf: on return contains the ascii number of nport events.
1419 *
1420 * Returns: size of formatted string.
1421 **/
dea31012005-04-17 16:05:31 -05001422static ssize_t
Tony Jonesee959b02008-02-22 00:13:36 +01001423lpfc_nport_evt_cnt_show(struct device *dev, struct device_attribute *attr,
1424 char *buf)
dea31012005-04-17 16:05:31 -05001425{
Tony Jonesee959b02008-02-22 00:13:36 +01001426 struct Scsi_Host *shost = class_to_shost(dev);
James Smart2e0fef82007-06-17 19:56:36 -05001427 struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata;
1428 struct lpfc_hba *phba = vport->phba;
1429
dea31012005-04-17 16:05:31 -05001430 return snprintf(buf, PAGE_SIZE, "%d\n", phba->nport_event_cnt);
1431}
1432
James Smarte59058c2008-08-24 21:49:00 -04001433/**
James Smart3621a712009-04-06 18:47:14 -04001434 * lpfc_board_mode_show - Return the state of the board
James Smarte59058c2008-08-24 21:49:00 -04001435 * @dev: class device that is converted into a Scsi_host.
1436 * @attr: device attribute, not used.
1437 * @buf: on return contains the state of the adapter.
1438 *
1439 * Returns: size of formatted string.
1440 **/
dea31012005-04-17 16:05:31 -05001441static ssize_t
Tony Jonesee959b02008-02-22 00:13:36 +01001442lpfc_board_mode_show(struct device *dev, struct device_attribute *attr,
1443 char *buf)
Jamie Wellnitz41415862006-02-28 19:25:27 -05001444{
Tony Jonesee959b02008-02-22 00:13:36 +01001445 struct Scsi_Host *shost = class_to_shost(dev);
James Smart2e0fef82007-06-17 19:56:36 -05001446 struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata;
1447 struct lpfc_hba *phba = vport->phba;
Jamie Wellnitz41415862006-02-28 19:25:27 -05001448 char * state;
1449
James Smart2e0fef82007-06-17 19:56:36 -05001450 if (phba->link_state == LPFC_HBA_ERROR)
Jamie Wellnitz41415862006-02-28 19:25:27 -05001451 state = "error";
James Smart2e0fef82007-06-17 19:56:36 -05001452 else if (phba->link_state == LPFC_WARM_START)
Jamie Wellnitz41415862006-02-28 19:25:27 -05001453 state = "warm start";
James Smart2e0fef82007-06-17 19:56:36 -05001454 else if (phba->link_state == LPFC_INIT_START)
Jamie Wellnitz41415862006-02-28 19:25:27 -05001455 state = "offline";
1456 else
1457 state = "online";
1458
1459 return snprintf(buf, PAGE_SIZE, "%s\n", state);
1460}
1461
James Smarte59058c2008-08-24 21:49:00 -04001462/**
James Smart3621a712009-04-06 18:47:14 -04001463 * lpfc_board_mode_store - Puts the hba in online, offline, warm or error state
James Smarte59058c2008-08-24 21:49:00 -04001464 * @dev: class device that is converted into a Scsi_host.
1465 * @attr: device attribute, not used.
1466 * @buf: containing one of the strings "online", "offline", "warm" or "error".
1467 * @count: unused variable.
1468 *
1469 * Returns:
1470 * -EACCES if enable hba reset not enabled
1471 * -EINVAL if the buffer does not contain a valid string (see above)
1472 * -EIO if lpfc_workq_post_event() or lpfc_do_offline() fails
1473 * buf length greater than zero indicates success
1474 **/
Jamie Wellnitz41415862006-02-28 19:25:27 -05001475static ssize_t
Tony Jonesee959b02008-02-22 00:13:36 +01001476lpfc_board_mode_store(struct device *dev, struct device_attribute *attr,
1477 const char *buf, size_t count)
Jamie Wellnitz41415862006-02-28 19:25:27 -05001478{
Tony Jonesee959b02008-02-22 00:13:36 +01001479 struct Scsi_Host *shost = class_to_shost(dev);
James Smart2e0fef82007-06-17 19:56:36 -05001480 struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata;
1481 struct lpfc_hba *phba = vport->phba;
Jamie Wellnitz41415862006-02-28 19:25:27 -05001482 struct completion online_compl;
James Smart026abb82011-12-13 13:20:45 -05001483 char *board_mode_str = NULL;
1484 int status = 0;
James Smartfedd3b72011-02-16 12:39:24 -05001485 int rc;
Jamie Wellnitz41415862006-02-28 19:25:27 -05001486
James Smart026abb82011-12-13 13:20:45 -05001487 if (!phba->cfg_enable_hba_reset) {
1488 status = -EACCES;
1489 goto board_mode_out;
1490 }
James Smart88a2cfb2011-07-22 18:36:33 -04001491
1492 lpfc_printf_vlog(vport, KERN_ERR, LOG_INIT,
James Smart026abb82011-12-13 13:20:45 -05001493 "3050 lpfc_board_mode set to %s\n", buf);
James Smart88a2cfb2011-07-22 18:36:33 -04001494
Jamie Wellnitz41415862006-02-28 19:25:27 -05001495 init_completion(&online_compl);
1496
James Smart46fa3112007-04-25 09:51:45 -04001497 if(strncmp(buf, "online", sizeof("online") - 1) == 0) {
James Smartfedd3b72011-02-16 12:39:24 -05001498 rc = lpfc_workq_post_event(phba, &status, &online_compl,
Jamie Wellnitz41415862006-02-28 19:25:27 -05001499 LPFC_EVT_ONLINE);
James Smart026abb82011-12-13 13:20:45 -05001500 if (rc == 0) {
1501 status = -ENOMEM;
1502 goto board_mode_out;
1503 }
James Smart46fa3112007-04-25 09:51:45 -04001504 wait_for_completion(&online_compl);
James Smart522dcee2017-06-01 21:07:03 -07001505 if (status)
1506 status = -EIO;
James Smart46fa3112007-04-25 09:51:45 -04001507 } else if (strncmp(buf, "offline", sizeof("offline") - 1) == 0)
1508 status = lpfc_do_offline(phba, LPFC_EVT_OFFLINE);
Jamie Wellnitz41415862006-02-28 19:25:27 -05001509 else if (strncmp(buf, "warm", sizeof("warm") - 1) == 0)
James Smart6a9c52c2009-10-02 15:16:51 -04001510 if (phba->sli_rev == LPFC_SLI_REV4)
James Smart026abb82011-12-13 13:20:45 -05001511 status = -EINVAL;
James Smart6a9c52c2009-10-02 15:16:51 -04001512 else
1513 status = lpfc_do_offline(phba, LPFC_EVT_WARM_START);
James Smart46fa3112007-04-25 09:51:45 -04001514 else if (strncmp(buf, "error", sizeof("error") - 1) == 0)
James Smart6a9c52c2009-10-02 15:16:51 -04001515 if (phba->sli_rev == LPFC_SLI_REV4)
James Smart026abb82011-12-13 13:20:45 -05001516 status = -EINVAL;
James Smart6a9c52c2009-10-02 15:16:51 -04001517 else
1518 status = lpfc_do_offline(phba, LPFC_EVT_KILL);
James Smartc0c11512011-05-24 11:41:34 -04001519 else if (strncmp(buf, "dump", sizeof("dump") - 1) == 0)
James Smart52d52442011-05-24 11:42:45 -04001520 status = lpfc_sli4_pdev_reg_request(phba, LPFC_FW_DUMP);
1521 else if (strncmp(buf, "fw_reset", sizeof("fw_reset") - 1) == 0)
1522 status = lpfc_sli4_pdev_reg_request(phba, LPFC_FW_RESET);
1523 else if (strncmp(buf, "dv_reset", sizeof("dv_reset") - 1) == 0)
1524 status = lpfc_sli4_pdev_reg_request(phba, LPFC_DV_RESET);
Jamie Wellnitz41415862006-02-28 19:25:27 -05001525 else
James Smart026abb82011-12-13 13:20:45 -05001526 status = -EINVAL;
Jamie Wellnitz41415862006-02-28 19:25:27 -05001527
James Smart026abb82011-12-13 13:20:45 -05001528board_mode_out:
Jamie Wellnitz41415862006-02-28 19:25:27 -05001529 if (!status)
1530 return strlen(buf);
James Smart026abb82011-12-13 13:20:45 -05001531 else {
1532 board_mode_str = strchr(buf, '\n');
1533 if (board_mode_str)
1534 *board_mode_str = '\0';
1535 lpfc_printf_vlog(vport, KERN_ERR, LOG_INIT,
1536 "3097 Failed \"%s\", status(%d), "
1537 "fc_flag(x%x)\n",
1538 buf, status, phba->pport->fc_flag);
James Smartf7a919b2011-08-21 21:49:16 -04001539 return status;
James Smart026abb82011-12-13 13:20:45 -05001540 }
Jamie Wellnitz41415862006-02-28 19:25:27 -05001541}
1542
James Smarte59058c2008-08-24 21:49:00 -04001543/**
James Smart3621a712009-04-06 18:47:14 -04001544 * lpfc_get_hba_info - Return various bits of informaton about the adapter
James Smarte59058c2008-08-24 21:49:00 -04001545 * @phba: pointer to the adapter structure.
James Smart3621a712009-04-06 18:47:14 -04001546 * @mxri: max xri count.
1547 * @axri: available xri count.
1548 * @mrpi: max rpi count.
1549 * @arpi: available rpi count.
1550 * @mvpi: max vpi count.
1551 * @avpi: available vpi count.
James Smarte59058c2008-08-24 21:49:00 -04001552 *
1553 * Description:
1554 * If an integer pointer for an count is not null then the value for the
1555 * count is returned.
1556 *
1557 * Returns:
1558 * zero on error
1559 * one for success
1560 **/
James Smart311464e2007-08-02 11:10:37 -04001561static int
James Smart858c9f62007-06-17 19:56:39 -05001562lpfc_get_hba_info(struct lpfc_hba *phba,
1563 uint32_t *mxri, uint32_t *axri,
1564 uint32_t *mrpi, uint32_t *arpi,
1565 uint32_t *mvpi, uint32_t *avpi)
James Smart92d7f7b2007-06-17 19:56:38 -05001566{
James Smart04c68492009-05-22 14:52:52 -04001567 struct lpfc_mbx_read_config *rd_config;
James Smart92d7f7b2007-06-17 19:56:38 -05001568 LPFC_MBOXQ_t *pmboxq;
1569 MAILBOX_t *pmb;
1570 int rc = 0;
James Smart15672312010-04-06 14:49:03 -04001571 uint32_t max_vpi;
James Smart92d7f7b2007-06-17 19:56:38 -05001572
1573 /*
1574 * prevent udev from issuing mailbox commands until the port is
1575 * configured.
1576 */
1577 if (phba->link_state < LPFC_LINK_DOWN ||
1578 !phba->mbox_mem_pool ||
James Smartf4b4c682009-05-22 14:53:12 -04001579 (phba->sli.sli_flag & LPFC_SLI_ACTIVE) == 0)
James Smart92d7f7b2007-06-17 19:56:38 -05001580 return 0;
1581
1582 if (phba->sli.sli_flag & LPFC_BLOCK_MGMT_IO)
1583 return 0;
1584
1585 pmboxq = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL);
1586 if (!pmboxq)
1587 return 0;
1588 memset(pmboxq, 0, sizeof (LPFC_MBOXQ_t));
1589
James Smart04c68492009-05-22 14:52:52 -04001590 pmb = &pmboxq->u.mb;
James Smart92d7f7b2007-06-17 19:56:38 -05001591 pmb->mbxCommand = MBX_READ_CONFIG;
1592 pmb->mbxOwner = OWN_HOST;
1593 pmboxq->context1 = NULL;
1594
James Smart75baf692010-06-08 18:31:21 -04001595 if (phba->pport->fc_flag & FC_OFFLINE_MODE)
James Smart92d7f7b2007-06-17 19:56:38 -05001596 rc = MBX_NOT_FINISHED;
1597 else
1598 rc = lpfc_sli_issue_mbox_wait(phba, pmboxq, phba->fc_ratov * 2);
1599
1600 if (rc != MBX_SUCCESS) {
James Smart858c9f62007-06-17 19:56:39 -05001601 if (rc != MBX_TIMEOUT)
James Smart92d7f7b2007-06-17 19:56:38 -05001602 mempool_free(pmboxq, phba->mbox_mem_pool);
1603 return 0;
1604 }
1605
James Smartda0436e2009-05-22 14:51:39 -04001606 if (phba->sli_rev == LPFC_SLI_REV4) {
1607 rd_config = &pmboxq->u.mqe.un.rd_config;
1608 if (mrpi)
1609 *mrpi = bf_get(lpfc_mbx_rd_conf_rpi_count, rd_config);
1610 if (arpi)
1611 *arpi = bf_get(lpfc_mbx_rd_conf_rpi_count, rd_config) -
1612 phba->sli4_hba.max_cfg_param.rpi_used;
1613 if (mxri)
1614 *mxri = bf_get(lpfc_mbx_rd_conf_xri_count, rd_config);
1615 if (axri)
1616 *axri = bf_get(lpfc_mbx_rd_conf_xri_count, rd_config) -
1617 phba->sli4_hba.max_cfg_param.xri_used;
James Smart15672312010-04-06 14:49:03 -04001618
1619 /* Account for differences with SLI-3. Get vpi count from
1620 * mailbox data and subtract one for max vpi value.
1621 */
1622 max_vpi = (bf_get(lpfc_mbx_rd_conf_vpi_count, rd_config) > 0) ?
1623 (bf_get(lpfc_mbx_rd_conf_vpi_count, rd_config) - 1) : 0;
1624
James Smartda0436e2009-05-22 14:51:39 -04001625 if (mvpi)
James Smart15672312010-04-06 14:49:03 -04001626 *mvpi = max_vpi;
James Smartda0436e2009-05-22 14:51:39 -04001627 if (avpi)
James Smart15672312010-04-06 14:49:03 -04001628 *avpi = max_vpi - phba->sli4_hba.max_cfg_param.vpi_used;
James Smartda0436e2009-05-22 14:51:39 -04001629 } else {
1630 if (mrpi)
1631 *mrpi = pmb->un.varRdConfig.max_rpi;
1632 if (arpi)
1633 *arpi = pmb->un.varRdConfig.avail_rpi;
1634 if (mxri)
1635 *mxri = pmb->un.varRdConfig.max_xri;
1636 if (axri)
1637 *axri = pmb->un.varRdConfig.avail_xri;
1638 if (mvpi)
1639 *mvpi = pmb->un.varRdConfig.max_vpi;
1640 if (avpi)
1641 *avpi = pmb->un.varRdConfig.avail_vpi;
1642 }
James Smart92d7f7b2007-06-17 19:56:38 -05001643
1644 mempool_free(pmboxq, phba->mbox_mem_pool);
1645 return 1;
1646}
1647
James Smarte59058c2008-08-24 21:49:00 -04001648/**
James Smart3621a712009-04-06 18:47:14 -04001649 * lpfc_max_rpi_show - Return maximum rpi
James Smarte59058c2008-08-24 21:49:00 -04001650 * @dev: class device that is converted into a Scsi_host.
1651 * @attr: device attribute, not used.
1652 * @buf: on return contains the maximum rpi count in decimal or "Unknown".
1653 *
1654 * Description:
1655 * Calls lpfc_get_hba_info() asking for just the mrpi count.
1656 * If lpfc_get_hba_info() returns zero (failure) the buffer text is set
1657 * to "Unknown" and the buffer length is returned, therefore the caller
1658 * must check for "Unknown" in the buffer to detect a failure.
1659 *
1660 * Returns: size of formatted string.
1661 **/
James Smart92d7f7b2007-06-17 19:56:38 -05001662static ssize_t
Tony Jonesee959b02008-02-22 00:13:36 +01001663lpfc_max_rpi_show(struct device *dev, struct device_attribute *attr,
1664 char *buf)
James Smart92d7f7b2007-06-17 19:56:38 -05001665{
Tony Jonesee959b02008-02-22 00:13:36 +01001666 struct Scsi_Host *shost = class_to_shost(dev);
James Smart92d7f7b2007-06-17 19:56:38 -05001667 struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata;
1668 struct lpfc_hba *phba = vport->phba;
1669 uint32_t cnt;
1670
James Smart858c9f62007-06-17 19:56:39 -05001671 if (lpfc_get_hba_info(phba, NULL, NULL, &cnt, NULL, NULL, NULL))
James Smart92d7f7b2007-06-17 19:56:38 -05001672 return snprintf(buf, PAGE_SIZE, "%d\n", cnt);
1673 return snprintf(buf, PAGE_SIZE, "Unknown\n");
1674}
1675
James Smarte59058c2008-08-24 21:49:00 -04001676/**
James Smart3621a712009-04-06 18:47:14 -04001677 * lpfc_used_rpi_show - Return maximum rpi minus available rpi
James Smarte59058c2008-08-24 21:49:00 -04001678 * @dev: class device that is converted into a Scsi_host.
1679 * @attr: device attribute, not used.
1680 * @buf: containing the used rpi count in decimal or "Unknown".
1681 *
1682 * Description:
1683 * Calls lpfc_get_hba_info() asking for just the mrpi and arpi counts.
1684 * If lpfc_get_hba_info() returns zero (failure) the buffer text is set
1685 * to "Unknown" and the buffer length is returned, therefore the caller
1686 * must check for "Unknown" in the buffer to detect a failure.
1687 *
1688 * Returns: size of formatted string.
1689 **/
James Smart92d7f7b2007-06-17 19:56:38 -05001690static ssize_t
Tony Jonesee959b02008-02-22 00:13:36 +01001691lpfc_used_rpi_show(struct device *dev, struct device_attribute *attr,
1692 char *buf)
James Smart92d7f7b2007-06-17 19:56:38 -05001693{
Tony Jonesee959b02008-02-22 00:13:36 +01001694 struct Scsi_Host *shost = class_to_shost(dev);
James Smart92d7f7b2007-06-17 19:56:38 -05001695 struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata;
1696 struct lpfc_hba *phba = vport->phba;
1697 uint32_t cnt, acnt;
1698
James Smart858c9f62007-06-17 19:56:39 -05001699 if (lpfc_get_hba_info(phba, NULL, NULL, &cnt, &acnt, NULL, NULL))
James Smart92d7f7b2007-06-17 19:56:38 -05001700 return snprintf(buf, PAGE_SIZE, "%d\n", (cnt - acnt));
1701 return snprintf(buf, PAGE_SIZE, "Unknown\n");
1702}
1703
James Smarte59058c2008-08-24 21:49:00 -04001704/**
James Smart3621a712009-04-06 18:47:14 -04001705 * lpfc_max_xri_show - Return maximum xri
James Smarte59058c2008-08-24 21:49:00 -04001706 * @dev: class device that is converted into a Scsi_host.
1707 * @attr: device attribute, not used.
1708 * @buf: on return contains the maximum xri count in decimal or "Unknown".
1709 *
1710 * Description:
1711 * Calls lpfc_get_hba_info() asking for just the mrpi count.
1712 * If lpfc_get_hba_info() returns zero (failure) the buffer text is set
1713 * to "Unknown" and the buffer length is returned, therefore the caller
1714 * must check for "Unknown" in the buffer to detect a failure.
1715 *
1716 * Returns: size of formatted string.
1717 **/
James Smart92d7f7b2007-06-17 19:56:38 -05001718static ssize_t
Tony Jonesee959b02008-02-22 00:13:36 +01001719lpfc_max_xri_show(struct device *dev, struct device_attribute *attr,
1720 char *buf)
James Smart92d7f7b2007-06-17 19:56:38 -05001721{
Tony Jonesee959b02008-02-22 00:13:36 +01001722 struct Scsi_Host *shost = class_to_shost(dev);
James Smart92d7f7b2007-06-17 19:56:38 -05001723 struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata;
1724 struct lpfc_hba *phba = vport->phba;
1725 uint32_t cnt;
1726
James Smart858c9f62007-06-17 19:56:39 -05001727 if (lpfc_get_hba_info(phba, &cnt, NULL, NULL, NULL, NULL, NULL))
James Smart92d7f7b2007-06-17 19:56:38 -05001728 return snprintf(buf, PAGE_SIZE, "%d\n", cnt);
1729 return snprintf(buf, PAGE_SIZE, "Unknown\n");
1730}
1731
James Smarte59058c2008-08-24 21:49:00 -04001732/**
James Smart3621a712009-04-06 18:47:14 -04001733 * lpfc_used_xri_show - Return maximum xpi minus the available xpi
James Smarte59058c2008-08-24 21:49:00 -04001734 * @dev: class device that is converted into a Scsi_host.
1735 * @attr: device attribute, not used.
1736 * @buf: on return contains the used xri count in decimal or "Unknown".
1737 *
1738 * Description:
1739 * Calls lpfc_get_hba_info() asking for just the mxri and axri counts.
1740 * If lpfc_get_hba_info() returns zero (failure) the buffer text is set
1741 * to "Unknown" and the buffer length is returned, therefore the caller
1742 * must check for "Unknown" in the buffer to detect a failure.
1743 *
1744 * Returns: size of formatted string.
1745 **/
James Smart92d7f7b2007-06-17 19:56:38 -05001746static ssize_t
Tony Jonesee959b02008-02-22 00:13:36 +01001747lpfc_used_xri_show(struct device *dev, struct device_attribute *attr,
1748 char *buf)
James Smart92d7f7b2007-06-17 19:56:38 -05001749{
Tony Jonesee959b02008-02-22 00:13:36 +01001750 struct Scsi_Host *shost = class_to_shost(dev);
James Smart92d7f7b2007-06-17 19:56:38 -05001751 struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata;
1752 struct lpfc_hba *phba = vport->phba;
1753 uint32_t cnt, acnt;
1754
James Smart858c9f62007-06-17 19:56:39 -05001755 if (lpfc_get_hba_info(phba, &cnt, &acnt, NULL, NULL, NULL, NULL))
1756 return snprintf(buf, PAGE_SIZE, "%d\n", (cnt - acnt));
1757 return snprintf(buf, PAGE_SIZE, "Unknown\n");
1758}
1759
James Smarte59058c2008-08-24 21:49:00 -04001760/**
James Smart3621a712009-04-06 18:47:14 -04001761 * lpfc_max_vpi_show - Return maximum vpi
James Smarte59058c2008-08-24 21:49:00 -04001762 * @dev: class device that is converted into a Scsi_host.
1763 * @attr: device attribute, not used.
1764 * @buf: on return contains the maximum vpi count in decimal or "Unknown".
1765 *
1766 * Description:
1767 * Calls lpfc_get_hba_info() asking for just the mvpi count.
1768 * If lpfc_get_hba_info() returns zero (failure) the buffer text is set
1769 * to "Unknown" and the buffer length is returned, therefore the caller
1770 * must check for "Unknown" in the buffer to detect a failure.
1771 *
1772 * Returns: size of formatted string.
1773 **/
James Smart858c9f62007-06-17 19:56:39 -05001774static ssize_t
Tony Jonesee959b02008-02-22 00:13:36 +01001775lpfc_max_vpi_show(struct device *dev, struct device_attribute *attr,
1776 char *buf)
James Smart858c9f62007-06-17 19:56:39 -05001777{
Tony Jonesee959b02008-02-22 00:13:36 +01001778 struct Scsi_Host *shost = class_to_shost(dev);
James Smart858c9f62007-06-17 19:56:39 -05001779 struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata;
1780 struct lpfc_hba *phba = vport->phba;
1781 uint32_t cnt;
1782
1783 if (lpfc_get_hba_info(phba, NULL, NULL, NULL, NULL, &cnt, NULL))
1784 return snprintf(buf, PAGE_SIZE, "%d\n", cnt);
1785 return snprintf(buf, PAGE_SIZE, "Unknown\n");
1786}
1787
James Smarte59058c2008-08-24 21:49:00 -04001788/**
James Smart3621a712009-04-06 18:47:14 -04001789 * lpfc_used_vpi_show - Return maximum vpi minus the available vpi
James Smarte59058c2008-08-24 21:49:00 -04001790 * @dev: class device that is converted into a Scsi_host.
1791 * @attr: device attribute, not used.
1792 * @buf: on return contains the used vpi count in decimal or "Unknown".
1793 *
1794 * Description:
1795 * Calls lpfc_get_hba_info() asking for just the mvpi and avpi counts.
1796 * If lpfc_get_hba_info() returns zero (failure) the buffer text is set
1797 * to "Unknown" and the buffer length is returned, therefore the caller
1798 * must check for "Unknown" in the buffer to detect a failure.
1799 *
1800 * Returns: size of formatted string.
1801 **/
James Smart858c9f62007-06-17 19:56:39 -05001802static ssize_t
Tony Jonesee959b02008-02-22 00:13:36 +01001803lpfc_used_vpi_show(struct device *dev, struct device_attribute *attr,
1804 char *buf)
James Smart858c9f62007-06-17 19:56:39 -05001805{
Tony Jonesee959b02008-02-22 00:13:36 +01001806 struct Scsi_Host *shost = class_to_shost(dev);
James Smart858c9f62007-06-17 19:56:39 -05001807 struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata;
1808 struct lpfc_hba *phba = vport->phba;
1809 uint32_t cnt, acnt;
1810
1811 if (lpfc_get_hba_info(phba, NULL, NULL, NULL, NULL, &cnt, &acnt))
James Smart92d7f7b2007-06-17 19:56:38 -05001812 return snprintf(buf, PAGE_SIZE, "%d\n", (cnt - acnt));
1813 return snprintf(buf, PAGE_SIZE, "Unknown\n");
1814}
1815
James Smarte59058c2008-08-24 21:49:00 -04001816/**
James Smart3621a712009-04-06 18:47:14 -04001817 * lpfc_npiv_info_show - Return text about NPIV support for the adapter
James Smarte59058c2008-08-24 21:49:00 -04001818 * @dev: class device that is converted into a Scsi_host.
1819 * @attr: device attribute, not used.
1820 * @buf: text that must be interpreted to determine if npiv is supported.
1821 *
1822 * Description:
1823 * Buffer will contain text indicating npiv is not suppoerted on the port,
1824 * the port is an NPIV physical port, or it is an npiv virtual port with
1825 * the id of the vport.
1826 *
1827 * Returns: size of formatted string.
1828 **/
James Smart92d7f7b2007-06-17 19:56:38 -05001829static ssize_t
Tony Jonesee959b02008-02-22 00:13:36 +01001830lpfc_npiv_info_show(struct device *dev, struct device_attribute *attr,
1831 char *buf)
James Smart92d7f7b2007-06-17 19:56:38 -05001832{
Tony Jonesee959b02008-02-22 00:13:36 +01001833 struct Scsi_Host *shost = class_to_shost(dev);
James Smart92d7f7b2007-06-17 19:56:38 -05001834 struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata;
1835 struct lpfc_hba *phba = vport->phba;
1836
1837 if (!(phba->max_vpi))
1838 return snprintf(buf, PAGE_SIZE, "NPIV Not Supported\n");
1839 if (vport->port_type == LPFC_PHYSICAL_PORT)
1840 return snprintf(buf, PAGE_SIZE, "NPIV Physical\n");
1841 return snprintf(buf, PAGE_SIZE, "NPIV Virtual (VPI %d)\n", vport->vpi);
1842}
1843
James Smarte59058c2008-08-24 21:49:00 -04001844/**
James Smart3621a712009-04-06 18:47:14 -04001845 * lpfc_poll_show - Return text about poll support for the adapter
James Smarte59058c2008-08-24 21:49:00 -04001846 * @dev: class device that is converted into a Scsi_host.
1847 * @attr: device attribute, not used.
1848 * @buf: on return contains the cfg_poll in hex.
1849 *
1850 * Notes:
1851 * cfg_poll should be a lpfc_polling_flags type.
1852 *
1853 * Returns: size of formatted string.
1854 **/
Jamie Wellnitz41415862006-02-28 19:25:27 -05001855static ssize_t
Tony Jonesee959b02008-02-22 00:13:36 +01001856lpfc_poll_show(struct device *dev, struct device_attribute *attr,
1857 char *buf)
James.Smart@Emulex.Com875fbdf2005-11-29 16:32:13 -05001858{
Tony Jonesee959b02008-02-22 00:13:36 +01001859 struct Scsi_Host *shost = class_to_shost(dev);
James Smart2e0fef82007-06-17 19:56:36 -05001860 struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata;
1861 struct lpfc_hba *phba = vport->phba;
James.Smart@Emulex.Com875fbdf2005-11-29 16:32:13 -05001862
1863 return snprintf(buf, PAGE_SIZE, "%#x\n", phba->cfg_poll);
1864}
1865
James Smarte59058c2008-08-24 21:49:00 -04001866/**
James Smart3621a712009-04-06 18:47:14 -04001867 * lpfc_poll_store - Set the value of cfg_poll for the adapter
James Smarte59058c2008-08-24 21:49:00 -04001868 * @dev: class device that is converted into a Scsi_host.
1869 * @attr: device attribute, not used.
1870 * @buf: one or more lpfc_polling_flags values.
1871 * @count: not used.
1872 *
1873 * Notes:
1874 * buf contents converted to integer and checked for a valid value.
1875 *
1876 * Returns:
1877 * -EINVAL if the buffer connot be converted or is out of range
1878 * length of the buf on success
1879 **/
James.Smart@Emulex.Com875fbdf2005-11-29 16:32:13 -05001880static ssize_t
Tony Jonesee959b02008-02-22 00:13:36 +01001881lpfc_poll_store(struct device *dev, struct device_attribute *attr,
1882 const char *buf, size_t count)
James.Smart@Emulex.Com875fbdf2005-11-29 16:32:13 -05001883{
Tony Jonesee959b02008-02-22 00:13:36 +01001884 struct Scsi_Host *shost = class_to_shost(dev);
James Smart2e0fef82007-06-17 19:56:36 -05001885 struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata;
1886 struct lpfc_hba *phba = vport->phba;
James.Smart@Emulex.Com875fbdf2005-11-29 16:32:13 -05001887 uint32_t creg_val;
1888 uint32_t old_val;
1889 int val=0;
1890
1891 if (!isdigit(buf[0]))
1892 return -EINVAL;
1893
1894 if (sscanf(buf, "%i", &val) != 1)
1895 return -EINVAL;
1896
1897 if ((val & 0x3) != val)
1898 return -EINVAL;
1899
James Smart45ed1192009-10-02 15:17:02 -04001900 if (phba->sli_rev == LPFC_SLI_REV4)
1901 val = 0;
1902
James Smart88a2cfb2011-07-22 18:36:33 -04001903 lpfc_printf_vlog(vport, KERN_ERR, LOG_INIT,
1904 "3051 lpfc_poll changed from %d to %d\n",
1905 phba->cfg_poll, val);
1906
James Smart2e0fef82007-06-17 19:56:36 -05001907 spin_lock_irq(&phba->hbalock);
James.Smart@Emulex.Com875fbdf2005-11-29 16:32:13 -05001908
1909 old_val = phba->cfg_poll;
1910
1911 if (val & ENABLE_FCP_RING_POLLING) {
1912 if ((val & DISABLE_FCP_RING_INT) &&
1913 !(old_val & DISABLE_FCP_RING_INT)) {
James Smart9940b972011-03-11 16:06:12 -05001914 if (lpfc_readl(phba->HCregaddr, &creg_val)) {
1915 spin_unlock_irq(&phba->hbalock);
1916 return -EINVAL;
1917 }
James.Smart@Emulex.Com875fbdf2005-11-29 16:32:13 -05001918 creg_val &= ~(HC_R0INT_ENA << LPFC_FCP_RING);
1919 writel(creg_val, phba->HCregaddr);
1920 readl(phba->HCregaddr); /* flush */
1921
1922 lpfc_poll_start_timer(phba);
1923 }
1924 } else if (val != 0x0) {
James Smart2e0fef82007-06-17 19:56:36 -05001925 spin_unlock_irq(&phba->hbalock);
James.Smart@Emulex.Com875fbdf2005-11-29 16:32:13 -05001926 return -EINVAL;
1927 }
1928
1929 if (!(val & DISABLE_FCP_RING_INT) &&
1930 (old_val & DISABLE_FCP_RING_INT))
1931 {
James Smart2e0fef82007-06-17 19:56:36 -05001932 spin_unlock_irq(&phba->hbalock);
James.Smart@Emulex.Com875fbdf2005-11-29 16:32:13 -05001933 del_timer(&phba->fcp_poll_timer);
James Smart2e0fef82007-06-17 19:56:36 -05001934 spin_lock_irq(&phba->hbalock);
James Smart9940b972011-03-11 16:06:12 -05001935 if (lpfc_readl(phba->HCregaddr, &creg_val)) {
1936 spin_unlock_irq(&phba->hbalock);
1937 return -EINVAL;
1938 }
James.Smart@Emulex.Com875fbdf2005-11-29 16:32:13 -05001939 creg_val |= (HC_R0INT_ENA << LPFC_FCP_RING);
1940 writel(creg_val, phba->HCregaddr);
1941 readl(phba->HCregaddr); /* flush */
1942 }
1943
1944 phba->cfg_poll = val;
1945
James Smart2e0fef82007-06-17 19:56:36 -05001946 spin_unlock_irq(&phba->hbalock);
James.Smart@Emulex.Com875fbdf2005-11-29 16:32:13 -05001947
1948 return strlen(buf);
1949}
dea31012005-04-17 16:05:31 -05001950
James Smarte59058c2008-08-24 21:49:00 -04001951/**
James Smartbc739052010-08-04 16:11:18 -04001952 * lpfc_fips_level_show - Return the current FIPS level for the HBA
1953 * @dev: class unused variable.
1954 * @attr: device attribute, not used.
1955 * @buf: on return contains the module description text.
1956 *
1957 * Returns: size of formatted string.
1958 **/
1959static ssize_t
1960lpfc_fips_level_show(struct device *dev, struct device_attribute *attr,
1961 char *buf)
1962{
1963 struct Scsi_Host *shost = class_to_shost(dev);
1964 struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata;
1965 struct lpfc_hba *phba = vport->phba;
1966
1967 return snprintf(buf, PAGE_SIZE, "%d\n", phba->fips_level);
1968}
1969
1970/**
1971 * lpfc_fips_rev_show - Return the FIPS Spec revision for the HBA
1972 * @dev: class unused variable.
1973 * @attr: device attribute, not used.
1974 * @buf: on return contains the module description text.
1975 *
1976 * Returns: size of formatted string.
1977 **/
1978static ssize_t
1979lpfc_fips_rev_show(struct device *dev, struct device_attribute *attr,
1980 char *buf)
1981{
1982 struct Scsi_Host *shost = class_to_shost(dev);
1983 struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata;
1984 struct lpfc_hba *phba = vport->phba;
1985
1986 return snprintf(buf, PAGE_SIZE, "%d\n", phba->fips_spec_rev);
1987}
1988
1989/**
James Smartab56dc22011-02-16 12:39:57 -05001990 * lpfc_dss_show - Return the current state of dss and the configured state
1991 * @dev: class converted to a Scsi_host structure.
1992 * @attr: device attribute, not used.
1993 * @buf: on return contains the formatted text.
1994 *
1995 * Returns: size of formatted string.
1996 **/
1997static ssize_t
1998lpfc_dss_show(struct device *dev, struct device_attribute *attr,
1999 char *buf)
2000{
2001 struct Scsi_Host *shost = class_to_shost(dev);
2002 struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata;
2003 struct lpfc_hba *phba = vport->phba;
2004
2005 return snprintf(buf, PAGE_SIZE, "%s - %sOperational\n",
2006 (phba->cfg_enable_dss) ? "Enabled" : "Disabled",
2007 (phba->sli3_options & LPFC_SLI3_DSS_ENABLED) ?
2008 "" : "Not ");
2009}
2010
2011/**
James Smart912e3ac2011-05-24 11:42:11 -04002012 * lpfc_sriov_hw_max_virtfn_show - Return maximum number of virtual functions
2013 * @dev: class converted to a Scsi_host structure.
2014 * @attr: device attribute, not used.
2015 * @buf: on return contains the formatted support level.
2016 *
2017 * Description:
2018 * Returns the maximum number of virtual functions a physical function can
2019 * support, 0 will be returned if called on virtual function.
2020 *
2021 * Returns: size of formatted string.
2022 **/
2023static ssize_t
2024lpfc_sriov_hw_max_virtfn_show(struct device *dev,
2025 struct device_attribute *attr,
2026 char *buf)
2027{
2028 struct Scsi_Host *shost = class_to_shost(dev);
2029 struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata;
2030 struct lpfc_hba *phba = vport->phba;
James Smart0a96e972011-07-22 18:37:28 -04002031 uint16_t max_nr_virtfn;
James Smart912e3ac2011-05-24 11:42:11 -04002032
James Smart0a96e972011-07-22 18:37:28 -04002033 max_nr_virtfn = lpfc_sli_sriov_nr_virtfn_get(phba);
2034 return snprintf(buf, PAGE_SIZE, "%d\n", max_nr_virtfn);
James Smart912e3ac2011-05-24 11:42:11 -04002035}
2036
Arnd Bergmannde8c36b2016-06-15 22:42:17 +02002037static inline bool lpfc_rangecheck(uint val, uint min, uint max)
2038{
2039 return val >= min && val <= max;
2040}
2041
James Smart912e3ac2011-05-24 11:42:11 -04002042/**
James Smart44fd7fe2017-08-23 16:55:47 -07002043 * lpfc_enable_bbcr_set: Sets an attribute value.
2044 * @phba: pointer the the adapter structure.
2045 * @val: integer attribute value.
2046 *
2047 * Description:
2048 * Validates the min and max values then sets the
2049 * adapter config field if in the valid range. prints error message
2050 * and does not set the parameter if invalid.
2051 *
2052 * Returns:
2053 * zero on success
2054 * -EINVAL if val is invalid
2055 */
2056static ssize_t
2057lpfc_enable_bbcr_set(struct lpfc_hba *phba, uint val)
2058{
2059 if (lpfc_rangecheck(val, 0, 1) && phba->sli_rev == LPFC_SLI_REV4) {
2060 lpfc_printf_log(phba, KERN_ERR, LOG_INIT,
2061 "3068 %s_enable_bbcr changed from %d to %d\n",
2062 LPFC_DRIVER_NAME, phba->cfg_enable_bbcr, val);
2063 phba->cfg_enable_bbcr = val;
2064 return 0;
2065 }
2066 lpfc_printf_log(phba, KERN_ERR, LOG_INIT,
2067 "0451 %s_enable_bbcr cannot set to %d, range is 0, 1\n",
2068 LPFC_DRIVER_NAME, val);
2069 return -EINVAL;
2070}
2071
2072/**
James Smart3621a712009-04-06 18:47:14 -04002073 * lpfc_param_show - Return a cfg attribute value in decimal
James Smarte59058c2008-08-24 21:49:00 -04002074 *
2075 * Description:
2076 * Macro that given an attr e.g. hba_queue_depth expands
2077 * into a function with the name lpfc_hba_queue_depth_show.
2078 *
2079 * lpfc_##attr##_show: Return the decimal value of an adapters cfg_xxx field.
2080 * @dev: class device that is converted into a Scsi_host.
2081 * @attr: device attribute, not used.
2082 * @buf: on return contains the attribute value in decimal.
2083 *
2084 * Returns: size of formatted string.
2085 **/
dea31012005-04-17 16:05:31 -05002086#define lpfc_param_show(attr) \
2087static ssize_t \
Tony Jonesee959b02008-02-22 00:13:36 +01002088lpfc_##attr##_show(struct device *dev, struct device_attribute *attr, \
2089 char *buf) \
dea31012005-04-17 16:05:31 -05002090{ \
Tony Jonesee959b02008-02-22 00:13:36 +01002091 struct Scsi_Host *shost = class_to_shost(dev);\
James Smart2e0fef82007-06-17 19:56:36 -05002092 struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata;\
2093 struct lpfc_hba *phba = vport->phba;\
James.Smart@Emulex.Com7bcbb752005-10-28 20:29:13 -04002094 return snprintf(buf, PAGE_SIZE, "%d\n",\
2095 phba->cfg_##attr);\
dea31012005-04-17 16:05:31 -05002096}
2097
James Smarte59058c2008-08-24 21:49:00 -04002098/**
James Smart3621a712009-04-06 18:47:14 -04002099 * lpfc_param_hex_show - Return a cfg attribute value in hex
James Smarte59058c2008-08-24 21:49:00 -04002100 *
2101 * Description:
2102 * Macro that given an attr e.g. hba_queue_depth expands
2103 * into a function with the name lpfc_hba_queue_depth_show
2104 *
2105 * lpfc_##attr##_show: Return the hex value of an adapters cfg_xxx field.
2106 * @dev: class device that is converted into a Scsi_host.
2107 * @attr: device attribute, not used.
James Smart3621a712009-04-06 18:47:14 -04002108 * @buf: on return contains the attribute value in hexadecimal.
James Smarte59058c2008-08-24 21:49:00 -04002109 *
2110 * Returns: size of formatted string.
2111 **/
James.Smart@Emulex.Com93a20f72005-10-28 20:29:32 -04002112#define lpfc_param_hex_show(attr) \
2113static ssize_t \
Tony Jonesee959b02008-02-22 00:13:36 +01002114lpfc_##attr##_show(struct device *dev, struct device_attribute *attr, \
2115 char *buf) \
James.Smart@Emulex.Com93a20f72005-10-28 20:29:32 -04002116{ \
Tony Jonesee959b02008-02-22 00:13:36 +01002117 struct Scsi_Host *shost = class_to_shost(dev);\
James Smart2e0fef82007-06-17 19:56:36 -05002118 struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata;\
2119 struct lpfc_hba *phba = vport->phba;\
James Smart84d1b002010-02-12 14:42:33 -05002120 uint val = 0;\
James.Smart@Emulex.Com93a20f72005-10-28 20:29:32 -04002121 val = phba->cfg_##attr;\
2122 return snprintf(buf, PAGE_SIZE, "%#x\n",\
2123 phba->cfg_##attr);\
2124}
2125
James Smarte59058c2008-08-24 21:49:00 -04002126/**
Uwe Kleine-Königb5950762010-11-01 15:38:34 -04002127 * lpfc_param_init - Initializes a cfg attribute
James Smarte59058c2008-08-24 21:49:00 -04002128 *
2129 * Description:
2130 * Macro that given an attr e.g. hba_queue_depth expands
2131 * into a function with the name lpfc_hba_queue_depth_init. The macro also
2132 * takes a default argument, a minimum and maximum argument.
2133 *
2134 * lpfc_##attr##_init: Initializes an attribute.
2135 * @phba: pointer the the adapter structure.
2136 * @val: integer attribute value.
2137 *
2138 * Validates the min and max values then sets the adapter config field
2139 * accordingly, or uses the default if out of range and prints an error message.
2140 *
2141 * Returns:
2142 * zero on success
2143 * -EINVAL if default used
2144 **/
James.Smart@Emulex.Com7bcbb752005-10-28 20:29:13 -04002145#define lpfc_param_init(attr, default, minval, maxval) \
2146static int \
James Smart84d1b002010-02-12 14:42:33 -05002147lpfc_##attr##_init(struct lpfc_hba *phba, uint val) \
James.Smart@Emulex.Com7bcbb752005-10-28 20:29:13 -04002148{ \
Arnd Bergmannde8c36b2016-06-15 22:42:17 +02002149 if (lpfc_rangecheck(val, minval, maxval)) {\
James.Smart@Emulex.Com7bcbb752005-10-28 20:29:13 -04002150 phba->cfg_##attr = val;\
2151 return 0;\
2152 }\
2153 lpfc_printf_log(phba, KERN_ERR, LOG_INIT, \
James Smarte8b62012007-08-02 11:10:09 -04002154 "0449 lpfc_"#attr" attribute cannot be set to %d, "\
2155 "allowed range is ["#minval", "#maxval"]\n", val); \
James.Smart@Emulex.Com7bcbb752005-10-28 20:29:13 -04002156 phba->cfg_##attr = default;\
2157 return -EINVAL;\
2158}
2159
James Smarte59058c2008-08-24 21:49:00 -04002160/**
James Smart3621a712009-04-06 18:47:14 -04002161 * lpfc_param_set - Set a cfg attribute value
James Smarte59058c2008-08-24 21:49:00 -04002162 *
2163 * Description:
2164 * Macro that given an attr e.g. hba_queue_depth expands
2165 * into a function with the name lpfc_hba_queue_depth_set
2166 *
2167 * lpfc_##attr##_set: Sets an attribute value.
2168 * @phba: pointer the the adapter structure.
2169 * @val: integer attribute value.
2170 *
2171 * Description:
2172 * Validates the min and max values then sets the
2173 * adapter config field if in the valid range. prints error message
2174 * and does not set the parameter if invalid.
2175 *
2176 * Returns:
2177 * zero on success
2178 * -EINVAL if val is invalid
2179 **/
James.Smart@Emulex.Com7bcbb752005-10-28 20:29:13 -04002180#define lpfc_param_set(attr, default, minval, maxval) \
2181static int \
James Smart84d1b002010-02-12 14:42:33 -05002182lpfc_##attr##_set(struct lpfc_hba *phba, uint val) \
James.Smart@Emulex.Com7bcbb752005-10-28 20:29:13 -04002183{ \
Arnd Bergmannde8c36b2016-06-15 22:42:17 +02002184 if (lpfc_rangecheck(val, minval, maxval)) {\
James Smart88a2cfb2011-07-22 18:36:33 -04002185 lpfc_printf_log(phba, KERN_ERR, LOG_INIT, \
2186 "3052 lpfc_" #attr " changed from %d to %d\n", \
2187 phba->cfg_##attr, val); \
James.Smart@Emulex.Com7bcbb752005-10-28 20:29:13 -04002188 phba->cfg_##attr = val;\
2189 return 0;\
2190 }\
2191 lpfc_printf_log(phba, KERN_ERR, LOG_INIT, \
James Smarte8b62012007-08-02 11:10:09 -04002192 "0450 lpfc_"#attr" attribute cannot be set to %d, "\
2193 "allowed range is ["#minval", "#maxval"]\n", val); \
James.Smart@Emulex.Com7bcbb752005-10-28 20:29:13 -04002194 return -EINVAL;\
2195}
2196
James Smarte59058c2008-08-24 21:49:00 -04002197/**
James Smart3621a712009-04-06 18:47:14 -04002198 * lpfc_param_store - Set a vport attribute value
James Smarte59058c2008-08-24 21:49:00 -04002199 *
2200 * Description:
2201 * Macro that given an attr e.g. hba_queue_depth expands
2202 * into a function with the name lpfc_hba_queue_depth_store.
2203 *
2204 * lpfc_##attr##_store: Set an sttribute value.
2205 * @dev: class device that is converted into a Scsi_host.
2206 * @attr: device attribute, not used.
2207 * @buf: contains the attribute value in ascii.
2208 * @count: not used.
2209 *
2210 * Description:
2211 * Convert the ascii text number to an integer, then
2212 * use the lpfc_##attr##_set function to set the value.
2213 *
2214 * Returns:
2215 * -EINVAL if val is invalid or lpfc_##attr##_set() fails
2216 * length of buffer upon success.
2217 **/
James.Smart@Emulex.Com7bcbb752005-10-28 20:29:13 -04002218#define lpfc_param_store(attr) \
dea31012005-04-17 16:05:31 -05002219static ssize_t \
Tony Jonesee959b02008-02-22 00:13:36 +01002220lpfc_##attr##_store(struct device *dev, struct device_attribute *attr, \
2221 const char *buf, size_t count) \
dea31012005-04-17 16:05:31 -05002222{ \
Tony Jonesee959b02008-02-22 00:13:36 +01002223 struct Scsi_Host *shost = class_to_shost(dev);\
James Smart2e0fef82007-06-17 19:56:36 -05002224 struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata;\
2225 struct lpfc_hba *phba = vport->phba;\
James Smart84d1b002010-02-12 14:42:33 -05002226 uint val = 0;\
James.Smart@Emulex.Com93a20f72005-10-28 20:29:32 -04002227 if (!isdigit(buf[0]))\
2228 return -EINVAL;\
2229 if (sscanf(buf, "%i", &val) != 1)\
2230 return -EINVAL;\
James.Smart@Emulex.Com7bcbb752005-10-28 20:29:13 -04002231 if (lpfc_##attr##_set(phba, val) == 0) \
James.Smart@Emulex.Com755c0d02005-10-28 20:29:06 -04002232 return strlen(buf);\
James.Smart@Emulex.Com7bcbb752005-10-28 20:29:13 -04002233 else \
2234 return -EINVAL;\
dea31012005-04-17 16:05:31 -05002235}
2236
James Smarte59058c2008-08-24 21:49:00 -04002237/**
James Smart3621a712009-04-06 18:47:14 -04002238 * lpfc_vport_param_show - Return decimal formatted cfg attribute value
James Smarte59058c2008-08-24 21:49:00 -04002239 *
2240 * Description:
2241 * Macro that given an attr e.g. hba_queue_depth expands
2242 * into a function with the name lpfc_hba_queue_depth_show
2243 *
2244 * lpfc_##attr##_show: prints the attribute value in decimal.
2245 * @dev: class device that is converted into a Scsi_host.
2246 * @attr: device attribute, not used.
2247 * @buf: on return contains the attribute value in decimal.
2248 *
2249 * Returns: length of formatted string.
2250 **/
James Smart3de2a652007-08-02 11:09:59 -04002251#define lpfc_vport_param_show(attr) \
2252static ssize_t \
Tony Jonesee959b02008-02-22 00:13:36 +01002253lpfc_##attr##_show(struct device *dev, struct device_attribute *attr, \
2254 char *buf) \
James Smart3de2a652007-08-02 11:09:59 -04002255{ \
Tony Jonesee959b02008-02-22 00:13:36 +01002256 struct Scsi_Host *shost = class_to_shost(dev);\
James Smart3de2a652007-08-02 11:09:59 -04002257 struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata;\
James Smart3de2a652007-08-02 11:09:59 -04002258 return snprintf(buf, PAGE_SIZE, "%d\n", vport->cfg_##attr);\
2259}
2260
James Smarte59058c2008-08-24 21:49:00 -04002261/**
James Smart3621a712009-04-06 18:47:14 -04002262 * lpfc_vport_param_hex_show - Return hex formatted attribute value
James Smarte59058c2008-08-24 21:49:00 -04002263 *
2264 * Description:
2265 * Macro that given an attr e.g.
2266 * hba_queue_depth expands into a function with the name
2267 * lpfc_hba_queue_depth_show
2268 *
James Smart3621a712009-04-06 18:47:14 -04002269 * lpfc_##attr##_show: prints the attribute value in hexadecimal.
James Smarte59058c2008-08-24 21:49:00 -04002270 * @dev: class device that is converted into a Scsi_host.
2271 * @attr: device attribute, not used.
James Smart3621a712009-04-06 18:47:14 -04002272 * @buf: on return contains the attribute value in hexadecimal.
James Smarte59058c2008-08-24 21:49:00 -04002273 *
2274 * Returns: length of formatted string.
2275 **/
James Smart3de2a652007-08-02 11:09:59 -04002276#define lpfc_vport_param_hex_show(attr) \
2277static ssize_t \
Tony Jonesee959b02008-02-22 00:13:36 +01002278lpfc_##attr##_show(struct device *dev, struct device_attribute *attr, \
2279 char *buf) \
James Smart3de2a652007-08-02 11:09:59 -04002280{ \
Tony Jonesee959b02008-02-22 00:13:36 +01002281 struct Scsi_Host *shost = class_to_shost(dev);\
James Smart3de2a652007-08-02 11:09:59 -04002282 struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata;\
James Smart3de2a652007-08-02 11:09:59 -04002283 return snprintf(buf, PAGE_SIZE, "%#x\n", vport->cfg_##attr);\
2284}
2285
James Smarte59058c2008-08-24 21:49:00 -04002286/**
James Smart3621a712009-04-06 18:47:14 -04002287 * lpfc_vport_param_init - Initialize a vport cfg attribute
James Smarte59058c2008-08-24 21:49:00 -04002288 *
2289 * Description:
2290 * Macro that given an attr e.g. hba_queue_depth expands
2291 * into a function with the name lpfc_hba_queue_depth_init. The macro also
2292 * takes a default argument, a minimum and maximum argument.
2293 *
2294 * lpfc_##attr##_init: validates the min and max values then sets the
2295 * adapter config field accordingly, or uses the default if out of range
2296 * and prints an error message.
2297 * @phba: pointer the the adapter structure.
2298 * @val: integer attribute value.
2299 *
2300 * Returns:
2301 * zero on success
2302 * -EINVAL if default used
2303 **/
James Smart3de2a652007-08-02 11:09:59 -04002304#define lpfc_vport_param_init(attr, default, minval, maxval) \
2305static int \
James Smart84d1b002010-02-12 14:42:33 -05002306lpfc_##attr##_init(struct lpfc_vport *vport, uint val) \
James Smart3de2a652007-08-02 11:09:59 -04002307{ \
Arnd Bergmannde8c36b2016-06-15 22:42:17 +02002308 if (lpfc_rangecheck(val, minval, maxval)) {\
James Smart3de2a652007-08-02 11:09:59 -04002309 vport->cfg_##attr = val;\
2310 return 0;\
2311 }\
James Smarte8b62012007-08-02 11:10:09 -04002312 lpfc_printf_vlog(vport, KERN_ERR, LOG_INIT, \
James Smartd7c255b2008-08-24 21:50:00 -04002313 "0423 lpfc_"#attr" attribute cannot be set to %d, "\
James Smarte8b62012007-08-02 11:10:09 -04002314 "allowed range is ["#minval", "#maxval"]\n", val); \
James Smart3de2a652007-08-02 11:09:59 -04002315 vport->cfg_##attr = default;\
2316 return -EINVAL;\
2317}
2318
James Smarte59058c2008-08-24 21:49:00 -04002319/**
James Smart3621a712009-04-06 18:47:14 -04002320 * lpfc_vport_param_set - Set a vport cfg attribute
James Smarte59058c2008-08-24 21:49:00 -04002321 *
2322 * Description:
2323 * Macro that given an attr e.g. hba_queue_depth expands
2324 * into a function with the name lpfc_hba_queue_depth_set
2325 *
2326 * lpfc_##attr##_set: validates the min and max values then sets the
2327 * adapter config field if in the valid range. prints error message
2328 * and does not set the parameter if invalid.
2329 * @phba: pointer the the adapter structure.
2330 * @val: integer attribute value.
2331 *
2332 * Returns:
2333 * zero on success
2334 * -EINVAL if val is invalid
2335 **/
James Smart3de2a652007-08-02 11:09:59 -04002336#define lpfc_vport_param_set(attr, default, minval, maxval) \
2337static int \
James Smart84d1b002010-02-12 14:42:33 -05002338lpfc_##attr##_set(struct lpfc_vport *vport, uint val) \
James Smart3de2a652007-08-02 11:09:59 -04002339{ \
Arnd Bergmannde8c36b2016-06-15 22:42:17 +02002340 if (lpfc_rangecheck(val, minval, maxval)) {\
James Smart88a2cfb2011-07-22 18:36:33 -04002341 lpfc_printf_vlog(vport, KERN_ERR, LOG_INIT, \
James Smart14660f42013-09-06 12:20:20 -04002342 "3053 lpfc_" #attr \
2343 " changed from %d (x%x) to %d (x%x)\n", \
2344 vport->cfg_##attr, vport->cfg_##attr, \
2345 val, val); \
James Smart3de2a652007-08-02 11:09:59 -04002346 vport->cfg_##attr = val;\
2347 return 0;\
2348 }\
James Smarte8b62012007-08-02 11:10:09 -04002349 lpfc_printf_vlog(vport, KERN_ERR, LOG_INIT, \
James Smartd7c255b2008-08-24 21:50:00 -04002350 "0424 lpfc_"#attr" attribute cannot be set to %d, "\
James Smarte8b62012007-08-02 11:10:09 -04002351 "allowed range is ["#minval", "#maxval"]\n", val); \
James Smart3de2a652007-08-02 11:09:59 -04002352 return -EINVAL;\
2353}
2354
James Smarte59058c2008-08-24 21:49:00 -04002355/**
James Smart3621a712009-04-06 18:47:14 -04002356 * lpfc_vport_param_store - Set a vport attribute
James Smarte59058c2008-08-24 21:49:00 -04002357 *
2358 * Description:
2359 * Macro that given an attr e.g. hba_queue_depth
2360 * expands into a function with the name lpfc_hba_queue_depth_store
2361 *
2362 * lpfc_##attr##_store: convert the ascii text number to an integer, then
2363 * use the lpfc_##attr##_set function to set the value.
2364 * @cdev: class device that is converted into a Scsi_host.
2365 * @buf: contains the attribute value in decimal.
2366 * @count: not used.
2367 *
2368 * Returns:
2369 * -EINVAL if val is invalid or lpfc_##attr##_set() fails
2370 * length of buffer upon success.
2371 **/
James Smart3de2a652007-08-02 11:09:59 -04002372#define lpfc_vport_param_store(attr) \
2373static ssize_t \
Tony Jonesee959b02008-02-22 00:13:36 +01002374lpfc_##attr##_store(struct device *dev, struct device_attribute *attr, \
2375 const char *buf, size_t count) \
James Smart3de2a652007-08-02 11:09:59 -04002376{ \
Tony Jonesee959b02008-02-22 00:13:36 +01002377 struct Scsi_Host *shost = class_to_shost(dev);\
James Smart3de2a652007-08-02 11:09:59 -04002378 struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata;\
James Smart84d1b002010-02-12 14:42:33 -05002379 uint val = 0;\
James Smart3de2a652007-08-02 11:09:59 -04002380 if (!isdigit(buf[0]))\
2381 return -EINVAL;\
2382 if (sscanf(buf, "%i", &val) != 1)\
2383 return -EINVAL;\
2384 if (lpfc_##attr##_set(vport, val) == 0) \
2385 return strlen(buf);\
2386 else \
2387 return -EINVAL;\
2388}
2389
2390
James Smart895427b2017-02-12 13:52:30 -08002391static DEVICE_ATTR(nvme_info, 0444, lpfc_nvme_info_show, NULL);
James Smart81301a92008-12-04 22:39:46 -05002392static DEVICE_ATTR(bg_info, S_IRUGO, lpfc_bg_info_show, NULL);
2393static DEVICE_ATTR(bg_guard_err, S_IRUGO, lpfc_bg_guard_err_show, NULL);
2394static DEVICE_ATTR(bg_apptag_err, S_IRUGO, lpfc_bg_apptag_err_show, NULL);
2395static DEVICE_ATTR(bg_reftag_err, S_IRUGO, lpfc_bg_reftag_err_show, NULL);
Tony Jonesee959b02008-02-22 00:13:36 +01002396static DEVICE_ATTR(info, S_IRUGO, lpfc_info_show, NULL);
2397static DEVICE_ATTR(serialnum, S_IRUGO, lpfc_serialnum_show, NULL);
2398static DEVICE_ATTR(modeldesc, S_IRUGO, lpfc_modeldesc_show, NULL);
2399static DEVICE_ATTR(modelname, S_IRUGO, lpfc_modelname_show, NULL);
2400static DEVICE_ATTR(programtype, S_IRUGO, lpfc_programtype_show, NULL);
2401static DEVICE_ATTR(portnum, S_IRUGO, lpfc_vportnum_show, NULL);
2402static DEVICE_ATTR(fwrev, S_IRUGO, lpfc_fwrev_show, NULL);
2403static DEVICE_ATTR(hdw, S_IRUGO, lpfc_hdw_show, NULL);
James Smart84d1b002010-02-12 14:42:33 -05002404static DEVICE_ATTR(link_state, S_IRUGO | S_IWUSR, lpfc_link_state_show,
2405 lpfc_link_state_store);
Tony Jonesee959b02008-02-22 00:13:36 +01002406static DEVICE_ATTR(option_rom_version, S_IRUGO,
2407 lpfc_option_rom_version_show, NULL);
2408static DEVICE_ATTR(num_discovered_ports, S_IRUGO,
2409 lpfc_num_discovered_ports_show, NULL);
James Smart84774a42008-08-24 21:50:06 -04002410static DEVICE_ATTR(menlo_mgmt_mode, S_IRUGO, lpfc_mlomgmt_show, NULL);
Tony Jonesee959b02008-02-22 00:13:36 +01002411static DEVICE_ATTR(nport_evt_cnt, S_IRUGO, lpfc_nport_evt_cnt_show, NULL);
Joe Perchesc828a892017-12-19 10:15:08 -08002412static DEVICE_ATTR_RO(lpfc_drvr_version);
2413static DEVICE_ATTR_RO(lpfc_enable_fip);
Tony Jonesee959b02008-02-22 00:13:36 +01002414static DEVICE_ATTR(board_mode, S_IRUGO | S_IWUSR,
2415 lpfc_board_mode_show, lpfc_board_mode_store);
2416static DEVICE_ATTR(issue_reset, S_IWUSR, NULL, lpfc_issue_reset);
2417static DEVICE_ATTR(max_vpi, S_IRUGO, lpfc_max_vpi_show, NULL);
2418static DEVICE_ATTR(used_vpi, S_IRUGO, lpfc_used_vpi_show, NULL);
2419static DEVICE_ATTR(max_rpi, S_IRUGO, lpfc_max_rpi_show, NULL);
2420static DEVICE_ATTR(used_rpi, S_IRUGO, lpfc_used_rpi_show, NULL);
2421static DEVICE_ATTR(max_xri, S_IRUGO, lpfc_max_xri_show, NULL);
2422static DEVICE_ATTR(used_xri, S_IRUGO, lpfc_used_xri_show, NULL);
2423static DEVICE_ATTR(npiv_info, S_IRUGO, lpfc_npiv_info_show, NULL);
Joe Perchesc828a892017-12-19 10:15:08 -08002424static DEVICE_ATTR_RO(lpfc_temp_sensor);
2425static DEVICE_ATTR_RO(lpfc_fips_level);
2426static DEVICE_ATTR_RO(lpfc_fips_rev);
2427static DEVICE_ATTR_RO(lpfc_dss);
2428static DEVICE_ATTR_RO(lpfc_sriov_hw_max_virtfn);
James Smart026abb82011-12-13 13:20:45 -05002429static DEVICE_ATTR(protocol, S_IRUGO, lpfc_sli4_protocol_show, NULL);
James Smart1ba981f2014-02-20 09:56:45 -05002430static DEVICE_ATTR(lpfc_xlane_supported, S_IRUGO, lpfc_oas_supported_show,
2431 NULL);
James Smartc3f28af2006-08-18 17:47:18 -04002432
James Smart352e5fd2016-12-30 06:57:47 -08002433static char *lpfc_soft_wwn_key = "C99G71SL8032A";
James Smart1ba981f2014-02-20 09:56:45 -05002434#define WWN_SZ 8
2435/**
2436 * lpfc_wwn_set - Convert string to the 8 byte WWN value.
2437 * @buf: WWN string.
2438 * @cnt: Length of string.
2439 * @wwn: Array to receive converted wwn value.
2440 *
2441 * Returns:
2442 * -EINVAL if the buffer does not contain a valid wwn
2443 * 0 success
2444 **/
2445static size_t
2446lpfc_wwn_set(const char *buf, size_t cnt, char wwn[])
2447{
2448 unsigned int i, j;
James Smartc3f28af2006-08-18 17:47:18 -04002449
James Smart1ba981f2014-02-20 09:56:45 -05002450 /* Count may include a LF at end of string */
2451 if (buf[cnt-1] == '\n')
2452 cnt--;
2453
2454 if ((cnt < 16) || (cnt > 18) || ((cnt == 17) && (*buf++ != 'x')) ||
2455 ((cnt == 18) && ((*buf++ != '0') || (*buf++ != 'x'))))
2456 return -EINVAL;
2457
2458 memset(wwn, 0, WWN_SZ);
2459
2460 /* Validate and store the new name */
2461 for (i = 0, j = 0; i < 16; i++) {
2462 if ((*buf >= 'a') && (*buf <= 'f'))
2463 j = ((j << 4) | ((*buf++ - 'a') + 10));
2464 else if ((*buf >= 'A') && (*buf <= 'F'))
2465 j = ((j << 4) | ((*buf++ - 'A') + 10));
2466 else if ((*buf >= '0') && (*buf <= '9'))
2467 j = ((j << 4) | (*buf++ - '0'));
2468 else
2469 return -EINVAL;
2470 if (i % 2) {
2471 wwn[i/2] = j & 0xff;
2472 j = 0;
2473 }
2474 }
2475 return 0;
2476}
James Smart352e5fd2016-12-30 06:57:47 -08002477/**
2478 * lpfc_soft_wwn_enable_store - Allows setting of the wwn if the key is valid
2479 * @dev: class device that is converted into a Scsi_host.
2480 * @attr: device attribute, not used.
2481 * @buf: containing the string lpfc_soft_wwn_key.
2482 * @count: must be size of lpfc_soft_wwn_key.
2483 *
2484 * Returns:
2485 * -EINVAL if the buffer does not contain lpfc_soft_wwn_key
2486 * length of buf indicates success
2487 **/
2488static ssize_t
2489lpfc_soft_wwn_enable_store(struct device *dev, struct device_attribute *attr,
2490 const char *buf, size_t count)
2491{
2492 struct Scsi_Host *shost = class_to_shost(dev);
2493 struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata;
2494 struct lpfc_hba *phba = vport->phba;
2495 unsigned int cnt = count;
James Smartaeb3c812017-04-21 16:05:02 -07002496 uint8_t vvvl = vport->fc_sparam.cmn.valid_vendor_ver_level;
2497 u32 *fawwpn_key = (uint32_t *)&vport->fc_sparam.un.vendorVersion[0];
James Smart352e5fd2016-12-30 06:57:47 -08002498
2499 /*
2500 * We're doing a simple sanity check for soft_wwpn setting.
2501 * We require that the user write a specific key to enable
2502 * the soft_wwpn attribute to be settable. Once the attribute
2503 * is written, the enable key resets. If further updates are
2504 * desired, the key must be written again to re-enable the
2505 * attribute.
2506 *
2507 * The "key" is not secret - it is a hardcoded string shown
2508 * here. The intent is to protect against the random user or
2509 * application that is just writing attributes.
2510 */
James Smartaeb3c812017-04-21 16:05:02 -07002511 if (vvvl == 1 && cpu_to_be32(*fawwpn_key) == FAPWWN_KEY_VENDOR) {
2512 lpfc_printf_log(phba, KERN_ERR, LOG_INIT,
2513 "0051 "LPFC_DRIVER_NAME" soft wwpn can not"
2514 " be enabled: fawwpn is enabled\n");
2515 return -EINVAL;
2516 }
James Smart352e5fd2016-12-30 06:57:47 -08002517
2518 /* count may include a LF at end of string */
2519 if (buf[cnt-1] == '\n')
2520 cnt--;
2521
2522 if ((cnt != strlen(lpfc_soft_wwn_key)) ||
2523 (strncmp(buf, lpfc_soft_wwn_key, strlen(lpfc_soft_wwn_key)) != 0))
2524 return -EINVAL;
2525
2526 phba->soft_wwn_enable = 1;
2527
2528 dev_printk(KERN_WARNING, &phba->pcidev->dev,
2529 "lpfc%d: soft_wwpn assignment has been enabled.\n",
2530 phba->brd_no);
2531 dev_printk(KERN_WARNING, &phba->pcidev->dev,
2532 " The soft_wwpn feature is not supported by Broadcom.");
2533
2534 return count;
2535}
Joe Perches6cbaefb2017-12-19 10:15:09 -08002536static DEVICE_ATTR_WO(lpfc_soft_wwn_enable);
James Smart352e5fd2016-12-30 06:57:47 -08002537
2538/**
2539 * lpfc_soft_wwpn_show - Return the cfg soft ww port name of the adapter
2540 * @dev: class device that is converted into a Scsi_host.
2541 * @attr: device attribute, not used.
2542 * @buf: on return contains the wwpn in hexadecimal.
2543 *
2544 * Returns: size of formatted string.
2545 **/
2546static ssize_t
2547lpfc_soft_wwpn_show(struct device *dev, struct device_attribute *attr,
2548 char *buf)
2549{
2550 struct Scsi_Host *shost = class_to_shost(dev);
2551 struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata;
2552 struct lpfc_hba *phba = vport->phba;
2553
2554 return snprintf(buf, PAGE_SIZE, "0x%llx\n",
2555 (unsigned long long)phba->cfg_soft_wwpn);
2556}
2557
2558/**
2559 * lpfc_soft_wwpn_store - Set the ww port name of the adapter
2560 * @dev class device that is converted into a Scsi_host.
2561 * @attr: device attribute, not used.
2562 * @buf: contains the wwpn in hexadecimal.
2563 * @count: number of wwpn bytes in buf
2564 *
2565 * Returns:
2566 * -EACCES hba reset not enabled, adapter over temp
2567 * -EINVAL soft wwn not enabled, count is invalid, invalid wwpn byte invalid
2568 * -EIO error taking adapter offline or online
2569 * value of count on success
2570 **/
2571static ssize_t
2572lpfc_soft_wwpn_store(struct device *dev, struct device_attribute *attr,
2573 const char *buf, size_t count)
2574{
2575 struct Scsi_Host *shost = class_to_shost(dev);
2576 struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata;
2577 struct lpfc_hba *phba = vport->phba;
2578 struct completion online_compl;
2579 int stat1 = 0, stat2 = 0;
2580 unsigned int cnt = count;
2581 u8 wwpn[WWN_SZ];
2582 int rc;
2583
2584 if (!phba->cfg_enable_hba_reset)
2585 return -EACCES;
2586 spin_lock_irq(&phba->hbalock);
2587 if (phba->over_temp_state == HBA_OVER_TEMP) {
2588 spin_unlock_irq(&phba->hbalock);
2589 return -EACCES;
2590 }
2591 spin_unlock_irq(&phba->hbalock);
2592 /* count may include a LF at end of string */
2593 if (buf[cnt-1] == '\n')
2594 cnt--;
2595
2596 if (!phba->soft_wwn_enable)
2597 return -EINVAL;
2598
2599 /* lock setting wwpn, wwnn down */
2600 phba->soft_wwn_enable = 0;
2601
2602 rc = lpfc_wwn_set(buf, cnt, wwpn);
James Smarte2934ed2017-01-17 12:31:56 -08002603 if (rc) {
James Smart352e5fd2016-12-30 06:57:47 -08002604 /* not able to set wwpn, unlock it */
2605 phba->soft_wwn_enable = 1;
2606 return rc;
2607 }
2608
2609 phba->cfg_soft_wwpn = wwn_to_u64(wwpn);
2610 fc_host_port_name(shost) = phba->cfg_soft_wwpn;
2611 if (phba->cfg_soft_wwnn)
2612 fc_host_node_name(shost) = phba->cfg_soft_wwnn;
2613
2614 dev_printk(KERN_NOTICE, &phba->pcidev->dev,
2615 "lpfc%d: Reinitializing to use soft_wwpn\n", phba->brd_no);
2616
2617 stat1 = lpfc_do_offline(phba, LPFC_EVT_OFFLINE);
2618 if (stat1)
2619 lpfc_printf_log(phba, KERN_ERR, LOG_INIT,
2620 "0463 lpfc_soft_wwpn attribute set failed to "
2621 "reinit adapter - %d\n", stat1);
2622 init_completion(&online_compl);
2623 rc = lpfc_workq_post_event(phba, &stat2, &online_compl,
2624 LPFC_EVT_ONLINE);
2625 if (rc == 0)
2626 return -ENOMEM;
2627
2628 wait_for_completion(&online_compl);
2629 if (stat2)
2630 lpfc_printf_log(phba, KERN_ERR, LOG_INIT,
2631 "0464 lpfc_soft_wwpn attribute set failed to "
2632 "reinit adapter - %d\n", stat2);
2633 return (stat1 || stat2) ? -EIO : count;
2634}
Joe Perchesb6b996b2017-12-19 10:15:07 -08002635static DEVICE_ATTR_RW(lpfc_soft_wwpn);
James Smart352e5fd2016-12-30 06:57:47 -08002636
2637/**
2638 * lpfc_soft_wwnn_show - Return the cfg soft ww node name for the adapter
2639 * @dev: class device that is converted into a Scsi_host.
2640 * @attr: device attribute, not used.
2641 * @buf: on return contains the wwnn in hexadecimal.
2642 *
2643 * Returns: size of formatted string.
2644 **/
2645static ssize_t
2646lpfc_soft_wwnn_show(struct device *dev, struct device_attribute *attr,
2647 char *buf)
2648{
2649 struct Scsi_Host *shost = class_to_shost(dev);
2650 struct lpfc_hba *phba = ((struct lpfc_vport *)shost->hostdata)->phba;
2651 return snprintf(buf, PAGE_SIZE, "0x%llx\n",
2652 (unsigned long long)phba->cfg_soft_wwnn);
2653}
2654
2655/**
2656 * lpfc_soft_wwnn_store - sets the ww node name of the adapter
2657 * @cdev: class device that is converted into a Scsi_host.
2658 * @buf: contains the ww node name in hexadecimal.
2659 * @count: number of wwnn bytes in buf.
2660 *
2661 * Returns:
2662 * -EINVAL soft wwn not enabled, count is invalid, invalid wwnn byte invalid
2663 * value of count on success
2664 **/
2665static ssize_t
2666lpfc_soft_wwnn_store(struct device *dev, struct device_attribute *attr,
2667 const char *buf, size_t count)
2668{
2669 struct Scsi_Host *shost = class_to_shost(dev);
2670 struct lpfc_hba *phba = ((struct lpfc_vport *)shost->hostdata)->phba;
2671 unsigned int cnt = count;
2672 u8 wwnn[WWN_SZ];
2673 int rc;
2674
2675 /* count may include a LF at end of string */
2676 if (buf[cnt-1] == '\n')
2677 cnt--;
2678
2679 if (!phba->soft_wwn_enable)
2680 return -EINVAL;
2681
2682 rc = lpfc_wwn_set(buf, cnt, wwnn);
James Smarte2934ed2017-01-17 12:31:56 -08002683 if (rc) {
James Smart352e5fd2016-12-30 06:57:47 -08002684 /* Allow wwnn to be set many times, as long as the enable
2685 * is set. However, once the wwpn is set, everything locks.
2686 */
2687 return rc;
2688 }
2689
2690 phba->cfg_soft_wwnn = wwn_to_u64(wwnn);
2691
2692 dev_printk(KERN_NOTICE, &phba->pcidev->dev,
2693 "lpfc%d: soft_wwnn set. Value will take effect upon "
2694 "setting of the soft_wwpn\n", phba->brd_no);
2695
2696 return count;
2697}
Joe Perchesb6b996b2017-12-19 10:15:07 -08002698static DEVICE_ATTR_RW(lpfc_soft_wwnn);
James Smarta12e07b2006-12-02 13:35:30 -05002699
James Smart1ba981f2014-02-20 09:56:45 -05002700/**
2701 * lpfc_oas_tgt_show - Return wwpn of target whose luns maybe enabled for
2702 * Optimized Access Storage (OAS) operations.
2703 * @dev: class device that is converted into a Scsi_host.
2704 * @attr: device attribute, not used.
2705 * @buf: buffer for passing information.
2706 *
2707 * Returns:
2708 * value of count
2709 **/
2710static ssize_t
2711lpfc_oas_tgt_show(struct device *dev, struct device_attribute *attr,
2712 char *buf)
2713{
2714 struct Scsi_Host *shost = class_to_shost(dev);
2715 struct lpfc_hba *phba = ((struct lpfc_vport *)shost->hostdata)->phba;
2716
2717 return snprintf(buf, PAGE_SIZE, "0x%llx\n",
2718 wwn_to_u64(phba->cfg_oas_tgt_wwpn));
2719}
2720
2721/**
2722 * lpfc_oas_tgt_store - Store wwpn of target whose luns maybe enabled for
2723 * Optimized Access Storage (OAS) operations.
2724 * @dev: class device that is converted into a Scsi_host.
2725 * @attr: device attribute, not used.
2726 * @buf: buffer for passing information.
2727 * @count: Size of the data buffer.
2728 *
2729 * Returns:
2730 * -EINVAL count is invalid, invalid wwpn byte invalid
2731 * -EPERM oas is not supported by hba
2732 * value of count on success
2733 **/
2734static ssize_t
2735lpfc_oas_tgt_store(struct device *dev, struct device_attribute *attr,
2736 const char *buf, size_t count)
2737{
2738 struct Scsi_Host *shost = class_to_shost(dev);
2739 struct lpfc_hba *phba = ((struct lpfc_vport *)shost->hostdata)->phba;
2740 unsigned int cnt = count;
2741 uint8_t wwpn[WWN_SZ];
2742 int rc;
2743
James Smartf38fa0b2014-04-04 13:52:21 -04002744 if (!phba->cfg_fof)
James Smart1ba981f2014-02-20 09:56:45 -05002745 return -EPERM;
2746
2747 /* count may include a LF at end of string */
2748 if (buf[cnt-1] == '\n')
2749 cnt--;
2750
2751 rc = lpfc_wwn_set(buf, cnt, wwpn);
2752 if (rc)
2753 return rc;
2754
2755 memcpy(phba->cfg_oas_tgt_wwpn, wwpn, (8 * sizeof(uint8_t)));
2756 memcpy(phba->sli4_hba.oas_next_tgt_wwpn, wwpn, (8 * sizeof(uint8_t)));
2757 if (wwn_to_u64(wwpn) == 0)
2758 phba->cfg_oas_flags |= OAS_FIND_ANY_TARGET;
2759 else
2760 phba->cfg_oas_flags &= ~OAS_FIND_ANY_TARGET;
2761 phba->cfg_oas_flags &= ~OAS_LUN_VALID;
2762 phba->sli4_hba.oas_next_lun = FIND_FIRST_OAS_LUN;
2763 return count;
2764}
2765static DEVICE_ATTR(lpfc_xlane_tgt, S_IRUGO | S_IWUSR,
2766 lpfc_oas_tgt_show, lpfc_oas_tgt_store);
2767
2768/**
James Smartc92c8412016-07-06 12:36:05 -07002769 * lpfc_oas_priority_show - Return wwpn of target whose luns maybe enabled for
2770 * Optimized Access Storage (OAS) operations.
2771 * @dev: class device that is converted into a Scsi_host.
2772 * @attr: device attribute, not used.
2773 * @buf: buffer for passing information.
2774 *
2775 * Returns:
2776 * value of count
2777 **/
2778static ssize_t
2779lpfc_oas_priority_show(struct device *dev, struct device_attribute *attr,
2780 char *buf)
2781{
2782 struct Scsi_Host *shost = class_to_shost(dev);
2783 struct lpfc_hba *phba = ((struct lpfc_vport *)shost->hostdata)->phba;
2784
2785 return snprintf(buf, PAGE_SIZE, "%d\n", phba->cfg_oas_priority);
2786}
2787
2788/**
2789 * lpfc_oas_priority_store - Store wwpn of target whose luns maybe enabled for
2790 * Optimized Access Storage (OAS) operations.
2791 * @dev: class device that is converted into a Scsi_host.
2792 * @attr: device attribute, not used.
2793 * @buf: buffer for passing information.
2794 * @count: Size of the data buffer.
2795 *
2796 * Returns:
2797 * -EINVAL count is invalid, invalid wwpn byte invalid
2798 * -EPERM oas is not supported by hba
2799 * value of count on success
2800 **/
2801static ssize_t
2802lpfc_oas_priority_store(struct device *dev, struct device_attribute *attr,
2803 const char *buf, size_t count)
2804{
2805 struct Scsi_Host *shost = class_to_shost(dev);
2806 struct lpfc_hba *phba = ((struct lpfc_vport *)shost->hostdata)->phba;
2807 unsigned int cnt = count;
2808 unsigned long val;
2809 int ret;
2810
2811 if (!phba->cfg_fof)
2812 return -EPERM;
2813
2814 /* count may include a LF at end of string */
2815 if (buf[cnt-1] == '\n')
2816 cnt--;
2817
2818 ret = kstrtoul(buf, 0, &val);
2819 if (ret || (val > 0x7f))
2820 return -EINVAL;
2821
2822 if (val)
2823 phba->cfg_oas_priority = (uint8_t)val;
2824 else
2825 phba->cfg_oas_priority = phba->cfg_XLanePriority;
2826 return count;
2827}
2828static DEVICE_ATTR(lpfc_xlane_priority, S_IRUGO | S_IWUSR,
2829 lpfc_oas_priority_show, lpfc_oas_priority_store);
2830
2831/**
James Smart1ba981f2014-02-20 09:56:45 -05002832 * lpfc_oas_vpt_show - Return wwpn of vport whose targets maybe enabled
2833 * for Optimized Access Storage (OAS) operations.
2834 * @dev: class device that is converted into a Scsi_host.
2835 * @attr: device attribute, not used.
2836 * @buf: buffer for passing information.
2837 *
2838 * Returns:
2839 * value of count on success
2840 **/
2841static ssize_t
2842lpfc_oas_vpt_show(struct device *dev, struct device_attribute *attr,
2843 char *buf)
2844{
2845 struct Scsi_Host *shost = class_to_shost(dev);
2846 struct lpfc_hba *phba = ((struct lpfc_vport *)shost->hostdata)->phba;
2847
2848 return snprintf(buf, PAGE_SIZE, "0x%llx\n",
2849 wwn_to_u64(phba->cfg_oas_vpt_wwpn));
2850}
2851
2852/**
2853 * lpfc_oas_vpt_store - Store wwpn of vport whose targets maybe enabled
2854 * for Optimized Access Storage (OAS) operations.
2855 * @dev: class device that is converted into a Scsi_host.
2856 * @attr: device attribute, not used.
2857 * @buf: buffer for passing information.
2858 * @count: Size of the data buffer.
2859 *
2860 * Returns:
2861 * -EINVAL count is invalid, invalid wwpn byte invalid
2862 * -EPERM oas is not supported by hba
2863 * value of count on success
2864 **/
2865static ssize_t
2866lpfc_oas_vpt_store(struct device *dev, struct device_attribute *attr,
2867 const char *buf, size_t count)
2868{
2869 struct Scsi_Host *shost = class_to_shost(dev);
2870 struct lpfc_hba *phba = ((struct lpfc_vport *)shost->hostdata)->phba;
2871 unsigned int cnt = count;
2872 uint8_t wwpn[WWN_SZ];
2873 int rc;
2874
James Smartf38fa0b2014-04-04 13:52:21 -04002875 if (!phba->cfg_fof)
James Smart1ba981f2014-02-20 09:56:45 -05002876 return -EPERM;
2877
2878 /* count may include a LF at end of string */
2879 if (buf[cnt-1] == '\n')
2880 cnt--;
2881
2882 rc = lpfc_wwn_set(buf, cnt, wwpn);
2883 if (rc)
2884 return rc;
2885
2886 memcpy(phba->cfg_oas_vpt_wwpn, wwpn, (8 * sizeof(uint8_t)));
2887 memcpy(phba->sli4_hba.oas_next_vpt_wwpn, wwpn, (8 * sizeof(uint8_t)));
2888 if (wwn_to_u64(wwpn) == 0)
2889 phba->cfg_oas_flags |= OAS_FIND_ANY_VPORT;
2890 else
2891 phba->cfg_oas_flags &= ~OAS_FIND_ANY_VPORT;
2892 phba->cfg_oas_flags &= ~OAS_LUN_VALID;
James Smartb5749fe2016-12-19 15:07:26 -08002893 if (phba->cfg_oas_priority == 0)
2894 phba->cfg_oas_priority = phba->cfg_XLanePriority;
James Smart1ba981f2014-02-20 09:56:45 -05002895 phba->sli4_hba.oas_next_lun = FIND_FIRST_OAS_LUN;
2896 return count;
2897}
2898static DEVICE_ATTR(lpfc_xlane_vpt, S_IRUGO | S_IWUSR,
2899 lpfc_oas_vpt_show, lpfc_oas_vpt_store);
2900
2901/**
2902 * lpfc_oas_lun_state_show - Return the current state (enabled or disabled)
2903 * of whether luns will be enabled or disabled
2904 * for Optimized Access Storage (OAS) operations.
2905 * @dev: class device that is converted into a Scsi_host.
2906 * @attr: device attribute, not used.
2907 * @buf: buffer for passing information.
2908 *
2909 * Returns:
2910 * size of formatted string.
2911 **/
2912static ssize_t
2913lpfc_oas_lun_state_show(struct device *dev, struct device_attribute *attr,
2914 char *buf)
2915{
2916 struct Scsi_Host *shost = class_to_shost(dev);
2917 struct lpfc_hba *phba = ((struct lpfc_vport *)shost->hostdata)->phba;
2918
2919 return snprintf(buf, PAGE_SIZE, "%d\n", phba->cfg_oas_lun_state);
2920}
2921
2922/**
2923 * lpfc_oas_lun_state_store - Store the state (enabled or disabled)
2924 * of whether luns will be enabled or disabled
2925 * for Optimized Access Storage (OAS) operations.
2926 * @dev: class device that is converted into a Scsi_host.
2927 * @attr: device attribute, not used.
2928 * @buf: buffer for passing information.
2929 * @count: Size of the data buffer.
2930 *
2931 * Returns:
2932 * -EINVAL count is invalid, invalid wwpn byte invalid
2933 * -EPERM oas is not supported by hba
2934 * value of count on success
2935 **/
2936static ssize_t
2937lpfc_oas_lun_state_store(struct device *dev, struct device_attribute *attr,
2938 const char *buf, size_t count)
2939{
2940 struct Scsi_Host *shost = class_to_shost(dev);
2941 struct lpfc_hba *phba = ((struct lpfc_vport *)shost->hostdata)->phba;
2942 int val = 0;
2943
James Smartf38fa0b2014-04-04 13:52:21 -04002944 if (!phba->cfg_fof)
James Smart1ba981f2014-02-20 09:56:45 -05002945 return -EPERM;
2946
2947 if (!isdigit(buf[0]))
2948 return -EINVAL;
2949
2950 if (sscanf(buf, "%i", &val) != 1)
2951 return -EINVAL;
2952
2953 if ((val != 0) && (val != 1))
2954 return -EINVAL;
2955
2956 phba->cfg_oas_lun_state = val;
James Smart1ba981f2014-02-20 09:56:45 -05002957 return strlen(buf);
2958}
2959static DEVICE_ATTR(lpfc_xlane_lun_state, S_IRUGO | S_IWUSR,
2960 lpfc_oas_lun_state_show, lpfc_oas_lun_state_store);
2961
2962/**
2963 * lpfc_oas_lun_status_show - Return the status of the Optimized Access
2964 * Storage (OAS) lun returned by the
2965 * lpfc_oas_lun_show function.
2966 * @dev: class device that is converted into a Scsi_host.
2967 * @attr: device attribute, not used.
2968 * @buf: buffer for passing information.
2969 *
2970 * Returns:
2971 * size of formatted string.
2972 **/
2973static ssize_t
2974lpfc_oas_lun_status_show(struct device *dev, struct device_attribute *attr,
2975 char *buf)
2976{
2977 struct Scsi_Host *shost = class_to_shost(dev);
2978 struct lpfc_hba *phba = ((struct lpfc_vport *)shost->hostdata)->phba;
2979
2980 if (!(phba->cfg_oas_flags & OAS_LUN_VALID))
2981 return -EFAULT;
2982
2983 return snprintf(buf, PAGE_SIZE, "%d\n", phba->cfg_oas_lun_status);
2984}
2985static DEVICE_ATTR(lpfc_xlane_lun_status, S_IRUGO,
2986 lpfc_oas_lun_status_show, NULL);
2987
2988
2989/**
2990 * lpfc_oas_lun_state_set - enable or disable a lun for Optimized Access Storage
2991 * (OAS) operations.
2992 * @phba: lpfc_hba pointer.
2993 * @ndlp: pointer to fcp target node.
2994 * @lun: the fc lun for setting oas state.
2995 * @oas_state: the oas state to be set to the lun.
2996 *
2997 * Returns:
2998 * SUCCESS : 0
2999 * -EPERM OAS is not enabled or not supported by this port.
3000 *
3001 */
3002static size_t
3003lpfc_oas_lun_state_set(struct lpfc_hba *phba, uint8_t vpt_wwpn[],
James Smartc92c8412016-07-06 12:36:05 -07003004 uint8_t tgt_wwpn[], uint64_t lun,
3005 uint32_t oas_state, uint8_t pri)
James Smart1ba981f2014-02-20 09:56:45 -05003006{
3007
3008 int rc = 0;
3009
James Smartf38fa0b2014-04-04 13:52:21 -04003010 if (!phba->cfg_fof)
James Smart1ba981f2014-02-20 09:56:45 -05003011 return -EPERM;
3012
3013 if (oas_state) {
3014 if (!lpfc_enable_oas_lun(phba, (struct lpfc_name *)vpt_wwpn,
James Smartc92c8412016-07-06 12:36:05 -07003015 (struct lpfc_name *)tgt_wwpn,
3016 lun, pri))
James Smart1ba981f2014-02-20 09:56:45 -05003017 rc = -ENOMEM;
3018 } else {
3019 lpfc_disable_oas_lun(phba, (struct lpfc_name *)vpt_wwpn,
James Smartb5749fe2016-12-19 15:07:26 -08003020 (struct lpfc_name *)tgt_wwpn, lun, pri);
James Smart1ba981f2014-02-20 09:56:45 -05003021 }
3022 return rc;
3023
3024}
3025
3026/**
3027 * lpfc_oas_lun_get_next - get the next lun that has been enabled for Optimized
3028 * Access Storage (OAS) operations.
3029 * @phba: lpfc_hba pointer.
3030 * @vpt_wwpn: wwpn of the vport associated with the returned lun
3031 * @tgt_wwpn: wwpn of the target associated with the returned lun
3032 * @lun_status: status of the lun returned lun
3033 *
3034 * Returns the first or next lun enabled for OAS operations for the vport/target
3035 * specified. If a lun is found, its vport wwpn, target wwpn and status is
3036 * returned. If the lun is not found, NOT_OAS_ENABLED_LUN is returned.
3037 *
3038 * Return:
3039 * lun that is OAS enabled for the vport/target
3040 * NOT_OAS_ENABLED_LUN when no oas enabled lun found.
3041 */
3042static uint64_t
3043lpfc_oas_lun_get_next(struct lpfc_hba *phba, uint8_t vpt_wwpn[],
James Smartb5749fe2016-12-19 15:07:26 -08003044 uint8_t tgt_wwpn[], uint32_t *lun_status,
3045 uint32_t *lun_pri)
James Smart1ba981f2014-02-20 09:56:45 -05003046{
3047 uint64_t found_lun;
3048
3049 if (unlikely(!phba) || !vpt_wwpn || !tgt_wwpn)
3050 return NOT_OAS_ENABLED_LUN;
3051 if (lpfc_find_next_oas_lun(phba, (struct lpfc_name *)
3052 phba->sli4_hba.oas_next_vpt_wwpn,
3053 (struct lpfc_name *)
3054 phba->sli4_hba.oas_next_tgt_wwpn,
3055 &phba->sli4_hba.oas_next_lun,
3056 (struct lpfc_name *)vpt_wwpn,
3057 (struct lpfc_name *)tgt_wwpn,
James Smartb5749fe2016-12-19 15:07:26 -08003058 &found_lun, lun_status, lun_pri))
James Smart1ba981f2014-02-20 09:56:45 -05003059 return found_lun;
3060 else
3061 return NOT_OAS_ENABLED_LUN;
3062}
3063
3064/**
3065 * lpfc_oas_lun_state_change - enable/disable a lun for OAS operations
3066 * @phba: lpfc_hba pointer.
3067 * @vpt_wwpn: vport wwpn by reference.
3068 * @tgt_wwpn: target wwpn by reference.
3069 * @lun: the fc lun for setting oas state.
3070 * @oas_state: the oas state to be set to the oas_lun.
3071 *
3072 * This routine enables (OAS_LUN_ENABLE) or disables (OAS_LUN_DISABLE)
3073 * a lun for OAS operations.
3074 *
3075 * Return:
3076 * SUCCESS: 0
3077 * -ENOMEM: failed to enable an lun for OAS operations
3078 * -EPERM: OAS is not enabled
3079 */
3080static ssize_t
3081lpfc_oas_lun_state_change(struct lpfc_hba *phba, uint8_t vpt_wwpn[],
3082 uint8_t tgt_wwpn[], uint64_t lun,
James Smartc92c8412016-07-06 12:36:05 -07003083 uint32_t oas_state, uint8_t pri)
James Smart1ba981f2014-02-20 09:56:45 -05003084{
3085
3086 int rc;
3087
3088 rc = lpfc_oas_lun_state_set(phba, vpt_wwpn, tgt_wwpn, lun,
James Smartc92c8412016-07-06 12:36:05 -07003089 oas_state, pri);
James Smart1ba981f2014-02-20 09:56:45 -05003090 return rc;
3091}
3092
3093/**
3094 * lpfc_oas_lun_show - Return oas enabled luns from a chosen target
3095 * @dev: class device that is converted into a Scsi_host.
3096 * @attr: device attribute, not used.
3097 * @buf: buffer for passing information.
3098 *
3099 * This routine returns a lun enabled for OAS each time the function
3100 * is called.
3101 *
3102 * Returns:
3103 * SUCCESS: size of formatted string.
3104 * -EFAULT: target or vport wwpn was not set properly.
3105 * -EPERM: oas is not enabled.
3106 **/
3107static ssize_t
3108lpfc_oas_lun_show(struct device *dev, struct device_attribute *attr,
3109 char *buf)
3110{
3111 struct Scsi_Host *shost = class_to_shost(dev);
3112 struct lpfc_hba *phba = ((struct lpfc_vport *)shost->hostdata)->phba;
3113
3114 uint64_t oas_lun;
3115 int len = 0;
3116
James Smartf38fa0b2014-04-04 13:52:21 -04003117 if (!phba->cfg_fof)
James Smart1ba981f2014-02-20 09:56:45 -05003118 return -EPERM;
3119
3120 if (wwn_to_u64(phba->cfg_oas_vpt_wwpn) == 0)
3121 if (!(phba->cfg_oas_flags & OAS_FIND_ANY_VPORT))
3122 return -EFAULT;
3123
3124 if (wwn_to_u64(phba->cfg_oas_tgt_wwpn) == 0)
3125 if (!(phba->cfg_oas_flags & OAS_FIND_ANY_TARGET))
3126 return -EFAULT;
3127
3128 oas_lun = lpfc_oas_lun_get_next(phba, phba->cfg_oas_vpt_wwpn,
3129 phba->cfg_oas_tgt_wwpn,
James Smartb5749fe2016-12-19 15:07:26 -08003130 &phba->cfg_oas_lun_status,
3131 &phba->cfg_oas_priority);
James Smart1ba981f2014-02-20 09:56:45 -05003132 if (oas_lun != NOT_OAS_ENABLED_LUN)
3133 phba->cfg_oas_flags |= OAS_LUN_VALID;
3134
3135 len += snprintf(buf + len, PAGE_SIZE-len, "0x%llx", oas_lun);
3136
3137 return len;
3138}
3139
3140/**
3141 * lpfc_oas_lun_store - Sets the OAS state for lun
3142 * @dev: class device that is converted into a Scsi_host.
3143 * @attr: device attribute, not used.
3144 * @buf: buffer for passing information.
3145 *
3146 * This function sets the OAS state for lun. Before this function is called,
3147 * the vport wwpn, target wwpn, and oas state need to be set.
3148 *
3149 * Returns:
3150 * SUCCESS: size of formatted string.
3151 * -EFAULT: target or vport wwpn was not set properly.
3152 * -EPERM: oas is not enabled.
3153 * size of formatted string.
3154 **/
3155static ssize_t
3156lpfc_oas_lun_store(struct device *dev, struct device_attribute *attr,
3157 const char *buf, size_t count)
3158{
3159 struct Scsi_Host *shost = class_to_shost(dev);
3160 struct lpfc_hba *phba = ((struct lpfc_vport *)shost->hostdata)->phba;
3161 uint64_t scsi_lun;
James Smartb5749fe2016-12-19 15:07:26 -08003162 uint32_t pri;
James Smart1ba981f2014-02-20 09:56:45 -05003163 ssize_t rc;
3164
James Smartf38fa0b2014-04-04 13:52:21 -04003165 if (!phba->cfg_fof)
James Smart1ba981f2014-02-20 09:56:45 -05003166 return -EPERM;
3167
3168 if (wwn_to_u64(phba->cfg_oas_vpt_wwpn) == 0)
3169 return -EFAULT;
3170
3171 if (wwn_to_u64(phba->cfg_oas_tgt_wwpn) == 0)
3172 return -EFAULT;
3173
3174 if (!isdigit(buf[0]))
3175 return -EINVAL;
3176
3177 if (sscanf(buf, "0x%llx", &scsi_lun) != 1)
3178 return -EINVAL;
3179
James Smartb5749fe2016-12-19 15:07:26 -08003180 pri = phba->cfg_oas_priority;
3181 if (pri == 0)
3182 pri = phba->cfg_XLanePriority;
3183
James Smart1ba981f2014-02-20 09:56:45 -05003184 lpfc_printf_log(phba, KERN_INFO, LOG_INIT,
James Smartc92c8412016-07-06 12:36:05 -07003185 "3372 Try to set vport 0x%llx target 0x%llx lun:0x%llx "
3186 "priority 0x%x with oas state %d\n",
James Smart1ba981f2014-02-20 09:56:45 -05003187 wwn_to_u64(phba->cfg_oas_vpt_wwpn),
3188 wwn_to_u64(phba->cfg_oas_tgt_wwpn), scsi_lun,
James Smartb5749fe2016-12-19 15:07:26 -08003189 pri, phba->cfg_oas_lun_state);
James Smart1ba981f2014-02-20 09:56:45 -05003190
3191 rc = lpfc_oas_lun_state_change(phba, phba->cfg_oas_vpt_wwpn,
James Smartc92c8412016-07-06 12:36:05 -07003192 phba->cfg_oas_tgt_wwpn, scsi_lun,
James Smartb5749fe2016-12-19 15:07:26 -08003193 phba->cfg_oas_lun_state, pri);
James Smart1ba981f2014-02-20 09:56:45 -05003194 if (rc)
3195 return rc;
3196
3197 return count;
3198}
3199static DEVICE_ATTR(lpfc_xlane_lun, S_IRUGO | S_IWUSR,
3200 lpfc_oas_lun_show, lpfc_oas_lun_store);
James Smartc3f28af2006-08-18 17:47:18 -04003201
James Smartf358dd02017-02-12 13:52:34 -08003202int lpfc_enable_nvmet_cnt;
3203unsigned long long lpfc_enable_nvmet[LPFC_NVMET_MAX_PORTS] = {
3204 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
3205 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
3206module_param_array(lpfc_enable_nvmet, ullong, &lpfc_enable_nvmet_cnt, 0444);
3207MODULE_PARM_DESC(lpfc_enable_nvmet, "Enable HBA port(s) WWPN as a NVME Target");
3208
James.Smart@Emulex.Com875fbdf2005-11-29 16:32:13 -05003209static int lpfc_poll = 0;
James Smartab56dc22011-02-16 12:39:57 -05003210module_param(lpfc_poll, int, S_IRUGO);
James.Smart@Emulex.Com875fbdf2005-11-29 16:32:13 -05003211MODULE_PARM_DESC(lpfc_poll, "FCP ring polling mode control:"
3212 " 0 - none,"
3213 " 1 - poll with interrupts enabled"
3214 " 3 - poll and disable FCP ring interrupts");
3215
Joe Perchesb6b996b2017-12-19 10:15:07 -08003216static DEVICE_ATTR_RW(lpfc_poll);
dea31012005-04-17 16:05:31 -05003217
James Smart96418b52017-03-04 09:30:31 -08003218int lpfc_no_hba_reset_cnt;
3219unsigned long lpfc_no_hba_reset[MAX_HBAS_NO_RESET] = {
3220 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
3221module_param_array(lpfc_no_hba_reset, ulong, &lpfc_no_hba_reset_cnt, 0444);
3222MODULE_PARM_DESC(lpfc_no_hba_reset, "WWPN of HBAs that should not be reset");
3223
James Smart12247e82016-07-06 12:36:09 -07003224LPFC_ATTR(sli_mode, 0, 0, 3,
3225 "SLI mode selector:"
3226 " 0 - auto (SLI-3 if supported),"
3227 " 2 - select SLI-2 even on SLI-3 capable HBAs,"
3228 " 3 - select SLI-3");
James Smart92d7f7b2007-06-17 19:56:38 -05003229
James Smart458c0832016-07-06 12:36:07 -07003230LPFC_ATTR_R(enable_npiv, 1, 0, 1,
3231 "Enable NPIV functionality");
James Smart92d7f7b2007-06-17 19:56:38 -05003232
James Smart7d791df2011-07-22 18:37:52 -04003233LPFC_ATTR_R(fcf_failover_policy, 1, 1, 2,
3234 "FCF Fast failover=1 Priority failover=2");
3235
James Smarte5771b42013-03-01 16:37:14 -05003236/*
3237# lpfc_enable_rrq: Track XRI/OXID reuse after IO failures
3238# 0x0 = disabled, XRI/OXID use not tracked.
3239# 0x1 = XRI/OXID reuse is timed with ratov, RRQ sent.
3240# 0x2 = XRI/OXID reuse is timed with ratov, No RRQ sent.
3241*/
James Smart31202b02016-10-13 15:06:08 -07003242LPFC_ATTR_R(enable_rrq, 2, 0, 2,
3243 "Enable RRQ functionality");
James Smart19ca7602010-11-20 23:11:55 -05003244
dea31012005-04-17 16:05:31 -05003245/*
James Smart84d1b002010-02-12 14:42:33 -05003246# lpfc_suppress_link_up: Bring link up at initialization
3247# 0x0 = bring link up (issue MBX_INIT_LINK)
3248# 0x1 = do NOT bring link up at initialization(MBX_INIT_LINK)
3249# 0x2 = never bring up link
3250# Default value is 0.
3251*/
James Smarte40a02c2010-02-26 14:13:54 -05003252LPFC_ATTR_R(suppress_link_up, LPFC_INITIALIZE_LINK, LPFC_INITIALIZE_LINK,
3253 LPFC_DELAY_INIT_LINK_INDEFINITELY,
3254 "Suppress Link Up at initialization");
James Smart2a9bf3d2010-06-07 15:24:45 -04003255/*
3256# lpfc_cnt: Number of IOCBs allocated for ELS, CT, and ABTS
3257# 1 - (1024)
3258# 2 - (2048)
3259# 3 - (3072)
3260# 4 - (4096)
3261# 5 - (5120)
3262*/
3263static ssize_t
3264lpfc_iocb_hw_show(struct device *dev, struct device_attribute *attr, char *buf)
3265{
3266 struct Scsi_Host *shost = class_to_shost(dev);
3267 struct lpfc_hba *phba = ((struct lpfc_vport *) shost->hostdata)->phba;
3268
3269 return snprintf(buf, PAGE_SIZE, "%d\n", phba->iocb_max);
3270}
3271
3272static DEVICE_ATTR(iocb_hw, S_IRUGO,
3273 lpfc_iocb_hw_show, NULL);
3274static ssize_t
3275lpfc_txq_hw_show(struct device *dev, struct device_attribute *attr, char *buf)
3276{
3277 struct Scsi_Host *shost = class_to_shost(dev);
3278 struct lpfc_hba *phba = ((struct lpfc_vport *) shost->hostdata)->phba;
James Smart895427b2017-02-12 13:52:30 -08003279 struct lpfc_sli_ring *pring = lpfc_phba_elsring(phba);
James Smart2a9bf3d2010-06-07 15:24:45 -04003280
Dick Kennedy1234a6d2017-09-29 17:34:29 -07003281 return snprintf(buf, PAGE_SIZE, "%d\n",
3282 pring ? pring->txq_max : 0);
James Smart2a9bf3d2010-06-07 15:24:45 -04003283}
3284
3285static DEVICE_ATTR(txq_hw, S_IRUGO,
3286 lpfc_txq_hw_show, NULL);
3287static ssize_t
3288lpfc_txcmplq_hw_show(struct device *dev, struct device_attribute *attr,
3289 char *buf)
3290{
3291 struct Scsi_Host *shost = class_to_shost(dev);
3292 struct lpfc_hba *phba = ((struct lpfc_vport *) shost->hostdata)->phba;
James Smart895427b2017-02-12 13:52:30 -08003293 struct lpfc_sli_ring *pring = lpfc_phba_elsring(phba);
James Smart2a9bf3d2010-06-07 15:24:45 -04003294
Dick Kennedy1234a6d2017-09-29 17:34:29 -07003295 return snprintf(buf, PAGE_SIZE, "%d\n",
3296 pring ? pring->txcmplq_max : 0);
James Smart2a9bf3d2010-06-07 15:24:45 -04003297}
3298
3299static DEVICE_ATTR(txcmplq_hw, S_IRUGO,
3300 lpfc_txcmplq_hw_show, NULL);
3301
James Smart0d8c8ba2016-10-13 15:06:07 -07003302LPFC_ATTR_R(iocb_cnt, 2, 1, 5,
James Smart2a9bf3d2010-06-07 15:24:45 -04003303 "Number of IOCBs alloc for ELS, CT, and ABTS: 1k to 5k IOCBs");
James Smart84d1b002010-02-12 14:42:33 -05003304
3305/*
James Smartc01f3202006-08-18 17:47:08 -04003306# lpfc_nodev_tmo: If set, it will hold all I/O errors on devices that disappear
3307# until the timer expires. Value range is [0,255]. Default value is 30.
3308*/
3309static int lpfc_nodev_tmo = LPFC_DEF_DEVLOSS_TMO;
3310static int lpfc_devloss_tmo = LPFC_DEF_DEVLOSS_TMO;
3311module_param(lpfc_nodev_tmo, int, 0);
3312MODULE_PARM_DESC(lpfc_nodev_tmo,
3313 "Seconds driver will hold I/O waiting "
3314 "for a device to come back");
James Smarte59058c2008-08-24 21:49:00 -04003315
3316/**
James Smart3621a712009-04-06 18:47:14 -04003317 * lpfc_nodev_tmo_show - Return the hba dev loss timeout value
James Smarte59058c2008-08-24 21:49:00 -04003318 * @dev: class converted to a Scsi_host structure.
3319 * @attr: device attribute, not used.
3320 * @buf: on return contains the dev loss timeout in decimal.
3321 *
3322 * Returns: size of formatted string.
3323 **/
James Smartc01f3202006-08-18 17:47:08 -04003324static ssize_t
Tony Jonesee959b02008-02-22 00:13:36 +01003325lpfc_nodev_tmo_show(struct device *dev, struct device_attribute *attr,
3326 char *buf)
James Smartc01f3202006-08-18 17:47:08 -04003327{
Tony Jonesee959b02008-02-22 00:13:36 +01003328 struct Scsi_Host *shost = class_to_shost(dev);
James Smart2e0fef82007-06-17 19:56:36 -05003329 struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata;
James Smarte40a02c2010-02-26 14:13:54 -05003330
James Smart3de2a652007-08-02 11:09:59 -04003331 return snprintf(buf, PAGE_SIZE, "%d\n", vport->cfg_devloss_tmo);
James Smartc01f3202006-08-18 17:47:08 -04003332}
3333
James Smarte59058c2008-08-24 21:49:00 -04003334/**
James Smart3621a712009-04-06 18:47:14 -04003335 * lpfc_nodev_tmo_init - Set the hba nodev timeout value
James Smarte59058c2008-08-24 21:49:00 -04003336 * @vport: lpfc vport structure pointer.
3337 * @val: contains the nodev timeout value.
3338 *
3339 * Description:
3340 * If the devloss tmo is already set then nodev tmo is set to devloss tmo,
3341 * a kernel error message is printed and zero is returned.
3342 * Else if val is in range then nodev tmo and devloss tmo are set to val.
3343 * Otherwise nodev tmo is set to the default value.
3344 *
3345 * Returns:
3346 * zero if already set or if val is in range
3347 * -EINVAL val out of range
3348 **/
James Smartc01f3202006-08-18 17:47:08 -04003349static int
James Smart3de2a652007-08-02 11:09:59 -04003350lpfc_nodev_tmo_init(struct lpfc_vport *vport, int val)
James Smartc01f3202006-08-18 17:47:08 -04003351{
James Smart3de2a652007-08-02 11:09:59 -04003352 if (vport->cfg_devloss_tmo != LPFC_DEF_DEVLOSS_TMO) {
3353 vport->cfg_nodev_tmo = vport->cfg_devloss_tmo;
3354 if (val != LPFC_DEF_DEVLOSS_TMO)
James Smarte8b62012007-08-02 11:10:09 -04003355 lpfc_printf_vlog(vport, KERN_ERR, LOG_INIT,
James Smart6c860682016-10-13 15:06:13 -07003356 "0407 Ignoring lpfc_nodev_tmo module "
3357 "parameter because lpfc_devloss_tmo "
3358 "is set.\n");
James Smartc01f3202006-08-18 17:47:08 -04003359 return 0;
3360 }
3361
3362 if (val >= LPFC_MIN_DEVLOSS_TMO && val <= LPFC_MAX_DEVLOSS_TMO) {
James Smart3de2a652007-08-02 11:09:59 -04003363 vport->cfg_nodev_tmo = val;
3364 vport->cfg_devloss_tmo = val;
James Smartc01f3202006-08-18 17:47:08 -04003365 return 0;
3366 }
James Smarte8b62012007-08-02 11:10:09 -04003367 lpfc_printf_vlog(vport, KERN_ERR, LOG_INIT,
3368 "0400 lpfc_nodev_tmo attribute cannot be set to"
3369 " %d, allowed range is [%d, %d]\n",
3370 val, LPFC_MIN_DEVLOSS_TMO, LPFC_MAX_DEVLOSS_TMO);
James Smart3de2a652007-08-02 11:09:59 -04003371 vport->cfg_nodev_tmo = LPFC_DEF_DEVLOSS_TMO;
James Smartc01f3202006-08-18 17:47:08 -04003372 return -EINVAL;
3373}
3374
James Smarte59058c2008-08-24 21:49:00 -04003375/**
James Smart3621a712009-04-06 18:47:14 -04003376 * lpfc_update_rport_devloss_tmo - Update dev loss tmo value
James Smarte59058c2008-08-24 21:49:00 -04003377 * @vport: lpfc vport structure pointer.
3378 *
3379 * Description:
3380 * Update all the ndlp's dev loss tmo with the vport devloss tmo value.
3381 **/
James Smart7054a602007-04-25 09:52:34 -04003382static void
James Smart3de2a652007-08-02 11:09:59 -04003383lpfc_update_rport_devloss_tmo(struct lpfc_vport *vport)
James Smart7054a602007-04-25 09:52:34 -04003384{
James Smart858c9f62007-06-17 19:56:39 -05003385 struct Scsi_Host *shost;
James Smart7054a602007-04-25 09:52:34 -04003386 struct lpfc_nodelist *ndlp;
James Smart01466022018-04-09 14:24:27 -07003387#if (IS_ENABLED(CONFIG_NVME_FC))
3388 struct lpfc_nvme_rport *rport;
3389#endif
James Smart7054a602007-04-25 09:52:34 -04003390
James Smart51ef4c22007-08-02 11:10:31 -04003391 shost = lpfc_shost_from_vport(vport);
3392 spin_lock_irq(shost->host_lock);
James Smart7a06dcd2017-06-01 21:06:55 -07003393 list_for_each_entry(ndlp, &vport->fc_nodes, nlp_listp) {
3394 if (!NLP_CHK_NODE_ACT(ndlp))
3395 continue;
3396 if (ndlp->rport)
James Smart51ef4c22007-08-02 11:10:31 -04003397 ndlp->rport->dev_loss_tmo = vport->cfg_devloss_tmo;
James Smart6ddcf0a2017-11-03 09:33:30 -07003398#if (IS_ENABLED(CONFIG_NVME_FC))
James Smart01466022018-04-09 14:24:27 -07003399 rport = lpfc_ndlp_get_nrport(ndlp);
3400 if (rport)
3401 nvme_fc_set_remoteport_devloss(rport->remoteport,
James Smart6ddcf0a2017-11-03 09:33:30 -07003402 vport->cfg_devloss_tmo);
3403#endif
James Smart7a06dcd2017-06-01 21:06:55 -07003404 }
James Smart51ef4c22007-08-02 11:10:31 -04003405 spin_unlock_irq(shost->host_lock);
James Smart7054a602007-04-25 09:52:34 -04003406}
3407
James Smarte59058c2008-08-24 21:49:00 -04003408/**
James Smart3621a712009-04-06 18:47:14 -04003409 * lpfc_nodev_tmo_set - Set the vport nodev tmo and devloss tmo values
James Smarte59058c2008-08-24 21:49:00 -04003410 * @vport: lpfc vport structure pointer.
3411 * @val: contains the tmo value.
3412 *
3413 * Description:
3414 * If the devloss tmo is already set or the vport dev loss tmo has changed
3415 * then a kernel error message is printed and zero is returned.
3416 * Else if val is in range then nodev tmo and devloss tmo are set to val.
3417 * Otherwise nodev tmo is set to the default value.
3418 *
3419 * Returns:
3420 * zero if already set or if val is in range
3421 * -EINVAL val out of range
3422 **/
James Smartc01f3202006-08-18 17:47:08 -04003423static int
James Smart3de2a652007-08-02 11:09:59 -04003424lpfc_nodev_tmo_set(struct lpfc_vport *vport, int val)
James Smartc01f3202006-08-18 17:47:08 -04003425{
James Smart3de2a652007-08-02 11:09:59 -04003426 if (vport->dev_loss_tmo_changed ||
3427 (lpfc_devloss_tmo != LPFC_DEF_DEVLOSS_TMO)) {
James Smarte8b62012007-08-02 11:10:09 -04003428 lpfc_printf_vlog(vport, KERN_ERR, LOG_INIT,
James Smart6c860682016-10-13 15:06:13 -07003429 "0401 Ignoring change to lpfc_nodev_tmo "
3430 "because lpfc_devloss_tmo is set.\n");
James Smartc01f3202006-08-18 17:47:08 -04003431 return 0;
3432 }
James Smartc01f3202006-08-18 17:47:08 -04003433 if (val >= LPFC_MIN_DEVLOSS_TMO && val <= LPFC_MAX_DEVLOSS_TMO) {
James Smart3de2a652007-08-02 11:09:59 -04003434 vport->cfg_nodev_tmo = val;
3435 vport->cfg_devloss_tmo = val;
Mike Christie0af5d702010-09-15 16:52:31 -05003436 /*
3437 * For compat: set the fc_host dev loss so new rports
3438 * will get the value.
3439 */
3440 fc_host_dev_loss_tmo(lpfc_shost_from_vport(vport)) = val;
James Smart3de2a652007-08-02 11:09:59 -04003441 lpfc_update_rport_devloss_tmo(vport);
James Smartc01f3202006-08-18 17:47:08 -04003442 return 0;
3443 }
James Smarte8b62012007-08-02 11:10:09 -04003444 lpfc_printf_vlog(vport, KERN_ERR, LOG_INIT,
James Smart6c860682016-10-13 15:06:13 -07003445 "0403 lpfc_nodev_tmo attribute cannot be set to "
James Smarte8b62012007-08-02 11:10:09 -04003446 "%d, allowed range is [%d, %d]\n",
3447 val, LPFC_MIN_DEVLOSS_TMO, LPFC_MAX_DEVLOSS_TMO);
James Smartc01f3202006-08-18 17:47:08 -04003448 return -EINVAL;
3449}
3450
James Smart3de2a652007-08-02 11:09:59 -04003451lpfc_vport_param_store(nodev_tmo)
James Smartc01f3202006-08-18 17:47:08 -04003452
Joe Perchesb6b996b2017-12-19 10:15:07 -08003453static DEVICE_ATTR_RW(lpfc_nodev_tmo);
James Smartc01f3202006-08-18 17:47:08 -04003454
3455/*
3456# lpfc_devloss_tmo: If set, it will hold all I/O errors on devices that
3457# disappear until the timer expires. Value range is [0,255]. Default
3458# value is 30.
3459*/
James Smartab56dc22011-02-16 12:39:57 -05003460module_param(lpfc_devloss_tmo, int, S_IRUGO);
James Smartc01f3202006-08-18 17:47:08 -04003461MODULE_PARM_DESC(lpfc_devloss_tmo,
3462 "Seconds driver will hold I/O waiting "
3463 "for a device to come back");
James Smart3de2a652007-08-02 11:09:59 -04003464lpfc_vport_param_init(devloss_tmo, LPFC_DEF_DEVLOSS_TMO,
3465 LPFC_MIN_DEVLOSS_TMO, LPFC_MAX_DEVLOSS_TMO)
3466lpfc_vport_param_show(devloss_tmo)
James Smarte59058c2008-08-24 21:49:00 -04003467
3468/**
James Smart3621a712009-04-06 18:47:14 -04003469 * lpfc_devloss_tmo_set - Sets vport nodev tmo, devloss tmo values, changed bit
James Smarte59058c2008-08-24 21:49:00 -04003470 * @vport: lpfc vport structure pointer.
3471 * @val: contains the tmo value.
3472 *
3473 * Description:
3474 * If val is in a valid range then set the vport nodev tmo,
3475 * devloss tmo, also set the vport dev loss tmo changed flag.
3476 * Else a kernel error message is printed.
3477 *
3478 * Returns:
3479 * zero if val is in range
3480 * -EINVAL val out of range
3481 **/
James Smartc01f3202006-08-18 17:47:08 -04003482static int
James Smart3de2a652007-08-02 11:09:59 -04003483lpfc_devloss_tmo_set(struct lpfc_vport *vport, int val)
James Smartc01f3202006-08-18 17:47:08 -04003484{
3485 if (val >= LPFC_MIN_DEVLOSS_TMO && val <= LPFC_MAX_DEVLOSS_TMO) {
James Smart3de2a652007-08-02 11:09:59 -04003486 vport->cfg_nodev_tmo = val;
3487 vport->cfg_devloss_tmo = val;
3488 vport->dev_loss_tmo_changed = 1;
Mike Christie0af5d702010-09-15 16:52:31 -05003489 fc_host_dev_loss_tmo(lpfc_shost_from_vport(vport)) = val;
James Smart3de2a652007-08-02 11:09:59 -04003490 lpfc_update_rport_devloss_tmo(vport);
James Smartc01f3202006-08-18 17:47:08 -04003491 return 0;
3492 }
3493
James Smarte8b62012007-08-02 11:10:09 -04003494 lpfc_printf_vlog(vport, KERN_ERR, LOG_INIT,
James Smart6c860682016-10-13 15:06:13 -07003495 "0404 lpfc_devloss_tmo attribute cannot be set to "
3496 "%d, allowed range is [%d, %d]\n",
James Smarte8b62012007-08-02 11:10:09 -04003497 val, LPFC_MIN_DEVLOSS_TMO, LPFC_MAX_DEVLOSS_TMO);
James Smartc01f3202006-08-18 17:47:08 -04003498 return -EINVAL;
3499}
3500
James Smart3de2a652007-08-02 11:09:59 -04003501lpfc_vport_param_store(devloss_tmo)
Joe Perchesb6b996b2017-12-19 10:15:07 -08003502static DEVICE_ATTR_RW(lpfc_devloss_tmo);
James Smartc01f3202006-08-18 17:47:08 -04003503
3504/*
James Smartf358dd02017-02-12 13:52:34 -08003505 * lpfc_suppress_rsp: Enable suppress rsp feature is firmware supports it
3506 * lpfc_suppress_rsp = 0 Disable
3507 * lpfc_suppress_rsp = 1 Enable (default)
3508 *
3509 */
3510LPFC_ATTR_R(suppress_rsp, 1, 0, 1,
3511 "Enable suppress rsp feature is firmware supports it");
3512
3513/*
James Smart2d7dbc42017-02-12 13:52:35 -08003514 * lpfc_nvmet_mrq: Specify number of RQ pairs for processing NVMET cmds
James Smartbcb24f62017-11-20 16:00:36 -08003515 * lpfc_nvmet_mrq = 0 driver will calcualte optimal number of RQ pairs
James Smart2d7dbc42017-02-12 13:52:35 -08003516 * lpfc_nvmet_mrq = 1 use a single RQ pair
3517 * lpfc_nvmet_mrq >= 2 use specified RQ pairs for MRQ
3518 *
3519 */
3520LPFC_ATTR_R(nvmet_mrq,
James Smartbcb24f62017-11-20 16:00:36 -08003521 LPFC_NVMET_MRQ_AUTO, LPFC_NVMET_MRQ_AUTO, LPFC_NVMET_MRQ_MAX,
James Smart2d7dbc42017-02-12 13:52:35 -08003522 "Specify number of RQ pairs for processing NVMET cmds");
3523
3524/*
James Smart2448e482018-04-09 14:24:24 -07003525 * lpfc_nvmet_mrq_post: Specify number of RQ buffer to initially post
3526 * to each NVMET RQ. Range 64 to 2048, default is 512.
3527 */
3528LPFC_ATTR_R(nvmet_mrq_post,
3529 LPFC_NVMET_RQE_DEF_POST, LPFC_NVMET_RQE_MIN_POST,
3530 LPFC_NVMET_RQE_DEF_COUNT,
3531 "Specify number of RQ buffers to initially post");
3532
3533/*
James Smart895427b2017-02-12 13:52:30 -08003534 * lpfc_enable_fc4_type: Defines what FC4 types are supported.
3535 * Supported Values: 1 - register just FCP
3536 * 3 - register both FCP and NVME
James Smart7d708032017-03-08 14:36:01 -08003537 * Supported values are [1,3]. Default value is 1
James Smart895427b2017-02-12 13:52:30 -08003538 */
James Smart7d708032017-03-08 14:36:01 -08003539LPFC_ATTR_R(enable_fc4_type, LPFC_ENABLE_FCP,
James Smart895427b2017-02-12 13:52:30 -08003540 LPFC_ENABLE_FCP, LPFC_ENABLE_BOTH,
Dick Kennedycf4c8c82017-09-29 17:34:38 -07003541 "Enable FC4 Protocol support - FCP / NVME");
James Smart895427b2017-02-12 13:52:30 -08003542
3543/*
3544 * lpfc_xri_split: Defines the division of XRI resources between SCSI and NVME
3545 * This parameter is only used if:
James Smartf358dd02017-02-12 13:52:34 -08003546 * lpfc_enable_fc4_type is 3 - register both FCP and NVME and
3547 * port is not configured for NVMET.
James Smart895427b2017-02-12 13:52:30 -08003548 *
3549 * ELS/CT always get 10% of XRIs, up to a maximum of 250
3550 * The remaining XRIs get split up based on lpfc_xri_split per port:
3551 *
3552 * Supported Values are in percentages
3553 * the xri_split value is the percentage the SCSI port will get. The remaining
3554 * percentage will go to NVME.
3555 */
3556LPFC_ATTR_R(xri_split, 50, 10, 90,
Dick Kennedycf4c8c82017-09-29 17:34:38 -07003557 "Percentage of FCP XRI resources versus NVME");
James Smart895427b2017-02-12 13:52:30 -08003558
3559/*
dea31012005-04-17 16:05:31 -05003560# lpfc_log_verbose: Only turn this flag on if you are willing to risk being
3561# deluged with LOTS of information.
3562# You can set a bit mask to record specific types of verbose messages:
James Smartf4b4c682009-05-22 14:53:12 -04003563# See lpfc_logmsh.h for definitions.
dea31012005-04-17 16:05:31 -05003564*/
James Smartf4b4c682009-05-22 14:53:12 -04003565LPFC_VPORT_ATTR_HEX_RW(log_verbose, 0x0, 0x0, 0xffffffff,
James Smarte8b62012007-08-02 11:10:09 -04003566 "Verbose logging bit-mask");
dea31012005-04-17 16:05:31 -05003567
3568/*
James Smart7ee5d432007-10-27 13:37:17 -04003569# lpfc_enable_da_id: This turns on the DA_ID CT command that deregisters
3570# objects that have been registered with the nameserver after login.
3571*/
James Smartcf971242012-03-01 22:37:32 -05003572LPFC_VPORT_ATTR_R(enable_da_id, 1, 0, 1,
James Smart7ee5d432007-10-27 13:37:17 -04003573 "Deregister nameserver objects before LOGO");
3574
3575/*
dea31012005-04-17 16:05:31 -05003576# lun_queue_depth: This parameter is used to limit the number of outstanding
James Smart572709e2013-07-15 18:32:43 -04003577# commands per FCP LUN. Value range is [1,512]. Default value is 30.
3578# If this parameter value is greater than 1/8th the maximum number of exchanges
3579# supported by the HBA port, then the lun queue depth will be reduced to
3580# 1/8th the maximum number of exchanges.
dea31012005-04-17 16:05:31 -05003581*/
James Smart572709e2013-07-15 18:32:43 -04003582LPFC_VPORT_ATTR_R(lun_queue_depth, 30, 1, 512,
James Smart3de2a652007-08-02 11:09:59 -04003583 "Max number of FCP commands we can queue to a specific LUN");
dea31012005-04-17 16:05:31 -05003584
3585/*
James Smart7dc517d2010-07-14 15:32:10 -04003586# tgt_queue_depth: This parameter is used to limit the number of outstanding
3587# commands per target port. Value range is [10,65535]. Default value is 65535.
3588*/
James Smartf91bc592018-04-09 14:24:22 -07003589static uint lpfc_tgt_queue_depth = LPFC_MAX_TGT_QDEPTH;
3590module_param(lpfc_tgt_queue_depth, uint, 0444);
3591MODULE_PARM_DESC(lpfc_tgt_queue_depth, "Set max Target queue depth");
3592lpfc_vport_param_show(tgt_queue_depth);
3593lpfc_vport_param_init(tgt_queue_depth, LPFC_MAX_TGT_QDEPTH,
3594 LPFC_MIN_TGT_QDEPTH, LPFC_MAX_TGT_QDEPTH);
3595
3596/**
3597 * lpfc_tgt_queue_depth_store: Sets an attribute value.
3598 * @phba: pointer the the adapter structure.
3599 * @val: integer attribute value.
3600 *
3601 * Description: Sets the parameter to the new value.
3602 *
3603 * Returns:
3604 * zero on success
3605 * -EINVAL if val is invalid
3606 */
3607static int
3608lpfc_tgt_queue_depth_set(struct lpfc_vport *vport, uint val)
3609{
3610 struct Scsi_Host *shost = lpfc_shost_from_vport(vport);
3611 struct lpfc_nodelist *ndlp;
3612
3613 if (!lpfc_rangecheck(val, LPFC_MIN_TGT_QDEPTH, LPFC_MAX_TGT_QDEPTH))
3614 return -EINVAL;
3615
3616 if (val == vport->cfg_tgt_queue_depth)
3617 return 0;
3618
3619 spin_lock_irq(shost->host_lock);
3620 vport->cfg_tgt_queue_depth = val;
3621
3622 /* Next loop thru nodelist and change cmd_qdepth */
3623 list_for_each_entry(ndlp, &vport->fc_nodes, nlp_listp)
3624 ndlp->cmd_qdepth = vport->cfg_tgt_queue_depth;
3625
3626 spin_unlock_irq(shost->host_lock);
3627 return 0;
3628}
3629
3630lpfc_vport_param_store(tgt_queue_depth);
3631static DEVICE_ATTR_RW(lpfc_tgt_queue_depth);
James Smart7dc517d2010-07-14 15:32:10 -04003632
3633/*
Jamie Wellnitzb28485a2006-02-28 19:25:21 -05003634# hba_queue_depth: This parameter is used to limit the number of outstanding
3635# commands per lpfc HBA. Value range is [32,8192]. If this parameter
3636# value is greater than the maximum number of exchanges supported by the HBA,
3637# then maximum number of exchanges supported by the HBA is used to determine
3638# the hba_queue_depth.
3639*/
3640LPFC_ATTR_R(hba_queue_depth, 8192, 32, 8192,
3641 "Max number of FCP commands we can queue to a lpfc HBA");
3642
3643/*
James Smart92d7f7b2007-06-17 19:56:38 -05003644# peer_port_login: This parameter allows/prevents logins
3645# between peer ports hosted on the same physical port.
3646# When this parameter is set 0 peer ports of same physical port
3647# are not allowed to login to each other.
3648# When this parameter is set 1 peer ports of same physical port
3649# are allowed to login to each other.
3650# Default value of this parameter is 0.
3651*/
James Smart3de2a652007-08-02 11:09:59 -04003652LPFC_VPORT_ATTR_R(peer_port_login, 0, 0, 1,
3653 "Allow peer ports on the same physical port to login to each "
3654 "other.");
James Smart92d7f7b2007-06-17 19:56:38 -05003655
3656/*
James Smart3de2a652007-08-02 11:09:59 -04003657# restrict_login: This parameter allows/prevents logins
James Smart92d7f7b2007-06-17 19:56:38 -05003658# between Virtual Ports and remote initiators.
3659# When this parameter is not set (0) Virtual Ports will accept PLOGIs from
3660# other initiators and will attempt to PLOGI all remote ports.
3661# When this parameter is set (1) Virtual Ports will reject PLOGIs from
3662# remote ports and will not attempt to PLOGI to other initiators.
3663# This parameter does not restrict to the physical port.
3664# This parameter does not restrict logins to Fabric resident remote ports.
3665# Default value of this parameter is 1.
3666*/
James Smart3de2a652007-08-02 11:09:59 -04003667static int lpfc_restrict_login = 1;
James Smartab56dc22011-02-16 12:39:57 -05003668module_param(lpfc_restrict_login, int, S_IRUGO);
James Smart3de2a652007-08-02 11:09:59 -04003669MODULE_PARM_DESC(lpfc_restrict_login,
3670 "Restrict virtual ports login to remote initiators.");
3671lpfc_vport_param_show(restrict_login);
3672
James Smarte59058c2008-08-24 21:49:00 -04003673/**
James Smart3621a712009-04-06 18:47:14 -04003674 * lpfc_restrict_login_init - Set the vport restrict login flag
James Smarte59058c2008-08-24 21:49:00 -04003675 * @vport: lpfc vport structure pointer.
3676 * @val: contains the restrict login value.
3677 *
3678 * Description:
3679 * If val is not in a valid range then log a kernel error message and set
3680 * the vport restrict login to one.
3681 * If the port type is physical clear the restrict login flag and return.
3682 * Else set the restrict login flag to val.
3683 *
3684 * Returns:
3685 * zero if val is in range
3686 * -EINVAL val out of range
3687 **/
James Smart3de2a652007-08-02 11:09:59 -04003688static int
3689lpfc_restrict_login_init(struct lpfc_vport *vport, int val)
3690{
3691 if (val < 0 || val > 1) {
James Smarte8b62012007-08-02 11:10:09 -04003692 lpfc_printf_vlog(vport, KERN_ERR, LOG_INIT,
James Smartd7c255b2008-08-24 21:50:00 -04003693 "0422 lpfc_restrict_login attribute cannot "
James Smarte8b62012007-08-02 11:10:09 -04003694 "be set to %d, allowed range is [0, 1]\n",
3695 val);
James Smart3de2a652007-08-02 11:09:59 -04003696 vport->cfg_restrict_login = 1;
3697 return -EINVAL;
3698 }
3699 if (vport->port_type == LPFC_PHYSICAL_PORT) {
3700 vport->cfg_restrict_login = 0;
3701 return 0;
3702 }
3703 vport->cfg_restrict_login = val;
3704 return 0;
3705}
3706
James Smarte59058c2008-08-24 21:49:00 -04003707/**
James Smart3621a712009-04-06 18:47:14 -04003708 * lpfc_restrict_login_set - Set the vport restrict login flag
James Smarte59058c2008-08-24 21:49:00 -04003709 * @vport: lpfc vport structure pointer.
3710 * @val: contains the restrict login value.
3711 *
3712 * Description:
3713 * If val is not in a valid range then log a kernel error message and set
3714 * the vport restrict login to one.
3715 * If the port type is physical and the val is not zero log a kernel
3716 * error message, clear the restrict login flag and return zero.
3717 * Else set the restrict login flag to val.
3718 *
3719 * Returns:
3720 * zero if val is in range
3721 * -EINVAL val out of range
3722 **/
James Smart3de2a652007-08-02 11:09:59 -04003723static int
3724lpfc_restrict_login_set(struct lpfc_vport *vport, int val)
3725{
3726 if (val < 0 || val > 1) {
James Smarte8b62012007-08-02 11:10:09 -04003727 lpfc_printf_vlog(vport, KERN_ERR, LOG_INIT,
James Smartd7c255b2008-08-24 21:50:00 -04003728 "0425 lpfc_restrict_login attribute cannot "
James Smarte8b62012007-08-02 11:10:09 -04003729 "be set to %d, allowed range is [0, 1]\n",
3730 val);
James Smart3de2a652007-08-02 11:09:59 -04003731 vport->cfg_restrict_login = 1;
3732 return -EINVAL;
3733 }
3734 if (vport->port_type == LPFC_PHYSICAL_PORT && val != 0) {
James Smarte8b62012007-08-02 11:10:09 -04003735 lpfc_printf_vlog(vport, KERN_ERR, LOG_INIT,
3736 "0468 lpfc_restrict_login must be 0 for "
3737 "Physical ports.\n");
James Smart3de2a652007-08-02 11:09:59 -04003738 vport->cfg_restrict_login = 0;
3739 return 0;
3740 }
3741 vport->cfg_restrict_login = val;
3742 return 0;
3743}
3744lpfc_vport_param_store(restrict_login);
Joe Perchesb6b996b2017-12-19 10:15:07 -08003745static DEVICE_ATTR_RW(lpfc_restrict_login);
James Smart92d7f7b2007-06-17 19:56:38 -05003746
3747/*
dea31012005-04-17 16:05:31 -05003748# Some disk devices have a "select ID" or "select Target" capability.
3749# From a protocol standpoint "select ID" usually means select the
3750# Fibre channel "ALPA". In the FC-AL Profile there is an "informative
3751# annex" which contains a table that maps a "select ID" (a number
3752# between 0 and 7F) to an ALPA. By default, for compatibility with
3753# older drivers, the lpfc driver scans this table from low ALPA to high
3754# ALPA.
3755#
3756# Turning on the scan-down variable (on = 1, off = 0) will
3757# cause the lpfc driver to use an inverted table, effectively
3758# scanning ALPAs from high to low. Value range is [0,1]. Default value is 1.
3759#
3760# (Note: This "select ID" functionality is a LOOP ONLY characteristic
3761# and will not work across a fabric. Also this parameter will take
3762# effect only in the case when ALPA map is not available.)
3763*/
James Smart3de2a652007-08-02 11:09:59 -04003764LPFC_VPORT_ATTR_R(scan_down, 1, 0, 1,
3765 "Start scanning for devices from highest ALPA to lowest");
dea31012005-04-17 16:05:31 -05003766
3767/*
dea31012005-04-17 16:05:31 -05003768# lpfc_topology: link topology for init link
3769# 0x0 = attempt loop mode then point-to-point
Jamie Wellnitz367c2712006-02-28 19:25:32 -05003770# 0x01 = internal loopback mode
dea31012005-04-17 16:05:31 -05003771# 0x02 = attempt point-to-point mode only
3772# 0x04 = attempt loop mode only
3773# 0x06 = attempt point-to-point mode then loop
3774# Set point-to-point mode if you want to run as an N_Port.
3775# Set loop mode if you want to run as an NL_Port. Value range is [0,0x6].
3776# Default value is 0.
3777*/
James Smart0a035432016-10-13 15:06:10 -07003778LPFC_ATTR(topology, 0, 0, 6,
3779 "Select Fibre Channel topology");
James Smarte59058c2008-08-24 21:49:00 -04003780
3781/**
James Smart3621a712009-04-06 18:47:14 -04003782 * lpfc_topology_set - Set the adapters topology field
James Smarte59058c2008-08-24 21:49:00 -04003783 * @phba: lpfc_hba pointer.
3784 * @val: topology value.
3785 *
3786 * Description:
3787 * If val is in a valid range then set the adapter's topology field and
3788 * issue a lip; if the lip fails reset the topology to the old value.
3789 *
3790 * If the value is not in range log a kernel error message and return an error.
3791 *
3792 * Returns:
3793 * zero if val is in range and lip okay
3794 * non-zero return value from lpfc_issue_lip()
3795 * -EINVAL val out of range
3796 **/
James Smarta257bf92009-04-06 18:48:10 -04003797static ssize_t
3798lpfc_topology_store(struct device *dev, struct device_attribute *attr,
3799 const char *buf, size_t count)
James Smart83108bd2008-01-11 01:53:09 -05003800{
James Smarta257bf92009-04-06 18:48:10 -04003801 struct Scsi_Host *shost = class_to_shost(dev);
3802 struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata;
3803 struct lpfc_hba *phba = vport->phba;
3804 int val = 0;
3805 int nolip = 0;
3806 const char *val_buf = buf;
James Smart83108bd2008-01-11 01:53:09 -05003807 int err;
3808 uint32_t prev_val;
James Smarta257bf92009-04-06 18:48:10 -04003809
3810 if (!strncmp(buf, "nolip ", strlen("nolip "))) {
3811 nolip = 1;
3812 val_buf = &buf[strlen("nolip ")];
3813 }
3814
3815 if (!isdigit(val_buf[0]))
3816 return -EINVAL;
3817 if (sscanf(val_buf, "%i", &val) != 1)
3818 return -EINVAL;
3819
James Smart83108bd2008-01-11 01:53:09 -05003820 if (val >= 0 && val <= 6) {
3821 prev_val = phba->cfg_topology;
James Smartff78d8f2011-12-13 13:21:35 -05003822 if (phba->cfg_link_speed == LPFC_USER_LINK_SPEED_16G &&
3823 val == 4) {
3824 lpfc_printf_vlog(vport, KERN_ERR, LOG_INIT,
3825 "3113 Loop mode not supported at speed %d\n",
James Smartd38dd522015-08-31 16:48:17 -04003826 val);
James Smartff78d8f2011-12-13 13:21:35 -05003827 return -EINVAL;
3828 }
James Smartd38dd522015-08-31 16:48:17 -04003829 if (phba->pcidev->device == PCI_DEVICE_ID_LANCER_G6_FC &&
3830 val == 4) {
3831 lpfc_printf_vlog(vport, KERN_ERR, LOG_INIT,
3832 "3114 Loop mode not supported\n");
3833 return -EINVAL;
3834 }
3835 phba->cfg_topology = val;
James Smarta257bf92009-04-06 18:48:10 -04003836 if (nolip)
3837 return strlen(buf);
3838
James Smart88a2cfb2011-07-22 18:36:33 -04003839 lpfc_printf_vlog(vport, KERN_ERR, LOG_INIT,
3840 "3054 lpfc_topology changed from %d to %d\n",
3841 prev_val, val);
James Smarte74c03c2013-04-17 20:15:19 -04003842 if (prev_val != val && phba->sli_rev == LPFC_SLI_REV4)
3843 phba->fc_topology_changed = 1;
James Smart83108bd2008-01-11 01:53:09 -05003844 err = lpfc_issue_lip(lpfc_shost_from_vport(phba->pport));
James Smarta257bf92009-04-06 18:48:10 -04003845 if (err) {
James Smart83108bd2008-01-11 01:53:09 -05003846 phba->cfg_topology = prev_val;
James Smarta257bf92009-04-06 18:48:10 -04003847 return -EINVAL;
3848 } else
3849 return strlen(buf);
James Smart83108bd2008-01-11 01:53:09 -05003850 }
3851 lpfc_printf_log(phba, KERN_ERR, LOG_INIT,
3852 "%d:0467 lpfc_topology attribute cannot be set to %d, "
3853 "allowed range is [0, 6]\n",
3854 phba->brd_no, val);
3855 return -EINVAL;
3856}
James Smart0a035432016-10-13 15:06:10 -07003857
James Smart83108bd2008-01-11 01:53:09 -05003858lpfc_param_show(topology)
Joe Perchesb6b996b2017-12-19 10:15:07 -08003859static DEVICE_ATTR_RW(lpfc_topology);
dea31012005-04-17 16:05:31 -05003860
James Smart21e9a0a2009-05-22 14:53:21 -04003861/**
3862 * lpfc_static_vport_show: Read callback function for
3863 * lpfc_static_vport sysfs file.
3864 * @dev: Pointer to class device object.
3865 * @attr: device attribute structure.
3866 * @buf: Data buffer.
3867 *
3868 * This function is the read call back function for
3869 * lpfc_static_vport sysfs file. The lpfc_static_vport
3870 * sysfs file report the mageability of the vport.
3871 **/
3872static ssize_t
3873lpfc_static_vport_show(struct device *dev, struct device_attribute *attr,
3874 char *buf)
3875{
3876 struct Scsi_Host *shost = class_to_shost(dev);
3877 struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata;
3878 if (vport->vport_flag & STATIC_VPORT)
3879 sprintf(buf, "1\n");
3880 else
3881 sprintf(buf, "0\n");
3882
3883 return strlen(buf);
3884}
3885
3886/*
3887 * Sysfs attribute to control the statistical data collection.
3888 */
Joe Perchesc828a892017-12-19 10:15:08 -08003889static DEVICE_ATTR_RO(lpfc_static_vport);
James Smartea2151b2008-09-07 11:52:10 -04003890
3891/**
James Smart3621a712009-04-06 18:47:14 -04003892 * lpfc_stat_data_ctrl_store - write call back for lpfc_stat_data_ctrl sysfs file
James Smartea2151b2008-09-07 11:52:10 -04003893 * @dev: Pointer to class device.
3894 * @buf: Data buffer.
3895 * @count: Size of the data buffer.
3896 *
Masahiro Yamada9332ef92017-02-27 14:28:47 -08003897 * This function get called when a user write to the lpfc_stat_data_ctrl
James Smartea2151b2008-09-07 11:52:10 -04003898 * sysfs file. This function parse the command written to the sysfs file
3899 * and take appropriate action. These commands are used for controlling
3900 * driver statistical data collection.
3901 * Following are the command this function handles.
3902 *
3903 * setbucket <bucket_type> <base> <step>
3904 * = Set the latency buckets.
3905 * destroybucket = destroy all the buckets.
3906 * start = start data collection
3907 * stop = stop data collection
3908 * reset = reset the collected data
3909 **/
3910static ssize_t
3911lpfc_stat_data_ctrl_store(struct device *dev, struct device_attribute *attr,
3912 const char *buf, size_t count)
3913{
3914 struct Scsi_Host *shost = class_to_shost(dev);
3915 struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata;
3916 struct lpfc_hba *phba = vport->phba;
3917#define LPFC_MAX_DATA_CTRL_LEN 1024
3918 static char bucket_data[LPFC_MAX_DATA_CTRL_LEN];
3919 unsigned long i;
3920 char *str_ptr, *token;
3921 struct lpfc_vport **vports;
3922 struct Scsi_Host *v_shost;
3923 char *bucket_type_str, *base_str, *step_str;
3924 unsigned long base, step, bucket_type;
3925
3926 if (!strncmp(buf, "setbucket", strlen("setbucket"))) {
James Smarta257bf92009-04-06 18:48:10 -04003927 if (strlen(buf) > (LPFC_MAX_DATA_CTRL_LEN - 1))
James Smartea2151b2008-09-07 11:52:10 -04003928 return -EINVAL;
3929
James Smarteb016562014-09-03 12:58:06 -04003930 strncpy(bucket_data, buf, LPFC_MAX_DATA_CTRL_LEN);
James Smartea2151b2008-09-07 11:52:10 -04003931 str_ptr = &bucket_data[0];
3932 /* Ignore this token - this is command token */
3933 token = strsep(&str_ptr, "\t ");
3934 if (!token)
3935 return -EINVAL;
3936
3937 bucket_type_str = strsep(&str_ptr, "\t ");
3938 if (!bucket_type_str)
3939 return -EINVAL;
3940
3941 if (!strncmp(bucket_type_str, "linear", strlen("linear")))
3942 bucket_type = LPFC_LINEAR_BUCKET;
3943 else if (!strncmp(bucket_type_str, "power2", strlen("power2")))
3944 bucket_type = LPFC_POWER2_BUCKET;
3945 else
3946 return -EINVAL;
3947
3948 base_str = strsep(&str_ptr, "\t ");
3949 if (!base_str)
3950 return -EINVAL;
3951 base = simple_strtoul(base_str, NULL, 0);
3952
3953 step_str = strsep(&str_ptr, "\t ");
3954 if (!step_str)
3955 return -EINVAL;
3956 step = simple_strtoul(step_str, NULL, 0);
3957 if (!step)
3958 return -EINVAL;
3959
3960 /* Block the data collection for every vport */
3961 vports = lpfc_create_vport_work_array(phba);
3962 if (vports == NULL)
3963 return -ENOMEM;
3964
James Smartf4b4c682009-05-22 14:53:12 -04003965 for (i = 0; i <= phba->max_vports && vports[i] != NULL; i++) {
James Smartea2151b2008-09-07 11:52:10 -04003966 v_shost = lpfc_shost_from_vport(vports[i]);
3967 spin_lock_irq(v_shost->host_lock);
3968 /* Block and reset data collection */
3969 vports[i]->stat_data_blocked = 1;
3970 if (vports[i]->stat_data_enabled)
3971 lpfc_vport_reset_stat_data(vports[i]);
3972 spin_unlock_irq(v_shost->host_lock);
3973 }
3974
3975 /* Set the bucket attributes */
3976 phba->bucket_type = bucket_type;
3977 phba->bucket_base = base;
3978 phba->bucket_step = step;
3979
James Smartf4b4c682009-05-22 14:53:12 -04003980 for (i = 0; i <= phba->max_vports && vports[i] != NULL; i++) {
James Smartea2151b2008-09-07 11:52:10 -04003981 v_shost = lpfc_shost_from_vport(vports[i]);
3982
3983 /* Unblock data collection */
3984 spin_lock_irq(v_shost->host_lock);
3985 vports[i]->stat_data_blocked = 0;
3986 spin_unlock_irq(v_shost->host_lock);
3987 }
3988 lpfc_destroy_vport_work_array(phba, vports);
3989 return strlen(buf);
3990 }
3991
3992 if (!strncmp(buf, "destroybucket", strlen("destroybucket"))) {
3993 vports = lpfc_create_vport_work_array(phba);
3994 if (vports == NULL)
3995 return -ENOMEM;
3996
James Smartf4b4c682009-05-22 14:53:12 -04003997 for (i = 0; i <= phba->max_vports && vports[i] != NULL; i++) {
James Smartea2151b2008-09-07 11:52:10 -04003998 v_shost = lpfc_shost_from_vport(vports[i]);
3999 spin_lock_irq(shost->host_lock);
4000 vports[i]->stat_data_blocked = 1;
4001 lpfc_free_bucket(vport);
4002 vport->stat_data_enabled = 0;
4003 vports[i]->stat_data_blocked = 0;
4004 spin_unlock_irq(shost->host_lock);
4005 }
4006 lpfc_destroy_vport_work_array(phba, vports);
4007 phba->bucket_type = LPFC_NO_BUCKET;
4008 phba->bucket_base = 0;
4009 phba->bucket_step = 0;
4010 return strlen(buf);
4011 }
4012
4013 if (!strncmp(buf, "start", strlen("start"))) {
4014 /* If no buckets configured return error */
4015 if (phba->bucket_type == LPFC_NO_BUCKET)
4016 return -EINVAL;
4017 spin_lock_irq(shost->host_lock);
4018 if (vport->stat_data_enabled) {
4019 spin_unlock_irq(shost->host_lock);
4020 return strlen(buf);
4021 }
4022 lpfc_alloc_bucket(vport);
4023 vport->stat_data_enabled = 1;
4024 spin_unlock_irq(shost->host_lock);
4025 return strlen(buf);
4026 }
4027
4028 if (!strncmp(buf, "stop", strlen("stop"))) {
4029 spin_lock_irq(shost->host_lock);
4030 if (vport->stat_data_enabled == 0) {
4031 spin_unlock_irq(shost->host_lock);
4032 return strlen(buf);
4033 }
4034 lpfc_free_bucket(vport);
4035 vport->stat_data_enabled = 0;
4036 spin_unlock_irq(shost->host_lock);
4037 return strlen(buf);
4038 }
4039
4040 if (!strncmp(buf, "reset", strlen("reset"))) {
4041 if ((phba->bucket_type == LPFC_NO_BUCKET)
4042 || !vport->stat_data_enabled)
4043 return strlen(buf);
4044 spin_lock_irq(shost->host_lock);
4045 vport->stat_data_blocked = 1;
4046 lpfc_vport_reset_stat_data(vport);
4047 vport->stat_data_blocked = 0;
4048 spin_unlock_irq(shost->host_lock);
4049 return strlen(buf);
4050 }
4051 return -EINVAL;
4052}
4053
4054
4055/**
James Smart3621a712009-04-06 18:47:14 -04004056 * lpfc_stat_data_ctrl_show - Read function for lpfc_stat_data_ctrl sysfs file
James Smartea2151b2008-09-07 11:52:10 -04004057 * @dev: Pointer to class device object.
4058 * @buf: Data buffer.
4059 *
4060 * This function is the read call back function for
4061 * lpfc_stat_data_ctrl sysfs file. This function report the
4062 * current statistical data collection state.
4063 **/
4064static ssize_t
4065lpfc_stat_data_ctrl_show(struct device *dev, struct device_attribute *attr,
4066 char *buf)
4067{
4068 struct Scsi_Host *shost = class_to_shost(dev);
4069 struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata;
4070 struct lpfc_hba *phba = vport->phba;
4071 int index = 0;
4072 int i;
4073 char *bucket_type;
4074 unsigned long bucket_value;
4075
4076 switch (phba->bucket_type) {
4077 case LPFC_LINEAR_BUCKET:
4078 bucket_type = "linear";
4079 break;
4080 case LPFC_POWER2_BUCKET:
4081 bucket_type = "power2";
4082 break;
4083 default:
4084 bucket_type = "No Bucket";
4085 break;
4086 }
4087
4088 sprintf(&buf[index], "Statistical Data enabled :%d, "
4089 "blocked :%d, Bucket type :%s, Bucket base :%d,"
4090 " Bucket step :%d\nLatency Ranges :",
4091 vport->stat_data_enabled, vport->stat_data_blocked,
4092 bucket_type, phba->bucket_base, phba->bucket_step);
4093 index = strlen(buf);
4094 if (phba->bucket_type != LPFC_NO_BUCKET) {
4095 for (i = 0; i < LPFC_MAX_BUCKET_COUNT; i++) {
4096 if (phba->bucket_type == LPFC_LINEAR_BUCKET)
4097 bucket_value = phba->bucket_base +
4098 phba->bucket_step * i;
4099 else
4100 bucket_value = phba->bucket_base +
4101 (1 << i) * phba->bucket_step;
4102
4103 if (index + 10 > PAGE_SIZE)
4104 break;
4105 sprintf(&buf[index], "%08ld ", bucket_value);
4106 index = strlen(buf);
4107 }
4108 }
4109 sprintf(&buf[index], "\n");
4110 return strlen(buf);
4111}
4112
4113/*
4114 * Sysfs attribute to control the statistical data collection.
4115 */
Joe Perchesb6b996b2017-12-19 10:15:07 -08004116static DEVICE_ATTR_RW(lpfc_stat_data_ctrl);
James Smartea2151b2008-09-07 11:52:10 -04004117
4118/*
4119 * lpfc_drvr_stat_data: sysfs attr to get driver statistical data.
4120 */
4121
4122/*
4123 * Each Bucket takes 11 characters and 1 new line + 17 bytes WWN
4124 * for each target.
4125 */
4126#define STAT_DATA_SIZE_PER_TARGET(NUM_BUCKETS) ((NUM_BUCKETS) * 11 + 18)
4127#define MAX_STAT_DATA_SIZE_PER_TARGET \
4128 STAT_DATA_SIZE_PER_TARGET(LPFC_MAX_BUCKET_COUNT)
4129
4130
4131/**
James Smart3621a712009-04-06 18:47:14 -04004132 * sysfs_drvr_stat_data_read - Read function for lpfc_drvr_stat_data attribute
Chris Wright2c3c8be2010-05-12 18:28:57 -07004133 * @filp: sysfs file
James Smartea2151b2008-09-07 11:52:10 -04004134 * @kobj: Pointer to the kernel object
4135 * @bin_attr: Attribute object
4136 * @buff: Buffer pointer
4137 * @off: File offset
4138 * @count: Buffer size
4139 *
4140 * This function is the read call back function for lpfc_drvr_stat_data
4141 * sysfs file. This function export the statistical data to user
4142 * applications.
4143 **/
4144static ssize_t
Chris Wright2c3c8be2010-05-12 18:28:57 -07004145sysfs_drvr_stat_data_read(struct file *filp, struct kobject *kobj,
4146 struct bin_attribute *bin_attr,
James Smartea2151b2008-09-07 11:52:10 -04004147 char *buf, loff_t off, size_t count)
4148{
4149 struct device *dev = container_of(kobj, struct device,
4150 kobj);
4151 struct Scsi_Host *shost = class_to_shost(dev);
4152 struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata;
4153 struct lpfc_hba *phba = vport->phba;
4154 int i = 0, index = 0;
4155 unsigned long nport_index;
4156 struct lpfc_nodelist *ndlp = NULL;
4157 nport_index = (unsigned long)off /
4158 MAX_STAT_DATA_SIZE_PER_TARGET;
4159
4160 if (!vport->stat_data_enabled || vport->stat_data_blocked
4161 || (phba->bucket_type == LPFC_NO_BUCKET))
4162 return 0;
4163
4164 spin_lock_irq(shost->host_lock);
4165 list_for_each_entry(ndlp, &vport->fc_nodes, nlp_listp) {
4166 if (!NLP_CHK_NODE_ACT(ndlp) || !ndlp->lat_data)
4167 continue;
4168
4169 if (nport_index > 0) {
4170 nport_index--;
4171 continue;
4172 }
4173
4174 if ((index + MAX_STAT_DATA_SIZE_PER_TARGET)
4175 > count)
4176 break;
4177
4178 if (!ndlp->lat_data)
4179 continue;
4180
4181 /* Print the WWN */
4182 sprintf(&buf[index], "%02x%02x%02x%02x%02x%02x%02x%02x:",
4183 ndlp->nlp_portname.u.wwn[0],
4184 ndlp->nlp_portname.u.wwn[1],
4185 ndlp->nlp_portname.u.wwn[2],
4186 ndlp->nlp_portname.u.wwn[3],
4187 ndlp->nlp_portname.u.wwn[4],
4188 ndlp->nlp_portname.u.wwn[5],
4189 ndlp->nlp_portname.u.wwn[6],
4190 ndlp->nlp_portname.u.wwn[7]);
4191
4192 index = strlen(buf);
4193
4194 for (i = 0; i < LPFC_MAX_BUCKET_COUNT; i++) {
4195 sprintf(&buf[index], "%010u,",
4196 ndlp->lat_data[i].cmd_count);
4197 index = strlen(buf);
4198 }
4199 sprintf(&buf[index], "\n");
4200 index = strlen(buf);
4201 }
4202 spin_unlock_irq(shost->host_lock);
4203 return index;
4204}
4205
4206static struct bin_attribute sysfs_drvr_stat_data_attr = {
4207 .attr = {
4208 .name = "lpfc_drvr_stat_data",
4209 .mode = S_IRUSR,
James Smartea2151b2008-09-07 11:52:10 -04004210 },
4211 .size = LPFC_MAX_TARGET * MAX_STAT_DATA_SIZE_PER_TARGET,
4212 .read = sysfs_drvr_stat_data_read,
4213 .write = NULL,
4214};
4215
dea31012005-04-17 16:05:31 -05004216/*
4217# lpfc_link_speed: Link speed selection for initializing the Fibre Channel
4218# connection.
James Smart76a95d72010-11-20 23:11:48 -05004219# Value range is [0,16]. Default value is 0.
dea31012005-04-17 16:05:31 -05004220*/
James Smarte59058c2008-08-24 21:49:00 -04004221/**
James Smart3621a712009-04-06 18:47:14 -04004222 * lpfc_link_speed_set - Set the adapters link speed
James Smarte59058c2008-08-24 21:49:00 -04004223 * @phba: lpfc_hba pointer.
4224 * @val: link speed value.
4225 *
4226 * Description:
4227 * If val is in a valid range then set the adapter's link speed field and
4228 * issue a lip; if the lip fails reset the link speed to the old value.
4229 *
4230 * Notes:
4231 * If the value is not in range log a kernel error message and return an error.
4232 *
4233 * Returns:
4234 * zero if val is in range and lip okay.
4235 * non-zero return value from lpfc_issue_lip()
4236 * -EINVAL val out of range
4237 **/
James Smarta257bf92009-04-06 18:48:10 -04004238static ssize_t
4239lpfc_link_speed_store(struct device *dev, struct device_attribute *attr,
4240 const char *buf, size_t count)
James Smart83108bd2008-01-11 01:53:09 -05004241{
James Smarta257bf92009-04-06 18:48:10 -04004242 struct Scsi_Host *shost = class_to_shost(dev);
4243 struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata;
4244 struct lpfc_hba *phba = vport->phba;
James Smart76a95d72010-11-20 23:11:48 -05004245 int val = LPFC_USER_LINK_SPEED_AUTO;
James Smarta257bf92009-04-06 18:48:10 -04004246 int nolip = 0;
4247 const char *val_buf = buf;
James Smart83108bd2008-01-11 01:53:09 -05004248 int err;
James Smartc6918162016-10-13 15:06:16 -07004249 uint32_t prev_val, if_type;
4250
4251 if_type = bf_get(lpfc_sli_intf_if_type, &phba->sli4_hba.sli_intf);
4252 if (if_type == LPFC_SLI_INTF_IF_TYPE_2 &&
4253 phba->hba_flag & HBA_FORCED_LINK_SPEED)
4254 return -EPERM;
James Smart83108bd2008-01-11 01:53:09 -05004255
James Smarta257bf92009-04-06 18:48:10 -04004256 if (!strncmp(buf, "nolip ", strlen("nolip "))) {
4257 nolip = 1;
4258 val_buf = &buf[strlen("nolip ")];
4259 }
4260
4261 if (!isdigit(val_buf[0]))
4262 return -EINVAL;
4263 if (sscanf(val_buf, "%i", &val) != 1)
4264 return -EINVAL;
4265
James Smart88a2cfb2011-07-22 18:36:33 -04004266 lpfc_printf_vlog(vport, KERN_ERR, LOG_INIT,
4267 "3055 lpfc_link_speed changed from %d to %d %s\n",
4268 phba->cfg_link_speed, val, nolip ? "(nolip)" : "(lip)");
4269
James Smart76a95d72010-11-20 23:11:48 -05004270 if (((val == LPFC_USER_LINK_SPEED_1G) && !(phba->lmt & LMT_1Gb)) ||
4271 ((val == LPFC_USER_LINK_SPEED_2G) && !(phba->lmt & LMT_2Gb)) ||
4272 ((val == LPFC_USER_LINK_SPEED_4G) && !(phba->lmt & LMT_4Gb)) ||
4273 ((val == LPFC_USER_LINK_SPEED_8G) && !(phba->lmt & LMT_8Gb)) ||
4274 ((val == LPFC_USER_LINK_SPEED_10G) && !(phba->lmt & LMT_10Gb)) ||
James Smartd38dd522015-08-31 16:48:17 -04004275 ((val == LPFC_USER_LINK_SPEED_16G) && !(phba->lmt & LMT_16Gb)) ||
James Smartfbd8a6b2018-02-22 08:18:45 -08004276 ((val == LPFC_USER_LINK_SPEED_32G) && !(phba->lmt & LMT_32Gb)) ||
4277 ((val == LPFC_USER_LINK_SPEED_64G) && !(phba->lmt & LMT_64Gb))) {
James Smart76a95d72010-11-20 23:11:48 -05004278 lpfc_printf_log(phba, KERN_ERR, LOG_INIT,
4279 "2879 lpfc_link_speed attribute cannot be set "
4280 "to %d. Speed is not supported by this port.\n",
4281 val);
James Smart83108bd2008-01-11 01:53:09 -05004282 return -EINVAL;
James Smart76a95d72010-11-20 23:11:48 -05004283 }
James Smartfbd8a6b2018-02-22 08:18:45 -08004284 if (val >= LPFC_USER_LINK_SPEED_16G &&
4285 phba->fc_topology == LPFC_TOPOLOGY_LOOP) {
James Smartff78d8f2011-12-13 13:21:35 -05004286 lpfc_printf_log(phba, KERN_ERR, LOG_INIT,
4287 "3112 lpfc_link_speed attribute cannot be set "
4288 "to %d. Speed is not supported in loop mode.\n",
4289 val);
4290 return -EINVAL;
4291 }
James Smartfbd8a6b2018-02-22 08:18:45 -08004292
4293 switch (val) {
4294 case LPFC_USER_LINK_SPEED_AUTO:
4295 case LPFC_USER_LINK_SPEED_1G:
4296 case LPFC_USER_LINK_SPEED_2G:
4297 case LPFC_USER_LINK_SPEED_4G:
4298 case LPFC_USER_LINK_SPEED_8G:
4299 case LPFC_USER_LINK_SPEED_16G:
4300 case LPFC_USER_LINK_SPEED_32G:
4301 case LPFC_USER_LINK_SPEED_64G:
James Smart83108bd2008-01-11 01:53:09 -05004302 prev_val = phba->cfg_link_speed;
4303 phba->cfg_link_speed = val;
James Smarta257bf92009-04-06 18:48:10 -04004304 if (nolip)
4305 return strlen(buf);
4306
James Smart83108bd2008-01-11 01:53:09 -05004307 err = lpfc_issue_lip(lpfc_shost_from_vport(phba->pport));
James Smarta257bf92009-04-06 18:48:10 -04004308 if (err) {
James Smart83108bd2008-01-11 01:53:09 -05004309 phba->cfg_link_speed = prev_val;
James Smarta257bf92009-04-06 18:48:10 -04004310 return -EINVAL;
James Smartfbd8a6b2018-02-22 08:18:45 -08004311 }
4312 return strlen(buf);
4313 default:
4314 break;
James Smart83108bd2008-01-11 01:53:09 -05004315 }
James Smartfbd8a6b2018-02-22 08:18:45 -08004316
James Smart83108bd2008-01-11 01:53:09 -05004317 lpfc_printf_log(phba, KERN_ERR, LOG_INIT,
James Smartfbd8a6b2018-02-22 08:18:45 -08004318 "0469 lpfc_link_speed attribute cannot be set to %d, "
4319 "allowed values are [%s]\n",
4320 val, LPFC_LINK_SPEED_STRING);
James Smart83108bd2008-01-11 01:53:09 -05004321 return -EINVAL;
James Smartfbd8a6b2018-02-22 08:18:45 -08004322
James Smart83108bd2008-01-11 01:53:09 -05004323}
4324
4325static int lpfc_link_speed = 0;
James Smartab56dc22011-02-16 12:39:57 -05004326module_param(lpfc_link_speed, int, S_IRUGO);
James Smart83108bd2008-01-11 01:53:09 -05004327MODULE_PARM_DESC(lpfc_link_speed, "Select link speed");
4328lpfc_param_show(link_speed)
James Smarte59058c2008-08-24 21:49:00 -04004329
4330/**
James Smart3621a712009-04-06 18:47:14 -04004331 * lpfc_link_speed_init - Set the adapters link speed
James Smarte59058c2008-08-24 21:49:00 -04004332 * @phba: lpfc_hba pointer.
4333 * @val: link speed value.
4334 *
4335 * Description:
4336 * If val is in a valid range then set the adapter's link speed field.
4337 *
4338 * Notes:
4339 * If the value is not in range log a kernel error message, clear the link
4340 * speed and return an error.
4341 *
4342 * Returns:
4343 * zero if val saved.
4344 * -EINVAL val out of range
4345 **/
James Smart83108bd2008-01-11 01:53:09 -05004346static int
4347lpfc_link_speed_init(struct lpfc_hba *phba, int val)
4348{
James Smartfbd8a6b2018-02-22 08:18:45 -08004349 if (val >= LPFC_USER_LINK_SPEED_16G && phba->cfg_topology == 4) {
James Smartff78d8f2011-12-13 13:21:35 -05004350 lpfc_printf_log(phba, KERN_ERR, LOG_INIT,
4351 "3111 lpfc_link_speed of %d cannot "
4352 "support loop mode, setting topology to default.\n",
4353 val);
4354 phba->cfg_topology = 0;
4355 }
James Smartfbd8a6b2018-02-22 08:18:45 -08004356
4357 switch (val) {
4358 case LPFC_USER_LINK_SPEED_AUTO:
4359 case LPFC_USER_LINK_SPEED_1G:
4360 case LPFC_USER_LINK_SPEED_2G:
4361 case LPFC_USER_LINK_SPEED_4G:
4362 case LPFC_USER_LINK_SPEED_8G:
4363 case LPFC_USER_LINK_SPEED_16G:
4364 case LPFC_USER_LINK_SPEED_32G:
4365 case LPFC_USER_LINK_SPEED_64G:
James Smart83108bd2008-01-11 01:53:09 -05004366 phba->cfg_link_speed = val;
4367 return 0;
James Smartfbd8a6b2018-02-22 08:18:45 -08004368 default:
4369 lpfc_printf_log(phba, KERN_ERR, LOG_INIT,
4370 "0405 lpfc_link_speed attribute cannot "
4371 "be set to %d, allowed values are "
4372 "["LPFC_LINK_SPEED_STRING"]\n", val);
4373 phba->cfg_link_speed = LPFC_USER_LINK_SPEED_AUTO;
4374 return -EINVAL;
James Smart83108bd2008-01-11 01:53:09 -05004375 }
James Smart83108bd2008-01-11 01:53:09 -05004376}
4377
Joe Perchesb6b996b2017-12-19 10:15:07 -08004378static DEVICE_ATTR_RW(lpfc_link_speed);
dea31012005-04-17 16:05:31 -05004379
4380/*
James Smart0d878412009-10-02 15:16:56 -04004381# lpfc_aer_support: Support PCIe device Advanced Error Reporting (AER)
4382# 0 = aer disabled or not supported
4383# 1 = aer supported and enabled (default)
4384# Value range is [0,1]. Default value is 1.
4385*/
James Smart506139a2016-10-13 15:06:09 -07004386LPFC_ATTR(aer_support, 1, 0, 1,
4387 "Enable PCIe device AER support");
4388lpfc_param_show(aer_support)
James Smart0d878412009-10-02 15:16:56 -04004389
4390/**
4391 * lpfc_aer_support_store - Set the adapter for aer support
4392 *
4393 * @dev: class device that is converted into a Scsi_host.
4394 * @attr: device attribute, not used.
James Smart912e3ac2011-05-24 11:42:11 -04004395 * @buf: containing enable or disable aer flag.
James Smart0d878412009-10-02 15:16:56 -04004396 * @count: unused variable.
4397 *
4398 * Description:
4399 * If the val is 1 and currently the device's AER capability was not
4400 * enabled, invoke the kernel's enable AER helper routine, trying to
4401 * enable the device's AER capability. If the helper routine enabling
4402 * AER returns success, update the device's cfg_aer_support flag to
4403 * indicate AER is supported by the device; otherwise, if the device
4404 * AER capability is already enabled to support AER, then do nothing.
4405 *
4406 * If the val is 0 and currently the device's AER support was enabled,
4407 * invoke the kernel's disable AER helper routine. After that, update
4408 * the device's cfg_aer_support flag to indicate AER is not supported
4409 * by the device; otherwise, if the device AER capability is already
4410 * disabled from supporting AER, then do nothing.
4411 *
4412 * Returns:
4413 * length of the buf on success if val is in range the intended mode
4414 * is supported.
4415 * -EINVAL if val out of range or intended mode is not supported.
4416 **/
4417static ssize_t
4418lpfc_aer_support_store(struct device *dev, struct device_attribute *attr,
4419 const char *buf, size_t count)
4420{
4421 struct Scsi_Host *shost = class_to_shost(dev);
4422 struct lpfc_vport *vport = (struct lpfc_vport *)shost->hostdata;
4423 struct lpfc_hba *phba = vport->phba;
4424 int val = 0, rc = -EINVAL;
4425
4426 if (!isdigit(buf[0]))
4427 return -EINVAL;
4428 if (sscanf(buf, "%i", &val) != 1)
4429 return -EINVAL;
4430
4431 switch (val) {
4432 case 0:
4433 if (phba->hba_flag & HBA_AER_ENABLED) {
4434 rc = pci_disable_pcie_error_reporting(phba->pcidev);
4435 if (!rc) {
4436 spin_lock_irq(&phba->hbalock);
4437 phba->hba_flag &= ~HBA_AER_ENABLED;
4438 spin_unlock_irq(&phba->hbalock);
4439 phba->cfg_aer_support = 0;
4440 rc = strlen(buf);
4441 } else
James Smart891478a2009-11-18 15:40:23 -05004442 rc = -EPERM;
4443 } else {
James Smart0d878412009-10-02 15:16:56 -04004444 phba->cfg_aer_support = 0;
James Smart891478a2009-11-18 15:40:23 -05004445 rc = strlen(buf);
4446 }
James Smart0d878412009-10-02 15:16:56 -04004447 break;
4448 case 1:
4449 if (!(phba->hba_flag & HBA_AER_ENABLED)) {
4450 rc = pci_enable_pcie_error_reporting(phba->pcidev);
4451 if (!rc) {
4452 spin_lock_irq(&phba->hbalock);
4453 phba->hba_flag |= HBA_AER_ENABLED;
4454 spin_unlock_irq(&phba->hbalock);
4455 phba->cfg_aer_support = 1;
4456 rc = strlen(buf);
4457 } else
James Smart891478a2009-11-18 15:40:23 -05004458 rc = -EPERM;
4459 } else {
James Smart0d878412009-10-02 15:16:56 -04004460 phba->cfg_aer_support = 1;
James Smart891478a2009-11-18 15:40:23 -05004461 rc = strlen(buf);
4462 }
James Smart0d878412009-10-02 15:16:56 -04004463 break;
4464 default:
4465 rc = -EINVAL;
4466 break;
4467 }
4468 return rc;
4469}
4470
Joe Perchesb6b996b2017-12-19 10:15:07 -08004471static DEVICE_ATTR_RW(lpfc_aer_support);
James Smart0d878412009-10-02 15:16:56 -04004472
4473/**
4474 * lpfc_aer_cleanup_state - Clean up aer state to the aer enabled device
4475 * @dev: class device that is converted into a Scsi_host.
4476 * @attr: device attribute, not used.
James Smart912e3ac2011-05-24 11:42:11 -04004477 * @buf: containing flag 1 for aer cleanup state.
James Smart0d878412009-10-02 15:16:56 -04004478 * @count: unused variable.
4479 *
4480 * Description:
4481 * If the @buf contains 1 and the device currently has the AER support
4482 * enabled, then invokes the kernel AER helper routine
4483 * pci_cleanup_aer_uncorrect_error_status to clean up the uncorrectable
4484 * error status register.
4485 *
4486 * Notes:
4487 *
4488 * Returns:
4489 * -EINVAL if the buf does not contain the 1 or the device is not currently
4490 * enabled with the AER support.
4491 **/
4492static ssize_t
4493lpfc_aer_cleanup_state(struct device *dev, struct device_attribute *attr,
4494 const char *buf, size_t count)
4495{
4496 struct Scsi_Host *shost = class_to_shost(dev);
4497 struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata;
4498 struct lpfc_hba *phba = vport->phba;
4499 int val, rc = -1;
4500
4501 if (!isdigit(buf[0]))
4502 return -EINVAL;
4503 if (sscanf(buf, "%i", &val) != 1)
4504 return -EINVAL;
James Smart891478a2009-11-18 15:40:23 -05004505 if (val != 1)
4506 return -EINVAL;
James Smart0d878412009-10-02 15:16:56 -04004507
James Smart891478a2009-11-18 15:40:23 -05004508 if (phba->hba_flag & HBA_AER_ENABLED)
James Smart0d878412009-10-02 15:16:56 -04004509 rc = pci_cleanup_aer_uncorrect_error_status(phba->pcidev);
4510
4511 if (rc == 0)
4512 return strlen(buf);
4513 else
James Smart891478a2009-11-18 15:40:23 -05004514 return -EPERM;
James Smart0d878412009-10-02 15:16:56 -04004515}
4516
4517static DEVICE_ATTR(lpfc_aer_state_cleanup, S_IWUSR, NULL,
4518 lpfc_aer_cleanup_state);
4519
James Smart912e3ac2011-05-24 11:42:11 -04004520/**
4521 * lpfc_sriov_nr_virtfn_store - Enable the adapter for sr-iov virtual functions
4522 *
4523 * @dev: class device that is converted into a Scsi_host.
4524 * @attr: device attribute, not used.
4525 * @buf: containing the string the number of vfs to be enabled.
4526 * @count: unused variable.
4527 *
4528 * Description:
4529 * When this api is called either through user sysfs, the driver shall
4530 * try to enable or disable SR-IOV virtual functions according to the
4531 * following:
4532 *
4533 * If zero virtual function has been enabled to the physical function,
4534 * the driver shall invoke the pci enable virtual function api trying
4535 * to enable the virtual functions. If the nr_vfn provided is greater
4536 * than the maximum supported, the maximum virtual function number will
4537 * be used for invoking the api; otherwise, the nr_vfn provided shall
4538 * be used for invoking the api. If the api call returned success, the
4539 * actual number of virtual functions enabled will be set to the driver
4540 * cfg_sriov_nr_virtfn; otherwise, -EINVAL shall be returned and driver
4541 * cfg_sriov_nr_virtfn remains zero.
4542 *
4543 * If none-zero virtual functions have already been enabled to the
4544 * physical function, as reflected by the driver's cfg_sriov_nr_virtfn,
4545 * -EINVAL will be returned and the driver does nothing;
4546 *
4547 * If the nr_vfn provided is zero and none-zero virtual functions have
4548 * been enabled, as indicated by the driver's cfg_sriov_nr_virtfn, the
4549 * disabling virtual function api shall be invoded to disable all the
4550 * virtual functions and driver's cfg_sriov_nr_virtfn shall be set to
4551 * zero. Otherwise, if zero virtual function has been enabled, do
4552 * nothing.
4553 *
4554 * Returns:
4555 * length of the buf on success if val is in range the intended mode
4556 * is supported.
4557 * -EINVAL if val out of range or intended mode is not supported.
4558 **/
4559static ssize_t
4560lpfc_sriov_nr_virtfn_store(struct device *dev, struct device_attribute *attr,
4561 const char *buf, size_t count)
4562{
4563 struct Scsi_Host *shost = class_to_shost(dev);
4564 struct lpfc_vport *vport = (struct lpfc_vport *)shost->hostdata;
4565 struct lpfc_hba *phba = vport->phba;
4566 struct pci_dev *pdev = phba->pcidev;
4567 int val = 0, rc = -EINVAL;
4568
4569 /* Sanity check on user data */
4570 if (!isdigit(buf[0]))
4571 return -EINVAL;
4572 if (sscanf(buf, "%i", &val) != 1)
4573 return -EINVAL;
4574 if (val < 0)
4575 return -EINVAL;
4576
4577 /* Request disabling virtual functions */
4578 if (val == 0) {
4579 if (phba->cfg_sriov_nr_virtfn > 0) {
4580 pci_disable_sriov(pdev);
4581 phba->cfg_sriov_nr_virtfn = 0;
4582 }
4583 return strlen(buf);
4584 }
4585
4586 /* Request enabling virtual functions */
4587 if (phba->cfg_sriov_nr_virtfn > 0) {
4588 lpfc_printf_log(phba, KERN_ERR, LOG_INIT,
4589 "3018 There are %d virtual functions "
4590 "enabled on physical function.\n",
4591 phba->cfg_sriov_nr_virtfn);
4592 return -EEXIST;
4593 }
4594
4595 if (val <= LPFC_MAX_VFN_PER_PFN)
4596 phba->cfg_sriov_nr_virtfn = val;
4597 else {
4598 lpfc_printf_log(phba, KERN_ERR, LOG_INIT,
4599 "3019 Enabling %d virtual functions is not "
4600 "allowed.\n", val);
4601 return -EINVAL;
4602 }
4603
4604 rc = lpfc_sli_probe_sriov_nr_virtfn(phba, phba->cfg_sriov_nr_virtfn);
4605 if (rc) {
4606 phba->cfg_sriov_nr_virtfn = 0;
4607 rc = -EPERM;
4608 } else
4609 rc = strlen(buf);
4610
4611 return rc;
4612}
4613
James Smart0cfbbf22016-10-13 15:06:12 -07004614LPFC_ATTR(sriov_nr_virtfn, LPFC_DEF_VFN_PER_PFN, 0, LPFC_MAX_VFN_PER_PFN,
4615 "Enable PCIe device SR-IOV virtual fn");
4616
James Smart912e3ac2011-05-24 11:42:11 -04004617lpfc_param_show(sriov_nr_virtfn)
Joe Perchesb6b996b2017-12-19 10:15:07 -08004618static DEVICE_ATTR_RW(lpfc_sriov_nr_virtfn);
James Smart912e3ac2011-05-24 11:42:11 -04004619
James Smart173edbb2012-06-12 13:54:50 -04004620/**
James Smartc71ab862012-10-31 14:44:33 -04004621 * lpfc_request_firmware_store - Request for Linux generic firmware upgrade
4622 *
4623 * @dev: class device that is converted into a Scsi_host.
4624 * @attr: device attribute, not used.
4625 * @buf: containing the string the number of vfs to be enabled.
4626 * @count: unused variable.
4627 *
4628 * Description:
4629 *
4630 * Returns:
4631 * length of the buf on success if val is in range the intended mode
4632 * is supported.
4633 * -EINVAL if val out of range or intended mode is not supported.
4634 **/
4635static ssize_t
4636lpfc_request_firmware_upgrade_store(struct device *dev,
4637 struct device_attribute *attr,
4638 const char *buf, size_t count)
4639{
4640 struct Scsi_Host *shost = class_to_shost(dev);
4641 struct lpfc_vport *vport = (struct lpfc_vport *)shost->hostdata;
4642 struct lpfc_hba *phba = vport->phba;
4643 int val = 0, rc = -EINVAL;
4644
4645 /* Sanity check on user data */
4646 if (!isdigit(buf[0]))
4647 return -EINVAL;
4648 if (sscanf(buf, "%i", &val) != 1)
4649 return -EINVAL;
4650 if (val != 1)
4651 return -EINVAL;
4652
4653 rc = lpfc_sli4_request_firmware_update(phba, RUN_FW_UPGRADE);
4654 if (rc)
4655 rc = -EPERM;
4656 else
4657 rc = strlen(buf);
4658 return rc;
4659}
4660
4661static int lpfc_req_fw_upgrade;
4662module_param(lpfc_req_fw_upgrade, int, S_IRUGO|S_IWUSR);
4663MODULE_PARM_DESC(lpfc_req_fw_upgrade, "Enable Linux generic firmware upgrade");
4664lpfc_param_show(request_firmware_upgrade)
4665
4666/**
4667 * lpfc_request_firmware_upgrade_init - Enable initial linux generic fw upgrade
4668 * @phba: lpfc_hba pointer.
4669 * @val: 0 or 1.
4670 *
4671 * Description:
4672 * Set the initial Linux generic firmware upgrade enable or disable flag.
4673 *
4674 * Returns:
4675 * zero if val saved.
4676 * -EINVAL val out of range
4677 **/
4678static int
4679lpfc_request_firmware_upgrade_init(struct lpfc_hba *phba, int val)
4680{
4681 if (val >= 0 && val <= 1) {
4682 phba->cfg_request_firmware_upgrade = val;
4683 return 0;
4684 }
4685 return -EINVAL;
4686}
4687static DEVICE_ATTR(lpfc_req_fw_upgrade, S_IRUGO | S_IWUSR,
4688 lpfc_request_firmware_upgrade_show,
4689 lpfc_request_firmware_upgrade_store);
4690
4691/**
James Smart173edbb2012-06-12 13:54:50 -04004692 * lpfc_fcp_imax_store
4693 *
4694 * @dev: class device that is converted into a Scsi_host.
4695 * @attr: device attribute, not used.
4696 * @buf: string with the number of fast-path FCP interrupts per second.
4697 * @count: unused variable.
4698 *
4699 * Description:
4700 * If val is in a valid range [636,651042], then set the adapter's
4701 * maximum number of fast-path FCP interrupts per second.
4702 *
4703 * Returns:
4704 * length of the buf on success if val is in range the intended mode
4705 * is supported.
4706 * -EINVAL if val out of range or intended mode is not supported.
4707 **/
4708static ssize_t
4709lpfc_fcp_imax_store(struct device *dev, struct device_attribute *attr,
4710 const char *buf, size_t count)
4711{
4712 struct Scsi_Host *shost = class_to_shost(dev);
4713 struct lpfc_vport *vport = (struct lpfc_vport *)shost->hostdata;
4714 struct lpfc_hba *phba = vport->phba;
4715 int val = 0, i;
4716
James Smartbf8dae82012-08-03 12:36:24 -04004717 /* fcp_imax is only valid for SLI4 */
4718 if (phba->sli_rev != LPFC_SLI_REV4)
4719 return -EINVAL;
4720
James Smart173edbb2012-06-12 13:54:50 -04004721 /* Sanity check on user data */
4722 if (!isdigit(buf[0]))
4723 return -EINVAL;
4724 if (sscanf(buf, "%i", &val) != 1)
4725 return -EINVAL;
4726
James Smartbf8dae82012-08-03 12:36:24 -04004727 /*
4728 * Value range for the HBA is [5000,5000000]
4729 * The value for each EQ depends on how many EQs are configured.
James Smart895427b2017-02-12 13:52:30 -08004730 * Allow value == 0
James Smartbf8dae82012-08-03 12:36:24 -04004731 */
James Smart895427b2017-02-12 13:52:30 -08004732 if (val && (val < LPFC_MIN_IMAX || val > LPFC_MAX_IMAX))
James Smart173edbb2012-06-12 13:54:50 -04004733 return -EINVAL;
4734
4735 phba->cfg_fcp_imax = (uint32_t)val;
James Smart0cf07f842017-06-01 21:07:10 -07004736 phba->initial_imax = phba->cfg_fcp_imax;
James Smart43140ca2017-03-04 09:30:34 -08004737
4738 for (i = 0; i < phba->io_channel_irqs; i += LPFC_MAX_EQ_DELAY_EQID_CNT)
James Smart0cf07f842017-06-01 21:07:10 -07004739 lpfc_modify_hba_eq_delay(phba, i, LPFC_MAX_EQ_DELAY_EQID_CNT,
4740 val);
James Smart173edbb2012-06-12 13:54:50 -04004741
4742 return strlen(buf);
4743}
4744
4745/*
4746# lpfc_fcp_imax: The maximum number of fast-path FCP interrupts per second
James Smartbf8dae82012-08-03 12:36:24 -04004747# for the HBA.
James Smart173edbb2012-06-12 13:54:50 -04004748#
James Smartbf8dae82012-08-03 12:36:24 -04004749# Value range is [5,000 to 5,000,000]. Default value is 50,000.
James Smart173edbb2012-06-12 13:54:50 -04004750*/
James Smartbf8dae82012-08-03 12:36:24 -04004751static int lpfc_fcp_imax = LPFC_DEF_IMAX;
James Smart173edbb2012-06-12 13:54:50 -04004752module_param(lpfc_fcp_imax, int, S_IRUGO|S_IWUSR);
4753MODULE_PARM_DESC(lpfc_fcp_imax,
James Smartbf8dae82012-08-03 12:36:24 -04004754 "Set the maximum number of FCP interrupts per second per HBA");
James Smart173edbb2012-06-12 13:54:50 -04004755lpfc_param_show(fcp_imax)
4756
4757/**
4758 * lpfc_fcp_imax_init - Set the initial sr-iov virtual function enable
4759 * @phba: lpfc_hba pointer.
4760 * @val: link speed value.
4761 *
4762 * Description:
4763 * If val is in a valid range [636,651042], then initialize the adapter's
4764 * maximum number of fast-path FCP interrupts per second.
4765 *
4766 * Returns:
4767 * zero if val saved.
4768 * -EINVAL val out of range
4769 **/
4770static int
4771lpfc_fcp_imax_init(struct lpfc_hba *phba, int val)
4772{
James Smartbf8dae82012-08-03 12:36:24 -04004773 if (phba->sli_rev != LPFC_SLI_REV4) {
4774 phba->cfg_fcp_imax = 0;
4775 return 0;
4776 }
4777
James Smart895427b2017-02-12 13:52:30 -08004778 if ((val >= LPFC_MIN_IMAX && val <= LPFC_MAX_IMAX) ||
4779 (val == 0)) {
James Smart173edbb2012-06-12 13:54:50 -04004780 phba->cfg_fcp_imax = val;
4781 return 0;
4782 }
4783
4784 lpfc_printf_log(phba, KERN_ERR, LOG_INIT,
James Smart6c860682016-10-13 15:06:13 -07004785 "3016 lpfc_fcp_imax: %d out of range, using default\n",
4786 val);
James Smartbf8dae82012-08-03 12:36:24 -04004787 phba->cfg_fcp_imax = LPFC_DEF_IMAX;
James Smart173edbb2012-06-12 13:54:50 -04004788
4789 return 0;
4790}
4791
Joe Perchesb6b996b2017-12-19 10:15:07 -08004792static DEVICE_ATTR_RW(lpfc_fcp_imax);
James Smart173edbb2012-06-12 13:54:50 -04004793
James Smart0cf07f842017-06-01 21:07:10 -07004794/*
4795 * lpfc_auto_imax: Controls Auto-interrupt coalescing values support.
4796 * 0 No auto_imax support
4797 * 1 auto imax on
4798 * Auto imax will change the value of fcp_imax on a per EQ basis, using
4799 * the EQ Delay Multiplier, depending on the activity for that EQ.
4800 * Value range [0,1]. Default value is 1.
4801 */
4802LPFC_ATTR_RW(auto_imax, 1, 0, 1, "Enable Auto imax");
4803
James Smart7bb03bb2013-04-17 20:19:16 -04004804/**
4805 * lpfc_state_show - Display current driver CPU affinity
4806 * @dev: class converted to a Scsi_host structure.
4807 * @attr: device attribute, not used.
4808 * @buf: on return contains text describing the state of the link.
4809 *
4810 * Returns: size of formatted string.
4811 **/
4812static ssize_t
4813lpfc_fcp_cpu_map_show(struct device *dev, struct device_attribute *attr,
4814 char *buf)
4815{
4816 struct Scsi_Host *shost = class_to_shost(dev);
4817 struct lpfc_vport *vport = (struct lpfc_vport *)shost->hostdata;
4818 struct lpfc_hba *phba = vport->phba;
4819 struct lpfc_vector_map_info *cpup;
James Smart76fd07a2014-02-20 09:57:18 -05004820 int len = 0;
James Smart7bb03bb2013-04-17 20:19:16 -04004821
4822 if ((phba->sli_rev != LPFC_SLI_REV4) ||
4823 (phba->intr_type != MSIX))
4824 return len;
4825
4826 switch (phba->cfg_fcp_cpu_map) {
4827 case 0:
4828 len += snprintf(buf + len, PAGE_SIZE-len,
4829 "fcp_cpu_map: No mapping (%d)\n",
4830 phba->cfg_fcp_cpu_map);
4831 return len;
4832 case 1:
4833 len += snprintf(buf + len, PAGE_SIZE-len,
4834 "fcp_cpu_map: HBA centric mapping (%d): "
4835 "%d online CPUs\n",
4836 phba->cfg_fcp_cpu_map,
4837 phba->sli4_hba.num_online_cpu);
4838 break;
4839 case 2:
4840 len += snprintf(buf + len, PAGE_SIZE-len,
4841 "fcp_cpu_map: Driver centric mapping (%d): "
4842 "%d online CPUs\n",
4843 phba->cfg_fcp_cpu_map,
4844 phba->sli4_hba.num_online_cpu);
4845 break;
4846 }
4847
James Smart76fd07a2014-02-20 09:57:18 -05004848 while (phba->sli4_hba.curr_disp_cpu < phba->sli4_hba.num_present_cpu) {
4849 cpup = &phba->sli4_hba.cpu_map[phba->sli4_hba.curr_disp_cpu];
4850
4851 /* margin should fit in this and the truncated message */
James Smart7bb03bb2013-04-17 20:19:16 -04004852 if (cpup->irq == LPFC_VECTOR_MAP_EMPTY)
4853 len += snprintf(buf + len, PAGE_SIZE-len,
4854 "CPU %02d io_chan %02d "
4855 "physid %d coreid %d\n",
James Smart76fd07a2014-02-20 09:57:18 -05004856 phba->sli4_hba.curr_disp_cpu,
4857 cpup->channel_id, cpup->phys_id,
James Smart7bb03bb2013-04-17 20:19:16 -04004858 cpup->core_id);
4859 else
4860 len += snprintf(buf + len, PAGE_SIZE-len,
4861 "CPU %02d io_chan %02d "
4862 "physid %d coreid %d IRQ %d\n",
James Smart76fd07a2014-02-20 09:57:18 -05004863 phba->sli4_hba.curr_disp_cpu,
4864 cpup->channel_id, cpup->phys_id,
James Smart7bb03bb2013-04-17 20:19:16 -04004865 cpup->core_id, cpup->irq);
4866
James Smart76fd07a2014-02-20 09:57:18 -05004867 phba->sli4_hba.curr_disp_cpu++;
4868
4869 /* display max number of CPUs keeping some margin */
4870 if (phba->sli4_hba.curr_disp_cpu <
4871 phba->sli4_hba.num_present_cpu &&
4872 (len >= (PAGE_SIZE - 64))) {
4873 len += snprintf(buf + len, PAGE_SIZE-len, "more...\n");
4874 break;
4875 }
James Smart7bb03bb2013-04-17 20:19:16 -04004876 }
James Smart76fd07a2014-02-20 09:57:18 -05004877
4878 if (phba->sli4_hba.curr_disp_cpu == phba->sli4_hba.num_present_cpu)
4879 phba->sli4_hba.curr_disp_cpu = 0;
4880
James Smart7bb03bb2013-04-17 20:19:16 -04004881 return len;
4882}
4883
4884/**
4885 * lpfc_fcp_cpu_map_store - Change CPU affinity of driver vectors
4886 * @dev: class device that is converted into a Scsi_host.
4887 * @attr: device attribute, not used.
4888 * @buf: one or more lpfc_polling_flags values.
4889 * @count: not used.
4890 *
4891 * Returns:
4892 * -EINVAL - Not implemented yet.
4893 **/
4894static ssize_t
4895lpfc_fcp_cpu_map_store(struct device *dev, struct device_attribute *attr,
4896 const char *buf, size_t count)
4897{
4898 int status = -EINVAL;
4899 return status;
4900}
4901
4902/*
4903# lpfc_fcp_cpu_map: Defines how to map CPUs to IRQ vectors
4904# for the HBA.
4905#
4906# Value range is [0 to 2]. Default value is LPFC_DRIVER_CPU_MAP (2).
4907# 0 - Do not affinitze IRQ vectors
4908# 1 - Affintize HBA vectors with respect to each HBA
4909# (start with CPU0 for each HBA)
4910# 2 - Affintize HBA vectors with respect to the entire driver
4911# (round robin thru all CPUs across all HBAs)
4912*/
4913static int lpfc_fcp_cpu_map = LPFC_DRIVER_CPU_MAP;
4914module_param(lpfc_fcp_cpu_map, int, S_IRUGO|S_IWUSR);
4915MODULE_PARM_DESC(lpfc_fcp_cpu_map,
4916 "Defines how to map CPUs to IRQ vectors per HBA");
4917
4918/**
4919 * lpfc_fcp_cpu_map_init - Set the initial sr-iov virtual function enable
4920 * @phba: lpfc_hba pointer.
4921 * @val: link speed value.
4922 *
4923 * Description:
4924 * If val is in a valid range [0-2], then affinitze the adapter's
4925 * MSIX vectors.
4926 *
4927 * Returns:
4928 * zero if val saved.
4929 * -EINVAL val out of range
4930 **/
4931static int
4932lpfc_fcp_cpu_map_init(struct lpfc_hba *phba, int val)
4933{
4934 if (phba->sli_rev != LPFC_SLI_REV4) {
4935 phba->cfg_fcp_cpu_map = 0;
4936 return 0;
4937 }
4938
4939 if (val >= LPFC_MIN_CPU_MAP && val <= LPFC_MAX_CPU_MAP) {
4940 phba->cfg_fcp_cpu_map = val;
4941 return 0;
4942 }
4943
4944 lpfc_printf_log(phba, KERN_ERR, LOG_INIT,
James Smart6c860682016-10-13 15:06:13 -07004945 "3326 lpfc_fcp_cpu_map: %d out of range, using "
4946 "default\n", val);
James Smart7bb03bb2013-04-17 20:19:16 -04004947 phba->cfg_fcp_cpu_map = LPFC_DRIVER_CPU_MAP;
4948
4949 return 0;
4950}
4951
Joe Perchesb6b996b2017-12-19 10:15:07 -08004952static DEVICE_ATTR_RW(lpfc_fcp_cpu_map);
James Smart7bb03bb2013-04-17 20:19:16 -04004953
James Smart0d878412009-10-02 15:16:56 -04004954/*
dea31012005-04-17 16:05:31 -05004955# lpfc_fcp_class: Determines FC class to use for the FCP protocol.
4956# Value range is [2,3]. Default value is 3.
4957*/
James Smart3de2a652007-08-02 11:09:59 -04004958LPFC_VPORT_ATTR_R(fcp_class, 3, 2, 3,
4959 "Select Fibre Channel class of service for FCP sequences");
dea31012005-04-17 16:05:31 -05004960
4961/*
4962# lpfc_use_adisc: Use ADISC for FCP rediscovery instead of PLOGI. Value range
4963# is [0,1]. Default value is 0.
4964*/
James Smart3de2a652007-08-02 11:09:59 -04004965LPFC_VPORT_ATTR_RW(use_adisc, 0, 0, 1,
4966 "Use ADISC on rediscovery to authenticate FCP devices");
dea31012005-04-17 16:05:31 -05004967
4968/*
James Smart3cb01c52013-07-15 18:35:04 -04004969# lpfc_first_burst_size: First burst size to use on the NPorts
4970# that support first burst.
4971# Value range is [0,65536]. Default value is 0.
4972*/
4973LPFC_VPORT_ATTR_RW(first_burst_size, 0, 0, 65536,
4974 "First burst size for Targets that support first burst");
4975
4976/*
James Smart2d7dbc42017-02-12 13:52:35 -08004977* lpfc_nvmet_fb_size: NVME Target mode supported first burst size.
4978* When the driver is configured as an NVME target, this value is
4979* communicated to the NVME initiator in the PRLI response. It is
4980* used only when the lpfc_nvme_enable_fb and lpfc_nvmet_support
4981* parameters are set and the target is sending the PRLI RSP.
James Smart895427b2017-02-12 13:52:30 -08004982* Parameter supported on physical port only - no NPIV support.
James Smart2d7dbc42017-02-12 13:52:35 -08004983* Value range is [0,65536]. Default value is 0.
James Smart895427b2017-02-12 13:52:30 -08004984*/
James Smart2d7dbc42017-02-12 13:52:35 -08004985LPFC_ATTR_RW(nvmet_fb_size, 0, 0, 65536,
4986 "NVME Target mode first burst size in 512B increments.");
4987
4988/*
4989 * lpfc_nvme_enable_fb: Enable NVME first burst on I and T functions.
4990 * For the Initiator (I), enabling this parameter means that an NVMET
4991 * PRLI response with FBA enabled and an FB_SIZE set to a nonzero value will be
4992 * processed by the initiator for subsequent NVME FCP IO. For the target
4993 * function (T), enabling this parameter qualifies the lpfc_nvmet_fb_size
4994 * driver parameter as the target function's first burst size returned to the
4995 * initiator in the target's NVME PRLI response. Parameter supported on physical
4996 * port only - no NPIV support.
4997 * Value range is [0,1]. Default value is 0 (disabled).
4998 */
James Smart895427b2017-02-12 13:52:30 -08004999LPFC_ATTR_RW(nvme_enable_fb, 0, 0, 1,
5000 "Enable First Burst feature on I and T functions.");
5001
5002/*
James Smart977b5a02008-09-07 11:52:04 -04005003# lpfc_max_scsicmpl_time: Use scsi command completion time to control I/O queue
5004# depth. Default value is 0. When the value of this parameter is zero the
5005# SCSI command completion time is not used for controlling I/O queue depth. When
5006# the parameter is set to a non-zero value, the I/O queue depth is controlled
5007# to limit the I/O completion time to the parameter value.
5008# The value is set in milliseconds.
5009*/
James Smarted5b1522016-10-13 15:06:11 -07005010LPFC_VPORT_ATTR(max_scsicmpl_time, 0, 0, 60000,
James Smart977b5a02008-09-07 11:52:04 -04005011 "Use command completion time to control queue depth");
James Smarted5b1522016-10-13 15:06:11 -07005012
James Smart977b5a02008-09-07 11:52:04 -04005013lpfc_vport_param_show(max_scsicmpl_time);
James Smart977b5a02008-09-07 11:52:04 -04005014static int
5015lpfc_max_scsicmpl_time_set(struct lpfc_vport *vport, int val)
5016{
5017 struct Scsi_Host *shost = lpfc_shost_from_vport(vport);
5018 struct lpfc_nodelist *ndlp, *next_ndlp;
5019
5020 if (val == vport->cfg_max_scsicmpl_time)
5021 return 0;
5022 if ((val < 0) || (val > 60000))
5023 return -EINVAL;
5024 vport->cfg_max_scsicmpl_time = val;
5025
5026 spin_lock_irq(shost->host_lock);
5027 list_for_each_entry_safe(ndlp, next_ndlp, &vport->fc_nodes, nlp_listp) {
5028 if (!NLP_CHK_NODE_ACT(ndlp))
5029 continue;
5030 if (ndlp->nlp_state == NLP_STE_UNUSED_NODE)
5031 continue;
James Smart7dc517d2010-07-14 15:32:10 -04005032 ndlp->cmd_qdepth = vport->cfg_tgt_queue_depth;
James Smart977b5a02008-09-07 11:52:04 -04005033 }
5034 spin_unlock_irq(shost->host_lock);
5035 return 0;
5036}
5037lpfc_vport_param_store(max_scsicmpl_time);
Joe Perchesb6b996b2017-12-19 10:15:07 -08005038static DEVICE_ATTR_RW(lpfc_max_scsicmpl_time);
James Smart977b5a02008-09-07 11:52:04 -04005039
5040/*
dea31012005-04-17 16:05:31 -05005041# lpfc_ack0: Use ACK0, instead of ACK1 for class 2 acknowledgement. Value
5042# range is [0,1]. Default value is 0.
5043*/
5044LPFC_ATTR_R(ack0, 0, 0, 1, "Enable ACK0 support");
5045
5046/*
James Smart895427b2017-02-12 13:52:30 -08005047 * lpfc_io_sched: Determine scheduling algrithmn for issuing FCP cmds
5048 * range is [0,1]. Default value is 0.
5049 * For [0], FCP commands are issued to Work Queues ina round robin fashion.
5050 * For [1], FCP commands are issued to a Work Queue associated with the
5051 * current CPU.
5052 *
5053 * LPFC_FCP_SCHED_ROUND_ROBIN == 0
5054 * LPFC_FCP_SCHED_BY_CPU == 1
5055 *
5056 * The driver dynamically sets this to 1 (BY_CPU) if it's able to set up cpu
5057 * affinity for FCP/NVME I/Os through Work Queues associated with the current
5058 * CPU. Otherwise, the default 0 (Round Robin) scheduling of FCP/NVME I/Os
5059 * through WQs will be used.
5060 */
5061LPFC_ATTR_RW(fcp_io_sched, LPFC_FCP_SCHED_ROUND_ROBIN,
5062 LPFC_FCP_SCHED_ROUND_ROBIN,
5063 LPFC_FCP_SCHED_BY_CPU,
5064 "Determine scheduling algorithm for "
5065 "issuing commands [0] - Round Robin, [1] - Current CPU");
James Smart49aa1432012-08-03 12:36:42 -04005066
5067/*
James Smarta6571c62012-10-31 14:44:42 -04005068# lpfc_fcp2_no_tgt_reset: Determine bus reset behavior
5069# range is [0,1]. Default value is 0.
5070# For [0], bus reset issues target reset to ALL devices
5071# For [1], bus reset issues target reset to non-FCP2 devices
5072*/
5073LPFC_ATTR_RW(fcp2_no_tgt_reset, 0, 0, 1, "Determine bus reset behavior for "
5074 "FCP2 devices [0] - issue tgt reset, [1] - no tgt reset");
5075
5076
5077/*
dea31012005-04-17 16:05:31 -05005078# lpfc_cr_delay & lpfc_cr_count: Default values for I/O colaesing
5079# cr_delay (msec) or cr_count outstanding commands. cr_delay can take
James Smart7054a602007-04-25 09:52:34 -04005080# value [0,63]. cr_count can take value [1,255]. Default value of cr_delay
dea31012005-04-17 16:05:31 -05005081# is 0. Default value of cr_count is 1. The cr_count feature is disabled if
5082# cr_delay is set to 0.
5083*/
Jamie Wellnitz8189fd12006-02-28 19:25:35 -05005084LPFC_ATTR_RW(cr_delay, 0, 0, 63, "A count of milliseconds after which an "
dea31012005-04-17 16:05:31 -05005085 "interrupt response is generated");
5086
Jamie Wellnitz8189fd12006-02-28 19:25:35 -05005087LPFC_ATTR_RW(cr_count, 1, 1, 255, "A count of I/O completions after which an "
dea31012005-04-17 16:05:31 -05005088 "interrupt response is generated");
5089
5090/*
Jamie Wellnitzcf5bf972006-02-28 22:33:08 -05005091# lpfc_multi_ring_support: Determines how many rings to spread available
5092# cmd/rsp IOCB entries across.
5093# Value range is [1,2]. Default value is 1.
5094*/
5095LPFC_ATTR_R(multi_ring_support, 1, 1, 2, "Determines number of primary "
5096 "SLI rings to spread IOCB entries across");
5097
5098/*
James Smarta4bc3372006-12-02 13:34:16 -05005099# lpfc_multi_ring_rctl: If lpfc_multi_ring_support is enabled, this
5100# identifies what rctl value to configure the additional ring for.
5101# Value range is [1,0xff]. Default value is 4 (Unsolicated Data).
5102*/
James Smart6a9c52c2009-10-02 15:16:51 -04005103LPFC_ATTR_R(multi_ring_rctl, FC_RCTL_DD_UNSOL_DATA, 1,
James Smarta4bc3372006-12-02 13:34:16 -05005104 255, "Identifies RCTL for additional ring configuration");
5105
5106/*
5107# lpfc_multi_ring_type: If lpfc_multi_ring_support is enabled, this
5108# identifies what type value to configure the additional ring for.
5109# Value range is [1,0xff]. Default value is 5 (LLC/SNAP).
5110*/
James Smart6a9c52c2009-10-02 15:16:51 -04005111LPFC_ATTR_R(multi_ring_type, FC_TYPE_IP, 1,
James Smarta4bc3372006-12-02 13:34:16 -05005112 255, "Identifies TYPE for additional ring configuration");
5113
5114/*
James Smart4258e982015-12-16 18:11:58 -05005115# lpfc_enable_SmartSAN: Sets up FDMI support for SmartSAN
5116# 0 = SmartSAN functionality disabled (default)
5117# 1 = SmartSAN functionality enabled
5118# This parameter will override the value of lpfc_fdmi_on module parameter.
5119# Value range is [0,1]. Default value is 0.
dea31012005-04-17 16:05:31 -05005120*/
James Smart4258e982015-12-16 18:11:58 -05005121LPFC_ATTR_R(enable_SmartSAN, 0, 0, 1, "Enable SmartSAN functionality");
5122
5123/*
5124# lpfc_fdmi_on: Controls FDMI support.
5125# 0 No FDMI support (default)
5126# 1 Traditional FDMI support
James Smart8663cbb2016-03-31 14:12:33 -07005127# Traditional FDMI support means the driver will assume FDMI-2 support;
5128# however, if that fails, it will fallback to FDMI-1.
5129# If lpfc_enable_SmartSAN is set to 1, the driver ignores lpfc_fdmi_on.
5130# If lpfc_enable_SmartSAN is set 0, the driver uses the current value of
5131# lpfc_fdmi_on.
5132# Value range [0,1]. Default value is 0.
James Smart4258e982015-12-16 18:11:58 -05005133*/
James Smart8663cbb2016-03-31 14:12:33 -07005134LPFC_ATTR_R(fdmi_on, 0, 0, 1, "Enable FDMI support");
dea31012005-04-17 16:05:31 -05005135
5136/*
5137# Specifies the maximum number of ELS cmds we can have outstanding (for
5138# discovery). Value range is [1,64]. Default value = 32.
5139*/
James Smart3de2a652007-08-02 11:09:59 -04005140LPFC_VPORT_ATTR(discovery_threads, 32, 1, 64, "Maximum number of ELS commands "
dea31012005-04-17 16:05:31 -05005141 "during discovery");
5142
5143/*
James Smartc4a7c922013-05-31 17:04:59 -04005144# lpfc_max_luns: maximum allowed LUN ID. This is the highest LUN ID that
5145# will be scanned by the SCSI midlayer when sequential scanning is
5146# used; and is also the highest LUN ID allowed when the SCSI midlayer
5147# parses REPORT_LUN responses. The lpfc driver has no LUN count or
5148# LUN ID limit, but the SCSI midlayer requires this field for the uses
5149# above. The lpfc driver limits the default value to 255 for two reasons.
5150# As it bounds the sequential scan loop, scanning for thousands of luns
5151# on a target can take minutes of wall clock time. Additionally,
5152# there are FC targets, such as JBODs, that only recognize 8-bits of
5153# LUN ID. When they receive a value greater than 8 bits, they chop off
5154# the high order bits. In other words, they see LUN IDs 0, 256, 512,
5155# and so on all as LUN ID 0. This causes the linux kernel, which sees
5156# valid responses at each of the LUN IDs, to believe there are multiple
5157# devices present, when in fact, there is only 1.
5158# A customer that is aware of their target behaviors, and the results as
5159# indicated above, is welcome to increase the lpfc_max_luns value.
5160# As mentioned, this value is not used by the lpfc driver, only the
5161# SCSI midlayer.
James Smart65a29c12006-07-06 15:50:50 -04005162# Value range is [0,65535]. Default value is 255.
5163# NOTE: The SCSI layer might probe all allowed LUN on some old targets.
dea31012005-04-17 16:05:31 -05005164*/
Hannes Reinecke1abf6352014-06-25 15:27:38 +02005165LPFC_VPORT_ULL_ATTR_R(max_luns, 255, 0, 65535, "Maximum allowed LUN ID");
dea31012005-04-17 16:05:31 -05005166
James.Smart@Emulex.Com875fbdf2005-11-29 16:32:13 -05005167/*
5168# lpfc_poll_tmo: .Milliseconds driver will wait between polling FCP ring.
5169# Value range is [1,255], default value is 10.
5170*/
5171LPFC_ATTR_RW(poll_tmo, 10, 1, 255,
5172 "Milliseconds driver will wait between polling FCP ring");
5173
James Smart4ff43242006-12-02 13:34:56 -05005174/*
James Smart0c411222013-09-06 12:22:46 -04005175# lpfc_task_mgmt_tmo: Maximum time to wait for task management commands
5176# to complete in seconds. Value range is [5,180], default value is 60.
5177*/
5178LPFC_ATTR_RW(task_mgmt_tmo, 60, 5, 180,
5179 "Maximum time to wait for task management commands to complete");
5180/*
James Smart4ff43242006-12-02 13:34:56 -05005181# lpfc_use_msi: Use MSI (Message Signaled Interrupts) in systems that
5182# support this feature
George Kadianakis8605c462010-01-17 21:19:31 +02005183# 0 = MSI disabled
James Smart4ff43242006-12-02 13:34:56 -05005184# 1 = MSI enabled
George Kadianakis8605c462010-01-17 21:19:31 +02005185# 2 = MSI-X enabled (default)
5186# Value range is [0,2]. Default value is 2.
James Smart4ff43242006-12-02 13:34:56 -05005187*/
George Kadianakis8605c462010-01-17 21:19:31 +02005188LPFC_ATTR_R(use_msi, 2, 0, 2, "Use Message Signaled Interrupts (1) or "
James Smartdb2378e2008-02-08 18:49:51 -05005189 "MSI-X (2), if possible");
James Smart4ff43242006-12-02 13:34:56 -05005190
James Smart13815c82008-01-11 01:52:48 -05005191/*
James Smartf358dd02017-02-12 13:52:34 -08005192 * lpfc_nvme_oas: Use the oas bit when sending NVME/NVMET IOs
James Smart895427b2017-02-12 13:52:30 -08005193 *
5194 * 0 = NVME OAS disabled
5195 * 1 = NVME OAS enabled
5196 *
5197 * Value range is [0,1]. Default value is 0.
5198 */
5199LPFC_ATTR_RW(nvme_oas, 0, 0, 1,
5200 "Use OAS bit on NVME IOs");
5201
5202/*
James Smart4e565cf2018-02-22 08:18:50 -08005203 * lpfc_nvme_embed_cmd: Use the oas bit when sending NVME/NVMET IOs
5204 *
5205 * 0 = Put NVME Command in SGL
5206 * 1 = Embed NVME Command in WQE (unless G7)
5207 * 2 = Embed NVME Command in WQE (force)
5208 *
5209 * Value range is [0,2]. Default value is 1.
5210 */
5211LPFC_ATTR_RW(nvme_embed_cmd, 1, 0, 2,
5212 "Embed NVME Command in WQE");
5213
5214/*
James Smart895427b2017-02-12 13:52:30 -08005215 * lpfc_fcp_io_channel: Set the number of FCP IO channels the driver
5216 * will advertise it supports to the SCSI layer. This also will map to
5217 * the number of WQs the driver will create.
5218 *
5219 * 0 = Configure the number of io channels to the number of active CPUs.
5220 * 1,32 = Manually specify how many io channels to use.
5221 *
5222 * Value range is [0,32]. Default value is 4.
5223 */
5224LPFC_ATTR_R(fcp_io_channel,
5225 LPFC_FCP_IO_CHAN_DEF,
5226 LPFC_HBA_IO_CHAN_MIN, LPFC_HBA_IO_CHAN_MAX,
James Smart67d12732012-08-03 12:36:13 -04005227 "Set the number of FCP I/O channels");
5228
5229/*
James Smart895427b2017-02-12 13:52:30 -08005230 * lpfc_nvme_io_channel: Set the number of IO hardware queues the driver
5231 * will advertise it supports to the NVME layer. This also will map to
5232 * the number of WQs the driver will create.
5233 *
5234 * This module parameter is valid when lpfc_enable_fc4_type is set
5235 * to support NVME.
5236 *
5237 * The NVME Layer will try to create this many, plus 1 administrative
5238 * hardware queue. The administrative queue will always map to WQ 0
5239 * A hardware IO queue maps (qidx) to a specific driver WQ.
5240 *
5241 * 0 = Configure the number of io channels to the number of active CPUs.
5242 * 1,32 = Manually specify how many io channels to use.
5243 *
5244 * Value range is [0,32]. Default value is 0.
5245 */
5246LPFC_ATTR_R(nvme_io_channel,
5247 LPFC_NVME_IO_CHAN_DEF,
5248 LPFC_HBA_IO_CHAN_MIN, LPFC_HBA_IO_CHAN_MAX,
5249 "Set the number of NVME I/O channels");
5250
5251/*
James Smart13815c82008-01-11 01:52:48 -05005252# lpfc_enable_hba_reset: Allow or prevent HBA resets to the hardware.
5253# 0 = HBA resets disabled
5254# 1 = HBA resets enabled (default)
5255# Value range is [0,1]. Default value is 1.
5256*/
5257LPFC_ATTR_R(enable_hba_reset, 1, 0, 1, "Enable HBA resets from the driver.");
James Smartc3f28af2006-08-18 17:47:18 -04005258
James Smart13815c82008-01-11 01:52:48 -05005259/*
James Smarteb7a3392010-11-20 23:12:02 -05005260# lpfc_enable_hba_heartbeat: Disable HBA heartbeat timer..
James Smart13815c82008-01-11 01:52:48 -05005261# 0 = HBA Heartbeat disabled
5262# 1 = HBA Heartbeat enabled (default)
5263# Value range is [0,1]. Default value is 1.
5264*/
James Smarteb7a3392010-11-20 23:12:02 -05005265LPFC_ATTR_R(enable_hba_heartbeat, 0, 0, 1, "Enable HBA Heartbeat.");
James Smart92d7f7b2007-06-17 19:56:38 -05005266
James Smart83108bd2008-01-11 01:53:09 -05005267/*
James Smart1ba981f2014-02-20 09:56:45 -05005268# lpfc_EnableXLane: Enable Express Lane Feature
5269# 0x0 Express Lane Feature disabled
5270# 0x1 Express Lane Feature enabled
5271# Value range is [0,1]. Default value is 0.
5272*/
5273LPFC_ATTR_R(EnableXLane, 0, 0, 1, "Enable Express Lane Feature.");
5274
5275/*
5276# lpfc_XLanePriority: Define CS_CTL priority for Express Lane Feature
5277# 0x0 - 0x7f = CS_CTL field in FC header (high 7 bits)
5278# Value range is [0x0,0x7f]. Default value is 0
5279*/
James Smart28d7f3d2014-05-21 08:05:28 -04005280LPFC_ATTR_RW(XLanePriority, 0, 0x0, 0x7f, "CS_CTL for Express Lane Feature.");
James Smart1ba981f2014-02-20 09:56:45 -05005281
5282/*
James Smart81301a92008-12-04 22:39:46 -05005283# lpfc_enable_bg: Enable BlockGuard (Emulex's Implementation of T10-DIF)
5284# 0 = BlockGuard disabled (default)
5285# 1 = BlockGuard enabled
5286# Value range is [0,1]. Default value is 0.
5287*/
5288LPFC_ATTR_R(enable_bg, 0, 0, 1, "Enable BlockGuard Support");
5289
James Smart6fb120a2009-05-22 14:52:59 -04005290/*
James Smartba20c852012-08-03 12:36:52 -04005291# lpfc_fcp_look_ahead: Look ahead for completions in FCP start routine
5292# 0 = disabled (default)
5293# 1 = enabled
5294# Value range is [0,1]. Default value is 0.
James Smart5688d672013-04-17 20:17:13 -04005295#
5296# This feature in under investigation and may be supported in the future.
James Smartba20c852012-08-03 12:36:52 -04005297*/
5298unsigned int lpfc_fcp_look_ahead = LPFC_LOOK_AHEAD_OFF;
5299
James Smartba20c852012-08-03 12:36:52 -04005300/*
James Smart81301a92008-12-04 22:39:46 -05005301# lpfc_prot_mask: i
5302# - Bit mask of host protection capabilities used to register with the
5303# SCSI mid-layer
5304# - Only meaningful if BG is turned on (lpfc_enable_bg=1).
5305# - Allows you to ultimately specify which profiles to use
5306# - Default will result in registering capabilities for all profiles.
James Smart005ffa72012-09-29 11:29:17 -04005307# - SHOST_DIF_TYPE1_PROTECTION 1
5308# HBA supports T10 DIF Type 1: HBA to Target Type 1 Protection
5309# - SHOST_DIX_TYPE0_PROTECTION 8
5310# HBA supports DIX Type 0: Host to HBA protection only
5311# - SHOST_DIX_TYPE1_PROTECTION 16
5312# HBA supports DIX Type 1: Host to HBA Type 1 protection
James Smart81301a92008-12-04 22:39:46 -05005313#
5314*/
James Smartb3b98b72016-10-13 15:06:06 -07005315LPFC_ATTR(prot_mask,
5316 (SHOST_DIF_TYPE1_PROTECTION |
5317 SHOST_DIX_TYPE0_PROTECTION |
5318 SHOST_DIX_TYPE1_PROTECTION),
5319 0,
5320 (SHOST_DIF_TYPE1_PROTECTION |
5321 SHOST_DIX_TYPE0_PROTECTION |
5322 SHOST_DIX_TYPE1_PROTECTION),
5323 "T10-DIF host protection capabilities mask");
James Smart81301a92008-12-04 22:39:46 -05005324
5325/*
5326# lpfc_prot_guard: i
5327# - Bit mask of protection guard types to register with the SCSI mid-layer
James Smart005ffa72012-09-29 11:29:17 -04005328# - Guard types are currently either 1) T10-DIF CRC 2) IP checksum
James Smart81301a92008-12-04 22:39:46 -05005329# - Allows you to ultimately specify which profiles to use
5330# - Default will result in registering capabilities for all guard types
5331#
5332*/
James Smartb3b98b72016-10-13 15:06:06 -07005333LPFC_ATTR(prot_guard,
5334 SHOST_DIX_GUARD_IP, SHOST_DIX_GUARD_CRC, SHOST_DIX_GUARD_IP,
5335 "T10-DIF host protection guard type");
James Smart81301a92008-12-04 22:39:46 -05005336
James Smart92494142011-02-16 12:39:44 -05005337/*
5338 * Delay initial NPort discovery when Clean Address bit is cleared in
5339 * FLOGI/FDISC accept and FCID/Fabric name/Fabric portname is changed.
5340 * This parameter can have value 0 or 1.
5341 * When this parameter is set to 0, no delay is added to the initial
5342 * discovery.
5343 * When this parameter is set to non-zero value, initial Nport discovery is
5344 * delayed by ra_tov seconds when Clean Address bit is cleared in FLOGI/FDISC
5345 * accept and FCID/Fabric name/Fabric portname is changed.
5346 * Driver always delay Nport discovery for subsequent FLOGI/FDISC completion
5347 * when Clean Address bit is cleared in FLOGI/FDISC
5348 * accept and FCID/Fabric name/Fabric portname is changed.
5349 * Default value is 0.
5350 */
James Smart8eb8b962016-07-06 12:36:08 -07005351LPFC_ATTR(delay_discovery, 0, 0, 1,
5352 "Delay NPort discovery when Clean Address bit is cleared.");
James Smart81301a92008-12-04 22:39:46 -05005353
5354/*
James Smart3621a712009-04-06 18:47:14 -04005355 * lpfc_sg_seg_cnt - Initial Maximum DMA Segment Count
James Smart96f70772013-04-17 20:16:15 -04005356 * This value can be set to values between 64 and 4096. The default value is
James Smart83108bd2008-01-11 01:53:09 -05005357 * 64, but may be increased to allow for larger Max I/O sizes. The scsi layer
5358 * will be allowed to request I/Os of sizes up to (MAX_SEG_COUNT * SEG_SIZE).
James Smart96f70772013-04-17 20:16:15 -04005359 * Because of the additional overhead involved in setting up T10-DIF,
5360 * this parameter will be limited to 128 if BlockGuard is enabled under SLI4
5361 * and will be limited to 512 if BlockGuard is enabled under SLI3.
James Smart83108bd2008-01-11 01:53:09 -05005362 */
James Smartb996ce32017-12-19 10:57:50 -08005363LPFC_ATTR_R(sg_seg_cnt, LPFC_DEFAULT_SG_SEG_CNT, LPFC_MIN_SG_SEG_CNT,
James Smart83108bd2008-01-11 01:53:09 -05005364 LPFC_MAX_SG_SEG_CNT, "Max Scatter Gather Segment Count");
5365
James Smart96f70772013-04-17 20:16:15 -04005366/*
James Smart7bdedb32016-07-06 12:36:00 -07005367 * lpfc_enable_mds_diags: Enable MDS Diagnostics
5368 * 0 = MDS Diagnostics disabled (default)
5369 * 1 = MDS Diagnostics enabled
5370 * Value range is [0,1]. Default value is 0.
5371 */
5372LPFC_ATTR_R(enable_mds_diags, 0, 0, 1, "Enable MDS Diagnostics");
5373
James Smart44fd7fe2017-08-23 16:55:47 -07005374/*
5375 * lpfc_enable_bbcr: Enable BB Credit Recovery
5376 * 0 = BB Credit Recovery disabled
5377 * 1 = BB Credit Recovery enabled (default)
5378 * Value range is [0,1]. Default value is 1.
5379 */
5380LPFC_BBCR_ATTR_RW(enable_bbcr, 1, 0, 1, "Enable BBC Recovery");
5381
James Smart1351e692018-02-22 08:18:43 -08005382/*
5383 * lpfc_enable_dpp: Enable DPP on G7
5384 * 0 = DPP on G7 disabled
5385 * 1 = DPP on G7 enabled (default)
5386 * Value range is [0,1]. Default value is 1.
5387 */
5388LPFC_ATTR_RW(enable_dpp, 1, 0, 1, "Enable Direct Packet Push");
5389
James Smart414abe02018-06-26 08:24:26 -07005390/*
5391 * lpfc_enable_pbde: Enable PBDE on PRISM - G7
5392 * 0 = PBDE on G7 disabled
5393 * 1 = PBDE on G7 enabled (default)
5394 * Value range is [0,1]. Default value is 1
5395 */
5396LPFC_ATTR_R(enable_pbde, 1, 0, 1, "Enable PBDE support on PRISM");
5397
Tony Jonesee959b02008-02-22 00:13:36 +01005398struct device_attribute *lpfc_hba_attrs[] = {
James Smart895427b2017-02-12 13:52:30 -08005399 &dev_attr_nvme_info,
James Smart81301a92008-12-04 22:39:46 -05005400 &dev_attr_bg_info,
5401 &dev_attr_bg_guard_err,
5402 &dev_attr_bg_apptag_err,
5403 &dev_attr_bg_reftag_err,
Tony Jonesee959b02008-02-22 00:13:36 +01005404 &dev_attr_info,
5405 &dev_attr_serialnum,
5406 &dev_attr_modeldesc,
5407 &dev_attr_modelname,
5408 &dev_attr_programtype,
5409 &dev_attr_portnum,
5410 &dev_attr_fwrev,
5411 &dev_attr_hdw,
5412 &dev_attr_option_rom_version,
Hannes Reineckebbd1ae42008-03-18 14:32:28 +01005413 &dev_attr_link_state,
Tony Jonesee959b02008-02-22 00:13:36 +01005414 &dev_attr_num_discovered_ports,
James Smart84774a42008-08-24 21:50:06 -04005415 &dev_attr_menlo_mgmt_mode,
Tony Jonesee959b02008-02-22 00:13:36 +01005416 &dev_attr_lpfc_drvr_version,
James Smart45ed1192009-10-02 15:17:02 -04005417 &dev_attr_lpfc_enable_fip,
Tony Jonesee959b02008-02-22 00:13:36 +01005418 &dev_attr_lpfc_temp_sensor,
5419 &dev_attr_lpfc_log_verbose,
5420 &dev_attr_lpfc_lun_queue_depth,
James Smart7dc517d2010-07-14 15:32:10 -04005421 &dev_attr_lpfc_tgt_queue_depth,
Tony Jonesee959b02008-02-22 00:13:36 +01005422 &dev_attr_lpfc_hba_queue_depth,
5423 &dev_attr_lpfc_peer_port_login,
5424 &dev_attr_lpfc_nodev_tmo,
5425 &dev_attr_lpfc_devloss_tmo,
James Smart895427b2017-02-12 13:52:30 -08005426 &dev_attr_lpfc_enable_fc4_type,
5427 &dev_attr_lpfc_xri_split,
Tony Jonesee959b02008-02-22 00:13:36 +01005428 &dev_attr_lpfc_fcp_class,
5429 &dev_attr_lpfc_use_adisc,
James Smart3cb01c52013-07-15 18:35:04 -04005430 &dev_attr_lpfc_first_burst_size,
Tony Jonesee959b02008-02-22 00:13:36 +01005431 &dev_attr_lpfc_ack0,
5432 &dev_attr_lpfc_topology,
5433 &dev_attr_lpfc_scan_down,
5434 &dev_attr_lpfc_link_speed,
James Smart49aa1432012-08-03 12:36:42 -04005435 &dev_attr_lpfc_fcp_io_sched,
James Smarta6571c62012-10-31 14:44:42 -04005436 &dev_attr_lpfc_fcp2_no_tgt_reset,
Tony Jonesee959b02008-02-22 00:13:36 +01005437 &dev_attr_lpfc_cr_delay,
5438 &dev_attr_lpfc_cr_count,
5439 &dev_attr_lpfc_multi_ring_support,
5440 &dev_attr_lpfc_multi_ring_rctl,
5441 &dev_attr_lpfc_multi_ring_type,
5442 &dev_attr_lpfc_fdmi_on,
James Smart4258e982015-12-16 18:11:58 -05005443 &dev_attr_lpfc_enable_SmartSAN,
Tony Jonesee959b02008-02-22 00:13:36 +01005444 &dev_attr_lpfc_max_luns,
5445 &dev_attr_lpfc_enable_npiv,
James Smart7d791df2011-07-22 18:37:52 -04005446 &dev_attr_lpfc_fcf_failover_policy,
James Smart19ca7602010-11-20 23:11:55 -05005447 &dev_attr_lpfc_enable_rrq,
Tony Jonesee959b02008-02-22 00:13:36 +01005448 &dev_attr_nport_evt_cnt,
5449 &dev_attr_board_mode,
5450 &dev_attr_max_vpi,
5451 &dev_attr_used_vpi,
5452 &dev_attr_max_rpi,
5453 &dev_attr_used_rpi,
5454 &dev_attr_max_xri,
5455 &dev_attr_used_xri,
5456 &dev_attr_npiv_info,
5457 &dev_attr_issue_reset,
5458 &dev_attr_lpfc_poll,
5459 &dev_attr_lpfc_poll_tmo,
James Smart0c411222013-09-06 12:22:46 -04005460 &dev_attr_lpfc_task_mgmt_tmo,
Tony Jonesee959b02008-02-22 00:13:36 +01005461 &dev_attr_lpfc_use_msi,
James Smart895427b2017-02-12 13:52:30 -08005462 &dev_attr_lpfc_nvme_oas,
James Smart4e565cf2018-02-22 08:18:50 -08005463 &dev_attr_lpfc_nvme_embed_cmd,
James Smart0cf07f842017-06-01 21:07:10 -07005464 &dev_attr_lpfc_auto_imax,
James Smartda0436e2009-05-22 14:51:39 -04005465 &dev_attr_lpfc_fcp_imax,
James Smart7bb03bb2013-04-17 20:19:16 -04005466 &dev_attr_lpfc_fcp_cpu_map,
James Smart67d12732012-08-03 12:36:13 -04005467 &dev_attr_lpfc_fcp_io_channel,
James Smartf358dd02017-02-12 13:52:34 -08005468 &dev_attr_lpfc_suppress_rsp,
James Smart895427b2017-02-12 13:52:30 -08005469 &dev_attr_lpfc_nvme_io_channel,
James Smart2d7dbc42017-02-12 13:52:35 -08005470 &dev_attr_lpfc_nvmet_mrq,
James Smart2448e482018-04-09 14:24:24 -07005471 &dev_attr_lpfc_nvmet_mrq_post,
James Smart895427b2017-02-12 13:52:30 -08005472 &dev_attr_lpfc_nvme_enable_fb,
James Smart2d7dbc42017-02-12 13:52:35 -08005473 &dev_attr_lpfc_nvmet_fb_size,
James Smart81301a92008-12-04 22:39:46 -05005474 &dev_attr_lpfc_enable_bg,
James Smart352e5fd2016-12-30 06:57:47 -08005475 &dev_attr_lpfc_soft_wwnn,
5476 &dev_attr_lpfc_soft_wwpn,
5477 &dev_attr_lpfc_soft_wwn_enable,
Tony Jonesee959b02008-02-22 00:13:36 +01005478 &dev_attr_lpfc_enable_hba_reset,
5479 &dev_attr_lpfc_enable_hba_heartbeat,
James Smart1ba981f2014-02-20 09:56:45 -05005480 &dev_attr_lpfc_EnableXLane,
5481 &dev_attr_lpfc_XLanePriority,
5482 &dev_attr_lpfc_xlane_lun,
5483 &dev_attr_lpfc_xlane_tgt,
5484 &dev_attr_lpfc_xlane_vpt,
5485 &dev_attr_lpfc_xlane_lun_state,
5486 &dev_attr_lpfc_xlane_lun_status,
James Smartc92c8412016-07-06 12:36:05 -07005487 &dev_attr_lpfc_xlane_priority,
Tony Jonesee959b02008-02-22 00:13:36 +01005488 &dev_attr_lpfc_sg_seg_cnt,
James Smart977b5a02008-09-07 11:52:04 -04005489 &dev_attr_lpfc_max_scsicmpl_time,
James Smartea2151b2008-09-07 11:52:10 -04005490 &dev_attr_lpfc_stat_data_ctrl,
James Smart0d878412009-10-02 15:16:56 -04005491 &dev_attr_lpfc_aer_support,
5492 &dev_attr_lpfc_aer_state_cleanup,
James Smart912e3ac2011-05-24 11:42:11 -04005493 &dev_attr_lpfc_sriov_nr_virtfn,
James Smartc71ab862012-10-31 14:44:33 -04005494 &dev_attr_lpfc_req_fw_upgrade,
James Smart84d1b002010-02-12 14:42:33 -05005495 &dev_attr_lpfc_suppress_link_up,
James Smart2a9bf3d2010-06-07 15:24:45 -04005496 &dev_attr_lpfc_iocb_cnt,
5497 &dev_attr_iocb_hw,
5498 &dev_attr_txq_hw,
5499 &dev_attr_txcmplq_hw,
James Smartbc739052010-08-04 16:11:18 -04005500 &dev_attr_lpfc_fips_level,
5501 &dev_attr_lpfc_fips_rev,
James Smartab56dc22011-02-16 12:39:57 -05005502 &dev_attr_lpfc_dss,
James Smart912e3ac2011-05-24 11:42:11 -04005503 &dev_attr_lpfc_sriov_hw_max_virtfn,
James Smart026abb82011-12-13 13:20:45 -05005504 &dev_attr_protocol,
James Smart1ba981f2014-02-20 09:56:45 -05005505 &dev_attr_lpfc_xlane_supported,
James Smart7bdedb32016-07-06 12:36:00 -07005506 &dev_attr_lpfc_enable_mds_diags,
James Smart44fd7fe2017-08-23 16:55:47 -07005507 &dev_attr_lpfc_enable_bbcr,
James Smart1351e692018-02-22 08:18:43 -08005508 &dev_attr_lpfc_enable_dpp,
James Smart414abe02018-06-26 08:24:26 -07005509 &dev_attr_lpfc_enable_pbde,
dea31012005-04-17 16:05:31 -05005510 NULL,
5511};
5512
Tony Jonesee959b02008-02-22 00:13:36 +01005513struct device_attribute *lpfc_vport_attrs[] = {
5514 &dev_attr_info,
Hannes Reineckebbd1ae42008-03-18 14:32:28 +01005515 &dev_attr_link_state,
Tony Jonesee959b02008-02-22 00:13:36 +01005516 &dev_attr_num_discovered_ports,
5517 &dev_attr_lpfc_drvr_version,
5518 &dev_attr_lpfc_log_verbose,
5519 &dev_attr_lpfc_lun_queue_depth,
James Smart7dc517d2010-07-14 15:32:10 -04005520 &dev_attr_lpfc_tgt_queue_depth,
Tony Jonesee959b02008-02-22 00:13:36 +01005521 &dev_attr_lpfc_nodev_tmo,
5522 &dev_attr_lpfc_devloss_tmo,
5523 &dev_attr_lpfc_hba_queue_depth,
5524 &dev_attr_lpfc_peer_port_login,
5525 &dev_attr_lpfc_restrict_login,
5526 &dev_attr_lpfc_fcp_class,
5527 &dev_attr_lpfc_use_adisc,
James Smart3cb01c52013-07-15 18:35:04 -04005528 &dev_attr_lpfc_first_burst_size,
Tony Jonesee959b02008-02-22 00:13:36 +01005529 &dev_attr_lpfc_max_luns,
5530 &dev_attr_nport_evt_cnt,
5531 &dev_attr_npiv_info,
5532 &dev_attr_lpfc_enable_da_id,
James Smartea2151b2008-09-07 11:52:10 -04005533 &dev_attr_lpfc_max_scsicmpl_time,
5534 &dev_attr_lpfc_stat_data_ctrl,
James Smart21e9a0a2009-05-22 14:53:21 -04005535 &dev_attr_lpfc_static_vport,
James Smartbc739052010-08-04 16:11:18 -04005536 &dev_attr_lpfc_fips_level,
5537 &dev_attr_lpfc_fips_rev,
James Smart3de2a652007-08-02 11:09:59 -04005538 NULL,
5539};
5540
James Smarte59058c2008-08-24 21:49:00 -04005541/**
James Smart3621a712009-04-06 18:47:14 -04005542 * sysfs_ctlreg_write - Write method for writing to ctlreg
Chris Wright2c3c8be2010-05-12 18:28:57 -07005543 * @filp: open sysfs file
James Smarte59058c2008-08-24 21:49:00 -04005544 * @kobj: kernel kobject that contains the kernel class device.
5545 * @bin_attr: kernel attributes passed to us.
5546 * @buf: contains the data to be written to the adapter IOREG space.
5547 * @off: offset into buffer to beginning of data.
5548 * @count: bytes to transfer.
5549 *
5550 * Description:
5551 * Accessed via /sys/class/scsi_host/hostxxx/ctlreg.
5552 * Uses the adapter io control registers to send buf contents to the adapter.
5553 *
5554 * Returns:
5555 * -ERANGE off and count combo out of range
5556 * -EINVAL off, count or buff address invalid
5557 * -EPERM adapter is offline
5558 * value of count, buf contents written
5559 **/
dea31012005-04-17 16:05:31 -05005560static ssize_t
Chris Wright2c3c8be2010-05-12 18:28:57 -07005561sysfs_ctlreg_write(struct file *filp, struct kobject *kobj,
5562 struct bin_attribute *bin_attr,
Zhang Rui91a69022007-06-09 13:57:22 +08005563 char *buf, loff_t off, size_t count)
dea31012005-04-17 16:05:31 -05005564{
5565 size_t buf_off;
Tony Jonesee959b02008-02-22 00:13:36 +01005566 struct device *dev = container_of(kobj, struct device, kobj);
5567 struct Scsi_Host *shost = class_to_shost(dev);
James Smart2e0fef82007-06-17 19:56:36 -05005568 struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata;
5569 struct lpfc_hba *phba = vport->phba;
dea31012005-04-17 16:05:31 -05005570
James Smartf1126682009-06-10 17:22:44 -04005571 if (phba->sli_rev >= LPFC_SLI_REV4)
5572 return -EPERM;
5573
dea31012005-04-17 16:05:31 -05005574 if ((off + count) > FF_REG_AREA_SIZE)
5575 return -ERANGE;
5576
James Smartf7a919b2011-08-21 21:49:16 -04005577 if (count <= LPFC_REG_WRITE_KEY_SIZE)
5578 return 0;
dea31012005-04-17 16:05:31 -05005579
5580 if (off % 4 || count % 4 || (unsigned long)buf % 4)
5581 return -EINVAL;
5582
James Smartf7a919b2011-08-21 21:49:16 -04005583 /* This is to protect HBA registers from accidental writes. */
5584 if (memcmp(buf, LPFC_REG_WRITE_KEY, LPFC_REG_WRITE_KEY_SIZE))
5585 return -EINVAL;
5586
5587 if (!(vport->fc_flag & FC_OFFLINE_MODE))
dea31012005-04-17 16:05:31 -05005588 return -EPERM;
dea31012005-04-17 16:05:31 -05005589
James Smart2e0fef82007-06-17 19:56:36 -05005590 spin_lock_irq(&phba->hbalock);
James Smartf7a919b2011-08-21 21:49:16 -04005591 for (buf_off = 0; buf_off < count - LPFC_REG_WRITE_KEY_SIZE;
5592 buf_off += sizeof(uint32_t))
5593 writel(*((uint32_t *)(buf + buf_off + LPFC_REG_WRITE_KEY_SIZE)),
dea31012005-04-17 16:05:31 -05005594 phba->ctrl_regs_memmap_p + off + buf_off);
5595
James Smart2e0fef82007-06-17 19:56:36 -05005596 spin_unlock_irq(&phba->hbalock);
dea31012005-04-17 16:05:31 -05005597
5598 return count;
5599}
5600
James Smarte59058c2008-08-24 21:49:00 -04005601/**
James Smart3621a712009-04-06 18:47:14 -04005602 * sysfs_ctlreg_read - Read method for reading from ctlreg
Chris Wright2c3c8be2010-05-12 18:28:57 -07005603 * @filp: open sysfs file
James Smarte59058c2008-08-24 21:49:00 -04005604 * @kobj: kernel kobject that contains the kernel class device.
5605 * @bin_attr: kernel attributes passed to us.
André Goddard Rosaaf901ca2009-11-14 13:09:05 -02005606 * @buf: if successful contains the data from the adapter IOREG space.
James Smarte59058c2008-08-24 21:49:00 -04005607 * @off: offset into buffer to beginning of data.
5608 * @count: bytes to transfer.
5609 *
5610 * Description:
5611 * Accessed via /sys/class/scsi_host/hostxxx/ctlreg.
5612 * Uses the adapter io control registers to read data into buf.
5613 *
5614 * Returns:
5615 * -ERANGE off and count combo out of range
5616 * -EINVAL off, count or buff address invalid
5617 * value of count, buf contents read
5618 **/
dea31012005-04-17 16:05:31 -05005619static ssize_t
Chris Wright2c3c8be2010-05-12 18:28:57 -07005620sysfs_ctlreg_read(struct file *filp, struct kobject *kobj,
5621 struct bin_attribute *bin_attr,
Zhang Rui91a69022007-06-09 13:57:22 +08005622 char *buf, loff_t off, size_t count)
dea31012005-04-17 16:05:31 -05005623{
5624 size_t buf_off;
5625 uint32_t * tmp_ptr;
Tony Jonesee959b02008-02-22 00:13:36 +01005626 struct device *dev = container_of(kobj, struct device, kobj);
5627 struct Scsi_Host *shost = class_to_shost(dev);
James Smart2e0fef82007-06-17 19:56:36 -05005628 struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata;
5629 struct lpfc_hba *phba = vport->phba;
dea31012005-04-17 16:05:31 -05005630
James Smartf1126682009-06-10 17:22:44 -04005631 if (phba->sli_rev >= LPFC_SLI_REV4)
5632 return -EPERM;
5633
dea31012005-04-17 16:05:31 -05005634 if (off > FF_REG_AREA_SIZE)
5635 return -ERANGE;
5636
5637 if ((off + count) > FF_REG_AREA_SIZE)
5638 count = FF_REG_AREA_SIZE - off;
5639
5640 if (count == 0) return 0;
5641
5642 if (off % 4 || count % 4 || (unsigned long)buf % 4)
5643 return -EINVAL;
5644
James Smart2e0fef82007-06-17 19:56:36 -05005645 spin_lock_irq(&phba->hbalock);
dea31012005-04-17 16:05:31 -05005646
5647 for (buf_off = 0; buf_off < count; buf_off += sizeof(uint32_t)) {
5648 tmp_ptr = (uint32_t *)(buf + buf_off);
5649 *tmp_ptr = readl(phba->ctrl_regs_memmap_p + off + buf_off);
5650 }
5651
James Smart2e0fef82007-06-17 19:56:36 -05005652 spin_unlock_irq(&phba->hbalock);
dea31012005-04-17 16:05:31 -05005653
5654 return count;
5655}
5656
5657static struct bin_attribute sysfs_ctlreg_attr = {
5658 .attr = {
5659 .name = "ctlreg",
5660 .mode = S_IRUSR | S_IWUSR,
dea31012005-04-17 16:05:31 -05005661 },
5662 .size = 256,
5663 .read = sysfs_ctlreg_read,
5664 .write = sysfs_ctlreg_write,
5665};
5666
James Smarte59058c2008-08-24 21:49:00 -04005667/**
James Smart3621a712009-04-06 18:47:14 -04005668 * sysfs_mbox_write - Write method for writing information via mbox
Chris Wright2c3c8be2010-05-12 18:28:57 -07005669 * @filp: open sysfs file
James Smarte59058c2008-08-24 21:49:00 -04005670 * @kobj: kernel kobject that contains the kernel class device.
5671 * @bin_attr: kernel attributes passed to us.
5672 * @buf: contains the data to be written to sysfs mbox.
5673 * @off: offset into buffer to beginning of data.
5674 * @count: bytes to transfer.
5675 *
5676 * Description:
James Smart026abb82011-12-13 13:20:45 -05005677 * Deprecated function. All mailbox access from user space is performed via the
5678 * bsg interface.
James Smarte59058c2008-08-24 21:49:00 -04005679 *
5680 * Returns:
James Smart026abb82011-12-13 13:20:45 -05005681 * -EPERM operation not permitted
James Smarte59058c2008-08-24 21:49:00 -04005682 **/
dea31012005-04-17 16:05:31 -05005683static ssize_t
Chris Wright2c3c8be2010-05-12 18:28:57 -07005684sysfs_mbox_write(struct file *filp, struct kobject *kobj,
5685 struct bin_attribute *bin_attr,
Zhang Rui91a69022007-06-09 13:57:22 +08005686 char *buf, loff_t off, size_t count)
dea31012005-04-17 16:05:31 -05005687{
James Smart026abb82011-12-13 13:20:45 -05005688 return -EPERM;
dea31012005-04-17 16:05:31 -05005689}
5690
James Smarte59058c2008-08-24 21:49:00 -04005691/**
James Smart3621a712009-04-06 18:47:14 -04005692 * sysfs_mbox_read - Read method for reading information via mbox
Chris Wright2c3c8be2010-05-12 18:28:57 -07005693 * @filp: open sysfs file
James Smarte59058c2008-08-24 21:49:00 -04005694 * @kobj: kernel kobject that contains the kernel class device.
5695 * @bin_attr: kernel attributes passed to us.
5696 * @buf: contains the data to be read from sysfs mbox.
5697 * @off: offset into buffer to beginning of data.
5698 * @count: bytes to transfer.
5699 *
5700 * Description:
James Smart026abb82011-12-13 13:20:45 -05005701 * Deprecated function. All mailbox access from user space is performed via the
5702 * bsg interface.
James Smarte59058c2008-08-24 21:49:00 -04005703 *
5704 * Returns:
James Smart026abb82011-12-13 13:20:45 -05005705 * -EPERM operation not permitted
James Smarte59058c2008-08-24 21:49:00 -04005706 **/
dea31012005-04-17 16:05:31 -05005707static ssize_t
Chris Wright2c3c8be2010-05-12 18:28:57 -07005708sysfs_mbox_read(struct file *filp, struct kobject *kobj,
5709 struct bin_attribute *bin_attr,
Zhang Rui91a69022007-06-09 13:57:22 +08005710 char *buf, loff_t off, size_t count)
dea31012005-04-17 16:05:31 -05005711{
James Smart026abb82011-12-13 13:20:45 -05005712 return -EPERM;
dea31012005-04-17 16:05:31 -05005713}
5714
5715static struct bin_attribute sysfs_mbox_attr = {
5716 .attr = {
5717 .name = "mbox",
5718 .mode = S_IRUSR | S_IWUSR,
dea31012005-04-17 16:05:31 -05005719 },
James Smartc0c11512011-05-24 11:41:34 -04005720 .size = MAILBOX_SYSFS_MAX,
dea31012005-04-17 16:05:31 -05005721 .read = sysfs_mbox_read,
5722 .write = sysfs_mbox_write,
5723};
5724
James Smarte59058c2008-08-24 21:49:00 -04005725/**
James Smart3621a712009-04-06 18:47:14 -04005726 * lpfc_alloc_sysfs_attr - Creates the ctlreg and mbox entries
James Smarte59058c2008-08-24 21:49:00 -04005727 * @vport: address of lpfc vport structure.
5728 *
5729 * Return codes:
5730 * zero on success
5731 * error return code from sysfs_create_bin_file()
5732 **/
dea31012005-04-17 16:05:31 -05005733int
James Smart2e0fef82007-06-17 19:56:36 -05005734lpfc_alloc_sysfs_attr(struct lpfc_vport *vport)
dea31012005-04-17 16:05:31 -05005735{
James Smart2e0fef82007-06-17 19:56:36 -05005736 struct Scsi_Host *shost = lpfc_shost_from_vport(vport);
dea31012005-04-17 16:05:31 -05005737 int error;
5738
Tony Jonesee959b02008-02-22 00:13:36 +01005739 error = sysfs_create_bin_file(&shost->shost_dev.kobj,
James Smarteada2722008-12-04 22:39:13 -05005740 &sysfs_drvr_stat_data_attr);
5741
5742 /* Virtual ports do not need ctrl_reg and mbox */
5743 if (error || vport->port_type == LPFC_NPIV_PORT)
5744 goto out;
5745
5746 error = sysfs_create_bin_file(&shost->shost_dev.kobj,
James Smart92d7f7b2007-06-17 19:56:38 -05005747 &sysfs_ctlreg_attr);
dea31012005-04-17 16:05:31 -05005748 if (error)
James Smarteada2722008-12-04 22:39:13 -05005749 goto out_remove_stat_attr;
dea31012005-04-17 16:05:31 -05005750
Tony Jonesee959b02008-02-22 00:13:36 +01005751 error = sysfs_create_bin_file(&shost->shost_dev.kobj,
James Smart92d7f7b2007-06-17 19:56:38 -05005752 &sysfs_mbox_attr);
dea31012005-04-17 16:05:31 -05005753 if (error)
5754 goto out_remove_ctlreg_attr;
5755
5756 return 0;
5757out_remove_ctlreg_attr:
Tony Jonesee959b02008-02-22 00:13:36 +01005758 sysfs_remove_bin_file(&shost->shost_dev.kobj, &sysfs_ctlreg_attr);
James Smarteada2722008-12-04 22:39:13 -05005759out_remove_stat_attr:
5760 sysfs_remove_bin_file(&shost->shost_dev.kobj,
5761 &sysfs_drvr_stat_data_attr);
dea31012005-04-17 16:05:31 -05005762out:
5763 return error;
5764}
5765
James Smarte59058c2008-08-24 21:49:00 -04005766/**
James Smart3621a712009-04-06 18:47:14 -04005767 * lpfc_free_sysfs_attr - Removes the ctlreg and mbox entries
James Smarte59058c2008-08-24 21:49:00 -04005768 * @vport: address of lpfc vport structure.
5769 **/
dea31012005-04-17 16:05:31 -05005770void
James Smart2e0fef82007-06-17 19:56:36 -05005771lpfc_free_sysfs_attr(struct lpfc_vport *vport)
dea31012005-04-17 16:05:31 -05005772{
James Smart2e0fef82007-06-17 19:56:36 -05005773 struct Scsi_Host *shost = lpfc_shost_from_vport(vport);
James Smartea2151b2008-09-07 11:52:10 -04005774 sysfs_remove_bin_file(&shost->shost_dev.kobj,
5775 &sysfs_drvr_stat_data_attr);
James Smarteada2722008-12-04 22:39:13 -05005776 /* Virtual ports do not need ctrl_reg and mbox */
5777 if (vport->port_type == LPFC_NPIV_PORT)
5778 return;
Tony Jonesee959b02008-02-22 00:13:36 +01005779 sysfs_remove_bin_file(&shost->shost_dev.kobj, &sysfs_mbox_attr);
5780 sysfs_remove_bin_file(&shost->shost_dev.kobj, &sysfs_ctlreg_attr);
dea31012005-04-17 16:05:31 -05005781}
5782
dea31012005-04-17 16:05:31 -05005783/*
5784 * Dynamic FC Host Attributes Support
5785 */
5786
James Smarte59058c2008-08-24 21:49:00 -04005787/**
James Smart6c9231f2016-12-19 15:07:24 -08005788 * lpfc_get_host_symbolic_name - Copy symbolic name into the scsi host
5789 * @shost: kernel scsi host pointer.
5790 **/
5791static void
5792lpfc_get_host_symbolic_name(struct Scsi_Host *shost)
5793{
5794 struct lpfc_vport *vport = (struct lpfc_vport *)shost->hostdata;
5795
5796 lpfc_vport_symbolic_node_name(vport, fc_host_symbolic_name(shost),
5797 sizeof fc_host_symbolic_name(shost));
5798}
5799
5800/**
James Smart3621a712009-04-06 18:47:14 -04005801 * lpfc_get_host_port_id - Copy the vport DID into the scsi host port id
James Smarte59058c2008-08-24 21:49:00 -04005802 * @shost: kernel scsi host pointer.
5803 **/
dea31012005-04-17 16:05:31 -05005804static void
5805lpfc_get_host_port_id(struct Scsi_Host *shost)
5806{
James Smart2e0fef82007-06-17 19:56:36 -05005807 struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata;
5808
dea31012005-04-17 16:05:31 -05005809 /* note: fc_myDID already in cpu endianness */
James Smart2e0fef82007-06-17 19:56:36 -05005810 fc_host_port_id(shost) = vport->fc_myDID;
dea31012005-04-17 16:05:31 -05005811}
5812
James Smarte59058c2008-08-24 21:49:00 -04005813/**
James Smart3621a712009-04-06 18:47:14 -04005814 * lpfc_get_host_port_type - Set the value of the scsi host port type
James Smarte59058c2008-08-24 21:49:00 -04005815 * @shost: kernel scsi host pointer.
5816 **/
dea31012005-04-17 16:05:31 -05005817static void
5818lpfc_get_host_port_type(struct Scsi_Host *shost)
5819{
James Smart2e0fef82007-06-17 19:56:36 -05005820 struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata;
5821 struct lpfc_hba *phba = vport->phba;
dea31012005-04-17 16:05:31 -05005822
5823 spin_lock_irq(shost->host_lock);
5824
James Smart92d7f7b2007-06-17 19:56:38 -05005825 if (vport->port_type == LPFC_NPIV_PORT) {
5826 fc_host_port_type(shost) = FC_PORTTYPE_NPIV;
5827 } else if (lpfc_is_link_up(phba)) {
James Smart76a95d72010-11-20 23:11:48 -05005828 if (phba->fc_topology == LPFC_TOPOLOGY_LOOP) {
James Smart2e0fef82007-06-17 19:56:36 -05005829 if (vport->fc_flag & FC_PUBLIC_LOOP)
dea31012005-04-17 16:05:31 -05005830 fc_host_port_type(shost) = FC_PORTTYPE_NLPORT;
5831 else
5832 fc_host_port_type(shost) = FC_PORTTYPE_LPORT;
5833 } else {
James Smart2e0fef82007-06-17 19:56:36 -05005834 if (vport->fc_flag & FC_FABRIC)
dea31012005-04-17 16:05:31 -05005835 fc_host_port_type(shost) = FC_PORTTYPE_NPORT;
5836 else
5837 fc_host_port_type(shost) = FC_PORTTYPE_PTP;
5838 }
5839 } else
5840 fc_host_port_type(shost) = FC_PORTTYPE_UNKNOWN;
5841
5842 spin_unlock_irq(shost->host_lock);
5843}
5844
James Smarte59058c2008-08-24 21:49:00 -04005845/**
James Smart3621a712009-04-06 18:47:14 -04005846 * lpfc_get_host_port_state - Set the value of the scsi host port state
James Smarte59058c2008-08-24 21:49:00 -04005847 * @shost: kernel scsi host pointer.
5848 **/
dea31012005-04-17 16:05:31 -05005849static void
5850lpfc_get_host_port_state(struct Scsi_Host *shost)
5851{
James Smart2e0fef82007-06-17 19:56:36 -05005852 struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata;
5853 struct lpfc_hba *phba = vport->phba;
dea31012005-04-17 16:05:31 -05005854
5855 spin_lock_irq(shost->host_lock);
5856
James Smart2e0fef82007-06-17 19:56:36 -05005857 if (vport->fc_flag & FC_OFFLINE_MODE)
dea31012005-04-17 16:05:31 -05005858 fc_host_port_state(shost) = FC_PORTSTATE_OFFLINE;
5859 else {
James Smart2e0fef82007-06-17 19:56:36 -05005860 switch (phba->link_state) {
5861 case LPFC_LINK_UNKNOWN:
dea31012005-04-17 16:05:31 -05005862 case LPFC_LINK_DOWN:
5863 fc_host_port_state(shost) = FC_PORTSTATE_LINKDOWN;
5864 break;
5865 case LPFC_LINK_UP:
dea31012005-04-17 16:05:31 -05005866 case LPFC_CLEAR_LA:
5867 case LPFC_HBA_READY:
James Smart026abb82011-12-13 13:20:45 -05005868 /* Links up, reports port state accordingly */
5869 if (vport->port_state < LPFC_VPORT_READY)
5870 fc_host_port_state(shost) =
5871 FC_PORTSTATE_BYPASSED;
5872 else
5873 fc_host_port_state(shost) =
5874 FC_PORTSTATE_ONLINE;
dea31012005-04-17 16:05:31 -05005875 break;
5876 case LPFC_HBA_ERROR:
5877 fc_host_port_state(shost) = FC_PORTSTATE_ERROR;
5878 break;
5879 default:
5880 fc_host_port_state(shost) = FC_PORTSTATE_UNKNOWN;
5881 break;
5882 }
5883 }
5884
5885 spin_unlock_irq(shost->host_lock);
5886}
5887
James Smarte59058c2008-08-24 21:49:00 -04005888/**
James Smart3621a712009-04-06 18:47:14 -04005889 * lpfc_get_host_speed - Set the value of the scsi host speed
James Smarte59058c2008-08-24 21:49:00 -04005890 * @shost: kernel scsi host pointer.
5891 **/
dea31012005-04-17 16:05:31 -05005892static void
5893lpfc_get_host_speed(struct Scsi_Host *shost)
5894{
James Smart2e0fef82007-06-17 19:56:36 -05005895 struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata;
5896 struct lpfc_hba *phba = vport->phba;
dea31012005-04-17 16:05:31 -05005897
5898 spin_lock_irq(shost->host_lock);
5899
James Smarta085e872015-12-16 18:12:02 -05005900 if ((lpfc_is_link_up(phba)) && (!(phba->hba_flag & HBA_FCOE_MODE))) {
dea31012005-04-17 16:05:31 -05005901 switch(phba->fc_linkspeed) {
James Smart76a95d72010-11-20 23:11:48 -05005902 case LPFC_LINK_SPEED_1GHZ:
5903 fc_host_speed(shost) = FC_PORTSPEED_1GBIT;
dea31012005-04-17 16:05:31 -05005904 break;
James Smart76a95d72010-11-20 23:11:48 -05005905 case LPFC_LINK_SPEED_2GHZ:
5906 fc_host_speed(shost) = FC_PORTSPEED_2GBIT;
dea31012005-04-17 16:05:31 -05005907 break;
James Smart76a95d72010-11-20 23:11:48 -05005908 case LPFC_LINK_SPEED_4GHZ:
5909 fc_host_speed(shost) = FC_PORTSPEED_4GBIT;
dea31012005-04-17 16:05:31 -05005910 break;
James Smart76a95d72010-11-20 23:11:48 -05005911 case LPFC_LINK_SPEED_8GHZ:
5912 fc_host_speed(shost) = FC_PORTSPEED_8GBIT;
James Smartb87eab32007-04-25 09:53:28 -04005913 break;
James Smart76a95d72010-11-20 23:11:48 -05005914 case LPFC_LINK_SPEED_10GHZ:
5915 fc_host_speed(shost) = FC_PORTSPEED_10GBIT;
James Smartf4b4c682009-05-22 14:53:12 -04005916 break;
James Smart76a95d72010-11-20 23:11:48 -05005917 case LPFC_LINK_SPEED_16GHZ:
5918 fc_host_speed(shost) = FC_PORTSPEED_16GBIT;
5919 break;
James Smartd38dd522015-08-31 16:48:17 -04005920 case LPFC_LINK_SPEED_32GHZ:
5921 fc_host_speed(shost) = FC_PORTSPEED_32GBIT;
5922 break;
James Smartfbd8a6b2018-02-22 08:18:45 -08005923 case LPFC_LINK_SPEED_64GHZ:
5924 fc_host_speed(shost) = FC_PORTSPEED_64GBIT;
5925 break;
James Smart76a95d72010-11-20 23:11:48 -05005926 default:
5927 fc_host_speed(shost) = FC_PORTSPEED_UNKNOWN;
dea31012005-04-17 16:05:31 -05005928 break;
5929 }
James Smartb615a202018-07-31 17:23:19 -07005930 } else if (lpfc_is_link_up(phba) && (phba->hba_flag & HBA_FCOE_MODE)) {
5931 switch (phba->fc_linkspeed) {
5932 case LPFC_ASYNC_LINK_SPEED_10GBPS:
5933 fc_host_speed(shost) = FC_PORTSPEED_10GBIT;
5934 break;
5935 case LPFC_ASYNC_LINK_SPEED_25GBPS:
5936 fc_host_speed(shost) = FC_PORTSPEED_25GBIT;
5937 break;
5938 case LPFC_ASYNC_LINK_SPEED_40GBPS:
5939 fc_host_speed(shost) = FC_PORTSPEED_40GBIT;
5940 break;
5941 case LPFC_ASYNC_LINK_SPEED_100GBPS:
5942 fc_host_speed(shost) = FC_PORTSPEED_100GBIT;
5943 break;
5944 default:
5945 fc_host_speed(shost) = FC_PORTSPEED_UNKNOWN;
5946 break;
5947 }
James Smart09372822008-01-11 01:52:54 -05005948 } else
5949 fc_host_speed(shost) = FC_PORTSPEED_UNKNOWN;
dea31012005-04-17 16:05:31 -05005950
5951 spin_unlock_irq(shost->host_lock);
5952}
5953
James Smarte59058c2008-08-24 21:49:00 -04005954/**
James Smart3621a712009-04-06 18:47:14 -04005955 * lpfc_get_host_fabric_name - Set the value of the scsi host fabric name
James Smarte59058c2008-08-24 21:49:00 -04005956 * @shost: kernel scsi host pointer.
5957 **/
dea31012005-04-17 16:05:31 -05005958static void
5959lpfc_get_host_fabric_name (struct Scsi_Host *shost)
5960{
James Smart2e0fef82007-06-17 19:56:36 -05005961 struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata;
5962 struct lpfc_hba *phba = vport->phba;
Andrew Vasquezf631b4b2005-08-31 15:23:12 -07005963 u64 node_name;
dea31012005-04-17 16:05:31 -05005964
5965 spin_lock_irq(shost->host_lock);
5966
James Smart73d91e52011-10-10 21:32:10 -04005967 if ((vport->port_state > LPFC_FLOGI) &&
5968 ((vport->fc_flag & FC_FABRIC) ||
5969 ((phba->fc_topology == LPFC_TOPOLOGY_LOOP) &&
5970 (vport->fc_flag & FC_PUBLIC_LOOP))))
Andrew Morton68ce1eb2005-09-21 09:46:54 -07005971 node_name = wwn_to_u64(phba->fc_fabparam.nodeName.u.wwn);
dea31012005-04-17 16:05:31 -05005972 else
5973 /* fabric is local port if there is no F/FL_Port */
James Smart09372822008-01-11 01:52:54 -05005974 node_name = 0;
dea31012005-04-17 16:05:31 -05005975
5976 spin_unlock_irq(shost->host_lock);
5977
Andrew Vasquezf631b4b2005-08-31 15:23:12 -07005978 fc_host_fabric_name(shost) = node_name;
dea31012005-04-17 16:05:31 -05005979}
5980
James Smarte59058c2008-08-24 21:49:00 -04005981/**
James Smart3621a712009-04-06 18:47:14 -04005982 * lpfc_get_stats - Return statistical information about the adapter
James Smarte59058c2008-08-24 21:49:00 -04005983 * @shost: kernel scsi host pointer.
5984 *
5985 * Notes:
5986 * NULL on error for link down, no mbox pool, sli2 active,
5987 * management not allowed, memory allocation error, or mbox error.
5988 *
5989 * Returns:
5990 * NULL for error
5991 * address of the adapter host statistics
5992 **/
dea31012005-04-17 16:05:31 -05005993static struct fc_host_statistics *
5994lpfc_get_stats(struct Scsi_Host *shost)
5995{
James Smart2e0fef82007-06-17 19:56:36 -05005996 struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata;
5997 struct lpfc_hba *phba = vport->phba;
5998 struct lpfc_sli *psli = &phba->sli;
James.Smart@Emulex.Comf888ba32005-08-10 15:03:01 -04005999 struct fc_host_statistics *hs = &phba->link_stats;
James Smart64ba8812006-08-02 15:24:34 -04006000 struct lpfc_lnk_stat * lso = &psli->lnk_stat_offsets;
dea31012005-04-17 16:05:31 -05006001 LPFC_MBOXQ_t *pmboxq;
6002 MAILBOX_t *pmb;
James.Smart@Emulex.Com433c3572005-10-28 20:28:56 -04006003 int rc = 0;
dea31012005-04-17 16:05:31 -05006004
James Smart92d7f7b2007-06-17 19:56:38 -05006005 /*
6006 * prevent udev from issuing mailbox commands until the port is
6007 * configured.
6008 */
James Smart2e0fef82007-06-17 19:56:36 -05006009 if (phba->link_state < LPFC_LINK_DOWN ||
6010 !phba->mbox_mem_pool ||
James Smartf4b4c682009-05-22 14:53:12 -04006011 (phba->sli.sli_flag & LPFC_SLI_ACTIVE) == 0)
James Smart92d7f7b2007-06-17 19:56:38 -05006012 return NULL;
James Smart2e0fef82007-06-17 19:56:36 -05006013
6014 if (phba->sli.sli_flag & LPFC_BLOCK_MGMT_IO)
James Smart46fa3112007-04-25 09:51:45 -04006015 return NULL;
6016
dea31012005-04-17 16:05:31 -05006017 pmboxq = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL);
6018 if (!pmboxq)
6019 return NULL;
6020 memset(pmboxq, 0, sizeof (LPFC_MBOXQ_t));
6021
James Smart04c68492009-05-22 14:52:52 -04006022 pmb = &pmboxq->u.mb;
dea31012005-04-17 16:05:31 -05006023 pmb->mbxCommand = MBX_READ_STATUS;
6024 pmb->mbxOwner = OWN_HOST;
6025 pmboxq->context1 = NULL;
James Smart92d7f7b2007-06-17 19:56:38 -05006026 pmboxq->vport = vport;
dea31012005-04-17 16:05:31 -05006027
James Smart75baf692010-06-08 18:31:21 -04006028 if (vport->fc_flag & FC_OFFLINE_MODE)
dea31012005-04-17 16:05:31 -05006029 rc = lpfc_sli_issue_mbox(phba, pmboxq, MBX_POLL);
James.Smart@Emulex.Com433c3572005-10-28 20:28:56 -04006030 else
dea31012005-04-17 16:05:31 -05006031 rc = lpfc_sli_issue_mbox_wait(phba, pmboxq, phba->fc_ratov * 2);
6032
6033 if (rc != MBX_SUCCESS) {
James Smart858c9f62007-06-17 19:56:39 -05006034 if (rc != MBX_TIMEOUT)
James.Smart@Emulex.Com433c3572005-10-28 20:28:56 -04006035 mempool_free(pmboxq, phba->mbox_mem_pool);
dea31012005-04-17 16:05:31 -05006036 return NULL;
6037 }
6038
James.Smart@Emulex.Comf888ba32005-08-10 15:03:01 -04006039 memset(hs, 0, sizeof (struct fc_host_statistics));
6040
dea31012005-04-17 16:05:31 -05006041 hs->tx_frames = pmb->un.varRdStatus.xmitFrameCnt;
James Smart73d91e52011-10-10 21:32:10 -04006042 /*
6043 * The MBX_READ_STATUS returns tx_k_bytes which has to
6044 * converted to words
6045 */
6046 hs->tx_words = (uint64_t)
6047 ((uint64_t)pmb->un.varRdStatus.xmitByteCnt
6048 * (uint64_t)256);
dea31012005-04-17 16:05:31 -05006049 hs->rx_frames = pmb->un.varRdStatus.rcvFrameCnt;
James Smart73d91e52011-10-10 21:32:10 -04006050 hs->rx_words = (uint64_t)
6051 ((uint64_t)pmb->un.varRdStatus.rcvByteCnt
6052 * (uint64_t)256);
dea31012005-04-17 16:05:31 -05006053
James.Smart@Emulex.Com433c3572005-10-28 20:28:56 -04006054 memset(pmboxq, 0, sizeof (LPFC_MBOXQ_t));
dea31012005-04-17 16:05:31 -05006055 pmb->mbxCommand = MBX_READ_LNK_STAT;
6056 pmb->mbxOwner = OWN_HOST;
6057 pmboxq->context1 = NULL;
James Smart92d7f7b2007-06-17 19:56:38 -05006058 pmboxq->vport = vport;
dea31012005-04-17 16:05:31 -05006059
James Smart75baf692010-06-08 18:31:21 -04006060 if (vport->fc_flag & FC_OFFLINE_MODE)
dea31012005-04-17 16:05:31 -05006061 rc = lpfc_sli_issue_mbox(phba, pmboxq, MBX_POLL);
James.Smart@Emulex.Com433c3572005-10-28 20:28:56 -04006062 else
dea31012005-04-17 16:05:31 -05006063 rc = lpfc_sli_issue_mbox_wait(phba, pmboxq, phba->fc_ratov * 2);
6064
6065 if (rc != MBX_SUCCESS) {
James Smart858c9f62007-06-17 19:56:39 -05006066 if (rc != MBX_TIMEOUT)
James Smart92d7f7b2007-06-17 19:56:38 -05006067 mempool_free(pmboxq, phba->mbox_mem_pool);
dea31012005-04-17 16:05:31 -05006068 return NULL;
6069 }
6070
6071 hs->link_failure_count = pmb->un.varRdLnk.linkFailureCnt;
6072 hs->loss_of_sync_count = pmb->un.varRdLnk.lossSyncCnt;
6073 hs->loss_of_signal_count = pmb->un.varRdLnk.lossSignalCnt;
6074 hs->prim_seq_protocol_err_count = pmb->un.varRdLnk.primSeqErrCnt;
6075 hs->invalid_tx_word_count = pmb->un.varRdLnk.invalidXmitWord;
6076 hs->invalid_crc_count = pmb->un.varRdLnk.crcCnt;
6077 hs->error_frames = pmb->un.varRdLnk.crcCnt;
6078
James Smart64ba8812006-08-02 15:24:34 -04006079 hs->link_failure_count -= lso->link_failure_count;
6080 hs->loss_of_sync_count -= lso->loss_of_sync_count;
6081 hs->loss_of_signal_count -= lso->loss_of_signal_count;
6082 hs->prim_seq_protocol_err_count -= lso->prim_seq_protocol_err_count;
6083 hs->invalid_tx_word_count -= lso->invalid_tx_word_count;
6084 hs->invalid_crc_count -= lso->invalid_crc_count;
6085 hs->error_frames -= lso->error_frames;
6086
James Smart76a95d72010-11-20 23:11:48 -05006087 if (phba->hba_flag & HBA_FCOE_MODE) {
James Smart4d9ab992009-10-02 15:16:39 -04006088 hs->lip_count = -1;
6089 hs->nos_count = (phba->link_events >> 1);
6090 hs->nos_count -= lso->link_events;
James Smart76a95d72010-11-20 23:11:48 -05006091 } else if (phba->fc_topology == LPFC_TOPOLOGY_LOOP) {
dea31012005-04-17 16:05:31 -05006092 hs->lip_count = (phba->fc_eventTag >> 1);
James Smart64ba8812006-08-02 15:24:34 -04006093 hs->lip_count -= lso->link_events;
dea31012005-04-17 16:05:31 -05006094 hs->nos_count = -1;
6095 } else {
6096 hs->lip_count = -1;
6097 hs->nos_count = (phba->fc_eventTag >> 1);
James Smart64ba8812006-08-02 15:24:34 -04006098 hs->nos_count -= lso->link_events;
dea31012005-04-17 16:05:31 -05006099 }
6100
6101 hs->dumped_frames = -1;
6102
Arnd Bergmannc4d6204d2018-06-18 17:28:23 +02006103 hs->seconds_since_last_reset = ktime_get_seconds() - psli->stats_start;
dea31012005-04-17 16:05:31 -05006104
James Smart1dcb58e2007-04-25 09:51:30 -04006105 mempool_free(pmboxq, phba->mbox_mem_pool);
6106
dea31012005-04-17 16:05:31 -05006107 return hs;
6108}
6109
James Smarte59058c2008-08-24 21:49:00 -04006110/**
James Smart3621a712009-04-06 18:47:14 -04006111 * lpfc_reset_stats - Copy the adapter link stats information
James Smarte59058c2008-08-24 21:49:00 -04006112 * @shost: kernel scsi host pointer.
6113 **/
James Smart64ba8812006-08-02 15:24:34 -04006114static void
6115lpfc_reset_stats(struct Scsi_Host *shost)
6116{
James Smart2e0fef82007-06-17 19:56:36 -05006117 struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata;
6118 struct lpfc_hba *phba = vport->phba;
6119 struct lpfc_sli *psli = &phba->sli;
6120 struct lpfc_lnk_stat *lso = &psli->lnk_stat_offsets;
James Smart64ba8812006-08-02 15:24:34 -04006121 LPFC_MBOXQ_t *pmboxq;
6122 MAILBOX_t *pmb;
6123 int rc = 0;
6124
James Smart2e0fef82007-06-17 19:56:36 -05006125 if (phba->sli.sli_flag & LPFC_BLOCK_MGMT_IO)
James Smart46fa3112007-04-25 09:51:45 -04006126 return;
6127
James Smart64ba8812006-08-02 15:24:34 -04006128 pmboxq = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL);
6129 if (!pmboxq)
6130 return;
6131 memset(pmboxq, 0, sizeof(LPFC_MBOXQ_t));
6132
James Smart04c68492009-05-22 14:52:52 -04006133 pmb = &pmboxq->u.mb;
James Smart64ba8812006-08-02 15:24:34 -04006134 pmb->mbxCommand = MBX_READ_STATUS;
6135 pmb->mbxOwner = OWN_HOST;
6136 pmb->un.varWords[0] = 0x1; /* reset request */
6137 pmboxq->context1 = NULL;
James Smart92d7f7b2007-06-17 19:56:38 -05006138 pmboxq->vport = vport;
James Smart64ba8812006-08-02 15:24:34 -04006139
James Smart2e0fef82007-06-17 19:56:36 -05006140 if ((vport->fc_flag & FC_OFFLINE_MODE) ||
James Smartf4b4c682009-05-22 14:53:12 -04006141 (!(psli->sli_flag & LPFC_SLI_ACTIVE)))
James Smart64ba8812006-08-02 15:24:34 -04006142 rc = lpfc_sli_issue_mbox(phba, pmboxq, MBX_POLL);
6143 else
6144 rc = lpfc_sli_issue_mbox_wait(phba, pmboxq, phba->fc_ratov * 2);
6145
6146 if (rc != MBX_SUCCESS) {
James Smart858c9f62007-06-17 19:56:39 -05006147 if (rc != MBX_TIMEOUT)
James Smart64ba8812006-08-02 15:24:34 -04006148 mempool_free(pmboxq, phba->mbox_mem_pool);
6149 return;
6150 }
6151
6152 memset(pmboxq, 0, sizeof(LPFC_MBOXQ_t));
6153 pmb->mbxCommand = MBX_READ_LNK_STAT;
6154 pmb->mbxOwner = OWN_HOST;
6155 pmboxq->context1 = NULL;
James Smart92d7f7b2007-06-17 19:56:38 -05006156 pmboxq->vport = vport;
James Smart64ba8812006-08-02 15:24:34 -04006157
James Smart2e0fef82007-06-17 19:56:36 -05006158 if ((vport->fc_flag & FC_OFFLINE_MODE) ||
James Smartf4b4c682009-05-22 14:53:12 -04006159 (!(psli->sli_flag & LPFC_SLI_ACTIVE)))
James Smart64ba8812006-08-02 15:24:34 -04006160 rc = lpfc_sli_issue_mbox(phba, pmboxq, MBX_POLL);
6161 else
6162 rc = lpfc_sli_issue_mbox_wait(phba, pmboxq, phba->fc_ratov * 2);
6163
6164 if (rc != MBX_SUCCESS) {
James Smart858c9f62007-06-17 19:56:39 -05006165 if (rc != MBX_TIMEOUT)
James Smart64ba8812006-08-02 15:24:34 -04006166 mempool_free( pmboxq, phba->mbox_mem_pool);
6167 return;
6168 }
6169
6170 lso->link_failure_count = pmb->un.varRdLnk.linkFailureCnt;
6171 lso->loss_of_sync_count = pmb->un.varRdLnk.lossSyncCnt;
6172 lso->loss_of_signal_count = pmb->un.varRdLnk.lossSignalCnt;
6173 lso->prim_seq_protocol_err_count = pmb->un.varRdLnk.primSeqErrCnt;
6174 lso->invalid_tx_word_count = pmb->un.varRdLnk.invalidXmitWord;
6175 lso->invalid_crc_count = pmb->un.varRdLnk.crcCnt;
6176 lso->error_frames = pmb->un.varRdLnk.crcCnt;
James Smart76a95d72010-11-20 23:11:48 -05006177 if (phba->hba_flag & HBA_FCOE_MODE)
James Smart4d9ab992009-10-02 15:16:39 -04006178 lso->link_events = (phba->link_events >> 1);
6179 else
6180 lso->link_events = (phba->fc_eventTag >> 1);
James Smart64ba8812006-08-02 15:24:34 -04006181
Arnd Bergmannc4d6204d2018-06-18 17:28:23 +02006182 psli->stats_start = ktime_get_seconds();
James Smart64ba8812006-08-02 15:24:34 -04006183
James Smart1dcb58e2007-04-25 09:51:30 -04006184 mempool_free(pmboxq, phba->mbox_mem_pool);
6185
James Smart64ba8812006-08-02 15:24:34 -04006186 return;
6187}
dea31012005-04-17 16:05:31 -05006188
6189/*
6190 * The LPFC driver treats linkdown handling as target loss events so there
6191 * are no sysfs handlers for link_down_tmo.
6192 */
James Smart685f0bf2007-04-25 09:53:08 -04006193
James Smarte59058c2008-08-24 21:49:00 -04006194/**
James Smart3621a712009-04-06 18:47:14 -04006195 * lpfc_get_node_by_target - Return the nodelist for a target
James Smarte59058c2008-08-24 21:49:00 -04006196 * @starget: kernel scsi target pointer.
6197 *
6198 * Returns:
6199 * address of the node list if found
6200 * NULL target not found
6201 **/
James Smart685f0bf2007-04-25 09:53:08 -04006202static struct lpfc_nodelist *
6203lpfc_get_node_by_target(struct scsi_target *starget)
dea31012005-04-17 16:05:31 -05006204{
James Smart2e0fef82007-06-17 19:56:36 -05006205 struct Scsi_Host *shost = dev_to_shost(starget->dev.parent);
6206 struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata;
James Smart685f0bf2007-04-25 09:53:08 -04006207 struct lpfc_nodelist *ndlp;
dea31012005-04-17 16:05:31 -05006208
6209 spin_lock_irq(shost->host_lock);
James Smart685f0bf2007-04-25 09:53:08 -04006210 /* Search for this, mapped, target ID */
James Smart2e0fef82007-06-17 19:56:36 -05006211 list_for_each_entry(ndlp, &vport->fc_nodes, nlp_listp) {
James Smarte47c9092008-02-08 18:49:26 -05006212 if (NLP_CHK_NODE_ACT(ndlp) &&
6213 ndlp->nlp_state == NLP_STE_MAPPED_NODE &&
James Smart685f0bf2007-04-25 09:53:08 -04006214 starget->id == ndlp->nlp_sid) {
6215 spin_unlock_irq(shost->host_lock);
6216 return ndlp;
dea31012005-04-17 16:05:31 -05006217 }
6218 }
6219 spin_unlock_irq(shost->host_lock);
James Smart685f0bf2007-04-25 09:53:08 -04006220 return NULL;
6221}
dea31012005-04-17 16:05:31 -05006222
James Smarte59058c2008-08-24 21:49:00 -04006223/**
James Smart3621a712009-04-06 18:47:14 -04006224 * lpfc_get_starget_port_id - Set the target port id to the ndlp DID or -1
James Smarte59058c2008-08-24 21:49:00 -04006225 * @starget: kernel scsi target pointer.
6226 **/
James Smart685f0bf2007-04-25 09:53:08 -04006227static void
6228lpfc_get_starget_port_id(struct scsi_target *starget)
6229{
6230 struct lpfc_nodelist *ndlp = lpfc_get_node_by_target(starget);
6231
6232 fc_starget_port_id(starget) = ndlp ? ndlp->nlp_DID : -1;
dea31012005-04-17 16:05:31 -05006233}
6234
James Smarte59058c2008-08-24 21:49:00 -04006235/**
James Smart3621a712009-04-06 18:47:14 -04006236 * lpfc_get_starget_node_name - Set the target node name
James Smarte59058c2008-08-24 21:49:00 -04006237 * @starget: kernel scsi target pointer.
6238 *
6239 * Description: Set the target node name to the ndlp node name wwn or zero.
6240 **/
dea31012005-04-17 16:05:31 -05006241static void
6242lpfc_get_starget_node_name(struct scsi_target *starget)
6243{
James Smart685f0bf2007-04-25 09:53:08 -04006244 struct lpfc_nodelist *ndlp = lpfc_get_node_by_target(starget);
dea31012005-04-17 16:05:31 -05006245
James Smart685f0bf2007-04-25 09:53:08 -04006246 fc_starget_node_name(starget) =
6247 ndlp ? wwn_to_u64(ndlp->nlp_nodename.u.wwn) : 0;
dea31012005-04-17 16:05:31 -05006248}
6249
James Smarte59058c2008-08-24 21:49:00 -04006250/**
James Smart3621a712009-04-06 18:47:14 -04006251 * lpfc_get_starget_port_name - Set the target port name
James Smarte59058c2008-08-24 21:49:00 -04006252 * @starget: kernel scsi target pointer.
6253 *
6254 * Description: set the target port name to the ndlp port name wwn or zero.
6255 **/
dea31012005-04-17 16:05:31 -05006256static void
6257lpfc_get_starget_port_name(struct scsi_target *starget)
6258{
James Smart685f0bf2007-04-25 09:53:08 -04006259 struct lpfc_nodelist *ndlp = lpfc_get_node_by_target(starget);
dea31012005-04-17 16:05:31 -05006260
James Smart685f0bf2007-04-25 09:53:08 -04006261 fc_starget_port_name(starget) =
6262 ndlp ? wwn_to_u64(ndlp->nlp_portname.u.wwn) : 0;
dea31012005-04-17 16:05:31 -05006263}
6264
James Smarte59058c2008-08-24 21:49:00 -04006265/**
James Smart3621a712009-04-06 18:47:14 -04006266 * lpfc_set_rport_loss_tmo - Set the rport dev loss tmo
James Smarte59058c2008-08-24 21:49:00 -04006267 * @rport: fc rport address.
6268 * @timeout: new value for dev loss tmo.
6269 *
6270 * Description:
6271 * If timeout is non zero set the dev_loss_tmo to timeout, else set
6272 * dev_loss_tmo to one.
6273 **/
dea31012005-04-17 16:05:31 -05006274static void
dea31012005-04-17 16:05:31 -05006275lpfc_set_rport_loss_tmo(struct fc_rport *rport, uint32_t timeout)
6276{
dea31012005-04-17 16:05:31 -05006277 if (timeout)
James Smartc01f3202006-08-18 17:47:08 -04006278 rport->dev_loss_tmo = timeout;
dea31012005-04-17 16:05:31 -05006279 else
James Smartc01f3202006-08-18 17:47:08 -04006280 rport->dev_loss_tmo = 1;
dea31012005-04-17 16:05:31 -05006281}
6282
James Smarte59058c2008-08-24 21:49:00 -04006283/**
James Smart3621a712009-04-06 18:47:14 -04006284 * lpfc_rport_show_function - Return rport target information
James Smarte59058c2008-08-24 21:49:00 -04006285 *
6286 * Description:
6287 * Macro that uses field to generate a function with the name lpfc_show_rport_
6288 *
6289 * lpfc_show_rport_##field: returns the bytes formatted in buf
6290 * @cdev: class converted to an fc_rport.
6291 * @buf: on return contains the target_field or zero.
6292 *
6293 * Returns: size of formatted string.
6294 **/
dea31012005-04-17 16:05:31 -05006295#define lpfc_rport_show_function(field, format_string, sz, cast) \
6296static ssize_t \
Tony Jonesee959b02008-02-22 00:13:36 +01006297lpfc_show_rport_##field (struct device *dev, \
6298 struct device_attribute *attr, \
6299 char *buf) \
dea31012005-04-17 16:05:31 -05006300{ \
Tony Jonesee959b02008-02-22 00:13:36 +01006301 struct fc_rport *rport = transport_class_to_rport(dev); \
dea31012005-04-17 16:05:31 -05006302 struct lpfc_rport_data *rdata = rport->hostdata; \
6303 return snprintf(buf, sz, format_string, \
6304 (rdata->target) ? cast rdata->target->field : 0); \
6305}
6306
6307#define lpfc_rport_rd_attr(field, format_string, sz) \
6308 lpfc_rport_show_function(field, format_string, sz, ) \
6309static FC_RPORT_ATTR(field, S_IRUGO, lpfc_show_rport_##field, NULL)
6310
James Smarteada2722008-12-04 22:39:13 -05006311/**
James Smart3621a712009-04-06 18:47:14 -04006312 * lpfc_set_vport_symbolic_name - Set the vport's symbolic name
James Smarteada2722008-12-04 22:39:13 -05006313 * @fc_vport: The fc_vport who's symbolic name has been changed.
6314 *
6315 * Description:
6316 * This function is called by the transport after the @fc_vport's symbolic name
6317 * has been changed. This function re-registers the symbolic name with the
Lucas De Marchi25985ed2011-03-30 22:57:33 -03006318 * switch to propagate the change into the fabric if the vport is active.
James Smarteada2722008-12-04 22:39:13 -05006319 **/
6320static void
6321lpfc_set_vport_symbolic_name(struct fc_vport *fc_vport)
6322{
6323 struct lpfc_vport *vport = *(struct lpfc_vport **)fc_vport->dd_data;
6324
6325 if (vport->port_state == LPFC_VPORT_READY)
6326 lpfc_ns_cmd(vport, SLI_CTNS_RSPN_ID, 0, 0);
6327}
dea31012005-04-17 16:05:31 -05006328
James Smartf4b4c682009-05-22 14:53:12 -04006329/**
6330 * lpfc_hba_log_verbose_init - Set hba's log verbose level
6331 * @phba: Pointer to lpfc_hba struct.
6332 *
6333 * This function is called by the lpfc_get_cfgparam() routine to set the
6334 * module lpfc_log_verbose into the @phba cfg_log_verbose for use with
Justin P. Mattock70f23fd2011-05-10 10:16:21 +02006335 * log message according to the module's lpfc_log_verbose parameter setting
James Smartf4b4c682009-05-22 14:53:12 -04006336 * before hba port or vport created.
6337 **/
6338static void
6339lpfc_hba_log_verbose_init(struct lpfc_hba *phba, uint32_t verbose)
6340{
6341 phba->cfg_log_verbose = verbose;
6342}
6343
dea31012005-04-17 16:05:31 -05006344struct fc_function_template lpfc_transport_functions = {
6345 /* fixed attributes the driver supports */
6346 .show_host_node_name = 1,
6347 .show_host_port_name = 1,
6348 .show_host_supported_classes = 1,
6349 .show_host_supported_fc4s = 1,
dea31012005-04-17 16:05:31 -05006350 .show_host_supported_speeds = 1,
6351 .show_host_maxframe_size = 1,
James Smart6c9231f2016-12-19 15:07:24 -08006352
6353 .get_host_symbolic_name = lpfc_get_host_symbolic_name,
James Smarteada2722008-12-04 22:39:13 -05006354 .show_host_symbolic_name = 1,
dea31012005-04-17 16:05:31 -05006355
6356 /* dynamic attributes the driver supports */
6357 .get_host_port_id = lpfc_get_host_port_id,
6358 .show_host_port_id = 1,
6359
6360 .get_host_port_type = lpfc_get_host_port_type,
6361 .show_host_port_type = 1,
6362
6363 .get_host_port_state = lpfc_get_host_port_state,
6364 .show_host_port_state = 1,
6365
6366 /* active_fc4s is shown but doesn't change (thus no get function) */
6367 .show_host_active_fc4s = 1,
6368
6369 .get_host_speed = lpfc_get_host_speed,
6370 .show_host_speed = 1,
6371
6372 .get_host_fabric_name = lpfc_get_host_fabric_name,
6373 .show_host_fabric_name = 1,
6374
6375 /*
6376 * The LPFC driver treats linkdown handling as target loss events
6377 * so there are no sysfs handlers for link_down_tmo.
6378 */
6379
6380 .get_fc_host_stats = lpfc_get_stats,
James Smart64ba8812006-08-02 15:24:34 -04006381 .reset_fc_host_stats = lpfc_reset_stats,
dea31012005-04-17 16:05:31 -05006382
6383 .dd_fcrport_size = sizeof(struct lpfc_rport_data),
6384 .show_rport_maxframe_size = 1,
6385 .show_rport_supported_classes = 1,
6386
dea31012005-04-17 16:05:31 -05006387 .set_rport_dev_loss_tmo = lpfc_set_rport_loss_tmo,
6388 .show_rport_dev_loss_tmo = 1,
6389
6390 .get_starget_port_id = lpfc_get_starget_port_id,
6391 .show_starget_port_id = 1,
6392
6393 .get_starget_node_name = lpfc_get_starget_node_name,
6394 .show_starget_node_name = 1,
6395
6396 .get_starget_port_name = lpfc_get_starget_port_name,
6397 .show_starget_port_name = 1,
Andrew Vasquez91ca7b02005-10-27 16:03:37 -07006398
6399 .issue_fc_host_lip = lpfc_issue_lip,
James Smartc01f3202006-08-18 17:47:08 -04006400 .dev_loss_tmo_callbk = lpfc_dev_loss_tmo_callbk,
6401 .terminate_rport_io = lpfc_terminate_rport_io,
James Smart92d7f7b2007-06-17 19:56:38 -05006402
James Smart92d7f7b2007-06-17 19:56:38 -05006403 .dd_fcvport_size = sizeof(struct lpfc_vport *),
James Smarteada2722008-12-04 22:39:13 -05006404
6405 .vport_disable = lpfc_vport_disable,
6406
6407 .set_vport_symbolic_name = lpfc_set_vport_symbolic_name,
James Smartf1c3b0f2009-07-19 10:01:32 -04006408
6409 .bsg_request = lpfc_bsg_request,
6410 .bsg_timeout = lpfc_bsg_timeout,
James Smart92d7f7b2007-06-17 19:56:38 -05006411};
6412
James Smart98c9ea52007-10-27 13:37:33 -04006413struct fc_function_template lpfc_vport_transport_functions = {
6414 /* fixed attributes the driver supports */
6415 .show_host_node_name = 1,
6416 .show_host_port_name = 1,
6417 .show_host_supported_classes = 1,
6418 .show_host_supported_fc4s = 1,
6419 .show_host_supported_speeds = 1,
6420 .show_host_maxframe_size = 1,
James Smart6c9231f2016-12-19 15:07:24 -08006421
6422 .get_host_symbolic_name = lpfc_get_host_symbolic_name,
James Smarteada2722008-12-04 22:39:13 -05006423 .show_host_symbolic_name = 1,
James Smart98c9ea52007-10-27 13:37:33 -04006424
6425 /* dynamic attributes the driver supports */
6426 .get_host_port_id = lpfc_get_host_port_id,
6427 .show_host_port_id = 1,
6428
6429 .get_host_port_type = lpfc_get_host_port_type,
6430 .show_host_port_type = 1,
6431
6432 .get_host_port_state = lpfc_get_host_port_state,
6433 .show_host_port_state = 1,
6434
6435 /* active_fc4s is shown but doesn't change (thus no get function) */
6436 .show_host_active_fc4s = 1,
6437
6438 .get_host_speed = lpfc_get_host_speed,
6439 .show_host_speed = 1,
6440
6441 .get_host_fabric_name = lpfc_get_host_fabric_name,
6442 .show_host_fabric_name = 1,
6443
6444 /*
6445 * The LPFC driver treats linkdown handling as target loss events
6446 * so there are no sysfs handlers for link_down_tmo.
6447 */
6448
6449 .get_fc_host_stats = lpfc_get_stats,
6450 .reset_fc_host_stats = lpfc_reset_stats,
6451
6452 .dd_fcrport_size = sizeof(struct lpfc_rport_data),
6453 .show_rport_maxframe_size = 1,
6454 .show_rport_supported_classes = 1,
6455
6456 .set_rport_dev_loss_tmo = lpfc_set_rport_loss_tmo,
6457 .show_rport_dev_loss_tmo = 1,
6458
6459 .get_starget_port_id = lpfc_get_starget_port_id,
6460 .show_starget_port_id = 1,
6461
6462 .get_starget_node_name = lpfc_get_starget_node_name,
6463 .show_starget_node_name = 1,
6464
6465 .get_starget_port_name = lpfc_get_starget_port_name,
6466 .show_starget_port_name = 1,
6467
6468 .dev_loss_tmo_callbk = lpfc_dev_loss_tmo_callbk,
6469 .terminate_rport_io = lpfc_terminate_rport_io,
6470
6471 .vport_disable = lpfc_vport_disable,
James Smarteada2722008-12-04 22:39:13 -05006472
6473 .set_vport_symbolic_name = lpfc_set_vport_symbolic_name,
James Smart98c9ea52007-10-27 13:37:33 -04006474};
6475
James Smarte59058c2008-08-24 21:49:00 -04006476/**
James Smart3621a712009-04-06 18:47:14 -04006477 * lpfc_get_cfgparam - Used during probe_one to init the adapter structure
James Smarte59058c2008-08-24 21:49:00 -04006478 * @phba: lpfc_hba pointer.
6479 **/
dea31012005-04-17 16:05:31 -05006480void
6481lpfc_get_cfgparam(struct lpfc_hba *phba)
6482{
James Smart49aa1432012-08-03 12:36:42 -04006483 lpfc_fcp_io_sched_init(phba, lpfc_fcp_io_sched);
James Smarta6571c62012-10-31 14:44:42 -04006484 lpfc_fcp2_no_tgt_reset_init(phba, lpfc_fcp2_no_tgt_reset);
James.Smart@Emulex.Com7bcbb752005-10-28 20:29:13 -04006485 lpfc_cr_delay_init(phba, lpfc_cr_delay);
6486 lpfc_cr_count_init(phba, lpfc_cr_count);
Jamie Wellnitzcf5bf972006-02-28 22:33:08 -05006487 lpfc_multi_ring_support_init(phba, lpfc_multi_ring_support);
James Smarta4bc3372006-12-02 13:34:16 -05006488 lpfc_multi_ring_rctl_init(phba, lpfc_multi_ring_rctl);
6489 lpfc_multi_ring_type_init(phba, lpfc_multi_ring_type);
James.Smart@Emulex.Com7bcbb752005-10-28 20:29:13 -04006490 lpfc_ack0_init(phba, lpfc_ack0);
6491 lpfc_topology_init(phba, lpfc_topology);
James.Smart@Emulex.Com7bcbb752005-10-28 20:29:13 -04006492 lpfc_link_speed_init(phba, lpfc_link_speed);
James.Smart@Emulex.Com875fbdf2005-11-29 16:32:13 -05006493 lpfc_poll_tmo_init(phba, lpfc_poll_tmo);
James Smart0c411222013-09-06 12:22:46 -04006494 lpfc_task_mgmt_tmo_init(phba, lpfc_task_mgmt_tmo);
James Smart78b2d852007-08-02 11:10:21 -04006495 lpfc_enable_npiv_init(phba, lpfc_enable_npiv);
James Smart7d791df2011-07-22 18:37:52 -04006496 lpfc_fcf_failover_policy_init(phba, lpfc_fcf_failover_policy);
James Smart19ca7602010-11-20 23:11:55 -05006497 lpfc_enable_rrq_init(phba, lpfc_enable_rrq);
James Smart4258e982015-12-16 18:11:58 -05006498 lpfc_fdmi_on_init(phba, lpfc_fdmi_on);
6499 lpfc_enable_SmartSAN_init(phba, lpfc_enable_SmartSAN);
James Smart4ff43242006-12-02 13:34:56 -05006500 lpfc_use_msi_init(phba, lpfc_use_msi);
James Smart895427b2017-02-12 13:52:30 -08006501 lpfc_nvme_oas_init(phba, lpfc_nvme_oas);
James Smart4e565cf2018-02-22 08:18:50 -08006502 lpfc_nvme_embed_cmd_init(phba, lpfc_nvme_embed_cmd);
James Smart0cf07f842017-06-01 21:07:10 -07006503 lpfc_auto_imax_init(phba, lpfc_auto_imax);
James Smartda0436e2009-05-22 14:51:39 -04006504 lpfc_fcp_imax_init(phba, lpfc_fcp_imax);
James Smart7bb03bb2013-04-17 20:19:16 -04006505 lpfc_fcp_cpu_map_init(phba, lpfc_fcp_cpu_map);
James Smart13815c82008-01-11 01:52:48 -05006506 lpfc_enable_hba_reset_init(phba, lpfc_enable_hba_reset);
6507 lpfc_enable_hba_heartbeat_init(phba, lpfc_enable_hba_heartbeat);
James Smart2ea259e2017-02-12 13:52:27 -08006508
James Smart1ba981f2014-02-20 09:56:45 -05006509 lpfc_EnableXLane_init(phba, lpfc_EnableXLane);
6510 if (phba->sli_rev != LPFC_SLI_REV4)
6511 phba->cfg_EnableXLane = 0;
6512 lpfc_XLanePriority_init(phba, lpfc_XLanePriority);
James Smart2ea259e2017-02-12 13:52:27 -08006513
James Smart1ba981f2014-02-20 09:56:45 -05006514 memset(phba->cfg_oas_tgt_wwpn, 0, (8 * sizeof(uint8_t)));
6515 memset(phba->cfg_oas_vpt_wwpn, 0, (8 * sizeof(uint8_t)));
6516 phba->cfg_oas_lun_state = 0;
6517 phba->cfg_oas_lun_status = 0;
6518 phba->cfg_oas_flags = 0;
James Smartc92c8412016-07-06 12:36:05 -07006519 phba->cfg_oas_priority = 0;
James Smart81301a92008-12-04 22:39:46 -05006520 lpfc_enable_bg_init(phba, lpfc_enable_bg);
James Smartb3b98b72016-10-13 15:06:06 -07006521 lpfc_prot_mask_init(phba, lpfc_prot_mask);
6522 lpfc_prot_guard_init(phba, lpfc_prot_guard);
James Smart45ed1192009-10-02 15:17:02 -04006523 if (phba->sli_rev == LPFC_SLI_REV4)
6524 phba->cfg_poll = 0;
6525 else
James Smart1ba981f2014-02-20 09:56:45 -05006526 phba->cfg_poll = lpfc_poll;
James Smartf44ac122018-03-05 12:04:08 -08006527
6528 if (phba->cfg_enable_bg)
6529 phba->sli3_options |= LPFC_SLI3_BG_ENABLED;
6530
James Smartf358dd02017-02-12 13:52:34 -08006531 lpfc_suppress_rsp_init(phba, lpfc_suppress_rsp);
James Smart4258e982015-12-16 18:11:58 -05006532
James Smart895427b2017-02-12 13:52:30 -08006533 lpfc_enable_fc4_type_init(phba, lpfc_enable_fc4_type);
James Smart2d7dbc42017-02-12 13:52:35 -08006534 lpfc_nvmet_mrq_init(phba, lpfc_nvmet_mrq);
James Smart2448e482018-04-09 14:24:24 -07006535 lpfc_nvmet_mrq_post_init(phba, lpfc_nvmet_mrq_post);
James Smart895427b2017-02-12 13:52:30 -08006536
6537 /* Initialize first burst. Target vs Initiator are different. */
6538 lpfc_nvme_enable_fb_init(phba, lpfc_nvme_enable_fb);
James Smart2d7dbc42017-02-12 13:52:35 -08006539 lpfc_nvmet_fb_size_init(phba, lpfc_nvmet_fb_size);
James Smart895427b2017-02-12 13:52:30 -08006540 lpfc_fcp_io_channel_init(phba, lpfc_fcp_io_channel);
6541 lpfc_nvme_io_channel_init(phba, lpfc_nvme_io_channel);
James Smart44fd7fe2017-08-23 16:55:47 -07006542 lpfc_enable_bbcr_init(phba, lpfc_enable_bbcr);
James Smart1351e692018-02-22 08:18:43 -08006543 lpfc_enable_dpp_init(phba, lpfc_enable_dpp);
James Smart414abe02018-06-26 08:24:26 -07006544 lpfc_enable_pbde_init(phba, lpfc_enable_pbde);
James Smart895427b2017-02-12 13:52:30 -08006545
6546 if (phba->sli_rev != LPFC_SLI_REV4) {
6547 /* NVME only supported on SLI4 */
6548 phba->nvmet_support = 0;
6549 phba->cfg_enable_fc4_type = LPFC_ENABLE_FCP;
James Smart44fd7fe2017-08-23 16:55:47 -07006550 phba->cfg_enable_bbcr = 0;
James Smart895427b2017-02-12 13:52:30 -08006551 } else {
6552 /* We MUST have FCP support */
6553 if (!(phba->cfg_enable_fc4_type & LPFC_ENABLE_FCP))
6554 phba->cfg_enable_fc4_type |= LPFC_ENABLE_FCP;
6555 }
6556
James Smart0cf07f842017-06-01 21:07:10 -07006557 if (phba->cfg_auto_imax && !phba->cfg_fcp_imax)
6558 phba->cfg_auto_imax = 0;
6559 phba->initial_imax = phba->cfg_fcp_imax;
6560
James Smart895427b2017-02-12 13:52:30 -08006561 /* A value of 0 means use the number of CPUs found in the system */
James Smart895427b2017-02-12 13:52:30 -08006562 if (phba->cfg_fcp_io_channel == 0)
6563 phba->cfg_fcp_io_channel = phba->sli4_hba.num_present_cpu;
James Smartf358dd02017-02-12 13:52:34 -08006564 if (phba->cfg_nvme_io_channel == 0)
6565 phba->cfg_nvme_io_channel = phba->sli4_hba.num_present_cpu;
James Smart895427b2017-02-12 13:52:30 -08006566
6567 if (phba->cfg_enable_fc4_type == LPFC_ENABLE_NVME)
6568 phba->cfg_fcp_io_channel = 0;
6569
James Smartf358dd02017-02-12 13:52:34 -08006570 if (phba->cfg_enable_fc4_type == LPFC_ENABLE_FCP)
6571 phba->cfg_nvme_io_channel = 0;
6572
James Smart895427b2017-02-12 13:52:30 -08006573 if (phba->cfg_fcp_io_channel > phba->cfg_nvme_io_channel)
6574 phba->io_channel_irqs = phba->cfg_fcp_io_channel;
6575 else
6576 phba->io_channel_irqs = phba->cfg_nvme_io_channel;
James Smart4258e982015-12-16 18:11:58 -05006577
James Smart352e5fd2016-12-30 06:57:47 -08006578 phba->cfg_soft_wwnn = 0L;
6579 phba->cfg_soft_wwpn = 0L;
James Smart895427b2017-02-12 13:52:30 -08006580 lpfc_xri_split_init(phba, lpfc_xri_split);
James Smart83108bd2008-01-11 01:53:09 -05006581 lpfc_sg_seg_cnt_init(phba, lpfc_sg_seg_cnt);
James Smart7054a602007-04-25 09:52:34 -04006582 lpfc_hba_queue_depth_init(phba, lpfc_hba_queue_depth);
James Smart6fb120a2009-05-22 14:52:59 -04006583 lpfc_hba_log_verbose_init(phba, lpfc_log_verbose);
James Smart0d878412009-10-02 15:16:56 -04006584 lpfc_aer_support_init(phba, lpfc_aer_support);
James Smart912e3ac2011-05-24 11:42:11 -04006585 lpfc_sriov_nr_virtfn_init(phba, lpfc_sriov_nr_virtfn);
James Smartc71ab862012-10-31 14:44:33 -04006586 lpfc_request_firmware_upgrade_init(phba, lpfc_req_fw_upgrade);
James Smart84d1b002010-02-12 14:42:33 -05006587 lpfc_suppress_link_up_init(phba, lpfc_suppress_link_up);
James Smart2a9bf3d2010-06-07 15:24:45 -04006588 lpfc_iocb_cnt_init(phba, lpfc_iocb_cnt);
James Smart8eb8b962016-07-06 12:36:08 -07006589 lpfc_delay_discovery_init(phba, lpfc_delay_discovery);
James Smart12247e82016-07-06 12:36:09 -07006590 lpfc_sli_mode_init(phba, lpfc_sli_mode);
James Smartab56dc22011-02-16 12:39:57 -05006591 phba->cfg_enable_dss = 1;
James Smart7bdedb32016-07-06 12:36:00 -07006592 lpfc_enable_mds_diags_init(phba, lpfc_enable_mds_diags);
James Smart3de2a652007-08-02 11:09:59 -04006593 return;
6594}
Jamie Wellnitzb28485a2006-02-28 19:25:21 -05006595
James Smarte59058c2008-08-24 21:49:00 -04006596/**
James Smart895427b2017-02-12 13:52:30 -08006597 * lpfc_nvme_mod_param_dep - Adjust module parameter value based on
6598 * dependencies between protocols and roles.
6599 * @phba: lpfc_hba pointer.
6600 **/
6601void
6602lpfc_nvme_mod_param_dep(struct lpfc_hba *phba)
6603{
James Smart895427b2017-02-12 13:52:30 -08006604 if (phba->cfg_nvme_io_channel > phba->sli4_hba.num_present_cpu)
6605 phba->cfg_nvme_io_channel = phba->sli4_hba.num_present_cpu;
James Smartf358dd02017-02-12 13:52:34 -08006606
James Smart895427b2017-02-12 13:52:30 -08006607 if (phba->cfg_fcp_io_channel > phba->sli4_hba.num_present_cpu)
6608 phba->cfg_fcp_io_channel = phba->sli4_hba.num_present_cpu;
6609
James Smartf358dd02017-02-12 13:52:34 -08006610 if (phba->cfg_enable_fc4_type & LPFC_ENABLE_NVME &&
6611 phba->nvmet_support) {
6612 phba->cfg_enable_fc4_type &= ~LPFC_ENABLE_FCP;
6613 phba->cfg_fcp_io_channel = 0;
James Smart2d7dbc42017-02-12 13:52:35 -08006614
6615 lpfc_printf_log(phba, KERN_INFO, LOG_NVME_DISC,
6616 "6013 %s x%x fb_size x%x, fb_max x%x\n",
6617 "NVME Target PRLI ACC enable_fb ",
6618 phba->cfg_nvme_enable_fb,
6619 phba->cfg_nvmet_fb_size,
6620 LPFC_NVMET_FB_SZ_MAX);
6621
6622 if (phba->cfg_nvme_enable_fb == 0)
6623 phba->cfg_nvmet_fb_size = 0;
6624 else {
6625 if (phba->cfg_nvmet_fb_size > LPFC_NVMET_FB_SZ_MAX)
6626 phba->cfg_nvmet_fb_size = LPFC_NVMET_FB_SZ_MAX;
6627 }
6628
James Smartbcb24f62017-11-20 16:00:36 -08006629 if (!phba->cfg_nvmet_mrq)
6630 phba->cfg_nvmet_mrq = phba->cfg_nvme_io_channel;
6631
James Smart2d7dbc42017-02-12 13:52:35 -08006632 /* Adjust lpfc_nvmet_mrq to avoid running out of WQE slots */
6633 if (phba->cfg_nvmet_mrq > phba->cfg_nvme_io_channel) {
6634 phba->cfg_nvmet_mrq = phba->cfg_nvme_io_channel;
6635 lpfc_printf_log(phba, KERN_ERR, LOG_NVME_DISC,
6636 "6018 Adjust lpfc_nvmet_mrq to %d\n",
6637 phba->cfg_nvmet_mrq);
6638 }
James Smartbcb24f62017-11-20 16:00:36 -08006639 if (phba->cfg_nvmet_mrq > LPFC_NVMET_MRQ_MAX)
6640 phba->cfg_nvmet_mrq = LPFC_NVMET_MRQ_MAX;
6641
James Smart2d7dbc42017-02-12 13:52:35 -08006642 } else {
James Smartf358dd02017-02-12 13:52:34 -08006643 /* Not NVME Target mode. Turn off Target parameters. */
6644 phba->nvmet_support = 0;
James Smartbcb24f62017-11-20 16:00:36 -08006645 phba->cfg_nvmet_mrq = LPFC_NVMET_MRQ_OFF;
James Smart2d7dbc42017-02-12 13:52:35 -08006646 phba->cfg_nvmet_fb_size = 0;
6647 }
James Smartf358dd02017-02-12 13:52:34 -08006648
James Smart895427b2017-02-12 13:52:30 -08006649 if (phba->cfg_fcp_io_channel > phba->cfg_nvme_io_channel)
6650 phba->io_channel_irqs = phba->cfg_fcp_io_channel;
6651 else
6652 phba->io_channel_irqs = phba->cfg_nvme_io_channel;
6653}
6654
6655/**
James Smart3621a712009-04-06 18:47:14 -04006656 * lpfc_get_vport_cfgparam - Used during port create, init the vport structure
James Smarte59058c2008-08-24 21:49:00 -04006657 * @vport: lpfc_vport pointer.
6658 **/
James Smart3de2a652007-08-02 11:09:59 -04006659void
6660lpfc_get_vport_cfgparam(struct lpfc_vport *vport)
6661{
James Smarte8b62012007-08-02 11:10:09 -04006662 lpfc_log_verbose_init(vport, lpfc_log_verbose);
James Smart3de2a652007-08-02 11:09:59 -04006663 lpfc_lun_queue_depth_init(vport, lpfc_lun_queue_depth);
James Smart7dc517d2010-07-14 15:32:10 -04006664 lpfc_tgt_queue_depth_init(vport, lpfc_tgt_queue_depth);
James Smart3de2a652007-08-02 11:09:59 -04006665 lpfc_devloss_tmo_init(vport, lpfc_devloss_tmo);
6666 lpfc_nodev_tmo_init(vport, lpfc_nodev_tmo);
6667 lpfc_peer_port_login_init(vport, lpfc_peer_port_login);
6668 lpfc_restrict_login_init(vport, lpfc_restrict_login);
6669 lpfc_fcp_class_init(vport, lpfc_fcp_class);
6670 lpfc_use_adisc_init(vport, lpfc_use_adisc);
James Smart3cb01c52013-07-15 18:35:04 -04006671 lpfc_first_burst_size_init(vport, lpfc_first_burst_size);
James Smart977b5a02008-09-07 11:52:04 -04006672 lpfc_max_scsicmpl_time_init(vport, lpfc_max_scsicmpl_time);
James Smart3de2a652007-08-02 11:09:59 -04006673 lpfc_discovery_threads_init(vport, lpfc_discovery_threads);
6674 lpfc_max_luns_init(vport, lpfc_max_luns);
6675 lpfc_scan_down_init(vport, lpfc_scan_down);
James Smart7ee5d432007-10-27 13:37:17 -04006676 lpfc_enable_da_id_init(vport, lpfc_enable_da_id);
dea31012005-04-17 16:05:31 -05006677 return;
6678}