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
19enum auth_els_sub_cmd {
20 SEND_ELS = 0,
21 SEND_ELS_REPLY,
22 PULL_ELS,
23};
24
25struct 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
38struct qla_bsg_auth_els_request {
39 struct fc_bsg_request r;
40 struct extra_auth_els e;
41};
42
43struct 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
51struct 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
58struct 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
67struct 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
75struct 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
82struct 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
89struct 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
111struct 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
132struct 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
140struct 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
148struct 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
156struct 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
164struct 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 */
207struct 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
217struct 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
226struct 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 */
244struct 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
258struct 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

source code of linux/drivers/scsi/qla2xxx/qla_edif_bsg.h