aboutsummaryrefslogtreecommitdiffstats
path: root/include/scsi
diff options
context:
space:
mode:
Diffstat (limited to 'include/scsi')
-rw-r--r--include/scsi/iscsi_if.h106
-rw-r--r--include/scsi/libiscsi.h286
-rw-r--r--include/scsi/scsi_devinfo.h1
-rw-r--r--include/scsi/scsi_transport_iscsi.h107
4 files changed, 451 insertions, 49 deletions
diff --git a/include/scsi/iscsi_if.h b/include/scsi/iscsi_if.h
index e5618b90996e..47524c726ee8 100644
--- a/include/scsi/iscsi_if.h
+++ b/include/scsi/iscsi_if.h
@@ -60,59 +60,68 @@ struct iscsi_uevent {
60 uint32_t initial_cmdsn; 60 uint32_t initial_cmdsn;
61 } c_session; 61 } c_session;
62 struct msg_destroy_session { 62 struct msg_destroy_session {
63 uint64_t session_handle;
64 uint32_t sid; 63 uint32_t sid;
65 } d_session; 64 } d_session;
66 struct msg_create_conn { 65 struct msg_create_conn {
67 uint64_t session_handle;
68 uint32_t cid;
69 uint32_t sid; 66 uint32_t sid;
67 uint32_t cid;
70 } c_conn; 68 } c_conn;
71 struct msg_bind_conn { 69 struct msg_bind_conn {
72 uint64_t session_handle; 70 uint32_t sid;
73 uint64_t conn_handle; 71 uint32_t cid;
74 uint32_t transport_fd; 72 uint32_t transport_fd;
75 uint32_t is_leading; 73 uint32_t is_leading;
76 } b_conn; 74 } b_conn;
77 struct msg_destroy_conn { 75 struct msg_destroy_conn {
78 uint64_t conn_handle; 76 uint32_t sid;
79 uint32_t cid; 77 uint32_t cid;
80 } d_conn; 78 } d_conn;
81 struct msg_send_pdu { 79 struct msg_send_pdu {
80 uint32_t sid;
81 uint32_t cid;
82 uint32_t hdr_size; 82 uint32_t hdr_size;
83 uint32_t data_size; 83 uint32_t data_size;
84 uint64_t conn_handle;
85 } send_pdu; 84 } send_pdu;
86 struct msg_set_param { 85 struct msg_set_param {
87 uint64_t conn_handle; 86 uint32_t sid;
87 uint32_t cid;
88 uint32_t param; /* enum iscsi_param */ 88 uint32_t param; /* enum iscsi_param */
89 uint32_t value; 89 uint32_t len;
90 } set_param; 90 } set_param;
91 struct msg_start_conn { 91 struct msg_start_conn {
92 uint64_t conn_handle; 92 uint32_t sid;
93 uint32_t cid;
93 } start_conn; 94 } start_conn;
94 struct msg_stop_conn { 95 struct msg_stop_conn {
96 uint32_t sid;
97 uint32_t cid;
95 uint64_t conn_handle; 98 uint64_t conn_handle;
96 uint32_t flag; 99 uint32_t flag;
97 } stop_conn; 100 } stop_conn;
98 struct msg_get_stats { 101 struct msg_get_stats {
99 uint64_t conn_handle; 102 uint32_t sid;
103 uint32_t cid;
100 } get_stats; 104 } get_stats;
101 } u; 105 } u;
102 union { 106 union {
103 /* messages k -> u */ 107 /* messages k -> u */
104 uint64_t handle;
105 int retcode; 108 int retcode;
106 struct msg_create_session_ret { 109 struct msg_create_session_ret {
107 uint64_t session_handle;
108 uint32_t sid; 110 uint32_t sid;
111 uint32_t host_no;
109 } c_session_ret; 112 } c_session_ret;
113 struct msg_create_conn_ret {
114 uint32_t sid;
115 uint32_t cid;
116 } c_conn_ret;
110 struct msg_recv_req { 117 struct msg_recv_req {
118 uint32_t sid;
119 uint32_t cid;
111 uint64_t recv_handle; 120 uint64_t recv_handle;
112 uint64_t conn_handle;
113 } recv_req; 121 } recv_req;
114 struct msg_conn_error { 122 struct msg_conn_error {
115 uint64_t conn_handle; 123 uint32_t sid;
124 uint32_t cid;
116 uint32_t error; /* enum iscsi_err */ 125 uint32_t error; /* enum iscsi_err */
117 } connerror; 126 } connerror;
118 } r; 127 } r;
@@ -139,29 +148,64 @@ enum iscsi_err {
139 ISCSI_ERR_SESSION_FAILED = ISCSI_ERR_BASE + 13, 148 ISCSI_ERR_SESSION_FAILED = ISCSI_ERR_BASE + 13,
140 ISCSI_ERR_HDR_DGST = ISCSI_ERR_BASE + 14, 149 ISCSI_ERR_HDR_DGST = ISCSI_ERR_BASE + 14,
141 ISCSI_ERR_DATA_DGST = ISCSI_ERR_BASE + 15, 150 ISCSI_ERR_DATA_DGST = ISCSI_ERR_BASE + 15,
142 ISCSI_ERR_PARAM_NOT_FOUND = ISCSI_ERR_BASE + 16 151 ISCSI_ERR_PARAM_NOT_FOUND = ISCSI_ERR_BASE + 16,
152 ISCSI_ERR_NO_SCSI_CMD = ISCSI_ERR_BASE + 17,
143}; 153};
144 154
145/* 155/*
146 * iSCSI Parameters (RFC3720) 156 * iSCSI Parameters (RFC3720)
147 */ 157 */
148enum iscsi_param { 158enum iscsi_param {
149 ISCSI_PARAM_MAX_RECV_DLENGTH = 0, 159 /* passed in using netlink set param */
150 ISCSI_PARAM_MAX_XMIT_DLENGTH = 1, 160 ISCSI_PARAM_MAX_RECV_DLENGTH,
151 ISCSI_PARAM_HDRDGST_EN = 2, 161 ISCSI_PARAM_MAX_XMIT_DLENGTH,
152 ISCSI_PARAM_DATADGST_EN = 3, 162 ISCSI_PARAM_HDRDGST_EN,
153 ISCSI_PARAM_INITIAL_R2T_EN = 4, 163 ISCSI_PARAM_DATADGST_EN,
154 ISCSI_PARAM_MAX_R2T = 5, 164 ISCSI_PARAM_INITIAL_R2T_EN,
155 ISCSI_PARAM_IMM_DATA_EN = 6, 165 ISCSI_PARAM_MAX_R2T,
156 ISCSI_PARAM_FIRST_BURST = 7, 166 ISCSI_PARAM_IMM_DATA_EN,
157 ISCSI_PARAM_MAX_BURST = 8, 167 ISCSI_PARAM_FIRST_BURST,
158 ISCSI_PARAM_PDU_INORDER_EN = 9, 168 ISCSI_PARAM_MAX_BURST,
159 ISCSI_PARAM_DATASEQ_INORDER_EN = 10, 169 ISCSI_PARAM_PDU_INORDER_EN,
160 ISCSI_PARAM_ERL = 11, 170 ISCSI_PARAM_DATASEQ_INORDER_EN,
161 ISCSI_PARAM_IFMARKER_EN = 12, 171 ISCSI_PARAM_ERL,
162 ISCSI_PARAM_OFMARKER_EN = 13, 172 ISCSI_PARAM_IFMARKER_EN,
173 ISCSI_PARAM_OFMARKER_EN,
174 ISCSI_PARAM_TARGET_NAME,
175 ISCSI_PARAM_TPGT,
176 ISCSI_PARAM_PERSISTENT_ADDRESS,
177 ISCSI_PARAM_PERSISTENT_PORT,
178 ISCSI_PARAM_SESS_RECOVERY_TMO,
179
180 /* pased in through bind conn using transport_fd */
181 ISCSI_PARAM_CONN_PORT,
182 ISCSI_PARAM_CONN_ADDRESS,
183
184 /* must always be last */
185 ISCSI_PARAM_MAX,
163}; 186};
164#define ISCSI_PARAM_MAX 14 187
188#define ISCSI_MAX_RECV_DLENGTH (1 << ISCSI_PARAM_MAX_RECV_DLENGTH)
189#define ISCSI_MAX_XMIT_DLENGTH (1 << ISCSI_PARAM_MAX_XMIT_DLENGTH)
190#define ISCSI_HDRDGST_EN (1 << ISCSI_PARAM_HDRDGST_EN)
191#define ISCSI_DATADGST_EN (1 << ISCSI_PARAM_DATADGST_EN)
192#define ISCSI_INITIAL_R2T_EN (1 << ISCSI_PARAM_INITIAL_R2T_EN)
193#define ISCSI_MAX_R2T (1 << ISCSI_PARAM_MAX_R2T)
194#define ISCSI_IMM_DATA_EN (1 << ISCSI_PARAM_IMM_DATA_EN)
195#define ISCSI_FIRST_BURST (1 << ISCSI_PARAM_FIRST_BURST)
196#define ISCSI_MAX_BURST (1 << ISCSI_PARAM_MAX_BURST)
197#define ISCSI_PDU_INORDER_EN (1 << ISCSI_PARAM_PDU_INORDER_EN)
198#define ISCSI_DATASEQ_INORDER_EN (1 << ISCSI_PARAM_DATASEQ_INORDER_EN)
199#define ISCSI_ERL (1 << ISCSI_PARAM_ERL)
200#define ISCSI_IFMARKER_EN (1 << ISCSI_PARAM_IFMARKER_EN)
201#define ISCSI_OFMARKER_EN (1 << ISCSI_PARAM_OFMARKER_EN)
202#define ISCSI_TARGET_NAME (1 << ISCSI_PARAM_TARGET_NAME)
203#define ISCSI_TPGT (1 << ISCSI_PARAM_TPGT)
204#define ISCSI_PERSISTENT_ADDRESS (1 << ISCSI_PARAM_PERSISTENT_ADDRESS)
205#define ISCSI_PERSISTENT_PORT (1 << ISCSI_PARAM_PERSISTENT_PORT)
206#define ISCSI_SESS_RECOVERY_TMO (1 << ISCSI_PARAM_SESS_RECOVERY_TMO)
207#define ISCSI_CONN_PORT (1 << ISCSI_PARAM_CONN_PORT)
208#define ISCSI_CONN_ADDRESS (1 << ISCSI_PARAM_CONN_ADDRESS)
165 209
166#define iscsi_ptr(_handle) ((void*)(unsigned long)_handle) 210#define iscsi_ptr(_handle) ((void*)(unsigned long)_handle)
167#define iscsi_handle(_ptr) ((uint64_t)(unsigned long)_ptr) 211#define iscsi_handle(_ptr) ((uint64_t)(unsigned long)_ptr)
diff --git a/include/scsi/libiscsi.h b/include/scsi/libiscsi.h
new file mode 100644
index 000000000000..830700a4ed69
--- /dev/null
+++ b/include/scsi/libiscsi.h
@@ -0,0 +1,286 @@
1/*
2 * iSCSI lib definitions
3 *
4 * Copyright (C) 2006 Red Hat, Inc. All rights reserved.
5 * Copyright (C) 2004 - 2006 Mike Christie
6 * Copyright (C) 2004 - 2005 Dmitry Yusupov
7 * Copyright (C) 2004 - 2005 Alex Aizman
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 LIBISCSI_H
24#define LIBISCSI_H
25
26#include <linux/types.h>
27#include <linux/mutex.h>
28#include <scsi/iscsi_proto.h>
29#include <scsi/iscsi_if.h>
30
31struct scsi_transport_template;
32struct scsi_device;
33struct Scsi_Host;
34struct scsi_cmnd;
35struct socket;
36struct iscsi_transport;
37struct iscsi_cls_session;
38struct iscsi_cls_conn;
39struct iscsi_session;
40struct iscsi_nopin;
41
42/* #define DEBUG_SCSI */
43#ifdef DEBUG_SCSI
44#define debug_scsi(fmt...) printk(KERN_INFO "scsi: " fmt)
45#else
46#define debug_scsi(fmt...)
47#endif
48
49#define ISCSI_XMIT_CMDS_MAX 128 /* must be power of 2 */
50#define ISCSI_MGMT_CMDS_MAX 32 /* must be power of 2 */
51#define ISCSI_CONN_MAX 1
52
53#define ISCSI_MGMT_ITT_OFFSET 0xa00
54
55#define ISCSI_DEF_CMD_PER_LUN 32
56#define ISCSI_MAX_CMD_PER_LUN 128
57
58/* Task Mgmt states */
59#define TMABORT_INITIAL 0x0
60#define TMABORT_SUCCESS 0x1
61#define TMABORT_FAILED 0x2
62#define TMABORT_TIMEDOUT 0x3
63
64/* Connection suspend "bit" */
65#define ISCSI_SUSPEND_BIT 1
66
67#define ISCSI_ITT_MASK (0xfff)
68#define ISCSI_CID_SHIFT 12
69#define ISCSI_CID_MASK (0xffff << ISCSI_CID_SHIFT)
70#define ISCSI_AGE_SHIFT 28
71#define ISCSI_AGE_MASK (0xf << ISCSI_AGE_SHIFT)
72
73struct iscsi_mgmt_task {
74 /*
75 * Becuae LLDs allocate their hdr differently, this is a pointer to
76 * that storage. It must be setup at session creation time.
77 */
78 struct iscsi_hdr *hdr;
79 char *data; /* mgmt payload */
80 int data_count; /* counts data to be sent */
81 uint32_t itt; /* this ITT */
82 void *dd_data; /* driver/transport data */
83 struct list_head running;
84};
85
86struct iscsi_cmd_task {
87 /*
88 * Becuae LLDs allocate their hdr differently, this is a pointer to
89 * that storage. It must be setup at session creation time.
90 */
91 struct iscsi_cmd *hdr;
92 int itt; /* this ITT */
93 int datasn; /* DataSN */
94
95 uint32_t unsol_datasn;
96 int imm_count; /* imm-data (bytes) */
97 int unsol_count; /* unsolicited (bytes)*/
98 int data_count; /* remaining Data-Out */
99 struct scsi_cmnd *sc; /* associated SCSI cmd*/
100 int total_length;
101 struct iscsi_conn *conn; /* used connection */
102 struct iscsi_mgmt_task *mtask; /* tmf mtask in progr */
103
104 struct list_head running; /* running cmd list */
105 void *dd_data; /* driver/transport data */
106};
107
108struct iscsi_conn {
109 struct iscsi_cls_conn *cls_conn; /* ptr to class connection */
110 void *dd_data; /* iscsi_transport data */
111 struct iscsi_session *session; /* parent session */
112 /*
113 * LLDs should set this lock. It protects the transport recv
114 * code
115 */
116 rwlock_t *recv_lock;
117 /*
118 * conn_stop() flag: stop to recover, stop to terminate
119 */
120 int stop_stage;
121
122 /* iSCSI connection-wide sequencing */
123 uint32_t exp_statsn;
124
125 /* control data */
126 int id; /* CID */
127 struct list_head item; /* maintains list of conns */
128 int c_stage; /* connection state */
129 struct iscsi_mgmt_task *login_mtask; /* mtask used for login/text */
130 struct iscsi_mgmt_task *mtask; /* xmit mtask in progress */
131 struct iscsi_cmd_task *ctask; /* xmit ctask in progress */
132
133 /* xmit */
134 struct kfifo *immqueue; /* immediate xmit queue */
135 struct kfifo *mgmtqueue; /* mgmt (control) xmit queue */
136 struct list_head mgmt_run_list; /* list of control tasks */
137 struct kfifo *xmitqueue; /* data-path cmd queue */
138 struct list_head run_list; /* list of cmds in progress */
139 struct work_struct xmitwork; /* per-conn. xmit workqueue */
140 /*
141 * serializes connection xmit, access to kfifos:
142 * xmitqueue, immqueue, mgmtqueue
143 */
144 struct mutex xmitmutex;
145
146 unsigned long suspend_tx; /* suspend Tx */
147 unsigned long suspend_rx; /* suspend Rx */
148
149 /* abort */
150 wait_queue_head_t ehwait; /* used in eh_abort() */
151 struct iscsi_tm tmhdr;
152 struct timer_list tmabort_timer;
153 int tmabort_state; /* see TMABORT_INITIAL, etc.*/
154
155 /* negotiated params */
156 int max_recv_dlength; /* initiator_max_recv_dsl*/
157 int max_xmit_dlength; /* target_max_recv_dsl */
158 int hdrdgst_en;
159 int datadgst_en;
160
161 /* MIB-statistics */
162 uint64_t txdata_octets;
163 uint64_t rxdata_octets;
164 uint32_t scsicmd_pdus_cnt;
165 uint32_t dataout_pdus_cnt;
166 uint32_t scsirsp_pdus_cnt;
167 uint32_t datain_pdus_cnt;
168 uint32_t r2t_pdus_cnt;
169 uint32_t tmfcmd_pdus_cnt;
170 int32_t tmfrsp_pdus_cnt;
171
172 /* custom statistics */
173 uint32_t eh_abort_cnt;
174};
175
176struct iscsi_queue {
177 struct kfifo *queue; /* FIFO Queue */
178 void **pool; /* Pool of elements */
179 int max; /* Max number of elements */
180};
181
182struct iscsi_session {
183 /* iSCSI session-wide sequencing */
184 uint32_t cmdsn;
185 uint32_t exp_cmdsn;
186 uint32_t max_cmdsn;
187
188 /* configuration */
189 int initial_r2t_en;
190 int max_r2t;
191 int imm_data_en;
192 int first_burst;
193 int max_burst;
194 int time2wait;
195 int time2retain;
196 int pdu_inorder_en;
197 int dataseq_inorder_en;
198 int erl;
199 int ifmarker_en;
200 int ofmarker_en;
201
202 /* control data */
203 struct iscsi_transport *tt;
204 struct Scsi_Host *host;
205 struct iscsi_conn *leadconn; /* leading connection */
206 spinlock_t lock; /* protects session state, *
207 * sequence numbers, *
208 * session resources: *
209 * - cmdpool, *
210 * - mgmtpool, *
211 * - r2tpool */
212 int state; /* session state */
213 int recovery_failed;
214 struct list_head item;
215 int conn_cnt;
216 int age; /* counts session re-opens */
217
218 struct list_head connections; /* list of connections */
219 int cmds_max; /* size of cmds array */
220 struct iscsi_cmd_task **cmds; /* Original Cmds arr */
221 struct iscsi_queue cmdpool; /* PDU's pool */
222 int mgmtpool_max; /* size of mgmt array */
223 struct iscsi_mgmt_task **mgmt_cmds; /* Original mgmt arr */
224 struct iscsi_queue mgmtpool; /* Mgmt PDU's pool */
225};
226
227/*
228 * scsi host template
229 */
230extern int iscsi_change_queue_depth(struct scsi_device *sdev, int depth);
231extern int iscsi_eh_abort(struct scsi_cmnd *sc);
232extern int iscsi_eh_host_reset(struct scsi_cmnd *sc);
233extern int iscsi_queuecommand(struct scsi_cmnd *sc,
234 void (*done)(struct scsi_cmnd *));
235
236/*
237 * session management
238 */
239extern struct iscsi_cls_session *
240iscsi_session_setup(struct iscsi_transport *, struct scsi_transport_template *,
241 int, int, uint32_t, uint32_t *);
242extern void iscsi_session_teardown(struct iscsi_cls_session *);
243extern struct iscsi_session *class_to_transport_session(struct iscsi_cls_session *);
244extern void iscsi_start_session_recovery(struct iscsi_session *,
245 struct iscsi_conn *, int);
246extern void iscsi_session_recovery_timedout(struct iscsi_cls_session *);
247
248#define session_to_cls(_sess) \
249 hostdata_session(_sess->host->hostdata)
250
251/*
252 * connection management
253 */
254extern struct iscsi_cls_conn *iscsi_conn_setup(struct iscsi_cls_session *,
255 uint32_t);
256extern void iscsi_conn_teardown(struct iscsi_cls_conn *);
257extern int iscsi_conn_start(struct iscsi_cls_conn *);
258extern void iscsi_conn_stop(struct iscsi_cls_conn *, int);
259extern int iscsi_conn_bind(struct iscsi_cls_session *, struct iscsi_cls_conn *,
260 int);
261extern void iscsi_conn_failure(struct iscsi_conn *conn, enum iscsi_err err);
262
263/*
264 * pdu and task processing
265 */
266extern int iscsi_check_assign_cmdsn(struct iscsi_session *,
267 struct iscsi_nopin *);
268extern void iscsi_prep_unsolicit_data_pdu(struct iscsi_cmd_task *,
269 struct iscsi_data *hdr,
270 int transport_data_cnt);
271extern int iscsi_conn_send_pdu(struct iscsi_cls_conn *, struct iscsi_hdr *,
272 char *, uint32_t);
273extern int iscsi_complete_pdu(struct iscsi_conn *, struct iscsi_hdr *,
274 char *, int);
275extern int __iscsi_complete_pdu(struct iscsi_conn *, struct iscsi_hdr *,
276 char *, int);
277extern int iscsi_verify_itt(struct iscsi_conn *, struct iscsi_hdr *,
278 uint32_t *);
279
280/*
281 * generic helpers
282 */
283extern void iscsi_pool_free(struct iscsi_queue *, void **);
284extern int iscsi_pool_init(struct iscsi_queue *, int, void ***, int);
285
286#endif
diff --git a/include/scsi/scsi_devinfo.h b/include/scsi/scsi_devinfo.h
index d31b16d25a09..b4ddd3b18b4c 100644
--- a/include/scsi/scsi_devinfo.h
+++ b/include/scsi/scsi_devinfo.h
@@ -29,4 +29,5 @@
29#define BLIST_SELECT_NO_ATN 0x200000 /* select without ATN */ 29#define BLIST_SELECT_NO_ATN 0x200000 /* select without ATN */
30#define BLIST_RETRY_HWERROR 0x400000 /* retry HARDWARE_ERROR */ 30#define BLIST_RETRY_HWERROR 0x400000 /* retry HARDWARE_ERROR */
31#define BLIST_MAX_512 0x800000 /* maximum 512 sector cdb length */ 31#define BLIST_MAX_512 0x800000 /* maximum 512 sector cdb length */
32#define BLIST_ATTACH_PQ3 0x1000000 /* Scan: Attach to PQ3 devices */
32#endif 33#endif
diff --git a/include/scsi/scsi_transport_iscsi.h b/include/scsi/scsi_transport_iscsi.h
index b41cf077e54b..b332d6e839fe 100644
--- a/include/scsi/scsi_transport_iscsi.h
+++ b/include/scsi/scsi_transport_iscsi.h
@@ -2,7 +2,7 @@
2 * iSCSI transport class definitions 2 * iSCSI transport class definitions
3 * 3 *
4 * Copyright (C) IBM Corporation, 2004 4 * Copyright (C) IBM Corporation, 2004
5 * Copyright (C) Mike Christie, 2004 - 2005 5 * Copyright (C) Mike Christie, 2004 - 2006
6 * Copyright (C) Dmitry Yusupov, 2004 - 2005 6 * Copyright (C) Dmitry Yusupov, 2004 - 2005
7 * Copyright (C) Alex Aizman, 2004 - 2005 7 * Copyright (C) Alex Aizman, 2004 - 2005
8 * 8 *
@@ -27,9 +27,13 @@
27#include <scsi/iscsi_if.h> 27#include <scsi/iscsi_if.h>
28 28
29struct scsi_transport_template; 29struct scsi_transport_template;
30struct iscsi_transport;
30struct Scsi_Host; 31struct Scsi_Host;
31struct mempool_zone; 32struct mempool_zone;
32struct iscsi_cls_conn; 33struct iscsi_cls_conn;
34struct iscsi_conn;
35struct iscsi_cmd_task;
36struct iscsi_mgmt_task;
33 37
34/** 38/**
35 * struct iscsi_transport - iSCSI Transport template 39 * struct iscsi_transport - iSCSI Transport template
@@ -46,6 +50,20 @@ struct iscsi_cls_conn;
46 * @start_conn: set connection to be operational 50 * @start_conn: set connection to be operational
47 * @stop_conn: suspend/recover/terminate connection 51 * @stop_conn: suspend/recover/terminate connection
48 * @send_pdu: send iSCSI PDU, Login, Logout, NOP-Out, Reject, Text. 52 * @send_pdu: send iSCSI PDU, Login, Logout, NOP-Out, Reject, Text.
53 * @session_recovery_timedout: notify LLD a block during recovery timed out
54 * @suspend_conn_recv: susepend the recv side of the connection
55 * @termincate_conn: destroy socket connection. Called with mutex lock.
56 * @init_cmd_task: Initialize a iscsi_cmd_task and any internal structs.
57 * Called from queuecommand with session lock held.
58 * @init_mgmt_task: Initialize a iscsi_mgmt_task and any internal structs.
59 * Called from iscsi_conn_send_generic with xmitmutex.
60 * @xmit_cmd_task: requests LLD to transfer cmd task
61 * @xmit_mgmt_task: requests LLD to transfer mgmt task
62 * @cleanup_cmd_task: requests LLD to fail cmd task. Called with xmitmutex
63 * and session->lock after the connection has been
64 * suspended and terminated during recovery. If called
65 * from abort task then connection is not suspended
66 * or terminated but sk_callback_lock is held
49 * 67 *
50 * Template API provided by iSCSI Transport 68 * Template API provided by iSCSI Transport
51 */ 69 */
@@ -53,18 +71,18 @@ struct iscsi_transport {
53 struct module *owner; 71 struct module *owner;
54 char *name; 72 char *name;
55 unsigned int caps; 73 unsigned int caps;
74 /* LLD sets this to indicate what values it can export to sysfs */
75 unsigned int param_mask;
56 struct scsi_host_template *host_template; 76 struct scsi_host_template *host_template;
57 /* LLD session/scsi_host data size */
58 int hostdata_size;
59 /* LLD iscsi_host data size */
60 int ihostdata_size;
61 /* LLD connection data size */ 77 /* LLD connection data size */
62 int conndata_size; 78 int conndata_size;
79 /* LLD session data size */
80 int sessiondata_size;
63 int max_lun; 81 int max_lun;
64 unsigned int max_conn; 82 unsigned int max_conn;
65 unsigned int max_cmd_len; 83 unsigned int max_cmd_len;
66 struct iscsi_cls_session *(*create_session) 84 struct iscsi_cls_session *(*create_session) (struct iscsi_transport *it,
67 (struct scsi_transport_template *t, uint32_t sn, uint32_t *sid); 85 struct scsi_transport_template *t, uint32_t sn, uint32_t *hn);
68 void (*destroy_session) (struct iscsi_cls_session *session); 86 void (*destroy_session) (struct iscsi_cls_session *session);
69 struct iscsi_cls_conn *(*create_conn) (struct iscsi_cls_session *sess, 87 struct iscsi_cls_conn *(*create_conn) (struct iscsi_cls_session *sess,
70 uint32_t cid); 88 uint32_t cid);
@@ -77,14 +95,30 @@ struct iscsi_transport {
77 int (*set_param) (struct iscsi_cls_conn *conn, enum iscsi_param param, 95 int (*set_param) (struct iscsi_cls_conn *conn, enum iscsi_param param,
78 uint32_t value); 96 uint32_t value);
79 int (*get_conn_param) (struct iscsi_cls_conn *conn, 97 int (*get_conn_param) (struct iscsi_cls_conn *conn,
80 enum iscsi_param param, 98 enum iscsi_param param, uint32_t *value);
81 uint32_t *value);
82 int (*get_session_param) (struct iscsi_cls_session *session, 99 int (*get_session_param) (struct iscsi_cls_session *session,
83 enum iscsi_param param, uint32_t *value); 100 enum iscsi_param param, uint32_t *value);
101 int (*get_conn_str_param) (struct iscsi_cls_conn *conn,
102 enum iscsi_param param, char *buf);
103 int (*get_session_str_param) (struct iscsi_cls_session *session,
104 enum iscsi_param param, char *buf);
84 int (*send_pdu) (struct iscsi_cls_conn *conn, struct iscsi_hdr *hdr, 105 int (*send_pdu) (struct iscsi_cls_conn *conn, struct iscsi_hdr *hdr,
85 char *data, uint32_t data_size); 106 char *data, uint32_t data_size);
86 void (*get_stats) (struct iscsi_cls_conn *conn, 107 void (*get_stats) (struct iscsi_cls_conn *conn,
87 struct iscsi_stats *stats); 108 struct iscsi_stats *stats);
109 void (*suspend_conn_recv) (struct iscsi_conn *conn);
110 void (*terminate_conn) (struct iscsi_conn *conn);
111 void (*init_cmd_task) (struct iscsi_cmd_task *ctask);
112 void (*init_mgmt_task) (struct iscsi_conn *conn,
113 struct iscsi_mgmt_task *mtask,
114 char *data, uint32_t data_size);
115 int (*xmit_cmd_task) (struct iscsi_conn *conn,
116 struct iscsi_cmd_task *ctask);
117 void (*cleanup_cmd_task) (struct iscsi_conn *conn,
118 struct iscsi_cmd_task *ctask);
119 int (*xmit_mgmt_task) (struct iscsi_conn *conn,
120 struct iscsi_mgmt_task *mtask);
121 void (*session_recovery_timedout) (struct iscsi_cls_session *session);
88}; 122};
89 123
90/* 124/*
@@ -100,10 +134,26 @@ extern void iscsi_conn_error(struct iscsi_cls_conn *conn, enum iscsi_err error);
100extern int iscsi_recv_pdu(struct iscsi_cls_conn *conn, struct iscsi_hdr *hdr, 134extern int iscsi_recv_pdu(struct iscsi_cls_conn *conn, struct iscsi_hdr *hdr,
101 char *data, uint32_t data_size); 135 char *data, uint32_t data_size);
102 136
137
138/* Connection's states */
139#define ISCSI_CONN_INITIAL_STAGE 0
140#define ISCSI_CONN_STARTED 1
141#define ISCSI_CONN_STOPPED 2
142#define ISCSI_CONN_CLEANUP_WAIT 3
143
103struct iscsi_cls_conn { 144struct iscsi_cls_conn {
104 struct list_head conn_list; /* item in connlist */ 145 struct list_head conn_list; /* item in connlist */
105 void *dd_data; /* LLD private data */ 146 void *dd_data; /* LLD private data */
106 struct iscsi_transport *transport; 147 struct iscsi_transport *transport;
148 uint32_t cid; /* connection id */
149
150 /* portal/group values we got during discovery */
151 char *persistent_address;
152 int persistent_port;
153 /* portal/group values we are currently using */
154 char *address;
155 int port;
156
107 int active; /* must be accessed with the connlock */ 157 int active; /* must be accessed with the connlock */
108 struct device dev; /* sysfs transport/container device */ 158 struct device dev; /* sysfs transport/container device */
109 struct mempool_zone *z_error; 159 struct mempool_zone *z_error;
@@ -114,9 +164,30 @@ struct iscsi_cls_conn {
114#define iscsi_dev_to_conn(_dev) \ 164#define iscsi_dev_to_conn(_dev) \
115 container_of(_dev, struct iscsi_cls_conn, dev) 165 container_of(_dev, struct iscsi_cls_conn, dev)
116 166
167/* Session's states */
168#define ISCSI_STATE_FREE 1
169#define ISCSI_STATE_LOGGED_IN 2
170#define ISCSI_STATE_FAILED 3
171#define ISCSI_STATE_TERMINATE 4
172
117struct iscsi_cls_session { 173struct iscsi_cls_session {
118 struct list_head sess_list; /* item in session_list */ 174 struct list_head sess_list; /* item in session_list */
175 struct list_head host_list;
119 struct iscsi_transport *transport; 176 struct iscsi_transport *transport;
177
178 /* iSCSI values used as unique id by userspace. */
179 char *targetname;
180 int tpgt;
181
182 /* recovery fields */
183 int recovery_tmo;
184 struct work_struct recovery_work;
185
186 int target_id;
187 int channel;
188
189 int sid; /* session id */
190 void *dd_data; /* LLD private data */
120 struct device dev; /* sysfs transport/container device */ 191 struct device dev; /* sysfs transport/container device */
121}; 192};
122 193
@@ -126,22 +197,22 @@ struct iscsi_cls_session {
126#define iscsi_session_to_shost(_session) \ 197#define iscsi_session_to_shost(_session) \
127 dev_to_shost(_session->dev.parent) 198 dev_to_shost(_session->dev.parent)
128 199
200struct iscsi_host {
201 int next_target_id;
202 struct list_head sessions;
203 struct mutex mutex;
204};
205
129/* 206/*
130 * session and connection functions that can be used by HW iSCSI LLDs 207 * session and connection functions that can be used by HW iSCSI LLDs
131 */ 208 */
132extern struct iscsi_cls_session *iscsi_create_session(struct Scsi_Host *shost, 209extern struct iscsi_cls_session *iscsi_create_session(struct Scsi_Host *shost,
133 struct iscsi_transport *t); 210 struct iscsi_transport *t, int channel);
134extern int iscsi_destroy_session(struct iscsi_cls_session *session); 211extern int iscsi_destroy_session(struct iscsi_cls_session *session);
135extern struct iscsi_cls_conn *iscsi_create_conn(struct iscsi_cls_session *sess, 212extern struct iscsi_cls_conn *iscsi_create_conn(struct iscsi_cls_session *sess,
136 uint32_t cid); 213 uint32_t cid);
137extern int iscsi_destroy_conn(struct iscsi_cls_conn *conn); 214extern int iscsi_destroy_conn(struct iscsi_cls_conn *conn);
138 215extern void iscsi_unblock_session(struct iscsi_cls_session *session);
139/* 216extern void iscsi_block_session(struct iscsi_cls_session *session);
140 * session functions used by software iscsi
141 */
142extern struct Scsi_Host *
143iscsi_transport_create_session(struct scsi_transport_template *scsit,
144 struct iscsi_transport *transport);
145extern int iscsi_transport_destroy_session(struct Scsi_Host *shost);
146 217
147#endif 218#endif