]> git.kernelconcepts.de Git - karo-tx-linux.git/blob - include/linux/nvme-fc.h
Merge tag 'md/4.12-rc2' of git://git.kernel.org/pub/scm/linux/kernel/git/shli/md
[karo-tx-linux.git] / include / linux / nvme-fc.h
1 /*
2  * Copyright (c) 2016 Avago Technologies.  All rights reserved.
3  *
4  * This program is free software; you can redistribute it and/or modify
5  * it under the terms of version 2 of the GNU General Public License as
6  * published by the Free Software Foundation.
7  *
8  * This program is distributed in the hope that it will be useful.
9  * ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES,
10  * INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A
11  * PARTICULAR PURPOSE, OR NON-INFRINGEMENT, ARE DISCLAIMED, EXCEPT TO
12  * THE EXTENT THAT SUCH DISCLAIMERS ARE HELD TO BE LEGALLY INVALID.
13  * See the GNU General Public License for more details, a copy of which
14  * can be found in the file COPYING included with this package
15  *
16  */
17
18 /*
19  * This file contains definitions relative to FC-NVME r1.14 (16-020vB).
20  */
21
22 #ifndef _NVME_FC_H
23 #define _NVME_FC_H 1
24
25
26 #define NVME_CMD_SCSI_ID                0xFD
27 #define NVME_CMD_FC_ID                  FC_TYPE_NVME
28
29 /* FC-NVME Cmd IU Flags */
30 #define FCNVME_CMD_FLAGS_DIRMASK        0x03
31 #define FCNVME_CMD_FLAGS_WRITE          0x01
32 #define FCNVME_CMD_FLAGS_READ           0x02
33
34 struct nvme_fc_cmd_iu {
35         __u8                    scsi_id;
36         __u8                    fc_id;
37         __be16                  iu_len;
38         __u8                    rsvd4[3];
39         __u8                    flags;
40         __be64                  connection_id;
41         __be32                  csn;
42         __be32                  data_len;
43         struct nvme_command     sqe;
44         __be32                  rsvd88[2];
45 };
46
47 #define NVME_FC_SIZEOF_ZEROS_RSP        12
48
49 enum {
50         FCNVME_SC_SUCCESS               = 0,
51         FCNVME_SC_INVALID_FIELD         = 1,
52         FCNVME_SC_INVALID_CONNID        = 2,
53 };
54
55 struct nvme_fc_ersp_iu {
56         __u8                    status_code;
57         __u8                    rsvd1;
58         __be16                  iu_len;
59         __be32                  rsn;
60         __be32                  xfrd_len;
61         __be32                  rsvd12;
62         struct nvme_completion  cqe;
63         /* for now - no additional payload */
64 };
65
66
67 /* FC-NVME Link Services */
68 enum {
69         FCNVME_LS_RSVD                  = 0,
70         FCNVME_LS_RJT                   = 1,
71         FCNVME_LS_ACC                   = 2,
72         FCNVME_LS_CREATE_ASSOCIATION    = 3,
73         FCNVME_LS_CREATE_CONNECTION     = 4,
74         FCNVME_LS_DISCONNECT            = 5,
75 };
76
77 /* FC-NVME Link Service Descriptors */
78 enum {
79         FCNVME_LSDESC_RSVD              = 0x0,
80         FCNVME_LSDESC_RQST              = 0x1,
81         FCNVME_LSDESC_RJT               = 0x2,
82         FCNVME_LSDESC_CREATE_ASSOC_CMD  = 0x3,
83         FCNVME_LSDESC_CREATE_CONN_CMD   = 0x4,
84         FCNVME_LSDESC_DISCONN_CMD       = 0x5,
85         FCNVME_LSDESC_CONN_ID           = 0x6,
86         FCNVME_LSDESC_ASSOC_ID          = 0x7,
87 };
88
89
90 /* ********** start of Link Service Descriptors ********** */
91
92
93 /*
94  * fills in length of a descriptor. Struture minus descriptor header
95  */
96 static inline __be32 fcnvme_lsdesc_len(size_t sz)
97 {
98         return cpu_to_be32(sz - (2 * sizeof(u32)));
99 }
100
101 struct fcnvme_ls_rqst_w0 {
102         u8      ls_cmd;                 /* FCNVME_LS_xxx */
103         u8      zeros[3];
104 };
105
106 /* FCNVME_LSDESC_RQST */
107 struct fcnvme_lsdesc_rqst {
108         __be32  desc_tag;               /* FCNVME_LSDESC_xxx */
109         __be32  desc_len;
110         struct fcnvme_ls_rqst_w0        w0;
111         __be32  rsvd12;
112 };
113
114 /* FC-NVME LS RJT reason_code values */
115 enum fcnvme_ls_rjt_reason {
116         FCNVME_RJT_RC_NONE              = 0,
117         /* no reason - not to be sent */
118
119         FCNVME_RJT_RC_INVAL             = 0x01,
120         /* invalid NVMe_LS command code */
121
122         FCNVME_RJT_RC_LOGIC             = 0x03,
123         /* logical error */
124
125         FCNVME_RJT_RC_UNAB              = 0x09,
126         /* unable to perform command request */
127
128         FCNVME_RJT_RC_UNSUP             = 0x0b,
129         /* command not supported */
130
131         FCNVME_RJT_RC_INPROG            = 0x0e,
132         /* command already in progress */
133
134         FCNVME_RJT_RC_INV_ASSOC         = 0x40,
135         /* Invalid Association ID*/
136
137         FCNVME_RJT_RC_INV_CONN          = 0x41,
138         /* Invalid Connection ID*/
139
140         FCNVME_RJT_RC_VENDOR            = 0xff,
141         /* vendor specific error */
142 };
143
144 /* FC-NVME LS RJT reason_explanation values */
145 enum fcnvme_ls_rjt_explan {
146         FCNVME_RJT_EXP_NONE             = 0x00,
147         /* No additional explanation */
148
149         FCNVME_RJT_EXP_OXID_RXID        = 0x17,
150         /* invalid OX_ID-RX_ID combination */
151
152         FCNVME_RJT_EXP_INSUF_RES        = 0x29,
153         /* insufficient resources */
154
155         FCNVME_RJT_EXP_UNAB_DATA        = 0x2a,
156         /* unable to supply requested data */
157
158         FCNVME_RJT_EXP_INV_LEN          = 0x2d,
159         /* Invalid payload length */
160 };
161
162 /* FCNVME_LSDESC_RJT */
163 struct fcnvme_lsdesc_rjt {
164         __be32  desc_tag;               /* FCNVME_LSDESC_xxx */
165         __be32  desc_len;
166         u8      rsvd8;
167
168         /*
169          * Reject reason and explanaction codes are generic
170          * to ELs's from LS-3.
171          */
172         u8      reason_code;            /* fcnvme_ls_rjt_reason */
173         u8      reason_explanation;     /* fcnvme_ls_rjt_explan */
174
175         u8      vendor;
176         __be32  rsvd12;
177 };
178
179
180 #define FCNVME_ASSOC_HOSTID_LEN         16
181 #define FCNVME_ASSOC_HOSTNQN_LEN        256
182 #define FCNVME_ASSOC_SUBNQN_LEN         256
183
184 /* FCNVME_LSDESC_CREATE_ASSOC_CMD */
185 struct fcnvme_lsdesc_cr_assoc_cmd {
186         __be32  desc_tag;               /* FCNVME_LSDESC_xxx */
187         __be32  desc_len;
188         __be16  ersp_ratio;
189         __be16  rsvd10;
190         __be32  rsvd12[9];
191         __be16  cntlid;
192         __be16  sqsize;
193         __be32  rsvd52;
194         u8      hostid[FCNVME_ASSOC_HOSTID_LEN];
195         u8      hostnqn[FCNVME_ASSOC_HOSTNQN_LEN];
196         u8      subnqn[FCNVME_ASSOC_SUBNQN_LEN];
197         u8      rsvd632[384];
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 struct fcnvme_ls_cr_assoc_acc {
278         struct fcnvme_ls_acc_hdr                hdr;
279         struct fcnvme_lsdesc_assoc_id           associd;
280         struct fcnvme_lsdesc_conn_id            connectid;
281 };
282
283
284 /* FCNVME_LS_CREATE_CONNECTION */
285 struct fcnvme_ls_cr_conn_rqst {
286         struct fcnvme_ls_rqst_w0                w0;
287         __be32                                  desc_list_len;
288         struct fcnvme_lsdesc_assoc_id           associd;
289         struct fcnvme_lsdesc_cr_conn_cmd        connect_cmd;
290 };
291
292 struct fcnvme_ls_cr_conn_acc {
293         struct fcnvme_ls_acc_hdr                hdr;
294         struct fcnvme_lsdesc_conn_id            connectid;
295 };
296
297 /* FCNVME_LS_DISCONNECT */
298 struct fcnvme_ls_disconnect_rqst {
299         struct fcnvme_ls_rqst_w0                w0;
300         __be32                                  desc_list_len;
301         struct fcnvme_lsdesc_assoc_id           associd;
302         struct fcnvme_lsdesc_disconn_cmd        discon_cmd;
303 };
304
305 struct fcnvme_ls_disconnect_acc {
306         struct fcnvme_ls_acc_hdr                hdr;
307 };
308
309
310 /*
311  * Yet to be defined in FC-NVME:
312  */
313 #define NVME_FC_CONNECT_TIMEOUT_SEC     2               /* 2 seconds */
314 #define NVME_FC_LS_TIMEOUT_SEC          2               /* 2 seconds */
315 #define NVME_FC_TGTOP_TIMEOUT_SEC       2               /* 2 seconds */
316
317
318 #endif /* _NVME_FC_H */