aboutsummaryrefslogtreecommitdiffstats
path: root/include/scsi
diff options
context:
space:
mode:
Diffstat (limited to 'include/scsi')
-rw-r--r--include/scsi/iscsi_if.h151
-rw-r--r--include/scsi/iscsi_proto.h2
-rw-r--r--include/scsi/libiscsi.h293
-rw-r--r--include/scsi/scsi_cmnd.h13
-rw-r--r--include/scsi/scsi_dbg.h2
-rw-r--r--include/scsi/scsi_devinfo.h1
-rw-r--r--include/scsi/scsi_eh.h3
-rw-r--r--include/scsi/scsi_host.h7
-rw-r--r--include/scsi/scsi_request.h54
-rw-r--r--include/scsi/scsi_transport_iscsi.h127
-rw-r--r--include/scsi/scsi_transport_sas.h37
-rw-r--r--include/scsi/sg_request.h26
-rw-r--r--include/scsi/srp.h5
13 files changed, 568 insertions, 153 deletions
diff --git a/include/scsi/iscsi_if.h b/include/scsi/iscsi_if.h
index e5618b90996e..55ebf035e620 100644
--- a/include/scsi/iscsi_if.h
+++ b/include/scsi/iscsi_if.h
@@ -43,10 +43,23 @@ enum iscsi_uevent_e {
43 ISCSI_UEVENT_GET_STATS = UEVENT_BASE + 10, 43 ISCSI_UEVENT_GET_STATS = UEVENT_BASE + 10,
44 ISCSI_UEVENT_GET_PARAM = UEVENT_BASE + 11, 44 ISCSI_UEVENT_GET_PARAM = UEVENT_BASE + 11,
45 45
46 ISCSI_UEVENT_TRANSPORT_EP_CONNECT = UEVENT_BASE + 12,
47 ISCSI_UEVENT_TRANSPORT_EP_POLL = UEVENT_BASE + 13,
48 ISCSI_UEVENT_TRANSPORT_EP_DISCONNECT = UEVENT_BASE + 14,
49
50 ISCSI_UEVENT_TGT_DSCVR = UEVENT_BASE + 15,
51
46 /* up events */ 52 /* up events */
47 ISCSI_KEVENT_RECV_PDU = KEVENT_BASE + 1, 53 ISCSI_KEVENT_RECV_PDU = KEVENT_BASE + 1,
48 ISCSI_KEVENT_CONN_ERROR = KEVENT_BASE + 2, 54 ISCSI_KEVENT_CONN_ERROR = KEVENT_BASE + 2,
49 ISCSI_KEVENT_IF_ERROR = KEVENT_BASE + 3, 55 ISCSI_KEVENT_IF_ERROR = KEVENT_BASE + 3,
56 ISCSI_KEVENT_DESTROY_SESSION = KEVENT_BASE + 4,
57};
58
59enum iscsi_tgt_dscvr {
60 ISCSI_TGT_DSCVR_SEND_TARGETS = 1,
61 ISCSI_TGT_DSCVR_ISNS = 2,
62 ISCSI_TGT_DSCVR_SLP = 3,
50}; 63};
51 64
52struct iscsi_uevent { 65struct iscsi_uevent {
@@ -60,61 +73,98 @@ struct iscsi_uevent {
60 uint32_t initial_cmdsn; 73 uint32_t initial_cmdsn;
61 } c_session; 74 } c_session;
62 struct msg_destroy_session { 75 struct msg_destroy_session {
63 uint64_t session_handle;
64 uint32_t sid; 76 uint32_t sid;
65 } d_session; 77 } d_session;
66 struct msg_create_conn { 78 struct msg_create_conn {
67 uint64_t session_handle;
68 uint32_t cid;
69 uint32_t sid; 79 uint32_t sid;
80 uint32_t cid;
70 } c_conn; 81 } c_conn;
71 struct msg_bind_conn { 82 struct msg_bind_conn {
72 uint64_t session_handle; 83 uint32_t sid;
73 uint64_t conn_handle; 84 uint32_t cid;
74 uint32_t transport_fd; 85 uint64_t transport_eph;
75 uint32_t is_leading; 86 uint32_t is_leading;
76 } b_conn; 87 } b_conn;
77 struct msg_destroy_conn { 88 struct msg_destroy_conn {
78 uint64_t conn_handle; 89 uint32_t sid;
79 uint32_t cid; 90 uint32_t cid;
80 } d_conn; 91 } d_conn;
81 struct msg_send_pdu { 92 struct msg_send_pdu {
93 uint32_t sid;
94 uint32_t cid;
82 uint32_t hdr_size; 95 uint32_t hdr_size;
83 uint32_t data_size; 96 uint32_t data_size;
84 uint64_t conn_handle;
85 } send_pdu; 97 } send_pdu;
86 struct msg_set_param { 98 struct msg_set_param {
87 uint64_t conn_handle; 99 uint32_t sid;
100 uint32_t cid;
88 uint32_t param; /* enum iscsi_param */ 101 uint32_t param; /* enum iscsi_param */
89 uint32_t value; 102 uint32_t len;
90 } set_param; 103 } set_param;
91 struct msg_start_conn { 104 struct msg_start_conn {
92 uint64_t conn_handle; 105 uint32_t sid;
106 uint32_t cid;
93 } start_conn; 107 } start_conn;
94 struct msg_stop_conn { 108 struct msg_stop_conn {
109 uint32_t sid;
110 uint32_t cid;
95 uint64_t conn_handle; 111 uint64_t conn_handle;
96 uint32_t flag; 112 uint32_t flag;
97 } stop_conn; 113 } stop_conn;
98 struct msg_get_stats { 114 struct msg_get_stats {
99 uint64_t conn_handle; 115 uint32_t sid;
116 uint32_t cid;
100 } get_stats; 117 } get_stats;
118 struct msg_transport_connect {
119 uint32_t non_blocking;
120 } ep_connect;
121 struct msg_transport_poll {
122 uint64_t ep_handle;
123 uint32_t timeout_ms;
124 } ep_poll;
125 struct msg_transport_disconnect {
126 uint64_t ep_handle;
127 } ep_disconnect;
128 struct msg_tgt_dscvr {
129 enum iscsi_tgt_dscvr type;
130 uint32_t host_no;
131 /*
132 * enable = 1 to establish a new connection
133 * with the server. enable = 0 to disconnect
134 * from the server. Used primarily to switch
135 * from one iSNS server to another.
136 */
137 uint32_t enable;
138 } tgt_dscvr;
101 } u; 139 } u;
102 union { 140 union {
103 /* messages k -> u */ 141 /* messages k -> u */
104 uint64_t handle;
105 int retcode; 142 int retcode;
106 struct msg_create_session_ret { 143 struct msg_create_session_ret {
107 uint64_t session_handle;
108 uint32_t sid; 144 uint32_t sid;
145 uint32_t host_no;
109 } c_session_ret; 146 } c_session_ret;
147 struct msg_create_conn_ret {
148 uint32_t sid;
149 uint32_t cid;
150 } c_conn_ret;
110 struct msg_recv_req { 151 struct msg_recv_req {
152 uint32_t sid;
153 uint32_t cid;
111 uint64_t recv_handle; 154 uint64_t recv_handle;
112 uint64_t conn_handle;
113 } recv_req; 155 } recv_req;
114 struct msg_conn_error { 156 struct msg_conn_error {
115 uint64_t conn_handle; 157 uint32_t sid;
158 uint32_t cid;
116 uint32_t error; /* enum iscsi_err */ 159 uint32_t error; /* enum iscsi_err */
117 } connerror; 160 } connerror;
161 struct msg_session_destroyed {
162 uint32_t host_no;
163 uint32_t sid;
164 } d_session;
165 struct msg_transport_connect_ret {
166 uint64_t handle;
167 } ep_connect_ret;
118 } r; 168 } r;
119} __attribute__ ((aligned (sizeof(uint64_t)))); 169} __attribute__ ((aligned (sizeof(uint64_t))));
120 170
@@ -139,29 +189,66 @@ enum iscsi_err {
139 ISCSI_ERR_SESSION_FAILED = ISCSI_ERR_BASE + 13, 189 ISCSI_ERR_SESSION_FAILED = ISCSI_ERR_BASE + 13,
140 ISCSI_ERR_HDR_DGST = ISCSI_ERR_BASE + 14, 190 ISCSI_ERR_HDR_DGST = ISCSI_ERR_BASE + 14,
141 ISCSI_ERR_DATA_DGST = ISCSI_ERR_BASE + 15, 191 ISCSI_ERR_DATA_DGST = ISCSI_ERR_BASE + 15,
142 ISCSI_ERR_PARAM_NOT_FOUND = ISCSI_ERR_BASE + 16 192 ISCSI_ERR_PARAM_NOT_FOUND = ISCSI_ERR_BASE + 16,
193 ISCSI_ERR_NO_SCSI_CMD = ISCSI_ERR_BASE + 17,
143}; 194};
144 195
145/* 196/*
146 * iSCSI Parameters (RFC3720) 197 * iSCSI Parameters (RFC3720)
147 */ 198 */
148enum iscsi_param { 199enum iscsi_param {
149 ISCSI_PARAM_MAX_RECV_DLENGTH = 0, 200 /* passed in using netlink set param */
150 ISCSI_PARAM_MAX_XMIT_DLENGTH = 1, 201 ISCSI_PARAM_MAX_RECV_DLENGTH,
151 ISCSI_PARAM_HDRDGST_EN = 2, 202 ISCSI_PARAM_MAX_XMIT_DLENGTH,
152 ISCSI_PARAM_DATADGST_EN = 3, 203 ISCSI_PARAM_HDRDGST_EN,
153 ISCSI_PARAM_INITIAL_R2T_EN = 4, 204 ISCSI_PARAM_DATADGST_EN,
154 ISCSI_PARAM_MAX_R2T = 5, 205 ISCSI_PARAM_INITIAL_R2T_EN,
155 ISCSI_PARAM_IMM_DATA_EN = 6, 206 ISCSI_PARAM_MAX_R2T,
156 ISCSI_PARAM_FIRST_BURST = 7, 207 ISCSI_PARAM_IMM_DATA_EN,
157 ISCSI_PARAM_MAX_BURST = 8, 208 ISCSI_PARAM_FIRST_BURST,
158 ISCSI_PARAM_PDU_INORDER_EN = 9, 209 ISCSI_PARAM_MAX_BURST,
159 ISCSI_PARAM_DATASEQ_INORDER_EN = 10, 210 ISCSI_PARAM_PDU_INORDER_EN,
160 ISCSI_PARAM_ERL = 11, 211 ISCSI_PARAM_DATASEQ_INORDER_EN,
161 ISCSI_PARAM_IFMARKER_EN = 12, 212 ISCSI_PARAM_ERL,
162 ISCSI_PARAM_OFMARKER_EN = 13, 213 ISCSI_PARAM_IFMARKER_EN,
214 ISCSI_PARAM_OFMARKER_EN,
215 ISCSI_PARAM_EXP_STATSN,
216 ISCSI_PARAM_TARGET_NAME,
217 ISCSI_PARAM_TPGT,
218 ISCSI_PARAM_PERSISTENT_ADDRESS,
219 ISCSI_PARAM_PERSISTENT_PORT,
220 ISCSI_PARAM_SESS_RECOVERY_TMO,
221
222 /* pased in through bind conn using transport_fd */
223 ISCSI_PARAM_CONN_PORT,
224 ISCSI_PARAM_CONN_ADDRESS,
225
226 /* must always be last */
227 ISCSI_PARAM_MAX,
163}; 228};
164#define ISCSI_PARAM_MAX 14 229
230#define ISCSI_MAX_RECV_DLENGTH (1 << ISCSI_PARAM_MAX_RECV_DLENGTH)
231#define ISCSI_MAX_XMIT_DLENGTH (1 << ISCSI_PARAM_MAX_XMIT_DLENGTH)
232#define ISCSI_HDRDGST_EN (1 << ISCSI_PARAM_HDRDGST_EN)
233#define ISCSI_DATADGST_EN (1 << ISCSI_PARAM_DATADGST_EN)
234#define ISCSI_INITIAL_R2T_EN (1 << ISCSI_PARAM_INITIAL_R2T_EN)
235#define ISCSI_MAX_R2T (1 << ISCSI_PARAM_MAX_R2T)
236#define ISCSI_IMM_DATA_EN (1 << ISCSI_PARAM_IMM_DATA_EN)
237#define ISCSI_FIRST_BURST (1 << ISCSI_PARAM_FIRST_BURST)
238#define ISCSI_MAX_BURST (1 << ISCSI_PARAM_MAX_BURST)
239#define ISCSI_PDU_INORDER_EN (1 << ISCSI_PARAM_PDU_INORDER_EN)
240#define ISCSI_DATASEQ_INORDER_EN (1 << ISCSI_PARAM_DATASEQ_INORDER_EN)
241#define ISCSI_ERL (1 << ISCSI_PARAM_ERL)
242#define ISCSI_IFMARKER_EN (1 << ISCSI_PARAM_IFMARKER_EN)
243#define ISCSI_OFMARKER_EN (1 << ISCSI_PARAM_OFMARKER_EN)
244#define ISCSI_EXP_STATSN (1 << ISCSI_PARAM_EXP_STATSN)
245#define ISCSI_TARGET_NAME (1 << ISCSI_PARAM_TARGET_NAME)
246#define ISCSI_TPGT (1 << ISCSI_PARAM_TPGT)
247#define ISCSI_PERSISTENT_ADDRESS (1 << ISCSI_PARAM_PERSISTENT_ADDRESS)
248#define ISCSI_PERSISTENT_PORT (1 << ISCSI_PARAM_PERSISTENT_PORT)
249#define ISCSI_SESS_RECOVERY_TMO (1 << ISCSI_PARAM_SESS_RECOVERY_TMO)
250#define ISCSI_CONN_PORT (1 << ISCSI_PARAM_CONN_PORT)
251#define ISCSI_CONN_ADDRESS (1 << ISCSI_PARAM_CONN_ADDRESS)
165 252
166#define iscsi_ptr(_handle) ((void*)(unsigned long)_handle) 253#define iscsi_ptr(_handle) ((void*)(unsigned long)_handle)
167#define iscsi_handle(_ptr) ((uint64_t)(unsigned long)_ptr) 254#define iscsi_handle(_ptr) ((uint64_t)(unsigned long)_ptr)
diff --git a/include/scsi/iscsi_proto.h b/include/scsi/iscsi_proto.h
index 4feda05fdf25..02f6e4b9e693 100644
--- a/include/scsi/iscsi_proto.h
+++ b/include/scsi/iscsi_proto.h
@@ -21,8 +21,6 @@
21#ifndef ISCSI_PROTO_H 21#ifndef ISCSI_PROTO_H
22#define ISCSI_PROTO_H 22#define ISCSI_PROTO_H
23 23
24#define ISCSI_VERSION_STR "0.3"
25#define ISCSI_DATE_STR "22-Apr-2005"
26#define ISCSI_DRAFT20_VERSION 0x00 24#define ISCSI_DRAFT20_VERSION 0x00
27 25
28/* default iSCSI listen port for incoming connections */ 26/* default iSCSI listen port for incoming connections */
diff --git a/include/scsi/libiscsi.h b/include/scsi/libiscsi.h
new file mode 100644
index 000000000000..ba2760802ded
--- /dev/null
+++ b/include/scsi/libiscsi.h
@@ -0,0 +1,293 @@
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 "iscsi: " 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 int ifmarker_en;
161 int ofmarker_en;
162 /* values userspace uses to id a conn */
163 int persistent_port;
164 char *persistent_address;
165
166 /* MIB-statistics */
167 uint64_t txdata_octets;
168 uint64_t rxdata_octets;
169 uint32_t scsicmd_pdus_cnt;
170 uint32_t dataout_pdus_cnt;
171 uint32_t scsirsp_pdus_cnt;
172 uint32_t datain_pdus_cnt;
173 uint32_t r2t_pdus_cnt;
174 uint32_t tmfcmd_pdus_cnt;
175 int32_t tmfrsp_pdus_cnt;
176
177 /* custom statistics */
178 uint32_t eh_abort_cnt;
179};
180
181struct iscsi_queue {
182 struct kfifo *queue; /* FIFO Queue */
183 void **pool; /* Pool of elements */
184 int max; /* Max number of elements */
185};
186
187struct iscsi_session {
188 /* iSCSI session-wide sequencing */
189 uint32_t cmdsn;
190 uint32_t exp_cmdsn;
191 uint32_t max_cmdsn;
192
193 /* configuration */
194 int initial_r2t_en;
195 int max_r2t;
196 int imm_data_en;
197 int first_burst;
198 int max_burst;
199 int time2wait;
200 int time2retain;
201 int pdu_inorder_en;
202 int dataseq_inorder_en;
203 int erl;
204 int tpgt;
205 char *targetname;
206
207 /* control data */
208 struct iscsi_transport *tt;
209 struct Scsi_Host *host;
210 struct iscsi_conn *leadconn; /* leading connection */
211 spinlock_t lock; /* protects session state, *
212 * sequence numbers, *
213 * session resources: *
214 * - cmdpool, *
215 * - mgmtpool, *
216 * - r2tpool */
217 int state; /* session state */
218 struct list_head item;
219 int age; /* counts session re-opens */
220
221 struct list_head connections; /* list of connections */
222 int cmds_max; /* size of cmds array */
223 struct iscsi_cmd_task **cmds; /* Original Cmds arr */
224 struct iscsi_queue cmdpool; /* PDU's pool */
225 int mgmtpool_max; /* size of mgmt array */
226 struct iscsi_mgmt_task **mgmt_cmds; /* Original mgmt arr */
227 struct iscsi_queue mgmtpool; /* Mgmt PDU's pool */
228};
229
230/*
231 * scsi host template
232 */
233extern int iscsi_change_queue_depth(struct scsi_device *sdev, int depth);
234extern int iscsi_eh_abort(struct scsi_cmnd *sc);
235extern int iscsi_eh_host_reset(struct scsi_cmnd *sc);
236extern int iscsi_queuecommand(struct scsi_cmnd *sc,
237 void (*done)(struct scsi_cmnd *));
238
239/*
240 * session management
241 */
242extern struct iscsi_cls_session *
243iscsi_session_setup(struct iscsi_transport *, struct scsi_transport_template *,
244 int, int, uint32_t, uint32_t *);
245extern void iscsi_session_teardown(struct iscsi_cls_session *);
246extern struct iscsi_session *class_to_transport_session(struct iscsi_cls_session *);
247extern void iscsi_session_recovery_timedout(struct iscsi_cls_session *);
248extern int iscsi_set_param(struct iscsi_cls_conn *cls_conn,
249 enum iscsi_param param, char *buf, int buflen);
250extern int iscsi_session_get_param(struct iscsi_cls_session *cls_session,
251 enum iscsi_param param, char *buf);
252
253#define session_to_cls(_sess) \
254 hostdata_session(_sess->host->hostdata)
255
256/*
257 * connection management
258 */
259extern struct iscsi_cls_conn *iscsi_conn_setup(struct iscsi_cls_session *,
260 uint32_t);
261extern void iscsi_conn_teardown(struct iscsi_cls_conn *);
262extern int iscsi_conn_start(struct iscsi_cls_conn *);
263extern void iscsi_conn_stop(struct iscsi_cls_conn *, int);
264extern int iscsi_conn_bind(struct iscsi_cls_session *, struct iscsi_cls_conn *,
265 int);
266extern void iscsi_conn_failure(struct iscsi_conn *conn, enum iscsi_err err);
267extern int iscsi_conn_get_param(struct iscsi_cls_conn *cls_conn,
268 enum iscsi_param param, char *buf);
269
270/*
271 * pdu and task processing
272 */
273extern int iscsi_check_assign_cmdsn(struct iscsi_session *,
274 struct iscsi_nopin *);
275extern void iscsi_prep_unsolicit_data_pdu(struct iscsi_cmd_task *,
276 struct iscsi_data *hdr,
277 int transport_data_cnt);
278extern int iscsi_conn_send_pdu(struct iscsi_cls_conn *, struct iscsi_hdr *,
279 char *, uint32_t);
280extern int iscsi_complete_pdu(struct iscsi_conn *, struct iscsi_hdr *,
281 char *, int);
282extern int __iscsi_complete_pdu(struct iscsi_conn *, struct iscsi_hdr *,
283 char *, int);
284extern int iscsi_verify_itt(struct iscsi_conn *, struct iscsi_hdr *,
285 uint32_t *);
286
287/*
288 * generic helpers
289 */
290extern void iscsi_pool_free(struct iscsi_queue *, void **);
291extern int iscsi_pool_init(struct iscsi_queue *, int, void ***, int);
292
293#endif
diff --git a/include/scsi/scsi_cmnd.h b/include/scsi/scsi_cmnd.h
index 1ace1b9fe537..371f70d9aa92 100644
--- a/include/scsi/scsi_cmnd.h
+++ b/include/scsi/scsi_cmnd.h
@@ -9,7 +9,6 @@
9struct request; 9struct request;
10struct scatterlist; 10struct scatterlist;
11struct scsi_device; 11struct scsi_device;
12struct scsi_request;
13 12
14 13
15/* embedded in scsi_cmnd */ 14/* embedded in scsi_cmnd */
@@ -29,13 +28,8 @@ struct scsi_pointer {
29}; 28};
30 29
31struct scsi_cmnd { 30struct scsi_cmnd {
32 int sc_magic;
33
34 struct scsi_device *device; 31 struct scsi_device *device;
35 struct scsi_request *sc_request;
36
37 struct list_head list; /* scsi_cmnd participates in queue lists */ 32 struct list_head list; /* scsi_cmnd participates in queue lists */
38
39 struct list_head eh_entry; /* entry for the host eh_cmd_q */ 33 struct list_head eh_entry; /* entry for the host eh_cmd_q */
40 int eh_eflags; /* Used by error handlr */ 34 int eh_eflags; /* Used by error handlr */
41 void (*done) (struct scsi_cmnd *); /* Mid-level done function */ 35 void (*done) (struct scsi_cmnd *); /* Mid-level done function */
@@ -149,7 +143,12 @@ struct scsi_cmnd {
149 143
150extern struct scsi_cmnd *scsi_get_command(struct scsi_device *, gfp_t); 144extern struct scsi_cmnd *scsi_get_command(struct scsi_device *, gfp_t);
151extern void scsi_put_command(struct scsi_cmnd *); 145extern void scsi_put_command(struct scsi_cmnd *);
152extern void scsi_io_completion(struct scsi_cmnd *, unsigned int, unsigned int); 146extern void scsi_io_completion(struct scsi_cmnd *, unsigned int);
153extern void scsi_finish_command(struct scsi_cmnd *cmd); 147extern void scsi_finish_command(struct scsi_cmnd *cmd);
148extern void scsi_req_abort_cmd(struct scsi_cmnd *cmd);
149
150extern void *scsi_kmap_atomic_sg(struct scatterlist *sg, int sg_count,
151 size_t *offset, size_t *len);
152extern void scsi_kunmap_atomic_sg(void *virt);
154 153
155#endif /* _SCSI_SCSI_CMND_H */ 154#endif /* _SCSI_SCSI_CMND_H */
diff --git a/include/scsi/scsi_dbg.h b/include/scsi/scsi_dbg.h
index 4d69dee66d4d..3bbbfbe8cbfc 100644
--- a/include/scsi/scsi_dbg.h
+++ b/include/scsi/scsi_dbg.h
@@ -2,14 +2,12 @@
2#define _SCSI_SCSI_DBG_H 2#define _SCSI_SCSI_DBG_H
3 3
4struct scsi_cmnd; 4struct scsi_cmnd;
5struct scsi_request;
6struct scsi_sense_hdr; 5struct scsi_sense_hdr;
7 6
8extern void scsi_print_command(struct scsi_cmnd *); 7extern void scsi_print_command(struct scsi_cmnd *);
9extern void scsi_print_sense_hdr(const char *, struct scsi_sense_hdr *); 8extern void scsi_print_sense_hdr(const char *, struct scsi_sense_hdr *);
10extern void __scsi_print_command(unsigned char *); 9extern void __scsi_print_command(unsigned char *);
11extern void scsi_print_sense(const char *, struct scsi_cmnd *); 10extern void scsi_print_sense(const char *, struct scsi_cmnd *);
12extern void scsi_print_req_sense(const char *, struct scsi_request *);
13extern void __scsi_print_sense(const char *name, 11extern void __scsi_print_sense(const char *name,
14 const unsigned char *sense_buffer, 12 const unsigned char *sense_buffer,
15 int sense_len); 13 int sense_len);
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_eh.h b/include/scsi/scsi_eh.h
index d160880b2a87..c5c0f6762a01 100644
--- a/include/scsi/scsi_eh.h
+++ b/include/scsi/scsi_eh.h
@@ -3,7 +3,6 @@
3 3
4struct scsi_cmnd; 4struct scsi_cmnd;
5struct scsi_device; 5struct scsi_device;
6struct scsi_request;
7struct Scsi_Host; 6struct Scsi_Host;
8 7
9/* 8/*
@@ -43,8 +42,6 @@ extern void scsi_report_device_reset(struct Scsi_Host *, int, int);
43extern int scsi_block_when_processing_errors(struct scsi_device *); 42extern int scsi_block_when_processing_errors(struct scsi_device *);
44extern int scsi_normalize_sense(const u8 *sense_buffer, int sb_len, 43extern int scsi_normalize_sense(const u8 *sense_buffer, int sb_len,
45 struct scsi_sense_hdr *sshdr); 44 struct scsi_sense_hdr *sshdr);
46extern int scsi_request_normalize_sense(struct scsi_request *sreq,
47 struct scsi_sense_hdr *sshdr);
48extern int scsi_command_normalize_sense(struct scsi_cmnd *cmd, 45extern int scsi_command_normalize_sense(struct scsi_cmnd *cmd,
49 struct scsi_sense_hdr *sshdr); 46 struct scsi_sense_hdr *sshdr);
50 47
diff --git a/include/scsi/scsi_host.h b/include/scsi/scsi_host.h
index de6ce541a046..b3dd90f3e858 100644
--- a/include/scsi/scsi_host.h
+++ b/include/scsi/scsi_host.h
@@ -472,6 +472,7 @@ struct Scsi_Host {
472 */ 472 */
473 unsigned int host_busy; /* commands actually active on low-level */ 473 unsigned int host_busy; /* commands actually active on low-level */
474 unsigned int host_failed; /* commands that failed. */ 474 unsigned int host_failed; /* commands that failed. */
475 unsigned int host_eh_scheduled; /* EH scheduled without command */
475 476
476 unsigned short host_no; /* Used for IOCTL_GET_IDLUN, /proc/scsi et al. */ 477 unsigned short host_no; /* Used for IOCTL_GET_IDLUN, /proc/scsi et al. */
477 int resetting; /* if set, it means that last_reset is a valid value */ 478 int resetting; /* if set, it means that last_reset is a valid value */
@@ -541,6 +542,9 @@ struct Scsi_Host {
541 */ 542 */
542 unsigned ordered_tag:1; 543 unsigned ordered_tag:1;
543 544
545 /* task mgmt function in progress */
546 unsigned tmf_in_progress:1;
547
544 /* 548 /*
545 * Optional work queue to be utilized by the transport 549 * Optional work queue to be utilized by the transport
546 */ 550 */
@@ -618,7 +622,8 @@ static inline int scsi_host_in_recovery(struct Scsi_Host *shost)
618{ 622{
619 return shost->shost_state == SHOST_RECOVERY || 623 return shost->shost_state == SHOST_RECOVERY ||
620 shost->shost_state == SHOST_CANCEL_RECOVERY || 624 shost->shost_state == SHOST_CANCEL_RECOVERY ||
621 shost->shost_state == SHOST_DEL_RECOVERY; 625 shost->shost_state == SHOST_DEL_RECOVERY ||
626 shost->tmf_in_progress;
622} 627}
623 628
624extern int scsi_queue_work(struct Scsi_Host *, struct work_struct *); 629extern int scsi_queue_work(struct Scsi_Host *, struct work_struct *);
diff --git a/include/scsi/scsi_request.h b/include/scsi/scsi_request.h
deleted file mode 100644
index 98d69fdb851c..000000000000
--- a/include/scsi/scsi_request.h
+++ /dev/null
@@ -1,54 +0,0 @@
1#ifndef _SCSI_SCSI_REQUEST_H
2#define _SCSI_SCSI_REQUEST_H
3
4#include <scsi/scsi_cmnd.h>
5
6struct request;
7struct scsi_cmnd;
8struct scsi_device;
9struct Scsi_Host;
10
11
12/*
13 * This is essentially a slimmed down version of Scsi_Cmnd. The point of
14 * having this is that requests that are injected into the queue as result
15 * of things like ioctls and character devices shouldn't be using a
16 * Scsi_Cmnd until such a time that the command is actually at the head
17 * of the queue and being sent to the driver.
18 */
19struct scsi_request {
20 int sr_magic;
21 int sr_result; /* Status code from lower level driver */
22 unsigned char sr_sense_buffer[SCSI_SENSE_BUFFERSIZE]; /* obtained by REQUEST SENSE
23 * when CHECK CONDITION is
24 * received on original command
25 * (auto-sense) */
26
27 struct Scsi_Host *sr_host;
28 struct scsi_device *sr_device;
29 struct scsi_cmnd *sr_command;
30 struct request *sr_request; /* A copy of the command we are
31 working on */
32 unsigned sr_bufflen; /* Size of data buffer */
33 void *sr_buffer; /* Data buffer */
34 int sr_allowed;
35 enum dma_data_direction sr_data_direction;
36 unsigned char sr_cmd_len;
37 unsigned char sr_cmnd[MAX_COMMAND_SIZE];
38 void (*sr_done) (struct scsi_cmnd *); /* Mid-level done function */
39 int sr_timeout_per_command;
40 unsigned short sr_use_sg; /* Number of pieces of scatter-gather */
41 unsigned short sr_sglist_len; /* size of malloc'd scatter-gather list */
42 unsigned sr_underflow; /* Return error if less than
43 this amount is transferred */
44 void *upper_private_data; /* reserved for owner (usually upper
45 level driver) of this request */
46};
47
48extern struct scsi_request *scsi_allocate_request(struct scsi_device *, gfp_t);
49extern void scsi_release_request(struct scsi_request *);
50extern void scsi_do_req(struct scsi_request *, const void *cmnd,
51 void *buffer, unsigned bufflen,
52 void (*done) (struct scsi_cmnd *),
53 int timeout, int retries);
54#endif /* _SCSI_SCSI_REQUEST_H */
diff --git a/include/scsi/scsi_transport_iscsi.h b/include/scsi/scsi_transport_iscsi.h
index b41cf077e54b..5a3df1d7085f 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,14 @@
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;
37struct sockaddr;
33 38
34/** 39/**
35 * struct iscsi_transport - iSCSI Transport template 40 * struct iscsi_transport - iSCSI Transport template
@@ -42,10 +47,33 @@ struct iscsi_cls_conn;
42 * @bind_conn: associate this connection with existing iSCSI session 47 * @bind_conn: associate this connection with existing iSCSI session
43 * and specified transport descriptor 48 * and specified transport descriptor
44 * @destroy_conn: destroy inactive iSCSI connection 49 * @destroy_conn: destroy inactive iSCSI connection
45 * @set_param: set iSCSI Data-Path operational parameter 50 * @set_param: set iSCSI parameter. Return 0 on success, -ENODATA
51 * when param is not supported, and a -Exx value on other
52 * error.
53 * @get_param get iSCSI parameter. Must return number of bytes
54 * copied to buffer on success, -ENODATA when param
55 * is not supported, and a -Exx value on other error
46 * @start_conn: set connection to be operational 56 * @start_conn: set connection to be operational
47 * @stop_conn: suspend/recover/terminate connection 57 * @stop_conn: suspend/recover/terminate connection
48 * @send_pdu: send iSCSI PDU, Login, Logout, NOP-Out, Reject, Text. 58 * @send_pdu: send iSCSI PDU, Login, Logout, NOP-Out, Reject, Text.
59 * @session_recovery_timedout: notify LLD a block during recovery timed out
60 * @suspend_conn_recv: susepend the recv side of the connection
61 * @termincate_conn: destroy socket connection. Called with mutex lock.
62 * @init_cmd_task: Initialize a iscsi_cmd_task and any internal structs.
63 * Called from queuecommand with session lock held.
64 * @init_mgmt_task: Initialize a iscsi_mgmt_task and any internal structs.
65 * Called from iscsi_conn_send_generic with xmitmutex.
66 * @xmit_cmd_task: Requests LLD to transfer cmd task. Returns 0 or the
67 * the number of bytes transferred on success, and -Exyz
68 * value on error.
69 * @xmit_mgmt_task: Requests LLD to transfer mgmt task. Returns 0 or the
70 * the number of bytes transferred on success, and -Exyz
71 * value on error.
72 * @cleanup_cmd_task: requests LLD to fail cmd task. Called with xmitmutex
73 * and session->lock after the connection has been
74 * suspended and terminated during recovery. If called
75 * from abort task then connection is not suspended
76 * or terminated but sk_callback_lock is held
49 * 77 *
50 * Template API provided by iSCSI Transport 78 * Template API provided by iSCSI Transport
51 */ 79 */
@@ -53,38 +81,56 @@ struct iscsi_transport {
53 struct module *owner; 81 struct module *owner;
54 char *name; 82 char *name;
55 unsigned int caps; 83 unsigned int caps;
84 /* LLD sets this to indicate what values it can export to sysfs */
85 unsigned int param_mask;
56 struct scsi_host_template *host_template; 86 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 */ 87 /* LLD connection data size */
62 int conndata_size; 88 int conndata_size;
89 /* LLD session data size */
90 int sessiondata_size;
63 int max_lun; 91 int max_lun;
64 unsigned int max_conn; 92 unsigned int max_conn;
65 unsigned int max_cmd_len; 93 unsigned int max_cmd_len;
66 struct iscsi_cls_session *(*create_session) 94 struct iscsi_cls_session *(*create_session) (struct iscsi_transport *it,
67 (struct scsi_transport_template *t, uint32_t sn, uint32_t *sid); 95 struct scsi_transport_template *t, uint32_t sn, uint32_t *hn);
68 void (*destroy_session) (struct iscsi_cls_session *session); 96 void (*destroy_session) (struct iscsi_cls_session *session);
69 struct iscsi_cls_conn *(*create_conn) (struct iscsi_cls_session *sess, 97 struct iscsi_cls_conn *(*create_conn) (struct iscsi_cls_session *sess,
70 uint32_t cid); 98 uint32_t cid);
71 int (*bind_conn) (struct iscsi_cls_session *session, 99 int (*bind_conn) (struct iscsi_cls_session *session,
72 struct iscsi_cls_conn *cls_conn, 100 struct iscsi_cls_conn *cls_conn,
73 uint32_t transport_fd, int is_leading); 101 uint64_t transport_eph, int is_leading);
74 int (*start_conn) (struct iscsi_cls_conn *conn); 102 int (*start_conn) (struct iscsi_cls_conn *conn);
75 void (*stop_conn) (struct iscsi_cls_conn *conn, int flag); 103 void (*stop_conn) (struct iscsi_cls_conn *conn, int flag);
76 void (*destroy_conn) (struct iscsi_cls_conn *conn); 104 void (*destroy_conn) (struct iscsi_cls_conn *conn);
77 int (*set_param) (struct iscsi_cls_conn *conn, enum iscsi_param param, 105 int (*set_param) (struct iscsi_cls_conn *conn, enum iscsi_param param,
78 uint32_t value); 106 char *buf, int buflen);
79 int (*get_conn_param) (struct iscsi_cls_conn *conn, 107 int (*get_conn_param) (struct iscsi_cls_conn *conn,
80 enum iscsi_param param, 108 enum iscsi_param param, char *buf);
81 uint32_t *value);
82 int (*get_session_param) (struct iscsi_cls_session *session, 109 int (*get_session_param) (struct iscsi_cls_session *session,
83 enum iscsi_param param, uint32_t *value); 110 enum iscsi_param param, char *buf);
84 int (*send_pdu) (struct iscsi_cls_conn *conn, struct iscsi_hdr *hdr, 111 int (*send_pdu) (struct iscsi_cls_conn *conn, struct iscsi_hdr *hdr,
85 char *data, uint32_t data_size); 112 char *data, uint32_t data_size);
86 void (*get_stats) (struct iscsi_cls_conn *conn, 113 void (*get_stats) (struct iscsi_cls_conn *conn,
87 struct iscsi_stats *stats); 114 struct iscsi_stats *stats);
115 void (*suspend_conn_recv) (struct iscsi_conn *conn);
116 void (*terminate_conn) (struct iscsi_conn *conn);
117 void (*init_cmd_task) (struct iscsi_cmd_task *ctask);
118 void (*init_mgmt_task) (struct iscsi_conn *conn,
119 struct iscsi_mgmt_task *mtask,
120 char *data, uint32_t data_size);
121 int (*xmit_cmd_task) (struct iscsi_conn *conn,
122 struct iscsi_cmd_task *ctask);
123 void (*cleanup_cmd_task) (struct iscsi_conn *conn,
124 struct iscsi_cmd_task *ctask);
125 int (*xmit_mgmt_task) (struct iscsi_conn *conn,
126 struct iscsi_mgmt_task *mtask);
127 void (*session_recovery_timedout) (struct iscsi_cls_session *session);
128 int (*ep_connect) (struct sockaddr *dst_addr, int non_blocking,
129 uint64_t *ep_handle);
130 int (*ep_poll) (uint64_t ep_handle, int timeout_ms);
131 void (*ep_disconnect) (uint64_t ep_handle);
132 int (*tgt_dscvr) (enum iscsi_tgt_dscvr type, uint32_t host_no,
133 uint32_t enable, struct sockaddr *dst_addr);
88}; 134};
89 135
90/* 136/*
@@ -100,10 +146,19 @@ 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, 146extern int iscsi_recv_pdu(struct iscsi_cls_conn *conn, struct iscsi_hdr *hdr,
101 char *data, uint32_t data_size); 147 char *data, uint32_t data_size);
102 148
149
150/* Connection's states */
151#define ISCSI_CONN_INITIAL_STAGE 0
152#define ISCSI_CONN_STARTED 1
153#define ISCSI_CONN_STOPPED 2
154#define ISCSI_CONN_CLEANUP_WAIT 3
155
103struct iscsi_cls_conn { 156struct iscsi_cls_conn {
104 struct list_head conn_list; /* item in connlist */ 157 struct list_head conn_list; /* item in connlist */
105 void *dd_data; /* LLD private data */ 158 void *dd_data; /* LLD private data */
106 struct iscsi_transport *transport; 159 struct iscsi_transport *transport;
160 uint32_t cid; /* connection id */
161
107 int active; /* must be accessed with the connlock */ 162 int active; /* must be accessed with the connlock */
108 struct device dev; /* sysfs transport/container device */ 163 struct device dev; /* sysfs transport/container device */
109 struct mempool_zone *z_error; 164 struct mempool_zone *z_error;
@@ -114,9 +169,27 @@ struct iscsi_cls_conn {
114#define iscsi_dev_to_conn(_dev) \ 169#define iscsi_dev_to_conn(_dev) \
115 container_of(_dev, struct iscsi_cls_conn, dev) 170 container_of(_dev, struct iscsi_cls_conn, dev)
116 171
172/* Session's states */
173#define ISCSI_STATE_FREE 1
174#define ISCSI_STATE_LOGGED_IN 2
175#define ISCSI_STATE_FAILED 3
176#define ISCSI_STATE_TERMINATE 4
177#define ISCSI_STATE_IN_RECOVERY 5
178#define ISCSI_STATE_RECOVERY_FAILED 6
179
117struct iscsi_cls_session { 180struct iscsi_cls_session {
118 struct list_head sess_list; /* item in session_list */ 181 struct list_head sess_list; /* item in session_list */
182 struct list_head host_list;
119 struct iscsi_transport *transport; 183 struct iscsi_transport *transport;
184
185 /* recovery fields */
186 int recovery_tmo;
187 struct work_struct recovery_work;
188
189 int target_id;
190
191 int sid; /* session id */
192 void *dd_data; /* LLD private data */
120 struct device dev; /* sysfs transport/container device */ 193 struct device dev; /* sysfs transport/container device */
121}; 194};
122 195
@@ -126,22 +199,34 @@ struct iscsi_cls_session {
126#define iscsi_session_to_shost(_session) \ 199#define iscsi_session_to_shost(_session) \
127 dev_to_shost(_session->dev.parent) 200 dev_to_shost(_session->dev.parent)
128 201
202#define starget_to_session(_stgt) \
203 iscsi_dev_to_session(_stgt->dev.parent)
204
205struct iscsi_host {
206 struct list_head sessions;
207 struct mutex mutex;
208};
209
129/* 210/*
130 * session and connection functions that can be used by HW iSCSI LLDs 211 * session and connection functions that can be used by HW iSCSI LLDs
131 */ 212 */
213extern struct iscsi_cls_session *iscsi_alloc_session(struct Scsi_Host *shost,
214 struct iscsi_transport *transport);
215extern int iscsi_add_session(struct iscsi_cls_session *session,
216 unsigned int target_id);
217extern int iscsi_if_create_session_done(struct iscsi_cls_conn *conn);
218extern int iscsi_if_destroy_session_done(struct iscsi_cls_conn *conn);
132extern struct iscsi_cls_session *iscsi_create_session(struct Scsi_Host *shost, 219extern struct iscsi_cls_session *iscsi_create_session(struct Scsi_Host *shost,
133 struct iscsi_transport *t); 220 struct iscsi_transport *t,
221 unsigned int target_id);
222extern void iscsi_remove_session(struct iscsi_cls_session *session);
223extern void iscsi_free_session(struct iscsi_cls_session *session);
134extern int iscsi_destroy_session(struct iscsi_cls_session *session); 224extern int iscsi_destroy_session(struct iscsi_cls_session *session);
135extern struct iscsi_cls_conn *iscsi_create_conn(struct iscsi_cls_session *sess, 225extern struct iscsi_cls_conn *iscsi_create_conn(struct iscsi_cls_session *sess,
136 uint32_t cid); 226 uint32_t cid);
137extern int iscsi_destroy_conn(struct iscsi_cls_conn *conn); 227extern int iscsi_destroy_conn(struct iscsi_cls_conn *conn);
228extern void iscsi_unblock_session(struct iscsi_cls_session *session);
229extern void iscsi_block_session(struct iscsi_cls_session *session);
138 230
139/*
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 231
147#endif 232#endif
diff --git a/include/scsi/scsi_transport_sas.h b/include/scsi/scsi_transport_sas.h
index 93cfb4bf4211..e3c503cd175e 100644
--- a/include/scsi/scsi_transport_sas.h
+++ b/include/scsi/scsi_transport_sas.h
@@ -3,6 +3,7 @@
3 3
4#include <linux/transport_class.h> 4#include <linux/transport_class.h>
5#include <linux/types.h> 5#include <linux/types.h>
6#include <linux/mutex.h>
6 7
7struct scsi_transport_template; 8struct scsi_transport_template;
8struct sas_rphy; 9struct sas_rphy;
@@ -55,7 +56,6 @@ struct sas_phy {
55 enum sas_linkrate minimum_linkrate; 56 enum sas_linkrate minimum_linkrate;
56 enum sas_linkrate maximum_linkrate_hw; 57 enum sas_linkrate maximum_linkrate_hw;
57 enum sas_linkrate maximum_linkrate; 58 enum sas_linkrate maximum_linkrate;
58 u8 port_identifier;
59 59
60 /* internal state */ 60 /* internal state */
61 unsigned int local_attached : 1; 61 unsigned int local_attached : 1;
@@ -66,8 +66,8 @@ struct sas_phy {
66 u32 loss_of_dword_sync_count; 66 u32 loss_of_dword_sync_count;
67 u32 phy_reset_problem_count; 67 u32 phy_reset_problem_count;
68 68
69 /* the other end of the link */ 69 /* for the list of phys belonging to a port */
70 struct sas_rphy *rphy; 70 struct list_head port_siblings;
71}; 71};
72 72
73#define dev_to_phy(d) \ 73#define dev_to_phy(d) \
@@ -124,6 +124,24 @@ struct sas_expander_device {
124#define rphy_to_expander_device(r) \ 124#define rphy_to_expander_device(r) \
125 container_of((r), struct sas_expander_device, rphy) 125 container_of((r), struct sas_expander_device, rphy)
126 126
127struct sas_port {
128 struct device dev;
129
130 u8 port_identifier;
131 int num_phys;
132
133 /* the other end of the link */
134 struct sas_rphy *rphy;
135
136 struct mutex phy_list_mutex;
137 struct list_head phy_list;
138};
139
140#define dev_to_sas_port(d) \
141 container_of((d), struct sas_port, dev)
142#define transport_class_to_sas_port(cdev) \
143 dev_to_sas_port((cdev)->dev)
144
127/* The functions by which the transport class and the driver communicate */ 145/* The functions by which the transport class and the driver communicate */
128struct sas_function_template { 146struct sas_function_template {
129 int (*get_linkerrors)(struct sas_phy *); 147 int (*get_linkerrors)(struct sas_phy *);
@@ -133,6 +151,7 @@ struct sas_function_template {
133}; 151};
134 152
135 153
154void sas_remove_children(struct device *);
136extern void sas_remove_host(struct Scsi_Host *); 155extern void sas_remove_host(struct Scsi_Host *);
137 156
138extern struct sas_phy *sas_phy_alloc(struct device *, int); 157extern struct sas_phy *sas_phy_alloc(struct device *, int);
@@ -141,13 +160,21 @@ extern int sas_phy_add(struct sas_phy *);
141extern void sas_phy_delete(struct sas_phy *); 160extern void sas_phy_delete(struct sas_phy *);
142extern int scsi_is_sas_phy(const struct device *); 161extern int scsi_is_sas_phy(const struct device *);
143 162
144extern struct sas_rphy *sas_end_device_alloc(struct sas_phy *); 163extern struct sas_rphy *sas_end_device_alloc(struct sas_port *);
145extern struct sas_rphy *sas_expander_alloc(struct sas_phy *, enum sas_device_type); 164extern struct sas_rphy *sas_expander_alloc(struct sas_port *, enum sas_device_type);
146void sas_rphy_free(struct sas_rphy *); 165void sas_rphy_free(struct sas_rphy *);
147extern int sas_rphy_add(struct sas_rphy *); 166extern int sas_rphy_add(struct sas_rphy *);
148extern void sas_rphy_delete(struct sas_rphy *); 167extern void sas_rphy_delete(struct sas_rphy *);
149extern int scsi_is_sas_rphy(const struct device *); 168extern int scsi_is_sas_rphy(const struct device *);
150 169
170struct sas_port *sas_port_alloc(struct device *, int);
171int sas_port_add(struct sas_port *);
172void sas_port_free(struct sas_port *);
173void sas_port_delete(struct sas_port *);
174void sas_port_add_phy(struct sas_port *, struct sas_phy *);
175void sas_port_delete_phy(struct sas_port *, struct sas_phy *);
176int scsi_is_sas_port(const struct device *);
177
151extern struct scsi_transport_template * 178extern struct scsi_transport_template *
152sas_attach_transport(struct sas_function_template *); 179sas_attach_transport(struct sas_function_template *);
153extern void sas_release_transport(struct scsi_transport_template *); 180extern void sas_release_transport(struct scsi_transport_template *);
diff --git a/include/scsi/sg_request.h b/include/scsi/sg_request.h
deleted file mode 100644
index 57ff525bdd3b..000000000000
--- a/include/scsi/sg_request.h
+++ /dev/null
@@ -1,26 +0,0 @@
1typedef struct scsi_request Scsi_Request;
2
3static Scsi_Request *dummy_cmdp; /* only used for sizeof */
4
5typedef struct sg_scatter_hold { /* holding area for scsi scatter gather info */
6 unsigned short k_use_sg; /* Count of kernel scatter-gather pieces */
7 unsigned short sglist_len; /* size of malloc'd scatter-gather list ++ */
8 unsigned bufflen; /* Size of (aggregate) data buffer */
9 unsigned b_malloc_len; /* actual len malloc'ed in buffer */
10 void *buffer; /* Data buffer or scatter list (k_use_sg>0) */
11 char dio_in_use; /* 0->indirect IO (or mmap), 1->dio */
12 unsigned char cmd_opcode; /* first byte of command */
13} Sg_scatter_hold;
14
15typedef struct sg_request { /* SG_MAX_QUEUE requests outstanding per file */
16 Scsi_Request *my_cmdp; /* != 0 when request with lower levels */
17 struct sg_request *nextrp; /* NULL -> tail request (slist) */
18 struct sg_fd *parentfp; /* NULL -> not in use */
19 Sg_scatter_hold data; /* hold buffer, perhaps scatter list */
20 sg_io_hdr_t header; /* scsi command+info, see <scsi/sg.h> */
21 unsigned char sense_b[sizeof (dummy_cmdp->sr_sense_buffer)];
22 char res_used; /* 1 -> using reserve buffer, 0 -> not ... */
23 char orphan; /* 1 -> drop on sight, 0 -> normal */
24 char sg_io_owned; /* 1 -> packet belongs to SG_IO */
25 volatile char done; /* 0->before bh, 1->before read, 2->read */
26} Sg_request;
diff --git a/include/scsi/srp.h b/include/scsi/srp.h
index 637f77eccf0c..ad178fa78f66 100644
--- a/include/scsi/srp.h
+++ b/include/scsi/srp.h
@@ -87,6 +87,11 @@ enum srp_login_rej_reason {
87 SRP_LOGIN_REJ_CHANNEL_LIMIT_REACHED = 0x00010006 87 SRP_LOGIN_REJ_CHANNEL_LIMIT_REACHED = 0x00010006
88}; 88};
89 89
90enum {
91 SRP_REV10_IB_IO_CLASS = 0xff00,
92 SRP_REV16A_IB_IO_CLASS = 0x0100
93};
94
90struct srp_direct_buf { 95struct srp_direct_buf {
91 __be64 va; 96 __be64 va;
92 __be32 key; 97 __be32 key;