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