1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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
34struct scsi_transport_template;
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56enum fc_port_type {
57 FC_PORTTYPE_UNKNOWN,
58 FC_PORTTYPE_OTHER,
59 FC_PORTTYPE_NOTPRESENT,
60 FC_PORTTYPE_NPORT,
61 FC_PORTTYPE_NLPORT,
62 FC_PORTTYPE_LPORT,
63 FC_PORTTYPE_PTP,
64 FC_PORTTYPE_NPIV,
65};
66
67
68
69
70
71
72enum fc_port_state {
73 FC_PORTSTATE_UNKNOWN,
74 FC_PORTSTATE_NOTPRESENT,
75 FC_PORTSTATE_ONLINE,
76 FC_PORTSTATE_OFFLINE,
77 FC_PORTSTATE_BLOCKED,
78 FC_PORTSTATE_BYPASSED,
79 FC_PORTSTATE_DIAGNOSTICS,
80 FC_PORTSTATE_LINKDOWN,
81 FC_PORTSTATE_ERROR,
82 FC_PORTSTATE_LOOPBACK,
83 FC_PORTSTATE_DELETED,
84};
85
86
87
88
89
90
91enum 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,
102};
103
104
105
106
107
108
109
110
111
112#define FC_COS_UNSPECIFIED 0
113#define FC_COS_CLASS1 2
114#define FC_COS_CLASS2 4
115#define FC_COS_CLASS3 8
116#define FC_COS_CLASS4 0x10
117#define FC_COS_CLASS6 0x40
118
119
120
121
122
123
124
125#define FC_PORTSPEED_UNKNOWN 0
126
127#define FC_PORTSPEED_1GBIT 1
128#define FC_PORTSPEED_2GBIT 2
129#define FC_PORTSPEED_4GBIT 4
130#define FC_PORTSPEED_10GBIT 8
131#define FC_PORTSPEED_8GBIT 0x10
132#define FC_PORTSPEED_16GBIT 0x20
133#define FC_PORTSPEED_NOT_NEGOTIATED (1 << 15)
134
135
136
137
138
139enum fc_tgtid_binding_type {
140 FC_TGTID_BIND_NONE,
141 FC_TGTID_BIND_BY_WWPN,
142 FC_TGTID_BIND_BY_WWNN,
143 FC_TGTID_BIND_BY_ID,
144};
145
146
147
148
149
150
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
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
165#define FC_VPORT_ATTR(_name,_mode,_show,_store) \
166struct device_attribute dev_attr_vport_##_name = \
167 __ATTR(_name,_mode,_show,_store)
168
169
170
171
172
173
174
175
176
177
178
179
180#define FC_VPORT_SYMBOLIC_NAMELEN 64
181struct fc_vport_identifiers {
182 u64 node_name;
183 u64 port_name;
184 u32 roles;
185 bool disable;
186 enum fc_port_type vport_type;
187 char symbolic_name[FC_VPORT_SYMBOLIC_NAMELEN];
188};
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219struct fc_vport {
220
221
222
223
224
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;
231 enum fc_port_type vport_type;
232 char symbolic_name[FC_VPORT_SYMBOLIC_NAMELEN];
233
234
235 void *dd_data;
236
237
238 struct Scsi_Host *shost;
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
248#define FC_VPORT_CREATING 0x01
249#define FC_VPORT_DELETING 0x02
250#define FC_VPORT_DELETED 0x04
251#define FC_VPORT_DEL 0x06
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
266#define VPCERR_UNSUPPORTED -ENOSYS
267
268#define VPCERR_BAD_WWN -ENOTUNIQ
269
270#define VPCERR_NO_FABRIC_SUPP -EOPNOTSUPP
271
272
273
274
275
276
277
278
279
280
281
282struct fc_rport_identifiers {
283 u64 node_name;
284 u64 port_name;
285 u32 port_id;
286 u32 roles;
287};
288
289
290
291#define FC_RPORT_ATTR(_name,_mode,_show,_store) \
292struct device_attribute dev_attr_rport_##_name = \
293 __ATTR(_name,_mode,_show,_store)
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323struct fc_rport {
324
325 u32 maxframe_size;
326 u32 supported_classes;
327
328
329 u32 dev_loss_tmo;
330
331
332 u64 node_name;
333 u64 port_name;
334 u32 port_id;
335 u32 roles;
336 enum fc_port_state port_state;
337 u32 scsi_target_id;
338 u32 fast_io_fail_tmo;
339
340
341 void *dd_data;
342
343
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;
355} __attribute__((aligned(sizeof(unsigned long))));
356
357
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
372
373
374
375
376
377
378
379
380
381
382struct fc_starget_attrs {
383
384 u64 node_name;
385 u64 port_name;
386 u32 port_id;
387};
388
389#define fc_starget_node_name(x) \
390 (((struct fc_starget_attrs *)&(x)->starget_data)->node_name)
391#define fc_starget_port_name(x) \
392 (((struct fc_starget_attrs *)&(x)->starget_data)->port_name)
393#define fc_starget_port_id(x) \
394 (((struct fc_starget_attrs *)&(x)->starget_data)->port_id)
395
396#define starget_to_rport(s) \
397 scsi_is_fc_rport(s->dev.parent) ? dev_to_rport(s->dev.parent) : NULL
398
399
400
401
402
403
404
405struct fc_host_statistics {
406
407 u64 seconds_since_last_reset;
408 u64 tx_frames;
409 u64 tx_words;
410 u64 rx_frames;
411 u64 rx_words;
412 u64 lip_count;
413 u64 nos_count;
414 u64 error_frames;
415 u64 dumped_frames;
416 u64 link_failure_count;
417 u64 loss_of_sync_count;
418 u64 loss_of_signal_count;
419 u64 prim_seq_protocol_err_count;
420 u64 invalid_tx_word_count;
421 u64 invalid_crc_count;
422
423
424 u64 fcp_input_requests;
425 u64 fcp_output_requests;
426 u64 fcp_control_requests;
427 u64 fcp_input_megabytes;
428 u64 fcp_output_megabytes;
429};
430
431
432
433
434
435
436
437
438
439
440enum 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
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473#define FC_FC4_LIST_SIZE 32
474#define FC_SYMBOLIC_NAME_SIZE 256
475#define FC_VERSION_STRING_SIZE 64
476#define FC_SERIAL_NUMBER_SIZE 80
477
478struct fc_host_attrs {
479
480 u64 node_name;
481 u64 port_name;
482 u64 permanent_port_name;
483 u32 supported_classes;
484 u8 supported_fc4s[FC_FC4_LIST_SIZE];
485 u32 supported_speeds;
486 u32 maxframe_size;
487 u16 max_npiv_vports;
488 char serial_number[FC_SERIAL_NUMBER_SIZE];
489
490
491 u32 port_id;
492 enum fc_port_type port_type;
493 enum fc_port_state port_state;
494 u8 active_fc4s[FC_FC4_LIST_SIZE];
495 u32 speed;
496 u64 fabric_name;
497 char symbolic_name[FC_SYMBOLIC_NAME_SIZE];
498 char system_hostname[FC_SYMBOLIC_NAME_SIZE];
499
500
501 enum fc_tgtid_binding_type tgtid_bind_type;
502
503
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
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
519 struct request_queue *rqst_q;
520};
521
522#define shost_to_fc_host(x) \
523 ((struct fc_host_attrs *)(x)->shost_data)
524
525#define fc_host_node_name(x) \
526 (((struct fc_host_attrs *)(x)->shost_data)->node_name)
527#define fc_host_port_name(x) \
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)
531#define fc_host_supported_classes(x) \
532 (((struct fc_host_attrs *)(x)->shost_data)->supported_classes)
533#define fc_host_supported_fc4s(x) \
534 (((struct fc_host_attrs *)(x)->shost_data)->supported_fc4s)
535#define fc_host_supported_speeds(x) \
536 (((struct fc_host_attrs *)(x)->shost_data)->supported_speeds)
537#define fc_host_maxframe_size(x) \
538 (((struct fc_host_attrs *)(x)->shost_data)->maxframe_size)
539#define fc_host_max_npiv_vports(x) \
540 (((struct fc_host_attrs *)(x)->shost_data)->max_npiv_vports)
541#define fc_host_serial_number(x) \
542 (((struct fc_host_attrs *)(x)->shost_data)->serial_number)
543#define fc_host_port_id(x) \
544 (((struct fc_host_attrs *)(x)->shost_data)->port_id)
545#define fc_host_port_type(x) \
546 (((struct fc_host_attrs *)(x)->shost_data)->port_type)
547#define fc_host_port_state(x) \
548 (((struct fc_host_attrs *)(x)->shost_data)->port_state)
549#define fc_host_active_fc4s(x) \
550 (((struct fc_host_attrs *)(x)->shost_data)->active_fc4s)
551#define fc_host_speed(x) \
552 (((struct fc_host_attrs *)(x)->shost_data)->speed)
553#define fc_host_fabric_name(x) \
554 (((struct fc_host_attrs *)(x)->shost_data)->fabric_name)
555#define fc_host_symbolic_name(x) \
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)
559#define fc_host_tgtid_bind_type(x) \
560 (((struct fc_host_attrs *)(x)->shost_data)->tgtid_bind_type)
561#define fc_host_rports(x) \
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
585struct fc_bsg_buffer {
586 unsigned int payload_len;
587 int sg_cnt;
588 struct scatterlist *sg_list;
589};
590
591
592#define FC_RQST_STATE_INPROGRESS 0
593#define FC_RQST_STATE_DONE 1
594
595struct 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
611
612
613
614
615
616
617
618
619 struct fc_bsg_buffer request_payload;
620 struct fc_bsg_buffer reply_payload;
621
622 void *dd_data;
623};
624
625
626
627struct fc_function_template {
628 void (*get_rport_dev_loss_tmo)(struct fc_rport *);
629 void (*set_rport_dev_loss_tmo)(struct fc_rport *, u32);
630
631 void (*get_starget_node_name)(struct scsi_target *);
632 void (*get_starget_port_name)(struct scsi_target *);
633 void (*get_starget_port_id)(struct scsi_target *);
634
635 void (*get_host_port_id)(struct Scsi_Host *);
636 void (*get_host_port_type)(struct Scsi_Host *);
637 void (*get_host_port_state)(struct Scsi_Host *);
638 void (*get_host_active_fc4s)(struct Scsi_Host *);
639 void (*get_host_speed)(struct Scsi_Host *);
640 void (*get_host_fabric_name)(struct Scsi_Host *);
641 void (*get_host_symbolic_name)(struct Scsi_Host *);
642 void (*set_host_system_hostname)(struct Scsi_Host *);
643
644 struct fc_host_statistics * (*get_fc_host_stats)(struct Scsi_Host *);
645 void (*reset_fc_host_stats)(struct Scsi_Host *);
646
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
658 int (* tsk_mgmt_response)(struct Scsi_Host *, u64, u64, int);
659 int (* it_nexus_response)(struct Scsi_Host *, u64, int);
660
661
662 int (*bsg_request)(struct fc_bsg_job *);
663 int (*bsg_timeout)(struct fc_bsg_job *);
664
665
666 u32 dd_fcrport_size;
667 u32 dd_fcvport_size;
668 u32 dd_bsg_size;
669
670
671
672
673
674
675
676
677
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
684
685
686
687 unsigned long show_starget_node_name:1;
688 unsigned long show_starget_port_name:1;
689 unsigned long show_starget_port_id:1;
690
691
692 unsigned long show_host_node_name:1;
693 unsigned long show_host_port_name:1;
694 unsigned long show_host_permanent_port_name:1;
695 unsigned long show_host_supported_classes:1;
696 unsigned long show_host_supported_fc4s:1;
697 unsigned long show_host_supported_speeds:1;
698 unsigned long show_host_maxframe_size:1;
699 unsigned long show_host_serial_number:1;
700
701 unsigned long show_host_port_id:1;
702 unsigned long show_host_port_type:1;
703 unsigned long show_host_port_state:1;
704 unsigned long show_host_active_fc4s:1;
705 unsigned long show_host_speed:1;
706 unsigned long show_host_fabric_name:1;
707 unsigned long show_host_symbolic_name:1;
708 unsigned long show_host_system_hostname:1;
709
710 unsigned long disable_target_scan:1;
711};
712
713
714
715
716
717
718
719
720
721
722static inline int
723fc_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
749static 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
757static 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
771
772
773
774
775
776
777
778
779
780static inline void
781fc_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
789struct scsi_transport_template *fc_attach_transport(
790 struct fc_function_template *);
791void fc_release_transport(struct scsi_transport_template *);
792void fc_remove_host(struct Scsi_Host *);
793struct fc_rport *fc_remote_port_add(struct Scsi_Host *shost,
794 int channel, struct fc_rport_identifiers *ids);
795void fc_remote_port_delete(struct fc_rport *rport);
796void fc_remote_port_rolechg(struct fc_rport *rport, u32 roles);
797int scsi_is_fc_rport(const struct device *);
798u32 fc_get_event_number(void);
799void fc_host_post_event(struct Scsi_Host *shost, u32 event_number,
800 enum fc_host_event_code event_code, u32 event_data);
801void fc_host_post_vendor_event(struct Scsi_Host *shost, u32 event_number,
802 u32 data_len, char * data_buf, u64 vendor_id);
803
804
805
806
807struct fc_vport *fc_vport_create(struct Scsi_Host *shost, int channel,
808 struct fc_vport_identifiers *);
809int fc_vport_terminate(struct fc_vport *vport);
810
811#endif
812