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