linux/drivers/scsi/qedi/qedi_iscsi.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0-only */
   2/*
   3 * QLogic iSCSI Offload Driver
   4 * Copyright (c) 2016 Cavium Inc.
   5 */
   6
   7#ifndef _QEDI_ISCSI_H_
   8#define _QEDI_ISCSI_H_
   9
  10#include <linux/socket.h>
  11#include <linux/completion.h>
  12#include "qedi.h"
  13
  14#define ISCSI_MAX_SESS_PER_HBA  4096
  15
  16#define DEF_KA_TIMEOUT          7200000
  17#define DEF_KA_INTERVAL         10000
  18#define DEF_KA_MAX_PROBE_COUNT  10
  19#define DEF_TOS                 0
  20#define DEF_TTL                 0xfe
  21#define DEF_SND_SEQ_SCALE       0
  22#define DEF_RCV_BUF             0xffff
  23#define DEF_SND_BUF             0xffff
  24#define DEF_SEED                0
  25#define DEF_MAX_RT_TIME         8000
  26#define DEF_MAX_DA_COUNT        2
  27#define DEF_SWS_TIMER           1000
  28#define DEF_MAX_CWND            2
  29#define DEF_PATH_MTU            1500
  30#define DEF_MSS                 1460
  31#define DEF_LL2_MTU             1560
  32#define JUMBO_MTU               9000
  33
  34#define MIN_MTU         576 /* rfc 793 */
  35#define IPV4_HDR_LEN    20
  36#define IPV6_HDR_LEN    40
  37#define TCP_HDR_LEN     20
  38#define TCP_OPTION_LEN  12
  39#define VLAN_LEN         4
  40
  41enum {
  42        EP_STATE_IDLE                   = 0x0,
  43        EP_STATE_ACQRCONN_START         = 0x1,
  44        EP_STATE_ACQRCONN_COMPL         = 0x2,
  45        EP_STATE_OFLDCONN_START         = 0x4,
  46        EP_STATE_OFLDCONN_COMPL         = 0x8,
  47        EP_STATE_DISCONN_START          = 0x10,
  48        EP_STATE_DISCONN_COMPL          = 0x20,
  49        EP_STATE_CLEANUP_START          = 0x40,
  50        EP_STATE_CLEANUP_CMPL           = 0x80,
  51        EP_STATE_TCP_FIN_RCVD           = 0x100,
  52        EP_STATE_TCP_RST_RCVD           = 0x200,
  53        EP_STATE_LOGOUT_SENT            = 0x400,
  54        EP_STATE_LOGOUT_RESP_RCVD       = 0x800,
  55        EP_STATE_CLEANUP_FAILED         = 0x1000,
  56        EP_STATE_OFLDCONN_FAILED        = 0x2000,
  57        EP_STATE_CONNECT_FAILED         = 0x4000,
  58        EP_STATE_DISCONN_TIMEDOUT       = 0x8000,
  59        EP_STATE_OFLDCONN_NONE          = 0x10000,
  60};
  61
  62struct qedi_conn;
  63
  64struct qedi_endpoint {
  65        struct qedi_ctx *qedi;
  66        u32 dst_addr[4];
  67        u32 src_addr[4];
  68        u16 src_port;
  69        u16 dst_port;
  70        u16 vlan_id;
  71        u16 pmtu;
  72        u8 src_mac[ETH_ALEN];
  73        u8 dst_mac[ETH_ALEN];
  74        u8 ip_type;
  75        int state;
  76        wait_queue_head_t ofld_wait;
  77        wait_queue_head_t tcp_ofld_wait;
  78        u32 iscsi_cid;
  79        /* identifier of the connection from qed */
  80        u32 handle;
  81        u32 fw_cid;
  82        void __iomem *p_doorbell;
  83        struct iscsi_db_data db_data;
  84
  85        /* Send queue management */
  86        struct iscsi_wqe *sq;
  87        dma_addr_t sq_dma;
  88
  89        u16 sq_prod_idx;
  90        u16 fw_sq_prod_idx;
  91        u16 sq_con_idx;
  92        u32 sq_mem_size;
  93
  94        void *sq_pbl;
  95        dma_addr_t sq_pbl_dma;
  96        u32 sq_pbl_size;
  97        struct qedi_conn *conn;
  98        struct work_struct offload_work;
  99};
 100
 101#define QEDI_SQ_WQES_MIN        16
 102
 103struct qedi_io_bdt {
 104        struct scsi_sge *sge_tbl;
 105        dma_addr_t sge_tbl_dma;
 106        u16 sge_valid;
 107};
 108
 109/**
 110 * struct generic_pdu_resc - login pdu resource structure
 111 *
 112 * @req_buf:            driver buffer used to stage payload associated with
 113 *                      the login request
 114 * @req_dma_addr:       dma address for iscsi login request payload buffer
 115 * @req_buf_size:       actual login request payload length
 116 * @req_wr_ptr:         pointer into login request buffer when next data is
 117 *                      to be written
 118 * @resp_hdr:           iscsi header where iscsi login response header is to
 119 *                      be recreated
 120 * @resp_buf:           buffer to stage login response payload
 121 * @resp_dma_addr:      login response payload buffer dma address
 122 * @resp_buf_size:      login response paylod length
 123 * @resp_wr_ptr:        pointer into login response buffer when next data is
 124 *                      to be written
 125 * @req_bd_tbl:         iscsi login request payload BD table
 126 * @req_bd_dma:         login request BD table dma address
 127 * @resp_bd_tbl:        iscsi login response payload BD table
 128 * @resp_bd_dma:        login request BD table dma address
 129 *
 130 * following structure defines buffer info for generic pdus such as iSCSI Login,
 131 *      Logout and NOP
 132 */
 133struct generic_pdu_resc {
 134        char *req_buf;
 135        dma_addr_t req_dma_addr;
 136        u32 req_buf_size;
 137        char *req_wr_ptr;
 138        struct iscsi_hdr resp_hdr;
 139        char *resp_buf;
 140        dma_addr_t resp_dma_addr;
 141        u32 resp_buf_size;
 142        char *resp_wr_ptr;
 143        char *req_bd_tbl;
 144        dma_addr_t req_bd_dma;
 145        char *resp_bd_tbl;
 146        dma_addr_t resp_bd_dma;
 147};
 148
 149struct qedi_conn {
 150        struct iscsi_cls_conn *cls_conn;
 151        struct qedi_ctx *qedi;
 152        struct qedi_endpoint *ep;
 153        struct iscsi_endpoint *iscsi_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        bool ep_disconnect_starting;
 174        int fw_cleanup_works;
 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        struct iscsi_task *ctask;
 217        int rtid;
 218
 219        int state;
 220#define QEDI_WORK_QUEUED        1
 221#define QEDI_WORK_SCHEDULED     2
 222#define QEDI_WORK_EXIT          3
 223
 224        struct work_struct *ptr_tmf_work;
 225};
 226
 227struct qedi_boot_target {
 228        char ip_addr[64];
 229        char iscsi_name[255];
 230        u32 ipv6_en;
 231};
 232
 233#define qedi_set_itt(task_id, itt) ((u32)(((task_id) & 0xffff) | ((itt) << 16)))
 234#define qedi_get_itt(cqe) (cqe.iscsi_hdr.cmd.itt >> 16)
 235
 236#define QEDI_OFLD_WAIT_STATE(q) ((q)->state == EP_STATE_OFLDCONN_FAILED || \
 237                                (q)->state == EP_STATE_OFLDCONN_COMPL)
 238
 239#endif /* _QEDI_ISCSI_H_ */
 240