Imported Upstream version 16.07-rc1
[deb_dpdk.git] / drivers / net / qede / base / ecore_l2_api.h
1 /*
2  * Copyright (c) 2016 QLogic Corporation.
3  * All rights reserved.
4  * www.qlogic.com
5  *
6  * See LICENSE.qede_pmd for copyright and licensing details.
7  */
8
9 #ifndef __ECORE_L2_API_H__
10 #define __ECORE_L2_API_H__
11
12 #include "ecore_status.h"
13 #include "ecore_sp_api.h"
14
15 #ifndef __EXTRACT__LINUX__
16 enum ecore_rss_caps {
17         ECORE_RSS_IPV4 = 0x1,
18         ECORE_RSS_IPV6 = 0x2,
19         ECORE_RSS_IPV4_TCP = 0x4,
20         ECORE_RSS_IPV6_TCP = 0x8,
21         ECORE_RSS_IPV4_UDP = 0x10,
22         ECORE_RSS_IPV6_UDP = 0x20,
23 };
24
25 /* Should be the same as ETH_RSS_IND_TABLE_ENTRIES_NUM */
26 #define ECORE_RSS_IND_TABLE_SIZE 128
27 #define ECORE_RSS_KEY_SIZE 10   /* size in 32b chunks */
28 #endif
29
30 struct ecore_rss_params {
31         u8 update_rss_config;
32         u8 rss_enable;
33         u8 rss_eng_id;
34         u8 update_rss_capabilities;
35         u8 update_rss_ind_table;
36         u8 update_rss_key;
37         u8 rss_caps;
38         u8 rss_table_size_log;  /* The table size is 2 ^ rss_table_size_log */
39         u16 rss_ind_table[ECORE_RSS_IND_TABLE_SIZE];
40         u32 rss_key[ECORE_RSS_KEY_SIZE];
41 };
42
43 struct ecore_sge_tpa_params {
44         u8 max_buffers_per_cqe;
45
46         u8 update_tpa_en_flg;
47         u8 tpa_ipv4_en_flg;
48         u8 tpa_ipv6_en_flg;
49         u8 tpa_ipv4_tunn_en_flg;
50         u8 tpa_ipv6_tunn_en_flg;
51
52         u8 update_tpa_param_flg;
53         u8 tpa_pkt_split_flg;
54         u8 tpa_hdr_data_split_flg;
55         u8 tpa_gro_consistent_flg;
56         u8 tpa_max_aggs_num;
57         u16 tpa_max_size;
58         u16 tpa_min_size_to_start;
59         u16 tpa_min_size_to_cont;
60 };
61
62 enum ecore_filter_opcode {
63         ECORE_FILTER_ADD,
64         ECORE_FILTER_REMOVE,
65         ECORE_FILTER_MOVE,
66         ECORE_FILTER_REPLACE,   /* Delete all MACs and add new one instead */
67         ECORE_FILTER_FLUSH,     /* Removes all filters */
68 };
69
70 enum ecore_filter_ucast_type {
71         ECORE_FILTER_MAC,
72         ECORE_FILTER_VLAN,
73         ECORE_FILTER_MAC_VLAN,
74         ECORE_FILTER_INNER_MAC,
75         ECORE_FILTER_INNER_VLAN,
76         ECORE_FILTER_INNER_PAIR,
77         ECORE_FILTER_INNER_MAC_VNI_PAIR,
78         ECORE_FILTER_MAC_VNI_PAIR,
79         ECORE_FILTER_VNI,
80 };
81
82 struct ecore_filter_ucast {
83         enum ecore_filter_opcode opcode;
84         enum ecore_filter_ucast_type type;
85         u8 is_rx_filter;
86         u8 is_tx_filter;
87         u8 vport_to_add_to;
88         u8 vport_to_remove_from;
89         unsigned char mac[ETH_ALEN];
90         u8 assert_on_error;
91         u16 vlan;
92         u32 vni;
93 };
94
95 struct ecore_filter_mcast {
96         /* MOVE is not supported for multicast */
97         enum ecore_filter_opcode opcode;
98         u8 vport_to_add_to;
99         u8 vport_to_remove_from;
100         u8 num_mc_addrs;
101 #define ECORE_MAX_MC_ADDRS      64
102         unsigned char mac[ECORE_MAX_MC_ADDRS][ETH_ALEN];
103 };
104
105 struct ecore_filter_accept_flags {
106         u8 update_rx_mode_config;
107         u8 update_tx_mode_config;
108         u8 rx_accept_filter;
109         u8 tx_accept_filter;
110 #define ECORE_ACCEPT_NONE               0x01
111 #define ECORE_ACCEPT_UCAST_MATCHED      0x02
112 #define ECORE_ACCEPT_UCAST_UNMATCHED    0x04
113 #define ECORE_ACCEPT_MCAST_MATCHED      0x08
114 #define ECORE_ACCEPT_MCAST_UNMATCHED    0x10
115 #define ECORE_ACCEPT_BCAST              0x20
116 };
117
118 /* Add / remove / move / remove-all unicast MAC-VLAN filters.
119  * FW will assert in the following cases, so driver should take care...:
120  * 1. Adding a filter to a full table.
121  * 2. Adding a filter which already exists on that vport.
122  * 3. Removing a filter which doesn't exist.
123  */
124
125 enum _ecore_status_t
126 ecore_filter_ucast_cmd(struct ecore_dev *p_dev,
127                        struct ecore_filter_ucast *p_filter_cmd,
128                        enum spq_mode comp_mode,
129                        struct ecore_spq_comp_cb *p_comp_data);
130
131 /* Add / remove / move multicast MAC filters. */
132 enum _ecore_status_t
133 ecore_filter_mcast_cmd(struct ecore_dev *p_dev,
134                        struct ecore_filter_mcast *p_filter_cmd,
135                        enum spq_mode comp_mode,
136                        struct ecore_spq_comp_cb *p_comp_data);
137
138 /* Set "accept" filters */
139 enum _ecore_status_t
140 ecore_filter_accept_cmd(struct ecore_dev *p_dev,
141                         u8 vport,
142                         struct ecore_filter_accept_flags accept_flags,
143                         u8 update_accept_any_vlan,
144                         u8 accept_any_vlan,
145                         enum spq_mode comp_mode,
146                         struct ecore_spq_comp_cb *p_comp_data);
147
148 /**
149  * @brief ecore_sp_eth_rx_queue_start - RX Queue Start Ramrod
150  *
151  * This ramrod initializes an RX Queue for a VPort. An Assert is generated if
152  * the VPort ID is not currently initialized.
153  *
154  * @param p_hwfn
155  * @param opaque_fid
156  * @param rx_queue_id           RX Queue ID: Zero based, per VPort, allocated
157  *                              by assignment (=rssId)
158  * @param vport_id              VPort ID
159  * @param u8 stats_id           VPort ID which the queue stats
160  *                              will be added to
161  * @param sb                    Status Block of the Function Event Ring
162  * @param sb_index              Index into the status block of the
163  *                      Function Event Ring
164  * @param bd_max_bytes          Maximum bytes that can be placed on a BD
165  * @param bd_chain_phys_addr    Physical address of BDs for receive.
166  * @param cqe_pbl_addr          Physical address of the CQE PBL Table.
167  * @param cqe_pbl_size          Size of the CQE PBL Table
168  * @param pp_prod               Pointer to place producer's
169  *                              address for the Rx Q (May be
170  *                              NULL).
171  *
172  * @return enum _ecore_status_t
173  */
174 enum _ecore_status_t ecore_sp_eth_rx_queue_start(struct ecore_hwfn *p_hwfn,
175                                                  u16 opaque_fid,
176                                                  u8 rx_queue_id,
177                                                  u8 vport_id,
178                                                  u8 stats_id,
179                                                  u16 sb,
180                                                  u8 sb_index,
181                                                  u16 bd_max_bytes,
182                                                  dma_addr_t bd_chain_phys_addr,
183                                                  dma_addr_t cqe_pbl_addr,
184                                                  u16 cqe_pbl_size,
185                                                  void OSAL_IOMEM * *pp_prod);
186
187 /**
188  * @brief ecore_sp_eth_rx_queue_stop -
189  *
190  * This ramrod closes an RX queue. It sends RX queue stop ramrod
191  * + CFC delete ramrod
192  *
193  * @param p_hwfn
194  * @param rx_queue_id           RX Queue ID
195  * @param eq_completion_only    If True completion will be on
196  *                              EQe, if False completion will be
197  *                              on EQe if p_hwfn opaque
198  *                              different from the RXQ opaque
199  *                              otherwise on CQe.
200  * @param cqe_completion        If True completion will be
201  *                              receive on CQe.
202  * @return enum _ecore_status_t
203  */
204 enum _ecore_status_t
205 ecore_sp_eth_rx_queue_stop(struct ecore_hwfn *p_hwfn,
206                            u16 rx_queue_id,
207                            bool eq_completion_only, bool cqe_completion);
208
209 /**
210  * @brief ecore_sp_eth_tx_queue_start - TX Queue Start Ramrod
211  *
212  * This ramrod initializes a TX Queue for a VPort. An Assert is generated if
213  * the VPort is not currently initialized.
214  *
215  * @param p_hwfn
216  * @param opaque_fid
217  * @param tx_queue_id           TX Queue ID
218  * @param vport_id              VPort ID
219  * @param stats_id              VPort ID which the queue stats
220  *                              will be added to
221  * @param sb                    Status Block of the Function Event Ring
222  * @param sb_index              Index into the status block of the Function
223  *                              Event Ring
224  * @param pbl_addr              address of the pbl array
225  * @param pbl_size              number of entries in pbl
226  * @param pp_doorbell           Pointer to place doorbell pointer (May be NULL).
227  *                      This address should be used with the
228  *                              DIRECT_REG_WR macro.
229  *
230  * @return enum _ecore_status_t
231  */
232 enum _ecore_status_t ecore_sp_eth_tx_queue_start(struct ecore_hwfn *p_hwfn,
233                                                  u16 opaque_fid,
234                                                  u16 tx_queue_id,
235                                                  u8 vport_id,
236                                                  u8 stats_id,
237                                                  u16 sb,
238                                                  u8 sb_index,
239                                                  dma_addr_t pbl_addr,
240                                                  u16 pbl_size,
241                                                  void OSAL_IOMEM * *
242                                                  pp_doorbell);
243
244 /**
245  * @brief ecore_sp_eth_tx_queue_stop -
246  *
247  * This ramrod closes a TX queue. It sends TX queue stop ramrod
248  * + CFC delete ramrod
249  *
250  * @param p_hwfn
251  * @param tx_queue_id           TX Queue ID
252  *
253  * @return enum _ecore_status_t
254  */
255 enum _ecore_status_t ecore_sp_eth_tx_queue_stop(struct ecore_hwfn *p_hwfn,
256                                                 u16 tx_queue_id);
257
258 enum ecore_tpa_mode {
259         ECORE_TPA_MODE_NONE,
260         ECORE_TPA_MODE_RSC,
261         ECORE_TPA_MODE_GRO,
262         ECORE_TPA_MODE_MAX
263 };
264
265 struct ecore_sp_vport_start_params {
266         enum ecore_tpa_mode tpa_mode;
267         bool remove_inner_vlan; /* Inner VLAN removal is enabled */
268         bool tx_switching;      /* Vport supports tx-switching */
269         bool handle_ptp_pkts;   /* Handle PTP packets */
270         bool only_untagged;     /* Untagged pkt control */
271         bool drop_ttl0;         /* Drop packets with TTL = 0 */
272         u8 max_buffers_per_cqe;
273         u32 concrete_fid;
274         u16 opaque_fid;
275         u8 vport_id;            /* VPORT ID */
276         u16 mtu;                /* VPORT MTU */
277         bool zero_placement_offset;
278 };
279
280 /**
281  * @brief ecore_sp_vport_start -
282  *
283  * This ramrod initializes a VPort. An Assert if generated if the Function ID
284  * of the VPort is not enabled.
285  *
286  * @param p_hwfn
287  * @param p_params              VPORT start params
288  *
289  * @return enum _ecore_status_t
290  */
291 enum _ecore_status_t
292 ecore_sp_vport_start(struct ecore_hwfn *p_hwfn,
293                      struct ecore_sp_vport_start_params *p_params);
294
295 struct ecore_sp_vport_update_params {
296         u16 opaque_fid;
297         u8 vport_id;
298         u8 update_vport_active_rx_flg;
299         u8 vport_active_rx_flg;
300         u8 update_vport_active_tx_flg;
301         u8 vport_active_tx_flg;
302         u8 update_inner_vlan_removal_flg;
303         u8 inner_vlan_removal_flg;
304         u8 silent_vlan_removal_flg;
305         u8 update_default_vlan_enable_flg;
306         u8 default_vlan_enable_flg;
307         u8 update_default_vlan_flg;
308         u16 default_vlan;
309         u8 update_tx_switching_flg;
310         u8 tx_switching_flg;
311         u8 update_approx_mcast_flg;
312         u8 update_anti_spoofing_en_flg;
313         u8 anti_spoofing_en;
314         u8 update_accept_any_vlan_flg;
315         u8 accept_any_vlan;
316         unsigned long bins[8];
317         struct ecore_rss_params *rss_params;
318         struct ecore_filter_accept_flags accept_flags;
319         struct ecore_sge_tpa_params *sge_tpa_params;
320 };
321
322 /**
323  * @brief ecore_sp_vport_update -
324  *
325  * This ramrod updates the parameters of the VPort. Every field can be updated
326  * independently, according to flags.
327  *
328  * This ramrod is also used to set the VPort state to active after creation.
329  * An Assert is generated if the VPort does not contain an RX queue.
330  *
331  * @param p_hwfn
332  * @param p_params
333  *
334  * @return enum _ecore_status_t
335  */
336 enum _ecore_status_t
337 ecore_sp_vport_update(struct ecore_hwfn *p_hwfn,
338                       struct ecore_sp_vport_update_params *p_params,
339                       enum spq_mode comp_mode,
340                       struct ecore_spq_comp_cb *p_comp_data);
341 /**
342  * @brief ecore_sp_vport_stop -
343  *
344  * This ramrod closes a VPort after all its RX and TX queues are terminated.
345  * An Assert is generated if any queues are left open.
346  *
347  * @param p_hwfn
348  * @param opaque_fid
349  * @param vport_id VPort ID
350  *
351  * @return enum _ecore_status_t
352  */
353 enum _ecore_status_t ecore_sp_vport_stop(struct ecore_hwfn *p_hwfn,
354                                          u16 opaque_fid, u8 vport_id);
355
356 enum _ecore_status_t
357 ecore_sp_eth_filter_ucast(struct ecore_hwfn *p_hwfn,
358                           u16 opaque_fid,
359                           struct ecore_filter_ucast *p_filter_cmd,
360                           enum spq_mode comp_mode,
361                           struct ecore_spq_comp_cb *p_comp_data);
362
363 /**
364  * @brief ecore_sp_rx_eth_queues_update -
365  *
366  * This ramrod updates an RX queue. It is used for setting the active state
367  * of the queue and updating the TPA and SGE parameters.
368  *
369  * @note Final phase API.
370  *
371  * @param p_hwfn
372  * @param rx_queue_id           RX Queue ID
373  * @param num_rxqs              Allow to update multiple rx
374  *                              queues, from rx_queue_id to
375  *                              (rx_queue_id + num_rxqs)
376  * @param complete_cqe_flg      Post completion to the CQE Ring if set
377  * @param complete_event_flg    Post completion to the Event Ring if set
378  *
379  * @return enum _ecore_status_t
380  */
381
382 enum _ecore_status_t
383 ecore_sp_eth_rx_queues_update(struct ecore_hwfn *p_hwfn,
384                               u16 rx_queue_id,
385                               u8 num_rxqs,
386                               u8 complete_cqe_flg,
387                               u8 complete_event_flg,
388                               enum spq_mode comp_mode,
389                               struct ecore_spq_comp_cb *p_comp_data);
390
391 void __ecore_get_vport_stats(struct ecore_hwfn *p_hwfn,
392                              struct ecore_ptt *p_ptt,
393                              struct ecore_eth_stats *stats,
394                              u16 statistics_bin, bool b_get_port_stats);
395
396 void ecore_get_vport_stats(struct ecore_dev *p_dev,
397                            struct ecore_eth_stats *stats);
398
399 void ecore_reset_vport_stats(struct ecore_dev *p_dev);
400
401 #endif