This source file includes following definitions.
- fc_lport_test_ready
- fc_set_wwnn
- fc_set_wwpn
- fc_lport_state_enter
- fc_lport_init_stats
- fc_lport_free_stats
- lport_priv
- libfc_host_alloc
- fc_fcp_is_read
- fc_disc_lport
1
2
3
4
5
6
7
8 #ifndef _LIBFC_H_
9 #define _LIBFC_H_
10
11 #include <linux/timer.h>
12 #include <linux/if.h>
13 #include <linux/percpu.h>
14 #include <linux/refcount.h>
15
16 #include <scsi/scsi_transport.h>
17 #include <scsi/scsi_transport_fc.h>
18 #include <scsi/scsi_bsg_fc.h>
19
20 #include <scsi/fc/fc_fcp.h>
21 #include <scsi/fc/fc_ns.h>
22 #include <scsi/fc/fc_ms.h>
23 #include <scsi/fc/fc_els.h>
24 #include <scsi/fc/fc_gs.h>
25
26 #include <scsi/fc_frame.h>
27
28 #define FC_FC4_PROV_SIZE (FC_TYPE_FCP + 1)
29
30
31
32
33 #define FC_NO_ERR 0
34 #define FC_EX_TIMEOUT 1
35 #define FC_EX_CLOSED 2
36 #define FC_EX_ALLOC_ERR 3
37 #define FC_EX_XMIT_ERR 4
38 #define FC_EX_ELS_RJT 5
39 #define FC_EX_INV_LOGIN 6
40 #define FC_EX_SEQ_ERR 6
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57 enum fc_lport_state {
58 LPORT_ST_DISABLED = 0,
59 LPORT_ST_FLOGI,
60 LPORT_ST_DNS,
61 LPORT_ST_RNN_ID,
62 LPORT_ST_RSNN_NN,
63 LPORT_ST_RSPN_ID,
64 LPORT_ST_RFT_ID,
65 LPORT_ST_RFF_ID,
66 LPORT_ST_FDMI,
67 LPORT_ST_RHBA,
68 LPORT_ST_RPA,
69 LPORT_ST_DHBA,
70 LPORT_ST_DPRT,
71 LPORT_ST_SCR,
72 LPORT_ST_READY,
73 LPORT_ST_LOGO,
74 LPORT_ST_RESET
75 };
76
77 enum fc_disc_event {
78 DISC_EV_NONE = 0,
79 DISC_EV_SUCCESS,
80 DISC_EV_FAILED
81 };
82
83
84
85
86
87
88
89
90
91
92
93
94
95 enum fc_rport_state {
96 RPORT_ST_INIT,
97 RPORT_ST_FLOGI,
98 RPORT_ST_PLOGI_WAIT,
99 RPORT_ST_PLOGI,
100 RPORT_ST_PRLI,
101 RPORT_ST_RTV,
102 RPORT_ST_READY,
103 RPORT_ST_ADISC,
104 RPORT_ST_DELETE,
105 };
106
107
108
109
110
111
112
113
114 struct fc_disc_port {
115 struct fc_lport *lp;
116 struct list_head peers;
117 struct work_struct rport_work;
118 u32 port_id;
119 };
120
121
122
123
124
125
126
127
128
129 enum fc_rport_event {
130 RPORT_EV_NONE = 0,
131 RPORT_EV_READY,
132 RPORT_EV_FAILED,
133 RPORT_EV_STOP,
134 RPORT_EV_LOGO
135 };
136
137 struct fc_rport_priv;
138
139
140
141
142
143 struct fc_rport_operations {
144 void (*event_callback)(struct fc_lport *, struct fc_rport_priv *,
145 enum fc_rport_event);
146 };
147
148
149
150
151
152
153
154
155
156 struct fc_rport_libfc_priv {
157 struct fc_lport *local_port;
158 enum fc_rport_state rp_state;
159 u16 flags;
160 #define FC_RP_FLAGS_REC_SUPPORTED (1 << 0)
161 #define FC_RP_FLAGS_RETRY (1 << 1)
162 #define FC_RP_STARTED (1 << 2)
163 #define FC_RP_FLAGS_CONF_REQ (1 << 3)
164 unsigned int e_d_tov;
165 unsigned int r_a_tov;
166 };
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190 struct fc_rport_priv {
191 struct fc_lport *local_port;
192 struct fc_rport *rport;
193 struct kref kref;
194 enum fc_rport_state rp_state;
195 struct fc_rport_identifiers ids;
196 u16 flags;
197 u16 max_seq;
198 u16 disc_id;
199 u16 maxframe_size;
200 unsigned int retries;
201 unsigned int major_retries;
202 unsigned int e_d_tov;
203 unsigned int r_a_tov;
204 struct mutex rp_mutex;
205 struct delayed_work retry_work;
206 enum fc_rport_event event;
207 struct fc_rport_operations *ops;
208 struct list_head peers;
209 struct work_struct event_work;
210 u32 supported_classes;
211 u16 prli_count;
212 struct rcu_head rcu;
213 u16 sp_features;
214 u8 spp_type;
215 void (*lld_event_callback)(struct fc_lport *,
216 struct fc_rport_priv *,
217 enum fc_rport_event);
218 };
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244 struct fc_stats {
245 u64 SecondsSinceLastReset;
246 u64 TxFrames;
247 u64 TxWords;
248 u64 RxFrames;
249 u64 RxWords;
250 u64 ErrorFrames;
251 u64 DumpedFrames;
252 u64 FcpPktAllocFails;
253 u64 FcpPktAborts;
254 u64 FcpFrameAllocFails;
255 u64 LinkFailureCount;
256 u64 LossOfSignalCount;
257 u64 InvalidTxWordCount;
258 u64 InvalidCRCCount;
259 u64 InputRequests;
260 u64 OutputRequests;
261 u64 ControlRequests;
262 u64 InputBytes;
263 u64 OutputBytes;
264 u64 VLinkFailureCount;
265 u64 MissDiscAdvCount;
266 };
267
268
269
270
271
272
273
274
275 struct fc_seq_els_data {
276 enum fc_els_rjt_reason reason;
277 enum fc_els_rjt_explan explan;
278 };
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311 struct fc_fcp_pkt {
312 spinlock_t scsi_pkt_lock;
313 refcount_t ref_cnt;
314
315
316 u32 data_len;
317
318
319 struct scsi_cmnd *cmd;
320 struct list_head list;
321
322
323 struct fc_lport *lp;
324 u8 state;
325
326
327 u8 cdb_status;
328 u8 status_code;
329 u8 scsi_comp_flags;
330 u32 io_status;
331 u32 req_flags;
332 u32 scsi_resid;
333
334
335 size_t xfer_len;
336 struct fcp_cmnd cdb_cmd;
337 u32 xfer_contig_end;
338 u16 max_payload;
339 u16 xfer_ddp;
340
341
342 struct fc_rport *rport;
343 struct fc_seq *seq_ptr;
344
345
346 struct timer_list timer;
347 int wait_for_comp;
348 int timer_delay;
349 u32 recov_retry;
350 struct fc_seq *recov_seq;
351 struct completion tm_done;
352 } ____cacheline_aligned_in_smp;
353
354
355
356
357
358
359
360
361
362
363 struct fc_exch_mgr;
364 struct fc_exch_mgr_anchor;
365 extern u16 fc_cpu_mask;
366
367
368
369
370
371
372
373
374 struct fc_seq {
375 u8 id;
376 u16 ssb_stat;
377 u16 cnt;
378 u32 rec_data;
379 };
380
381 #define FC_EX_DONE (1 << 0)
382 #define FC_EX_RST_CLEANUP (1 << 1)
383 #define FC_EX_QUARANTINE (1 << 2)
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424 struct fc_exch {
425 spinlock_t ex_lock;
426 atomic_t ex_refcnt;
427 enum fc_class class;
428 struct fc_exch_mgr *em;
429 struct fc_exch_pool *pool;
430 struct list_head ex_list;
431 struct fc_lport *lp;
432 u32 esb_stat;
433 u8 state;
434 u8 fh_type;
435 u8 seq_id;
436 u8 encaps;
437 u16 xid;
438 u16 oxid;
439 u16 rxid;
440 u32 oid;
441 u32 sid;
442 u32 did;
443 u32 r_a_tov;
444 u32 f_ctl;
445 struct fc_seq seq;
446 int resp_active;
447 struct task_struct *resp_task;
448 wait_queue_head_t resp_wq;
449 void (*resp)(struct fc_seq *, struct fc_frame *, void *);
450 void *arg;
451 void (*destructor)(struct fc_seq *, void *);
452 struct delayed_work timeout_work;
453 } ____cacheline_aligned_in_smp;
454 #define fc_seq_exch(sp) container_of(sp, struct fc_exch, seq)
455
456
457 struct libfc_function_template {
458
459
460
461
462
463 int (*frame_send)(struct fc_lport *, struct fc_frame *);
464
465
466
467
468
469
470 struct fc_seq *(*elsct_send)(struct fc_lport *, u32 did,
471 struct fc_frame *, unsigned int op,
472 void (*resp)(struct fc_seq *,
473 struct fc_frame *, void *arg),
474 void *arg, u32 timer_msec);
475
476
477
478
479
480
481
482 int (*ddp_setup)(struct fc_lport *, u16, struct scatterlist *,
483 unsigned int);
484
485
486
487
488
489
490 int (*ddp_done)(struct fc_lport *, u16);
491
492
493
494
495
496
497 int (*ddp_target)(struct fc_lport *, u16, struct scatterlist *,
498 unsigned int);
499
500
501
502
503
504 void (*get_lesb)(struct fc_lport *, struct fc_els_lesb *lesb);
505
506
507
508
509
510
511
512
513 void (*exch_mgr_reset)(struct fc_lport *, u32 s_id, u32 d_id);
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532 void (*lport_set_port_id)(struct fc_lport *, u32 port_id,
533 struct fc_frame *);
534
535
536
537
538
539
540 void (*rport_event_callback)(struct fc_lport *,
541 struct fc_rport_priv *,
542 enum fc_rport_event);
543
544
545
546
547
548
549
550
551
552 int (*fcp_cmd_send)(struct fc_lport *, struct fc_fcp_pkt *,
553 void (*resp)(struct fc_seq *, struct fc_frame *,
554 void *));
555
556
557
558
559
560
561 void (*fcp_cleanup)(struct fc_lport *);
562
563
564
565
566
567
568 void (*fcp_abort_io)(struct fc_lport *);
569
570
571
572
573
574
575 void (*disc_recv_req)(struct fc_lport *, struct fc_frame *);
576
577
578
579
580
581
582 void (*disc_start)(void (*disc_callback)(struct fc_lport *,
583 enum fc_disc_event),
584 struct fc_lport *);
585
586
587
588
589
590
591
592 void (*disc_stop) (struct fc_lport *);
593
594
595
596
597
598
599
600
601 void (*disc_stop_final) (struct fc_lport *);
602 };
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620 struct fc_disc {
621 unsigned char retry_count;
622 unsigned char pending;
623 unsigned char requested;
624 unsigned short seq_count;
625 unsigned char buf_len;
626 u16 disc_id;
627
628 struct list_head rports;
629 void *priv;
630 struct mutex disc_mutex;
631 struct fc_gpn_ft_resp partial_buf;
632 struct delayed_work disc_work;
633
634 void (*disc_callback)(struct fc_lport *,
635 enum fc_disc_event);
636 };
637
638
639
640
641 extern struct blocking_notifier_head fc_lport_notifier_head;
642 enum fc_lport_event {
643 FC_LPORT_EV_ADD,
644 FC_LPORT_EV_DEL,
645 };
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692 struct fc_lport {
693
694 struct Scsi_Host *host;
695 struct list_head ema_list;
696 struct fc_rport_priv *dns_rdata;
697 struct fc_rport_priv *ms_rdata;
698 struct fc_rport_priv *ptp_rdata;
699 void *scsi_priv;
700 struct fc_disc disc;
701
702
703 struct list_head vports;
704 struct fc_vport *vport;
705
706
707 struct libfc_function_template tt;
708 u8 link_up;
709 u8 qfull;
710 u16 vlan;
711 enum fc_lport_state state;
712 unsigned long boot_time;
713 struct fc_host_statistics host_stats;
714 struct fc_stats __percpu *stats;
715 u8 retry_count;
716
717
718 u32 port_id;
719 u64 wwpn;
720 u64 wwnn;
721 unsigned int service_params;
722 unsigned int e_d_tov;
723 unsigned int r_a_tov;
724 struct fc_els_rnid_gen rnid_gen;
725
726
727 u32 sg_supp:1;
728 u32 seq_offload:1;
729 u32 crc_offload:1;
730 u32 lro_enabled:1;
731 u32 does_npiv:1;
732 u32 npiv_enabled:1;
733 u32 point_to_multipoint:1;
734 u32 fdmi_enabled:1;
735 u32 mfs;
736 u8 max_retry_count;
737 u8 max_rport_retry_count;
738 u16 rport_priv_size;
739 u16 link_speed;
740 u16 link_supported_speeds;
741 u16 lro_xid;
742 unsigned int lso_max;
743 struct fc_ns_fts fcts;
744
745
746 struct mutex lp_mutex;
747 struct list_head list;
748 struct delayed_work retry_work;
749 void *prov[FC_FC4_PROV_SIZE];
750 struct list_head lport_list;
751 };
752
753
754
755
756
757
758
759
760 struct fc4_prov {
761 int (*prli)(struct fc_rport_priv *, u32 spp_len,
762 const struct fc_els_spp *spp_in,
763 struct fc_els_spp *spp_out);
764 void (*prlo)(struct fc_rport_priv *);
765 void (*recv)(struct fc_lport *, struct fc_frame *);
766 struct module *module;
767 };
768
769
770
771
772 int fc_fc4_register_provider(enum fc_fh_type type, struct fc4_prov *);
773 void fc_fc4_deregister_provider(enum fc_fh_type type, struct fc4_prov *);
774
775
776
777
778
779
780
781
782
783 static inline int fc_lport_test_ready(struct fc_lport *lport)
784 {
785 return lport->state == LPORT_ST_READY;
786 }
787
788
789
790
791
792
793 static inline void fc_set_wwnn(struct fc_lport *lport, u64 wwnn)
794 {
795 lport->wwnn = wwnn;
796 }
797
798
799
800
801
802
803 static inline void fc_set_wwpn(struct fc_lport *lport, u64 wwpn)
804 {
805 lport->wwpn = wwpn;
806 }
807
808
809
810
811
812
813 static inline void fc_lport_state_enter(struct fc_lport *lport,
814 enum fc_lport_state state)
815 {
816 if (state != lport->state)
817 lport->retry_count = 0;
818 lport->state = state;
819 }
820
821
822
823
824
825 static inline int fc_lport_init_stats(struct fc_lport *lport)
826 {
827 lport->stats = alloc_percpu(struct fc_stats);
828 if (!lport->stats)
829 return -ENOMEM;
830 return 0;
831 }
832
833
834
835
836
837 static inline void fc_lport_free_stats(struct fc_lport *lport)
838 {
839 free_percpu(lport->stats);
840 }
841
842
843
844
845
846 static inline void *lport_priv(const struct fc_lport *lport)
847 {
848 return (void *)(lport + 1);
849 }
850
851
852
853
854
855
856
857
858
859 static inline struct fc_lport *
860 libfc_host_alloc(struct scsi_host_template *sht, int priv_size)
861 {
862 struct fc_lport *lport;
863 struct Scsi_Host *shost;
864
865 shost = scsi_host_alloc(sht, sizeof(*lport) + priv_size);
866 if (!shost)
867 return NULL;
868 lport = shost_priv(shost);
869 lport->host = shost;
870 INIT_LIST_HEAD(&lport->ema_list);
871 INIT_LIST_HEAD(&lport->vports);
872 return lport;
873 }
874
875
876
877
878 static inline bool fc_fcp_is_read(const struct fc_fcp_pkt *fsp)
879 {
880 if (fsp && fsp->cmd)
881 return fsp->cmd->sc_data_direction == DMA_FROM_DEVICE;
882 return false;
883 }
884
885
886
887
888 int fc_lport_init(struct fc_lport *);
889 int fc_lport_destroy(struct fc_lport *);
890 int fc_fabric_logoff(struct fc_lport *);
891 int fc_fabric_login(struct fc_lport *);
892 void __fc_linkup(struct fc_lport *);
893 void fc_linkup(struct fc_lport *);
894 void __fc_linkdown(struct fc_lport *);
895 void fc_linkdown(struct fc_lport *);
896 void fc_vport_setlink(struct fc_lport *);
897 void fc_vports_linkchange(struct fc_lport *);
898 int fc_lport_config(struct fc_lport *);
899 int fc_lport_reset(struct fc_lport *);
900 void fc_lport_recv(struct fc_lport *lport, struct fc_frame *fp);
901 int fc_set_mfs(struct fc_lport *, u32 mfs);
902 struct fc_lport *libfc_vport_create(struct fc_vport *, int privsize);
903 struct fc_lport *fc_vport_id_lookup(struct fc_lport *, u32 port_id);
904 int fc_lport_bsg_request(struct bsg_job *);
905 void fc_lport_set_local_id(struct fc_lport *, u32 port_id);
906 void fc_lport_iterate(void (*func)(struct fc_lport *, void *), void *);
907
908
909
910
911 void fc_rport_terminate_io(struct fc_rport *);
912 struct fc_rport_priv *fc_rport_lookup(const struct fc_lport *lport,
913 u32 port_id);
914 struct fc_rport_priv *fc_rport_create(struct fc_lport *, u32);
915 void fc_rport_destroy(struct kref *kref);
916 int fc_rport_login(struct fc_rport_priv *rdata);
917 int fc_rport_logoff(struct fc_rport_priv *rdata);
918 void fc_rport_recv_req(struct fc_lport *lport, struct fc_frame *fp);
919 void fc_rport_flush_queue(void);
920
921
922
923
924 void fc_disc_init(struct fc_lport *);
925 void fc_disc_config(struct fc_lport *, void *);
926
927 static inline struct fc_lport *fc_disc_lport(struct fc_disc *disc)
928 {
929 return container_of(disc, struct fc_lport, disc);
930 }
931
932
933
934
935 int fc_fcp_init(struct fc_lport *);
936 void fc_fcp_destroy(struct fc_lport *);
937
938
939
940
941 int fc_queuecommand(struct Scsi_Host *, struct scsi_cmnd *);
942 int fc_eh_abort(struct scsi_cmnd *);
943 int fc_eh_device_reset(struct scsi_cmnd *);
944 int fc_eh_host_reset(struct scsi_cmnd *);
945 int fc_slave_alloc(struct scsi_device *);
946
947
948
949
950 int fc_elsct_init(struct fc_lport *);
951 struct fc_seq *fc_elsct_send(struct fc_lport *, u32 did,
952 struct fc_frame *,
953 unsigned int op,
954 void (*resp)(struct fc_seq *,
955 struct fc_frame *,
956 void *arg),
957 void *arg, u32 timer_msec);
958 void fc_lport_flogi_resp(struct fc_seq *, struct fc_frame *, void *);
959 void fc_lport_logo_resp(struct fc_seq *, struct fc_frame *, void *);
960 void fc_fill_reply_hdr(struct fc_frame *, const struct fc_frame *,
961 enum fc_rctl, u32 parm_offset);
962 void fc_fill_hdr(struct fc_frame *, const struct fc_frame *,
963 enum fc_rctl, u32 f_ctl, u16 seq_cnt, u32 parm_offset);
964
965
966
967
968
969 int fc_exch_init(struct fc_lport *);
970 void fc_exch_update_stats(struct fc_lport *lport);
971 struct fc_seq *fc_exch_seq_send(struct fc_lport *lport,
972 struct fc_frame *fp,
973 void (*resp)(struct fc_seq *,
974 struct fc_frame *fp,
975 void *arg),
976 void (*destructor)(struct fc_seq *, void *),
977 void *arg, u32 timer_msec);
978 void fc_seq_els_rsp_send(struct fc_frame *, enum fc_els_cmd,
979 struct fc_seq_els_data *);
980 struct fc_seq *fc_seq_start_next(struct fc_seq *sp);
981 void fc_seq_set_resp(struct fc_seq *sp,
982 void (*resp)(struct fc_seq *, struct fc_frame *, void *),
983 void *arg);
984 struct fc_seq *fc_seq_assign(struct fc_lport *lport, struct fc_frame *fp);
985 void fc_seq_release(struct fc_seq *sp);
986 struct fc_exch_mgr_anchor *fc_exch_mgr_add(struct fc_lport *,
987 struct fc_exch_mgr *,
988 bool (*match)(struct fc_frame *));
989 void fc_exch_mgr_del(struct fc_exch_mgr_anchor *);
990 int fc_exch_mgr_list_clone(struct fc_lport *src, struct fc_lport *dst);
991 struct fc_exch_mgr *fc_exch_mgr_alloc(struct fc_lport *, enum fc_class class,
992 u16 min_xid, u16 max_xid,
993 bool (*match)(struct fc_frame *));
994 void fc_exch_mgr_free(struct fc_lport *);
995 void fc_exch_recv(struct fc_lport *, struct fc_frame *);
996 void fc_exch_mgr_reset(struct fc_lport *, u32 s_id, u32 d_id);
997 int fc_seq_send(struct fc_lport *lport, struct fc_seq *sp, struct fc_frame *fp);
998 int fc_seq_exch_abort(const struct fc_seq *, unsigned int timer_msec);
999 void fc_exch_done(struct fc_seq *sp);
1000
1001
1002
1003
1004 void fc_get_host_speed(struct Scsi_Host *);
1005 void fc_get_host_port_state(struct Scsi_Host *);
1006 void fc_set_rport_loss_tmo(struct fc_rport *, u32 timeout);
1007 struct fc_host_statistics *fc_get_host_stats(struct Scsi_Host *);
1008
1009 #endif