OpenCores
URL https://opencores.org/ocsvn/test_project/test_project/trunk

Subversion Repositories test_project

[/] [test_project/] [trunk/] [linux_sd_driver/] [include/] [scsi/] [scsi_transport_fc.h] - Blame information for rev 62

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 62 marcus.erl
/*
2
 *  FiberChannel transport specific attributes exported to sysfs.
3
 *
4
 *  Copyright (c) 2003 Silicon Graphics, Inc.  All rights reserved.
5
 *
6
 *  This program is free software; you can redistribute it and/or modify
7
 *  it under the terms of the GNU General Public License as published by
8
 *  the Free Software Foundation; either version 2 of the License, or
9
 *  (at your option) any later version.
10
 *
11
 *  This program is distributed in the hope that it will be useful,
12
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
13
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
 *  GNU General Public License for more details.
15
 *
16
 *  You should have received a copy of the GNU General Public License
17
 *  along with this program; if not, write to the Free Software
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
 *
26
 */
27
#ifndef SCSI_TRANSPORT_FC_H
28
#define SCSI_TRANSPORT_FC_H
29
 
30
#include <linux/sched.h>
31
#include <scsi/scsi.h>
32
#include <scsi/scsi_netlink.h>
33
 
34
struct scsi_transport_template;
35
 
36
 
37
/*
38
 * FC Port definitions - Following FC HBAAPI guidelines
39
 *
40
 * Note: Not all binary values for the different fields match HBAAPI.
41
 *  Instead, we use densely packed ordinal values or enums.
42
 *  We get away with this as we never present the actual binary values
43
 *  externally. For sysfs, we always present the string that describes
44
 *  the value. Thus, an admin doesn't need a magic HBAAPI decoder ring
45
 *  to understand the values. The HBAAPI user-space library is free to
46
 *  convert the strings into the HBAAPI-specified binary values.
47
 *
48
 * Note: Not all HBAAPI-defined values are contained in the definitions
49
 *  below. Those not appropriate to an fc_host (e.g. FCP initiator) have
50
 *  been removed.
51
 */
52
 
53
/*
54
 * fc_port_type: If you alter this, you also need to alter scsi_transport_fc.c
55
 * (for the ascii descriptions).
56
 */
57
enum fc_port_type {
58
        FC_PORTTYPE_UNKNOWN,
59
        FC_PORTTYPE_OTHER,
60
        FC_PORTTYPE_NOTPRESENT,
61
        FC_PORTTYPE_NPORT,              /* Attached to FPort */
62
        FC_PORTTYPE_NLPORT,             /* (Public) Loop w/ FLPort */
63
        FC_PORTTYPE_LPORT,              /* (Private) Loop w/o FLPort */
64
        FC_PORTTYPE_PTP,                /* Point to Point w/ another NPort */
65
        FC_PORTTYPE_NPIV,               /* VPORT based on NPIV */
66
};
67
 
68
 
69
/*
70
 * fc_port_state: If you alter this, you also need to alter scsi_transport_fc.c
71
 * (for the ascii descriptions).
72
 */
73
enum fc_port_state {
74
        FC_PORTSTATE_UNKNOWN,
75
        FC_PORTSTATE_NOTPRESENT,
76
        FC_PORTSTATE_ONLINE,
77
        FC_PORTSTATE_OFFLINE,           /* User has taken Port Offline */
78
        FC_PORTSTATE_BLOCKED,
79
        FC_PORTSTATE_BYPASSED,
80
        FC_PORTSTATE_DIAGNOSTICS,
81
        FC_PORTSTATE_LINKDOWN,
82
        FC_PORTSTATE_ERROR,
83
        FC_PORTSTATE_LOOPBACK,
84
        FC_PORTSTATE_DELETED,
85
};
86
 
87
 
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
/*
108
 * FC Classes of Service
109
 * Note: values are not enumerated, as they can be "or'd" together
110
 * for reporting (e.g. report supported_classes). If you alter this list,
111
 * you also need to alter scsi_transport_fc.c (for the ascii descriptions).
112
 */
113
#define FC_COS_UNSPECIFIED              0
114
#define FC_COS_CLASS1                   2
115
#define FC_COS_CLASS2                   4
116
#define FC_COS_CLASS3                   8
117
#define FC_COS_CLASS4                   0x10
118
#define FC_COS_CLASS6                   0x40
119
 
120
/*
121
 * FC Port Speeds
122
 * Note: values are not enumerated, as they can be "or'd" together
123
 * for reporting (e.g. report supported_speeds). If you alter this list,
124
 * you also need to alter scsi_transport_fc.c (for the ascii descriptions).
125
 */
126
#define FC_PORTSPEED_UNKNOWN            0 /* Unknown - transceiver
127
                                             incapable of reporting */
128
#define FC_PORTSPEED_1GBIT              1
129
#define FC_PORTSPEED_2GBIT              2
130
#define FC_PORTSPEED_4GBIT              4
131
#define FC_PORTSPEED_10GBIT             8
132
#define FC_PORTSPEED_8GBIT              0x10
133
#define FC_PORTSPEED_16GBIT             0x20
134
#define FC_PORTSPEED_NOT_NEGOTIATED     (1 << 15) /* Speed not established */
135
 
136
/*
137
 * fc_tgtid_binding_type: If you alter this, you also need to alter
138
 * scsi_transport_fc.c (for the ascii descriptions).
139
 */
140
enum fc_tgtid_binding_type  {
141
        FC_TGTID_BIND_NONE,
142
        FC_TGTID_BIND_BY_WWPN,
143
        FC_TGTID_BIND_BY_WWNN,
144
        FC_TGTID_BIND_BY_ID,
145
};
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)
169
 
170
 
171
/*
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 priviledge, 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.
198
 */
199
 
200
#define FC_VPORT_SYMBOLIC_NAMELEN               64
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;
209
        u64 node_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 */
311
        u32 dev_loss_tmo;       /* Remote Port loss timeout in seconds. */
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;
366
};
367
 
368
#define fc_starget_node_name(x) \
369
        (((struct fc_starget_attrs *)&(x)->starget_data)->node_name)
370
#define fc_starget_port_name(x) \
371
        (((struct fc_starget_attrs *)&(x)->starget_data)->port_name)
372
#define fc_starget_port_id(x) \
373
        (((struct fc_starget_attrs *)&(x)->starget_data)->port_id)
374
 
375
#define starget_to_rport(s)                     \
376
        scsi_is_fc_rport(s->dev.parent) ? dev_to_rport(s->dev.parent) : NULL
377
 
378
 
379
/*
380
 * FC Local Port (Host) Statistics
381
 */
382
 
383
/* FC Statistics - Following FC HBAAPI v2.0 guidelines */
384
struct fc_host_statistics {
385
        /* port statistics */
386
        u64 seconds_since_last_reset;
387
        u64 tx_frames;
388
        u64 tx_words;
389
        u64 rx_frames;
390
        u64 rx_words;
391
        u64 lip_count;
392
        u64 nos_count;
393
        u64 error_frames;
394
        u64 dumped_frames;
395
        u64 link_failure_count;
396
        u64 loss_of_sync_count;
397
        u64 loss_of_signal_count;
398
        u64 prim_seq_protocol_err_count;
399
        u64 invalid_tx_word_count;
400
        u64 invalid_crc_count;
401
 
402
        /* fc4 statistics  (only FCP supported currently) */
403
        u64 fcp_input_requests;
404
        u64 fcp_output_requests;
405
        u64 fcp_control_requests;
406
        u64 fcp_input_megabytes;
407
        u64 fcp_output_megabytes;
408
};
409
 
410
 
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
/*
436
 * FC Local Port (Host) Attributes
437
 *
438
 * Attributes are based on HBAAPI V2.0 definitions.
439
 * Note: OSDeviceName is determined by user-space library
440
 *
441
 * Fixed attributes are not expected to change. The driver is
442
 * expected to set these values after successfully calling scsi_add_host().
443
 * The transport fully manages all get functions w/o driver interaction.
444
 *
445
 * Dynamic attributes are expected to change. The driver participates
446
 * in all get/set operations via functions provided by the driver.
447
 *
448
 * Private attributes are transport-managed values. They are fully
449
 * managed by the transport w/o driver interaction.
450
 */
451
 
452
#define FC_FC4_LIST_SIZE                32
453
#define FC_SYMBOLIC_NAME_SIZE           256
454
#define FC_VERSION_STRING_SIZE          64
455
#define FC_SERIAL_NUMBER_SIZE           80
456
 
457
struct fc_host_attrs {
458
        /* Fixed Attributes */
459
        u64 node_name;
460
        u64 port_name;
461
        u64 permanent_port_name;
462
        u32 supported_classes;
463
        u8  supported_fc4s[FC_FC4_LIST_SIZE];
464
        u32 supported_speeds;
465
        u32 maxframe_size;
466
        u16 max_npiv_vports;
467
        char serial_number[FC_SERIAL_NUMBER_SIZE];
468
 
469
        /* Dynamic Attributes */
470
        u32 port_id;
471
        enum fc_port_type port_type;
472
        enum fc_port_state port_state;
473
        u8  active_fc4s[FC_FC4_LIST_SIZE];
474
        u32 speed;
475
        u64 fabric_name;
476
        char symbolic_name[FC_SYMBOLIC_NAME_SIZE];
477
        char system_hostname[FC_SYMBOLIC_NAME_SIZE];
478
 
479
        /* Private (Transport-managed) Attributes */
480
        enum fc_tgtid_binding_type  tgtid_bind_type;
481
 
482
        /* internal data */
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;
496
};
497
 
498
#define shost_to_fc_host(x) \
499
        ((struct fc_host_attrs *)(x)->shost_data)
500
 
501
#define fc_host_node_name(x) \
502
        (((struct fc_host_attrs *)(x)->shost_data)->node_name)
503
#define fc_host_port_name(x)    \
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)
507
#define fc_host_supported_classes(x)    \
508
        (((struct fc_host_attrs *)(x)->shost_data)->supported_classes)
509
#define fc_host_supported_fc4s(x)       \
510
        (((struct fc_host_attrs *)(x)->shost_data)->supported_fc4s)
511
#define fc_host_supported_speeds(x)     \
512
        (((struct fc_host_attrs *)(x)->shost_data)->supported_speeds)
513
#define fc_host_maxframe_size(x)        \
514
        (((struct fc_host_attrs *)(x)->shost_data)->maxframe_size)
515
#define fc_host_max_npiv_vports(x)      \
516
        (((struct fc_host_attrs *)(x)->shost_data)->max_npiv_vports)
517
#define fc_host_serial_number(x)        \
518
        (((struct fc_host_attrs *)(x)->shost_data)->serial_number)
519
#define fc_host_port_id(x)      \
520
        (((struct fc_host_attrs *)(x)->shost_data)->port_id)
521
#define fc_host_port_type(x)    \
522
        (((struct fc_host_attrs *)(x)->shost_data)->port_type)
523
#define fc_host_port_state(x)   \
524
        (((struct fc_host_attrs *)(x)->shost_data)->port_state)
525
#define fc_host_active_fc4s(x)  \
526
        (((struct fc_host_attrs *)(x)->shost_data)->active_fc4s)
527
#define fc_host_speed(x)        \
528
        (((struct fc_host_attrs *)(x)->shost_data)->speed)
529
#define fc_host_fabric_name(x)  \
530
        (((struct fc_host_attrs *)(x)->shost_data)->fabric_name)
531
#define fc_host_symbolic_name(x)        \
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)
535
#define fc_host_tgtid_bind_type(x) \
536
        (((struct fc_host_attrs *)(x)->shost_data)->tgtid_bind_type)
537
#define fc_host_rports(x) \
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)
559
 
560
 
561
/* The functions by which the transport class and the driver communicate */
562
struct fc_function_template {
563
        void    (*get_rport_dev_loss_tmo)(struct fc_rport *);
564
        void    (*set_rport_dev_loss_tmo)(struct fc_rport *, u32);
565
 
566
        void    (*get_starget_node_name)(struct scsi_target *);
567
        void    (*get_starget_port_name)(struct scsi_target *);
568
        void    (*get_starget_port_id)(struct scsi_target *);
569
 
570
        void    (*get_host_port_id)(struct Scsi_Host *);
571
        void    (*get_host_port_type)(struct Scsi_Host *);
572
        void    (*get_host_port_state)(struct Scsi_Host *);
573
        void    (*get_host_active_fc4s)(struct Scsi_Host *);
574
        void    (*get_host_speed)(struct Scsi_Host *);
575
        void    (*get_host_fabric_name)(struct Scsi_Host *);
576
        void    (*get_host_symbolic_name)(struct Scsi_Host *);
577
        void    (*set_host_system_hostname)(struct Scsi_Host *);
578
 
579
        struct fc_host_statistics * (*get_fc_host_stats)(struct Scsi_Host *);
580
        void    (*reset_fc_host_stats)(struct Scsi_Host *);
581
 
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
        /*
601
         * The driver sets these to tell the transport class it
602
         * wants the attributes displayed in sysfs.  If the show_ flag
603
         * is not set, the attribute will be private to the transport
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).
616
         */
617
        unsigned long   show_starget_node_name:1;
618
        unsigned long   show_starget_port_name:1;
619
        unsigned long   show_starget_port_id:1;
620
 
621
        /* host fixed attributes */
622
        unsigned long   show_host_node_name:1;
623
        unsigned long   show_host_port_name:1;
624
        unsigned long   show_host_permanent_port_name:1;
625
        unsigned long   show_host_supported_classes:1;
626
        unsigned long   show_host_supported_fc4s:1;
627
        unsigned long   show_host_supported_speeds:1;
628
        unsigned long   show_host_maxframe_size:1;
629
        unsigned long   show_host_serial_number:1;
630
        /* host dynamic attributes */
631
        unsigned long   show_host_port_id:1;
632
        unsigned long   show_host_port_type:1;
633
        unsigned long   show_host_port_state:1;
634
        unsigned long   show_host_active_fc4s:1;
635
        unsigned long   show_host_speed:1;
636
        unsigned long   show_host_fabric_name:1;
637
        unsigned long   show_host_symbolic_name:1;
638
        unsigned long   show_host_system_hostname:1;
639
 
640
        unsigned long   disable_target_scan:1;
641
};
642
 
643
 
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 *);
719
void fc_release_transport(struct scsi_transport_template *);
720
void fc_remove_host(struct Scsi_Host *);
721
struct fc_rport *fc_remote_port_add(struct Scsi_Host *shost,
722
                        int channel, struct fc_rport_identifiers  *ids);
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);
736
 
737
#endif /* SCSI_TRANSPORT_FC_H */

powered by: WebSVN 2.1.0

© copyright 1999-2025 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.