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