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 iscsi_cls_conn; |
36 | struct iscsi_conn; |
37 | struct iscsi_task; |
38 | struct sockaddr; |
39 | |
40 | /** |
41 | * struct iscsi_transport - iSCSI Transport template |
42 | * |
43 | * @name: transport name |
44 | * @caps: iSCSI Data-Path capabilities |
45 | * @create_session: create new iSCSI session object |
46 | * @destroy_session: destroy existing iSCSI session object |
47 | * @create_conn: create new iSCSI connection |
48 | * @bind_conn: associate this connection with existing iSCSI session |
49 | * and specified transport descriptor |
50 | * @destroy_conn: destroy inactive iSCSI connection |
51 | * @set_param: set iSCSI parameter. Return 0 on success, -ENODATA |
52 | * when param is not supported, and a -Exx value on other |
53 | * error. |
54 | * @get_param get iSCSI parameter. Must return number of bytes |
55 | * copied to buffer on success, -ENODATA when param |
56 | * is not supported, and a -Exx value on other error |
57 | * @start_conn: set connection to be operational |
58 | * @stop_conn: suspend/recover/terminate connection |
59 | * @send_pdu: send iSCSI PDU, Login, Logout, NOP-Out, Reject, Text. |
60 | * @session_recovery_timedout: notify LLD a block during recovery timed out |
61 | * @init_task: Initialize a iscsi_task and any internal structs. |
62 | * When offloading the data path, this is called from |
63 | * queuecommand with the session lock, or from the |
64 | * iscsi_conn_send_pdu context with the session lock. |
65 | * When not offloading the data path, this is called |
66 | * from the scsi work queue without the session lock. |
67 | * @xmit_task Requests LLD to transfer cmd task. Returns 0 or the |
68 | * the number of bytes transferred on success, and -Exyz |
69 | * value on error. When offloading the data path, this |
70 | * is called from queuecommand with the session lock, or |
71 | * from the iscsi_conn_send_pdu context with the session |
72 | * lock. When not offloading the data path, this is called |
73 | * from the scsi work queue without the session lock. |
74 | * @cleanup_task: requests LLD to fail task. Called with session lock |
75 | * and after the connection has been suspended and |
76 | * terminated during recovery. If called |
77 | * from abort task then connection is not suspended |
78 | * or terminated but sk_callback_lock is held |
79 | * |
80 | * Template API provided by iSCSI Transport |
81 | */ |
82 | struct iscsi_transport { |
83 | struct module *owner; |
84 | char *name; |
85 | unsigned int caps; |
86 | /* LLD sets this to indicate what values it can export to sysfs */ |
87 | uint64_t param_mask; |
88 | uint64_t host_param_mask; |
89 | struct iscsi_cls_session *(*create_session) (struct iscsi_endpoint *ep, |
90 | uint16_t cmds_max, uint16_t qdepth, |
91 | uint32_t sn); |
92 | void (*destroy_session) (struct iscsi_cls_session *session); |
93 | struct iscsi_cls_conn *(*create_conn) (struct iscsi_cls_session *sess, |
94 | uint32_t cid); |
95 | int (*bind_conn) (struct iscsi_cls_session *session, |
96 | struct iscsi_cls_conn *cls_conn, |
97 | uint64_t transport_eph, int is_leading); |
98 | int (*start_conn) (struct iscsi_cls_conn *conn); |
99 | void (*stop_conn) (struct iscsi_cls_conn *conn, int flag); |
100 | void (*destroy_conn) (struct iscsi_cls_conn *conn); |
101 | int (*set_param) (struct iscsi_cls_conn *conn, enum iscsi_param param, |
102 | char *buf, int buflen); |
103 | int (*get_conn_param) (struct iscsi_cls_conn *conn, |
104 | enum iscsi_param param, char *buf); |
105 | int (*get_session_param) (struct iscsi_cls_session *session, |
106 | enum iscsi_param param, char *buf); |
107 | int (*get_host_param) (struct Scsi_Host *shost, |
108 | enum iscsi_host_param param, char *buf); |
109 | int (*set_host_param) (struct Scsi_Host *shost, |
110 | enum iscsi_host_param param, char *buf, |
111 | int buflen); |
112 | int (*send_pdu) (struct iscsi_cls_conn *conn, struct iscsi_hdr *hdr, |
113 | char *data, uint32_t data_size); |
114 | void (*get_stats) (struct iscsi_cls_conn *conn, |
115 | struct iscsi_stats *stats); |
116 | |
117 | int (*init_task) (struct iscsi_task *task); |
118 | int (*xmit_task) (struct iscsi_task *task); |
119 | void (*cleanup_task) (struct iscsi_task *task); |
120 | |
121 | int (*alloc_pdu) (struct iscsi_task *task, uint8_t opcode); |
122 | int (*xmit_pdu) (struct iscsi_task *task); |
123 | int (*init_pdu) (struct iscsi_task *task, unsigned int offset, |
124 | unsigned int count); |
125 | void (*parse_pdu_itt) (struct iscsi_conn *conn, itt_t itt, |
126 | int *index, int *age); |
127 | |
128 | void (*session_recovery_timedout) (struct iscsi_cls_session *session); |
129 | struct iscsi_endpoint *(*ep_connect) (struct Scsi_Host *shost, |
130 | struct sockaddr *dst_addr, |
131 | int non_blocking); |
132 | int (*ep_poll) (struct iscsi_endpoint *ep, int timeout_ms); |
133 | void (*ep_disconnect) (struct iscsi_endpoint *ep); |
134 | int (*tgt_dscvr) (struct Scsi_Host *shost, enum iscsi_tgt_dscvr type, |
135 | uint32_t enable, struct sockaddr *dst_addr); |
136 | int (*set_path) (struct Scsi_Host *shost, struct iscsi_path *params); |
137 | }; |
138 | |
139 | /* |
140 | * transport registration upcalls |
141 | */ |
142 | extern struct scsi_transport_template *iscsi_register_transport(struct iscsi_transport *tt); |
143 | extern int iscsi_unregister_transport(struct iscsi_transport *tt); |
144 | |
145 | /* |
146 | * control plane upcalls |
147 | */ |
148 | extern void iscsi_conn_error_event(struct iscsi_cls_conn *conn, |
149 | enum iscsi_err error); |
150 | extern int iscsi_recv_pdu(struct iscsi_cls_conn *conn, struct iscsi_hdr *hdr, |
151 | char *data, uint32_t data_size); |
152 | |
153 | extern int iscsi_offload_mesg(struct Scsi_Host *shost, |
154 | struct iscsi_transport *transport, uint32_t type, |
155 | char *data, uint16_t data_size); |
156 | |
157 | struct iscsi_cls_conn { |
158 | struct list_head conn_list; /* item in connlist */ |
159 | void *dd_data; /* LLD private data */ |
160 | struct iscsi_transport *transport; |
161 | uint32_t cid; /* connection id */ |
162 | |
163 | int active; /* must be accessed with the connlock */ |
164 | struct device dev; /* sysfs transport/container device */ |
165 | }; |
166 | |
167 | #define iscsi_dev_to_conn(_dev) \ |
168 | container_of(_dev, struct iscsi_cls_conn, dev) |
169 | |
170 | #define iscsi_conn_to_session(_conn) \ |
171 | iscsi_dev_to_session(_conn->dev.parent) |
172 | |
173 | /* iscsi class session state */ |
174 | enum { |
175 | ISCSI_SESSION_LOGGED_IN, |
176 | ISCSI_SESSION_FAILED, |
177 | ISCSI_SESSION_FREE, |
178 | }; |
179 | |
180 | #define ISCSI_MAX_TARGET -1 |
181 | |
182 | struct iscsi_cls_session { |
183 | struct list_head sess_list; /* item in session_list */ |
184 | struct iscsi_transport *transport; |
185 | spinlock_t lock; |
186 | struct work_struct block_work; |
187 | struct work_struct unblock_work; |
188 | struct work_struct scan_work; |
189 | struct work_struct unbind_work; |
190 | |
191 | /* recovery fields */ |
192 | int recovery_tmo; |
193 | struct delayed_work recovery_work; |
194 | |
195 | unsigned int target_id; |
196 | |
197 | int state; |
198 | int sid; /* session id */ |
199 | void *dd_data; /* LLD private data */ |
200 | struct device dev; /* sysfs transport/container device */ |
201 | }; |
202 | |
203 | #define iscsi_dev_to_session(_dev) \ |
204 | container_of(_dev, struct iscsi_cls_session, dev) |
205 | |
206 | #define iscsi_session_to_shost(_session) \ |
207 | dev_to_shost(_session->dev.parent) |
208 | |
209 | #define starget_to_session(_stgt) \ |
210 | iscsi_dev_to_session(_stgt->dev.parent) |
211 | |
212 | struct iscsi_cls_host { |
213 | atomic_t nr_scans; |
214 | struct mutex mutex; |
215 | }; |
216 | |
217 | extern void iscsi_host_for_each_session(struct Scsi_Host *shost, |
218 | void (*fn)(struct iscsi_cls_session *)); |
219 | |
220 | struct iscsi_endpoint { |
221 | void *dd_data; /* LLD private data */ |
222 | struct device dev; |
223 | uint64_t id; |
224 | }; |
225 | |
226 | /* |
227 | * session and connection functions that can be used by HW iSCSI LLDs |
228 | */ |
229 | #define iscsi_cls_session_printk(prefix, _cls_session, fmt, a...) \ |
230 | dev_printk(prefix, &(_cls_session)->dev, fmt, ##a) |
231 | |
232 | #define iscsi_cls_conn_printk(prefix, _cls_conn, fmt, a...) \ |
233 | dev_printk(prefix, &(_cls_conn)->dev, fmt, ##a) |
234 | |
235 | extern int iscsi_session_chkready(struct iscsi_cls_session *session); |
236 | extern struct iscsi_cls_session *iscsi_alloc_session(struct Scsi_Host *shost, |
237 | struct iscsi_transport *transport, int dd_size); |
238 | extern int iscsi_add_session(struct iscsi_cls_session *session, |
239 | unsigned int target_id); |
240 | extern int iscsi_session_event(struct iscsi_cls_session *session, |
241 | enum iscsi_uevent_e event); |
242 | extern struct iscsi_cls_session *iscsi_create_session(struct Scsi_Host *shost, |
243 | struct iscsi_transport *t, |
244 | int dd_size, |
245 | unsigned int target_id); |
246 | extern void iscsi_remove_session(struct iscsi_cls_session *session); |
247 | extern void iscsi_free_session(struct iscsi_cls_session *session); |
248 | extern int iscsi_destroy_session(struct iscsi_cls_session *session); |
249 | extern struct iscsi_cls_conn *iscsi_create_conn(struct iscsi_cls_session *sess, |
250 | int dd_size, uint32_t cid); |
251 | extern int iscsi_destroy_conn(struct iscsi_cls_conn *conn); |
252 | extern void iscsi_unblock_session(struct iscsi_cls_session *session); |
253 | extern void iscsi_block_session(struct iscsi_cls_session *session); |
254 | extern int iscsi_scan_finished(struct Scsi_Host *shost, unsigned long time); |
255 | extern struct iscsi_endpoint *iscsi_create_endpoint(int dd_size); |
256 | extern void iscsi_destroy_endpoint(struct iscsi_endpoint *ep); |
257 | extern struct iscsi_endpoint *iscsi_lookup_endpoint(u64 handle); |
258 | |
259 | #endif |
260 |
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