Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
awilliam
GitHub Repository: awilliam/linux-vfio
Path: blob/master/include/scsi/srp.h
10820 views
1
/*
2
* Copyright (c) 2005 Cisco Systems. All rights reserved.
3
*
4
* This software is available to you under a choice of one of two
5
* licenses. You may choose to be licensed under the terms of the GNU
6
* General Public License (GPL) Version 2, available from the file
7
* COPYING in the main directory of this source tree, or the
8
* OpenIB.org BSD license below:
9
*
10
* Redistribution and use in source and binary forms, with or
11
* without modification, are permitted provided that the following
12
* conditions are met:
13
*
14
* - Redistributions of source code must retain the above
15
* copyright notice, this list of conditions and the following
16
* disclaimer.
17
*
18
* - Redistributions in binary form must reproduce the above
19
* copyright notice, this list of conditions and the following
20
* disclaimer in the documentation and/or other materials
21
* provided with the distribution.
22
*
23
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
24
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
25
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
26
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
27
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
28
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
29
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
30
* SOFTWARE.
31
*
32
* $Id$
33
*/
34
35
#ifndef SCSI_SRP_H
36
#define SCSI_SRP_H
37
38
/*
39
* Structures and constants for the SCSI RDMA Protocol (SRP) as
40
* defined by the INCITS T10 committee. This file was written using
41
* draft Revision 16a of the SRP standard.
42
*/
43
44
#include <linux/types.h>
45
46
enum {
47
SRP_LOGIN_REQ = 0x00,
48
SRP_TSK_MGMT = 0x01,
49
SRP_CMD = 0x02,
50
SRP_I_LOGOUT = 0x03,
51
SRP_LOGIN_RSP = 0xc0,
52
SRP_RSP = 0xc1,
53
SRP_LOGIN_REJ = 0xc2,
54
SRP_T_LOGOUT = 0x80,
55
SRP_CRED_REQ = 0x81,
56
SRP_AER_REQ = 0x82,
57
SRP_CRED_RSP = 0x41,
58
SRP_AER_RSP = 0x42
59
};
60
61
enum {
62
SRP_BUF_FORMAT_DIRECT = 1 << 1,
63
SRP_BUF_FORMAT_INDIRECT = 1 << 2
64
};
65
66
enum {
67
SRP_NO_DATA_DESC = 0,
68
SRP_DATA_DESC_DIRECT = 1,
69
SRP_DATA_DESC_INDIRECT = 2
70
};
71
72
enum {
73
SRP_TSK_ABORT_TASK = 0x01,
74
SRP_TSK_ABORT_TASK_SET = 0x02,
75
SRP_TSK_CLEAR_TASK_SET = 0x04,
76
SRP_TSK_LUN_RESET = 0x08,
77
SRP_TSK_CLEAR_ACA = 0x40
78
};
79
80
enum srp_login_rej_reason {
81
SRP_LOGIN_REJ_UNABLE_ESTABLISH_CHANNEL = 0x00010000,
82
SRP_LOGIN_REJ_INSUFFICIENT_RESOURCES = 0x00010001,
83
SRP_LOGIN_REJ_REQ_IT_IU_LENGTH_TOO_LARGE = 0x00010002,
84
SRP_LOGIN_REJ_UNABLE_ASSOCIATE_CHANNEL = 0x00010003,
85
SRP_LOGIN_REJ_UNSUPPORTED_DESCRIPTOR_FMT = 0x00010004,
86
SRP_LOGIN_REJ_MULTI_CHANNEL_UNSUPPORTED = 0x00010005,
87
SRP_LOGIN_REJ_CHANNEL_LIMIT_REACHED = 0x00010006
88
};
89
90
enum {
91
SRP_REV10_IB_IO_CLASS = 0xff00,
92
SRP_REV16A_IB_IO_CLASS = 0x0100
93
};
94
95
struct srp_direct_buf {
96
__be64 va;
97
__be32 key;
98
__be32 len;
99
};
100
101
/*
102
* We need the packed attribute because the SRP spec puts the list of
103
* descriptors at an offset of 20, which is not aligned to the size of
104
* struct srp_direct_buf. The whole structure must be packed to avoid
105
* having the 20-byte structure padded to 24 bytes on 64-bit architectures.
106
*/
107
struct srp_indirect_buf {
108
struct srp_direct_buf table_desc;
109
__be32 len;
110
struct srp_direct_buf desc_list[0];
111
} __attribute__((packed));
112
113
enum {
114
SRP_MULTICHAN_SINGLE = 0,
115
SRP_MULTICHAN_MULTI = 1
116
};
117
118
struct srp_login_req {
119
u8 opcode;
120
u8 reserved1[7];
121
u64 tag;
122
__be32 req_it_iu_len;
123
u8 reserved2[4];
124
__be16 req_buf_fmt;
125
u8 req_flags;
126
u8 reserved3[5];
127
u8 initiator_port_id[16];
128
u8 target_port_id[16];
129
};
130
131
/*
132
* The SRP spec defines the size of the LOGIN_RSP structure to be 52
133
* bytes, so it needs to be packed to avoid having it padded to 56
134
* bytes on 64-bit architectures.
135
*/
136
struct srp_login_rsp {
137
u8 opcode;
138
u8 reserved1[3];
139
__be32 req_lim_delta;
140
u64 tag;
141
__be32 max_it_iu_len;
142
__be32 max_ti_iu_len;
143
__be16 buf_fmt;
144
u8 rsp_flags;
145
u8 reserved2[25];
146
} __attribute__((packed));
147
148
struct srp_login_rej {
149
u8 opcode;
150
u8 reserved1[3];
151
__be32 reason;
152
u64 tag;
153
u8 reserved2[8];
154
__be16 buf_fmt;
155
u8 reserved3[6];
156
};
157
158
struct srp_i_logout {
159
u8 opcode;
160
u8 reserved[7];
161
u64 tag;
162
};
163
164
struct srp_t_logout {
165
u8 opcode;
166
u8 sol_not;
167
u8 reserved[2];
168
__be32 reason;
169
u64 tag;
170
};
171
172
/*
173
* We need the packed attribute because the SRP spec only aligns the
174
* 8-byte LUN field to 4 bytes.
175
*/
176
struct srp_tsk_mgmt {
177
u8 opcode;
178
u8 sol_not;
179
u8 reserved1[6];
180
u64 tag;
181
u8 reserved2[4];
182
__be64 lun __attribute__((packed));
183
u8 reserved3[2];
184
u8 tsk_mgmt_func;
185
u8 reserved4;
186
u64 task_tag;
187
u8 reserved5[8];
188
};
189
190
/*
191
* We need the packed attribute because the SRP spec only aligns the
192
* 8-byte LUN field to 4 bytes.
193
*/
194
struct srp_cmd {
195
u8 opcode;
196
u8 sol_not;
197
u8 reserved1[3];
198
u8 buf_fmt;
199
u8 data_out_desc_cnt;
200
u8 data_in_desc_cnt;
201
u64 tag;
202
u8 reserved2[4];
203
__be64 lun __attribute__((packed));
204
u8 reserved3;
205
u8 task_attr;
206
u8 reserved4;
207
u8 add_cdb_len;
208
u8 cdb[16];
209
u8 add_data[0];
210
};
211
212
enum {
213
SRP_RSP_FLAG_RSPVALID = 1 << 0,
214
SRP_RSP_FLAG_SNSVALID = 1 << 1,
215
SRP_RSP_FLAG_DOOVER = 1 << 2,
216
SRP_RSP_FLAG_DOUNDER = 1 << 3,
217
SRP_RSP_FLAG_DIOVER = 1 << 4,
218
SRP_RSP_FLAG_DIUNDER = 1 << 5
219
};
220
221
/*
222
* The SRP spec defines the size of the RSP structure to be 36 bytes,
223
* so it needs to be packed to avoid having it padded to 40 bytes on
224
* 64-bit architectures.
225
*/
226
struct srp_rsp {
227
u8 opcode;
228
u8 sol_not;
229
u8 reserved1[2];
230
__be32 req_lim_delta;
231
u64 tag;
232
u8 reserved2[2];
233
u8 flags;
234
u8 status;
235
__be32 data_out_res_cnt;
236
__be32 data_in_res_cnt;
237
__be32 sense_data_len;
238
__be32 resp_data_len;
239
u8 data[0];
240
} __attribute__((packed));
241
242
struct srp_cred_req {
243
u8 opcode;
244
u8 sol_not;
245
u8 reserved[2];
246
__be32 req_lim_delta;
247
u64 tag;
248
};
249
250
struct srp_cred_rsp {
251
u8 opcode;
252
u8 reserved[7];
253
u64 tag;
254
};
255
256
/*
257
* The SRP spec defines the fixed portion of the AER_REQ structure to be
258
* 36 bytes, so it needs to be packed to avoid having it padded to 40 bytes
259
* on 64-bit architectures.
260
*/
261
struct srp_aer_req {
262
u8 opcode;
263
u8 sol_not;
264
u8 reserved[2];
265
__be32 req_lim_delta;
266
u64 tag;
267
u32 reserved2;
268
__be64 lun;
269
__be32 sense_data_len;
270
u32 reserved3;
271
u8 sense_data[0];
272
} __attribute__((packed));
273
274
struct srp_aer_rsp {
275
u8 opcode;
276
u8 reserved[7];
277
u64 tag;
278
};
279
280
#endif /* SCSI_SRP_H */
281
282