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 __BFI_MS_H__ |
12 | #define __BFI_MS_H__ |
13 | |
14 | #include "bfi.h" |
15 | #include "bfa_fc.h" |
16 | #include "bfa_defs_svc.h" |
17 | |
18 | #pragma pack(1) |
19 | |
20 | enum bfi_iocfc_h2i_msgs { |
21 | BFI_IOCFC_H2I_CFG_REQ = 1, |
22 | BFI_IOCFC_H2I_SET_INTR_REQ = 2, |
23 | BFI_IOCFC_H2I_UPDATEQ_REQ = 3, |
24 | BFI_IOCFC_H2I_FAA_QUERY_REQ = 4, |
25 | BFI_IOCFC_H2I_ADDR_REQ = 5, |
26 | }; |
27 | |
28 | enum bfi_iocfc_i2h_msgs { |
29 | BFI_IOCFC_I2H_CFG_REPLY = BFA_I2HM(1), |
30 | BFI_IOCFC_I2H_UPDATEQ_RSP = BFA_I2HM(3), |
31 | BFI_IOCFC_I2H_FAA_QUERY_RSP = BFA_I2HM(4), |
32 | BFI_IOCFC_I2H_ADDR_MSG = BFA_I2HM(5), |
33 | }; |
34 | |
35 | struct bfi_iocfc_cfg_s { |
36 | u8 num_cqs; /* Number of CQs to be used */ |
37 | u8 sense_buf_len; /* SCSI sense length */ |
38 | u16 rsvd_1; |
39 | u32 endian_sig; /* endian signature of host */ |
40 | u8 rsvd_2; |
41 | u8 single_msix_vec; |
42 | u8 rsvd[2]; |
43 | __be16 num_ioim_reqs; |
44 | __be16 num_fwtio_reqs; |
45 | |
46 | |
47 | /* |
48 | * Request and response circular queue base addresses, size and |
49 | * shadow index pointers. |
50 | */ |
51 | union bfi_addr_u req_cq_ba[BFI_IOC_MAX_CQS]; |
52 | union bfi_addr_u req_shadow_ci[BFI_IOC_MAX_CQS]; |
53 | __be16 req_cq_elems[BFI_IOC_MAX_CQS]; |
54 | union bfi_addr_u rsp_cq_ba[BFI_IOC_MAX_CQS]; |
55 | union bfi_addr_u rsp_shadow_pi[BFI_IOC_MAX_CQS]; |
56 | __be16 rsp_cq_elems[BFI_IOC_MAX_CQS]; |
57 | |
58 | union bfi_addr_u stats_addr; /* DMA-able address for stats */ |
59 | union bfi_addr_u cfgrsp_addr; /* config response dma address */ |
60 | union bfi_addr_u ioim_snsbase[BFI_IOIM_SNSBUF_SEGS]; |
61 | /* IO sense buf base addr segments */ |
62 | struct bfa_iocfc_intr_attr_s intr_attr; /* IOC interrupt attributes */ |
63 | }; |
64 | |
65 | /* |
66 | * Boot target wwn information for this port. This contains either the stored |
67 | * or discovered boot target port wwns for the port. |
68 | */ |
69 | struct bfi_iocfc_bootwwns { |
70 | wwn_t wwn[BFA_BOOT_BOOTLUN_MAX]; |
71 | u8 nwwns; |
72 | u8 rsvd[7]; |
73 | }; |
74 | |
75 | /** |
76 | * Queue configuration response from firmware |
77 | */ |
78 | struct bfi_iocfc_qreg_s { |
79 | u32 cpe_q_ci_off[BFI_IOC_MAX_CQS]; |
80 | u32 cpe_q_pi_off[BFI_IOC_MAX_CQS]; |
81 | u32 cpe_qctl_off[BFI_IOC_MAX_CQS]; |
82 | u32 rme_q_ci_off[BFI_IOC_MAX_CQS]; |
83 | u32 rme_q_pi_off[BFI_IOC_MAX_CQS]; |
84 | u32 rme_qctl_off[BFI_IOC_MAX_CQS]; |
85 | u8 hw_qid[BFI_IOC_MAX_CQS]; |
86 | }; |
87 | |
88 | struct bfi_iocfc_cfgrsp_s { |
89 | struct bfa_iocfc_fwcfg_s fwcfg; |
90 | struct bfa_iocfc_intr_attr_s intr_attr; |
91 | struct bfi_iocfc_bootwwns bootwwns; |
92 | struct bfi_pbc_s pbc_cfg; |
93 | struct bfi_iocfc_qreg_s qreg; |
94 | }; |
95 | |
96 | /* |
97 | * BFI_IOCFC_H2I_CFG_REQ message |
98 | */ |
99 | struct bfi_iocfc_cfg_req_s { |
100 | struct bfi_mhdr_s mh; |
101 | union bfi_addr_u ioc_cfg_dma_addr; |
102 | }; |
103 | |
104 | |
105 | /* |
106 | * BFI_IOCFC_I2H_CFG_REPLY message |
107 | */ |
108 | struct bfi_iocfc_cfg_reply_s { |
109 | struct bfi_mhdr_s mh; /* Common msg header */ |
110 | u8 cfg_success; /* cfg reply status */ |
111 | u8 lpu_bm; /* LPUs assigned for this IOC */ |
112 | u8 rsvd[2]; |
113 | }; |
114 | |
115 | |
116 | /* |
117 | * BFI_IOCFC_H2I_SET_INTR_REQ message |
118 | */ |
119 | struct bfi_iocfc_set_intr_req_s { |
120 | struct bfi_mhdr_s mh; /* common msg header */ |
121 | u8 coalesce; /* enable intr coalescing */ |
122 | u8 rsvd[3]; |
123 | __be16 delay; /* delay timer 0..1125us */ |
124 | __be16 latency; /* latency timer 0..225us */ |
125 | }; |
126 | |
127 | |
128 | /* |
129 | * BFI_IOCFC_H2I_UPDATEQ_REQ message |
130 | */ |
131 | struct bfi_iocfc_updateq_req_s { |
132 | struct bfi_mhdr_s mh; /* common msg header */ |
133 | u32 reqq_ba; /* reqq base addr */ |
134 | u32 rspq_ba; /* rspq base addr */ |
135 | u32 reqq_sci; /* reqq shadow ci */ |
136 | u32 rspq_spi; /* rspq shadow pi */ |
137 | }; |
138 | |
139 | |
140 | /* |
141 | * BFI_IOCFC_I2H_UPDATEQ_RSP message |
142 | */ |
143 | struct bfi_iocfc_updateq_rsp_s { |
144 | struct bfi_mhdr_s mh; /* common msg header */ |
145 | u8 status; /* updateq status */ |
146 | u8 rsvd[3]; |
147 | }; |
148 | |
149 | |
150 | /* |
151 | * H2I Messages |
152 | */ |
153 | union bfi_iocfc_h2i_msg_u { |
154 | struct bfi_mhdr_s mh; |
155 | struct bfi_iocfc_cfg_req_s cfg_req; |
156 | struct bfi_iocfc_updateq_req_s updateq_req; |
157 | u32 mboxmsg[BFI_IOC_MSGSZ]; |
158 | }; |
159 | |
160 | |
161 | /* |
162 | * I2H Messages |
163 | */ |
164 | union bfi_iocfc_i2h_msg_u { |
165 | struct bfi_mhdr_s mh; |
166 | struct bfi_iocfc_cfg_reply_s cfg_reply; |
167 | struct bfi_iocfc_updateq_rsp_s updateq_rsp; |
168 | u32 mboxmsg[BFI_IOC_MSGSZ]; |
169 | }; |
170 | |
171 | /* |
172 | * BFI_IOCFC_H2I_FAA_ENABLE_REQ BFI_IOCFC_H2I_FAA_DISABLE_REQ message |
173 | */ |
174 | struct bfi_faa_en_dis_s { |
175 | struct bfi_mhdr_s mh; /* common msg header */ |
176 | }; |
177 | |
178 | struct bfi_faa_addr_msg_s { |
179 | struct bfi_mhdr_s mh; /* common msg header */ |
180 | u8 rsvd[4]; |
181 | wwn_t pwwn; /* Fabric acquired PWWN */ |
182 | wwn_t nwwn; /* Fabric acquired PWWN */ |
183 | }; |
184 | |
185 | /* |
186 | * BFI_IOCFC_H2I_FAA_QUERY_REQ message |
187 | */ |
188 | struct bfi_faa_query_s { |
189 | struct bfi_mhdr_s mh; /* common msg header */ |
190 | u8 faa_status; /* FAA status */ |
191 | u8 addr_source; /* PWWN source */ |
192 | u8 rsvd[2]; |
193 | wwn_t faa; /* Fabric acquired PWWN */ |
194 | }; |
195 | |
196 | /* |
197 | * BFI_IOCFC_I2H_FAA_ENABLE_RSP, BFI_IOCFC_I2H_FAA_DISABLE_RSP message |
198 | */ |
199 | struct bfi_faa_en_dis_rsp_s { |
200 | struct bfi_mhdr_s mh; /* common msg header */ |
201 | u8 status; /* updateq status */ |
202 | u8 rsvd[3]; |
203 | }; |
204 | |
205 | /* |
206 | * BFI_IOCFC_I2H_FAA_QUERY_RSP message |
207 | */ |
208 | #define bfi_faa_query_rsp_t struct bfi_faa_query_s |
209 | |
210 | enum bfi_fcport_h2i { |
211 | BFI_FCPORT_H2I_ENABLE_REQ = (1), |
212 | BFI_FCPORT_H2I_DISABLE_REQ = (2), |
213 | BFI_FCPORT_H2I_SET_SVC_PARAMS_REQ = (3), |
214 | BFI_FCPORT_H2I_STATS_GET_REQ = (4), |
215 | BFI_FCPORT_H2I_STATS_CLEAR_REQ = (5), |
216 | }; |
217 | |
218 | |
219 | enum bfi_fcport_i2h { |
220 | BFI_FCPORT_I2H_ENABLE_RSP = BFA_I2HM(1), |
221 | BFI_FCPORT_I2H_DISABLE_RSP = BFA_I2HM(2), |
222 | BFI_FCPORT_I2H_SET_SVC_PARAMS_RSP = BFA_I2HM(3), |
223 | BFI_FCPORT_I2H_STATS_GET_RSP = BFA_I2HM(4), |
224 | BFI_FCPORT_I2H_STATS_CLEAR_RSP = BFA_I2HM(5), |
225 | BFI_FCPORT_I2H_EVENT = BFA_I2HM(6), |
226 | BFI_FCPORT_I2H_TRUNK_SCN = BFA_I2HM(7), |
227 | BFI_FCPORT_I2H_ENABLE_AEN = BFA_I2HM(8), |
228 | BFI_FCPORT_I2H_DISABLE_AEN = BFA_I2HM(9), |
229 | }; |
230 | |
231 | |
232 | /* |
233 | * Generic REQ type |
234 | */ |
235 | struct bfi_fcport_req_s { |
236 | struct bfi_mhdr_s mh; /* msg header */ |
237 | u32 msgtag; /* msgtag for reply */ |
238 | }; |
239 | |
240 | /* |
241 | * Generic RSP type |
242 | */ |
243 | struct bfi_fcport_rsp_s { |
244 | struct bfi_mhdr_s mh; /* common msg header */ |
245 | u8 status; /* port enable status */ |
246 | u8 rsvd[3]; |
247 | struct bfa_port_cfg_s port_cfg;/* port configuration */ |
248 | u32 msgtag; /* msgtag for reply */ |
249 | }; |
250 | |
251 | /* |
252 | * BFI_FCPORT_H2I_ENABLE_REQ |
253 | */ |
254 | struct bfi_fcport_enable_req_s { |
255 | struct bfi_mhdr_s mh; /* msg header */ |
256 | u32 rsvd1; |
257 | wwn_t nwwn; /* node wwn of physical port */ |
258 | wwn_t pwwn; /* port wwn of physical port */ |
259 | struct bfa_port_cfg_s port_cfg; /* port configuration */ |
260 | union bfi_addr_u stats_dma_addr; /* DMA address for stats */ |
261 | u32 msgtag; /* msgtag for reply */ |
262 | u8 use_flash_cfg; /* get prot cfg from flash */ |
263 | u8 rsvd2[3]; |
264 | }; |
265 | |
266 | /* |
267 | * BFI_FCPORT_H2I_SET_SVC_PARAMS_REQ |
268 | */ |
269 | struct bfi_fcport_set_svc_params_req_s { |
270 | struct bfi_mhdr_s mh; /* msg header */ |
271 | __be16 tx_bbcredit; /* Tx credits */ |
272 | u8 rsvd[2]; |
273 | }; |
274 | |
275 | /* |
276 | * BFI_FCPORT_I2H_EVENT |
277 | */ |
278 | struct bfi_fcport_event_s { |
279 | struct bfi_mhdr_s mh; /* common msg header */ |
280 | struct bfa_port_link_s link_state; |
281 | }; |
282 | |
283 | /* |
284 | * BFI_FCPORT_I2H_TRUNK_SCN |
285 | */ |
286 | struct bfi_fcport_trunk_link_s { |
287 | wwn_t trunk_wwn; |
288 | u8 fctl; /* bfa_trunk_link_fctl_t */ |
289 | u8 state; /* bfa_trunk_link_state_t */ |
290 | u8 speed; /* bfa_port_speed_t */ |
291 | u8 rsvd; |
292 | __be32 deskew; |
293 | }; |
294 | |
295 | #define BFI_FCPORT_MAX_LINKS 2 |
296 | struct bfi_fcport_trunk_scn_s { |
297 | struct bfi_mhdr_s mh; |
298 | u8 trunk_state; /* bfa_trunk_state_t */ |
299 | u8 trunk_speed; /* bfa_port_speed_t */ |
300 | u8 rsvd_a[2]; |
301 | struct bfi_fcport_trunk_link_s tlink[BFI_FCPORT_MAX_LINKS]; |
302 | }; |
303 | |
304 | /* |
305 | * fcport H2I message |
306 | */ |
307 | union bfi_fcport_h2i_msg_u { |
308 | struct bfi_mhdr_s *mhdr; |
309 | struct bfi_fcport_enable_req_s *penable; |
310 | struct bfi_fcport_req_s *pdisable; |
311 | struct bfi_fcport_set_svc_params_req_s *psetsvcparams; |
312 | struct bfi_fcport_req_s *pstatsget; |
313 | struct bfi_fcport_req_s *pstatsclear; |
314 | }; |
315 | |
316 | /* |
317 | * fcport I2H message |
318 | */ |
319 | union bfi_fcport_i2h_msg_u { |
320 | struct bfi_msg_s *msg; |
321 | struct bfi_fcport_rsp_s *penable_rsp; |
322 | struct bfi_fcport_rsp_s *pdisable_rsp; |
323 | struct bfi_fcport_rsp_s *psetsvcparams_rsp; |
324 | struct bfi_fcport_rsp_s *pstatsget_rsp; |
325 | struct bfi_fcport_rsp_s *pstatsclear_rsp; |
326 | struct bfi_fcport_event_s *event; |
327 | struct bfi_fcport_trunk_scn_s *trunk_scn; |
328 | }; |
329 | |
330 | enum bfi_fcxp_h2i { |
331 | BFI_FCXP_H2I_SEND_REQ = 1, |
332 | }; |
333 | |
334 | enum bfi_fcxp_i2h { |
335 | BFI_FCXP_I2H_SEND_RSP = BFA_I2HM(1), |
336 | }; |
337 | |
338 | #define BFA_FCXP_MAX_SGES 2 |
339 | |
340 | /* |
341 | * FCXP send request structure |
342 | */ |
343 | struct bfi_fcxp_send_req_s { |
344 | struct bfi_mhdr_s mh; /* Common msg header */ |
345 | __be16 fcxp_tag; /* driver request tag */ |
346 | __be16 max_frmsz; /* max send frame size */ |
347 | __be16 vf_id; /* vsan tag if applicable */ |
348 | u16 rport_fw_hndl; /* FW Handle for the remote port */ |
349 | u8 class; /* FC class used for req/rsp */ |
350 | u8 rsp_timeout; /* timeout in secs, 0-no response */ |
351 | u8 cts; /* continue sequence */ |
352 | u8 lp_fwtag; /* lport tag */ |
353 | struct fchs_s fchs; /* request FC header structure */ |
354 | __be32 req_len; /* request payload length */ |
355 | __be32 rsp_maxlen; /* max response length expected */ |
356 | struct bfi_alen_s req_alen; /* request buffer */ |
357 | struct bfi_alen_s rsp_alen; /* response buffer */ |
358 | }; |
359 | |
360 | /* |
361 | * FCXP send response structure |
362 | */ |
363 | struct bfi_fcxp_send_rsp_s { |
364 | struct bfi_mhdr_s mh; /* Common msg header */ |
365 | __be16 fcxp_tag; /* send request tag */ |
366 | u8 req_status; /* request status */ |
367 | u8 rsvd; |
368 | __be32 rsp_len; /* actual response length */ |
369 | __be32 residue_len; /* residual response length */ |
370 | struct fchs_s fchs; /* response FC header structure */ |
371 | }; |
372 | |
373 | enum bfi_uf_h2i { |
374 | BFI_UF_H2I_BUF_POST = 1, |
375 | }; |
376 | |
377 | enum bfi_uf_i2h { |
378 | BFI_UF_I2H_FRM_RCVD = BFA_I2HM(1), |
379 | }; |
380 | |
381 | #define BFA_UF_MAX_SGES 2 |
382 | |
383 | struct bfi_uf_buf_post_s { |
384 | struct bfi_mhdr_s mh; /* Common msg header */ |
385 | u16 buf_tag; /* buffer tag */ |
386 | __be16 buf_len; /* total buffer length */ |
387 | struct bfi_alen_s alen; /* buffer address/len pair */ |
388 | }; |
389 | |
390 | struct bfi_uf_frm_rcvd_s { |
391 | struct bfi_mhdr_s mh; /* Common msg header */ |
392 | u16 buf_tag; /* buffer tag */ |
393 | u16 rsvd; |
394 | u16 frm_len; /* received frame length */ |
395 | u16 xfr_len; /* tranferred length */ |
396 | }; |
397 | |
398 | enum bfi_lps_h2i_msgs { |
399 | BFI_LPS_H2I_LOGIN_REQ = 1, |
400 | BFI_LPS_H2I_LOGOUT_REQ = 2, |
401 | BFI_LPS_H2I_N2N_PID_REQ = 3, |
402 | }; |
403 | |
404 | enum bfi_lps_i2h_msgs { |
405 | BFI_LPS_I2H_LOGIN_RSP = BFA_I2HM(1), |
406 | BFI_LPS_I2H_LOGOUT_RSP = BFA_I2HM(2), |
407 | BFI_LPS_I2H_CVL_EVENT = BFA_I2HM(3), |
408 | }; |
409 | |
410 | struct bfi_lps_login_req_s { |
411 | struct bfi_mhdr_s mh; /* common msg header */ |
412 | u8 bfa_tag; |
413 | u8 alpa; |
414 | __be16 pdu_size; |
415 | wwn_t pwwn; |
416 | wwn_t nwwn; |
417 | u8 fdisc; |
418 | u8 auth_en; |
419 | u8 lps_role; |
420 | u8 bb_scn; |
421 | u32 vvl_flag; |
422 | }; |
423 | |
424 | struct bfi_lps_login_rsp_s { |
425 | struct bfi_mhdr_s mh; /* common msg header */ |
426 | u8 fw_tag; |
427 | u8 status; |
428 | u8 lsrjt_rsn; |
429 | u8 lsrjt_expl; |
430 | wwn_t port_name; |
431 | wwn_t node_name; |
432 | __be16 bb_credit; |
433 | u8 f_port; |
434 | u8 npiv_en; |
435 | u32 lp_pid:24; |
436 | u32 auth_req:8; |
437 | mac_t lp_mac; |
438 | mac_t fcf_mac; |
439 | u8 ext_status; |
440 | u8 brcd_switch; /* attached peer is brcd switch */ |
441 | u8 bfa_tag; |
442 | u8 rsvd; |
443 | }; |
444 | |
445 | struct bfi_lps_logout_req_s { |
446 | struct bfi_mhdr_s mh; /* common msg header */ |
447 | u8 fw_tag; |
448 | u8 rsvd[3]; |
449 | wwn_t port_name; |
450 | }; |
451 | |
452 | struct bfi_lps_logout_rsp_s { |
453 | struct bfi_mhdr_s mh; /* common msg header */ |
454 | u8 bfa_tag; |
455 | u8 status; |
456 | u8 rsvd[2]; |
457 | }; |
458 | |
459 | struct bfi_lps_cvl_event_s { |
460 | struct bfi_mhdr_s mh; /* common msg header */ |
461 | u8 bfa_tag; |
462 | u8 rsvd[3]; |
463 | }; |
464 | |
465 | struct bfi_lps_n2n_pid_req_s { |
466 | struct bfi_mhdr_s mh; /* common msg header */ |
467 | u8 fw_tag; |
468 | u32 lp_pid:24; |
469 | }; |
470 | |
471 | union bfi_lps_h2i_msg_u { |
472 | struct bfi_mhdr_s *msg; |
473 | struct bfi_lps_login_req_s *login_req; |
474 | struct bfi_lps_logout_req_s *logout_req; |
475 | struct bfi_lps_n2n_pid_req_s *n2n_pid_req; |
476 | }; |
477 | |
478 | union bfi_lps_i2h_msg_u { |
479 | struct bfi_msg_s *msg; |
480 | struct bfi_lps_login_rsp_s *login_rsp; |
481 | struct bfi_lps_logout_rsp_s *logout_rsp; |
482 | struct bfi_lps_cvl_event_s *cvl_event; |
483 | }; |
484 | |
485 | enum bfi_rport_h2i_msgs { |
486 | BFI_RPORT_H2I_CREATE_REQ = 1, |
487 | BFI_RPORT_H2I_DELETE_REQ = 2, |
488 | BFI_RPORT_H2I_SET_SPEED_REQ = 3, |
489 | }; |
490 | |
491 | enum bfi_rport_i2h_msgs { |
492 | BFI_RPORT_I2H_CREATE_RSP = BFA_I2HM(1), |
493 | BFI_RPORT_I2H_DELETE_RSP = BFA_I2HM(2), |
494 | BFI_RPORT_I2H_QOS_SCN = BFA_I2HM(3), |
495 | BFI_RPORT_I2H_LIP_SCN_ONLINE = BFA_I2HM(4), |
496 | BFI_RPORT_I2H_LIP_SCN_OFFLINE = BFA_I2HM(5), |
497 | BFI_RPORT_I2H_NO_DEV = BFA_I2HM(6), |
498 | }; |
499 | |
500 | struct bfi_rport_create_req_s { |
501 | struct bfi_mhdr_s mh; /* common msg header */ |
502 | u16 bfa_handle; /* host rport handle */ |
503 | __be16 max_frmsz; /* max rcv pdu size */ |
504 | u32 pid:24, /* remote port ID */ |
505 | lp_fwtag:8; /* local port tag */ |
506 | u32 local_pid:24, /* local port ID */ |
507 | cisc:8; |
508 | u8 fc_class; /* supported FC classes */ |
509 | u8 vf_en; /* virtual fabric enable */ |
510 | u16 vf_id; /* virtual fabric ID */ |
511 | }; |
512 | |
513 | struct bfi_rport_create_rsp_s { |
514 | struct bfi_mhdr_s mh; /* common msg header */ |
515 | u8 status; /* rport creation status */ |
516 | u8 rsvd[3]; |
517 | u16 bfa_handle; /* host rport handle */ |
518 | u16 fw_handle; /* firmware rport handle */ |
519 | struct bfa_rport_qos_attr_s qos_attr; /* QoS Attributes */ |
520 | }; |
521 | |
522 | struct bfa_rport_speed_req_s { |
523 | struct bfi_mhdr_s mh; /* common msg header */ |
524 | u16 fw_handle; /* firmware rport handle */ |
525 | u8 speed; /* rport's speed via RPSC */ |
526 | u8 rsvd; |
527 | }; |
528 | |
529 | struct bfi_rport_delete_req_s { |
530 | struct bfi_mhdr_s mh; /* common msg header */ |
531 | u16 fw_handle; /* firmware rport handle */ |
532 | u16 rsvd; |
533 | }; |
534 | |
535 | struct bfi_rport_delete_rsp_s { |
536 | struct bfi_mhdr_s mh; /* common msg header */ |
537 | u16 bfa_handle; /* host rport handle */ |
538 | u8 status; /* rport deletion status */ |
539 | u8 rsvd; |
540 | }; |
541 | |
542 | struct bfi_rport_qos_scn_s { |
543 | struct bfi_mhdr_s mh; /* common msg header */ |
544 | u16 bfa_handle; /* host rport handle */ |
545 | u16 rsvd; |
546 | struct bfa_rport_qos_attr_s old_qos_attr; /* Old QoS Attributes */ |
547 | struct bfa_rport_qos_attr_s new_qos_attr; /* New QoS Attributes */ |
548 | }; |
549 | |
550 | struct bfi_rport_lip_scn_s { |
551 | struct bfi_mhdr_s mh; /*!< common msg header */ |
552 | u16 bfa_handle; /*!< host rport handle */ |
553 | u8 status; /*!< scn online status */ |
554 | u8 rsvd; |
555 | struct bfa_fcport_loop_info_s loop_info; |
556 | }; |
557 | |
558 | union bfi_rport_h2i_msg_u { |
559 | struct bfi_msg_s *msg; |
560 | struct bfi_rport_create_req_s *create_req; |
561 | struct bfi_rport_delete_req_s *delete_req; |
562 | struct bfi_rport_speed_req_s *speed_req; |
563 | }; |
564 | |
565 | union bfi_rport_i2h_msg_u { |
566 | struct bfi_msg_s *msg; |
567 | struct bfi_rport_create_rsp_s *create_rsp; |
568 | struct bfi_rport_delete_rsp_s *delete_rsp; |
569 | struct bfi_rport_qos_scn_s *qos_scn_evt; |
570 | struct bfi_rport_lip_scn_s *lip_scn; |
571 | }; |
572 | |
573 | /* |
574 | * Initiator mode I-T nexus interface defines. |
575 | */ |
576 | |
577 | enum bfi_itn_h2i { |
578 | BFI_ITN_H2I_CREATE_REQ = 1, /* i-t nexus creation */ |
579 | BFI_ITN_H2I_DELETE_REQ = 2, /* i-t nexus deletion */ |
580 | }; |
581 | |
582 | enum bfi_itn_i2h { |
583 | BFI_ITN_I2H_CREATE_RSP = BFA_I2HM(1), |
584 | BFI_ITN_I2H_DELETE_RSP = BFA_I2HM(2), |
585 | BFI_ITN_I2H_SLER_EVENT = BFA_I2HM(3), |
586 | }; |
587 | |
588 | struct bfi_itn_create_req_s { |
589 | struct bfi_mhdr_s mh; /* common msg header */ |
590 | u16 fw_handle; /* f/w handle for itnim */ |
591 | u8 class; /* FC class for IO */ |
592 | u8 seq_rec; /* sequence recovery support */ |
593 | u8 msg_no; /* seq id of the msg */ |
594 | u8 role; |
595 | }; |
596 | |
597 | struct bfi_itn_create_rsp_s { |
598 | struct bfi_mhdr_s mh; /* common msg header */ |
599 | u16 bfa_handle; /* bfa handle for itnim */ |
600 | u8 status; /* fcp request status */ |
601 | u8 seq_id; /* seq id of the msg */ |
602 | }; |
603 | |
604 | struct bfi_itn_delete_req_s { |
605 | struct bfi_mhdr_s mh; /* common msg header */ |
606 | u16 fw_handle; /* f/w itnim handle */ |
607 | u8 seq_id; /* seq id of the msg */ |
608 | u8 rsvd; |
609 | }; |
610 | |
611 | struct bfi_itn_delete_rsp_s { |
612 | struct bfi_mhdr_s mh; /* common msg header */ |
613 | u16 bfa_handle; /* bfa handle for itnim */ |
614 | u8 status; /* fcp request status */ |
615 | u8 seq_id; /* seq id of the msg */ |
616 | }; |
617 | |
618 | struct bfi_itn_sler_event_s { |
619 | struct bfi_mhdr_s mh; /* common msg header */ |
620 | u16 bfa_handle; /* bfa handle for itnim */ |
621 | u16 rsvd; |
622 | }; |
623 | |
624 | union bfi_itn_h2i_msg_u { |
625 | struct bfi_itn_create_req_s *create_req; |
626 | struct bfi_itn_delete_req_s *delete_req; |
627 | struct bfi_msg_s *msg; |
628 | }; |
629 | |
630 | union bfi_itn_i2h_msg_u { |
631 | struct bfi_itn_create_rsp_s *create_rsp; |
632 | struct bfi_itn_delete_rsp_s *delete_rsp; |
633 | struct bfi_itn_sler_event_s *sler_event; |
634 | struct bfi_msg_s *msg; |
635 | }; |
636 | |
637 | /* |
638 | * Initiator mode IO interface defines. |
639 | */ |
640 | |
641 | enum bfi_ioim_h2i { |
642 | BFI_IOIM_H2I_IOABORT_REQ = 1, /* IO abort request */ |
643 | BFI_IOIM_H2I_IOCLEANUP_REQ = 2, /* IO cleanup request */ |
644 | }; |
645 | |
646 | enum bfi_ioim_i2h { |
647 | BFI_IOIM_I2H_IO_RSP = BFA_I2HM(1), /* non-fp IO response */ |
648 | BFI_IOIM_I2H_IOABORT_RSP = BFA_I2HM(2), /* ABORT rsp */ |
649 | }; |
650 | |
651 | /* |
652 | * IO command DIF info |
653 | */ |
654 | struct bfi_ioim_dif_s { |
655 | u32 dif_info[4]; |
656 | }; |
657 | |
658 | /* |
659 | * FCP IO messages overview |
660 | * |
661 | * @note |
662 | * - Max CDB length supported is 64 bytes. |
663 | * - SCSI Linked commands and SCSI bi-directional Commands not |
664 | * supported. |
665 | * |
666 | */ |
667 | struct bfi_ioim_req_s { |
668 | struct bfi_mhdr_s mh; /* Common msg header */ |
669 | __be16 io_tag; /* I/O tag */ |
670 | u16 rport_hdl; /* itnim/rport firmware handle */ |
671 | struct fcp_cmnd_s cmnd; /* IO request info */ |
672 | |
673 | /* |
674 | * SG elements array within the IO request must be double word |
675 | * aligned. This alignment is required to optimize SGM setup for the IO. |
676 | */ |
677 | struct bfi_sge_s sges[BFI_SGE_INLINE_MAX]; |
678 | u8 io_timeout; |
679 | u8 dif_en; |
680 | u8 rsvd_a[2]; |
681 | struct bfi_ioim_dif_s dif; |
682 | }; |
683 | |
684 | /* |
685 | * This table shows various IO status codes from firmware and their |
686 | * meaning. Host driver can use these status codes to further process |
687 | * IO completions. |
688 | * |
689 | * BFI_IOIM_STS_OK : IO completed with error free SCSI & |
690 | * transport status. |
691 | * io-tag can be reused. |
692 | * |
693 | * BFA_IOIM_STS_SCSI_ERR : IO completed with scsi error. |
694 | * - io-tag can be reused. |
695 | * |
696 | * BFI_IOIM_STS_HOST_ABORTED : IO was aborted successfully due to |
697 | * host request. |
698 | * - io-tag cannot be reused yet. |
699 | * |
700 | * BFI_IOIM_STS_ABORTED : IO was aborted successfully |
701 | * internally by f/w. |
702 | * - io-tag cannot be reused yet. |
703 | * |
704 | * BFI_IOIM_STS_TIMEDOUT : IO timedout and ABTS/RRQ is happening |
705 | * in the firmware and |
706 | * - io-tag cannot be reused yet. |
707 | * |
708 | * BFI_IOIM_STS_SQER_NEEDED : Firmware could not recover the IO |
709 | * with sequence level error |
710 | * logic and hence host needs to retry |
711 | * this IO with a different IO tag |
712 | * - io-tag cannot be used yet. |
713 | * |
714 | * BFI_IOIM_STS_NEXUS_ABORT : Second Level Error Recovery from host |
715 | * is required because 2 consecutive ABTS |
716 | * timedout and host needs logout and |
717 | * re-login with the target |
718 | * - io-tag cannot be used yet. |
719 | * |
720 | * BFI_IOIM_STS_UNDERRUN : IO completed with SCSI status good, |
721 | * but the data tranferred is less than |
722 | * the fcp data length in the command. |
723 | * ex. SCSI INQUIRY where transferred |
724 | * data length and residue count in FCP |
725 | * response accounts for total fcp-dl |
726 | * - io-tag can be reused. |
727 | * |
728 | * BFI_IOIM_STS_OVERRUN : IO completed with SCSI status good, |
729 | * but the data transerred is more than |
730 | * fcp data length in the command. ex. |
731 | * TAPE IOs where blocks can of unequal |
732 | * lengths. |
733 | * - io-tag can be reused. |
734 | * |
735 | * BFI_IOIM_STS_RES_FREE : Firmware has completed using io-tag |
736 | * during abort process |
737 | * - io-tag can be reused. |
738 | * |
739 | * BFI_IOIM_STS_PROTO_ERR : Firmware detected a protocol error. |
740 | * ex target sent more data than |
741 | * requested, or there was data frame |
742 | * loss and other reasons |
743 | * - io-tag cannot be used yet. |
744 | * |
745 | * BFI_IOIM_STS_DIF_ERR : Firwmare detected DIF error. ex: DIF |
746 | * CRC err or Ref Tag err or App tag err. |
747 | * - io-tag can be reused. |
748 | * |
749 | * BFA_IOIM_STS_TSK_MGT_ABORT : IO was aborted because of Task |
750 | * Management command from the host |
751 | * - io-tag can be reused. |
752 | * |
753 | * BFI_IOIM_STS_UTAG : Firmware does not know about this |
754 | * io_tag. |
755 | * - io-tag can be reused. |
756 | */ |
757 | enum bfi_ioim_status { |
758 | BFI_IOIM_STS_OK = 0, |
759 | BFI_IOIM_STS_HOST_ABORTED = 1, |
760 | BFI_IOIM_STS_ABORTED = 2, |
761 | BFI_IOIM_STS_TIMEDOUT = 3, |
762 | BFI_IOIM_STS_RES_FREE = 4, |
763 | BFI_IOIM_STS_SQER_NEEDED = 5, |
764 | BFI_IOIM_STS_PROTO_ERR = 6, |
765 | BFI_IOIM_STS_UTAG = 7, |
766 | BFI_IOIM_STS_PATHTOV = 8, |
767 | }; |
768 | |
769 | /* |
770 | * I/O response message |
771 | */ |
772 | struct bfi_ioim_rsp_s { |
773 | struct bfi_mhdr_s mh; /* common msg header */ |
774 | __be16 io_tag; /* completed IO tag */ |
775 | u16 bfa_rport_hndl; /* releated rport handle */ |
776 | u8 io_status; /* IO completion status */ |
777 | u8 reuse_io_tag; /* IO tag can be reused */ |
778 | u16 abort_tag; /* host abort request tag */ |
779 | u8 scsi_status; /* scsi status from target */ |
780 | u8 sns_len; /* scsi sense length */ |
781 | u8 resid_flags; /* IO residue flags */ |
782 | u8 rsvd_a; |
783 | __be32 residue; /* IO residual length in bytes */ |
784 | u32 rsvd_b[3]; |
785 | }; |
786 | |
787 | struct bfi_ioim_abort_req_s { |
788 | struct bfi_mhdr_s mh; /* Common msg header */ |
789 | __be16 io_tag; /* I/O tag */ |
790 | u16 abort_tag; /* unique request tag */ |
791 | }; |
792 | |
793 | /* |
794 | * Initiator mode task management command interface defines. |
795 | */ |
796 | |
797 | enum bfi_tskim_h2i { |
798 | BFI_TSKIM_H2I_TM_REQ = 1, /* task-mgmt command */ |
799 | BFI_TSKIM_H2I_ABORT_REQ = 2, /* task-mgmt command */ |
800 | }; |
801 | |
802 | enum bfi_tskim_i2h { |
803 | BFI_TSKIM_I2H_TM_RSP = BFA_I2HM(1), |
804 | }; |
805 | |
806 | struct bfi_tskim_req_s { |
807 | struct bfi_mhdr_s mh; /* Common msg header */ |
808 | __be16 tsk_tag; /* task management tag */ |
809 | u16 itn_fhdl; /* itn firmware handle */ |
810 | struct scsi_lun lun; /* LU number */ |
811 | u8 tm_flags; /* see enum fcp_tm_cmnd */ |
812 | u8 t_secs; /* Timeout value in seconds */ |
813 | u8 rsvd[2]; |
814 | }; |
815 | |
816 | struct bfi_tskim_abortreq_s { |
817 | struct bfi_mhdr_s mh; /* Common msg header */ |
818 | __be16 tsk_tag; /* task management tag */ |
819 | u16 rsvd; |
820 | }; |
821 | |
822 | enum bfi_tskim_status { |
823 | /* |
824 | * Following are FCP-4 spec defined status codes, |
825 | * **DO NOT CHANGE THEM ** |
826 | */ |
827 | BFI_TSKIM_STS_OK = 0, |
828 | BFI_TSKIM_STS_NOT_SUPP = 4, |
829 | BFI_TSKIM_STS_FAILED = 5, |
830 | |
831 | /* |
832 | * Defined by BFA |
833 | */ |
834 | BFI_TSKIM_STS_TIMEOUT = 10, /* TM request timedout */ |
835 | BFI_TSKIM_STS_ABORTED = 11, /* Aborted on host request */ |
836 | BFI_TSKIM_STS_UTAG = 12, /* unknown tag for request */ |
837 | }; |
838 | |
839 | struct bfi_tskim_rsp_s { |
840 | struct bfi_mhdr_s mh; /* Common msg header */ |
841 | __be16 tsk_tag; /* task mgmt cmnd tag */ |
842 | u8 tsk_status; /* @ref bfi_tskim_status */ |
843 | u8 rsvd; |
844 | }; |
845 | |
846 | #pragma pack() |
847 | |
848 | /* |
849 | * Crossbow PCI MSI-X vector defines |
850 | */ |
851 | enum { |
852 | BFI_MSIX_CPE_QMIN_CB = 0, |
853 | BFI_MSIX_CPE_QMAX_CB = 7, |
854 | BFI_MSIX_RME_QMIN_CB = 8, |
855 | BFI_MSIX_RME_QMAX_CB = 15, |
856 | BFI_MSIX_CB_MAX = 22, |
857 | }; |
858 | |
859 | /* |
860 | * Catapult FC PCI MSI-X vector defines |
861 | */ |
862 | enum { |
863 | BFI_MSIX_LPU_ERR_CT = 0, |
864 | BFI_MSIX_CPE_QMIN_CT = 1, |
865 | BFI_MSIX_CPE_QMAX_CT = 4, |
866 | BFI_MSIX_RME_QMIN_CT = 5, |
867 | BFI_MSIX_RME_QMAX_CT = 8, |
868 | BFI_MSIX_CT_MAX = 9, |
869 | }; |
870 | |
871 | #endif /* __BFI_MS_H__ */ |
872 | |