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