1 /* SPDX-License-Identifier: GPL-2.0-only */
2 /*
3  * Marvell Fibre Channel HBA Driver
4  * Copyright (C)  2018-	    Marvell
5  *
6  */
7 #ifndef __QLA_EDIF_BSG_H
8 #define __QLA_EDIF_BSG_H
9 
10 /* BSG Vendor specific commands */
11 #define	ELS_MAX_PAYLOAD		2112
12 #ifndef	WWN_SIZE
13 #define WWN_SIZE		8
14 #endif
15 #define	VND_CMD_APP_RESERVED_SIZE	32
16 
17 enum auth_els_sub_cmd {
18 	SEND_ELS = 0,
19 	SEND_ELS_REPLY,
20 	PULL_ELS,
21 };
22 
23 struct extra_auth_els {
24 	enum auth_els_sub_cmd sub_cmd;
25 	uint32_t        extra_rx_xchg_address;
26 	uint8_t         extra_control_flags;
27 #define BSG_CTL_FLAG_INIT       0
28 #define BSG_CTL_FLAG_LS_ACC     1
29 #define BSG_CTL_FLAG_LS_RJT     2
30 #define BSG_CTL_FLAG_TRM        3
31 	uint8_t         extra_rsvd[3];
32 } __packed;
33 
34 struct qla_bsg_auth_els_request {
35 	struct fc_bsg_request r;
36 	struct extra_auth_els e;
37 };
38 
39 struct qla_bsg_auth_els_reply {
40 	struct fc_bsg_reply r;
41 	uint32_t rx_xchg_address;
42 };
43 
44 struct app_id {
45 	int		app_vid;
46 	uint8_t		app_key[32];
47 } __packed;
48 
49 struct app_start_reply {
50 	uint32_t	host_support_edif;
51 	uint32_t	edif_enode_active;
52 	uint32_t	edif_edb_active;
53 	uint32_t	reserved[VND_CMD_APP_RESERVED_SIZE];
54 } __packed;
55 
56 struct app_start {
57 	struct app_id	app_info;
58 	uint32_t	prli_to;
59 	uint32_t	key_shred;
60 	uint8_t         app_start_flags;
61 	uint8_t         reserved[VND_CMD_APP_RESERVED_SIZE - 1];
62 } __packed;
63 
64 struct app_stop {
65 	struct app_id	app_info;
66 	char		buf[16];
67 } __packed;
68 
69 struct app_plogi_reply {
70 	uint32_t	prli_status;
71 	uint8_t		reserved[VND_CMD_APP_RESERVED_SIZE];
72 } __packed;
73 
74 #define	RECFG_TIME	1
75 #define	RECFG_BYTES	2
76 
77 struct app_rekey_cfg {
78 	struct app_id app_info;
79 	uint8_t	 rekey_mode;
80 	port_id_t d_id;
81 	uint8_t	 force;
82 	union {
83 		int64_t bytes;
84 		int64_t time;
85 	} rky_units;
86 
87 	uint8_t		reserved[VND_CMD_APP_RESERVED_SIZE];
88 } __packed;
89 
90 struct app_pinfo_req {
91 	struct app_id app_info;
92 	uint8_t	 num_ports;
93 	port_id_t remote_pid;
94 	uint8_t	 reserved[VND_CMD_APP_RESERVED_SIZE];
95 } __packed;
96 
97 struct app_pinfo {
98 	port_id_t remote_pid;
99 	uint8_t	remote_wwpn[WWN_SIZE];
100 	uint8_t	remote_type;
101 #define	VND_CMD_RTYPE_UNKNOWN		0
102 #define	VND_CMD_RTYPE_TARGET		1
103 #define	VND_CMD_RTYPE_INITIATOR		2
104 	uint8_t	remote_state;
105 	uint8_t	auth_state;
106 	uint8_t	rekey_mode;
107 	int64_t	rekey_count;
108 	int64_t	rekey_config_value;
109 	int64_t	rekey_consumed_value;
110 
111 	uint8_t	reserved[VND_CMD_APP_RESERVED_SIZE];
112 } __packed;
113 
114 /* AUTH States */
115 #define	VND_CMD_AUTH_STATE_UNDEF	0
116 #define	VND_CMD_AUTH_STATE_SESSION_SHUTDOWN	1
117 #define	VND_CMD_AUTH_STATE_NEEDED	2
118 #define	VND_CMD_AUTH_STATE_ELS_RCVD	3
119 #define	VND_CMD_AUTH_STATE_SAUPDATE_COMPL 4
120 
121 struct app_pinfo_reply {
122 	uint8_t		port_count;
123 	uint8_t		reserved[VND_CMD_APP_RESERVED_SIZE];
124 	struct app_pinfo ports[];
125 } __packed;
126 
127 struct app_sinfo_req {
128 	struct app_id	app_info;
129 	uint8_t		num_ports;
130 	uint8_t		reserved[VND_CMD_APP_RESERVED_SIZE];
131 } __packed;
132 
133 struct app_sinfo {
134 	uint8_t	remote_wwpn[WWN_SIZE];
135 	int64_t	rekey_count;
136 	uint8_t	rekey_mode;
137 	int64_t	tx_bytes;
138 	int64_t	rx_bytes;
139 } __packed;
140 
141 struct app_stats_reply {
142 	uint8_t		elem_count;
143 	struct app_sinfo elem[];
144 } __packed;
145 
146 struct qla_sa_update_frame {
147 	struct app_id	app_info;
148 	uint16_t	flags;
149 #define SAU_FLG_INV		0x01	/* delete key */
150 #define SAU_FLG_TX		0x02	/* 1=tx, 0 = rx */
151 #define SAU_FLG_FORCE_DELETE	0x08
152 #define SAU_FLG_GMAC_MODE	0x20	/*
153 					 * GMAC mode is cleartext for the IO
154 					 * (i.e. NULL encryption)
155 					 */
156 #define SAU_FLG_KEY128          0x40
157 #define SAU_FLG_KEY256          0x80
158 	uint16_t        fast_sa_index:10,
159 			reserved:6;
160 	uint32_t	salt;
161 	uint32_t	spi;
162 	uint8_t		sa_key[32];
163 	uint8_t		node_name[WWN_SIZE];
164 	uint8_t		port_name[WWN_SIZE];
165 	port_id_t	port_id;
166 } __packed;
167 
168 // used for edif mgmt bsg interface
169 #define	QL_VND_SC_UNDEF		0
170 #define	QL_VND_SC_SA_UPDATE	1
171 #define	QL_VND_SC_APP_START	2
172 #define	QL_VND_SC_APP_STOP	3
173 #define	QL_VND_SC_AUTH_OK	4
174 #define	QL_VND_SC_AUTH_FAIL	5
175 #define	QL_VND_SC_REKEY_CONFIG	6
176 #define	QL_VND_SC_GET_FCINFO	7
177 #define	QL_VND_SC_GET_STATS	8
178 
179 /* Application interface data structure for rtn data */
180 #define	EXT_DEF_EVENT_DATA_SIZE	64
181 struct edif_app_dbell {
182 	uint32_t	event_code;
183 	uint32_t	event_data_size;
184 	union  {
185 		port_id_t	port_id;
186 		uint8_t		event_data[EXT_DEF_EVENT_DATA_SIZE];
187 	};
188 } __packed;
189 
190 struct edif_sa_update_aen {
191 	port_id_t port_id;
192 	uint32_t key_type;	/* Tx (1) or RX (2) */
193 	uint32_t status;	/* 0 succes,  1 failed, 2 timeout , 3 error */
194 	uint8_t		reserved[16];
195 } __packed;
196 
197 #define	QL_VND_SA_STAT_SUCCESS	0
198 #define	QL_VND_SA_STAT_FAILED	1
199 #define	QL_VND_SA_STAT_TIMEOUT	2
200 #define	QL_VND_SA_STAT_ERROR	3
201 
202 #define	QL_VND_RX_SA_KEY	1
203 #define	QL_VND_TX_SA_KEY	2
204 
205 /* App defines for plogi auth'd ok and plogi auth bad requests */
206 struct auth_complete_cmd {
207 	struct app_id app_info;
208 #define PL_TYPE_WWPN    1
209 #define PL_TYPE_DID     2
210 	uint32_t    type;
211 	union {
212 		uint8_t  wwpn[WWN_SIZE];
213 		port_id_t d_id;
214 	} u;
215 	uint32_t reserved[VND_CMD_APP_RESERVED_SIZE];
216 } __packed;
217 
218 #define RX_DELAY_DELETE_TIMEOUT 20
219 
220 #endif	/* QLA_EDIF_BSG_H */
221