2005-11-03 01:07:13 +03:00
/*
* Copyright ( c ) 2005 Cisco Systems . All rights reserved .
*
* This software is available to you under a choice of one of two
* licenses . You may choose to be licensed under the terms of the GNU
* General Public License ( GPL ) Version 2 , available from the file
* COPYING in the main directory of this source tree , or the
* OpenIB . org BSD license below :
*
* Redistribution and use in source and binary forms , with or
* without modification , are permitted provided that the following
* conditions are met :
*
* - Redistributions of source code must retain the above
* copyright notice , this list of conditions and the following
* disclaimer .
*
* - Redistributions in binary form must reproduce the above
* copyright notice , this list of conditions and the following
* disclaimer in the documentation and / or other materials
* provided with the distribution .
*
* THE SOFTWARE IS PROVIDED " AS IS " , WITHOUT WARRANTY OF ANY KIND ,
* EXPRESS OR IMPLIED , INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY , FITNESS FOR A PARTICULAR PURPOSE AND
* NONINFRINGEMENT . IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
* BE LIABLE FOR ANY CLAIM , DAMAGES OR OTHER LIABILITY , WHETHER IN AN
* ACTION OF CONTRACT , TORT OR OTHERWISE , ARISING FROM , OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE .
*/
# ifndef IB_SRP_H
# define IB_SRP_H
# include <linux/types.h>
# include <linux/list.h>
2006-01-31 02:21:21 +03:00
# include <linux/mutex.h>
2006-03-25 02:47:26 +03:00
# include <linux/scatterlist.h>
2005-11-03 01:07:13 +03:00
# include <scsi/scsi_host.h>
# include <scsi/scsi_cmnd.h>
# include <rdma/ib_verbs.h>
# include <rdma/ib_sa.h>
# include <rdma/ib_cm.h>
2006-06-18 07:37:29 +04:00
# include <rdma/ib_fmr_pool.h>
2005-11-03 01:07:13 +03:00
enum {
SRP_PATH_REC_TIMEOUT_MS = 1000 ,
SRP_ABORT_TIMEOUT_MS = 5000 ,
SRP_PORT_REDIRECT = 1 ,
SRP_DLID_REDIRECT = 2 ,
2008-01-09 01:08:52 +03:00
SRP_STALE_CONN = 3 ,
2005-11-03 01:07:13 +03:00
2005-11-12 01:06:01 +03:00
SRP_MAX_LUN = 512 ,
2006-06-18 07:37:32 +04:00
SRP_DEF_SG_TABLESIZE = 12 ,
2005-11-03 01:07:13 +03:00
SRP_RQ_SHIFT = 6 ,
SRP_RQ_SIZE = 1 < < SRP_RQ_SHIFT ,
2010-08-30 23:27:20 +04:00
SRP_SQ_SIZE = SRP_RQ_SIZE ,
SRP_RSP_SQ_SIZE = 1 ,
SRP_REQ_SQ_SIZE = SRP_SQ_SIZE - SRP_RSP_SQ_SIZE ,
SRP_TSK_MGMT_SQ_SIZE = 1 ,
SRP_CMD_SQ_SIZE = SRP_REQ_SQ_SIZE - SRP_TSK_MGMT_SQ_SIZE ,
2005-11-03 01:07:13 +03:00
2010-11-26 21:02:21 +03:00
SRP_TAG_NO_REQ = ~ 0U ,
SRP_TAG_TSK_MGMT = 1U < < 31 ,
2006-06-18 07:37:29 +04:00
2011-01-19 05:58:09 +03:00
SRP_FMR_SIZE = 512 ,
SRP_FMR_MIN_SIZE = 128 ,
2006-06-18 07:37:29 +04:00
SRP_FMR_POOL_SIZE = 1024 ,
2011-01-15 03:45:50 +03:00
SRP_FMR_DIRTY_SIZE = SRP_FMR_POOL_SIZE / 4 ,
SRP_MAP_ALLOW_FMR = 0 ,
SRP_MAP_NO_FMR = 1 ,
2005-11-03 01:07:13 +03:00
} ;
enum srp_target_state {
SRP_TARGET_LIVE ,
SRP_TARGET_DEAD ,
SRP_TARGET_REMOVED
} ;
2010-10-08 22:40:47 +04:00
enum srp_iu_type {
SRP_IU_CMD ,
SRP_IU_TSK_MGMT ,
SRP_IU_RSP ,
2007-12-20 01:08:43 +03:00
} ;
2006-06-18 07:37:29 +04:00
struct srp_device {
struct list_head dev_list ;
2005-11-03 01:07:13 +03:00
struct ib_device * dev ;
struct ib_pd * pd ;
struct ib_mr * mr ;
2006-06-18 07:37:29 +04:00
struct ib_fmr_pool * fmr_pool ;
2006-12-16 01:01:49 +03:00
u64 fmr_page_mask ;
2011-01-15 03:45:50 +03:00
int fmr_page_size ;
int fmr_max_size ;
2006-06-18 07:37:29 +04:00
} ;
struct srp_host {
2008-03-06 02:13:36 +03:00
struct srp_device * srp_dev ;
2006-06-18 07:37:29 +04:00
u8 port ;
2008-02-22 02:13:36 +03:00
struct device dev ;
2005-11-03 01:07:13 +03:00
struct list_head target_list ;
2006-06-18 07:37:30 +04:00
spinlock_t target_lock ;
2005-11-03 01:07:13 +03:00
struct completion released ;
struct list_head list ;
} ;
struct srp_request {
struct list_head list ;
struct scsi_cmnd * scmnd ;
struct srp_iu * cmd ;
2011-01-15 03:45:50 +03:00
struct ib_pool_fmr * * fmr_list ;
u64 * map_page ;
2011-01-16 21:57:10 +03:00
struct srp_direct_buf * indirect_desc ;
dma_addr_t indirect_dma_addr ;
2011-01-15 03:45:50 +03:00
short nfmr ;
2006-05-09 21:50:28 +04:00
short index ;
2005-11-03 01:07:13 +03:00
} ;
struct srp_target_port {
2010-11-26 23:34:46 +03:00
/* These are RW in the hot path, and commonly used together */
struct list_head free_tx ;
struct list_head free_reqs ;
spinlock_t lock ;
s32 req_lim ;
/* These are read-only in the hot path */
struct ib_cq * send_cq ____cacheline_aligned_in_smp ;
struct ib_cq * recv_cq ;
struct ib_qp * qp ;
u32 lkey ;
u32 rkey ;
enum srp_target_state state ;
2011-01-15 02:23:24 +03:00
unsigned int max_iu_len ;
unsigned int cmd_sg_cnt ;
2011-01-16 21:57:10 +03:00
unsigned int indirect_size ;
bool allow_ext_sg ;
2010-11-26 23:34:46 +03:00
/* Everything above this point is used in the hot path of
* command processing . Try to keep them packed into cachelines .
*/
2005-11-03 01:07:13 +03:00
__be64 id_ext ;
__be64 ioc_guid ;
__be64 service_id ;
2006-10-04 17:28:56 +04:00
__be64 initiator_ext ;
2006-06-18 07:37:38 +04:00
u16 io_class ;
2005-11-03 01:07:13 +03:00
struct srp_host * srp_host ;
struct Scsi_Host * scsi_host ;
char target_name [ 32 ] ;
unsigned int scsi_id ;
2011-01-16 21:57:10 +03:00
unsigned int sg_tablesize ;
2005-11-03 01:07:13 +03:00
struct ib_sa_path_rec path ;
2007-05-07 08:18:11 +04:00
__be16 orig_dgid [ 8 ] ;
2005-11-03 01:07:13 +03:00
struct ib_sa_query * path_query ;
int path_query_id ;
2011-09-03 11:34:48 +04:00
u32 rq_tmo_jiffies ;
2011-12-25 16:18:12 +04:00
bool connected ;
2011-09-03 11:34:48 +04:00
2005-11-03 01:07:13 +03:00
struct ib_cm_id * cm_id ;
int max_ti_iu_len ;
2006-06-18 07:37:33 +04:00
int zero_req_lim ;
2010-08-30 23:27:20 +04:00
struct srp_iu * tx_ring [ SRP_SQ_SIZE ] ;
2010-11-26 23:34:46 +03:00
struct srp_iu * rx_ring [ SRP_RQ_SIZE ] ;
2010-08-30 23:27:20 +04:00
struct srp_request req_ring [ SRP_CMD_SQ_SIZE ] ;
2005-11-03 01:07:13 +03:00
struct work_struct work ;
struct list_head list ;
struct completion done ;
int status ;
2011-09-03 11:25:42 +04:00
bool qp_in_error ;
2010-11-26 21:02:21 +03:00
struct completion tsk_mgmt_done ;
u8 tsk_mgmt_status ;
2005-11-03 01:07:13 +03:00
} ;
struct srp_iu {
2010-11-26 21:22:48 +03:00
struct list_head list ;
2006-12-13 01:30:55 +03:00
u64 dma ;
2005-11-03 01:07:13 +03:00
void * buf ;
size_t size ;
enum dma_data_direction direction ;
} ;
2011-01-15 03:45:50 +03:00
struct srp_map_state {
struct ib_pool_fmr * * next_fmr ;
struct srp_direct_buf * desc ;
u64 * pages ;
dma_addr_t base_dma_addr ;
u32 fmr_len ;
u32 total_len ;
unsigned int npages ;
unsigned int nfmr ;
unsigned int ndesc ;
struct scatterlist * unmapped_sg ;
int unmapped_index ;
dma_addr_t unmapped_addr ;
} ;
2005-11-03 01:07:13 +03:00
# endif /* IB_SRP_H */