| 
									
										
										
										
											2005-11-02 14:07:13 -08: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-30 15:21:21 -08:00
										 |  |  | #include <linux/mutex.h>
 | 
					
						
							| 
									
										
										
										
											2006-03-24 15:47:26 -08:00
										 |  |  | #include <linux/scatterlist.h>
 | 
					
						
							| 
									
										
										
										
											2005-11-02 14:07:13 -08: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-17 20:37:29 -07:00
										 |  |  | #include <rdma/ib_fmr_pool.h>
 | 
					
						
							| 
									
										
										
										
											2005-11-02 14:07:13 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  | enum { | 
					
						
							|  |  |  | 	SRP_PATH_REC_TIMEOUT_MS	= 1000, | 
					
						
							|  |  |  | 	SRP_ABORT_TIMEOUT_MS	= 5000, | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	SRP_PORT_REDIRECT	= 1, | 
					
						
							|  |  |  | 	SRP_DLID_REDIRECT	= 2, | 
					
						
							| 
									
										
										
										
											2008-01-08 17:08:52 -05:00
										 |  |  | 	SRP_STALE_CONN		= 3, | 
					
						
							| 
									
										
										
										
											2005-11-02 14:07:13 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-11-11 14:06:01 -08:00
										 |  |  | 	SRP_MAX_LUN		= 512, | 
					
						
							| 
									
										
										
										
											2006-06-17 20:37:32 -07:00
										 |  |  | 	SRP_DEF_SG_TABLESIZE	= 12, | 
					
						
							| 
									
										
										
										
											2005-11-02 14:07:13 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	SRP_RQ_SHIFT    	= 6, | 
					
						
							|  |  |  | 	SRP_RQ_SIZE		= 1 << SRP_RQ_SHIFT, | 
					
						
							|  |  |  | 	SRP_SQ_SIZE		= SRP_RQ_SIZE - 1, | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-06-17 20:37:29 -07:00
										 |  |  | 	SRP_TAG_TSK_MGMT	= 1 << (SRP_RQ_SHIFT + 1), | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	SRP_FMR_SIZE		= 256, | 
					
						
							|  |  |  | 	SRP_FMR_POOL_SIZE	= 1024, | 
					
						
							|  |  |  | 	SRP_FMR_DIRTY_SIZE	= SRP_FMR_POOL_SIZE / 4 | 
					
						
							| 
									
										
										
										
											2005-11-02 14:07:13 -08:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | enum srp_target_state { | 
					
						
							|  |  |  | 	SRP_TARGET_LIVE, | 
					
						
							|  |  |  | 	SRP_TARGET_CONNECTING, | 
					
						
							|  |  |  | 	SRP_TARGET_DEAD, | 
					
						
							|  |  |  | 	SRP_TARGET_REMOVED | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-12-19 17:08:43 -05:00
										 |  |  | enum srp_request_type { | 
					
						
							|  |  |  | 	SRP_REQ_NORMAL, | 
					
						
							|  |  |  | 	SRP_REQ_TASK_MGMT, | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-06-17 20:37:29 -07:00
										 |  |  | struct srp_device { | 
					
						
							|  |  |  | 	struct list_head	dev_list; | 
					
						
							| 
									
										
										
										
											2005-11-02 14:07:13 -08:00
										 |  |  | 	struct ib_device       *dev; | 
					
						
							|  |  |  | 	struct ib_pd	       *pd; | 
					
						
							|  |  |  | 	struct ib_mr	       *mr; | 
					
						
							| 
									
										
										
										
											2006-06-17 20:37:29 -07:00
										 |  |  | 	struct ib_fmr_pool     *fmr_pool; | 
					
						
							|  |  |  | 	int			fmr_page_shift; | 
					
						
							|  |  |  | 	int			fmr_page_size; | 
					
						
							| 
									
										
										
										
											2006-12-15 14:01:49 -08:00
										 |  |  | 	u64			fmr_page_mask; | 
					
						
							| 
									
										
										
										
											2006-06-17 20:37:29 -07:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | struct srp_host { | 
					
						
							| 
									
										
										
										
											2008-03-06 00:13:36 +01:00
										 |  |  | 	struct srp_device      *srp_dev; | 
					
						
							| 
									
										
										
										
											2006-06-17 20:37:29 -07:00
										 |  |  | 	u8			port; | 
					
						
							| 
									
										
										
										
											2008-02-22 00:13:36 +01:00
										 |  |  | 	struct device		dev; | 
					
						
							| 
									
										
										
										
											2005-11-02 14:07:13 -08:00
										 |  |  | 	struct list_head	target_list; | 
					
						
							| 
									
										
										
										
											2006-06-17 20:37:30 -07:00
										 |  |  | 	spinlock_t		target_lock; | 
					
						
							| 
									
										
										
										
											2005-11-02 14:07:13 -08:00
										 |  |  | 	struct completion	released; | 
					
						
							|  |  |  | 	struct list_head	list; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | struct srp_request { | 
					
						
							|  |  |  | 	struct list_head	list; | 
					
						
							|  |  |  | 	struct scsi_cmnd       *scmnd; | 
					
						
							|  |  |  | 	struct srp_iu	       *cmd; | 
					
						
							|  |  |  | 	struct srp_iu	       *tsk_mgmt; | 
					
						
							| 
									
										
										
										
											2006-06-17 20:37:29 -07:00
										 |  |  | 	struct ib_pool_fmr     *fmr; | 
					
						
							| 
									
										
										
										
											2005-11-02 14:07:13 -08:00
										 |  |  | 	struct completion	done; | 
					
						
							| 
									
										
										
										
											2006-05-09 10:50:28 -07:00
										 |  |  | 	short			index; | 
					
						
							| 
									
										
										
										
											2005-11-02 14:07:13 -08:00
										 |  |  | 	u8			cmd_done; | 
					
						
							|  |  |  | 	u8			tsk_status; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | struct srp_target_port { | 
					
						
							|  |  |  | 	__be64			id_ext; | 
					
						
							|  |  |  | 	__be64			ioc_guid; | 
					
						
							|  |  |  | 	__be64			service_id; | 
					
						
							| 
									
										
										
										
											2006-10-04 15:28:56 +02:00
										 |  |  | 	__be64			initiator_ext; | 
					
						
							| 
									
										
										
										
											2006-06-17 20:37:38 -07:00
										 |  |  | 	u16			io_class; | 
					
						
							| 
									
										
										
										
											2005-11-02 14:07:13 -08:00
										 |  |  | 	struct srp_host	       *srp_host; | 
					
						
							|  |  |  | 	struct Scsi_Host       *scsi_host; | 
					
						
							|  |  |  | 	char			target_name[32]; | 
					
						
							|  |  |  | 	unsigned int		scsi_id; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	struct ib_sa_path_rec	path; | 
					
						
							| 
									
										
										
										
											2007-05-06 21:18:11 -07:00
										 |  |  | 	__be16			orig_dgid[8]; | 
					
						
							| 
									
										
										
										
											2005-11-02 14:07:13 -08:00
										 |  |  | 	struct ib_sa_query     *path_query; | 
					
						
							|  |  |  | 	int			path_query_id; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	struct ib_cm_id	       *cm_id; | 
					
						
							| 
									
										
										
										
											2010-02-02 19:23:54 +00:00
										 |  |  | 	struct ib_cq	       *recv_cq; | 
					
						
							|  |  |  | 	struct ib_cq	       *send_cq; | 
					
						
							| 
									
										
										
										
											2005-11-02 14:07:13 -08:00
										 |  |  | 	struct ib_qp	       *qp; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	int			max_ti_iu_len; | 
					
						
							|  |  |  | 	s32			req_lim; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-06-17 20:37:33 -07:00
										 |  |  | 	int			zero_req_lim; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-11-02 14:07:13 -08:00
										 |  |  | 	unsigned		rx_head; | 
					
						
							|  |  |  | 	struct srp_iu	       *rx_ring[SRP_RQ_SIZE]; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	unsigned		tx_head; | 
					
						
							|  |  |  | 	unsigned		tx_tail; | 
					
						
							|  |  |  | 	struct srp_iu	       *tx_ring[SRP_SQ_SIZE + 1]; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-05-09 10:50:28 -07:00
										 |  |  | 	struct list_head	free_reqs; | 
					
						
							| 
									
										
										
										
											2005-11-02 14:07:13 -08:00
										 |  |  | 	struct list_head	req_queue; | 
					
						
							|  |  |  | 	struct srp_request	req_ring[SRP_SQ_SIZE]; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	struct work_struct	work; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	struct list_head	list; | 
					
						
							|  |  |  | 	struct completion	done; | 
					
						
							|  |  |  | 	int			status; | 
					
						
							|  |  |  | 	enum srp_target_state	state; | 
					
						
							| 
									
										
										
										
											2007-01-16 17:26:22 +02:00
										 |  |  | 	int			qp_in_error; | 
					
						
							| 
									
										
										
										
											2005-11-02 14:07:13 -08:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | struct srp_iu { | 
					
						
							| 
									
										
										
										
											2006-12-12 14:30:55 -08:00
										 |  |  | 	u64			dma; | 
					
						
							| 
									
										
										
										
											2005-11-02 14:07:13 -08:00
										 |  |  | 	void		       *buf; | 
					
						
							|  |  |  | 	size_t			size; | 
					
						
							|  |  |  | 	enum dma_data_direction	direction; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #endif /* IB_SRP_H */
 |