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