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