Commit | Line | Data |
---|---|---|
ace7f46b MR |
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 | ||
44 | enum { | |
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 | ||
64 | struct qedi_conn; | |
65 | ||
66 | struct 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 | ||
104 | struct qedi_io_bdt { | |
be086e7c | 105 | struct scsi_sge *sge_tbl; |
ace7f46b MR |
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 | */ | |
134 | struct 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 | ||
150 | struct 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 | ||
177 | struct 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; | |
21dd79e8 | 185 | struct e4_iscsi_task_context request; |
ace7f46b MR |
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 | ||
213 | struct 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 | ||
534bbdf8 MR |
226 | struct qedi_boot_target { |
227 | char ip_addr[64]; | |
228 | char iscsi_name[255]; | |
229 | u32 ipv6_en; | |
230 | }; | |
231 | ||
ace7f46b MR |
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_ */ |