blob: 4e3d62a16cab7f9883aa4d4df83263c4b1de1c61 [file] [log] [blame]
Yuval Mintz0a7fb112016-10-01 21:59:55 +03001/* QLogic qed NIC Driver
2 *
3 * Copyright (c) 2015 QLogic Corporation
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 _QED_LL2_H
11#define _QED_LL2_H
12
13#include <linux/types.h>
14#include <linux/kernel.h>
15#include <linux/list.h>
16#include <linux/mutex.h>
17#include <linux/slab.h>
18#include <linux/spinlock.h>
19#include <linux/qed/qed_chain.h>
20#include <linux/qed/qed_ll2_if.h>
21#include "qed.h"
22#include "qed_hsi.h"
23#include "qed_sp.h"
24
25#define QED_MAX_NUM_OF_LL2_CONNECTIONS (4)
26
Ram Amraniabd49672016-10-01 22:00:01 +030027enum qed_ll2_roce_flavor_type {
28 QED_LL2_ROCE,
29 QED_LL2_RROCE,
30 MAX_QED_LL2_ROCE_FLAVOR_TYPE
31};
32
Yuval Mintz0a7fb112016-10-01 21:59:55 +030033enum qed_ll2_conn_type {
34 QED_LL2_TYPE_RESERVED,
35 QED_LL2_TYPE_ISCSI,
36 QED_LL2_TYPE_TEST,
37 QED_LL2_TYPE_ISCSI_OOO,
38 QED_LL2_TYPE_RESERVED2,
39 QED_LL2_TYPE_ROCE,
40 QED_LL2_TYPE_RESERVED3,
41 MAX_QED_LL2_RX_CONN_TYPE
42};
43
44struct qed_ll2_rx_packet {
45 struct list_head list_entry;
46 struct core_rx_bd_with_buff_len *rxq_bd;
47 dma_addr_t rx_buf_addr;
48 u16 buf_length;
49 void *cookie;
50 u8 placement_offset;
51 u16 parse_flags;
52 u16 packet_length;
53 u16 vlan;
54 u32 opaque_data[2];
55};
56
57struct qed_ll2_tx_packet {
58 struct list_head list_entry;
59 u16 bd_used;
60 u16 vlan;
61 u16 l4_hdr_offset_w;
62 u8 bd_flags;
63 bool notify_fw;
64 void *cookie;
65
66 struct {
67 struct core_tx_bd *txq_bd;
68 dma_addr_t tx_frag;
69 u16 frag_len;
70 } bds_set[ETH_TX_MAX_BDS_PER_NON_LSO_PACKET];
71};
72
73struct qed_ll2_rx_queue {
74 /* Lock protecting the Rx queue manipulation */
75 spinlock_t lock;
76 struct qed_chain rxq_chain;
77 struct qed_chain rcq_chain;
78 u8 rx_sb_index;
79 bool b_cb_registred;
80 __le16 *p_fw_cons;
81 struct list_head active_descq;
82 struct list_head free_descq;
83 struct list_head posting_descq;
84 struct qed_ll2_rx_packet *descq_array;
85 void __iomem *set_prod_addr;
86};
87
88struct qed_ll2_tx_queue {
89 /* Lock protecting the Tx queue manipulation */
90 spinlock_t lock;
91 struct qed_chain txq_chain;
92 u8 tx_sb_index;
93 bool b_cb_registred;
94 __le16 *p_fw_cons;
95 struct list_head active_descq;
96 struct list_head free_descq;
97 struct list_head sending_descq;
98 struct qed_ll2_tx_packet *descq_array;
99 struct qed_ll2_tx_packet *cur_send_packet;
100 struct qed_ll2_tx_packet cur_completing_packet;
101 u16 cur_completing_bd_idx;
102 void __iomem *doorbell_addr;
103 u16 bds_idx;
104 u16 cur_send_frag_num;
105 u16 cur_completing_frag_num;
106 bool b_completing_packet;
107};
108
109struct qed_ll2_info {
110 /* Lock protecting the state of LL2 */
111 struct mutex mutex;
112 enum qed_ll2_conn_type conn_type;
113 u32 cid;
114 u8 my_id;
115 u8 queue_id;
116 u8 tx_stats_id;
117 bool b_active;
118 u16 mtu;
119 u8 rx_drop_ttl0_flg;
120 u8 rx_vlan_removal_en;
121 u8 tx_tc;
122 enum core_tx_dest tx_dest;
123 enum core_error_handle ai_err_packet_too_big;
124 enum core_error_handle ai_err_no_buf;
125 u8 tx_stats_en;
126 struct qed_ll2_rx_queue rx_queue;
127 struct qed_ll2_tx_queue tx_queue;
Ram Amraniabd49672016-10-01 22:00:01 +0300128 u8 gsi_enable;
Yuval Mintz0a7fb112016-10-01 21:59:55 +0300129};
130
131/**
132 * @brief qed_ll2_acquire_connection - allocate resources,
133 * starts rx & tx (if relevant) queues pair. Provides
134 * connecion handler as output parameter.
135 *
136 * @param p_hwfn
137 * @param p_params Contain various configuration properties
138 * @param rx_num_desc
139 * @param tx_num_desc
140 *
141 * @param p_connection_handle Output container for LL2 connection's handle
142 *
143 * @return 0 on success, failure otherwise
144 */
145int qed_ll2_acquire_connection(struct qed_hwfn *p_hwfn,
146 struct qed_ll2_info *p_params,
147 u16 rx_num_desc,
148 u16 tx_num_desc,
149 u8 *p_connection_handle);
150
151/**
152 * @brief qed_ll2_establish_connection - start previously
153 * allocated LL2 queues pair
154 *
155 * @param p_hwfn
156 * @param p_ptt
157 * @param connection_handle LL2 connection's handle obtained from
158 * qed_ll2_require_connection
159 *
160 * @return 0 on success, failure otherwise
161 */
162int qed_ll2_establish_connection(struct qed_hwfn *p_hwfn, u8 connection_handle);
163
164/**
165 * @brief qed_ll2_post_rx_buffers - submit buffers to LL2 Rx queue.
166 *
167 * @param p_hwfn
168 * @param connection_handle LL2 connection's handle obtained from
169 * qed_ll2_require_connection
170 * @param addr rx (physical address) buffers to submit
171 * @param cookie
172 * @param notify_fw produce corresponding Rx BD immediately
173 *
174 * @return 0 on success, failure otherwise
175 */
176int qed_ll2_post_rx_buffer(struct qed_hwfn *p_hwfn,
177 u8 connection_handle,
178 dma_addr_t addr,
179 u16 buf_len, void *cookie, u8 notify_fw);
180
181/**
182 * @brief qed_ll2_prepare_tx_packet - request for start Tx BD
183 * to prepare Tx packet submission to FW.
184 *
185 * @param p_hwfn
186 * @param connection_handle LL2 connection's handle obtained from
187 * qed_ll2_require_connection
188 * @param num_of_bds a number of requested BD equals a number of
189 * fragments in Tx packet
190 * @param vlan VLAN to insert to packet (if insertion set)
191 * @param bd_flags
192 * @param l4_hdr_offset_w L4 Header Offset from start of packet
193 * (in words). This is needed if both l4_csum
194 * and ipv6_ext are set
195 * @param first_frag
196 * @param first_frag_len
197 * @param cookie
198 *
199 * @param notify_fw
200 *
201 * @return 0 on success, failure otherwise
202 */
203int qed_ll2_prepare_tx_packet(struct qed_hwfn *p_hwfn,
204 u8 connection_handle,
205 u8 num_of_bds,
206 u16 vlan,
207 u8 bd_flags,
208 u16 l4_hdr_offset_w,
Ram Amraniabd49672016-10-01 22:00:01 +0300209 enum qed_ll2_roce_flavor_type qed_roce_flavor,
Yuval Mintz0a7fb112016-10-01 21:59:55 +0300210 dma_addr_t first_frag,
211 u16 first_frag_len, void *cookie, u8 notify_fw);
212
213/**
214 * @brief qed_ll2_release_connection - releases resources
215 * allocated for LL2 connection
216 *
217 * @param p_hwfn
218 * @param connection_handle LL2 connection's handle obtained from
219 * qed_ll2_require_connection
220 */
221void qed_ll2_release_connection(struct qed_hwfn *p_hwfn, u8 connection_handle);
222
223/**
224 * @brief qed_ll2_set_fragment_of_tx_packet - provides fragments to fill
225 * Tx BD of BDs requested by
226 * qed_ll2_prepare_tx_packet
227 *
228 * @param p_hwfn
229 * @param connection_handle LL2 connection's handle
230 * obtained from
231 * qed_ll2_require_connection
232 * @param addr
233 * @param nbytes
234 *
235 * @return 0 on success, failure otherwise
236 */
237int qed_ll2_set_fragment_of_tx_packet(struct qed_hwfn *p_hwfn,
238 u8 connection_handle,
239 dma_addr_t addr, u16 nbytes);
240
241/**
242 * @brief qed_ll2_terminate_connection - stops Tx/Rx queues
243 *
244 *
245 * @param p_hwfn
246 * @param connection_handle LL2 connection's handle
247 * obtained from
248 * qed_ll2_require_connection
249 *
250 * @return 0 on success, failure otherwise
251 */
252int qed_ll2_terminate_connection(struct qed_hwfn *p_hwfn, u8 connection_handle);
253
254/**
255 * @brief qed_ll2_get_stats - get LL2 queue's statistics
256 *
257 *
258 * @param p_hwfn
259 * @param connection_handle LL2 connection's handle obtained from
260 * qed_ll2_require_connection
261 * @param p_stats
262 *
263 * @return 0 on success, failure otherwise
264 */
265int qed_ll2_get_stats(struct qed_hwfn *p_hwfn,
266 u8 connection_handle, struct qed_ll2_stats *p_stats);
267
268/**
269 * @brief qed_ll2_alloc - Allocates LL2 connections set
270 *
271 * @param p_hwfn
272 *
273 * @return pointer to alocated qed_ll2_info or NULL
274 */
275struct qed_ll2_info *qed_ll2_alloc(struct qed_hwfn *p_hwfn);
276
277/**
278 * @brief qed_ll2_setup - Inits LL2 connections set
279 *
280 * @param p_hwfn
281 * @param p_ll2_connections
282 *
283 */
284void qed_ll2_setup(struct qed_hwfn *p_hwfn,
285 struct qed_ll2_info *p_ll2_connections);
286
287/**
288 * @brief qed_ll2_free - Releases LL2 connections set
289 *
290 * @param p_hwfn
291 * @param p_ll2_connections
292 *
293 */
294void qed_ll2_free(struct qed_hwfn *p_hwfn,
295 struct qed_ll2_info *p_ll2_connections);
Yuval Mintz0a7fb112016-10-01 21:59:55 +0300296#endif