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