xref: /openbmc/linux/drivers/scsi/scsi_transport_fc.c (revision 5f8b7d4b2e9604d03ae06f1a2dd5a1f34c33e533)
1  // SPDX-License-Identifier: GPL-2.0-or-later
2  /*
3   *  FiberChannel transport specific attributes exported to sysfs.
4   *
5   *  Copyright (c) 2003 Silicon Graphics, Inc.  All rights reserved.
6   *  Copyright (C) 2004-2007   James Smart, Emulex Corporation
7   *    Rewrite for host, target, device, and remote port attributes,
8   *    statistics, and service functions...
9   *    Add vports, etc
10   */
11  #include <linux/module.h>
12  #include <linux/init.h>
13  #include <linux/slab.h>
14  #include <linux/delay.h>
15  #include <linux/kernel.h>
16  #include <linux/bsg-lib.h>
17  #include <scsi/scsi_device.h>
18  #include <scsi/scsi_host.h>
19  #include <scsi/scsi_transport.h>
20  #include <scsi/scsi_transport_fc.h>
21  #include <scsi/scsi_cmnd.h>
22  #include <net/netlink.h>
23  #include <scsi/scsi_netlink_fc.h>
24  #include <scsi/scsi_bsg_fc.h>
25  #include <uapi/scsi/fc/fc_els.h>
26  #include "scsi_priv.h"
27  
28  static int fc_queue_work(struct Scsi_Host *, struct work_struct *);
29  static void fc_vport_sched_delete(struct work_struct *work);
30  static int fc_vport_setup(struct Scsi_Host *shost, int channel,
31  	struct device *pdev, struct fc_vport_identifiers  *ids,
32  	struct fc_vport **vport);
33  static int fc_bsg_hostadd(struct Scsi_Host *, struct fc_host_attrs *);
34  static int fc_bsg_rportadd(struct Scsi_Host *, struct fc_rport *);
35  static void fc_bsg_remove(struct request_queue *);
36  static void fc_bsg_goose_queue(struct fc_rport *);
37  static void fc_li_stats_update(u16 event_type,
38  			       struct fc_fpin_stats *stats);
39  static void fc_delivery_stats_update(u32 reason_code,
40  				     struct fc_fpin_stats *stats);
41  static void fc_cn_stats_update(u16 event_type, struct fc_fpin_stats *stats);
42  
43  /*
44   * Module Parameters
45   */
46  
47  /*
48   * dev_loss_tmo: the default number of seconds that the FC transport
49   *   should insulate the loss of a remote port.
50   *   The maximum will be capped by the value of SCSI_DEVICE_BLOCK_MAX_TIMEOUT.
51   */
52  static unsigned int fc_dev_loss_tmo = 60;		/* seconds */
53  
54  module_param_named(dev_loss_tmo, fc_dev_loss_tmo, uint, S_IRUGO|S_IWUSR);
55  MODULE_PARM_DESC(dev_loss_tmo,
56  		 "Maximum number of seconds that the FC transport should"
57  		 " insulate the loss of a remote port. Once this value is"
58  		 " exceeded, the scsi target is removed. Value should be"
59  		 " between 1 and SCSI_DEVICE_BLOCK_MAX_TIMEOUT if"
60  		 " fast_io_fail_tmo is not set.");
61  
62  /*
63   * Redefine so that we can have same named attributes in the
64   * sdev/starget/host objects.
65   */
66  #define FC_DEVICE_ATTR(_prefix,_name,_mode,_show,_store)		\
67  struct device_attribute device_attr_##_prefix##_##_name = 	\
68  	__ATTR(_name,_mode,_show,_store)
69  
70  #define fc_enum_name_search(title, table_type, table)			\
71  static const char *get_fc_##title##_name(enum table_type table_key)	\
72  {									\
73  	int i;								\
74  	char *name = NULL;						\
75  									\
76  	for (i = 0; i < ARRAY_SIZE(table); i++) {			\
77  		if (table[i].value == table_key) {			\
78  			name = table[i].name;				\
79  			break;						\
80  		}							\
81  	}								\
82  	return name;							\
83  }
84  
85  #define fc_enum_name_match(title, table_type, table)			\
86  static int get_fc_##title##_match(const char *table_key,		\
87  		enum table_type *value)					\
88  {									\
89  	int i;								\
90  									\
91  	for (i = 0; i < ARRAY_SIZE(table); i++) {			\
92  		if (strncmp(table_key, table[i].name,			\
93  				table[i].matchlen) == 0) {		\
94  			*value = table[i].value;			\
95  			return 0; /* success */				\
96  		}							\
97  	}								\
98  	return 1; /* failure */						\
99  }
100  
101  
102  /* Convert fc_port_type values to ascii string name */
103  static struct {
104  	enum fc_port_type	value;
105  	char			*name;
106  } fc_port_type_names[] = {
107  	{ FC_PORTTYPE_UNKNOWN,		"Unknown" },
108  	{ FC_PORTTYPE_OTHER,		"Other" },
109  	{ FC_PORTTYPE_NOTPRESENT,	"Not Present" },
110  	{ FC_PORTTYPE_NPORT,	"NPort (fabric via point-to-point)" },
111  	{ FC_PORTTYPE_NLPORT,	"NLPort (fabric via loop)" },
112  	{ FC_PORTTYPE_LPORT,	"LPort (private loop)" },
113  	{ FC_PORTTYPE_PTP,	"Point-To-Point (direct nport connection)" },
114  	{ FC_PORTTYPE_NPIV,		"NPIV VPORT" },
115  };
116  fc_enum_name_search(port_type, fc_port_type, fc_port_type_names)
117  #define FC_PORTTYPE_MAX_NAMELEN		50
118  
119  /* Reuse fc_port_type enum function for vport_type */
120  #define get_fc_vport_type_name get_fc_port_type_name
121  
122  
123  /* Convert fc_host_event_code values to ascii string name */
124  static const struct {
125  	enum fc_host_event_code		value;
126  	char				*name;
127  } fc_host_event_code_names[] = {
128  	{ FCH_EVT_LIP,			"lip" },
129  	{ FCH_EVT_LINKUP,		"link_up" },
130  	{ FCH_EVT_LINKDOWN,		"link_down" },
131  	{ FCH_EVT_LIPRESET,		"lip_reset" },
132  	{ FCH_EVT_RSCN,			"rscn" },
133  	{ FCH_EVT_ADAPTER_CHANGE,	"adapter_chg" },
134  	{ FCH_EVT_PORT_UNKNOWN,		"port_unknown" },
135  	{ FCH_EVT_PORT_ONLINE,		"port_online" },
136  	{ FCH_EVT_PORT_OFFLINE,		"port_offline" },
137  	{ FCH_EVT_PORT_FABRIC,		"port_fabric" },
138  	{ FCH_EVT_LINK_UNKNOWN,		"link_unknown" },
139  	{ FCH_EVT_LINK_FPIN,		"link_FPIN" },
140  	{ FCH_EVT_LINK_FPIN_ACK,	"link_FPIN_ACK" },
141  	{ FCH_EVT_VENDOR_UNIQUE,	"vendor_unique" },
142  };
143  fc_enum_name_search(host_event_code, fc_host_event_code,
144  		fc_host_event_code_names)
145  #define FC_HOST_EVENT_CODE_MAX_NAMELEN	30
146  
147  
148  /* Convert fc_port_state values to ascii string name */
149  static struct {
150  	enum fc_port_state	value;
151  	char			*name;
152  	int			matchlen;
153  } fc_port_state_names[] = {
154  	{ FC_PORTSTATE_UNKNOWN,		"Unknown", 7},
155  	{ FC_PORTSTATE_NOTPRESENT,	"Not Present", 11 },
156  	{ FC_PORTSTATE_ONLINE,		"Online", 6 },
157  	{ FC_PORTSTATE_OFFLINE,		"Offline", 7 },
158  	{ FC_PORTSTATE_BLOCKED,		"Blocked", 7 },
159  	{ FC_PORTSTATE_BYPASSED,	"Bypassed", 8 },
160  	{ FC_PORTSTATE_DIAGNOSTICS,	"Diagnostics", 11 },
161  	{ FC_PORTSTATE_LINKDOWN,	"Linkdown", 8 },
162  	{ FC_PORTSTATE_ERROR,		"Error", 5 },
163  	{ FC_PORTSTATE_LOOPBACK,	"Loopback", 8 },
164  	{ FC_PORTSTATE_DELETED,		"Deleted", 7 },
165  	{ FC_PORTSTATE_MARGINAL,	"Marginal", 8 },
166  };
167  fc_enum_name_search(port_state, fc_port_state, fc_port_state_names)
168  fc_enum_name_match(port_state, fc_port_state, fc_port_state_names)
169  #define FC_PORTSTATE_MAX_NAMELEN	20
170  
171  
172  /* Convert fc_vport_state values to ascii string name */
173  static struct {
174  	enum fc_vport_state	value;
175  	char			*name;
176  } fc_vport_state_names[] = {
177  	{ FC_VPORT_UNKNOWN,		"Unknown" },
178  	{ FC_VPORT_ACTIVE,		"Active" },
179  	{ FC_VPORT_DISABLED,		"Disabled" },
180  	{ FC_VPORT_LINKDOWN,		"Linkdown" },
181  	{ FC_VPORT_INITIALIZING,	"Initializing" },
182  	{ FC_VPORT_NO_FABRIC_SUPP,	"No Fabric Support" },
183  	{ FC_VPORT_NO_FABRIC_RSCS,	"No Fabric Resources" },
184  	{ FC_VPORT_FABRIC_LOGOUT,	"Fabric Logout" },
185  	{ FC_VPORT_FABRIC_REJ_WWN,	"Fabric Rejected WWN" },
186  	{ FC_VPORT_FAILED,		"VPort Failed" },
187  };
188  fc_enum_name_search(vport_state, fc_vport_state, fc_vport_state_names)
189  #define FC_VPORTSTATE_MAX_NAMELEN	24
190  
191  /* Reuse fc_vport_state enum function for vport_last_state */
192  #define get_fc_vport_last_state_name get_fc_vport_state_name
193  
194  
195  /* Convert fc_tgtid_binding_type values to ascii string name */
196  static const struct {
197  	enum fc_tgtid_binding_type	value;
198  	char				*name;
199  	int				matchlen;
200  } fc_tgtid_binding_type_names[] = {
201  	{ FC_TGTID_BIND_NONE, "none", 4 },
202  	{ FC_TGTID_BIND_BY_WWPN, "wwpn (World Wide Port Name)", 4 },
203  	{ FC_TGTID_BIND_BY_WWNN, "wwnn (World Wide Node Name)", 4 },
204  	{ FC_TGTID_BIND_BY_ID, "port_id (FC Address)", 7 },
205  };
206  fc_enum_name_search(tgtid_bind_type, fc_tgtid_binding_type,
207  		fc_tgtid_binding_type_names)
208  fc_enum_name_match(tgtid_bind_type, fc_tgtid_binding_type,
209  		fc_tgtid_binding_type_names)
210  #define FC_BINDTYPE_MAX_NAMELEN	30
211  
212  
213  #define fc_bitfield_name_search(title, table)			\
214  static ssize_t							\
215  get_fc_##title##_names(u32 table_key, char *buf)		\
216  {								\
217  	char *prefix = "";					\
218  	ssize_t len = 0;					\
219  	int i;							\
220  								\
221  	for (i = 0; i < ARRAY_SIZE(table); i++) {		\
222  		if (table[i].value & table_key) {		\
223  			len += sprintf(buf + len, "%s%s",	\
224  				prefix, table[i].name);		\
225  			prefix = ", ";				\
226  		}						\
227  	}							\
228  	len += sprintf(buf + len, "\n");			\
229  	return len;						\
230  }
231  
232  
233  /* Convert FC_COS bit values to ascii string name */
234  static const struct {
235  	u32 			value;
236  	char			*name;
237  } fc_cos_names[] = {
238  	{ FC_COS_CLASS1,	"Class 1" },
239  	{ FC_COS_CLASS2,	"Class 2" },
240  	{ FC_COS_CLASS3,	"Class 3" },
241  	{ FC_COS_CLASS4,	"Class 4" },
242  	{ FC_COS_CLASS6,	"Class 6" },
243  };
244  fc_bitfield_name_search(cos, fc_cos_names)
245  
246  
247  /* Convert FC_PORTSPEED bit values to ascii string name */
248  static const struct {
249  	u32 			value;
250  	char			*name;
251  } fc_port_speed_names[] = {
252  	{ FC_PORTSPEED_1GBIT,		"1 Gbit" },
253  	{ FC_PORTSPEED_2GBIT,		"2 Gbit" },
254  	{ FC_PORTSPEED_4GBIT,		"4 Gbit" },
255  	{ FC_PORTSPEED_10GBIT,		"10 Gbit" },
256  	{ FC_PORTSPEED_8GBIT,		"8 Gbit" },
257  	{ FC_PORTSPEED_16GBIT,		"16 Gbit" },
258  	{ FC_PORTSPEED_32GBIT,		"32 Gbit" },
259  	{ FC_PORTSPEED_20GBIT,		"20 Gbit" },
260  	{ FC_PORTSPEED_40GBIT,		"40 Gbit" },
261  	{ FC_PORTSPEED_50GBIT,		"50 Gbit" },
262  	{ FC_PORTSPEED_100GBIT,		"100 Gbit" },
263  	{ FC_PORTSPEED_25GBIT,		"25 Gbit" },
264  	{ FC_PORTSPEED_64GBIT,		"64 Gbit" },
265  	{ FC_PORTSPEED_128GBIT,		"128 Gbit" },
266  	{ FC_PORTSPEED_256GBIT,		"256 Gbit" },
267  	{ FC_PORTSPEED_NOT_NEGOTIATED,	"Not Negotiated" },
268  };
fc_bitfield_name_search(port_speed,fc_port_speed_names)269  fc_bitfield_name_search(port_speed, fc_port_speed_names)
270  
271  
272  static int
273  show_fc_fc4s (char *buf, u8 *fc4_list)
274  {
275  	int i, len=0;
276  
277  	for (i = 0; i < FC_FC4_LIST_SIZE; i++, fc4_list++)
278  		len += sprintf(buf + len , "0x%02x ", *fc4_list);
279  	len += sprintf(buf + len, "\n");
280  	return len;
281  }
282  
283  
284  /* Convert FC_PORT_ROLE bit values to ascii string name */
285  static const struct {
286  	u32 			value;
287  	char			*name;
288  } fc_port_role_names[] = {
289  	{ FC_PORT_ROLE_FCP_TARGET,		"FCP Target" },
290  	{ FC_PORT_ROLE_FCP_INITIATOR,		"FCP Initiator" },
291  	{ FC_PORT_ROLE_IP_PORT,			"IP Port" },
292  	{ FC_PORT_ROLE_FCP_DUMMY_INITIATOR,	"FCP Dummy Initiator" },
293  	{ FC_PORT_ROLE_NVME_INITIATOR,		"NVMe Initiator" },
294  	{ FC_PORT_ROLE_NVME_TARGET,		"NVMe Target" },
295  	{ FC_PORT_ROLE_NVME_DISCOVERY,		"NVMe Discovery" },
296  };
297  fc_bitfield_name_search(port_roles, fc_port_role_names)
298  
299  /*
300   * Define roles that are specific to port_id. Values are relative to ROLE_MASK.
301   */
302  #define FC_WELLKNOWN_PORTID_MASK	0xfffff0
303  #define FC_WELLKNOWN_ROLE_MASK  	0x00000f
304  #define FC_FPORT_PORTID			0x00000e
305  #define FC_FABCTLR_PORTID		0x00000d
306  #define FC_DIRSRVR_PORTID		0x00000c
307  #define FC_TIMESRVR_PORTID		0x00000b
308  #define FC_MGMTSRVR_PORTID		0x00000a
309  
310  
311  static void fc_timeout_deleted_rport(struct work_struct *work);
312  static void fc_timeout_fail_rport_io(struct work_struct *work);
313  static void fc_scsi_scan_rport(struct work_struct *work);
314  
315  /*
316   * Attribute counts pre object type...
317   * Increase these values if you add attributes
318   */
319  #define FC_STARGET_NUM_ATTRS 	3
320  #define FC_RPORT_NUM_ATTRS	10
321  #define FC_VPORT_NUM_ATTRS	9
322  #define FC_HOST_NUM_ATTRS	29
323  
324  struct fc_internal {
325  	struct scsi_transport_template t;
326  	struct fc_function_template *f;
327  
328  	/*
329  	 * For attributes : each object has :
330  	 *   An array of the actual attributes structures
331  	 *   An array of null-terminated pointers to the attribute
332  	 *     structures - used for mid-layer interaction.
333  	 *
334  	 * The attribute containers for the starget and host are are
335  	 * part of the midlayer. As the remote port is specific to the
336  	 * fc transport, we must provide the attribute container.
337  	 */
338  	struct device_attribute private_starget_attrs[
339  							FC_STARGET_NUM_ATTRS];
340  	struct device_attribute *starget_attrs[FC_STARGET_NUM_ATTRS + 1];
341  
342  	struct device_attribute private_host_attrs[FC_HOST_NUM_ATTRS];
343  	struct device_attribute *host_attrs[FC_HOST_NUM_ATTRS + 1];
344  
345  	struct transport_container rport_attr_cont;
346  	struct device_attribute private_rport_attrs[FC_RPORT_NUM_ATTRS];
347  	struct device_attribute *rport_attrs[FC_RPORT_NUM_ATTRS + 1];
348  
349  	struct transport_container vport_attr_cont;
350  	struct device_attribute private_vport_attrs[FC_VPORT_NUM_ATTRS];
351  	struct device_attribute *vport_attrs[FC_VPORT_NUM_ATTRS + 1];
352  };
353  
354  #define to_fc_internal(tmpl)	container_of(tmpl, struct fc_internal, t)
355  
fc_target_setup(struct transport_container * tc,struct device * dev,struct device * cdev)356  static int fc_target_setup(struct transport_container *tc, struct device *dev,
357  			   struct device *cdev)
358  {
359  	struct scsi_target *starget = to_scsi_target(dev);
360  	struct fc_rport *rport = starget_to_rport(starget);
361  
362  	/*
363  	 * if parent is remote port, use values from remote port.
364  	 * Otherwise, this host uses the fc_transport, but not the
365  	 * remote port interface. As such, initialize to known non-values.
366  	 */
367  	if (rport) {
368  		fc_starget_node_name(starget) = rport->node_name;
369  		fc_starget_port_name(starget) = rport->port_name;
370  		fc_starget_port_id(starget) = rport->port_id;
371  	} else {
372  		fc_starget_node_name(starget) = -1;
373  		fc_starget_port_name(starget) = -1;
374  		fc_starget_port_id(starget) = -1;
375  	}
376  
377  	return 0;
378  }
379  
380  static DECLARE_TRANSPORT_CLASS(fc_transport_class,
381  			       "fc_transport",
382  			       fc_target_setup,
383  			       NULL,
384  			       NULL);
385  
fc_host_setup(struct transport_container * tc,struct device * dev,struct device * cdev)386  static int fc_host_setup(struct transport_container *tc, struct device *dev,
387  			 struct device *cdev)
388  {
389  	struct Scsi_Host *shost = dev_to_shost(dev);
390  	struct fc_host_attrs *fc_host = shost_to_fc_host(shost);
391  
392  	/*
393  	 * Set default values easily detected by the midlayer as
394  	 * failure cases.  The scsi lldd is responsible for initializing
395  	 * all transport attributes to valid values per host.
396  	 */
397  	fc_host->node_name = -1;
398  	fc_host->port_name = -1;
399  	fc_host->permanent_port_name = -1;
400  	fc_host->supported_classes = FC_COS_UNSPECIFIED;
401  	memset(fc_host->supported_fc4s, 0,
402  		sizeof(fc_host->supported_fc4s));
403  	fc_host->supported_speeds = FC_PORTSPEED_UNKNOWN;
404  	fc_host->maxframe_size = -1;
405  	fc_host->max_npiv_vports = 0;
406  	memset(fc_host->serial_number, 0,
407  		sizeof(fc_host->serial_number));
408  	memset(fc_host->manufacturer, 0,
409  		sizeof(fc_host->manufacturer));
410  	memset(fc_host->model, 0,
411  		sizeof(fc_host->model));
412  	memset(fc_host->model_description, 0,
413  		sizeof(fc_host->model_description));
414  	memset(fc_host->hardware_version, 0,
415  		sizeof(fc_host->hardware_version));
416  	memset(fc_host->driver_version, 0,
417  		sizeof(fc_host->driver_version));
418  	memset(fc_host->firmware_version, 0,
419  		sizeof(fc_host->firmware_version));
420  	memset(fc_host->optionrom_version, 0,
421  		sizeof(fc_host->optionrom_version));
422  
423  	fc_host->port_id = -1;
424  	fc_host->port_type = FC_PORTTYPE_UNKNOWN;
425  	fc_host->port_state = FC_PORTSTATE_UNKNOWN;
426  	memset(fc_host->active_fc4s, 0,
427  		sizeof(fc_host->active_fc4s));
428  	fc_host->speed = FC_PORTSPEED_UNKNOWN;
429  	fc_host->fabric_name = -1;
430  	memset(fc_host->symbolic_name, 0, sizeof(fc_host->symbolic_name));
431  	memset(fc_host->system_hostname, 0, sizeof(fc_host->system_hostname));
432  	memset(&fc_host->fpin_stats, 0, sizeof(fc_host->fpin_stats));
433  
434  	fc_host->tgtid_bind_type = FC_TGTID_BIND_BY_WWPN;
435  
436  	INIT_LIST_HEAD(&fc_host->rports);
437  	INIT_LIST_HEAD(&fc_host->rport_bindings);
438  	INIT_LIST_HEAD(&fc_host->vports);
439  	fc_host->next_rport_number = 0;
440  	fc_host->next_target_id = 0;
441  	fc_host->next_vport_number = 0;
442  	fc_host->npiv_vports_inuse = 0;
443  
444  	snprintf(fc_host->work_q_name, sizeof(fc_host->work_q_name),
445  		 "fc_wq_%d", shost->host_no);
446  	fc_host->work_q = alloc_workqueue("%s", 0, 0, fc_host->work_q_name);
447  	if (!fc_host->work_q)
448  		return -ENOMEM;
449  
450  	fc_host->dev_loss_tmo = fc_dev_loss_tmo;
451  	snprintf(fc_host->devloss_work_q_name,
452  		 sizeof(fc_host->devloss_work_q_name),
453  		 "fc_dl_%d", shost->host_no);
454  	fc_host->devloss_work_q = alloc_workqueue("%s", 0, 0,
455  					fc_host->devloss_work_q_name);
456  	if (!fc_host->devloss_work_q) {
457  		destroy_workqueue(fc_host->work_q);
458  		fc_host->work_q = NULL;
459  		return -ENOMEM;
460  	}
461  
462  	fc_bsg_hostadd(shost, fc_host);
463  	/* ignore any bsg add error - we just can't do sgio */
464  
465  	return 0;
466  }
467  
fc_host_remove(struct transport_container * tc,struct device * dev,struct device * cdev)468  static int fc_host_remove(struct transport_container *tc, struct device *dev,
469  			 struct device *cdev)
470  {
471  	struct Scsi_Host *shost = dev_to_shost(dev);
472  	struct fc_host_attrs *fc_host = shost_to_fc_host(shost);
473  
474  	fc_bsg_remove(fc_host->rqst_q);
475  	return 0;
476  }
477  
478  static DECLARE_TRANSPORT_CLASS(fc_host_class,
479  			       "fc_host",
480  			       fc_host_setup,
481  			       fc_host_remove,
482  			       NULL);
483  
484  /*
485   * Setup and Remove actions for remote ports are handled
486   * in the service functions below.
487   */
488  static DECLARE_TRANSPORT_CLASS(fc_rport_class,
489  			       "fc_remote_ports",
490  			       NULL,
491  			       NULL,
492  			       NULL);
493  
494  /*
495   * Setup and Remove actions for virtual ports are handled
496   * in the service functions below.
497   */
498  static DECLARE_TRANSPORT_CLASS(fc_vport_class,
499  			       "fc_vports",
500  			       NULL,
501  			       NULL,
502  			       NULL);
503  
504  /*
505   * Netlink Infrastructure
506   */
507  
508  static atomic_t fc_event_seq;
509  
510  /**
511   * fc_get_event_number - Obtain the next sequential FC event number
512   *
513   * Notes:
514   *   We could have inlined this, but it would have required fc_event_seq to
515   *   be exposed. For now, live with the subroutine call.
516   *   Atomic used to avoid lock/unlock...
517   */
518  u32
fc_get_event_number(void)519  fc_get_event_number(void)
520  {
521  	return atomic_add_return(1, &fc_event_seq);
522  }
523  EXPORT_SYMBOL(fc_get_event_number);
524  
525  /**
526   * fc_host_post_fc_event - routine to do the work of posting an event
527   *                      on an fc_host.
528   * @shost:		host the event occurred on
529   * @event_number:	fc event number obtained from get_fc_event_number()
530   * @event_code:		fc_host event being posted
531   * @data_len:		amount, in bytes, of event data
532   * @data_buf:		pointer to event data
533   * @vendor_id:          value for Vendor id
534   *
535   * Notes:
536   *	This routine assumes no locks are held on entry.
537   */
538  void
fc_host_post_fc_event(struct Scsi_Host * shost,u32 event_number,enum fc_host_event_code event_code,u32 data_len,char * data_buf,u64 vendor_id)539  fc_host_post_fc_event(struct Scsi_Host *shost, u32 event_number,
540  		enum fc_host_event_code event_code,
541  		u32 data_len, char *data_buf, u64 vendor_id)
542  {
543  	struct sk_buff *skb;
544  	struct nlmsghdr	*nlh;
545  	struct fc_nl_event *event;
546  	const char *name;
547  	size_t len, padding;
548  	int err;
549  
550  	if (!data_buf || data_len < 4)
551  		data_len = 0;
552  
553  	if (!scsi_nl_sock) {
554  		err = -ENOENT;
555  		goto send_fail;
556  	}
557  
558  	len = FC_NL_MSGALIGN(sizeof(*event) - sizeof(event->event_data) + data_len);
559  
560  	skb = nlmsg_new(len, GFP_KERNEL);
561  	if (!skb) {
562  		err = -ENOBUFS;
563  		goto send_fail;
564  	}
565  
566  	nlh = nlmsg_put(skb, 0, 0, SCSI_TRANSPORT_MSG, len, 0);
567  	if (!nlh) {
568  		err = -ENOBUFS;
569  		goto send_fail_skb;
570  	}
571  	event = nlmsg_data(nlh);
572  
573  	INIT_SCSI_NL_HDR(&event->snlh, SCSI_NL_TRANSPORT_FC,
574  				FC_NL_ASYNC_EVENT, len);
575  	event->seconds = ktime_get_real_seconds();
576  	event->vendor_id = vendor_id;
577  	event->host_no = shost->host_no;
578  	event->event_datalen = data_len;	/* bytes */
579  	event->event_num = event_number;
580  	event->event_code = event_code;
581  	if (data_len)
582  		memcpy(event->event_data_flex, data_buf, data_len);
583  	padding = len - offsetof(typeof(*event), event_data_flex) - data_len;
584  	memset(event->event_data_flex + data_len, 0, padding);
585  
586  	nlmsg_multicast(scsi_nl_sock, skb, 0, SCSI_NL_GRP_FC_EVENTS,
587  			GFP_KERNEL);
588  	return;
589  
590  send_fail_skb:
591  	kfree_skb(skb);
592  send_fail:
593  	name = get_fc_host_event_code_name(event_code);
594  	printk(KERN_WARNING
595  		"%s: Dropped Event : host %d %s data 0x%08x - err %d\n",
596  		__func__, shost->host_no,
597  		(name) ? name : "<unknown>",
598  		(data_len) ? *((u32 *)data_buf) : 0xFFFFFFFF, err);
599  	return;
600  }
601  EXPORT_SYMBOL(fc_host_post_fc_event);
602  
603  /**
604   * fc_host_post_event - called to post an even on an fc_host.
605   * @shost:		host the event occurred on
606   * @event_number:	fc event number obtained from get_fc_event_number()
607   * @event_code:		fc_host event being posted
608   * @event_data:		32bits of data for the event being posted
609   *
610   * Notes:
611   *	This routine assumes no locks are held on entry.
612   */
613  void
fc_host_post_event(struct Scsi_Host * shost,u32 event_number,enum fc_host_event_code event_code,u32 event_data)614  fc_host_post_event(struct Scsi_Host *shost, u32 event_number,
615  		enum fc_host_event_code event_code, u32 event_data)
616  {
617  	fc_host_post_fc_event(shost, event_number, event_code,
618  		(u32)sizeof(u32), (char *)&event_data, 0);
619  }
620  EXPORT_SYMBOL(fc_host_post_event);
621  
622  
623  /**
624   * fc_host_post_vendor_event - called to post a vendor unique event
625   *                      on an fc_host
626   * @shost:		host the event occurred on
627   * @event_number:	fc event number obtained from get_fc_event_number()
628   * @data_len:		amount, in bytes, of vendor unique data
629   * @data_buf:		pointer to vendor unique data
630   * @vendor_id:          Vendor id
631   *
632   * Notes:
633   *	This routine assumes no locks are held on entry.
634   */
635  void
fc_host_post_vendor_event(struct Scsi_Host * shost,u32 event_number,u32 data_len,char * data_buf,u64 vendor_id)636  fc_host_post_vendor_event(struct Scsi_Host *shost, u32 event_number,
637  		u32 data_len, char * data_buf, u64 vendor_id)
638  {
639  	fc_host_post_fc_event(shost, event_number, FCH_EVT_VENDOR_UNIQUE,
640  		data_len, data_buf, vendor_id);
641  }
642  EXPORT_SYMBOL(fc_host_post_vendor_event);
643  
644  /**
645   * fc_find_rport_by_wwpn - find the fc_rport pointer for a given wwpn
646   * @shost:		host the fc_rport is associated with
647   * @wwpn:		wwpn of the fc_rport device
648   *
649   * Notes:
650   *	This routine assumes no locks are held on entry.
651   */
652  struct fc_rport *
fc_find_rport_by_wwpn(struct Scsi_Host * shost,u64 wwpn)653  fc_find_rport_by_wwpn(struct Scsi_Host *shost, u64 wwpn)
654  {
655  	struct fc_rport *rport;
656  	unsigned long flags;
657  
658  	spin_lock_irqsave(shost->host_lock, flags);
659  
660  	list_for_each_entry(rport, &fc_host_rports(shost), peers) {
661  		if (rport->port_state != FC_PORTSTATE_ONLINE)
662  			continue;
663  
664  		if (rport->port_name == wwpn) {
665  			spin_unlock_irqrestore(shost->host_lock, flags);
666  			return rport;
667  		}
668  	}
669  
670  	spin_unlock_irqrestore(shost->host_lock, flags);
671  	return NULL;
672  }
673  EXPORT_SYMBOL(fc_find_rport_by_wwpn);
674  
675  static void
fc_li_stats_update(u16 event_type,struct fc_fpin_stats * stats)676  fc_li_stats_update(u16 event_type,
677  		   struct fc_fpin_stats *stats)
678  {
679  	stats->li++;
680  	switch (event_type) {
681  	case FPIN_LI_UNKNOWN:
682  		stats->li_failure_unknown++;
683  		break;
684  	case FPIN_LI_LINK_FAILURE:
685  		stats->li_link_failure_count++;
686  		break;
687  	case FPIN_LI_LOSS_OF_SYNC:
688  		stats->li_loss_of_sync_count++;
689  		break;
690  	case FPIN_LI_LOSS_OF_SIG:
691  		stats->li_loss_of_signals_count++;
692  		break;
693  	case FPIN_LI_PRIM_SEQ_ERR:
694  		stats->li_prim_seq_err_count++;
695  		break;
696  	case FPIN_LI_INVALID_TX_WD:
697  		stats->li_invalid_tx_word_count++;
698  		break;
699  	case FPIN_LI_INVALID_CRC:
700  		stats->li_invalid_crc_count++;
701  		break;
702  	case FPIN_LI_DEVICE_SPEC:
703  		stats->li_device_specific++;
704  		break;
705  	}
706  }
707  
708  static void
fc_delivery_stats_update(u32 reason_code,struct fc_fpin_stats * stats)709  fc_delivery_stats_update(u32 reason_code, struct fc_fpin_stats *stats)
710  {
711  	stats->dn++;
712  	switch (reason_code) {
713  	case FPIN_DELI_UNKNOWN:
714  		stats->dn_unknown++;
715  		break;
716  	case FPIN_DELI_TIMEOUT:
717  		stats->dn_timeout++;
718  		break;
719  	case FPIN_DELI_UNABLE_TO_ROUTE:
720  		stats->dn_unable_to_route++;
721  		break;
722  	case FPIN_DELI_DEVICE_SPEC:
723  		stats->dn_device_specific++;
724  		break;
725  	}
726  }
727  
728  static void
fc_cn_stats_update(u16 event_type,struct fc_fpin_stats * stats)729  fc_cn_stats_update(u16 event_type, struct fc_fpin_stats *stats)
730  {
731  	stats->cn++;
732  	switch (event_type) {
733  	case FPIN_CONGN_CLEAR:
734  		stats->cn_clear++;
735  		break;
736  	case FPIN_CONGN_LOST_CREDIT:
737  		stats->cn_lost_credit++;
738  		break;
739  	case FPIN_CONGN_CREDIT_STALL:
740  		stats->cn_credit_stall++;
741  		break;
742  	case FPIN_CONGN_OVERSUBSCRIPTION:
743  		stats->cn_oversubscription++;
744  		break;
745  	case FPIN_CONGN_DEVICE_SPEC:
746  		stats->cn_device_specific++;
747  	}
748  }
749  
750  /*
751   * fc_fpin_li_stats_update - routine to update Link Integrity
752   * event statistics.
753   * @shost:		host the FPIN was received on
754   * @tlv:		pointer to link integrity descriptor
755   *
756   */
757  static void
fc_fpin_li_stats_update(struct Scsi_Host * shost,struct fc_tlv_desc * tlv)758  fc_fpin_li_stats_update(struct Scsi_Host *shost, struct fc_tlv_desc *tlv)
759  {
760  	u8 i;
761  	struct fc_rport *rport = NULL;
762  	struct fc_rport *attach_rport = NULL;
763  	struct fc_host_attrs *fc_host = shost_to_fc_host(shost);
764  	struct fc_fn_li_desc *li_desc = (struct fc_fn_li_desc *)tlv;
765  	u16 event_type = be16_to_cpu(li_desc->event_type);
766  	u64 wwpn;
767  
768  	rport = fc_find_rport_by_wwpn(shost,
769  				      be64_to_cpu(li_desc->attached_wwpn));
770  	if (rport &&
771  	    (rport->roles & FC_PORT_ROLE_FCP_TARGET ||
772  	     rport->roles & FC_PORT_ROLE_NVME_TARGET)) {
773  		attach_rport = rport;
774  		fc_li_stats_update(event_type, &attach_rport->fpin_stats);
775  	}
776  
777  	if (be32_to_cpu(li_desc->pname_count) > 0) {
778  		for (i = 0;
779  		    i < be32_to_cpu(li_desc->pname_count);
780  		    i++) {
781  			wwpn = be64_to_cpu(li_desc->pname_list[i]);
782  			rport = fc_find_rport_by_wwpn(shost, wwpn);
783  			if (rport &&
784  			    (rport->roles & FC_PORT_ROLE_FCP_TARGET ||
785  			    rport->roles & FC_PORT_ROLE_NVME_TARGET)) {
786  				if (rport == attach_rport)
787  					continue;
788  				fc_li_stats_update(event_type,
789  						   &rport->fpin_stats);
790  			}
791  		}
792  	}
793  
794  	if (fc_host->port_name == be64_to_cpu(li_desc->attached_wwpn))
795  		fc_li_stats_update(event_type, &fc_host->fpin_stats);
796  }
797  
798  /*
799   * fc_fpin_delivery_stats_update - routine to update Delivery Notification
800   * event statistics.
801   * @shost:		host the FPIN was received on
802   * @tlv:		pointer to delivery descriptor
803   *
804   */
805  static void
fc_fpin_delivery_stats_update(struct Scsi_Host * shost,struct fc_tlv_desc * tlv)806  fc_fpin_delivery_stats_update(struct Scsi_Host *shost,
807  			      struct fc_tlv_desc *tlv)
808  {
809  	struct fc_rport *rport = NULL;
810  	struct fc_rport *attach_rport = NULL;
811  	struct fc_host_attrs *fc_host = shost_to_fc_host(shost);
812  	struct fc_fn_deli_desc *dn_desc = (struct fc_fn_deli_desc *)tlv;
813  	u32 reason_code = be32_to_cpu(dn_desc->deli_reason_code);
814  
815  	rport = fc_find_rport_by_wwpn(shost,
816  				      be64_to_cpu(dn_desc->attached_wwpn));
817  	if (rport &&
818  	    (rport->roles & FC_PORT_ROLE_FCP_TARGET ||
819  	     rport->roles & FC_PORT_ROLE_NVME_TARGET)) {
820  		attach_rport = rport;
821  		fc_delivery_stats_update(reason_code,
822  					 &attach_rport->fpin_stats);
823  	}
824  
825  	if (fc_host->port_name == be64_to_cpu(dn_desc->attached_wwpn))
826  		fc_delivery_stats_update(reason_code, &fc_host->fpin_stats);
827  }
828  
829  /*
830   * fc_fpin_peer_congn_stats_update - routine to update Peer Congestion
831   * event statistics.
832   * @shost:		host the FPIN was received on
833   * @tlv:		pointer to peer congestion descriptor
834   *
835   */
836  static void
fc_fpin_peer_congn_stats_update(struct Scsi_Host * shost,struct fc_tlv_desc * tlv)837  fc_fpin_peer_congn_stats_update(struct Scsi_Host *shost,
838  				struct fc_tlv_desc *tlv)
839  {
840  	u8 i;
841  	struct fc_rport *rport = NULL;
842  	struct fc_rport *attach_rport = NULL;
843  	struct fc_fn_peer_congn_desc *pc_desc =
844  	    (struct fc_fn_peer_congn_desc *)tlv;
845  	u16 event_type = be16_to_cpu(pc_desc->event_type);
846  	u64 wwpn;
847  
848  	rport = fc_find_rport_by_wwpn(shost,
849  				      be64_to_cpu(pc_desc->attached_wwpn));
850  	if (rport &&
851  	    (rport->roles & FC_PORT_ROLE_FCP_TARGET ||
852  	     rport->roles & FC_PORT_ROLE_NVME_TARGET)) {
853  		attach_rport = rport;
854  		fc_cn_stats_update(event_type, &attach_rport->fpin_stats);
855  	}
856  
857  	if (be32_to_cpu(pc_desc->pname_count) > 0) {
858  		for (i = 0;
859  		    i < be32_to_cpu(pc_desc->pname_count);
860  		    i++) {
861  			wwpn = be64_to_cpu(pc_desc->pname_list[i]);
862  			rport = fc_find_rport_by_wwpn(shost, wwpn);
863  			if (rport &&
864  			    (rport->roles & FC_PORT_ROLE_FCP_TARGET ||
865  			     rport->roles & FC_PORT_ROLE_NVME_TARGET)) {
866  				if (rport == attach_rport)
867  					continue;
868  				fc_cn_stats_update(event_type,
869  						   &rport->fpin_stats);
870  			}
871  		}
872  	}
873  }
874  
875  /*
876   * fc_fpin_congn_stats_update - routine to update Congestion
877   * event statistics.
878   * @shost:		host the FPIN was received on
879   * @tlv:		pointer to congestion descriptor
880   *
881   */
882  static void
fc_fpin_congn_stats_update(struct Scsi_Host * shost,struct fc_tlv_desc * tlv)883  fc_fpin_congn_stats_update(struct Scsi_Host *shost,
884  			   struct fc_tlv_desc *tlv)
885  {
886  	struct fc_host_attrs *fc_host = shost_to_fc_host(shost);
887  	struct fc_fn_congn_desc *congn = (struct fc_fn_congn_desc *)tlv;
888  
889  	fc_cn_stats_update(be16_to_cpu(congn->event_type),
890  			   &fc_host->fpin_stats);
891  }
892  
893  /**
894   * fc_host_fpin_rcv - routine to process a received FPIN.
895   * @shost:		host the FPIN was received on
896   * @fpin_len:		length of FPIN payload, in bytes
897   * @fpin_buf:		pointer to FPIN payload
898   * @event_acknowledge:	1, if LLDD handles this event.
899   * Notes:
900   *	This routine assumes no locks are held on entry.
901   */
902  void
fc_host_fpin_rcv(struct Scsi_Host * shost,u32 fpin_len,char * fpin_buf,u8 event_acknowledge)903  fc_host_fpin_rcv(struct Scsi_Host *shost, u32 fpin_len, char *fpin_buf,
904  		u8 event_acknowledge)
905  {
906  	struct fc_els_fpin *fpin = (struct fc_els_fpin *)fpin_buf;
907  	struct fc_tlv_desc *tlv;
908  	u32 bytes_remain;
909  	u32 dtag;
910  	enum fc_host_event_code event_code =
911  		event_acknowledge ? FCH_EVT_LINK_FPIN_ACK : FCH_EVT_LINK_FPIN;
912  
913  	/* Update Statistics */
914  	tlv = (struct fc_tlv_desc *)&fpin->fpin_desc[0];
915  	bytes_remain = fpin_len - offsetof(struct fc_els_fpin, fpin_desc);
916  	bytes_remain = min_t(u32, bytes_remain, be32_to_cpu(fpin->desc_len));
917  
918  	while (bytes_remain >= FC_TLV_DESC_HDR_SZ &&
919  	       bytes_remain >= FC_TLV_DESC_SZ_FROM_LENGTH(tlv)) {
920  		dtag = be32_to_cpu(tlv->desc_tag);
921  		switch (dtag) {
922  		case ELS_DTAG_LNK_INTEGRITY:
923  			fc_fpin_li_stats_update(shost, tlv);
924  			break;
925  		case ELS_DTAG_DELIVERY:
926  			fc_fpin_delivery_stats_update(shost, tlv);
927  			break;
928  		case ELS_DTAG_PEER_CONGEST:
929  			fc_fpin_peer_congn_stats_update(shost, tlv);
930  			break;
931  		case ELS_DTAG_CONGESTION:
932  			fc_fpin_congn_stats_update(shost, tlv);
933  		}
934  
935  		bytes_remain -= FC_TLV_DESC_SZ_FROM_LENGTH(tlv);
936  		tlv = fc_tlv_next_desc(tlv);
937  	}
938  
939  	fc_host_post_fc_event(shost, fc_get_event_number(),
940  				event_code, fpin_len, fpin_buf, 0);
941  }
942  EXPORT_SYMBOL(fc_host_fpin_rcv);
943  
944  
fc_transport_init(void)945  static __init int fc_transport_init(void)
946  {
947  	int error;
948  
949  	atomic_set(&fc_event_seq, 0);
950  
951  	error = transport_class_register(&fc_host_class);
952  	if (error)
953  		return error;
954  	error = transport_class_register(&fc_vport_class);
955  	if (error)
956  		goto unreg_host_class;
957  	error = transport_class_register(&fc_rport_class);
958  	if (error)
959  		goto unreg_vport_class;
960  	error = transport_class_register(&fc_transport_class);
961  	if (error)
962  		goto unreg_rport_class;
963  	return 0;
964  
965  unreg_rport_class:
966  	transport_class_unregister(&fc_rport_class);
967  unreg_vport_class:
968  	transport_class_unregister(&fc_vport_class);
969  unreg_host_class:
970  	transport_class_unregister(&fc_host_class);
971  	return error;
972  }
973  
fc_transport_exit(void)974  static void __exit fc_transport_exit(void)
975  {
976  	transport_class_unregister(&fc_transport_class);
977  	transport_class_unregister(&fc_rport_class);
978  	transport_class_unregister(&fc_host_class);
979  	transport_class_unregister(&fc_vport_class);
980  }
981  
982  /*
983   * FC Remote Port Attribute Management
984   */
985  
986  #define fc_rport_show_function(field, format_string, sz, cast)		\
987  static ssize_t								\
988  show_fc_rport_##field (struct device *dev, 				\
989  		       struct device_attribute *attr, char *buf)	\
990  {									\
991  	struct fc_rport *rport = transport_class_to_rport(dev);		\
992  	struct Scsi_Host *shost = rport_to_shost(rport);		\
993  	struct fc_internal *i = to_fc_internal(shost->transportt);	\
994  	if ((i->f->get_rport_##field) &&				\
995  	    !((rport->port_state == FC_PORTSTATE_BLOCKED) ||		\
996  	      (rport->port_state == FC_PORTSTATE_DELETED) ||		\
997  	      (rport->port_state == FC_PORTSTATE_NOTPRESENT)))		\
998  		i->f->get_rport_##field(rport);				\
999  	return snprintf(buf, sz, format_string, cast rport->field); 	\
1000  }
1001  
1002  #define fc_rport_store_function(field)					\
1003  static ssize_t								\
1004  store_fc_rport_##field(struct device *dev,				\
1005  		       struct device_attribute *attr,			\
1006  		       const char *buf,	size_t count)			\
1007  {									\
1008  	int val;							\
1009  	struct fc_rport *rport = transport_class_to_rport(dev);		\
1010  	struct Scsi_Host *shost = rport_to_shost(rport);		\
1011  	struct fc_internal *i = to_fc_internal(shost->transportt);	\
1012  	char *cp;							\
1013  	if ((rport->port_state == FC_PORTSTATE_BLOCKED) ||		\
1014  	    (rport->port_state == FC_PORTSTATE_DELETED) ||		\
1015  	    (rport->port_state == FC_PORTSTATE_NOTPRESENT))		\
1016  		return -EBUSY;						\
1017  	val = simple_strtoul(buf, &cp, 0);				\
1018  	if (*cp && (*cp != '\n'))					\
1019  		return -EINVAL;						\
1020  	i->f->set_rport_##field(rport, val);				\
1021  	return count;							\
1022  }
1023  
1024  #define fc_rport_rd_attr(field, format_string, sz)			\
1025  	fc_rport_show_function(field, format_string, sz, )		\
1026  static FC_DEVICE_ATTR(rport, field, S_IRUGO,			\
1027  			 show_fc_rport_##field, NULL)
1028  
1029  #define fc_rport_rd_attr_cast(field, format_string, sz, cast)		\
1030  	fc_rport_show_function(field, format_string, sz, (cast))	\
1031  static FC_DEVICE_ATTR(rport, field, S_IRUGO,			\
1032  			  show_fc_rport_##field, NULL)
1033  
1034  #define fc_rport_rw_attr(field, format_string, sz)			\
1035  	fc_rport_show_function(field, format_string, sz, )		\
1036  	fc_rport_store_function(field)					\
1037  static FC_DEVICE_ATTR(rport, field, S_IRUGO | S_IWUSR,		\
1038  			show_fc_rport_##field,				\
1039  			store_fc_rport_##field)
1040  
1041  
1042  #define fc_private_rport_show_function(field, format_string, sz, cast)	\
1043  static ssize_t								\
1044  show_fc_rport_##field (struct device *dev, 				\
1045  		       struct device_attribute *attr, char *buf)	\
1046  {									\
1047  	struct fc_rport *rport = transport_class_to_rport(dev);		\
1048  	return snprintf(buf, sz, format_string, cast rport->field); 	\
1049  }
1050  
1051  #define fc_private_rport_rd_attr(field, format_string, sz)		\
1052  	fc_private_rport_show_function(field, format_string, sz, )	\
1053  static FC_DEVICE_ATTR(rport, field, S_IRUGO,			\
1054  			 show_fc_rport_##field, NULL)
1055  
1056  #define fc_private_rport_rd_attr_cast(field, format_string, sz, cast)	\
1057  	fc_private_rport_show_function(field, format_string, sz, (cast)) \
1058  static FC_DEVICE_ATTR(rport, field, S_IRUGO,			\
1059  			  show_fc_rport_##field, NULL)
1060  
1061  
1062  #define fc_private_rport_rd_enum_attr(title, maxlen)			\
1063  static ssize_t								\
1064  show_fc_rport_##title (struct device *dev,				\
1065  		       struct device_attribute *attr, char *buf)	\
1066  {									\
1067  	struct fc_rport *rport = transport_class_to_rport(dev);		\
1068  	const char *name;						\
1069  	name = get_fc_##title##_name(rport->title);			\
1070  	if (!name)							\
1071  		return -EINVAL;						\
1072  	return snprintf(buf, maxlen, "%s\n", name);			\
1073  }									\
1074  static FC_DEVICE_ATTR(rport, title, S_IRUGO,			\
1075  			show_fc_rport_##title, NULL)
1076  
1077  
1078  #define SETUP_RPORT_ATTRIBUTE_RD(field)					\
1079  	i->private_rport_attrs[count] = device_attr_rport_##field; \
1080  	i->private_rport_attrs[count].attr.mode = S_IRUGO;		\
1081  	i->private_rport_attrs[count].store = NULL;			\
1082  	i->rport_attrs[count] = &i->private_rport_attrs[count];		\
1083  	if (i->f->show_rport_##field)					\
1084  		count++
1085  
1086  #define SETUP_PRIVATE_RPORT_ATTRIBUTE_RD(field)				\
1087  	i->private_rport_attrs[count] = device_attr_rport_##field; \
1088  	i->private_rport_attrs[count].attr.mode = S_IRUGO;		\
1089  	i->private_rport_attrs[count].store = NULL;			\
1090  	i->rport_attrs[count] = &i->private_rport_attrs[count];		\
1091  	count++
1092  
1093  #define SETUP_RPORT_ATTRIBUTE_RW(field)					\
1094  	i->private_rport_attrs[count] = device_attr_rport_##field; \
1095  	if (!i->f->set_rport_##field) {					\
1096  		i->private_rport_attrs[count].attr.mode = S_IRUGO;	\
1097  		i->private_rport_attrs[count].store = NULL;		\
1098  	}								\
1099  	i->rport_attrs[count] = &i->private_rport_attrs[count];		\
1100  	if (i->f->show_rport_##field)					\
1101  		count++
1102  
1103  #define SETUP_PRIVATE_RPORT_ATTRIBUTE_RW(field)				\
1104  {									\
1105  	i->private_rport_attrs[count] = device_attr_rport_##field; \
1106  	i->rport_attrs[count] = &i->private_rport_attrs[count];		\
1107  	count++;							\
1108  }
1109  
1110  
1111  /* The FC Transport Remote Port Attributes: */
1112  
1113  /* Fixed Remote Port Attributes */
1114  
1115  fc_private_rport_rd_attr(maxframe_size, "%u bytes\n", 20);
1116  
1117  static ssize_t
show_fc_rport_supported_classes(struct device * dev,struct device_attribute * attr,char * buf)1118  show_fc_rport_supported_classes (struct device *dev,
1119  				 struct device_attribute *attr, char *buf)
1120  {
1121  	struct fc_rport *rport = transport_class_to_rport(dev);
1122  	if (rport->supported_classes == FC_COS_UNSPECIFIED)
1123  		return snprintf(buf, 20, "unspecified\n");
1124  	return get_fc_cos_names(rport->supported_classes, buf);
1125  }
1126  static FC_DEVICE_ATTR(rport, supported_classes, S_IRUGO,
1127  		show_fc_rport_supported_classes, NULL);
1128  
1129  /* Dynamic Remote Port Attributes */
1130  
1131  /*
1132   * dev_loss_tmo attribute
1133   */
fc_str_to_dev_loss(const char * buf,unsigned long * val)1134  static int fc_str_to_dev_loss(const char *buf, unsigned long *val)
1135  {
1136  	char *cp;
1137  
1138  	*val = simple_strtoul(buf, &cp, 0);
1139  	if (*cp && (*cp != '\n'))
1140  		return -EINVAL;
1141  	/*
1142  	 * Check for overflow; dev_loss_tmo is u32
1143  	 */
1144  	if (*val > UINT_MAX)
1145  		return -EINVAL;
1146  
1147  	return 0;
1148  }
1149  
fc_rport_set_dev_loss_tmo(struct fc_rport * rport,unsigned long val)1150  static int fc_rport_set_dev_loss_tmo(struct fc_rport *rport,
1151  				     unsigned long val)
1152  {
1153  	struct Scsi_Host *shost = rport_to_shost(rport);
1154  	struct fc_internal *i = to_fc_internal(shost->transportt);
1155  
1156  	if ((rport->port_state == FC_PORTSTATE_BLOCKED) ||
1157  	    (rport->port_state == FC_PORTSTATE_DELETED) ||
1158  	    (rport->port_state == FC_PORTSTATE_NOTPRESENT))
1159  		return -EBUSY;
1160  	/*
1161  	 * Check for overflow; dev_loss_tmo is u32
1162  	 */
1163  	if (val > UINT_MAX)
1164  		return -EINVAL;
1165  
1166  	/*
1167  	 * If fast_io_fail is off we have to cap
1168  	 * dev_loss_tmo at SCSI_DEVICE_BLOCK_MAX_TIMEOUT
1169  	 */
1170  	if (rport->fast_io_fail_tmo == -1 &&
1171  	    val > SCSI_DEVICE_BLOCK_MAX_TIMEOUT)
1172  		return -EINVAL;
1173  
1174  	i->f->set_rport_dev_loss_tmo(rport, val);
1175  	return 0;
1176  }
1177  
1178  fc_rport_show_function(dev_loss_tmo, "%u\n", 20, )
1179  static ssize_t
store_fc_rport_dev_loss_tmo(struct device * dev,struct device_attribute * attr,const char * buf,size_t count)1180  store_fc_rport_dev_loss_tmo(struct device *dev, struct device_attribute *attr,
1181  			    const char *buf, size_t count)
1182  {
1183  	struct fc_rport *rport = transport_class_to_rport(dev);
1184  	unsigned long val;
1185  	int rc;
1186  
1187  	rc = fc_str_to_dev_loss(buf, &val);
1188  	if (rc)
1189  		return rc;
1190  
1191  	rc = fc_rport_set_dev_loss_tmo(rport, val);
1192  	if (rc)
1193  		return rc;
1194  	return count;
1195  }
1196  static FC_DEVICE_ATTR(rport, dev_loss_tmo, S_IRUGO | S_IWUSR,
1197  		show_fc_rport_dev_loss_tmo, store_fc_rport_dev_loss_tmo);
1198  
1199  
1200  /* Private Remote Port Attributes */
1201  
1202  fc_private_rport_rd_attr_cast(node_name, "0x%llx\n", 20, unsigned long long);
1203  fc_private_rport_rd_attr_cast(port_name, "0x%llx\n", 20, unsigned long long);
1204  fc_private_rport_rd_attr(port_id, "0x%06x\n", 20);
1205  
1206  static ssize_t
show_fc_rport_roles(struct device * dev,struct device_attribute * attr,char * buf)1207  show_fc_rport_roles (struct device *dev, struct device_attribute *attr,
1208  		     char *buf)
1209  {
1210  	struct fc_rport *rport = transport_class_to_rport(dev);
1211  
1212  	/* identify any roles that are port_id specific */
1213  	if ((rport->port_id != -1) &&
1214  	    (rport->port_id & FC_WELLKNOWN_PORTID_MASK) ==
1215  					FC_WELLKNOWN_PORTID_MASK) {
1216  		switch (rport->port_id & FC_WELLKNOWN_ROLE_MASK) {
1217  		case FC_FPORT_PORTID:
1218  			return snprintf(buf, 30, "Fabric Port\n");
1219  		case FC_FABCTLR_PORTID:
1220  			return snprintf(buf, 30, "Fabric Controller\n");
1221  		case FC_DIRSRVR_PORTID:
1222  			return snprintf(buf, 30, "Directory Server\n");
1223  		case FC_TIMESRVR_PORTID:
1224  			return snprintf(buf, 30, "Time Server\n");
1225  		case FC_MGMTSRVR_PORTID:
1226  			return snprintf(buf, 30, "Management Server\n");
1227  		default:
1228  			return snprintf(buf, 30, "Unknown Fabric Entity\n");
1229  		}
1230  	} else {
1231  		if (rport->roles == FC_PORT_ROLE_UNKNOWN)
1232  			return snprintf(buf, 20, "unknown\n");
1233  		return get_fc_port_roles_names(rport->roles, buf);
1234  	}
1235  }
1236  static FC_DEVICE_ATTR(rport, roles, S_IRUGO,
1237  		show_fc_rport_roles, NULL);
1238  
fc_rport_set_marginal_state(struct device * dev,struct device_attribute * attr,const char * buf,size_t count)1239  static ssize_t fc_rport_set_marginal_state(struct device *dev,
1240  						struct device_attribute *attr,
1241  						const char *buf, size_t count)
1242  {
1243  	struct fc_rport *rport = transport_class_to_rport(dev);
1244  	enum fc_port_state port_state;
1245  	int ret = 0;
1246  
1247  	ret = get_fc_port_state_match(buf, &port_state);
1248  	if (ret)
1249  		return -EINVAL;
1250  	if (port_state == FC_PORTSTATE_MARGINAL) {
1251  		/*
1252  		 * Change the state to Marginal only if the
1253  		 * current rport state is Online
1254  		 * Allow only Online->Marginal
1255  		 */
1256  		if (rport->port_state == FC_PORTSTATE_ONLINE)
1257  			rport->port_state = port_state;
1258  		else if (port_state != rport->port_state)
1259  			return -EINVAL;
1260  	} else if (port_state == FC_PORTSTATE_ONLINE) {
1261  		/*
1262  		 * Change the state to Online only if the
1263  		 * current rport state is Marginal
1264  		 * Allow only Marginal->Online
1265  		 */
1266  		if (rport->port_state == FC_PORTSTATE_MARGINAL)
1267  			rport->port_state = port_state;
1268  		else if (port_state != rport->port_state)
1269  			return -EINVAL;
1270  	} else
1271  		return -EINVAL;
1272  	return count;
1273  }
1274  
1275  static ssize_t
show_fc_rport_port_state(struct device * dev,struct device_attribute * attr,char * buf)1276  show_fc_rport_port_state(struct device *dev,
1277  				struct device_attribute *attr, char *buf)
1278  {
1279  	const char *name;
1280  	struct fc_rport *rport = transport_class_to_rport(dev);
1281  
1282  	name = get_fc_port_state_name(rport->port_state);
1283  	if (!name)
1284  		return -EINVAL;
1285  
1286  	return snprintf(buf, 20, "%s\n", name);
1287  }
1288  
1289  static FC_DEVICE_ATTR(rport, port_state, 0444 | 0200,
1290  			show_fc_rport_port_state, fc_rport_set_marginal_state);
1291  
1292  fc_private_rport_rd_attr(scsi_target_id, "%d\n", 20);
1293  
1294  /*
1295   * fast_io_fail_tmo attribute
1296   */
1297  static ssize_t
show_fc_rport_fast_io_fail_tmo(struct device * dev,struct device_attribute * attr,char * buf)1298  show_fc_rport_fast_io_fail_tmo (struct device *dev,
1299  				struct device_attribute *attr, char *buf)
1300  {
1301  	struct fc_rport *rport = transport_class_to_rport(dev);
1302  
1303  	if (rport->fast_io_fail_tmo == -1)
1304  		return snprintf(buf, 5, "off\n");
1305  	return snprintf(buf, 20, "%d\n", rport->fast_io_fail_tmo);
1306  }
1307  
1308  static ssize_t
store_fc_rport_fast_io_fail_tmo(struct device * dev,struct device_attribute * attr,const char * buf,size_t count)1309  store_fc_rport_fast_io_fail_tmo(struct device *dev,
1310  				struct device_attribute *attr, const char *buf,
1311  				size_t count)
1312  {
1313  	int val;
1314  	char *cp;
1315  	struct fc_rport *rport = transport_class_to_rport(dev);
1316  
1317  	if ((rport->port_state == FC_PORTSTATE_BLOCKED) ||
1318  	    (rport->port_state == FC_PORTSTATE_DELETED) ||
1319  	    (rport->port_state == FC_PORTSTATE_NOTPRESENT))
1320  		return -EBUSY;
1321  	if (strncmp(buf, "off", 3) == 0)
1322  		rport->fast_io_fail_tmo = -1;
1323  	else {
1324  		val = simple_strtoul(buf, &cp, 0);
1325  		if ((*cp && (*cp != '\n')) || (val < 0))
1326  			return -EINVAL;
1327  		/*
1328  		 * Cap fast_io_fail by dev_loss_tmo or
1329  		 * SCSI_DEVICE_BLOCK_MAX_TIMEOUT.
1330  		 */
1331  		if ((val >= rport->dev_loss_tmo) ||
1332  		    (val > SCSI_DEVICE_BLOCK_MAX_TIMEOUT))
1333  			return -EINVAL;
1334  
1335  		rport->fast_io_fail_tmo = val;
1336  	}
1337  	return count;
1338  }
1339  static FC_DEVICE_ATTR(rport, fast_io_fail_tmo, S_IRUGO | S_IWUSR,
1340  	show_fc_rport_fast_io_fail_tmo, store_fc_rport_fast_io_fail_tmo);
1341  
1342  #define fc_rport_fpin_statistic(name)					\
1343  static ssize_t fc_rport_fpinstat_##name(struct device *cd,		\
1344  				  struct device_attribute *attr,	\
1345  				  char *buf)				\
1346  {									\
1347  	struct fc_rport *rport = transport_class_to_rport(cd);		\
1348  									\
1349  	return snprintf(buf, 20, "0x%llx\n", rport->fpin_stats.name);	\
1350  }									\
1351  static FC_DEVICE_ATTR(rport, fpin_##name, 0444, fc_rport_fpinstat_##name, NULL)
1352  
1353  fc_rport_fpin_statistic(dn);
1354  fc_rport_fpin_statistic(dn_unknown);
1355  fc_rport_fpin_statistic(dn_timeout);
1356  fc_rport_fpin_statistic(dn_unable_to_route);
1357  fc_rport_fpin_statistic(dn_device_specific);
1358  fc_rport_fpin_statistic(cn);
1359  fc_rport_fpin_statistic(cn_clear);
1360  fc_rport_fpin_statistic(cn_lost_credit);
1361  fc_rport_fpin_statistic(cn_credit_stall);
1362  fc_rport_fpin_statistic(cn_oversubscription);
1363  fc_rport_fpin_statistic(cn_device_specific);
1364  fc_rport_fpin_statistic(li);
1365  fc_rport_fpin_statistic(li_failure_unknown);
1366  fc_rport_fpin_statistic(li_link_failure_count);
1367  fc_rport_fpin_statistic(li_loss_of_sync_count);
1368  fc_rport_fpin_statistic(li_loss_of_signals_count);
1369  fc_rport_fpin_statistic(li_prim_seq_err_count);
1370  fc_rport_fpin_statistic(li_invalid_tx_word_count);
1371  fc_rport_fpin_statistic(li_invalid_crc_count);
1372  fc_rport_fpin_statistic(li_device_specific);
1373  
1374  static struct attribute *fc_rport_statistics_attrs[] = {
1375  	&device_attr_rport_fpin_dn.attr,
1376  	&device_attr_rport_fpin_dn_unknown.attr,
1377  	&device_attr_rport_fpin_dn_timeout.attr,
1378  	&device_attr_rport_fpin_dn_unable_to_route.attr,
1379  	&device_attr_rport_fpin_dn_device_specific.attr,
1380  	&device_attr_rport_fpin_li.attr,
1381  	&device_attr_rport_fpin_li_failure_unknown.attr,
1382  	&device_attr_rport_fpin_li_link_failure_count.attr,
1383  	&device_attr_rport_fpin_li_loss_of_sync_count.attr,
1384  	&device_attr_rport_fpin_li_loss_of_signals_count.attr,
1385  	&device_attr_rport_fpin_li_prim_seq_err_count.attr,
1386  	&device_attr_rport_fpin_li_invalid_tx_word_count.attr,
1387  	&device_attr_rport_fpin_li_invalid_crc_count.attr,
1388  	&device_attr_rport_fpin_li_device_specific.attr,
1389  	&device_attr_rport_fpin_cn.attr,
1390  	&device_attr_rport_fpin_cn_clear.attr,
1391  	&device_attr_rport_fpin_cn_lost_credit.attr,
1392  	&device_attr_rport_fpin_cn_credit_stall.attr,
1393  	&device_attr_rport_fpin_cn_oversubscription.attr,
1394  	&device_attr_rport_fpin_cn_device_specific.attr,
1395  	NULL
1396  };
1397  
1398  static struct attribute_group fc_rport_statistics_group = {
1399  	.name = "statistics",
1400  	.attrs = fc_rport_statistics_attrs,
1401  };
1402  
1403  
1404  /*
1405   * FC SCSI Target Attribute Management
1406   */
1407  
1408  /*
1409   * Note: in the target show function we recognize when the remote
1410   *  port is in the hierarchy and do not allow the driver to get
1411   *  involved in sysfs functions. The driver only gets involved if
1412   *  it's the "old" style that doesn't use rports.
1413   */
1414  #define fc_starget_show_function(field, format_string, sz, cast)	\
1415  static ssize_t								\
1416  show_fc_starget_##field (struct device *dev, 				\
1417  			 struct device_attribute *attr, char *buf)	\
1418  {									\
1419  	struct scsi_target *starget = transport_class_to_starget(dev);	\
1420  	struct Scsi_Host *shost = dev_to_shost(starget->dev.parent);	\
1421  	struct fc_internal *i = to_fc_internal(shost->transportt);	\
1422  	struct fc_rport *rport = starget_to_rport(starget);		\
1423  	if (rport)							\
1424  		fc_starget_##field(starget) = rport->field;		\
1425  	else if (i->f->get_starget_##field)				\
1426  		i->f->get_starget_##field(starget);			\
1427  	return snprintf(buf, sz, format_string, 			\
1428  		cast fc_starget_##field(starget)); 			\
1429  }
1430  
1431  #define fc_starget_rd_attr(field, format_string, sz)			\
1432  	fc_starget_show_function(field, format_string, sz, )		\
1433  static FC_DEVICE_ATTR(starget, field, S_IRUGO,			\
1434  			 show_fc_starget_##field, NULL)
1435  
1436  #define fc_starget_rd_attr_cast(field, format_string, sz, cast)		\
1437  	fc_starget_show_function(field, format_string, sz, (cast))	\
1438  static FC_DEVICE_ATTR(starget, field, S_IRUGO,			\
1439  			  show_fc_starget_##field, NULL)
1440  
1441  #define SETUP_STARGET_ATTRIBUTE_RD(field)				\
1442  	i->private_starget_attrs[count] = device_attr_starget_##field; \
1443  	i->private_starget_attrs[count].attr.mode = S_IRUGO;		\
1444  	i->private_starget_attrs[count].store = NULL;			\
1445  	i->starget_attrs[count] = &i->private_starget_attrs[count];	\
1446  	if (i->f->show_starget_##field)					\
1447  		count++
1448  
1449  #define SETUP_STARGET_ATTRIBUTE_RW(field)				\
1450  	i->private_starget_attrs[count] = device_attr_starget_##field; \
1451  	if (!i->f->set_starget_##field) {				\
1452  		i->private_starget_attrs[count].attr.mode = S_IRUGO;	\
1453  		i->private_starget_attrs[count].store = NULL;		\
1454  	}								\
1455  	i->starget_attrs[count] = &i->private_starget_attrs[count];	\
1456  	if (i->f->show_starget_##field)					\
1457  		count++
1458  
1459  /* The FC Transport SCSI Target Attributes: */
1460  fc_starget_rd_attr_cast(node_name, "0x%llx\n", 20, unsigned long long);
1461  fc_starget_rd_attr_cast(port_name, "0x%llx\n", 20, unsigned long long);
1462  fc_starget_rd_attr(port_id, "0x%06x\n", 20);
1463  
1464  
1465  /*
1466   * FC Virtual Port Attribute Management
1467   */
1468  
1469  #define fc_vport_show_function(field, format_string, sz, cast)		\
1470  static ssize_t								\
1471  show_fc_vport_##field (struct device *dev, 				\
1472  		       struct device_attribute *attr, char *buf)	\
1473  {									\
1474  	struct fc_vport *vport = transport_class_to_vport(dev);		\
1475  	struct Scsi_Host *shost = vport_to_shost(vport);		\
1476  	struct fc_internal *i = to_fc_internal(shost->transportt);	\
1477  	if ((i->f->get_vport_##field) &&				\
1478  	    !(vport->flags & (FC_VPORT_DEL | FC_VPORT_CREATING)))	\
1479  		i->f->get_vport_##field(vport);				\
1480  	return snprintf(buf, sz, format_string, cast vport->field); 	\
1481  }
1482  
1483  #define fc_vport_store_function(field)					\
1484  static ssize_t								\
1485  store_fc_vport_##field(struct device *dev,				\
1486  		       struct device_attribute *attr,			\
1487  		       const char *buf,	size_t count)			\
1488  {									\
1489  	int val;							\
1490  	struct fc_vport *vport = transport_class_to_vport(dev);		\
1491  	struct Scsi_Host *shost = vport_to_shost(vport);		\
1492  	struct fc_internal *i = to_fc_internal(shost->transportt);	\
1493  	char *cp;							\
1494  	if (vport->flags & (FC_VPORT_DEL | FC_VPORT_CREATING))	\
1495  		return -EBUSY;						\
1496  	val = simple_strtoul(buf, &cp, 0);				\
1497  	if (*cp && (*cp != '\n'))					\
1498  		return -EINVAL;						\
1499  	i->f->set_vport_##field(vport, val);				\
1500  	return count;							\
1501  }
1502  
1503  #define fc_vport_store_str_function(field, slen)			\
1504  static ssize_t								\
1505  store_fc_vport_##field(struct device *dev,				\
1506  		       struct device_attribute *attr, 			\
1507  		       const char *buf,	size_t count)			\
1508  {									\
1509  	struct fc_vport *vport = transport_class_to_vport(dev);		\
1510  	struct Scsi_Host *shost = vport_to_shost(vport);		\
1511  	struct fc_internal *i = to_fc_internal(shost->transportt);	\
1512  	unsigned int cnt=count;						\
1513  									\
1514  	/* count may include a LF at end of string */			\
1515  	if (buf[cnt-1] == '\n')						\
1516  		cnt--;							\
1517  	if (cnt > ((slen) - 1))						\
1518  		return -EINVAL;						\
1519  	memcpy(vport->field, buf, cnt);					\
1520  	i->f->set_vport_##field(vport);					\
1521  	return count;							\
1522  }
1523  
1524  #define fc_vport_rd_attr(field, format_string, sz)			\
1525  	fc_vport_show_function(field, format_string, sz, )		\
1526  static FC_DEVICE_ATTR(vport, field, S_IRUGO,			\
1527  			 show_fc_vport_##field, NULL)
1528  
1529  #define fc_vport_rd_attr_cast(field, format_string, sz, cast)		\
1530  	fc_vport_show_function(field, format_string, sz, (cast))	\
1531  static FC_DEVICE_ATTR(vport, field, S_IRUGO,			\
1532  			  show_fc_vport_##field, NULL)
1533  
1534  #define fc_vport_rw_attr(field, format_string, sz)			\
1535  	fc_vport_show_function(field, format_string, sz, )		\
1536  	fc_vport_store_function(field)					\
1537  static FC_DEVICE_ATTR(vport, field, S_IRUGO | S_IWUSR,		\
1538  			show_fc_vport_##field,				\
1539  			store_fc_vport_##field)
1540  
1541  #define fc_private_vport_show_function(field, format_string, sz, cast)	\
1542  static ssize_t								\
1543  show_fc_vport_##field (struct device *dev,				\
1544  		       struct device_attribute *attr, char *buf)	\
1545  {									\
1546  	struct fc_vport *vport = transport_class_to_vport(dev);		\
1547  	return snprintf(buf, sz, format_string, cast vport->field); 	\
1548  }
1549  
1550  #define fc_private_vport_store_u32_function(field)			\
1551  static ssize_t								\
1552  store_fc_vport_##field(struct device *dev,				\
1553  		       struct device_attribute *attr,			\
1554  		       const char *buf,	size_t count)			\
1555  {									\
1556  	u32 val;							\
1557  	struct fc_vport *vport = transport_class_to_vport(dev);		\
1558  	char *cp;							\
1559  	if (vport->flags & (FC_VPORT_DEL | FC_VPORT_CREATING))		\
1560  		return -EBUSY;						\
1561  	val = simple_strtoul(buf, &cp, 0);				\
1562  	if (*cp && (*cp != '\n'))					\
1563  		return -EINVAL;						\
1564  	vport->field = val;						\
1565  	return count;							\
1566  }
1567  
1568  
1569  #define fc_private_vport_rd_attr(field, format_string, sz)		\
1570  	fc_private_vport_show_function(field, format_string, sz, )	\
1571  static FC_DEVICE_ATTR(vport, field, S_IRUGO,			\
1572  			 show_fc_vport_##field, NULL)
1573  
1574  #define fc_private_vport_rd_attr_cast(field, format_string, sz, cast)	\
1575  	fc_private_vport_show_function(field, format_string, sz, (cast)) \
1576  static FC_DEVICE_ATTR(vport, field, S_IRUGO,			\
1577  			  show_fc_vport_##field, NULL)
1578  
1579  #define fc_private_vport_rw_u32_attr(field, format_string, sz)		\
1580  	fc_private_vport_show_function(field, format_string, sz, )	\
1581  	fc_private_vport_store_u32_function(field)			\
1582  static FC_DEVICE_ATTR(vport, field, S_IRUGO | S_IWUSR,		\
1583  			show_fc_vport_##field,				\
1584  			store_fc_vport_##field)
1585  
1586  
1587  #define fc_private_vport_rd_enum_attr(title, maxlen)			\
1588  static ssize_t								\
1589  show_fc_vport_##title (struct device *dev,				\
1590  		       struct device_attribute *attr,			\
1591  		       char *buf)					\
1592  {									\
1593  	struct fc_vport *vport = transport_class_to_vport(dev);		\
1594  	const char *name;						\
1595  	name = get_fc_##title##_name(vport->title);			\
1596  	if (!name)							\
1597  		return -EINVAL;						\
1598  	return snprintf(buf, maxlen, "%s\n", name);			\
1599  }									\
1600  static FC_DEVICE_ATTR(vport, title, S_IRUGO,			\
1601  			show_fc_vport_##title, NULL)
1602  
1603  
1604  #define SETUP_VPORT_ATTRIBUTE_RD(field)					\
1605  	i->private_vport_attrs[count] = device_attr_vport_##field; \
1606  	i->private_vport_attrs[count].attr.mode = S_IRUGO;		\
1607  	i->private_vport_attrs[count].store = NULL;			\
1608  	i->vport_attrs[count] = &i->private_vport_attrs[count];		\
1609  	if (i->f->get_##field)						\
1610  		count++
1611  	/* NOTE: Above MACRO differs: checks function not show bit */
1612  
1613  #define SETUP_PRIVATE_VPORT_ATTRIBUTE_RD(field)				\
1614  	i->private_vport_attrs[count] = device_attr_vport_##field; \
1615  	i->private_vport_attrs[count].attr.mode = S_IRUGO;		\
1616  	i->private_vport_attrs[count].store = NULL;			\
1617  	i->vport_attrs[count] = &i->private_vport_attrs[count];		\
1618  	count++
1619  
1620  #define SETUP_VPORT_ATTRIBUTE_WR(field)					\
1621  	i->private_vport_attrs[count] = device_attr_vport_##field; \
1622  	i->vport_attrs[count] = &i->private_vport_attrs[count];		\
1623  	if (i->f->field)						\
1624  		count++
1625  	/* NOTE: Above MACRO differs: checks function */
1626  
1627  #define SETUP_VPORT_ATTRIBUTE_RW(field)					\
1628  	i->private_vport_attrs[count] = device_attr_vport_##field; \
1629  	if (!i->f->set_vport_##field) {					\
1630  		i->private_vport_attrs[count].attr.mode = S_IRUGO;	\
1631  		i->private_vport_attrs[count].store = NULL;		\
1632  	}								\
1633  	i->vport_attrs[count] = &i->private_vport_attrs[count];		\
1634  	count++
1635  	/* NOTE: Above MACRO differs: does not check show bit */
1636  
1637  #define SETUP_PRIVATE_VPORT_ATTRIBUTE_RW(field)				\
1638  {									\
1639  	i->private_vport_attrs[count] = device_attr_vport_##field; \
1640  	i->vport_attrs[count] = &i->private_vport_attrs[count];		\
1641  	count++;							\
1642  }
1643  
1644  
1645  /* The FC Transport Virtual Port Attributes: */
1646  
1647  /* Fixed Virtual Port Attributes */
1648  
1649  /* Dynamic Virtual Port Attributes */
1650  
1651  /* Private Virtual Port Attributes */
1652  
1653  fc_private_vport_rd_enum_attr(vport_state, FC_VPORTSTATE_MAX_NAMELEN);
1654  fc_private_vport_rd_enum_attr(vport_last_state, FC_VPORTSTATE_MAX_NAMELEN);
1655  fc_private_vport_rd_attr_cast(node_name, "0x%llx\n", 20, unsigned long long);
1656  fc_private_vport_rd_attr_cast(port_name, "0x%llx\n", 20, unsigned long long);
1657  
1658  static ssize_t
show_fc_vport_roles(struct device * dev,struct device_attribute * attr,char * buf)1659  show_fc_vport_roles (struct device *dev, struct device_attribute *attr,
1660  		     char *buf)
1661  {
1662  	struct fc_vport *vport = transport_class_to_vport(dev);
1663  
1664  	if (vport->roles == FC_PORT_ROLE_UNKNOWN)
1665  		return snprintf(buf, 20, "unknown\n");
1666  	return get_fc_port_roles_names(vport->roles, buf);
1667  }
1668  static FC_DEVICE_ATTR(vport, roles, S_IRUGO, show_fc_vport_roles, NULL);
1669  
1670  fc_private_vport_rd_enum_attr(vport_type, FC_PORTTYPE_MAX_NAMELEN);
1671  
1672  fc_private_vport_show_function(symbolic_name, "%s\n",
1673  		FC_VPORT_SYMBOLIC_NAMELEN + 1, )
1674  fc_vport_store_str_function(symbolic_name, FC_VPORT_SYMBOLIC_NAMELEN)
1675  static FC_DEVICE_ATTR(vport, symbolic_name, S_IRUGO | S_IWUSR,
1676  		show_fc_vport_symbolic_name, store_fc_vport_symbolic_name);
1677  
1678  static ssize_t
store_fc_vport_delete(struct device * dev,struct device_attribute * attr,const char * buf,size_t count)1679  store_fc_vport_delete(struct device *dev, struct device_attribute *attr,
1680  		      const char *buf, size_t count)
1681  {
1682  	struct fc_vport *vport = transport_class_to_vport(dev);
1683  	struct Scsi_Host *shost = vport_to_shost(vport);
1684  	unsigned long flags;
1685  
1686  	spin_lock_irqsave(shost->host_lock, flags);
1687  	if (vport->flags & (FC_VPORT_DEL | FC_VPORT_CREATING)) {
1688  		spin_unlock_irqrestore(shost->host_lock, flags);
1689  		return -EBUSY;
1690  	}
1691  	vport->flags |= FC_VPORT_DELETING;
1692  	spin_unlock_irqrestore(shost->host_lock, flags);
1693  
1694  	fc_queue_work(shost, &vport->vport_delete_work);
1695  	return count;
1696  }
1697  static FC_DEVICE_ATTR(vport, vport_delete, S_IWUSR,
1698  			NULL, store_fc_vport_delete);
1699  
1700  
1701  /*
1702   * Enable/Disable vport
1703   *  Write "1" to disable, write "0" to enable
1704   */
1705  static ssize_t
store_fc_vport_disable(struct device * dev,struct device_attribute * attr,const char * buf,size_t count)1706  store_fc_vport_disable(struct device *dev, struct device_attribute *attr,
1707  		       const char *buf,
1708  			   size_t count)
1709  {
1710  	struct fc_vport *vport = transport_class_to_vport(dev);
1711  	struct Scsi_Host *shost = vport_to_shost(vport);
1712  	struct fc_internal *i = to_fc_internal(shost->transportt);
1713  	int stat;
1714  
1715  	if (vport->flags & (FC_VPORT_DEL | FC_VPORT_CREATING))
1716  		return -EBUSY;
1717  
1718  	if (*buf == '0') {
1719  		if (vport->vport_state != FC_VPORT_DISABLED)
1720  			return -EALREADY;
1721  	} else if (*buf == '1') {
1722  		if (vport->vport_state == FC_VPORT_DISABLED)
1723  			return -EALREADY;
1724  	} else
1725  		return -EINVAL;
1726  
1727  	stat = i->f->vport_disable(vport, ((*buf == '0') ? false : true));
1728  	return stat ? stat : count;
1729  }
1730  static FC_DEVICE_ATTR(vport, vport_disable, S_IWUSR,
1731  			NULL, store_fc_vport_disable);
1732  
1733  
1734  /*
1735   * Host Attribute Management
1736   */
1737  
1738  #define fc_host_show_function(field, format_string, sz, cast)		\
1739  static ssize_t								\
1740  show_fc_host_##field (struct device *dev,				\
1741  		      struct device_attribute *attr, char *buf)		\
1742  {									\
1743  	struct Scsi_Host *shost = transport_class_to_shost(dev);	\
1744  	struct fc_internal *i = to_fc_internal(shost->transportt);	\
1745  	if (i->f->get_host_##field)					\
1746  		i->f->get_host_##field(shost);				\
1747  	return snprintf(buf, sz, format_string, cast fc_host_##field(shost)); \
1748  }
1749  
1750  #define fc_host_store_function(field)					\
1751  static ssize_t								\
1752  store_fc_host_##field(struct device *dev, 				\
1753  		      struct device_attribute *attr,			\
1754  		      const char *buf,	size_t count)			\
1755  {									\
1756  	int val;							\
1757  	struct Scsi_Host *shost = transport_class_to_shost(dev);	\
1758  	struct fc_internal *i = to_fc_internal(shost->transportt);	\
1759  	char *cp;							\
1760  									\
1761  	val = simple_strtoul(buf, &cp, 0);				\
1762  	if (*cp && (*cp != '\n'))					\
1763  		return -EINVAL;						\
1764  	i->f->set_host_##field(shost, val);				\
1765  	return count;							\
1766  }
1767  
1768  #define fc_host_store_str_function(field, slen)				\
1769  static ssize_t								\
1770  store_fc_host_##field(struct device *dev,				\
1771  		      struct device_attribute *attr,			\
1772  		      const char *buf, size_t count)			\
1773  {									\
1774  	struct Scsi_Host *shost = transport_class_to_shost(dev);	\
1775  	struct fc_internal *i = to_fc_internal(shost->transportt);	\
1776  	unsigned int cnt=count;						\
1777  									\
1778  	/* count may include a LF at end of string */			\
1779  	if (buf[cnt-1] == '\n')						\
1780  		cnt--;							\
1781  	if (cnt > ((slen) - 1))						\
1782  		return -EINVAL;						\
1783  	memcpy(fc_host_##field(shost), buf, cnt);			\
1784  	i->f->set_host_##field(shost);					\
1785  	return count;							\
1786  }
1787  
1788  #define fc_host_rd_attr(field, format_string, sz)			\
1789  	fc_host_show_function(field, format_string, sz, )		\
1790  static FC_DEVICE_ATTR(host, field, S_IRUGO,			\
1791  			 show_fc_host_##field, NULL)
1792  
1793  #define fc_host_rd_attr_cast(field, format_string, sz, cast)		\
1794  	fc_host_show_function(field, format_string, sz, (cast))		\
1795  static FC_DEVICE_ATTR(host, field, S_IRUGO,			\
1796  			  show_fc_host_##field, NULL)
1797  
1798  #define fc_host_rw_attr(field, format_string, sz)			\
1799  	fc_host_show_function(field, format_string, sz, )		\
1800  	fc_host_store_function(field)					\
1801  static FC_DEVICE_ATTR(host, field, S_IRUGO | S_IWUSR,		\
1802  			show_fc_host_##field,				\
1803  			store_fc_host_##field)
1804  
1805  #define fc_host_rd_enum_attr(title, maxlen)				\
1806  static ssize_t								\
1807  show_fc_host_##title (struct device *dev,				\
1808  		      struct device_attribute *attr, char *buf)		\
1809  {									\
1810  	struct Scsi_Host *shost = transport_class_to_shost(dev);	\
1811  	struct fc_internal *i = to_fc_internal(shost->transportt);	\
1812  	const char *name;						\
1813  	if (i->f->get_host_##title)					\
1814  		i->f->get_host_##title(shost);				\
1815  	name = get_fc_##title##_name(fc_host_##title(shost));		\
1816  	if (!name)							\
1817  		return -EINVAL;						\
1818  	return snprintf(buf, maxlen, "%s\n", name);			\
1819  }									\
1820  static FC_DEVICE_ATTR(host, title, S_IRUGO, show_fc_host_##title, NULL)
1821  
1822  #define SETUP_HOST_ATTRIBUTE_RD(field)					\
1823  	i->private_host_attrs[count] = device_attr_host_##field;	\
1824  	i->private_host_attrs[count].attr.mode = S_IRUGO;		\
1825  	i->private_host_attrs[count].store = NULL;			\
1826  	i->host_attrs[count] = &i->private_host_attrs[count];		\
1827  	if (i->f->show_host_##field)					\
1828  		count++
1829  
1830  #define SETUP_HOST_ATTRIBUTE_RD_NS(field)				\
1831  	i->private_host_attrs[count] = device_attr_host_##field;	\
1832  	i->private_host_attrs[count].attr.mode = S_IRUGO;		\
1833  	i->private_host_attrs[count].store = NULL;			\
1834  	i->host_attrs[count] = &i->private_host_attrs[count];		\
1835  	count++
1836  
1837  #define SETUP_HOST_ATTRIBUTE_RW(field)					\
1838  	i->private_host_attrs[count] = device_attr_host_##field;	\
1839  	if (!i->f->set_host_##field) {					\
1840  		i->private_host_attrs[count].attr.mode = S_IRUGO;	\
1841  		i->private_host_attrs[count].store = NULL;		\
1842  	}								\
1843  	i->host_attrs[count] = &i->private_host_attrs[count];		\
1844  	if (i->f->show_host_##field)					\
1845  		count++
1846  
1847  
1848  #define fc_private_host_show_function(field, format_string, sz, cast)	\
1849  static ssize_t								\
1850  show_fc_host_##field (struct device *dev,				\
1851  		      struct device_attribute *attr, char *buf)		\
1852  {									\
1853  	struct Scsi_Host *shost = transport_class_to_shost(dev);	\
1854  	return snprintf(buf, sz, format_string, cast fc_host_##field(shost)); \
1855  }
1856  
1857  #define fc_private_host_rd_attr(field, format_string, sz)		\
1858  	fc_private_host_show_function(field, format_string, sz, )	\
1859  static FC_DEVICE_ATTR(host, field, S_IRUGO,			\
1860  			 show_fc_host_##field, NULL)
1861  
1862  #define fc_private_host_rd_attr_cast(field, format_string, sz, cast)	\
1863  	fc_private_host_show_function(field, format_string, sz, (cast)) \
1864  static FC_DEVICE_ATTR(host, field, S_IRUGO,			\
1865  			  show_fc_host_##field, NULL)
1866  
1867  #define SETUP_PRIVATE_HOST_ATTRIBUTE_RD(field)			\
1868  	i->private_host_attrs[count] = device_attr_host_##field;	\
1869  	i->private_host_attrs[count].attr.mode = S_IRUGO;		\
1870  	i->private_host_attrs[count].store = NULL;			\
1871  	i->host_attrs[count] = &i->private_host_attrs[count];		\
1872  	count++
1873  
1874  #define SETUP_PRIVATE_HOST_ATTRIBUTE_RW(field)			\
1875  {									\
1876  	i->private_host_attrs[count] = device_attr_host_##field;	\
1877  	i->host_attrs[count] = &i->private_host_attrs[count];		\
1878  	count++;							\
1879  }
1880  
1881  
1882  /* Fixed Host Attributes */
1883  
1884  static ssize_t
show_fc_host_supported_classes(struct device * dev,struct device_attribute * attr,char * buf)1885  show_fc_host_supported_classes (struct device *dev,
1886  			        struct device_attribute *attr, char *buf)
1887  {
1888  	struct Scsi_Host *shost = transport_class_to_shost(dev);
1889  
1890  	if (fc_host_supported_classes(shost) == FC_COS_UNSPECIFIED)
1891  		return snprintf(buf, 20, "unspecified\n");
1892  
1893  	return get_fc_cos_names(fc_host_supported_classes(shost), buf);
1894  }
1895  static FC_DEVICE_ATTR(host, supported_classes, S_IRUGO,
1896  		show_fc_host_supported_classes, NULL);
1897  
1898  static ssize_t
show_fc_host_supported_fc4s(struct device * dev,struct device_attribute * attr,char * buf)1899  show_fc_host_supported_fc4s (struct device *dev,
1900  			     struct device_attribute *attr, char *buf)
1901  {
1902  	struct Scsi_Host *shost = transport_class_to_shost(dev);
1903  	return (ssize_t)show_fc_fc4s(buf, fc_host_supported_fc4s(shost));
1904  }
1905  static FC_DEVICE_ATTR(host, supported_fc4s, S_IRUGO,
1906  		show_fc_host_supported_fc4s, NULL);
1907  
1908  static ssize_t
show_fc_host_supported_speeds(struct device * dev,struct device_attribute * attr,char * buf)1909  show_fc_host_supported_speeds (struct device *dev,
1910  			       struct device_attribute *attr, char *buf)
1911  {
1912  	struct Scsi_Host *shost = transport_class_to_shost(dev);
1913  
1914  	if (fc_host_supported_speeds(shost) == FC_PORTSPEED_UNKNOWN)
1915  		return snprintf(buf, 20, "unknown\n");
1916  
1917  	return get_fc_port_speed_names(fc_host_supported_speeds(shost), buf);
1918  }
1919  static FC_DEVICE_ATTR(host, supported_speeds, S_IRUGO,
1920  		show_fc_host_supported_speeds, NULL);
1921  
1922  
1923  fc_private_host_rd_attr_cast(node_name, "0x%llx\n", 20, unsigned long long);
1924  fc_private_host_rd_attr_cast(port_name, "0x%llx\n", 20, unsigned long long);
1925  fc_private_host_rd_attr_cast(permanent_port_name, "0x%llx\n", 20,
1926  			     unsigned long long);
1927  fc_private_host_rd_attr(maxframe_size, "%u bytes\n", 20);
1928  fc_private_host_rd_attr(max_npiv_vports, "%u\n", 20);
1929  fc_private_host_rd_attr(serial_number, "%s\n", (FC_SERIAL_NUMBER_SIZE +1));
1930  fc_private_host_rd_attr(manufacturer, "%s\n", FC_SERIAL_NUMBER_SIZE + 1);
1931  fc_private_host_rd_attr(model, "%s\n", FC_SYMBOLIC_NAME_SIZE + 1);
1932  fc_private_host_rd_attr(model_description, "%s\n", FC_SYMBOLIC_NAME_SIZE + 1);
1933  fc_private_host_rd_attr(hardware_version, "%s\n", FC_VERSION_STRING_SIZE + 1);
1934  fc_private_host_rd_attr(driver_version, "%s\n", FC_VERSION_STRING_SIZE + 1);
1935  fc_private_host_rd_attr(firmware_version, "%s\n", FC_VERSION_STRING_SIZE + 1);
1936  fc_private_host_rd_attr(optionrom_version, "%s\n", FC_VERSION_STRING_SIZE + 1);
1937  
1938  
1939  /* Dynamic Host Attributes */
1940  
1941  static ssize_t
show_fc_host_active_fc4s(struct device * dev,struct device_attribute * attr,char * buf)1942  show_fc_host_active_fc4s (struct device *dev,
1943  			  struct device_attribute *attr, char *buf)
1944  {
1945  	struct Scsi_Host *shost = transport_class_to_shost(dev);
1946  	struct fc_internal *i = to_fc_internal(shost->transportt);
1947  
1948  	if (i->f->get_host_active_fc4s)
1949  		i->f->get_host_active_fc4s(shost);
1950  
1951  	return (ssize_t)show_fc_fc4s(buf, fc_host_active_fc4s(shost));
1952  }
1953  static FC_DEVICE_ATTR(host, active_fc4s, S_IRUGO,
1954  		show_fc_host_active_fc4s, NULL);
1955  
1956  static ssize_t
show_fc_host_speed(struct device * dev,struct device_attribute * attr,char * buf)1957  show_fc_host_speed (struct device *dev,
1958  		    struct device_attribute *attr, char *buf)
1959  {
1960  	struct Scsi_Host *shost = transport_class_to_shost(dev);
1961  	struct fc_internal *i = to_fc_internal(shost->transportt);
1962  
1963  	if (i->f->get_host_speed)
1964  		i->f->get_host_speed(shost);
1965  
1966  	if (fc_host_speed(shost) == FC_PORTSPEED_UNKNOWN)
1967  		return snprintf(buf, 20, "unknown\n");
1968  
1969  	return get_fc_port_speed_names(fc_host_speed(shost), buf);
1970  }
1971  static FC_DEVICE_ATTR(host, speed, S_IRUGO,
1972  		show_fc_host_speed, NULL);
1973  
1974  
1975  fc_host_rd_attr(port_id, "0x%06x\n", 20);
1976  fc_host_rd_enum_attr(port_type, FC_PORTTYPE_MAX_NAMELEN);
1977  fc_host_rd_enum_attr(port_state, FC_PORTSTATE_MAX_NAMELEN);
1978  fc_host_rd_attr_cast(fabric_name, "0x%llx\n", 20, unsigned long long);
1979  fc_host_rd_attr(symbolic_name, "%s\n", FC_SYMBOLIC_NAME_SIZE + 1);
1980  
1981  fc_private_host_show_function(system_hostname, "%s\n",
1982  		FC_SYMBOLIC_NAME_SIZE + 1, )
1983  fc_host_store_str_function(system_hostname, FC_SYMBOLIC_NAME_SIZE)
1984  static FC_DEVICE_ATTR(host, system_hostname, S_IRUGO | S_IWUSR,
1985  		show_fc_host_system_hostname, store_fc_host_system_hostname);
1986  
1987  
1988  /* Private Host Attributes */
1989  
1990  static ssize_t
show_fc_private_host_tgtid_bind_type(struct device * dev,struct device_attribute * attr,char * buf)1991  show_fc_private_host_tgtid_bind_type(struct device *dev,
1992  				     struct device_attribute *attr, char *buf)
1993  {
1994  	struct Scsi_Host *shost = transport_class_to_shost(dev);
1995  	const char *name;
1996  
1997  	name = get_fc_tgtid_bind_type_name(fc_host_tgtid_bind_type(shost));
1998  	if (!name)
1999  		return -EINVAL;
2000  	return snprintf(buf, FC_BINDTYPE_MAX_NAMELEN, "%s\n", name);
2001  }
2002  
2003  #define get_list_head_entry(pos, head, member) 		\
2004  	pos = list_entry((head)->next, typeof(*pos), member)
2005  
2006  static ssize_t
store_fc_private_host_tgtid_bind_type(struct device * dev,struct device_attribute * attr,const char * buf,size_t count)2007  store_fc_private_host_tgtid_bind_type(struct device *dev,
2008  	struct device_attribute *attr, const char *buf, size_t count)
2009  {
2010  	struct Scsi_Host *shost = transport_class_to_shost(dev);
2011  	struct fc_rport *rport;
2012   	enum fc_tgtid_binding_type val;
2013  	unsigned long flags;
2014  
2015  	if (get_fc_tgtid_bind_type_match(buf, &val))
2016  		return -EINVAL;
2017  
2018  	/* if changing bind type, purge all unused consistent bindings */
2019  	if (val != fc_host_tgtid_bind_type(shost)) {
2020  		spin_lock_irqsave(shost->host_lock, flags);
2021  		while (!list_empty(&fc_host_rport_bindings(shost))) {
2022  			get_list_head_entry(rport,
2023  				&fc_host_rport_bindings(shost), peers);
2024  			list_del(&rport->peers);
2025  			rport->port_state = FC_PORTSTATE_DELETED;
2026  			fc_queue_work(shost, &rport->rport_delete_work);
2027  		}
2028  		spin_unlock_irqrestore(shost->host_lock, flags);
2029  	}
2030  
2031  	fc_host_tgtid_bind_type(shost) = val;
2032  	return count;
2033  }
2034  
2035  static FC_DEVICE_ATTR(host, tgtid_bind_type, S_IRUGO | S_IWUSR,
2036  			show_fc_private_host_tgtid_bind_type,
2037  			store_fc_private_host_tgtid_bind_type);
2038  
2039  static ssize_t
store_fc_private_host_issue_lip(struct device * dev,struct device_attribute * attr,const char * buf,size_t count)2040  store_fc_private_host_issue_lip(struct device *dev,
2041  	struct device_attribute *attr, const char *buf, size_t count)
2042  {
2043  	struct Scsi_Host *shost = transport_class_to_shost(dev);
2044  	struct fc_internal *i = to_fc_internal(shost->transportt);
2045  	int ret;
2046  
2047  	/* ignore any data value written to the attribute */
2048  	if (i->f->issue_fc_host_lip) {
2049  		ret = i->f->issue_fc_host_lip(shost);
2050  		return ret ? ret: count;
2051  	}
2052  
2053  	return -ENOENT;
2054  }
2055  
2056  static FC_DEVICE_ATTR(host, issue_lip, S_IWUSR, NULL,
2057  			store_fc_private_host_issue_lip);
2058  
2059  static ssize_t
store_fc_private_host_dev_loss_tmo(struct device * dev,struct device_attribute * attr,const char * buf,size_t count)2060  store_fc_private_host_dev_loss_tmo(struct device *dev,
2061  				   struct device_attribute *attr,
2062  				   const char *buf, size_t count)
2063  {
2064  	struct Scsi_Host *shost = transport_class_to_shost(dev);
2065  	struct fc_host_attrs *fc_host = shost_to_fc_host(shost);
2066  	struct fc_rport *rport;
2067  	unsigned long val, flags;
2068  	int rc;
2069  
2070  	rc = fc_str_to_dev_loss(buf, &val);
2071  	if (rc)
2072  		return rc;
2073  
2074  	fc_host_dev_loss_tmo(shost) = val;
2075  	spin_lock_irqsave(shost->host_lock, flags);
2076  	list_for_each_entry(rport, &fc_host->rports, peers)
2077  		fc_rport_set_dev_loss_tmo(rport, val);
2078  	spin_unlock_irqrestore(shost->host_lock, flags);
2079  	return count;
2080  }
2081  
2082  fc_private_host_show_function(dev_loss_tmo, "%d\n", 20, );
2083  static FC_DEVICE_ATTR(host, dev_loss_tmo, S_IRUGO | S_IWUSR,
2084  		      show_fc_host_dev_loss_tmo,
2085  		      store_fc_private_host_dev_loss_tmo);
2086  
2087  fc_private_host_rd_attr(npiv_vports_inuse, "%u\n", 20);
2088  
2089  /*
2090   * Host Statistics Management
2091   */
2092  
2093  /* Show a given attribute in the statistics group */
2094  static ssize_t
fc_stat_show(const struct device * dev,char * buf,unsigned long offset)2095  fc_stat_show(const struct device *dev, char *buf, unsigned long offset)
2096  {
2097  	struct Scsi_Host *shost = transport_class_to_shost(dev);
2098  	struct fc_internal *i = to_fc_internal(shost->transportt);
2099  	struct fc_host_statistics *stats;
2100  	ssize_t ret = -ENOENT;
2101  
2102  	if (offset > sizeof(struct fc_host_statistics) ||
2103  	    offset % sizeof(u64) != 0)
2104  		WARN_ON(1);
2105  
2106  	if (i->f->get_fc_host_stats) {
2107  		stats = (i->f->get_fc_host_stats)(shost);
2108  		if (stats)
2109  			ret = snprintf(buf, 20, "0x%llx\n",
2110  			      (unsigned long long)*(u64 *)(((u8 *) stats) + offset));
2111  	}
2112  	return ret;
2113  }
2114  
2115  
2116  /* generate a read-only statistics attribute */
2117  #define fc_host_statistic(name)						\
2118  static ssize_t show_fcstat_##name(struct device *cd,			\
2119  				  struct device_attribute *attr,	\
2120  				  char *buf)				\
2121  {									\
2122  	return fc_stat_show(cd, buf, 					\
2123  			    offsetof(struct fc_host_statistics, name));	\
2124  }									\
2125  static FC_DEVICE_ATTR(host, name, S_IRUGO, show_fcstat_##name, NULL)
2126  
2127  fc_host_statistic(seconds_since_last_reset);
2128  fc_host_statistic(tx_frames);
2129  fc_host_statistic(tx_words);
2130  fc_host_statistic(rx_frames);
2131  fc_host_statistic(rx_words);
2132  fc_host_statistic(lip_count);
2133  fc_host_statistic(nos_count);
2134  fc_host_statistic(error_frames);
2135  fc_host_statistic(dumped_frames);
2136  fc_host_statistic(link_failure_count);
2137  fc_host_statistic(loss_of_sync_count);
2138  fc_host_statistic(loss_of_signal_count);
2139  fc_host_statistic(prim_seq_protocol_err_count);
2140  fc_host_statistic(invalid_tx_word_count);
2141  fc_host_statistic(invalid_crc_count);
2142  fc_host_statistic(fcp_input_requests);
2143  fc_host_statistic(fcp_output_requests);
2144  fc_host_statistic(fcp_control_requests);
2145  fc_host_statistic(fcp_input_megabytes);
2146  fc_host_statistic(fcp_output_megabytes);
2147  fc_host_statistic(fcp_packet_alloc_failures);
2148  fc_host_statistic(fcp_packet_aborts);
2149  fc_host_statistic(fcp_frame_alloc_failures);
2150  fc_host_statistic(fc_no_free_exch);
2151  fc_host_statistic(fc_no_free_exch_xid);
2152  fc_host_statistic(fc_xid_not_found);
2153  fc_host_statistic(fc_xid_busy);
2154  fc_host_statistic(fc_seq_not_found);
2155  fc_host_statistic(fc_non_bls_resp);
2156  fc_host_statistic(cn_sig_warn);
2157  fc_host_statistic(cn_sig_alarm);
2158  
2159  
2160  #define fc_host_fpin_statistic(name)					\
2161  static ssize_t fc_host_fpinstat_##name(struct device *cd,		\
2162  				  struct device_attribute *attr,	\
2163  				  char *buf)				\
2164  {									\
2165  	struct Scsi_Host *shost = transport_class_to_shost(cd);		\
2166  	struct fc_host_attrs *fc_host = shost_to_fc_host(shost);	\
2167  									\
2168  	return snprintf(buf, 20, "0x%llx\n", fc_host->fpin_stats.name);	\
2169  }									\
2170  static FC_DEVICE_ATTR(host, fpin_##name, 0444, fc_host_fpinstat_##name, NULL)
2171  
2172  fc_host_fpin_statistic(dn);
2173  fc_host_fpin_statistic(dn_unknown);
2174  fc_host_fpin_statistic(dn_timeout);
2175  fc_host_fpin_statistic(dn_unable_to_route);
2176  fc_host_fpin_statistic(dn_device_specific);
2177  fc_host_fpin_statistic(cn);
2178  fc_host_fpin_statistic(cn_clear);
2179  fc_host_fpin_statistic(cn_lost_credit);
2180  fc_host_fpin_statistic(cn_credit_stall);
2181  fc_host_fpin_statistic(cn_oversubscription);
2182  fc_host_fpin_statistic(cn_device_specific);
2183  fc_host_fpin_statistic(li);
2184  fc_host_fpin_statistic(li_failure_unknown);
2185  fc_host_fpin_statistic(li_link_failure_count);
2186  fc_host_fpin_statistic(li_loss_of_sync_count);
2187  fc_host_fpin_statistic(li_loss_of_signals_count);
2188  fc_host_fpin_statistic(li_prim_seq_err_count);
2189  fc_host_fpin_statistic(li_invalid_tx_word_count);
2190  fc_host_fpin_statistic(li_invalid_crc_count);
2191  fc_host_fpin_statistic(li_device_specific);
2192  
2193  static ssize_t
fc_reset_statistics(struct device * dev,struct device_attribute * attr,const char * buf,size_t count)2194  fc_reset_statistics(struct device *dev, struct device_attribute *attr,
2195  		    const char *buf, size_t count)
2196  {
2197  	struct Scsi_Host *shost = transport_class_to_shost(dev);
2198  	struct fc_internal *i = to_fc_internal(shost->transportt);
2199  
2200  	/* ignore any data value written to the attribute */
2201  	if (i->f->reset_fc_host_stats) {
2202  		i->f->reset_fc_host_stats(shost);
2203  		return count;
2204  	}
2205  
2206  	return -ENOENT;
2207  }
2208  static FC_DEVICE_ATTR(host, reset_statistics, S_IWUSR, NULL,
2209  				fc_reset_statistics);
2210  
2211  static struct attribute *fc_statistics_attrs[] = {
2212  	&device_attr_host_seconds_since_last_reset.attr,
2213  	&device_attr_host_tx_frames.attr,
2214  	&device_attr_host_tx_words.attr,
2215  	&device_attr_host_rx_frames.attr,
2216  	&device_attr_host_rx_words.attr,
2217  	&device_attr_host_lip_count.attr,
2218  	&device_attr_host_nos_count.attr,
2219  	&device_attr_host_error_frames.attr,
2220  	&device_attr_host_dumped_frames.attr,
2221  	&device_attr_host_link_failure_count.attr,
2222  	&device_attr_host_loss_of_sync_count.attr,
2223  	&device_attr_host_loss_of_signal_count.attr,
2224  	&device_attr_host_prim_seq_protocol_err_count.attr,
2225  	&device_attr_host_invalid_tx_word_count.attr,
2226  	&device_attr_host_invalid_crc_count.attr,
2227  	&device_attr_host_fcp_input_requests.attr,
2228  	&device_attr_host_fcp_output_requests.attr,
2229  	&device_attr_host_fcp_control_requests.attr,
2230  	&device_attr_host_fcp_input_megabytes.attr,
2231  	&device_attr_host_fcp_output_megabytes.attr,
2232  	&device_attr_host_fcp_packet_alloc_failures.attr,
2233  	&device_attr_host_fcp_packet_aborts.attr,
2234  	&device_attr_host_fcp_frame_alloc_failures.attr,
2235  	&device_attr_host_fc_no_free_exch.attr,
2236  	&device_attr_host_fc_no_free_exch_xid.attr,
2237  	&device_attr_host_fc_xid_not_found.attr,
2238  	&device_attr_host_fc_xid_busy.attr,
2239  	&device_attr_host_fc_seq_not_found.attr,
2240  	&device_attr_host_fc_non_bls_resp.attr,
2241  	&device_attr_host_cn_sig_warn.attr,
2242  	&device_attr_host_cn_sig_alarm.attr,
2243  	&device_attr_host_reset_statistics.attr,
2244  	&device_attr_host_fpin_dn.attr,
2245  	&device_attr_host_fpin_dn_unknown.attr,
2246  	&device_attr_host_fpin_dn_timeout.attr,
2247  	&device_attr_host_fpin_dn_unable_to_route.attr,
2248  	&device_attr_host_fpin_dn_device_specific.attr,
2249  	&device_attr_host_fpin_li.attr,
2250  	&device_attr_host_fpin_li_failure_unknown.attr,
2251  	&device_attr_host_fpin_li_link_failure_count.attr,
2252  	&device_attr_host_fpin_li_loss_of_sync_count.attr,
2253  	&device_attr_host_fpin_li_loss_of_signals_count.attr,
2254  	&device_attr_host_fpin_li_prim_seq_err_count.attr,
2255  	&device_attr_host_fpin_li_invalid_tx_word_count.attr,
2256  	&device_attr_host_fpin_li_invalid_crc_count.attr,
2257  	&device_attr_host_fpin_li_device_specific.attr,
2258  	&device_attr_host_fpin_cn.attr,
2259  	&device_attr_host_fpin_cn_clear.attr,
2260  	&device_attr_host_fpin_cn_lost_credit.attr,
2261  	&device_attr_host_fpin_cn_credit_stall.attr,
2262  	&device_attr_host_fpin_cn_oversubscription.attr,
2263  	&device_attr_host_fpin_cn_device_specific.attr,
2264  	NULL
2265  };
2266  
2267  static struct attribute_group fc_statistics_group = {
2268  	.name = "statistics",
2269  	.attrs = fc_statistics_attrs,
2270  };
2271  
2272  
2273  /* Host Vport Attributes */
2274  
2275  static int
fc_parse_wwn(const char * ns,u64 * nm)2276  fc_parse_wwn(const char *ns, u64 *nm)
2277  {
2278  	unsigned int i, j;
2279  	u8 wwn[8];
2280  
2281  	memset(wwn, 0, sizeof(wwn));
2282  
2283  	/* Validate and store the new name */
2284  	for (i=0, j=0; i < 16; i++) {
2285  		int value;
2286  
2287  		value = hex_to_bin(*ns++);
2288  		if (value >= 0)
2289  			j = (j << 4) | value;
2290  		else
2291  			return -EINVAL;
2292  		if (i % 2) {
2293  			wwn[i/2] = j & 0xff;
2294  			j = 0;
2295  		}
2296  	}
2297  
2298  	*nm = wwn_to_u64(wwn);
2299  
2300  	return 0;
2301  }
2302  
2303  
2304  /*
2305   * "Short-cut" sysfs variable to create a new vport on a FC Host.
2306   * Input is a string of the form "<WWPN>:<WWNN>". Other attributes
2307   * will default to a NPIV-based FCP_Initiator; The WWNs are specified
2308   * as hex characters, and may *not* contain any prefixes (e.g. 0x, x, etc)
2309   */
2310  static ssize_t
store_fc_host_vport_create(struct device * dev,struct device_attribute * attr,const char * buf,size_t count)2311  store_fc_host_vport_create(struct device *dev, struct device_attribute *attr,
2312  			   const char *buf, size_t count)
2313  {
2314  	struct Scsi_Host *shost = transport_class_to_shost(dev);
2315  	struct fc_vport_identifiers vid;
2316  	struct fc_vport *vport;
2317  	unsigned int cnt=count;
2318  	int stat;
2319  
2320  	memset(&vid, 0, sizeof(vid));
2321  
2322  	/* count may include a LF at end of string */
2323  	if (buf[cnt-1] == '\n')
2324  		cnt--;
2325  
2326  	/* validate we have enough characters for WWPN */
2327  	if ((cnt != (16+1+16)) || (buf[16] != ':'))
2328  		return -EINVAL;
2329  
2330  	stat = fc_parse_wwn(&buf[0], &vid.port_name);
2331  	if (stat)
2332  		return stat;
2333  
2334  	stat = fc_parse_wwn(&buf[17], &vid.node_name);
2335  	if (stat)
2336  		return stat;
2337  
2338  	vid.roles = FC_PORT_ROLE_FCP_INITIATOR;
2339  	vid.vport_type = FC_PORTTYPE_NPIV;
2340  	/* vid.symbolic_name is already zero/NULL's */
2341  	vid.disable = false;		/* always enabled */
2342  
2343  	/* we only allow support on Channel 0 !!! */
2344  	stat = fc_vport_setup(shost, 0, &shost->shost_gendev, &vid, &vport);
2345  	return stat ? stat : count;
2346  }
2347  static FC_DEVICE_ATTR(host, vport_create, S_IWUSR, NULL,
2348  			store_fc_host_vport_create);
2349  
2350  
2351  /*
2352   * "Short-cut" sysfs variable to delete a vport on a FC Host.
2353   * Vport is identified by a string containing "<WWPN>:<WWNN>".
2354   * The WWNs are specified as hex characters, and may *not* contain
2355   * any prefixes (e.g. 0x, x, etc)
2356   */
2357  static ssize_t
store_fc_host_vport_delete(struct device * dev,struct device_attribute * attr,const char * buf,size_t count)2358  store_fc_host_vport_delete(struct device *dev, struct device_attribute *attr,
2359  			   const char *buf, size_t count)
2360  {
2361  	struct Scsi_Host *shost = transport_class_to_shost(dev);
2362  	struct fc_host_attrs *fc_host = shost_to_fc_host(shost);
2363  	struct fc_vport *vport;
2364  	u64 wwpn, wwnn;
2365  	unsigned long flags;
2366  	unsigned int cnt=count;
2367  	int stat, match;
2368  
2369  	/* count may include a LF at end of string */
2370  	if (buf[cnt-1] == '\n')
2371  		cnt--;
2372  
2373  	/* validate we have enough characters for WWPN */
2374  	if ((cnt != (16+1+16)) || (buf[16] != ':'))
2375  		return -EINVAL;
2376  
2377  	stat = fc_parse_wwn(&buf[0], &wwpn);
2378  	if (stat)
2379  		return stat;
2380  
2381  	stat = fc_parse_wwn(&buf[17], &wwnn);
2382  	if (stat)
2383  		return stat;
2384  
2385  	spin_lock_irqsave(shost->host_lock, flags);
2386  	match = 0;
2387  	/* we only allow support on Channel 0 !!! */
2388  	list_for_each_entry(vport, &fc_host->vports, peers) {
2389  		if ((vport->channel == 0) &&
2390  		    (vport->port_name == wwpn) && (vport->node_name == wwnn)) {
2391  			if (vport->flags & (FC_VPORT_DEL | FC_VPORT_CREATING))
2392  				break;
2393  			vport->flags |= FC_VPORT_DELETING;
2394  			match = 1;
2395  			break;
2396  		}
2397  	}
2398  	spin_unlock_irqrestore(shost->host_lock, flags);
2399  
2400  	if (!match)
2401  		return -ENODEV;
2402  
2403  	stat = fc_vport_terminate(vport);
2404  	return stat ? stat : count;
2405  }
2406  static FC_DEVICE_ATTR(host, vport_delete, S_IWUSR, NULL,
2407  			store_fc_host_vport_delete);
2408  
2409  
fc_host_match(struct attribute_container * cont,struct device * dev)2410  static int fc_host_match(struct attribute_container *cont,
2411  			  struct device *dev)
2412  {
2413  	struct Scsi_Host *shost;
2414  	struct fc_internal *i;
2415  
2416  	if (!scsi_is_host_device(dev))
2417  		return 0;
2418  
2419  	shost = dev_to_shost(dev);
2420  	if (!shost->transportt  || shost->transportt->host_attrs.ac.class
2421  	    != &fc_host_class.class)
2422  		return 0;
2423  
2424  	i = to_fc_internal(shost->transportt);
2425  
2426  	return &i->t.host_attrs.ac == cont;
2427  }
2428  
fc_target_match(struct attribute_container * cont,struct device * dev)2429  static int fc_target_match(struct attribute_container *cont,
2430  			    struct device *dev)
2431  {
2432  	struct Scsi_Host *shost;
2433  	struct fc_internal *i;
2434  
2435  	if (!scsi_is_target_device(dev))
2436  		return 0;
2437  
2438  	shost = dev_to_shost(dev->parent);
2439  	if (!shost->transportt  || shost->transportt->host_attrs.ac.class
2440  	    != &fc_host_class.class)
2441  		return 0;
2442  
2443  	i = to_fc_internal(shost->transportt);
2444  
2445  	return &i->t.target_attrs.ac == cont;
2446  }
2447  
fc_rport_dev_release(struct device * dev)2448  static void fc_rport_dev_release(struct device *dev)
2449  {
2450  	struct fc_rport *rport = dev_to_rport(dev);
2451  	put_device(dev->parent);
2452  	kfree(rport);
2453  }
2454  
scsi_is_fc_rport(const struct device * dev)2455  int scsi_is_fc_rport(const struct device *dev)
2456  {
2457  	return dev->release == fc_rport_dev_release;
2458  }
2459  EXPORT_SYMBOL(scsi_is_fc_rport);
2460  
fc_rport_match(struct attribute_container * cont,struct device * dev)2461  static int fc_rport_match(struct attribute_container *cont,
2462  			    struct device *dev)
2463  {
2464  	struct Scsi_Host *shost;
2465  	struct fc_internal *i;
2466  
2467  	if (!scsi_is_fc_rport(dev))
2468  		return 0;
2469  
2470  	shost = dev_to_shost(dev->parent);
2471  	if (!shost->transportt  || shost->transportt->host_attrs.ac.class
2472  	    != &fc_host_class.class)
2473  		return 0;
2474  
2475  	i = to_fc_internal(shost->transportt);
2476  
2477  	return &i->rport_attr_cont.ac == cont;
2478  }
2479  
2480  
fc_vport_dev_release(struct device * dev)2481  static void fc_vport_dev_release(struct device *dev)
2482  {
2483  	struct fc_vport *vport = dev_to_vport(dev);
2484  	put_device(dev->parent);		/* release kobj parent */
2485  	kfree(vport);
2486  }
2487  
scsi_is_fc_vport(const struct device * dev)2488  static int scsi_is_fc_vport(const struct device *dev)
2489  {
2490  	return dev->release == fc_vport_dev_release;
2491  }
2492  
fc_vport_match(struct attribute_container * cont,struct device * dev)2493  static int fc_vport_match(struct attribute_container *cont,
2494  			    struct device *dev)
2495  {
2496  	struct fc_vport *vport;
2497  	struct Scsi_Host *shost;
2498  	struct fc_internal *i;
2499  
2500  	if (!scsi_is_fc_vport(dev))
2501  		return 0;
2502  	vport = dev_to_vport(dev);
2503  
2504  	shost = vport_to_shost(vport);
2505  	if (!shost->transportt  || shost->transportt->host_attrs.ac.class
2506  	    != &fc_host_class.class)
2507  		return 0;
2508  
2509  	i = to_fc_internal(shost->transportt);
2510  	return &i->vport_attr_cont.ac == cont;
2511  }
2512  
2513  
2514  /**
2515   * fc_eh_timed_out - FC Transport I/O timeout intercept handler
2516   * @scmd:	The SCSI command which timed out
2517   *
2518   * This routine protects against error handlers getting invoked while a
2519   * rport is in a blocked state, typically due to a temporarily loss of
2520   * connectivity. If the error handlers are allowed to proceed, requests
2521   * to abort i/o, reset the target, etc will likely fail as there is no way
2522   * to communicate with the device to perform the requested function. These
2523   * failures may result in the midlayer taking the device offline, requiring
2524   * manual intervention to restore operation.
2525   *
2526   * This routine, called whenever an i/o times out, validates the state of
2527   * the underlying rport. If the rport is blocked, it returns
2528   * EH_RESET_TIMER, which will continue to reschedule the timeout.
2529   * Eventually, either the device will return, or devloss_tmo will fire,
2530   * and when the timeout then fires, it will be handled normally.
2531   * If the rport is not blocked, normal error handling continues.
2532   *
2533   * Notes:
2534   *	This routine assumes no locks are held on entry.
2535   */
fc_eh_timed_out(struct scsi_cmnd * scmd)2536  enum scsi_timeout_action fc_eh_timed_out(struct scsi_cmnd *scmd)
2537  {
2538  	struct fc_rport *rport = starget_to_rport(scsi_target(scmd->device));
2539  
2540  	if (rport->port_state == FC_PORTSTATE_BLOCKED)
2541  		return SCSI_EH_RESET_TIMER;
2542  
2543  	return SCSI_EH_NOT_HANDLED;
2544  }
2545  EXPORT_SYMBOL(fc_eh_timed_out);
2546  
2547  /*
2548   * Called by fc_user_scan to locate an rport on the shost that
2549   * matches the channel and target id, and invoke scsi_scan_target()
2550   * on the rport.
2551   */
2552  static void
fc_user_scan_tgt(struct Scsi_Host * shost,uint channel,uint id,u64 lun)2553  fc_user_scan_tgt(struct Scsi_Host *shost, uint channel, uint id, u64 lun)
2554  {
2555  	struct fc_rport *rport;
2556  	unsigned long flags;
2557  
2558  	spin_lock_irqsave(shost->host_lock, flags);
2559  
2560  	list_for_each_entry(rport, &fc_host_rports(shost), peers) {
2561  		if (rport->scsi_target_id == -1)
2562  			continue;
2563  
2564  		if ((rport->port_state != FC_PORTSTATE_ONLINE) &&
2565  			(rport->port_state != FC_PORTSTATE_MARGINAL))
2566  			continue;
2567  
2568  		if ((channel == rport->channel) &&
2569  		    (id == rport->scsi_target_id)) {
2570  			spin_unlock_irqrestore(shost->host_lock, flags);
2571  			scsi_scan_target(&rport->dev, channel, id, lun,
2572  					 SCSI_SCAN_MANUAL);
2573  			return;
2574  		}
2575  	}
2576  
2577  	spin_unlock_irqrestore(shost->host_lock, flags);
2578  }
2579  
2580  /*
2581   * Called via sysfs scan routines. Necessary, as the FC transport
2582   * wants to place all target objects below the rport object. So this
2583   * routine must invoke the scsi_scan_target() routine with the rport
2584   * object as the parent.
2585   */
2586  static int
fc_user_scan(struct Scsi_Host * shost,uint channel,uint id,u64 lun)2587  fc_user_scan(struct Scsi_Host *shost, uint channel, uint id, u64 lun)
2588  {
2589  	uint chlo, chhi;
2590  	uint tgtlo, tgthi;
2591  
2592  	if (((channel != SCAN_WILD_CARD) && (channel > shost->max_channel)) ||
2593  	    ((id != SCAN_WILD_CARD) && (id >= shost->max_id)) ||
2594  	    ((lun != SCAN_WILD_CARD) && (lun > shost->max_lun)))
2595  		return -EINVAL;
2596  
2597  	if (channel == SCAN_WILD_CARD) {
2598  		chlo = 0;
2599  		chhi = shost->max_channel + 1;
2600  	} else {
2601  		chlo = channel;
2602  		chhi = channel + 1;
2603  	}
2604  
2605  	if (id == SCAN_WILD_CARD) {
2606  		tgtlo = 0;
2607  		tgthi = shost->max_id;
2608  	} else {
2609  		tgtlo = id;
2610  		tgthi = id + 1;
2611  	}
2612  
2613  	for ( ; chlo < chhi; chlo++)
2614  		for ( ; tgtlo < tgthi; tgtlo++)
2615  			fc_user_scan_tgt(shost, chlo, tgtlo, lun);
2616  
2617  	return 0;
2618  }
2619  
2620  struct scsi_transport_template *
fc_attach_transport(struct fc_function_template * ft)2621  fc_attach_transport(struct fc_function_template *ft)
2622  {
2623  	int count;
2624  	struct fc_internal *i = kzalloc(sizeof(struct fc_internal),
2625  					GFP_KERNEL);
2626  
2627  	if (unlikely(!i))
2628  		return NULL;
2629  
2630  	i->t.target_attrs.ac.attrs = &i->starget_attrs[0];
2631  	i->t.target_attrs.ac.class = &fc_transport_class.class;
2632  	i->t.target_attrs.ac.match = fc_target_match;
2633  	i->t.target_size = sizeof(struct fc_starget_attrs);
2634  	transport_container_register(&i->t.target_attrs);
2635  
2636  	i->t.host_attrs.ac.attrs = &i->host_attrs[0];
2637  	i->t.host_attrs.ac.class = &fc_host_class.class;
2638  	i->t.host_attrs.ac.match = fc_host_match;
2639  	i->t.host_size = sizeof(struct fc_host_attrs);
2640  	if (ft->get_fc_host_stats)
2641  		i->t.host_attrs.statistics = &fc_statistics_group;
2642  	transport_container_register(&i->t.host_attrs);
2643  
2644  	i->rport_attr_cont.ac.attrs = &i->rport_attrs[0];
2645  	i->rport_attr_cont.ac.class = &fc_rport_class.class;
2646  	i->rport_attr_cont.ac.match = fc_rport_match;
2647  	i->rport_attr_cont.statistics = &fc_rport_statistics_group;
2648  	transport_container_register(&i->rport_attr_cont);
2649  
2650  	i->vport_attr_cont.ac.attrs = &i->vport_attrs[0];
2651  	i->vport_attr_cont.ac.class = &fc_vport_class.class;
2652  	i->vport_attr_cont.ac.match = fc_vport_match;
2653  	transport_container_register(&i->vport_attr_cont);
2654  
2655  	i->f = ft;
2656  
2657  	/* Transport uses the shost workq for scsi scanning */
2658  	i->t.create_work_queue = 1;
2659  
2660  	i->t.user_scan = fc_user_scan;
2661  
2662  	/*
2663  	 * Setup SCSI Target Attributes.
2664  	 */
2665  	count = 0;
2666  	SETUP_STARGET_ATTRIBUTE_RD(node_name);
2667  	SETUP_STARGET_ATTRIBUTE_RD(port_name);
2668  	SETUP_STARGET_ATTRIBUTE_RD(port_id);
2669  
2670  	BUG_ON(count > FC_STARGET_NUM_ATTRS);
2671  
2672  	i->starget_attrs[count] = NULL;
2673  
2674  
2675  	/*
2676  	 * Setup SCSI Host Attributes.
2677  	 */
2678  	count=0;
2679  	SETUP_HOST_ATTRIBUTE_RD(node_name);
2680  	SETUP_HOST_ATTRIBUTE_RD(port_name);
2681  	SETUP_HOST_ATTRIBUTE_RD(permanent_port_name);
2682  	SETUP_HOST_ATTRIBUTE_RD(supported_classes);
2683  	SETUP_HOST_ATTRIBUTE_RD(supported_fc4s);
2684  	SETUP_HOST_ATTRIBUTE_RD(supported_speeds);
2685  	SETUP_HOST_ATTRIBUTE_RD(maxframe_size);
2686  	if (ft->vport_create) {
2687  		SETUP_HOST_ATTRIBUTE_RD_NS(max_npiv_vports);
2688  		SETUP_HOST_ATTRIBUTE_RD_NS(npiv_vports_inuse);
2689  	}
2690  	SETUP_HOST_ATTRIBUTE_RD(serial_number);
2691  	SETUP_HOST_ATTRIBUTE_RD(manufacturer);
2692  	SETUP_HOST_ATTRIBUTE_RD(model);
2693  	SETUP_HOST_ATTRIBUTE_RD(model_description);
2694  	SETUP_HOST_ATTRIBUTE_RD(hardware_version);
2695  	SETUP_HOST_ATTRIBUTE_RD(driver_version);
2696  	SETUP_HOST_ATTRIBUTE_RD(firmware_version);
2697  	SETUP_HOST_ATTRIBUTE_RD(optionrom_version);
2698  
2699  	SETUP_HOST_ATTRIBUTE_RD(port_id);
2700  	SETUP_HOST_ATTRIBUTE_RD(port_type);
2701  	SETUP_HOST_ATTRIBUTE_RD(port_state);
2702  	SETUP_HOST_ATTRIBUTE_RD(active_fc4s);
2703  	SETUP_HOST_ATTRIBUTE_RD(speed);
2704  	SETUP_HOST_ATTRIBUTE_RD(fabric_name);
2705  	SETUP_HOST_ATTRIBUTE_RD(symbolic_name);
2706  	SETUP_HOST_ATTRIBUTE_RW(system_hostname);
2707  
2708  	/* Transport-managed attributes */
2709  	SETUP_PRIVATE_HOST_ATTRIBUTE_RW(dev_loss_tmo);
2710  	SETUP_PRIVATE_HOST_ATTRIBUTE_RW(tgtid_bind_type);
2711  	if (ft->issue_fc_host_lip)
2712  		SETUP_PRIVATE_HOST_ATTRIBUTE_RW(issue_lip);
2713  	if (ft->vport_create)
2714  		SETUP_PRIVATE_HOST_ATTRIBUTE_RW(vport_create);
2715  	if (ft->vport_delete)
2716  		SETUP_PRIVATE_HOST_ATTRIBUTE_RW(vport_delete);
2717  
2718  	BUG_ON(count > FC_HOST_NUM_ATTRS);
2719  
2720  	i->host_attrs[count] = NULL;
2721  
2722  	/*
2723  	 * Setup Remote Port Attributes.
2724  	 */
2725  	count=0;
2726  	SETUP_RPORT_ATTRIBUTE_RD(maxframe_size);
2727  	SETUP_RPORT_ATTRIBUTE_RD(supported_classes);
2728  	SETUP_RPORT_ATTRIBUTE_RW(dev_loss_tmo);
2729  	SETUP_PRIVATE_RPORT_ATTRIBUTE_RD(node_name);
2730  	SETUP_PRIVATE_RPORT_ATTRIBUTE_RD(port_name);
2731  	SETUP_PRIVATE_RPORT_ATTRIBUTE_RD(port_id);
2732  	SETUP_PRIVATE_RPORT_ATTRIBUTE_RD(roles);
2733  	SETUP_PRIVATE_RPORT_ATTRIBUTE_RW(port_state);
2734  	SETUP_PRIVATE_RPORT_ATTRIBUTE_RD(scsi_target_id);
2735  	SETUP_PRIVATE_RPORT_ATTRIBUTE_RW(fast_io_fail_tmo);
2736  
2737  	BUG_ON(count > FC_RPORT_NUM_ATTRS);
2738  
2739  	i->rport_attrs[count] = NULL;
2740  
2741  	/*
2742  	 * Setup Virtual Port Attributes.
2743  	 */
2744  	count=0;
2745  	SETUP_PRIVATE_VPORT_ATTRIBUTE_RD(vport_state);
2746  	SETUP_PRIVATE_VPORT_ATTRIBUTE_RD(vport_last_state);
2747  	SETUP_PRIVATE_VPORT_ATTRIBUTE_RD(node_name);
2748  	SETUP_PRIVATE_VPORT_ATTRIBUTE_RD(port_name);
2749  	SETUP_PRIVATE_VPORT_ATTRIBUTE_RD(roles);
2750  	SETUP_PRIVATE_VPORT_ATTRIBUTE_RD(vport_type);
2751  	SETUP_VPORT_ATTRIBUTE_RW(symbolic_name);
2752  	SETUP_VPORT_ATTRIBUTE_WR(vport_delete);
2753  	SETUP_VPORT_ATTRIBUTE_WR(vport_disable);
2754  
2755  	BUG_ON(count > FC_VPORT_NUM_ATTRS);
2756  
2757  	i->vport_attrs[count] = NULL;
2758  
2759  	return &i->t;
2760  }
2761  EXPORT_SYMBOL(fc_attach_transport);
2762  
fc_release_transport(struct scsi_transport_template * t)2763  void fc_release_transport(struct scsi_transport_template *t)
2764  {
2765  	struct fc_internal *i = to_fc_internal(t);
2766  
2767  	transport_container_unregister(&i->t.target_attrs);
2768  	transport_container_unregister(&i->t.host_attrs);
2769  	transport_container_unregister(&i->rport_attr_cont);
2770  	transport_container_unregister(&i->vport_attr_cont);
2771  
2772  	kfree(i);
2773  }
2774  EXPORT_SYMBOL(fc_release_transport);
2775  
2776  /**
2777   * fc_queue_work - Queue work to the fc_host workqueue.
2778   * @shost:	Pointer to Scsi_Host bound to fc_host.
2779   * @work:	Work to queue for execution.
2780   *
2781   * Return value:
2782   * 	1 - work queued for execution
2783   *	0 - work is already queued
2784   *	-EINVAL - work queue doesn't exist
2785   */
2786  static int
fc_queue_work(struct Scsi_Host * shost,struct work_struct * work)2787  fc_queue_work(struct Scsi_Host *shost, struct work_struct *work)
2788  {
2789  	if (unlikely(!fc_host_work_q(shost))) {
2790  		printk(KERN_ERR
2791  			"ERROR: FC host '%s' attempted to queue work, "
2792  			"when no workqueue created.\n", shost->hostt->name);
2793  		dump_stack();
2794  
2795  		return -EINVAL;
2796  	}
2797  
2798  	return queue_work(fc_host_work_q(shost), work);
2799  }
2800  
2801  /**
2802   * fc_flush_work - Flush a fc_host's workqueue.
2803   * @shost:	Pointer to Scsi_Host bound to fc_host.
2804   */
2805  static void
fc_flush_work(struct Scsi_Host * shost)2806  fc_flush_work(struct Scsi_Host *shost)
2807  {
2808  	if (!fc_host_work_q(shost)) {
2809  		printk(KERN_ERR
2810  			"ERROR: FC host '%s' attempted to flush work, "
2811  			"when no workqueue created.\n", shost->hostt->name);
2812  		dump_stack();
2813  		return;
2814  	}
2815  
2816  	flush_workqueue(fc_host_work_q(shost));
2817  }
2818  
2819  /**
2820   * fc_queue_devloss_work - Schedule work for the fc_host devloss workqueue.
2821   * @shost:	Pointer to Scsi_Host bound to fc_host.
2822   * @work:	Work to queue for execution.
2823   * @delay:	jiffies to delay the work queuing
2824   *
2825   * Return value:
2826   * 	1 on success / 0 already queued / < 0 for error
2827   */
2828  static int
fc_queue_devloss_work(struct Scsi_Host * shost,struct delayed_work * work,unsigned long delay)2829  fc_queue_devloss_work(struct Scsi_Host *shost, struct delayed_work *work,
2830  				unsigned long delay)
2831  {
2832  	if (unlikely(!fc_host_devloss_work_q(shost))) {
2833  		printk(KERN_ERR
2834  			"ERROR: FC host '%s' attempted to queue work, "
2835  			"when no workqueue created.\n", shost->hostt->name);
2836  		dump_stack();
2837  
2838  		return -EINVAL;
2839  	}
2840  
2841  	return queue_delayed_work(fc_host_devloss_work_q(shost), work, delay);
2842  }
2843  
2844  /**
2845   * fc_flush_devloss - Flush a fc_host's devloss workqueue.
2846   * @shost:	Pointer to Scsi_Host bound to fc_host.
2847   */
2848  static void
fc_flush_devloss(struct Scsi_Host * shost)2849  fc_flush_devloss(struct Scsi_Host *shost)
2850  {
2851  	if (!fc_host_devloss_work_q(shost)) {
2852  		printk(KERN_ERR
2853  			"ERROR: FC host '%s' attempted to flush work, "
2854  			"when no workqueue created.\n", shost->hostt->name);
2855  		dump_stack();
2856  		return;
2857  	}
2858  
2859  	flush_workqueue(fc_host_devloss_work_q(shost));
2860  }
2861  
2862  
2863  /**
2864   * fc_remove_host - called to terminate any fc_transport-related elements for a scsi host.
2865   * @shost:	Which &Scsi_Host
2866   *
2867   * This routine is expected to be called immediately preceding the
2868   * a driver's call to scsi_remove_host().
2869   *
2870   * WARNING: A driver utilizing the fc_transport, which fails to call
2871   *   this routine prior to scsi_remove_host(), will leave dangling
2872   *   objects in /sys/class/fc_remote_ports. Access to any of these
2873   *   objects can result in a system crash !!!
2874   *
2875   * Notes:
2876   *	This routine assumes no locks are held on entry.
2877   */
2878  void
fc_remove_host(struct Scsi_Host * shost)2879  fc_remove_host(struct Scsi_Host *shost)
2880  {
2881  	struct fc_vport *vport = NULL, *next_vport = NULL;
2882  	struct fc_rport *rport = NULL, *next_rport = NULL;
2883  	struct workqueue_struct *work_q;
2884  	struct fc_host_attrs *fc_host = shost_to_fc_host(shost);
2885  	unsigned long flags;
2886  
2887  	spin_lock_irqsave(shost->host_lock, flags);
2888  
2889  	/* Remove any vports */
2890  	list_for_each_entry_safe(vport, next_vport, &fc_host->vports, peers) {
2891  		vport->flags |= FC_VPORT_DELETING;
2892  		fc_queue_work(shost, &vport->vport_delete_work);
2893  	}
2894  
2895  	/* Remove any remote ports */
2896  	list_for_each_entry_safe(rport, next_rport,
2897  			&fc_host->rports, peers) {
2898  		list_del(&rport->peers);
2899  		rport->port_state = FC_PORTSTATE_DELETED;
2900  		fc_queue_work(shost, &rport->rport_delete_work);
2901  	}
2902  
2903  	list_for_each_entry_safe(rport, next_rport,
2904  			&fc_host->rport_bindings, peers) {
2905  		list_del(&rport->peers);
2906  		rport->port_state = FC_PORTSTATE_DELETED;
2907  		fc_queue_work(shost, &rport->rport_delete_work);
2908  	}
2909  
2910  	spin_unlock_irqrestore(shost->host_lock, flags);
2911  
2912  	/* flush all scan work items */
2913  	scsi_flush_work(shost);
2914  
2915  	/* flush all stgt delete, and rport delete work items, then kill it  */
2916  	if (fc_host->work_q) {
2917  		work_q = fc_host->work_q;
2918  		fc_host->work_q = NULL;
2919  		destroy_workqueue(work_q);
2920  	}
2921  
2922  	/* flush all devloss work items, then kill it  */
2923  	if (fc_host->devloss_work_q) {
2924  		work_q = fc_host->devloss_work_q;
2925  		fc_host->devloss_work_q = NULL;
2926  		destroy_workqueue(work_q);
2927  	}
2928  }
2929  EXPORT_SYMBOL(fc_remove_host);
2930  
fc_terminate_rport_io(struct fc_rport * rport)2931  static void fc_terminate_rport_io(struct fc_rport *rport)
2932  {
2933  	struct Scsi_Host *shost = rport_to_shost(rport);
2934  	struct fc_internal *i = to_fc_internal(shost->transportt);
2935  
2936  	/* Involve the LLDD if possible to terminate all io on the rport. */
2937  	if (i->f->terminate_rport_io)
2938  		i->f->terminate_rport_io(rport);
2939  
2940  	/*
2941  	 * Must unblock to flush queued IO. scsi-ml will fail incoming reqs.
2942  	 */
2943  	scsi_target_unblock(&rport->dev, SDEV_TRANSPORT_OFFLINE);
2944  }
2945  
2946  /**
2947   * fc_starget_delete - called to delete the scsi descendants of an rport
2948   * @work:	remote port to be operated on.
2949   *
2950   * Deletes target and all sdevs.
2951   */
2952  static void
fc_starget_delete(struct work_struct * work)2953  fc_starget_delete(struct work_struct *work)
2954  {
2955  	struct fc_rport *rport =
2956  		container_of(work, struct fc_rport, stgt_delete_work);
2957  
2958  	fc_terminate_rport_io(rport);
2959  	scsi_remove_target(&rport->dev);
2960  }
2961  
2962  
2963  /**
2964   * fc_rport_final_delete - finish rport termination and delete it.
2965   * @work:	remote port to be deleted.
2966   */
2967  static void
fc_rport_final_delete(struct work_struct * work)2968  fc_rport_final_delete(struct work_struct *work)
2969  {
2970  	struct fc_rport *rport =
2971  		container_of(work, struct fc_rport, rport_delete_work);
2972  	struct device *dev = &rport->dev;
2973  	struct Scsi_Host *shost = rport_to_shost(rport);
2974  	struct fc_internal *i = to_fc_internal(shost->transportt);
2975  	unsigned long flags;
2976  	int do_callback = 0;
2977  
2978  	fc_terminate_rport_io(rport);
2979  
2980  	/*
2981  	 * if a scan is pending, flush the SCSI Host work_q so that
2982  	 * that we can reclaim the rport scan work element.
2983  	 */
2984  	if (rport->flags & FC_RPORT_SCAN_PENDING)
2985  		scsi_flush_work(shost);
2986  
2987  	/*
2988  	 * Cancel any outstanding timers. These should really exist
2989  	 * only when rmmod'ing the LLDD and we're asking for
2990  	 * immediate termination of the rports
2991  	 */
2992  	spin_lock_irqsave(shost->host_lock, flags);
2993  	if (rport->flags & FC_RPORT_DEVLOSS_PENDING) {
2994  		spin_unlock_irqrestore(shost->host_lock, flags);
2995  		if (!cancel_delayed_work(&rport->fail_io_work))
2996  			fc_flush_devloss(shost);
2997  		if (!cancel_delayed_work(&rport->dev_loss_work))
2998  			fc_flush_devloss(shost);
2999  		cancel_work_sync(&rport->scan_work);
3000  		spin_lock_irqsave(shost->host_lock, flags);
3001  		rport->flags &= ~FC_RPORT_DEVLOSS_PENDING;
3002  	}
3003  	spin_unlock_irqrestore(shost->host_lock, flags);
3004  
3005  	/* Delete SCSI target and sdevs */
3006  	if (rport->scsi_target_id != -1)
3007  		fc_starget_delete(&rport->stgt_delete_work);
3008  
3009  	/*
3010  	 * Notify the driver that the rport is now dead. The LLDD will
3011  	 * also guarantee that any communication to the rport is terminated
3012  	 *
3013  	 * Avoid this call if we already called it when we preserved the
3014  	 * rport for the binding.
3015  	 */
3016  	spin_lock_irqsave(shost->host_lock, flags);
3017  	if (!(rport->flags & FC_RPORT_DEVLOSS_CALLBK_DONE) &&
3018  	    (i->f->dev_loss_tmo_callbk)) {
3019  		rport->flags |= FC_RPORT_DEVLOSS_CALLBK_DONE;
3020  		do_callback = 1;
3021  	}
3022  	spin_unlock_irqrestore(shost->host_lock, flags);
3023  
3024  	if (do_callback)
3025  		i->f->dev_loss_tmo_callbk(rport);
3026  
3027  	fc_bsg_remove(rport->rqst_q);
3028  
3029  	transport_remove_device(dev);
3030  	device_del(dev);
3031  	transport_destroy_device(dev);
3032  	scsi_host_put(shost);			/* for fc_host->rport list */
3033  	put_device(dev);			/* for self-reference */
3034  }
3035  
3036  
3037  /**
3038   * fc_remote_port_create - allocates and creates a remote FC port.
3039   * @shost:	scsi host the remote port is connected to.
3040   * @channel:	Channel on shost port connected to.
3041   * @ids:	The world wide names, fc address, and FC4 port
3042   *		roles for the remote port.
3043   *
3044   * Allocates and creates the remoter port structure, including the
3045   * class and sysfs creation.
3046   *
3047   * Notes:
3048   *	This routine assumes no locks are held on entry.
3049   */
3050  static struct fc_rport *
fc_remote_port_create(struct Scsi_Host * shost,int channel,struct fc_rport_identifiers * ids)3051  fc_remote_port_create(struct Scsi_Host *shost, int channel,
3052  		      struct fc_rport_identifiers  *ids)
3053  {
3054  	struct fc_host_attrs *fc_host = shost_to_fc_host(shost);
3055  	struct fc_internal *fci = to_fc_internal(shost->transportt);
3056  	struct fc_rport *rport;
3057  	struct device *dev;
3058  	unsigned long flags;
3059  	int error;
3060  	size_t size;
3061  
3062  	size = (sizeof(struct fc_rport) + fci->f->dd_fcrport_size);
3063  	rport = kzalloc(size, GFP_KERNEL);
3064  	if (unlikely(!rport)) {
3065  		printk(KERN_ERR "%s: allocation failure\n", __func__);
3066  		return NULL;
3067  	}
3068  
3069  	rport->maxframe_size = -1;
3070  	rport->supported_classes = FC_COS_UNSPECIFIED;
3071  	rport->dev_loss_tmo = fc_host->dev_loss_tmo;
3072  	memcpy(&rport->node_name, &ids->node_name, sizeof(rport->node_name));
3073  	memcpy(&rport->port_name, &ids->port_name, sizeof(rport->port_name));
3074  	rport->port_id = ids->port_id;
3075  	rport->roles = ids->roles;
3076  	rport->port_state = FC_PORTSTATE_ONLINE;
3077  	if (fci->f->dd_fcrport_size)
3078  		rport->dd_data = &rport[1];
3079  	rport->channel = channel;
3080  	rport->fast_io_fail_tmo = -1;
3081  
3082  	INIT_DELAYED_WORK(&rport->dev_loss_work, fc_timeout_deleted_rport);
3083  	INIT_DELAYED_WORK(&rport->fail_io_work, fc_timeout_fail_rport_io);
3084  	INIT_WORK(&rport->scan_work, fc_scsi_scan_rport);
3085  	INIT_WORK(&rport->stgt_delete_work, fc_starget_delete);
3086  	INIT_WORK(&rport->rport_delete_work, fc_rport_final_delete);
3087  
3088  	spin_lock_irqsave(shost->host_lock, flags);
3089  
3090  	rport->number = fc_host->next_rport_number++;
3091  	if ((rport->roles & FC_PORT_ROLE_FCP_TARGET) ||
3092  	    (rport->roles & FC_PORT_ROLE_FCP_DUMMY_INITIATOR))
3093  		rport->scsi_target_id = fc_host->next_target_id++;
3094  	else
3095  		rport->scsi_target_id = -1;
3096  	list_add_tail(&rport->peers, &fc_host->rports);
3097  	scsi_host_get(shost);			/* for fc_host->rport list */
3098  
3099  	spin_unlock_irqrestore(shost->host_lock, flags);
3100  
3101  	dev = &rport->dev;
3102  	device_initialize(dev);			/* takes self reference */
3103  	dev->parent = get_device(&shost->shost_gendev); /* parent reference */
3104  	dev->release = fc_rport_dev_release;
3105  	dev_set_name(dev, "rport-%d:%d-%d",
3106  		     shost->host_no, channel, rport->number);
3107  	transport_setup_device(dev);
3108  
3109  	error = device_add(dev);
3110  	if (error) {
3111  		printk(KERN_ERR "FC Remote Port device_add failed\n");
3112  		goto delete_rport;
3113  	}
3114  	transport_add_device(dev);
3115  	transport_configure_device(dev);
3116  
3117  	fc_bsg_rportadd(shost, rport);
3118  	/* ignore any bsg add error - we just can't do sgio */
3119  
3120  	if (rport->roles & FC_PORT_ROLE_FCP_TARGET) {
3121  		/* initiate a scan of the target */
3122  		rport->flags |= FC_RPORT_SCAN_PENDING;
3123  		scsi_queue_work(shost, &rport->scan_work);
3124  	}
3125  
3126  	return rport;
3127  
3128  delete_rport:
3129  	transport_destroy_device(dev);
3130  	spin_lock_irqsave(shost->host_lock, flags);
3131  	list_del(&rport->peers);
3132  	scsi_host_put(shost);			/* for fc_host->rport list */
3133  	spin_unlock_irqrestore(shost->host_lock, flags);
3134  	put_device(dev->parent);
3135  	kfree(rport);
3136  	return NULL;
3137  }
3138  
3139  /**
3140   * fc_remote_port_add - notify fc transport of the existence of a remote FC port.
3141   * @shost:	scsi host the remote port is connected to.
3142   * @channel:	Channel on shost port connected to.
3143   * @ids:	The world wide names, fc address, and FC4 port
3144   *		roles for the remote port.
3145   *
3146   * The LLDD calls this routine to notify the transport of the existence
3147   * of a remote port. The LLDD provides the unique identifiers (wwpn,wwn)
3148   * of the port, it's FC address (port_id), and the FC4 roles that are
3149   * active for the port.
3150   *
3151   * For ports that are FCP targets (aka scsi targets), the FC transport
3152   * maintains consistent target id bindings on behalf of the LLDD.
3153   * A consistent target id binding is an assignment of a target id to
3154   * a remote port identifier, which persists while the scsi host is
3155   * attached. The remote port can disappear, then later reappear, and
3156   * it's target id assignment remains the same. This allows for shifts
3157   * in FC addressing (if binding by wwpn or wwnn) with no apparent
3158   * changes to the scsi subsystem which is based on scsi host number and
3159   * target id values.  Bindings are only valid during the attachment of
3160   * the scsi host. If the host detaches, then later re-attaches, target
3161   * id bindings may change.
3162   *
3163   * This routine is responsible for returning a remote port structure.
3164   * The routine will search the list of remote ports it maintains
3165   * internally on behalf of consistent target id mappings. If found, the
3166   * remote port structure will be reused. Otherwise, a new remote port
3167   * structure will be allocated.
3168   *
3169   * Whenever a remote port is allocated, a new fc_remote_port class
3170   * device is created.
3171   *
3172   * Should not be called from interrupt context.
3173   *
3174   * Notes:
3175   *	This routine assumes no locks are held on entry.
3176   */
3177  struct fc_rport *
fc_remote_port_add(struct Scsi_Host * shost,int channel,struct fc_rport_identifiers * ids)3178  fc_remote_port_add(struct Scsi_Host *shost, int channel,
3179  	struct fc_rport_identifiers  *ids)
3180  {
3181  	struct fc_internal *fci = to_fc_internal(shost->transportt);
3182  	struct fc_host_attrs *fc_host = shost_to_fc_host(shost);
3183  	struct fc_rport *rport;
3184  	unsigned long flags;
3185  	int match = 0;
3186  
3187  	/* ensure any stgt delete functions are done */
3188  	fc_flush_work(shost);
3189  
3190  	/*
3191  	 * Search the list of "active" rports, for an rport that has been
3192  	 * deleted, but we've held off the real delete while the target
3193  	 * is in a "blocked" state.
3194  	 */
3195  	spin_lock_irqsave(shost->host_lock, flags);
3196  
3197  	list_for_each_entry(rport, &fc_host->rports, peers) {
3198  
3199  		if ((rport->port_state == FC_PORTSTATE_BLOCKED ||
3200  		     rport->port_state == FC_PORTSTATE_NOTPRESENT) &&
3201  			(rport->channel == channel)) {
3202  
3203  			switch (fc_host->tgtid_bind_type) {
3204  			case FC_TGTID_BIND_BY_WWPN:
3205  			case FC_TGTID_BIND_NONE:
3206  				if (rport->port_name == ids->port_name)
3207  					match = 1;
3208  				break;
3209  			case FC_TGTID_BIND_BY_WWNN:
3210  				if (rport->node_name == ids->node_name)
3211  					match = 1;
3212  				break;
3213  			case FC_TGTID_BIND_BY_ID:
3214  				if (rport->port_id == ids->port_id)
3215  					match = 1;
3216  				break;
3217  			}
3218  
3219  			if (match) {
3220  
3221  				memcpy(&rport->node_name, &ids->node_name,
3222  					sizeof(rport->node_name));
3223  				memcpy(&rport->port_name, &ids->port_name,
3224  					sizeof(rport->port_name));
3225  				rport->port_id = ids->port_id;
3226  
3227  				rport->port_state = FC_PORTSTATE_ONLINE;
3228  				rport->roles = ids->roles;
3229  
3230  				spin_unlock_irqrestore(shost->host_lock, flags);
3231  
3232  				if (fci->f->dd_fcrport_size)
3233  					memset(rport->dd_data, 0,
3234  						fci->f->dd_fcrport_size);
3235  
3236  				/*
3237  				 * If we were not a target, cancel the
3238  				 * io terminate and rport timers, and
3239  				 * we're done.
3240  				 *
3241  				 * If we were a target, but our new role
3242  				 * doesn't indicate a target, leave the
3243  				 * timers running expecting the role to
3244  				 * change as the target fully logs in. If
3245  				 * it doesn't, the target will be torn down.
3246  				 *
3247  				 * If we were a target, and our role shows
3248  				 * we're still a target, cancel the timers
3249  				 * and kick off a scan.
3250  				 */
3251  
3252  				/* was a target, not in roles */
3253  				if ((rport->scsi_target_id != -1) &&
3254  				    (!(ids->roles & FC_PORT_ROLE_FCP_TARGET)))
3255  					return rport;
3256  
3257  				/*
3258  				 * Stop the fail io and dev_loss timers.
3259  				 * If they flush, the port_state will
3260  				 * be checked and will NOOP the function.
3261  				 */
3262  				if (!cancel_delayed_work(&rport->fail_io_work))
3263  					fc_flush_devloss(shost);
3264  				if (!cancel_delayed_work(&rport->dev_loss_work))
3265  					fc_flush_devloss(shost);
3266  
3267  				spin_lock_irqsave(shost->host_lock, flags);
3268  
3269  				rport->flags &= ~(FC_RPORT_FAST_FAIL_TIMEDOUT |
3270  						  FC_RPORT_DEVLOSS_PENDING |
3271  						  FC_RPORT_DEVLOSS_CALLBK_DONE);
3272  
3273  				spin_unlock_irqrestore(shost->host_lock, flags);
3274  
3275  				/* if target, initiate a scan */
3276  				if (rport->scsi_target_id != -1) {
3277  					scsi_target_unblock(&rport->dev,
3278  							    SDEV_RUNNING);
3279  					spin_lock_irqsave(shost->host_lock,
3280  							  flags);
3281  					rport->flags |= FC_RPORT_SCAN_PENDING;
3282  					scsi_queue_work(shost,
3283  							&rport->scan_work);
3284  					spin_unlock_irqrestore(shost->host_lock,
3285  							flags);
3286  				}
3287  
3288  				fc_bsg_goose_queue(rport);
3289  
3290  				return rport;
3291  			}
3292  		}
3293  	}
3294  
3295  	/*
3296  	 * Search the bindings array
3297  	 * Note: if never a FCP target, you won't be on this list
3298  	 */
3299  	if (fc_host->tgtid_bind_type != FC_TGTID_BIND_NONE) {
3300  
3301  		/* search for a matching consistent binding */
3302  
3303  		list_for_each_entry(rport, &fc_host->rport_bindings,
3304  					peers) {
3305  			if (rport->channel != channel)
3306  				continue;
3307  
3308  			switch (fc_host->tgtid_bind_type) {
3309  			case FC_TGTID_BIND_BY_WWPN:
3310  				if (rport->port_name == ids->port_name)
3311  					match = 1;
3312  				break;
3313  			case FC_TGTID_BIND_BY_WWNN:
3314  				if (rport->node_name == ids->node_name)
3315  					match = 1;
3316  				break;
3317  			case FC_TGTID_BIND_BY_ID:
3318  				if (rport->port_id == ids->port_id)
3319  					match = 1;
3320  				break;
3321  			case FC_TGTID_BIND_NONE: /* to keep compiler happy */
3322  				break;
3323  			}
3324  
3325  			if (match) {
3326  				list_move_tail(&rport->peers, &fc_host->rports);
3327  				break;
3328  			}
3329  		}
3330  
3331  		if (match) {
3332  			memcpy(&rport->node_name, &ids->node_name,
3333  				sizeof(rport->node_name));
3334  			memcpy(&rport->port_name, &ids->port_name,
3335  				sizeof(rport->port_name));
3336  			rport->port_id = ids->port_id;
3337  			rport->port_state = FC_PORTSTATE_ONLINE;
3338  			rport->flags &= ~FC_RPORT_FAST_FAIL_TIMEDOUT;
3339  
3340  			if (fci->f->dd_fcrport_size)
3341  				memset(rport->dd_data, 0,
3342  						fci->f->dd_fcrport_size);
3343  			spin_unlock_irqrestore(shost->host_lock, flags);
3344  
3345  			fc_remote_port_rolechg(rport, ids->roles);
3346  			return rport;
3347  		}
3348  	}
3349  
3350  	spin_unlock_irqrestore(shost->host_lock, flags);
3351  
3352  	/* No consistent binding found - create new remote port entry */
3353  	rport = fc_remote_port_create(shost, channel, ids);
3354  
3355  	return rport;
3356  }
3357  EXPORT_SYMBOL(fc_remote_port_add);
3358  
3359  
3360  /**
3361   * fc_remote_port_delete - notifies the fc transport that a remote port is no longer in existence.
3362   * @rport:	The remote port that no longer exists
3363   *
3364   * The LLDD calls this routine to notify the transport that a remote
3365   * port is no longer part of the topology. Note: Although a port
3366   * may no longer be part of the topology, it may persist in the remote
3367   * ports displayed by the fc_host. We do this under 2 conditions:
3368   *
3369   * 1) If the port was a scsi target, we delay its deletion by "blocking" it.
3370   *    This allows the port to temporarily disappear, then reappear without
3371   *    disrupting the SCSI device tree attached to it. During the "blocked"
3372   *    period the port will still exist.
3373   *
3374   * 2) If the port was a scsi target and disappears for longer than we
3375   *    expect, we'll delete the port and the tear down the SCSI device tree
3376   *    attached to it. However, we want to semi-persist the target id assigned
3377   *    to that port if it eventually does exist. The port structure will
3378   *    remain (although with minimal information) so that the target id
3379   *    bindings also remain.
3380   *
3381   * If the remote port is not an FCP Target, it will be fully torn down
3382   * and deallocated, including the fc_remote_port class device.
3383   *
3384   * If the remote port is an FCP Target, the port will be placed in a
3385   * temporary blocked state. From the LLDD's perspective, the rport no
3386   * longer exists. From the SCSI midlayer's perspective, the SCSI target
3387   * exists, but all sdevs on it are blocked from further I/O. The following
3388   * is then expected.
3389   *
3390   *   If the remote port does not return (signaled by a LLDD call to
3391   *   fc_remote_port_add()) within the dev_loss_tmo timeout, then the
3392   *   scsi target is removed - killing all outstanding i/o and removing the
3393   *   scsi devices attached to it. The port structure will be marked Not
3394   *   Present and be partially cleared, leaving only enough information to
3395   *   recognize the remote port relative to the scsi target id binding if
3396   *   it later appears.  The port will remain as long as there is a valid
3397   *   binding (e.g. until the user changes the binding type or unloads the
3398   *   scsi host with the binding).
3399   *
3400   *   If the remote port returns within the dev_loss_tmo value (and matches
3401   *   according to the target id binding type), the port structure will be
3402   *   reused. If it is no longer a SCSI target, the target will be torn
3403   *   down. If it continues to be a SCSI target, then the target will be
3404   *   unblocked (allowing i/o to be resumed), and a scan will be activated
3405   *   to ensure that all luns are detected.
3406   *
3407   * Called from normal process context only - cannot be called from interrupt.
3408   *
3409   * Notes:
3410   *	This routine assumes no locks are held on entry.
3411   */
3412  void
fc_remote_port_delete(struct fc_rport * rport)3413  fc_remote_port_delete(struct fc_rport  *rport)
3414  {
3415  	struct Scsi_Host *shost = rport_to_shost(rport);
3416  	unsigned long timeout = rport->dev_loss_tmo;
3417  	unsigned long flags;
3418  
3419  	/*
3420  	 * No need to flush the fc_host work_q's, as all adds are synchronous.
3421  	 *
3422  	 * We do need to reclaim the rport scan work element, so eventually
3423  	 * (in fc_rport_final_delete()) we'll flush the scsi host work_q if
3424  	 * there's still a scan pending.
3425  	 */
3426  
3427  	spin_lock_irqsave(shost->host_lock, flags);
3428  
3429  	if ((rport->port_state != FC_PORTSTATE_ONLINE) &&
3430  		(rport->port_state != FC_PORTSTATE_MARGINAL)) {
3431  		spin_unlock_irqrestore(shost->host_lock, flags);
3432  		return;
3433  	}
3434  
3435  	/*
3436  	 * In the past, we if this was not an FCP-Target, we would
3437  	 * unconditionally just jump to deleting the rport.
3438  	 * However, rports can be used as node containers by the LLDD,
3439  	 * and its not appropriate to just terminate the rport at the
3440  	 * first sign of a loss in connectivity. The LLDD may want to
3441  	 * send ELS traffic to re-validate the login. If the rport is
3442  	 * immediately deleted, it makes it inappropriate for a node
3443  	 * container.
3444  	 * So... we now unconditionally wait dev_loss_tmo before
3445  	 * destroying an rport.
3446  	 */
3447  
3448  	rport->port_state = FC_PORTSTATE_BLOCKED;
3449  
3450  	rport->flags |= FC_RPORT_DEVLOSS_PENDING;
3451  
3452  	spin_unlock_irqrestore(shost->host_lock, flags);
3453  
3454  	scsi_block_targets(shost, &rport->dev);
3455  
3456  	/* see if we need to kill io faster than waiting for device loss */
3457  	if ((rport->fast_io_fail_tmo != -1) &&
3458  	    (rport->fast_io_fail_tmo < timeout))
3459  		fc_queue_devloss_work(shost, &rport->fail_io_work,
3460  					rport->fast_io_fail_tmo * HZ);
3461  
3462  	/* cap the length the devices can be blocked until they are deleted */
3463  	fc_queue_devloss_work(shost, &rport->dev_loss_work, timeout * HZ);
3464  }
3465  EXPORT_SYMBOL(fc_remote_port_delete);
3466  
3467  /**
3468   * fc_remote_port_rolechg - notifies the fc transport that the roles on a remote may have changed.
3469   * @rport:	The remote port that changed.
3470   * @roles:      New roles for this port.
3471   *
3472   * Description: The LLDD calls this routine to notify the transport that the
3473   * roles on a remote port may have changed. The largest effect of this is
3474   * if a port now becomes a FCP Target, it must be allocated a
3475   * scsi target id.  If the port is no longer a FCP target, any
3476   * scsi target id value assigned to it will persist in case the
3477   * role changes back to include FCP Target. No changes in the scsi
3478   * midlayer will be invoked if the role changes (in the expectation
3479   * that the role will be resumed. If it doesn't normal error processing
3480   * will take place).
3481   *
3482   * Should not be called from interrupt context.
3483   *
3484   * Notes:
3485   *	This routine assumes no locks are held on entry.
3486   */
3487  void
fc_remote_port_rolechg(struct fc_rport * rport,u32 roles)3488  fc_remote_port_rolechg(struct fc_rport  *rport, u32 roles)
3489  {
3490  	struct Scsi_Host *shost = rport_to_shost(rport);
3491  	struct fc_host_attrs *fc_host = shost_to_fc_host(shost);
3492  	unsigned long flags;
3493  	int create = 0;
3494  
3495  	spin_lock_irqsave(shost->host_lock, flags);
3496  	if (roles & FC_PORT_ROLE_FCP_TARGET) {
3497  		if (rport->scsi_target_id == -1) {
3498  			rport->scsi_target_id = fc_host->next_target_id++;
3499  			create = 1;
3500  		} else if (!(rport->roles & FC_PORT_ROLE_FCP_TARGET))
3501  			create = 1;
3502  	}
3503  
3504  	rport->roles = roles;
3505  
3506  	spin_unlock_irqrestore(shost->host_lock, flags);
3507  
3508  	if (create) {
3509  		/*
3510  		 * There may have been a delete timer running on the
3511  		 * port. Ensure that it is cancelled as we now know
3512  		 * the port is an FCP Target.
3513  		 * Note: we know the rport exists and is in an online
3514  		 *  state as the LLDD would not have had an rport
3515  		 *  reference to pass us.
3516  		 *
3517  		 * Take no action on the del_timer failure as the state
3518  		 * machine state change will validate the
3519  		 * transaction.
3520  		 */
3521  		if (!cancel_delayed_work(&rport->fail_io_work))
3522  			fc_flush_devloss(shost);
3523  		if (!cancel_delayed_work(&rport->dev_loss_work))
3524  			fc_flush_devloss(shost);
3525  
3526  		spin_lock_irqsave(shost->host_lock, flags);
3527  		rport->flags &= ~(FC_RPORT_FAST_FAIL_TIMEDOUT |
3528  				  FC_RPORT_DEVLOSS_PENDING |
3529  				  FC_RPORT_DEVLOSS_CALLBK_DONE);
3530  		spin_unlock_irqrestore(shost->host_lock, flags);
3531  
3532  		/* ensure any stgt delete functions are done */
3533  		fc_flush_work(shost);
3534  
3535  		scsi_target_unblock(&rport->dev, SDEV_RUNNING);
3536  		/* initiate a scan of the target */
3537  		spin_lock_irqsave(shost->host_lock, flags);
3538  		rport->flags |= FC_RPORT_SCAN_PENDING;
3539  		scsi_queue_work(shost, &rport->scan_work);
3540  		spin_unlock_irqrestore(shost->host_lock, flags);
3541  	}
3542  }
3543  EXPORT_SYMBOL(fc_remote_port_rolechg);
3544  
3545  /**
3546   * fc_timeout_deleted_rport - Timeout handler for a deleted remote port.
3547   * @work:	rport target that failed to reappear in the allotted time.
3548   *
3549   * Description: An attempt to delete a remote port blocks, and if it fails
3550   *              to return in the allotted time this gets called.
3551   */
3552  static void
fc_timeout_deleted_rport(struct work_struct * work)3553  fc_timeout_deleted_rport(struct work_struct *work)
3554  {
3555  	struct fc_rport *rport =
3556  		container_of(work, struct fc_rport, dev_loss_work.work);
3557  	struct Scsi_Host *shost = rport_to_shost(rport);
3558  	struct fc_internal *i = to_fc_internal(shost->transportt);
3559  	struct fc_host_attrs *fc_host = shost_to_fc_host(shost);
3560  	unsigned long flags;
3561  	int do_callback = 0;
3562  
3563  	spin_lock_irqsave(shost->host_lock, flags);
3564  
3565  	rport->flags &= ~FC_RPORT_DEVLOSS_PENDING;
3566  
3567  	/*
3568  	 * If the port is ONLINE, then it came back. If it was a SCSI
3569  	 * target, validate it still is. If not, tear down the
3570  	 * scsi_target on it.
3571  	 */
3572  	if (((rport->port_state == FC_PORTSTATE_ONLINE) ||
3573  		(rport->port_state == FC_PORTSTATE_MARGINAL)) &&
3574  	    (rport->scsi_target_id != -1) &&
3575  	    !(rport->roles & FC_PORT_ROLE_FCP_TARGET)) {
3576  		dev_printk(KERN_ERR, &rport->dev,
3577  			"blocked FC remote port time out: no longer"
3578  			" a FCP target, removing starget\n");
3579  		spin_unlock_irqrestore(shost->host_lock, flags);
3580  		scsi_target_unblock(&rport->dev, SDEV_TRANSPORT_OFFLINE);
3581  		fc_queue_work(shost, &rport->stgt_delete_work);
3582  		return;
3583  	}
3584  
3585  	/* NOOP state - we're flushing workq's */
3586  	if (rport->port_state != FC_PORTSTATE_BLOCKED) {
3587  		spin_unlock_irqrestore(shost->host_lock, flags);
3588  		dev_printk(KERN_ERR, &rport->dev,
3589  			"blocked FC remote port time out: leaving"
3590  			" rport%s alone\n",
3591  			(rport->scsi_target_id != -1) ?  " and starget" : "");
3592  		return;
3593  	}
3594  
3595  	if ((fc_host->tgtid_bind_type == FC_TGTID_BIND_NONE) ||
3596  	    (rport->scsi_target_id == -1)) {
3597  		list_del(&rport->peers);
3598  		rport->port_state = FC_PORTSTATE_DELETED;
3599  		dev_printk(KERN_ERR, &rport->dev,
3600  			"blocked FC remote port time out: removing"
3601  			" rport%s\n",
3602  			(rport->scsi_target_id != -1) ?  " and starget" : "");
3603  		fc_queue_work(shost, &rport->rport_delete_work);
3604  		spin_unlock_irqrestore(shost->host_lock, flags);
3605  		return;
3606  	}
3607  
3608  	dev_printk(KERN_ERR, &rport->dev,
3609  		"blocked FC remote port time out: removing target and "
3610  		"saving binding\n");
3611  
3612  	list_move_tail(&rport->peers, &fc_host->rport_bindings);
3613  
3614  	/*
3615  	 * Note: We do not remove or clear the hostdata area. This allows
3616  	 *   host-specific target data to persist along with the
3617  	 *   scsi_target_id. It's up to the host to manage it's hostdata area.
3618  	 */
3619  
3620  	/*
3621  	 * Reinitialize port attributes that may change if the port comes back.
3622  	 */
3623  	rport->maxframe_size = -1;
3624  	rport->supported_classes = FC_COS_UNSPECIFIED;
3625  	rport->roles = FC_PORT_ROLE_UNKNOWN;
3626  	rport->port_state = FC_PORTSTATE_NOTPRESENT;
3627  	rport->flags &= ~FC_RPORT_FAST_FAIL_TIMEDOUT;
3628  
3629  	/*
3630  	 * Pre-emptively kill I/O rather than waiting for the work queue
3631  	 * item to teardown the starget. (FCOE libFC folks prefer this
3632  	 * and to have the rport_port_id still set when it's done).
3633  	 */
3634  	spin_unlock_irqrestore(shost->host_lock, flags);
3635  	fc_terminate_rport_io(rport);
3636  
3637  	spin_lock_irqsave(shost->host_lock, flags);
3638  
3639  	if (rport->port_state == FC_PORTSTATE_NOTPRESENT) {	/* still missing */
3640  
3641  		/* remove the identifiers that aren't used in the consisting binding */
3642  		switch (fc_host->tgtid_bind_type) {
3643  		case FC_TGTID_BIND_BY_WWPN:
3644  			rport->node_name = -1;
3645  			rport->port_id = -1;
3646  			break;
3647  		case FC_TGTID_BIND_BY_WWNN:
3648  			rport->port_name = -1;
3649  			rport->port_id = -1;
3650  			break;
3651  		case FC_TGTID_BIND_BY_ID:
3652  			rport->node_name = -1;
3653  			rport->port_name = -1;
3654  			break;
3655  		case FC_TGTID_BIND_NONE:	/* to keep compiler happy */
3656  			break;
3657  		}
3658  
3659  		/*
3660  		 * As this only occurs if the remote port (scsi target)
3661  		 * went away and didn't come back - we'll remove
3662  		 * all attached scsi devices.
3663  		 */
3664  		rport->flags |= FC_RPORT_DEVLOSS_CALLBK_DONE;
3665  		fc_queue_work(shost, &rport->stgt_delete_work);
3666  
3667  		do_callback = 1;
3668  	}
3669  
3670  	spin_unlock_irqrestore(shost->host_lock, flags);
3671  
3672  	/*
3673  	 * Notify the driver that the rport is now dead. The LLDD will
3674  	 * also guarantee that any communication to the rport is terminated
3675  	 *
3676  	 * Note: we set the CALLBK_DONE flag above to correspond
3677  	 */
3678  	if (do_callback && i->f->dev_loss_tmo_callbk)
3679  		i->f->dev_loss_tmo_callbk(rport);
3680  }
3681  
3682  
3683  /**
3684   * fc_timeout_fail_rport_io - Timeout handler for a fast io failing on a disconnected SCSI target.
3685   * @work:	rport to terminate io on.
3686   *
3687   * Notes: Only requests the failure of the io, not that all are flushed
3688   *    prior to returning.
3689   */
3690  static void
fc_timeout_fail_rport_io(struct work_struct * work)3691  fc_timeout_fail_rport_io(struct work_struct *work)
3692  {
3693  	struct fc_rport *rport =
3694  		container_of(work, struct fc_rport, fail_io_work.work);
3695  
3696  	if (rport->port_state != FC_PORTSTATE_BLOCKED)
3697  		return;
3698  
3699  	rport->flags |= FC_RPORT_FAST_FAIL_TIMEDOUT;
3700  	fc_terminate_rport_io(rport);
3701  }
3702  
3703  /**
3704   * fc_scsi_scan_rport - called to perform a scsi scan on a remote port.
3705   * @work:	remote port to be scanned.
3706   */
3707  static void
fc_scsi_scan_rport(struct work_struct * work)3708  fc_scsi_scan_rport(struct work_struct *work)
3709  {
3710  	struct fc_rport *rport =
3711  		container_of(work, struct fc_rport, scan_work);
3712  	struct Scsi_Host *shost = rport_to_shost(rport);
3713  	struct fc_internal *i = to_fc_internal(shost->transportt);
3714  	unsigned long flags;
3715  
3716  	if (((rport->port_state == FC_PORTSTATE_ONLINE) ||
3717  		(rport->port_state == FC_PORTSTATE_MARGINAL)) &&
3718  	    (rport->roles & FC_PORT_ROLE_FCP_TARGET) &&
3719  	    !(i->f->disable_target_scan)) {
3720  		scsi_scan_target(&rport->dev, rport->channel,
3721  				 rport->scsi_target_id, SCAN_WILD_CARD,
3722  				 SCSI_SCAN_RESCAN);
3723  	}
3724  
3725  	spin_lock_irqsave(shost->host_lock, flags);
3726  	rport->flags &= ~FC_RPORT_SCAN_PENDING;
3727  	spin_unlock_irqrestore(shost->host_lock, flags);
3728  }
3729  
3730  /**
3731   * fc_block_rport() - Block SCSI eh thread for blocked fc_rport.
3732   * @rport: Remote port that scsi_eh is trying to recover.
3733   *
3734   * This routine can be called from a FC LLD scsi_eh callback. It
3735   * blocks the scsi_eh thread until the fc_rport leaves the
3736   * FC_PORTSTATE_BLOCKED, or the fast_io_fail_tmo fires. This is
3737   * necessary to avoid the scsi_eh failing recovery actions for blocked
3738   * rports which would lead to offlined SCSI devices.
3739   *
3740   * Returns: 0 if the fc_rport left the state FC_PORTSTATE_BLOCKED.
3741   *	    FAST_IO_FAIL if the fast_io_fail_tmo fired, this should be
3742   *	    passed back to scsi_eh.
3743   */
fc_block_rport(struct fc_rport * rport)3744  int fc_block_rport(struct fc_rport *rport)
3745  {
3746  	struct Scsi_Host *shost = rport_to_shost(rport);
3747  	unsigned long flags;
3748  
3749  	spin_lock_irqsave(shost->host_lock, flags);
3750  	while (rport->port_state == FC_PORTSTATE_BLOCKED &&
3751  	       !(rport->flags & FC_RPORT_FAST_FAIL_TIMEDOUT)) {
3752  		spin_unlock_irqrestore(shost->host_lock, flags);
3753  		msleep(1000);
3754  		spin_lock_irqsave(shost->host_lock, flags);
3755  	}
3756  	spin_unlock_irqrestore(shost->host_lock, flags);
3757  
3758  	if (rport->flags & FC_RPORT_FAST_FAIL_TIMEDOUT)
3759  		return FAST_IO_FAIL;
3760  
3761  	return 0;
3762  }
3763  EXPORT_SYMBOL(fc_block_rport);
3764  
3765  /**
3766   * fc_block_scsi_eh - Block SCSI eh thread for blocked fc_rport
3767   * @cmnd: SCSI command that scsi_eh is trying to recover
3768   *
3769   * This routine can be called from a FC LLD scsi_eh callback. It
3770   * blocks the scsi_eh thread until the fc_rport leaves the
3771   * FC_PORTSTATE_BLOCKED, or the fast_io_fail_tmo fires. This is
3772   * necessary to avoid the scsi_eh failing recovery actions for blocked
3773   * rports which would lead to offlined SCSI devices.
3774   *
3775   * Returns: 0 if the fc_rport left the state FC_PORTSTATE_BLOCKED.
3776   *	    FAST_IO_FAIL if the fast_io_fail_tmo fired, this should be
3777   *	    passed back to scsi_eh.
3778   */
fc_block_scsi_eh(struct scsi_cmnd * cmnd)3779  int fc_block_scsi_eh(struct scsi_cmnd *cmnd)
3780  {
3781  	struct fc_rport *rport = starget_to_rport(scsi_target(cmnd->device));
3782  
3783  	if (WARN_ON_ONCE(!rport))
3784  		return FAST_IO_FAIL;
3785  
3786  	return fc_block_rport(rport);
3787  }
3788  EXPORT_SYMBOL(fc_block_scsi_eh);
3789  
3790  /*
3791   * fc_eh_should_retry_cmd - Checks if the cmd should be retried or not
3792   * @scmd:        The SCSI command to be checked
3793   *
3794   * This checks the rport state to decide if a cmd is
3795   * retryable.
3796   *
3797   * Returns: true if the rport state is not in marginal state.
3798   */
fc_eh_should_retry_cmd(struct scsi_cmnd * scmd)3799  bool fc_eh_should_retry_cmd(struct scsi_cmnd *scmd)
3800  {
3801  	struct fc_rport *rport = starget_to_rport(scsi_target(scmd->device));
3802  
3803  	if ((rport->port_state != FC_PORTSTATE_ONLINE) &&
3804  		(scsi_cmd_to_rq(scmd)->cmd_flags & REQ_FAILFAST_TRANSPORT)) {
3805  		set_host_byte(scmd, DID_TRANSPORT_MARGINAL);
3806  		return false;
3807  	}
3808  	return true;
3809  }
3810  EXPORT_SYMBOL_GPL(fc_eh_should_retry_cmd);
3811  
3812  /**
3813   * fc_vport_setup - allocates and creates a FC virtual port.
3814   * @shost:	scsi host the virtual port is connected to.
3815   * @channel:	Channel on shost port connected to.
3816   * @pdev:	parent device for vport
3817   * @ids:	The world wide names, FC4 port roles, etc for
3818   *              the virtual port.
3819   * @ret_vport:	The pointer to the created vport.
3820   *
3821   * Allocates and creates the vport structure, calls the parent host
3822   * to instantiate the vport, this completes w/ class and sysfs creation.
3823   *
3824   * Notes:
3825   *	This routine assumes no locks are held on entry.
3826   */
3827  static int
fc_vport_setup(struct Scsi_Host * shost,int channel,struct device * pdev,struct fc_vport_identifiers * ids,struct fc_vport ** ret_vport)3828  fc_vport_setup(struct Scsi_Host *shost, int channel, struct device *pdev,
3829  	struct fc_vport_identifiers  *ids, struct fc_vport **ret_vport)
3830  {
3831  	struct fc_host_attrs *fc_host = shost_to_fc_host(shost);
3832  	struct fc_internal *fci = to_fc_internal(shost->transportt);
3833  	struct fc_vport *vport;
3834  	struct device *dev;
3835  	unsigned long flags;
3836  	size_t size;
3837  	int error;
3838  
3839  	*ret_vport = NULL;
3840  
3841  	if ( ! fci->f->vport_create)
3842  		return -ENOENT;
3843  
3844  	size = (sizeof(struct fc_vport) + fci->f->dd_fcvport_size);
3845  	vport = kzalloc(size, GFP_KERNEL);
3846  	if (unlikely(!vport)) {
3847  		printk(KERN_ERR "%s: allocation failure\n", __func__);
3848  		return -ENOMEM;
3849  	}
3850  
3851  	vport->vport_state = FC_VPORT_UNKNOWN;
3852  	vport->vport_last_state = FC_VPORT_UNKNOWN;
3853  	vport->node_name = ids->node_name;
3854  	vport->port_name = ids->port_name;
3855  	vport->roles = ids->roles;
3856  	vport->vport_type = ids->vport_type;
3857  	if (fci->f->dd_fcvport_size)
3858  		vport->dd_data = &vport[1];
3859  	vport->shost = shost;
3860  	vport->channel = channel;
3861  	vport->flags = FC_VPORT_CREATING;
3862  	INIT_WORK(&vport->vport_delete_work, fc_vport_sched_delete);
3863  
3864  	spin_lock_irqsave(shost->host_lock, flags);
3865  
3866  	if (fc_host->npiv_vports_inuse >= fc_host->max_npiv_vports) {
3867  		spin_unlock_irqrestore(shost->host_lock, flags);
3868  		kfree(vport);
3869  		return -ENOSPC;
3870  	}
3871  	fc_host->npiv_vports_inuse++;
3872  	vport->number = fc_host->next_vport_number++;
3873  	list_add_tail(&vport->peers, &fc_host->vports);
3874  	scsi_host_get(shost);			/* for fc_host->vport list */
3875  
3876  	spin_unlock_irqrestore(shost->host_lock, flags);
3877  
3878  	dev = &vport->dev;
3879  	device_initialize(dev);			/* takes self reference */
3880  	dev->parent = get_device(pdev);		/* takes parent reference */
3881  	dev->release = fc_vport_dev_release;
3882  	dev_set_name(dev, "vport-%d:%d-%d",
3883  		     shost->host_no, channel, vport->number);
3884  	transport_setup_device(dev);
3885  
3886  	error = device_add(dev);
3887  	if (error) {
3888  		printk(KERN_ERR "FC Virtual Port device_add failed\n");
3889  		goto delete_vport;
3890  	}
3891  	transport_add_device(dev);
3892  	transport_configure_device(dev);
3893  
3894  	error = fci->f->vport_create(vport, ids->disable);
3895  	if (error) {
3896  		printk(KERN_ERR "FC Virtual Port LLDD Create failed\n");
3897  		goto delete_vport_all;
3898  	}
3899  
3900  	/*
3901  	 * if the parent isn't the physical adapter's Scsi_Host, ensure
3902  	 * the Scsi_Host at least contains a symlink to the vport.
3903  	 */
3904  	if (pdev != &shost->shost_gendev) {
3905  		error = sysfs_create_link(&shost->shost_gendev.kobj,
3906  				 &dev->kobj, dev_name(dev));
3907  		if (error)
3908  			printk(KERN_ERR
3909  				"%s: Cannot create vport symlinks for "
3910  				"%s, err=%d\n",
3911  				__func__, dev_name(dev), error);
3912  	}
3913  	spin_lock_irqsave(shost->host_lock, flags);
3914  	vport->flags &= ~FC_VPORT_CREATING;
3915  	spin_unlock_irqrestore(shost->host_lock, flags);
3916  
3917  	dev_printk(KERN_NOTICE, pdev,
3918  			"%s created via shost%d channel %d\n", dev_name(dev),
3919  			shost->host_no, channel);
3920  
3921  	*ret_vport = vport;
3922  
3923  	return 0;
3924  
3925  delete_vport_all:
3926  	transport_remove_device(dev);
3927  	device_del(dev);
3928  delete_vport:
3929  	transport_destroy_device(dev);
3930  	spin_lock_irqsave(shost->host_lock, flags);
3931  	list_del(&vport->peers);
3932  	scsi_host_put(shost);			/* for fc_host->vport list */
3933  	fc_host->npiv_vports_inuse--;
3934  	spin_unlock_irqrestore(shost->host_lock, flags);
3935  	put_device(dev->parent);
3936  	kfree(vport);
3937  
3938  	return error;
3939  }
3940  
3941  /**
3942   * fc_vport_create - Admin App or LLDD requests creation of a vport
3943   * @shost:	scsi host the virtual port is connected to.
3944   * @channel:	channel on shost port connected to.
3945   * @ids:	The world wide names, FC4 port roles, etc for
3946   *              the virtual port.
3947   *
3948   * Notes:
3949   *	This routine assumes no locks are held on entry.
3950   */
3951  struct fc_vport *
fc_vport_create(struct Scsi_Host * shost,int channel,struct fc_vport_identifiers * ids)3952  fc_vport_create(struct Scsi_Host *shost, int channel,
3953  	struct fc_vport_identifiers *ids)
3954  {
3955  	int stat;
3956  	struct fc_vport *vport;
3957  
3958  	stat = fc_vport_setup(shost, channel, &shost->shost_gendev,
3959  		 ids, &vport);
3960  	return stat ? NULL : vport;
3961  }
3962  EXPORT_SYMBOL(fc_vport_create);
3963  
3964  /**
3965   * fc_vport_terminate - Admin App or LLDD requests termination of a vport
3966   * @vport:	fc_vport to be terminated
3967   *
3968   * Calls the LLDD vport_delete() function, then deallocates and removes
3969   * the vport from the shost and object tree.
3970   *
3971   * Notes:
3972   *	This routine assumes no locks are held on entry.
3973   */
3974  int
fc_vport_terminate(struct fc_vport * vport)3975  fc_vport_terminate(struct fc_vport *vport)
3976  {
3977  	struct Scsi_Host *shost = vport_to_shost(vport);
3978  	struct fc_host_attrs *fc_host = shost_to_fc_host(shost);
3979  	struct fc_internal *i = to_fc_internal(shost->transportt);
3980  	struct device *dev = &vport->dev;
3981  	unsigned long flags;
3982  	int stat;
3983  
3984  	if (i->f->vport_delete)
3985  		stat = i->f->vport_delete(vport);
3986  	else
3987  		stat = -ENOENT;
3988  
3989  	spin_lock_irqsave(shost->host_lock, flags);
3990  	vport->flags &= ~FC_VPORT_DELETING;
3991  	if (!stat) {
3992  		vport->flags |= FC_VPORT_DELETED;
3993  		list_del(&vport->peers);
3994  		fc_host->npiv_vports_inuse--;
3995  		scsi_host_put(shost);		/* for fc_host->vport list */
3996  	}
3997  	spin_unlock_irqrestore(shost->host_lock, flags);
3998  
3999  	if (stat)
4000  		return stat;
4001  
4002  	if (dev->parent != &shost->shost_gendev)
4003  		sysfs_remove_link(&shost->shost_gendev.kobj, dev_name(dev));
4004  	transport_remove_device(dev);
4005  	device_del(dev);
4006  	transport_destroy_device(dev);
4007  
4008  	/*
4009  	 * Removing our self-reference should mean our
4010  	 * release function gets called, which will drop the remaining
4011  	 * parent reference and free the data structure.
4012  	 */
4013  	put_device(dev);			/* for self-reference */
4014  
4015  	return 0; /* SUCCESS */
4016  }
4017  EXPORT_SYMBOL(fc_vport_terminate);
4018  
4019  /**
4020   * fc_vport_sched_delete - workq-based delete request for a vport
4021   * @work:	vport to be deleted.
4022   */
4023  static void
fc_vport_sched_delete(struct work_struct * work)4024  fc_vport_sched_delete(struct work_struct *work)
4025  {
4026  	struct fc_vport *vport =
4027  		container_of(work, struct fc_vport, vport_delete_work);
4028  	int stat;
4029  
4030  	stat = fc_vport_terminate(vport);
4031  	if (stat)
4032  		dev_printk(KERN_ERR, vport->dev.parent,
4033  			"%s: %s could not be deleted created via "
4034  			"shost%d channel %d - error %d\n", __func__,
4035  			dev_name(&vport->dev), vport->shost->host_no,
4036  			vport->channel, stat);
4037  }
4038  
4039  
4040  /*
4041   * BSG support
4042   */
4043  
4044  /**
4045   * fc_bsg_job_timeout - handler for when a bsg request timesout
4046   * @req:	request that timed out
4047   */
4048  static enum blk_eh_timer_return
fc_bsg_job_timeout(struct request * req)4049  fc_bsg_job_timeout(struct request *req)
4050  {
4051  	struct bsg_job *job = blk_mq_rq_to_pdu(req);
4052  	struct Scsi_Host *shost = fc_bsg_to_shost(job);
4053  	struct fc_rport *rport = fc_bsg_to_rport(job);
4054  	struct fc_internal *i = to_fc_internal(shost->transportt);
4055  	int err = 0, inflight = 0;
4056  
4057  	if (rport && rport->port_state == FC_PORTSTATE_BLOCKED)
4058  		return BLK_EH_RESET_TIMER;
4059  
4060  	inflight = bsg_job_get(job);
4061  
4062  	if (inflight && i->f->bsg_timeout) {
4063  		/* call LLDD to abort the i/o as it has timed out */
4064  		err = i->f->bsg_timeout(job);
4065  		if (err == -EAGAIN) {
4066  			bsg_job_put(job);
4067  			return BLK_EH_RESET_TIMER;
4068  		} else if (err)
4069  			printk(KERN_ERR "ERROR: FC BSG request timeout - LLD "
4070  				"abort failed with status %d\n", err);
4071  	}
4072  
4073  	/* the blk_end_sync_io() doesn't check the error */
4074  	if (inflight)
4075  		blk_mq_end_request(req, BLK_STS_IOERR);
4076  	return BLK_EH_DONE;
4077  }
4078  
4079  /**
4080   * fc_bsg_host_dispatch - process fc host bsg requests and dispatch to LLDD
4081   * @shost:	scsi host rport attached to
4082   * @job:	bsg job to be processed
4083   */
fc_bsg_host_dispatch(struct Scsi_Host * shost,struct bsg_job * job)4084  static int fc_bsg_host_dispatch(struct Scsi_Host *shost, struct bsg_job *job)
4085  {
4086  	struct fc_internal *i = to_fc_internal(shost->transportt);
4087  	struct fc_bsg_request *bsg_request = job->request;
4088  	struct fc_bsg_reply *bsg_reply = job->reply;
4089  	int cmdlen = sizeof(uint32_t);	/* start with length of msgcode */
4090  	int ret;
4091  
4092  	/* check if we really have all the request data needed */
4093  	if (job->request_len < cmdlen) {
4094  		ret = -ENOMSG;
4095  		goto fail_host_msg;
4096  	}
4097  
4098  	/* Validate the host command */
4099  	switch (bsg_request->msgcode) {
4100  	case FC_BSG_HST_ADD_RPORT:
4101  		cmdlen += sizeof(struct fc_bsg_host_add_rport);
4102  		break;
4103  
4104  	case FC_BSG_HST_DEL_RPORT:
4105  		cmdlen += sizeof(struct fc_bsg_host_del_rport);
4106  		break;
4107  
4108  	case FC_BSG_HST_ELS_NOLOGIN:
4109  		cmdlen += sizeof(struct fc_bsg_host_els);
4110  		/* there better be a xmt and rcv payloads */
4111  		if ((!job->request_payload.payload_len) ||
4112  		    (!job->reply_payload.payload_len)) {
4113  			ret = -EINVAL;
4114  			goto fail_host_msg;
4115  		}
4116  		break;
4117  
4118  	case FC_BSG_HST_CT:
4119  		cmdlen += sizeof(struct fc_bsg_host_ct);
4120  		/* there better be xmt and rcv payloads */
4121  		if ((!job->request_payload.payload_len) ||
4122  		    (!job->reply_payload.payload_len)) {
4123  			ret = -EINVAL;
4124  			goto fail_host_msg;
4125  		}
4126  		break;
4127  
4128  	case FC_BSG_HST_VENDOR:
4129  		cmdlen += sizeof(struct fc_bsg_host_vendor);
4130  		if ((shost->hostt->vendor_id == 0L) ||
4131  		    (bsg_request->rqst_data.h_vendor.vendor_id !=
4132  			shost->hostt->vendor_id)) {
4133  			ret = -ESRCH;
4134  			goto fail_host_msg;
4135  		}
4136  		break;
4137  
4138  	default:
4139  		ret = -EBADR;
4140  		goto fail_host_msg;
4141  	}
4142  
4143  	ret = i->f->bsg_request(job);
4144  	if (!ret)
4145  		return 0;
4146  
4147  fail_host_msg:
4148  	/* return the errno failure code as the only status */
4149  	BUG_ON(job->reply_len < sizeof(uint32_t));
4150  	bsg_reply->reply_payload_rcv_len = 0;
4151  	bsg_reply->result = ret;
4152  	job->reply_len = sizeof(uint32_t);
4153  	bsg_job_done(job, bsg_reply->result,
4154  		       bsg_reply->reply_payload_rcv_len);
4155  	return 0;
4156  }
4157  
4158  
4159  /*
4160   * fc_bsg_goose_queue - restart rport queue in case it was stopped
4161   * @rport:	rport to be restarted
4162   */
4163  static void
fc_bsg_goose_queue(struct fc_rport * rport)4164  fc_bsg_goose_queue(struct fc_rport *rport)
4165  {
4166  	struct request_queue *q = rport->rqst_q;
4167  
4168  	if (q)
4169  		blk_mq_run_hw_queues(q, true);
4170  }
4171  
4172  /**
4173   * fc_bsg_rport_dispatch - process rport bsg requests and dispatch to LLDD
4174   * @shost:	scsi host rport attached to
4175   * @job:	bsg job to be processed
4176   */
fc_bsg_rport_dispatch(struct Scsi_Host * shost,struct bsg_job * job)4177  static int fc_bsg_rport_dispatch(struct Scsi_Host *shost, struct bsg_job *job)
4178  {
4179  	struct fc_internal *i = to_fc_internal(shost->transportt);
4180  	struct fc_bsg_request *bsg_request = job->request;
4181  	struct fc_bsg_reply *bsg_reply = job->reply;
4182  	int cmdlen = sizeof(uint32_t);	/* start with length of msgcode */
4183  	int ret;
4184  
4185  	/* check if we really have all the request data needed */
4186  	if (job->request_len < cmdlen) {
4187  		ret = -ENOMSG;
4188  		goto fail_rport_msg;
4189  	}
4190  
4191  	/* Validate the rport command */
4192  	switch (bsg_request->msgcode) {
4193  	case FC_BSG_RPT_ELS:
4194  		cmdlen += sizeof(struct fc_bsg_rport_els);
4195  		goto check_bidi;
4196  
4197  	case FC_BSG_RPT_CT:
4198  		cmdlen += sizeof(struct fc_bsg_rport_ct);
4199  check_bidi:
4200  		/* there better be xmt and rcv payloads */
4201  		if ((!job->request_payload.payload_len) ||
4202  		    (!job->reply_payload.payload_len)) {
4203  			ret = -EINVAL;
4204  			goto fail_rport_msg;
4205  		}
4206  		break;
4207  	default:
4208  		ret = -EBADR;
4209  		goto fail_rport_msg;
4210  	}
4211  
4212  	ret = i->f->bsg_request(job);
4213  	if (!ret)
4214  		return 0;
4215  
4216  fail_rport_msg:
4217  	/* return the errno failure code as the only status */
4218  	BUG_ON(job->reply_len < sizeof(uint32_t));
4219  	bsg_reply->reply_payload_rcv_len = 0;
4220  	bsg_reply->result = ret;
4221  	job->reply_len = sizeof(uint32_t);
4222  	bsg_job_done(job, bsg_reply->result,
4223  		       bsg_reply->reply_payload_rcv_len);
4224  	return 0;
4225  }
4226  
fc_bsg_dispatch(struct bsg_job * job)4227  static int fc_bsg_dispatch(struct bsg_job *job)
4228  {
4229  	struct Scsi_Host *shost = fc_bsg_to_shost(job);
4230  
4231  	if (scsi_is_fc_rport(job->dev))
4232  		return fc_bsg_rport_dispatch(shost, job);
4233  	else
4234  		return fc_bsg_host_dispatch(shost, job);
4235  }
4236  
fc_bsg_rport_prep(struct fc_rport * rport)4237  static blk_status_t fc_bsg_rport_prep(struct fc_rport *rport)
4238  {
4239  	if (rport->port_state == FC_PORTSTATE_BLOCKED &&
4240  	    !(rport->flags & FC_RPORT_FAST_FAIL_TIMEDOUT))
4241  		return BLK_STS_RESOURCE;
4242  
4243  	if ((rport->port_state != FC_PORTSTATE_ONLINE) &&
4244  		(rport->port_state != FC_PORTSTATE_MARGINAL))
4245  		return BLK_STS_IOERR;
4246  
4247  	return BLK_STS_OK;
4248  }
4249  
4250  
fc_bsg_dispatch_prep(struct bsg_job * job)4251  static int fc_bsg_dispatch_prep(struct bsg_job *job)
4252  {
4253  	struct fc_rport *rport = fc_bsg_to_rport(job);
4254  	blk_status_t ret;
4255  
4256  	ret = fc_bsg_rport_prep(rport);
4257  	switch (ret) {
4258  	case BLK_STS_OK:
4259  		break;
4260  	case BLK_STS_RESOURCE:
4261  		return -EAGAIN;
4262  	default:
4263  		return -EIO;
4264  	}
4265  
4266  	return fc_bsg_dispatch(job);
4267  }
4268  
4269  /**
4270   * fc_bsg_hostadd - Create and add the bsg hooks so we can receive requests
4271   * @shost:	shost for fc_host
4272   * @fc_host:	fc_host adding the structures to
4273   */
4274  static int
fc_bsg_hostadd(struct Scsi_Host * shost,struct fc_host_attrs * fc_host)4275  fc_bsg_hostadd(struct Scsi_Host *shost, struct fc_host_attrs *fc_host)
4276  {
4277  	struct device *dev = &shost->shost_gendev;
4278  	struct fc_internal *i = to_fc_internal(shost->transportt);
4279  	struct request_queue *q;
4280  	char bsg_name[20];
4281  
4282  	fc_host->rqst_q = NULL;
4283  
4284  	if (!i->f->bsg_request)
4285  		return -ENOTSUPP;
4286  
4287  	snprintf(bsg_name, sizeof(bsg_name),
4288  		 "fc_host%d", shost->host_no);
4289  
4290  	q = bsg_setup_queue(dev, bsg_name, fc_bsg_dispatch, fc_bsg_job_timeout,
4291  				i->f->dd_bsg_size);
4292  	if (IS_ERR(q)) {
4293  		dev_err(dev,
4294  			"fc_host%d: bsg interface failed to initialize - setup queue\n",
4295  			shost->host_no);
4296  		return PTR_ERR(q);
4297  	}
4298  	__scsi_init_queue(shost, q);
4299  	blk_queue_rq_timeout(q, FC_DEFAULT_BSG_TIMEOUT);
4300  	fc_host->rqst_q = q;
4301  	return 0;
4302  }
4303  
4304  /**
4305   * fc_bsg_rportadd - Create and add the bsg hooks so we can receive requests
4306   * @shost:	shost that rport is attached to
4307   * @rport:	rport that the bsg hooks are being attached to
4308   */
4309  static int
fc_bsg_rportadd(struct Scsi_Host * shost,struct fc_rport * rport)4310  fc_bsg_rportadd(struct Scsi_Host *shost, struct fc_rport *rport)
4311  {
4312  	struct device *dev = &rport->dev;
4313  	struct fc_internal *i = to_fc_internal(shost->transportt);
4314  	struct request_queue *q;
4315  
4316  	rport->rqst_q = NULL;
4317  
4318  	if (!i->f->bsg_request)
4319  		return -ENOTSUPP;
4320  
4321  	q = bsg_setup_queue(dev, dev_name(dev), fc_bsg_dispatch_prep,
4322  				fc_bsg_job_timeout, i->f->dd_bsg_size);
4323  	if (IS_ERR(q)) {
4324  		dev_err(dev, "failed to setup bsg queue\n");
4325  		return PTR_ERR(q);
4326  	}
4327  	__scsi_init_queue(shost, q);
4328  	blk_queue_rq_timeout(q, BLK_DEFAULT_SG_TIMEOUT);
4329  	rport->rqst_q = q;
4330  	return 0;
4331  }
4332  
4333  
4334  /**
4335   * fc_bsg_remove - Deletes the bsg hooks on fchosts/rports
4336   * @q:	the request_queue that is to be torn down.
4337   *
4338   * Notes:
4339   *   Before unregistering the queue empty any requests that are blocked
4340   *
4341   *
4342   */
4343  static void
fc_bsg_remove(struct request_queue * q)4344  fc_bsg_remove(struct request_queue *q)
4345  {
4346  	bsg_remove_queue(q);
4347  }
4348  
4349  
4350  /* Original Author:  Martin Hicks */
4351  MODULE_AUTHOR("James Smart");
4352  MODULE_DESCRIPTION("FC Transport Attributes");
4353  MODULE_LICENSE("GPL");
4354  
4355  module_init(fc_transport_init);
4356  module_exit(fc_transport_exit);
4357