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 |