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