2005-08-05 06:31:00 +04:00
/*
2005-04-17 02:20:36 +04:00
* iSCSI transport class definitions
*
* Copyright ( C ) IBM Corporation , 2004
2006-04-07 06:13:41 +04:00
* Copyright ( C ) Mike Christie , 2004 - 2006
2005-08-05 06:31:00 +04:00
* Copyright ( C ) Dmitry Yusupov , 2004 - 2005
* Copyright ( C ) Alex Aizman , 2004 - 2005
2005-04-17 02:20:36 +04:00
*
* This program is free software ; you can redistribute it and / or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation ; either version 2 of the License , or
* ( at your option ) any later version .
*
* This program is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU General Public License for more details .
*
* You should have received a copy of the GNU General Public License
* along with this program ; if not , write to the Free Software
* Foundation , Inc . , 59 Temple Place - Suite 330 , Boston , MA 02111 - 1307 , USA .
*/
# ifndef SCSI_TRANSPORT_ISCSI_H
# define SCSI_TRANSPORT_ISCSI_H
2006-01-14 03:05:50 +03:00
# include <linux/device.h>
2007-10-03 01:38:05 +04:00
# include <linux/list.h>
# include <linux/mutex.h>
2005-08-05 06:31:00 +04:00
# include <scsi/iscsi_if.h>
2005-04-17 02:20:36 +04:00
2006-01-14 03:05:50 +03:00
struct scsi_transport_template ;
2006-04-07 06:13:41 +04:00
struct iscsi_transport ;
2006-01-14 03:05:50 +03:00
struct Scsi_Host ;
struct iscsi_cls_conn ;
2006-04-07 06:13:41 +04:00
struct iscsi_conn ;
2008-05-22 00:54:09 +04:00
struct iscsi_task ;
2006-06-28 21:00:23 +04:00
struct sockaddr ;
2006-01-14 03:05:50 +03:00
2005-08-05 06:31:00 +04:00
/**
* struct iscsi_transport - iSCSI Transport template
*
* @ name : transport name
* @ caps : iSCSI Data - Path capabilities
* @ create_session : create new iSCSI session object
* @ destroy_session : destroy existing iSCSI session object
* @ create_conn : create new iSCSI connection
* @ bind_conn : associate this connection with existing iSCSI session
* and specified transport descriptor
* @ destroy_conn : destroy inactive iSCSI connection
2006-06-28 21:00:23 +04:00
* @ set_param : set iSCSI parameter . Return 0 on success , - ENODATA
* when param is not supported , and a - Exx value on other
* error .
* @ get_param get iSCSI parameter . Must return number of bytes
* copied to buffer on success , - ENODATA when param
* is not supported , and a - Exx value on other error
2005-08-05 06:31:00 +04:00
* @ start_conn : set connection to be operational
* @ stop_conn : suspend / recover / terminate connection
* @ send_pdu : send iSCSI PDU , Login , Logout , NOP - Out , Reject , Text .
2006-04-07 06:13:41 +04:00
* @ session_recovery_timedout : notify LLD a block during recovery timed out
2008-05-22 00:54:06 +04:00
* @ init_task : Initialize a iscsi_task and any internal structs .
* When offloading the data path , this is called from
* queuecommand with the session lock , or from the
* iscsi_conn_send_pdu context with the session lock .
* When not offloading the data path , this is called
* from the scsi work queue without the session lock .
* @ xmit_task Requests LLD to transfer cmd task . Returns 0 or the
2006-05-30 09:37:28 +04:00
* the number of bytes transferred on success , and - Exyz
2008-05-22 00:54:06 +04:00
* value on error . When offloading the data path , this
* is called from queuecommand with the session lock , or
* from the iscsi_conn_send_pdu context with the session
* lock . When not offloading the data path , this is called
* from the scsi work queue without the session lock .
* @ cleanup_task : requests LLD to fail task . Called with session lock
* and after the connection has been suspended and
* terminated during recovery . If called
2006-04-07 06:13:41 +04:00
* from abort task then connection is not suspended
* or terminated but sk_callback_lock is held
2005-08-05 06:31:00 +04:00
*
* Template API provided by iSCSI Transport
*/
struct iscsi_transport {
struct module * owner ;
char * name ;
unsigned int caps ;
2006-04-07 06:13:36 +04:00
/* LLD sets this to indicate what values it can export to sysfs */
2007-05-30 21:57:08 +04:00
uint64_t param_mask ;
uint64_t host_param_mask ;
2008-05-22 00:53:59 +04:00
struct iscsi_cls_session * ( * create_session ) ( struct Scsi_Host * shost ,
uint16_t cmds_max , uint16_t qdepth ,
uint32_t sn , uint32_t * hn ) ;
2006-02-02 06:06:49 +03:00
void ( * destroy_session ) ( struct iscsi_cls_session * session ) ;
struct iscsi_cls_conn * ( * create_conn ) ( struct iscsi_cls_session * sess ,
2006-01-14 03:05:50 +03:00
uint32_t cid ) ;
2006-02-02 06:06:49 +03:00
int ( * bind_conn ) ( struct iscsi_cls_session * session ,
struct iscsi_cls_conn * cls_conn ,
2006-05-03 04:46:36 +04:00
uint64_t transport_eph , int is_leading ) ;
2006-02-02 06:06:49 +03:00
int ( * start_conn ) ( struct iscsi_cls_conn * conn ) ;
void ( * stop_conn ) ( struct iscsi_cls_conn * conn , int flag ) ;
2006-01-14 03:05:50 +03:00
void ( * destroy_conn ) ( struct iscsi_cls_conn * conn ) ;
2006-02-02 06:06:49 +03:00
int ( * set_param ) ( struct iscsi_cls_conn * conn , enum iscsi_param param ,
2006-06-28 21:00:23 +04:00
char * buf , int buflen ) ;
2006-02-02 06:06:49 +03:00
int ( * get_conn_param ) ( struct iscsi_cls_conn * conn ,
2006-06-28 21:00:23 +04:00
enum iscsi_param param , char * buf ) ;
2006-02-02 06:06:49 +03:00
int ( * get_session_param ) ( struct iscsi_cls_session * session ,
2006-06-28 21:00:23 +04:00
enum iscsi_param param , char * buf ) ;
2007-05-30 21:57:08 +04:00
int ( * get_host_param ) ( struct Scsi_Host * shost ,
enum iscsi_host_param param , char * buf ) ;
2007-05-30 21:57:11 +04:00
int ( * set_host_param ) ( struct Scsi_Host * shost ,
enum iscsi_host_param param , char * buf ,
int buflen ) ;
2006-02-02 06:06:49 +03:00
int ( * send_pdu ) ( struct iscsi_cls_conn * conn , struct iscsi_hdr * hdr ,
2005-08-05 06:31:00 +04:00
char * data , uint32_t data_size ) ;
2006-02-02 06:06:49 +03:00
void ( * get_stats ) ( struct iscsi_cls_conn * conn ,
struct iscsi_stats * stats ) ;
2008-05-22 00:54:09 +04:00
int ( * init_task ) ( struct iscsi_task * task ) ;
int ( * xmit_task ) ( struct iscsi_task * task ) ;
2008-05-22 00:54:06 +04:00
void ( * cleanup_task ) ( struct iscsi_conn * conn ,
2008-05-22 00:54:09 +04:00
struct iscsi_task * task ) ;
2006-04-07 06:13:39 +04:00
void ( * session_recovery_timedout ) ( struct iscsi_cls_session * session ) ;
2006-05-03 04:46:36 +04:00
int ( * ep_connect ) ( struct sockaddr * dst_addr , int non_blocking ,
uint64_t * ep_handle ) ;
int ( * ep_poll ) ( uint64_t ep_handle , int timeout_ms ) ;
void ( * ep_disconnect ) ( uint64_t ep_handle ) ;
2007-05-30 21:57:10 +04:00
int ( * tgt_dscvr ) ( struct Scsi_Host * shost , enum iscsi_tgt_dscvr type ,
2006-06-28 21:00:22 +04:00
uint32_t enable , struct sockaddr * dst_addr ) ;
2005-04-17 02:20:36 +04:00
} ;
/*
2005-08-05 06:31:00 +04:00
* transport registration upcalls
2005-04-17 02:20:36 +04:00
*/
2006-01-14 03:05:50 +03:00
extern struct scsi_transport_template * iscsi_register_transport ( struct iscsi_transport * tt ) ;
2005-08-05 06:31:00 +04:00
extern int iscsi_unregister_transport ( struct iscsi_transport * tt ) ;
2005-04-17 02:20:36 +04:00
/*
2005-08-05 06:31:00 +04:00
* control plane upcalls
2005-04-17 02:20:36 +04:00
*/
2006-02-02 06:06:49 +03:00
extern void iscsi_conn_error ( struct iscsi_cls_conn * conn , enum iscsi_err error ) ;
extern int iscsi_recv_pdu ( struct iscsi_cls_conn * conn , struct iscsi_hdr * hdr ,
2005-08-05 06:31:00 +04:00
char * data , uint32_t data_size ) ;
2005-04-17 02:20:36 +04:00
2006-01-14 03:05:50 +03:00
struct iscsi_cls_conn {
struct list_head conn_list ; /* item in connlist */
void * dd_data ; /* LLD private data */
struct iscsi_transport * transport ;
2006-04-07 06:13:33 +04:00
uint32_t cid ; /* connection id */
2006-04-07 06:13:36 +04:00
2006-01-14 03:05:50 +03:00
int active ; /* must be accessed with the connlock */
struct device dev ; /* sysfs transport/container device */
} ;
# define iscsi_dev_to_conn(_dev) \
container_of ( _dev , struct iscsi_cls_conn , dev )
2008-01-31 22:36:43 +03:00
# define iscsi_conn_to_session(_conn) \
iscsi_dev_to_session ( _conn - > dev . parent )
/* iscsi class session state */
enum {
ISCSI_SESSION_LOGGED_IN ,
ISCSI_SESSION_FAILED ,
ISCSI_SESSION_FREE ,
} ;
2006-04-07 06:13:41 +04:00
2008-05-22 00:54:12 +04:00
# define ISCSI_MAX_TARGET -1
2006-01-14 03:05:50 +03:00
struct iscsi_cls_session {
2006-02-02 06:06:49 +03:00
struct list_head sess_list ; /* item in session_list */
2006-01-14 03:05:50 +03:00
struct iscsi_transport * transport ;
2008-01-31 22:36:43 +03:00
spinlock_t lock ;
2008-03-04 22:26:55 +03:00
struct work_struct block_work ;
struct work_struct unblock_work ;
2008-01-31 22:36:46 +03:00
struct work_struct scan_work ;
struct work_struct unbind_work ;
2006-04-07 06:13:36 +04:00
2006-04-07 06:13:39 +04:00
/* recovery fields */
int recovery_tmo ;
2006-11-22 17:57:56 +03:00
struct delayed_work recovery_work ;
2006-04-07 06:13:39 +04:00
2008-05-22 00:54:12 +04:00
unsigned int target_id ;
2006-04-07 06:13:39 +04:00
2008-01-31 22:36:43 +03:00
int state ;
2006-04-07 06:13:33 +04:00
int sid ; /* session id */
void * dd_data ; /* LLD private data */
2006-01-14 03:05:50 +03:00
struct device dev ; /* sysfs transport/container device */
} ;
# define iscsi_dev_to_session(_dev) \
container_of ( _dev , struct iscsi_cls_session , dev )
# define iscsi_session_to_shost(_session) \
dev_to_shost ( _session - > dev . parent )
2006-06-28 21:00:30 +04:00
# define starget_to_session(_stgt) \
iscsi_dev_to_session ( _stgt - > dev . parent )
2008-05-22 00:53:58 +04:00
struct iscsi_cls_host {
2008-01-31 22:36:48 +03:00
atomic_t nr_scans ;
2006-04-07 06:13:39 +04:00
struct mutex mutex ;
2008-01-31 22:36:46 +03:00
struct workqueue_struct * scan_workq ;
char scan_workq_name [ KOBJ_NAME_LEN ] ;
2006-04-07 06:13:39 +04:00
} ;
2008-05-22 00:54:00 +04:00
extern void iscsi_host_for_each_session ( struct Scsi_Host * shost ,
void ( * fn ) ( struct iscsi_cls_session * ) ) ;
2006-01-14 03:05:50 +03:00
/*
* session and connection functions that can be used by HW iSCSI LLDs
*/
2008-01-31 22:36:52 +03:00
# define iscsi_cls_session_printk(prefix, _cls_session, fmt, a...) \
dev_printk ( prefix , & ( _cls_session ) - > dev , fmt , # # a )
# define iscsi_cls_conn_printk(prefix, _cls_conn, fmt, a...) \
dev_printk ( prefix , & ( _cls_conn ) - > dev , fmt , # # a )
2008-01-31 22:36:43 +03:00
extern int iscsi_session_chkready ( struct iscsi_cls_session * session ) ;
2006-06-28 21:00:30 +04:00
extern struct iscsi_cls_session * iscsi_alloc_session ( struct Scsi_Host * shost ,
2008-05-22 00:54:01 +04:00
struct iscsi_transport * transport , int dd_size ) ;
2006-06-28 21:00:31 +04:00
extern int iscsi_add_session ( struct iscsi_cls_session * session ,
unsigned int target_id ) ;
2007-12-13 21:43:29 +03:00
extern int iscsi_session_event ( struct iscsi_cls_session * session ,
enum iscsi_uevent_e event ) ;
2006-01-14 03:05:50 +03:00
extern struct iscsi_cls_session * iscsi_create_session ( struct Scsi_Host * shost ,
2006-06-28 21:00:31 +04:00
struct iscsi_transport * t ,
2008-05-22 00:54:01 +04:00
int dd_size ,
2006-06-28 21:00:31 +04:00
unsigned int target_id ) ;
2006-06-28 21:00:30 +04:00
extern void iscsi_remove_session ( struct iscsi_cls_session * session ) ;
extern void iscsi_free_session ( struct iscsi_cls_session * session ) ;
2006-01-14 03:05:50 +03:00
extern int iscsi_destroy_session ( struct iscsi_cls_session * session ) ;
extern struct iscsi_cls_conn * iscsi_create_conn ( struct iscsi_cls_session * sess ,
2008-05-22 00:54:01 +04:00
int dd_size , uint32_t cid ) ;
2006-01-14 03:05:50 +03:00
extern int iscsi_destroy_conn ( struct iscsi_cls_conn * conn ) ;
2006-04-07 06:13:39 +04:00
extern void iscsi_unblock_session ( struct iscsi_cls_session * session ) ;
extern void iscsi_block_session ( struct iscsi_cls_session * session ) ;
2008-01-31 22:36:48 +03:00
extern int iscsi_scan_finished ( struct Scsi_Host * shost , unsigned long time ) ;
2006-06-28 21:00:32 +04:00
2005-04-17 02:20:36 +04:00
# endif