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#define ISER_RX_PAD_SIZE        (ISCSI_DEF_MAX_RECV_SEG_LEN + 4096 - \
  63                (ISER_RX_PAYLOAD_SIZE + sizeof(u64) + sizeof(struct ib_sge) + \
  64                 sizeof(struct ib_cqe) + sizeof(bool)))
  65
  66#define ISCSI_ISER_SG_TABLESIZE         256
  67
  68enum isert_desc_type {
  69        ISCSI_TX_CONTROL,
  70        ISCSI_TX_DATAIN
  71};
  72
  73enum iser_conn_state {
  74        ISER_CONN_INIT,
  75        ISER_CONN_UP,
  76        ISER_CONN_BOUND,
  77        ISER_CONN_FULL_FEATURE,
  78        ISER_CONN_TERMINATING,
  79        ISER_CONN_DOWN,
  80};
  81
  82struct iser_rx_desc {
  83        struct iser_ctrl iser_header;
  84        struct iscsi_hdr iscsi_header;
  85        char            data[ISCSI_DEF_MAX_RECV_SEG_LEN];
  86        u64             dma_addr;
  87        struct ib_sge   rx_sg;
  88        struct ib_cqe   rx_cqe;
  89        bool            in_use;
  90        char            pad[ISER_RX_PAD_SIZE];
  91} __packed;
  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
  98struct iser_tx_desc {
  99        struct iser_ctrl iser_header;
 100        struct iscsi_hdr iscsi_header;
 101        enum isert_desc_type type;
 102        u64             dma_addr;
 103        struct ib_sge   tx_sg[2];
 104        struct ib_cqe   tx_cqe;
 105        int             num_sge;
 106        struct ib_send_wr send_wr;
 107} __packed;
 108
 109static inline struct iser_tx_desc *cqe_to_tx_desc(struct ib_cqe *cqe)
 110{
 111        return container_of(cqe, struct iser_tx_desc, tx_cqe);
 112}
 113
 114struct isert_cmd {
 115        uint32_t                read_stag;
 116        uint32_t                write_stag;
 117        uint64_t                read_va;
 118        uint64_t                write_va;
 119        uint32_t                inv_rkey;
 120        u64                     pdu_buf_dma;
 121        u32                     pdu_buf_len;
 122        struct isert_conn       *conn;
 123        struct iscsi_cmd        *iscsi_cmd;
 124        struct iser_tx_desc     tx_desc;
 125        struct iser_rx_desc     *rx_desc;
 126        struct rdma_rw_ctx      rw;
 127        struct work_struct      comp_work;
 128        struct scatterlist      sg;
 129        bool                    ctx_init_done;
 130};
 131
 132static inline struct isert_cmd *tx_desc_to_cmd(struct iser_tx_desc *desc)
 133{
 134        return container_of(desc, struct isert_cmd, tx_desc);
 135}
 136
 137struct isert_device;
 138
 139struct isert_conn {
 140        enum iser_conn_state    state;
 141        u32                     responder_resources;
 142        u32                     initiator_depth;
 143        bool                    pi_support;
 144        struct iser_rx_desc     *login_req_buf;
 145        char                    *login_rsp_buf;
 146        u64                     login_req_dma;
 147        int                     login_req_len;
 148        u64                     login_rsp_dma;
 149        struct iser_rx_desc     *rx_descs;
 150        struct ib_recv_wr       rx_wr[ISERT_QP_MAX_RECV_DTOS];
 151        struct iscsi_conn       *conn;
 152        struct list_head        node;
 153        struct completion       login_comp;
 154        struct completion       login_req_comp;
 155        struct iser_tx_desc     login_tx_desc;
 156        struct rdma_cm_id       *cm_id;
 157        struct ib_qp            *qp;
 158        struct isert_device     *device;
 159        struct mutex            mutex;
 160        struct kref             kref;
 161        struct work_struct      release_work;
 162        bool                    logout_posted;
 163        bool                    snd_w_inv;
 164        wait_queue_head_t       rem_wait;
 165        bool                    dev_removed;
 166};
 167
 168#define ISERT_MAX_CQ 64
 169
 170/**
 171 * struct isert_comp - iSER completion context
 172 *
 173 * @device:     pointer to device handle
 174 * @cq:         completion queue
 175 * @active_qps: Number of active QPs attached
 176 *              to completion context
 177 */
 178struct isert_comp {
 179        struct isert_device     *device;
 180        struct ib_cq            *cq;
 181        int                      active_qps;
 182};
 183
 184struct isert_device {
 185        bool                    pi_capable;
 186        int                     refcount;
 187        struct ib_device        *ib_device;
 188        struct ib_pd            *pd;
 189        struct isert_comp       *comps;
 190        int                     comps_used;
 191        struct list_head        dev_node;
 192};
 193
 194struct isert_np {
 195        struct iscsi_np         *np;
 196        struct semaphore        sem;
 197        struct rdma_cm_id       *cm_id;
 198        struct mutex            mutex;
 199        struct list_head        accepted;
 200        struct list_head        pending;
 201};
 202