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