Merge tag 'spi-fix-v4.9-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/broonie/spi
[cascardo/linux.git] / drivers / net / ethernet / qlogic / qed / qed_ll2.h
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 struct 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
57 struct 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
73 struct 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
88 struct 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
109 struct 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;
128         u8 gsi_enable;
129 };
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  */
145 int 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  */
162 int 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  */
176 int 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  */
203 int 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,
209                               enum qed_ll2_roce_flavor_type qed_roce_flavor,
210                               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  */
221 void 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  */
237 int 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  */
252 int 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  */
265 int 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  */
275 struct 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  */
284 void 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  */
294 void qed_ll2_free(struct qed_hwfn *p_hwfn,
295                   struct qed_ll2_info *p_ll2_connections);
296 #endif