xref: /linux/drivers/scsi/lpfc/lpfc_attr.c (revision b43ab901d671e3e3cad425ea5e9a3c74e266dcdd)
1 /*******************************************************************
2  * This file is part of the Emulex Linux Device Driver for         *
3  * Fibre Channel Host Bus Adapters.                                *
4  * Copyright (C) 2004-2011 Emulex.  All rights reserved.           *
5  * EMULEX and SLI are trademarks of Emulex.                        *
6  * www.emulex.com                                                  *
7  * Portions Copyright (C) 2004-2005 Christoph Hellwig              *
8  *                                                                 *
9  * This program is free software; you can redistribute it and/or   *
10  * modify it under the terms of version 2 of the GNU General       *
11  * Public License as published by the Free Software Foundation.    *
12  * This program is distributed in the hope that it will be useful. *
13  * ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND          *
14  * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,  *
15  * FITNESS FOR A PARTICULAR PURPOSE, OR NON-INFRINGEMENT, ARE      *
16  * DISCLAIMED, EXCEPT TO THE EXTENT THAT SUCH DISCLAIMERS ARE HELD *
17  * TO BE LEGALLY INVALID.  See the GNU General Public License for  *
18  * more details, a copy of which can be found in the file COPYING  *
19  * included with this package.                                     *
20  *******************************************************************/
21 
22 #include <linux/ctype.h>
23 #include <linux/delay.h>
24 #include <linux/pci.h>
25 #include <linux/interrupt.h>
26 #include <linux/module.h>
27 #include <linux/aer.h>
28 #include <linux/gfp.h>
29 #include <linux/kernel.h>
30 
31 #include <scsi/scsi.h>
32 #include <scsi/scsi_device.h>
33 #include <scsi/scsi_host.h>
34 #include <scsi/scsi_tcq.h>
35 #include <scsi/scsi_transport_fc.h>
36 #include <scsi/fc/fc_fs.h>
37 
38 #include "lpfc_hw4.h"
39 #include "lpfc_hw.h"
40 #include "lpfc_sli.h"
41 #include "lpfc_sli4.h"
42 #include "lpfc_nl.h"
43 #include "lpfc_disc.h"
44 #include "lpfc_scsi.h"
45 #include "lpfc.h"
46 #include "lpfc_logmsg.h"
47 #include "lpfc_version.h"
48 #include "lpfc_compat.h"
49 #include "lpfc_crtn.h"
50 #include "lpfc_vport.h"
51 
52 #define LPFC_DEF_DEVLOSS_TMO 30
53 #define LPFC_MIN_DEVLOSS_TMO 1
54 #define LPFC_MAX_DEVLOSS_TMO 255
55 
56 /*
57  * Write key size should be multiple of 4. If write key is changed
58  * make sure that library write key is also changed.
59  */
60 #define LPFC_REG_WRITE_KEY_SIZE	4
61 #define LPFC_REG_WRITE_KEY	"EMLX"
62 
63 /**
64  * lpfc_jedec_to_ascii - Hex to ascii convertor according to JEDEC rules
65  * @incr: integer to convert.
66  * @hdw: ascii string holding converted integer plus a string terminator.
67  *
68  * Description:
69  * JEDEC Joint Electron Device Engineering Council.
70  * Convert a 32 bit integer composed of 8 nibbles into an 8 byte ascii
71  * character string. The string is then terminated with a NULL in byte 9.
72  * Hex 0-9 becomes ascii '0' to '9'.
73  * Hex a-f becomes ascii '=' to 'B' capital B.
74  *
75  * Notes:
76  * Coded for 32 bit integers only.
77  **/
78 static void
79 lpfc_jedec_to_ascii(int incr, char hdw[])
80 {
81 	int i, j;
82 	for (i = 0; i < 8; i++) {
83 		j = (incr & 0xf);
84 		if (j <= 9)
85 			hdw[7 - i] = 0x30 +  j;
86 		 else
87 			hdw[7 - i] = 0x61 + j - 10;
88 		incr = (incr >> 4);
89 	}
90 	hdw[8] = 0;
91 	return;
92 }
93 
94 /**
95  * lpfc_drvr_version_show - Return the Emulex driver string with version number
96  * @dev: class unused variable.
97  * @attr: device attribute, not used.
98  * @buf: on return contains the module description text.
99  *
100  * Returns: size of formatted string.
101  **/
102 static ssize_t
103 lpfc_drvr_version_show(struct device *dev, struct device_attribute *attr,
104 		       char *buf)
105 {
106 	return snprintf(buf, PAGE_SIZE, LPFC_MODULE_DESC "\n");
107 }
108 
109 /**
110  * lpfc_enable_fip_show - Return the fip mode of the HBA
111  * @dev: class unused variable.
112  * @attr: device attribute, not used.
113  * @buf: on return contains the module description text.
114  *
115  * Returns: size of formatted string.
116  **/
117 static ssize_t
118 lpfc_enable_fip_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 
125 	if (phba->hba_flag & HBA_FIP_SUPPORT)
126 		return snprintf(buf, PAGE_SIZE, "1\n");
127 	else
128 		return snprintf(buf, PAGE_SIZE, "0\n");
129 }
130 
131 static ssize_t
132 lpfc_bg_info_show(struct device *dev, struct device_attribute *attr,
133 		  char *buf)
134 {
135 	struct Scsi_Host *shost = class_to_shost(dev);
136 	struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata;
137 	struct lpfc_hba   *phba = vport->phba;
138 
139 	if (phba->cfg_enable_bg)
140 		if (phba->sli3_options & LPFC_SLI3_BG_ENABLED)
141 			return snprintf(buf, PAGE_SIZE, "BlockGuard Enabled\n");
142 		else
143 			return snprintf(buf, PAGE_SIZE,
144 					"BlockGuard Not Supported\n");
145 	else
146 			return snprintf(buf, PAGE_SIZE,
147 					"BlockGuard Disabled\n");
148 }
149 
150 static ssize_t
151 lpfc_bg_guard_err_show(struct device *dev, struct device_attribute *attr,
152 		       char *buf)
153 {
154 	struct Scsi_Host *shost = class_to_shost(dev);
155 	struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata;
156 	struct lpfc_hba   *phba = vport->phba;
157 
158 	return snprintf(buf, PAGE_SIZE, "%llu\n",
159 			(unsigned long long)phba->bg_guard_err_cnt);
160 }
161 
162 static ssize_t
163 lpfc_bg_apptag_err_show(struct device *dev, struct device_attribute *attr,
164 			char *buf)
165 {
166 	struct Scsi_Host *shost = class_to_shost(dev);
167 	struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata;
168 	struct lpfc_hba   *phba = vport->phba;
169 
170 	return snprintf(buf, PAGE_SIZE, "%llu\n",
171 			(unsigned long long)phba->bg_apptag_err_cnt);
172 }
173 
174 static ssize_t
175 lpfc_bg_reftag_err_show(struct device *dev, struct device_attribute *attr,
176 			char *buf)
177 {
178 	struct Scsi_Host *shost = class_to_shost(dev);
179 	struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata;
180 	struct lpfc_hba   *phba = vport->phba;
181 
182 	return snprintf(buf, PAGE_SIZE, "%llu\n",
183 			(unsigned long long)phba->bg_reftag_err_cnt);
184 }
185 
186 /**
187  * lpfc_info_show - Return some pci info about the host in ascii
188  * @dev: class converted to a Scsi_host structure.
189  * @attr: device attribute, not used.
190  * @buf: on return contains the formatted text from lpfc_info().
191  *
192  * Returns: size of formatted string.
193  **/
194 static ssize_t
195 lpfc_info_show(struct device *dev, struct device_attribute *attr,
196 	       char *buf)
197 {
198 	struct Scsi_Host *host = class_to_shost(dev);
199 
200 	return snprintf(buf, PAGE_SIZE, "%s\n",lpfc_info(host));
201 }
202 
203 /**
204  * lpfc_serialnum_show - Return the hba serial number in ascii
205  * @dev: class converted to a Scsi_host structure.
206  * @attr: device attribute, not used.
207  * @buf: on return contains the formatted text serial number.
208  *
209  * Returns: size of formatted string.
210  **/
211 static ssize_t
212 lpfc_serialnum_show(struct device *dev, struct device_attribute *attr,
213 		    char *buf)
214 {
215 	struct Scsi_Host  *shost = class_to_shost(dev);
216 	struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata;
217 	struct lpfc_hba   *phba = vport->phba;
218 
219 	return snprintf(buf, PAGE_SIZE, "%s\n",phba->SerialNumber);
220 }
221 
222 /**
223  * lpfc_temp_sensor_show - Return the temperature sensor level
224  * @dev: class converted to a Scsi_host structure.
225  * @attr: device attribute, not used.
226  * @buf: on return contains the formatted support level.
227  *
228  * Description:
229  * Returns a number indicating the temperature sensor level currently
230  * supported, zero or one in ascii.
231  *
232  * Returns: size of formatted string.
233  **/
234 static ssize_t
235 lpfc_temp_sensor_show(struct device *dev, struct device_attribute *attr,
236 		      char *buf)
237 {
238 	struct Scsi_Host *shost = class_to_shost(dev);
239 	struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata;
240 	struct lpfc_hba   *phba = vport->phba;
241 	return snprintf(buf, PAGE_SIZE, "%d\n",phba->temp_sensor_support);
242 }
243 
244 /**
245  * lpfc_modeldesc_show - Return the model description of the hba
246  * @dev: class converted to a Scsi_host structure.
247  * @attr: device attribute, not used.
248  * @buf: on return contains the scsi vpd model description.
249  *
250  * Returns: size of formatted string.
251  **/
252 static ssize_t
253 lpfc_modeldesc_show(struct device *dev, struct device_attribute *attr,
254 		    char *buf)
255 {
256 	struct Scsi_Host  *shost = class_to_shost(dev);
257 	struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata;
258 	struct lpfc_hba   *phba = vport->phba;
259 
260 	return snprintf(buf, PAGE_SIZE, "%s\n",phba->ModelDesc);
261 }
262 
263 /**
264  * lpfc_modelname_show - Return the model name of the hba
265  * @dev: class converted to a Scsi_host structure.
266  * @attr: device attribute, not used.
267  * @buf: on return contains the scsi vpd model name.
268  *
269  * Returns: size of formatted string.
270  **/
271 static ssize_t
272 lpfc_modelname_show(struct device *dev, struct device_attribute *attr,
273 		    char *buf)
274 {
275 	struct Scsi_Host  *shost = class_to_shost(dev);
276 	struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata;
277 	struct lpfc_hba   *phba = vport->phba;
278 
279 	return snprintf(buf, PAGE_SIZE, "%s\n",phba->ModelName);
280 }
281 
282 /**
283  * lpfc_programtype_show - Return the program type of the hba
284  * @dev: class converted to a Scsi_host structure.
285  * @attr: device attribute, not used.
286  * @buf: on return contains the scsi vpd program type.
287  *
288  * Returns: size of formatted string.
289  **/
290 static ssize_t
291 lpfc_programtype_show(struct device *dev, struct device_attribute *attr,
292 		      char *buf)
293 {
294 	struct Scsi_Host  *shost = class_to_shost(dev);
295 	struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata;
296 	struct lpfc_hba   *phba = vport->phba;
297 
298 	return snprintf(buf, PAGE_SIZE, "%s\n",phba->ProgramType);
299 }
300 
301 /**
302  * lpfc_mlomgmt_show - Return the Menlo Maintenance sli flag
303  * @dev: class converted to a Scsi_host structure.
304  * @attr: device attribute, not used.
305  * @buf: on return contains the Menlo Maintenance sli flag.
306  *
307  * Returns: size of formatted string.
308  **/
309 static ssize_t
310 lpfc_mlomgmt_show(struct device *dev, struct device_attribute *attr, char *buf)
311 {
312 	struct Scsi_Host  *shost = class_to_shost(dev);
313 	struct lpfc_vport *vport = (struct lpfc_vport *)shost->hostdata;
314 	struct lpfc_hba   *phba = vport->phba;
315 
316 	return snprintf(buf, PAGE_SIZE, "%d\n",
317 		(phba->sli.sli_flag & LPFC_MENLO_MAINT));
318 }
319 
320 /**
321  * lpfc_vportnum_show - Return the port number in ascii of the hba
322  * @dev: class converted to a Scsi_host structure.
323  * @attr: device attribute, not used.
324  * @buf: on return contains scsi vpd program type.
325  *
326  * Returns: size of formatted string.
327  **/
328 static ssize_t
329 lpfc_vportnum_show(struct device *dev, struct device_attribute *attr,
330 		   char *buf)
331 {
332 	struct Scsi_Host  *shost = class_to_shost(dev);
333 	struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata;
334 	struct lpfc_hba   *phba = vport->phba;
335 
336 	return snprintf(buf, PAGE_SIZE, "%s\n",phba->Port);
337 }
338 
339 /**
340  * lpfc_fwrev_show - Return the firmware rev running in the hba
341  * @dev: class converted to a Scsi_host structure.
342  * @attr: device attribute, not used.
343  * @buf: on return contains the scsi vpd program type.
344  *
345  * Returns: size of formatted string.
346  **/
347 static ssize_t
348 lpfc_fwrev_show(struct device *dev, struct device_attribute *attr,
349 		char *buf)
350 {
351 	struct Scsi_Host  *shost = class_to_shost(dev);
352 	struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata;
353 	struct lpfc_hba   *phba = vport->phba;
354 	uint32_t if_type;
355 	uint8_t sli_family;
356 	char fwrev[32];
357 	int len;
358 
359 	lpfc_decode_firmware_rev(phba, fwrev, 1);
360 	if_type = phba->sli4_hba.pc_sli4_params.if_type;
361 	sli_family = phba->sli4_hba.pc_sli4_params.sli_family;
362 
363 	if (phba->sli_rev < LPFC_SLI_REV4)
364 		len = snprintf(buf, PAGE_SIZE, "%s, sli-%d\n",
365 			       fwrev, phba->sli_rev);
366 	else
367 		len = snprintf(buf, PAGE_SIZE, "%s, sli-%d:%d:%x\n",
368 			       fwrev, phba->sli_rev, if_type, sli_family);
369 
370 	return len;
371 }
372 
373 /**
374  * lpfc_hdw_show - Return the jedec information about the hba
375  * @dev: class converted to a Scsi_host structure.
376  * @attr: device attribute, not used.
377  * @buf: on return contains the scsi vpd program type.
378  *
379  * Returns: size of formatted string.
380  **/
381 static ssize_t
382 lpfc_hdw_show(struct device *dev, struct device_attribute *attr, char *buf)
383 {
384 	char hdw[9];
385 	struct Scsi_Host  *shost = class_to_shost(dev);
386 	struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata;
387 	struct lpfc_hba   *phba = vport->phba;
388 	lpfc_vpd_t *vp = &phba->vpd;
389 
390 	lpfc_jedec_to_ascii(vp->rev.biuRev, hdw);
391 	return snprintf(buf, PAGE_SIZE, "%s\n", hdw);
392 }
393 
394 /**
395  * lpfc_option_rom_version_show - Return the adapter ROM FCode version
396  * @dev: class converted to a Scsi_host structure.
397  * @attr: device attribute, not used.
398  * @buf: on return contains the ROM and FCode ascii strings.
399  *
400  * Returns: size of formatted string.
401  **/
402 static ssize_t
403 lpfc_option_rom_version_show(struct device *dev, struct device_attribute *attr,
404 			     char *buf)
405 {
406 	struct Scsi_Host  *shost = class_to_shost(dev);
407 	struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata;
408 	struct lpfc_hba   *phba = vport->phba;
409 
410 	return snprintf(buf, PAGE_SIZE, "%s\n", phba->OptionROMVersion);
411 }
412 
413 /**
414  * lpfc_state_show - Return the link state of the port
415  * @dev: class converted to a Scsi_host structure.
416  * @attr: device attribute, not used.
417  * @buf: on return contains text describing the state of the link.
418  *
419  * Notes:
420  * The switch statement has no default so zero will be returned.
421  *
422  * Returns: size of formatted string.
423  **/
424 static ssize_t
425 lpfc_link_state_show(struct device *dev, struct device_attribute *attr,
426 		     char *buf)
427 {
428 	struct Scsi_Host  *shost = class_to_shost(dev);
429 	struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata;
430 	struct lpfc_hba   *phba = vport->phba;
431 	int  len = 0;
432 
433 	switch (phba->link_state) {
434 	case LPFC_LINK_UNKNOWN:
435 	case LPFC_WARM_START:
436 	case LPFC_INIT_START:
437 	case LPFC_INIT_MBX_CMDS:
438 	case LPFC_LINK_DOWN:
439 	case LPFC_HBA_ERROR:
440 		if (phba->hba_flag & LINK_DISABLED)
441 			len += snprintf(buf + len, PAGE_SIZE-len,
442 				"Link Down - User disabled\n");
443 		else
444 			len += snprintf(buf + len, PAGE_SIZE-len,
445 				"Link Down\n");
446 		break;
447 	case LPFC_LINK_UP:
448 	case LPFC_CLEAR_LA:
449 	case LPFC_HBA_READY:
450 		len += snprintf(buf + len, PAGE_SIZE-len, "Link Up - ");
451 
452 		switch (vport->port_state) {
453 		case LPFC_LOCAL_CFG_LINK:
454 			len += snprintf(buf + len, PAGE_SIZE-len,
455 					"Configuring Link\n");
456 			break;
457 		case LPFC_FDISC:
458 		case LPFC_FLOGI:
459 		case LPFC_FABRIC_CFG_LINK:
460 		case LPFC_NS_REG:
461 		case LPFC_NS_QRY:
462 		case LPFC_BUILD_DISC_LIST:
463 		case LPFC_DISC_AUTH:
464 			len += snprintf(buf + len, PAGE_SIZE - len,
465 					"Discovery\n");
466 			break;
467 		case LPFC_VPORT_READY:
468 			len += snprintf(buf + len, PAGE_SIZE - len, "Ready\n");
469 			break;
470 
471 		case LPFC_VPORT_FAILED:
472 			len += snprintf(buf + len, PAGE_SIZE - len, "Failed\n");
473 			break;
474 
475 		case LPFC_VPORT_UNKNOWN:
476 			len += snprintf(buf + len, PAGE_SIZE - len,
477 					"Unknown\n");
478 			break;
479 		}
480 		if (phba->sli.sli_flag & LPFC_MENLO_MAINT)
481 			len += snprintf(buf + len, PAGE_SIZE-len,
482 					"   Menlo Maint Mode\n");
483 		else if (phba->fc_topology == LPFC_TOPOLOGY_LOOP) {
484 			if (vport->fc_flag & FC_PUBLIC_LOOP)
485 				len += snprintf(buf + len, PAGE_SIZE-len,
486 						"   Public Loop\n");
487 			else
488 				len += snprintf(buf + len, PAGE_SIZE-len,
489 						"   Private Loop\n");
490 		} else {
491 			if (vport->fc_flag & FC_FABRIC)
492 				len += snprintf(buf + len, PAGE_SIZE-len,
493 						"   Fabric\n");
494 			else
495 				len += snprintf(buf + len, PAGE_SIZE-len,
496 						"   Point-2-Point\n");
497 		}
498 	}
499 
500 	return len;
501 }
502 
503 /**
504  * lpfc_sli4_protocol_show - Return the fip mode of the HBA
505  * @dev: class unused variable.
506  * @attr: device attribute, not used.
507  * @buf: on return contains the module description text.
508  *
509  * Returns: size of formatted string.
510  **/
511 static ssize_t
512 lpfc_sli4_protocol_show(struct device *dev, struct device_attribute *attr,
513 			char *buf)
514 {
515 	struct Scsi_Host *shost = class_to_shost(dev);
516 	struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata;
517 	struct lpfc_hba *phba = vport->phba;
518 
519 	if (phba->sli_rev < LPFC_SLI_REV4)
520 		return snprintf(buf, PAGE_SIZE, "fc\n");
521 
522 	if (phba->sli4_hba.lnk_info.lnk_dv == LPFC_LNK_DAT_VAL) {
523 		if (phba->sli4_hba.lnk_info.lnk_tp == LPFC_LNK_TYPE_GE)
524 			return snprintf(buf, PAGE_SIZE, "fcoe\n");
525 		if (phba->sli4_hba.lnk_info.lnk_tp == LPFC_LNK_TYPE_FC)
526 			return snprintf(buf, PAGE_SIZE, "fc\n");
527 	}
528 	return snprintf(buf, PAGE_SIZE, "unknown\n");
529 }
530 
531 /**
532  * lpfc_link_state_store - Transition the link_state on an HBA port
533  * @dev: class device that is converted into a Scsi_host.
534  * @attr: device attribute, not used.
535  * @buf: one or more lpfc_polling_flags values.
536  * @count: not used.
537  *
538  * Returns:
539  * -EINVAL if the buffer is not "up" or "down"
540  * return from link state change function if non-zero
541  * length of the buf on success
542  **/
543 static ssize_t
544 lpfc_link_state_store(struct device *dev, struct device_attribute *attr,
545 		const char *buf, size_t count)
546 {
547 	struct Scsi_Host  *shost = class_to_shost(dev);
548 	struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata;
549 	struct lpfc_hba   *phba = vport->phba;
550 
551 	int status = -EINVAL;
552 
553 	if ((strncmp(buf, "up", sizeof("up") - 1) == 0) &&
554 			(phba->link_state == LPFC_LINK_DOWN))
555 		status = phba->lpfc_hba_init_link(phba, MBX_NOWAIT);
556 	else if ((strncmp(buf, "down", sizeof("down") - 1) == 0) &&
557 			(phba->link_state >= LPFC_LINK_UP))
558 		status = phba->lpfc_hba_down_link(phba, MBX_NOWAIT);
559 
560 	if (status == 0)
561 		return strlen(buf);
562 	else
563 		return status;
564 }
565 
566 /**
567  * lpfc_num_discovered_ports_show - Return sum of mapped and unmapped vports
568  * @dev: class device that is converted into a Scsi_host.
569  * @attr: device attribute, not used.
570  * @buf: on return contains the sum of fc mapped and unmapped.
571  *
572  * Description:
573  * Returns the ascii text number of the sum of the fc mapped and unmapped
574  * vport counts.
575  *
576  * Returns: size of formatted string.
577  **/
578 static ssize_t
579 lpfc_num_discovered_ports_show(struct device *dev,
580 			       struct device_attribute *attr, char *buf)
581 {
582 	struct Scsi_Host  *shost = class_to_shost(dev);
583 	struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata;
584 
585 	return snprintf(buf, PAGE_SIZE, "%d\n",
586 			vport->fc_map_cnt + vport->fc_unmap_cnt);
587 }
588 
589 /**
590  * lpfc_issue_lip - Misnomer, name carried over from long ago
591  * @shost: Scsi_Host pointer.
592  *
593  * Description:
594  * Bring the link down gracefully then re-init the link. The firmware will
595  * re-init the fiber channel interface as required. Does not issue a LIP.
596  *
597  * Returns:
598  * -EPERM port offline or management commands are being blocked
599  * -ENOMEM cannot allocate memory for the mailbox command
600  * -EIO error sending the mailbox command
601  * zero for success
602  **/
603 static int
604 lpfc_issue_lip(struct Scsi_Host *shost)
605 {
606 	struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata;
607 	struct lpfc_hba   *phba = vport->phba;
608 	LPFC_MBOXQ_t *pmboxq;
609 	int mbxstatus = MBXERR_ERROR;
610 
611 	if ((vport->fc_flag & FC_OFFLINE_MODE) ||
612 	    (phba->sli.sli_flag & LPFC_BLOCK_MGMT_IO))
613 		return -EPERM;
614 
615 	pmboxq = mempool_alloc(phba->mbox_mem_pool,GFP_KERNEL);
616 
617 	if (!pmboxq)
618 		return -ENOMEM;
619 
620 	memset((void *)pmboxq, 0, sizeof (LPFC_MBOXQ_t));
621 	pmboxq->u.mb.mbxCommand = MBX_DOWN_LINK;
622 	pmboxq->u.mb.mbxOwner = OWN_HOST;
623 
624 	mbxstatus = lpfc_sli_issue_mbox_wait(phba, pmboxq, LPFC_MBOX_TMO * 2);
625 
626 	if ((mbxstatus == MBX_SUCCESS) &&
627 	    (pmboxq->u.mb.mbxStatus == 0 ||
628 	     pmboxq->u.mb.mbxStatus == MBXERR_LINK_DOWN)) {
629 		memset((void *)pmboxq, 0, sizeof (LPFC_MBOXQ_t));
630 		lpfc_init_link(phba, pmboxq, phba->cfg_topology,
631 			       phba->cfg_link_speed);
632 		mbxstatus = lpfc_sli_issue_mbox_wait(phba, pmboxq,
633 						     phba->fc_ratov * 2);
634 		if ((mbxstatus == MBX_SUCCESS) &&
635 		    (pmboxq->u.mb.mbxStatus == MBXERR_SEC_NO_PERMISSION))
636 			lpfc_printf_log(phba, KERN_ERR, LOG_MBOX | LOG_SLI,
637 					"2859 SLI authentication is required "
638 					"for INIT_LINK but has not done yet\n");
639 	}
640 
641 	lpfc_set_loopback_flag(phba);
642 	if (mbxstatus != MBX_TIMEOUT)
643 		mempool_free(pmboxq, phba->mbox_mem_pool);
644 
645 	if (mbxstatus == MBXERR_ERROR)
646 		return -EIO;
647 
648 	return 0;
649 }
650 
651 /**
652  * lpfc_do_offline - Issues a mailbox command to bring the link down
653  * @phba: lpfc_hba pointer.
654  * @type: LPFC_EVT_OFFLINE, LPFC_EVT_WARM_START, LPFC_EVT_KILL.
655  *
656  * Notes:
657  * Assumes any error from lpfc_do_offline() will be negative.
658  * Can wait up to 5 seconds for the port ring buffers count
659  * to reach zero, prints a warning if it is not zero and continues.
660  * lpfc_workq_post_event() returns a non-zero return code if call fails.
661  *
662  * Returns:
663  * -EIO error posting the event
664  * zero for success
665  **/
666 static int
667 lpfc_do_offline(struct lpfc_hba *phba, uint32_t type)
668 {
669 	struct completion online_compl;
670 	struct lpfc_sli_ring *pring;
671 	struct lpfc_sli *psli;
672 	int status = 0;
673 	int cnt = 0;
674 	int i;
675 	int rc;
676 
677 	init_completion(&online_compl);
678 	rc = lpfc_workq_post_event(phba, &status, &online_compl,
679 			      LPFC_EVT_OFFLINE_PREP);
680 	if (rc == 0)
681 		return -ENOMEM;
682 
683 	wait_for_completion(&online_compl);
684 
685 	if (status != 0)
686 		return -EIO;
687 
688 	psli = &phba->sli;
689 
690 	/* Wait a little for things to settle down, but not
691 	 * long enough for dev loss timeout to expire.
692 	 */
693 	for (i = 0; i < psli->num_rings; i++) {
694 		pring = &psli->ring[i];
695 		while (pring->txcmplq_cnt) {
696 			msleep(10);
697 			if (cnt++ > 500) {  /* 5 secs */
698 				lpfc_printf_log(phba,
699 					KERN_WARNING, LOG_INIT,
700 					"0466 Outstanding IO when "
701 					"bringing Adapter offline\n");
702 				break;
703 			}
704 		}
705 	}
706 
707 	init_completion(&online_compl);
708 	rc = lpfc_workq_post_event(phba, &status, &online_compl, type);
709 	if (rc == 0)
710 		return -ENOMEM;
711 
712 	wait_for_completion(&online_compl);
713 
714 	if (status != 0)
715 		return -EIO;
716 
717 	return 0;
718 }
719 
720 /**
721  * lpfc_selective_reset - Offline then onlines the port
722  * @phba: lpfc_hba pointer.
723  *
724  * Description:
725  * If the port is configured to allow a reset then the hba is brought
726  * offline then online.
727  *
728  * Notes:
729  * Assumes any error from lpfc_do_offline() will be negative.
730  * Do not make this function static.
731  *
732  * Returns:
733  * lpfc_do_offline() return code if not zero
734  * -EIO reset not configured or error posting the event
735  * zero for success
736  **/
737 int
738 lpfc_selective_reset(struct lpfc_hba *phba)
739 {
740 	struct completion online_compl;
741 	int status = 0;
742 	int rc;
743 
744 	if (!phba->cfg_enable_hba_reset)
745 		return -EACCES;
746 
747 	status = lpfc_do_offline(phba, LPFC_EVT_OFFLINE);
748 
749 	if (status != 0)
750 		return status;
751 
752 	init_completion(&online_compl);
753 	rc = lpfc_workq_post_event(phba, &status, &online_compl,
754 			      LPFC_EVT_ONLINE);
755 	if (rc == 0)
756 		return -ENOMEM;
757 
758 	wait_for_completion(&online_compl);
759 
760 	if (status != 0)
761 		return -EIO;
762 
763 	return 0;
764 }
765 
766 /**
767  * lpfc_issue_reset - Selectively resets an adapter
768  * @dev: class device that is converted into a Scsi_host.
769  * @attr: device attribute, not used.
770  * @buf: containing the string "selective".
771  * @count: unused variable.
772  *
773  * Description:
774  * If the buf contains the string "selective" then lpfc_selective_reset()
775  * is called to perform the reset.
776  *
777  * Notes:
778  * Assumes any error from lpfc_selective_reset() will be negative.
779  * If lpfc_selective_reset() returns zero then the length of the buffer
780  * is returned which indicates success
781  *
782  * Returns:
783  * -EINVAL if the buffer does not contain the string "selective"
784  * length of buf if lpfc-selective_reset() if the call succeeds
785  * return value of lpfc_selective_reset() if the call fails
786 **/
787 static ssize_t
788 lpfc_issue_reset(struct device *dev, struct device_attribute *attr,
789 		 const char *buf, size_t count)
790 {
791 	struct Scsi_Host  *shost = class_to_shost(dev);
792 	struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata;
793 	struct lpfc_hba   *phba = vport->phba;
794 	int status = -EINVAL;
795 
796 	if (!phba->cfg_enable_hba_reset)
797 		return -EACCES;
798 
799 	if (strncmp(buf, "selective", sizeof("selective") - 1) == 0)
800 		status = phba->lpfc_selective_reset(phba);
801 
802 	if (status == 0)
803 		return strlen(buf);
804 	else
805 		return status;
806 }
807 
808 /**
809  * lpfc_sli4_pdev_status_reg_wait - Wait for pdev status register for readyness
810  * @phba: lpfc_hba pointer.
811  *
812  * Description:
813  * SLI4 interface type-2 device to wait on the sliport status register for
814  * the readyness after performing a firmware reset.
815  *
816  * Returns:
817  * zero for success, -EPERM when port does not have privilage to perform the
818  * reset, -EIO when port timeout from recovering from the reset.
819  *
820  * Note:
821  * As the caller will interpret the return code by value, be careful in making
822  * change or addition to return codes.
823  **/
824 int
825 lpfc_sli4_pdev_status_reg_wait(struct lpfc_hba *phba)
826 {
827 	struct lpfc_register portstat_reg = {0};
828 	int i;
829 
830 	msleep(100);
831 	lpfc_readl(phba->sli4_hba.u.if_type2.STATUSregaddr,
832 		   &portstat_reg.word0);
833 
834 	/* verify if privilaged for the request operation */
835 	if (!bf_get(lpfc_sliport_status_rn, &portstat_reg) &&
836 	    !bf_get(lpfc_sliport_status_err, &portstat_reg))
837 		return -EPERM;
838 
839 	/* wait for the SLI port firmware ready after firmware reset */
840 	for (i = 0; i < LPFC_FW_RESET_MAXIMUM_WAIT_10MS_CNT; i++) {
841 		msleep(10);
842 		lpfc_readl(phba->sli4_hba.u.if_type2.STATUSregaddr,
843 			   &portstat_reg.word0);
844 		if (!bf_get(lpfc_sliport_status_err, &portstat_reg))
845 			continue;
846 		if (!bf_get(lpfc_sliport_status_rn, &portstat_reg))
847 			continue;
848 		if (!bf_get(lpfc_sliport_status_rdy, &portstat_reg))
849 			continue;
850 		break;
851 	}
852 
853 	if (i < LPFC_FW_RESET_MAXIMUM_WAIT_10MS_CNT)
854 		return 0;
855 	else
856 		return -EIO;
857 }
858 
859 /**
860  * lpfc_sli4_pdev_reg_request - Request physical dev to perform a register acc
861  * @phba: lpfc_hba pointer.
862  *
863  * Description:
864  * Request SLI4 interface type-2 device to perform a physical register set
865  * access.
866  *
867  * Returns:
868  * zero for success
869  **/
870 static ssize_t
871 lpfc_sli4_pdev_reg_request(struct lpfc_hba *phba, uint32_t opcode)
872 {
873 	struct completion online_compl;
874 	struct pci_dev *pdev = phba->pcidev;
875 	uint32_t before_fc_flag;
876 	uint32_t sriov_nr_virtfn;
877 	uint32_t reg_val;
878 	int status = 0, rc = 0;
879 	int job_posted = 1, sriov_err;
880 
881 	if (!phba->cfg_enable_hba_reset)
882 		return -EACCES;
883 
884 	if ((phba->sli_rev < LPFC_SLI_REV4) ||
885 	    (bf_get(lpfc_sli_intf_if_type, &phba->sli4_hba.sli_intf) !=
886 	     LPFC_SLI_INTF_IF_TYPE_2))
887 		return -EPERM;
888 
889 	/* Keep state if we need to restore back */
890 	before_fc_flag = phba->pport->fc_flag;
891 	sriov_nr_virtfn = phba->cfg_sriov_nr_virtfn;
892 
893 	/* Disable SR-IOV virtual functions if enabled */
894 	if (phba->cfg_sriov_nr_virtfn) {
895 		pci_disable_sriov(pdev);
896 		phba->cfg_sriov_nr_virtfn = 0;
897 	}
898 	status = lpfc_do_offline(phba, LPFC_EVT_OFFLINE);
899 
900 	if (status != 0)
901 		return status;
902 
903 	/* wait for the device to be quiesced before firmware reset */
904 	msleep(100);
905 
906 	reg_val = readl(phba->sli4_hba.conf_regs_memmap_p +
907 			LPFC_CTL_PDEV_CTL_OFFSET);
908 
909 	if (opcode == LPFC_FW_DUMP)
910 		reg_val |= LPFC_FW_DUMP_REQUEST;
911 	else if (opcode == LPFC_FW_RESET)
912 		reg_val |= LPFC_CTL_PDEV_CTL_FRST;
913 	else if (opcode == LPFC_DV_RESET)
914 		reg_val |= LPFC_CTL_PDEV_CTL_DRST;
915 
916 	writel(reg_val, phba->sli4_hba.conf_regs_memmap_p +
917 	       LPFC_CTL_PDEV_CTL_OFFSET);
918 	/* flush */
919 	readl(phba->sli4_hba.conf_regs_memmap_p + LPFC_CTL_PDEV_CTL_OFFSET);
920 
921 	/* delay driver action following IF_TYPE_2 reset */
922 	rc = lpfc_sli4_pdev_status_reg_wait(phba);
923 
924 	if (rc == -EPERM) {
925 		/* no privilage for reset, restore if needed */
926 		if (before_fc_flag & FC_OFFLINE_MODE)
927 			goto out;
928 	} else if (rc == -EIO) {
929 		/* reset failed, there is nothing more we can do */
930 		return rc;
931 	}
932 
933 	/* keep the original port state */
934 	if (before_fc_flag & FC_OFFLINE_MODE)
935 		goto out;
936 
937 	init_completion(&online_compl);
938 	job_posted = lpfc_workq_post_event(phba, &status, &online_compl,
939 					   LPFC_EVT_ONLINE);
940 	if (!job_posted)
941 		goto out;
942 
943 	wait_for_completion(&online_compl);
944 
945 out:
946 	/* in any case, restore the virtual functions enabled as before */
947 	if (sriov_nr_virtfn) {
948 		sriov_err =
949 			lpfc_sli_probe_sriov_nr_virtfn(phba, sriov_nr_virtfn);
950 		if (!sriov_err)
951 			phba->cfg_sriov_nr_virtfn = sriov_nr_virtfn;
952 	}
953 
954 	/* return proper error code */
955 	if (!rc) {
956 		if (!job_posted)
957 			rc = -ENOMEM;
958 		else if (status)
959 			rc = -EIO;
960 	}
961 	return rc;
962 }
963 
964 /**
965  * lpfc_nport_evt_cnt_show - Return the number of nport events
966  * @dev: class device that is converted into a Scsi_host.
967  * @attr: device attribute, not used.
968  * @buf: on return contains the ascii number of nport events.
969  *
970  * Returns: size of formatted string.
971  **/
972 static ssize_t
973 lpfc_nport_evt_cnt_show(struct device *dev, struct device_attribute *attr,
974 			char *buf)
975 {
976 	struct Scsi_Host  *shost = class_to_shost(dev);
977 	struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata;
978 	struct lpfc_hba   *phba = vport->phba;
979 
980 	return snprintf(buf, PAGE_SIZE, "%d\n", phba->nport_event_cnt);
981 }
982 
983 /**
984  * lpfc_board_mode_show - Return the state of the board
985  * @dev: class device that is converted into a Scsi_host.
986  * @attr: device attribute, not used.
987  * @buf: on return contains the state of the adapter.
988  *
989  * Returns: size of formatted string.
990  **/
991 static ssize_t
992 lpfc_board_mode_show(struct device *dev, struct device_attribute *attr,
993 		     char *buf)
994 {
995 	struct Scsi_Host  *shost = class_to_shost(dev);
996 	struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata;
997 	struct lpfc_hba   *phba = vport->phba;
998 	char  * state;
999 
1000 	if (phba->link_state == LPFC_HBA_ERROR)
1001 		state = "error";
1002 	else if (phba->link_state == LPFC_WARM_START)
1003 		state = "warm start";
1004 	else if (phba->link_state == LPFC_INIT_START)
1005 		state = "offline";
1006 	else
1007 		state = "online";
1008 
1009 	return snprintf(buf, PAGE_SIZE, "%s\n", state);
1010 }
1011 
1012 /**
1013  * lpfc_board_mode_store - Puts the hba in online, offline, warm or error state
1014  * @dev: class device that is converted into a Scsi_host.
1015  * @attr: device attribute, not used.
1016  * @buf: containing one of the strings "online", "offline", "warm" or "error".
1017  * @count: unused variable.
1018  *
1019  * Returns:
1020  * -EACCES if enable hba reset not enabled
1021  * -EINVAL if the buffer does not contain a valid string (see above)
1022  * -EIO if lpfc_workq_post_event() or lpfc_do_offline() fails
1023  * buf length greater than zero indicates success
1024  **/
1025 static ssize_t
1026 lpfc_board_mode_store(struct device *dev, struct device_attribute *attr,
1027 		      const char *buf, size_t count)
1028 {
1029 	struct Scsi_Host  *shost = class_to_shost(dev);
1030 	struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata;
1031 	struct lpfc_hba   *phba = vport->phba;
1032 	struct completion online_compl;
1033 	char *board_mode_str = NULL;
1034 	int status = 0;
1035 	int rc;
1036 
1037 	if (!phba->cfg_enable_hba_reset) {
1038 		status = -EACCES;
1039 		goto board_mode_out;
1040 	}
1041 
1042 	lpfc_printf_vlog(vport, KERN_ERR, LOG_INIT,
1043 			 "3050 lpfc_board_mode set to %s\n", buf);
1044 
1045 	init_completion(&online_compl);
1046 
1047 	if(strncmp(buf, "online", sizeof("online") - 1) == 0) {
1048 		rc = lpfc_workq_post_event(phba, &status, &online_compl,
1049 				      LPFC_EVT_ONLINE);
1050 		if (rc == 0) {
1051 			status = -ENOMEM;
1052 			goto board_mode_out;
1053 		}
1054 		wait_for_completion(&online_compl);
1055 	} else if (strncmp(buf, "offline", sizeof("offline") - 1) == 0)
1056 		status = lpfc_do_offline(phba, LPFC_EVT_OFFLINE);
1057 	else if (strncmp(buf, "warm", sizeof("warm") - 1) == 0)
1058 		if (phba->sli_rev == LPFC_SLI_REV4)
1059 			status = -EINVAL;
1060 		else
1061 			status = lpfc_do_offline(phba, LPFC_EVT_WARM_START);
1062 	else if (strncmp(buf, "error", sizeof("error") - 1) == 0)
1063 		if (phba->sli_rev == LPFC_SLI_REV4)
1064 			status = -EINVAL;
1065 		else
1066 			status = lpfc_do_offline(phba, LPFC_EVT_KILL);
1067 	else if (strncmp(buf, "dump", sizeof("dump") - 1) == 0)
1068 		status = lpfc_sli4_pdev_reg_request(phba, LPFC_FW_DUMP);
1069 	else if (strncmp(buf, "fw_reset", sizeof("fw_reset") - 1) == 0)
1070 		status = lpfc_sli4_pdev_reg_request(phba, LPFC_FW_RESET);
1071 	else if (strncmp(buf, "dv_reset", sizeof("dv_reset") - 1) == 0)
1072 		status = lpfc_sli4_pdev_reg_request(phba, LPFC_DV_RESET);
1073 	else
1074 		status = -EINVAL;
1075 
1076 board_mode_out:
1077 	if (!status)
1078 		return strlen(buf);
1079 	else {
1080 		board_mode_str = strchr(buf, '\n');
1081 		if (board_mode_str)
1082 			*board_mode_str = '\0';
1083 		lpfc_printf_vlog(vport, KERN_ERR, LOG_INIT,
1084 				 "3097 Failed \"%s\", status(%d), "
1085 				 "fc_flag(x%x)\n",
1086 				 buf, status, phba->pport->fc_flag);
1087 		return status;
1088 	}
1089 }
1090 
1091 /**
1092  * lpfc_get_hba_info - Return various bits of informaton about the adapter
1093  * @phba: pointer to the adapter structure.
1094  * @mxri: max xri count.
1095  * @axri: available xri count.
1096  * @mrpi: max rpi count.
1097  * @arpi: available rpi count.
1098  * @mvpi: max vpi count.
1099  * @avpi: available vpi count.
1100  *
1101  * Description:
1102  * If an integer pointer for an count is not null then the value for the
1103  * count is returned.
1104  *
1105  * Returns:
1106  * zero on error
1107  * one for success
1108  **/
1109 static int
1110 lpfc_get_hba_info(struct lpfc_hba *phba,
1111 		  uint32_t *mxri, uint32_t *axri,
1112 		  uint32_t *mrpi, uint32_t *arpi,
1113 		  uint32_t *mvpi, uint32_t *avpi)
1114 {
1115 	struct lpfc_mbx_read_config *rd_config;
1116 	LPFC_MBOXQ_t *pmboxq;
1117 	MAILBOX_t *pmb;
1118 	int rc = 0;
1119 	uint32_t max_vpi;
1120 
1121 	/*
1122 	 * prevent udev from issuing mailbox commands until the port is
1123 	 * configured.
1124 	 */
1125 	if (phba->link_state < LPFC_LINK_DOWN ||
1126 	    !phba->mbox_mem_pool ||
1127 	    (phba->sli.sli_flag & LPFC_SLI_ACTIVE) == 0)
1128 		return 0;
1129 
1130 	if (phba->sli.sli_flag & LPFC_BLOCK_MGMT_IO)
1131 		return 0;
1132 
1133 	pmboxq = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL);
1134 	if (!pmboxq)
1135 		return 0;
1136 	memset(pmboxq, 0, sizeof (LPFC_MBOXQ_t));
1137 
1138 	pmb = &pmboxq->u.mb;
1139 	pmb->mbxCommand = MBX_READ_CONFIG;
1140 	pmb->mbxOwner = OWN_HOST;
1141 	pmboxq->context1 = NULL;
1142 
1143 	if (phba->pport->fc_flag & FC_OFFLINE_MODE)
1144 		rc = MBX_NOT_FINISHED;
1145 	else
1146 		rc = lpfc_sli_issue_mbox_wait(phba, pmboxq, phba->fc_ratov * 2);
1147 
1148 	if (rc != MBX_SUCCESS) {
1149 		if (rc != MBX_TIMEOUT)
1150 			mempool_free(pmboxq, phba->mbox_mem_pool);
1151 		return 0;
1152 	}
1153 
1154 	if (phba->sli_rev == LPFC_SLI_REV4) {
1155 		rd_config = &pmboxq->u.mqe.un.rd_config;
1156 		if (mrpi)
1157 			*mrpi = bf_get(lpfc_mbx_rd_conf_rpi_count, rd_config);
1158 		if (arpi)
1159 			*arpi = bf_get(lpfc_mbx_rd_conf_rpi_count, rd_config) -
1160 					phba->sli4_hba.max_cfg_param.rpi_used;
1161 		if (mxri)
1162 			*mxri = bf_get(lpfc_mbx_rd_conf_xri_count, rd_config);
1163 		if (axri)
1164 			*axri = bf_get(lpfc_mbx_rd_conf_xri_count, rd_config) -
1165 					phba->sli4_hba.max_cfg_param.xri_used;
1166 
1167 		/* Account for differences with SLI-3.  Get vpi count from
1168 		 * mailbox data and subtract one for max vpi value.
1169 		 */
1170 		max_vpi = (bf_get(lpfc_mbx_rd_conf_vpi_count, rd_config) > 0) ?
1171 			(bf_get(lpfc_mbx_rd_conf_vpi_count, rd_config) - 1) : 0;
1172 
1173 		if (mvpi)
1174 			*mvpi = max_vpi;
1175 		if (avpi)
1176 			*avpi = max_vpi - phba->sli4_hba.max_cfg_param.vpi_used;
1177 	} else {
1178 		if (mrpi)
1179 			*mrpi = pmb->un.varRdConfig.max_rpi;
1180 		if (arpi)
1181 			*arpi = pmb->un.varRdConfig.avail_rpi;
1182 		if (mxri)
1183 			*mxri = pmb->un.varRdConfig.max_xri;
1184 		if (axri)
1185 			*axri = pmb->un.varRdConfig.avail_xri;
1186 		if (mvpi)
1187 			*mvpi = pmb->un.varRdConfig.max_vpi;
1188 		if (avpi)
1189 			*avpi = pmb->un.varRdConfig.avail_vpi;
1190 	}
1191 
1192 	mempool_free(pmboxq, phba->mbox_mem_pool);
1193 	return 1;
1194 }
1195 
1196 /**
1197  * lpfc_max_rpi_show - Return maximum rpi
1198  * @dev: class device that is converted into a Scsi_host.
1199  * @attr: device attribute, not used.
1200  * @buf: on return contains the maximum rpi count in decimal or "Unknown".
1201  *
1202  * Description:
1203  * Calls lpfc_get_hba_info() asking for just the mrpi count.
1204  * If lpfc_get_hba_info() returns zero (failure) the buffer text is set
1205  * to "Unknown" and the buffer length is returned, therefore the caller
1206  * must check for "Unknown" in the buffer to detect a failure.
1207  *
1208  * Returns: size of formatted string.
1209  **/
1210 static ssize_t
1211 lpfc_max_rpi_show(struct device *dev, struct device_attribute *attr,
1212 		  char *buf)
1213 {
1214 	struct Scsi_Host  *shost = class_to_shost(dev);
1215 	struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata;
1216 	struct lpfc_hba   *phba = vport->phba;
1217 	uint32_t cnt;
1218 
1219 	if (lpfc_get_hba_info(phba, NULL, NULL, &cnt, NULL, NULL, NULL))
1220 		return snprintf(buf, PAGE_SIZE, "%d\n", cnt);
1221 	return snprintf(buf, PAGE_SIZE, "Unknown\n");
1222 }
1223 
1224 /**
1225  * lpfc_used_rpi_show - Return maximum rpi minus available rpi
1226  * @dev: class device that is converted into a Scsi_host.
1227  * @attr: device attribute, not used.
1228  * @buf: containing the used rpi count in decimal or "Unknown".
1229  *
1230  * Description:
1231  * Calls lpfc_get_hba_info() asking for just the mrpi and arpi counts.
1232  * If lpfc_get_hba_info() returns zero (failure) the buffer text is set
1233  * to "Unknown" and the buffer length is returned, therefore the caller
1234  * must check for "Unknown" in the buffer to detect a failure.
1235  *
1236  * Returns: size of formatted string.
1237  **/
1238 static ssize_t
1239 lpfc_used_rpi_show(struct device *dev, struct device_attribute *attr,
1240 		   char *buf)
1241 {
1242 	struct Scsi_Host  *shost = class_to_shost(dev);
1243 	struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata;
1244 	struct lpfc_hba   *phba = vport->phba;
1245 	uint32_t cnt, acnt;
1246 
1247 	if (lpfc_get_hba_info(phba, NULL, NULL, &cnt, &acnt, NULL, NULL))
1248 		return snprintf(buf, PAGE_SIZE, "%d\n", (cnt - acnt));
1249 	return snprintf(buf, PAGE_SIZE, "Unknown\n");
1250 }
1251 
1252 /**
1253  * lpfc_max_xri_show - Return maximum xri
1254  * @dev: class device that is converted into a Scsi_host.
1255  * @attr: device attribute, not used.
1256  * @buf: on return contains the maximum xri count in decimal or "Unknown".
1257  *
1258  * Description:
1259  * Calls lpfc_get_hba_info() asking for just the mrpi count.
1260  * If lpfc_get_hba_info() returns zero (failure) the buffer text is set
1261  * to "Unknown" and the buffer length is returned, therefore the caller
1262  * must check for "Unknown" in the buffer to detect a failure.
1263  *
1264  * Returns: size of formatted string.
1265  **/
1266 static ssize_t
1267 lpfc_max_xri_show(struct device *dev, struct device_attribute *attr,
1268 		  char *buf)
1269 {
1270 	struct Scsi_Host  *shost = class_to_shost(dev);
1271 	struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata;
1272 	struct lpfc_hba   *phba = vport->phba;
1273 	uint32_t cnt;
1274 
1275 	if (lpfc_get_hba_info(phba, &cnt, NULL, NULL, NULL, NULL, NULL))
1276 		return snprintf(buf, PAGE_SIZE, "%d\n", cnt);
1277 	return snprintf(buf, PAGE_SIZE, "Unknown\n");
1278 }
1279 
1280 /**
1281  * lpfc_used_xri_show - Return maximum xpi minus the available xpi
1282  * @dev: class device that is converted into a Scsi_host.
1283  * @attr: device attribute, not used.
1284  * @buf: on return contains the used xri count in decimal or "Unknown".
1285  *
1286  * Description:
1287  * Calls lpfc_get_hba_info() asking for just the mxri and axri counts.
1288  * If lpfc_get_hba_info() returns zero (failure) the buffer text is set
1289  * to "Unknown" and the buffer length is returned, therefore the caller
1290  * must check for "Unknown" in the buffer to detect a failure.
1291  *
1292  * Returns: size of formatted string.
1293  **/
1294 static ssize_t
1295 lpfc_used_xri_show(struct device *dev, struct device_attribute *attr,
1296 		   char *buf)
1297 {
1298 	struct Scsi_Host  *shost = class_to_shost(dev);
1299 	struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata;
1300 	struct lpfc_hba   *phba = vport->phba;
1301 	uint32_t cnt, acnt;
1302 
1303 	if (lpfc_get_hba_info(phba, &cnt, &acnt, NULL, NULL, NULL, NULL))
1304 		return snprintf(buf, PAGE_SIZE, "%d\n", (cnt - acnt));
1305 	return snprintf(buf, PAGE_SIZE, "Unknown\n");
1306 }
1307 
1308 /**
1309  * lpfc_max_vpi_show - Return maximum vpi
1310  * @dev: class device that is converted into a Scsi_host.
1311  * @attr: device attribute, not used.
1312  * @buf: on return contains the maximum vpi count in decimal or "Unknown".
1313  *
1314  * Description:
1315  * Calls lpfc_get_hba_info() asking for just the mvpi count.
1316  * If lpfc_get_hba_info() returns zero (failure) the buffer text is set
1317  * to "Unknown" and the buffer length is returned, therefore the caller
1318  * must check for "Unknown" in the buffer to detect a failure.
1319  *
1320  * Returns: size of formatted string.
1321  **/
1322 static ssize_t
1323 lpfc_max_vpi_show(struct device *dev, struct device_attribute *attr,
1324 		  char *buf)
1325 {
1326 	struct Scsi_Host  *shost = class_to_shost(dev);
1327 	struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata;
1328 	struct lpfc_hba   *phba = vport->phba;
1329 	uint32_t cnt;
1330 
1331 	if (lpfc_get_hba_info(phba, NULL, NULL, NULL, NULL, &cnt, NULL))
1332 		return snprintf(buf, PAGE_SIZE, "%d\n", cnt);
1333 	return snprintf(buf, PAGE_SIZE, "Unknown\n");
1334 }
1335 
1336 /**
1337  * lpfc_used_vpi_show - Return maximum vpi minus the available vpi
1338  * @dev: class device that is converted into a Scsi_host.
1339  * @attr: device attribute, not used.
1340  * @buf: on return contains the used vpi count in decimal or "Unknown".
1341  *
1342  * Description:
1343  * Calls lpfc_get_hba_info() asking for just the mvpi and avpi counts.
1344  * If lpfc_get_hba_info() returns zero (failure) the buffer text is set
1345  * to "Unknown" and the buffer length is returned, therefore the caller
1346  * must check for "Unknown" in the buffer to detect a failure.
1347  *
1348  * Returns: size of formatted string.
1349  **/
1350 static ssize_t
1351 lpfc_used_vpi_show(struct device *dev, struct device_attribute *attr,
1352 		   char *buf)
1353 {
1354 	struct Scsi_Host  *shost = class_to_shost(dev);
1355 	struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata;
1356 	struct lpfc_hba   *phba = vport->phba;
1357 	uint32_t cnt, acnt;
1358 
1359 	if (lpfc_get_hba_info(phba, NULL, NULL, NULL, NULL, &cnt, &acnt))
1360 		return snprintf(buf, PAGE_SIZE, "%d\n", (cnt - acnt));
1361 	return snprintf(buf, PAGE_SIZE, "Unknown\n");
1362 }
1363 
1364 /**
1365  * lpfc_npiv_info_show - Return text about NPIV support for the adapter
1366  * @dev: class device that is converted into a Scsi_host.
1367  * @attr: device attribute, not used.
1368  * @buf: text that must be interpreted to determine if npiv is supported.
1369  *
1370  * Description:
1371  * Buffer will contain text indicating npiv is not suppoerted on the port,
1372  * the port is an NPIV physical port, or it is an npiv virtual port with
1373  * the id of the vport.
1374  *
1375  * Returns: size of formatted string.
1376  **/
1377 static ssize_t
1378 lpfc_npiv_info_show(struct device *dev, struct device_attribute *attr,
1379 		    char *buf)
1380 {
1381 	struct Scsi_Host  *shost = class_to_shost(dev);
1382 	struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata;
1383 	struct lpfc_hba   *phba = vport->phba;
1384 
1385 	if (!(phba->max_vpi))
1386 		return snprintf(buf, PAGE_SIZE, "NPIV Not Supported\n");
1387 	if (vport->port_type == LPFC_PHYSICAL_PORT)
1388 		return snprintf(buf, PAGE_SIZE, "NPIV Physical\n");
1389 	return snprintf(buf, PAGE_SIZE, "NPIV Virtual (VPI %d)\n", vport->vpi);
1390 }
1391 
1392 /**
1393  * lpfc_poll_show - Return text about poll support for the adapter
1394  * @dev: class device that is converted into a Scsi_host.
1395  * @attr: device attribute, not used.
1396  * @buf: on return contains the cfg_poll in hex.
1397  *
1398  * Notes:
1399  * cfg_poll should be a lpfc_polling_flags type.
1400  *
1401  * Returns: size of formatted string.
1402  **/
1403 static ssize_t
1404 lpfc_poll_show(struct device *dev, struct device_attribute *attr,
1405 	       char *buf)
1406 {
1407 	struct Scsi_Host  *shost = class_to_shost(dev);
1408 	struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata;
1409 	struct lpfc_hba   *phba = vport->phba;
1410 
1411 	return snprintf(buf, PAGE_SIZE, "%#x\n", phba->cfg_poll);
1412 }
1413 
1414 /**
1415  * lpfc_poll_store - Set the value of cfg_poll for the adapter
1416  * @dev: class device that is converted into a Scsi_host.
1417  * @attr: device attribute, not used.
1418  * @buf: one or more lpfc_polling_flags values.
1419  * @count: not used.
1420  *
1421  * Notes:
1422  * buf contents converted to integer and checked for a valid value.
1423  *
1424  * Returns:
1425  * -EINVAL if the buffer connot be converted or is out of range
1426  * length of the buf on success
1427  **/
1428 static ssize_t
1429 lpfc_poll_store(struct device *dev, struct device_attribute *attr,
1430 		const char *buf, size_t count)
1431 {
1432 	struct Scsi_Host  *shost = class_to_shost(dev);
1433 	struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata;
1434 	struct lpfc_hba   *phba = vport->phba;
1435 	uint32_t creg_val;
1436 	uint32_t old_val;
1437 	int val=0;
1438 
1439 	if (!isdigit(buf[0]))
1440 		return -EINVAL;
1441 
1442 	if (sscanf(buf, "%i", &val) != 1)
1443 		return -EINVAL;
1444 
1445 	if ((val & 0x3) != val)
1446 		return -EINVAL;
1447 
1448 	if (phba->sli_rev == LPFC_SLI_REV4)
1449 		val = 0;
1450 
1451 	lpfc_printf_vlog(vport, KERN_ERR, LOG_INIT,
1452 		"3051 lpfc_poll changed from %d to %d\n",
1453 		phba->cfg_poll, val);
1454 
1455 	spin_lock_irq(&phba->hbalock);
1456 
1457 	old_val = phba->cfg_poll;
1458 
1459 	if (val & ENABLE_FCP_RING_POLLING) {
1460 		if ((val & DISABLE_FCP_RING_INT) &&
1461 		    !(old_val & DISABLE_FCP_RING_INT)) {
1462 			if (lpfc_readl(phba->HCregaddr, &creg_val)) {
1463 				spin_unlock_irq(&phba->hbalock);
1464 				return -EINVAL;
1465 			}
1466 			creg_val &= ~(HC_R0INT_ENA << LPFC_FCP_RING);
1467 			writel(creg_val, phba->HCregaddr);
1468 			readl(phba->HCregaddr); /* flush */
1469 
1470 			lpfc_poll_start_timer(phba);
1471 		}
1472 	} else if (val != 0x0) {
1473 		spin_unlock_irq(&phba->hbalock);
1474 		return -EINVAL;
1475 	}
1476 
1477 	if (!(val & DISABLE_FCP_RING_INT) &&
1478 	    (old_val & DISABLE_FCP_RING_INT))
1479 	{
1480 		spin_unlock_irq(&phba->hbalock);
1481 		del_timer(&phba->fcp_poll_timer);
1482 		spin_lock_irq(&phba->hbalock);
1483 		if (lpfc_readl(phba->HCregaddr, &creg_val)) {
1484 			spin_unlock_irq(&phba->hbalock);
1485 			return -EINVAL;
1486 		}
1487 		creg_val |= (HC_R0INT_ENA << LPFC_FCP_RING);
1488 		writel(creg_val, phba->HCregaddr);
1489 		readl(phba->HCregaddr); /* flush */
1490 	}
1491 
1492 	phba->cfg_poll = val;
1493 
1494 	spin_unlock_irq(&phba->hbalock);
1495 
1496 	return strlen(buf);
1497 }
1498 
1499 /**
1500  * lpfc_fips_level_show - Return the current FIPS level for the HBA
1501  * @dev: class unused variable.
1502  * @attr: device attribute, not used.
1503  * @buf: on return contains the module description text.
1504  *
1505  * Returns: size of formatted string.
1506  **/
1507 static ssize_t
1508 lpfc_fips_level_show(struct device *dev,  struct device_attribute *attr,
1509 		     char *buf)
1510 {
1511 	struct Scsi_Host  *shost = class_to_shost(dev);
1512 	struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata;
1513 	struct lpfc_hba   *phba = vport->phba;
1514 
1515 	return snprintf(buf, PAGE_SIZE, "%d\n", phba->fips_level);
1516 }
1517 
1518 /**
1519  * lpfc_fips_rev_show - Return the FIPS Spec revision for the HBA
1520  * @dev: class unused variable.
1521  * @attr: device attribute, not used.
1522  * @buf: on return contains the module description text.
1523  *
1524  * Returns: size of formatted string.
1525  **/
1526 static ssize_t
1527 lpfc_fips_rev_show(struct device *dev,  struct device_attribute *attr,
1528 		   char *buf)
1529 {
1530 	struct Scsi_Host  *shost = class_to_shost(dev);
1531 	struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata;
1532 	struct lpfc_hba   *phba = vport->phba;
1533 
1534 	return snprintf(buf, PAGE_SIZE, "%d\n", phba->fips_spec_rev);
1535 }
1536 
1537 /**
1538  * lpfc_dss_show - Return the current state of dss and the configured state
1539  * @dev: class converted to a Scsi_host structure.
1540  * @attr: device attribute, not used.
1541  * @buf: on return contains the formatted text.
1542  *
1543  * Returns: size of formatted string.
1544  **/
1545 static ssize_t
1546 lpfc_dss_show(struct device *dev, struct device_attribute *attr,
1547 	      char *buf)
1548 {
1549 	struct Scsi_Host *shost = class_to_shost(dev);
1550 	struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata;
1551 	struct lpfc_hba   *phba = vport->phba;
1552 
1553 	return snprintf(buf, PAGE_SIZE, "%s - %sOperational\n",
1554 			(phba->cfg_enable_dss) ? "Enabled" : "Disabled",
1555 			(phba->sli3_options & LPFC_SLI3_DSS_ENABLED) ?
1556 				"" : "Not ");
1557 }
1558 
1559 /**
1560  * lpfc_sriov_hw_max_virtfn_show - Return maximum number of virtual functions
1561  * @dev: class converted to a Scsi_host structure.
1562  * @attr: device attribute, not used.
1563  * @buf: on return contains the formatted support level.
1564  *
1565  * Description:
1566  * Returns the maximum number of virtual functions a physical function can
1567  * support, 0 will be returned if called on virtual function.
1568  *
1569  * Returns: size of formatted string.
1570  **/
1571 static ssize_t
1572 lpfc_sriov_hw_max_virtfn_show(struct device *dev,
1573 			      struct device_attribute *attr,
1574 			      char *buf)
1575 {
1576 	struct Scsi_Host *shost = class_to_shost(dev);
1577 	struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata;
1578 	struct lpfc_hba *phba = vport->phba;
1579 	uint16_t max_nr_virtfn;
1580 
1581 	max_nr_virtfn = lpfc_sli_sriov_nr_virtfn_get(phba);
1582 	return snprintf(buf, PAGE_SIZE, "%d\n", max_nr_virtfn);
1583 }
1584 
1585 /**
1586  * lpfc_param_show - Return a cfg attribute value in decimal
1587  *
1588  * Description:
1589  * Macro that given an attr e.g. hba_queue_depth expands
1590  * into a function with the name lpfc_hba_queue_depth_show.
1591  *
1592  * lpfc_##attr##_show: Return the decimal value of an adapters cfg_xxx field.
1593  * @dev: class device that is converted into a Scsi_host.
1594  * @attr: device attribute, not used.
1595  * @buf: on return contains the attribute value in decimal.
1596  *
1597  * Returns: size of formatted string.
1598  **/
1599 #define lpfc_param_show(attr)	\
1600 static ssize_t \
1601 lpfc_##attr##_show(struct device *dev, struct device_attribute *attr, \
1602 		   char *buf) \
1603 { \
1604 	struct Scsi_Host  *shost = class_to_shost(dev);\
1605 	struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata;\
1606 	struct lpfc_hba   *phba = vport->phba;\
1607 	uint val = 0;\
1608 	val = phba->cfg_##attr;\
1609 	return snprintf(buf, PAGE_SIZE, "%d\n",\
1610 			phba->cfg_##attr);\
1611 }
1612 
1613 /**
1614  * lpfc_param_hex_show - Return a cfg attribute value in hex
1615  *
1616  * Description:
1617  * Macro that given an attr e.g. hba_queue_depth expands
1618  * into a function with the name lpfc_hba_queue_depth_show
1619  *
1620  * lpfc_##attr##_show: Return the hex value of an adapters cfg_xxx field.
1621  * @dev: class device that is converted into a Scsi_host.
1622  * @attr: device attribute, not used.
1623  * @buf: on return contains the attribute value in hexadecimal.
1624  *
1625  * Returns: size of formatted string.
1626  **/
1627 #define lpfc_param_hex_show(attr)	\
1628 static ssize_t \
1629 lpfc_##attr##_show(struct device *dev, struct device_attribute *attr, \
1630 		   char *buf) \
1631 { \
1632 	struct Scsi_Host  *shost = class_to_shost(dev);\
1633 	struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata;\
1634 	struct lpfc_hba   *phba = vport->phba;\
1635 	uint val = 0;\
1636 	val = phba->cfg_##attr;\
1637 	return snprintf(buf, PAGE_SIZE, "%#x\n",\
1638 			phba->cfg_##attr);\
1639 }
1640 
1641 /**
1642  * lpfc_param_init - Initializes a cfg attribute
1643  *
1644  * Description:
1645  * Macro that given an attr e.g. hba_queue_depth expands
1646  * into a function with the name lpfc_hba_queue_depth_init. The macro also
1647  * takes a default argument, a minimum and maximum argument.
1648  *
1649  * lpfc_##attr##_init: Initializes an attribute.
1650  * @phba: pointer the the adapter structure.
1651  * @val: integer attribute value.
1652  *
1653  * Validates the min and max values then sets the adapter config field
1654  * accordingly, or uses the default if out of range and prints an error message.
1655  *
1656  * Returns:
1657  * zero on success
1658  * -EINVAL if default used
1659  **/
1660 #define lpfc_param_init(attr, default, minval, maxval)	\
1661 static int \
1662 lpfc_##attr##_init(struct lpfc_hba *phba, uint val) \
1663 { \
1664 	if (val >= minval && val <= maxval) {\
1665 		phba->cfg_##attr = val;\
1666 		return 0;\
1667 	}\
1668 	lpfc_printf_log(phba, KERN_ERR, LOG_INIT, \
1669 			"0449 lpfc_"#attr" attribute cannot be set to %d, "\
1670 			"allowed range is ["#minval", "#maxval"]\n", val); \
1671 	phba->cfg_##attr = default;\
1672 	return -EINVAL;\
1673 }
1674 
1675 /**
1676  * lpfc_param_set - Set a cfg attribute value
1677  *
1678  * Description:
1679  * Macro that given an attr e.g. hba_queue_depth expands
1680  * into a function with the name lpfc_hba_queue_depth_set
1681  *
1682  * lpfc_##attr##_set: Sets an attribute value.
1683  * @phba: pointer the the adapter structure.
1684  * @val: integer attribute value.
1685  *
1686  * Description:
1687  * Validates the min and max values then sets the
1688  * adapter config field if in the valid range. prints error message
1689  * and does not set the parameter if invalid.
1690  *
1691  * Returns:
1692  * zero on success
1693  * -EINVAL if val is invalid
1694  **/
1695 #define lpfc_param_set(attr, default, minval, maxval)	\
1696 static int \
1697 lpfc_##attr##_set(struct lpfc_hba *phba, uint val) \
1698 { \
1699 	if (val >= minval && val <= maxval) {\
1700 		lpfc_printf_log(phba, KERN_ERR, LOG_INIT, \
1701 			"3052 lpfc_" #attr " changed from %d to %d\n", \
1702 			phba->cfg_##attr, val); \
1703 		phba->cfg_##attr = val;\
1704 		return 0;\
1705 	}\
1706 	lpfc_printf_log(phba, KERN_ERR, LOG_INIT, \
1707 			"0450 lpfc_"#attr" attribute cannot be set to %d, "\
1708 			"allowed range is ["#minval", "#maxval"]\n", val); \
1709 	return -EINVAL;\
1710 }
1711 
1712 /**
1713  * lpfc_param_store - Set a vport attribute value
1714  *
1715  * Description:
1716  * Macro that given an attr e.g. hba_queue_depth expands
1717  * into a function with the name lpfc_hba_queue_depth_store.
1718  *
1719  * lpfc_##attr##_store: Set an sttribute value.
1720  * @dev: class device that is converted into a Scsi_host.
1721  * @attr: device attribute, not used.
1722  * @buf: contains the attribute value in ascii.
1723  * @count: not used.
1724  *
1725  * Description:
1726  * Convert the ascii text number to an integer, then
1727  * use the lpfc_##attr##_set function to set the value.
1728  *
1729  * Returns:
1730  * -EINVAL if val is invalid or lpfc_##attr##_set() fails
1731  * length of buffer upon success.
1732  **/
1733 #define lpfc_param_store(attr)	\
1734 static ssize_t \
1735 lpfc_##attr##_store(struct device *dev, struct device_attribute *attr, \
1736 		    const char *buf, size_t count) \
1737 { \
1738 	struct Scsi_Host  *shost = class_to_shost(dev);\
1739 	struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata;\
1740 	struct lpfc_hba   *phba = vport->phba;\
1741 	uint val = 0;\
1742 	if (!isdigit(buf[0]))\
1743 		return -EINVAL;\
1744 	if (sscanf(buf, "%i", &val) != 1)\
1745 		return -EINVAL;\
1746 	if (lpfc_##attr##_set(phba, val) == 0) \
1747 		return strlen(buf);\
1748 	else \
1749 		return -EINVAL;\
1750 }
1751 
1752 /**
1753  * lpfc_vport_param_show - Return decimal formatted cfg attribute value
1754  *
1755  * Description:
1756  * Macro that given an attr e.g. hba_queue_depth expands
1757  * into a function with the name lpfc_hba_queue_depth_show
1758  *
1759  * lpfc_##attr##_show: prints the attribute value in decimal.
1760  * @dev: class device that is converted into a Scsi_host.
1761  * @attr: device attribute, not used.
1762  * @buf: on return contains the attribute value in decimal.
1763  *
1764  * Returns: length of formatted string.
1765  **/
1766 #define lpfc_vport_param_show(attr)	\
1767 static ssize_t \
1768 lpfc_##attr##_show(struct device *dev, struct device_attribute *attr, \
1769 		   char *buf) \
1770 { \
1771 	struct Scsi_Host  *shost = class_to_shost(dev);\
1772 	struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata;\
1773 	uint val = 0;\
1774 	val = vport->cfg_##attr;\
1775 	return snprintf(buf, PAGE_SIZE, "%d\n", vport->cfg_##attr);\
1776 }
1777 
1778 /**
1779  * lpfc_vport_param_hex_show - Return hex formatted attribute value
1780  *
1781  * Description:
1782  * Macro that given an attr e.g.
1783  * hba_queue_depth expands into a function with the name
1784  * lpfc_hba_queue_depth_show
1785  *
1786  * lpfc_##attr##_show: prints the attribute value in hexadecimal.
1787  * @dev: class device that is converted into a Scsi_host.
1788  * @attr: device attribute, not used.
1789  * @buf: on return contains the attribute value in hexadecimal.
1790  *
1791  * Returns: length of formatted string.
1792  **/
1793 #define lpfc_vport_param_hex_show(attr)	\
1794 static ssize_t \
1795 lpfc_##attr##_show(struct device *dev, struct device_attribute *attr, \
1796 		   char *buf) \
1797 { \
1798 	struct Scsi_Host  *shost = class_to_shost(dev);\
1799 	struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata;\
1800 	uint val = 0;\
1801 	val = vport->cfg_##attr;\
1802 	return snprintf(buf, PAGE_SIZE, "%#x\n", vport->cfg_##attr);\
1803 }
1804 
1805 /**
1806  * lpfc_vport_param_init - Initialize a vport cfg attribute
1807  *
1808  * Description:
1809  * Macro that given an attr e.g. hba_queue_depth expands
1810  * into a function with the name lpfc_hba_queue_depth_init. The macro also
1811  * takes a default argument, a minimum and maximum argument.
1812  *
1813  * lpfc_##attr##_init: validates the min and max values then sets the
1814  * adapter config field accordingly, or uses the default if out of range
1815  * and prints an error message.
1816  * @phba: pointer the the adapter structure.
1817  * @val: integer attribute value.
1818  *
1819  * Returns:
1820  * zero on success
1821  * -EINVAL if default used
1822  **/
1823 #define lpfc_vport_param_init(attr, default, minval, maxval)	\
1824 static int \
1825 lpfc_##attr##_init(struct lpfc_vport *vport, uint val) \
1826 { \
1827 	if (val >= minval && val <= maxval) {\
1828 		vport->cfg_##attr = val;\
1829 		return 0;\
1830 	}\
1831 	lpfc_printf_vlog(vport, KERN_ERR, LOG_INIT, \
1832 			 "0423 lpfc_"#attr" attribute cannot be set to %d, "\
1833 			 "allowed range is ["#minval", "#maxval"]\n", val); \
1834 	vport->cfg_##attr = default;\
1835 	return -EINVAL;\
1836 }
1837 
1838 /**
1839  * lpfc_vport_param_set - Set a vport cfg attribute
1840  *
1841  * Description:
1842  * Macro that given an attr e.g. hba_queue_depth expands
1843  * into a function with the name lpfc_hba_queue_depth_set
1844  *
1845  * lpfc_##attr##_set: validates the min and max values then sets the
1846  * adapter config field if in the valid range. prints error message
1847  * and does not set the parameter if invalid.
1848  * @phba: pointer the the adapter structure.
1849  * @val:	integer attribute value.
1850  *
1851  * Returns:
1852  * zero on success
1853  * -EINVAL if val is invalid
1854  **/
1855 #define lpfc_vport_param_set(attr, default, minval, maxval)	\
1856 static int \
1857 lpfc_##attr##_set(struct lpfc_vport *vport, uint val) \
1858 { \
1859 	if (val >= minval && val <= maxval) {\
1860 		lpfc_printf_vlog(vport, KERN_ERR, LOG_INIT, \
1861 			"3053 lpfc_" #attr " changed from %d to %d\n", \
1862 			vport->cfg_##attr, val); \
1863 		vport->cfg_##attr = val;\
1864 		return 0;\
1865 	}\
1866 	lpfc_printf_vlog(vport, KERN_ERR, LOG_INIT, \
1867 			 "0424 lpfc_"#attr" attribute cannot be set to %d, "\
1868 			 "allowed range is ["#minval", "#maxval"]\n", val); \
1869 	return -EINVAL;\
1870 }
1871 
1872 /**
1873  * lpfc_vport_param_store - Set a vport attribute
1874  *
1875  * Description:
1876  * Macro that given an attr e.g. hba_queue_depth
1877  * expands into a function with the name lpfc_hba_queue_depth_store
1878  *
1879  * lpfc_##attr##_store: convert the ascii text number to an integer, then
1880  * use the lpfc_##attr##_set function to set the value.
1881  * @cdev: class device that is converted into a Scsi_host.
1882  * @buf:	contains the attribute value in decimal.
1883  * @count: not used.
1884  *
1885  * Returns:
1886  * -EINVAL if val is invalid or lpfc_##attr##_set() fails
1887  * length of buffer upon success.
1888  **/
1889 #define lpfc_vport_param_store(attr)	\
1890 static ssize_t \
1891 lpfc_##attr##_store(struct device *dev, struct device_attribute *attr, \
1892 		    const char *buf, size_t count) \
1893 { \
1894 	struct Scsi_Host  *shost = class_to_shost(dev);\
1895 	struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata;\
1896 	uint val = 0;\
1897 	if (!isdigit(buf[0]))\
1898 		return -EINVAL;\
1899 	if (sscanf(buf, "%i", &val) != 1)\
1900 		return -EINVAL;\
1901 	if (lpfc_##attr##_set(vport, val) == 0) \
1902 		return strlen(buf);\
1903 	else \
1904 		return -EINVAL;\
1905 }
1906 
1907 
1908 #define LPFC_ATTR(name, defval, minval, maxval, desc) \
1909 static uint lpfc_##name = defval;\
1910 module_param(lpfc_##name, uint, S_IRUGO);\
1911 MODULE_PARM_DESC(lpfc_##name, desc);\
1912 lpfc_param_init(name, defval, minval, maxval)
1913 
1914 #define LPFC_ATTR_R(name, defval, minval, maxval, desc) \
1915 static uint lpfc_##name = defval;\
1916 module_param(lpfc_##name, uint, S_IRUGO);\
1917 MODULE_PARM_DESC(lpfc_##name, desc);\
1918 lpfc_param_show(name)\
1919 lpfc_param_init(name, defval, minval, maxval)\
1920 static DEVICE_ATTR(lpfc_##name, S_IRUGO , lpfc_##name##_show, NULL)
1921 
1922 #define LPFC_ATTR_RW(name, defval, minval, maxval, desc) \
1923 static uint lpfc_##name = defval;\
1924 module_param(lpfc_##name, uint, S_IRUGO);\
1925 MODULE_PARM_DESC(lpfc_##name, desc);\
1926 lpfc_param_show(name)\
1927 lpfc_param_init(name, defval, minval, maxval)\
1928 lpfc_param_set(name, defval, minval, maxval)\
1929 lpfc_param_store(name)\
1930 static DEVICE_ATTR(lpfc_##name, S_IRUGO | S_IWUSR,\
1931 		   lpfc_##name##_show, lpfc_##name##_store)
1932 
1933 #define LPFC_ATTR_HEX_R(name, defval, minval, maxval, desc) \
1934 static uint lpfc_##name = defval;\
1935 module_param(lpfc_##name, uint, S_IRUGO);\
1936 MODULE_PARM_DESC(lpfc_##name, desc);\
1937 lpfc_param_hex_show(name)\
1938 lpfc_param_init(name, defval, minval, maxval)\
1939 static DEVICE_ATTR(lpfc_##name, S_IRUGO , lpfc_##name##_show, NULL)
1940 
1941 #define LPFC_ATTR_HEX_RW(name, defval, minval, maxval, desc) \
1942 static uint lpfc_##name = defval;\
1943 module_param(lpfc_##name, uint, S_IRUGO);\
1944 MODULE_PARM_DESC(lpfc_##name, desc);\
1945 lpfc_param_hex_show(name)\
1946 lpfc_param_init(name, defval, minval, maxval)\
1947 lpfc_param_set(name, defval, minval, maxval)\
1948 lpfc_param_store(name)\
1949 static DEVICE_ATTR(lpfc_##name, S_IRUGO | S_IWUSR,\
1950 		   lpfc_##name##_show, lpfc_##name##_store)
1951 
1952 #define LPFC_VPORT_ATTR(name, defval, minval, maxval, desc) \
1953 static uint lpfc_##name = defval;\
1954 module_param(lpfc_##name, uint, S_IRUGO);\
1955 MODULE_PARM_DESC(lpfc_##name, desc);\
1956 lpfc_vport_param_init(name, defval, minval, maxval)
1957 
1958 #define LPFC_VPORT_ATTR_R(name, defval, minval, maxval, desc) \
1959 static uint lpfc_##name = defval;\
1960 module_param(lpfc_##name, uint, S_IRUGO);\
1961 MODULE_PARM_DESC(lpfc_##name, desc);\
1962 lpfc_vport_param_show(name)\
1963 lpfc_vport_param_init(name, defval, minval, maxval)\
1964 static DEVICE_ATTR(lpfc_##name, S_IRUGO , lpfc_##name##_show, NULL)
1965 
1966 #define LPFC_VPORT_ATTR_RW(name, defval, minval, maxval, desc) \
1967 static uint lpfc_##name = defval;\
1968 module_param(lpfc_##name, uint, S_IRUGO);\
1969 MODULE_PARM_DESC(lpfc_##name, desc);\
1970 lpfc_vport_param_show(name)\
1971 lpfc_vport_param_init(name, defval, minval, maxval)\
1972 lpfc_vport_param_set(name, defval, minval, maxval)\
1973 lpfc_vport_param_store(name)\
1974 static DEVICE_ATTR(lpfc_##name, S_IRUGO | S_IWUSR,\
1975 		   lpfc_##name##_show, lpfc_##name##_store)
1976 
1977 #define LPFC_VPORT_ATTR_HEX_R(name, defval, minval, maxval, desc) \
1978 static uint lpfc_##name = defval;\
1979 module_param(lpfc_##name, uint, S_IRUGO);\
1980 MODULE_PARM_DESC(lpfc_##name, desc);\
1981 lpfc_vport_param_hex_show(name)\
1982 lpfc_vport_param_init(name, defval, minval, maxval)\
1983 static DEVICE_ATTR(lpfc_##name, S_IRUGO , lpfc_##name##_show, NULL)
1984 
1985 #define LPFC_VPORT_ATTR_HEX_RW(name, defval, minval, maxval, desc) \
1986 static uint lpfc_##name = defval;\
1987 module_param(lpfc_##name, uint, S_IRUGO);\
1988 MODULE_PARM_DESC(lpfc_##name, desc);\
1989 lpfc_vport_param_hex_show(name)\
1990 lpfc_vport_param_init(name, defval, minval, maxval)\
1991 lpfc_vport_param_set(name, defval, minval, maxval)\
1992 lpfc_vport_param_store(name)\
1993 static DEVICE_ATTR(lpfc_##name, S_IRUGO | S_IWUSR,\
1994 		   lpfc_##name##_show, lpfc_##name##_store)
1995 
1996 static DEVICE_ATTR(bg_info, S_IRUGO, lpfc_bg_info_show, NULL);
1997 static DEVICE_ATTR(bg_guard_err, S_IRUGO, lpfc_bg_guard_err_show, NULL);
1998 static DEVICE_ATTR(bg_apptag_err, S_IRUGO, lpfc_bg_apptag_err_show, NULL);
1999 static DEVICE_ATTR(bg_reftag_err, S_IRUGO, lpfc_bg_reftag_err_show, NULL);
2000 static DEVICE_ATTR(info, S_IRUGO, lpfc_info_show, NULL);
2001 static DEVICE_ATTR(serialnum, S_IRUGO, lpfc_serialnum_show, NULL);
2002 static DEVICE_ATTR(modeldesc, S_IRUGO, lpfc_modeldesc_show, NULL);
2003 static DEVICE_ATTR(modelname, S_IRUGO, lpfc_modelname_show, NULL);
2004 static DEVICE_ATTR(programtype, S_IRUGO, lpfc_programtype_show, NULL);
2005 static DEVICE_ATTR(portnum, S_IRUGO, lpfc_vportnum_show, NULL);
2006 static DEVICE_ATTR(fwrev, S_IRUGO, lpfc_fwrev_show, NULL);
2007 static DEVICE_ATTR(hdw, S_IRUGO, lpfc_hdw_show, NULL);
2008 static DEVICE_ATTR(link_state, S_IRUGO | S_IWUSR, lpfc_link_state_show,
2009 		lpfc_link_state_store);
2010 static DEVICE_ATTR(option_rom_version, S_IRUGO,
2011 		   lpfc_option_rom_version_show, NULL);
2012 static DEVICE_ATTR(num_discovered_ports, S_IRUGO,
2013 		   lpfc_num_discovered_ports_show, NULL);
2014 static DEVICE_ATTR(menlo_mgmt_mode, S_IRUGO, lpfc_mlomgmt_show, NULL);
2015 static DEVICE_ATTR(nport_evt_cnt, S_IRUGO, lpfc_nport_evt_cnt_show, NULL);
2016 static DEVICE_ATTR(lpfc_drvr_version, S_IRUGO, lpfc_drvr_version_show, NULL);
2017 static DEVICE_ATTR(lpfc_enable_fip, S_IRUGO, lpfc_enable_fip_show, NULL);
2018 static DEVICE_ATTR(board_mode, S_IRUGO | S_IWUSR,
2019 		   lpfc_board_mode_show, lpfc_board_mode_store);
2020 static DEVICE_ATTR(issue_reset, S_IWUSR, NULL, lpfc_issue_reset);
2021 static DEVICE_ATTR(max_vpi, S_IRUGO, lpfc_max_vpi_show, NULL);
2022 static DEVICE_ATTR(used_vpi, S_IRUGO, lpfc_used_vpi_show, NULL);
2023 static DEVICE_ATTR(max_rpi, S_IRUGO, lpfc_max_rpi_show, NULL);
2024 static DEVICE_ATTR(used_rpi, S_IRUGO, lpfc_used_rpi_show, NULL);
2025 static DEVICE_ATTR(max_xri, S_IRUGO, lpfc_max_xri_show, NULL);
2026 static DEVICE_ATTR(used_xri, S_IRUGO, lpfc_used_xri_show, NULL);
2027 static DEVICE_ATTR(npiv_info, S_IRUGO, lpfc_npiv_info_show, NULL);
2028 static DEVICE_ATTR(lpfc_temp_sensor, S_IRUGO, lpfc_temp_sensor_show, NULL);
2029 static DEVICE_ATTR(lpfc_fips_level, S_IRUGO, lpfc_fips_level_show, NULL);
2030 static DEVICE_ATTR(lpfc_fips_rev, S_IRUGO, lpfc_fips_rev_show, NULL);
2031 static DEVICE_ATTR(lpfc_dss, S_IRUGO, lpfc_dss_show, NULL);
2032 static DEVICE_ATTR(lpfc_sriov_hw_max_virtfn, S_IRUGO,
2033 		   lpfc_sriov_hw_max_virtfn_show, NULL);
2034 static DEVICE_ATTR(protocol, S_IRUGO, lpfc_sli4_protocol_show, NULL);
2035 
2036 static char *lpfc_soft_wwn_key = "C99G71SL8032A";
2037 
2038 /**
2039  * lpfc_soft_wwn_enable_store - Allows setting of the wwn if the key is valid
2040  * @dev: class device that is converted into a Scsi_host.
2041  * @attr: device attribute, not used.
2042  * @buf: containing the string lpfc_soft_wwn_key.
2043  * @count: must be size of lpfc_soft_wwn_key.
2044  *
2045  * Returns:
2046  * -EINVAL if the buffer does not contain lpfc_soft_wwn_key
2047  * length of buf indicates success
2048  **/
2049 static ssize_t
2050 lpfc_soft_wwn_enable_store(struct device *dev, struct device_attribute *attr,
2051 			   const char *buf, size_t count)
2052 {
2053 	struct Scsi_Host  *shost = class_to_shost(dev);
2054 	struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata;
2055 	struct lpfc_hba   *phba = vport->phba;
2056 	unsigned int cnt = count;
2057 
2058 	/*
2059 	 * We're doing a simple sanity check for soft_wwpn setting.
2060 	 * We require that the user write a specific key to enable
2061 	 * the soft_wwpn attribute to be settable. Once the attribute
2062 	 * is written, the enable key resets. If further updates are
2063 	 * desired, the key must be written again to re-enable the
2064 	 * attribute.
2065 	 *
2066 	 * The "key" is not secret - it is a hardcoded string shown
2067 	 * here. The intent is to protect against the random user or
2068 	 * application that is just writing attributes.
2069 	 */
2070 
2071 	/* count may include a LF at end of string */
2072 	if (buf[cnt-1] == '\n')
2073 		cnt--;
2074 
2075 	if ((cnt != strlen(lpfc_soft_wwn_key)) ||
2076 	    (strncmp(buf, lpfc_soft_wwn_key, strlen(lpfc_soft_wwn_key)) != 0))
2077 		return -EINVAL;
2078 
2079 	phba->soft_wwn_enable = 1;
2080 	return count;
2081 }
2082 static DEVICE_ATTR(lpfc_soft_wwn_enable, S_IWUSR, NULL,
2083 		   lpfc_soft_wwn_enable_store);
2084 
2085 /**
2086  * lpfc_soft_wwpn_show - Return the cfg soft ww port name of the adapter
2087  * @dev: class device that is converted into a Scsi_host.
2088  * @attr: device attribute, not used.
2089  * @buf: on return contains the wwpn in hexadecimal.
2090  *
2091  * Returns: size of formatted string.
2092  **/
2093 static ssize_t
2094 lpfc_soft_wwpn_show(struct device *dev, struct device_attribute *attr,
2095 		    char *buf)
2096 {
2097 	struct Scsi_Host  *shost = class_to_shost(dev);
2098 	struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata;
2099 	struct lpfc_hba   *phba = vport->phba;
2100 
2101 	return snprintf(buf, PAGE_SIZE, "0x%llx\n",
2102 			(unsigned long long)phba->cfg_soft_wwpn);
2103 }
2104 
2105 /**
2106  * lpfc_soft_wwpn_store - Set the ww port name of the adapter
2107  * @dev class device that is converted into a Scsi_host.
2108  * @attr: device attribute, not used.
2109  * @buf: contains the wwpn in hexadecimal.
2110  * @count: number of wwpn bytes in buf
2111  *
2112  * Returns:
2113  * -EACCES hba reset not enabled, adapter over temp
2114  * -EINVAL soft wwn not enabled, count is invalid, invalid wwpn byte invalid
2115  * -EIO error taking adapter offline or online
2116  * value of count on success
2117  **/
2118 static ssize_t
2119 lpfc_soft_wwpn_store(struct device *dev, struct device_attribute *attr,
2120 		     const char *buf, size_t count)
2121 {
2122 	struct Scsi_Host  *shost = class_to_shost(dev);
2123 	struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata;
2124 	struct lpfc_hba   *phba = vport->phba;
2125 	struct completion online_compl;
2126 	int stat1=0, stat2=0;
2127 	unsigned int i, j, cnt=count;
2128 	u8 wwpn[8];
2129 	int rc;
2130 
2131 	if (!phba->cfg_enable_hba_reset)
2132 		return -EACCES;
2133 	spin_lock_irq(&phba->hbalock);
2134 	if (phba->over_temp_state == HBA_OVER_TEMP) {
2135 		spin_unlock_irq(&phba->hbalock);
2136 		return -EACCES;
2137 	}
2138 	spin_unlock_irq(&phba->hbalock);
2139 	/* count may include a LF at end of string */
2140 	if (buf[cnt-1] == '\n')
2141 		cnt--;
2142 
2143 	if (!phba->soft_wwn_enable || (cnt < 16) || (cnt > 18) ||
2144 	    ((cnt == 17) && (*buf++ != 'x')) ||
2145 	    ((cnt == 18) && ((*buf++ != '0') || (*buf++ != 'x'))))
2146 		return -EINVAL;
2147 
2148 	phba->soft_wwn_enable = 0;
2149 
2150 	memset(wwpn, 0, sizeof(wwpn));
2151 
2152 	/* Validate and store the new name */
2153 	for (i=0, j=0; i < 16; i++) {
2154 		int value;
2155 
2156 		value = hex_to_bin(*buf++);
2157 		if (value >= 0)
2158 			j = (j << 4) | value;
2159 		else
2160 			return -EINVAL;
2161 		if (i % 2) {
2162 			wwpn[i/2] = j & 0xff;
2163 			j = 0;
2164 		}
2165 	}
2166 	phba->cfg_soft_wwpn = wwn_to_u64(wwpn);
2167 	fc_host_port_name(shost) = phba->cfg_soft_wwpn;
2168 	if (phba->cfg_soft_wwnn)
2169 		fc_host_node_name(shost) = phba->cfg_soft_wwnn;
2170 
2171 	dev_printk(KERN_NOTICE, &phba->pcidev->dev,
2172 		   "lpfc%d: Reinitializing to use soft_wwpn\n", phba->brd_no);
2173 
2174 	stat1 = lpfc_do_offline(phba, LPFC_EVT_OFFLINE);
2175 	if (stat1)
2176 		lpfc_printf_log(phba, KERN_ERR, LOG_INIT,
2177 				"0463 lpfc_soft_wwpn attribute set failed to "
2178 				"reinit adapter - %d\n", stat1);
2179 	init_completion(&online_compl);
2180 	rc = lpfc_workq_post_event(phba, &stat2, &online_compl,
2181 				   LPFC_EVT_ONLINE);
2182 	if (rc == 0)
2183 		return -ENOMEM;
2184 
2185 	wait_for_completion(&online_compl);
2186 	if (stat2)
2187 		lpfc_printf_log(phba, KERN_ERR, LOG_INIT,
2188 				"0464 lpfc_soft_wwpn attribute set failed to "
2189 				"reinit adapter - %d\n", stat2);
2190 	return (stat1 || stat2) ? -EIO : count;
2191 }
2192 static DEVICE_ATTR(lpfc_soft_wwpn, S_IRUGO | S_IWUSR,\
2193 		   lpfc_soft_wwpn_show, lpfc_soft_wwpn_store);
2194 
2195 /**
2196  * lpfc_soft_wwnn_show - Return the cfg soft ww node name for the adapter
2197  * @dev: class device that is converted into a Scsi_host.
2198  * @attr: device attribute, not used.
2199  * @buf: on return contains the wwnn in hexadecimal.
2200  *
2201  * Returns: size of formatted string.
2202  **/
2203 static ssize_t
2204 lpfc_soft_wwnn_show(struct device *dev, struct device_attribute *attr,
2205 		    char *buf)
2206 {
2207 	struct Scsi_Host *shost = class_to_shost(dev);
2208 	struct lpfc_hba *phba = ((struct lpfc_vport *)shost->hostdata)->phba;
2209 	return snprintf(buf, PAGE_SIZE, "0x%llx\n",
2210 			(unsigned long long)phba->cfg_soft_wwnn);
2211 }
2212 
2213 /**
2214  * lpfc_soft_wwnn_store - sets the ww node name of the adapter
2215  * @cdev: class device that is converted into a Scsi_host.
2216  * @buf: contains the ww node name in hexadecimal.
2217  * @count: number of wwnn bytes in buf.
2218  *
2219  * Returns:
2220  * -EINVAL soft wwn not enabled, count is invalid, invalid wwnn byte invalid
2221  * value of count on success
2222  **/
2223 static ssize_t
2224 lpfc_soft_wwnn_store(struct device *dev, struct device_attribute *attr,
2225 		     const char *buf, size_t count)
2226 {
2227 	struct Scsi_Host *shost = class_to_shost(dev);
2228 	struct lpfc_hba *phba = ((struct lpfc_vport *)shost->hostdata)->phba;
2229 	unsigned int i, j, cnt=count;
2230 	u8 wwnn[8];
2231 
2232 	/* count may include a LF at end of string */
2233 	if (buf[cnt-1] == '\n')
2234 		cnt--;
2235 
2236 	if (!phba->soft_wwn_enable || (cnt < 16) || (cnt > 18) ||
2237 	    ((cnt == 17) && (*buf++ != 'x')) ||
2238 	    ((cnt == 18) && ((*buf++ != '0') || (*buf++ != 'x'))))
2239 		return -EINVAL;
2240 
2241 	/*
2242 	 * Allow wwnn to be set many times, as long as the enable is set.
2243 	 * However, once the wwpn is set, everything locks.
2244 	 */
2245 
2246 	memset(wwnn, 0, sizeof(wwnn));
2247 
2248 	/* Validate and store the new name */
2249 	for (i=0, j=0; i < 16; i++) {
2250 		int value;
2251 
2252 		value = hex_to_bin(*buf++);
2253 		if (value >= 0)
2254 			j = (j << 4) | value;
2255 		else
2256 			return -EINVAL;
2257 		if (i % 2) {
2258 			wwnn[i/2] = j & 0xff;
2259 			j = 0;
2260 		}
2261 	}
2262 	phba->cfg_soft_wwnn = wwn_to_u64(wwnn);
2263 
2264 	dev_printk(KERN_NOTICE, &phba->pcidev->dev,
2265 		   "lpfc%d: soft_wwnn set. Value will take effect upon "
2266 		   "setting of the soft_wwpn\n", phba->brd_no);
2267 
2268 	return count;
2269 }
2270 static DEVICE_ATTR(lpfc_soft_wwnn, S_IRUGO | S_IWUSR,\
2271 		   lpfc_soft_wwnn_show, lpfc_soft_wwnn_store);
2272 
2273 
2274 static int lpfc_poll = 0;
2275 module_param(lpfc_poll, int, S_IRUGO);
2276 MODULE_PARM_DESC(lpfc_poll, "FCP ring polling mode control:"
2277 		 " 0 - none,"
2278 		 " 1 - poll with interrupts enabled"
2279 		 " 3 - poll and disable FCP ring interrupts");
2280 
2281 static DEVICE_ATTR(lpfc_poll, S_IRUGO | S_IWUSR,
2282 		   lpfc_poll_show, lpfc_poll_store);
2283 
2284 int  lpfc_sli_mode = 0;
2285 module_param(lpfc_sli_mode, int, S_IRUGO);
2286 MODULE_PARM_DESC(lpfc_sli_mode, "SLI mode selector:"
2287 		 " 0 - auto (SLI-3 if supported),"
2288 		 " 2 - select SLI-2 even on SLI-3 capable HBAs,"
2289 		 " 3 - select SLI-3");
2290 
2291 int lpfc_enable_npiv = 1;
2292 module_param(lpfc_enable_npiv, int, S_IRUGO);
2293 MODULE_PARM_DESC(lpfc_enable_npiv, "Enable NPIV functionality");
2294 lpfc_param_show(enable_npiv);
2295 lpfc_param_init(enable_npiv, 1, 0, 1);
2296 static DEVICE_ATTR(lpfc_enable_npiv, S_IRUGO, lpfc_enable_npiv_show, NULL);
2297 
2298 LPFC_ATTR_R(fcf_failover_policy, 1, 1, 2,
2299 	"FCF Fast failover=1 Priority failover=2");
2300 
2301 int lpfc_enable_rrq;
2302 module_param(lpfc_enable_rrq, int, S_IRUGO);
2303 MODULE_PARM_DESC(lpfc_enable_rrq, "Enable RRQ functionality");
2304 lpfc_param_show(enable_rrq);
2305 lpfc_param_init(enable_rrq, 0, 0, 1);
2306 static DEVICE_ATTR(lpfc_enable_rrq, S_IRUGO, lpfc_enable_rrq_show, NULL);
2307 
2308 /*
2309 # lpfc_suppress_link_up:  Bring link up at initialization
2310 #            0x0  = bring link up (issue MBX_INIT_LINK)
2311 #            0x1  = do NOT bring link up at initialization(MBX_INIT_LINK)
2312 #            0x2  = never bring up link
2313 # Default value is 0.
2314 */
2315 LPFC_ATTR_R(suppress_link_up, LPFC_INITIALIZE_LINK, LPFC_INITIALIZE_LINK,
2316 		LPFC_DELAY_INIT_LINK_INDEFINITELY,
2317 		"Suppress Link Up at initialization");
2318 /*
2319 # lpfc_cnt: Number of IOCBs allocated for ELS, CT, and ABTS
2320 #       1 - (1024)
2321 #       2 - (2048)
2322 #       3 - (3072)
2323 #       4 - (4096)
2324 #       5 - (5120)
2325 */
2326 static ssize_t
2327 lpfc_iocb_hw_show(struct device *dev, struct device_attribute *attr, char *buf)
2328 {
2329 	struct Scsi_Host  *shost = class_to_shost(dev);
2330 	struct lpfc_hba   *phba = ((struct lpfc_vport *) shost->hostdata)->phba;
2331 
2332 	return snprintf(buf, PAGE_SIZE, "%d\n", phba->iocb_max);
2333 }
2334 
2335 static DEVICE_ATTR(iocb_hw, S_IRUGO,
2336 			 lpfc_iocb_hw_show, NULL);
2337 static ssize_t
2338 lpfc_txq_hw_show(struct device *dev, struct device_attribute *attr, char *buf)
2339 {
2340 	struct Scsi_Host  *shost = class_to_shost(dev);
2341 	struct lpfc_hba   *phba = ((struct lpfc_vport *) shost->hostdata)->phba;
2342 
2343 	return snprintf(buf, PAGE_SIZE, "%d\n",
2344 		phba->sli.ring[LPFC_ELS_RING].txq_max);
2345 }
2346 
2347 static DEVICE_ATTR(txq_hw, S_IRUGO,
2348 			 lpfc_txq_hw_show, NULL);
2349 static ssize_t
2350 lpfc_txcmplq_hw_show(struct device *dev, struct device_attribute *attr,
2351  char *buf)
2352 {
2353 	struct Scsi_Host  *shost = class_to_shost(dev);
2354 	struct lpfc_hba   *phba = ((struct lpfc_vport *) shost->hostdata)->phba;
2355 
2356 	return snprintf(buf, PAGE_SIZE, "%d\n",
2357 		phba->sli.ring[LPFC_ELS_RING].txcmplq_max);
2358 }
2359 
2360 static DEVICE_ATTR(txcmplq_hw, S_IRUGO,
2361 			 lpfc_txcmplq_hw_show, NULL);
2362 
2363 int lpfc_iocb_cnt = 2;
2364 module_param(lpfc_iocb_cnt, int, S_IRUGO);
2365 MODULE_PARM_DESC(lpfc_iocb_cnt,
2366 	"Number of IOCBs alloc for ELS, CT, and ABTS: 1k to 5k IOCBs");
2367 lpfc_param_show(iocb_cnt);
2368 lpfc_param_init(iocb_cnt, 2, 1, 5);
2369 static DEVICE_ATTR(lpfc_iocb_cnt, S_IRUGO,
2370 			 lpfc_iocb_cnt_show, NULL);
2371 
2372 /*
2373 # lpfc_nodev_tmo: If set, it will hold all I/O errors on devices that disappear
2374 # until the timer expires. Value range is [0,255]. Default value is 30.
2375 */
2376 static int lpfc_nodev_tmo = LPFC_DEF_DEVLOSS_TMO;
2377 static int lpfc_devloss_tmo = LPFC_DEF_DEVLOSS_TMO;
2378 module_param(lpfc_nodev_tmo, int, 0);
2379 MODULE_PARM_DESC(lpfc_nodev_tmo,
2380 		 "Seconds driver will hold I/O waiting "
2381 		 "for a device to come back");
2382 
2383 /**
2384  * lpfc_nodev_tmo_show - Return the hba dev loss timeout value
2385  * @dev: class converted to a Scsi_host structure.
2386  * @attr: device attribute, not used.
2387  * @buf: on return contains the dev loss timeout in decimal.
2388  *
2389  * Returns: size of formatted string.
2390  **/
2391 static ssize_t
2392 lpfc_nodev_tmo_show(struct device *dev, struct device_attribute *attr,
2393 		    char *buf)
2394 {
2395 	struct Scsi_Host  *shost = class_to_shost(dev);
2396 	struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata;
2397 
2398 	return snprintf(buf, PAGE_SIZE, "%d\n",	vport->cfg_devloss_tmo);
2399 }
2400 
2401 /**
2402  * lpfc_nodev_tmo_init - Set the hba nodev timeout value
2403  * @vport: lpfc vport structure pointer.
2404  * @val: contains the nodev timeout value.
2405  *
2406  * Description:
2407  * If the devloss tmo is already set then nodev tmo is set to devloss tmo,
2408  * a kernel error message is printed and zero is returned.
2409  * Else if val is in range then nodev tmo and devloss tmo are set to val.
2410  * Otherwise nodev tmo is set to the default value.
2411  *
2412  * Returns:
2413  * zero if already set or if val is in range
2414  * -EINVAL val out of range
2415  **/
2416 static int
2417 lpfc_nodev_tmo_init(struct lpfc_vport *vport, int val)
2418 {
2419 	if (vport->cfg_devloss_tmo != LPFC_DEF_DEVLOSS_TMO) {
2420 		vport->cfg_nodev_tmo = vport->cfg_devloss_tmo;
2421 		if (val != LPFC_DEF_DEVLOSS_TMO)
2422 			lpfc_printf_vlog(vport, KERN_ERR, LOG_INIT,
2423 					 "0407 Ignoring nodev_tmo module "
2424 					 "parameter because devloss_tmo is "
2425 					 "set.\n");
2426 		return 0;
2427 	}
2428 
2429 	if (val >= LPFC_MIN_DEVLOSS_TMO && val <= LPFC_MAX_DEVLOSS_TMO) {
2430 		vport->cfg_nodev_tmo = val;
2431 		vport->cfg_devloss_tmo = val;
2432 		return 0;
2433 	}
2434 	lpfc_printf_vlog(vport, KERN_ERR, LOG_INIT,
2435 			 "0400 lpfc_nodev_tmo attribute cannot be set to"
2436 			 " %d, allowed range is [%d, %d]\n",
2437 			 val, LPFC_MIN_DEVLOSS_TMO, LPFC_MAX_DEVLOSS_TMO);
2438 	vport->cfg_nodev_tmo = LPFC_DEF_DEVLOSS_TMO;
2439 	return -EINVAL;
2440 }
2441 
2442 /**
2443  * lpfc_update_rport_devloss_tmo - Update dev loss tmo value
2444  * @vport: lpfc vport structure pointer.
2445  *
2446  * Description:
2447  * Update all the ndlp's dev loss tmo with the vport devloss tmo value.
2448  **/
2449 static void
2450 lpfc_update_rport_devloss_tmo(struct lpfc_vport *vport)
2451 {
2452 	struct Scsi_Host  *shost;
2453 	struct lpfc_nodelist  *ndlp;
2454 
2455 	shost = lpfc_shost_from_vport(vport);
2456 	spin_lock_irq(shost->host_lock);
2457 	list_for_each_entry(ndlp, &vport->fc_nodes, nlp_listp)
2458 		if (NLP_CHK_NODE_ACT(ndlp) && ndlp->rport)
2459 			ndlp->rport->dev_loss_tmo = vport->cfg_devloss_tmo;
2460 	spin_unlock_irq(shost->host_lock);
2461 }
2462 
2463 /**
2464  * lpfc_nodev_tmo_set - Set the vport nodev tmo and devloss tmo values
2465  * @vport: lpfc vport structure pointer.
2466  * @val: contains the tmo value.
2467  *
2468  * Description:
2469  * If the devloss tmo is already set or the vport dev loss tmo has changed
2470  * then a kernel error message is printed and zero is returned.
2471  * Else if val is in range then nodev tmo and devloss tmo are set to val.
2472  * Otherwise nodev tmo is set to the default value.
2473  *
2474  * Returns:
2475  * zero if already set or if val is in range
2476  * -EINVAL val out of range
2477  **/
2478 static int
2479 lpfc_nodev_tmo_set(struct lpfc_vport *vport, int val)
2480 {
2481 	if (vport->dev_loss_tmo_changed ||
2482 	    (lpfc_devloss_tmo != LPFC_DEF_DEVLOSS_TMO)) {
2483 		lpfc_printf_vlog(vport, KERN_ERR, LOG_INIT,
2484 				 "0401 Ignoring change to nodev_tmo "
2485 				 "because devloss_tmo is set.\n");
2486 		return 0;
2487 	}
2488 	if (val >= LPFC_MIN_DEVLOSS_TMO && val <= LPFC_MAX_DEVLOSS_TMO) {
2489 		vport->cfg_nodev_tmo = val;
2490 		vport->cfg_devloss_tmo = val;
2491 		/*
2492 		 * For compat: set the fc_host dev loss so new rports
2493 		 * will get the value.
2494 		 */
2495 		fc_host_dev_loss_tmo(lpfc_shost_from_vport(vport)) = val;
2496 		lpfc_update_rport_devloss_tmo(vport);
2497 		return 0;
2498 	}
2499 	lpfc_printf_vlog(vport, KERN_ERR, LOG_INIT,
2500 			 "0403 lpfc_nodev_tmo attribute cannot be set to"
2501 			 "%d, allowed range is [%d, %d]\n",
2502 			 val, LPFC_MIN_DEVLOSS_TMO, LPFC_MAX_DEVLOSS_TMO);
2503 	return -EINVAL;
2504 }
2505 
2506 lpfc_vport_param_store(nodev_tmo)
2507 
2508 static DEVICE_ATTR(lpfc_nodev_tmo, S_IRUGO | S_IWUSR,
2509 		   lpfc_nodev_tmo_show, lpfc_nodev_tmo_store);
2510 
2511 /*
2512 # lpfc_devloss_tmo: If set, it will hold all I/O errors on devices that
2513 # disappear until the timer expires. Value range is [0,255]. Default
2514 # value is 30.
2515 */
2516 module_param(lpfc_devloss_tmo, int, S_IRUGO);
2517 MODULE_PARM_DESC(lpfc_devloss_tmo,
2518 		 "Seconds driver will hold I/O waiting "
2519 		 "for a device to come back");
2520 lpfc_vport_param_init(devloss_tmo, LPFC_DEF_DEVLOSS_TMO,
2521 		      LPFC_MIN_DEVLOSS_TMO, LPFC_MAX_DEVLOSS_TMO)
2522 lpfc_vport_param_show(devloss_tmo)
2523 
2524 /**
2525  * lpfc_devloss_tmo_set - Sets vport nodev tmo, devloss tmo values, changed bit
2526  * @vport: lpfc vport structure pointer.
2527  * @val: contains the tmo value.
2528  *
2529  * Description:
2530  * If val is in a valid range then set the vport nodev tmo,
2531  * devloss tmo, also set the vport dev loss tmo changed flag.
2532  * Else a kernel error message is printed.
2533  *
2534  * Returns:
2535  * zero if val is in range
2536  * -EINVAL val out of range
2537  **/
2538 static int
2539 lpfc_devloss_tmo_set(struct lpfc_vport *vport, int val)
2540 {
2541 	if (val >= LPFC_MIN_DEVLOSS_TMO && val <= LPFC_MAX_DEVLOSS_TMO) {
2542 		vport->cfg_nodev_tmo = val;
2543 		vport->cfg_devloss_tmo = val;
2544 		vport->dev_loss_tmo_changed = 1;
2545 		fc_host_dev_loss_tmo(lpfc_shost_from_vport(vport)) = val;
2546 		lpfc_update_rport_devloss_tmo(vport);
2547 		return 0;
2548 	}
2549 
2550 	lpfc_printf_vlog(vport, KERN_ERR, LOG_INIT,
2551 			 "0404 lpfc_devloss_tmo attribute cannot be set to"
2552 			 " %d, allowed range is [%d, %d]\n",
2553 			 val, LPFC_MIN_DEVLOSS_TMO, LPFC_MAX_DEVLOSS_TMO);
2554 	return -EINVAL;
2555 }
2556 
2557 lpfc_vport_param_store(devloss_tmo)
2558 static DEVICE_ATTR(lpfc_devloss_tmo, S_IRUGO | S_IWUSR,
2559 		   lpfc_devloss_tmo_show, lpfc_devloss_tmo_store);
2560 
2561 /*
2562 # lpfc_log_verbose: Only turn this flag on if you are willing to risk being
2563 # deluged with LOTS of information.
2564 # You can set a bit mask to record specific types of verbose messages:
2565 # See lpfc_logmsh.h for definitions.
2566 */
2567 LPFC_VPORT_ATTR_HEX_RW(log_verbose, 0x0, 0x0, 0xffffffff,
2568 		       "Verbose logging bit-mask");
2569 
2570 /*
2571 # lpfc_enable_da_id: This turns on the DA_ID CT command that deregisters
2572 # objects that have been registered with the nameserver after login.
2573 */
2574 LPFC_VPORT_ATTR_R(enable_da_id, 0, 0, 1,
2575 		  "Deregister nameserver objects before LOGO");
2576 
2577 /*
2578 # lun_queue_depth:  This parameter is used to limit the number of outstanding
2579 # commands per FCP LUN. Value range is [1,128]. Default value is 30.
2580 */
2581 LPFC_VPORT_ATTR_R(lun_queue_depth, 30, 1, 128,
2582 		  "Max number of FCP commands we can queue to a specific LUN");
2583 
2584 /*
2585 # tgt_queue_depth:  This parameter is used to limit the number of outstanding
2586 # commands per target port. Value range is [10,65535]. Default value is 65535.
2587 */
2588 LPFC_VPORT_ATTR_R(tgt_queue_depth, 65535, 10, 65535,
2589 	"Max number of FCP commands we can queue to a specific target port");
2590 
2591 /*
2592 # hba_queue_depth:  This parameter is used to limit the number of outstanding
2593 # commands per lpfc HBA. Value range is [32,8192]. If this parameter
2594 # value is greater than the maximum number of exchanges supported by the HBA,
2595 # then maximum number of exchanges supported by the HBA is used to determine
2596 # the hba_queue_depth.
2597 */
2598 LPFC_ATTR_R(hba_queue_depth, 8192, 32, 8192,
2599 	    "Max number of FCP commands we can queue to a lpfc HBA");
2600 
2601 /*
2602 # peer_port_login:  This parameter allows/prevents logins
2603 # between peer ports hosted on the same physical port.
2604 # When this parameter is set 0 peer ports of same physical port
2605 # are not allowed to login to each other.
2606 # When this parameter is set 1 peer ports of same physical port
2607 # are allowed to login to each other.
2608 # Default value of this parameter is 0.
2609 */
2610 LPFC_VPORT_ATTR_R(peer_port_login, 0, 0, 1,
2611 		  "Allow peer ports on the same physical port to login to each "
2612 		  "other.");
2613 
2614 /*
2615 # restrict_login:  This parameter allows/prevents logins
2616 # between Virtual Ports and remote initiators.
2617 # When this parameter is not set (0) Virtual Ports will accept PLOGIs from
2618 # other initiators and will attempt to PLOGI all remote ports.
2619 # When this parameter is set (1) Virtual Ports will reject PLOGIs from
2620 # remote ports and will not attempt to PLOGI to other initiators.
2621 # This parameter does not restrict to the physical port.
2622 # This parameter does not restrict logins to Fabric resident remote ports.
2623 # Default value of this parameter is 1.
2624 */
2625 static int lpfc_restrict_login = 1;
2626 module_param(lpfc_restrict_login, int, S_IRUGO);
2627 MODULE_PARM_DESC(lpfc_restrict_login,
2628 		 "Restrict virtual ports login to remote initiators.");
2629 lpfc_vport_param_show(restrict_login);
2630 
2631 /**
2632  * lpfc_restrict_login_init - Set the vport restrict login flag
2633  * @vport: lpfc vport structure pointer.
2634  * @val: contains the restrict login value.
2635  *
2636  * Description:
2637  * If val is not in a valid range then log a kernel error message and set
2638  * the vport restrict login to one.
2639  * If the port type is physical clear the restrict login flag and return.
2640  * Else set the restrict login flag to val.
2641  *
2642  * Returns:
2643  * zero if val is in range
2644  * -EINVAL val out of range
2645  **/
2646 static int
2647 lpfc_restrict_login_init(struct lpfc_vport *vport, int val)
2648 {
2649 	if (val < 0 || val > 1) {
2650 		lpfc_printf_vlog(vport, KERN_ERR, LOG_INIT,
2651 				 "0422 lpfc_restrict_login attribute cannot "
2652 				 "be set to %d, allowed range is [0, 1]\n",
2653 				 val);
2654 		vport->cfg_restrict_login = 1;
2655 		return -EINVAL;
2656 	}
2657 	if (vport->port_type == LPFC_PHYSICAL_PORT) {
2658 		vport->cfg_restrict_login = 0;
2659 		return 0;
2660 	}
2661 	vport->cfg_restrict_login = val;
2662 	return 0;
2663 }
2664 
2665 /**
2666  * lpfc_restrict_login_set - Set the vport restrict login flag
2667  * @vport: lpfc vport structure pointer.
2668  * @val: contains the restrict login value.
2669  *
2670  * Description:
2671  * If val is not in a valid range then log a kernel error message and set
2672  * the vport restrict login to one.
2673  * If the port type is physical and the val is not zero log a kernel
2674  * error message, clear the restrict login flag and return zero.
2675  * Else set the restrict login flag to val.
2676  *
2677  * Returns:
2678  * zero if val is in range
2679  * -EINVAL val out of range
2680  **/
2681 static int
2682 lpfc_restrict_login_set(struct lpfc_vport *vport, int val)
2683 {
2684 	if (val < 0 || val > 1) {
2685 		lpfc_printf_vlog(vport, KERN_ERR, LOG_INIT,
2686 				 "0425 lpfc_restrict_login attribute cannot "
2687 				 "be set to %d, allowed range is [0, 1]\n",
2688 				 val);
2689 		vport->cfg_restrict_login = 1;
2690 		return -EINVAL;
2691 	}
2692 	if (vport->port_type == LPFC_PHYSICAL_PORT && val != 0) {
2693 		lpfc_printf_vlog(vport, KERN_ERR, LOG_INIT,
2694 				 "0468 lpfc_restrict_login must be 0 for "
2695 				 "Physical ports.\n");
2696 		vport->cfg_restrict_login = 0;
2697 		return 0;
2698 	}
2699 	vport->cfg_restrict_login = val;
2700 	return 0;
2701 }
2702 lpfc_vport_param_store(restrict_login);
2703 static DEVICE_ATTR(lpfc_restrict_login, S_IRUGO | S_IWUSR,
2704 		   lpfc_restrict_login_show, lpfc_restrict_login_store);
2705 
2706 /*
2707 # Some disk devices have a "select ID" or "select Target" capability.
2708 # From a protocol standpoint "select ID" usually means select the
2709 # Fibre channel "ALPA".  In the FC-AL Profile there is an "informative
2710 # annex" which contains a table that maps a "select ID" (a number
2711 # between 0 and 7F) to an ALPA.  By default, for compatibility with
2712 # older drivers, the lpfc driver scans this table from low ALPA to high
2713 # ALPA.
2714 #
2715 # Turning on the scan-down variable (on  = 1, off = 0) will
2716 # cause the lpfc driver to use an inverted table, effectively
2717 # scanning ALPAs from high to low. Value range is [0,1]. Default value is 1.
2718 #
2719 # (Note: This "select ID" functionality is a LOOP ONLY characteristic
2720 # and will not work across a fabric. Also this parameter will take
2721 # effect only in the case when ALPA map is not available.)
2722 */
2723 LPFC_VPORT_ATTR_R(scan_down, 1, 0, 1,
2724 		  "Start scanning for devices from highest ALPA to lowest");
2725 
2726 /*
2727 # lpfc_topology:  link topology for init link
2728 #            0x0  = attempt loop mode then point-to-point
2729 #            0x01 = internal loopback mode
2730 #            0x02 = attempt point-to-point mode only
2731 #            0x04 = attempt loop mode only
2732 #            0x06 = attempt point-to-point mode then loop
2733 # Set point-to-point mode if you want to run as an N_Port.
2734 # Set loop mode if you want to run as an NL_Port. Value range is [0,0x6].
2735 # Default value is 0.
2736 */
2737 
2738 /**
2739  * lpfc_topology_set - Set the adapters topology field
2740  * @phba: lpfc_hba pointer.
2741  * @val: topology value.
2742  *
2743  * Description:
2744  * If val is in a valid range then set the adapter's topology field and
2745  * issue a lip; if the lip fails reset the topology to the old value.
2746  *
2747  * If the value is not in range log a kernel error message and return an error.
2748  *
2749  * Returns:
2750  * zero if val is in range and lip okay
2751  * non-zero return value from lpfc_issue_lip()
2752  * -EINVAL val out of range
2753  **/
2754 static ssize_t
2755 lpfc_topology_store(struct device *dev, struct device_attribute *attr,
2756 			const char *buf, size_t count)
2757 {
2758 	struct Scsi_Host  *shost = class_to_shost(dev);
2759 	struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata;
2760 	struct lpfc_hba   *phba = vport->phba;
2761 	int val = 0;
2762 	int nolip = 0;
2763 	const char *val_buf = buf;
2764 	int err;
2765 	uint32_t prev_val;
2766 
2767 	if (!strncmp(buf, "nolip ", strlen("nolip "))) {
2768 		nolip = 1;
2769 		val_buf = &buf[strlen("nolip ")];
2770 	}
2771 
2772 	if (!isdigit(val_buf[0]))
2773 		return -EINVAL;
2774 	if (sscanf(val_buf, "%i", &val) != 1)
2775 		return -EINVAL;
2776 
2777 	if (val >= 0 && val <= 6) {
2778 		prev_val = phba->cfg_topology;
2779 		phba->cfg_topology = val;
2780 		if (phba->cfg_link_speed == LPFC_USER_LINK_SPEED_16G &&
2781 			val == 4) {
2782 			lpfc_printf_vlog(vport, KERN_ERR, LOG_INIT,
2783 				"3113 Loop mode not supported at speed %d\n",
2784 				phba->cfg_link_speed);
2785 			phba->cfg_topology = prev_val;
2786 			return -EINVAL;
2787 		}
2788 		if (nolip)
2789 			return strlen(buf);
2790 
2791 		lpfc_printf_vlog(vport, KERN_ERR, LOG_INIT,
2792 			"3054 lpfc_topology changed from %d to %d\n",
2793 			prev_val, val);
2794 		err = lpfc_issue_lip(lpfc_shost_from_vport(phba->pport));
2795 		if (err) {
2796 			phba->cfg_topology = prev_val;
2797 			return -EINVAL;
2798 		} else
2799 			return strlen(buf);
2800 	}
2801 	lpfc_printf_log(phba, KERN_ERR, LOG_INIT,
2802 		"%d:0467 lpfc_topology attribute cannot be set to %d, "
2803 		"allowed range is [0, 6]\n",
2804 		phba->brd_no, val);
2805 	return -EINVAL;
2806 }
2807 static int lpfc_topology = 0;
2808 module_param(lpfc_topology, int, S_IRUGO);
2809 MODULE_PARM_DESC(lpfc_topology, "Select Fibre Channel topology");
2810 lpfc_param_show(topology)
2811 lpfc_param_init(topology, 0, 0, 6)
2812 static DEVICE_ATTR(lpfc_topology, S_IRUGO | S_IWUSR,
2813 		lpfc_topology_show, lpfc_topology_store);
2814 
2815 /**
2816  * lpfc_static_vport_show: Read callback function for
2817  *   lpfc_static_vport sysfs file.
2818  * @dev: Pointer to class device object.
2819  * @attr: device attribute structure.
2820  * @buf: Data buffer.
2821  *
2822  * This function is the read call back function for
2823  * lpfc_static_vport sysfs file. The lpfc_static_vport
2824  * sysfs file report the mageability of the vport.
2825  **/
2826 static ssize_t
2827 lpfc_static_vport_show(struct device *dev, struct device_attribute *attr,
2828 			 char *buf)
2829 {
2830 	struct Scsi_Host  *shost = class_to_shost(dev);
2831 	struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata;
2832 	if (vport->vport_flag & STATIC_VPORT)
2833 		sprintf(buf, "1\n");
2834 	else
2835 		sprintf(buf, "0\n");
2836 
2837 	return strlen(buf);
2838 }
2839 
2840 /*
2841  * Sysfs attribute to control the statistical data collection.
2842  */
2843 static DEVICE_ATTR(lpfc_static_vport, S_IRUGO,
2844 		   lpfc_static_vport_show, NULL);
2845 
2846 /**
2847  * lpfc_stat_data_ctrl_store - write call back for lpfc_stat_data_ctrl sysfs file
2848  * @dev: Pointer to class device.
2849  * @buf: Data buffer.
2850  * @count: Size of the data buffer.
2851  *
2852  * This function get called when an user write to the lpfc_stat_data_ctrl
2853  * sysfs file. This function parse the command written to the sysfs file
2854  * and take appropriate action. These commands are used for controlling
2855  * driver statistical data collection.
2856  * Following are the command this function handles.
2857  *
2858  *    setbucket <bucket_type> <base> <step>
2859  *			       = Set the latency buckets.
2860  *    destroybucket            = destroy all the buckets.
2861  *    start                    = start data collection
2862  *    stop                     = stop data collection
2863  *    reset                    = reset the collected data
2864  **/
2865 static ssize_t
2866 lpfc_stat_data_ctrl_store(struct device *dev, struct device_attribute *attr,
2867 			  const char *buf, size_t count)
2868 {
2869 	struct Scsi_Host  *shost = class_to_shost(dev);
2870 	struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata;
2871 	struct lpfc_hba   *phba = vport->phba;
2872 #define LPFC_MAX_DATA_CTRL_LEN 1024
2873 	static char bucket_data[LPFC_MAX_DATA_CTRL_LEN];
2874 	unsigned long i;
2875 	char *str_ptr, *token;
2876 	struct lpfc_vport **vports;
2877 	struct Scsi_Host *v_shost;
2878 	char *bucket_type_str, *base_str, *step_str;
2879 	unsigned long base, step, bucket_type;
2880 
2881 	if (!strncmp(buf, "setbucket", strlen("setbucket"))) {
2882 		if (strlen(buf) > (LPFC_MAX_DATA_CTRL_LEN - 1))
2883 			return -EINVAL;
2884 
2885 		strcpy(bucket_data, buf);
2886 		str_ptr = &bucket_data[0];
2887 		/* Ignore this token - this is command token */
2888 		token = strsep(&str_ptr, "\t ");
2889 		if (!token)
2890 			return -EINVAL;
2891 
2892 		bucket_type_str = strsep(&str_ptr, "\t ");
2893 		if (!bucket_type_str)
2894 			return -EINVAL;
2895 
2896 		if (!strncmp(bucket_type_str, "linear", strlen("linear")))
2897 			bucket_type = LPFC_LINEAR_BUCKET;
2898 		else if (!strncmp(bucket_type_str, "power2", strlen("power2")))
2899 			bucket_type = LPFC_POWER2_BUCKET;
2900 		else
2901 			return -EINVAL;
2902 
2903 		base_str = strsep(&str_ptr, "\t ");
2904 		if (!base_str)
2905 			return -EINVAL;
2906 		base = simple_strtoul(base_str, NULL, 0);
2907 
2908 		step_str = strsep(&str_ptr, "\t ");
2909 		if (!step_str)
2910 			return -EINVAL;
2911 		step = simple_strtoul(step_str, NULL, 0);
2912 		if (!step)
2913 			return -EINVAL;
2914 
2915 		/* Block the data collection for every vport */
2916 		vports = lpfc_create_vport_work_array(phba);
2917 		if (vports == NULL)
2918 			return -ENOMEM;
2919 
2920 		for (i = 0; i <= phba->max_vports && vports[i] != NULL; i++) {
2921 			v_shost = lpfc_shost_from_vport(vports[i]);
2922 			spin_lock_irq(v_shost->host_lock);
2923 			/* Block and reset data collection */
2924 			vports[i]->stat_data_blocked = 1;
2925 			if (vports[i]->stat_data_enabled)
2926 				lpfc_vport_reset_stat_data(vports[i]);
2927 			spin_unlock_irq(v_shost->host_lock);
2928 		}
2929 
2930 		/* Set the bucket attributes */
2931 		phba->bucket_type = bucket_type;
2932 		phba->bucket_base = base;
2933 		phba->bucket_step = step;
2934 
2935 		for (i = 0; i <= phba->max_vports && vports[i] != NULL; i++) {
2936 			v_shost = lpfc_shost_from_vport(vports[i]);
2937 
2938 			/* Unblock data collection */
2939 			spin_lock_irq(v_shost->host_lock);
2940 			vports[i]->stat_data_blocked = 0;
2941 			spin_unlock_irq(v_shost->host_lock);
2942 		}
2943 		lpfc_destroy_vport_work_array(phba, vports);
2944 		return strlen(buf);
2945 	}
2946 
2947 	if (!strncmp(buf, "destroybucket", strlen("destroybucket"))) {
2948 		vports = lpfc_create_vport_work_array(phba);
2949 		if (vports == NULL)
2950 			return -ENOMEM;
2951 
2952 		for (i = 0; i <= phba->max_vports && vports[i] != NULL; i++) {
2953 			v_shost = lpfc_shost_from_vport(vports[i]);
2954 			spin_lock_irq(shost->host_lock);
2955 			vports[i]->stat_data_blocked = 1;
2956 			lpfc_free_bucket(vport);
2957 			vport->stat_data_enabled = 0;
2958 			vports[i]->stat_data_blocked = 0;
2959 			spin_unlock_irq(shost->host_lock);
2960 		}
2961 		lpfc_destroy_vport_work_array(phba, vports);
2962 		phba->bucket_type = LPFC_NO_BUCKET;
2963 		phba->bucket_base = 0;
2964 		phba->bucket_step = 0;
2965 		return strlen(buf);
2966 	}
2967 
2968 	if (!strncmp(buf, "start", strlen("start"))) {
2969 		/* If no buckets configured return error */
2970 		if (phba->bucket_type == LPFC_NO_BUCKET)
2971 			return -EINVAL;
2972 		spin_lock_irq(shost->host_lock);
2973 		if (vport->stat_data_enabled) {
2974 			spin_unlock_irq(shost->host_lock);
2975 			return strlen(buf);
2976 		}
2977 		lpfc_alloc_bucket(vport);
2978 		vport->stat_data_enabled = 1;
2979 		spin_unlock_irq(shost->host_lock);
2980 		return strlen(buf);
2981 	}
2982 
2983 	if (!strncmp(buf, "stop", strlen("stop"))) {
2984 		spin_lock_irq(shost->host_lock);
2985 		if (vport->stat_data_enabled == 0) {
2986 			spin_unlock_irq(shost->host_lock);
2987 			return strlen(buf);
2988 		}
2989 		lpfc_free_bucket(vport);
2990 		vport->stat_data_enabled = 0;
2991 		spin_unlock_irq(shost->host_lock);
2992 		return strlen(buf);
2993 	}
2994 
2995 	if (!strncmp(buf, "reset", strlen("reset"))) {
2996 		if ((phba->bucket_type == LPFC_NO_BUCKET)
2997 			|| !vport->stat_data_enabled)
2998 			return strlen(buf);
2999 		spin_lock_irq(shost->host_lock);
3000 		vport->stat_data_blocked = 1;
3001 		lpfc_vport_reset_stat_data(vport);
3002 		vport->stat_data_blocked = 0;
3003 		spin_unlock_irq(shost->host_lock);
3004 		return strlen(buf);
3005 	}
3006 	return -EINVAL;
3007 }
3008 
3009 
3010 /**
3011  * lpfc_stat_data_ctrl_show - Read function for lpfc_stat_data_ctrl sysfs file
3012  * @dev: Pointer to class device object.
3013  * @buf: Data buffer.
3014  *
3015  * This function is the read call back function for
3016  * lpfc_stat_data_ctrl sysfs file. This function report the
3017  * current statistical data collection state.
3018  **/
3019 static ssize_t
3020 lpfc_stat_data_ctrl_show(struct device *dev, struct device_attribute *attr,
3021 			 char *buf)
3022 {
3023 	struct Scsi_Host  *shost = class_to_shost(dev);
3024 	struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata;
3025 	struct lpfc_hba   *phba = vport->phba;
3026 	int index = 0;
3027 	int i;
3028 	char *bucket_type;
3029 	unsigned long bucket_value;
3030 
3031 	switch (phba->bucket_type) {
3032 	case LPFC_LINEAR_BUCKET:
3033 		bucket_type = "linear";
3034 		break;
3035 	case LPFC_POWER2_BUCKET:
3036 		bucket_type = "power2";
3037 		break;
3038 	default:
3039 		bucket_type = "No Bucket";
3040 		break;
3041 	}
3042 
3043 	sprintf(&buf[index], "Statistical Data enabled :%d, "
3044 		"blocked :%d, Bucket type :%s, Bucket base :%d,"
3045 		" Bucket step :%d\nLatency Ranges :",
3046 		vport->stat_data_enabled, vport->stat_data_blocked,
3047 		bucket_type, phba->bucket_base, phba->bucket_step);
3048 	index = strlen(buf);
3049 	if (phba->bucket_type != LPFC_NO_BUCKET) {
3050 		for (i = 0; i < LPFC_MAX_BUCKET_COUNT; i++) {
3051 			if (phba->bucket_type == LPFC_LINEAR_BUCKET)
3052 				bucket_value = phba->bucket_base +
3053 					phba->bucket_step * i;
3054 			else
3055 				bucket_value = phba->bucket_base +
3056 				(1 << i) * phba->bucket_step;
3057 
3058 			if (index + 10 > PAGE_SIZE)
3059 				break;
3060 			sprintf(&buf[index], "%08ld ", bucket_value);
3061 			index = strlen(buf);
3062 		}
3063 	}
3064 	sprintf(&buf[index], "\n");
3065 	return strlen(buf);
3066 }
3067 
3068 /*
3069  * Sysfs attribute to control the statistical data collection.
3070  */
3071 static DEVICE_ATTR(lpfc_stat_data_ctrl, S_IRUGO | S_IWUSR,
3072 		   lpfc_stat_data_ctrl_show, lpfc_stat_data_ctrl_store);
3073 
3074 /*
3075  * lpfc_drvr_stat_data: sysfs attr to get driver statistical data.
3076  */
3077 
3078 /*
3079  * Each Bucket takes 11 characters and 1 new line + 17 bytes WWN
3080  * for each target.
3081  */
3082 #define STAT_DATA_SIZE_PER_TARGET(NUM_BUCKETS) ((NUM_BUCKETS) * 11 + 18)
3083 #define MAX_STAT_DATA_SIZE_PER_TARGET \
3084 	STAT_DATA_SIZE_PER_TARGET(LPFC_MAX_BUCKET_COUNT)
3085 
3086 
3087 /**
3088  * sysfs_drvr_stat_data_read - Read function for lpfc_drvr_stat_data attribute
3089  * @filp: sysfs file
3090  * @kobj: Pointer to the kernel object
3091  * @bin_attr: Attribute object
3092  * @buff: Buffer pointer
3093  * @off: File offset
3094  * @count: Buffer size
3095  *
3096  * This function is the read call back function for lpfc_drvr_stat_data
3097  * sysfs file. This function export the statistical data to user
3098  * applications.
3099  **/
3100 static ssize_t
3101 sysfs_drvr_stat_data_read(struct file *filp, struct kobject *kobj,
3102 		struct bin_attribute *bin_attr,
3103 		char *buf, loff_t off, size_t count)
3104 {
3105 	struct device *dev = container_of(kobj, struct device,
3106 		kobj);
3107 	struct Scsi_Host  *shost = class_to_shost(dev);
3108 	struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata;
3109 	struct lpfc_hba   *phba = vport->phba;
3110 	int i = 0, index = 0;
3111 	unsigned long nport_index;
3112 	struct lpfc_nodelist *ndlp = NULL;
3113 	nport_index = (unsigned long)off /
3114 		MAX_STAT_DATA_SIZE_PER_TARGET;
3115 
3116 	if (!vport->stat_data_enabled || vport->stat_data_blocked
3117 		|| (phba->bucket_type == LPFC_NO_BUCKET))
3118 		return 0;
3119 
3120 	spin_lock_irq(shost->host_lock);
3121 	list_for_each_entry(ndlp, &vport->fc_nodes, nlp_listp) {
3122 		if (!NLP_CHK_NODE_ACT(ndlp) || !ndlp->lat_data)
3123 			continue;
3124 
3125 		if (nport_index > 0) {
3126 			nport_index--;
3127 			continue;
3128 		}
3129 
3130 		if ((index + MAX_STAT_DATA_SIZE_PER_TARGET)
3131 			> count)
3132 			break;
3133 
3134 		if (!ndlp->lat_data)
3135 			continue;
3136 
3137 		/* Print the WWN */
3138 		sprintf(&buf[index], "%02x%02x%02x%02x%02x%02x%02x%02x:",
3139 			ndlp->nlp_portname.u.wwn[0],
3140 			ndlp->nlp_portname.u.wwn[1],
3141 			ndlp->nlp_portname.u.wwn[2],
3142 			ndlp->nlp_portname.u.wwn[3],
3143 			ndlp->nlp_portname.u.wwn[4],
3144 			ndlp->nlp_portname.u.wwn[5],
3145 			ndlp->nlp_portname.u.wwn[6],
3146 			ndlp->nlp_portname.u.wwn[7]);
3147 
3148 		index = strlen(buf);
3149 
3150 		for (i = 0; i < LPFC_MAX_BUCKET_COUNT; i++) {
3151 			sprintf(&buf[index], "%010u,",
3152 				ndlp->lat_data[i].cmd_count);
3153 			index = strlen(buf);
3154 		}
3155 		sprintf(&buf[index], "\n");
3156 		index = strlen(buf);
3157 	}
3158 	spin_unlock_irq(shost->host_lock);
3159 	return index;
3160 }
3161 
3162 static struct bin_attribute sysfs_drvr_stat_data_attr = {
3163 	.attr = {
3164 		.name = "lpfc_drvr_stat_data",
3165 		.mode = S_IRUSR,
3166 	},
3167 	.size = LPFC_MAX_TARGET * MAX_STAT_DATA_SIZE_PER_TARGET,
3168 	.read = sysfs_drvr_stat_data_read,
3169 	.write = NULL,
3170 };
3171 
3172 /*
3173 # lpfc_link_speed: Link speed selection for initializing the Fibre Channel
3174 # connection.
3175 # Value range is [0,16]. Default value is 0.
3176 */
3177 /**
3178  * lpfc_link_speed_set - Set the adapters link speed
3179  * @phba: lpfc_hba pointer.
3180  * @val: link speed value.
3181  *
3182  * Description:
3183  * If val is in a valid range then set the adapter's link speed field and
3184  * issue a lip; if the lip fails reset the link speed to the old value.
3185  *
3186  * Notes:
3187  * If the value is not in range log a kernel error message and return an error.
3188  *
3189  * Returns:
3190  * zero if val is in range and lip okay.
3191  * non-zero return value from lpfc_issue_lip()
3192  * -EINVAL val out of range
3193  **/
3194 static ssize_t
3195 lpfc_link_speed_store(struct device *dev, struct device_attribute *attr,
3196 		const char *buf, size_t count)
3197 {
3198 	struct Scsi_Host  *shost = class_to_shost(dev);
3199 	struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata;
3200 	struct lpfc_hba   *phba = vport->phba;
3201 	int val = LPFC_USER_LINK_SPEED_AUTO;
3202 	int nolip = 0;
3203 	const char *val_buf = buf;
3204 	int err;
3205 	uint32_t prev_val;
3206 
3207 	if (!strncmp(buf, "nolip ", strlen("nolip "))) {
3208 		nolip = 1;
3209 		val_buf = &buf[strlen("nolip ")];
3210 	}
3211 
3212 	if (!isdigit(val_buf[0]))
3213 		return -EINVAL;
3214 	if (sscanf(val_buf, "%i", &val) != 1)
3215 		return -EINVAL;
3216 
3217 	lpfc_printf_vlog(vport, KERN_ERR, LOG_INIT,
3218 		"3055 lpfc_link_speed changed from %d to %d %s\n",
3219 		phba->cfg_link_speed, val, nolip ? "(nolip)" : "(lip)");
3220 
3221 	if (((val == LPFC_USER_LINK_SPEED_1G) && !(phba->lmt & LMT_1Gb)) ||
3222 	    ((val == LPFC_USER_LINK_SPEED_2G) && !(phba->lmt & LMT_2Gb)) ||
3223 	    ((val == LPFC_USER_LINK_SPEED_4G) && !(phba->lmt & LMT_4Gb)) ||
3224 	    ((val == LPFC_USER_LINK_SPEED_8G) && !(phba->lmt & LMT_8Gb)) ||
3225 	    ((val == LPFC_USER_LINK_SPEED_10G) && !(phba->lmt & LMT_10Gb)) ||
3226 	    ((val == LPFC_USER_LINK_SPEED_16G) && !(phba->lmt & LMT_16Gb))) {
3227 		lpfc_printf_log(phba, KERN_ERR, LOG_INIT,
3228 				"2879 lpfc_link_speed attribute cannot be set "
3229 				"to %d. Speed is not supported by this port.\n",
3230 				val);
3231 		return -EINVAL;
3232 	}
3233 	if (val == LPFC_USER_LINK_SPEED_16G &&
3234 		 phba->fc_topology == LPFC_TOPOLOGY_LOOP) {
3235 		lpfc_printf_log(phba, KERN_ERR, LOG_INIT,
3236 				"3112 lpfc_link_speed attribute cannot be set "
3237 				"to %d. Speed is not supported in loop mode.\n",
3238 				val);
3239 		return -EINVAL;
3240 	}
3241 	if ((val >= 0) && (val <= LPFC_USER_LINK_SPEED_MAX) &&
3242 	    (LPFC_USER_LINK_SPEED_BITMAP & (1 << val))) {
3243 		prev_val = phba->cfg_link_speed;
3244 		phba->cfg_link_speed = val;
3245 		if (nolip)
3246 			return strlen(buf);
3247 
3248 		err = lpfc_issue_lip(lpfc_shost_from_vport(phba->pport));
3249 		if (err) {
3250 			phba->cfg_link_speed = prev_val;
3251 			return -EINVAL;
3252 		} else
3253 			return strlen(buf);
3254 	}
3255 	lpfc_printf_log(phba, KERN_ERR, LOG_INIT,
3256 		"0469 lpfc_link_speed attribute cannot be set to %d, "
3257 		"allowed values are ["LPFC_LINK_SPEED_STRING"]\n", val);
3258 	return -EINVAL;
3259 }
3260 
3261 static int lpfc_link_speed = 0;
3262 module_param(lpfc_link_speed, int, S_IRUGO);
3263 MODULE_PARM_DESC(lpfc_link_speed, "Select link speed");
3264 lpfc_param_show(link_speed)
3265 
3266 /**
3267  * lpfc_link_speed_init - Set the adapters link speed
3268  * @phba: lpfc_hba pointer.
3269  * @val: link speed value.
3270  *
3271  * Description:
3272  * If val is in a valid range then set the adapter's link speed field.
3273  *
3274  * Notes:
3275  * If the value is not in range log a kernel error message, clear the link
3276  * speed and return an error.
3277  *
3278  * Returns:
3279  * zero if val saved.
3280  * -EINVAL val out of range
3281  **/
3282 static int
3283 lpfc_link_speed_init(struct lpfc_hba *phba, int val)
3284 {
3285 	if (val == LPFC_USER_LINK_SPEED_16G && phba->cfg_topology == 4) {
3286 		lpfc_printf_log(phba, KERN_ERR, LOG_INIT,
3287 			"3111 lpfc_link_speed of %d cannot "
3288 			"support loop mode, setting topology to default.\n",
3289 			 val);
3290 		phba->cfg_topology = 0;
3291 	}
3292 	if ((val >= 0) && (val <= LPFC_USER_LINK_SPEED_MAX) &&
3293 	    (LPFC_USER_LINK_SPEED_BITMAP & (1 << val))) {
3294 		phba->cfg_link_speed = val;
3295 		return 0;
3296 	}
3297 	lpfc_printf_log(phba, KERN_ERR, LOG_INIT,
3298 			"0405 lpfc_link_speed attribute cannot "
3299 			"be set to %d, allowed values are "
3300 			"["LPFC_LINK_SPEED_STRING"]\n", val);
3301 	phba->cfg_link_speed = LPFC_USER_LINK_SPEED_AUTO;
3302 	return -EINVAL;
3303 }
3304 
3305 static DEVICE_ATTR(lpfc_link_speed, S_IRUGO | S_IWUSR,
3306 		   lpfc_link_speed_show, lpfc_link_speed_store);
3307 
3308 /*
3309 # lpfc_aer_support: Support PCIe device Advanced Error Reporting (AER)
3310 #       0  = aer disabled or not supported
3311 #       1  = aer supported and enabled (default)
3312 # Value range is [0,1]. Default value is 1.
3313 */
3314 
3315 /**
3316  * lpfc_aer_support_store - Set the adapter for aer support
3317  *
3318  * @dev: class device that is converted into a Scsi_host.
3319  * @attr: device attribute, not used.
3320  * @buf: containing enable or disable aer flag.
3321  * @count: unused variable.
3322  *
3323  * Description:
3324  * If the val is 1 and currently the device's AER capability was not
3325  * enabled, invoke the kernel's enable AER helper routine, trying to
3326  * enable the device's AER capability. If the helper routine enabling
3327  * AER returns success, update the device's cfg_aer_support flag to
3328  * indicate AER is supported by the device; otherwise, if the device
3329  * AER capability is already enabled to support AER, then do nothing.
3330  *
3331  * If the val is 0 and currently the device's AER support was enabled,
3332  * invoke the kernel's disable AER helper routine. After that, update
3333  * the device's cfg_aer_support flag to indicate AER is not supported
3334  * by the device; otherwise, if the device AER capability is already
3335  * disabled from supporting AER, then do nothing.
3336  *
3337  * Returns:
3338  * length of the buf on success if val is in range the intended mode
3339  * is supported.
3340  * -EINVAL if val out of range or intended mode is not supported.
3341  **/
3342 static ssize_t
3343 lpfc_aer_support_store(struct device *dev, struct device_attribute *attr,
3344 		       const char *buf, size_t count)
3345 {
3346 	struct Scsi_Host *shost = class_to_shost(dev);
3347 	struct lpfc_vport *vport = (struct lpfc_vport *)shost->hostdata;
3348 	struct lpfc_hba *phba = vport->phba;
3349 	int val = 0, rc = -EINVAL;
3350 
3351 	if (!isdigit(buf[0]))
3352 		return -EINVAL;
3353 	if (sscanf(buf, "%i", &val) != 1)
3354 		return -EINVAL;
3355 
3356 	switch (val) {
3357 	case 0:
3358 		if (phba->hba_flag & HBA_AER_ENABLED) {
3359 			rc = pci_disable_pcie_error_reporting(phba->pcidev);
3360 			if (!rc) {
3361 				spin_lock_irq(&phba->hbalock);
3362 				phba->hba_flag &= ~HBA_AER_ENABLED;
3363 				spin_unlock_irq(&phba->hbalock);
3364 				phba->cfg_aer_support = 0;
3365 				rc = strlen(buf);
3366 			} else
3367 				rc = -EPERM;
3368 		} else {
3369 			phba->cfg_aer_support = 0;
3370 			rc = strlen(buf);
3371 		}
3372 		break;
3373 	case 1:
3374 		if (!(phba->hba_flag & HBA_AER_ENABLED)) {
3375 			rc = pci_enable_pcie_error_reporting(phba->pcidev);
3376 			if (!rc) {
3377 				spin_lock_irq(&phba->hbalock);
3378 				phba->hba_flag |= HBA_AER_ENABLED;
3379 				spin_unlock_irq(&phba->hbalock);
3380 				phba->cfg_aer_support = 1;
3381 				rc = strlen(buf);
3382 			} else
3383 				 rc = -EPERM;
3384 		} else {
3385 			phba->cfg_aer_support = 1;
3386 			rc = strlen(buf);
3387 		}
3388 		break;
3389 	default:
3390 		rc = -EINVAL;
3391 		break;
3392 	}
3393 	return rc;
3394 }
3395 
3396 static int lpfc_aer_support = 1;
3397 module_param(lpfc_aer_support, int, S_IRUGO);
3398 MODULE_PARM_DESC(lpfc_aer_support, "Enable PCIe device AER support");
3399 lpfc_param_show(aer_support)
3400 
3401 /**
3402  * lpfc_aer_support_init - Set the initial adapters aer support flag
3403  * @phba: lpfc_hba pointer.
3404  * @val: enable aer or disable aer flag.
3405  *
3406  * Description:
3407  * If val is in a valid range [0,1], then set the adapter's initial
3408  * cfg_aer_support field. It will be up to the driver's probe_one
3409  * routine to determine whether the device's AER support can be set
3410  * or not.
3411  *
3412  * Notes:
3413  * If the value is not in range log a kernel error message, and
3414  * choose the default value of setting AER support and return.
3415  *
3416  * Returns:
3417  * zero if val saved.
3418  * -EINVAL val out of range
3419  **/
3420 static int
3421 lpfc_aer_support_init(struct lpfc_hba *phba, int val)
3422 {
3423 	if (val == 0 || val == 1) {
3424 		phba->cfg_aer_support = val;
3425 		return 0;
3426 	}
3427 	lpfc_printf_log(phba, KERN_ERR, LOG_INIT,
3428 			"2712 lpfc_aer_support attribute value %d out "
3429 			"of range, allowed values are 0|1, setting it "
3430 			"to default value of 1\n", val);
3431 	/* By default, try to enable AER on a device */
3432 	phba->cfg_aer_support = 1;
3433 	return -EINVAL;
3434 }
3435 
3436 static DEVICE_ATTR(lpfc_aer_support, S_IRUGO | S_IWUSR,
3437 		   lpfc_aer_support_show, lpfc_aer_support_store);
3438 
3439 /**
3440  * lpfc_aer_cleanup_state - Clean up aer state to the aer enabled device
3441  * @dev: class device that is converted into a Scsi_host.
3442  * @attr: device attribute, not used.
3443  * @buf: containing flag 1 for aer cleanup state.
3444  * @count: unused variable.
3445  *
3446  * Description:
3447  * If the @buf contains 1 and the device currently has the AER support
3448  * enabled, then invokes the kernel AER helper routine
3449  * pci_cleanup_aer_uncorrect_error_status to clean up the uncorrectable
3450  * error status register.
3451  *
3452  * Notes:
3453  *
3454  * Returns:
3455  * -EINVAL if the buf does not contain the 1 or the device is not currently
3456  * enabled with the AER support.
3457  **/
3458 static ssize_t
3459 lpfc_aer_cleanup_state(struct device *dev, struct device_attribute *attr,
3460 		       const char *buf, size_t count)
3461 {
3462 	struct Scsi_Host  *shost = class_to_shost(dev);
3463 	struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata;
3464 	struct lpfc_hba   *phba = vport->phba;
3465 	int val, rc = -1;
3466 
3467 	if (!isdigit(buf[0]))
3468 		return -EINVAL;
3469 	if (sscanf(buf, "%i", &val) != 1)
3470 		return -EINVAL;
3471 	if (val != 1)
3472 		return -EINVAL;
3473 
3474 	if (phba->hba_flag & HBA_AER_ENABLED)
3475 		rc = pci_cleanup_aer_uncorrect_error_status(phba->pcidev);
3476 
3477 	if (rc == 0)
3478 		return strlen(buf);
3479 	else
3480 		return -EPERM;
3481 }
3482 
3483 static DEVICE_ATTR(lpfc_aer_state_cleanup, S_IWUSR, NULL,
3484 		   lpfc_aer_cleanup_state);
3485 
3486 /**
3487  * lpfc_sriov_nr_virtfn_store - Enable the adapter for sr-iov virtual functions
3488  *
3489  * @dev: class device that is converted into a Scsi_host.
3490  * @attr: device attribute, not used.
3491  * @buf: containing the string the number of vfs to be enabled.
3492  * @count: unused variable.
3493  *
3494  * Description:
3495  * When this api is called either through user sysfs, the driver shall
3496  * try to enable or disable SR-IOV virtual functions according to the
3497  * following:
3498  *
3499  * If zero virtual function has been enabled to the physical function,
3500  * the driver shall invoke the pci enable virtual function api trying
3501  * to enable the virtual functions. If the nr_vfn provided is greater
3502  * than the maximum supported, the maximum virtual function number will
3503  * be used for invoking the api; otherwise, the nr_vfn provided shall
3504  * be used for invoking the api. If the api call returned success, the
3505  * actual number of virtual functions enabled will be set to the driver
3506  * cfg_sriov_nr_virtfn; otherwise, -EINVAL shall be returned and driver
3507  * cfg_sriov_nr_virtfn remains zero.
3508  *
3509  * If none-zero virtual functions have already been enabled to the
3510  * physical function, as reflected by the driver's cfg_sriov_nr_virtfn,
3511  * -EINVAL will be returned and the driver does nothing;
3512  *
3513  * If the nr_vfn provided is zero and none-zero virtual functions have
3514  * been enabled, as indicated by the driver's cfg_sriov_nr_virtfn, the
3515  * disabling virtual function api shall be invoded to disable all the
3516  * virtual functions and driver's cfg_sriov_nr_virtfn shall be set to
3517  * zero. Otherwise, if zero virtual function has been enabled, do
3518  * nothing.
3519  *
3520  * Returns:
3521  * length of the buf on success if val is in range the intended mode
3522  * is supported.
3523  * -EINVAL if val out of range or intended mode is not supported.
3524  **/
3525 static ssize_t
3526 lpfc_sriov_nr_virtfn_store(struct device *dev, struct device_attribute *attr,
3527 			 const char *buf, size_t count)
3528 {
3529 	struct Scsi_Host *shost = class_to_shost(dev);
3530 	struct lpfc_vport *vport = (struct lpfc_vport *)shost->hostdata;
3531 	struct lpfc_hba *phba = vport->phba;
3532 	struct pci_dev *pdev = phba->pcidev;
3533 	int val = 0, rc = -EINVAL;
3534 
3535 	/* Sanity check on user data */
3536 	if (!isdigit(buf[0]))
3537 		return -EINVAL;
3538 	if (sscanf(buf, "%i", &val) != 1)
3539 		return -EINVAL;
3540 	if (val < 0)
3541 		return -EINVAL;
3542 
3543 	/* Request disabling virtual functions */
3544 	if (val == 0) {
3545 		if (phba->cfg_sriov_nr_virtfn > 0) {
3546 			pci_disable_sriov(pdev);
3547 			phba->cfg_sriov_nr_virtfn = 0;
3548 		}
3549 		return strlen(buf);
3550 	}
3551 
3552 	/* Request enabling virtual functions */
3553 	if (phba->cfg_sriov_nr_virtfn > 0) {
3554 		lpfc_printf_log(phba, KERN_ERR, LOG_INIT,
3555 				"3018 There are %d virtual functions "
3556 				"enabled on physical function.\n",
3557 				phba->cfg_sriov_nr_virtfn);
3558 		return -EEXIST;
3559 	}
3560 
3561 	if (val <= LPFC_MAX_VFN_PER_PFN)
3562 		phba->cfg_sriov_nr_virtfn = val;
3563 	else {
3564 		lpfc_printf_log(phba, KERN_ERR, LOG_INIT,
3565 				"3019 Enabling %d virtual functions is not "
3566 				"allowed.\n", val);
3567 		return -EINVAL;
3568 	}
3569 
3570 	rc = lpfc_sli_probe_sriov_nr_virtfn(phba, phba->cfg_sriov_nr_virtfn);
3571 	if (rc) {
3572 		phba->cfg_sriov_nr_virtfn = 0;
3573 		rc = -EPERM;
3574 	} else
3575 		rc = strlen(buf);
3576 
3577 	return rc;
3578 }
3579 
3580 static int lpfc_sriov_nr_virtfn = LPFC_DEF_VFN_PER_PFN;
3581 module_param(lpfc_sriov_nr_virtfn, int, S_IRUGO|S_IWUSR);
3582 MODULE_PARM_DESC(lpfc_sriov_nr_virtfn, "Enable PCIe device SR-IOV virtual fn");
3583 lpfc_param_show(sriov_nr_virtfn)
3584 
3585 /**
3586  * lpfc_sriov_nr_virtfn_init - Set the initial sr-iov virtual function enable
3587  * @phba: lpfc_hba pointer.
3588  * @val: link speed value.
3589  *
3590  * Description:
3591  * If val is in a valid range [0,255], then set the adapter's initial
3592  * cfg_sriov_nr_virtfn field. If it's greater than the maximum, the maximum
3593  * number shall be used instead. It will be up to the driver's probe_one
3594  * routine to determine whether the device's SR-IOV is supported or not.
3595  *
3596  * Returns:
3597  * zero if val saved.
3598  * -EINVAL val out of range
3599  **/
3600 static int
3601 lpfc_sriov_nr_virtfn_init(struct lpfc_hba *phba, int val)
3602 {
3603 	if (val >= 0 && val <= LPFC_MAX_VFN_PER_PFN) {
3604 		phba->cfg_sriov_nr_virtfn = val;
3605 		return 0;
3606 	}
3607 
3608 	lpfc_printf_log(phba, KERN_ERR, LOG_INIT,
3609 			"3017 Enabling %d virtual functions is not "
3610 			"allowed.\n", val);
3611 	return -EINVAL;
3612 }
3613 static DEVICE_ATTR(lpfc_sriov_nr_virtfn, S_IRUGO | S_IWUSR,
3614 		   lpfc_sriov_nr_virtfn_show, lpfc_sriov_nr_virtfn_store);
3615 
3616 /*
3617 # lpfc_fcp_class:  Determines FC class to use for the FCP protocol.
3618 # Value range is [2,3]. Default value is 3.
3619 */
3620 LPFC_VPORT_ATTR_R(fcp_class, 3, 2, 3,
3621 		  "Select Fibre Channel class of service for FCP sequences");
3622 
3623 /*
3624 # lpfc_use_adisc: Use ADISC for FCP rediscovery instead of PLOGI. Value range
3625 # is [0,1]. Default value is 0.
3626 */
3627 LPFC_VPORT_ATTR_RW(use_adisc, 0, 0, 1,
3628 		   "Use ADISC on rediscovery to authenticate FCP devices");
3629 
3630 /*
3631 # lpfc_max_scsicmpl_time: Use scsi command completion time to control I/O queue
3632 # depth. Default value is 0. When the value of this parameter is zero the
3633 # SCSI command completion time is not used for controlling I/O queue depth. When
3634 # the parameter is set to a non-zero value, the I/O queue depth is controlled
3635 # to limit the I/O completion time to the parameter value.
3636 # The value is set in milliseconds.
3637 */
3638 static int lpfc_max_scsicmpl_time;
3639 module_param(lpfc_max_scsicmpl_time, int, S_IRUGO);
3640 MODULE_PARM_DESC(lpfc_max_scsicmpl_time,
3641 	"Use command completion time to control queue depth");
3642 lpfc_vport_param_show(max_scsicmpl_time);
3643 lpfc_vport_param_init(max_scsicmpl_time, 0, 0, 60000);
3644 static int
3645 lpfc_max_scsicmpl_time_set(struct lpfc_vport *vport, int val)
3646 {
3647 	struct Scsi_Host *shost = lpfc_shost_from_vport(vport);
3648 	struct lpfc_nodelist *ndlp, *next_ndlp;
3649 
3650 	if (val == vport->cfg_max_scsicmpl_time)
3651 		return 0;
3652 	if ((val < 0) || (val > 60000))
3653 		return -EINVAL;
3654 	vport->cfg_max_scsicmpl_time = val;
3655 
3656 	spin_lock_irq(shost->host_lock);
3657 	list_for_each_entry_safe(ndlp, next_ndlp, &vport->fc_nodes, nlp_listp) {
3658 		if (!NLP_CHK_NODE_ACT(ndlp))
3659 			continue;
3660 		if (ndlp->nlp_state == NLP_STE_UNUSED_NODE)
3661 			continue;
3662 		ndlp->cmd_qdepth = vport->cfg_tgt_queue_depth;
3663 	}
3664 	spin_unlock_irq(shost->host_lock);
3665 	return 0;
3666 }
3667 lpfc_vport_param_store(max_scsicmpl_time);
3668 static DEVICE_ATTR(lpfc_max_scsicmpl_time, S_IRUGO | S_IWUSR,
3669 		   lpfc_max_scsicmpl_time_show,
3670 		   lpfc_max_scsicmpl_time_store);
3671 
3672 /*
3673 # lpfc_ack0: Use ACK0, instead of ACK1 for class 2 acknowledgement. Value
3674 # range is [0,1]. Default value is 0.
3675 */
3676 LPFC_ATTR_R(ack0, 0, 0, 1, "Enable ACK0 support");
3677 
3678 /*
3679 # lpfc_cr_delay & lpfc_cr_count: Default values for I/O colaesing
3680 # cr_delay (msec) or cr_count outstanding commands. cr_delay can take
3681 # value [0,63]. cr_count can take value [1,255]. Default value of cr_delay
3682 # is 0. Default value of cr_count is 1. The cr_count feature is disabled if
3683 # cr_delay is set to 0.
3684 */
3685 LPFC_ATTR_RW(cr_delay, 0, 0, 63, "A count of milliseconds after which an "
3686 		"interrupt response is generated");
3687 
3688 LPFC_ATTR_RW(cr_count, 1, 1, 255, "A count of I/O completions after which an "
3689 		"interrupt response is generated");
3690 
3691 /*
3692 # lpfc_multi_ring_support:  Determines how many rings to spread available
3693 # cmd/rsp IOCB entries across.
3694 # Value range is [1,2]. Default value is 1.
3695 */
3696 LPFC_ATTR_R(multi_ring_support, 1, 1, 2, "Determines number of primary "
3697 		"SLI rings to spread IOCB entries across");
3698 
3699 /*
3700 # lpfc_multi_ring_rctl:  If lpfc_multi_ring_support is enabled, this
3701 # identifies what rctl value to configure the additional ring for.
3702 # Value range is [1,0xff]. Default value is 4 (Unsolicated Data).
3703 */
3704 LPFC_ATTR_R(multi_ring_rctl, FC_RCTL_DD_UNSOL_DATA, 1,
3705 	     255, "Identifies RCTL for additional ring configuration");
3706 
3707 /*
3708 # lpfc_multi_ring_type:  If lpfc_multi_ring_support is enabled, this
3709 # identifies what type value to configure the additional ring for.
3710 # Value range is [1,0xff]. Default value is 5 (LLC/SNAP).
3711 */
3712 LPFC_ATTR_R(multi_ring_type, FC_TYPE_IP, 1,
3713 	     255, "Identifies TYPE for additional ring configuration");
3714 
3715 /*
3716 # lpfc_fdmi_on: controls FDMI support.
3717 #       0 = no FDMI support
3718 #       1 = support FDMI without attribute of hostname
3719 #       2 = support FDMI with attribute of hostname
3720 # Value range [0,2]. Default value is 0.
3721 */
3722 LPFC_VPORT_ATTR_RW(fdmi_on, 0, 0, 2, "Enable FDMI support");
3723 
3724 /*
3725 # Specifies the maximum number of ELS cmds we can have outstanding (for
3726 # discovery). Value range is [1,64]. Default value = 32.
3727 */
3728 LPFC_VPORT_ATTR(discovery_threads, 32, 1, 64, "Maximum number of ELS commands "
3729 		 "during discovery");
3730 
3731 /*
3732 # lpfc_max_luns: maximum allowed LUN.
3733 # Value range is [0,65535]. Default value is 255.
3734 # NOTE: The SCSI layer might probe all allowed LUN on some old targets.
3735 */
3736 LPFC_VPORT_ATTR_R(max_luns, 255, 0, 65535, "Maximum allowed LUN");
3737 
3738 /*
3739 # lpfc_poll_tmo: .Milliseconds driver will wait between polling FCP ring.
3740 # Value range is [1,255], default value is 10.
3741 */
3742 LPFC_ATTR_RW(poll_tmo, 10, 1, 255,
3743 	     "Milliseconds driver will wait between polling FCP ring");
3744 
3745 /*
3746 # lpfc_use_msi: Use MSI (Message Signaled Interrupts) in systems that
3747 #		support this feature
3748 #       0  = MSI disabled
3749 #       1  = MSI enabled
3750 #       2  = MSI-X enabled (default)
3751 # Value range is [0,2]. Default value is 2.
3752 */
3753 LPFC_ATTR_R(use_msi, 2, 0, 2, "Use Message Signaled Interrupts (1) or "
3754 	    "MSI-X (2), if possible");
3755 
3756 /*
3757 # lpfc_fcp_imax: Set the maximum number of fast-path FCP interrupts per second
3758 #
3759 # Value range is [636,651042]. Default value is 10000.
3760 */
3761 LPFC_ATTR_R(fcp_imax, LPFC_FP_DEF_IMAX, LPFC_MIM_IMAX, LPFC_DMULT_CONST,
3762 	    "Set the maximum number of fast-path FCP interrupts per second");
3763 
3764 /*
3765 # lpfc_fcp_wq_count: Set the number of fast-path FCP work queues
3766 #
3767 # Value range is [1,31]. Default value is 4.
3768 */
3769 LPFC_ATTR_R(fcp_wq_count, LPFC_FP_WQN_DEF, LPFC_FP_WQN_MIN, LPFC_FP_WQN_MAX,
3770 	    "Set the number of fast-path FCP work queues, if possible");
3771 
3772 /*
3773 # lpfc_fcp_eq_count: Set the number of fast-path FCP event queues
3774 #
3775 # Value range is [1,7]. Default value is 1.
3776 */
3777 LPFC_ATTR_R(fcp_eq_count, LPFC_FP_EQN_DEF, LPFC_FP_EQN_MIN, LPFC_FP_EQN_MAX,
3778 	    "Set the number of fast-path FCP event queues, if possible");
3779 
3780 /*
3781 # lpfc_enable_hba_reset: Allow or prevent HBA resets to the hardware.
3782 #       0  = HBA resets disabled
3783 #       1  = HBA resets enabled (default)
3784 # Value range is [0,1]. Default value is 1.
3785 */
3786 LPFC_ATTR_R(enable_hba_reset, 1, 0, 1, "Enable HBA resets from the driver.");
3787 
3788 /*
3789 # lpfc_enable_hba_heartbeat: Disable HBA heartbeat timer..
3790 #       0  = HBA Heartbeat disabled
3791 #       1  = HBA Heartbeat enabled (default)
3792 # Value range is [0,1]. Default value is 1.
3793 */
3794 LPFC_ATTR_R(enable_hba_heartbeat, 0, 0, 1, "Enable HBA Heartbeat.");
3795 
3796 /*
3797 # lpfc_enable_bg: Enable BlockGuard (Emulex's Implementation of T10-DIF)
3798 #       0  = BlockGuard disabled (default)
3799 #       1  = BlockGuard enabled
3800 # Value range is [0,1]. Default value is 0.
3801 */
3802 LPFC_ATTR_R(enable_bg, 0, 0, 1, "Enable BlockGuard Support");
3803 
3804 /*
3805 # lpfc_prot_mask: i
3806 #	- Bit mask of host protection capabilities used to register with the
3807 #	  SCSI mid-layer
3808 # 	- Only meaningful if BG is turned on (lpfc_enable_bg=1).
3809 #	- Allows you to ultimately specify which profiles to use
3810 #	- Default will result in registering capabilities for all profiles.
3811 #
3812 */
3813 unsigned int lpfc_prot_mask = SHOST_DIF_TYPE1_PROTECTION |
3814 			      SHOST_DIX_TYPE0_PROTECTION |
3815 			      SHOST_DIX_TYPE1_PROTECTION;
3816 
3817 module_param(lpfc_prot_mask, uint, S_IRUGO);
3818 MODULE_PARM_DESC(lpfc_prot_mask, "host protection mask");
3819 
3820 /*
3821 # lpfc_prot_guard: i
3822 #	- Bit mask of protection guard types to register with the SCSI mid-layer
3823 # 	- Guard types are currently either 1) IP checksum 2) T10-DIF CRC
3824 #	- Allows you to ultimately specify which profiles to use
3825 #	- Default will result in registering capabilities for all guard types
3826 #
3827 */
3828 unsigned char lpfc_prot_guard = SHOST_DIX_GUARD_IP;
3829 module_param(lpfc_prot_guard, byte, S_IRUGO);
3830 MODULE_PARM_DESC(lpfc_prot_guard, "host protection guard type");
3831 
3832 /*
3833  * Delay initial NPort discovery when Clean Address bit is cleared in
3834  * FLOGI/FDISC accept and FCID/Fabric name/Fabric portname is changed.
3835  * This parameter can have value 0 or 1.
3836  * When this parameter is set to 0, no delay is added to the initial
3837  * discovery.
3838  * When this parameter is set to non-zero value, initial Nport discovery is
3839  * delayed by ra_tov seconds when Clean Address bit is cleared in FLOGI/FDISC
3840  * accept and FCID/Fabric name/Fabric portname is changed.
3841  * Driver always delay Nport discovery for subsequent FLOGI/FDISC completion
3842  * when Clean Address bit is cleared in FLOGI/FDISC
3843  * accept and FCID/Fabric name/Fabric portname is changed.
3844  * Default value is 0.
3845  */
3846 int lpfc_delay_discovery;
3847 module_param(lpfc_delay_discovery, int, S_IRUGO);
3848 MODULE_PARM_DESC(lpfc_delay_discovery,
3849 	"Delay NPort discovery when Clean Address bit is cleared. "
3850 	"Allowed values: 0,1.");
3851 
3852 /*
3853  * lpfc_sg_seg_cnt - Initial Maximum DMA Segment Count
3854  * This value can be set to values between 64 and 256. The default value is
3855  * 64, but may be increased to allow for larger Max I/O sizes. The scsi layer
3856  * will be allowed to request I/Os of sizes up to (MAX_SEG_COUNT * SEG_SIZE).
3857  */
3858 LPFC_ATTR_R(sg_seg_cnt, LPFC_DEFAULT_SG_SEG_CNT, LPFC_DEFAULT_SG_SEG_CNT,
3859 	    LPFC_MAX_SG_SEG_CNT, "Max Scatter Gather Segment Count");
3860 
3861 LPFC_ATTR_R(prot_sg_seg_cnt, LPFC_DEFAULT_PROT_SG_SEG_CNT,
3862 		LPFC_DEFAULT_PROT_SG_SEG_CNT, LPFC_MAX_PROT_SG_SEG_CNT,
3863 		"Max Protection Scatter Gather Segment Count");
3864 
3865 struct device_attribute *lpfc_hba_attrs[] = {
3866 	&dev_attr_bg_info,
3867 	&dev_attr_bg_guard_err,
3868 	&dev_attr_bg_apptag_err,
3869 	&dev_attr_bg_reftag_err,
3870 	&dev_attr_info,
3871 	&dev_attr_serialnum,
3872 	&dev_attr_modeldesc,
3873 	&dev_attr_modelname,
3874 	&dev_attr_programtype,
3875 	&dev_attr_portnum,
3876 	&dev_attr_fwrev,
3877 	&dev_attr_hdw,
3878 	&dev_attr_option_rom_version,
3879 	&dev_attr_link_state,
3880 	&dev_attr_num_discovered_ports,
3881 	&dev_attr_menlo_mgmt_mode,
3882 	&dev_attr_lpfc_drvr_version,
3883 	&dev_attr_lpfc_enable_fip,
3884 	&dev_attr_lpfc_temp_sensor,
3885 	&dev_attr_lpfc_log_verbose,
3886 	&dev_attr_lpfc_lun_queue_depth,
3887 	&dev_attr_lpfc_tgt_queue_depth,
3888 	&dev_attr_lpfc_hba_queue_depth,
3889 	&dev_attr_lpfc_peer_port_login,
3890 	&dev_attr_lpfc_nodev_tmo,
3891 	&dev_attr_lpfc_devloss_tmo,
3892 	&dev_attr_lpfc_fcp_class,
3893 	&dev_attr_lpfc_use_adisc,
3894 	&dev_attr_lpfc_ack0,
3895 	&dev_attr_lpfc_topology,
3896 	&dev_attr_lpfc_scan_down,
3897 	&dev_attr_lpfc_link_speed,
3898 	&dev_attr_lpfc_cr_delay,
3899 	&dev_attr_lpfc_cr_count,
3900 	&dev_attr_lpfc_multi_ring_support,
3901 	&dev_attr_lpfc_multi_ring_rctl,
3902 	&dev_attr_lpfc_multi_ring_type,
3903 	&dev_attr_lpfc_fdmi_on,
3904 	&dev_attr_lpfc_max_luns,
3905 	&dev_attr_lpfc_enable_npiv,
3906 	&dev_attr_lpfc_fcf_failover_policy,
3907 	&dev_attr_lpfc_enable_rrq,
3908 	&dev_attr_nport_evt_cnt,
3909 	&dev_attr_board_mode,
3910 	&dev_attr_max_vpi,
3911 	&dev_attr_used_vpi,
3912 	&dev_attr_max_rpi,
3913 	&dev_attr_used_rpi,
3914 	&dev_attr_max_xri,
3915 	&dev_attr_used_xri,
3916 	&dev_attr_npiv_info,
3917 	&dev_attr_issue_reset,
3918 	&dev_attr_lpfc_poll,
3919 	&dev_attr_lpfc_poll_tmo,
3920 	&dev_attr_lpfc_use_msi,
3921 	&dev_attr_lpfc_fcp_imax,
3922 	&dev_attr_lpfc_fcp_wq_count,
3923 	&dev_attr_lpfc_fcp_eq_count,
3924 	&dev_attr_lpfc_enable_bg,
3925 	&dev_attr_lpfc_soft_wwnn,
3926 	&dev_attr_lpfc_soft_wwpn,
3927 	&dev_attr_lpfc_soft_wwn_enable,
3928 	&dev_attr_lpfc_enable_hba_reset,
3929 	&dev_attr_lpfc_enable_hba_heartbeat,
3930 	&dev_attr_lpfc_sg_seg_cnt,
3931 	&dev_attr_lpfc_max_scsicmpl_time,
3932 	&dev_attr_lpfc_stat_data_ctrl,
3933 	&dev_attr_lpfc_prot_sg_seg_cnt,
3934 	&dev_attr_lpfc_aer_support,
3935 	&dev_attr_lpfc_aer_state_cleanup,
3936 	&dev_attr_lpfc_sriov_nr_virtfn,
3937 	&dev_attr_lpfc_suppress_link_up,
3938 	&dev_attr_lpfc_iocb_cnt,
3939 	&dev_attr_iocb_hw,
3940 	&dev_attr_txq_hw,
3941 	&dev_attr_txcmplq_hw,
3942 	&dev_attr_lpfc_fips_level,
3943 	&dev_attr_lpfc_fips_rev,
3944 	&dev_attr_lpfc_dss,
3945 	&dev_attr_lpfc_sriov_hw_max_virtfn,
3946 	&dev_attr_protocol,
3947 	NULL,
3948 };
3949 
3950 struct device_attribute *lpfc_vport_attrs[] = {
3951 	&dev_attr_info,
3952 	&dev_attr_link_state,
3953 	&dev_attr_num_discovered_ports,
3954 	&dev_attr_lpfc_drvr_version,
3955 	&dev_attr_lpfc_log_verbose,
3956 	&dev_attr_lpfc_lun_queue_depth,
3957 	&dev_attr_lpfc_tgt_queue_depth,
3958 	&dev_attr_lpfc_nodev_tmo,
3959 	&dev_attr_lpfc_devloss_tmo,
3960 	&dev_attr_lpfc_hba_queue_depth,
3961 	&dev_attr_lpfc_peer_port_login,
3962 	&dev_attr_lpfc_restrict_login,
3963 	&dev_attr_lpfc_fcp_class,
3964 	&dev_attr_lpfc_use_adisc,
3965 	&dev_attr_lpfc_fdmi_on,
3966 	&dev_attr_lpfc_max_luns,
3967 	&dev_attr_nport_evt_cnt,
3968 	&dev_attr_npiv_info,
3969 	&dev_attr_lpfc_enable_da_id,
3970 	&dev_attr_lpfc_max_scsicmpl_time,
3971 	&dev_attr_lpfc_stat_data_ctrl,
3972 	&dev_attr_lpfc_static_vport,
3973 	&dev_attr_lpfc_fips_level,
3974 	&dev_attr_lpfc_fips_rev,
3975 	NULL,
3976 };
3977 
3978 /**
3979  * sysfs_ctlreg_write - Write method for writing to ctlreg
3980  * @filp: open sysfs file
3981  * @kobj: kernel kobject that contains the kernel class device.
3982  * @bin_attr: kernel attributes passed to us.
3983  * @buf: contains the data to be written to the adapter IOREG space.
3984  * @off: offset into buffer to beginning of data.
3985  * @count: bytes to transfer.
3986  *
3987  * Description:
3988  * Accessed via /sys/class/scsi_host/hostxxx/ctlreg.
3989  * Uses the adapter io control registers to send buf contents to the adapter.
3990  *
3991  * Returns:
3992  * -ERANGE off and count combo out of range
3993  * -EINVAL off, count or buff address invalid
3994  * -EPERM adapter is offline
3995  * value of count, buf contents written
3996  **/
3997 static ssize_t
3998 sysfs_ctlreg_write(struct file *filp, struct kobject *kobj,
3999 		   struct bin_attribute *bin_attr,
4000 		   char *buf, loff_t off, size_t count)
4001 {
4002 	size_t buf_off;
4003 	struct device *dev = container_of(kobj, struct device, kobj);
4004 	struct Scsi_Host  *shost = class_to_shost(dev);
4005 	struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata;
4006 	struct lpfc_hba   *phba = vport->phba;
4007 
4008 	if (phba->sli_rev >= LPFC_SLI_REV4)
4009 		return -EPERM;
4010 
4011 	if ((off + count) > FF_REG_AREA_SIZE)
4012 		return -ERANGE;
4013 
4014 	if (count <= LPFC_REG_WRITE_KEY_SIZE)
4015 		return 0;
4016 
4017 	if (off % 4 || count % 4 || (unsigned long)buf % 4)
4018 		return -EINVAL;
4019 
4020 	/* This is to protect HBA registers from accidental writes. */
4021 	if (memcmp(buf, LPFC_REG_WRITE_KEY, LPFC_REG_WRITE_KEY_SIZE))
4022 		return -EINVAL;
4023 
4024 	if (!(vport->fc_flag & FC_OFFLINE_MODE))
4025 		return -EPERM;
4026 
4027 	spin_lock_irq(&phba->hbalock);
4028 	for (buf_off = 0; buf_off < count - LPFC_REG_WRITE_KEY_SIZE;
4029 			buf_off += sizeof(uint32_t))
4030 		writel(*((uint32_t *)(buf + buf_off + LPFC_REG_WRITE_KEY_SIZE)),
4031 		       phba->ctrl_regs_memmap_p + off + buf_off);
4032 
4033 	spin_unlock_irq(&phba->hbalock);
4034 
4035 	return count;
4036 }
4037 
4038 /**
4039  * sysfs_ctlreg_read - Read method for reading from ctlreg
4040  * @filp: open sysfs file
4041  * @kobj: kernel kobject that contains the kernel class device.
4042  * @bin_attr: kernel attributes passed to us.
4043  * @buf: if successful contains the data from the adapter IOREG space.
4044  * @off: offset into buffer to beginning of data.
4045  * @count: bytes to transfer.
4046  *
4047  * Description:
4048  * Accessed via /sys/class/scsi_host/hostxxx/ctlreg.
4049  * Uses the adapter io control registers to read data into buf.
4050  *
4051  * Returns:
4052  * -ERANGE off and count combo out of range
4053  * -EINVAL off, count or buff address invalid
4054  * value of count, buf contents read
4055  **/
4056 static ssize_t
4057 sysfs_ctlreg_read(struct file *filp, struct kobject *kobj,
4058 		  struct bin_attribute *bin_attr,
4059 		  char *buf, loff_t off, size_t count)
4060 {
4061 	size_t buf_off;
4062 	uint32_t * tmp_ptr;
4063 	struct device *dev = container_of(kobj, struct device, kobj);
4064 	struct Scsi_Host  *shost = class_to_shost(dev);
4065 	struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata;
4066 	struct lpfc_hba   *phba = vport->phba;
4067 
4068 	if (phba->sli_rev >= LPFC_SLI_REV4)
4069 		return -EPERM;
4070 
4071 	if (off > FF_REG_AREA_SIZE)
4072 		return -ERANGE;
4073 
4074 	if ((off + count) > FF_REG_AREA_SIZE)
4075 		count = FF_REG_AREA_SIZE - off;
4076 
4077 	if (count == 0) return 0;
4078 
4079 	if (off % 4 || count % 4 || (unsigned long)buf % 4)
4080 		return -EINVAL;
4081 
4082 	spin_lock_irq(&phba->hbalock);
4083 
4084 	for (buf_off = 0; buf_off < count; buf_off += sizeof(uint32_t)) {
4085 		tmp_ptr = (uint32_t *)(buf + buf_off);
4086 		*tmp_ptr = readl(phba->ctrl_regs_memmap_p + off + buf_off);
4087 	}
4088 
4089 	spin_unlock_irq(&phba->hbalock);
4090 
4091 	return count;
4092 }
4093 
4094 static struct bin_attribute sysfs_ctlreg_attr = {
4095 	.attr = {
4096 		.name = "ctlreg",
4097 		.mode = S_IRUSR | S_IWUSR,
4098 	},
4099 	.size = 256,
4100 	.read = sysfs_ctlreg_read,
4101 	.write = sysfs_ctlreg_write,
4102 };
4103 
4104 /**
4105  * sysfs_mbox_write - Write method for writing information via mbox
4106  * @filp: open sysfs file
4107  * @kobj: kernel kobject that contains the kernel class device.
4108  * @bin_attr: kernel attributes passed to us.
4109  * @buf: contains the data to be written to sysfs mbox.
4110  * @off: offset into buffer to beginning of data.
4111  * @count: bytes to transfer.
4112  *
4113  * Description:
4114  * Deprecated function. All mailbox access from user space is performed via the
4115  * bsg interface.
4116  *
4117  * Returns:
4118  * -EPERM operation not permitted
4119  **/
4120 static ssize_t
4121 sysfs_mbox_write(struct file *filp, struct kobject *kobj,
4122 		 struct bin_attribute *bin_attr,
4123 		 char *buf, loff_t off, size_t count)
4124 {
4125 	return -EPERM;
4126 }
4127 
4128 /**
4129  * sysfs_mbox_read - Read method for reading information via mbox
4130  * @filp: open sysfs file
4131  * @kobj: kernel kobject that contains the kernel class device.
4132  * @bin_attr: kernel attributes passed to us.
4133  * @buf: contains the data to be read from sysfs mbox.
4134  * @off: offset into buffer to beginning of data.
4135  * @count: bytes to transfer.
4136  *
4137  * Description:
4138  * Deprecated function. All mailbox access from user space is performed via the
4139  * bsg interface.
4140  *
4141  * Returns:
4142  * -EPERM operation not permitted
4143  **/
4144 static ssize_t
4145 sysfs_mbox_read(struct file *filp, struct kobject *kobj,
4146 		struct bin_attribute *bin_attr,
4147 		char *buf, loff_t off, size_t count)
4148 {
4149 	return -EPERM;
4150 }
4151 
4152 static struct bin_attribute sysfs_mbox_attr = {
4153 	.attr = {
4154 		.name = "mbox",
4155 		.mode = S_IRUSR | S_IWUSR,
4156 	},
4157 	.size = MAILBOX_SYSFS_MAX,
4158 	.read = sysfs_mbox_read,
4159 	.write = sysfs_mbox_write,
4160 };
4161 
4162 /**
4163  * lpfc_alloc_sysfs_attr - Creates the ctlreg and mbox entries
4164  * @vport: address of lpfc vport structure.
4165  *
4166  * Return codes:
4167  * zero on success
4168  * error return code from sysfs_create_bin_file()
4169  **/
4170 int
4171 lpfc_alloc_sysfs_attr(struct lpfc_vport *vport)
4172 {
4173 	struct Scsi_Host *shost = lpfc_shost_from_vport(vport);
4174 	int error;
4175 
4176 	error = sysfs_create_bin_file(&shost->shost_dev.kobj,
4177 				      &sysfs_drvr_stat_data_attr);
4178 
4179 	/* Virtual ports do not need ctrl_reg and mbox */
4180 	if (error || vport->port_type == LPFC_NPIV_PORT)
4181 		goto out;
4182 
4183 	error = sysfs_create_bin_file(&shost->shost_dev.kobj,
4184 				      &sysfs_ctlreg_attr);
4185 	if (error)
4186 		goto out_remove_stat_attr;
4187 
4188 	error = sysfs_create_bin_file(&shost->shost_dev.kobj,
4189 				      &sysfs_mbox_attr);
4190 	if (error)
4191 		goto out_remove_ctlreg_attr;
4192 
4193 	return 0;
4194 out_remove_ctlreg_attr:
4195 	sysfs_remove_bin_file(&shost->shost_dev.kobj, &sysfs_ctlreg_attr);
4196 out_remove_stat_attr:
4197 	sysfs_remove_bin_file(&shost->shost_dev.kobj,
4198 			&sysfs_drvr_stat_data_attr);
4199 out:
4200 	return error;
4201 }
4202 
4203 /**
4204  * lpfc_free_sysfs_attr - Removes the ctlreg and mbox entries
4205  * @vport: address of lpfc vport structure.
4206  **/
4207 void
4208 lpfc_free_sysfs_attr(struct lpfc_vport *vport)
4209 {
4210 	struct Scsi_Host *shost = lpfc_shost_from_vport(vport);
4211 	sysfs_remove_bin_file(&shost->shost_dev.kobj,
4212 		&sysfs_drvr_stat_data_attr);
4213 	/* Virtual ports do not need ctrl_reg and mbox */
4214 	if (vport->port_type == LPFC_NPIV_PORT)
4215 		return;
4216 	sysfs_remove_bin_file(&shost->shost_dev.kobj, &sysfs_mbox_attr);
4217 	sysfs_remove_bin_file(&shost->shost_dev.kobj, &sysfs_ctlreg_attr);
4218 }
4219 
4220 
4221 /*
4222  * Dynamic FC Host Attributes Support
4223  */
4224 
4225 /**
4226  * lpfc_get_host_port_id - Copy the vport DID into the scsi host port id
4227  * @shost: kernel scsi host pointer.
4228  **/
4229 static void
4230 lpfc_get_host_port_id(struct Scsi_Host *shost)
4231 {
4232 	struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata;
4233 
4234 	/* note: fc_myDID already in cpu endianness */
4235 	fc_host_port_id(shost) = vport->fc_myDID;
4236 }
4237 
4238 /**
4239  * lpfc_get_host_port_type - Set the value of the scsi host port type
4240  * @shost: kernel scsi host pointer.
4241  **/
4242 static void
4243 lpfc_get_host_port_type(struct Scsi_Host *shost)
4244 {
4245 	struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata;
4246 	struct lpfc_hba   *phba = vport->phba;
4247 
4248 	spin_lock_irq(shost->host_lock);
4249 
4250 	if (vport->port_type == LPFC_NPIV_PORT) {
4251 		fc_host_port_type(shost) = FC_PORTTYPE_NPIV;
4252 	} else if (lpfc_is_link_up(phba)) {
4253 		if (phba->fc_topology == LPFC_TOPOLOGY_LOOP) {
4254 			if (vport->fc_flag & FC_PUBLIC_LOOP)
4255 				fc_host_port_type(shost) = FC_PORTTYPE_NLPORT;
4256 			else
4257 				fc_host_port_type(shost) = FC_PORTTYPE_LPORT;
4258 		} else {
4259 			if (vport->fc_flag & FC_FABRIC)
4260 				fc_host_port_type(shost) = FC_PORTTYPE_NPORT;
4261 			else
4262 				fc_host_port_type(shost) = FC_PORTTYPE_PTP;
4263 		}
4264 	} else
4265 		fc_host_port_type(shost) = FC_PORTTYPE_UNKNOWN;
4266 
4267 	spin_unlock_irq(shost->host_lock);
4268 }
4269 
4270 /**
4271  * lpfc_get_host_port_state - Set the value of the scsi host port state
4272  * @shost: kernel scsi host pointer.
4273  **/
4274 static void
4275 lpfc_get_host_port_state(struct Scsi_Host *shost)
4276 {
4277 	struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata;
4278 	struct lpfc_hba   *phba = vport->phba;
4279 
4280 	spin_lock_irq(shost->host_lock);
4281 
4282 	if (vport->fc_flag & FC_OFFLINE_MODE)
4283 		fc_host_port_state(shost) = FC_PORTSTATE_OFFLINE;
4284 	else {
4285 		switch (phba->link_state) {
4286 		case LPFC_LINK_UNKNOWN:
4287 		case LPFC_LINK_DOWN:
4288 			fc_host_port_state(shost) = FC_PORTSTATE_LINKDOWN;
4289 			break;
4290 		case LPFC_LINK_UP:
4291 		case LPFC_CLEAR_LA:
4292 		case LPFC_HBA_READY:
4293 			/* Links up, reports port state accordingly */
4294 			if (vport->port_state < LPFC_VPORT_READY)
4295 				fc_host_port_state(shost) =
4296 							FC_PORTSTATE_BYPASSED;
4297 			else
4298 				fc_host_port_state(shost) =
4299 							FC_PORTSTATE_ONLINE;
4300 			break;
4301 		case LPFC_HBA_ERROR:
4302 			fc_host_port_state(shost) = FC_PORTSTATE_ERROR;
4303 			break;
4304 		default:
4305 			fc_host_port_state(shost) = FC_PORTSTATE_UNKNOWN;
4306 			break;
4307 		}
4308 	}
4309 
4310 	spin_unlock_irq(shost->host_lock);
4311 }
4312 
4313 /**
4314  * lpfc_get_host_speed - Set the value of the scsi host speed
4315  * @shost: kernel scsi host pointer.
4316  **/
4317 static void
4318 lpfc_get_host_speed(struct Scsi_Host *shost)
4319 {
4320 	struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata;
4321 	struct lpfc_hba   *phba = vport->phba;
4322 
4323 	spin_lock_irq(shost->host_lock);
4324 
4325 	if (lpfc_is_link_up(phba)) {
4326 		switch(phba->fc_linkspeed) {
4327 		case LPFC_LINK_SPEED_1GHZ:
4328 			fc_host_speed(shost) = FC_PORTSPEED_1GBIT;
4329 			break;
4330 		case LPFC_LINK_SPEED_2GHZ:
4331 			fc_host_speed(shost) = FC_PORTSPEED_2GBIT;
4332 			break;
4333 		case LPFC_LINK_SPEED_4GHZ:
4334 			fc_host_speed(shost) = FC_PORTSPEED_4GBIT;
4335 			break;
4336 		case LPFC_LINK_SPEED_8GHZ:
4337 			fc_host_speed(shost) = FC_PORTSPEED_8GBIT;
4338 			break;
4339 		case LPFC_LINK_SPEED_10GHZ:
4340 			fc_host_speed(shost) = FC_PORTSPEED_10GBIT;
4341 			break;
4342 		case LPFC_LINK_SPEED_16GHZ:
4343 			fc_host_speed(shost) = FC_PORTSPEED_16GBIT;
4344 			break;
4345 		default:
4346 			fc_host_speed(shost) = FC_PORTSPEED_UNKNOWN;
4347 			break;
4348 		}
4349 	} else
4350 		fc_host_speed(shost) = FC_PORTSPEED_UNKNOWN;
4351 
4352 	spin_unlock_irq(shost->host_lock);
4353 }
4354 
4355 /**
4356  * lpfc_get_host_fabric_name - Set the value of the scsi host fabric name
4357  * @shost: kernel scsi host pointer.
4358  **/
4359 static void
4360 lpfc_get_host_fabric_name (struct Scsi_Host *shost)
4361 {
4362 	struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata;
4363 	struct lpfc_hba   *phba = vport->phba;
4364 	u64 node_name;
4365 
4366 	spin_lock_irq(shost->host_lock);
4367 
4368 	if ((vport->port_state > LPFC_FLOGI) &&
4369 	    ((vport->fc_flag & FC_FABRIC) ||
4370 	     ((phba->fc_topology == LPFC_TOPOLOGY_LOOP) &&
4371 	      (vport->fc_flag & FC_PUBLIC_LOOP))))
4372 		node_name = wwn_to_u64(phba->fc_fabparam.nodeName.u.wwn);
4373 	else
4374 		/* fabric is local port if there is no F/FL_Port */
4375 		node_name = 0;
4376 
4377 	spin_unlock_irq(shost->host_lock);
4378 
4379 	fc_host_fabric_name(shost) = node_name;
4380 }
4381 
4382 /**
4383  * lpfc_get_stats - Return statistical information about the adapter
4384  * @shost: kernel scsi host pointer.
4385  *
4386  * Notes:
4387  * NULL on error for link down, no mbox pool, sli2 active,
4388  * management not allowed, memory allocation error, or mbox error.
4389  *
4390  * Returns:
4391  * NULL for error
4392  * address of the adapter host statistics
4393  **/
4394 static struct fc_host_statistics *
4395 lpfc_get_stats(struct Scsi_Host *shost)
4396 {
4397 	struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata;
4398 	struct lpfc_hba   *phba = vport->phba;
4399 	struct lpfc_sli   *psli = &phba->sli;
4400 	struct fc_host_statistics *hs = &phba->link_stats;
4401 	struct lpfc_lnk_stat * lso = &psli->lnk_stat_offsets;
4402 	LPFC_MBOXQ_t *pmboxq;
4403 	MAILBOX_t *pmb;
4404 	unsigned long seconds;
4405 	int rc = 0;
4406 
4407 	/*
4408 	 * prevent udev from issuing mailbox commands until the port is
4409 	 * configured.
4410 	 */
4411 	if (phba->link_state < LPFC_LINK_DOWN ||
4412 	    !phba->mbox_mem_pool ||
4413 	    (phba->sli.sli_flag & LPFC_SLI_ACTIVE) == 0)
4414 		return NULL;
4415 
4416 	if (phba->sli.sli_flag & LPFC_BLOCK_MGMT_IO)
4417 		return NULL;
4418 
4419 	pmboxq = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL);
4420 	if (!pmboxq)
4421 		return NULL;
4422 	memset(pmboxq, 0, sizeof (LPFC_MBOXQ_t));
4423 
4424 	pmb = &pmboxq->u.mb;
4425 	pmb->mbxCommand = MBX_READ_STATUS;
4426 	pmb->mbxOwner = OWN_HOST;
4427 	pmboxq->context1 = NULL;
4428 	pmboxq->vport = vport;
4429 
4430 	if (vport->fc_flag & FC_OFFLINE_MODE)
4431 		rc = lpfc_sli_issue_mbox(phba, pmboxq, MBX_POLL);
4432 	else
4433 		rc = lpfc_sli_issue_mbox_wait(phba, pmboxq, phba->fc_ratov * 2);
4434 
4435 	if (rc != MBX_SUCCESS) {
4436 		if (rc != MBX_TIMEOUT)
4437 			mempool_free(pmboxq, phba->mbox_mem_pool);
4438 		return NULL;
4439 	}
4440 
4441 	memset(hs, 0, sizeof (struct fc_host_statistics));
4442 
4443 	hs->tx_frames = pmb->un.varRdStatus.xmitFrameCnt;
4444 	/*
4445 	 * The MBX_READ_STATUS returns tx_k_bytes which has to
4446 	 * converted to words
4447 	 */
4448 	hs->tx_words = (uint64_t)
4449 			((uint64_t)pmb->un.varRdStatus.xmitByteCnt
4450 			* (uint64_t)256);
4451 	hs->rx_frames = pmb->un.varRdStatus.rcvFrameCnt;
4452 	hs->rx_words = (uint64_t)
4453 			((uint64_t)pmb->un.varRdStatus.rcvByteCnt
4454 			 * (uint64_t)256);
4455 
4456 	memset(pmboxq, 0, sizeof (LPFC_MBOXQ_t));
4457 	pmb->mbxCommand = MBX_READ_LNK_STAT;
4458 	pmb->mbxOwner = OWN_HOST;
4459 	pmboxq->context1 = NULL;
4460 	pmboxq->vport = vport;
4461 
4462 	if (vport->fc_flag & FC_OFFLINE_MODE)
4463 		rc = lpfc_sli_issue_mbox(phba, pmboxq, MBX_POLL);
4464 	else
4465 		rc = lpfc_sli_issue_mbox_wait(phba, pmboxq, phba->fc_ratov * 2);
4466 
4467 	if (rc != MBX_SUCCESS) {
4468 		if (rc != MBX_TIMEOUT)
4469 			mempool_free(pmboxq, phba->mbox_mem_pool);
4470 		return NULL;
4471 	}
4472 
4473 	hs->link_failure_count = pmb->un.varRdLnk.linkFailureCnt;
4474 	hs->loss_of_sync_count = pmb->un.varRdLnk.lossSyncCnt;
4475 	hs->loss_of_signal_count = pmb->un.varRdLnk.lossSignalCnt;
4476 	hs->prim_seq_protocol_err_count = pmb->un.varRdLnk.primSeqErrCnt;
4477 	hs->invalid_tx_word_count = pmb->un.varRdLnk.invalidXmitWord;
4478 	hs->invalid_crc_count = pmb->un.varRdLnk.crcCnt;
4479 	hs->error_frames = pmb->un.varRdLnk.crcCnt;
4480 
4481 	hs->link_failure_count -= lso->link_failure_count;
4482 	hs->loss_of_sync_count -= lso->loss_of_sync_count;
4483 	hs->loss_of_signal_count -= lso->loss_of_signal_count;
4484 	hs->prim_seq_protocol_err_count -= lso->prim_seq_protocol_err_count;
4485 	hs->invalid_tx_word_count -= lso->invalid_tx_word_count;
4486 	hs->invalid_crc_count -= lso->invalid_crc_count;
4487 	hs->error_frames -= lso->error_frames;
4488 
4489 	if (phba->hba_flag & HBA_FCOE_MODE) {
4490 		hs->lip_count = -1;
4491 		hs->nos_count = (phba->link_events >> 1);
4492 		hs->nos_count -= lso->link_events;
4493 	} else if (phba->fc_topology == LPFC_TOPOLOGY_LOOP) {
4494 		hs->lip_count = (phba->fc_eventTag >> 1);
4495 		hs->lip_count -= lso->link_events;
4496 		hs->nos_count = -1;
4497 	} else {
4498 		hs->lip_count = -1;
4499 		hs->nos_count = (phba->fc_eventTag >> 1);
4500 		hs->nos_count -= lso->link_events;
4501 	}
4502 
4503 	hs->dumped_frames = -1;
4504 
4505 	seconds = get_seconds();
4506 	if (seconds < psli->stats_start)
4507 		hs->seconds_since_last_reset = seconds +
4508 				((unsigned long)-1 - psli->stats_start);
4509 	else
4510 		hs->seconds_since_last_reset = seconds - psli->stats_start;
4511 
4512 	mempool_free(pmboxq, phba->mbox_mem_pool);
4513 
4514 	return hs;
4515 }
4516 
4517 /**
4518  * lpfc_reset_stats - Copy the adapter link stats information
4519  * @shost: kernel scsi host pointer.
4520  **/
4521 static void
4522 lpfc_reset_stats(struct Scsi_Host *shost)
4523 {
4524 	struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata;
4525 	struct lpfc_hba   *phba = vport->phba;
4526 	struct lpfc_sli   *psli = &phba->sli;
4527 	struct lpfc_lnk_stat *lso = &psli->lnk_stat_offsets;
4528 	LPFC_MBOXQ_t *pmboxq;
4529 	MAILBOX_t *pmb;
4530 	int rc = 0;
4531 
4532 	if (phba->sli.sli_flag & LPFC_BLOCK_MGMT_IO)
4533 		return;
4534 
4535 	pmboxq = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL);
4536 	if (!pmboxq)
4537 		return;
4538 	memset(pmboxq, 0, sizeof(LPFC_MBOXQ_t));
4539 
4540 	pmb = &pmboxq->u.mb;
4541 	pmb->mbxCommand = MBX_READ_STATUS;
4542 	pmb->mbxOwner = OWN_HOST;
4543 	pmb->un.varWords[0] = 0x1; /* reset request */
4544 	pmboxq->context1 = NULL;
4545 	pmboxq->vport = vport;
4546 
4547 	if ((vport->fc_flag & FC_OFFLINE_MODE) ||
4548 		(!(psli->sli_flag & LPFC_SLI_ACTIVE)))
4549 		rc = lpfc_sli_issue_mbox(phba, pmboxq, MBX_POLL);
4550 	else
4551 		rc = lpfc_sli_issue_mbox_wait(phba, pmboxq, phba->fc_ratov * 2);
4552 
4553 	if (rc != MBX_SUCCESS) {
4554 		if (rc != MBX_TIMEOUT)
4555 			mempool_free(pmboxq, phba->mbox_mem_pool);
4556 		return;
4557 	}
4558 
4559 	memset(pmboxq, 0, sizeof(LPFC_MBOXQ_t));
4560 	pmb->mbxCommand = MBX_READ_LNK_STAT;
4561 	pmb->mbxOwner = OWN_HOST;
4562 	pmboxq->context1 = NULL;
4563 	pmboxq->vport = vport;
4564 
4565 	if ((vport->fc_flag & FC_OFFLINE_MODE) ||
4566 	    (!(psli->sli_flag & LPFC_SLI_ACTIVE)))
4567 		rc = lpfc_sli_issue_mbox(phba, pmboxq, MBX_POLL);
4568 	else
4569 		rc = lpfc_sli_issue_mbox_wait(phba, pmboxq, phba->fc_ratov * 2);
4570 
4571 	if (rc != MBX_SUCCESS) {
4572 		if (rc != MBX_TIMEOUT)
4573 			mempool_free( pmboxq, phba->mbox_mem_pool);
4574 		return;
4575 	}
4576 
4577 	lso->link_failure_count = pmb->un.varRdLnk.linkFailureCnt;
4578 	lso->loss_of_sync_count = pmb->un.varRdLnk.lossSyncCnt;
4579 	lso->loss_of_signal_count = pmb->un.varRdLnk.lossSignalCnt;
4580 	lso->prim_seq_protocol_err_count = pmb->un.varRdLnk.primSeqErrCnt;
4581 	lso->invalid_tx_word_count = pmb->un.varRdLnk.invalidXmitWord;
4582 	lso->invalid_crc_count = pmb->un.varRdLnk.crcCnt;
4583 	lso->error_frames = pmb->un.varRdLnk.crcCnt;
4584 	if (phba->hba_flag & HBA_FCOE_MODE)
4585 		lso->link_events = (phba->link_events >> 1);
4586 	else
4587 		lso->link_events = (phba->fc_eventTag >> 1);
4588 
4589 	psli->stats_start = get_seconds();
4590 
4591 	mempool_free(pmboxq, phba->mbox_mem_pool);
4592 
4593 	return;
4594 }
4595 
4596 /*
4597  * The LPFC driver treats linkdown handling as target loss events so there
4598  * are no sysfs handlers for link_down_tmo.
4599  */
4600 
4601 /**
4602  * lpfc_get_node_by_target - Return the nodelist for a target
4603  * @starget: kernel scsi target pointer.
4604  *
4605  * Returns:
4606  * address of the node list if found
4607  * NULL target not found
4608  **/
4609 static struct lpfc_nodelist *
4610 lpfc_get_node_by_target(struct scsi_target *starget)
4611 {
4612 	struct Scsi_Host  *shost = dev_to_shost(starget->dev.parent);
4613 	struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata;
4614 	struct lpfc_nodelist *ndlp;
4615 
4616 	spin_lock_irq(shost->host_lock);
4617 	/* Search for this, mapped, target ID */
4618 	list_for_each_entry(ndlp, &vport->fc_nodes, nlp_listp) {
4619 		if (NLP_CHK_NODE_ACT(ndlp) &&
4620 		    ndlp->nlp_state == NLP_STE_MAPPED_NODE &&
4621 		    starget->id == ndlp->nlp_sid) {
4622 			spin_unlock_irq(shost->host_lock);
4623 			return ndlp;
4624 		}
4625 	}
4626 	spin_unlock_irq(shost->host_lock);
4627 	return NULL;
4628 }
4629 
4630 /**
4631  * lpfc_get_starget_port_id - Set the target port id to the ndlp DID or -1
4632  * @starget: kernel scsi target pointer.
4633  **/
4634 static void
4635 lpfc_get_starget_port_id(struct scsi_target *starget)
4636 {
4637 	struct lpfc_nodelist *ndlp = lpfc_get_node_by_target(starget);
4638 
4639 	fc_starget_port_id(starget) = ndlp ? ndlp->nlp_DID : -1;
4640 }
4641 
4642 /**
4643  * lpfc_get_starget_node_name - Set the target node name
4644  * @starget: kernel scsi target pointer.
4645  *
4646  * Description: Set the target node name to the ndlp node name wwn or zero.
4647  **/
4648 static void
4649 lpfc_get_starget_node_name(struct scsi_target *starget)
4650 {
4651 	struct lpfc_nodelist *ndlp = lpfc_get_node_by_target(starget);
4652 
4653 	fc_starget_node_name(starget) =
4654 		ndlp ? wwn_to_u64(ndlp->nlp_nodename.u.wwn) : 0;
4655 }
4656 
4657 /**
4658  * lpfc_get_starget_port_name - Set the target port name
4659  * @starget: kernel scsi target pointer.
4660  *
4661  * Description:  set the target port name to the ndlp port name wwn or zero.
4662  **/
4663 static void
4664 lpfc_get_starget_port_name(struct scsi_target *starget)
4665 {
4666 	struct lpfc_nodelist *ndlp = lpfc_get_node_by_target(starget);
4667 
4668 	fc_starget_port_name(starget) =
4669 		ndlp ? wwn_to_u64(ndlp->nlp_portname.u.wwn) : 0;
4670 }
4671 
4672 /**
4673  * lpfc_set_rport_loss_tmo - Set the rport dev loss tmo
4674  * @rport: fc rport address.
4675  * @timeout: new value for dev loss tmo.
4676  *
4677  * Description:
4678  * If timeout is non zero set the dev_loss_tmo to timeout, else set
4679  * dev_loss_tmo to one.
4680  **/
4681 static void
4682 lpfc_set_rport_loss_tmo(struct fc_rport *rport, uint32_t timeout)
4683 {
4684 	if (timeout)
4685 		rport->dev_loss_tmo = timeout;
4686 	else
4687 		rport->dev_loss_tmo = 1;
4688 }
4689 
4690 /**
4691  * lpfc_rport_show_function - Return rport target information
4692  *
4693  * Description:
4694  * Macro that uses field to generate a function with the name lpfc_show_rport_
4695  *
4696  * lpfc_show_rport_##field: returns the bytes formatted in buf
4697  * @cdev: class converted to an fc_rport.
4698  * @buf: on return contains the target_field or zero.
4699  *
4700  * Returns: size of formatted string.
4701  **/
4702 #define lpfc_rport_show_function(field, format_string, sz, cast)	\
4703 static ssize_t								\
4704 lpfc_show_rport_##field (struct device *dev,				\
4705 			 struct device_attribute *attr,			\
4706 			 char *buf)					\
4707 {									\
4708 	struct fc_rport *rport = transport_class_to_rport(dev);		\
4709 	struct lpfc_rport_data *rdata = rport->hostdata;		\
4710 	return snprintf(buf, sz, format_string,				\
4711 		(rdata->target) ? cast rdata->target->field : 0);	\
4712 }
4713 
4714 #define lpfc_rport_rd_attr(field, format_string, sz)			\
4715 	lpfc_rport_show_function(field, format_string, sz, )		\
4716 static FC_RPORT_ATTR(field, S_IRUGO, lpfc_show_rport_##field, NULL)
4717 
4718 /**
4719  * lpfc_set_vport_symbolic_name - Set the vport's symbolic name
4720  * @fc_vport: The fc_vport who's symbolic name has been changed.
4721  *
4722  * Description:
4723  * This function is called by the transport after the @fc_vport's symbolic name
4724  * has been changed. This function re-registers the symbolic name with the
4725  * switch to propagate the change into the fabric if the vport is active.
4726  **/
4727 static void
4728 lpfc_set_vport_symbolic_name(struct fc_vport *fc_vport)
4729 {
4730 	struct lpfc_vport *vport = *(struct lpfc_vport **)fc_vport->dd_data;
4731 
4732 	if (vport->port_state == LPFC_VPORT_READY)
4733 		lpfc_ns_cmd(vport, SLI_CTNS_RSPN_ID, 0, 0);
4734 }
4735 
4736 /**
4737  * lpfc_hba_log_verbose_init - Set hba's log verbose level
4738  * @phba: Pointer to lpfc_hba struct.
4739  *
4740  * This function is called by the lpfc_get_cfgparam() routine to set the
4741  * module lpfc_log_verbose into the @phba cfg_log_verbose for use with
4742  * log message according to the module's lpfc_log_verbose parameter setting
4743  * before hba port or vport created.
4744  **/
4745 static void
4746 lpfc_hba_log_verbose_init(struct lpfc_hba *phba, uint32_t verbose)
4747 {
4748 	phba->cfg_log_verbose = verbose;
4749 }
4750 
4751 struct fc_function_template lpfc_transport_functions = {
4752 	/* fixed attributes the driver supports */
4753 	.show_host_node_name = 1,
4754 	.show_host_port_name = 1,
4755 	.show_host_supported_classes = 1,
4756 	.show_host_supported_fc4s = 1,
4757 	.show_host_supported_speeds = 1,
4758 	.show_host_maxframe_size = 1,
4759 	.show_host_symbolic_name = 1,
4760 
4761 	/* dynamic attributes the driver supports */
4762 	.get_host_port_id = lpfc_get_host_port_id,
4763 	.show_host_port_id = 1,
4764 
4765 	.get_host_port_type = lpfc_get_host_port_type,
4766 	.show_host_port_type = 1,
4767 
4768 	.get_host_port_state = lpfc_get_host_port_state,
4769 	.show_host_port_state = 1,
4770 
4771 	/* active_fc4s is shown but doesn't change (thus no get function) */
4772 	.show_host_active_fc4s = 1,
4773 
4774 	.get_host_speed = lpfc_get_host_speed,
4775 	.show_host_speed = 1,
4776 
4777 	.get_host_fabric_name = lpfc_get_host_fabric_name,
4778 	.show_host_fabric_name = 1,
4779 
4780 	/*
4781 	 * The LPFC driver treats linkdown handling as target loss events
4782 	 * so there are no sysfs handlers for link_down_tmo.
4783 	 */
4784 
4785 	.get_fc_host_stats = lpfc_get_stats,
4786 	.reset_fc_host_stats = lpfc_reset_stats,
4787 
4788 	.dd_fcrport_size = sizeof(struct lpfc_rport_data),
4789 	.show_rport_maxframe_size = 1,
4790 	.show_rport_supported_classes = 1,
4791 
4792 	.set_rport_dev_loss_tmo = lpfc_set_rport_loss_tmo,
4793 	.show_rport_dev_loss_tmo = 1,
4794 
4795 	.get_starget_port_id  = lpfc_get_starget_port_id,
4796 	.show_starget_port_id = 1,
4797 
4798 	.get_starget_node_name = lpfc_get_starget_node_name,
4799 	.show_starget_node_name = 1,
4800 
4801 	.get_starget_port_name = lpfc_get_starget_port_name,
4802 	.show_starget_port_name = 1,
4803 
4804 	.issue_fc_host_lip = lpfc_issue_lip,
4805 	.dev_loss_tmo_callbk = lpfc_dev_loss_tmo_callbk,
4806 	.terminate_rport_io = lpfc_terminate_rport_io,
4807 
4808 	.dd_fcvport_size = sizeof(struct lpfc_vport *),
4809 
4810 	.vport_disable = lpfc_vport_disable,
4811 
4812 	.set_vport_symbolic_name = lpfc_set_vport_symbolic_name,
4813 
4814 	.bsg_request = lpfc_bsg_request,
4815 	.bsg_timeout = lpfc_bsg_timeout,
4816 };
4817 
4818 struct fc_function_template lpfc_vport_transport_functions = {
4819 	/* fixed attributes the driver supports */
4820 	.show_host_node_name = 1,
4821 	.show_host_port_name = 1,
4822 	.show_host_supported_classes = 1,
4823 	.show_host_supported_fc4s = 1,
4824 	.show_host_supported_speeds = 1,
4825 	.show_host_maxframe_size = 1,
4826 	.show_host_symbolic_name = 1,
4827 
4828 	/* dynamic attributes the driver supports */
4829 	.get_host_port_id = lpfc_get_host_port_id,
4830 	.show_host_port_id = 1,
4831 
4832 	.get_host_port_type = lpfc_get_host_port_type,
4833 	.show_host_port_type = 1,
4834 
4835 	.get_host_port_state = lpfc_get_host_port_state,
4836 	.show_host_port_state = 1,
4837 
4838 	/* active_fc4s is shown but doesn't change (thus no get function) */
4839 	.show_host_active_fc4s = 1,
4840 
4841 	.get_host_speed = lpfc_get_host_speed,
4842 	.show_host_speed = 1,
4843 
4844 	.get_host_fabric_name = lpfc_get_host_fabric_name,
4845 	.show_host_fabric_name = 1,
4846 
4847 	/*
4848 	 * The LPFC driver treats linkdown handling as target loss events
4849 	 * so there are no sysfs handlers for link_down_tmo.
4850 	 */
4851 
4852 	.get_fc_host_stats = lpfc_get_stats,
4853 	.reset_fc_host_stats = lpfc_reset_stats,
4854 
4855 	.dd_fcrport_size = sizeof(struct lpfc_rport_data),
4856 	.show_rport_maxframe_size = 1,
4857 	.show_rport_supported_classes = 1,
4858 
4859 	.set_rport_dev_loss_tmo = lpfc_set_rport_loss_tmo,
4860 	.show_rport_dev_loss_tmo = 1,
4861 
4862 	.get_starget_port_id  = lpfc_get_starget_port_id,
4863 	.show_starget_port_id = 1,
4864 
4865 	.get_starget_node_name = lpfc_get_starget_node_name,
4866 	.show_starget_node_name = 1,
4867 
4868 	.get_starget_port_name = lpfc_get_starget_port_name,
4869 	.show_starget_port_name = 1,
4870 
4871 	.dev_loss_tmo_callbk = lpfc_dev_loss_tmo_callbk,
4872 	.terminate_rport_io = lpfc_terminate_rport_io,
4873 
4874 	.vport_disable = lpfc_vport_disable,
4875 
4876 	.set_vport_symbolic_name = lpfc_set_vport_symbolic_name,
4877 };
4878 
4879 /**
4880  * lpfc_get_cfgparam - Used during probe_one to init the adapter structure
4881  * @phba: lpfc_hba pointer.
4882  **/
4883 void
4884 lpfc_get_cfgparam(struct lpfc_hba *phba)
4885 {
4886 	lpfc_cr_delay_init(phba, lpfc_cr_delay);
4887 	lpfc_cr_count_init(phba, lpfc_cr_count);
4888 	lpfc_multi_ring_support_init(phba, lpfc_multi_ring_support);
4889 	lpfc_multi_ring_rctl_init(phba, lpfc_multi_ring_rctl);
4890 	lpfc_multi_ring_type_init(phba, lpfc_multi_ring_type);
4891 	lpfc_ack0_init(phba, lpfc_ack0);
4892 	lpfc_topology_init(phba, lpfc_topology);
4893 	lpfc_link_speed_init(phba, lpfc_link_speed);
4894 	lpfc_poll_tmo_init(phba, lpfc_poll_tmo);
4895 	lpfc_enable_npiv_init(phba, lpfc_enable_npiv);
4896 	lpfc_fcf_failover_policy_init(phba, lpfc_fcf_failover_policy);
4897 	lpfc_enable_rrq_init(phba, lpfc_enable_rrq);
4898 	lpfc_use_msi_init(phba, lpfc_use_msi);
4899 	lpfc_fcp_imax_init(phba, lpfc_fcp_imax);
4900 	lpfc_fcp_wq_count_init(phba, lpfc_fcp_wq_count);
4901 	lpfc_fcp_eq_count_init(phba, lpfc_fcp_eq_count);
4902 	lpfc_enable_hba_reset_init(phba, lpfc_enable_hba_reset);
4903 	lpfc_enable_hba_heartbeat_init(phba, lpfc_enable_hba_heartbeat);
4904 	lpfc_enable_bg_init(phba, lpfc_enable_bg);
4905 	if (phba->sli_rev == LPFC_SLI_REV4)
4906 		phba->cfg_poll = 0;
4907 	else
4908 	phba->cfg_poll = lpfc_poll;
4909 	phba->cfg_soft_wwnn = 0L;
4910 	phba->cfg_soft_wwpn = 0L;
4911 	lpfc_sg_seg_cnt_init(phba, lpfc_sg_seg_cnt);
4912 	lpfc_prot_sg_seg_cnt_init(phba, lpfc_prot_sg_seg_cnt);
4913 	lpfc_hba_queue_depth_init(phba, lpfc_hba_queue_depth);
4914 	lpfc_hba_log_verbose_init(phba, lpfc_log_verbose);
4915 	lpfc_aer_support_init(phba, lpfc_aer_support);
4916 	lpfc_sriov_nr_virtfn_init(phba, lpfc_sriov_nr_virtfn);
4917 	lpfc_suppress_link_up_init(phba, lpfc_suppress_link_up);
4918 	lpfc_iocb_cnt_init(phba, lpfc_iocb_cnt);
4919 	phba->cfg_enable_dss = 1;
4920 	return;
4921 }
4922 
4923 /**
4924  * lpfc_get_vport_cfgparam - Used during port create, init the vport structure
4925  * @vport: lpfc_vport pointer.
4926  **/
4927 void
4928 lpfc_get_vport_cfgparam(struct lpfc_vport *vport)
4929 {
4930 	lpfc_log_verbose_init(vport, lpfc_log_verbose);
4931 	lpfc_lun_queue_depth_init(vport, lpfc_lun_queue_depth);
4932 	lpfc_tgt_queue_depth_init(vport, lpfc_tgt_queue_depth);
4933 	lpfc_devloss_tmo_init(vport, lpfc_devloss_tmo);
4934 	lpfc_nodev_tmo_init(vport, lpfc_nodev_tmo);
4935 	lpfc_peer_port_login_init(vport, lpfc_peer_port_login);
4936 	lpfc_restrict_login_init(vport, lpfc_restrict_login);
4937 	lpfc_fcp_class_init(vport, lpfc_fcp_class);
4938 	lpfc_use_adisc_init(vport, lpfc_use_adisc);
4939 	lpfc_max_scsicmpl_time_init(vport, lpfc_max_scsicmpl_time);
4940 	lpfc_fdmi_on_init(vport, lpfc_fdmi_on);
4941 	lpfc_discovery_threads_init(vport, lpfc_discovery_threads);
4942 	lpfc_max_luns_init(vport, lpfc_max_luns);
4943 	lpfc_scan_down_init(vport, lpfc_scan_down);
4944 	lpfc_enable_da_id_init(vport, lpfc_enable_da_id);
4945 	return;
4946 }
4947