Merge tag 'nfs-for-5.1-1' of git://git.linux-nfs.org/projects/trondmy/linux-nfs
[sfrench/cifs-2.6.git] / include / linux / nvme-fc.h
1 /* SPDX-License-Identifier: GPL-2.0 */
2 /*
3  * Copyright (c) 2016 Avago Technologies.  All rights reserved.
4  */
5
6 /*
7  * This file contains definitions relative to FC-NVME r1.14 (16-020vB).
8  * The fcnvme_lsdesc_cr_assoc_cmd struct reflects expected r1.16 content.
9  */
10
11 #ifndef _NVME_FC_H
12 #define _NVME_FC_H 1
13
14
15 #define NVME_CMD_SCSI_ID                0xFD
16 #define NVME_CMD_FC_ID                  FC_TYPE_NVME
17
18 /* FC-NVME Cmd IU Flags */
19 #define FCNVME_CMD_FLAGS_DIRMASK        0x03
20 #define FCNVME_CMD_FLAGS_WRITE          0x01
21 #define FCNVME_CMD_FLAGS_READ           0x02
22
23 struct nvme_fc_cmd_iu {
24         __u8                    scsi_id;
25         __u8                    fc_id;
26         __be16                  iu_len;
27         __u8                    rsvd4[3];
28         __u8                    flags;
29         __be64                  connection_id;
30         __be32                  csn;
31         __be32                  data_len;
32         struct nvme_command     sqe;
33         __be32                  rsvd88[2];
34 };
35
36 #define NVME_FC_SIZEOF_ZEROS_RSP        12
37
38 enum {
39         FCNVME_SC_SUCCESS               = 0,
40         FCNVME_SC_INVALID_FIELD         = 1,
41         FCNVME_SC_INVALID_CONNID        = 2,
42 };
43
44 struct nvme_fc_ersp_iu {
45         __u8                    status_code;
46         __u8                    rsvd1;
47         __be16                  iu_len;
48         __be32                  rsn;
49         __be32                  xfrd_len;
50         __be32                  rsvd12;
51         struct nvme_completion  cqe;
52         /* for now - no additional payload */
53 };
54
55
56 /* FC-NVME Link Services */
57 enum {
58         FCNVME_LS_RSVD                  = 0,
59         FCNVME_LS_RJT                   = 1,
60         FCNVME_LS_ACC                   = 2,
61         FCNVME_LS_CREATE_ASSOCIATION    = 3,
62         FCNVME_LS_CREATE_CONNECTION     = 4,
63         FCNVME_LS_DISCONNECT            = 5,
64 };
65
66 /* FC-NVME Link Service Descriptors */
67 enum {
68         FCNVME_LSDESC_RSVD              = 0x0,
69         FCNVME_LSDESC_RQST              = 0x1,
70         FCNVME_LSDESC_RJT               = 0x2,
71         FCNVME_LSDESC_CREATE_ASSOC_CMD  = 0x3,
72         FCNVME_LSDESC_CREATE_CONN_CMD   = 0x4,
73         FCNVME_LSDESC_DISCONN_CMD       = 0x5,
74         FCNVME_LSDESC_CONN_ID           = 0x6,
75         FCNVME_LSDESC_ASSOC_ID          = 0x7,
76 };
77
78
79 /* ********** start of Link Service Descriptors ********** */
80
81
82 /*
83  * fills in length of a descriptor. Struture minus descriptor header
84  */
85 static inline __be32 fcnvme_lsdesc_len(size_t sz)
86 {
87         return cpu_to_be32(sz - (2 * sizeof(u32)));
88 }
89
90 struct fcnvme_ls_rqst_w0 {
91         u8      ls_cmd;                 /* FCNVME_LS_xxx */
92         u8      zeros[3];
93 };
94
95 /* FCNVME_LSDESC_RQST */
96 struct fcnvme_lsdesc_rqst {
97         __be32  desc_tag;               /* FCNVME_LSDESC_xxx */
98         __be32  desc_len;
99         struct fcnvme_ls_rqst_w0        w0;
100         __be32  rsvd12;
101 };
102
103 /* FC-NVME LS RJT reason_code values */
104 enum fcnvme_ls_rjt_reason {
105         FCNVME_RJT_RC_NONE              = 0,
106         /* no reason - not to be sent */
107
108         FCNVME_RJT_RC_INVAL             = 0x01,
109         /* invalid NVMe_LS command code */
110
111         FCNVME_RJT_RC_LOGIC             = 0x03,
112         /* logical error */
113
114         FCNVME_RJT_RC_UNAB              = 0x09,
115         /* unable to perform command request */
116
117         FCNVME_RJT_RC_UNSUP             = 0x0b,
118         /* command not supported */
119
120         FCNVME_RJT_RC_INPROG            = 0x0e,
121         /* command already in progress */
122
123         FCNVME_RJT_RC_INV_ASSOC         = 0x40,
124         /* Invalid Association ID*/
125
126         FCNVME_RJT_RC_INV_CONN          = 0x41,
127         /* Invalid Connection ID*/
128
129         FCNVME_RJT_RC_VENDOR            = 0xff,
130         /* vendor specific error */
131 };
132
133 /* FC-NVME LS RJT reason_explanation values */
134 enum fcnvme_ls_rjt_explan {
135         FCNVME_RJT_EXP_NONE             = 0x00,
136         /* No additional explanation */
137
138         FCNVME_RJT_EXP_OXID_RXID        = 0x17,
139         /* invalid OX_ID-RX_ID combination */
140
141         FCNVME_RJT_EXP_INSUF_RES        = 0x29,
142         /* insufficient resources */
143
144         FCNVME_RJT_EXP_UNAB_DATA        = 0x2a,
145         /* unable to supply requested data */
146
147         FCNVME_RJT_EXP_INV_LEN          = 0x2d,
148         /* Invalid payload length */
149 };
150
151 /* FCNVME_LSDESC_RJT */
152 struct fcnvme_lsdesc_rjt {
153         __be32  desc_tag;               /* FCNVME_LSDESC_xxx */
154         __be32  desc_len;
155         u8      rsvd8;
156
157         /*
158          * Reject reason and explanaction codes are generic
159          * to ELs's from LS-3.
160          */
161         u8      reason_code;            /* fcnvme_ls_rjt_reason */
162         u8      reason_explanation;     /* fcnvme_ls_rjt_explan */
163
164         u8      vendor;
165         __be32  rsvd12;
166 };
167
168
169 #define FCNVME_ASSOC_HOSTNQN_LEN        256
170 #define FCNVME_ASSOC_SUBNQN_LEN         256
171
172 /* FCNVME_LSDESC_CREATE_ASSOC_CMD */
173 struct fcnvme_lsdesc_cr_assoc_cmd {
174         __be32  desc_tag;               /* FCNVME_LSDESC_xxx */
175         __be32  desc_len;
176         __be16  ersp_ratio;
177         __be16  rsvd10;
178         __be32  rsvd12[9];
179         __be16  cntlid;
180         __be16  sqsize;
181         __be32  rsvd52;
182         uuid_t  hostid;
183         u8      hostnqn[FCNVME_ASSOC_HOSTNQN_LEN];
184         u8      subnqn[FCNVME_ASSOC_SUBNQN_LEN];
185         __be32  rsvd584[108];           /* pad to 1016 bytes,
186                                          * which makes overall LS rqst
187                                          * payload 1024 bytes
188                                          */
189 };
190
191 #define FCNVME_LSDESC_CRA_CMD_DESC_MINLEN       \
192                 offsetof(struct fcnvme_lsdesc_cr_assoc_cmd, rsvd584)
193
194 #define FCNVME_LSDESC_CRA_CMD_DESC_MIN_DESCLEN  \
195                 (FCNVME_LSDESC_CRA_CMD_DESC_MINLEN - \
196                  offsetof(struct fcnvme_lsdesc_cr_assoc_cmd, ersp_ratio))
197
198
199
200 /* FCNVME_LSDESC_CREATE_CONN_CMD */
201 struct fcnvme_lsdesc_cr_conn_cmd {
202         __be32  desc_tag;               /* FCNVME_LSDESC_xxx */
203         __be32  desc_len;
204         __be16  ersp_ratio;
205         __be16  rsvd10;
206         __be32  rsvd12[9];
207         __be16  qid;
208         __be16  sqsize;
209         __be32  rsvd52;
210 };
211
212 /* Disconnect Scope Values */
213 enum {
214         FCNVME_DISCONN_ASSOCIATION      = 0,
215         FCNVME_DISCONN_CONNECTION       = 1,
216 };
217
218 /* FCNVME_LSDESC_DISCONN_CMD */
219 struct fcnvme_lsdesc_disconn_cmd {
220         __be32  desc_tag;               /* FCNVME_LSDESC_xxx */
221         __be32  desc_len;
222         u8      rsvd8[3];
223         /* note: scope is really a 1 bit field */
224         u8      scope;                  /* FCNVME_DISCONN_xxx */
225         __be32  rsvd12;
226         __be64  id;
227 };
228
229 /* FCNVME_LSDESC_CONN_ID */
230 struct fcnvme_lsdesc_conn_id {
231         __be32  desc_tag;               /* FCNVME_LSDESC_xxx */
232         __be32  desc_len;
233         __be64  connection_id;
234 };
235
236 /* FCNVME_LSDESC_ASSOC_ID */
237 struct fcnvme_lsdesc_assoc_id {
238         __be32  desc_tag;               /* FCNVME_LSDESC_xxx */
239         __be32  desc_len;
240         __be64  association_id;
241 };
242
243 /* r_ctl values */
244 enum {
245         FCNVME_RS_RCTL_DATA             = 1,
246         FCNVME_RS_RCTL_XFER_RDY         = 5,
247         FCNVME_RS_RCTL_RSP              = 8,
248 };
249
250
251 /* ********** start of Link Services ********** */
252
253
254 /* FCNVME_LS_RJT */
255 struct fcnvme_ls_rjt {
256         struct fcnvme_ls_rqst_w0                w0;
257         __be32                                  desc_list_len;
258         struct fcnvme_lsdesc_rqst               rqst;
259         struct fcnvme_lsdesc_rjt                rjt;
260 };
261
262 /* FCNVME_LS_ACC */
263 struct fcnvme_ls_acc_hdr {
264         struct fcnvme_ls_rqst_w0                w0;
265         __be32                                  desc_list_len;
266         struct fcnvme_lsdesc_rqst               rqst;
267         /* Followed by cmd-specific ACC descriptors, see next definitions */
268 };
269
270 /* FCNVME_LS_CREATE_ASSOCIATION */
271 struct fcnvme_ls_cr_assoc_rqst {
272         struct fcnvme_ls_rqst_w0                w0;
273         __be32                                  desc_list_len;
274         struct fcnvme_lsdesc_cr_assoc_cmd       assoc_cmd;
275 };
276
277 #define FCNVME_LSDESC_CRA_RQST_MINLEN   \
278                 (offsetof(struct fcnvme_ls_cr_assoc_rqst, assoc_cmd) + \
279                         FCNVME_LSDESC_CRA_CMD_DESC_MINLEN)
280
281 #define FCNVME_LSDESC_CRA_RQST_MIN_LISTLEN      \
282                 FCNVME_LSDESC_CRA_CMD_DESC_MINLEN
283
284
285 struct fcnvme_ls_cr_assoc_acc {
286         struct fcnvme_ls_acc_hdr                hdr;
287         struct fcnvme_lsdesc_assoc_id           associd;
288         struct fcnvme_lsdesc_conn_id            connectid;
289 };
290
291
292 /* FCNVME_LS_CREATE_CONNECTION */
293 struct fcnvme_ls_cr_conn_rqst {
294         struct fcnvme_ls_rqst_w0                w0;
295         __be32                                  desc_list_len;
296         struct fcnvme_lsdesc_assoc_id           associd;
297         struct fcnvme_lsdesc_cr_conn_cmd        connect_cmd;
298 };
299
300 struct fcnvme_ls_cr_conn_acc {
301         struct fcnvme_ls_acc_hdr                hdr;
302         struct fcnvme_lsdesc_conn_id            connectid;
303 };
304
305 /* FCNVME_LS_DISCONNECT */
306 struct fcnvme_ls_disconnect_rqst {
307         struct fcnvme_ls_rqst_w0                w0;
308         __be32                                  desc_list_len;
309         struct fcnvme_lsdesc_assoc_id           associd;
310         struct fcnvme_lsdesc_disconn_cmd        discon_cmd;
311 };
312
313 struct fcnvme_ls_disconnect_acc {
314         struct fcnvme_ls_acc_hdr                hdr;
315 };
316
317
318 /*
319  * Yet to be defined in FC-NVME:
320  */
321 #define NVME_FC_CONNECT_TIMEOUT_SEC     2               /* 2 seconds */
322 #define NVME_FC_LS_TIMEOUT_SEC          2               /* 2 seconds */
323 #define NVME_FC_TGTOP_TIMEOUT_SEC       2               /* 2 seconds */
324
325 /*
326  * TRADDR string must be of form "nn-<16hexdigits>:pn-<16hexdigits>"
327  * the string is allowed to be specified with or without a "0x" prefix
328  * infront of the <16hexdigits>.  Without is considered the "min" string
329  * and with is considered the "max" string. The hexdigits may be upper
330  * or lower case.
331  */
332 #define NVME_FC_TRADDR_NNLEN            3       /* "?n-" */
333 #define NVME_FC_TRADDR_OXNNLEN          5       /* "?n-0x" */
334 #define NVME_FC_TRADDR_HEXNAMELEN       16
335 #define NVME_FC_TRADDR_MINLENGTH        \
336                 (2 * (NVME_FC_TRADDR_NNLEN + NVME_FC_TRADDR_HEXNAMELEN) + 1)
337 #define NVME_FC_TRADDR_MAXLENGTH        \
338                 (2 * (NVME_FC_TRADDR_OXNNLEN + NVME_FC_TRADDR_HEXNAMELEN) + 1)
339 #define NVME_FC_TRADDR_MIN_PN_OFFSET    \
340                 (NVME_FC_TRADDR_NNLEN + NVME_FC_TRADDR_HEXNAMELEN + 1)
341 #define NVME_FC_TRADDR_MAX_PN_OFFSET    \
342                 (NVME_FC_TRADDR_OXNNLEN + NVME_FC_TRADDR_HEXNAMELEN + 1)
343
344
345 #endif /* _NVME_FC_H */