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