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