linux/drivers/infiniband/ulp/isert/ib_isert.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0 */
   2#include <linux/socket.h>
   3#include <linux/in.h>
   4#include <linux/in6.h>
   5#include <rdma/ib_verbs.h>
   6#include <rdma/rdma_cm.h>
   7#include <rdma/rw.h>
   8#include <scsi/iser.h>
   9
  10
  11#define DRV_NAME        "isert"
  12#define PFX             DRV_NAME ": "
  13
  14#define isert_dbg(fmt, arg...)                           \
  15        do {                                             \
  16                if (unlikely(isert_debug_level > 2))     \
  17                        printk(KERN_DEBUG PFX "%s: " fmt,\
  18                                __func__ , ## arg);      \
  19        } while (0)
  20
  21#define isert_warn(fmt, arg...)                         \
  22        do {                                            \
  23                if (unlikely(isert_debug_level > 0))    \
  24                        pr_warn(PFX "%s: " fmt,         \
  25                                __func__ , ## arg);     \
  26        } while (0)
  27
  28#define isert_info(fmt, arg...)                         \
  29        do {                                            \
  30                if (unlikely(isert_debug_level > 1))    \
  31                        pr_info(PFX "%s: " fmt,         \
  32                                __func__ , ## arg);     \
  33        } while (0)
  34
  35#define isert_err(fmt, arg...) \
  36        pr_err(PFX "%s: " fmt, __func__ , ## arg)
  37
  38/* Constant PDU lengths calculations */
  39#define ISER_HEADERS_LEN        (sizeof(struct iser_ctrl) + \
  40                                 sizeof(struct iscsi_hdr))
  41#define ISER_RX_PAYLOAD_SIZE    (ISER_HEADERS_LEN + ISCSI_DEF_MAX_RECV_SEG_LEN)
  42
  43/* QP settings */
  44/* Maximal bounds on received asynchronous PDUs */
  45#define ISERT_MAX_TX_MISC_PDUS  4 /* NOOP_IN(2) , ASYNC_EVENT(2)   */
  46
  47#define ISERT_MAX_RX_MISC_PDUS  6 /*
  48                                   * NOOP_OUT(2), TEXT(1),
  49                                   * SCSI_TMFUNC(2), LOGOUT(1)
  50                                   */
  51
  52#define ISCSI_DEF_XMIT_CMDS_MAX 128 /* from libiscsi.h, must be power of 2 */
  53
  54#define ISERT_QP_MAX_RECV_DTOS  (ISCSI_DEF_XMIT_CMDS_MAX)
  55
  56#define ISERT_MIN_POSTED_RX     (ISCSI_DEF_XMIT_CMDS_MAX >> 2)
  57
  58#define ISERT_QP_MAX_REQ_DTOS   (ISCSI_DEF_XMIT_CMDS_MAX +    \
  59                                ISERT_MAX_TX_MISC_PDUS  + \
  60                                ISERT_MAX_RX_MISC_PDUS)
  61
  62/*
  63 * RX size is default of 8k plus headers, but data needs to align to
  64 * 512 boundary, so use 1024 to have the extra space for alignment.
  65 */
  66#define ISER_RX_SIZE            (ISCSI_DEF_MAX_RECV_SEG_LEN + 1024)
  67
  68/* Maximum support is 16MB I/O size */
  69#define ISCSI_ISER_MAX_SG_TABLESIZE     4096
  70
  71enum isert_desc_type {
  72        ISCSI_TX_CONTROL,
  73        ISCSI_TX_DATAIN
  74};
  75
  76enum iser_conn_state {
  77        ISER_CONN_INIT,
  78        ISER_CONN_UP,
  79        ISER_CONN_BOUND,
  80        ISER_CONN_FULL_FEATURE,
  81        ISER_CONN_TERMINATING,
  82        ISER_CONN_DOWN,
  83};
  84
  85struct iser_rx_desc {
  86        char            buf[ISER_RX_SIZE];
  87        u64             dma_addr;
  88        struct ib_sge   rx_sg;
  89        struct ib_cqe   rx_cqe;
  90        bool            in_use;
  91};
  92
  93static inline struct iser_rx_desc *cqe_to_rx_desc(struct ib_cqe *cqe)
  94{
  95        return container_of(cqe, struct iser_rx_desc, rx_cqe);
  96}
  97
  98static void *isert_get_iser_hdr(struct iser_rx_desc *desc)
  99{
 100        return PTR_ALIGN(desc->buf + ISER_HEADERS_LEN, 512) - ISER_HEADERS_LEN;
 101}
 102
 103static size_t isert_get_hdr_offset(struct iser_rx_desc *desc)
 104{
 105        return isert_get_iser_hdr(desc) - (void *)desc->buf;
 106}
 107
 108static void *isert_get_iscsi_hdr(struct iser_rx_desc *desc)
 109{
 110        return isert_get_iser_hdr(desc) + sizeof(struct iser_ctrl);
 111}
 112
 113static void *isert_get_data(struct iser_rx_desc *desc)
 114{
 115        void *data = isert_get_iser_hdr(desc) + ISER_HEADERS_LEN;
 116
 117        WARN_ON((uintptr_t)data & 511);
 118        return data;
 119}
 120
 121struct iser_tx_desc {
 122        struct iser_ctrl iser_header;
 123        struct iscsi_hdr iscsi_header;
 124        enum isert_desc_type type;
 125        u64             dma_addr;
 126        struct ib_sge   tx_sg[2];
 127        struct ib_cqe   tx_cqe;
 128        int             num_sge;
 129        struct ib_send_wr send_wr;
 130} __packed;
 131
 132static inline struct iser_tx_desc *cqe_to_tx_desc(struct ib_cqe *cqe)
 133{
 134        return container_of(cqe, struct iser_tx_desc, tx_cqe);
 135}
 136
 137struct isert_cmd {
 138        uint32_t                read_stag;
 139        uint32_t                write_stag;
 140        uint64_t                read_va;
 141        uint64_t                write_va;
 142        uint32_t                inv_rkey;
 143        u64                     pdu_buf_dma;
 144        u32                     pdu_buf_len;
 145        struct isert_conn       *conn;
 146        struct iscsi_cmd        *iscsi_cmd;
 147        struct iser_tx_desc     tx_desc;
 148        struct iser_rx_desc     *rx_desc;
 149        struct rdma_rw_ctx      rw;
 150        struct work_struct      comp_work;
 151        struct scatterlist      sg;
 152        bool                    ctx_init_done;
 153};
 154
 155static inline struct isert_cmd *tx_desc_to_cmd(struct iser_tx_desc *desc)
 156{
 157        return container_of(desc, struct isert_cmd, tx_desc);
 158}
 159
 160struct isert_device;
 161
 162struct isert_conn {
 163        enum iser_conn_state    state;
 164        u32                     responder_resources;
 165        u32                     initiator_depth;
 166        bool                    pi_support;
 167        struct iser_rx_desc     *login_desc;
 168        char                    *login_rsp_buf;
 169        int                     login_req_len;
 170        u64                     login_rsp_dma;
 171        struct iser_rx_desc     *rx_descs;
 172        struct ib_recv_wr       rx_wr[ISERT_QP_MAX_RECV_DTOS];
 173        struct iscsi_conn       *conn;
 174        struct list_head        node;
 175        struct completion       login_comp;
 176        struct completion       login_req_comp;
 177        struct iser_tx_desc     login_tx_desc;
 178        struct rdma_cm_id       *cm_id;
 179        struct ib_qp            *qp;
 180        struct ib_cq            *cq;
 181        u32                     cq_size;
 182        struct isert_device     *device;
 183        struct mutex            mutex;
 184        struct kref             kref;
 185        struct work_struct      release_work;
 186        bool                    logout_posted;
 187        bool                    snd_w_inv;
 188        wait_queue_head_t       rem_wait;
 189        bool                    dev_removed;
 190};
 191
 192struct isert_device {
 193        bool                    pi_capable;
 194        int                     refcount;
 195        struct ib_device        *ib_device;
 196        struct ib_pd            *pd;
 197        struct isert_comp       *comps;
 198        int                     comps_used;
 199        struct list_head        dev_node;
 200};
 201
 202struct isert_np {
 203        struct iscsi_np         *np;
 204        struct semaphore        sem;
 205        struct rdma_cm_id       *cm_id;
 206        struct mutex            mutex;
 207        struct list_head        accepted;
 208        struct list_head        pending;
 209};
 210