]> asedeno.scripts.mit.edu Git - linux.git/blob - drivers/net/ethernet/qlogic/qed/qed_ll2.h
Merge branches 'pm-core', 'pm-qos', 'pm-domains' and 'pm-opp'
[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 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