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;
927ebb336eSQuinn Tran 	port_id_t remote_pid;
937a7b0b48SQuinn Tran 	uint8_t		version;
947a7b0b48SQuinn Tran 	uint8_t		pad[VND_CMD_PAD_SIZE];
957ebb336eSQuinn Tran 	uint8_t		reserved[VND_CMD_APP_RESERVED_SIZE];
967ebb336eSQuinn Tran } __packed;
977ebb336eSQuinn Tran 
987ebb336eSQuinn Tran struct app_pinfo {
997ebb336eSQuinn Tran 	port_id_t remote_pid;
1007ebb336eSQuinn Tran 	uint8_t	remote_wwpn[WWN_SIZE];
1017ebb336eSQuinn Tran 	uint8_t	remote_type;
1027ebb336eSQuinn Tran #define	VND_CMD_RTYPE_UNKNOWN		0
1037ebb336eSQuinn Tran #define	VND_CMD_RTYPE_TARGET		1
1047ebb336eSQuinn Tran #define	VND_CMD_RTYPE_INITIATOR		2
1057ebb336eSQuinn Tran 	uint8_t	remote_state;
1067ebb336eSQuinn Tran 	uint8_t	auth_state;
1077a7b0b48SQuinn Tran 	uint8_t	version;
1087a7b0b48SQuinn Tran 	uint8_t	pad[VND_CMD_PAD_SIZE];
1097ebb336eSQuinn Tran 	uint8_t	reserved[VND_CMD_APP_RESERVED_SIZE];
1107ebb336eSQuinn Tran } __packed;
1117ebb336eSQuinn Tran 
1127ebb336eSQuinn Tran /* AUTH States */
1137ebb336eSQuinn Tran #define	VND_CMD_AUTH_STATE_UNDEF	0
1147ebb336eSQuinn Tran #define	VND_CMD_AUTH_STATE_SESSION_SHUTDOWN	1
1157ebb336eSQuinn Tran #define	VND_CMD_AUTH_STATE_NEEDED	2
1167ebb336eSQuinn Tran #define	VND_CMD_AUTH_STATE_ELS_RCVD	3
1177ebb336eSQuinn Tran #define	VND_CMD_AUTH_STATE_SAUPDATE_COMPL 4
1187ebb336eSQuinn Tran 
1197ebb336eSQuinn Tran struct app_pinfo_reply {
1207ebb336eSQuinn Tran 	uint8_t		port_count;
1217a7b0b48SQuinn Tran 	uint8_t		version;
1227a7b0b48SQuinn Tran 	uint8_t		pad[VND_CMD_PAD_SIZE];
1237ebb336eSQuinn Tran 	uint8_t		reserved[VND_CMD_APP_RESERVED_SIZE];
1245224f790SGustavo A. R. Silva 	struct app_pinfo ports[];
1257ebb336eSQuinn Tran } __packed;
1267ebb336eSQuinn Tran 
1277ebb336eSQuinn Tran struct app_sinfo_req {
1287ebb336eSQuinn Tran 	struct app_id	app_info;
1297ebb336eSQuinn Tran 	uint8_t		num_ports;
1307a7b0b48SQuinn Tran 	uint8_t		version;
1317a7b0b48SQuinn Tran 	uint8_t		pad[VND_CMD_PAD_SIZE];
1327ebb336eSQuinn Tran 	uint8_t		reserved[VND_CMD_APP_RESERVED_SIZE];
1337ebb336eSQuinn Tran } __packed;
1347ebb336eSQuinn Tran 
1357ebb336eSQuinn Tran struct app_sinfo {
1367ebb336eSQuinn Tran 	uint8_t	remote_wwpn[WWN_SIZE];
1377ebb336eSQuinn Tran 	int64_t	rekey_count;
1387ebb336eSQuinn Tran 	uint8_t	rekey_mode;
1397ebb336eSQuinn Tran 	int64_t	tx_bytes;
1407ebb336eSQuinn Tran 	int64_t	rx_bytes;
1417ebb336eSQuinn Tran } __packed;
1427ebb336eSQuinn Tran 
1437ebb336eSQuinn Tran struct app_stats_reply {
1447ebb336eSQuinn Tran 	uint8_t		elem_count;
1457a7b0b48SQuinn Tran 	uint8_t		version;
1467a7b0b48SQuinn Tran 	uint8_t		pad[VND_CMD_PAD_SIZE];
1477a7b0b48SQuinn Tran 	uint8_t		reserved[VND_CMD_APP_RESERVED_SIZE];
1485224f790SGustavo A. R. Silva 	struct app_sinfo elem[];
1497ebb336eSQuinn Tran } __packed;
1507ebb336eSQuinn Tran 
1517ebb336eSQuinn Tran struct qla_sa_update_frame {
1527ebb336eSQuinn Tran 	struct app_id	app_info;
1537ebb336eSQuinn Tran 	uint16_t	flags;
1547ebb336eSQuinn Tran #define SAU_FLG_INV		0x01	/* delete key */
1557ebb336eSQuinn Tran #define SAU_FLG_TX		0x02	/* 1=tx, 0 = rx */
1567ebb336eSQuinn Tran #define SAU_FLG_FORCE_DELETE	0x08
1577ebb336eSQuinn Tran #define SAU_FLG_GMAC_MODE	0x20	/*
1587ebb336eSQuinn Tran 					 * GMAC mode is cleartext for the IO
1597ebb336eSQuinn Tran 					 * (i.e. NULL encryption)
1607ebb336eSQuinn Tran 					 */
1617ebb336eSQuinn Tran #define SAU_FLG_KEY128          0x40
1627ebb336eSQuinn Tran #define SAU_FLG_KEY256          0x80
1637ebb336eSQuinn Tran 	uint16_t        fast_sa_index:10,
1647ebb336eSQuinn Tran 			reserved:6;
1657ebb336eSQuinn Tran 	uint32_t	salt;
1667ebb336eSQuinn Tran 	uint32_t	spi;
1677ebb336eSQuinn Tran 	uint8_t		sa_key[32];
1687ebb336eSQuinn Tran 	uint8_t		node_name[WWN_SIZE];
1697ebb336eSQuinn Tran 	uint8_t		port_name[WWN_SIZE];
1707ebb336eSQuinn Tran 	port_id_t	port_id;
1717a7b0b48SQuinn Tran 	uint8_t		version;
1727a7b0b48SQuinn Tran 	uint8_t		pad[VND_CMD_PAD_SIZE];
1737a7b0b48SQuinn Tran 	uint8_t		reserved2[VND_CMD_APP_RESERVED_SIZE];
1747ebb336eSQuinn Tran } __packed;
1757ebb336eSQuinn Tran 
1767ebb336eSQuinn Tran #define	QL_VND_SC_UNDEF		0
1777ebb336eSQuinn Tran #define	QL_VND_SC_SA_UPDATE	1
1787ebb336eSQuinn Tran #define	QL_VND_SC_APP_START	2
1797ebb336eSQuinn Tran #define	QL_VND_SC_APP_STOP	3
1807ebb336eSQuinn Tran #define	QL_VND_SC_AUTH_OK	4
1817ebb336eSQuinn Tran #define	QL_VND_SC_AUTH_FAIL	5
1827ebb336eSQuinn Tran #define	QL_VND_SC_REKEY_CONFIG	6
1837ebb336eSQuinn Tran #define	QL_VND_SC_GET_FCINFO	7
1847ebb336eSQuinn Tran #define	QL_VND_SC_GET_STATS	8
1857a7b0b48SQuinn Tran #define QL_VND_SC_AEN_COMPLETE  9
186*5ecd241bSQuinn Tran #define QL_VND_SC_READ_DBELL	10
187*5ecd241bSQuinn Tran 
188*5ecd241bSQuinn Tran /*
189*5ecd241bSQuinn Tran  * bsg caller to provide empty buffer for doorbell events.
190*5ecd241bSQuinn Tran  *
191*5ecd241bSQuinn Tran  * sg_io_v4.din_xferp  = empty buffer for door bell events
192*5ecd241bSQuinn Tran  * sg_io_v4.dout_xferp = struct edif_read_dbell *buf
193*5ecd241bSQuinn Tran  */
194*5ecd241bSQuinn Tran struct edif_read_dbell {
195*5ecd241bSQuinn Tran 	struct app_id app_info;
196*5ecd241bSQuinn Tran 	uint8_t version;
197*5ecd241bSQuinn Tran 	uint8_t pad[VND_CMD_PAD_SIZE];
198*5ecd241bSQuinn Tran 	uint8_t reserved[VND_CMD_APP_RESERVED_SIZE];
199*5ecd241bSQuinn Tran };
2007a7b0b48SQuinn Tran 
2017ebb336eSQuinn Tran 
2027ebb336eSQuinn Tran /* Application interface data structure for rtn data */
2037ebb336eSQuinn Tran #define	EXT_DEF_EVENT_DATA_SIZE	64
2047ebb336eSQuinn Tran struct edif_app_dbell {
2057ebb336eSQuinn Tran 	uint32_t	event_code;
2067ebb336eSQuinn Tran 	uint32_t	event_data_size;
2077ebb336eSQuinn Tran 	union  {
2087ebb336eSQuinn Tran 		port_id_t	port_id;
2097ebb336eSQuinn Tran 		uint8_t		event_data[EXT_DEF_EVENT_DATA_SIZE];
2107ebb336eSQuinn Tran 	};
2117ebb336eSQuinn Tran } __packed;
2127ebb336eSQuinn Tran 
2137ebb336eSQuinn Tran struct edif_sa_update_aen {
2147ebb336eSQuinn Tran 	port_id_t port_id;
2157ebb336eSQuinn Tran 	uint32_t key_type;	/* Tx (1) or RX (2) */
2167ebb336eSQuinn Tran 	uint32_t status;	/* 0 succes,  1 failed, 2 timeout , 3 error */
2177a7b0b48SQuinn Tran 	uint8_t	version;
2187a7b0b48SQuinn Tran 	uint8_t	pad[VND_CMD_PAD_SIZE];
2197a7b0b48SQuinn Tran 	uint8_t	reserved[VND_CMD_APP_RESERVED_SIZE];
2207ebb336eSQuinn Tran } __packed;
2217ebb336eSQuinn Tran 
2227ebb336eSQuinn Tran #define	QL_VND_SA_STAT_SUCCESS	0
2237ebb336eSQuinn Tran #define	QL_VND_SA_STAT_FAILED	1
2247ebb336eSQuinn Tran #define	QL_VND_SA_STAT_TIMEOUT	2
2257ebb336eSQuinn Tran #define	QL_VND_SA_STAT_ERROR	3
2267ebb336eSQuinn Tran 
2277ebb336eSQuinn Tran #define	QL_VND_RX_SA_KEY	1
2287ebb336eSQuinn Tran #define	QL_VND_TX_SA_KEY	2
2297ebb336eSQuinn Tran 
2307ebb336eSQuinn Tran /* App defines for plogi auth'd ok and plogi auth bad requests */
2317ebb336eSQuinn Tran struct auth_complete_cmd {
2327ebb336eSQuinn Tran 	struct app_id app_info;
2337ebb336eSQuinn Tran #define PL_TYPE_WWPN    1
2347ebb336eSQuinn Tran #define PL_TYPE_DID     2
2357ebb336eSQuinn Tran 	uint32_t    type;
2367ebb336eSQuinn Tran 	union {
2377ebb336eSQuinn Tran 		uint8_t  wwpn[WWN_SIZE];
2387ebb336eSQuinn Tran 		port_id_t d_id;
2397ebb336eSQuinn Tran 	} u;
2407a7b0b48SQuinn Tran 	uint8_t	version;
2417a7b0b48SQuinn Tran 	uint8_t	pad[VND_CMD_PAD_SIZE];
2427a7b0b48SQuinn Tran 	uint8_t	reserved[VND_CMD_APP_RESERVED_SIZE];
2437a7b0b48SQuinn Tran } __packed;
2447a7b0b48SQuinn Tran 
2457a7b0b48SQuinn Tran struct aen_complete_cmd {
2467a7b0b48SQuinn Tran 	struct app_id app_info;
2477a7b0b48SQuinn Tran 	port_id_t   port_id;
2487a7b0b48SQuinn Tran 	uint32_t    event_code;
2497a7b0b48SQuinn Tran 	uint8_t     version;
2507a7b0b48SQuinn Tran 	uint8_t     pad[VND_CMD_PAD_SIZE];
2517a7b0b48SQuinn Tran 	uint8_t     reserved[VND_CMD_APP_RESERVED_SIZE];
2527ebb336eSQuinn Tran } __packed;
2537ebb336eSQuinn Tran 
2547ebb336eSQuinn Tran #define RX_DELAY_DELETE_TIMEOUT 20
2557ebb336eSQuinn Tran 
2567ebb336eSQuinn Tran #endif	/* QLA_EDIF_BSG_H */
257