17ebb336eSQuinn Tran /* SPDX-License-Identifier: GPL-2.0-only */
27ebb336eSQuinn Tran /*
37ebb336eSQuinn Tran  * Marvell Fibre Channel HBA Driver
47ebb336eSQuinn Tran  * Copyright (C)  2018-	    Marvell
57ebb336eSQuinn Tran  *
67ebb336eSQuinn Tran  */
77ebb336eSQuinn Tran #ifndef __QLA_EDIF_BSG_H
87ebb336eSQuinn Tran #define __QLA_EDIF_BSG_H
97ebb336eSQuinn Tran 
107a7b0b48SQuinn Tran #define EDIF_VERSION1 1
117a7b0b48SQuinn Tran 
127ebb336eSQuinn Tran /* BSG Vendor specific commands */
130f6d600aSQuinn Tran #define	ELS_MAX_PAYLOAD		2112
147ebb336eSQuinn Tran #ifndef	WWN_SIZE
157ebb336eSQuinn Tran #define WWN_SIZE		8
167ebb336eSQuinn Tran #endif
177a7b0b48SQuinn Tran #define VND_CMD_APP_RESERVED_SIZE	28
187a7b0b48SQuinn Tran #define VND_CMD_PAD_SIZE                3
197ebb336eSQuinn Tran enum auth_els_sub_cmd {
207ebb336eSQuinn Tran 	SEND_ELS = 0,
217ebb336eSQuinn Tran 	SEND_ELS_REPLY,
227ebb336eSQuinn Tran 	PULL_ELS,
237ebb336eSQuinn Tran };
247ebb336eSQuinn Tran 
257ebb336eSQuinn Tran struct extra_auth_els {
267ebb336eSQuinn Tran 	enum auth_els_sub_cmd sub_cmd;
277ebb336eSQuinn Tran 	uint32_t        extra_rx_xchg_address;
287ebb336eSQuinn Tran 	uint8_t         extra_control_flags;
297ebb336eSQuinn Tran #define BSG_CTL_FLAG_INIT       0
307ebb336eSQuinn Tran #define BSG_CTL_FLAG_LS_ACC     1
317ebb336eSQuinn Tran #define BSG_CTL_FLAG_LS_RJT     2
327ebb336eSQuinn Tran #define BSG_CTL_FLAG_TRM        3
337a7b0b48SQuinn Tran 	uint8_t		version;
347a7b0b48SQuinn Tran 	uint8_t		pad[2];
357a7b0b48SQuinn Tran 	uint8_t		reserved[VND_CMD_APP_RESERVED_SIZE];
367ebb336eSQuinn Tran } __packed;
377ebb336eSQuinn Tran 
387ebb336eSQuinn Tran struct qla_bsg_auth_els_request {
397ebb336eSQuinn Tran 	struct fc_bsg_request r;
407ebb336eSQuinn Tran 	struct extra_auth_els e;
417ebb336eSQuinn Tran };
427ebb336eSQuinn Tran 
437ebb336eSQuinn Tran struct qla_bsg_auth_els_reply {
447ebb336eSQuinn Tran 	struct fc_bsg_reply r;
457ebb336eSQuinn Tran 	uint32_t rx_xchg_address;
467a7b0b48SQuinn Tran 	uint8_t version;
477a7b0b48SQuinn Tran 	uint8_t pad[VND_CMD_PAD_SIZE];
487a7b0b48SQuinn Tran 	uint8_t reserved[VND_CMD_APP_RESERVED_SIZE];
497ebb336eSQuinn Tran };
507ebb336eSQuinn Tran 
517ebb336eSQuinn Tran struct app_id {
527ebb336eSQuinn Tran 	int		app_vid;
537a7b0b48SQuinn Tran 	uint8_t		version;
547a7b0b48SQuinn Tran 	uint8_t		pad[VND_CMD_PAD_SIZE];
557a7b0b48SQuinn Tran 	uint8_t		reserved[VND_CMD_APP_RESERVED_SIZE];
567ebb336eSQuinn Tran } __packed;
577ebb336eSQuinn Tran 
587ebb336eSQuinn Tran struct app_start_reply {
597ebb336eSQuinn Tran 	uint32_t	host_support_edif;
607ebb336eSQuinn Tran 	uint32_t	edif_enode_active;
617ebb336eSQuinn Tran 	uint32_t	edif_edb_active;
627a7b0b48SQuinn Tran 	uint8_t		version;
637a7b0b48SQuinn Tran 	uint8_t		pad[VND_CMD_PAD_SIZE];
647a7b0b48SQuinn Tran 	uint8_t		reserved[VND_CMD_APP_RESERVED_SIZE];
657ebb336eSQuinn Tran } __packed;
667ebb336eSQuinn Tran 
677ebb336eSQuinn Tran struct app_start {
687ebb336eSQuinn Tran 	struct app_id	app_info;
697ebb336eSQuinn Tran 	uint8_t         app_start_flags;
707a7b0b48SQuinn Tran 	uint8_t		version;
717a7b0b48SQuinn Tran 	uint8_t		pad[2];
727a7b0b48SQuinn Tran 	uint8_t		reserved[VND_CMD_APP_RESERVED_SIZE];
737ebb336eSQuinn Tran } __packed;
747ebb336eSQuinn Tran 
757ebb336eSQuinn Tran struct app_stop {
767ebb336eSQuinn Tran 	struct app_id	app_info;
777a7b0b48SQuinn Tran 	uint8_t		version;
787a7b0b48SQuinn Tran 	uint8_t		pad[VND_CMD_PAD_SIZE];
797a7b0b48SQuinn Tran 	uint8_t		reserved[VND_CMD_APP_RESERVED_SIZE];
807ebb336eSQuinn Tran } __packed;
817ebb336eSQuinn Tran 
827ebb336eSQuinn Tran struct app_plogi_reply {
837ebb336eSQuinn Tran 	uint32_t	prli_status;
847a7b0b48SQuinn Tran 	uint8_t		version;
857a7b0b48SQuinn Tran 	uint8_t		pad[VND_CMD_PAD_SIZE];
867ebb336eSQuinn Tran 	uint8_t		reserved[VND_CMD_APP_RESERVED_SIZE];
877ebb336eSQuinn Tran } __packed;
887ebb336eSQuinn Tran 
897ebb336eSQuinn Tran struct app_pinfo_req {
907ebb336eSQuinn Tran 	struct app_id app_info;
917ebb336eSQuinn Tran 	uint8_t	 num_ports;
92*2f5fab1bSQuinn Tran 	struct {
93*2f5fab1bSQuinn Tran #ifdef __BIG_ENDIAN
94*2f5fab1bSQuinn Tran 		uint8_t domain;
95*2f5fab1bSQuinn Tran 		uint8_t area;
96*2f5fab1bSQuinn Tran 		uint8_t al_pa;
97*2f5fab1bSQuinn Tran #elif defined(__LITTLE_ENDIAN)
98*2f5fab1bSQuinn Tran 		uint8_t al_pa;
99*2f5fab1bSQuinn Tran 		uint8_t area;
100*2f5fab1bSQuinn Tran 		uint8_t domain;
101*2f5fab1bSQuinn Tran #else
102*2f5fab1bSQuinn Tran #error "__BIG_ENDIAN or __LITTLE_ENDIAN must be defined!"
103*2f5fab1bSQuinn Tran #endif
104*2f5fab1bSQuinn Tran 		uint8_t rsvd_1;
105*2f5fab1bSQuinn Tran 	} remote_pid;
1067a7b0b48SQuinn Tran 	uint8_t		version;
1077a7b0b48SQuinn Tran 	uint8_t		pad[VND_CMD_PAD_SIZE];
1087ebb336eSQuinn Tran 	uint8_t		reserved[VND_CMD_APP_RESERVED_SIZE];
1097ebb336eSQuinn Tran } __packed;
1107ebb336eSQuinn Tran 
1117ebb336eSQuinn Tran struct app_pinfo {
1127ebb336eSQuinn Tran 	port_id_t remote_pid;
1137ebb336eSQuinn Tran 	uint8_t	remote_wwpn[WWN_SIZE];
1147ebb336eSQuinn Tran 	uint8_t	remote_type;
1157ebb336eSQuinn Tran #define	VND_CMD_RTYPE_UNKNOWN		0
1167ebb336eSQuinn Tran #define	VND_CMD_RTYPE_TARGET		1
1177ebb336eSQuinn Tran #define	VND_CMD_RTYPE_INITIATOR		2
1187ebb336eSQuinn Tran 	uint8_t	remote_state;
1197ebb336eSQuinn Tran 	uint8_t	auth_state;
1207a7b0b48SQuinn Tran 	uint8_t	version;
1217a7b0b48SQuinn Tran 	uint8_t	pad[VND_CMD_PAD_SIZE];
1227ebb336eSQuinn Tran 	uint8_t	reserved[VND_CMD_APP_RESERVED_SIZE];
1237ebb336eSQuinn Tran } __packed;
1247ebb336eSQuinn Tran 
1257ebb336eSQuinn Tran /* AUTH States */
1267ebb336eSQuinn Tran #define	VND_CMD_AUTH_STATE_UNDEF	0
1277ebb336eSQuinn Tran #define	VND_CMD_AUTH_STATE_SESSION_SHUTDOWN	1
1287ebb336eSQuinn Tran #define	VND_CMD_AUTH_STATE_NEEDED	2
1297ebb336eSQuinn Tran #define	VND_CMD_AUTH_STATE_ELS_RCVD	3
1307ebb336eSQuinn Tran #define	VND_CMD_AUTH_STATE_SAUPDATE_COMPL 4
1317ebb336eSQuinn Tran 
1327ebb336eSQuinn Tran struct app_pinfo_reply {
1337ebb336eSQuinn Tran 	uint8_t		port_count;
1347a7b0b48SQuinn Tran 	uint8_t		version;
1357a7b0b48SQuinn Tran 	uint8_t		pad[VND_CMD_PAD_SIZE];
1367ebb336eSQuinn Tran 	uint8_t		reserved[VND_CMD_APP_RESERVED_SIZE];
1375224f790SGustavo A. R. Silva 	struct app_pinfo ports[];
1387ebb336eSQuinn Tran } __packed;
1397ebb336eSQuinn Tran 
1407ebb336eSQuinn Tran struct app_sinfo_req {
1417ebb336eSQuinn Tran 	struct app_id	app_info;
1427ebb336eSQuinn Tran 	uint8_t		num_ports;
1437a7b0b48SQuinn Tran 	uint8_t		version;
1447a7b0b48SQuinn Tran 	uint8_t		pad[VND_CMD_PAD_SIZE];
1457ebb336eSQuinn Tran 	uint8_t		reserved[VND_CMD_APP_RESERVED_SIZE];
1467ebb336eSQuinn Tran } __packed;
1477ebb336eSQuinn Tran 
1487ebb336eSQuinn Tran struct app_sinfo {
1497ebb336eSQuinn Tran 	uint8_t	remote_wwpn[WWN_SIZE];
1507ebb336eSQuinn Tran 	int64_t	rekey_count;
1517ebb336eSQuinn Tran 	uint8_t	rekey_mode;
1527ebb336eSQuinn Tran 	int64_t	tx_bytes;
1537ebb336eSQuinn Tran 	int64_t	rx_bytes;
1547ebb336eSQuinn Tran } __packed;
1557ebb336eSQuinn Tran 
1567ebb336eSQuinn Tran struct app_stats_reply {
1577ebb336eSQuinn Tran 	uint8_t		elem_count;
1587a7b0b48SQuinn Tran 	uint8_t		version;
1597a7b0b48SQuinn Tran 	uint8_t		pad[VND_CMD_PAD_SIZE];
1607a7b0b48SQuinn Tran 	uint8_t		reserved[VND_CMD_APP_RESERVED_SIZE];
1615224f790SGustavo A. R. Silva 	struct app_sinfo elem[];
1627ebb336eSQuinn Tran } __packed;
1637ebb336eSQuinn Tran 
1647ebb336eSQuinn Tran struct qla_sa_update_frame {
1657ebb336eSQuinn Tran 	struct app_id	app_info;
1667ebb336eSQuinn Tran 	uint16_t	flags;
1677ebb336eSQuinn Tran #define SAU_FLG_INV		0x01	/* delete key */
1687ebb336eSQuinn Tran #define SAU_FLG_TX		0x02	/* 1=tx, 0 = rx */
1697ebb336eSQuinn Tran #define SAU_FLG_FORCE_DELETE	0x08
1707ebb336eSQuinn Tran #define SAU_FLG_GMAC_MODE	0x20	/*
1717ebb336eSQuinn Tran 					 * GMAC mode is cleartext for the IO
1727ebb336eSQuinn Tran 					 * (i.e. NULL encryption)
1737ebb336eSQuinn Tran 					 */
1747ebb336eSQuinn Tran #define SAU_FLG_KEY128          0x40
1757ebb336eSQuinn Tran #define SAU_FLG_KEY256          0x80
1767ebb336eSQuinn Tran 	uint16_t        fast_sa_index:10,
1777ebb336eSQuinn Tran 			reserved:6;
1787ebb336eSQuinn Tran 	uint32_t	salt;
1797ebb336eSQuinn Tran 	uint32_t	spi;
1807ebb336eSQuinn Tran 	uint8_t		sa_key[32];
1817ebb336eSQuinn Tran 	uint8_t		node_name[WWN_SIZE];
1827ebb336eSQuinn Tran 	uint8_t		port_name[WWN_SIZE];
1837ebb336eSQuinn Tran 	port_id_t	port_id;
1847a7b0b48SQuinn Tran 	uint8_t		version;
1857a7b0b48SQuinn Tran 	uint8_t		pad[VND_CMD_PAD_SIZE];
1867a7b0b48SQuinn Tran 	uint8_t		reserved2[VND_CMD_APP_RESERVED_SIZE];
1877ebb336eSQuinn Tran } __packed;
1887ebb336eSQuinn Tran 
1897ebb336eSQuinn Tran #define	QL_VND_SC_UNDEF		0
1907ebb336eSQuinn Tran #define	QL_VND_SC_SA_UPDATE	1
1917ebb336eSQuinn Tran #define	QL_VND_SC_APP_START	2
1927ebb336eSQuinn Tran #define	QL_VND_SC_APP_STOP	3
1937ebb336eSQuinn Tran #define	QL_VND_SC_AUTH_OK	4
1947ebb336eSQuinn Tran #define	QL_VND_SC_AUTH_FAIL	5
1957ebb336eSQuinn Tran #define	QL_VND_SC_REKEY_CONFIG	6
1967ebb336eSQuinn Tran #define	QL_VND_SC_GET_FCINFO	7
1977ebb336eSQuinn Tran #define	QL_VND_SC_GET_STATS	8
1987a7b0b48SQuinn Tran #define QL_VND_SC_AEN_COMPLETE  9
1995ecd241bSQuinn Tran #define QL_VND_SC_READ_DBELL	10
2005ecd241bSQuinn Tran 
2015ecd241bSQuinn Tran /*
2025ecd241bSQuinn Tran  * bsg caller to provide empty buffer for doorbell events.
2035ecd241bSQuinn Tran  *
2045ecd241bSQuinn Tran  * sg_io_v4.din_xferp  = empty buffer for door bell events
2055ecd241bSQuinn Tran  * sg_io_v4.dout_xferp = struct edif_read_dbell *buf
2065ecd241bSQuinn Tran  */
2075ecd241bSQuinn Tran struct edif_read_dbell {
2085ecd241bSQuinn Tran 	struct app_id app_info;
2095ecd241bSQuinn Tran 	uint8_t version;
2105ecd241bSQuinn Tran 	uint8_t pad[VND_CMD_PAD_SIZE];
2115ecd241bSQuinn Tran 	uint8_t reserved[VND_CMD_APP_RESERVED_SIZE];
2125ecd241bSQuinn Tran };
2137a7b0b48SQuinn Tran 
2147ebb336eSQuinn Tran 
2157ebb336eSQuinn Tran /* Application interface data structure for rtn data */
2167ebb336eSQuinn Tran #define	EXT_DEF_EVENT_DATA_SIZE	64
2177ebb336eSQuinn Tran struct edif_app_dbell {
2187ebb336eSQuinn Tran 	uint32_t	event_code;
2197ebb336eSQuinn Tran 	uint32_t	event_data_size;
2207ebb336eSQuinn Tran 	union  {
2217ebb336eSQuinn Tran 		port_id_t	port_id;
2227ebb336eSQuinn Tran 		uint8_t		event_data[EXT_DEF_EVENT_DATA_SIZE];
2237ebb336eSQuinn Tran 	};
2247ebb336eSQuinn Tran } __packed;
2257ebb336eSQuinn Tran 
2267ebb336eSQuinn Tran struct edif_sa_update_aen {
2277ebb336eSQuinn Tran 	port_id_t port_id;
2287ebb336eSQuinn Tran 	uint32_t key_type;	/* Tx (1) or RX (2) */
2297ebb336eSQuinn Tran 	uint32_t status;	/* 0 succes,  1 failed, 2 timeout , 3 error */
2307a7b0b48SQuinn Tran 	uint8_t	version;
2317a7b0b48SQuinn Tran 	uint8_t	pad[VND_CMD_PAD_SIZE];
2327a7b0b48SQuinn Tran 	uint8_t	reserved[VND_CMD_APP_RESERVED_SIZE];
2337ebb336eSQuinn Tran } __packed;
2347ebb336eSQuinn Tran 
2357ebb336eSQuinn Tran #define	QL_VND_SA_STAT_SUCCESS	0
2367ebb336eSQuinn Tran #define	QL_VND_SA_STAT_FAILED	1
2377ebb336eSQuinn Tran #define	QL_VND_SA_STAT_TIMEOUT	2
2387ebb336eSQuinn Tran #define	QL_VND_SA_STAT_ERROR	3
2397ebb336eSQuinn Tran 
2407ebb336eSQuinn Tran #define	QL_VND_RX_SA_KEY	1
2417ebb336eSQuinn Tran #define	QL_VND_TX_SA_KEY	2
2427ebb336eSQuinn Tran 
2437ebb336eSQuinn Tran /* App defines for plogi auth'd ok and plogi auth bad requests */
2447ebb336eSQuinn Tran struct auth_complete_cmd {
2457ebb336eSQuinn Tran 	struct app_id app_info;
2467ebb336eSQuinn Tran #define PL_TYPE_WWPN    1
2477ebb336eSQuinn Tran #define PL_TYPE_DID     2
2487ebb336eSQuinn Tran 	uint32_t    type;
2497ebb336eSQuinn Tran 	union {
2507ebb336eSQuinn Tran 		uint8_t  wwpn[WWN_SIZE];
2517ebb336eSQuinn Tran 		port_id_t d_id;
2527ebb336eSQuinn Tran 	} u;
2537a7b0b48SQuinn Tran 	uint8_t	version;
2547a7b0b48SQuinn Tran 	uint8_t	pad[VND_CMD_PAD_SIZE];
2557a7b0b48SQuinn Tran 	uint8_t	reserved[VND_CMD_APP_RESERVED_SIZE];
2567a7b0b48SQuinn Tran } __packed;
2577a7b0b48SQuinn Tran 
2587a7b0b48SQuinn Tran struct aen_complete_cmd {
2597a7b0b48SQuinn Tran 	struct app_id app_info;
2607a7b0b48SQuinn Tran 	port_id_t   port_id;
2617a7b0b48SQuinn Tran 	uint32_t    event_code;
2627a7b0b48SQuinn Tran 	uint8_t     version;
2637a7b0b48SQuinn Tran 	uint8_t     pad[VND_CMD_PAD_SIZE];
2647a7b0b48SQuinn Tran 	uint8_t     reserved[VND_CMD_APP_RESERVED_SIZE];
2657ebb336eSQuinn Tran } __packed;
2667ebb336eSQuinn Tran 
2677ebb336eSQuinn Tran #define RX_DELAY_DELETE_TIMEOUT 20
2687ebb336eSQuinn Tran 
269cf79716eSQuinn Tran #define FCH_EVT_VENDOR_UNIQUE_VPORT_DOWN  1
270cf79716eSQuinn Tran 
2717ebb336eSQuinn Tran #endif	/* QLA_EDIF_BSG_H */
272