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/* Default I/O size is 1MB */
  69#define ISCSI_ISER_DEF_SG_TABLESIZE 256
  70
  71/* Minimum I/O size is 512KB */
  72#define ISCSI_ISER_MIN_SG_TABLESIZE 128
  73
  74/* Maximum support is 16MB I/O size */
  75#define ISCSI_ISER_MAX_SG_TABLESIZE     4096
  76
  77enum isert_desc_type {
  78        ISCSI_TX_CONTROL,
  79        ISCSI_TX_DATAIN
  80};
  81
  82enum iser_conn_state {
  83        ISER_CONN_INIT,
  84        ISER_CONN_UP,
  85        ISER_CONN_BOUND,
  86        ISER_CONN_FULL_FEATURE,
  87        ISER_CONN_TERMINATING,
  88        ISER_CONN_DOWN,
  89};
  90
  91struct iser_rx_desc {
  92        char            buf[ISER_RX_SIZE];
  93        u64             dma_addr;
  94        struct ib_sge   rx_sg;
  95        struct ib_cqe   rx_cqe;
  96        bool            in_use;
  97};
  98
  99static inline struct iser_rx_desc *cqe_to_rx_desc(struct ib_cqe *cqe)
 100{
 101        return container_of(cqe, struct iser_rx_desc, rx_cqe);
 102}
 103
 104static void *isert_get_iser_hdr(struct iser_rx_desc *desc)
 105{
 106        return PTR_ALIGN(desc->buf + ISER_HEADERS_LEN, 512) - ISER_HEADERS_LEN;
 107}
 108
 109static size_t isert_get_hdr_offset(struct iser_rx_desc *desc)
 110{
 111        return isert_get_iser_hdr(desc) - (void *)desc->buf;
 112}
 113
 114static void *isert_get_iscsi_hdr(struct iser_rx_desc *desc)
 115{
 116        return isert_get_iser_hdr(desc) + sizeof(struct iser_ctrl);
 117}
 118
 119static void *isert_get_data(struct iser_rx_desc *desc)
 120{
 121        void *data = isert_get_iser_hdr(desc) + ISER_HEADERS_LEN;
 122
 123        WARN_ON((uintptr_t)data & 511);
 124        return data;
 125}
 126
 127struct iser_tx_desc {
 128        struct iser_ctrl iser_header;
 129        struct iscsi_hdr iscsi_header;
 130        enum isert_desc_type type;
 131        u64             dma_addr;
 132        struct ib_sge   tx_sg[2];
 133        struct ib_cqe   tx_cqe;
 134        int             num_sge;
 135        struct ib_send_wr send_wr;
 136} __packed;
 137
 138static inline struct iser_tx_desc *cqe_to_tx_desc(struct ib_cqe *cqe)
 139{
 140        return container_of(cqe, struct iser_tx_desc, tx_cqe);
 141}
 142
 143struct isert_cmd {
 144        uint32_t                read_stag;
 145        uint32_t                write_stag;
 146        uint64_t                read_va;
 147        uint64_t                write_va;
 148        uint32_t                inv_rkey;
 149        u64                     pdu_buf_dma;
 150        u32                     pdu_buf_len;
 151        struct isert_conn       *conn;
 152        struct iscsi_cmd        *iscsi_cmd;
 153        struct iser_tx_desc     tx_desc;
 154        struct iser_rx_desc     *rx_desc;
 155        struct rdma_rw_ctx      rw;
 156        struct work_struct      comp_work;
 157        struct scatterlist      sg;
 158        bool                    ctx_init_done;
 159};
 160
 161static inline struct isert_cmd *tx_desc_to_cmd(struct iser_tx_desc *desc)
 162{
 163        return container_of(desc, struct isert_cmd, tx_desc);
 164}
 165
 166struct isert_device;
 167
 168struct isert_conn {
 169        enum iser_conn_state    state;
 170        u32                     responder_resources;
 171        u32                     initiator_depth;
 172        bool                    pi_support;
 173        struct iser_rx_desc     *login_desc;
 174        char                    *login_rsp_buf;
 175        int                     login_req_len;
 176        u64                     login_rsp_dma;
 177        struct iser_rx_desc     *rx_descs;
 178        struct ib_recv_wr       rx_wr[ISERT_QP_MAX_RECV_DTOS];
 179        struct iscsi_conn       *conn;
 180        struct list_head        node;
 181        struct completion       login_comp;
 182        struct completion       login_req_comp;
 183        struct iser_tx_desc     login_tx_desc;
 184        struct rdma_cm_id       *cm_id;
 185        struct ib_qp            *qp;
 186        struct ib_cq            *cq;
 187        u32                     cq_size;
 188        struct isert_device     *device;
 189        struct mutex            mutex;
 190        struct kref             kref;
 191        struct work_struct      release_work;
 192        bool                    logout_posted;
 193        bool                    snd_w_inv;
 194        wait_queue_head_t       rem_wait;
 195        bool                    dev_removed;
 196};
 197
 198struct isert_device {
 199        bool                    pi_capable;
 200        int                     refcount;
 201        struct ib_device        *ib_device;
 202        struct ib_pd            *pd;
 203        struct isert_comp       *comps;
 204        int                     comps_used;
 205        struct list_head        dev_node;
 206};
 207
 208struct isert_np {
 209        struct iscsi_np         *np;
 210        struct semaphore        sem;
 211        struct rdma_cm_id       *cm_id;
 212        struct mutex            mutex;
 213        struct list_head        accepted;
 214        struct list_head        pending;
 215};
 216