Commit | Line | Data |
---|---|---|
a36c61f9 KG |
1 | /* |
2 | * Copyright (c) 2005-2010 Brocade Communications Systems, Inc. | |
3 | * All rights reserved | |
4 | * www.brocade.com | |
5 | * | |
6 | * Linux driver for Brocade Fibre Channel Host Bus Adapter. | |
7 | * | |
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 | |
11 | * | |
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. | |
16 | */ | |
17 | ||
18 | #ifndef __BFA_SVC_H__ | |
19 | #define __BFA_SVC_H__ | |
20 | ||
21 | #include "bfa_cs.h" | |
22 | #include "bfi_ms.h" | |
23 | ||
24 | ||
acdc79a6 | 25 | /* |
a36c61f9 KG |
26 | * Scatter-gather DMA related defines |
27 | */ | |
28 | #define BFA_SGPG_MIN (16) | |
4507025d | 29 | #define BFA_SGPG_MAX (8192) |
a36c61f9 | 30 | |
acdc79a6 | 31 | /* |
a36c61f9 KG |
32 | * Alignment macro for SG page allocation |
33 | */ | |
34 | #define BFA_SGPG_ROUNDUP(_l) (((_l) + (sizeof(struct bfi_sgpg_s) - 1)) \ | |
35 | & ~(sizeof(struct bfi_sgpg_s) - 1)) | |
36 | ||
37 | struct bfa_sgpg_wqe_s { | |
38 | struct list_head qe; /* queue sg page element */ | |
39 | int nsgpg; /* pages to be allocated */ | |
40 | int nsgpg_total; /* total pages required */ | |
41 | void (*cbfn) (void *cbarg); /* callback function */ | |
42 | void *cbarg; /* callback arg */ | |
43 | struct list_head sgpg_q; /* queue of alloced sgpgs */ | |
44 | }; | |
45 | ||
46 | struct bfa_sgpg_s { | |
47 | struct list_head qe; /* queue sg page element */ | |
48 | struct bfi_sgpg_s *sgpg; /* va of SG page */ | |
49 | union bfi_addr_u sgpg_pa; /* pa of SG page */ | |
50 | }; | |
51 | ||
acdc79a6 | 52 | /* |
a36c61f9 KG |
53 | * Given number of SG elements, BFA_SGPG_NPAGE() returns the number of |
54 | * SG pages required. | |
55 | */ | |
56 | #define BFA_SGPG_NPAGE(_nsges) (((_nsges) / BFI_SGPG_DATA_SGES) + 1) | |
57 | ||
4507025d KG |
58 | /* Max SGPG dma segs required */ |
59 | #define BFA_SGPG_DMA_SEGS \ | |
60 | BFI_MEM_DMA_NSEGS(BFA_SGPG_MAX, (uint32_t)sizeof(struct bfi_sgpg_s)) | |
61 | ||
a36c61f9 KG |
62 | struct bfa_sgpg_mod_s { |
63 | struct bfa_s *bfa; | |
64 | int num_sgpgs; /* number of SG pages */ | |
65 | int free_sgpgs; /* number of free SG pages */ | |
a36c61f9 KG |
66 | struct list_head sgpg_q; /* queue of free SG pages */ |
67 | struct list_head sgpg_wait_q; /* wait queue for SG pages */ | |
4507025d KG |
68 | struct bfa_mem_dma_s dma_seg[BFA_SGPG_DMA_SEGS]; |
69 | struct bfa_mem_kva_s kva_seg; | |
a36c61f9 KG |
70 | }; |
71 | #define BFA_SGPG_MOD(__bfa) (&(__bfa)->modules.sgpg_mod) | |
4507025d | 72 | #define BFA_MEM_SGPG_KVA(__bfa) (&(BFA_SGPG_MOD(__bfa)->kva_seg)) |
a36c61f9 KG |
73 | |
74 | bfa_status_t bfa_sgpg_malloc(struct bfa_s *bfa, struct list_head *sgpg_q, | |
75 | int nsgpgs); | |
76 | void bfa_sgpg_mfree(struct bfa_s *bfa, struct list_head *sgpg_q, int nsgpgs); | |
77 | void bfa_sgpg_winit(struct bfa_sgpg_wqe_s *wqe, | |
78 | void (*cbfn) (void *cbarg), void *cbarg); | |
79 | void bfa_sgpg_wait(struct bfa_s *bfa, struct bfa_sgpg_wqe_s *wqe, int nsgpgs); | |
80 | void bfa_sgpg_wcancel(struct bfa_s *bfa, struct bfa_sgpg_wqe_s *wqe); | |
81 | ||
82 | ||
acdc79a6 | 83 | /* |
a36c61f9 KG |
84 | * FCXP related defines |
85 | */ | |
86 | #define BFA_FCXP_MIN (1) | |
4507025d | 87 | #define BFA_FCXP_MAX (256) |
a36c61f9 KG |
88 | #define BFA_FCXP_MAX_IBUF_SZ (2 * 1024 + 256) |
89 | #define BFA_FCXP_MAX_LBUF_SZ (4 * 1024 + 256) | |
90 | ||
4507025d KG |
91 | /* Max FCXP dma segs required */ |
92 | #define BFA_FCXP_DMA_SEGS \ | |
93 | BFI_MEM_DMA_NSEGS(BFA_FCXP_MAX, \ | |
94 | (u32)BFA_FCXP_MAX_IBUF_SZ + BFA_FCXP_MAX_LBUF_SZ) | |
95 | ||
a36c61f9 KG |
96 | struct bfa_fcxp_mod_s { |
97 | struct bfa_s *bfa; /* backpointer to BFA */ | |
98 | struct bfa_fcxp_s *fcxp_list; /* array of FCXPs */ | |
99 | u16 num_fcxps; /* max num FCXP requests */ | |
100 | struct list_head fcxp_free_q; /* free FCXPs */ | |
101 | struct list_head fcxp_active_q; /* active FCXPs */ | |
a36c61f9 | 102 | struct list_head wait_q; /* wait queue for free fcxp */ |
3fd45980 | 103 | struct list_head fcxp_unused_q; /* unused fcxps */ |
a36c61f9 KG |
104 | u32 req_pld_sz; |
105 | u32 rsp_pld_sz; | |
4507025d KG |
106 | struct bfa_mem_dma_s dma_seg[BFA_FCXP_DMA_SEGS]; |
107 | struct bfa_mem_kva_s kva_seg; | |
a36c61f9 KG |
108 | }; |
109 | ||
110 | #define BFA_FCXP_MOD(__bfa) (&(__bfa)->modules.fcxp_mod) | |
111 | #define BFA_FCXP_FROM_TAG(__mod, __tag) (&(__mod)->fcxp_list[__tag]) | |
4507025d | 112 | #define BFA_MEM_FCXP_KVA(__bfa) (&(BFA_FCXP_MOD(__bfa)->kva_seg)) |
a36c61f9 KG |
113 | |
114 | typedef void (*fcxp_send_cb_t) (struct bfa_s *ioc, struct bfa_fcxp_s *fcxp, | |
115 | void *cb_arg, bfa_status_t req_status, | |
116 | u32 rsp_len, u32 resid_len, | |
117 | struct fchs_s *rsp_fchs); | |
118 | ||
119 | typedef u64 (*bfa_fcxp_get_sgaddr_t) (void *bfad_fcxp, int sgeid); | |
120 | typedef u32 (*bfa_fcxp_get_sglen_t) (void *bfad_fcxp, int sgeid); | |
121 | typedef void (*bfa_cb_fcxp_send_t) (void *bfad_fcxp, struct bfa_fcxp_s *fcxp, | |
122 | void *cbarg, enum bfa_status req_status, | |
123 | u32 rsp_len, u32 resid_len, | |
124 | struct fchs_s *rsp_fchs); | |
125 | typedef void (*bfa_fcxp_alloc_cbfn_t) (void *cbarg, struct bfa_fcxp_s *fcxp); | |
126 | ||
127 | ||
128 | ||
acdc79a6 | 129 | /* |
a36c61f9 KG |
130 | * Information needed for a FCXP request |
131 | */ | |
132 | struct bfa_fcxp_req_info_s { | |
133 | struct bfa_rport_s *bfa_rport; | |
acdc79a6 | 134 | /* Pointer to the bfa rport that was |
a36c61f9 KG |
135 | * returned from bfa_rport_create(). |
136 | * This could be left NULL for WKA or | |
137 | * for FCXP interactions before the | |
138 | * rport nexus is established | |
139 | */ | |
140 | struct fchs_s fchs; /* request FC header structure */ | |
25985edc | 141 | u8 cts; /* continuous sequence */ |
a36c61f9 KG |
142 | u8 class; /* FC class for the request/response */ |
143 | u16 max_frmsz; /* max send frame size */ | |
144 | u16 vf_id; /* vsan tag if applicable */ | |
145 | u8 lp_tag; /* lport tag */ | |
146 | u32 req_tot_len; /* request payload total length */ | |
147 | }; | |
148 | ||
149 | struct bfa_fcxp_rsp_info_s { | |
150 | struct fchs_s rsp_fchs; | |
acdc79a6 | 151 | /* Response frame's FC header will |
a36c61f9 KG |
152 | * be sent back in this field */ |
153 | u8 rsp_timeout; | |
acdc79a6 | 154 | /* timeout in seconds, 0-no response */ |
a36c61f9 KG |
155 | u8 rsvd2[3]; |
156 | u32 rsp_maxlen; /* max response length expected */ | |
157 | }; | |
158 | ||
159 | struct bfa_fcxp_s { | |
160 | struct list_head qe; /* fcxp queue element */ | |
161 | bfa_sm_t sm; /* state machine */ | |
162 | void *caller; /* driver or fcs */ | |
163 | struct bfa_fcxp_mod_s *fcxp_mod; | |
164 | /* back pointer to fcxp mod */ | |
165 | u16 fcxp_tag; /* internal tag */ | |
166 | struct bfa_fcxp_req_info_s req_info; | |
167 | /* request info */ | |
168 | struct bfa_fcxp_rsp_info_s rsp_info; | |
169 | /* response info */ | |
170 | u8 use_ireqbuf; /* use internal req buf */ | |
171 | u8 use_irspbuf; /* use internal rsp buf */ | |
172 | u32 nreq_sgles; /* num request SGLEs */ | |
173 | u32 nrsp_sgles; /* num response SGLEs */ | |
174 | struct list_head req_sgpg_q; /* SG pages for request buf */ | |
175 | struct list_head req_sgpg_wqe; /* wait queue for req SG page */ | |
176 | struct list_head rsp_sgpg_q; /* SG pages for response buf */ | |
177 | struct list_head rsp_sgpg_wqe; /* wait queue for rsp SG page */ | |
178 | ||
179 | bfa_fcxp_get_sgaddr_t req_sga_cbfn; | |
180 | /* SG elem addr user function */ | |
181 | bfa_fcxp_get_sglen_t req_sglen_cbfn; | |
182 | /* SG elem len user function */ | |
183 | bfa_fcxp_get_sgaddr_t rsp_sga_cbfn; | |
184 | /* SG elem addr user function */ | |
185 | bfa_fcxp_get_sglen_t rsp_sglen_cbfn; | |
186 | /* SG elem len user function */ | |
187 | bfa_cb_fcxp_send_t send_cbfn; /* send completion callback */ | |
188 | void *send_cbarg; /* callback arg */ | |
189 | struct bfa_sge_s req_sge[BFA_FCXP_MAX_SGES]; | |
190 | /* req SG elems */ | |
191 | struct bfa_sge_s rsp_sge[BFA_FCXP_MAX_SGES]; | |
192 | /* rsp SG elems */ | |
193 | u8 rsp_status; /* comp: rsp status */ | |
194 | u32 rsp_len; /* comp: actual response len */ | |
195 | u32 residue_len; /* comp: residual rsp length */ | |
196 | struct fchs_s rsp_fchs; /* comp: response fchs */ | |
197 | struct bfa_cb_qe_s hcb_qe; /* comp: callback qelem */ | |
198 | struct bfa_reqq_wait_s reqq_wqe; | |
199 | bfa_boolean_t reqq_waiting; | |
200 | }; | |
201 | ||
202 | struct bfa_fcxp_wqe_s { | |
203 | struct list_head qe; | |
204 | bfa_fcxp_alloc_cbfn_t alloc_cbfn; | |
205 | void *alloc_cbarg; | |
206 | void *caller; | |
207 | struct bfa_s *bfa; | |
208 | int nreq_sgles; | |
209 | int nrsp_sgles; | |
210 | bfa_fcxp_get_sgaddr_t req_sga_cbfn; | |
211 | bfa_fcxp_get_sglen_t req_sglen_cbfn; | |
212 | bfa_fcxp_get_sgaddr_t rsp_sga_cbfn; | |
213 | bfa_fcxp_get_sglen_t rsp_sglen_cbfn; | |
214 | }; | |
215 | ||
216 | #define BFA_FCXP_REQ_PLD(_fcxp) (bfa_fcxp_get_reqbuf(_fcxp)) | |
217 | #define BFA_FCXP_RSP_FCHS(_fcxp) (&((_fcxp)->rsp_info.fchs)) | |
218 | #define BFA_FCXP_RSP_PLD(_fcxp) (bfa_fcxp_get_rspbuf(_fcxp)) | |
219 | ||
4507025d KG |
220 | #define BFA_FCXP_REQ_PLD_PA(_fcxp) \ |
221 | bfa_mem_get_dmabuf_pa((_fcxp)->fcxp_mod, (_fcxp)->fcxp_tag, \ | |
222 | (_fcxp)->fcxp_mod->req_pld_sz + (_fcxp)->fcxp_mod->rsp_pld_sz) | |
a36c61f9 | 223 | |
4507025d KG |
224 | /* fcxp_buf = req_buf + rsp_buf :- add req_buf_sz to get to rsp_buf */ |
225 | #define BFA_FCXP_RSP_PLD_PA(_fcxp) \ | |
226 | (bfa_mem_get_dmabuf_pa((_fcxp)->fcxp_mod, (_fcxp)->fcxp_tag, \ | |
227 | (_fcxp)->fcxp_mod->req_pld_sz + (_fcxp)->fcxp_mod->rsp_pld_sz) + \ | |
228 | (_fcxp)->fcxp_mod->req_pld_sz) | |
a36c61f9 KG |
229 | |
230 | void bfa_fcxp_isr(struct bfa_s *bfa, struct bfi_msg_s *msg); | |
231 | ||
232 | ||
acdc79a6 | 233 | /* |
a36c61f9 KG |
234 | * RPORT related defines |
235 | */ | |
f7f73812 MZ |
236 | enum bfa_rport_event { |
237 | BFA_RPORT_SM_CREATE = 1, /* rport create event */ | |
238 | BFA_RPORT_SM_DELETE = 2, /* deleting an existing rport */ | |
239 | BFA_RPORT_SM_ONLINE = 3, /* rport is online */ | |
240 | BFA_RPORT_SM_OFFLINE = 4, /* rport is offline */ | |
241 | BFA_RPORT_SM_FWRSP = 5, /* firmware response */ | |
242 | BFA_RPORT_SM_HWFAIL = 6, /* IOC h/w failure */ | |
243 | BFA_RPORT_SM_QOS_SCN = 7, /* QoS SCN from firmware */ | |
244 | BFA_RPORT_SM_SET_SPEED = 8, /* Set Rport Speed */ | |
245 | BFA_RPORT_SM_QRESUME = 9, /* space in requeue queue */ | |
246 | }; | |
247 | ||
a36c61f9 KG |
248 | #define BFA_RPORT_MIN 4 |
249 | ||
250 | struct bfa_rport_mod_s { | |
251 | struct bfa_rport_s *rps_list; /* list of rports */ | |
252 | struct list_head rp_free_q; /* free bfa_rports */ | |
253 | struct list_head rp_active_q; /* free bfa_rports */ | |
3fd45980 | 254 | struct list_head rp_unused_q; /* unused bfa rports */ |
a36c61f9 | 255 | u16 num_rports; /* number of rports */ |
4507025d | 256 | struct bfa_mem_kva_s kva_seg; |
a36c61f9 KG |
257 | }; |
258 | ||
259 | #define BFA_RPORT_MOD(__bfa) (&(__bfa)->modules.rport_mod) | |
4507025d | 260 | #define BFA_MEM_RPORT_KVA(__bfa) (&(BFA_RPORT_MOD(__bfa)->kva_seg)) |
a36c61f9 | 261 | |
acdc79a6 | 262 | /* |
a36c61f9 KG |
263 | * Convert rport tag to RPORT |
264 | */ | |
265 | #define BFA_RPORT_FROM_TAG(__bfa, _tag) \ | |
266 | (BFA_RPORT_MOD(__bfa)->rps_list + \ | |
267 | ((_tag) & (BFA_RPORT_MOD(__bfa)->num_rports - 1))) | |
268 | ||
269 | /* | |
270 | * protected functions | |
271 | */ | |
272 | void bfa_rport_isr(struct bfa_s *bfa, struct bfi_msg_s *msg); | |
3fd45980 | 273 | void bfa_rport_res_recfg(struct bfa_s *bfa, u16 num_rport_fw); |
a36c61f9 | 274 | |
acdc79a6 | 275 | /* |
a36c61f9 KG |
276 | * BFA rport information. |
277 | */ | |
278 | struct bfa_rport_info_s { | |
279 | u16 max_frmsz; /* max rcv pdu size */ | |
280 | u32 pid:24, /* remote port ID */ | |
281 | lp_tag:8; /* tag */ | |
282 | u32 local_pid:24, /* local port ID */ | |
283 | cisc:8; /* CIRO supported */ | |
284 | u8 fc_class; /* supported FC classes. enum fc_cos */ | |
285 | u8 vf_en; /* virtual fabric enable */ | |
286 | u16 vf_id; /* virtual fabric ID */ | |
287 | enum bfa_port_speed speed; /* Rport's current speed */ | |
288 | }; | |
289 | ||
acdc79a6 | 290 | /* |
a36c61f9 KG |
291 | * BFA rport data structure |
292 | */ | |
293 | struct bfa_rport_s { | |
294 | struct list_head qe; /* queue element */ | |
295 | bfa_sm_t sm; /* state machine */ | |
296 | struct bfa_s *bfa; /* backpointer to BFA */ | |
297 | void *rport_drv; /* fcs/driver rport object */ | |
298 | u16 fw_handle; /* firmware rport handle */ | |
299 | u16 rport_tag; /* BFA rport tag */ | |
83763d59 | 300 | u8 lun_mask; /* LUN mask flag */ |
a36c61f9 KG |
301 | struct bfa_rport_info_s rport_info; /* rport info from fcs/driver */ |
302 | struct bfa_reqq_wait_s reqq_wait; /* to wait for room in reqq */ | |
303 | struct bfa_cb_qe_s hcb_qe; /* BFA callback qelem */ | |
304 | struct bfa_rport_hal_stats_s stats; /* BFA rport statistics */ | |
305 | struct bfa_rport_qos_attr_s qos_attr; | |
306 | union a { | |
307 | bfa_status_t status; /* f/w status */ | |
308 | void *fw_msg; /* QoS scn event */ | |
309 | } event_arg; | |
310 | }; | |
311 | #define BFA_RPORT_FC_COS(_rport) ((_rport)->rport_info.fc_class) | |
312 | ||
313 | ||
acdc79a6 | 314 | /* |
a36c61f9 KG |
315 | * UF - unsolicited receive related defines |
316 | */ | |
317 | ||
318 | #define BFA_UF_MIN (4) | |
4507025d | 319 | #define BFA_UF_MAX (256) |
a36c61f9 KG |
320 | |
321 | struct bfa_uf_s { | |
322 | struct list_head qe; /* queue element */ | |
323 | struct bfa_s *bfa; /* bfa instance */ | |
324 | u16 uf_tag; /* identifying tag fw msgs */ | |
325 | u16 vf_id; | |
326 | u16 src_rport_handle; | |
327 | u16 rsvd; | |
328 | u8 *data_ptr; | |
329 | u16 data_len; /* actual receive length */ | |
330 | u16 pb_len; /* posted buffer length */ | |
331 | void *buf_kva; /* buffer virtual address */ | |
332 | u64 buf_pa; /* buffer physical address */ | |
333 | struct bfa_cb_qe_s hcb_qe; /* comp: BFA comp qelem */ | |
334 | struct bfa_sge_s sges[BFI_SGE_INLINE_MAX]; | |
335 | }; | |
336 | ||
acdc79a6 | 337 | /* |
a36c61f9 KG |
338 | * Callback prototype for unsolicited frame receive handler. |
339 | * | |
340 | * @param[in] cbarg callback arg for receive handler | |
341 | * @param[in] uf unsolicited frame descriptor | |
342 | * | |
343 | * @return None | |
344 | */ | |
345 | typedef void (*bfa_cb_uf_recv_t) (void *cbarg, struct bfa_uf_s *uf); | |
346 | ||
4507025d KG |
347 | #define BFA_UF_BUFSZ (2 * 1024 + 256) |
348 | ||
349 | struct bfa_uf_buf_s { | |
350 | u8 d[BFA_UF_BUFSZ]; | |
351 | }; | |
352 | ||
353 | #define BFA_PER_UF_DMA_SZ \ | |
354 | (u32)BFA_ROUNDUP(sizeof(struct bfa_uf_buf_s), BFA_DMA_ALIGN_SZ) | |
355 | ||
356 | /* Max UF dma segs required */ | |
357 | #define BFA_UF_DMA_SEGS BFI_MEM_DMA_NSEGS(BFA_UF_MAX, BFA_PER_UF_DMA_SZ) | |
358 | ||
a36c61f9 KG |
359 | struct bfa_uf_mod_s { |
360 | struct bfa_s *bfa; /* back pointer to BFA */ | |
361 | struct bfa_uf_s *uf_list; /* array of UFs */ | |
362 | u16 num_ufs; /* num unsolicited rx frames */ | |
363 | struct list_head uf_free_q; /* free UFs */ | |
364 | struct list_head uf_posted_q; /* UFs posted to IOC */ | |
3fd45980 | 365 | struct list_head uf_unused_q; /* unused UF's */ |
a36c61f9 KG |
366 | struct bfi_uf_buf_post_s *uf_buf_posts; |
367 | /* pre-built UF post msgs */ | |
368 | bfa_cb_uf_recv_t ufrecv; /* uf recv handler function */ | |
369 | void *cbarg; /* uf receive handler arg */ | |
4507025d KG |
370 | struct bfa_mem_dma_s dma_seg[BFA_UF_DMA_SEGS]; |
371 | struct bfa_mem_kva_s kva_seg; | |
a36c61f9 KG |
372 | }; |
373 | ||
374 | #define BFA_UF_MOD(__bfa) (&(__bfa)->modules.uf_mod) | |
4507025d | 375 | #define BFA_MEM_UF_KVA(__bfa) (&(BFA_UF_MOD(__bfa)->kva_seg)) |
a36c61f9 KG |
376 | |
377 | #define ufm_pbs_pa(_ufmod, _uftag) \ | |
4507025d | 378 | bfa_mem_get_dmabuf_pa(_ufmod, _uftag, BFA_PER_UF_DMA_SZ) |
a36c61f9 KG |
379 | |
380 | void bfa_uf_isr(struct bfa_s *bfa, struct bfi_msg_s *msg); | |
3fd45980 | 381 | void bfa_uf_res_recfg(struct bfa_s *bfa, u16 num_uf_fw); |
a36c61f9 | 382 | |
acdc79a6 | 383 | /* |
a36c61f9 KG |
384 | * LPS - bfa lport login/logout service interface |
385 | */ | |
386 | struct bfa_lps_s { | |
387 | struct list_head qe; /* queue element */ | |
388 | struct bfa_s *bfa; /* parent bfa instance */ | |
389 | bfa_sm_t sm; /* finite state machine */ | |
3fd45980 KG |
390 | u8 bfa_tag; /* lport tag */ |
391 | u8 fw_tag; /* lport fw tag */ | |
a36c61f9 KG |
392 | u8 reqq; /* lport request queue */ |
393 | u8 alpa; /* ALPA for loop topologies */ | |
394 | u32 lp_pid; /* lport port ID */ | |
395 | bfa_boolean_t fdisc; /* snd FDISC instead of FLOGI */ | |
396 | bfa_boolean_t auth_en; /* enable authentication */ | |
397 | bfa_boolean_t auth_req; /* authentication required */ | |
398 | bfa_boolean_t npiv_en; /* NPIV is allowed by peer */ | |
399 | bfa_boolean_t fport; /* attached peer is F_PORT */ | |
400 | bfa_boolean_t brcd_switch; /* attached peer is brcd sw */ | |
401 | bfa_status_t status; /* login status */ | |
402 | u16 pdusz; /* max receive PDU size */ | |
403 | u16 pr_bbcred; /* BB_CREDIT from peer */ | |
be540a99 KG |
404 | u8 pr_bbscn; /* BB_SCN from peer */ |
405 | u8 bb_scn; /* local BB_SCN */ | |
a36c61f9 KG |
406 | u8 lsrjt_rsn; /* LSRJT reason */ |
407 | u8 lsrjt_expl; /* LSRJT explanation */ | |
83763d59 | 408 | u8 lun_mask; /* LUN mask flag */ |
a36c61f9 KG |
409 | wwn_t pwwn; /* port wwn of lport */ |
410 | wwn_t nwwn; /* node wwn of lport */ | |
411 | wwn_t pr_pwwn; /* port wwn of lport peer */ | |
412 | wwn_t pr_nwwn; /* node wwn of lport peer */ | |
413 | mac_t lp_mac; /* fpma/spma MAC for lport */ | |
414 | mac_t fcf_mac; /* FCF MAC of lport */ | |
415 | struct bfa_reqq_wait_s wqe; /* request wait queue element */ | |
416 | void *uarg; /* user callback arg */ | |
417 | struct bfa_cb_qe_s hcb_qe; /* comp: callback qelem */ | |
418 | struct bfi_lps_login_rsp_s *loginrsp; | |
419 | bfa_eproto_status_t ext_status; | |
420 | }; | |
421 | ||
422 | struct bfa_lps_mod_s { | |
423 | struct list_head lps_free_q; | |
424 | struct list_head lps_active_q; | |
3fd45980 | 425 | struct list_head lps_login_q; |
a36c61f9 KG |
426 | struct bfa_lps_s *lps_arr; |
427 | int num_lps; | |
4507025d | 428 | struct bfa_mem_kva_s kva_seg; |
a36c61f9 KG |
429 | }; |
430 | ||
431 | #define BFA_LPS_MOD(__bfa) (&(__bfa)->modules.lps_mod) | |
432 | #define BFA_LPS_FROM_TAG(__mod, __tag) (&(__mod)->lps_arr[__tag]) | |
4507025d | 433 | #define BFA_MEM_LPS_KVA(__bfa) (&(BFA_LPS_MOD(__bfa)->kva_seg)) |
a36c61f9 KG |
434 | |
435 | /* | |
436 | * external functions | |
437 | */ | |
438 | void bfa_lps_isr(struct bfa_s *bfa, struct bfi_msg_s *msg); | |
439 | ||
440 | ||
acdc79a6 | 441 | /* |
a36c61f9 KG |
442 | * FCPORT related defines |
443 | */ | |
444 | ||
445 | #define BFA_FCPORT(_bfa) (&((_bfa)->modules.port)) | |
a36c61f9 | 446 | |
acdc79a6 | 447 | /* |
a36c61f9 KG |
448 | * Link notification data structure |
449 | */ | |
450 | struct bfa_fcport_ln_s { | |
451 | struct bfa_fcport_s *fcport; | |
452 | bfa_sm_t sm; | |
453 | struct bfa_cb_qe_s ln_qe; /* BFA callback queue elem for ln */ | |
454 | enum bfa_port_linkstate ln_event; /* ln event for callback */ | |
455 | }; | |
456 | ||
457 | struct bfa_fcport_trunk_s { | |
458 | struct bfa_trunk_attr_s attr; | |
459 | }; | |
460 | ||
acdc79a6 | 461 | /* |
a36c61f9 KG |
462 | * BFA FC port data structure |
463 | */ | |
464 | struct bfa_fcport_s { | |
465 | struct bfa_s *bfa; /* parent BFA instance */ | |
466 | bfa_sm_t sm; /* port state machine */ | |
467 | wwn_t nwwn; /* node wwn of physical port */ | |
468 | wwn_t pwwn; /* port wwn of physical oprt */ | |
469 | enum bfa_port_speed speed_sup; | |
470 | /* supported speeds */ | |
471 | enum bfa_port_speed speed; /* current speed */ | |
472 | enum bfa_port_topology topology; /* current topology */ | |
473 | u8 myalpa; /* my ALPA in LOOP topology */ | |
474 | u8 rsvd[3]; | |
475 | struct bfa_port_cfg_s cfg; /* current port configuration */ | |
f3a060ca | 476 | bfa_boolean_t use_flash_cfg; /* get port cfg from flash */ |
a36c61f9 KG |
477 | struct bfa_qos_attr_s qos_attr; /* QoS Attributes */ |
478 | struct bfa_qos_vc_attr_s qos_vc_attr; /* VC info from ELP */ | |
479 | struct bfa_reqq_wait_s reqq_wait; | |
480 | /* to wait for room in reqq */ | |
481 | struct bfa_reqq_wait_s svcreq_wait; | |
482 | /* to wait for room in reqq */ | |
483 | struct bfa_reqq_wait_s stats_reqq_wait; | |
484 | /* to wait for room in reqq (stats) */ | |
485 | void *event_cbarg; | |
486 | void (*event_cbfn) (void *cbarg, | |
487 | enum bfa_port_linkstate event); | |
488 | union { | |
489 | union bfi_fcport_i2h_msg_u i2hmsg; | |
490 | } event_arg; | |
491 | void *bfad; /* BFA driver handle */ | |
492 | struct bfa_fcport_ln_s ln; /* Link Notification */ | |
493 | struct bfa_cb_qe_s hcb_qe; /* BFA callback queue elem */ | |
494 | struct bfa_timer_s timer; /* timer */ | |
495 | u32 msgtag; /* fimrware msg tag for reply */ | |
496 | u8 *stats_kva; | |
497 | u64 stats_pa; | |
498 | union bfa_fcport_stats_u *stats; | |
a36c61f9 | 499 | bfa_status_t stats_status; /* stats/statsclr status */ |
37ea0558 KG |
500 | struct list_head stats_pending_q; |
501 | struct list_head statsclr_pending_q; | |
a36c61f9 KG |
502 | bfa_boolean_t stats_qfull; |
503 | u32 stats_reset_time; /* stats reset time stamp */ | |
a36c61f9 KG |
504 | bfa_boolean_t diag_busy; /* diag busy status */ |
505 | bfa_boolean_t beacon; /* port beacon status */ | |
506 | bfa_boolean_t link_e2e_beacon; /* link beacon status */ | |
be540a99 | 507 | bfa_boolean_t bbsc_op_state; /* Cred recov Oper State */ |
a36c61f9 KG |
508 | struct bfa_fcport_trunk_s trunk; |
509 | u16 fcoe_vlan; | |
4507025d | 510 | struct bfa_mem_dma_s fcport_dma; |
a36c61f9 KG |
511 | }; |
512 | ||
513 | #define BFA_FCPORT_MOD(__bfa) (&(__bfa)->modules.fcport) | |
4507025d | 514 | #define BFA_MEM_FCPORT_DMA(__bfa) (&(BFA_FCPORT_MOD(__bfa)->fcport_dma)) |
a36c61f9 KG |
515 | |
516 | /* | |
517 | * protected functions | |
518 | */ | |
519 | void bfa_fcport_init(struct bfa_s *bfa); | |
520 | void bfa_fcport_isr(struct bfa_s *bfa, struct bfi_msg_s *msg); | |
521 | ||
522 | /* | |
523 | * bfa fcport API functions | |
524 | */ | |
525 | bfa_status_t bfa_fcport_enable(struct bfa_s *bfa); | |
526 | bfa_status_t bfa_fcport_disable(struct bfa_s *bfa); | |
527 | bfa_status_t bfa_fcport_cfg_speed(struct bfa_s *bfa, | |
528 | enum bfa_port_speed speed); | |
529 | enum bfa_port_speed bfa_fcport_get_speed(struct bfa_s *bfa); | |
530 | bfa_status_t bfa_fcport_cfg_topology(struct bfa_s *bfa, | |
531 | enum bfa_port_topology topo); | |
532 | enum bfa_port_topology bfa_fcport_get_topology(struct bfa_s *bfa); | |
533 | bfa_status_t bfa_fcport_cfg_hardalpa(struct bfa_s *bfa, u8 alpa); | |
534 | bfa_boolean_t bfa_fcport_get_hardalpa(struct bfa_s *bfa, u8 *alpa); | |
535 | u8 bfa_fcport_get_myalpa(struct bfa_s *bfa); | |
536 | bfa_status_t bfa_fcport_clr_hardalpa(struct bfa_s *bfa); | |
537 | bfa_status_t bfa_fcport_cfg_maxfrsize(struct bfa_s *bfa, u16 maxsize); | |
538 | u16 bfa_fcport_get_maxfrsize(struct bfa_s *bfa); | |
539 | u8 bfa_fcport_get_rx_bbcredit(struct bfa_s *bfa); | |
540 | void bfa_fcport_get_attr(struct bfa_s *bfa, struct bfa_port_attr_s *attr); | |
541 | wwn_t bfa_fcport_get_wwn(struct bfa_s *bfa, bfa_boolean_t node); | |
542 | void bfa_fcport_event_register(struct bfa_s *bfa, | |
543 | void (*event_cbfn) (void *cbarg, | |
544 | enum bfa_port_linkstate event), void *event_cbarg); | |
545 | bfa_boolean_t bfa_fcport_is_disabled(struct bfa_s *bfa); | |
a36c61f9 KG |
546 | enum bfa_port_speed bfa_fcport_get_ratelim_speed(struct bfa_s *bfa); |
547 | ||
be540a99 | 548 | void bfa_fcport_set_tx_bbcredit(struct bfa_s *bfa, u16 tx_bbcredit, u8 bb_scn); |
a36c61f9 | 549 | bfa_boolean_t bfa_fcport_is_ratelim(struct bfa_s *bfa); |
3d7fc66d KG |
550 | void bfa_fcport_beacon(void *dev, bfa_boolean_t beacon, |
551 | bfa_boolean_t link_e2e_beacon); | |
a36c61f9 KG |
552 | bfa_boolean_t bfa_fcport_is_linkup(struct bfa_s *bfa); |
553 | bfa_status_t bfa_fcport_get_stats(struct bfa_s *bfa, | |
37ea0558 KG |
554 | struct bfa_cb_pending_q_s *cb); |
555 | bfa_status_t bfa_fcport_clear_stats(struct bfa_s *bfa, | |
556 | struct bfa_cb_pending_q_s *cb); | |
a36c61f9 | 557 | bfa_boolean_t bfa_fcport_is_qos_enabled(struct bfa_s *bfa); |
be540a99 | 558 | bfa_boolean_t bfa_fcport_is_trunk_enabled(struct bfa_s *bfa); |
43ffdf4d | 559 | bfa_status_t bfa_fcport_is_pbcdisabled(struct bfa_s *bfa); |
a714134a | 560 | void bfa_fcport_cfg_faa(struct bfa_s *bfa, u8 state); |
a36c61f9 KG |
561 | |
562 | /* | |
563 | * bfa rport API functions | |
564 | */ | |
565 | struct bfa_rport_s *bfa_rport_create(struct bfa_s *bfa, void *rport_drv); | |
a36c61f9 KG |
566 | void bfa_rport_online(struct bfa_rport_s *rport, |
567 | struct bfa_rport_info_s *rport_info); | |
a36c61f9 | 568 | void bfa_rport_speed(struct bfa_rport_s *rport, enum bfa_port_speed speed); |
a36c61f9 KG |
569 | void bfa_cb_rport_online(void *rport); |
570 | void bfa_cb_rport_offline(void *rport); | |
571 | void bfa_cb_rport_qos_scn_flowid(void *rport, | |
572 | struct bfa_rport_qos_attr_s old_qos_attr, | |
573 | struct bfa_rport_qos_attr_s new_qos_attr); | |
574 | void bfa_cb_rport_qos_scn_prio(void *rport, | |
575 | struct bfa_rport_qos_attr_s old_qos_attr, | |
576 | struct bfa_rport_qos_attr_s new_qos_attr); | |
a36c61f9 | 577 | |
83763d59 KG |
578 | /* |
579 | * Rport LUN masking related | |
580 | */ | |
581 | #define BFA_RPORT_TAG_INVALID 0xffff | |
582 | #define BFA_LP_TAG_INVALID 0xff | |
583 | void bfa_rport_set_lunmask(struct bfa_s *bfa, struct bfa_rport_s *rp); | |
584 | void bfa_rport_unset_lunmask(struct bfa_s *bfa, struct bfa_rport_s *rp); | |
83763d59 | 585 | |
a36c61f9 KG |
586 | /* |
587 | * bfa fcxp API functions | |
588 | */ | |
589 | struct bfa_fcxp_s *bfa_fcxp_alloc(void *bfad_fcxp, struct bfa_s *bfa, | |
590 | int nreq_sgles, int nrsp_sgles, | |
591 | bfa_fcxp_get_sgaddr_t get_req_sga, | |
592 | bfa_fcxp_get_sglen_t get_req_sglen, | |
593 | bfa_fcxp_get_sgaddr_t get_rsp_sga, | |
594 | bfa_fcxp_get_sglen_t get_rsp_sglen); | |
595 | void bfa_fcxp_alloc_wait(struct bfa_s *bfa, struct bfa_fcxp_wqe_s *wqe, | |
596 | bfa_fcxp_alloc_cbfn_t alloc_cbfn, | |
597 | void *cbarg, void *bfad_fcxp, | |
598 | int nreq_sgles, int nrsp_sgles, | |
599 | bfa_fcxp_get_sgaddr_t get_req_sga, | |
600 | bfa_fcxp_get_sglen_t get_req_sglen, | |
601 | bfa_fcxp_get_sgaddr_t get_rsp_sga, | |
602 | bfa_fcxp_get_sglen_t get_rsp_sglen); | |
603 | void bfa_fcxp_walloc_cancel(struct bfa_s *bfa, | |
604 | struct bfa_fcxp_wqe_s *wqe); | |
605 | void bfa_fcxp_discard(struct bfa_fcxp_s *fcxp); | |
606 | ||
607 | void *bfa_fcxp_get_reqbuf(struct bfa_fcxp_s *fcxp); | |
608 | void *bfa_fcxp_get_rspbuf(struct bfa_fcxp_s *fcxp); | |
609 | ||
610 | void bfa_fcxp_free(struct bfa_fcxp_s *fcxp); | |
611 | ||
612 | void bfa_fcxp_send(struct bfa_fcxp_s *fcxp, struct bfa_rport_s *rport, | |
613 | u16 vf_id, u8 lp_tag, | |
614 | bfa_boolean_t cts, enum fc_cos cos, | |
615 | u32 reqlen, struct fchs_s *fchs, | |
616 | bfa_cb_fcxp_send_t cbfn, | |
617 | void *cbarg, | |
618 | u32 rsp_maxlen, u8 rsp_timeout); | |
619 | bfa_status_t bfa_fcxp_abort(struct bfa_fcxp_s *fcxp); | |
620 | u32 bfa_fcxp_get_reqbufsz(struct bfa_fcxp_s *fcxp); | |
621 | u32 bfa_fcxp_get_maxrsp(struct bfa_s *bfa); | |
3fd45980 | 622 | void bfa_fcxp_res_recfg(struct bfa_s *bfa, u16 num_fcxp_fw); |
a36c61f9 KG |
623 | |
624 | static inline void * | |
625 | bfa_uf_get_frmbuf(struct bfa_uf_s *uf) | |
626 | { | |
627 | return uf->data_ptr; | |
628 | } | |
629 | ||
630 | static inline u16 | |
631 | bfa_uf_get_frmlen(struct bfa_uf_s *uf) | |
632 | { | |
633 | return uf->data_len; | |
634 | } | |
635 | ||
636 | /* | |
637 | * bfa uf API functions | |
638 | */ | |
639 | void bfa_uf_recv_register(struct bfa_s *bfa, bfa_cb_uf_recv_t ufrecv, | |
640 | void *cbarg); | |
641 | void bfa_uf_free(struct bfa_uf_s *uf); | |
642 | ||
acdc79a6 | 643 | /* |
a36c61f9 KG |
644 | * bfa lport service api |
645 | */ | |
646 | ||
647 | u32 bfa_lps_get_max_vport(struct bfa_s *bfa); | |
648 | struct bfa_lps_s *bfa_lps_alloc(struct bfa_s *bfa); | |
649 | void bfa_lps_delete(struct bfa_lps_s *lps); | |
a36c61f9 KG |
650 | void bfa_lps_flogi(struct bfa_lps_s *lps, void *uarg, u8 alpa, |
651 | u16 pdusz, wwn_t pwwn, wwn_t nwwn, | |
be540a99 | 652 | bfa_boolean_t auth_en, u8 bb_scn); |
a36c61f9 KG |
653 | void bfa_lps_fdisc(struct bfa_lps_s *lps, void *uarg, u16 pdusz, |
654 | wwn_t pwwn, wwn_t nwwn); | |
a36c61f9 | 655 | void bfa_lps_fdisclogo(struct bfa_lps_s *lps); |
b704495c | 656 | void bfa_lps_set_n2n_pid(struct bfa_lps_s *lps, u32 n2n_pid); |
3fd45980 | 657 | u8 bfa_lps_get_fwtag(struct bfa_s *bfa, u8 lp_tag); |
a36c61f9 KG |
658 | u32 bfa_lps_get_base_pid(struct bfa_s *bfa); |
659 | u8 bfa_lps_get_tag_from_pid(struct bfa_s *bfa, u32 pid); | |
a36c61f9 KG |
660 | void bfa_cb_lps_flogi_comp(void *bfad, void *uarg, bfa_status_t status); |
661 | void bfa_cb_lps_fdisc_comp(void *bfad, void *uarg, bfa_status_t status); | |
662 | void bfa_cb_lps_fdisclogo_comp(void *bfad, void *uarg); | |
663 | void bfa_cb_lps_cvl_event(void *bfad, void *uarg); | |
664 | ||
a714134a | 665 | /* FAA specific APIs */ |
a714134a KG |
666 | bfa_status_t bfa_faa_query(struct bfa_s *bfa, struct bfa_faa_attr_s *attr, |
667 | bfa_cb_iocfc_t cbfn, void *cbarg); | |
668 | ||
3d7fc66d KG |
669 | /* |
670 | * FC DIAG data structure | |
671 | */ | |
672 | struct bfa_fcdiag_qtest_s { | |
673 | struct bfa_diag_qtest_result_s *result; | |
674 | bfa_cb_diag_t cbfn; | |
675 | void *cbarg; | |
676 | struct bfa_timer_s timer; | |
677 | u32 status; | |
678 | u32 count; | |
679 | u8 lock; | |
680 | u8 queue; | |
681 | u8 all; | |
682 | u8 timer_active; | |
683 | }; | |
684 | ||
685 | struct bfa_fcdiag_lb_s { | |
686 | bfa_cb_diag_t cbfn; | |
687 | void *cbarg; | |
688 | void *result; | |
689 | bfa_boolean_t lock; | |
690 | u32 status; | |
691 | }; | |
692 | ||
693 | struct bfa_fcdiag_s { | |
694 | struct bfa_s *bfa; /* Back pointer to BFA */ | |
695 | struct bfa_trc_mod_s *trcmod; | |
696 | struct bfa_fcdiag_lb_s lb; | |
697 | struct bfa_fcdiag_qtest_s qtest; | |
698 | }; | |
699 | ||
700 | #define BFA_FCDIAG_MOD(__bfa) (&(__bfa)->modules.fcdiag) | |
701 | ||
702 | void bfa_fcdiag_intr(struct bfa_s *bfa, struct bfi_msg_s *msg); | |
703 | ||
704 | bfa_status_t bfa_fcdiag_loopback(struct bfa_s *bfa, | |
705 | enum bfa_port_opmode opmode, | |
706 | enum bfa_port_speed speed, u32 lpcnt, u32 pat, | |
707 | struct bfa_diag_loopback_result_s *result, | |
708 | bfa_cb_diag_t cbfn, void *cbarg); | |
709 | bfa_status_t bfa_fcdiag_queuetest(struct bfa_s *bfa, u32 ignore, | |
710 | u32 queue, struct bfa_diag_qtest_result_s *result, | |
711 | bfa_cb_diag_t cbfn, void *cbarg); | |
712 | bfa_status_t bfa_fcdiag_lb_is_running(struct bfa_s *bfa); | |
713 | ||
a36c61f9 | 714 | #endif /* __BFA_SVC_H__ */ |