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