Linux Kernel
3.7.1
Main Page
Related Pages
Modules
Namespaces
Data Structures
Files
File List
Globals
All
Data Structures
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
Pages
include
scsi
libfc.h
Go to the documentation of this file.
1
/*
2
* Copyright(c) 2007 Intel Corporation. All rights reserved.
3
*
4
* This program is free software; you can redistribute it and/or modify it
5
* under the terms and conditions of the GNU General Public License,
6
* version 2, as published by the Free Software Foundation.
7
*
8
* This program is distributed in the hope it will be useful, but WITHOUT
9
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
10
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
11
* more details.
12
*
13
* You should have received a copy of the GNU General Public License along with
14
* this program; if not, write to the Free Software Foundation, Inc.,
15
* 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
16
*
17
* Maintained at www.Open-FCoE.org
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)
/* size of tables */
40
41
/*
42
* libfc error codes
43
*/
44
#define FC_NO_ERR 0
/* no error */
45
#define FC_EX_TIMEOUT 1
/* Exchange timeout */
46
#define FC_EX_CLOSED 2
/* Exchange closed */
47
63
enum
fc_lport_state
{
64
LPORT_ST_DISABLED
= 0,
65
LPORT_ST_FLOGI
,
66
LPORT_ST_DNS
,
67
LPORT_ST_RNN_ID
,
68
LPORT_ST_RSNN_NN
,
69
LPORT_ST_RSPN_ID
,
70
LPORT_ST_RFT_ID
,
71
LPORT_ST_RFF_ID
,
72
LPORT_ST_FDMI
,
73
LPORT_ST_RHBA
,
74
LPORT_ST_RPA
,
75
LPORT_ST_DHBA
,
76
LPORT_ST_DPRT
,
77
LPORT_ST_SCR
,
78
LPORT_ST_READY
,
79
LPORT_ST_LOGO
,
80
LPORT_ST_RESET
81
};
82
83
enum
fc_disc_event
{
84
DISC_EV_NONE
= 0,
85
DISC_EV_SUCCESS
,
86
DISC_EV_FAILED
87
};
88
101
enum
fc_rport_state
{
102
RPORT_ST_INIT
,
103
RPORT_ST_FLOGI
,
104
RPORT_ST_PLOGI_WAIT
,
105
RPORT_ST_PLOGI
,
106
RPORT_ST_PRLI
,
107
RPORT_ST_RTV
,
108
RPORT_ST_READY
,
109
RPORT_ST_ADISC
,
110
RPORT_ST_DELETE
,
111
};
112
120
struct
fc_disc_port
{
121
struct
fc_lport
*
lp
;
122
struct
list_head
peers
;
123
struct
work_struct
rport_work
;
124
u32
port_id
;
125
};
126
135
enum
fc_rport_event
{
136
RPORT_EV_NONE
= 0,
137
RPORT_EV_READY
,
138
RPORT_EV_FAILED
,
139
RPORT_EV_STOP
,
140
RPORT_EV_LOGO
141
};
142
143
struct
fc_rport_priv
;
144
149
struct
fc_rport_operations
{
150
void
(*
event_callback
)(
struct
fc_lport
*,
struct
fc_rport_priv
*,
151
enum
fc_rport_event
);
152
};
153
162
struct
fc_rport_libfc_priv
{
163
struct
fc_lport
*
local_port
;
164
enum
fc_rport_state
rp_state
;
165
u16
flags
;
166
#define FC_RP_FLAGS_REC_SUPPORTED (1 << 0)
167
#define FC_RP_FLAGS_RETRY (1 << 1)
168
#define FC_RP_STARTED (1 << 2)
169
#define FC_RP_FLAGS_CONF_REQ (1 << 3)
170
unsigned
int
e_d_tov
;
171
unsigned
int
r_a_tov
;
172
};
173
196
struct
fc_rport_priv
{
197
struct
fc_lport
*
local_port
;
198
struct
fc_rport
*
rport
;
199
struct
kref
kref
;
200
enum
fc_rport_state
rp_state
;
201
struct
fc_rport_identifiers
ids
;
202
u16
flags
;
203
u16
max_seq
;
204
u16
disc_id
;
205
u16
maxframe_size
;
206
unsigned
int
retries
;
207
unsigned
int
major_retries
;
208
unsigned
int
e_d_tov
;
209
unsigned
int
r_a_tov
;
210
struct
mutex
rp_mutex
;
211
struct
delayed_work
retry_work
;
212
enum
fc_rport_event
event
;
213
struct
fc_rport_operations
*
ops
;
214
struct
list_head
peers
;
215
struct
work_struct
event_work
;
216
u32
supported_classes
;
217
u16
prli_count
;
218
struct
rcu_head
rcu
;
219
u16
sp_features
;
220
u8
spp_type
;
221
void
(*
lld_event_callback
)(
struct
fc_lport
*,
222
struct
fc_rport_priv
*,
223
enum
fc_rport_event
);
224
};
225
250
struct
fc_stats
{
251
u64
SecondsSinceLastReset
;
252
u64
TxFrames
;
253
u64
TxWords
;
254
u64
RxFrames
;
255
u64
RxWords
;
256
u64
ErrorFrames
;
257
u64
DumpedFrames
;
258
u64
FcpPktAllocFails
;
259
u64
FcpPktAborts
;
260
u64
FcpFrameAllocFails
;
261
u64
LinkFailureCount
;
262
u64
LossOfSignalCount
;
263
u64
InvalidTxWordCount
;
264
u64
InvalidCRCCount
;
265
u64
InputRequests
;
266
u64
OutputRequests
;
267
u64
ControlRequests
;
268
u64
InputBytes
;
269
u64
OutputBytes
;
270
u64
VLinkFailureCount
;
271
u64
MissDiscAdvCount
;
272
};
273
281
struct
fc_seq_els_data
{
282
enum
fc_els_rjt_reason
reason
;
283
enum
fc_els_rjt_explan
explan
;
284
};
285
317
struct
fc_fcp_pkt
{
318
spinlock_t
scsi_pkt_lock
;
319
atomic_t
ref_cnt
;
320
321
/* SCSI command and data transfer information */
322
u32
data_len
;
323
324
/* SCSI I/O related information */
325
struct
scsi_cmnd
*
cmd
;
326
struct
list_head
list
;
327
328
/* Housekeeping information */
329
struct
fc_lport
*
lp
;
330
u8
state
;
331
332
/* SCSI/FCP return status */
333
u8
cdb_status
;
334
u8
status_code
;
335
u8
scsi_comp_flags
;
336
u32
io_status
;
337
u32
req_flags
;
338
u32
scsi_resid
;
339
340
/* Transport related veriables */
341
size_t
xfer_len
;
342
struct
fcp_cmnd
cdb_cmd
;
343
u32
xfer_contig_end
;
344
u16
max_payload
;
345
u16
xfer_ddp
;
346
347
/* Associated structures */
348
struct
fc_rport
*
rport
;
349
struct
fc_seq
*
seq_ptr
;
350
351
/* Timeout/error related information */
352
struct
timer_list
timer
;
353
int
wait_for_comp
;
354
u32
recov_retry
;
355
struct
fc_seq
*
recov_seq
;
356
struct
completion
tm_done
;
357
}
____cacheline_aligned_in_smp
;
358
359
/*
360
* Structure and function definitions for managing Fibre Channel Exchanges
361
* and Sequences
362
*
363
* fc_exch holds state for one exchange and links to its active sequence.
364
*
365
* fc_seq holds the state for an individual sequence.
366
*/
367
368
struct
fc_exch_mgr
;
369
struct
fc_exch_mgr_anchor
;
370
extern
u16
fc_cpu_mask
;
/* cpu mask for possible cpus */
371
379
struct
fc_seq
{
380
u8
id
;
381
u16
ssb_stat
;
382
u16
cnt
;
383
u32
rec_data
;
384
};
385
386
#define FC_EX_DONE (1 << 0)
/* ep is completed */
387
#define FC_EX_RST_CLEANUP (1 << 1)
/* reset is forcing completion */
388
422
struct
fc_exch
{
423
spinlock_t
ex_lock
;
424
atomic_t
ex_refcnt
;
425
enum
fc_class
class
;
426
struct
fc_exch_mgr
*
em
;
427
struct
fc_exch_pool
*
pool
;
428
struct
list_head
ex_list
;
429
struct
fc_lport
*
lp
;
430
u32
esb_stat
;
431
u8
state
;
432
u8
fh_type
;
433
u8
seq_id
;
434
u8
encaps
;
435
u16
xid
;
436
u16
oxid
;
437
u16
rxid
;
438
u32
oid
;
439
u32
sid
;
440
u32
did
;
441
u32
r_a_tov
;
442
u32
f_ctl
;
443
struct
fc_seq
seq
;
444
void
(*
resp
)(
struct
fc_seq
*,
struct
fc_frame
*,
void
*);
445
void
*
arg
;
446
void
(*
destructor
)(
struct
fc_seq
*,
void
*);
447
struct
delayed_work
timeout_work
;
448
}
____cacheline_aligned_in_smp
;
449
#define fc_seq_exch(sp) container_of(sp, struct fc_exch, seq)
450
451
452
struct
libfc_function_template
{
453
/*
454
* Interface to send a FC frame
455
*
456
* STATUS: REQUIRED
457
*/
458
int
(*
frame_send
)(
struct
fc_lport
*,
struct
fc_frame
*);
459
460
/*
461
* Interface to send ELS/CT frames
462
*
463
* STATUS: OPTIONAL
464
*/
465
struct
fc_seq
*(*elsct_send)(
struct
fc_lport
*,
u32
did,
466
struct
fc_frame
*,
unsigned
int
op
,
467
void
(*
resp
)(
struct
fc_seq
*,
468
struct
fc_frame
*,
void
*
arg
),
469
void
*
arg
,
u32
timer_msec);
470
471
/*
472
* Send the FC frame payload using a new exchange and sequence.
473
*
474
* The exchange response handler is set in this routine to resp()
475
* function pointer. It can be called in two scenarios: if a timeout
476
* occurs or if a response frame is received for the exchange. The
477
* fc_frame pointer in response handler will also indicate timeout
478
* as error using IS_ERR related macros.
479
*
480
* The exchange destructor handler is also set in this routine.
481
* The destructor handler is invoked by EM layer when exchange
482
* is about to free, this can be used by caller to free its
483
* resources along with exchange free.
484
*
485
* The arg is passed back to resp and destructor handler.
486
*
487
* The timeout value (in msec) for an exchange is set if non zero
488
* timer_msec argument is specified. The timer is canceled when
489
* it fires or when the exchange is done. The exchange timeout handler
490
* is registered by EM layer.
491
*
492
* STATUS: OPTIONAL
493
*/
494
struct
fc_seq
*(*exch_seq_send)(
struct
fc_lport
*,
struct
fc_frame
*,
495
void
(*
resp
)(
struct
fc_seq
*,
496
struct
fc_frame
*,
497
void
*),
498
void
(*destructor)(
struct
fc_seq
*,
499
void
*),
500
void
*,
unsigned
int
timer_msec);
501
502
/*
503
* Sets up the DDP context for a given exchange id on the given
504
* scatterlist if LLD supports DDP for large receive.
505
*
506
* STATUS: OPTIONAL
507
*/
508
int
(*
ddp_setup
)(
struct
fc_lport
*,
u16
,
struct
scatterlist
*,
509
unsigned
int
);
510
/*
511
* Completes the DDP transfer and returns the length of data DDPed
512
* for the given exchange id.
513
*
514
* STATUS: OPTIONAL
515
*/
516
int
(*
ddp_done
)(
struct
fc_lport
*,
u16
);
517
/*
518
* Sets up the DDP context for a given exchange id on the given
519
* scatterlist if LLD supports DDP for target.
520
*
521
* STATUS: OPTIONAL
522
*/
523
int
(*
ddp_target
)(
struct
fc_lport
*,
u16
,
struct
scatterlist
*,
524
unsigned
int
);
525
/*
526
* Allow LLD to fill its own Link Error Status Block
527
*
528
* STATUS: OPTIONAL
529
*/
530
void
(*
get_lesb
)(
struct
fc_lport
*,
struct
fc_els_lesb
*lesb);
531
/*
532
* Send a frame using an existing sequence and exchange.
533
*
534
* STATUS: OPTIONAL
535
*/
536
int
(*
seq_send
)(
struct
fc_lport
*,
struct
fc_seq
*,
537
struct
fc_frame
*);
538
539
/*
540
* Send an ELS response using information from the received frame.
541
*
542
* STATUS: OPTIONAL
543
*/
544
void
(*
seq_els_rsp_send
)(
struct
fc_frame
*,
enum
fc_els_cmd
,
545
struct
fc_seq_els_data
*);
546
547
/*
548
* Abort an exchange and sequence. Generally called because of a
549
* exchange timeout or an abort from the upper layer.
550
*
551
* A timer_msec can be specified for abort timeout, if non-zero
552
* timer_msec value is specified then exchange resp handler
553
* will be called with timeout error if no response to abort.
554
*
555
* STATUS: OPTIONAL
556
*/
557
int
(*
seq_exch_abort
)(
const
struct
fc_seq
*,
558
unsigned
int
timer_msec);
559
560
/*
561
* Indicate that an exchange/sequence tuple is complete and the memory
562
* allocated for the related objects may be freed.
563
*
564
* STATUS: OPTIONAL
565
*/
566
void
(*
exch_done
)(
struct
fc_seq
*);
567
568
/*
569
* Start a new sequence on the same exchange/sequence tuple.
570
*
571
* STATUS: OPTIONAL
572
*/
573
struct
fc_seq
*(*seq_start_next)(
struct
fc_seq
*);
574
575
/*
576
* Set a response handler for the exchange of the sequence.
577
*
578
* STATUS: OPTIONAL
579
*/
580
void
(*
seq_set_resp
)(
struct
fc_seq
*
sp
,
581
void
(*
resp
)(
struct
fc_seq
*,
struct
fc_frame
*,
582
void
*),
583
void
*
arg
);
584
585
/*
586
* Assign a sequence for an incoming request frame.
587
*
588
* STATUS: OPTIONAL
589
*/
590
struct
fc_seq
*(*seq_assign)(
struct
fc_lport
*,
struct
fc_frame
*);
591
592
/*
593
* Release the reference on the sequence returned by seq_assign().
594
*
595
* STATUS: OPTIONAL
596
*/
597
void
(*
seq_release
)(
struct
fc_seq
*);
598
599
/*
600
* Reset an exchange manager, completing all sequences and exchanges.
601
* If s_id is non-zero, reset only exchanges originating from that FID.
602
* If d_id is non-zero, reset only exchanges sending to that FID.
603
*
604
* STATUS: OPTIONAL
605
*/
606
void
(*
exch_mgr_reset
)(
struct
fc_lport
*,
u32
s_id
,
u32
d_id
);
607
608
/*
609
* Flush the rport work queue. Generally used before shutdown.
610
*
611
* STATUS: OPTIONAL
612
*/
613
void
(*
rport_flush_queue
)(
void
);
614
615
/*
616
* Receive a frame for a local port.
617
*
618
* STATUS: OPTIONAL
619
*/
620
void
(*
lport_recv
)(
struct
fc_lport
*,
struct
fc_frame
*);
621
622
/*
623
* Reset the local port.
624
*
625
* STATUS: OPTIONAL
626
*/
627
int
(*
lport_reset
)(
struct
fc_lport
*);
628
629
/*
630
* Set the local port FC_ID.
631
*
632
* This may be provided by the LLD to allow it to be
633
* notified when the local port is assigned a FC-ID.
634
*
635
* The frame, if non-NULL, is the incoming frame with the
636
* FLOGI LS_ACC or FLOGI, and may contain the granted MAC
637
* address for the LLD. The frame pointer may be NULL if
638
* no MAC is associated with this assignment (LOGO or PLOGI).
639
*
640
* If FC_ID is non-zero, r_a_tov and e_d_tov must be valid.
641
*
642
* Note: this is called with the local port mutex held.
643
*
644
* STATUS: OPTIONAL
645
*/
646
void
(*
lport_set_port_id
)(
struct
fc_lport
*,
u32
port_id
,
647
struct
fc_frame
*);
648
649
/*
650
* Create a remote port with a given port ID
651
*
652
* STATUS: OPTIONAL
653
*/
654
struct
fc_rport_priv
*(*rport_create)(
struct
fc_lport
*,
u32
);
655
656
/*
657
* Initiates the RP state machine. It is called from the LP module.
658
* This function will issue the following commands to the N_Port
659
* identified by the FC ID provided.
660
*
661
* - PLOGI
662
* - PRLI
663
* - RTV
664
*
665
* STATUS: OPTIONAL
666
*/
667
int
(*
rport_login
)(
struct
fc_rport_priv
*);
668
669
/*
670
* Logoff, and remove the rport from the transport if
671
* it had been added. This will send a LOGO to the target.
672
*
673
* STATUS: OPTIONAL
674
*/
675
int
(*
rport_logoff
)(
struct
fc_rport_priv
*);
676
677
/*
678
* Receive a request from a remote port.
679
*
680
* STATUS: OPTIONAL
681
*/
682
void
(*
rport_recv_req
)(
struct
fc_lport
*,
struct
fc_frame
*);
683
684
/*
685
* lookup an rport by it's port ID.
686
*
687
* STATUS: OPTIONAL
688
*/
689
struct
fc_rport_priv
*(*rport_lookup)(
const
struct
fc_lport
*,
u32
);
690
691
/*
692
* Destroy an rport after final kref_put().
693
* The argument is a pointer to the kref inside the fc_rport_priv.
694
*/
695
void
(*
rport_destroy
)(
struct
kref
*);
696
697
/*
698
* Callback routine after the remote port is logged in
699
*
700
* STATUS: OPTIONAL
701
*/
702
void
(*
rport_event_callback
)(
struct
fc_lport
*,
703
struct
fc_rport_priv
*,
704
enum
fc_rport_event
);
705
706
/*
707
* Send a fcp cmd from fsp pkt.
708
* Called with the SCSI host lock unlocked and irqs disabled.
709
*
710
* The resp handler is called when FCP_RSP received.
711
*
712
* STATUS: OPTIONAL
713
*/
714
int
(*
fcp_cmd_send
)(
struct
fc_lport
*,
struct
fc_fcp_pkt
*,
715
void
(*
resp
)(
struct
fc_seq
*,
struct
fc_frame
*,
716
void
*));
717
718
/*
719
* Cleanup the FCP layer, used during link down and reset
720
*
721
* STATUS: OPTIONAL
722
*/
723
void
(*
fcp_cleanup
)(
struct
fc_lport
*);
724
725
/*
726
* Abort all I/O on a local port
727
*
728
* STATUS: OPTIONAL
729
*/
730
void
(*
fcp_abort_io
)(
struct
fc_lport
*);
731
732
/*
733
* Receive a request for the discovery layer.
734
*
735
* STATUS: OPTIONAL
736
*/
737
void
(*
disc_recv_req
)(
struct
fc_lport
*,
struct
fc_frame
*);
738
739
/*
740
* Start discovery for a local port.
741
*
742
* STATUS: OPTIONAL
743
*/
744
void
(*
disc_start
)(
void
(*disc_callback)(
struct
fc_lport
*,
745
enum
fc_disc_event
),
746
struct
fc_lport
*);
747
748
/*
749
* Stop discovery for a given lport. This will remove
750
* all discovered rports
751
*
752
* STATUS: OPTIONAL
753
*/
754
void
(*
disc_stop
) (
struct
fc_lport
*);
755
756
/*
757
* Stop discovery for a given lport. This will block
758
* until all discovered rports are deleted from the
759
* FC transport class
760
*
761
* STATUS: OPTIONAL
762
*/
763
void
(*
disc_stop_final
) (
struct
fc_lport
*);
764
};
765
782
struct
fc_disc
{
783
unsigned
char
retry_count
;
784
unsigned
char
pending
;
785
unsigned
char
requested
;
786
unsigned
short
seq_count
;
787
unsigned
char
buf_len
;
788
u16
disc_id
;
789
790
struct
list_head
rports
;
791
void
*
priv
;
792
struct
mutex
disc_mutex
;
793
struct
fc_gpn_ft_resp
partial_buf
;
794
struct
delayed_work
disc_work
;
795
796
void
(*
disc_callback
)(
struct
fc_lport
*,
797
enum
fc_disc_event
);
798
};
799
800
/*
801
* Local port notifier and events.
802
*/
803
extern
struct
blocking_notifier_head
fc_lport_notifier_head
;
804
enum
fc_lport_event
{
805
FC_LPORT_EV_ADD
,
806
FC_LPORT_EV_DEL
,
807
};
808
854
struct
fc_lport
{
855
/* Associations */
856
struct
Scsi_Host
*
host
;
857
struct
list_head
ema_list
;
858
struct
fc_rport_priv
*
dns_rdata
;
859
struct
fc_rport_priv
*
ms_rdata
;
860
struct
fc_rport_priv
*
ptp_rdata
;
861
void
*
scsi_priv
;
862
struct
fc_disc
disc
;
863
864
/* Virtual port information */
865
struct
list_head
vports
;
866
struct
fc_vport
*
vport
;
867
868
/* Operational Information */
869
struct
libfc_function_template
tt
;
870
u8
link_up
;
871
u8
qfull
;
872
enum
fc_lport_state
state
;
873
unsigned
long
boot_time
;
874
struct
fc_host_statistics
host_stats
;
875
struct
fc_stats
__percpu
*
stats
;
876
u8
retry_count
;
877
878
/* Fabric information */
879
u32
port_id
;
880
u64
wwpn
;
881
u64
wwnn
;
882
unsigned
int
service_params
;
883
unsigned
int
e_d_tov
;
884
unsigned
int
r_a_tov
;
885
struct
fc_els_rnid_gen
rnid_gen
;
886
887
/* Capabilities */
888
u32
sg_supp
:1;
889
u32
seq_offload
:1;
890
u32
crc_offload
:1;
891
u32
lro_enabled
:1;
892
u32
does_npiv
:1;
893
u32
npiv_enabled
:1;
894
u32
point_to_multipoint
:1;
895
u32
fdmi_enabled
:1;
896
u32
mfs
;
897
u8
max_retry_count
;
898
u8
max_rport_retry_count
;
899
u16
rport_priv_size
;
900
u16
link_speed
;
901
u16
link_supported_speeds
;
902
u16
lro_xid
;
903
unsigned
int
lso_max
;
904
struct
fc_ns_fts
fcts
;
905
906
/* Miscellaneous */
907
struct
mutex
lp_mutex
;
908
struct
list_head
list
;
909
struct
delayed_work
retry_work
;
910
void
*
prov
[
FC_FC4_PROV_SIZE
];
911
struct
list_head
lport_list
;
912
};
913
921
struct
fc4_prov
{
922
int
(*
prli
)(
struct
fc_rport_priv
*,
u32
spp_len,
923
const
struct
fc_els_spp
*spp_in,
924
struct
fc_els_spp
*spp_out);
925
void
(*
prlo
)(
struct
fc_rport_priv
*);
926
void
(*
recv
)(
struct
fc_lport
*,
struct
fc_frame
*);
927
struct
module
*
module
;
928
};
929
930
/*
931
* Register FC-4 provider with libfc.
932
*/
933
int
fc_fc4_register_provider
(
enum
fc_fh_type
type
,
struct
fc4_prov
*);
934
void
fc_fc4_deregister_provider
(
enum
fc_fh_type
type
,
struct
fc4_prov
*);
935
936
/*
937
* FC_LPORT HELPER FUNCTIONS
938
*****************************/
939
944
static
inline
int
fc_lport_test_ready(
struct
fc_lport
*
lport
)
945
{
946
return
lport->
state
==
LPORT_ST_READY
;
947
}
948
954
static
inline
void
fc_set_wwnn(
struct
fc_lport
*
lport
,
u64
wwnn
)
955
{
956
lport->
wwnn
=
wwnn
;
957
}
958
964
static
inline
void
fc_set_wwpn(
struct
fc_lport
*
lport
,
u64
wwnn
)
965
{
966
lport->
wwpn
=
wwnn
;
967
}
968
974
static
inline
void
fc_lport_state_enter(
struct
fc_lport
*
lport
,
975
enum
fc_lport_state
state
)
976
{
977
if
(state != lport->
state
)
978
lport->
retry_count
= 0;
979
lport->
state
=
state
;
980
}
981
986
static
inline
int
fc_lport_init_stats(
struct
fc_lport
*lport)
987
{
988
lport->
stats
=
alloc_percpu
(
struct
fc_stats
);
989
if
(!lport->
stats
)
990
return
-
ENOMEM
;
991
return
0;
992
}
993
998
static
inline
void
fc_lport_free_stats(
struct
fc_lport
*lport)
999
{
1000
free_percpu
(lport->
stats
);
1001
}
1002
1007
static
inline
void
*lport_priv(
const
struct
fc_lport
*lport)
1008
{
1009
return
(
void
*)(lport + 1);
1010
}
1011
1020
static
inline
struct
fc_lport
*
1021
libfc_host_alloc(
struct
scsi_host_template
*sht,
int
priv_size)
1022
{
1023
struct
fc_lport
*
lport
;
1024
struct
Scsi_Host
*
shost
;
1025
1026
shost =
scsi_host_alloc
(sht,
sizeof
(*lport) + priv_size);
1027
if
(!shost)
1028
return
NULL
;
1029
lport = shost_priv(shost);
1030
lport->
host
=
shost
;
1031
INIT_LIST_HEAD(&lport->
ema_list
);
1032
INIT_LIST_HEAD(&lport->
vports
);
1033
return
lport
;
1034
}
1035
1036
/*
1037
* FC_FCP HELPER FUNCTIONS
1038
*****************************/
1039
static
inline
bool
fc_fcp_is_read(
const
struct
fc_fcp_pkt
*fsp)
1040
{
1041
if
(fsp && fsp->
cmd
)
1042
return
fsp->
cmd
->sc_data_direction ==
DMA_FROM_DEVICE
;
1043
return
false
;
1044
}
1045
1046
/*
1047
* LOCAL PORT LAYER
1048
*****************************/
1049
int
fc_lport_init
(
struct
fc_lport
*);
1050
int
fc_lport_destroy
(
struct
fc_lport
*);
1051
int
fc_fabric_logoff
(
struct
fc_lport
*);
1052
int
fc_fabric_login
(
struct
fc_lport
*);
1053
void
__fc_linkup
(
struct
fc_lport
*);
1054
void
fc_linkup
(
struct
fc_lport
*);
1055
void
__fc_linkdown
(
struct
fc_lport
*);
1056
void
fc_linkdown
(
struct
fc_lport
*);
1057
void
fc_vport_setlink
(
struct
fc_lport
*);
1058
void
fc_vports_linkchange
(
struct
fc_lport
*);
1059
int
fc_lport_config
(
struct
fc_lport
*);
1060
int
fc_lport_reset
(
struct
fc_lport
*);
1061
int
fc_set_mfs
(
struct
fc_lport
*,
u32
mfs);
1062
struct
fc_lport
*
libfc_vport_create
(
struct
fc_vport
*,
int
privsize);
1063
struct
fc_lport
*
fc_vport_id_lookup
(
struct
fc_lport
*,
u32
port_id
);
1064
int
fc_lport_bsg_request
(
struct
fc_bsg_job
*);
1065
void
fc_lport_set_local_id
(
struct
fc_lport
*,
u32
port_id
);
1066
void
fc_lport_iterate
(
void
(*
func
)(
struct
fc_lport
*,
void
*),
void
*);
1067
1068
/*
1069
* REMOTE PORT LAYER
1070
*****************************/
1071
int
fc_rport_init
(
struct
fc_lport
*);
1072
void
fc_rport_terminate_io
(
struct
fc_rport
*);
1073
1074
/*
1075
* DISCOVERY LAYER
1076
*****************************/
1077
int
fc_disc_init
(
struct
fc_lport
*);
1078
1079
static
inline
struct
fc_lport
*fc_disc_lport(
struct
fc_disc
*
disc
)
1080
{
1081
return
container_of
(disc,
struct
fc_lport
, disc);
1082
}
1083
1084
/*
1085
* FCP LAYER
1086
*****************************/
1087
int
fc_fcp_init
(
struct
fc_lport
*);
1088
void
fc_fcp_destroy
(
struct
fc_lport
*);
1089
1090
/*
1091
* SCSI INTERACTION LAYER
1092
*****************************/
1093
int
fc_queuecommand
(
struct
Scsi_Host
*,
struct
scsi_cmnd
*);
1094
int
fc_eh_abort
(
struct
scsi_cmnd
*);
1095
int
fc_eh_device_reset
(
struct
scsi_cmnd
*);
1096
int
fc_eh_host_reset
(
struct
scsi_cmnd
*);
1097
int
fc_slave_alloc
(
struct
scsi_device
*);
1098
int
fc_change_queue_depth
(
struct
scsi_device
*,
int
qdepth,
int
reason
);
1099
int
fc_change_queue_type
(
struct
scsi_device
*,
int
tag_type
);
1100
1101
/*
1102
* ELS/CT interface
1103
*****************************/
1104
int
fc_elsct_init
(
struct
fc_lport
*);
1105
struct
fc_seq
*
fc_elsct_send
(
struct
fc_lport
*,
u32
did,
1106
struct
fc_frame
*,
1107
unsigned
int
op
,
1108
void
(*
resp
)(
struct
fc_seq
*,
1109
struct
fc_frame
*,
1110
void
*
arg
),
1111
void
*arg,
u32
timer_msec);
1112
void
fc_lport_flogi_resp
(
struct
fc_seq
*,
struct
fc_frame
*,
void
*);
1113
void
fc_lport_logo_resp
(
struct
fc_seq
*,
struct
fc_frame
*,
void
*);
1114
void
fc_fill_reply_hdr
(
struct
fc_frame
*,
const
struct
fc_frame
*,
1115
enum
fc_rctl
,
u32
parm_offset);
1116
void
fc_fill_hdr
(
struct
fc_frame
*,
const
struct
fc_frame
*,
1117
enum
fc_rctl
,
u32
f_ctl,
u16
seq_cnt,
u32
parm_offset);
1118
1119
1120
/*
1121
* EXCHANGE MANAGER LAYER
1122
*****************************/
1123
int
fc_exch_init
(
struct
fc_lport
*);
1124
void
fc_exch_update_stats
(
struct
fc_lport
*lport);
1125
struct
fc_exch_mgr_anchor
*
fc_exch_mgr_add
(
struct
fc_lport
*,
1126
struct
fc_exch_mgr
*,
1127
bool
(*
match
)(
struct
fc_frame
*));
1128
void
fc_exch_mgr_del
(
struct
fc_exch_mgr_anchor
*);
1129
int
fc_exch_mgr_list_clone
(
struct
fc_lport
*
src
,
struct
fc_lport
*
dst
);
1130
struct
fc_exch_mgr
*
fc_exch_mgr_alloc
(
struct
fc_lport
*,
enum
fc_class
class
,
1131
u16
min_xid
,
u16
max_xid
,
1132
bool
(*
match
)(
struct
fc_frame
*));
1133
void
fc_exch_mgr_free
(
struct
fc_lport
*);
1134
void
fc_exch_recv
(
struct
fc_lport
*,
struct
fc_frame
*);
1135
void
fc_exch_mgr_reset
(
struct
fc_lport
*,
u32
s_id
,
u32
d_id
);
1136
1137
/*
1138
* Functions for fc_functions_template
1139
*/
1140
void
fc_get_host_speed
(
struct
Scsi_Host
*);
1141
void
fc_get_host_port_state
(
struct
Scsi_Host
*);
1142
void
fc_set_rport_loss_tmo
(
struct
fc_rport
*,
u32
timeout);
1143
struct
fc_host_statistics
*
fc_get_host_stats
(
struct
Scsi_Host
*);
1144
1145
#endif
/* _LIBFC_H_ */
Generated on Thu Jan 10 2013 14:53:25 for Linux Kernel by
1.8.2