xref: /OK3568_Linux_fs/kernel/drivers/net/ethernet/brocade/bna/bfi.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-only */
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun  * Linux network driver for QLogic BR-series Converged Network Adapter.
4*4882a593Smuzhiyun  */
5*4882a593Smuzhiyun /*
6*4882a593Smuzhiyun  * Copyright (c) 2005-2014 Brocade Communications Systems, Inc.
7*4882a593Smuzhiyun  * Copyright (c) 2014-2015 QLogic Corporation
8*4882a593Smuzhiyun  * All rights reserved
9*4882a593Smuzhiyun  * www.qlogic.com
10*4882a593Smuzhiyun  */
11*4882a593Smuzhiyun #ifndef __BFI_H__
12*4882a593Smuzhiyun #define __BFI_H__
13*4882a593Smuzhiyun 
14*4882a593Smuzhiyun #include "bfa_defs.h"
15*4882a593Smuzhiyun 
16*4882a593Smuzhiyun /* BFI FW image type */
17*4882a593Smuzhiyun #define	BFI_FLASH_CHUNK_SZ			256	/*!< Flash chunk size */
18*4882a593Smuzhiyun #define	BFI_FLASH_CHUNK_SZ_WORDS	(BFI_FLASH_CHUNK_SZ/sizeof(u32))
19*4882a593Smuzhiyun #define BFI_FLASH_IMAGE_SZ		0x100000
20*4882a593Smuzhiyun 
21*4882a593Smuzhiyun /* Msg header common to all msgs */
22*4882a593Smuzhiyun struct bfi_mhdr {
23*4882a593Smuzhiyun 	u8		msg_class;	/*!< @ref enum bfi_mclass	    */
24*4882a593Smuzhiyun 	u8		msg_id;		/*!< msg opcode with in the class   */
25*4882a593Smuzhiyun 	union {
26*4882a593Smuzhiyun 		struct {
27*4882a593Smuzhiyun 			u8	qid;
28*4882a593Smuzhiyun 			u8	fn_lpu;	/*!< msg destination		    */
29*4882a593Smuzhiyun 		} __packed h2i;
30*4882a593Smuzhiyun 		u16	i2htok;	/*!< token in msgs to host	    */
31*4882a593Smuzhiyun 	} __packed mtag;
32*4882a593Smuzhiyun } __packed;
33*4882a593Smuzhiyun 
34*4882a593Smuzhiyun #define bfi_fn_lpu(__fn, __lpu)	((__fn) << 1 | (__lpu))
35*4882a593Smuzhiyun #define bfi_mhdr_2_fn(_mh)	((_mh)->mtag.h2i.fn_lpu >> 1)
36*4882a593Smuzhiyun #define bfi_mhdr_2_qid(_mh)	((_mh)->mtag.h2i.qid)
37*4882a593Smuzhiyun 
38*4882a593Smuzhiyun #define bfi_h2i_set(_mh, _mc, _op, _fn_lpu) do {		\
39*4882a593Smuzhiyun 	(_mh).msg_class			= (_mc);		\
40*4882a593Smuzhiyun 	(_mh).msg_id			= (_op);		\
41*4882a593Smuzhiyun 	(_mh).mtag.h2i.fn_lpu	= (_fn_lpu);			\
42*4882a593Smuzhiyun } while (0)
43*4882a593Smuzhiyun 
44*4882a593Smuzhiyun #define bfi_i2h_set(_mh, _mc, _op, _i2htok) do {		\
45*4882a593Smuzhiyun 	(_mh).msg_class			= (_mc);		\
46*4882a593Smuzhiyun 	(_mh).msg_id			= (_op);		\
47*4882a593Smuzhiyun 	(_mh).mtag.i2htok		= (_i2htok);		\
48*4882a593Smuzhiyun } while (0)
49*4882a593Smuzhiyun 
50*4882a593Smuzhiyun /*
51*4882a593Smuzhiyun  * Message opcodes: 0-127 to firmware, 128-255 to host
52*4882a593Smuzhiyun  */
53*4882a593Smuzhiyun #define BFI_I2H_OPCODE_BASE	128
54*4882a593Smuzhiyun #define BFA_I2HM(_x)			((_x) + BFI_I2H_OPCODE_BASE)
55*4882a593Smuzhiyun 
56*4882a593Smuzhiyun /****************************************************************************
57*4882a593Smuzhiyun  *
58*4882a593Smuzhiyun  * Scatter Gather Element and Page definition
59*4882a593Smuzhiyun  *
60*4882a593Smuzhiyun  ****************************************************************************
61*4882a593Smuzhiyun  */
62*4882a593Smuzhiyun 
63*4882a593Smuzhiyun /* DMA addresses */
64*4882a593Smuzhiyun union bfi_addr_u {
65*4882a593Smuzhiyun 	struct {
66*4882a593Smuzhiyun 		u32	addr_lo;
67*4882a593Smuzhiyun 		u32	addr_hi;
68*4882a593Smuzhiyun 	} __packed a32;
69*4882a593Smuzhiyun } __packed;
70*4882a593Smuzhiyun 
71*4882a593Smuzhiyun /* Generic DMA addr-len pair. */
72*4882a593Smuzhiyun struct bfi_alen {
73*4882a593Smuzhiyun 	union bfi_addr_u	al_addr;	/* DMA addr of buffer	*/
74*4882a593Smuzhiyun 	u32			al_len;		/* length of buffer */
75*4882a593Smuzhiyun } __packed;
76*4882a593Smuzhiyun 
77*4882a593Smuzhiyun /*
78*4882a593Smuzhiyun  * Large Message structure - 128 Bytes size Msgs
79*4882a593Smuzhiyun  */
80*4882a593Smuzhiyun #define BFI_LMSG_SZ		128
81*4882a593Smuzhiyun #define BFI_LMSG_PL_WSZ	\
82*4882a593Smuzhiyun 			((BFI_LMSG_SZ - sizeof(struct bfi_mhdr)) / 4)
83*4882a593Smuzhiyun 
84*4882a593Smuzhiyun /* Mailbox message structure */
85*4882a593Smuzhiyun #define BFI_MBMSG_SZ		7
86*4882a593Smuzhiyun struct bfi_mbmsg {
87*4882a593Smuzhiyun 	struct bfi_mhdr mh;
88*4882a593Smuzhiyun 	u32		pl[BFI_MBMSG_SZ];
89*4882a593Smuzhiyun } __packed;
90*4882a593Smuzhiyun 
91*4882a593Smuzhiyun /* Supported PCI function class codes (personality) */
92*4882a593Smuzhiyun enum bfi_pcifn_class {
93*4882a593Smuzhiyun 	BFI_PCIFN_CLASS_FC	= 0x0c04,
94*4882a593Smuzhiyun 	BFI_PCIFN_CLASS_ETH	= 0x0200,
95*4882a593Smuzhiyun };
96*4882a593Smuzhiyun 
97*4882a593Smuzhiyun /* Message Classes */
98*4882a593Smuzhiyun enum bfi_mclass {
99*4882a593Smuzhiyun 	BFI_MC_IOC		= 1,	/*!< IO Controller (IOC)	    */
100*4882a593Smuzhiyun 	BFI_MC_DIAG		= 2,	/*!< Diagnostic Msgs		    */
101*4882a593Smuzhiyun 	BFI_MC_FLASH		= 3,	/*!< Flash message class	    */
102*4882a593Smuzhiyun 	BFI_MC_CEE		= 4,	/*!< CEE			    */
103*4882a593Smuzhiyun 	BFI_MC_FCPORT		= 5,	/*!< FC port			    */
104*4882a593Smuzhiyun 	BFI_MC_IOCFC		= 6,	/*!< FC - IO Controller (IOC)	    */
105*4882a593Smuzhiyun 	BFI_MC_LL		= 7,	/*!< Link Layer			    */
106*4882a593Smuzhiyun 	BFI_MC_UF		= 8,	/*!< Unsolicited frame receive	    */
107*4882a593Smuzhiyun 	BFI_MC_FCXP		= 9,	/*!< FC Transport		    */
108*4882a593Smuzhiyun 	BFI_MC_LPS		= 10,	/*!< lport fc login services	    */
109*4882a593Smuzhiyun 	BFI_MC_RPORT		= 11,	/*!< Remote port		    */
110*4882a593Smuzhiyun 	BFI_MC_ITNIM		= 12,	/*!< I-T nexus (Initiator mode)	    */
111*4882a593Smuzhiyun 	BFI_MC_IOIM_READ	= 13,	/*!< read IO (Initiator mode)	    */
112*4882a593Smuzhiyun 	BFI_MC_IOIM_WRITE	= 14,	/*!< write IO (Initiator mode)	    */
113*4882a593Smuzhiyun 	BFI_MC_IOIM_IO		= 15,	/*!< IO (Initiator mode)	    */
114*4882a593Smuzhiyun 	BFI_MC_IOIM		= 16,	/*!< IO (Initiator mode)	    */
115*4882a593Smuzhiyun 	BFI_MC_IOIM_IOCOM	= 17,	/*!< good IO completion		    */
116*4882a593Smuzhiyun 	BFI_MC_TSKIM		= 18,	/*!< Initiator Task management	    */
117*4882a593Smuzhiyun 	BFI_MC_SBOOT		= 19,	/*!< SAN boot services		    */
118*4882a593Smuzhiyun 	BFI_MC_IPFC		= 20,	/*!< IP over FC Msgs		    */
119*4882a593Smuzhiyun 	BFI_MC_PORT		= 21,	/*!< Physical port		    */
120*4882a593Smuzhiyun 	BFI_MC_SFP		= 22,	/*!< SFP module			    */
121*4882a593Smuzhiyun 	BFI_MC_MSGQ		= 23,	/*!< MSGQ			    */
122*4882a593Smuzhiyun 	BFI_MC_ENET		= 24,	/*!< ENET commands/responses	    */
123*4882a593Smuzhiyun 	BFI_MC_PHY		= 25,	/*!< External PHY message class	    */
124*4882a593Smuzhiyun 	BFI_MC_NBOOT		= 26,	/*!< Network Boot		    */
125*4882a593Smuzhiyun 	BFI_MC_TIO_READ		= 27,	/*!< read IO (Target mode)	    */
126*4882a593Smuzhiyun 	BFI_MC_TIO_WRITE	= 28,	/*!< write IO (Target mode)	    */
127*4882a593Smuzhiyun 	BFI_MC_TIO_DATA_XFERED	= 29,	/*!< ds transferred (target mode)   */
128*4882a593Smuzhiyun 	BFI_MC_TIO_IO		= 30,	/*!< IO (Target mode)		    */
129*4882a593Smuzhiyun 	BFI_MC_TIO		= 31,	/*!< IO (target mode)		    */
130*4882a593Smuzhiyun 	BFI_MC_MFG		= 32,	/*!< MFG/ASIC block commands	    */
131*4882a593Smuzhiyun 	BFI_MC_EDMA		= 33,	/*!< EDMA copy commands		    */
132*4882a593Smuzhiyun 	BFI_MC_MAX		= 34
133*4882a593Smuzhiyun };
134*4882a593Smuzhiyun 
135*4882a593Smuzhiyun #define BFI_IOC_MSGLEN_MAX	32	/* 32 bytes */
136*4882a593Smuzhiyun 
137*4882a593Smuzhiyun #define BFI_FWBOOT_ENV_OS		0
138*4882a593Smuzhiyun 
139*4882a593Smuzhiyun /*----------------------------------------------------------------------
140*4882a593Smuzhiyun  *				IOC
141*4882a593Smuzhiyun  *----------------------------------------------------------------------
142*4882a593Smuzhiyun  */
143*4882a593Smuzhiyun 
144*4882a593Smuzhiyun /* Different asic generations */
145*4882a593Smuzhiyun enum bfi_asic_gen {
146*4882a593Smuzhiyun 	BFI_ASIC_GEN_CB		= 1,
147*4882a593Smuzhiyun 	BFI_ASIC_GEN_CT		= 2,
148*4882a593Smuzhiyun 	BFI_ASIC_GEN_CT2	= 3,
149*4882a593Smuzhiyun };
150*4882a593Smuzhiyun 
151*4882a593Smuzhiyun enum bfi_asic_mode {
152*4882a593Smuzhiyun 	BFI_ASIC_MODE_FC	= 1,	/* FC up to 8G speed		*/
153*4882a593Smuzhiyun 	BFI_ASIC_MODE_FC16	= 2,	/* FC up to 16G speed		*/
154*4882a593Smuzhiyun 	BFI_ASIC_MODE_ETH	= 3,	/* Ethernet ports		*/
155*4882a593Smuzhiyun 	BFI_ASIC_MODE_COMBO	= 4,	/* FC 16G and Ethernet 10G port	*/
156*4882a593Smuzhiyun };
157*4882a593Smuzhiyun 
158*4882a593Smuzhiyun enum bfi_ioc_h2i_msgs {
159*4882a593Smuzhiyun 	BFI_IOC_H2I_ENABLE_REQ		= 1,
160*4882a593Smuzhiyun 	BFI_IOC_H2I_DISABLE_REQ		= 2,
161*4882a593Smuzhiyun 	BFI_IOC_H2I_GETATTR_REQ		= 3,
162*4882a593Smuzhiyun 	BFI_IOC_H2I_DBG_SYNC		= 4,
163*4882a593Smuzhiyun 	BFI_IOC_H2I_DBG_DUMP		= 5,
164*4882a593Smuzhiyun };
165*4882a593Smuzhiyun 
166*4882a593Smuzhiyun enum bfi_ioc_i2h_msgs {
167*4882a593Smuzhiyun 	BFI_IOC_I2H_ENABLE_REPLY	= BFA_I2HM(1),
168*4882a593Smuzhiyun 	BFI_IOC_I2H_DISABLE_REPLY	= BFA_I2HM(2),
169*4882a593Smuzhiyun 	BFI_IOC_I2H_GETATTR_REPLY	= BFA_I2HM(3),
170*4882a593Smuzhiyun 	BFI_IOC_I2H_HBEAT		= BFA_I2HM(4),
171*4882a593Smuzhiyun };
172*4882a593Smuzhiyun 
173*4882a593Smuzhiyun /* BFI_IOC_H2I_GETATTR_REQ message */
174*4882a593Smuzhiyun struct bfi_ioc_getattr_req {
175*4882a593Smuzhiyun 	struct bfi_mhdr mh;
176*4882a593Smuzhiyun 	union bfi_addr_u	attr_addr;
177*4882a593Smuzhiyun } __packed;
178*4882a593Smuzhiyun 
179*4882a593Smuzhiyun struct bfi_ioc_attr {
180*4882a593Smuzhiyun 	u64		mfg_pwwn;	/*!< Mfg port wwn	   */
181*4882a593Smuzhiyun 	u64		mfg_nwwn;	/*!< Mfg node wwn	   */
182*4882a593Smuzhiyun 	u8		mfg_mac[ETH_ALEN]; /*!< Mfg mac		   */
183*4882a593Smuzhiyun 	u8		port_mode;	/* enum bfi_port_mode	   */
184*4882a593Smuzhiyun 	u8		rsvd_a;
185*4882a593Smuzhiyun 	u64		pwwn;
186*4882a593Smuzhiyun 	u64		nwwn;
187*4882a593Smuzhiyun 	u8		mac[ETH_ALEN];	/*!< PBC or Mfg mac	   */
188*4882a593Smuzhiyun 	u16	rsvd_b;
189*4882a593Smuzhiyun 	u8		fcoe_mac[ETH_ALEN];
190*4882a593Smuzhiyun 	u16	rsvd_c;
191*4882a593Smuzhiyun 	char		brcd_serialnum[STRSZ(BFA_MFG_SERIALNUM_SIZE)];
192*4882a593Smuzhiyun 	u8		pcie_gen;
193*4882a593Smuzhiyun 	u8		pcie_lanes_orig;
194*4882a593Smuzhiyun 	u8		pcie_lanes;
195*4882a593Smuzhiyun 	u8		rx_bbcredit;	/*!< receive buffer credits */
196*4882a593Smuzhiyun 	u32	adapter_prop;	/*!< adapter properties     */
197*4882a593Smuzhiyun 	u16	maxfrsize;	/*!< max receive frame size */
198*4882a593Smuzhiyun 	char		asic_rev;
199*4882a593Smuzhiyun 	u8		rsvd_d;
200*4882a593Smuzhiyun 	char		fw_version[BFA_VERSION_LEN];
201*4882a593Smuzhiyun 	char		optrom_version[BFA_VERSION_LEN];
202*4882a593Smuzhiyun 	struct bfa_mfg_vpd vpd;
203*4882a593Smuzhiyun 	u32	card_type;	/*!< card type			*/
204*4882a593Smuzhiyun } __packed;
205*4882a593Smuzhiyun 
206*4882a593Smuzhiyun /* BFI_IOC_I2H_GETATTR_REPLY message */
207*4882a593Smuzhiyun struct bfi_ioc_getattr_reply {
208*4882a593Smuzhiyun 	struct bfi_mhdr mh;	/*!< Common msg header		*/
209*4882a593Smuzhiyun 	u8			status;	/*!< cfg reply status		*/
210*4882a593Smuzhiyun 	u8			rsvd[3];
211*4882a593Smuzhiyun } __packed;
212*4882a593Smuzhiyun 
213*4882a593Smuzhiyun /* Firmware memory page offsets */
214*4882a593Smuzhiyun #define BFI_IOC_SMEM_PG0_CB	(0x40)
215*4882a593Smuzhiyun #define BFI_IOC_SMEM_PG0_CT	(0x180)
216*4882a593Smuzhiyun 
217*4882a593Smuzhiyun /* Firmware statistic offset */
218*4882a593Smuzhiyun #define BFI_IOC_FWSTATS_OFF	(0x6B40)
219*4882a593Smuzhiyun #define BFI_IOC_FWSTATS_SZ	(4096)
220*4882a593Smuzhiyun 
221*4882a593Smuzhiyun /* Firmware trace offset */
222*4882a593Smuzhiyun #define BFI_IOC_TRC_OFF		(0x4b00)
223*4882a593Smuzhiyun #define BFI_IOC_TRC_ENTS	256
224*4882a593Smuzhiyun #define BFI_IOC_TRC_ENT_SZ	16
225*4882a593Smuzhiyun #define BFI_IOC_TRC_HDR_SZ	32
226*4882a593Smuzhiyun 
227*4882a593Smuzhiyun #define BFI_IOC_FW_SIGNATURE	(0xbfadbfad)
228*4882a593Smuzhiyun #define BFI_IOC_FW_INV_SIGN	(0xdeaddead)
229*4882a593Smuzhiyun #define BFI_IOC_MD5SUM_SZ	4
230*4882a593Smuzhiyun 
231*4882a593Smuzhiyun struct bfi_ioc_fwver {
232*4882a593Smuzhiyun #ifdef __BIG_ENDIAN
233*4882a593Smuzhiyun 	u8 patch;
234*4882a593Smuzhiyun 	u8 maint;
235*4882a593Smuzhiyun 	u8 minor;
236*4882a593Smuzhiyun 	u8 major;
237*4882a593Smuzhiyun 	u8 rsvd[2];
238*4882a593Smuzhiyun 	u8 build;
239*4882a593Smuzhiyun 	u8 phase;
240*4882a593Smuzhiyun #else
241*4882a593Smuzhiyun 	u8 major;
242*4882a593Smuzhiyun 	u8 minor;
243*4882a593Smuzhiyun 	u8 maint;
244*4882a593Smuzhiyun 	u8 patch;
245*4882a593Smuzhiyun 	u8 phase;
246*4882a593Smuzhiyun 	u8 build;
247*4882a593Smuzhiyun 	u8 rsvd[2];
248*4882a593Smuzhiyun #endif
249*4882a593Smuzhiyun } __packed;
250*4882a593Smuzhiyun 
251*4882a593Smuzhiyun struct bfi_ioc_image_hdr {
252*4882a593Smuzhiyun 	u32	signature;	/*!< constant signature */
253*4882a593Smuzhiyun 	u8	asic_gen;	/*!< asic generation */
254*4882a593Smuzhiyun 	u8	asic_mode;
255*4882a593Smuzhiyun 	u8	port0_mode;	/*!< device mode for port 0 */
256*4882a593Smuzhiyun 	u8	port1_mode;	/*!< device mode for port 1 */
257*4882a593Smuzhiyun 	u32	exec;		/*!< exec vector	*/
258*4882a593Smuzhiyun 	u32	bootenv;	/*!< firmware boot env */
259*4882a593Smuzhiyun 	u32	rsvd_b[2];
260*4882a593Smuzhiyun 	struct bfi_ioc_fwver fwver;
261*4882a593Smuzhiyun 	u32	md5sum[BFI_IOC_MD5SUM_SZ];
262*4882a593Smuzhiyun } __packed;
263*4882a593Smuzhiyun 
264*4882a593Smuzhiyun enum bfi_ioc_img_ver_cmp {
265*4882a593Smuzhiyun 	BFI_IOC_IMG_VER_INCOMP,
266*4882a593Smuzhiyun 	BFI_IOC_IMG_VER_OLD,
267*4882a593Smuzhiyun 	BFI_IOC_IMG_VER_SAME,
268*4882a593Smuzhiyun 	BFI_IOC_IMG_VER_BETTER
269*4882a593Smuzhiyun };
270*4882a593Smuzhiyun 
271*4882a593Smuzhiyun #define BFI_FWBOOT_DEVMODE_OFF		4
272*4882a593Smuzhiyun #define BFI_FWBOOT_TYPE_OFF		8
273*4882a593Smuzhiyun #define BFI_FWBOOT_ENV_OFF		12
274*4882a593Smuzhiyun #define BFI_FWBOOT_DEVMODE(__asic_gen, __asic_mode, __p0_mode, __p1_mode) \
275*4882a593Smuzhiyun 	(((u32)(__asic_gen)) << 24 |	\
276*4882a593Smuzhiyun 	 ((u32)(__asic_mode)) << 16 |	\
277*4882a593Smuzhiyun 	 ((u32)(__p0_mode)) << 8 |	\
278*4882a593Smuzhiyun 	 ((u32)(__p1_mode)))
279*4882a593Smuzhiyun 
280*4882a593Smuzhiyun enum bfi_fwboot_type {
281*4882a593Smuzhiyun 	BFI_FWBOOT_TYPE_NORMAL	= 0,
282*4882a593Smuzhiyun 	BFI_FWBOOT_TYPE_FLASH	= 1,
283*4882a593Smuzhiyun 	BFI_FWBOOT_TYPE_MEMTEST	= 2,
284*4882a593Smuzhiyun };
285*4882a593Smuzhiyun 
286*4882a593Smuzhiyun enum bfi_port_mode {
287*4882a593Smuzhiyun 	BFI_PORT_MODE_FC	= 1,
288*4882a593Smuzhiyun 	BFI_PORT_MODE_ETH	= 2,
289*4882a593Smuzhiyun };
290*4882a593Smuzhiyun 
291*4882a593Smuzhiyun struct bfi_ioc_hbeat {
292*4882a593Smuzhiyun 	struct bfi_mhdr mh;		/*!< common msg header		*/
293*4882a593Smuzhiyun 	u32	   hb_count;	/*!< current heart beat count	*/
294*4882a593Smuzhiyun } __packed;
295*4882a593Smuzhiyun 
296*4882a593Smuzhiyun /* IOC hardware/firmware state */
297*4882a593Smuzhiyun enum bfi_ioc_state {
298*4882a593Smuzhiyun 	BFI_IOC_UNINIT		= 0,	/*!< not initialized		     */
299*4882a593Smuzhiyun 	BFI_IOC_INITING		= 1,	/*!< h/w is being initialized	     */
300*4882a593Smuzhiyun 	BFI_IOC_HWINIT		= 2,	/*!< h/w is initialized		     */
301*4882a593Smuzhiyun 	BFI_IOC_CFG		= 3,	/*!< IOC configuration in progress   */
302*4882a593Smuzhiyun 	BFI_IOC_OP		= 4,	/*!< IOC is operational		     */
303*4882a593Smuzhiyun 	BFI_IOC_DISABLING	= 5,	/*!< IOC is being disabled	     */
304*4882a593Smuzhiyun 	BFI_IOC_DISABLED	= 6,	/*!< IOC is disabled		     */
305*4882a593Smuzhiyun 	BFI_IOC_CFG_DISABLED	= 7,	/*!< IOC is being disabled;transient */
306*4882a593Smuzhiyun 	BFI_IOC_FAIL		= 8,	/*!< IOC heart-beat failure	     */
307*4882a593Smuzhiyun 	BFI_IOC_MEMTEST		= 9,	/*!< IOC is doing memtest	     */
308*4882a593Smuzhiyun };
309*4882a593Smuzhiyun 
310*4882a593Smuzhiyun enum {
311*4882a593Smuzhiyun 	BFI_ADAPTER_TYPE_FC	= 0x01,		/*!< FC adapters	   */
312*4882a593Smuzhiyun 	BFI_ADAPTER_TYPE_MK	= 0x0f0000,	/*!< adapter type mask     */
313*4882a593Smuzhiyun 	BFI_ADAPTER_TYPE_SH	= 16,	        /*!< adapter type shift    */
314*4882a593Smuzhiyun 	BFI_ADAPTER_NPORTS_MK	= 0xff00,	/*!< number of ports mask  */
315*4882a593Smuzhiyun 	BFI_ADAPTER_NPORTS_SH	= 8,	        /*!< number of ports shift */
316*4882a593Smuzhiyun 	BFI_ADAPTER_SPEED_MK	= 0xff,		/*!< adapter speed mask    */
317*4882a593Smuzhiyun 	BFI_ADAPTER_SPEED_SH	= 0,	        /*!< adapter speed shift   */
318*4882a593Smuzhiyun 	BFI_ADAPTER_PROTO	= 0x100000,	/*!< prototype adapaters   */
319*4882a593Smuzhiyun 	BFI_ADAPTER_TTV		= 0x200000,	/*!< TTV debug capable     */
320*4882a593Smuzhiyun 	BFI_ADAPTER_UNSUPP	= 0x400000,	/*!< unknown adapter type  */
321*4882a593Smuzhiyun };
322*4882a593Smuzhiyun 
323*4882a593Smuzhiyun #define BFI_ADAPTER_GETP(__prop, __adap_prop)			\
324*4882a593Smuzhiyun 	(((__adap_prop) & BFI_ADAPTER_ ## __prop ## _MK) >>	\
325*4882a593Smuzhiyun 		BFI_ADAPTER_ ## __prop ## _SH)
326*4882a593Smuzhiyun #define BFI_ADAPTER_SETP(__prop, __val)				\
327*4882a593Smuzhiyun 	((__val) << BFI_ADAPTER_ ## __prop ## _SH)
328*4882a593Smuzhiyun #define BFI_ADAPTER_IS_SPECIAL(__adap_type)			\
329*4882a593Smuzhiyun 	((__adap_type) & (BFI_ADAPTER_TTV | BFI_ADAPTER_PROTO |	\
330*4882a593Smuzhiyun 			BFI_ADAPTER_UNSUPP))
331*4882a593Smuzhiyun 
332*4882a593Smuzhiyun /* BFI_IOC_H2I_ENABLE_REQ & BFI_IOC_H2I_DISABLE_REQ messages */
333*4882a593Smuzhiyun struct bfi_ioc_ctrl_req {
334*4882a593Smuzhiyun 	struct bfi_mhdr mh;
335*4882a593Smuzhiyun 	u16			clscode;
336*4882a593Smuzhiyun 	u16			rsvd;
337*4882a593Smuzhiyun 	u32		tv_sec;
338*4882a593Smuzhiyun } __packed;
339*4882a593Smuzhiyun 
340*4882a593Smuzhiyun /* BFI_IOC_I2H_ENABLE_REPLY & BFI_IOC_I2H_DISABLE_REPLY messages */
341*4882a593Smuzhiyun struct bfi_ioc_ctrl_reply {
342*4882a593Smuzhiyun 	struct bfi_mhdr mh;			/*!< Common msg header     */
343*4882a593Smuzhiyun 	u8			status;		/*!< enable/disable status */
344*4882a593Smuzhiyun 	u8			port_mode;	/*!< enum bfa_mode */
345*4882a593Smuzhiyun 	u8			cap_bm;		/*!< capability bit mask */
346*4882a593Smuzhiyun 	u8			rsvd;
347*4882a593Smuzhiyun } __packed;
348*4882a593Smuzhiyun 
349*4882a593Smuzhiyun #define BFI_IOC_MSGSZ   8
350*4882a593Smuzhiyun /* H2I Messages */
351*4882a593Smuzhiyun union bfi_ioc_h2i_msg_u {
352*4882a593Smuzhiyun 	struct bfi_mhdr mh;
353*4882a593Smuzhiyun 	struct bfi_ioc_ctrl_req enable_req;
354*4882a593Smuzhiyun 	struct bfi_ioc_ctrl_req disable_req;
355*4882a593Smuzhiyun 	struct bfi_ioc_getattr_req getattr_req;
356*4882a593Smuzhiyun 	u32			mboxmsg[BFI_IOC_MSGSZ];
357*4882a593Smuzhiyun } __packed;
358*4882a593Smuzhiyun 
359*4882a593Smuzhiyun /* I2H Messages */
360*4882a593Smuzhiyun union bfi_ioc_i2h_msg_u {
361*4882a593Smuzhiyun 	struct bfi_mhdr mh;
362*4882a593Smuzhiyun 	struct bfi_ioc_ctrl_reply fw_event;
363*4882a593Smuzhiyun 	u32			mboxmsg[BFI_IOC_MSGSZ];
364*4882a593Smuzhiyun } __packed;
365*4882a593Smuzhiyun 
366*4882a593Smuzhiyun /*----------------------------------------------------------------------
367*4882a593Smuzhiyun  *				MSGQ
368*4882a593Smuzhiyun  *----------------------------------------------------------------------
369*4882a593Smuzhiyun  */
370*4882a593Smuzhiyun 
371*4882a593Smuzhiyun enum bfi_msgq_h2i_msgs {
372*4882a593Smuzhiyun 	BFI_MSGQ_H2I_INIT_REQ	   = 1,
373*4882a593Smuzhiyun 	BFI_MSGQ_H2I_DOORBELL_PI	= 2,
374*4882a593Smuzhiyun 	BFI_MSGQ_H2I_DOORBELL_CI	= 3,
375*4882a593Smuzhiyun 	BFI_MSGQ_H2I_CMDQ_COPY_RSP      = 4,
376*4882a593Smuzhiyun };
377*4882a593Smuzhiyun 
378*4882a593Smuzhiyun enum bfi_msgq_i2h_msgs {
379*4882a593Smuzhiyun 	BFI_MSGQ_I2H_INIT_RSP	   = BFA_I2HM(BFI_MSGQ_H2I_INIT_REQ),
380*4882a593Smuzhiyun 	BFI_MSGQ_I2H_DOORBELL_PI	= BFA_I2HM(BFI_MSGQ_H2I_DOORBELL_PI),
381*4882a593Smuzhiyun 	BFI_MSGQ_I2H_DOORBELL_CI	= BFA_I2HM(BFI_MSGQ_H2I_DOORBELL_CI),
382*4882a593Smuzhiyun 	BFI_MSGQ_I2H_CMDQ_COPY_REQ      = BFA_I2HM(BFI_MSGQ_H2I_CMDQ_COPY_RSP),
383*4882a593Smuzhiyun };
384*4882a593Smuzhiyun 
385*4882a593Smuzhiyun /* Messages(commands/responsed/AENS will have the following header */
386*4882a593Smuzhiyun struct bfi_msgq_mhdr {
387*4882a593Smuzhiyun 	u8	msg_class;
388*4882a593Smuzhiyun 	u8	msg_id;
389*4882a593Smuzhiyun 	u16	msg_token;
390*4882a593Smuzhiyun 	u16	num_entries;
391*4882a593Smuzhiyun 	u8	enet_id;
392*4882a593Smuzhiyun 	u8	rsvd;
393*4882a593Smuzhiyun } __packed;
394*4882a593Smuzhiyun 
395*4882a593Smuzhiyun #define bfi_msgq_mhdr_set(_mh, _mc, _mid, _tok, _enet_id) do {	\
396*4882a593Smuzhiyun 	(_mh).msg_class	 = (_mc);	\
397*4882a593Smuzhiyun 	(_mh).msg_id	    = (_mid);       \
398*4882a593Smuzhiyun 	(_mh).msg_token	 = (_tok);       \
399*4882a593Smuzhiyun 	(_mh).enet_id	   = (_enet_id);   \
400*4882a593Smuzhiyun } while (0)
401*4882a593Smuzhiyun 
402*4882a593Smuzhiyun /*
403*4882a593Smuzhiyun  * Mailbox  for messaging interface
404*4882a593Smuzhiyun  */
405*4882a593Smuzhiyun #define BFI_MSGQ_CMD_ENTRY_SIZE	 (64)    /* TBD */
406*4882a593Smuzhiyun #define BFI_MSGQ_RSP_ENTRY_SIZE	 (64)    /* TBD */
407*4882a593Smuzhiyun 
408*4882a593Smuzhiyun #define bfi_msgq_num_cmd_entries(_size)				 \
409*4882a593Smuzhiyun 	(((_size) + BFI_MSGQ_CMD_ENTRY_SIZE - 1) / BFI_MSGQ_CMD_ENTRY_SIZE)
410*4882a593Smuzhiyun 
411*4882a593Smuzhiyun struct bfi_msgq {
412*4882a593Smuzhiyun 	union bfi_addr_u addr;
413*4882a593Smuzhiyun 	u16 q_depth;     /* Total num of entries in the queue */
414*4882a593Smuzhiyun 	u8 rsvd[2];
415*4882a593Smuzhiyun } __packed;
416*4882a593Smuzhiyun 
417*4882a593Smuzhiyun /* BFI_ENET_MSGQ_CFG_REQ TBD init or cfg? */
418*4882a593Smuzhiyun struct bfi_msgq_cfg_req {
419*4882a593Smuzhiyun 	struct bfi_mhdr mh;
420*4882a593Smuzhiyun 	struct bfi_msgq cmdq;
421*4882a593Smuzhiyun 	struct bfi_msgq rspq;
422*4882a593Smuzhiyun } __packed;
423*4882a593Smuzhiyun 
424*4882a593Smuzhiyun /* BFI_ENET_MSGQ_CFG_RSP */
425*4882a593Smuzhiyun struct bfi_msgq_cfg_rsp {
426*4882a593Smuzhiyun 	struct bfi_mhdr mh;
427*4882a593Smuzhiyun 	u8 cmd_status;
428*4882a593Smuzhiyun 	u8 rsvd[3];
429*4882a593Smuzhiyun } __packed;
430*4882a593Smuzhiyun 
431*4882a593Smuzhiyun /* BFI_MSGQ_H2I_DOORBELL */
432*4882a593Smuzhiyun struct bfi_msgq_h2i_db {
433*4882a593Smuzhiyun 	struct bfi_mhdr mh;
434*4882a593Smuzhiyun 	union {
435*4882a593Smuzhiyun 		u16 cmdq_pi;
436*4882a593Smuzhiyun 		u16 rspq_ci;
437*4882a593Smuzhiyun 	} __packed idx;
438*4882a593Smuzhiyun } __packed;
439*4882a593Smuzhiyun 
440*4882a593Smuzhiyun /* BFI_MSGQ_I2H_DOORBELL */
441*4882a593Smuzhiyun struct bfi_msgq_i2h_db {
442*4882a593Smuzhiyun 	struct bfi_mhdr mh;
443*4882a593Smuzhiyun 	union {
444*4882a593Smuzhiyun 		u16 rspq_pi;
445*4882a593Smuzhiyun 		u16 cmdq_ci;
446*4882a593Smuzhiyun 	} __packed idx;
447*4882a593Smuzhiyun } __packed;
448*4882a593Smuzhiyun 
449*4882a593Smuzhiyun #define BFI_CMD_COPY_SZ 28
450*4882a593Smuzhiyun 
451*4882a593Smuzhiyun /* BFI_MSGQ_H2I_CMD_COPY_RSP */
452*4882a593Smuzhiyun struct bfi_msgq_h2i_cmdq_copy_rsp {
453*4882a593Smuzhiyun 	struct bfi_mhdr mh;
454*4882a593Smuzhiyun 	u8	      data[BFI_CMD_COPY_SZ];
455*4882a593Smuzhiyun } __packed;
456*4882a593Smuzhiyun 
457*4882a593Smuzhiyun /* BFI_MSGQ_I2H_CMD_COPY_REQ */
458*4882a593Smuzhiyun struct bfi_msgq_i2h_cmdq_copy_req {
459*4882a593Smuzhiyun 	struct bfi_mhdr mh;
460*4882a593Smuzhiyun 	u16     offset;
461*4882a593Smuzhiyun 	u16     len;
462*4882a593Smuzhiyun } __packed;
463*4882a593Smuzhiyun 
464*4882a593Smuzhiyun /*
465*4882a593Smuzhiyun  *      FLASH module specific
466*4882a593Smuzhiyun  */
467*4882a593Smuzhiyun enum bfi_flash_h2i_msgs {
468*4882a593Smuzhiyun 	BFI_FLASH_H2I_QUERY_REQ = 1,
469*4882a593Smuzhiyun 	BFI_FLASH_H2I_ERASE_REQ = 2,
470*4882a593Smuzhiyun 	BFI_FLASH_H2I_WRITE_REQ = 3,
471*4882a593Smuzhiyun 	BFI_FLASH_H2I_READ_REQ = 4,
472*4882a593Smuzhiyun 	BFI_FLASH_H2I_BOOT_VER_REQ = 5,
473*4882a593Smuzhiyun };
474*4882a593Smuzhiyun 
475*4882a593Smuzhiyun enum bfi_flash_i2h_msgs {
476*4882a593Smuzhiyun 	BFI_FLASH_I2H_QUERY_RSP = BFA_I2HM(1),
477*4882a593Smuzhiyun 	BFI_FLASH_I2H_ERASE_RSP = BFA_I2HM(2),
478*4882a593Smuzhiyun 	BFI_FLASH_I2H_WRITE_RSP = BFA_I2HM(3),
479*4882a593Smuzhiyun 	BFI_FLASH_I2H_READ_RSP = BFA_I2HM(4),
480*4882a593Smuzhiyun 	BFI_FLASH_I2H_BOOT_VER_RSP = BFA_I2HM(5),
481*4882a593Smuzhiyun 	BFI_FLASH_I2H_EVENT = BFA_I2HM(127),
482*4882a593Smuzhiyun };
483*4882a593Smuzhiyun 
484*4882a593Smuzhiyun /*
485*4882a593Smuzhiyun  * Flash query request
486*4882a593Smuzhiyun  */
487*4882a593Smuzhiyun struct bfi_flash_query_req {
488*4882a593Smuzhiyun 	struct bfi_mhdr mh;   /* Common msg header */
489*4882a593Smuzhiyun 	struct bfi_alen alen;
490*4882a593Smuzhiyun } __packed;
491*4882a593Smuzhiyun 
492*4882a593Smuzhiyun /*
493*4882a593Smuzhiyun  * Flash write request
494*4882a593Smuzhiyun  */
495*4882a593Smuzhiyun struct bfi_flash_write_req {
496*4882a593Smuzhiyun 	struct bfi_mhdr mh;	/* Common msg header */
497*4882a593Smuzhiyun 	struct bfi_alen alen;
498*4882a593Smuzhiyun 	u32	type;   /* partition type */
499*4882a593Smuzhiyun 	u8	instance; /* partition instance */
500*4882a593Smuzhiyun 	u8	last;
501*4882a593Smuzhiyun 	u8	rsv[2];
502*4882a593Smuzhiyun 	u32	offset;
503*4882a593Smuzhiyun 	u32	length;
504*4882a593Smuzhiyun } __packed;
505*4882a593Smuzhiyun 
506*4882a593Smuzhiyun /*
507*4882a593Smuzhiyun  * Flash read request
508*4882a593Smuzhiyun  */
509*4882a593Smuzhiyun struct bfi_flash_read_req {
510*4882a593Smuzhiyun 	struct bfi_mhdr mh;	/* Common msg header */
511*4882a593Smuzhiyun 	u32	type;		/* partition type */
512*4882a593Smuzhiyun 	u8	instance;	/* partition instance */
513*4882a593Smuzhiyun 	u8	rsv[3];
514*4882a593Smuzhiyun 	u32	offset;
515*4882a593Smuzhiyun 	u32	length;
516*4882a593Smuzhiyun 	struct bfi_alen alen;
517*4882a593Smuzhiyun } __packed;
518*4882a593Smuzhiyun 
519*4882a593Smuzhiyun /*
520*4882a593Smuzhiyun  * Flash query response
521*4882a593Smuzhiyun  */
522*4882a593Smuzhiyun struct bfi_flash_query_rsp {
523*4882a593Smuzhiyun 	struct bfi_mhdr mh;	/* Common msg header */
524*4882a593Smuzhiyun 	u32	status;
525*4882a593Smuzhiyun } __packed;
526*4882a593Smuzhiyun 
527*4882a593Smuzhiyun /*
528*4882a593Smuzhiyun  * Flash read response
529*4882a593Smuzhiyun  */
530*4882a593Smuzhiyun struct bfi_flash_read_rsp {
531*4882a593Smuzhiyun 	struct bfi_mhdr mh;	/* Common msg header */
532*4882a593Smuzhiyun 	u32	type;		/* partition type */
533*4882a593Smuzhiyun 	u8	instance;	/* partition instance */
534*4882a593Smuzhiyun 	u8	rsv[3];
535*4882a593Smuzhiyun 	u32	status;
536*4882a593Smuzhiyun 	u32	length;
537*4882a593Smuzhiyun } __packed;
538*4882a593Smuzhiyun 
539*4882a593Smuzhiyun /*
540*4882a593Smuzhiyun  * Flash write response
541*4882a593Smuzhiyun  */
542*4882a593Smuzhiyun struct bfi_flash_write_rsp {
543*4882a593Smuzhiyun 	struct bfi_mhdr mh;	/* Common msg header */
544*4882a593Smuzhiyun 	u32	type;		/* partition type */
545*4882a593Smuzhiyun 	u8	instance;	/* partition instance */
546*4882a593Smuzhiyun 	u8	rsv[3];
547*4882a593Smuzhiyun 	u32	status;
548*4882a593Smuzhiyun 	u32	length;
549*4882a593Smuzhiyun } __packed;
550*4882a593Smuzhiyun 
551*4882a593Smuzhiyun #endif /* __BFI_H__ */
552