linux/drivers/scsi/qedi/qedi_iscsi.h
<<
>>
Prefs
   1/*
   2 * QLogic iSCSI Offload Driver
   3 * Copyright (c) 2016 Cavium Inc.
   4 *
   5 * This software is available under the terms of the GNU General Public License
   6 * (GPL) Version 2, available from the file COPYING in the main directory of
   7 * this source tree.
   8 */
   9
  10#ifndef _QEDI_ISCSI_H_
  11#define _QEDI_ISCSI_H_
  12
  13#include <linux/socket.h>
  14#include <linux/completion.h>
  15#include "qedi.h"
  16
  17#define ISCSI_MAX_SESS_PER_HBA  4096
  18
  19#define DEF_KA_TIMEOUT          7200000
  20#define DEF_KA_INTERVAL         10000
  21#define DEF_KA_MAX_PROBE_COUNT  10
  22#define DEF_TOS                 0
  23#define DEF_TTL                 0xfe
  24#define DEF_SND_SEQ_SCALE       0
  25#define DEF_RCV_BUF             0xffff
  26#define DEF_SND_BUF             0xffff
  27#define DEF_SEED                0
  28#define DEF_MAX_RT_TIME         8000
  29#define DEF_MAX_DA_COUNT        2
  30#define DEF_SWS_TIMER           1000
  31#define DEF_MAX_CWND            2
  32#define DEF_PATH_MTU            1500
  33#define DEF_MSS                 1460
  34#define DEF_LL2_MTU             1560
  35#define JUMBO_MTU               9000
  36
  37#define MIN_MTU         576 /* rfc 793 */
  38#define IPV4_HDR_LEN    20
  39#define IPV6_HDR_LEN    40
  40#define TCP_HDR_LEN     20
  41#define TCP_OPTION_LEN  12
  42#define VLAN_LEN         4
  43
  44enum {
  45        EP_STATE_IDLE                   = 0x0,
  46        EP_STATE_ACQRCONN_START         = 0x1,
  47        EP_STATE_ACQRCONN_COMPL         = 0x2,
  48        EP_STATE_OFLDCONN_START         = 0x4,
  49        EP_STATE_OFLDCONN_COMPL         = 0x8,
  50        EP_STATE_DISCONN_START          = 0x10,
  51        EP_STATE_DISCONN_COMPL          = 0x20,
  52        EP_STATE_CLEANUP_START          = 0x40,
  53        EP_STATE_CLEANUP_CMPL           = 0x80,
  54        EP_STATE_TCP_FIN_RCVD           = 0x100,
  55        EP_STATE_TCP_RST_RCVD           = 0x200,
  56        EP_STATE_LOGOUT_SENT            = 0x400,
  57        EP_STATE_LOGOUT_RESP_RCVD       = 0x800,
  58        EP_STATE_CLEANUP_FAILED         = 0x1000,
  59        EP_STATE_OFLDCONN_FAILED        = 0x2000,
  60        EP_STATE_CONNECT_FAILED         = 0x4000,
  61        EP_STATE_DISCONN_TIMEDOUT       = 0x8000,
  62};
  63
  64struct qedi_conn;
  65
  66struct qedi_endpoint {
  67        struct qedi_ctx *qedi;
  68        u32 dst_addr[4];
  69        u32 src_addr[4];
  70        u16 src_port;
  71        u16 dst_port;
  72        u16 vlan_id;
  73        u16 pmtu;
  74        u8 src_mac[ETH_ALEN];
  75        u8 dst_mac[ETH_ALEN];
  76        u8 ip_type;
  77        int state;
  78        wait_queue_head_t ofld_wait;
  79        wait_queue_head_t tcp_ofld_wait;
  80        u32 iscsi_cid;
  81        /* identifier of the connection from qed */
  82        u32 handle;
  83        u32 fw_cid;
  84        void __iomem *p_doorbell;
  85
  86        /* Send queue management */
  87        struct iscsi_wqe *sq;
  88        dma_addr_t sq_dma;
  89
  90        u16 sq_prod_idx;
  91        u16 fw_sq_prod_idx;
  92        u16 sq_con_idx;
  93        u32 sq_mem_size;
  94
  95        void *sq_pbl;
  96        dma_addr_t sq_pbl_dma;
  97        u32 sq_pbl_size;
  98        struct qedi_conn *conn;
  99        struct work_struct offload_work;
 100};
 101
 102#define QEDI_SQ_WQES_MIN        16
 103
 104struct qedi_io_bdt {
 105        struct scsi_sge *sge_tbl;
 106        dma_addr_t sge_tbl_dma;
 107        u16 sge_valid;
 108};
 109
 110/**
 111 * struct generic_pdu_resc - login pdu resource structure
 112 *
 113 * @req_buf:            driver buffer used to stage payload associated with
 114 *                      the login request
 115 * @req_dma_addr:       dma address for iscsi login request payload buffer
 116 * @req_buf_size:       actual login request payload length
 117 * @req_wr_ptr:         pointer into login request buffer when next data is
 118 *                      to be written
 119 * @resp_hdr:           iscsi header where iscsi login response header is to
 120 *                      be recreated
 121 * @resp_buf:           buffer to stage login response payload
 122 * @resp_dma_addr:      login response payload buffer dma address
 123 * @resp_buf_size:      login response paylod length
 124 * @resp_wr_ptr:        pointer into login response buffer when next data is
 125 *                      to be written
 126 * @req_bd_tbl:         iscsi login request payload BD table
 127 * @req_bd_dma:         login request BD table dma address
 128 * @resp_bd_tbl:        iscsi login response payload BD table
 129 * @resp_bd_dma:        login request BD table dma address
 130 *
 131 * following structure defines buffer info for generic pdus such as iSCSI Login,
 132 *      Logout and NOP
 133 */
 134struct generic_pdu_resc {
 135        char *req_buf;
 136        dma_addr_t req_dma_addr;
 137        u32 req_buf_size;
 138        char *req_wr_ptr;
 139        struct iscsi_hdr resp_hdr;
 140        char *resp_buf;
 141        dma_addr_t resp_dma_addr;
 142        u32 resp_buf_size;
 143        char *resp_wr_ptr;
 144        char *req_bd_tbl;
 145        dma_addr_t req_bd_dma;
 146        char *resp_bd_tbl;
 147        dma_addr_t resp_bd_dma;
 148};
 149
 150struct qedi_conn {
 151        struct iscsi_cls_conn *cls_conn;
 152        struct qedi_ctx *qedi;
 153        struct qedi_endpoint *ep;
 154        struct list_head active_cmd_list;
 155        spinlock_t list_lock;           /* internal conn lock */
 156        u32 active_cmd_count;
 157        u32 cmd_cleanup_req;
 158        u32 cmd_cleanup_cmpl;
 159
 160        u32 iscsi_conn_id;
 161        int itt;
 162        int abrt_conn;
 163#define QEDI_CID_RESERVED       0x5AFF
 164        u32 fw_cid;
 165        /*
 166         * Buffer for login negotiation process
 167         */
 168        struct generic_pdu_resc gen_pdu;
 169
 170        struct list_head tmf_work_list;
 171        wait_queue_head_t wait_queue;
 172        spinlock_t tmf_work_lock;       /* tmf work lock */
 173        unsigned long flags;
 174#define QEDI_CONN_FW_CLEANUP    1
 175};
 176
 177struct qedi_cmd {
 178        struct list_head io_cmd;
 179        bool io_cmd_in_list;
 180        struct iscsi_hdr hdr;
 181        struct qedi_conn *conn;
 182        struct scsi_cmnd *scsi_cmd;
 183        struct scatterlist *sg;
 184        struct qedi_io_bdt io_tbl;
 185        struct e4_iscsi_task_context request;
 186        unsigned char *sense_buffer;
 187        dma_addr_t sense_buffer_dma;
 188        u16 task_id;
 189
 190        /* field populated for tmf work queue */
 191        struct iscsi_task *task;
 192        struct work_struct tmf_work;
 193        int state;
 194#define CLEANUP_WAIT    1
 195#define CLEANUP_RECV    2
 196#define CLEANUP_WAIT_FAILED     3
 197#define CLEANUP_NOT_REQUIRED    4
 198#define LUN_RESET_RESPONSE_RECEIVED     5
 199#define RESPONSE_RECEIVED       6
 200
 201        int type;
 202#define TYPEIO          1
 203#define TYPERESET       2
 204
 205        struct qedi_work_map *list_tmf_work;
 206        /* slowpath management */
 207        bool use_slowpath;
 208
 209        struct iscsi_tm_rsp *tmf_resp_buf;
 210        struct qedi_work cqe_work;
 211};
 212
 213struct qedi_work_map {
 214        struct list_head list;
 215        struct qedi_cmd *qedi_cmd;
 216        int rtid;
 217
 218        int state;
 219#define QEDI_WORK_QUEUED        1
 220#define QEDI_WORK_SCHEDULED     2
 221#define QEDI_WORK_EXIT          3
 222
 223        struct work_struct *ptr_tmf_work;
 224};
 225
 226struct qedi_boot_target {
 227        char ip_addr[64];
 228        char iscsi_name[255];
 229        u32 ipv6_en;
 230};
 231
 232#define qedi_set_itt(task_id, itt) ((u32)(((task_id) & 0xffff) | ((itt) << 16)))
 233#define qedi_get_itt(cqe) (cqe.iscsi_hdr.cmd.itt >> 16)
 234
 235#define QEDI_OFLD_WAIT_STATE(q) ((q)->state == EP_STATE_OFLDCONN_FAILED || \
 236                                (q)->state == EP_STATE_OFLDCONN_COMPL)
 237
 238#endif /* _QEDI_ISCSI_H_ */
 239