Root/
1 | /* |
2 | * iSCSI transport class definitions |
3 | * |
4 | * Copyright (C) IBM Corporation, 2004 |
5 | * Copyright (C) Mike Christie, 2004 - 2006 |
6 | * Copyright (C) Dmitry Yusupov, 2004 - 2005 |
7 | * Copyright (C) Alex Aizman, 2004 - 2005 |
8 | * |
9 | * This program is free software; you can redistribute it and/or modify |
10 | * it under the terms of the GNU General Public License as published by |
11 | * the Free Software Foundation; either version 2 of the License, or |
12 | * (at your option) any later version. |
13 | * |
14 | * This program is distributed in the hope that it will be useful, |
15 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
16 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
17 | * GNU General Public License for more details. |
18 | * |
19 | * You should have received a copy of the GNU General Public License |
20 | * along with this program; if not, write to the Free Software |
21 | * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. |
22 | */ |
23 | #ifndef SCSI_TRANSPORT_ISCSI_H |
24 | #define SCSI_TRANSPORT_ISCSI_H |
25 | |
26 | #include <linux/device.h> |
27 | #include <linux/list.h> |
28 | #include <linux/mutex.h> |
29 | #include <scsi/iscsi_if.h> |
30 | |
31 | struct scsi_transport_template; |
32 | struct iscsi_transport; |
33 | struct iscsi_endpoint; |
34 | struct Scsi_Host; |
35 | struct scsi_cmnd; |
36 | struct iscsi_cls_conn; |
37 | struct iscsi_conn; |
38 | struct iscsi_task; |
39 | struct sockaddr; |
40 | |
41 | /** |
42 | * struct iscsi_transport - iSCSI Transport template |
43 | * |
44 | * @name: transport name |
45 | * @caps: iSCSI Data-Path capabilities |
46 | * @create_session: create new iSCSI session object |
47 | * @destroy_session: destroy existing iSCSI session object |
48 | * @create_conn: create new iSCSI connection |
49 | * @bind_conn: associate this connection with existing iSCSI session |
50 | * and specified transport descriptor |
51 | * @destroy_conn: destroy inactive iSCSI connection |
52 | * @set_param: set iSCSI parameter. Return 0 on success, -ENODATA |
53 | * when param is not supported, and a -Exx value on other |
54 | * error. |
55 | * @get_param get iSCSI parameter. Must return number of bytes |
56 | * copied to buffer on success, -ENODATA when param |
57 | * is not supported, and a -Exx value on other error |
58 | * @start_conn: set connection to be operational |
59 | * @stop_conn: suspend/recover/terminate connection |
60 | * @send_pdu: send iSCSI PDU, Login, Logout, NOP-Out, Reject, Text. |
61 | * @session_recovery_timedout: notify LLD a block during recovery timed out |
62 | * @init_task: Initialize a iscsi_task and any internal structs. |
63 | * When offloading the data path, this is called from |
64 | * queuecommand with the session lock, or from the |
65 | * iscsi_conn_send_pdu context with the session lock. |
66 | * When not offloading the data path, this is called |
67 | * from the scsi work queue without the session lock. |
68 | * @xmit_task Requests LLD to transfer cmd task. Returns 0 or the |
69 | * the number of bytes transferred on success, and -Exyz |
70 | * value on error. When offloading the data path, this |
71 | * is called from queuecommand with the session lock, or |
72 | * from the iscsi_conn_send_pdu context with the session |
73 | * lock. When not offloading the data path, this is called |
74 | * from the scsi work queue without the session lock. |
75 | * @cleanup_task: requests LLD to fail task. Called with session lock |
76 | * and after the connection has been suspended and |
77 | * terminated during recovery. If called |
78 | * from abort task then connection is not suspended |
79 | * or terminated but sk_callback_lock is held |
80 | * |
81 | * Template API provided by iSCSI Transport |
82 | */ |
83 | struct iscsi_transport { |
84 | struct module *owner; |
85 | char *name; |
86 | unsigned int caps; |
87 | /* LLD sets this to indicate what values it can export to sysfs */ |
88 | uint64_t param_mask; |
89 | uint64_t host_param_mask; |
90 | struct iscsi_cls_session *(*create_session) (struct iscsi_endpoint *ep, |
91 | uint16_t cmds_max, uint16_t qdepth, |
92 | uint32_t sn); |
93 | void (*destroy_session) (struct iscsi_cls_session *session); |
94 | struct iscsi_cls_conn *(*create_conn) (struct iscsi_cls_session *sess, |
95 | uint32_t cid); |
96 | int (*bind_conn) (struct iscsi_cls_session *session, |
97 | struct iscsi_cls_conn *cls_conn, |
98 | uint64_t transport_eph, int is_leading); |
99 | int (*start_conn) (struct iscsi_cls_conn *conn); |
100 | void (*stop_conn) (struct iscsi_cls_conn *conn, int flag); |
101 | void (*destroy_conn) (struct iscsi_cls_conn *conn); |
102 | int (*set_param) (struct iscsi_cls_conn *conn, enum iscsi_param param, |
103 | char *buf, int buflen); |
104 | int (*get_ep_param) (struct iscsi_endpoint *ep, enum iscsi_param param, |
105 | char *buf); |
106 | int (*get_conn_param) (struct iscsi_cls_conn *conn, |
107 | enum iscsi_param param, char *buf); |
108 | int (*get_session_param) (struct iscsi_cls_session *session, |
109 | enum iscsi_param param, char *buf); |
110 | int (*get_host_param) (struct Scsi_Host *shost, |
111 | enum iscsi_host_param param, char *buf); |
112 | int (*set_host_param) (struct Scsi_Host *shost, |
113 | enum iscsi_host_param param, char *buf, |
114 | int buflen); |
115 | int (*send_pdu) (struct iscsi_cls_conn *conn, struct iscsi_hdr *hdr, |
116 | char *data, uint32_t data_size); |
117 | void (*get_stats) (struct iscsi_cls_conn *conn, |
118 | struct iscsi_stats *stats); |
119 | |
120 | int (*init_task) (struct iscsi_task *task); |
121 | int (*xmit_task) (struct iscsi_task *task); |
122 | void (*cleanup_task) (struct iscsi_task *task); |
123 | |
124 | int (*alloc_pdu) (struct iscsi_task *task, uint8_t opcode); |
125 | int (*xmit_pdu) (struct iscsi_task *task); |
126 | int (*init_pdu) (struct iscsi_task *task, unsigned int offset, |
127 | unsigned int count); |
128 | void (*parse_pdu_itt) (struct iscsi_conn *conn, itt_t itt, |
129 | int *index, int *age); |
130 | |
131 | void (*session_recovery_timedout) (struct iscsi_cls_session *session); |
132 | struct iscsi_endpoint *(*ep_connect) (struct Scsi_Host *shost, |
133 | struct sockaddr *dst_addr, |
134 | int non_blocking); |
135 | int (*ep_poll) (struct iscsi_endpoint *ep, int timeout_ms); |
136 | void (*ep_disconnect) (struct iscsi_endpoint *ep); |
137 | int (*tgt_dscvr) (struct Scsi_Host *shost, enum iscsi_tgt_dscvr type, |
138 | uint32_t enable, struct sockaddr *dst_addr); |
139 | int (*set_path) (struct Scsi_Host *shost, struct iscsi_path *params); |
140 | }; |
141 | |
142 | /* |
143 | * transport registration upcalls |
144 | */ |
145 | extern struct scsi_transport_template *iscsi_register_transport(struct iscsi_transport *tt); |
146 | extern int iscsi_unregister_transport(struct iscsi_transport *tt); |
147 | |
148 | /* |
149 | * control plane upcalls |
150 | */ |
151 | extern void iscsi_conn_error_event(struct iscsi_cls_conn *conn, |
152 | enum iscsi_err error); |
153 | extern int iscsi_recv_pdu(struct iscsi_cls_conn *conn, struct iscsi_hdr *hdr, |
154 | char *data, uint32_t data_size); |
155 | |
156 | extern int iscsi_offload_mesg(struct Scsi_Host *shost, |
157 | struct iscsi_transport *transport, uint32_t type, |
158 | char *data, uint16_t data_size); |
159 | |
160 | struct iscsi_cls_conn { |
161 | struct list_head conn_list; /* item in connlist */ |
162 | void *dd_data; /* LLD private data */ |
163 | struct iscsi_transport *transport; |
164 | uint32_t cid; /* connection id */ |
165 | struct mutex ep_mutex; |
166 | struct iscsi_endpoint *ep; |
167 | |
168 | struct device dev; /* sysfs transport/container device */ |
169 | }; |
170 | |
171 | #define iscsi_dev_to_conn(_dev) \ |
172 | container_of(_dev, struct iscsi_cls_conn, dev) |
173 | |
174 | #define iscsi_conn_to_session(_conn) \ |
175 | iscsi_dev_to_session(_conn->dev.parent) |
176 | |
177 | /* iscsi class session state */ |
178 | enum { |
179 | ISCSI_SESSION_LOGGED_IN, |
180 | ISCSI_SESSION_FAILED, |
181 | ISCSI_SESSION_FREE, |
182 | }; |
183 | |
184 | #define ISCSI_MAX_TARGET -1 |
185 | |
186 | struct iscsi_cls_session { |
187 | struct list_head sess_list; /* item in session_list */ |
188 | struct iscsi_transport *transport; |
189 | spinlock_t lock; |
190 | struct work_struct block_work; |
191 | struct work_struct unblock_work; |
192 | struct work_struct scan_work; |
193 | struct work_struct unbind_work; |
194 | |
195 | /* recovery fields */ |
196 | int recovery_tmo; |
197 | struct delayed_work recovery_work; |
198 | |
199 | unsigned int target_id; |
200 | |
201 | int state; |
202 | int sid; /* session id */ |
203 | void *dd_data; /* LLD private data */ |
204 | struct device dev; /* sysfs transport/container device */ |
205 | }; |
206 | |
207 | #define iscsi_dev_to_session(_dev) \ |
208 | container_of(_dev, struct iscsi_cls_session, dev) |
209 | |
210 | #define iscsi_session_to_shost(_session) \ |
211 | dev_to_shost(_session->dev.parent) |
212 | |
213 | #define starget_to_session(_stgt) \ |
214 | iscsi_dev_to_session(_stgt->dev.parent) |
215 | |
216 | struct iscsi_cls_host { |
217 | atomic_t nr_scans; |
218 | struct mutex mutex; |
219 | }; |
220 | |
221 | extern void iscsi_host_for_each_session(struct Scsi_Host *shost, |
222 | void (*fn)(struct iscsi_cls_session *)); |
223 | |
224 | struct iscsi_endpoint { |
225 | void *dd_data; /* LLD private data */ |
226 | struct device dev; |
227 | uint64_t id; |
228 | struct iscsi_cls_conn *conn; |
229 | }; |
230 | |
231 | /* |
232 | * session and connection functions that can be used by HW iSCSI LLDs |
233 | */ |
234 | #define iscsi_cls_session_printk(prefix, _cls_session, fmt, a...) \ |
235 | dev_printk(prefix, &(_cls_session)->dev, fmt, ##a) |
236 | |
237 | #define iscsi_cls_conn_printk(prefix, _cls_conn, fmt, a...) \ |
238 | dev_printk(prefix, &(_cls_conn)->dev, fmt, ##a) |
239 | |
240 | extern int iscsi_session_chkready(struct iscsi_cls_session *session); |
241 | extern struct iscsi_cls_session *iscsi_alloc_session(struct Scsi_Host *shost, |
242 | struct iscsi_transport *transport, int dd_size); |
243 | extern int iscsi_add_session(struct iscsi_cls_session *session, |
244 | unsigned int target_id); |
245 | extern int iscsi_session_event(struct iscsi_cls_session *session, |
246 | enum iscsi_uevent_e event); |
247 | extern struct iscsi_cls_session *iscsi_create_session(struct Scsi_Host *shost, |
248 | struct iscsi_transport *t, |
249 | int dd_size, |
250 | unsigned int target_id); |
251 | extern void iscsi_remove_session(struct iscsi_cls_session *session); |
252 | extern void iscsi_free_session(struct iscsi_cls_session *session); |
253 | extern int iscsi_destroy_session(struct iscsi_cls_session *session); |
254 | extern struct iscsi_cls_conn *iscsi_create_conn(struct iscsi_cls_session *sess, |
255 | int dd_size, uint32_t cid); |
256 | extern int iscsi_destroy_conn(struct iscsi_cls_conn *conn); |
257 | extern void iscsi_unblock_session(struct iscsi_cls_session *session); |
258 | extern void iscsi_block_session(struct iscsi_cls_session *session); |
259 | extern int iscsi_scan_finished(struct Scsi_Host *shost, unsigned long time); |
260 | extern struct iscsi_endpoint *iscsi_create_endpoint(int dd_size); |
261 | extern void iscsi_destroy_endpoint(struct iscsi_endpoint *ep); |
262 | extern struct iscsi_endpoint *iscsi_lookup_endpoint(u64 handle); |
263 | extern int iscsi_block_scsi_eh(struct scsi_cmnd *cmd); |
264 | |
265 | #endif |
266 |
Branches:
ben-wpan
ben-wpan-stefan
javiroman/ks7010
jz-2.6.34
jz-2.6.34-rc5
jz-2.6.34-rc6
jz-2.6.34-rc7
jz-2.6.35
jz-2.6.36
jz-2.6.37
jz-2.6.38
jz-2.6.39
jz-3.0
jz-3.1
jz-3.11
jz-3.12
jz-3.13
jz-3.15
jz-3.16
jz-3.18-dt
jz-3.2
jz-3.3
jz-3.4
jz-3.5
jz-3.6
jz-3.6-rc2-pwm
jz-3.9
jz-3.9-clk
jz-3.9-rc8
jz47xx
jz47xx-2.6.38
master
Tags:
od-2011-09-04
od-2011-09-18
v2.6.34-rc5
v2.6.34-rc6
v2.6.34-rc7
v3.9