GNU Linux-libre 6.8.7-gnu
[releases.git] / drivers / scsi / qla2xxx / qla_edif_bsg.h
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 */