xref: /linux/drivers/scsi/lpfc/lpfc_attr.c (revision 776cfebb430c7b22c208b1b17add97f354d97cab)
1 /*******************************************************************
2  * This file is part of the Emulex Linux Device Driver for         *
3  * Enterprise Fibre Channel Host Bus Adapters.                     *
4  * Refer to the README file included with this package for         *
5  * driver version and adapter support.                             *
6  * Copyright (C) 2004 Emulex Corporation.                          *
7  * www.emulex.com                                                  *
8  *                                                                 *
9  * This program is free software; you can redistribute it and/or   *
10  * modify it under the terms of the GNU General Public License     *
11  * as published by the Free Software Foundation; either version 2  *
12  * of the License, or (at your option) any later version.          *
13  *                                                                 *
14  * This program is distributed in the hope that it will be useful, *
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of  *
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the   *
17  * GNU General Public License for more details, a copy of which    *
18  * can be found in the file COPYING included with this package.    *
19  *******************************************************************/
20 
21 /*
22  * $Id: lpfc_attr.c 1.24 2005/04/13 11:58:55EDT sf_support Exp  $
23  */
24 
25 #include <linux/ctype.h>
26 #include <linux/pci.h>
27 #include <linux/interrupt.h>
28 
29 #include <scsi/scsi_device.h>
30 #include <scsi/scsi_host.h>
31 #include <scsi/scsi_tcq.h>
32 #include <scsi/scsi_transport_fc.h>
33 
34 #include "lpfc_hw.h"
35 #include "lpfc_sli.h"
36 #include "lpfc_disc.h"
37 #include "lpfc_scsi.h"
38 #include "lpfc.h"
39 #include "lpfc_logmsg.h"
40 #include "lpfc_version.h"
41 #include "lpfc_compat.h"
42 #include "lpfc_crtn.h"
43 
44 
45 static void
46 lpfc_jedec_to_ascii(int incr, char hdw[])
47 {
48 	int i, j;
49 	for (i = 0; i < 8; i++) {
50 		j = (incr & 0xf);
51 		if (j <= 9)
52 			hdw[7 - i] = 0x30 +  j;
53 		 else
54 			hdw[7 - i] = 0x61 + j - 10;
55 		incr = (incr >> 4);
56 	}
57 	hdw[8] = 0;
58 	return;
59 }
60 
61 static ssize_t
62 lpfc_drvr_version_show(struct class_device *cdev, char *buf)
63 {
64 	return snprintf(buf, PAGE_SIZE, LPFC_MODULE_DESC "\n");
65 }
66 
67 static ssize_t
68 management_version_show(struct class_device *cdev, char *buf)
69 {
70 	return snprintf(buf, PAGE_SIZE, DFC_API_VERSION "\n");
71 }
72 
73 static ssize_t
74 lpfc_info_show(struct class_device *cdev, char *buf)
75 {
76 	struct Scsi_Host *host = class_to_shost(cdev);
77 	return snprintf(buf, PAGE_SIZE, "%s\n",lpfc_info(host));
78 }
79 
80 static ssize_t
81 lpfc_serialnum_show(struct class_device *cdev, char *buf)
82 {
83 	struct Scsi_Host *host = class_to_shost(cdev);
84 	struct lpfc_hba *phba = (struct lpfc_hba*)host->hostdata[0];
85 	return snprintf(buf, PAGE_SIZE, "%s\n",phba->SerialNumber);
86 }
87 
88 static ssize_t
89 lpfc_modeldesc_show(struct class_device *cdev, char *buf)
90 {
91 	struct Scsi_Host *host = class_to_shost(cdev);
92 	struct lpfc_hba *phba = (struct lpfc_hba*)host->hostdata[0];
93 	return snprintf(buf, PAGE_SIZE, "%s\n",phba->ModelDesc);
94 }
95 
96 static ssize_t
97 lpfc_modelname_show(struct class_device *cdev, char *buf)
98 {
99 	struct Scsi_Host *host = class_to_shost(cdev);
100 	struct lpfc_hba *phba = (struct lpfc_hba*)host->hostdata[0];
101 	return snprintf(buf, PAGE_SIZE, "%s\n",phba->ModelName);
102 }
103 
104 static ssize_t
105 lpfc_programtype_show(struct class_device *cdev, char *buf)
106 {
107 	struct Scsi_Host *host = class_to_shost(cdev);
108 	struct lpfc_hba *phba = (struct lpfc_hba*)host->hostdata[0];
109 	return snprintf(buf, PAGE_SIZE, "%s\n",phba->ProgramType);
110 }
111 
112 static ssize_t
113 lpfc_portnum_show(struct class_device *cdev, char *buf)
114 {
115 	struct Scsi_Host *host = class_to_shost(cdev);
116 	struct lpfc_hba *phba = (struct lpfc_hba*)host->hostdata[0];
117 	return snprintf(buf, PAGE_SIZE, "%s\n",phba->Port);
118 }
119 
120 static ssize_t
121 lpfc_fwrev_show(struct class_device *cdev, char *buf)
122 {
123 	struct Scsi_Host *host = class_to_shost(cdev);
124 	struct lpfc_hba *phba = (struct lpfc_hba*)host->hostdata[0];
125 	char fwrev[32];
126 	lpfc_decode_firmware_rev(phba, fwrev, 1);
127 	return snprintf(buf, PAGE_SIZE, "%s\n",fwrev);
128 }
129 
130 static ssize_t
131 lpfc_hdw_show(struct class_device *cdev, char *buf)
132 {
133 	char hdw[9];
134 	struct Scsi_Host *host = class_to_shost(cdev);
135 	struct lpfc_hba *phba = (struct lpfc_hba*)host->hostdata[0];
136 	lpfc_vpd_t *vp = &phba->vpd;
137 	lpfc_jedec_to_ascii(vp->rev.biuRev, hdw);
138 	return snprintf(buf, PAGE_SIZE, "%s\n", hdw);
139 }
140 static ssize_t
141 lpfc_option_rom_version_show(struct class_device *cdev, char *buf)
142 {
143 	struct Scsi_Host *host = class_to_shost(cdev);
144 	struct lpfc_hba *phba = (struct lpfc_hba*)host->hostdata[0];
145 	return snprintf(buf, PAGE_SIZE, "%s\n", phba->OptionROMVersion);
146 }
147 static ssize_t
148 lpfc_state_show(struct class_device *cdev, char *buf)
149 {
150 	struct Scsi_Host *host = class_to_shost(cdev);
151 	struct lpfc_hba *phba = (struct lpfc_hba*)host->hostdata[0];
152 	int len = 0;
153 	switch (phba->hba_state) {
154 	case LPFC_INIT_START:
155 	case LPFC_INIT_MBX_CMDS:
156 	case LPFC_LINK_DOWN:
157 		len += snprintf(buf + len, PAGE_SIZE-len, "Link Down\n");
158 		break;
159 	case LPFC_LINK_UP:
160 	case LPFC_LOCAL_CFG_LINK:
161 		len += snprintf(buf + len, PAGE_SIZE-len, "Link Up\n");
162 		break;
163 	case LPFC_FLOGI:
164 	case LPFC_FABRIC_CFG_LINK:
165 	case LPFC_NS_REG:
166 	case LPFC_NS_QRY:
167 	case LPFC_BUILD_DISC_LIST:
168 	case LPFC_DISC_AUTH:
169 	case LPFC_CLEAR_LA:
170 		len += snprintf(buf + len, PAGE_SIZE-len,
171 				"Link Up - Discovery\n");
172 		break;
173 	case LPFC_HBA_READY:
174 		len += snprintf(buf + len, PAGE_SIZE-len,
175 				"Link Up - Ready:\n");
176 		if (phba->fc_topology == TOPOLOGY_LOOP) {
177 			if (phba->fc_flag & FC_PUBLIC_LOOP)
178 				len += snprintf(buf + len, PAGE_SIZE-len,
179 						"   Public Loop\n");
180 			else
181 				len += snprintf(buf + len, PAGE_SIZE-len,
182 						"   Private Loop\n");
183 		} else {
184 			if (phba->fc_flag & FC_FABRIC)
185 				len += snprintf(buf + len, PAGE_SIZE-len,
186 						"   Fabric\n");
187 			else
188 				len += snprintf(buf + len, PAGE_SIZE-len,
189 						"   Point-2-Point\n");
190 		}
191 	}
192 	return len;
193 }
194 
195 static ssize_t
196 lpfc_num_discovered_ports_show(struct class_device *cdev, char *buf)
197 {
198 	struct Scsi_Host *host = class_to_shost(cdev);
199 	struct lpfc_hba *phba = (struct lpfc_hba*)host->hostdata[0];
200 	return snprintf(buf, PAGE_SIZE, "%d\n", phba->fc_map_cnt +
201 							phba->fc_unmap_cnt);
202 }
203 
204 
205 static ssize_t
206 lpfc_issue_lip (struct class_device *cdev, const char *buf, size_t count)
207 {
208 	struct Scsi_Host *host = class_to_shost(cdev);
209 	struct lpfc_hba *phba = (struct lpfc_hba *) host->hostdata[0];
210 	int val = 0;
211 	LPFC_MBOXQ_t *pmboxq;
212 	int mbxstatus = MBXERR_ERROR;
213 
214 	if ((sscanf(buf, "%d", &val) != 1) ||
215 	    (val != 1))
216 		return -EINVAL;
217 
218 	if ((phba->fc_flag & FC_OFFLINE_MODE) ||
219 	    (phba->hba_state != LPFC_HBA_READY))
220 		return -EPERM;
221 
222 	pmboxq = mempool_alloc(phba->mbox_mem_pool,GFP_KERNEL);
223 
224 	if (!pmboxq)
225 		return -ENOMEM;
226 
227 	memset((void *)pmboxq, 0, sizeof (LPFC_MBOXQ_t));
228 	lpfc_init_link(phba, pmboxq, phba->cfg_topology, phba->cfg_link_speed);
229 	mbxstatus = lpfc_sli_issue_mbox_wait(phba, pmboxq, phba->fc_ratov * 2);
230 
231 	if (mbxstatus == MBX_TIMEOUT)
232 		pmboxq->mbox_cmpl = lpfc_sli_def_mbox_cmpl;
233 	else
234 		mempool_free( pmboxq, phba->mbox_mem_pool);
235 
236 	if (mbxstatus == MBXERR_ERROR)
237 		return -EIO;
238 
239 	return strlen(buf);
240 }
241 
242 static ssize_t
243 lpfc_nport_evt_cnt_show(struct class_device *cdev, char *buf)
244 {
245 	struct Scsi_Host *host = class_to_shost(cdev);
246 	struct lpfc_hba *phba = (struct lpfc_hba*)host->hostdata[0];
247 	return snprintf(buf, PAGE_SIZE, "%d\n", phba->nport_event_cnt);
248 }
249 
250 static ssize_t
251 lpfc_board_online_show(struct class_device *cdev, char *buf)
252 {
253 	struct Scsi_Host *host = class_to_shost(cdev);
254 	struct lpfc_hba *phba = (struct lpfc_hba*)host->hostdata[0];
255 
256 	if (!phba) return 0;
257 
258 	if (phba->fc_flag & FC_OFFLINE_MODE)
259 		return snprintf(buf, PAGE_SIZE, "0\n");
260 	else
261 		return snprintf(buf, PAGE_SIZE, "1\n");
262 }
263 
264 static ssize_t
265 lpfc_board_online_store(struct class_device *cdev, const char *buf,
266 								size_t count)
267 {
268 	struct Scsi_Host *host = class_to_shost(cdev);
269 	struct lpfc_hba *phba = (struct lpfc_hba*)host->hostdata[0];
270 	struct completion online_compl;
271 	int val=0, status=0;
272 
273 	if (sscanf(buf, "%d", &val) != 1)
274 		return 0;
275 
276 	init_completion(&online_compl);
277 
278 	if (val)
279 		lpfc_workq_post_event(phba, &status, &online_compl,
280 							LPFC_EVT_ONLINE);
281 	else
282 		lpfc_workq_post_event(phba, &status, &online_compl,
283 							LPFC_EVT_OFFLINE);
284 	wait_for_completion(&online_compl);
285 	if (!status)
286 		return strlen(buf);
287 	else
288 		return 0;
289 }
290 
291 
292 #define lpfc_param_show(attr)	\
293 static ssize_t \
294 lpfc_##attr##_show(struct class_device *cdev, char *buf) \
295 { \
296 	struct Scsi_Host *host = class_to_shost(cdev);\
297 	struct lpfc_hba *phba = (struct lpfc_hba*)host->hostdata[0];\
298 	int val = 0;\
299 	if (phba){\
300 		val = phba->cfg_##attr;\
301 		return snprintf(buf, PAGE_SIZE, "%d\n",\
302 				phba->cfg_##attr);\
303 	}\
304 	return 0;\
305 }
306 
307 #define lpfc_param_store(attr, minval, maxval)	\
308 static ssize_t \
309 lpfc_##attr##_store(struct class_device *cdev, const char *buf, size_t count) \
310 { \
311 	struct Scsi_Host *host = class_to_shost(cdev);\
312 	struct lpfc_hba *phba = (struct lpfc_hba*)host->hostdata[0];\
313 	int val = 0;\
314 	if (!isdigit(buf[0]))\
315 		return -EINVAL;\
316 	if (sscanf(buf, "0x%x", &val) != 1)\
317 		if (sscanf(buf, "%d", &val) != 1)\
318 			return -EINVAL;\
319 	if (phba){\
320 		if (val >= minval && val <= maxval) {\
321 			phba->cfg_##attr = val;\
322 			return strlen(buf);\
323 		}\
324 	}\
325 	return 0;\
326 }
327 
328 #define LPFC_ATTR_R_NOINIT(name, desc) \
329 extern int lpfc_##name;\
330 module_param(lpfc_##name, int, 0);\
331 MODULE_PARM_DESC(lpfc_##name, desc);\
332 lpfc_param_show(name)\
333 static CLASS_DEVICE_ATTR(lpfc_##name, S_IRUGO , lpfc_##name##_show, NULL)
334 
335 #define LPFC_ATTR_R(name, defval, minval, maxval, desc) \
336 static int lpfc_##name = defval;\
337 module_param(lpfc_##name, int, 0);\
338 MODULE_PARM_DESC(lpfc_##name, desc);\
339 lpfc_param_show(name)\
340 static CLASS_DEVICE_ATTR(lpfc_##name, S_IRUGO , lpfc_##name##_show, NULL)
341 
342 #define LPFC_ATTR_RW(name, defval, minval, maxval, desc) \
343 static int lpfc_##name = defval;\
344 module_param(lpfc_##name, int, 0);\
345 MODULE_PARM_DESC(lpfc_##name, desc);\
346 lpfc_param_show(name)\
347 lpfc_param_store(name, minval, maxval)\
348 static CLASS_DEVICE_ATTR(lpfc_##name, S_IRUGO | S_IWUSR,\
349 			 lpfc_##name##_show, lpfc_##name##_store)
350 
351 static CLASS_DEVICE_ATTR(info, S_IRUGO, lpfc_info_show, NULL);
352 static CLASS_DEVICE_ATTR(serialnum, S_IRUGO, lpfc_serialnum_show, NULL);
353 static CLASS_DEVICE_ATTR(modeldesc, S_IRUGO, lpfc_modeldesc_show, NULL);
354 static CLASS_DEVICE_ATTR(modelname, S_IRUGO, lpfc_modelname_show, NULL);
355 static CLASS_DEVICE_ATTR(programtype, S_IRUGO, lpfc_programtype_show, NULL);
356 static CLASS_DEVICE_ATTR(portnum, S_IRUGO, lpfc_portnum_show, NULL);
357 static CLASS_DEVICE_ATTR(fwrev, S_IRUGO, lpfc_fwrev_show, NULL);
358 static CLASS_DEVICE_ATTR(hdw, S_IRUGO, lpfc_hdw_show, NULL);
359 static CLASS_DEVICE_ATTR(state, S_IRUGO, lpfc_state_show, NULL);
360 static CLASS_DEVICE_ATTR(option_rom_version, S_IRUGO,
361 					lpfc_option_rom_version_show, NULL);
362 static CLASS_DEVICE_ATTR(num_discovered_ports, S_IRUGO,
363 					lpfc_num_discovered_ports_show, NULL);
364 static CLASS_DEVICE_ATTR(nport_evt_cnt, S_IRUGO, lpfc_nport_evt_cnt_show, NULL);
365 static CLASS_DEVICE_ATTR(lpfc_drvr_version, S_IRUGO, lpfc_drvr_version_show,
366 			 NULL);
367 static CLASS_DEVICE_ATTR(management_version, S_IRUGO, management_version_show,
368 			 NULL);
369 static CLASS_DEVICE_ATTR(issue_lip, S_IWUSR, NULL, lpfc_issue_lip);
370 static CLASS_DEVICE_ATTR(board_online, S_IRUGO | S_IWUSR,
371 			 lpfc_board_online_show, lpfc_board_online_store);
372 
373 
374 /*
375 # lpfc_log_verbose: Only turn this flag on if you are willing to risk being
376 # deluged with LOTS of information.
377 # You can set a bit mask to record specific types of verbose messages:
378 #
379 # LOG_ELS                       0x1        ELS events
380 # LOG_DISCOVERY                 0x2        Link discovery events
381 # LOG_MBOX                      0x4        Mailbox events
382 # LOG_INIT                      0x8        Initialization events
383 # LOG_LINK_EVENT                0x10       Link events
384 # LOG_IP                        0x20       IP traffic history
385 # LOG_FCP                       0x40       FCP traffic history
386 # LOG_NODE                      0x80       Node table events
387 # LOG_MISC                      0x400      Miscellaneous events
388 # LOG_SLI                       0x800      SLI events
389 # LOG_CHK_COND                  0x1000     FCP Check condition flag
390 # LOG_LIBDFC                    0x2000     LIBDFC events
391 # LOG_ALL_MSG                   0xffff     LOG all messages
392 */
393 LPFC_ATTR_RW(log_verbose, 0x0, 0x0, 0xffff, "Verbose logging bit-mask");
394 
395 /*
396 # lun_queue_depth:  This parameter is used to limit the number of outstanding
397 # commands per FCP LUN. Value range is [1,128]. Default value is 30.
398 */
399 LPFC_ATTR_R(lun_queue_depth, 30, 1, 128,
400 	    "Max number of FCP commands we can queue to a specific LUN");
401 
402 /*
403 # Some disk devices have a "select ID" or "select Target" capability.
404 # From a protocol standpoint "select ID" usually means select the
405 # Fibre channel "ALPA".  In the FC-AL Profile there is an "informative
406 # annex" which contains a table that maps a "select ID" (a number
407 # between 0 and 7F) to an ALPA.  By default, for compatibility with
408 # older drivers, the lpfc driver scans this table from low ALPA to high
409 # ALPA.
410 #
411 # Turning on the scan-down variable (on  = 1, off = 0) will
412 # cause the lpfc driver to use an inverted table, effectively
413 # scanning ALPAs from high to low. Value range is [0,1]. Default value is 1.
414 #
415 # (Note: This "select ID" functionality is a LOOP ONLY characteristic
416 # and will not work across a fabric. Also this parameter will take
417 # effect only in the case when ALPA map is not available.)
418 */
419 LPFC_ATTR_R(scan_down, 1, 0, 1,
420 	     "Start scanning for devices from highest ALPA to lowest");
421 
422 /*
423 # lpfc_nodev_tmo: If set, it will hold all I/O errors on devices that disappear
424 # until the timer expires. Value range is [0,255]. Default value is 20.
425 # NOTE: this MUST be less then the SCSI Layer command timeout - 1.
426 */
427 LPFC_ATTR_RW(nodev_tmo, 30, 0, 255,
428 	     "Seconds driver will hold I/O waiting for a device to come back");
429 
430 /*
431 # lpfc_topology:  link topology for init link
432 #            0x0  = attempt loop mode then point-to-point
433 #            0x02 = attempt point-to-point mode only
434 #            0x04 = attempt loop mode only
435 #            0x06 = attempt point-to-point mode then loop
436 # Set point-to-point mode if you want to run as an N_Port.
437 # Set loop mode if you want to run as an NL_Port. Value range is [0,0x6].
438 # Default value is 0.
439 */
440 LPFC_ATTR_R(topology, 0, 0, 6, "Select Fibre Channel topology");
441 
442 /*
443 # lpfc_link_speed: Link speed selection for initializing the Fibre Channel
444 # connection.
445 #       0  = auto select (default)
446 #       1  = 1 Gigabaud
447 #       2  = 2 Gigabaud
448 #       4  = 4 Gigabaud
449 # Value range is [0,4]. Default value is 0.
450 */
451 LPFC_ATTR_R(link_speed, 0, 0, 4, "Select link speed");
452 
453 /*
454 # lpfc_fcp_class:  Determines FC class to use for the FCP protocol.
455 # Value range is [2,3]. Default value is 3.
456 */
457 LPFC_ATTR_R(fcp_class, 3, 2, 3,
458 	     "Select Fibre Channel class of service for FCP sequences");
459 
460 /*
461 # lpfc_use_adisc: Use ADISC for FCP rediscovery instead of PLOGI. Value range
462 # is [0,1]. Default value is 0.
463 */
464 LPFC_ATTR_RW(use_adisc, 0, 0, 1,
465 	     "Use ADISC on rediscovery to authenticate FCP devices");
466 
467 /*
468 # lpfc_ack0: Use ACK0, instead of ACK1 for class 2 acknowledgement. Value
469 # range is [0,1]. Default value is 0.
470 */
471 LPFC_ATTR_R(ack0, 0, 0, 1, "Enable ACK0 support");
472 
473 /*
474 # lpfc_cr_delay & lpfc_cr_count: Default values for I/O colaesing
475 # cr_delay (msec) or cr_count outstanding commands. cr_delay can take
476 # value [0,63]. cr_count can take value [0,255]. Default value of cr_delay
477 # is 0. Default value of cr_count is 1. The cr_count feature is disabled if
478 # cr_delay is set to 0.
479 */
480 static int lpfc_cr_delay = 0;
481 module_param(lpfc_cr_delay, int , 0);
482 MODULE_PARM_DESC(lpfc_cr_delay, "A count of milliseconds after which an "
483 		"interrupt response is generated");
484 
485 static int lpfc_cr_count = 1;
486 module_param(lpfc_cr_count, int, 0);
487 MODULE_PARM_DESC(lpfc_cr_count, "A count of I/O completions after which an "
488 		"interrupt response is generated");
489 
490 /*
491 # lpfc_fdmi_on: controls FDMI support.
492 #       0 = no FDMI support
493 #       1 = support FDMI without attribute of hostname
494 #       2 = support FDMI with attribute of hostname
495 # Value range [0,2]. Default value is 0.
496 */
497 LPFC_ATTR_RW(fdmi_on, 0, 0, 2, "Enable FDMI support");
498 
499 /*
500 # Specifies the maximum number of ELS cmds we can have outstanding (for
501 # discovery). Value range is [1,64]. Default value = 32.
502 */
503 static int lpfc_discovery_threads = 32;
504 module_param(lpfc_discovery_threads, int, 0);
505 MODULE_PARM_DESC(lpfc_discovery_threads, "Maximum number of ELS commands "
506 		 "during discovery");
507 
508 /*
509 # lpfc_max_luns: maximum number of LUNs per target driver will support
510 # Value range is [1,32768]. Default value is 256.
511 # NOTE: The SCSI layer will scan each target for this many luns
512 */
513 LPFC_ATTR_R(max_luns, 256, 1, 32768,
514 	     "Maximum number of LUNs per target driver will support");
515 
516 struct class_device_attribute *lpfc_host_attrs[] = {
517 	&class_device_attr_info,
518 	&class_device_attr_serialnum,
519 	&class_device_attr_modeldesc,
520 	&class_device_attr_modelname,
521 	&class_device_attr_programtype,
522 	&class_device_attr_portnum,
523 	&class_device_attr_fwrev,
524 	&class_device_attr_hdw,
525 	&class_device_attr_option_rom_version,
526 	&class_device_attr_state,
527 	&class_device_attr_num_discovered_ports,
528 	&class_device_attr_lpfc_drvr_version,
529 	&class_device_attr_lpfc_log_verbose,
530 	&class_device_attr_lpfc_lun_queue_depth,
531 	&class_device_attr_lpfc_nodev_tmo,
532 	&class_device_attr_lpfc_fcp_class,
533 	&class_device_attr_lpfc_use_adisc,
534 	&class_device_attr_lpfc_ack0,
535 	&class_device_attr_lpfc_topology,
536 	&class_device_attr_lpfc_scan_down,
537 	&class_device_attr_lpfc_link_speed,
538 	&class_device_attr_lpfc_fdmi_on,
539 	&class_device_attr_lpfc_max_luns,
540 	&class_device_attr_nport_evt_cnt,
541 	&class_device_attr_management_version,
542 	&class_device_attr_issue_lip,
543 	&class_device_attr_board_online,
544 	NULL,
545 };
546 
547 static ssize_t
548 sysfs_ctlreg_write(struct kobject *kobj, char *buf, loff_t off, size_t count)
549 {
550 	size_t buf_off;
551 	struct Scsi_Host *host = class_to_shost(container_of(kobj,
552 					     struct class_device, kobj));
553 	struct lpfc_hba *phba = (struct lpfc_hba*)host->hostdata[0];
554 
555 	if ((off + count) > FF_REG_AREA_SIZE)
556 		return -ERANGE;
557 
558 	if (count == 0) return 0;
559 
560 	if (off % 4 || count % 4 || (unsigned long)buf % 4)
561 		return -EINVAL;
562 
563 	spin_lock_irq(phba->host->host_lock);
564 
565 	if (!(phba->fc_flag & FC_OFFLINE_MODE)) {
566 		spin_unlock_irq(phba->host->host_lock);
567 		return -EPERM;
568 	}
569 
570 	for (buf_off = 0; buf_off < count; buf_off += sizeof(uint32_t))
571 		writel(*((uint32_t *)(buf + buf_off)),
572 		       phba->ctrl_regs_memmap_p + off + buf_off);
573 
574 	spin_unlock_irq(phba->host->host_lock);
575 
576 	return count;
577 }
578 
579 static ssize_t
580 sysfs_ctlreg_read(struct kobject *kobj, char *buf, loff_t off, size_t count)
581 {
582 	size_t buf_off;
583 	uint32_t * tmp_ptr;
584 	struct Scsi_Host *host = class_to_shost(container_of(kobj,
585 					     struct class_device, kobj));
586 	struct lpfc_hba *phba = (struct lpfc_hba*)host->hostdata[0];
587 
588 	if (off > FF_REG_AREA_SIZE)
589 		return -ERANGE;
590 
591 	if ((off + count) > FF_REG_AREA_SIZE)
592 		count = FF_REG_AREA_SIZE - off;
593 
594 	if (count == 0) return 0;
595 
596 	if (off % 4 || count % 4 || (unsigned long)buf % 4)
597 		return -EINVAL;
598 
599 	spin_lock_irq(phba->host->host_lock);
600 
601 	for (buf_off = 0; buf_off < count; buf_off += sizeof(uint32_t)) {
602 		tmp_ptr = (uint32_t *)(buf + buf_off);
603 		*tmp_ptr = readl(phba->ctrl_regs_memmap_p + off + buf_off);
604 	}
605 
606 	spin_unlock_irq(phba->host->host_lock);
607 
608 	return count;
609 }
610 
611 static struct bin_attribute sysfs_ctlreg_attr = {
612 	.attr = {
613 		.name = "ctlreg",
614 		.mode = S_IRUSR | S_IWUSR,
615 		.owner = THIS_MODULE,
616 	},
617 	.size = 256,
618 	.read = sysfs_ctlreg_read,
619 	.write = sysfs_ctlreg_write,
620 };
621 
622 
623 static void
624 sysfs_mbox_idle (struct lpfc_hba * phba)
625 {
626 	phba->sysfs_mbox.state = SMBOX_IDLE;
627 	phba->sysfs_mbox.offset = 0;
628 
629 	if (phba->sysfs_mbox.mbox) {
630 		mempool_free(phba->sysfs_mbox.mbox,
631 			     phba->mbox_mem_pool);
632 		phba->sysfs_mbox.mbox = NULL;
633 	}
634 }
635 
636 static ssize_t
637 sysfs_mbox_write(struct kobject *kobj, char *buf, loff_t off, size_t count)
638 {
639 	struct Scsi_Host * host =
640 		class_to_shost(container_of(kobj, struct class_device, kobj));
641 	struct lpfc_hba * phba = (struct lpfc_hba*)host->hostdata[0];
642 	struct lpfcMboxq * mbox = NULL;
643 
644 	if ((count + off) > MAILBOX_CMD_SIZE)
645 		return -ERANGE;
646 
647 	if (off % 4 ||  count % 4 || (unsigned long)buf % 4)
648 		return -EINVAL;
649 
650 	if (count == 0)
651 		return 0;
652 
653 	if (off == 0) {
654 		mbox = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL);
655 		if (!mbox)
656 			return -ENOMEM;
657 
658 	}
659 
660 	spin_lock_irq(host->host_lock);
661 
662 	if (off == 0) {
663 		if (phba->sysfs_mbox.mbox)
664 			mempool_free(mbox, phba->mbox_mem_pool);
665 		else
666 			phba->sysfs_mbox.mbox = mbox;
667 		phba->sysfs_mbox.state = SMBOX_WRITING;
668 	} else {
669 		if (phba->sysfs_mbox.state  != SMBOX_WRITING ||
670 		    phba->sysfs_mbox.offset != off           ||
671 		    phba->sysfs_mbox.mbox   == NULL ) {
672 			sysfs_mbox_idle(phba);
673 			spin_unlock_irq(host->host_lock);
674 			return -EINVAL;
675 		}
676 	}
677 
678 	memcpy((uint8_t *) & phba->sysfs_mbox.mbox->mb + off,
679 	       buf, count);
680 
681 	phba->sysfs_mbox.offset = off + count;
682 
683 	spin_unlock_irq(host->host_lock);
684 
685 	return count;
686 }
687 
688 static ssize_t
689 sysfs_mbox_read(struct kobject *kobj, char *buf, loff_t off, size_t count)
690 {
691 	struct Scsi_Host *host =
692 		class_to_shost(container_of(kobj, struct class_device,
693 					    kobj));
694 	struct lpfc_hba *phba = (struct lpfc_hba*)host->hostdata[0];
695 	int rc;
696 
697 	if (off > sizeof(MAILBOX_t))
698 		return -ERANGE;
699 
700 	if ((count + off) > sizeof(MAILBOX_t))
701 		count = sizeof(MAILBOX_t) - off;
702 
703 	if (off % 4 ||  count % 4 || (unsigned long)buf % 4)
704 		return -EINVAL;
705 
706 	if (off && count == 0)
707 		return 0;
708 
709 	spin_lock_irq(phba->host->host_lock);
710 
711 	if (off == 0 &&
712 	    phba->sysfs_mbox.state  == SMBOX_WRITING &&
713 	    phba->sysfs_mbox.offset >= 2 * sizeof(uint32_t)) {
714 
715 		switch (phba->sysfs_mbox.mbox->mb.mbxCommand) {
716 			/* Offline only */
717 		case MBX_WRITE_NV:
718 		case MBX_INIT_LINK:
719 		case MBX_DOWN_LINK:
720 		case MBX_CONFIG_LINK:
721 		case MBX_CONFIG_RING:
722 		case MBX_RESET_RING:
723 		case MBX_UNREG_LOGIN:
724 		case MBX_CLEAR_LA:
725 		case MBX_DUMP_CONTEXT:
726 		case MBX_RUN_DIAGS:
727 		case MBX_RESTART:
728 		case MBX_FLASH_WR_ULA:
729 		case MBX_SET_MASK:
730 		case MBX_SET_SLIM:
731 		case MBX_SET_DEBUG:
732 			if (!(phba->fc_flag & FC_OFFLINE_MODE)) {
733 				printk(KERN_WARNING "mbox_read:Command 0x%x "
734 				       "is illegal in on-line state\n",
735 				       phba->sysfs_mbox.mbox->mb.mbxCommand);
736 				sysfs_mbox_idle(phba);
737 				spin_unlock_irq(phba->host->host_lock);
738 				return -EPERM;
739 			}
740 		case MBX_LOAD_SM:
741 		case MBX_READ_NV:
742 		case MBX_READ_CONFIG:
743 		case MBX_READ_RCONFIG:
744 		case MBX_READ_STATUS:
745 		case MBX_READ_XRI:
746 		case MBX_READ_REV:
747 		case MBX_READ_LNK_STAT:
748 		case MBX_DUMP_MEMORY:
749 		case MBX_DOWN_LOAD:
750 		case MBX_UPDATE_CFG:
751 		case MBX_LOAD_AREA:
752 		case MBX_LOAD_EXP_ROM:
753 			break;
754 		case MBX_READ_SPARM64:
755 		case MBX_READ_LA:
756 		case MBX_READ_LA64:
757 		case MBX_REG_LOGIN:
758 		case MBX_REG_LOGIN64:
759 		case MBX_CONFIG_PORT:
760 		case MBX_RUN_BIU_DIAG:
761 			printk(KERN_WARNING "mbox_read: Illegal Command 0x%x\n",
762 			       phba->sysfs_mbox.mbox->mb.mbxCommand);
763 			sysfs_mbox_idle(phba);
764 			spin_unlock_irq(phba->host->host_lock);
765 			return -EPERM;
766 		default:
767 			printk(KERN_WARNING "mbox_read: Unknown Command 0x%x\n",
768 			       phba->sysfs_mbox.mbox->mb.mbxCommand);
769 			sysfs_mbox_idle(phba);
770 			spin_unlock_irq(phba->host->host_lock);
771 			return -EPERM;
772 		}
773 
774 		if ((phba->fc_flag & FC_OFFLINE_MODE) ||
775 		    (!(phba->sli.sli_flag & LPFC_SLI2_ACTIVE))){
776 
777 			spin_unlock_irq(phba->host->host_lock);
778 			rc = lpfc_sli_issue_mbox (phba,
779 						  phba->sysfs_mbox.mbox,
780 						  MBX_POLL);
781 			spin_lock_irq(phba->host->host_lock);
782 
783 		} else {
784 			spin_unlock_irq(phba->host->host_lock);
785 			rc = lpfc_sli_issue_mbox_wait (phba,
786 						       phba->sysfs_mbox.mbox,
787 						       phba->fc_ratov * 2);
788 			spin_lock_irq(phba->host->host_lock);
789 		}
790 
791 		if (rc != MBX_SUCCESS) {
792 			sysfs_mbox_idle(phba);
793 			spin_unlock_irq(host->host_lock);
794 			return -ENODEV;
795 		}
796 		phba->sysfs_mbox.state = SMBOX_READING;
797 	}
798 	else if (phba->sysfs_mbox.offset != off ||
799 		 phba->sysfs_mbox.state  != SMBOX_READING) {
800 		printk(KERN_WARNING  "mbox_read: Bad State\n");
801 		sysfs_mbox_idle(phba);
802 		spin_unlock_irq(host->host_lock);
803 		return -EINVAL;
804 	}
805 
806 	memcpy(buf, (uint8_t *) & phba->sysfs_mbox.mbox->mb + off, count);
807 
808 	phba->sysfs_mbox.offset = off + count;
809 
810 	if (phba->sysfs_mbox.offset == sizeof(MAILBOX_t))
811 		sysfs_mbox_idle(phba);
812 
813 	spin_unlock_irq(phba->host->host_lock);
814 
815 	return count;
816 }
817 
818 static struct bin_attribute sysfs_mbox_attr = {
819 	.attr = {
820 		.name = "mbox",
821 		.mode = S_IRUSR | S_IWUSR,
822 		.owner = THIS_MODULE,
823 	},
824 	.size = sizeof(MAILBOX_t),
825 	.read = sysfs_mbox_read,
826 	.write = sysfs_mbox_write,
827 };
828 
829 int
830 lpfc_alloc_sysfs_attr(struct lpfc_hba *phba)
831 {
832 	struct Scsi_Host *host = phba->host;
833 	int error;
834 
835 	error = sysfs_create_bin_file(&host->shost_classdev.kobj,
836 							&sysfs_ctlreg_attr);
837 	if (error)
838 		goto out;
839 
840 	error = sysfs_create_bin_file(&host->shost_classdev.kobj,
841 							&sysfs_mbox_attr);
842 	if (error)
843 		goto out_remove_ctlreg_attr;
844 
845 	return 0;
846 out_remove_ctlreg_attr:
847 	sysfs_remove_bin_file(&host->shost_classdev.kobj, &sysfs_ctlreg_attr);
848 out:
849 	return error;
850 }
851 
852 void
853 lpfc_free_sysfs_attr(struct lpfc_hba *phba)
854 {
855 	struct Scsi_Host *host = phba->host;
856 
857 	sysfs_remove_bin_file(&host->shost_classdev.kobj, &sysfs_mbox_attr);
858 	sysfs_remove_bin_file(&host->shost_classdev.kobj, &sysfs_ctlreg_attr);
859 }
860 
861 
862 /*
863  * Dynamic FC Host Attributes Support
864  */
865 
866 static void
867 lpfc_get_host_port_id(struct Scsi_Host *shost)
868 {
869 	struct lpfc_hba *phba = (struct lpfc_hba*)shost->hostdata[0];
870 	/* note: fc_myDID already in cpu endianness */
871 	fc_host_port_id(shost) = phba->fc_myDID;
872 }
873 
874 static void
875 lpfc_get_host_port_type(struct Scsi_Host *shost)
876 {
877 	struct lpfc_hba *phba = (struct lpfc_hba*)shost->hostdata[0];
878 
879 	spin_lock_irq(shost->host_lock);
880 
881 	if (phba->hba_state == LPFC_HBA_READY) {
882 		if (phba->fc_topology == TOPOLOGY_LOOP) {
883 			if (phba->fc_flag & FC_PUBLIC_LOOP)
884 				fc_host_port_type(shost) = FC_PORTTYPE_NLPORT;
885 			else
886 				fc_host_port_type(shost) = FC_PORTTYPE_LPORT;
887 		} else {
888 			if (phba->fc_flag & FC_FABRIC)
889 				fc_host_port_type(shost) = FC_PORTTYPE_NPORT;
890 			else
891 				fc_host_port_type(shost) = FC_PORTTYPE_PTP;
892 		}
893 	} else
894 		fc_host_port_type(shost) = FC_PORTTYPE_UNKNOWN;
895 
896 	spin_unlock_irq(shost->host_lock);
897 }
898 
899 static void
900 lpfc_get_host_port_state(struct Scsi_Host *shost)
901 {
902 	struct lpfc_hba *phba = (struct lpfc_hba*)shost->hostdata[0];
903 
904 	spin_lock_irq(shost->host_lock);
905 
906 	if (phba->fc_flag & FC_OFFLINE_MODE)
907 		fc_host_port_state(shost) = FC_PORTSTATE_OFFLINE;
908 	else {
909 		switch (phba->hba_state) {
910 		case LPFC_INIT_START:
911 		case LPFC_INIT_MBX_CMDS:
912 		case LPFC_LINK_DOWN:
913 			fc_host_port_state(shost) = FC_PORTSTATE_LINKDOWN;
914 			break;
915 		case LPFC_LINK_UP:
916 		case LPFC_LOCAL_CFG_LINK:
917 		case LPFC_FLOGI:
918 		case LPFC_FABRIC_CFG_LINK:
919 		case LPFC_NS_REG:
920 		case LPFC_NS_QRY:
921 		case LPFC_BUILD_DISC_LIST:
922 		case LPFC_DISC_AUTH:
923 		case LPFC_CLEAR_LA:
924 		case LPFC_HBA_READY:
925 			/* Links up, beyond this port_type reports state */
926 			fc_host_port_state(shost) = FC_PORTSTATE_ONLINE;
927 			break;
928 		case LPFC_HBA_ERROR:
929 			fc_host_port_state(shost) = FC_PORTSTATE_ERROR;
930 			break;
931 		default:
932 			fc_host_port_state(shost) = FC_PORTSTATE_UNKNOWN;
933 			break;
934 		}
935 	}
936 
937 	spin_unlock_irq(shost->host_lock);
938 }
939 
940 static void
941 lpfc_get_host_speed(struct Scsi_Host *shost)
942 {
943 	struct lpfc_hba *phba = (struct lpfc_hba*)shost->hostdata[0];
944 
945 	spin_lock_irq(shost->host_lock);
946 
947 	if (phba->hba_state == LPFC_HBA_READY) {
948 		switch(phba->fc_linkspeed) {
949 			case LA_1GHZ_LINK:
950 				fc_host_speed(shost) = FC_PORTSPEED_1GBIT;
951 			break;
952 			case LA_2GHZ_LINK:
953 				fc_host_speed(shost) = FC_PORTSPEED_2GBIT;
954 			break;
955 			case LA_4GHZ_LINK:
956 				fc_host_speed(shost) = FC_PORTSPEED_4GBIT;
957 			break;
958 			default:
959 				fc_host_speed(shost) = FC_PORTSPEED_UNKNOWN;
960 			break;
961 		}
962 	}
963 
964 	spin_unlock_irq(shost->host_lock);
965 }
966 
967 static void
968 lpfc_get_host_fabric_name (struct Scsi_Host *shost)
969 {
970 	struct lpfc_hba *phba = (struct lpfc_hba*)shost->hostdata[0];
971 	u64 nodename;
972 
973 	spin_lock_irq(shost->host_lock);
974 
975 	if ((phba->fc_flag & FC_FABRIC) ||
976 	    ((phba->fc_topology == TOPOLOGY_LOOP) &&
977 	     (phba->fc_flag & FC_PUBLIC_LOOP)))
978 		memcpy(&nodename, &phba->fc_fabparam.nodeName, sizeof(u64));
979 	else
980 		/* fabric is local port if there is no F/FL_Port */
981 		memcpy(&nodename, &phba->fc_nodename, sizeof(u64));
982 
983 	spin_unlock_irq(shost->host_lock);
984 
985 	fc_host_fabric_name(shost) = be64_to_cpu(nodename);
986 }
987 
988 
989 static struct fc_host_statistics *
990 lpfc_get_stats(struct Scsi_Host *shost)
991 {
992 	struct lpfc_hba *phba = (struct lpfc_hba *)shost->hostdata[0];
993 	struct lpfc_sli *psli = &phba->sli;
994 	struct fc_host_statistics *hs =
995 			(struct fc_host_statistics *)phba->link_stats;
996 	LPFC_MBOXQ_t *pmboxq;
997 	MAILBOX_t *pmb;
998 	int rc=0;
999 
1000 	pmboxq = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL);
1001 	if (!pmboxq)
1002 		return NULL;
1003 	memset(pmboxq, 0, sizeof (LPFC_MBOXQ_t));
1004 
1005 	pmb = &pmboxq->mb;
1006 	pmb->mbxCommand = MBX_READ_STATUS;
1007 	pmb->mbxOwner = OWN_HOST;
1008 	pmboxq->context1 = NULL;
1009 
1010 	if ((phba->fc_flag & FC_OFFLINE_MODE) ||
1011 	    (!(psli->sli_flag & LPFC_SLI2_ACTIVE))){
1012 		rc = lpfc_sli_issue_mbox(phba, pmboxq, MBX_POLL);
1013 	} else
1014 		rc = lpfc_sli_issue_mbox_wait(phba, pmboxq, phba->fc_ratov * 2);
1015 
1016 	if (rc != MBX_SUCCESS) {
1017 		if (pmboxq) {
1018 			if (rc == MBX_TIMEOUT)
1019 				pmboxq->mbox_cmpl = lpfc_sli_def_mbox_cmpl;
1020 			else
1021 				mempool_free( pmboxq, phba->mbox_mem_pool);
1022 		}
1023 		return NULL;
1024 	}
1025 
1026 	hs->tx_frames = pmb->un.varRdStatus.xmitFrameCnt;
1027 	hs->tx_words = (pmb->un.varRdStatus.xmitByteCnt * 256);
1028 	hs->rx_frames = pmb->un.varRdStatus.rcvFrameCnt;
1029 	hs->rx_words = (pmb->un.varRdStatus.rcvByteCnt * 256);
1030 
1031 	memset((void *)pmboxq, 0, sizeof (LPFC_MBOXQ_t));
1032 	pmb->mbxCommand = MBX_READ_LNK_STAT;
1033 	pmb->mbxOwner = OWN_HOST;
1034 	pmboxq->context1 = NULL;
1035 
1036 	if ((phba->fc_flag & FC_OFFLINE_MODE) ||
1037 	    (!(psli->sli_flag & LPFC_SLI2_ACTIVE))) {
1038 		rc = lpfc_sli_issue_mbox(phba, pmboxq, MBX_POLL);
1039 	} else
1040 		rc = lpfc_sli_issue_mbox_wait(phba, pmboxq, phba->fc_ratov * 2);
1041 
1042 	if (rc != MBX_SUCCESS) {
1043 		if (pmboxq) {
1044 			if (rc == MBX_TIMEOUT)
1045 				pmboxq->mbox_cmpl = lpfc_sli_def_mbox_cmpl;
1046 			else
1047 				mempool_free( pmboxq, phba->mbox_mem_pool);
1048 		}
1049 		return NULL;
1050 	}
1051 
1052 	hs->link_failure_count = pmb->un.varRdLnk.linkFailureCnt;
1053 	hs->loss_of_sync_count = pmb->un.varRdLnk.lossSyncCnt;
1054 	hs->loss_of_signal_count = pmb->un.varRdLnk.lossSignalCnt;
1055 	hs->prim_seq_protocol_err_count = pmb->un.varRdLnk.primSeqErrCnt;
1056 	hs->invalid_tx_word_count = pmb->un.varRdLnk.invalidXmitWord;
1057 	hs->invalid_crc_count = pmb->un.varRdLnk.crcCnt;
1058 	hs->error_frames = pmb->un.varRdLnk.crcCnt;
1059 
1060 	if (phba->fc_topology == TOPOLOGY_LOOP) {
1061 		hs->lip_count = (phba->fc_eventTag >> 1);
1062 		hs->nos_count = -1;
1063 	} else {
1064 		hs->lip_count = -1;
1065 		hs->nos_count = (phba->fc_eventTag >> 1);
1066 	}
1067 
1068 	hs->dumped_frames = -1;
1069 
1070 /* FIX ME */
1071 	/*hs->SecondsSinceLastReset = (jiffies - lpfc_loadtime) / HZ;*/
1072 
1073 	return hs;
1074 }
1075 
1076 
1077 /*
1078  * The LPFC driver treats linkdown handling as target loss events so there
1079  * are no sysfs handlers for link_down_tmo.
1080  */
1081 static void
1082 lpfc_get_starget_port_id(struct scsi_target *starget)
1083 {
1084 	struct Scsi_Host *shost = dev_to_shost(starget->dev.parent);
1085 	struct lpfc_hba *phba = (struct lpfc_hba *) shost->hostdata[0];
1086 	uint32_t did = -1;
1087 	struct lpfc_nodelist *ndlp = NULL;
1088 
1089 	spin_lock_irq(shost->host_lock);
1090 	/* Search the mapped list for this target ID */
1091 	list_for_each_entry(ndlp, &phba->fc_nlpmap_list, nlp_listp) {
1092 		if (starget->id == ndlp->nlp_sid) {
1093 			did = ndlp->nlp_DID;
1094 			break;
1095 		}
1096 	}
1097 	spin_unlock_irq(shost->host_lock);
1098 
1099 	fc_starget_port_id(starget) = did;
1100 }
1101 
1102 static void
1103 lpfc_get_starget_node_name(struct scsi_target *starget)
1104 {
1105 	struct Scsi_Host *shost = dev_to_shost(starget->dev.parent);
1106 	struct lpfc_hba *phba = (struct lpfc_hba *) shost->hostdata[0];
1107 	uint64_t node_name = 0;
1108 	struct lpfc_nodelist *ndlp = NULL;
1109 
1110 	spin_lock_irq(shost->host_lock);
1111 	/* Search the mapped list for this target ID */
1112 	list_for_each_entry(ndlp, &phba->fc_nlpmap_list, nlp_listp) {
1113 		if (starget->id == ndlp->nlp_sid) {
1114 			memcpy(&node_name, &ndlp->nlp_nodename,
1115 						sizeof(struct lpfc_name));
1116 			break;
1117 		}
1118 	}
1119 	spin_unlock_irq(shost->host_lock);
1120 
1121 	fc_starget_node_name(starget) = be64_to_cpu(node_name);
1122 }
1123 
1124 static void
1125 lpfc_get_starget_port_name(struct scsi_target *starget)
1126 {
1127 	struct Scsi_Host *shost = dev_to_shost(starget->dev.parent);
1128 	struct lpfc_hba *phba = (struct lpfc_hba *) shost->hostdata[0];
1129 	uint64_t port_name = 0;
1130 	struct lpfc_nodelist *ndlp = NULL;
1131 
1132 	spin_lock_irq(shost->host_lock);
1133 	/* Search the mapped list for this target ID */
1134 	list_for_each_entry(ndlp, &phba->fc_nlpmap_list, nlp_listp) {
1135 		if (starget->id == ndlp->nlp_sid) {
1136 			memcpy(&port_name, &ndlp->nlp_portname,
1137 						sizeof(struct lpfc_name));
1138 			break;
1139 		}
1140 	}
1141 	spin_unlock_irq(shost->host_lock);
1142 
1143 	fc_starget_port_name(starget) = be64_to_cpu(port_name);
1144 }
1145 
1146 static void
1147 lpfc_get_rport_loss_tmo(struct fc_rport *rport)
1148 {
1149 	/*
1150 	 * Return the driver's global value for device loss timeout plus
1151 	 * five seconds to allow the driver's nodev timer to run.
1152 	 */
1153 	rport->dev_loss_tmo = lpfc_nodev_tmo + 5;
1154 }
1155 
1156 static void
1157 lpfc_set_rport_loss_tmo(struct fc_rport *rport, uint32_t timeout)
1158 {
1159 	/*
1160 	 * The driver doesn't have a per-target timeout setting.  Set
1161 	 * this value globally. lpfc_nodev_tmo should be greater then 0.
1162 	 */
1163 	if (timeout)
1164 		lpfc_nodev_tmo = timeout;
1165 	else
1166 		lpfc_nodev_tmo = 1;
1167 	rport->dev_loss_tmo = lpfc_nodev_tmo + 5;
1168 }
1169 
1170 
1171 #define lpfc_rport_show_function(field, format_string, sz, cast)	\
1172 static ssize_t								\
1173 lpfc_show_rport_##field (struct class_device *cdev, char *buf)		\
1174 {									\
1175 	struct fc_rport *rport = transport_class_to_rport(cdev);	\
1176 	struct lpfc_rport_data *rdata = rport->hostdata;		\
1177 	return snprintf(buf, sz, format_string,				\
1178 		(rdata->target) ? cast rdata->target->field : 0);	\
1179 }
1180 
1181 #define lpfc_rport_rd_attr(field, format_string, sz)			\
1182 	lpfc_rport_show_function(field, format_string, sz, )		\
1183 static FC_RPORT_ATTR(field, S_IRUGO, lpfc_show_rport_##field, NULL)
1184 
1185 
1186 struct fc_function_template lpfc_transport_functions = {
1187 	/* fixed attributes the driver supports */
1188 	.show_host_node_name = 1,
1189 	.show_host_port_name = 1,
1190 	.show_host_supported_classes = 1,
1191 	.show_host_supported_fc4s = 1,
1192 	.show_host_symbolic_name = 1,
1193 	.show_host_supported_speeds = 1,
1194 	.show_host_maxframe_size = 1,
1195 
1196 	/* dynamic attributes the driver supports */
1197 	.get_host_port_id = lpfc_get_host_port_id,
1198 	.show_host_port_id = 1,
1199 
1200 	.get_host_port_type = lpfc_get_host_port_type,
1201 	.show_host_port_type = 1,
1202 
1203 	.get_host_port_state = lpfc_get_host_port_state,
1204 	.show_host_port_state = 1,
1205 
1206 	/* active_fc4s is shown but doesn't change (thus no get function) */
1207 	.show_host_active_fc4s = 1,
1208 
1209 	.get_host_speed = lpfc_get_host_speed,
1210 	.show_host_speed = 1,
1211 
1212 	.get_host_fabric_name = lpfc_get_host_fabric_name,
1213 	.show_host_fabric_name = 1,
1214 
1215 	/*
1216 	 * The LPFC driver treats linkdown handling as target loss events
1217 	 * so there are no sysfs handlers for link_down_tmo.
1218 	 */
1219 
1220 	.get_fc_host_stats = lpfc_get_stats,
1221 
1222 	/* the LPFC driver doesn't support resetting stats yet */
1223 
1224 	.dd_fcrport_size = sizeof(struct lpfc_rport_data),
1225 	.show_rport_maxframe_size = 1,
1226 	.show_rport_supported_classes = 1,
1227 
1228 	.get_rport_dev_loss_tmo = lpfc_get_rport_loss_tmo,
1229 	.set_rport_dev_loss_tmo = lpfc_set_rport_loss_tmo,
1230 	.show_rport_dev_loss_tmo = 1,
1231 
1232 	.get_starget_port_id  = lpfc_get_starget_port_id,
1233 	.show_starget_port_id = 1,
1234 
1235 	.get_starget_node_name = lpfc_get_starget_node_name,
1236 	.show_starget_node_name = 1,
1237 
1238 	.get_starget_port_name = lpfc_get_starget_port_name,
1239 	.show_starget_port_name = 1,
1240 };
1241 
1242 void
1243 lpfc_get_cfgparam(struct lpfc_hba *phba)
1244 {
1245 	phba->cfg_log_verbose = lpfc_log_verbose;
1246 	phba->cfg_cr_delay = lpfc_cr_delay;
1247 	phba->cfg_cr_count = lpfc_cr_count;
1248 	phba->cfg_lun_queue_depth = lpfc_lun_queue_depth;
1249 	phba->cfg_fcp_class = lpfc_fcp_class;
1250 	phba->cfg_use_adisc = lpfc_use_adisc;
1251 	phba->cfg_ack0 = lpfc_ack0;
1252 	phba->cfg_topology = lpfc_topology;
1253 	phba->cfg_scan_down = lpfc_scan_down;
1254 	phba->cfg_nodev_tmo = lpfc_nodev_tmo;
1255 	phba->cfg_link_speed = lpfc_link_speed;
1256 	phba->cfg_fdmi_on = lpfc_fdmi_on;
1257 	phba->cfg_discovery_threads = lpfc_discovery_threads;
1258 	phba->cfg_max_luns = lpfc_max_luns;
1259 
1260 	/*
1261 	 * The total number of segments is the configuration value plus 2
1262 	 * since the IOCB need a command and response bde.
1263 	 */
1264 	phba->cfg_sg_seg_cnt = LPFC_SG_SEG_CNT + 2;
1265 
1266 	/*
1267 	 * Since the sg_tablesize is module parameter, the sg_dma_buf_size
1268 	 * used to create the sg_dma_buf_pool must be dynamically calculated
1269 	 */
1270 	phba->cfg_sg_dma_buf_size = sizeof(struct fcp_cmnd) +
1271 			sizeof(struct fcp_rsp) +
1272 			(phba->cfg_sg_seg_cnt * sizeof(struct ulp_bde64));
1273 
1274 	switch (phba->pcidev->device) {
1275 	case PCI_DEVICE_ID_LP101:
1276 	case PCI_DEVICE_ID_BSMB:
1277 	case PCI_DEVICE_ID_ZSMB:
1278 		phba->cfg_hba_queue_depth = LPFC_LP101_HBA_Q_DEPTH;
1279 		break;
1280 	case PCI_DEVICE_ID_RFLY:
1281 	case PCI_DEVICE_ID_PFLY:
1282 	case PCI_DEVICE_ID_BMID:
1283 	case PCI_DEVICE_ID_ZMID:
1284 	case PCI_DEVICE_ID_TFLY:
1285 		phba->cfg_hba_queue_depth = LPFC_LC_HBA_Q_DEPTH;
1286 		break;
1287 	default:
1288 		phba->cfg_hba_queue_depth = LPFC_DFT_HBA_Q_DEPTH;
1289 	}
1290 	return;
1291 }
1292