diff options
author | Roland Dreier <rolandd@cisco.com> | 2005-11-02 17:07:13 -0500 |
---|---|---|
committer | Roland Dreier <rolandd@cisco.com> | 2005-11-02 17:07:13 -0500 |
commit | aef9ec39c47f0cece886ddd6b53c440321e0b2a6 (patch) | |
tree | d9a0f0fb69ef336bec4317ef5f95adc8c062e445 /include/scsi | |
parent | 89fbb69c4f285019ba5e029963dc11cc6beb078a (diff) |
IB: Add SCSI RDMA Protocol (SRP) initiator
Add an InfiniBand SCSI RDMA Protocol (SRP) initiator. This driver is
used to talk talk to InfiniBand SRP targets (storage devices).
Signed-off-by: Roland Dreier <rolandd@cisco.com>
Diffstat (limited to 'include/scsi')
-rw-r--r-- | include/scsi/srp.h | 226 |
1 files changed, 226 insertions, 0 deletions
diff --git a/include/scsi/srp.h b/include/scsi/srp.h new file mode 100644 index 000000000000..6c2681dc5b46 --- /dev/null +++ b/include/scsi/srp.h | |||
@@ -0,0 +1,226 @@ | |||
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 | struct srp_direct_buf { | ||
91 | __be64 va; | ||
92 | __be32 key; | ||
93 | __be32 len; | ||
94 | }; | ||
95 | |||
96 | /* | ||
97 | * We need the packed attribute because the SRP spec puts the list of | ||
98 | * descriptors at an offset of 20, which is not aligned to the size | ||
99 | * of struct srp_direct_buf. | ||
100 | */ | ||
101 | struct srp_indirect_buf { | ||
102 | struct srp_direct_buf table_desc; | ||
103 | __be32 len; | ||
104 | struct srp_direct_buf desc_list[0] __attribute__((packed)); | ||
105 | }; | ||
106 | |||
107 | enum { | ||
108 | SRP_MULTICHAN_SINGLE = 0, | ||
109 | SRP_MULTICHAN_MULTI = 1 | ||
110 | }; | ||
111 | |||
112 | struct srp_login_req { | ||
113 | u8 opcode; | ||
114 | u8 reserved1[7]; | ||
115 | u64 tag; | ||
116 | __be32 req_it_iu_len; | ||
117 | u8 reserved2[4]; | ||
118 | __be16 req_buf_fmt; | ||
119 | u8 req_flags; | ||
120 | u8 reserved3[5]; | ||
121 | u8 initiator_port_id[16]; | ||
122 | u8 target_port_id[16]; | ||
123 | }; | ||
124 | |||
125 | struct srp_login_rsp { | ||
126 | u8 opcode; | ||
127 | u8 reserved1[3]; | ||
128 | __be32 req_lim_delta; | ||
129 | u64 tag; | ||
130 | __be32 max_it_iu_len; | ||
131 | __be32 max_ti_iu_len; | ||
132 | __be16 buf_fmt; | ||
133 | u8 rsp_flags; | ||
134 | u8 reserved2[25]; | ||
135 | }; | ||
136 | |||
137 | struct srp_login_rej { | ||
138 | u8 opcode; | ||
139 | u8 reserved1[3]; | ||
140 | __be32 reason; | ||
141 | u64 tag; | ||
142 | u8 reserved2[8]; | ||
143 | __be16 buf_fmt; | ||
144 | u8 reserved3[6]; | ||
145 | }; | ||
146 | |||
147 | struct srp_i_logout { | ||
148 | u8 opcode; | ||
149 | u8 reserved[7]; | ||
150 | u64 tag; | ||
151 | }; | ||
152 | |||
153 | struct srp_t_logout { | ||
154 | u8 opcode; | ||
155 | u8 sol_not; | ||
156 | u8 reserved[2]; | ||
157 | __be32 reason; | ||
158 | u64 tag; | ||
159 | }; | ||
160 | |||
161 | /* | ||
162 | * We need the packed attribute because the SRP spec only aligns the | ||
163 | * 8-byte LUN field to 4 bytes. | ||
164 | */ | ||
165 | struct srp_tsk_mgmt { | ||
166 | u8 opcode; | ||
167 | u8 sol_not; | ||
168 | u8 reserved1[6]; | ||
169 | u64 tag; | ||
170 | u8 reserved2[4]; | ||
171 | __be64 lun __attribute__((packed)); | ||
172 | u8 reserved3[2]; | ||
173 | u8 tsk_mgmt_func; | ||
174 | u8 reserved4; | ||
175 | u64 task_tag; | ||
176 | u8 reserved5[8]; | ||
177 | }; | ||
178 | |||
179 | /* | ||
180 | * We need the packed attribute because the SRP spec only aligns the | ||
181 | * 8-byte LUN field to 4 bytes. | ||
182 | */ | ||
183 | struct srp_cmd { | ||
184 | u8 opcode; | ||
185 | u8 sol_not; | ||
186 | u8 reserved1[3]; | ||
187 | u8 buf_fmt; | ||
188 | u8 data_out_desc_cnt; | ||
189 | u8 data_in_desc_cnt; | ||
190 | u64 tag; | ||
191 | u8 reserved2[4]; | ||
192 | __be64 lun __attribute__((packed)); | ||
193 | u8 reserved3; | ||
194 | u8 task_attr; | ||
195 | u8 reserved4; | ||
196 | u8 add_cdb_len; | ||
197 | u8 cdb[16]; | ||
198 | u8 add_data[0]; | ||
199 | }; | ||
200 | |||
201 | enum { | ||
202 | SRP_RSP_FLAG_RSPVALID = 1 << 0, | ||
203 | SRP_RSP_FLAG_SNSVALID = 1 << 1, | ||
204 | SRP_RSP_FLAG_DOOVER = 1 << 2, | ||
205 | SRP_RSP_FLAG_DOUNDER = 1 << 3, | ||
206 | SRP_RSP_FLAG_DIOVER = 1 << 4, | ||
207 | SRP_RSP_FLAG_DIUNDER = 1 << 5 | ||
208 | }; | ||
209 | |||
210 | struct srp_rsp { | ||
211 | u8 opcode; | ||
212 | u8 sol_not; | ||
213 | u8 reserved1[2]; | ||
214 | __be32 req_lim_delta; | ||
215 | u64 tag; | ||
216 | u8 reserved2[2]; | ||
217 | u8 flags; | ||
218 | u8 status; | ||
219 | __be32 data_out_res_cnt; | ||
220 | __be32 data_in_res_cnt; | ||
221 | __be32 sense_data_len; | ||
222 | __be32 resp_data_len; | ||
223 | u8 data[0]; | ||
224 | }; | ||
225 | |||
226 | #endif /* SCSI_SRP_H */ | ||