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 u32 dev_loss_tmo;
500
501
502 enum fc_tgtid_binding_type tgtid_bind_type;
503
504
505 struct list_head rports;
506 struct list_head rport_bindings;
507 struct list_head vports;
508 u32 next_rport_number;
509 u32 next_target_id;
510 u32 next_vport_number;
511 u16 npiv_vports_inuse;
512
513
514 char work_q_name[20];
515 struct workqueue_struct *work_q;
516 char devloss_work_q_name[20];
517 struct workqueue_struct *devloss_work_q;
518
519
520 struct request_queue *rqst_q;
521};
522
523#define shost_to_fc_host(x) \
524 ((struct fc_host_attrs *)(x)->shost_data)
525
526#define fc_host_node_name(x) \
527 (((struct fc_host_attrs *)(x)->shost_data)->node_name)
528#define fc_host_port_name(x) \
529 (((struct fc_host_attrs *)(x)->shost_data)->port_name)
530#define fc_host_permanent_port_name(x) \
531 (((struct fc_host_attrs *)(x)->shost_data)->permanent_port_name)
532#define fc_host_supported_classes(x) \
533 (((struct fc_host_attrs *)(x)->shost_data)->supported_classes)
534#define fc_host_supported_fc4s(x) \
535 (((struct fc_host_attrs *)(x)->shost_data)->supported_fc4s)
536#define fc_host_supported_speeds(x) \
537 (((struct fc_host_attrs *)(x)->shost_data)->supported_speeds)
538#define fc_host_maxframe_size(x) \
539 (((struct fc_host_attrs *)(x)->shost_data)->maxframe_size)
540#define fc_host_max_npiv_vports(x) \
541 (((struct fc_host_attrs *)(x)->shost_data)->max_npiv_vports)
542#define fc_host_serial_number(x) \
543 (((struct fc_host_attrs *)(x)->shost_data)->serial_number)
544#define fc_host_port_id(x) \
545 (((struct fc_host_attrs *)(x)->shost_data)->port_id)
546#define fc_host_port_type(x) \
547 (((struct fc_host_attrs *)(x)->shost_data)->port_type)
548#define fc_host_port_state(x) \
549 (((struct fc_host_attrs *)(x)->shost_data)->port_state)
550#define fc_host_active_fc4s(x) \
551 (((struct fc_host_attrs *)(x)->shost_data)->active_fc4s)
552#define fc_host_speed(x) \
553 (((struct fc_host_attrs *)(x)->shost_data)->speed)
554#define fc_host_fabric_name(x) \
555 (((struct fc_host_attrs *)(x)->shost_data)->fabric_name)
556#define fc_host_symbolic_name(x) \
557 (((struct fc_host_attrs *)(x)->shost_data)->symbolic_name)
558#define fc_host_system_hostname(x) \
559 (((struct fc_host_attrs *)(x)->shost_data)->system_hostname)
560#define fc_host_tgtid_bind_type(x) \
561 (((struct fc_host_attrs *)(x)->shost_data)->tgtid_bind_type)
562#define fc_host_rports(x) \
563 (((struct fc_host_attrs *)(x)->shost_data)->rports)
564#define fc_host_rport_bindings(x) \
565 (((struct fc_host_attrs *)(x)->shost_data)->rport_bindings)
566#define fc_host_vports(x) \
567 (((struct fc_host_attrs *)(x)->shost_data)->vports)
568#define fc_host_next_rport_number(x) \
569 (((struct fc_host_attrs *)(x)->shost_data)->next_rport_number)
570#define fc_host_next_target_id(x) \
571 (((struct fc_host_attrs *)(x)->shost_data)->next_target_id)
572#define fc_host_next_vport_number(x) \
573 (((struct fc_host_attrs *)(x)->shost_data)->next_vport_number)
574#define fc_host_npiv_vports_inuse(x) \
575 (((struct fc_host_attrs *)(x)->shost_data)->npiv_vports_inuse)
576#define fc_host_work_q_name(x) \
577 (((struct fc_host_attrs *)(x)->shost_data)->work_q_name)
578#define fc_host_work_q(x) \
579 (((struct fc_host_attrs *)(x)->shost_data)->work_q)
580#define fc_host_devloss_work_q_name(x) \
581 (((struct fc_host_attrs *)(x)->shost_data)->devloss_work_q_name)
582#define fc_host_devloss_work_q(x) \
583 (((struct fc_host_attrs *)(x)->shost_data)->devloss_work_q)
584#define fc_host_dev_loss_tmo(x) \
585 (((struct fc_host_attrs *)(x)->shost_data)->dev_loss_tmo)
586
587
588struct fc_bsg_buffer {
589 unsigned int payload_len;
590 int sg_cnt;
591 struct scatterlist *sg_list;
592};
593
594
595#define FC_RQST_STATE_INPROGRESS 0
596#define FC_RQST_STATE_DONE 1
597
598struct fc_bsg_job {
599 struct Scsi_Host *shost;
600 struct fc_rport *rport;
601 struct device *dev;
602 struct request *req;
603 spinlock_t job_lock;
604 unsigned int state_flags;
605 unsigned int ref_cnt;
606 void (*job_done)(struct fc_bsg_job *);
607
608 struct fc_bsg_request *request;
609 struct fc_bsg_reply *reply;
610 unsigned int request_len;
611 unsigned int reply_len;
612
613
614
615
616
617
618
619
620
621
622 struct fc_bsg_buffer request_payload;
623 struct fc_bsg_buffer reply_payload;
624
625 void *dd_data;
626};
627
628
629
630struct fc_function_template {
631 void (*get_rport_dev_loss_tmo)(struct fc_rport *);
632 void (*set_rport_dev_loss_tmo)(struct fc_rport *, u32);
633
634 void (*get_starget_node_name)(struct scsi_target *);
635 void (*get_starget_port_name)(struct scsi_target *);
636 void (*get_starget_port_id)(struct scsi_target *);
637
638 void (*get_host_port_id)(struct Scsi_Host *);
639 void (*get_host_port_type)(struct Scsi_Host *);
640 void (*get_host_port_state)(struct Scsi_Host *);
641 void (*get_host_active_fc4s)(struct Scsi_Host *);
642 void (*get_host_speed)(struct Scsi_Host *);
643 void (*get_host_fabric_name)(struct Scsi_Host *);
644 void (*get_host_symbolic_name)(struct Scsi_Host *);
645 void (*set_host_system_hostname)(struct Scsi_Host *);
646
647 struct fc_host_statistics * (*get_fc_host_stats)(struct Scsi_Host *);
648 void (*reset_fc_host_stats)(struct Scsi_Host *);
649
650 int (*issue_fc_host_lip)(struct Scsi_Host *);
651
652 void (*dev_loss_tmo_callbk)(struct fc_rport *);
653 void (*terminate_rport_io)(struct fc_rport *);
654
655 void (*set_vport_symbolic_name)(struct fc_vport *);
656 int (*vport_create)(struct fc_vport *, bool);
657 int (*vport_disable)(struct fc_vport *, bool);
658 int (*vport_delete)(struct fc_vport *);
659
660
661 int (* tsk_mgmt_response)(struct Scsi_Host *, u64, u64, int);
662 int (* it_nexus_response)(struct Scsi_Host *, u64, int);
663
664
665 int (*bsg_request)(struct fc_bsg_job *);
666 int (*bsg_timeout)(struct fc_bsg_job *);
667
668
669 u32 dd_fcrport_size;
670 u32 dd_fcvport_size;
671 u32 dd_bsg_size;
672
673
674
675
676
677
678
679
680
681 unsigned long show_rport_maxframe_size:1;
682 unsigned long show_rport_supported_classes:1;
683 unsigned long show_rport_dev_loss_tmo:1;
684
685
686
687
688
689
690 unsigned long show_starget_node_name:1;
691 unsigned long show_starget_port_name:1;
692 unsigned long show_starget_port_id:1;
693
694
695 unsigned long show_host_node_name:1;
696 unsigned long show_host_port_name:1;
697 unsigned long show_host_permanent_port_name:1;
698 unsigned long show_host_supported_classes:1;
699 unsigned long show_host_supported_fc4s:1;
700 unsigned long show_host_supported_speeds:1;
701 unsigned long show_host_maxframe_size:1;
702 unsigned long show_host_serial_number:1;
703
704 unsigned long show_host_port_id:1;
705 unsigned long show_host_port_type:1;
706 unsigned long show_host_port_state:1;
707 unsigned long show_host_active_fc4s:1;
708 unsigned long show_host_speed:1;
709 unsigned long show_host_fabric_name:1;
710 unsigned long show_host_symbolic_name:1;
711 unsigned long show_host_system_hostname:1;
712
713 unsigned long disable_target_scan:1;
714};
715
716
717
718
719
720
721
722
723
724
725static inline int
726fc_remote_port_chkready(struct fc_rport *rport)
727{
728 int result;
729
730 switch (rport->port_state) {
731 case FC_PORTSTATE_ONLINE:
732 if (rport->roles & FC_PORT_ROLE_FCP_TARGET)
733 result = 0;
734 else if (rport->flags & FC_RPORT_DEVLOSS_PENDING)
735 result = DID_IMM_RETRY << 16;
736 else
737 result = DID_NO_CONNECT << 16;
738 break;
739 case FC_PORTSTATE_BLOCKED:
740 if (rport->flags & FC_RPORT_FAST_FAIL_TIMEDOUT)
741 result = DID_TRANSPORT_FAILFAST << 16;
742 else
743 result = DID_IMM_RETRY << 16;
744 break;
745 default:
746 result = DID_NO_CONNECT << 16;
747 break;
748 }
749 return result;
750}
751
752static inline u64 wwn_to_u64(u8 *wwn)
753{
754 return (u64)wwn[0] << 56 | (u64)wwn[1] << 48 |
755 (u64)wwn[2] << 40 | (u64)wwn[3] << 32 |
756 (u64)wwn[4] << 24 | (u64)wwn[5] << 16 |
757 (u64)wwn[6] << 8 | (u64)wwn[7];
758}
759
760static inline void u64_to_wwn(u64 inm, u8 *wwn)
761{
762 wwn[0] = (inm >> 56) & 0xff;
763 wwn[1] = (inm >> 48) & 0xff;
764 wwn[2] = (inm >> 40) & 0xff;
765 wwn[3] = (inm >> 32) & 0xff;
766 wwn[4] = (inm >> 24) & 0xff;
767 wwn[5] = (inm >> 16) & 0xff;
768 wwn[6] = (inm >> 8) & 0xff;
769 wwn[7] = inm & 0xff;
770}
771
772
773
774
775
776
777
778
779
780
781
782
783static inline void
784fc_vport_set_state(struct fc_vport *vport, enum fc_vport_state new_state)
785{
786 if ((new_state != FC_VPORT_UNKNOWN) &&
787 (new_state != FC_VPORT_INITIALIZING))
788 vport->vport_last_state = vport->vport_state;
789 vport->vport_state = new_state;
790}
791
792struct scsi_transport_template *fc_attach_transport(
793 struct fc_function_template *);
794void fc_release_transport(struct scsi_transport_template *);
795void fc_remove_host(struct Scsi_Host *);
796struct fc_rport *fc_remote_port_add(struct Scsi_Host *shost,
797 int channel, struct fc_rport_identifiers *ids);
798void fc_remote_port_delete(struct fc_rport *rport);
799void fc_remote_port_rolechg(struct fc_rport *rport, u32 roles);
800int scsi_is_fc_rport(const struct device *);
801u32 fc_get_event_number(void);
802void fc_host_post_event(struct Scsi_Host *shost, u32 event_number,
803 enum fc_host_event_code event_code, u32 event_data);
804void fc_host_post_vendor_event(struct Scsi_Host *shost, u32 event_number,
805 u32 data_len, char * data_buf, u64 vendor_id);
806
807
808
809
810struct fc_vport *fc_vport_create(struct Scsi_Host *shost, int channel,
811 struct fc_vport_identifiers *);
812int fc_vport_terminate(struct fc_vport *vport);
813int fc_block_scsi_eh(struct scsi_cmnd *cmnd);
814
815#endif
816