1aef9ec39SRoland Dreier /* 2aef9ec39SRoland Dreier * Copyright (c) 2005 Cisco Systems. All rights reserved. 3aef9ec39SRoland Dreier * 4aef9ec39SRoland Dreier * This software is available to you under a choice of one of two 5aef9ec39SRoland Dreier * licenses. You may choose to be licensed under the terms of the GNU 6aef9ec39SRoland Dreier * General Public License (GPL) Version 2, available from the file 7aef9ec39SRoland Dreier * COPYING in the main directory of this source tree, or the 8aef9ec39SRoland Dreier * OpenIB.org BSD license below: 9aef9ec39SRoland Dreier * 10aef9ec39SRoland Dreier * Redistribution and use in source and binary forms, with or 11aef9ec39SRoland Dreier * without modification, are permitted provided that the following 12aef9ec39SRoland Dreier * conditions are met: 13aef9ec39SRoland Dreier * 14aef9ec39SRoland Dreier * - Redistributions of source code must retain the above 15aef9ec39SRoland Dreier * copyright notice, this list of conditions and the following 16aef9ec39SRoland Dreier * disclaimer. 17aef9ec39SRoland Dreier * 18aef9ec39SRoland Dreier * - Redistributions in binary form must reproduce the above 19aef9ec39SRoland Dreier * copyright notice, this list of conditions and the following 20aef9ec39SRoland Dreier * disclaimer in the documentation and/or other materials 21aef9ec39SRoland Dreier * provided with the distribution. 22aef9ec39SRoland Dreier * 23aef9ec39SRoland Dreier * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 24aef9ec39SRoland Dreier * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 25aef9ec39SRoland Dreier * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 26aef9ec39SRoland Dreier * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS 27aef9ec39SRoland Dreier * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN 28aef9ec39SRoland Dreier * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 29aef9ec39SRoland Dreier * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 30aef9ec39SRoland Dreier * SOFTWARE. 31aef9ec39SRoland Dreier * 32aef9ec39SRoland Dreier * $Id: ib_srp.h 3932 2005-11-01 17:19:29Z roland $ 33aef9ec39SRoland Dreier */ 34aef9ec39SRoland Dreier 35aef9ec39SRoland Dreier #ifndef IB_SRP_H 36aef9ec39SRoland Dreier #define IB_SRP_H 37aef9ec39SRoland Dreier 38aef9ec39SRoland Dreier #include <linux/types.h> 39aef9ec39SRoland Dreier #include <linux/list.h> 408e9e5f4fSIngo Molnar #include <linux/mutex.h> 41cf368713SRoland Dreier #include <linux/scatterlist.h> 42aef9ec39SRoland Dreier 43aef9ec39SRoland Dreier #include <scsi/scsi_host.h> 44aef9ec39SRoland Dreier #include <scsi/scsi_cmnd.h> 45aef9ec39SRoland Dreier 46aef9ec39SRoland Dreier #include <rdma/ib_verbs.h> 47aef9ec39SRoland Dreier #include <rdma/ib_sa.h> 48aef9ec39SRoland Dreier #include <rdma/ib_cm.h> 49aef9ec39SRoland Dreier 50aef9ec39SRoland Dreier enum { 51aef9ec39SRoland Dreier SRP_PATH_REC_TIMEOUT_MS = 1000, 52aef9ec39SRoland Dreier SRP_ABORT_TIMEOUT_MS = 5000, 53aef9ec39SRoland Dreier 54aef9ec39SRoland Dreier SRP_PORT_REDIRECT = 1, 55aef9ec39SRoland Dreier SRP_DLID_REDIRECT = 2, 56aef9ec39SRoland Dreier 575f068992SRoland Dreier SRP_MAX_LUN = 512, 58aef9ec39SRoland Dreier SRP_MAX_IU_LEN = 256, 59aef9ec39SRoland Dreier 60aef9ec39SRoland Dreier SRP_RQ_SHIFT = 6, 61aef9ec39SRoland Dreier SRP_RQ_SIZE = 1 << SRP_RQ_SHIFT, 62aef9ec39SRoland Dreier SRP_SQ_SIZE = SRP_RQ_SIZE - 1, 63aef9ec39SRoland Dreier SRP_CQ_SIZE = SRP_SQ_SIZE + SRP_RQ_SIZE, 64aef9ec39SRoland Dreier 65aef9ec39SRoland Dreier SRP_TAG_TSK_MGMT = 1 << (SRP_RQ_SHIFT + 1) 66aef9ec39SRoland Dreier }; 67aef9ec39SRoland Dreier 68aef9ec39SRoland Dreier #define SRP_OP_RECV (1 << 31) 69aef9ec39SRoland Dreier #define SRP_MAX_INDIRECT ((SRP_MAX_IU_LEN - \ 70aef9ec39SRoland Dreier sizeof (struct srp_cmd) - \ 71aef9ec39SRoland Dreier sizeof (struct srp_indirect_buf)) / 16) 72aef9ec39SRoland Dreier 73aef9ec39SRoland Dreier enum srp_target_state { 74aef9ec39SRoland Dreier SRP_TARGET_LIVE, 75aef9ec39SRoland Dreier SRP_TARGET_CONNECTING, 76aef9ec39SRoland Dreier SRP_TARGET_DEAD, 77aef9ec39SRoland Dreier SRP_TARGET_REMOVED 78aef9ec39SRoland Dreier }; 79aef9ec39SRoland Dreier 80aef9ec39SRoland Dreier struct srp_host { 81aef9ec39SRoland Dreier u8 initiator_port_id[16]; 82aef9ec39SRoland Dreier struct ib_device *dev; 83aef9ec39SRoland Dreier u8 port; 84aef9ec39SRoland Dreier struct ib_pd *pd; 85aef9ec39SRoland Dreier struct ib_mr *mr; 86aef9ec39SRoland Dreier struct class_device class_dev; 87aef9ec39SRoland Dreier struct list_head target_list; 888e9e5f4fSIngo Molnar struct mutex target_mutex; 89aef9ec39SRoland Dreier struct completion released; 90aef9ec39SRoland Dreier struct list_head list; 91aef9ec39SRoland Dreier }; 92aef9ec39SRoland Dreier 93aef9ec39SRoland Dreier struct srp_request { 94aef9ec39SRoland Dreier struct list_head list; 95aef9ec39SRoland Dreier struct scsi_cmnd *scmnd; 96aef9ec39SRoland Dreier struct srp_iu *cmd; 97aef9ec39SRoland Dreier struct srp_iu *tsk_mgmt; 98cf368713SRoland Dreier /* 99cf368713SRoland Dreier * Fake scatterlist used when scmnd->use_sg==0. Can be killed 100cf368713SRoland Dreier * when the SCSI midlayer no longer generates non-SG commands. 101cf368713SRoland Dreier */ 102cf368713SRoland Dreier struct scatterlist fake_sg; 103aef9ec39SRoland Dreier struct completion done; 104d945e1dfSRoland Dreier short index; 105aef9ec39SRoland Dreier u8 cmd_done; 106aef9ec39SRoland Dreier u8 tsk_status; 107aef9ec39SRoland Dreier }; 108aef9ec39SRoland Dreier 109aef9ec39SRoland Dreier struct srp_target_port { 110aef9ec39SRoland Dreier __be64 id_ext; 111aef9ec39SRoland Dreier __be64 ioc_guid; 112aef9ec39SRoland Dreier __be64 service_id; 113aef9ec39SRoland Dreier struct srp_host *srp_host; 114aef9ec39SRoland Dreier struct Scsi_Host *scsi_host; 115aef9ec39SRoland Dreier char target_name[32]; 116aef9ec39SRoland Dreier unsigned int scsi_id; 117aef9ec39SRoland Dreier 118aef9ec39SRoland Dreier struct ib_sa_path_rec path; 119aef9ec39SRoland Dreier struct ib_sa_query *path_query; 120aef9ec39SRoland Dreier int path_query_id; 121aef9ec39SRoland Dreier 122aef9ec39SRoland Dreier struct ib_cm_id *cm_id; 123aef9ec39SRoland Dreier struct ib_cq *cq; 124aef9ec39SRoland Dreier struct ib_qp *qp; 125aef9ec39SRoland Dreier 126aef9ec39SRoland Dreier int max_ti_iu_len; 127aef9ec39SRoland Dreier s32 req_lim; 128aef9ec39SRoland Dreier 129aef9ec39SRoland Dreier unsigned rx_head; 130aef9ec39SRoland Dreier struct srp_iu *rx_ring[SRP_RQ_SIZE]; 131aef9ec39SRoland Dreier 132aef9ec39SRoland Dreier unsigned tx_head; 133aef9ec39SRoland Dreier unsigned tx_tail; 134aef9ec39SRoland Dreier struct srp_iu *tx_ring[SRP_SQ_SIZE + 1]; 135aef9ec39SRoland Dreier 136d945e1dfSRoland Dreier struct list_head free_reqs; 137aef9ec39SRoland Dreier struct list_head req_queue; 138aef9ec39SRoland Dreier struct srp_request req_ring[SRP_SQ_SIZE]; 139aef9ec39SRoland Dreier 140aef9ec39SRoland Dreier struct work_struct work; 141aef9ec39SRoland Dreier 142aef9ec39SRoland Dreier struct list_head list; 143aef9ec39SRoland Dreier struct completion done; 144aef9ec39SRoland Dreier int status; 145aef9ec39SRoland Dreier enum srp_target_state state; 146aef9ec39SRoland Dreier }; 147aef9ec39SRoland Dreier 148aef9ec39SRoland Dreier struct srp_iu { 149aef9ec39SRoland Dreier dma_addr_t dma; 150aef9ec39SRoland Dreier void *buf; 151aef9ec39SRoland Dreier size_t size; 152aef9ec39SRoland Dreier enum dma_data_direction direction; 153aef9ec39SRoland Dreier }; 154aef9ec39SRoland Dreier 155aef9ec39SRoland Dreier #endif /* IB_SRP_H */ 156