xref: /OK3568_Linux_fs/kernel/include/scsi/scsi_transport_iscsi.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-or-later */
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun  * iSCSI transport class definitions
4*4882a593Smuzhiyun  *
5*4882a593Smuzhiyun  * Copyright (C) IBM Corporation, 2004
6*4882a593Smuzhiyun  * Copyright (C) Mike Christie, 2004 - 2006
7*4882a593Smuzhiyun  * Copyright (C) Dmitry Yusupov, 2004 - 2005
8*4882a593Smuzhiyun  * Copyright (C) Alex Aizman, 2004 - 2005
9*4882a593Smuzhiyun  */
10*4882a593Smuzhiyun #ifndef SCSI_TRANSPORT_ISCSI_H
11*4882a593Smuzhiyun #define SCSI_TRANSPORT_ISCSI_H
12*4882a593Smuzhiyun 
13*4882a593Smuzhiyun #include <linux/device.h>
14*4882a593Smuzhiyun #include <linux/list.h>
15*4882a593Smuzhiyun #include <linux/mutex.h>
16*4882a593Smuzhiyun #include <scsi/iscsi_if.h>
17*4882a593Smuzhiyun 
18*4882a593Smuzhiyun struct scsi_transport_template;
19*4882a593Smuzhiyun struct iscsi_transport;
20*4882a593Smuzhiyun struct iscsi_endpoint;
21*4882a593Smuzhiyun struct Scsi_Host;
22*4882a593Smuzhiyun struct scsi_cmnd;
23*4882a593Smuzhiyun struct iscsi_cls_conn;
24*4882a593Smuzhiyun struct iscsi_conn;
25*4882a593Smuzhiyun struct iscsi_task;
26*4882a593Smuzhiyun struct sockaddr;
27*4882a593Smuzhiyun struct iscsi_iface;
28*4882a593Smuzhiyun struct bsg_job;
29*4882a593Smuzhiyun struct iscsi_bus_flash_session;
30*4882a593Smuzhiyun struct iscsi_bus_flash_conn;
31*4882a593Smuzhiyun 
32*4882a593Smuzhiyun /**
33*4882a593Smuzhiyun  * struct iscsi_transport - iSCSI Transport template
34*4882a593Smuzhiyun  *
35*4882a593Smuzhiyun  * @name:		transport name
36*4882a593Smuzhiyun  * @caps:		iSCSI Data-Path capabilities
37*4882a593Smuzhiyun  * @create_session:	create new iSCSI session object
38*4882a593Smuzhiyun  * @destroy_session:	destroy existing iSCSI session object
39*4882a593Smuzhiyun  * @create_conn:	create new iSCSI connection
40*4882a593Smuzhiyun  * @bind_conn:		associate this connection with existing iSCSI session
41*4882a593Smuzhiyun  *			and specified transport descriptor
42*4882a593Smuzhiyun  * @destroy_conn:	destroy inactive iSCSI connection
43*4882a593Smuzhiyun  * @set_param:		set iSCSI parameter. Return 0 on success, -ENODATA
44*4882a593Smuzhiyun  *			when param is not supported, and a -Exx value on other
45*4882a593Smuzhiyun  *			error.
46*4882a593Smuzhiyun  * @get_param		get iSCSI parameter. Must return number of bytes
47*4882a593Smuzhiyun  *			copied to buffer on success, -ENODATA when param
48*4882a593Smuzhiyun  *			is not supported, and a -Exx value on other error
49*4882a593Smuzhiyun  * @start_conn:		set connection to be operational
50*4882a593Smuzhiyun  * @stop_conn:		suspend/recover/terminate connection
51*4882a593Smuzhiyun  * @send_pdu:		send iSCSI PDU, Login, Logout, NOP-Out, Reject, Text.
52*4882a593Smuzhiyun  * @session_recovery_timedout: notify LLD a block during recovery timed out
53*4882a593Smuzhiyun  * @init_task:		Initialize a iscsi_task and any internal structs.
54*4882a593Smuzhiyun  *			When offloading the data path, this is called from
55*4882a593Smuzhiyun  *			queuecommand with the session lock, or from the
56*4882a593Smuzhiyun  *			iscsi_conn_send_pdu context with the session lock.
57*4882a593Smuzhiyun  *			When not offloading the data path, this is called
58*4882a593Smuzhiyun  *			from the scsi work queue without the session lock.
59*4882a593Smuzhiyun  * @xmit_task		Requests LLD to transfer cmd task. Returns 0 or the
60*4882a593Smuzhiyun  *			number of bytes transferred on success, and -Exyz
61*4882a593Smuzhiyun  *			value on error. When offloading the data path, this
62*4882a593Smuzhiyun  *			is called from queuecommand with the session lock, or
63*4882a593Smuzhiyun  *			from the iscsi_conn_send_pdu context with the session
64*4882a593Smuzhiyun  *			lock. When not offloading the data path, this is called
65*4882a593Smuzhiyun  *			from the scsi work queue without the session lock.
66*4882a593Smuzhiyun  * @cleanup_task:	requests LLD to fail task. Called with session lock
67*4882a593Smuzhiyun  *			and after the connection has been suspended and
68*4882a593Smuzhiyun  *			terminated during recovery. If called
69*4882a593Smuzhiyun  *			from abort task then connection is not suspended
70*4882a593Smuzhiyun  *			or terminated but sk_callback_lock is held
71*4882a593Smuzhiyun  *
72*4882a593Smuzhiyun  * Template API provided by iSCSI Transport
73*4882a593Smuzhiyun  */
74*4882a593Smuzhiyun struct iscsi_transport {
75*4882a593Smuzhiyun 	struct module *owner;
76*4882a593Smuzhiyun 	char *name;
77*4882a593Smuzhiyun 	unsigned int caps;
78*4882a593Smuzhiyun 
79*4882a593Smuzhiyun 	struct iscsi_cls_session *(*create_session) (struct iscsi_endpoint *ep,
80*4882a593Smuzhiyun 					uint16_t cmds_max, uint16_t qdepth,
81*4882a593Smuzhiyun 					uint32_t sn);
82*4882a593Smuzhiyun 	void (*destroy_session) (struct iscsi_cls_session *session);
83*4882a593Smuzhiyun 	struct iscsi_cls_conn *(*create_conn) (struct iscsi_cls_session *sess,
84*4882a593Smuzhiyun 				uint32_t cid);
85*4882a593Smuzhiyun 	void (*unbind_conn) (struct iscsi_cls_conn *conn, bool is_active);
86*4882a593Smuzhiyun 	int (*bind_conn) (struct iscsi_cls_session *session,
87*4882a593Smuzhiyun 			  struct iscsi_cls_conn *cls_conn,
88*4882a593Smuzhiyun 			  uint64_t transport_eph, int is_leading);
89*4882a593Smuzhiyun 	int (*start_conn) (struct iscsi_cls_conn *conn);
90*4882a593Smuzhiyun 	void (*stop_conn) (struct iscsi_cls_conn *conn, int flag);
91*4882a593Smuzhiyun 	void (*destroy_conn) (struct iscsi_cls_conn *conn);
92*4882a593Smuzhiyun 	int (*set_param) (struct iscsi_cls_conn *conn, enum iscsi_param param,
93*4882a593Smuzhiyun 			  char *buf, int buflen);
94*4882a593Smuzhiyun 	int (*get_ep_param) (struct iscsi_endpoint *ep, enum iscsi_param param,
95*4882a593Smuzhiyun 			     char *buf);
96*4882a593Smuzhiyun 	int (*get_conn_param) (struct iscsi_cls_conn *conn,
97*4882a593Smuzhiyun 			       enum iscsi_param param, char *buf);
98*4882a593Smuzhiyun 	int (*get_session_param) (struct iscsi_cls_session *session,
99*4882a593Smuzhiyun 				  enum iscsi_param param, char *buf);
100*4882a593Smuzhiyun 	int (*get_host_param) (struct Scsi_Host *shost,
101*4882a593Smuzhiyun 				enum iscsi_host_param param, char *buf);
102*4882a593Smuzhiyun 	int (*set_host_param) (struct Scsi_Host *shost,
103*4882a593Smuzhiyun 			       enum iscsi_host_param param, char *buf,
104*4882a593Smuzhiyun 			       int buflen);
105*4882a593Smuzhiyun 	int (*send_pdu) (struct iscsi_cls_conn *conn, struct iscsi_hdr *hdr,
106*4882a593Smuzhiyun 			 char *data, uint32_t data_size);
107*4882a593Smuzhiyun 	void (*get_stats) (struct iscsi_cls_conn *conn,
108*4882a593Smuzhiyun 			   struct iscsi_stats *stats);
109*4882a593Smuzhiyun 
110*4882a593Smuzhiyun 	int (*init_task) (struct iscsi_task *task);
111*4882a593Smuzhiyun 	int (*xmit_task) (struct iscsi_task *task);
112*4882a593Smuzhiyun 	void (*cleanup_task) (struct iscsi_task *task);
113*4882a593Smuzhiyun 
114*4882a593Smuzhiyun 	int (*alloc_pdu) (struct iscsi_task *task, uint8_t opcode);
115*4882a593Smuzhiyun 	int (*xmit_pdu) (struct iscsi_task *task);
116*4882a593Smuzhiyun 	int (*init_pdu) (struct iscsi_task *task, unsigned int offset,
117*4882a593Smuzhiyun 			 unsigned int count);
118*4882a593Smuzhiyun 	void (*parse_pdu_itt) (struct iscsi_conn *conn, itt_t itt,
119*4882a593Smuzhiyun 			       int *index, int *age);
120*4882a593Smuzhiyun 
121*4882a593Smuzhiyun 	void (*session_recovery_timedout) (struct iscsi_cls_session *session);
122*4882a593Smuzhiyun 	struct iscsi_endpoint *(*ep_connect) (struct Scsi_Host *shost,
123*4882a593Smuzhiyun 					      struct sockaddr *dst_addr,
124*4882a593Smuzhiyun 					      int non_blocking);
125*4882a593Smuzhiyun 	int (*ep_poll) (struct iscsi_endpoint *ep, int timeout_ms);
126*4882a593Smuzhiyun 	void (*ep_disconnect) (struct iscsi_endpoint *ep);
127*4882a593Smuzhiyun 	int (*tgt_dscvr) (struct Scsi_Host *shost, enum iscsi_tgt_dscvr type,
128*4882a593Smuzhiyun 			  uint32_t enable, struct sockaddr *dst_addr);
129*4882a593Smuzhiyun 	int (*set_path) (struct Scsi_Host *shost, struct iscsi_path *params);
130*4882a593Smuzhiyun 	int (*set_iface_param) (struct Scsi_Host *shost, void *data,
131*4882a593Smuzhiyun 				uint32_t len);
132*4882a593Smuzhiyun 	int (*get_iface_param) (struct iscsi_iface *iface,
133*4882a593Smuzhiyun 				enum iscsi_param_type param_type,
134*4882a593Smuzhiyun 				int param, char *buf);
135*4882a593Smuzhiyun 	umode_t (*attr_is_visible)(int param_type, int param);
136*4882a593Smuzhiyun 	int (*bsg_request)(struct bsg_job *job);
137*4882a593Smuzhiyun 	int (*send_ping) (struct Scsi_Host *shost, uint32_t iface_num,
138*4882a593Smuzhiyun 			  uint32_t iface_type, uint32_t payload_size,
139*4882a593Smuzhiyun 			  uint32_t pid, struct sockaddr *dst_addr);
140*4882a593Smuzhiyun 	int (*get_chap) (struct Scsi_Host *shost, uint16_t chap_tbl_idx,
141*4882a593Smuzhiyun 			 uint32_t *num_entries, char *buf);
142*4882a593Smuzhiyun 	int (*delete_chap) (struct Scsi_Host *shost, uint16_t chap_tbl_idx);
143*4882a593Smuzhiyun 	int (*set_chap) (struct Scsi_Host *shost, void *data, int len);
144*4882a593Smuzhiyun 	int (*get_flashnode_param) (struct iscsi_bus_flash_session *fnode_sess,
145*4882a593Smuzhiyun 				    int param, char *buf);
146*4882a593Smuzhiyun 	int (*set_flashnode_param) (struct iscsi_bus_flash_session *fnode_sess,
147*4882a593Smuzhiyun 				    struct iscsi_bus_flash_conn *fnode_conn,
148*4882a593Smuzhiyun 				    void *data, int len);
149*4882a593Smuzhiyun 	int (*new_flashnode) (struct Scsi_Host *shost, const char *buf,
150*4882a593Smuzhiyun 			      int len);
151*4882a593Smuzhiyun 	int (*del_flashnode) (struct iscsi_bus_flash_session *fnode_sess);
152*4882a593Smuzhiyun 	int (*login_flashnode) (struct iscsi_bus_flash_session *fnode_sess,
153*4882a593Smuzhiyun 				struct iscsi_bus_flash_conn *fnode_conn);
154*4882a593Smuzhiyun 	int (*logout_flashnode) (struct iscsi_bus_flash_session *fnode_sess,
155*4882a593Smuzhiyun 				 struct iscsi_bus_flash_conn *fnode_conn);
156*4882a593Smuzhiyun 	int (*logout_flashnode_sid) (struct iscsi_cls_session *cls_sess);
157*4882a593Smuzhiyun 	int (*get_host_stats) (struct Scsi_Host *shost, char *buf, int len);
158*4882a593Smuzhiyun 	u8 (*check_protection)(struct iscsi_task *task, sector_t *sector);
159*4882a593Smuzhiyun };
160*4882a593Smuzhiyun 
161*4882a593Smuzhiyun /*
162*4882a593Smuzhiyun  * transport registration upcalls
163*4882a593Smuzhiyun  */
164*4882a593Smuzhiyun extern struct scsi_transport_template *iscsi_register_transport(struct iscsi_transport *tt);
165*4882a593Smuzhiyun extern int iscsi_unregister_transport(struct iscsi_transport *tt);
166*4882a593Smuzhiyun 
167*4882a593Smuzhiyun /*
168*4882a593Smuzhiyun  * control plane upcalls
169*4882a593Smuzhiyun  */
170*4882a593Smuzhiyun extern void iscsi_conn_error_event(struct iscsi_cls_conn *conn,
171*4882a593Smuzhiyun 				   enum iscsi_err error);
172*4882a593Smuzhiyun extern void iscsi_conn_login_event(struct iscsi_cls_conn *conn,
173*4882a593Smuzhiyun 				   enum iscsi_conn_state state);
174*4882a593Smuzhiyun extern int iscsi_recv_pdu(struct iscsi_cls_conn *conn, struct iscsi_hdr *hdr,
175*4882a593Smuzhiyun 			  char *data, uint32_t data_size);
176*4882a593Smuzhiyun 
177*4882a593Smuzhiyun extern int iscsi_offload_mesg(struct Scsi_Host *shost,
178*4882a593Smuzhiyun 			      struct iscsi_transport *transport, uint32_t type,
179*4882a593Smuzhiyun 			      char *data, uint16_t data_size);
180*4882a593Smuzhiyun 
181*4882a593Smuzhiyun extern void iscsi_post_host_event(uint32_t host_no,
182*4882a593Smuzhiyun 				  struct iscsi_transport *transport,
183*4882a593Smuzhiyun 				  enum iscsi_host_event_code code,
184*4882a593Smuzhiyun 				  uint32_t data_size,
185*4882a593Smuzhiyun 				  uint8_t *data);
186*4882a593Smuzhiyun 
187*4882a593Smuzhiyun extern void iscsi_ping_comp_event(uint32_t host_no,
188*4882a593Smuzhiyun 				  struct iscsi_transport *transport,
189*4882a593Smuzhiyun 				  uint32_t status, uint32_t pid,
190*4882a593Smuzhiyun 				  uint32_t data_size, uint8_t *data);
191*4882a593Smuzhiyun 
192*4882a593Smuzhiyun /* iscsi class connection state */
193*4882a593Smuzhiyun enum iscsi_connection_state {
194*4882a593Smuzhiyun 	ISCSI_CONN_UP = 0,
195*4882a593Smuzhiyun 	ISCSI_CONN_DOWN,
196*4882a593Smuzhiyun 	ISCSI_CONN_FAILED,
197*4882a593Smuzhiyun 	ISCSI_CONN_BOUND,
198*4882a593Smuzhiyun };
199*4882a593Smuzhiyun 
200*4882a593Smuzhiyun #define ISCSI_CLS_CONN_BIT_CLEANUP	1
201*4882a593Smuzhiyun 
202*4882a593Smuzhiyun struct iscsi_cls_conn {
203*4882a593Smuzhiyun 	struct list_head conn_list;	/* item in connlist */
204*4882a593Smuzhiyun 	void *dd_data;			/* LLD private data */
205*4882a593Smuzhiyun 	struct iscsi_transport *transport;
206*4882a593Smuzhiyun 	uint32_t cid;			/* connection id */
207*4882a593Smuzhiyun 	/*
208*4882a593Smuzhiyun 	 * This protects the conn startup and binding/unbinding of the ep to
209*4882a593Smuzhiyun 	 * the conn. Unbinding includes ep_disconnect and stop_conn.
210*4882a593Smuzhiyun 	 */
211*4882a593Smuzhiyun 	struct mutex ep_mutex;
212*4882a593Smuzhiyun 	struct iscsi_endpoint *ep;
213*4882a593Smuzhiyun 
214*4882a593Smuzhiyun 	/* Used when accessing flags and queueing work. */
215*4882a593Smuzhiyun 	spinlock_t lock;
216*4882a593Smuzhiyun 	unsigned long flags;
217*4882a593Smuzhiyun 	struct work_struct cleanup_work;
218*4882a593Smuzhiyun 
219*4882a593Smuzhiyun 	struct device dev;		/* sysfs transport/container device */
220*4882a593Smuzhiyun 	enum iscsi_connection_state state;
221*4882a593Smuzhiyun };
222*4882a593Smuzhiyun 
223*4882a593Smuzhiyun #define iscsi_dev_to_conn(_dev) \
224*4882a593Smuzhiyun 	container_of(_dev, struct iscsi_cls_conn, dev)
225*4882a593Smuzhiyun 
226*4882a593Smuzhiyun #define transport_class_to_conn(_cdev) \
227*4882a593Smuzhiyun 	iscsi_dev_to_conn(_cdev->parent)
228*4882a593Smuzhiyun 
229*4882a593Smuzhiyun #define iscsi_conn_to_session(_conn) \
230*4882a593Smuzhiyun 	iscsi_dev_to_session(_conn->dev.parent)
231*4882a593Smuzhiyun 
232*4882a593Smuzhiyun /* iscsi class session state */
233*4882a593Smuzhiyun enum {
234*4882a593Smuzhiyun 	ISCSI_SESSION_LOGGED_IN,
235*4882a593Smuzhiyun 	ISCSI_SESSION_FAILED,
236*4882a593Smuzhiyun 	ISCSI_SESSION_FREE,
237*4882a593Smuzhiyun };
238*4882a593Smuzhiyun 
239*4882a593Smuzhiyun #define ISCSI_MAX_TARGET -1
240*4882a593Smuzhiyun 
241*4882a593Smuzhiyun struct iscsi_cls_session {
242*4882a593Smuzhiyun 	struct list_head sess_list;		/* item in session_list */
243*4882a593Smuzhiyun 	struct iscsi_transport *transport;
244*4882a593Smuzhiyun 	spinlock_t lock;
245*4882a593Smuzhiyun 	struct work_struct block_work;
246*4882a593Smuzhiyun 	struct work_struct unblock_work;
247*4882a593Smuzhiyun 	struct work_struct scan_work;
248*4882a593Smuzhiyun 	struct work_struct unbind_work;
249*4882a593Smuzhiyun 	struct work_struct destroy_work;
250*4882a593Smuzhiyun 
251*4882a593Smuzhiyun 	/* recovery fields */
252*4882a593Smuzhiyun 	int recovery_tmo;
253*4882a593Smuzhiyun 	bool recovery_tmo_sysfs_override;
254*4882a593Smuzhiyun 	struct delayed_work recovery_work;
255*4882a593Smuzhiyun 
256*4882a593Smuzhiyun 	unsigned int target_id;
257*4882a593Smuzhiyun 	bool ida_used;
258*4882a593Smuzhiyun 
259*4882a593Smuzhiyun 	/*
260*4882a593Smuzhiyun 	 * pid of userspace process that created session or -1 if
261*4882a593Smuzhiyun 	 * created by the kernel.
262*4882a593Smuzhiyun 	 */
263*4882a593Smuzhiyun 	pid_t creator;
264*4882a593Smuzhiyun 	int state;
265*4882a593Smuzhiyun 	int sid;				/* session id */
266*4882a593Smuzhiyun 	void *dd_data;				/* LLD private data */
267*4882a593Smuzhiyun 	struct device dev;	/* sysfs transport/container device */
268*4882a593Smuzhiyun };
269*4882a593Smuzhiyun 
270*4882a593Smuzhiyun #define iscsi_dev_to_session(_dev) \
271*4882a593Smuzhiyun 	container_of(_dev, struct iscsi_cls_session, dev)
272*4882a593Smuzhiyun 
273*4882a593Smuzhiyun #define transport_class_to_session(_cdev) \
274*4882a593Smuzhiyun 	iscsi_dev_to_session(_cdev->parent)
275*4882a593Smuzhiyun 
276*4882a593Smuzhiyun #define iscsi_session_to_shost(_session) \
277*4882a593Smuzhiyun 	dev_to_shost(_session->dev.parent)
278*4882a593Smuzhiyun 
279*4882a593Smuzhiyun #define starget_to_session(_stgt) \
280*4882a593Smuzhiyun 	iscsi_dev_to_session(_stgt->dev.parent)
281*4882a593Smuzhiyun 
282*4882a593Smuzhiyun struct iscsi_cls_host {
283*4882a593Smuzhiyun 	atomic_t nr_scans;
284*4882a593Smuzhiyun 	struct mutex mutex;
285*4882a593Smuzhiyun 	struct request_queue *bsg_q;
286*4882a593Smuzhiyun 	uint32_t port_speed;
287*4882a593Smuzhiyun 	uint32_t port_state;
288*4882a593Smuzhiyun };
289*4882a593Smuzhiyun 
290*4882a593Smuzhiyun #define iscsi_job_to_shost(_job) \
291*4882a593Smuzhiyun         dev_to_shost(_job->dev)
292*4882a593Smuzhiyun 
293*4882a593Smuzhiyun extern void iscsi_host_for_each_session(struct Scsi_Host *shost,
294*4882a593Smuzhiyun 				void (*fn)(struct iscsi_cls_session *));
295*4882a593Smuzhiyun 
296*4882a593Smuzhiyun struct iscsi_endpoint {
297*4882a593Smuzhiyun 	void *dd_data;			/* LLD private data */
298*4882a593Smuzhiyun 	struct device dev;
299*4882a593Smuzhiyun 	uint64_t id;
300*4882a593Smuzhiyun 	struct iscsi_cls_conn *conn;
301*4882a593Smuzhiyun };
302*4882a593Smuzhiyun 
303*4882a593Smuzhiyun struct iscsi_iface {
304*4882a593Smuzhiyun 	struct device dev;
305*4882a593Smuzhiyun 	struct iscsi_transport *transport;
306*4882a593Smuzhiyun 	uint32_t iface_type;	/* IPv4 or IPv6 */
307*4882a593Smuzhiyun 	uint32_t iface_num;	/* iface number, 0 - n */
308*4882a593Smuzhiyun 	void *dd_data;		/* LLD private data */
309*4882a593Smuzhiyun };
310*4882a593Smuzhiyun 
311*4882a593Smuzhiyun #define iscsi_dev_to_iface(_dev) \
312*4882a593Smuzhiyun 	container_of(_dev, struct iscsi_iface, dev)
313*4882a593Smuzhiyun 
314*4882a593Smuzhiyun #define iscsi_iface_to_shost(_iface) \
315*4882a593Smuzhiyun 	dev_to_shost(_iface->dev.parent)
316*4882a593Smuzhiyun 
317*4882a593Smuzhiyun 
318*4882a593Smuzhiyun struct iscsi_bus_flash_conn {
319*4882a593Smuzhiyun 	struct list_head conn_list;	/* item in connlist */
320*4882a593Smuzhiyun 	void *dd_data;			/* LLD private data */
321*4882a593Smuzhiyun 	struct iscsi_transport *transport;
322*4882a593Smuzhiyun 	struct device dev;		/* sysfs transport/container device */
323*4882a593Smuzhiyun 	/* iscsi connection parameters */
324*4882a593Smuzhiyun 	uint32_t		exp_statsn;
325*4882a593Smuzhiyun 	uint32_t		statsn;
326*4882a593Smuzhiyun 	unsigned		max_recv_dlength; /* initiator_max_recv_dsl*/
327*4882a593Smuzhiyun 	unsigned		max_xmit_dlength; /* target_max_recv_dsl */
328*4882a593Smuzhiyun 	unsigned		max_segment_size;
329*4882a593Smuzhiyun 	unsigned		tcp_xmit_wsf;
330*4882a593Smuzhiyun 	unsigned		tcp_recv_wsf;
331*4882a593Smuzhiyun 	int			hdrdgst_en;
332*4882a593Smuzhiyun 	int			datadgst_en;
333*4882a593Smuzhiyun 	int			port;
334*4882a593Smuzhiyun 	char			*ipaddress;
335*4882a593Smuzhiyun 	char			*link_local_ipv6_addr;
336*4882a593Smuzhiyun 	char			*redirect_ipaddr;
337*4882a593Smuzhiyun 	uint16_t		keepalive_timeout;
338*4882a593Smuzhiyun 	uint16_t		local_port;
339*4882a593Smuzhiyun 	uint8_t			snack_req_en;
340*4882a593Smuzhiyun 	/* tcp timestamp negotiation status */
341*4882a593Smuzhiyun 	uint8_t			tcp_timestamp_stat;
342*4882a593Smuzhiyun 	uint8_t			tcp_nagle_disable;
343*4882a593Smuzhiyun 	/* tcp window scale factor */
344*4882a593Smuzhiyun 	uint8_t			tcp_wsf_disable;
345*4882a593Smuzhiyun 	uint8_t			tcp_timer_scale;
346*4882a593Smuzhiyun 	uint8_t			tcp_timestamp_en;
347*4882a593Smuzhiyun 	uint8_t			ipv4_tos;
348*4882a593Smuzhiyun 	uint8_t			ipv6_traffic_class;
349*4882a593Smuzhiyun 	uint8_t			ipv6_flow_label;
350*4882a593Smuzhiyun 	uint8_t			fragment_disable;
351*4882a593Smuzhiyun 	/* Link local IPv6 address is assigned by firmware or driver */
352*4882a593Smuzhiyun 	uint8_t			is_fw_assigned_ipv6;
353*4882a593Smuzhiyun };
354*4882a593Smuzhiyun 
355*4882a593Smuzhiyun #define iscsi_dev_to_flash_conn(_dev) \
356*4882a593Smuzhiyun 	container_of(_dev, struct iscsi_bus_flash_conn, dev)
357*4882a593Smuzhiyun 
358*4882a593Smuzhiyun #define iscsi_flash_conn_to_flash_session(_conn) \
359*4882a593Smuzhiyun 	iscsi_dev_to_flash_session(_conn->dev.parent)
360*4882a593Smuzhiyun 
361*4882a593Smuzhiyun #define ISID_SIZE 6
362*4882a593Smuzhiyun 
363*4882a593Smuzhiyun struct iscsi_bus_flash_session {
364*4882a593Smuzhiyun 	struct list_head sess_list;		/* item in session_list */
365*4882a593Smuzhiyun 	struct iscsi_transport *transport;
366*4882a593Smuzhiyun 	unsigned int target_id;
367*4882a593Smuzhiyun 	int flash_state;	/* persistent or non-persistent */
368*4882a593Smuzhiyun 	void *dd_data;				/* LLD private data */
369*4882a593Smuzhiyun 	struct device dev;	/* sysfs transport/container device */
370*4882a593Smuzhiyun 	/* iscsi session parameters */
371*4882a593Smuzhiyun 	unsigned		first_burst;
372*4882a593Smuzhiyun 	unsigned		max_burst;
373*4882a593Smuzhiyun 	unsigned short		max_r2t;
374*4882a593Smuzhiyun 	int			default_taskmgmt_timeout;
375*4882a593Smuzhiyun 	int			initial_r2t_en;
376*4882a593Smuzhiyun 	int			imm_data_en;
377*4882a593Smuzhiyun 	int			time2wait;
378*4882a593Smuzhiyun 	int			time2retain;
379*4882a593Smuzhiyun 	int			pdu_inorder_en;
380*4882a593Smuzhiyun 	int			dataseq_inorder_en;
381*4882a593Smuzhiyun 	int			erl;
382*4882a593Smuzhiyun 	int			tpgt;
383*4882a593Smuzhiyun 	char			*username;
384*4882a593Smuzhiyun 	char			*username_in;
385*4882a593Smuzhiyun 	char			*password;
386*4882a593Smuzhiyun 	char			*password_in;
387*4882a593Smuzhiyun 	char			*targetname;
388*4882a593Smuzhiyun 	char			*targetalias;
389*4882a593Smuzhiyun 	char			*portal_type;
390*4882a593Smuzhiyun 	uint16_t		tsid;
391*4882a593Smuzhiyun 	uint16_t		chap_in_idx;
392*4882a593Smuzhiyun 	uint16_t		chap_out_idx;
393*4882a593Smuzhiyun 	/* index of iSCSI discovery session if the entry is
394*4882a593Smuzhiyun 	 * discovered by iSCSI discovery session
395*4882a593Smuzhiyun 	 */
396*4882a593Smuzhiyun 	uint16_t		discovery_parent_idx;
397*4882a593Smuzhiyun 	/* indicates if discovery was done through iSNS discovery service
398*4882a593Smuzhiyun 	 * or through sendTarget */
399*4882a593Smuzhiyun 	uint16_t		discovery_parent_type;
400*4882a593Smuzhiyun 	/* Firmware auto sendtarget discovery disable */
401*4882a593Smuzhiyun 	uint8_t			auto_snd_tgt_disable;
402*4882a593Smuzhiyun 	uint8_t			discovery_sess;
403*4882a593Smuzhiyun 	/* indicates if this flashnode entry is enabled or disabled */
404*4882a593Smuzhiyun 	uint8_t			entry_state;
405*4882a593Smuzhiyun 	uint8_t			chap_auth_en;
406*4882a593Smuzhiyun 	/* enables firmware to auto logout the discovery session on discovery
407*4882a593Smuzhiyun 	 * completion
408*4882a593Smuzhiyun 	 */
409*4882a593Smuzhiyun 	uint8_t			discovery_logout_en;
410*4882a593Smuzhiyun 	uint8_t			bidi_chap_en;
411*4882a593Smuzhiyun 	/* makes authentication for discovery session optional */
412*4882a593Smuzhiyun 	uint8_t			discovery_auth_optional;
413*4882a593Smuzhiyun 	uint8_t			isid[ISID_SIZE];
414*4882a593Smuzhiyun 	uint8_t			is_boot_target;
415*4882a593Smuzhiyun };
416*4882a593Smuzhiyun 
417*4882a593Smuzhiyun #define iscsi_dev_to_flash_session(_dev) \
418*4882a593Smuzhiyun 	container_of(_dev, struct iscsi_bus_flash_session, dev)
419*4882a593Smuzhiyun 
420*4882a593Smuzhiyun #define iscsi_flash_session_to_shost(_session) \
421*4882a593Smuzhiyun 	dev_to_shost(_session->dev.parent)
422*4882a593Smuzhiyun 
423*4882a593Smuzhiyun /*
424*4882a593Smuzhiyun  * session and connection functions that can be used by HW iSCSI LLDs
425*4882a593Smuzhiyun  */
426*4882a593Smuzhiyun #define iscsi_cls_session_printk(prefix, _cls_session, fmt, a...) \
427*4882a593Smuzhiyun 	dev_printk(prefix, &(_cls_session)->dev, fmt, ##a)
428*4882a593Smuzhiyun 
429*4882a593Smuzhiyun #define iscsi_cls_conn_printk(prefix, _cls_conn, fmt, a...) \
430*4882a593Smuzhiyun 	dev_printk(prefix, &(_cls_conn)->dev, fmt, ##a)
431*4882a593Smuzhiyun 
432*4882a593Smuzhiyun extern int iscsi_session_chkready(struct iscsi_cls_session *session);
433*4882a593Smuzhiyun extern int iscsi_is_session_online(struct iscsi_cls_session *session);
434*4882a593Smuzhiyun extern struct iscsi_cls_session *iscsi_alloc_session(struct Scsi_Host *shost,
435*4882a593Smuzhiyun 				struct iscsi_transport *transport, int dd_size);
436*4882a593Smuzhiyun extern int iscsi_add_session(struct iscsi_cls_session *session,
437*4882a593Smuzhiyun 			     unsigned int target_id);
438*4882a593Smuzhiyun extern int iscsi_session_event(struct iscsi_cls_session *session,
439*4882a593Smuzhiyun 			       enum iscsi_uevent_e event);
440*4882a593Smuzhiyun extern struct iscsi_cls_session *iscsi_create_session(struct Scsi_Host *shost,
441*4882a593Smuzhiyun 						struct iscsi_transport *t,
442*4882a593Smuzhiyun 						int dd_size,
443*4882a593Smuzhiyun 						unsigned int target_id);
444*4882a593Smuzhiyun extern void iscsi_remove_session(struct iscsi_cls_session *session);
445*4882a593Smuzhiyun extern void iscsi_free_session(struct iscsi_cls_session *session);
446*4882a593Smuzhiyun extern struct iscsi_cls_conn *iscsi_create_conn(struct iscsi_cls_session *sess,
447*4882a593Smuzhiyun 						int dd_size, uint32_t cid);
448*4882a593Smuzhiyun extern void iscsi_put_conn(struct iscsi_cls_conn *conn);
449*4882a593Smuzhiyun extern void iscsi_get_conn(struct iscsi_cls_conn *conn);
450*4882a593Smuzhiyun extern int iscsi_destroy_conn(struct iscsi_cls_conn *conn);
451*4882a593Smuzhiyun extern void iscsi_unblock_session(struct iscsi_cls_session *session);
452*4882a593Smuzhiyun extern void iscsi_block_session(struct iscsi_cls_session *session);
453*4882a593Smuzhiyun extern int iscsi_scan_finished(struct Scsi_Host *shost, unsigned long time);
454*4882a593Smuzhiyun extern struct iscsi_endpoint *iscsi_create_endpoint(int dd_size);
455*4882a593Smuzhiyun extern void iscsi_destroy_endpoint(struct iscsi_endpoint *ep);
456*4882a593Smuzhiyun extern struct iscsi_endpoint *iscsi_lookup_endpoint(u64 handle);
457*4882a593Smuzhiyun extern void iscsi_put_endpoint(struct iscsi_endpoint *ep);
458*4882a593Smuzhiyun extern int iscsi_block_scsi_eh(struct scsi_cmnd *cmd);
459*4882a593Smuzhiyun extern struct iscsi_iface *iscsi_create_iface(struct Scsi_Host *shost,
460*4882a593Smuzhiyun 					      struct iscsi_transport *t,
461*4882a593Smuzhiyun 					      uint32_t iface_type,
462*4882a593Smuzhiyun 					      uint32_t iface_num, int dd_size);
463*4882a593Smuzhiyun extern void iscsi_destroy_iface(struct iscsi_iface *iface);
464*4882a593Smuzhiyun extern struct iscsi_iface *iscsi_lookup_iface(int handle);
465*4882a593Smuzhiyun extern char *iscsi_get_port_speed_name(struct Scsi_Host *shost);
466*4882a593Smuzhiyun extern char *iscsi_get_port_state_name(struct Scsi_Host *shost);
467*4882a593Smuzhiyun extern int iscsi_is_session_dev(const struct device *dev);
468*4882a593Smuzhiyun 
469*4882a593Smuzhiyun extern char *iscsi_get_discovery_parent_name(int parent_type);
470*4882a593Smuzhiyun extern struct device *
471*4882a593Smuzhiyun iscsi_find_flashnode(struct Scsi_Host *shost, void *data,
472*4882a593Smuzhiyun 		     int (*fn)(struct device *dev, void *data));
473*4882a593Smuzhiyun 
474*4882a593Smuzhiyun extern struct iscsi_bus_flash_session *
475*4882a593Smuzhiyun iscsi_create_flashnode_sess(struct Scsi_Host *shost, int index,
476*4882a593Smuzhiyun 			    struct iscsi_transport *transport, int dd_size);
477*4882a593Smuzhiyun 
478*4882a593Smuzhiyun extern struct iscsi_bus_flash_conn *
479*4882a593Smuzhiyun iscsi_create_flashnode_conn(struct Scsi_Host *shost,
480*4882a593Smuzhiyun 			    struct iscsi_bus_flash_session *fnode_sess,
481*4882a593Smuzhiyun 			    struct iscsi_transport *transport, int dd_size);
482*4882a593Smuzhiyun 
483*4882a593Smuzhiyun extern void
484*4882a593Smuzhiyun iscsi_destroy_flashnode_sess(struct iscsi_bus_flash_session *fnode_sess);
485*4882a593Smuzhiyun 
486*4882a593Smuzhiyun extern void iscsi_destroy_all_flashnode(struct Scsi_Host *shost);
487*4882a593Smuzhiyun extern int iscsi_flashnode_bus_match(struct device *dev,
488*4882a593Smuzhiyun 				     struct device_driver *drv);
489*4882a593Smuzhiyun extern struct device *
490*4882a593Smuzhiyun iscsi_find_flashnode_sess(struct Scsi_Host *shost, void *data,
491*4882a593Smuzhiyun 			  int (*fn)(struct device *dev, void *data));
492*4882a593Smuzhiyun extern struct device *
493*4882a593Smuzhiyun iscsi_find_flashnode_conn(struct iscsi_bus_flash_session *fnode_sess);
494*4882a593Smuzhiyun 
495*4882a593Smuzhiyun extern char *
496*4882a593Smuzhiyun iscsi_get_ipaddress_state_name(enum iscsi_ipaddress_state port_state);
497*4882a593Smuzhiyun extern char *iscsi_get_router_state_name(enum iscsi_router_state router_state);
498*4882a593Smuzhiyun #endif
499