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 | #define BFA_RPORT_MIN 4 |
230 | |
231 | struct bfa_rport_mod_s { |
232 | struct bfa_rport_s *rps_list; /* list of rports */ |
233 | struct list_head rp_free_q; /* free bfa_rports */ |
234 | struct list_head rp_active_q; /* free bfa_rports */ |
235 | struct list_head rp_unused_q; /* unused bfa rports */ |
236 | u16 num_rports; /* number of rports */ |
237 | struct bfa_mem_kva_s kva_seg; |
238 | }; |
239 | |
240 | #define BFA_RPORT_MOD(__bfa) (&(__bfa)->modules.rport_mod) |
241 | #define BFA_MEM_RPORT_KVA(__bfa) (&(BFA_RPORT_MOD(__bfa)->kva_seg)) |
242 | |
243 | /* |
244 | * Convert rport tag to RPORT |
245 | */ |
246 | #define BFA_RPORT_FROM_TAG(__bfa, _tag) \ |
247 | (BFA_RPORT_MOD(__bfa)->rps_list + \ |
248 | ((_tag) & (BFA_RPORT_MOD(__bfa)->num_rports - 1))) |
249 | |
250 | /* |
251 | * protected functions |
252 | */ |
253 | void bfa_rport_isr(struct bfa_s *bfa, struct bfi_msg_s *msg); |
254 | void bfa_rport_res_recfg(struct bfa_s *bfa, u16 num_rport_fw); |
255 | |
256 | /* |
257 | * BFA rport information. |
258 | */ |
259 | struct bfa_rport_info_s { |
260 | u16 max_frmsz; /* max rcv pdu size */ |
261 | u32 pid:24, /* remote port ID */ |
262 | lp_tag:8; /* tag */ |
263 | u32 local_pid:24, /* local port ID */ |
264 | cisc:8; /* CIRO supported */ |
265 | u8 fc_class; /* supported FC classes. enum fc_cos */ |
266 | u8 vf_en; /* virtual fabric enable */ |
267 | u16 vf_id; /* virtual fabric ID */ |
268 | enum bfa_port_speed speed; /* Rport's current speed */ |
269 | }; |
270 | |
271 | /* |
272 | * RPORT related defines |
273 | */ |
274 | enum bfa_rport_event { |
275 | BFA_RPORT_SM_CREATE = 1, /* rport create event */ |
276 | BFA_RPORT_SM_DELETE = 2, /* deleting an existing rport */ |
277 | BFA_RPORT_SM_ONLINE = 3, /* rport is online */ |
278 | BFA_RPORT_SM_OFFLINE = 4, /* rport is offline */ |
279 | BFA_RPORT_SM_FWRSP = 5, /* firmware response */ |
280 | BFA_RPORT_SM_HWFAIL = 6, /* IOC h/w failure */ |
281 | BFA_RPORT_SM_QOS_SCN = 7, /* QoS SCN from firmware */ |
282 | BFA_RPORT_SM_SET_SPEED = 8, /* Set Rport Speed */ |
283 | BFA_RPORT_SM_QRESUME = 9, /* space in requeue queue */ |
284 | }; |
285 | |
286 | struct bfa_rport_s; |
287 | typedef void (*bfa_rport_sm_t)(struct bfa_rport_s *, enum bfa_rport_event); |
288 | |
289 | /* |
290 | * BFA rport data structure |
291 | */ |
292 | struct bfa_rport_s { |
293 | struct list_head qe; /* queue element */ |
294 | bfa_rport_sm_t sm; /* state machine */ |
295 | struct bfa_s *bfa; /* backpointer to BFA */ |
296 | void *rport_drv; /* fcs/driver rport object */ |
297 | u16 fw_handle; /* firmware rport handle */ |
298 | u16 rport_tag; /* BFA rport tag */ |
299 | u8 lun_mask; /* LUN mask flag */ |
300 | struct bfa_rport_info_s rport_info; /* rport info from fcs/driver */ |
301 | struct bfa_reqq_wait_s reqq_wait; /* to wait for room in reqq */ |
302 | struct bfa_cb_qe_s hcb_qe; /* BFA callback qelem */ |
303 | struct bfa_rport_hal_stats_s stats; /* BFA rport statistics */ |
304 | struct bfa_rport_qos_attr_s qos_attr; |
305 | union a { |
306 | bfa_status_t status; /* f/w status */ |
307 | void *fw_msg; /* QoS scn event */ |
308 | } event_arg; |
309 | }; |
310 | #define BFA_RPORT_FC_COS(_rport) ((_rport)->rport_info.fc_class) |
311 | |
312 | |
313 | /* |
314 | * UF - unsolicited receive related defines |
315 | */ |
316 | |
317 | #define BFA_UF_MIN (4) |
318 | #define BFA_UF_MAX (256) |
319 | |
320 | struct bfa_uf_s { |
321 | struct list_head qe; /* queue element */ |
322 | struct bfa_s *bfa; /* bfa instance */ |
323 | u16 uf_tag; /* identifying tag fw msgs */ |
324 | u16 vf_id; |
325 | u16 src_rport_handle; |
326 | u16 rsvd; |
327 | u8 *data_ptr; |
328 | u16 data_len; /* actual receive length */ |
329 | u16 pb_len; /* posted buffer length */ |
330 | void *buf_kva; /* buffer virtual address */ |
331 | u64 buf_pa; /* buffer physical address */ |
332 | struct bfa_cb_qe_s hcb_qe; /* comp: BFA comp qelem */ |
333 | struct bfa_sge_s sges[BFI_SGE_INLINE_MAX]; |
334 | }; |
335 | |
336 | /* |
337 | * Callback prototype for unsolicited frame receive handler. |
338 | * |
339 | * @param[in] cbarg callback arg for receive handler |
340 | * @param[in] uf unsolicited frame descriptor |
341 | * |
342 | * @return None |
343 | */ |
344 | typedef void (*bfa_cb_uf_recv_t) (void *cbarg, struct bfa_uf_s *uf); |
345 | |
346 | #define BFA_UF_BUFSZ (2 * 1024 + 256) |
347 | |
348 | struct bfa_uf_buf_s { |
349 | u8 d[BFA_UF_BUFSZ]; |
350 | }; |
351 | |
352 | #define BFA_PER_UF_DMA_SZ \ |
353 | (u32)BFA_ROUNDUP(sizeof(struct bfa_uf_buf_s), BFA_DMA_ALIGN_SZ) |
354 | |
355 | /* Max UF dma segs required */ |
356 | #define BFA_UF_DMA_SEGS BFI_MEM_DMA_NSEGS(BFA_UF_MAX, BFA_PER_UF_DMA_SZ) |
357 | |
358 | struct bfa_uf_mod_s { |
359 | struct bfa_s *bfa; /* back pointer to BFA */ |
360 | struct bfa_uf_s *uf_list; /* array of UFs */ |
361 | u16 num_ufs; /* num unsolicited rx frames */ |
362 | struct list_head uf_free_q; /* free UFs */ |
363 | struct list_head uf_posted_q; /* UFs posted to IOC */ |
364 | struct list_head uf_unused_q; /* unused UF's */ |
365 | struct bfi_uf_buf_post_s *uf_buf_posts; |
366 | /* pre-built UF post msgs */ |
367 | bfa_cb_uf_recv_t ufrecv; /* uf recv handler function */ |
368 | void *cbarg; /* uf receive handler arg */ |
369 | struct bfa_mem_dma_s dma_seg[BFA_UF_DMA_SEGS]; |
370 | struct bfa_mem_kva_s kva_seg; |
371 | }; |
372 | |
373 | #define BFA_UF_MOD(__bfa) (&(__bfa)->modules.uf_mod) |
374 | #define BFA_MEM_UF_KVA(__bfa) (&(BFA_UF_MOD(__bfa)->kva_seg)) |
375 | |
376 | #define ufm_pbs_pa(_ufmod, _uftag) \ |
377 | bfa_mem_get_dmabuf_pa(_ufmod, _uftag, BFA_PER_UF_DMA_SZ) |
378 | |
379 | void bfa_uf_isr(struct bfa_s *bfa, struct bfi_msg_s *msg); |
380 | void bfa_uf_res_recfg(struct bfa_s *bfa, u16 num_uf_fw); |
381 | |
382 | /* |
383 | * lps_pvt BFA LPS private functions |
384 | */ |
385 | |
386 | enum bfa_lps_event { |
387 | BFA_LPS_SM_LOGIN = 1, /* login request from user */ |
388 | BFA_LPS_SM_LOGOUT = 2, /* logout request from user */ |
389 | BFA_LPS_SM_FWRSP = 3, /* f/w response to login/logout */ |
390 | BFA_LPS_SM_RESUME = 4, /* space present in reqq queue */ |
391 | BFA_LPS_SM_DELETE = 5, /* lps delete from user */ |
392 | BFA_LPS_SM_OFFLINE = 6, /* Link is offline */ |
393 | BFA_LPS_SM_RX_CVL = 7, /* Rx clear virtual link */ |
394 | BFA_LPS_SM_SET_N2N_PID = 8, /* Set assigned PID for n2n */ |
395 | }; |
396 | |
397 | struct bfa_lps_s; |
398 | typedef void (*bfa_lps_sm_t)(struct bfa_lps_s *, enum bfa_lps_event); |
399 | |
400 | /* |
401 | * LPS - bfa lport login/logout service interface |
402 | */ |
403 | struct bfa_lps_s { |
404 | struct list_head qe; /* queue element */ |
405 | struct bfa_s *bfa; /* parent bfa instance */ |
406 | bfa_lps_sm_t sm; /* finite state machine */ |
407 | u8 bfa_tag; /* lport tag */ |
408 | u8 fw_tag; /* lport fw tag */ |
409 | u8 reqq; /* lport request queue */ |
410 | u8 alpa; /* ALPA for loop topologies */ |
411 | u32 lp_pid; /* lport port ID */ |
412 | bfa_boolean_t fdisc; /* snd FDISC instead of FLOGI */ |
413 | bfa_boolean_t auth_en; /* enable authentication */ |
414 | bfa_boolean_t auth_req; /* authentication required */ |
415 | bfa_boolean_t npiv_en; /* NPIV is allowed by peer */ |
416 | bfa_boolean_t fport; /* attached peer is F_PORT */ |
417 | bfa_boolean_t brcd_switch; /* attached peer is brcd sw */ |
418 | bfa_status_t status; /* login status */ |
419 | u16 pdusz; /* max receive PDU size */ |
420 | u16 pr_bbcred; /* BB_CREDIT from peer */ |
421 | u8 lsrjt_rsn; /* LSRJT reason */ |
422 | u8 lsrjt_expl; /* LSRJT explanation */ |
423 | u8 lun_mask; /* LUN mask flag */ |
424 | wwn_t pwwn; /* port wwn of lport */ |
425 | wwn_t nwwn; /* node wwn of lport */ |
426 | wwn_t pr_pwwn; /* port wwn of lport peer */ |
427 | wwn_t pr_nwwn; /* node wwn of lport peer */ |
428 | mac_t lp_mac; /* fpma/spma MAC for lport */ |
429 | mac_t fcf_mac; /* FCF MAC of lport */ |
430 | struct bfa_reqq_wait_s wqe; /* request wait queue element */ |
431 | void *uarg; /* user callback arg */ |
432 | struct bfa_cb_qe_s hcb_qe; /* comp: callback qelem */ |
433 | struct bfi_lps_login_rsp_s *loginrsp; |
434 | bfa_eproto_status_t ext_status; |
435 | }; |
436 | |
437 | struct bfa_lps_mod_s { |
438 | struct list_head lps_free_q; |
439 | struct list_head lps_active_q; |
440 | struct list_head lps_login_q; |
441 | struct bfa_lps_s *lps_arr; |
442 | int num_lps; |
443 | struct bfa_mem_kva_s kva_seg; |
444 | }; |
445 | |
446 | #define BFA_LPS_MOD(__bfa) (&(__bfa)->modules.lps_mod) |
447 | #define BFA_LPS_FROM_TAG(__mod, __tag) (&(__mod)->lps_arr[__tag]) |
448 | #define BFA_MEM_LPS_KVA(__bfa) (&(BFA_LPS_MOD(__bfa)->kva_seg)) |
449 | |
450 | /* |
451 | * external functions |
452 | */ |
453 | void bfa_lps_isr(struct bfa_s *bfa, struct bfi_msg_s *msg); |
454 | |
455 | |
456 | /* |
457 | * FCPORT related defines |
458 | */ |
459 | |
460 | #define BFA_FCPORT(_bfa) (&((_bfa)->modules.port)) |
461 | |
462 | /* |
463 | * BFA port link notification state machine events |
464 | */ |
465 | |
466 | enum bfa_fcport_ln_sm_event { |
467 | BFA_FCPORT_LN_SM_LINKUP = 1, /* linkup event */ |
468 | BFA_FCPORT_LN_SM_LINKDOWN = 2, /* linkdown event */ |
469 | BFA_FCPORT_LN_SM_NOTIFICATION = 3 /* done notification */ |
470 | }; |
471 | |
472 | struct bfa_fcport_ln_s; |
473 | typedef void (*bfa_fcport_ln_sm_t)(struct bfa_fcport_ln_s *, enum bfa_fcport_ln_sm_event); |
474 | |
475 | /* |
476 | * Link notification data structure |
477 | */ |
478 | struct bfa_fcport_ln_s { |
479 | struct bfa_fcport_s *fcport; |
480 | bfa_fcport_ln_sm_t sm; |
481 | struct bfa_cb_qe_s ln_qe; /* BFA callback queue elem for ln */ |
482 | enum bfa_port_linkstate ln_event; /* ln event for callback */ |
483 | }; |
484 | |
485 | struct bfa_fcport_trunk_s { |
486 | struct bfa_trunk_attr_s attr; |
487 | }; |
488 | |
489 | /* |
490 | * BFA port state machine events |
491 | */ |
492 | enum bfa_fcport_sm_event { |
493 | BFA_FCPORT_SM_START = 1, /* start port state machine */ |
494 | BFA_FCPORT_SM_STOP = 2, /* stop port state machine */ |
495 | BFA_FCPORT_SM_ENABLE = 3, /* enable port */ |
496 | BFA_FCPORT_SM_DISABLE = 4, /* disable port state machine */ |
497 | BFA_FCPORT_SM_FWRSP = 5, /* firmware enable/disable rsp */ |
498 | BFA_FCPORT_SM_LINKUP = 6, /* firmware linkup event */ |
499 | BFA_FCPORT_SM_LINKDOWN = 7, /* firmware linkup down */ |
500 | BFA_FCPORT_SM_QRESUME = 8, /* CQ space available */ |
501 | BFA_FCPORT_SM_HWFAIL = 9, /* IOC h/w failure */ |
502 | BFA_FCPORT_SM_DPORTENABLE = 10, /* enable dport */ |
503 | BFA_FCPORT_SM_DPORTDISABLE = 11,/* disable dport */ |
504 | BFA_FCPORT_SM_FAA_MISCONFIG = 12, /* FAA misconfiguratin */ |
505 | BFA_FCPORT_SM_DDPORTENABLE = 13, /* enable ddport */ |
506 | BFA_FCPORT_SM_DDPORTDISABLE = 14, /* disable ddport */ |
507 | }; |
508 | |
509 | struct bfa_fcport_s; |
510 | typedef void (*bfa_fcport_sm_t)(struct bfa_fcport_s *, enum bfa_fcport_sm_event); |
511 | |
512 | /* |
513 | * BFA FC port data structure |
514 | */ |
515 | struct bfa_fcport_s { |
516 | struct bfa_s *bfa; /* parent BFA instance */ |
517 | bfa_fcport_sm_t sm; /* port state machine */ |
518 | wwn_t nwwn; /* node wwn of physical port */ |
519 | wwn_t pwwn; /* port wwn of physical oprt */ |
520 | enum bfa_port_speed speed_sup; |
521 | /* supported speeds */ |
522 | enum bfa_port_speed speed; /* current speed */ |
523 | enum bfa_port_topology topology; /* current topology */ |
524 | u8 rsvd[3]; |
525 | u8 myalpa; /* my ALPA in LOOP topology */ |
526 | u8 alpabm_valid; /* alpa bitmap valid or not */ |
527 | struct fc_alpabm_s alpabm; /* alpa bitmap */ |
528 | struct bfa_port_cfg_s cfg; /* current port configuration */ |
529 | bfa_boolean_t use_flash_cfg; /* get port cfg from flash */ |
530 | struct bfa_qos_attr_s qos_attr; /* QoS Attributes */ |
531 | struct bfa_qos_vc_attr_s qos_vc_attr; /* VC info from ELP */ |
532 | struct bfa_reqq_wait_s reqq_wait; |
533 | /* to wait for room in reqq */ |
534 | struct bfa_reqq_wait_s svcreq_wait; |
535 | /* to wait for room in reqq */ |
536 | struct bfa_reqq_wait_s stats_reqq_wait; |
537 | /* to wait for room in reqq (stats) */ |
538 | void *event_cbarg; |
539 | void (*event_cbfn) (void *cbarg, |
540 | enum bfa_port_linkstate event); |
541 | union { |
542 | union bfi_fcport_i2h_msg_u i2hmsg; |
543 | } event_arg; |
544 | void *bfad; /* BFA driver handle */ |
545 | struct bfa_fcport_ln_s ln; /* Link Notification */ |
546 | struct bfa_cb_qe_s hcb_qe; /* BFA callback queue elem */ |
547 | struct bfa_timer_s timer; /* timer */ |
548 | u32 msgtag; /* fimrware msg tag for reply */ |
549 | u8 *stats_kva; |
550 | u64 stats_pa; |
551 | union bfa_fcport_stats_u *stats; |
552 | bfa_status_t stats_status; /* stats/statsclr status */ |
553 | struct list_head stats_pending_q; |
554 | struct list_head statsclr_pending_q; |
555 | bfa_boolean_t stats_qfull; |
556 | time64_t stats_reset_time; /* stats reset time stamp */ |
557 | bfa_boolean_t diag_busy; /* diag busy status */ |
558 | bfa_boolean_t beacon; /* port beacon status */ |
559 | bfa_boolean_t link_e2e_beacon; /* link beacon status */ |
560 | struct bfa_fcport_trunk_s trunk; |
561 | u16 fcoe_vlan; |
562 | struct bfa_mem_dma_s fcport_dma; |
563 | bfa_boolean_t stats_dma_ready; |
564 | struct bfa_bbcr_attr_s bbcr_attr; |
565 | enum bfa_fec_state_s fec_state; |
566 | }; |
567 | |
568 | #define BFA_FCPORT_MOD(__bfa) (&(__bfa)->modules.fcport) |
569 | #define BFA_MEM_FCPORT_DMA(__bfa) (&(BFA_FCPORT_MOD(__bfa)->fcport_dma)) |
570 | |
571 | /* |
572 | * protected functions |
573 | */ |
574 | void bfa_fcport_init(struct bfa_s *bfa); |
575 | void bfa_fcport_isr(struct bfa_s *bfa, struct bfi_msg_s *msg); |
576 | |
577 | /* |
578 | * bfa fcport API functions |
579 | */ |
580 | bfa_status_t bfa_fcport_enable(struct bfa_s *bfa); |
581 | bfa_status_t bfa_fcport_disable(struct bfa_s *bfa); |
582 | bfa_status_t bfa_fcport_cfg_speed(struct bfa_s *bfa, |
583 | enum bfa_port_speed speed); |
584 | enum bfa_port_speed bfa_fcport_get_speed(struct bfa_s *bfa); |
585 | bfa_status_t bfa_fcport_cfg_topology(struct bfa_s *bfa, |
586 | enum bfa_port_topology topo); |
587 | enum bfa_port_topology bfa_fcport_get_topology(struct bfa_s *bfa); |
588 | enum bfa_port_topology bfa_fcport_get_cfg_topology(struct bfa_s *bfa); |
589 | bfa_status_t bfa_fcport_cfg_hardalpa(struct bfa_s *bfa, u8 alpa); |
590 | bfa_boolean_t bfa_fcport_get_hardalpa(struct bfa_s *bfa, u8 *alpa); |
591 | u8 bfa_fcport_get_myalpa(struct bfa_s *bfa); |
592 | bfa_status_t bfa_fcport_clr_hardalpa(struct bfa_s *bfa); |
593 | bfa_status_t bfa_fcport_cfg_maxfrsize(struct bfa_s *bfa, u16 maxsize); |
594 | u16 bfa_fcport_get_maxfrsize(struct bfa_s *bfa); |
595 | u8 bfa_fcport_get_rx_bbcredit(struct bfa_s *bfa); |
596 | void bfa_fcport_get_attr(struct bfa_s *bfa, struct bfa_port_attr_s *attr); |
597 | wwn_t bfa_fcport_get_wwn(struct bfa_s *bfa, bfa_boolean_t node); |
598 | void bfa_fcport_event_register(struct bfa_s *bfa, |
599 | void (*event_cbfn) (void *cbarg, |
600 | enum bfa_port_linkstate event), void *event_cbarg); |
601 | bfa_boolean_t bfa_fcport_is_disabled(struct bfa_s *bfa); |
602 | bfa_boolean_t bfa_fcport_is_dport(struct bfa_s *bfa); |
603 | bfa_boolean_t bfa_fcport_is_ddport(struct bfa_s *bfa); |
604 | bfa_status_t bfa_fcport_set_qos_bw(struct bfa_s *bfa, |
605 | struct bfa_qos_bw_s *qos_bw); |
606 | enum bfa_port_speed bfa_fcport_get_ratelim_speed(struct bfa_s *bfa); |
607 | |
608 | void bfa_fcport_set_tx_bbcredit(struct bfa_s *bfa, u16 tx_bbcredit); |
609 | bfa_boolean_t bfa_fcport_is_ratelim(struct bfa_s *bfa); |
610 | void bfa_fcport_beacon(void *dev, bfa_boolean_t beacon, |
611 | bfa_boolean_t link_e2e_beacon); |
612 | bfa_boolean_t bfa_fcport_is_linkup(struct bfa_s *bfa); |
613 | bfa_status_t bfa_fcport_get_stats(struct bfa_s *bfa, |
614 | struct bfa_cb_pending_q_s *cb); |
615 | bfa_status_t bfa_fcport_clear_stats(struct bfa_s *bfa, |
616 | struct bfa_cb_pending_q_s *cb); |
617 | bfa_boolean_t bfa_fcport_is_qos_enabled(struct bfa_s *bfa); |
618 | bfa_boolean_t bfa_fcport_is_trunk_enabled(struct bfa_s *bfa); |
619 | void bfa_fcport_dportenable(struct bfa_s *bfa); |
620 | void bfa_fcport_dportdisable(struct bfa_s *bfa); |
621 | bfa_status_t bfa_fcport_is_pbcdisabled(struct bfa_s *bfa); |
622 | void bfa_fcport_cfg_faa(struct bfa_s *bfa, u8 state); |
623 | bfa_status_t bfa_fcport_cfg_bbcr(struct bfa_s *bfa, |
624 | bfa_boolean_t on_off, u8 bb_scn); |
625 | bfa_status_t bfa_fcport_get_bbcr_attr(struct bfa_s *bfa, |
626 | struct bfa_bbcr_attr_s *bbcr_attr); |
627 | |
628 | /* |
629 | * bfa rport API functions |
630 | */ |
631 | struct bfa_rport_s *bfa_rport_create(struct bfa_s *bfa, void *rport_drv); |
632 | void bfa_rport_online(struct bfa_rport_s *rport, |
633 | struct bfa_rport_info_s *rport_info); |
634 | void bfa_rport_speed(struct bfa_rport_s *rport, enum bfa_port_speed speed); |
635 | void bfa_cb_rport_online(void *rport); |
636 | void bfa_cb_rport_offline(void *rport); |
637 | void bfa_cb_rport_qos_scn_flowid(void *rport, |
638 | struct bfa_rport_qos_attr_s old_qos_attr, |
639 | struct bfa_rport_qos_attr_s new_qos_attr); |
640 | void bfa_cb_rport_scn_online(struct bfa_s *bfa); |
641 | void bfa_cb_rport_scn_offline(struct bfa_s *bfa); |
642 | void bfa_cb_rport_scn_no_dev(void *rp); |
643 | void bfa_cb_rport_qos_scn_prio(void *rport, |
644 | struct bfa_rport_qos_attr_s old_qos_attr, |
645 | struct bfa_rport_qos_attr_s new_qos_attr); |
646 | |
647 | /* |
648 | * Rport LUN masking related |
649 | */ |
650 | #define BFA_RPORT_TAG_INVALID 0xffff |
651 | #define BFA_LP_TAG_INVALID 0xff |
652 | void bfa_rport_set_lunmask(struct bfa_s *bfa, struct bfa_rport_s *rp); |
653 | void bfa_rport_unset_lunmask(struct bfa_s *bfa, struct bfa_rport_s *rp); |
654 | |
655 | /* |
656 | * bfa fcxp API functions |
657 | */ |
658 | struct bfa_fcxp_s *bfa_fcxp_req_rsp_alloc(void *bfad_fcxp, struct bfa_s *bfa, |
659 | int nreq_sgles, int nrsp_sgles, |
660 | bfa_fcxp_get_sgaddr_t get_req_sga, |
661 | bfa_fcxp_get_sglen_t get_req_sglen, |
662 | bfa_fcxp_get_sgaddr_t get_rsp_sga, |
663 | bfa_fcxp_get_sglen_t get_rsp_sglen, |
664 | bfa_boolean_t req); |
665 | void bfa_fcxp_req_rsp_alloc_wait(struct bfa_s *bfa, struct bfa_fcxp_wqe_s *wqe, |
666 | bfa_fcxp_alloc_cbfn_t alloc_cbfn, |
667 | void *cbarg, void *bfad_fcxp, |
668 | int nreq_sgles, int nrsp_sgles, |
669 | bfa_fcxp_get_sgaddr_t get_req_sga, |
670 | bfa_fcxp_get_sglen_t get_req_sglen, |
671 | bfa_fcxp_get_sgaddr_t get_rsp_sga, |
672 | bfa_fcxp_get_sglen_t get_rsp_sglen, |
673 | bfa_boolean_t req); |
674 | void bfa_fcxp_walloc_cancel(struct bfa_s *bfa, |
675 | struct bfa_fcxp_wqe_s *wqe); |
676 | void bfa_fcxp_discard(struct bfa_fcxp_s *fcxp); |
677 | |
678 | void *bfa_fcxp_get_reqbuf(struct bfa_fcxp_s *fcxp); |
679 | void *bfa_fcxp_get_rspbuf(struct bfa_fcxp_s *fcxp); |
680 | |
681 | void bfa_fcxp_free(struct bfa_fcxp_s *fcxp); |
682 | |
683 | void bfa_fcxp_send(struct bfa_fcxp_s *fcxp, struct bfa_rport_s *rport, |
684 | u16 vf_id, u8 lp_tag, |
685 | bfa_boolean_t cts, enum fc_cos cos, |
686 | u32 reqlen, struct fchs_s *fchs, |
687 | bfa_cb_fcxp_send_t cbfn, |
688 | void *cbarg, |
689 | u32 rsp_maxlen, u8 rsp_timeout); |
690 | bfa_status_t bfa_fcxp_abort(struct bfa_fcxp_s *fcxp); |
691 | u32 bfa_fcxp_get_reqbufsz(struct bfa_fcxp_s *fcxp); |
692 | u32 bfa_fcxp_get_maxrsp(struct bfa_s *bfa); |
693 | void bfa_fcxp_res_recfg(struct bfa_s *bfa, u16 num_fcxp_fw); |
694 | |
695 | static inline void * |
696 | bfa_uf_get_frmbuf(struct bfa_uf_s *uf) |
697 | { |
698 | return uf->data_ptr; |
699 | } |
700 | |
701 | static inline u16 |
702 | bfa_uf_get_frmlen(struct bfa_uf_s *uf) |
703 | { |
704 | return uf->data_len; |
705 | } |
706 | |
707 | /* |
708 | * bfa uf API functions |
709 | */ |
710 | void bfa_uf_recv_register(struct bfa_s *bfa, bfa_cb_uf_recv_t ufrecv, |
711 | void *cbarg); |
712 | void bfa_uf_free(struct bfa_uf_s *uf); |
713 | |
714 | /* |
715 | * bfa lport service api |
716 | */ |
717 | |
718 | u32 bfa_lps_get_max_vport(struct bfa_s *bfa); |
719 | struct bfa_lps_s *bfa_lps_alloc(struct bfa_s *bfa); |
720 | void bfa_lps_delete(struct bfa_lps_s *lps); |
721 | void bfa_lps_flogi(struct bfa_lps_s *lps, void *uarg, u8 alpa, |
722 | u16 pdusz, wwn_t pwwn, wwn_t nwwn, |
723 | bfa_boolean_t auth_en); |
724 | void bfa_lps_fdisc(struct bfa_lps_s *lps, void *uarg, u16 pdusz, |
725 | wwn_t pwwn, wwn_t nwwn); |
726 | void bfa_lps_fdisclogo(struct bfa_lps_s *lps); |
727 | void bfa_lps_set_n2n_pid(struct bfa_lps_s *lps, u32 n2n_pid); |
728 | u8 bfa_lps_get_fwtag(struct bfa_s *bfa, u8 lp_tag); |
729 | u32 bfa_lps_get_base_pid(struct bfa_s *bfa); |
730 | u8 bfa_lps_get_tag_from_pid(struct bfa_s *bfa, u32 pid); |
731 | void bfa_cb_lps_flogi_comp(void *bfad, void *uarg, bfa_status_t status); |
732 | void bfa_cb_lps_flogo_comp(void *bfad, void *uarg); |
733 | void bfa_cb_lps_fdisc_comp(void *bfad, void *uarg, bfa_status_t status); |
734 | void bfa_cb_lps_fdisclogo_comp(void *bfad, void *uarg); |
735 | void bfa_cb_lps_cvl_event(void *bfad, void *uarg); |
736 | |
737 | /* FAA specific APIs */ |
738 | bfa_status_t bfa_faa_query(struct bfa_s *bfa, struct bfa_faa_attr_s *attr, |
739 | bfa_cb_iocfc_t cbfn, void *cbarg); |
740 | |
741 | /* |
742 | * FC DIAG data structure |
743 | */ |
744 | struct bfa_fcdiag_qtest_s { |
745 | struct bfa_diag_qtest_result_s *result; |
746 | bfa_cb_diag_t cbfn; |
747 | void *cbarg; |
748 | struct bfa_timer_s timer; |
749 | u32 status; |
750 | u32 count; |
751 | u8 lock; |
752 | u8 queue; |
753 | u8 all; |
754 | u8 timer_active; |
755 | }; |
756 | |
757 | struct bfa_fcdiag_lb_s { |
758 | bfa_cb_diag_t cbfn; |
759 | void *cbarg; |
760 | void *result; |
761 | bfa_boolean_t lock; |
762 | u32 status; |
763 | }; |
764 | |
765 | /* |
766 | * BFA DPORT state machine events |
767 | */ |
768 | enum bfa_dport_sm_event { |
769 | BFA_DPORT_SM_ENABLE = 1, /* dport enable event */ |
770 | BFA_DPORT_SM_DISABLE = 2, /* dport disable event */ |
771 | BFA_DPORT_SM_FWRSP = 3, /* fw enable/disable rsp */ |
772 | BFA_DPORT_SM_QRESUME = 4, /* CQ space available */ |
773 | BFA_DPORT_SM_HWFAIL = 5, /* IOC h/w failure */ |
774 | BFA_DPORT_SM_START = 6, /* re-start dport test */ |
775 | BFA_DPORT_SM_REQFAIL = 7, /* request failure */ |
776 | BFA_DPORT_SM_SCN = 8, /* state change notify frm fw */ |
777 | }; |
778 | |
779 | struct bfa_dport_s; |
780 | typedef void (*bfa_dport_sm_t)(struct bfa_dport_s *, enum bfa_dport_sm_event); |
781 | |
782 | struct bfa_dport_s { |
783 | struct bfa_s *bfa; /* Back pointer to BFA */ |
784 | bfa_dport_sm_t sm; /* finite state machine */ |
785 | struct bfa_reqq_wait_s reqq_wait; |
786 | bfa_cb_diag_t cbfn; |
787 | void *cbarg; |
788 | union bfi_diag_dport_msg_u i2hmsg; |
789 | u8 test_state; /* enum dport_test_state */ |
790 | u8 dynamic; /* boolean_t */ |
791 | u8 rsvd[2]; |
792 | u32 lpcnt; |
793 | u32 payload; /* user defined payload pattern */ |
794 | wwn_t rp_pwwn; |
795 | wwn_t rp_nwwn; |
796 | struct bfa_diag_dport_result_s result; |
797 | }; |
798 | |
799 | struct bfa_fcdiag_s { |
800 | struct bfa_s *bfa; /* Back pointer to BFA */ |
801 | struct bfa_trc_mod_s *trcmod; |
802 | struct bfa_fcdiag_lb_s lb; |
803 | struct bfa_fcdiag_qtest_s qtest; |
804 | struct bfa_dport_s dport; |
805 | }; |
806 | |
807 | #define BFA_FCDIAG_MOD(__bfa) (&(__bfa)->modules.fcdiag) |
808 | |
809 | void bfa_fcdiag_intr(struct bfa_s *bfa, struct bfi_msg_s *msg); |
810 | |
811 | bfa_status_t bfa_fcdiag_loopback(struct bfa_s *bfa, |
812 | enum bfa_port_opmode opmode, |
813 | enum bfa_port_speed speed, u32 lpcnt, u32 pat, |
814 | struct bfa_diag_loopback_result_s *result, |
815 | bfa_cb_diag_t cbfn, void *cbarg); |
816 | bfa_status_t bfa_fcdiag_queuetest(struct bfa_s *bfa, u32 ignore, |
817 | u32 queue, struct bfa_diag_qtest_result_s *result, |
818 | bfa_cb_diag_t cbfn, void *cbarg); |
819 | bfa_status_t bfa_fcdiag_lb_is_running(struct bfa_s *bfa); |
820 | bfa_status_t bfa_dport_enable(struct bfa_s *bfa, u32 lpcnt, u32 pat, |
821 | bfa_cb_diag_t cbfn, void *cbarg); |
822 | bfa_status_t bfa_dport_disable(struct bfa_s *bfa, bfa_cb_diag_t cbfn, |
823 | void *cbarg); |
824 | bfa_status_t bfa_dport_start(struct bfa_s *bfa, u32 lpcnt, u32 pat, |
825 | bfa_cb_diag_t cbfn, void *cbarg); |
826 | bfa_status_t bfa_dport_show(struct bfa_s *bfa, |
827 | struct bfa_diag_dport_result_s *result); |
828 | |
829 | #endif /* __BFA_SVC_H__ */ |
830 | |