xref: /OK3568_Linux_fs/kernel/drivers/scsi/qedi/qedi_iscsi.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
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