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> 49f5358a17SRoland Dreier #include <rdma/ib_fmr_pool.h> 50aef9ec39SRoland Dreier 51aef9ec39SRoland Dreier enum { 52aef9ec39SRoland Dreier SRP_PATH_REC_TIMEOUT_MS = 1000, 53aef9ec39SRoland Dreier SRP_ABORT_TIMEOUT_MS = 5000, 54aef9ec39SRoland Dreier 55aef9ec39SRoland Dreier SRP_PORT_REDIRECT = 1, 56aef9ec39SRoland Dreier SRP_DLID_REDIRECT = 2, 57aef9ec39SRoland Dreier 585f068992SRoland Dreier SRP_MAX_LUN = 512, 5974b0a15bSVu Pham SRP_DEF_SG_TABLESIZE = 12, 60aef9ec39SRoland Dreier 61aef9ec39SRoland Dreier SRP_RQ_SHIFT = 6, 62aef9ec39SRoland Dreier SRP_RQ_SIZE = 1 << SRP_RQ_SHIFT, 63aef9ec39SRoland Dreier SRP_SQ_SIZE = SRP_RQ_SIZE - 1, 64aef9ec39SRoland Dreier SRP_CQ_SIZE = SRP_SQ_SIZE + SRP_RQ_SIZE, 65aef9ec39SRoland Dreier 66f5358a17SRoland Dreier SRP_TAG_TSK_MGMT = 1 << (SRP_RQ_SHIFT + 1), 67f5358a17SRoland Dreier 68f5358a17SRoland Dreier SRP_FMR_SIZE = 256, 69f5358a17SRoland Dreier SRP_FMR_POOL_SIZE = 1024, 70f5358a17SRoland Dreier SRP_FMR_DIRTY_SIZE = SRP_FMR_POOL_SIZE / 4 71aef9ec39SRoland Dreier }; 72aef9ec39SRoland Dreier 73aef9ec39SRoland Dreier #define SRP_OP_RECV (1 << 31) 74aef9ec39SRoland Dreier 75aef9ec39SRoland Dreier enum srp_target_state { 76aef9ec39SRoland Dreier SRP_TARGET_LIVE, 77aef9ec39SRoland Dreier SRP_TARGET_CONNECTING, 78aef9ec39SRoland Dreier SRP_TARGET_DEAD, 79aef9ec39SRoland Dreier SRP_TARGET_REMOVED 80aef9ec39SRoland Dreier }; 81aef9ec39SRoland Dreier 82f5358a17SRoland Dreier struct srp_device { 83f5358a17SRoland Dreier struct list_head dev_list; 84aef9ec39SRoland Dreier struct ib_device *dev; 85aef9ec39SRoland Dreier struct ib_pd *pd; 86aef9ec39SRoland Dreier struct ib_mr *mr; 87f5358a17SRoland Dreier struct ib_fmr_pool *fmr_pool; 88f5358a17SRoland Dreier int fmr_page_shift; 89f5358a17SRoland Dreier int fmr_page_size; 90bf628dc2SRoland Dreier u64 fmr_page_mask; 91f5358a17SRoland Dreier }; 92f5358a17SRoland Dreier 93f5358a17SRoland Dreier struct srp_host { 94f5358a17SRoland Dreier struct srp_device *dev; 95f5358a17SRoland Dreier u8 port; 96aef9ec39SRoland Dreier struct class_device class_dev; 97aef9ec39SRoland Dreier struct list_head target_list; 98b3589fd4SMatthew Wilcox spinlock_t target_lock; 99aef9ec39SRoland Dreier struct completion released; 100aef9ec39SRoland Dreier struct list_head list; 101aef9ec39SRoland Dreier }; 102aef9ec39SRoland Dreier 103aef9ec39SRoland Dreier struct srp_request { 104aef9ec39SRoland Dreier struct list_head list; 105aef9ec39SRoland Dreier struct scsi_cmnd *scmnd; 106aef9ec39SRoland Dreier struct srp_iu *cmd; 107aef9ec39SRoland Dreier struct srp_iu *tsk_mgmt; 108f5358a17SRoland Dreier struct ib_pool_fmr *fmr; 109cf368713SRoland Dreier /* 110cf368713SRoland Dreier * Fake scatterlist used when scmnd->use_sg==0. Can be killed 111cf368713SRoland Dreier * when the SCSI midlayer no longer generates non-SG commands. 112cf368713SRoland Dreier */ 113cf368713SRoland Dreier struct scatterlist fake_sg; 114aef9ec39SRoland Dreier struct completion done; 115d945e1dfSRoland Dreier short index; 116aef9ec39SRoland Dreier u8 cmd_done; 117aef9ec39SRoland Dreier u8 tsk_status; 118aef9ec39SRoland Dreier }; 119aef9ec39SRoland Dreier 120aef9ec39SRoland Dreier struct srp_target_port { 121aef9ec39SRoland Dreier __be64 id_ext; 122aef9ec39SRoland Dreier __be64 ioc_guid; 123aef9ec39SRoland Dreier __be64 service_id; 12401cb9bcbSIshai Rabinovitz __be64 initiator_ext; 1250c0450dbSRamachandra K u16 io_class; 126aef9ec39SRoland Dreier struct srp_host *srp_host; 127aef9ec39SRoland Dreier struct Scsi_Host *scsi_host; 128aef9ec39SRoland Dreier char target_name[32]; 129aef9ec39SRoland Dreier unsigned int scsi_id; 130aef9ec39SRoland Dreier 131aef9ec39SRoland Dreier struct ib_sa_path_rec path; 132aef9ec39SRoland Dreier struct ib_sa_query *path_query; 133aef9ec39SRoland Dreier int path_query_id; 134aef9ec39SRoland Dreier 135aef9ec39SRoland Dreier struct ib_cm_id *cm_id; 136aef9ec39SRoland Dreier struct ib_cq *cq; 137aef9ec39SRoland Dreier struct ib_qp *qp; 138aef9ec39SRoland Dreier 139aef9ec39SRoland Dreier int max_ti_iu_len; 140aef9ec39SRoland Dreier s32 req_lim; 141aef9ec39SRoland Dreier 1426bfa24faSRoland Dreier int zero_req_lim; 1436bfa24faSRoland Dreier 144aef9ec39SRoland Dreier unsigned rx_head; 145aef9ec39SRoland Dreier struct srp_iu *rx_ring[SRP_RQ_SIZE]; 146aef9ec39SRoland Dreier 147aef9ec39SRoland Dreier unsigned tx_head; 148aef9ec39SRoland Dreier unsigned tx_tail; 149aef9ec39SRoland Dreier struct srp_iu *tx_ring[SRP_SQ_SIZE + 1]; 150aef9ec39SRoland Dreier 151d945e1dfSRoland Dreier struct list_head free_reqs; 152aef9ec39SRoland Dreier struct list_head req_queue; 153aef9ec39SRoland Dreier struct srp_request req_ring[SRP_SQ_SIZE]; 154aef9ec39SRoland Dreier 155aef9ec39SRoland Dreier struct work_struct work; 156aef9ec39SRoland Dreier 157aef9ec39SRoland Dreier struct list_head list; 158aef9ec39SRoland Dreier struct completion done; 159aef9ec39SRoland Dreier int status; 160aef9ec39SRoland Dreier enum srp_target_state state; 161aef9ec39SRoland Dreier }; 162aef9ec39SRoland Dreier 163aef9ec39SRoland Dreier struct srp_iu { 16485507bccSRalph Campbell u64 dma; 165aef9ec39SRoland Dreier void *buf; 166aef9ec39SRoland Dreier size_t size; 167aef9ec39SRoland Dreier enum dma_data_direction direction; 168aef9ec39SRoland Dreier }; 169aef9ec39SRoland Dreier 170aef9ec39SRoland Dreier #endif /* IB_SRP_H */ 171