Diff markup
1 /* !! 1 /*
2 * FiberChannel transport specific attributes 2 * FiberChannel transport specific attributes exported to sysfs.
3 * 3 *
4 * Copyright (c) 2003 Silicon Graphics, Inc. 4 * Copyright (c) 2003 Silicon Graphics, Inc. All rights reserved.
5 * 5 *
6 * This program is free software; you can red 6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Publ 7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either versi 8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version. 9 * (at your option) any later version.
10 * 10 *
11 * This program is distributed in the hope th 11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the 12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULA 13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more detail 14 * GNU General Public License for more details.
15 * 15 *
16 * You should have received a copy of the GNU 16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to 17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place, Suite 3 18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
>> 19 *
>> 20 * ========
>> 21 *
>> 22 * Copyright (C) 2004-2007 James Smart, Emulex Corporation
>> 23 * Rewrite for host, target, device, and remote port attributes,
>> 24 * statistics, and service functions...
>> 25 *
19 */ 26 */
20 #ifndef SCSI_TRANSPORT_FC_H 27 #ifndef SCSI_TRANSPORT_FC_H
21 #define SCSI_TRANSPORT_FC_H 28 #define SCSI_TRANSPORT_FC_H
22 29
23 #include <linux/config.h> !! 30 #include <linux/sched.h>
>> 31 #include <scsi/scsi.h>
>> 32 #include <scsi/scsi_netlink.h>
24 33
25 struct scsi_transport_template; 34 struct scsi_transport_template;
26 35
27 <<
28 /* 36 /*
29 * FC Port definitions - Following FC HBAAPI g 37 * FC Port definitions - Following FC HBAAPI guidelines
30 * 38 *
31 * Note: Not all binary values for the differe 39 * Note: Not all binary values for the different fields match HBAAPI.
32 * Instead, we use densely packed ordinal val 40 * Instead, we use densely packed ordinal values or enums.
33 * We get away with this as we never present 41 * We get away with this as we never present the actual binary values
34 * externally. For sysfs, we always present t 42 * externally. For sysfs, we always present the string that describes
35 * the value. Thus, an admin doesn't need a m 43 * the value. Thus, an admin doesn't need a magic HBAAPI decoder ring
36 * to understand the values. The HBAAPI user- 44 * to understand the values. The HBAAPI user-space library is free to
37 * convert the strings into the HBAAPI-specif 45 * convert the strings into the HBAAPI-specified binary values.
38 * 46 *
39 * Note: Not all HBAAPI-defined values are con 47 * Note: Not all HBAAPI-defined values are contained in the definitions
40 * below. Those not appropriate to an fc_host 48 * below. Those not appropriate to an fc_host (e.g. FCP initiator) have
41 * been removed. 49 * been removed.
42 */ 50 */
43 51
44 /* 52 /*
45 * fc_port_type: If you alter this, you also n 53 * fc_port_type: If you alter this, you also need to alter scsi_transport_fc.c
46 * (for the ascii descriptions). 54 * (for the ascii descriptions).
47 */ 55 */
48 enum fc_port_type { 56 enum fc_port_type {
49 FC_PORTTYPE_UNKNOWN, 57 FC_PORTTYPE_UNKNOWN,
50 FC_PORTTYPE_OTHER, 58 FC_PORTTYPE_OTHER,
51 FC_PORTTYPE_NOTPRESENT, 59 FC_PORTTYPE_NOTPRESENT,
52 FC_PORTTYPE_NPORT, /* Att 60 FC_PORTTYPE_NPORT, /* Attached to FPort */
53 FC_PORTTYPE_NLPORT, /* (Pu 61 FC_PORTTYPE_NLPORT, /* (Public) Loop w/ FLPort */
54 FC_PORTTYPE_LPORT, /* (Pr 62 FC_PORTTYPE_LPORT, /* (Private) Loop w/o FLPort */
55 FC_PORTTYPE_PTP, /* Poi 63 FC_PORTTYPE_PTP, /* Point to Point w/ another NPort */
>> 64 FC_PORTTYPE_NPIV, /* VPORT based on NPIV */
56 }; 65 };
57 66
>> 67
58 /* 68 /*
59 * fc_port_state: If you alter this, you also 69 * fc_port_state: If you alter this, you also need to alter scsi_transport_fc.c
60 * (for the ascii descriptions). 70 * (for the ascii descriptions).
61 */ 71 */
62 enum fc_port_state { 72 enum fc_port_state {
63 FC_PORTSTATE_UNKNOWN, 73 FC_PORTSTATE_UNKNOWN,
>> 74 FC_PORTSTATE_NOTPRESENT,
64 FC_PORTSTATE_ONLINE, 75 FC_PORTSTATE_ONLINE,
65 FC_PORTSTATE_OFFLINE, /* Use 76 FC_PORTSTATE_OFFLINE, /* User has taken Port Offline */
>> 77 FC_PORTSTATE_BLOCKED,
66 FC_PORTSTATE_BYPASSED, 78 FC_PORTSTATE_BYPASSED,
67 FC_PORTSTATE_DIAGNOSTICS, 79 FC_PORTSTATE_DIAGNOSTICS,
68 FC_PORTSTATE_LINKDOWN, 80 FC_PORTSTATE_LINKDOWN,
69 FC_PORTSTATE_ERROR, 81 FC_PORTSTATE_ERROR,
70 FC_PORTSTATE_LOOPBACK, 82 FC_PORTSTATE_LOOPBACK,
>> 83 FC_PORTSTATE_DELETED,
>> 84 };
>> 85
>> 86
>> 87 /*
>> 88 * fc_vport_state: If you alter this, you also need to alter
>> 89 * scsi_transport_fc.c (for the ascii descriptions).
>> 90 */
>> 91 enum fc_vport_state {
>> 92 FC_VPORT_UNKNOWN,
>> 93 FC_VPORT_ACTIVE,
>> 94 FC_VPORT_DISABLED,
>> 95 FC_VPORT_LINKDOWN,
>> 96 FC_VPORT_INITIALIZING,
>> 97 FC_VPORT_NO_FABRIC_SUPP,
>> 98 FC_VPORT_NO_FABRIC_RSCS,
>> 99 FC_VPORT_FABRIC_LOGOUT,
>> 100 FC_VPORT_FABRIC_REJ_WWN,
>> 101 FC_VPORT_FAILED,
71 }; 102 };
72 103
73 104
74 /* !! 105
>> 106 /*
75 * FC Classes of Service 107 * FC Classes of Service
76 * Note: values are not enumerated, as they ca 108 * Note: values are not enumerated, as they can be "or'd" together
77 * for reporting (e.g. report supported_classe 109 * for reporting (e.g. report supported_classes). If you alter this list,
78 * you also need to alter scsi_transport_fc.c 110 * you also need to alter scsi_transport_fc.c (for the ascii descriptions).
79 */ 111 */
80 #define FC_COS_UNSPECIFIED 0 112 #define FC_COS_UNSPECIFIED 0
81 #define FC_COS_CLASS1 2 113 #define FC_COS_CLASS1 2
82 #define FC_COS_CLASS2 4 114 #define FC_COS_CLASS2 4
83 #define FC_COS_CLASS3 8 115 #define FC_COS_CLASS3 8
84 #define FC_COS_CLASS4 0x10 116 #define FC_COS_CLASS4 0x10
85 #define FC_COS_CLASS6 0x40 117 #define FC_COS_CLASS6 0x40
86 118
87 /* !! 119 /*
88 * FC Port Speeds 120 * FC Port Speeds
89 * Note: values are not enumerated, as they ca 121 * Note: values are not enumerated, as they can be "or'd" together
90 * for reporting (e.g. report supported_speeds 122 * for reporting (e.g. report supported_speeds). If you alter this list,
91 * you also need to alter scsi_transport_fc.c 123 * you also need to alter scsi_transport_fc.c (for the ascii descriptions).
92 */ 124 */
93 #define FC_PORTSPEED_UNKNOWN 0 /* U 125 #define FC_PORTSPEED_UNKNOWN 0 /* Unknown - transceiver
94 i 126 incapable of reporting */
95 #define FC_PORTSPEED_1GBIT 1 127 #define FC_PORTSPEED_1GBIT 1
96 #define FC_PORTSPEED_2GBIT 2 128 #define FC_PORTSPEED_2GBIT 2
97 #define FC_PORTSPEED_10GBIT 4 !! 129 #define FC_PORTSPEED_4GBIT 4
98 #define FC_PORTSPEED_4GBIT 8 !! 130 #define FC_PORTSPEED_10GBIT 8
>> 131 #define FC_PORTSPEED_8GBIT 0x10
>> 132 #define FC_PORTSPEED_16GBIT 0x20
99 #define FC_PORTSPEED_NOT_NEGOTIATED (1 << 133 #define FC_PORTSPEED_NOT_NEGOTIATED (1 << 15) /* Speed not established */
100 134
101 /* 135 /*
102 * fc_tgtid_binding_type: If you alter this, y 136 * fc_tgtid_binding_type: If you alter this, you also need to alter
103 * scsi_transport_fc.c (for the ascii descript 137 * scsi_transport_fc.c (for the ascii descriptions).
104 */ 138 */
105 enum fc_tgtid_binding_type { 139 enum fc_tgtid_binding_type {
>> 140 FC_TGTID_BIND_NONE,
106 FC_TGTID_BIND_BY_WWPN, 141 FC_TGTID_BIND_BY_WWPN,
107 FC_TGTID_BIND_BY_WWNN, 142 FC_TGTID_BIND_BY_WWNN,
108 FC_TGTID_BIND_BY_ID, 143 FC_TGTID_BIND_BY_ID,
109 }; 144 };
110 145
>> 146 /*
>> 147 * FC Port Roles
>> 148 * Note: values are not enumerated, as they can be "or'd" together
>> 149 * for reporting (e.g. report roles). If you alter this list,
>> 150 * you also need to alter scsi_transport_fc.c (for the ascii descriptions).
>> 151 */
>> 152 #define FC_PORT_ROLE_UNKNOWN 0x00
>> 153 #define FC_PORT_ROLE_FCP_TARGET 0x01
>> 154 #define FC_PORT_ROLE_FCP_INITIATOR 0x02
>> 155 #define FC_PORT_ROLE_IP_PORT 0x04
>> 156
>> 157 /* The following are for compatibility */
>> 158 #define FC_RPORT_ROLE_UNKNOWN FC_PORT_ROLE_UNKNOWN
>> 159 #define FC_RPORT_ROLE_FCP_TARGET FC_PORT_ROLE_FCP_TARGET
>> 160 #define FC_RPORT_ROLE_FCP_INITIATOR FC_PORT_ROLE_FCP_INITIATOR
>> 161 #define FC_RPORT_ROLE_IP_PORT FC_PORT_ROLE_IP_PORT
>> 162
>> 163
>> 164 /* Macro for use in defining Virtual Port attributes */
>> 165 #define FC_VPORT_ATTR(_name,_mode,_show,_store) \
>> 166 struct device_attribute dev_attr_vport_##_name = \
>> 167 __ATTR(_name,_mode,_show,_store)
111 168
>> 169 /*
>> 170 * fc_vport_identifiers: This set of data contains all elements
>> 171 * to uniquely identify and instantiate a FC virtual port.
>> 172 *
>> 173 * Notes:
>> 174 * symbolic_name: The driver is to append the symbolic_name string data
>> 175 * to the symbolic_node_name data that it generates by default.
>> 176 * the resulting combination should then be registered with the switch.
>> 177 * It is expected that things like Xen may stuff a VM title into
>> 178 * this field.
>> 179 */
>> 180 #define FC_VPORT_SYMBOLIC_NAMELEN 64
>> 181 struct fc_vport_identifiers {
>> 182 u64 node_name;
>> 183 u64 port_name;
>> 184 u32 roles;
>> 185 bool disable;
>> 186 enum fc_port_type vport_type; /* only FC_PORTTYPE_NPIV allowed */
>> 187 char symbolic_name[FC_VPORT_SYMBOLIC_NAMELEN];
>> 188 };
112 189
113 /* 190 /*
114 * FC Remote Port (Target) Attributes !! 191 * FC Virtual Port Attributes
>> 192 *
>> 193 * This structure exists for each FC port is a virtual FC port. Virtual
>> 194 * ports share the physical link with the Physical port. Each virtual
>> 195 * ports has a unique presense on the SAN, and may be instantiated via
>> 196 * NPIV, Virtual Fabrics, or via additional ALPAs. As the vport is a
>> 197 * unique presense, each vport has it's own view of the fabric,
>> 198 * authentication privilege, and priorities.
>> 199 *
>> 200 * A virtual port may support 1 or more FC4 roles. Typically it is a
>> 201 * FCP Initiator. It could be a FCP Target, or exist sole for an IP over FC
>> 202 * roles. FC port attributes for the vport will be reported on any
>> 203 * fc_host class object allocated for an FCP Initiator.
>> 204 *
>> 205 * --
>> 206 *
>> 207 * Fixed attributes are not expected to change. The driver is
>> 208 * expected to set these values after receiving the fc_vport structure
>> 209 * via the vport_create() call from the transport.
>> 210 * The transport fully manages all get functions w/o driver interaction.
>> 211 *
>> 212 * Dynamic attributes are expected to change. The driver participates
>> 213 * in all get/set operations via functions provided by the driver.
>> 214 *
>> 215 * Private attributes are transport-managed values. They are fully
>> 216 * managed by the transport w/o driver interaction.
115 */ 217 */
116 218
117 struct fc_starget_attrs { /* aka fc_targ !! 219 struct fc_vport {
118 int port_id; !! 220 /* Fixed Attributes */
>> 221
>> 222 /* Dynamic Attributes */
>> 223
>> 224 /* Private (Transport-managed) Attributes */
>> 225 enum fc_vport_state vport_state;
>> 226 enum fc_vport_state vport_last_state;
>> 227 u64 node_name;
>> 228 u64 port_name;
>> 229 u32 roles;
>> 230 u32 vport_id; /* Admin Identifier for the vport */
>> 231 enum fc_port_type vport_type;
>> 232 char symbolic_name[FC_VPORT_SYMBOLIC_NAMELEN];
>> 233
>> 234 /* exported data */
>> 235 void *dd_data; /* Used for driver-specific storage */
>> 236
>> 237 /* internal data */
>> 238 struct Scsi_Host *shost; /* Physical Port Parent */
>> 239 unsigned int channel;
>> 240 u32 number;
>> 241 u8 flags;
>> 242 struct list_head peers;
>> 243 struct device dev;
>> 244 struct work_struct vport_delete_work;
>> 245 } __attribute__((aligned(sizeof(unsigned long))));
>> 246
>> 247 /* bit field values for struct fc_vport "flags" field: */
>> 248 #define FC_VPORT_CREATING 0x01
>> 249 #define FC_VPORT_DELETING 0x02
>> 250 #define FC_VPORT_DELETED 0x04
>> 251 #define FC_VPORT_DEL 0x06 /* Any DELETE state */
>> 252
>> 253 #define dev_to_vport(d) \
>> 254 container_of(d, struct fc_vport, dev)
>> 255 #define transport_class_to_vport(dev) \
>> 256 dev_to_vport(dev->parent)
>> 257 #define vport_to_shost(v) \
>> 258 (v->shost)
>> 259 #define vport_to_shost_channel(v) \
>> 260 (v->channel)
>> 261 #define vport_to_parent(v) \
>> 262 (v->dev.parent)
>> 263
>> 264
>> 265 /* Error return codes for vport_create() callback */
>> 266 #define VPCERR_UNSUPPORTED -ENOSYS /* no driver/adapter
>> 267 support */
>> 268 #define VPCERR_BAD_WWN -ENOTUNIQ /* driver validation
>> 269 of WWNs failed */
>> 270 #define VPCERR_NO_FABRIC_SUPP -EOPNOTSUPP /* Fabric connection
>> 271 is loop or the
>> 272 Fabric Port does
>> 273 not support NPIV */
>> 274
>> 275 /*
>> 276 * fc_rport_identifiers: This set of data contains all elements
>> 277 * to uniquely identify a remote FC port. The driver uses this data
>> 278 * to report the existence of a remote FC port in the topology. Internally,
>> 279 * the transport uses this data for attributes and to manage consistent
>> 280 * target id bindings.
>> 281 */
>> 282 struct fc_rport_identifiers {
119 u64 node_name; 283 u64 node_name;
120 u64 port_name; 284 u64 port_name;
>> 285 u32 port_id;
>> 286 u32 roles;
>> 287 };
>> 288
>> 289
>> 290 /* Macro for use in defining Remote Port attributes */
>> 291 #define FC_RPORT_ATTR(_name,_mode,_show,_store) \
>> 292 struct device_attribute dev_attr_rport_##_name = \
>> 293 __ATTR(_name,_mode,_show,_store)
>> 294
>> 295
>> 296 /*
>> 297 * FC Remote Port Attributes
>> 298 *
>> 299 * This structure exists for each remote FC port that a LLDD notifies
>> 300 * the subsystem of. A remote FC port may or may not be a SCSI Target,
>> 301 * also be a SCSI initiator, IP endpoint, etc. As such, the remote
>> 302 * port is considered a separate entity, independent of "role" (such
>> 303 * as scsi target).
>> 304 *
>> 305 * --
>> 306 *
>> 307 * Attributes are based on HBAAPI V2.0 definitions. Only those
>> 308 * attributes that are determinable by the local port (aka Host)
>> 309 * are contained.
>> 310 *
>> 311 * Fixed attributes are not expected to change. The driver is
>> 312 * expected to set these values after successfully calling
>> 313 * fc_remote_port_add(). The transport fully manages all get functions
>> 314 * w/o driver interaction.
>> 315 *
>> 316 * Dynamic attributes are expected to change. The driver participates
>> 317 * in all get/set operations via functions provided by the driver.
>> 318 *
>> 319 * Private attributes are transport-managed values. They are fully
>> 320 * managed by the transport w/o driver interaction.
>> 321 */
>> 322
>> 323 struct fc_rport { /* aka fc_starget_attrs */
>> 324 /* Fixed Attributes */
>> 325 u32 maxframe_size;
>> 326 u32 supported_classes;
>> 327
>> 328 /* Dynamic Attributes */
121 u32 dev_loss_tmo; /* Remote Port 329 u32 dev_loss_tmo; /* Remote Port loss timeout in seconds. */
122 struct work_struct dev_loss_work; !! 330
>> 331 /* Private (Transport-managed) Attributes */
>> 332 u64 node_name;
>> 333 u64 port_name;
>> 334 u32 port_id;
>> 335 u32 roles;
>> 336 enum fc_port_state port_state; /* Will only be ONLINE or UNKNOWN */
>> 337 u32 scsi_target_id;
>> 338 u32 fast_io_fail_tmo;
>> 339
>> 340 /* exported data */
>> 341 void *dd_data; /* Used for driver-specific storage */
>> 342
>> 343 /* internal data */
>> 344 unsigned int channel;
>> 345 u32 number;
>> 346 u8 flags;
>> 347 struct list_head peers;
>> 348 struct device dev;
>> 349 struct delayed_work dev_loss_work;
>> 350 struct work_struct scan_work;
>> 351 struct delayed_work fail_io_work;
>> 352 struct work_struct stgt_delete_work;
>> 353 struct work_struct rport_delete_work;
>> 354 struct request_queue *rqst_q; /* bsg support */
>> 355 } __attribute__((aligned(sizeof(unsigned long))));
>> 356
>> 357 /* bit field values for struct fc_rport "flags" field: */
>> 358 #define FC_RPORT_DEVLOSS_PENDING 0x01
>> 359 #define FC_RPORT_SCAN_PENDING 0x02
>> 360 #define FC_RPORT_FAST_FAIL_TIMEDOUT 0x04
>> 361 #define FC_RPORT_DEVLOSS_CALLBK_DONE 0x08
>> 362
>> 363 #define dev_to_rport(d) \
>> 364 container_of(d, struct fc_rport, dev)
>> 365 #define transport_class_to_rport(dev) \
>> 366 dev_to_rport(dev->parent)
>> 367 #define rport_to_shost(r) \
>> 368 dev_to_shost(r->dev.parent)
>> 369
>> 370 /*
>> 371 * FC SCSI Target Attributes
>> 372 *
>> 373 * The SCSI Target is considered an extention of a remote port (as
>> 374 * a remote port can be more than a SCSI Target). Within the scsi
>> 375 * subsystem, we leave the Target as a separate entity. Doing so
>> 376 * provides backward compatibility with prior FC transport api's,
>> 377 * and lets remote ports be handled entirely within the FC transport
>> 378 * and independently from the scsi subsystem. The drawback is that
>> 379 * some data will be duplicated.
>> 380 */
>> 381
>> 382 struct fc_starget_attrs { /* aka fc_target_attrs */
>> 383 /* Dynamic Attributes */
>> 384 u64 node_name;
>> 385 u64 port_name;
>> 386 u32 port_id;
123 }; 387 };
124 388
125 #define fc_starget_port_id(x) \ <<
126 (((struct fc_starget_attrs *)&(x)->sta <<
127 #define fc_starget_node_name(x) \ 389 #define fc_starget_node_name(x) \
128 (((struct fc_starget_attrs *)&(x)->sta 390 (((struct fc_starget_attrs *)&(x)->starget_data)->node_name)
129 #define fc_starget_port_name(x) \ 391 #define fc_starget_port_name(x) \
130 (((struct fc_starget_attrs *)&(x)->sta 392 (((struct fc_starget_attrs *)&(x)->starget_data)->port_name)
131 #define fc_starget_dev_loss_tmo(x) \ !! 393 #define fc_starget_port_id(x) \
132 (((struct fc_starget_attrs *)&(x)->sta !! 394 (((struct fc_starget_attrs *)&(x)->starget_data)->port_id)
133 #define fc_starget_dev_loss_work(x) \ !! 395
134 (((struct fc_starget_attrs *)&(x)->sta !! 396 #define starget_to_rport(s) \
>> 397 scsi_is_fc_rport(s->dev.parent) ? dev_to_rport(s->dev.parent) : NULL
135 398
136 399
137 /* 400 /*
138 * FC Local Port (Host) Statistics 401 * FC Local Port (Host) Statistics
139 */ 402 */
140 403
141 /* FC Statistics - Following FC HBAAPI v2.0 gu 404 /* FC Statistics - Following FC HBAAPI v2.0 guidelines */
142 struct fc_host_statistics { 405 struct fc_host_statistics {
143 /* port statistics */ 406 /* port statistics */
144 u64 seconds_since_last_reset; 407 u64 seconds_since_last_reset;
145 u64 tx_frames; 408 u64 tx_frames;
146 u64 tx_words; 409 u64 tx_words;
147 u64 rx_frames; 410 u64 rx_frames;
148 u64 rx_words; 411 u64 rx_words;
149 u64 lip_count; 412 u64 lip_count;
150 u64 nos_count; 413 u64 nos_count;
151 u64 error_frames; 414 u64 error_frames;
152 u64 dumped_frames; 415 u64 dumped_frames;
153 u64 link_failure_count; 416 u64 link_failure_count;
154 u64 loss_of_sync_count; 417 u64 loss_of_sync_count;
155 u64 loss_of_signal_count; 418 u64 loss_of_signal_count;
156 u64 prim_seq_protocol_err_count; 419 u64 prim_seq_protocol_err_count;
157 u64 invalid_tx_word_count; 420 u64 invalid_tx_word_count;
158 u64 invalid_crc_count; 421 u64 invalid_crc_count;
159 !! 422
160 /* fc4 statistics (only FCP supported 423 /* fc4 statistics (only FCP supported currently) */
161 u64 fcp_input_requests; 424 u64 fcp_input_requests;
162 u64 fcp_output_requests; 425 u64 fcp_output_requests;
163 u64 fcp_control_requests; 426 u64 fcp_control_requests;
164 u64 fcp_input_megabytes; 427 u64 fcp_input_megabytes;
165 u64 fcp_output_megabytes; 428 u64 fcp_output_megabytes;
166 }; 429 };
167 430
168 431
169 /* 432 /*
>> 433 * FC Event Codes - Polled and Async, following FC HBAAPI v2.0 guidelines
>> 434 */
>> 435
>> 436 /*
>> 437 * fc_host_event_code: If you alter this, you also need to alter
>> 438 * scsi_transport_fc.c (for the ascii descriptions).
>> 439 */
>> 440 enum fc_host_event_code {
>> 441 FCH_EVT_LIP = 0x1,
>> 442 FCH_EVT_LINKUP = 0x2,
>> 443 FCH_EVT_LINKDOWN = 0x3,
>> 444 FCH_EVT_LIPRESET = 0x4,
>> 445 FCH_EVT_RSCN = 0x5,
>> 446 FCH_EVT_ADAPTER_CHANGE = 0x103,
>> 447 FCH_EVT_PORT_UNKNOWN = 0x200,
>> 448 FCH_EVT_PORT_OFFLINE = 0x201,
>> 449 FCH_EVT_PORT_ONLINE = 0x202,
>> 450 FCH_EVT_PORT_FABRIC = 0x204,
>> 451 FCH_EVT_LINK_UNKNOWN = 0x500,
>> 452 FCH_EVT_VENDOR_UNIQUE = 0xffff,
>> 453 };
>> 454
>> 455
>> 456 /*
170 * FC Local Port (Host) Attributes 457 * FC Local Port (Host) Attributes
171 * 458 *
172 * Attributes are based on HBAAPI V2.0 definit 459 * Attributes are based on HBAAPI V2.0 definitions.
173 * Note: OSDeviceName is determined by user-sp 460 * Note: OSDeviceName is determined by user-space library
174 * 461 *
175 * Fixed attributes are not expected to change 462 * Fixed attributes are not expected to change. The driver is
176 * expected to set these values after successf 463 * expected to set these values after successfully calling scsi_add_host().
177 * The transport fully manages all get functio 464 * The transport fully manages all get functions w/o driver interaction.
178 * 465 *
179 * Dynamic attributes are expected to change. 466 * Dynamic attributes are expected to change. The driver participates
180 * in all get/set operations via functions pro 467 * in all get/set operations via functions provided by the driver.
181 * 468 *
182 * Private attributes are transport-managed va 469 * Private attributes are transport-managed values. They are fully
183 * managed by the transport w/o driver interac 470 * managed by the transport w/o driver interaction.
184 */ 471 */
185 472
186 #define FC_FC4_LIST_SIZE 32 473 #define FC_FC4_LIST_SIZE 32
187 #define FC_SYMBOLIC_NAME_SIZE 256 474 #define FC_SYMBOLIC_NAME_SIZE 256
188 #define FC_VERSION_STRING_SIZE 64 475 #define FC_VERSION_STRING_SIZE 64
189 #define FC_SERIAL_NUMBER_SIZE 80 476 #define FC_SERIAL_NUMBER_SIZE 80
190 477
191 struct fc_host_attrs { 478 struct fc_host_attrs {
192 /* Fixed Attributes */ 479 /* Fixed Attributes */
193 u64 node_name; 480 u64 node_name;
194 u64 port_name; 481 u64 port_name;
>> 482 u64 permanent_port_name;
195 u32 supported_classes; 483 u32 supported_classes;
196 u8 supported_fc4s[FC_FC4_LIST_SIZE]; 484 u8 supported_fc4s[FC_FC4_LIST_SIZE];
197 char symbolic_name[FC_SYMBOLIC_NAME_SI <<
198 u32 supported_speeds; 485 u32 supported_speeds;
199 u32 maxframe_size; 486 u32 maxframe_size;
200 char hardware_version[FC_VERSION_STRIN !! 487 u16 max_npiv_vports;
201 char firmware_version[FC_VERSION_STRIN <<
202 char serial_number[FC_SERIAL_NUMBER_SI 488 char serial_number[FC_SERIAL_NUMBER_SIZE];
203 char opt_rom_version[FC_VERSION_STRING <<
204 char driver_version[FC_VERSION_STRING_ <<
205 489
206 /* Dynamic Attributes */ 490 /* Dynamic Attributes */
207 u32 port_id; 491 u32 port_id;
208 enum fc_port_type port_type; 492 enum fc_port_type port_type;
209 enum fc_port_state port_state; 493 enum fc_port_state port_state;
210 u8 active_fc4s[FC_FC4_LIST_SIZE]; 494 u8 active_fc4s[FC_FC4_LIST_SIZE];
211 u32 speed; 495 u32 speed;
212 u64 fabric_name; 496 u64 fabric_name;
213 u32 link_down_tmo; /* Link Down t !! 497 char symbolic_name[FC_SYMBOLIC_NAME_SIZE];
>> 498 char system_hostname[FC_SYMBOLIC_NAME_SIZE];
214 499
215 /* Private (Transport-managed) Attribu 500 /* Private (Transport-managed) Attributes */
216 enum fc_tgtid_binding_type tgtid_bind 501 enum fc_tgtid_binding_type tgtid_bind_type;
217 502
218 /* internal data */ 503 /* internal data */
219 struct work_struct link_down_work; !! 504 struct list_head rports;
>> 505 struct list_head rport_bindings;
>> 506 struct list_head vports;
>> 507 u32 next_rport_number;
>> 508 u32 next_target_id;
>> 509 u32 next_vport_number;
>> 510 u16 npiv_vports_inuse;
>> 511
>> 512 /* work queues for rport state manipulation */
>> 513 char work_q_name[20];
>> 514 struct workqueue_struct *work_q;
>> 515 char devloss_work_q_name[20];
>> 516 struct workqueue_struct *devloss_work_q;
>> 517
>> 518 /* bsg support */
>> 519 struct request_queue *rqst_q;
220 }; 520 };
221 521
>> 522 #define shost_to_fc_host(x) \
>> 523 ((struct fc_host_attrs *)(x)->shost_data)
>> 524
222 #define fc_host_node_name(x) \ 525 #define fc_host_node_name(x) \
223 (((struct fc_host_attrs *)(x)->shost_d 526 (((struct fc_host_attrs *)(x)->shost_data)->node_name)
224 #define fc_host_port_name(x) \ 527 #define fc_host_port_name(x) \
225 (((struct fc_host_attrs *)(x)->shost_d 528 (((struct fc_host_attrs *)(x)->shost_data)->port_name)
>> 529 #define fc_host_permanent_port_name(x) \
>> 530 (((struct fc_host_attrs *)(x)->shost_data)->permanent_port_name)
226 #define fc_host_supported_classes(x) \ 531 #define fc_host_supported_classes(x) \
227 (((struct fc_host_attrs *)(x)->shost_d 532 (((struct fc_host_attrs *)(x)->shost_data)->supported_classes)
228 #define fc_host_supported_fc4s(x) \ 533 #define fc_host_supported_fc4s(x) \
229 (((struct fc_host_attrs *)(x)->shost_d 534 (((struct fc_host_attrs *)(x)->shost_data)->supported_fc4s)
230 #define fc_host_symbolic_name(x) \ <<
231 (((struct fc_host_attrs *)(x)->shost_d <<
232 #define fc_host_supported_speeds(x) \ 535 #define fc_host_supported_speeds(x) \
233 (((struct fc_host_attrs *)(x)->shost_d 536 (((struct fc_host_attrs *)(x)->shost_data)->supported_speeds)
234 #define fc_host_maxframe_size(x) \ 537 #define fc_host_maxframe_size(x) \
235 (((struct fc_host_attrs *)(x)->shost_d 538 (((struct fc_host_attrs *)(x)->shost_data)->maxframe_size)
236 #define fc_host_hardware_version(x) \ !! 539 #define fc_host_max_npiv_vports(x) \
237 (((struct fc_host_attrs *)(x)->shost_d !! 540 (((struct fc_host_attrs *)(x)->shost_data)->max_npiv_vports)
238 #define fc_host_firmware_version(x) \ <<
239 (((struct fc_host_attrs *)(x)->shost_d <<
240 #define fc_host_serial_number(x) \ 541 #define fc_host_serial_number(x) \
241 (((struct fc_host_attrs *)(x)->shost_d 542 (((struct fc_host_attrs *)(x)->shost_data)->serial_number)
242 #define fc_host_opt_rom_version(x) \ <<
243 (((struct fc_host_attrs *)(x)->shost_d <<
244 #define fc_host_driver_version(x) \ <<
245 (((struct fc_host_attrs *)(x)->shost_d <<
246 #define fc_host_port_id(x) \ 543 #define fc_host_port_id(x) \
247 (((struct fc_host_attrs *)(x)->shost_d 544 (((struct fc_host_attrs *)(x)->shost_data)->port_id)
248 #define fc_host_port_type(x) \ 545 #define fc_host_port_type(x) \
249 (((struct fc_host_attrs *)(x)->shost_d 546 (((struct fc_host_attrs *)(x)->shost_data)->port_type)
250 #define fc_host_port_state(x) \ 547 #define fc_host_port_state(x) \
251 (((struct fc_host_attrs *)(x)->shost_d 548 (((struct fc_host_attrs *)(x)->shost_data)->port_state)
252 #define fc_host_active_fc4s(x) \ 549 #define fc_host_active_fc4s(x) \
253 (((struct fc_host_attrs *)(x)->shost_d 550 (((struct fc_host_attrs *)(x)->shost_data)->active_fc4s)
254 #define fc_host_speed(x) \ 551 #define fc_host_speed(x) \
255 (((struct fc_host_attrs *)(x)->shost_d 552 (((struct fc_host_attrs *)(x)->shost_data)->speed)
256 #define fc_host_fabric_name(x) \ 553 #define fc_host_fabric_name(x) \
257 (((struct fc_host_attrs *)(x)->shost_d 554 (((struct fc_host_attrs *)(x)->shost_data)->fabric_name)
258 #define fc_host_link_down_tmo(x) \ !! 555 #define fc_host_symbolic_name(x) \
259 (((struct fc_host_attrs *)(x)->shost_d !! 556 (((struct fc_host_attrs *)(x)->shost_data)->symbolic_name)
>> 557 #define fc_host_system_hostname(x) \
>> 558 (((struct fc_host_attrs *)(x)->shost_data)->system_hostname)
260 #define fc_host_tgtid_bind_type(x) \ 559 #define fc_host_tgtid_bind_type(x) \
261 (((struct fc_host_attrs *)(x)->shost_d 560 (((struct fc_host_attrs *)(x)->shost_data)->tgtid_bind_type)
262 #define fc_host_link_down_work(x) \ !! 561 #define fc_host_rports(x) \
263 (((struct fc_host_attrs *)(x)->shost_d !! 562 (((struct fc_host_attrs *)(x)->shost_data)->rports)
>> 563 #define fc_host_rport_bindings(x) \
>> 564 (((struct fc_host_attrs *)(x)->shost_data)->rport_bindings)
>> 565 #define fc_host_vports(x) \
>> 566 (((struct fc_host_attrs *)(x)->shost_data)->vports)
>> 567 #define fc_host_next_rport_number(x) \
>> 568 (((struct fc_host_attrs *)(x)->shost_data)->next_rport_number)
>> 569 #define fc_host_next_target_id(x) \
>> 570 (((struct fc_host_attrs *)(x)->shost_data)->next_target_id)
>> 571 #define fc_host_next_vport_number(x) \
>> 572 (((struct fc_host_attrs *)(x)->shost_data)->next_vport_number)
>> 573 #define fc_host_npiv_vports_inuse(x) \
>> 574 (((struct fc_host_attrs *)(x)->shost_data)->npiv_vports_inuse)
>> 575 #define fc_host_work_q_name(x) \
>> 576 (((struct fc_host_attrs *)(x)->shost_data)->work_q_name)
>> 577 #define fc_host_work_q(x) \
>> 578 (((struct fc_host_attrs *)(x)->shost_data)->work_q)
>> 579 #define fc_host_devloss_work_q_name(x) \
>> 580 (((struct fc_host_attrs *)(x)->shost_data)->devloss_work_q_name)
>> 581 #define fc_host_devloss_work_q(x) \
>> 582 (((struct fc_host_attrs *)(x)->shost_data)->devloss_work_q)
>> 583
>> 584
>> 585 struct fc_bsg_buffer {
>> 586 unsigned int payload_len;
>> 587 int sg_cnt;
>> 588 struct scatterlist *sg_list;
>> 589 };
>> 590
>> 591 /* Values for fc_bsg_job->state_flags (bitflags) */
>> 592 #define FC_RQST_STATE_INPROGRESS 0
>> 593 #define FC_RQST_STATE_DONE 1
>> 594
>> 595 struct fc_bsg_job {
>> 596 struct Scsi_Host *shost;
>> 597 struct fc_rport *rport;
>> 598 struct device *dev;
>> 599 struct request *req;
>> 600 spinlock_t job_lock;
>> 601 unsigned int state_flags;
>> 602 unsigned int ref_cnt;
>> 603 void (*job_done)(struct fc_bsg_job *);
>> 604
>> 605 struct fc_bsg_request *request;
>> 606 struct fc_bsg_reply *reply;
>> 607 unsigned int request_len;
>> 608 unsigned int reply_len;
>> 609 /*
>> 610 * On entry : reply_len indicates the buffer size allocated for
>> 611 * the reply.
>> 612 *
>> 613 * Upon completion : the message handler must set reply_len
>> 614 * to indicates the size of the reply to be returned to the
>> 615 * caller.
>> 616 */
>> 617
>> 618 /* DMA payloads for the request/response */
>> 619 struct fc_bsg_buffer request_payload;
>> 620 struct fc_bsg_buffer reply_payload;
>> 621
>> 622 void *dd_data; /* Used for driver-specific storage */
>> 623 };
264 624
265 625
266 /* The functions by which the transport class 626 /* The functions by which the transport class and the driver communicate */
267 struct fc_function_template { 627 struct fc_function_template {
268 void (*get_starget_port_id)(struct !! 628 void (*get_rport_dev_loss_tmo)(struct fc_rport *);
>> 629 void (*set_rport_dev_loss_tmo)(struct fc_rport *, u32);
>> 630
269 void (*get_starget_node_name)(struc 631 void (*get_starget_node_name)(struct scsi_target *);
270 void (*get_starget_port_name)(struc 632 void (*get_starget_port_name)(struct scsi_target *);
271 void (*get_starget_dev_loss_tmo)(st !! 633 void (*get_starget_port_id)(struct scsi_target *);
272 void (*set_starget_dev_loss_tmo)(st <<
273 634
274 void (*get_host_port_id)(struct Scs 635 void (*get_host_port_id)(struct Scsi_Host *);
275 void (*get_host_port_type)(struct S 636 void (*get_host_port_type)(struct Scsi_Host *);
276 void (*get_host_port_state)(struct 637 void (*get_host_port_state)(struct Scsi_Host *);
277 void (*get_host_active_fc4s)(struct 638 void (*get_host_active_fc4s)(struct Scsi_Host *);
278 void (*get_host_speed)(struct Scsi_ 639 void (*get_host_speed)(struct Scsi_Host *);
279 void (*get_host_fabric_name)(struct 640 void (*get_host_fabric_name)(struct Scsi_Host *);
280 void (*get_host_link_down_tmo)(stru !! 641 void (*get_host_symbolic_name)(struct Scsi_Host *);
281 void (*set_host_link_down_tmo)(stru !! 642 void (*set_host_system_hostname)(struct Scsi_Host *);
282 643
283 struct fc_host_statistics * (*get_fc_h 644 struct fc_host_statistics * (*get_fc_host_stats)(struct Scsi_Host *);
284 void (*reset_fc_host_stats)(struct 645 void (*reset_fc_host_stats)(struct Scsi_Host *);
285 646
286 /* !! 647 int (*issue_fc_host_lip)(struct Scsi_Host *);
>> 648
>> 649 void (*dev_loss_tmo_callbk)(struct fc_rport *);
>> 650 void (*terminate_rport_io)(struct fc_rport *);
>> 651
>> 652 void (*set_vport_symbolic_name)(struct fc_vport *);
>> 653 int (*vport_create)(struct fc_vport *, bool);
>> 654 int (*vport_disable)(struct fc_vport *, bool);
>> 655 int (*vport_delete)(struct fc_vport *);
>> 656
>> 657 /* target-mode drivers' functions */
>> 658 int (* tsk_mgmt_response)(struct Scsi_Host *, u64, u64, int);
>> 659 int (* it_nexus_response)(struct Scsi_Host *, u64, int);
>> 660
>> 661 /* bsg support */
>> 662 int (*bsg_request)(struct fc_bsg_job *);
>> 663 int (*bsg_timeout)(struct fc_bsg_job *);
>> 664
>> 665 /* allocation lengths for host-specific data */
>> 666 u32 dd_fcrport_size;
>> 667 u32 dd_fcvport_size;
>> 668 u32 dd_bsg_size;
>> 669
>> 670 /*
287 * The driver sets these to tell the t 671 * The driver sets these to tell the transport class it
288 * wants the attributes displayed in s 672 * wants the attributes displayed in sysfs. If the show_ flag
289 * is not set, the attribute will be p 673 * is not set, the attribute will be private to the transport
290 * class !! 674 * class
>> 675 */
>> 676
>> 677 /* remote port fixed attributes */
>> 678 unsigned long show_rport_maxframe_size:1;
>> 679 unsigned long show_rport_supported_classes:1;
>> 680 unsigned long show_rport_dev_loss_tmo:1;
>> 681
>> 682 /*
>> 683 * target dynamic attributes
>> 684 * These should all be "1" if the driver uses the remote port
>> 685 * add/delete functions (so attributes reflect rport values).
291 */ 686 */
292 unsigned long show_starget_port_id:1 <<
293 unsigned long show_starget_node_name 687 unsigned long show_starget_node_name:1;
294 unsigned long show_starget_port_name 688 unsigned long show_starget_port_name:1;
295 unsigned long show_starget_dev_loss_ !! 689 unsigned long show_starget_port_id:1;
296 690
297 /* host fixed attributes */ 691 /* host fixed attributes */
298 unsigned long show_host_node_name:1; 692 unsigned long show_host_node_name:1;
299 unsigned long show_host_port_name:1; 693 unsigned long show_host_port_name:1;
>> 694 unsigned long show_host_permanent_port_name:1;
300 unsigned long show_host_supported_cl 695 unsigned long show_host_supported_classes:1;
301 unsigned long show_host_supported_fc 696 unsigned long show_host_supported_fc4s:1;
302 unsigned long show_host_symbolic_nam <<
303 unsigned long show_host_supported_sp 697 unsigned long show_host_supported_speeds:1;
304 unsigned long show_host_maxframe_siz 698 unsigned long show_host_maxframe_size:1;
305 unsigned long show_host_hardware_ver <<
306 unsigned long show_host_firmware_ver <<
307 unsigned long show_host_serial_numbe 699 unsigned long show_host_serial_number:1;
308 unsigned long show_host_opt_rom_vers <<
309 unsigned long show_host_driver_versi <<
310 /* host dynamic attributes */ 700 /* host dynamic attributes */
311 unsigned long show_host_port_id:1; 701 unsigned long show_host_port_id:1;
312 unsigned long show_host_port_type:1; 702 unsigned long show_host_port_type:1;
313 unsigned long show_host_port_state:1 703 unsigned long show_host_port_state:1;
314 unsigned long show_host_active_fc4s: 704 unsigned long show_host_active_fc4s:1;
315 unsigned long show_host_speed:1; 705 unsigned long show_host_speed:1;
316 unsigned long show_host_fabric_name: 706 unsigned long show_host_fabric_name:1;
317 unsigned long show_host_link_down_tm !! 707 unsigned long show_host_symbolic_name:1;
>> 708 unsigned long show_host_system_hostname:1;
>> 709
>> 710 unsigned long disable_target_scan:1;
318 }; 711 };
319 712
320 713
321 struct scsi_transport_template *fc_attach_tran !! 714 /**
>> 715 * fc_remote_port_chkready - called to validate the remote port state
>> 716 * prior to initiating io to the port.
>> 717 *
>> 718 * Returns a scsi result code that can be returned by the LLDD.
>> 719 *
>> 720 * @rport: remote port to be checked
>> 721 **/
>> 722 static inline int
>> 723 fc_remote_port_chkready(struct fc_rport *rport)
>> 724 {
>> 725 int result;
>> 726
>> 727 switch (rport->port_state) {
>> 728 case FC_PORTSTATE_ONLINE:
>> 729 if (rport->roles & FC_PORT_ROLE_FCP_TARGET)
>> 730 result = 0;
>> 731 else if (rport->flags & FC_RPORT_DEVLOSS_PENDING)
>> 732 result = DID_IMM_RETRY << 16;
>> 733 else
>> 734 result = DID_NO_CONNECT << 16;
>> 735 break;
>> 736 case FC_PORTSTATE_BLOCKED:
>> 737 if (rport->flags & FC_RPORT_FAST_FAIL_TIMEDOUT)
>> 738 result = DID_TRANSPORT_FAILFAST << 16;
>> 739 else
>> 740 result = DID_IMM_RETRY << 16;
>> 741 break;
>> 742 default:
>> 743 result = DID_NO_CONNECT << 16;
>> 744 break;
>> 745 }
>> 746 return result;
>> 747 }
>> 748
>> 749 static inline u64 wwn_to_u64(u8 *wwn)
>> 750 {
>> 751 return (u64)wwn[0] << 56 | (u64)wwn[1] << 48 |
>> 752 (u64)wwn[2] << 40 | (u64)wwn[3] << 32 |
>> 753 (u64)wwn[4] << 24 | (u64)wwn[5] << 16 |
>> 754 (u64)wwn[6] << 8 | (u64)wwn[7];
>> 755 }
>> 756
>> 757 static inline void u64_to_wwn(u64 inm, u8 *wwn)
>> 758 {
>> 759 wwn[0] = (inm >> 56) & 0xff;
>> 760 wwn[1] = (inm >> 48) & 0xff;
>> 761 wwn[2] = (inm >> 40) & 0xff;
>> 762 wwn[3] = (inm >> 32) & 0xff;
>> 763 wwn[4] = (inm >> 24) & 0xff;
>> 764 wwn[5] = (inm >> 16) & 0xff;
>> 765 wwn[6] = (inm >> 8) & 0xff;
>> 766 wwn[7] = inm & 0xff;
>> 767 }
>> 768
>> 769 /**
>> 770 * fc_vport_set_state() - called to set a vport's state. Saves the old state,
>> 771 * excepting the transitory states of initializing and sending the ELS
>> 772 * traffic to instantiate the vport on the link.
>> 773 *
>> 774 * Assumes the driver has surrounded this with the proper locking to ensure
>> 775 * a coherent state change.
>> 776 *
>> 777 * @vport: virtual port whose state is changing
>> 778 * @new_state: new state
>> 779 **/
>> 780 static inline void
>> 781 fc_vport_set_state(struct fc_vport *vport, enum fc_vport_state new_state)
>> 782 {
>> 783 if ((new_state != FC_VPORT_UNKNOWN) &&
>> 784 (new_state != FC_VPORT_INITIALIZING))
>> 785 vport->vport_last_state = vport->vport_state;
>> 786 vport->vport_state = new_state;
>> 787 }
>> 788
>> 789 struct scsi_transport_template *fc_attach_transport(
>> 790 struct fc_function_template *);
322 void fc_release_transport(struct scsi_transpor 791 void fc_release_transport(struct scsi_transport_template *);
323 int fc_target_block(struct scsi_target *starge !! 792 void fc_remove_host(struct Scsi_Host *);
324 void fc_target_unblock(struct scsi_target *sta !! 793 struct fc_rport *fc_remote_port_add(struct Scsi_Host *shost,
325 int fc_host_block(struct Scsi_Host *shost); !! 794 int channel, struct fc_rport_identifiers *ids);
326 void fc_host_unblock(struct Scsi_Host *shost); !! 795 void fc_remote_port_delete(struct fc_rport *rport);
>> 796 void fc_remote_port_rolechg(struct fc_rport *rport, u32 roles);
>> 797 int scsi_is_fc_rport(const struct device *);
>> 798 u32 fc_get_event_number(void);
>> 799 void fc_host_post_event(struct Scsi_Host *shost, u32 event_number,
>> 800 enum fc_host_event_code event_code, u32 event_data);
>> 801 void fc_host_post_vendor_event(struct Scsi_Host *shost, u32 event_number,
>> 802 u32 data_len, char * data_buf, u64 vendor_id);
>> 803 /* Note: when specifying vendor_id to fc_host_post_vendor_event()
>> 804 * be sure to read the Vendor Type and ID formatting requirements
>> 805 * specified in scsi_netlink.h
>> 806 */
>> 807 struct fc_vport *fc_vport_create(struct Scsi_Host *shost, int channel,
>> 808 struct fc_vport_identifiers *);
>> 809 int fc_vport_terminate(struct fc_vport *vport);
327 810
328 #endif /* SCSI_TRANSPORT_FC_H */ 811 #endif /* SCSI_TRANSPORT_FC_H */
329 812
|
This page was automatically generated by the
LXR engine.
|