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