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 #define EDIF_VERSION1 1
11 
12 /* BSG Vendor specific commands */
13 #define	ELS_MAX_PAYLOAD		2112
14 #ifndef	WWN_SIZE
15 #define WWN_SIZE		8
16 #endif
17 #define VND_CMD_APP_RESERVED_SIZE	28
18 #define VND_CMD_PAD_SIZE                3
19 enum auth_els_sub_cmd {
20 	SEND_ELS = 0,
21 	SEND_ELS_REPLY,
22 	PULL_ELS,
23 };
24 
25 struct extra_auth_els {
26 	enum auth_els_sub_cmd sub_cmd;
27 	uint32_t        extra_rx_xchg_address;
28 	uint8_t         extra_control_flags;
29 #define BSG_CTL_FLAG_INIT       0
30 #define BSG_CTL_FLAG_LS_ACC     1
31 #define BSG_CTL_FLAG_LS_RJT     2
32 #define BSG_CTL_FLAG_TRM        3
33 	uint8_t		version;
34 	uint8_t		pad[2];
35 	uint8_t		reserved[VND_CMD_APP_RESERVED_SIZE];
36 } __packed;
37 
38 struct qla_bsg_auth_els_request {
39 	struct fc_bsg_request r;
40 	struct extra_auth_els e;
41 };
42 
43 struct qla_bsg_auth_els_reply {
44 	struct fc_bsg_reply r;
45 	uint32_t rx_xchg_address;
46 	uint8_t version;
47 	uint8_t pad[VND_CMD_PAD_SIZE];
48 	uint8_t reserved[VND_CMD_APP_RESERVED_SIZE];
49 };
50 
51 struct app_id {
52 	int		app_vid;
53 	uint8_t		version;
54 	uint8_t		pad[VND_CMD_PAD_SIZE];
55 	uint8_t		reserved[VND_CMD_APP_RESERVED_SIZE];
56 } __packed;
57 
58 struct app_start_reply {
59 	uint32_t	host_support_edif;
60 	uint32_t	edif_enode_active;
61 	uint32_t	edif_edb_active;
62 	uint8_t		version;
63 	uint8_t		pad[VND_CMD_PAD_SIZE];
64 	uint8_t		reserved[VND_CMD_APP_RESERVED_SIZE];
65 } __packed;
66 
67 struct app_start {
68 	struct app_id	app_info;
69 	uint8_t         app_start_flags;
70 	uint8_t		version;
71 	uint8_t		pad[2];
72 	uint8_t		reserved[VND_CMD_APP_RESERVED_SIZE];
73 } __packed;
74 
75 struct app_stop {
76 	struct app_id	app_info;
77 	uint8_t		version;
78 	uint8_t		pad[VND_CMD_PAD_SIZE];
79 	uint8_t		reserved[VND_CMD_APP_RESERVED_SIZE];
80 } __packed;
81 
82 struct app_plogi_reply {
83 	uint32_t	prli_status;
84 	uint8_t		version;
85 	uint8_t		pad[VND_CMD_PAD_SIZE];
86 	uint8_t		reserved[VND_CMD_APP_RESERVED_SIZE];
87 } __packed;
88 
89 struct app_pinfo_req {
90 	struct app_id app_info;
91 	uint8_t	 num_ports;
92 	struct {
93 #ifdef __BIG_ENDIAN
94 		uint8_t domain;
95 		uint8_t area;
96 		uint8_t al_pa;
97 #elif defined(__LITTLE_ENDIAN)
98 		uint8_t al_pa;
99 		uint8_t area;
100 		uint8_t domain;
101 #else
102 #error "__BIG_ENDIAN or __LITTLE_ENDIAN must be defined!"
103 #endif
104 		uint8_t rsvd_1;
105 	} remote_pid;
106 	uint8_t		version;
107 	uint8_t		pad[VND_CMD_PAD_SIZE];
108 	uint8_t		reserved[VND_CMD_APP_RESERVED_SIZE];
109 } __packed;
110 
111 struct app_pinfo {
112 	port_id_t remote_pid;
113 	uint8_t	remote_wwpn[WWN_SIZE];
114 	uint8_t	remote_type;
115 #define	VND_CMD_RTYPE_UNKNOWN		0
116 #define	VND_CMD_RTYPE_TARGET		1
117 #define	VND_CMD_RTYPE_INITIATOR		2
118 	uint8_t	remote_state;
119 	uint8_t	auth_state;
120 	uint8_t	version;
121 	uint8_t	pad[VND_CMD_PAD_SIZE];
122 	uint8_t	reserved[VND_CMD_APP_RESERVED_SIZE];
123 } __packed;
124 
125 /* AUTH States */
126 #define	VND_CMD_AUTH_STATE_UNDEF	0
127 #define	VND_CMD_AUTH_STATE_SESSION_SHUTDOWN	1
128 #define	VND_CMD_AUTH_STATE_NEEDED	2
129 #define	VND_CMD_AUTH_STATE_ELS_RCVD	3
130 #define	VND_CMD_AUTH_STATE_SAUPDATE_COMPL 4
131 
132 struct app_pinfo_reply {
133 	uint8_t		port_count;
134 	uint8_t		version;
135 	uint8_t		pad[VND_CMD_PAD_SIZE];
136 	uint8_t		reserved[VND_CMD_APP_RESERVED_SIZE];
137 	struct app_pinfo ports[];
138 } __packed;
139 
140 struct app_sinfo_req {
141 	struct app_id	app_info;
142 	uint8_t		num_ports;
143 	uint8_t		version;
144 	uint8_t		pad[VND_CMD_PAD_SIZE];
145 	uint8_t		reserved[VND_CMD_APP_RESERVED_SIZE];
146 } __packed;
147 
148 struct app_sinfo {
149 	uint8_t	remote_wwpn[WWN_SIZE];
150 	int64_t	rekey_count;
151 	uint8_t	rekey_mode;
152 	int64_t	tx_bytes;
153 	int64_t	rx_bytes;
154 } __packed;
155 
156 struct app_stats_reply {
157 	uint8_t		elem_count;
158 	uint8_t		version;
159 	uint8_t		pad[VND_CMD_PAD_SIZE];
160 	uint8_t		reserved[VND_CMD_APP_RESERVED_SIZE];
161 	struct app_sinfo elem[];
162 } __packed;
163 
164 struct qla_sa_update_frame {
165 	struct app_id	app_info;
166 	uint16_t	flags;
167 #define SAU_FLG_INV		0x01	/* delete key */
168 #define SAU_FLG_TX		0x02	/* 1=tx, 0 = rx */
169 #define SAU_FLG_FORCE_DELETE	0x08
170 #define SAU_FLG_GMAC_MODE	0x20	/*
171 					 * GMAC mode is cleartext for the IO
172 					 * (i.e. NULL encryption)
173 					 */
174 #define SAU_FLG_KEY128          0x40
175 #define SAU_FLG_KEY256          0x80
176 	uint16_t        fast_sa_index:10,
177 			reserved:6;
178 	uint32_t	salt;
179 	uint32_t	spi;
180 	uint8_t		sa_key[32];
181 	uint8_t		node_name[WWN_SIZE];
182 	uint8_t		port_name[WWN_SIZE];
183 	port_id_t	port_id;
184 	uint8_t		version;
185 	uint8_t		pad[VND_CMD_PAD_SIZE];
186 	uint8_t		reserved2[VND_CMD_APP_RESERVED_SIZE];
187 } __packed;
188 
189 #define	QL_VND_SC_UNDEF		0
190 #define	QL_VND_SC_SA_UPDATE	1
191 #define	QL_VND_SC_APP_START	2
192 #define	QL_VND_SC_APP_STOP	3
193 #define	QL_VND_SC_AUTH_OK	4
194 #define	QL_VND_SC_AUTH_FAIL	5
195 #define	QL_VND_SC_REKEY_CONFIG	6
196 #define	QL_VND_SC_GET_FCINFO	7
197 #define	QL_VND_SC_GET_STATS	8
198 #define QL_VND_SC_AEN_COMPLETE  9
199 #define QL_VND_SC_READ_DBELL	10
200 
201 /*
202  * bsg caller to provide empty buffer for doorbell events.
203  *
204  * sg_io_v4.din_xferp  = empty buffer for door bell events
205  * sg_io_v4.dout_xferp = struct edif_read_dbell *buf
206  */
207 struct edif_read_dbell {
208 	struct app_id app_info;
209 	uint8_t version;
210 	uint8_t pad[VND_CMD_PAD_SIZE];
211 	uint8_t reserved[VND_CMD_APP_RESERVED_SIZE];
212 };
213 
214 
215 /* Application interface data structure for rtn data */
216 #define	EXT_DEF_EVENT_DATA_SIZE	64
217 struct edif_app_dbell {
218 	uint32_t	event_code;
219 	uint32_t	event_data_size;
220 	union  {
221 		port_id_t	port_id;
222 		uint8_t		event_data[EXT_DEF_EVENT_DATA_SIZE];
223 	};
224 } __packed;
225 
226 struct edif_sa_update_aen {
227 	port_id_t port_id;
228 	uint32_t key_type;	/* Tx (1) or RX (2) */
229 	uint32_t status;	/* 0 succes,  1 failed, 2 timeout , 3 error */
230 	uint8_t	version;
231 	uint8_t	pad[VND_CMD_PAD_SIZE];
232 	uint8_t	reserved[VND_CMD_APP_RESERVED_SIZE];
233 } __packed;
234 
235 #define	QL_VND_SA_STAT_SUCCESS	0
236 #define	QL_VND_SA_STAT_FAILED	1
237 #define	QL_VND_SA_STAT_TIMEOUT	2
238 #define	QL_VND_SA_STAT_ERROR	3
239 
240 #define	QL_VND_RX_SA_KEY	1
241 #define	QL_VND_TX_SA_KEY	2
242 
243 /* App defines for plogi auth'd ok and plogi auth bad requests */
244 struct auth_complete_cmd {
245 	struct app_id app_info;
246 #define PL_TYPE_WWPN    1
247 #define PL_TYPE_DID     2
248 	uint32_t    type;
249 	union {
250 		uint8_t  wwpn[WWN_SIZE];
251 		port_id_t d_id;
252 	} u;
253 	uint8_t	version;
254 	uint8_t	pad[VND_CMD_PAD_SIZE];
255 	uint8_t	reserved[VND_CMD_APP_RESERVED_SIZE];
256 } __packed;
257 
258 struct aen_complete_cmd {
259 	struct app_id app_info;
260 	port_id_t   port_id;
261 	uint32_t    event_code;
262 	uint8_t     version;
263 	uint8_t     pad[VND_CMD_PAD_SIZE];
264 	uint8_t     reserved[VND_CMD_APP_RESERVED_SIZE];
265 } __packed;
266 
267 #define RX_DELAY_DELETE_TIMEOUT 20
268 
269 #define FCH_EVT_VENDOR_UNIQUE_VPORT_DOWN  1
270 
271 #endif	/* QLA_EDIF_BSG_H */
272