162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * Linux network driver for QLogic BR-series Converged Network Adapter.
462306a36Sopenharmony_ci */
562306a36Sopenharmony_ci/*
662306a36Sopenharmony_ci * Copyright (c) 2005-2014 Brocade Communications Systems, Inc.
762306a36Sopenharmony_ci * Copyright (c) 2014-2015 QLogic Corporation
862306a36Sopenharmony_ci * All rights reserved
962306a36Sopenharmony_ci * www.qlogic.com
1062306a36Sopenharmony_ci */
1162306a36Sopenharmony_ci#ifndef __BFI_H__
1262306a36Sopenharmony_ci#define __BFI_H__
1362306a36Sopenharmony_ci
1462306a36Sopenharmony_ci#include "bfa_defs.h"
1562306a36Sopenharmony_ci
1662306a36Sopenharmony_ci/* BFI FW image type */
1762306a36Sopenharmony_ci#define	BFI_FLASH_CHUNK_SZ			256	/*!< Flash chunk size */
1862306a36Sopenharmony_ci#define	BFI_FLASH_CHUNK_SZ_WORDS	(BFI_FLASH_CHUNK_SZ/sizeof(u32))
1962306a36Sopenharmony_ci#define BFI_FLASH_IMAGE_SZ		0x100000
2062306a36Sopenharmony_ci
2162306a36Sopenharmony_ci/* Msg header common to all msgs */
2262306a36Sopenharmony_cistruct bfi_mhdr {
2362306a36Sopenharmony_ci	u8		msg_class;	/*!< @ref enum bfi_mclass	    */
2462306a36Sopenharmony_ci	u8		msg_id;		/*!< msg opcode with in the class   */
2562306a36Sopenharmony_ci	union {
2662306a36Sopenharmony_ci		struct {
2762306a36Sopenharmony_ci			u8	qid;
2862306a36Sopenharmony_ci			u8	fn_lpu;	/*!< msg destination		    */
2962306a36Sopenharmony_ci		} __packed h2i;
3062306a36Sopenharmony_ci		u16	i2htok;	/*!< token in msgs to host	    */
3162306a36Sopenharmony_ci	} __packed mtag;
3262306a36Sopenharmony_ci} __packed;
3362306a36Sopenharmony_ci
3462306a36Sopenharmony_ci#define bfi_fn_lpu(__fn, __lpu)	((__fn) << 1 | (__lpu))
3562306a36Sopenharmony_ci#define bfi_mhdr_2_fn(_mh)	((_mh)->mtag.h2i.fn_lpu >> 1)
3662306a36Sopenharmony_ci#define bfi_mhdr_2_qid(_mh)	((_mh)->mtag.h2i.qid)
3762306a36Sopenharmony_ci
3862306a36Sopenharmony_ci#define bfi_h2i_set(_mh, _mc, _op, _fn_lpu) do {		\
3962306a36Sopenharmony_ci	(_mh).msg_class			= (_mc);		\
4062306a36Sopenharmony_ci	(_mh).msg_id			= (_op);		\
4162306a36Sopenharmony_ci	(_mh).mtag.h2i.fn_lpu	= (_fn_lpu);			\
4262306a36Sopenharmony_ci} while (0)
4362306a36Sopenharmony_ci
4462306a36Sopenharmony_ci#define bfi_i2h_set(_mh, _mc, _op, _i2htok) do {		\
4562306a36Sopenharmony_ci	(_mh).msg_class			= (_mc);		\
4662306a36Sopenharmony_ci	(_mh).msg_id			= (_op);		\
4762306a36Sopenharmony_ci	(_mh).mtag.i2htok		= (_i2htok);		\
4862306a36Sopenharmony_ci} while (0)
4962306a36Sopenharmony_ci
5062306a36Sopenharmony_ci/*
5162306a36Sopenharmony_ci * Message opcodes: 0-127 to firmware, 128-255 to host
5262306a36Sopenharmony_ci */
5362306a36Sopenharmony_ci#define BFI_I2H_OPCODE_BASE	128
5462306a36Sopenharmony_ci#define BFA_I2HM(_x)			((_x) + BFI_I2H_OPCODE_BASE)
5562306a36Sopenharmony_ci
5662306a36Sopenharmony_ci/****************************************************************************
5762306a36Sopenharmony_ci *
5862306a36Sopenharmony_ci * Scatter Gather Element and Page definition
5962306a36Sopenharmony_ci *
6062306a36Sopenharmony_ci ****************************************************************************
6162306a36Sopenharmony_ci */
6262306a36Sopenharmony_ci
6362306a36Sopenharmony_ci/* DMA addresses */
6462306a36Sopenharmony_ciunion bfi_addr_u {
6562306a36Sopenharmony_ci	struct {
6662306a36Sopenharmony_ci		u32	addr_lo;
6762306a36Sopenharmony_ci		u32	addr_hi;
6862306a36Sopenharmony_ci	} __packed a32;
6962306a36Sopenharmony_ci} __packed;
7062306a36Sopenharmony_ci
7162306a36Sopenharmony_ci/* Generic DMA addr-len pair. */
7262306a36Sopenharmony_cistruct bfi_alen {
7362306a36Sopenharmony_ci	union bfi_addr_u	al_addr;	/* DMA addr of buffer	*/
7462306a36Sopenharmony_ci	u32			al_len;		/* length of buffer */
7562306a36Sopenharmony_ci} __packed;
7662306a36Sopenharmony_ci
7762306a36Sopenharmony_ci/*
7862306a36Sopenharmony_ci * Large Message structure - 128 Bytes size Msgs
7962306a36Sopenharmony_ci */
8062306a36Sopenharmony_ci#define BFI_LMSG_SZ		128
8162306a36Sopenharmony_ci#define BFI_LMSG_PL_WSZ	\
8262306a36Sopenharmony_ci			((BFI_LMSG_SZ - sizeof(struct bfi_mhdr)) / 4)
8362306a36Sopenharmony_ci
8462306a36Sopenharmony_ci/* Mailbox message structure */
8562306a36Sopenharmony_ci#define BFI_MBMSG_SZ		7
8662306a36Sopenharmony_cistruct bfi_mbmsg {
8762306a36Sopenharmony_ci	struct bfi_mhdr mh;
8862306a36Sopenharmony_ci	u32		pl[BFI_MBMSG_SZ];
8962306a36Sopenharmony_ci} __packed;
9062306a36Sopenharmony_ci
9162306a36Sopenharmony_ci/* Supported PCI function class codes (personality) */
9262306a36Sopenharmony_cienum bfi_pcifn_class {
9362306a36Sopenharmony_ci	BFI_PCIFN_CLASS_FC	= 0x0c04,
9462306a36Sopenharmony_ci	BFI_PCIFN_CLASS_ETH	= 0x0200,
9562306a36Sopenharmony_ci};
9662306a36Sopenharmony_ci
9762306a36Sopenharmony_ci/* Message Classes */
9862306a36Sopenharmony_cienum bfi_mclass {
9962306a36Sopenharmony_ci	BFI_MC_IOC		= 1,	/*!< IO Controller (IOC)	    */
10062306a36Sopenharmony_ci	BFI_MC_DIAG		= 2,	/*!< Diagnostic Msgs		    */
10162306a36Sopenharmony_ci	BFI_MC_FLASH		= 3,	/*!< Flash message class	    */
10262306a36Sopenharmony_ci	BFI_MC_CEE		= 4,	/*!< CEE			    */
10362306a36Sopenharmony_ci	BFI_MC_FCPORT		= 5,	/*!< FC port			    */
10462306a36Sopenharmony_ci	BFI_MC_IOCFC		= 6,	/*!< FC - IO Controller (IOC)	    */
10562306a36Sopenharmony_ci	BFI_MC_LL		= 7,	/*!< Link Layer			    */
10662306a36Sopenharmony_ci	BFI_MC_UF		= 8,	/*!< Unsolicited frame receive	    */
10762306a36Sopenharmony_ci	BFI_MC_FCXP		= 9,	/*!< FC Transport		    */
10862306a36Sopenharmony_ci	BFI_MC_LPS		= 10,	/*!< lport fc login services	    */
10962306a36Sopenharmony_ci	BFI_MC_RPORT		= 11,	/*!< Remote port		    */
11062306a36Sopenharmony_ci	BFI_MC_ITNIM		= 12,	/*!< I-T nexus (Initiator mode)	    */
11162306a36Sopenharmony_ci	BFI_MC_IOIM_READ	= 13,	/*!< read IO (Initiator mode)	    */
11262306a36Sopenharmony_ci	BFI_MC_IOIM_WRITE	= 14,	/*!< write IO (Initiator mode)	    */
11362306a36Sopenharmony_ci	BFI_MC_IOIM_IO		= 15,	/*!< IO (Initiator mode)	    */
11462306a36Sopenharmony_ci	BFI_MC_IOIM		= 16,	/*!< IO (Initiator mode)	    */
11562306a36Sopenharmony_ci	BFI_MC_IOIM_IOCOM	= 17,	/*!< good IO completion		    */
11662306a36Sopenharmony_ci	BFI_MC_TSKIM		= 18,	/*!< Initiator Task management	    */
11762306a36Sopenharmony_ci	BFI_MC_SBOOT		= 19,	/*!< SAN boot services		    */
11862306a36Sopenharmony_ci	BFI_MC_IPFC		= 20,	/*!< IP over FC Msgs		    */
11962306a36Sopenharmony_ci	BFI_MC_PORT		= 21,	/*!< Physical port		    */
12062306a36Sopenharmony_ci	BFI_MC_SFP		= 22,	/*!< SFP module			    */
12162306a36Sopenharmony_ci	BFI_MC_MSGQ		= 23,	/*!< MSGQ			    */
12262306a36Sopenharmony_ci	BFI_MC_ENET		= 24,	/*!< ENET commands/responses	    */
12362306a36Sopenharmony_ci	BFI_MC_PHY		= 25,	/*!< External PHY message class	    */
12462306a36Sopenharmony_ci	BFI_MC_NBOOT		= 26,	/*!< Network Boot		    */
12562306a36Sopenharmony_ci	BFI_MC_TIO_READ		= 27,	/*!< read IO (Target mode)	    */
12662306a36Sopenharmony_ci	BFI_MC_TIO_WRITE	= 28,	/*!< write IO (Target mode)	    */
12762306a36Sopenharmony_ci	BFI_MC_TIO_DATA_XFERED	= 29,	/*!< ds transferred (target mode)   */
12862306a36Sopenharmony_ci	BFI_MC_TIO_IO		= 30,	/*!< IO (Target mode)		    */
12962306a36Sopenharmony_ci	BFI_MC_TIO		= 31,	/*!< IO (target mode)		    */
13062306a36Sopenharmony_ci	BFI_MC_MFG		= 32,	/*!< MFG/ASIC block commands	    */
13162306a36Sopenharmony_ci	BFI_MC_EDMA		= 33,	/*!< EDMA copy commands		    */
13262306a36Sopenharmony_ci	BFI_MC_MAX		= 34
13362306a36Sopenharmony_ci};
13462306a36Sopenharmony_ci
13562306a36Sopenharmony_ci#define BFI_IOC_MSGLEN_MAX	32	/* 32 bytes */
13662306a36Sopenharmony_ci
13762306a36Sopenharmony_ci#define BFI_FWBOOT_ENV_OS		0
13862306a36Sopenharmony_ci
13962306a36Sopenharmony_ci/*----------------------------------------------------------------------
14062306a36Sopenharmony_ci *				IOC
14162306a36Sopenharmony_ci *----------------------------------------------------------------------
14262306a36Sopenharmony_ci */
14362306a36Sopenharmony_ci
14462306a36Sopenharmony_ci/* Different asic generations */
14562306a36Sopenharmony_cienum bfi_asic_gen {
14662306a36Sopenharmony_ci	BFI_ASIC_GEN_CB		= 1,
14762306a36Sopenharmony_ci	BFI_ASIC_GEN_CT		= 2,
14862306a36Sopenharmony_ci	BFI_ASIC_GEN_CT2	= 3,
14962306a36Sopenharmony_ci};
15062306a36Sopenharmony_ci
15162306a36Sopenharmony_cienum bfi_asic_mode {
15262306a36Sopenharmony_ci	BFI_ASIC_MODE_FC	= 1,	/* FC up to 8G speed		*/
15362306a36Sopenharmony_ci	BFI_ASIC_MODE_FC16	= 2,	/* FC up to 16G speed		*/
15462306a36Sopenharmony_ci	BFI_ASIC_MODE_ETH	= 3,	/* Ethernet ports		*/
15562306a36Sopenharmony_ci	BFI_ASIC_MODE_COMBO	= 4,	/* FC 16G and Ethernet 10G port	*/
15662306a36Sopenharmony_ci};
15762306a36Sopenharmony_ci
15862306a36Sopenharmony_cienum bfi_ioc_h2i_msgs {
15962306a36Sopenharmony_ci	BFI_IOC_H2I_ENABLE_REQ		= 1,
16062306a36Sopenharmony_ci	BFI_IOC_H2I_DISABLE_REQ		= 2,
16162306a36Sopenharmony_ci	BFI_IOC_H2I_GETATTR_REQ		= 3,
16262306a36Sopenharmony_ci	BFI_IOC_H2I_DBG_SYNC		= 4,
16362306a36Sopenharmony_ci	BFI_IOC_H2I_DBG_DUMP		= 5,
16462306a36Sopenharmony_ci};
16562306a36Sopenharmony_ci
16662306a36Sopenharmony_cienum bfi_ioc_i2h_msgs {
16762306a36Sopenharmony_ci	BFI_IOC_I2H_ENABLE_REPLY	= BFA_I2HM(1),
16862306a36Sopenharmony_ci	BFI_IOC_I2H_DISABLE_REPLY	= BFA_I2HM(2),
16962306a36Sopenharmony_ci	BFI_IOC_I2H_GETATTR_REPLY	= BFA_I2HM(3),
17062306a36Sopenharmony_ci	BFI_IOC_I2H_HBEAT		= BFA_I2HM(4),
17162306a36Sopenharmony_ci};
17262306a36Sopenharmony_ci
17362306a36Sopenharmony_ci/* BFI_IOC_H2I_GETATTR_REQ message */
17462306a36Sopenharmony_cistruct bfi_ioc_getattr_req {
17562306a36Sopenharmony_ci	struct bfi_mhdr mh;
17662306a36Sopenharmony_ci	union bfi_addr_u	attr_addr;
17762306a36Sopenharmony_ci} __packed;
17862306a36Sopenharmony_ci
17962306a36Sopenharmony_cistruct bfi_ioc_attr {
18062306a36Sopenharmony_ci	u64		mfg_pwwn;	/*!< Mfg port wwn	   */
18162306a36Sopenharmony_ci	u64		mfg_nwwn;	/*!< Mfg node wwn	   */
18262306a36Sopenharmony_ci	u8		mfg_mac[ETH_ALEN]; /*!< Mfg mac		   */
18362306a36Sopenharmony_ci	u8		port_mode;	/* enum bfi_port_mode	   */
18462306a36Sopenharmony_ci	u8		rsvd_a;
18562306a36Sopenharmony_ci	u64		pwwn;
18662306a36Sopenharmony_ci	u64		nwwn;
18762306a36Sopenharmony_ci	u8		mac[ETH_ALEN];	/*!< PBC or Mfg mac	   */
18862306a36Sopenharmony_ci	u16	rsvd_b;
18962306a36Sopenharmony_ci	u8		fcoe_mac[ETH_ALEN];
19062306a36Sopenharmony_ci	u16	rsvd_c;
19162306a36Sopenharmony_ci	char		brcd_serialnum[STRSZ(BFA_MFG_SERIALNUM_SIZE)];
19262306a36Sopenharmony_ci	u8		pcie_gen;
19362306a36Sopenharmony_ci	u8		pcie_lanes_orig;
19462306a36Sopenharmony_ci	u8		pcie_lanes;
19562306a36Sopenharmony_ci	u8		rx_bbcredit;	/*!< receive buffer credits */
19662306a36Sopenharmony_ci	u32	adapter_prop;	/*!< adapter properties     */
19762306a36Sopenharmony_ci	u16	maxfrsize;	/*!< max receive frame size */
19862306a36Sopenharmony_ci	char		asic_rev;
19962306a36Sopenharmony_ci	u8		rsvd_d;
20062306a36Sopenharmony_ci	char		fw_version[BFA_VERSION_LEN];
20162306a36Sopenharmony_ci	char		optrom_version[BFA_VERSION_LEN];
20262306a36Sopenharmony_ci	struct bfa_mfg_vpd vpd;
20362306a36Sopenharmony_ci	u32	card_type;	/*!< card type			*/
20462306a36Sopenharmony_ci} __packed;
20562306a36Sopenharmony_ci
20662306a36Sopenharmony_ci/* BFI_IOC_I2H_GETATTR_REPLY message */
20762306a36Sopenharmony_cistruct bfi_ioc_getattr_reply {
20862306a36Sopenharmony_ci	struct bfi_mhdr mh;	/*!< Common msg header		*/
20962306a36Sopenharmony_ci	u8			status;	/*!< cfg reply status		*/
21062306a36Sopenharmony_ci	u8			rsvd[3];
21162306a36Sopenharmony_ci} __packed;
21262306a36Sopenharmony_ci
21362306a36Sopenharmony_ci/* Firmware memory page offsets */
21462306a36Sopenharmony_ci#define BFI_IOC_SMEM_PG0_CB	(0x40)
21562306a36Sopenharmony_ci#define BFI_IOC_SMEM_PG0_CT	(0x180)
21662306a36Sopenharmony_ci
21762306a36Sopenharmony_ci/* Firmware statistic offset */
21862306a36Sopenharmony_ci#define BFI_IOC_FWSTATS_OFF	(0x6B40)
21962306a36Sopenharmony_ci#define BFI_IOC_FWSTATS_SZ	(4096)
22062306a36Sopenharmony_ci
22162306a36Sopenharmony_ci/* Firmware trace offset */
22262306a36Sopenharmony_ci#define BFI_IOC_TRC_OFF		(0x4b00)
22362306a36Sopenharmony_ci#define BFI_IOC_TRC_ENTS	256
22462306a36Sopenharmony_ci#define BFI_IOC_TRC_ENT_SZ	16
22562306a36Sopenharmony_ci#define BFI_IOC_TRC_HDR_SZ	32
22662306a36Sopenharmony_ci
22762306a36Sopenharmony_ci#define BFI_IOC_FW_SIGNATURE	(0xbfadbfad)
22862306a36Sopenharmony_ci#define BFI_IOC_FW_INV_SIGN	(0xdeaddead)
22962306a36Sopenharmony_ci#define BFI_IOC_MD5SUM_SZ	4
23062306a36Sopenharmony_ci
23162306a36Sopenharmony_cistruct bfi_ioc_fwver {
23262306a36Sopenharmony_ci#ifdef __BIG_ENDIAN
23362306a36Sopenharmony_ci	u8 patch;
23462306a36Sopenharmony_ci	u8 maint;
23562306a36Sopenharmony_ci	u8 minor;
23662306a36Sopenharmony_ci	u8 major;
23762306a36Sopenharmony_ci	u8 rsvd[2];
23862306a36Sopenharmony_ci	u8 build;
23962306a36Sopenharmony_ci	u8 phase;
24062306a36Sopenharmony_ci#else
24162306a36Sopenharmony_ci	u8 major;
24262306a36Sopenharmony_ci	u8 minor;
24362306a36Sopenharmony_ci	u8 maint;
24462306a36Sopenharmony_ci	u8 patch;
24562306a36Sopenharmony_ci	u8 phase;
24662306a36Sopenharmony_ci	u8 build;
24762306a36Sopenharmony_ci	u8 rsvd[2];
24862306a36Sopenharmony_ci#endif
24962306a36Sopenharmony_ci} __packed;
25062306a36Sopenharmony_ci
25162306a36Sopenharmony_cistruct bfi_ioc_image_hdr {
25262306a36Sopenharmony_ci	u32	signature;	/*!< constant signature */
25362306a36Sopenharmony_ci	u8	asic_gen;	/*!< asic generation */
25462306a36Sopenharmony_ci	u8	asic_mode;
25562306a36Sopenharmony_ci	u8	port0_mode;	/*!< device mode for port 0 */
25662306a36Sopenharmony_ci	u8	port1_mode;	/*!< device mode for port 1 */
25762306a36Sopenharmony_ci	u32	exec;		/*!< exec vector	*/
25862306a36Sopenharmony_ci	u32	bootenv;	/*!< firmware boot env */
25962306a36Sopenharmony_ci	u32	rsvd_b[2];
26062306a36Sopenharmony_ci	struct bfi_ioc_fwver fwver;
26162306a36Sopenharmony_ci	u32	md5sum[BFI_IOC_MD5SUM_SZ];
26262306a36Sopenharmony_ci} __packed;
26362306a36Sopenharmony_ci
26462306a36Sopenharmony_cienum bfi_ioc_img_ver_cmp {
26562306a36Sopenharmony_ci	BFI_IOC_IMG_VER_INCOMP,
26662306a36Sopenharmony_ci	BFI_IOC_IMG_VER_OLD,
26762306a36Sopenharmony_ci	BFI_IOC_IMG_VER_SAME,
26862306a36Sopenharmony_ci	BFI_IOC_IMG_VER_BETTER
26962306a36Sopenharmony_ci};
27062306a36Sopenharmony_ci
27162306a36Sopenharmony_ci#define BFI_FWBOOT_DEVMODE_OFF		4
27262306a36Sopenharmony_ci#define BFI_FWBOOT_TYPE_OFF		8
27362306a36Sopenharmony_ci#define BFI_FWBOOT_ENV_OFF		12
27462306a36Sopenharmony_ci#define BFI_FWBOOT_DEVMODE(__asic_gen, __asic_mode, __p0_mode, __p1_mode) \
27562306a36Sopenharmony_ci	(((u32)(__asic_gen)) << 24 |	\
27662306a36Sopenharmony_ci	 ((u32)(__asic_mode)) << 16 |	\
27762306a36Sopenharmony_ci	 ((u32)(__p0_mode)) << 8 |	\
27862306a36Sopenharmony_ci	 ((u32)(__p1_mode)))
27962306a36Sopenharmony_ci
28062306a36Sopenharmony_cienum bfi_fwboot_type {
28162306a36Sopenharmony_ci	BFI_FWBOOT_TYPE_NORMAL	= 0,
28262306a36Sopenharmony_ci	BFI_FWBOOT_TYPE_FLASH	= 1,
28362306a36Sopenharmony_ci	BFI_FWBOOT_TYPE_MEMTEST	= 2,
28462306a36Sopenharmony_ci};
28562306a36Sopenharmony_ci
28662306a36Sopenharmony_cienum bfi_port_mode {
28762306a36Sopenharmony_ci	BFI_PORT_MODE_FC	= 1,
28862306a36Sopenharmony_ci	BFI_PORT_MODE_ETH	= 2,
28962306a36Sopenharmony_ci};
29062306a36Sopenharmony_ci
29162306a36Sopenharmony_cistruct bfi_ioc_hbeat {
29262306a36Sopenharmony_ci	struct bfi_mhdr mh;		/*!< common msg header		*/
29362306a36Sopenharmony_ci	u32	   hb_count;	/*!< current heart beat count	*/
29462306a36Sopenharmony_ci} __packed;
29562306a36Sopenharmony_ci
29662306a36Sopenharmony_ci/* IOC hardware/firmware state */
29762306a36Sopenharmony_cienum bfi_ioc_state {
29862306a36Sopenharmony_ci	BFI_IOC_UNINIT		= 0,	/*!< not initialized		     */
29962306a36Sopenharmony_ci	BFI_IOC_INITING		= 1,	/*!< h/w is being initialized	     */
30062306a36Sopenharmony_ci	BFI_IOC_HWINIT		= 2,	/*!< h/w is initialized		     */
30162306a36Sopenharmony_ci	BFI_IOC_CFG		= 3,	/*!< IOC configuration in progress   */
30262306a36Sopenharmony_ci	BFI_IOC_OP		= 4,	/*!< IOC is operational		     */
30362306a36Sopenharmony_ci	BFI_IOC_DISABLING	= 5,	/*!< IOC is being disabled	     */
30462306a36Sopenharmony_ci	BFI_IOC_DISABLED	= 6,	/*!< IOC is disabled		     */
30562306a36Sopenharmony_ci	BFI_IOC_CFG_DISABLED	= 7,	/*!< IOC is being disabled;transient */
30662306a36Sopenharmony_ci	BFI_IOC_FAIL		= 8,	/*!< IOC heart-beat failure	     */
30762306a36Sopenharmony_ci	BFI_IOC_MEMTEST		= 9,	/*!< IOC is doing memtest	     */
30862306a36Sopenharmony_ci};
30962306a36Sopenharmony_ci
31062306a36Sopenharmony_cienum {
31162306a36Sopenharmony_ci	BFI_ADAPTER_TYPE_FC	= 0x01,		/*!< FC adapters	   */
31262306a36Sopenharmony_ci	BFI_ADAPTER_TYPE_MK	= 0x0f0000,	/*!< adapter type mask     */
31362306a36Sopenharmony_ci	BFI_ADAPTER_TYPE_SH	= 16,	        /*!< adapter type shift    */
31462306a36Sopenharmony_ci	BFI_ADAPTER_NPORTS_MK	= 0xff00,	/*!< number of ports mask  */
31562306a36Sopenharmony_ci	BFI_ADAPTER_NPORTS_SH	= 8,	        /*!< number of ports shift */
31662306a36Sopenharmony_ci	BFI_ADAPTER_SPEED_MK	= 0xff,		/*!< adapter speed mask    */
31762306a36Sopenharmony_ci	BFI_ADAPTER_SPEED_SH	= 0,	        /*!< adapter speed shift   */
31862306a36Sopenharmony_ci	BFI_ADAPTER_PROTO	= 0x100000,	/*!< prototype adapaters   */
31962306a36Sopenharmony_ci	BFI_ADAPTER_TTV		= 0x200000,	/*!< TTV debug capable     */
32062306a36Sopenharmony_ci	BFI_ADAPTER_UNSUPP	= 0x400000,	/*!< unknown adapter type  */
32162306a36Sopenharmony_ci};
32262306a36Sopenharmony_ci
32362306a36Sopenharmony_ci#define BFI_ADAPTER_GETP(__prop, __adap_prop)			\
32462306a36Sopenharmony_ci	(((__adap_prop) & BFI_ADAPTER_ ## __prop ## _MK) >>	\
32562306a36Sopenharmony_ci		BFI_ADAPTER_ ## __prop ## _SH)
32662306a36Sopenharmony_ci#define BFI_ADAPTER_SETP(__prop, __val)				\
32762306a36Sopenharmony_ci	((__val) << BFI_ADAPTER_ ## __prop ## _SH)
32862306a36Sopenharmony_ci#define BFI_ADAPTER_IS_SPECIAL(__adap_type)			\
32962306a36Sopenharmony_ci	((__adap_type) & (BFI_ADAPTER_TTV | BFI_ADAPTER_PROTO |	\
33062306a36Sopenharmony_ci			BFI_ADAPTER_UNSUPP))
33162306a36Sopenharmony_ci
33262306a36Sopenharmony_ci/* BFI_IOC_H2I_ENABLE_REQ & BFI_IOC_H2I_DISABLE_REQ messages */
33362306a36Sopenharmony_cistruct bfi_ioc_ctrl_req {
33462306a36Sopenharmony_ci	struct bfi_mhdr mh;
33562306a36Sopenharmony_ci	u16			clscode;
33662306a36Sopenharmony_ci	u16			rsvd;
33762306a36Sopenharmony_ci	u32		tv_sec;
33862306a36Sopenharmony_ci} __packed;
33962306a36Sopenharmony_ci
34062306a36Sopenharmony_ci/* BFI_IOC_I2H_ENABLE_REPLY & BFI_IOC_I2H_DISABLE_REPLY messages */
34162306a36Sopenharmony_cistruct bfi_ioc_ctrl_reply {
34262306a36Sopenharmony_ci	struct bfi_mhdr mh;			/*!< Common msg header     */
34362306a36Sopenharmony_ci	u8			status;		/*!< enable/disable status */
34462306a36Sopenharmony_ci	u8			port_mode;	/*!< enum bfa_mode */
34562306a36Sopenharmony_ci	u8			cap_bm;		/*!< capability bit mask */
34662306a36Sopenharmony_ci	u8			rsvd;
34762306a36Sopenharmony_ci} __packed;
34862306a36Sopenharmony_ci
34962306a36Sopenharmony_ci#define BFI_IOC_MSGSZ   8
35062306a36Sopenharmony_ci/* H2I Messages */
35162306a36Sopenharmony_ciunion bfi_ioc_h2i_msg_u {
35262306a36Sopenharmony_ci	struct bfi_mhdr mh;
35362306a36Sopenharmony_ci	struct bfi_ioc_ctrl_req enable_req;
35462306a36Sopenharmony_ci	struct bfi_ioc_ctrl_req disable_req;
35562306a36Sopenharmony_ci	struct bfi_ioc_getattr_req getattr_req;
35662306a36Sopenharmony_ci	u32			mboxmsg[BFI_IOC_MSGSZ];
35762306a36Sopenharmony_ci} __packed;
35862306a36Sopenharmony_ci
35962306a36Sopenharmony_ci/* I2H Messages */
36062306a36Sopenharmony_ciunion bfi_ioc_i2h_msg_u {
36162306a36Sopenharmony_ci	struct bfi_mhdr mh;
36262306a36Sopenharmony_ci	struct bfi_ioc_ctrl_reply fw_event;
36362306a36Sopenharmony_ci	u32			mboxmsg[BFI_IOC_MSGSZ];
36462306a36Sopenharmony_ci} __packed;
36562306a36Sopenharmony_ci
36662306a36Sopenharmony_ci/*----------------------------------------------------------------------
36762306a36Sopenharmony_ci *				MSGQ
36862306a36Sopenharmony_ci *----------------------------------------------------------------------
36962306a36Sopenharmony_ci */
37062306a36Sopenharmony_ci
37162306a36Sopenharmony_cienum bfi_msgq_h2i_msgs {
37262306a36Sopenharmony_ci	BFI_MSGQ_H2I_INIT_REQ	   = 1,
37362306a36Sopenharmony_ci	BFI_MSGQ_H2I_DOORBELL_PI	= 2,
37462306a36Sopenharmony_ci	BFI_MSGQ_H2I_DOORBELL_CI	= 3,
37562306a36Sopenharmony_ci	BFI_MSGQ_H2I_CMDQ_COPY_RSP      = 4,
37662306a36Sopenharmony_ci};
37762306a36Sopenharmony_ci
37862306a36Sopenharmony_cienum bfi_msgq_i2h_msgs {
37962306a36Sopenharmony_ci	BFI_MSGQ_I2H_INIT_RSP	   = BFA_I2HM(BFI_MSGQ_H2I_INIT_REQ),
38062306a36Sopenharmony_ci	BFI_MSGQ_I2H_DOORBELL_PI	= BFA_I2HM(BFI_MSGQ_H2I_DOORBELL_PI),
38162306a36Sopenharmony_ci	BFI_MSGQ_I2H_DOORBELL_CI	= BFA_I2HM(BFI_MSGQ_H2I_DOORBELL_CI),
38262306a36Sopenharmony_ci	BFI_MSGQ_I2H_CMDQ_COPY_REQ      = BFA_I2HM(BFI_MSGQ_H2I_CMDQ_COPY_RSP),
38362306a36Sopenharmony_ci};
38462306a36Sopenharmony_ci
38562306a36Sopenharmony_ci/* Messages(commands/responsed/AENS will have the following header */
38662306a36Sopenharmony_cistruct bfi_msgq_mhdr {
38762306a36Sopenharmony_ci	u8	msg_class;
38862306a36Sopenharmony_ci	u8	msg_id;
38962306a36Sopenharmony_ci	u16	msg_token;
39062306a36Sopenharmony_ci	u16	num_entries;
39162306a36Sopenharmony_ci	u8	enet_id;
39262306a36Sopenharmony_ci	u8	rsvd;
39362306a36Sopenharmony_ci} __packed;
39462306a36Sopenharmony_ci
39562306a36Sopenharmony_ci#define bfi_msgq_mhdr_set(_mh, _mc, _mid, _tok, _enet_id) do {	\
39662306a36Sopenharmony_ci	(_mh).msg_class	 = (_mc);	\
39762306a36Sopenharmony_ci	(_mh).msg_id	    = (_mid);       \
39862306a36Sopenharmony_ci	(_mh).msg_token	 = (_tok);       \
39962306a36Sopenharmony_ci	(_mh).enet_id	   = (_enet_id);   \
40062306a36Sopenharmony_ci} while (0)
40162306a36Sopenharmony_ci
40262306a36Sopenharmony_ci/*
40362306a36Sopenharmony_ci * Mailbox  for messaging interface
40462306a36Sopenharmony_ci */
40562306a36Sopenharmony_ci#define BFI_MSGQ_CMD_ENTRY_SIZE	 (64)    /* TBD */
40662306a36Sopenharmony_ci#define BFI_MSGQ_RSP_ENTRY_SIZE	 (64)    /* TBD */
40762306a36Sopenharmony_ci
40862306a36Sopenharmony_ci#define bfi_msgq_num_cmd_entries(_size)				 \
40962306a36Sopenharmony_ci	(((_size) + BFI_MSGQ_CMD_ENTRY_SIZE - 1) / BFI_MSGQ_CMD_ENTRY_SIZE)
41062306a36Sopenharmony_ci
41162306a36Sopenharmony_cistruct bfi_msgq {
41262306a36Sopenharmony_ci	union bfi_addr_u addr;
41362306a36Sopenharmony_ci	u16 q_depth;     /* Total num of entries in the queue */
41462306a36Sopenharmony_ci	u8 rsvd[2];
41562306a36Sopenharmony_ci} __packed;
41662306a36Sopenharmony_ci
41762306a36Sopenharmony_ci/* BFI_ENET_MSGQ_CFG_REQ TBD init or cfg? */
41862306a36Sopenharmony_cistruct bfi_msgq_cfg_req {
41962306a36Sopenharmony_ci	struct bfi_mhdr mh;
42062306a36Sopenharmony_ci	struct bfi_msgq cmdq;
42162306a36Sopenharmony_ci	struct bfi_msgq rspq;
42262306a36Sopenharmony_ci} __packed;
42362306a36Sopenharmony_ci
42462306a36Sopenharmony_ci/* BFI_ENET_MSGQ_CFG_RSP */
42562306a36Sopenharmony_cistruct bfi_msgq_cfg_rsp {
42662306a36Sopenharmony_ci	struct bfi_mhdr mh;
42762306a36Sopenharmony_ci	u8 cmd_status;
42862306a36Sopenharmony_ci	u8 rsvd[3];
42962306a36Sopenharmony_ci} __packed;
43062306a36Sopenharmony_ci
43162306a36Sopenharmony_ci/* BFI_MSGQ_H2I_DOORBELL */
43262306a36Sopenharmony_cistruct bfi_msgq_h2i_db {
43362306a36Sopenharmony_ci	struct bfi_mhdr mh;
43462306a36Sopenharmony_ci	union {
43562306a36Sopenharmony_ci		u16 cmdq_pi;
43662306a36Sopenharmony_ci		u16 rspq_ci;
43762306a36Sopenharmony_ci	} __packed idx;
43862306a36Sopenharmony_ci} __packed;
43962306a36Sopenharmony_ci
44062306a36Sopenharmony_ci/* BFI_MSGQ_I2H_DOORBELL */
44162306a36Sopenharmony_cistruct bfi_msgq_i2h_db {
44262306a36Sopenharmony_ci	struct bfi_mhdr mh;
44362306a36Sopenharmony_ci	union {
44462306a36Sopenharmony_ci		u16 rspq_pi;
44562306a36Sopenharmony_ci		u16 cmdq_ci;
44662306a36Sopenharmony_ci	} __packed idx;
44762306a36Sopenharmony_ci} __packed;
44862306a36Sopenharmony_ci
44962306a36Sopenharmony_ci#define BFI_CMD_COPY_SZ 28
45062306a36Sopenharmony_ci
45162306a36Sopenharmony_ci/* BFI_MSGQ_H2I_CMD_COPY_RSP */
45262306a36Sopenharmony_cistruct bfi_msgq_h2i_cmdq_copy_rsp {
45362306a36Sopenharmony_ci	struct bfi_mhdr mh;
45462306a36Sopenharmony_ci	u8	      data[BFI_CMD_COPY_SZ];
45562306a36Sopenharmony_ci} __packed;
45662306a36Sopenharmony_ci
45762306a36Sopenharmony_ci/* BFI_MSGQ_I2H_CMD_COPY_REQ */
45862306a36Sopenharmony_cistruct bfi_msgq_i2h_cmdq_copy_req {
45962306a36Sopenharmony_ci	struct bfi_mhdr mh;
46062306a36Sopenharmony_ci	u16     offset;
46162306a36Sopenharmony_ci	u16     len;
46262306a36Sopenharmony_ci} __packed;
46362306a36Sopenharmony_ci
46462306a36Sopenharmony_ci/*
46562306a36Sopenharmony_ci *      FLASH module specific
46662306a36Sopenharmony_ci */
46762306a36Sopenharmony_cienum bfi_flash_h2i_msgs {
46862306a36Sopenharmony_ci	BFI_FLASH_H2I_QUERY_REQ = 1,
46962306a36Sopenharmony_ci	BFI_FLASH_H2I_ERASE_REQ = 2,
47062306a36Sopenharmony_ci	BFI_FLASH_H2I_WRITE_REQ = 3,
47162306a36Sopenharmony_ci	BFI_FLASH_H2I_READ_REQ = 4,
47262306a36Sopenharmony_ci	BFI_FLASH_H2I_BOOT_VER_REQ = 5,
47362306a36Sopenharmony_ci};
47462306a36Sopenharmony_ci
47562306a36Sopenharmony_cienum bfi_flash_i2h_msgs {
47662306a36Sopenharmony_ci	BFI_FLASH_I2H_QUERY_RSP = BFA_I2HM(1),
47762306a36Sopenharmony_ci	BFI_FLASH_I2H_ERASE_RSP = BFA_I2HM(2),
47862306a36Sopenharmony_ci	BFI_FLASH_I2H_WRITE_RSP = BFA_I2HM(3),
47962306a36Sopenharmony_ci	BFI_FLASH_I2H_READ_RSP = BFA_I2HM(4),
48062306a36Sopenharmony_ci	BFI_FLASH_I2H_BOOT_VER_RSP = BFA_I2HM(5),
48162306a36Sopenharmony_ci	BFI_FLASH_I2H_EVENT = BFA_I2HM(127),
48262306a36Sopenharmony_ci};
48362306a36Sopenharmony_ci
48462306a36Sopenharmony_ci/*
48562306a36Sopenharmony_ci * Flash query request
48662306a36Sopenharmony_ci */
48762306a36Sopenharmony_cistruct bfi_flash_query_req {
48862306a36Sopenharmony_ci	struct bfi_mhdr mh;   /* Common msg header */
48962306a36Sopenharmony_ci	struct bfi_alen alen;
49062306a36Sopenharmony_ci} __packed;
49162306a36Sopenharmony_ci
49262306a36Sopenharmony_ci/*
49362306a36Sopenharmony_ci * Flash write request
49462306a36Sopenharmony_ci */
49562306a36Sopenharmony_cistruct bfi_flash_write_req {
49662306a36Sopenharmony_ci	struct bfi_mhdr mh;	/* Common msg header */
49762306a36Sopenharmony_ci	struct bfi_alen alen;
49862306a36Sopenharmony_ci	u32	type;   /* partition type */
49962306a36Sopenharmony_ci	u8	instance; /* partition instance */
50062306a36Sopenharmony_ci	u8	last;
50162306a36Sopenharmony_ci	u8	rsv[2];
50262306a36Sopenharmony_ci	u32	offset;
50362306a36Sopenharmony_ci	u32	length;
50462306a36Sopenharmony_ci} __packed;
50562306a36Sopenharmony_ci
50662306a36Sopenharmony_ci/*
50762306a36Sopenharmony_ci * Flash read request
50862306a36Sopenharmony_ci */
50962306a36Sopenharmony_cistruct bfi_flash_read_req {
51062306a36Sopenharmony_ci	struct bfi_mhdr mh;	/* Common msg header */
51162306a36Sopenharmony_ci	u32	type;		/* partition type */
51262306a36Sopenharmony_ci	u8	instance;	/* partition instance */
51362306a36Sopenharmony_ci	u8	rsv[3];
51462306a36Sopenharmony_ci	u32	offset;
51562306a36Sopenharmony_ci	u32	length;
51662306a36Sopenharmony_ci	struct bfi_alen alen;
51762306a36Sopenharmony_ci} __packed;
51862306a36Sopenharmony_ci
51962306a36Sopenharmony_ci/*
52062306a36Sopenharmony_ci * Flash query response
52162306a36Sopenharmony_ci */
52262306a36Sopenharmony_cistruct bfi_flash_query_rsp {
52362306a36Sopenharmony_ci	struct bfi_mhdr mh;	/* Common msg header */
52462306a36Sopenharmony_ci	u32	status;
52562306a36Sopenharmony_ci} __packed;
52662306a36Sopenharmony_ci
52762306a36Sopenharmony_ci/*
52862306a36Sopenharmony_ci * Flash read response
52962306a36Sopenharmony_ci */
53062306a36Sopenharmony_cistruct bfi_flash_read_rsp {
53162306a36Sopenharmony_ci	struct bfi_mhdr mh;	/* Common msg header */
53262306a36Sopenharmony_ci	u32	type;		/* partition type */
53362306a36Sopenharmony_ci	u8	instance;	/* partition instance */
53462306a36Sopenharmony_ci	u8	rsv[3];
53562306a36Sopenharmony_ci	u32	status;
53662306a36Sopenharmony_ci	u32	length;
53762306a36Sopenharmony_ci} __packed;
53862306a36Sopenharmony_ci
53962306a36Sopenharmony_ci/*
54062306a36Sopenharmony_ci * Flash write response
54162306a36Sopenharmony_ci */
54262306a36Sopenharmony_cistruct bfi_flash_write_rsp {
54362306a36Sopenharmony_ci	struct bfi_mhdr mh;	/* Common msg header */
54462306a36Sopenharmony_ci	u32	type;		/* partition type */
54562306a36Sopenharmony_ci	u8	instance;	/* partition instance */
54662306a36Sopenharmony_ci	u8	rsv[3];
54762306a36Sopenharmony_ci	u32	status;
54862306a36Sopenharmony_ci	u32	length;
54962306a36Sopenharmony_ci} __packed;
55062306a36Sopenharmony_ci
55162306a36Sopenharmony_ci#endif /* __BFI_H__ */
552