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