2 * Copyright (c) 2005-2009 Brocade Communications Systems, Inc.
6 * Linux driver for Brocade Fibre Channel Host Bus Adapter.
8 * This program is free software; you can redistribute it and/or modify it
9 * under the terms of the GNU General Public License (GPL) Version 2 as
10 * published by the Free Software Foundation
12 * This program is distributed in the hope that it will be useful, but
13 * WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * General Public License for more details.
18 #ifndef __BFA_FCXP_PRIV_H__
19 #define __BFA_FCXP_PRIV_H__
21 #include <cs/bfa_sm.h>
22 #include <protocol/fc.h>
24 #include <bfi/bfi_fcxp.h>
26 #define BFA_FCXP_MIN (1)
27 #define BFA_FCXP_MAX_IBUF_SZ (2 * 1024 + 256)
28 #define BFA_FCXP_MAX_LBUF_SZ (4 * 1024 + 256)
30 struct bfa_fcxp_mod_s
{
31 struct bfa_s
*bfa
; /* backpointer to BFA */
32 struct bfa_fcxp_s
*fcxp_list
; /* array of FCXPs */
33 u16 num_fcxps
; /* max num FCXP requests */
34 struct list_head fcxp_free_q
; /* free FCXPs */
35 struct list_head fcxp_active_q
; /* active FCXPs */
36 void *req_pld_list_kva
; /* list of FCXP req pld */
37 u64 req_pld_list_pa
; /* list of FCXP req pld */
38 void *rsp_pld_list_kva
; /* list of FCXP resp pld */
39 u64 rsp_pld_list_pa
; /* list of FCXP resp pld */
40 struct list_head wait_q
; /* wait queue for free fcxp */
45 #define BFA_FCXP_MOD(__bfa) (&(__bfa)->modules.fcxp_mod)
46 #define BFA_FCXP_FROM_TAG(__mod, __tag) (&(__mod)->fcxp_list[__tag])
48 typedef void (*fcxp_send_cb_t
) (struct bfa_s
*ioc
, struct bfa_fcxp_s
*fcxp
,
49 void *cb_arg
, bfa_status_t req_status
,
50 u32 rsp_len
, u32 resid_len
,
51 struct fchs_s
*rsp_fchs
);
54 * Information needed for a FCXP request
56 struct bfa_fcxp_req_info_s
{
57 struct bfa_rport_s
*bfa_rport
; /* Pointer to the bfa rport that was
58 *returned from bfa_rport_create().
59 *This could be left NULL for WKA or for
60 *FCXP interactions before the rport
63 struct fchs_s fchs
; /* request FC header structure */
64 u8 cts
; /* continous sequence */
65 u8
class; /* FC class for the request/response */
66 u16 max_frmsz
; /* max send frame size */
67 u16 vf_id
; /* vsan tag if applicable */
68 u8 lp_tag
; /* lport tag */
69 u32 req_tot_len
; /* request payload total length */
72 struct bfa_fcxp_rsp_info_s
{
73 struct fchs_s rsp_fchs
; /* Response frame's FC header will
74 * be *sent back in this field */
75 u8 rsp_timeout
; /* timeout in seconds, 0-no response
78 u32 rsp_maxlen
; /* max response length expected */
82 struct list_head qe
; /* fcxp queue element */
83 bfa_sm_t sm
; /* state machine */
84 void *caller
; /* driver or fcs */
85 struct bfa_fcxp_mod_s
*fcxp_mod
;
86 /* back pointer to fcxp mod */
87 u16 fcxp_tag
; /* internal tag */
88 struct bfa_fcxp_req_info_s req_info
;
90 struct bfa_fcxp_rsp_info_s rsp_info
;
92 u8 use_ireqbuf
; /* use internal req buf */
93 u8 use_irspbuf
; /* use internal rsp buf */
94 u32 nreq_sgles
; /* num request SGLEs */
95 u32 nrsp_sgles
; /* num response SGLEs */
96 struct list_head req_sgpg_q
; /* SG pages for request buf */
97 struct list_head req_sgpg_wqe
; /* wait queue for req SG page */
98 struct list_head rsp_sgpg_q
; /* SG pages for response buf */
99 struct list_head rsp_sgpg_wqe
; /* wait queue for rsp SG page */
101 bfa_fcxp_get_sgaddr_t req_sga_cbfn
;
102 /* SG elem addr user function */
103 bfa_fcxp_get_sglen_t req_sglen_cbfn
;
104 /* SG elem len user function */
105 bfa_fcxp_get_sgaddr_t rsp_sga_cbfn
;
106 /* SG elem addr user function */
107 bfa_fcxp_get_sglen_t rsp_sglen_cbfn
;
108 /* SG elem len user function */
109 bfa_cb_fcxp_send_t send_cbfn
; /* send completion callback */
110 void *send_cbarg
; /* callback arg */
111 struct bfa_sge_s req_sge
[BFA_FCXP_MAX_SGES
];
113 struct bfa_sge_s rsp_sge
[BFA_FCXP_MAX_SGES
];
115 u8 rsp_status
; /* comp: rsp status */
116 u32 rsp_len
; /* comp: actual response len */
117 u32 residue_len
; /* comp: residual rsp length */
118 struct fchs_s rsp_fchs
; /* comp: response fchs */
119 struct bfa_cb_qe_s hcb_qe
; /* comp: callback qelem */
120 struct bfa_reqq_wait_s reqq_wqe
;
121 bfa_boolean_t reqq_waiting
;
124 #define BFA_FCXP_REQ_PLD(_fcxp) (bfa_fcxp_get_reqbuf(_fcxp))
126 #define BFA_FCXP_RSP_FCHS(_fcxp) (&((_fcxp)->rsp_info.fchs))
127 #define BFA_FCXP_RSP_PLD(_fcxp) (bfa_fcxp_get_rspbuf(_fcxp))
129 #define BFA_FCXP_REQ_PLD_PA(_fcxp) \
130 ((_fcxp)->fcxp_mod->req_pld_list_pa + \
131 ((_fcxp)->fcxp_mod->req_pld_sz * (_fcxp)->fcxp_tag))
133 #define BFA_FCXP_RSP_PLD_PA(_fcxp) \
134 ((_fcxp)->fcxp_mod->rsp_pld_list_pa + \
135 ((_fcxp)->fcxp_mod->rsp_pld_sz * (_fcxp)->fcxp_tag))
137 void bfa_fcxp_isr(struct bfa_s
*bfa
, struct bfi_msg_s
*msg
);
138 #endif /* __BFA_FCXP_PRIV_H__ */