1c27a02cdSYevgeny Petrilin /*
2c27a02cdSYevgeny Petrilin * Copyright (c) 2007 Mellanox Technologies. All rights reserved.
3c27a02cdSYevgeny Petrilin *
4c27a02cdSYevgeny Petrilin * This software is available to you under a choice of one of two
5c27a02cdSYevgeny Petrilin * licenses. You may choose to be licensed under the terms of the GNU
6c27a02cdSYevgeny Petrilin * General Public License (GPL) Version 2, available from the file
7c27a02cdSYevgeny Petrilin * COPYING in the main directory of this source tree, or the
8c27a02cdSYevgeny Petrilin * OpenIB.org BSD license below:
9c27a02cdSYevgeny Petrilin *
10c27a02cdSYevgeny Petrilin * Redistribution and use in source and binary forms, with or
11c27a02cdSYevgeny Petrilin * without modification, are permitted provided that the following
12c27a02cdSYevgeny Petrilin * conditions are met:
13c27a02cdSYevgeny Petrilin *
14c27a02cdSYevgeny Petrilin * - Redistributions of source code must retain the above
15c27a02cdSYevgeny Petrilin * copyright notice, this list of conditions and the following
16c27a02cdSYevgeny Petrilin * disclaimer.
17c27a02cdSYevgeny Petrilin *
18c27a02cdSYevgeny Petrilin * - Redistributions in binary form must reproduce the above
19c27a02cdSYevgeny Petrilin * copyright notice, this list of conditions and the following
20c27a02cdSYevgeny Petrilin * disclaimer in the documentation and/or other materials
21c27a02cdSYevgeny Petrilin * provided with the distribution.
22c27a02cdSYevgeny Petrilin *
23c27a02cdSYevgeny Petrilin * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
24c27a02cdSYevgeny Petrilin * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
25c27a02cdSYevgeny Petrilin * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
26c27a02cdSYevgeny Petrilin * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
27c27a02cdSYevgeny Petrilin * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
28c27a02cdSYevgeny Petrilin * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
29c27a02cdSYevgeny Petrilin * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
30c27a02cdSYevgeny Petrilin * SOFTWARE.
31c27a02cdSYevgeny Petrilin *
32c27a02cdSYevgeny Petrilin */
33c27a02cdSYevgeny Petrilin
34c27a02cdSYevgeny Petrilin #ifndef _MLX4_EN_H_
35c27a02cdSYevgeny Petrilin #define _MLX4_EN_H_
36c27a02cdSYevgeny Petrilin
37f1b553fbSJiri Pirko #include <linux/bitops.h>
38c27a02cdSYevgeny Petrilin #include <linux/compiler.h>
39cc69837fSJakub Kicinski #include <linux/ethtool.h>
40c27a02cdSYevgeny Petrilin #include <linux/list.h>
41c27a02cdSYevgeny Petrilin #include <linux/mutex.h>
42c27a02cdSYevgeny Petrilin #include <linux/netdevice.h>
43f1b553fbSJiri Pirko #include <linux/if_vlan.h>
44ec693d47SAmir Vadai #include <linux/net_tstamp.h>
45564c274cSAmir Vadai #ifdef CONFIG_MLX4_EN_DCB
46564c274cSAmir Vadai #include <linux/dcbnl.h>
47564c274cSAmir Vadai #endif
481eb8c695SAmir Vadai #include <linux/cpu_rmap.h>
49ad7d4eaeSShawn Bohrer #include <linux/ptp_clock_kernel.h>
5080a62deeSThomas Gleixner #include <linux/irq.h>
51ae75415dSJesper Dangaard Brouer #include <net/xdp.h>
5273d68002SPetr Pavlu #include <linux/notifier.h>
53c27a02cdSYevgeny Petrilin
54c27a02cdSYevgeny Petrilin #include <linux/mlx4/device.h>
55c27a02cdSYevgeny Petrilin #include <linux/mlx4/qp.h>
56c27a02cdSYevgeny Petrilin #include <linux/mlx4/cq.h>
57c27a02cdSYevgeny Petrilin #include <linux/mlx4/srq.h>
58c27a02cdSYevgeny Petrilin #include <linux/mlx4/doorbell.h>
59e7c1c2c4SYevgeny Petrilin #include <linux/mlx4/cmd.h>
60c27a02cdSYevgeny Petrilin
61c27a02cdSYevgeny Petrilin #include "en_port.h"
62b4b6e842SEran Ben Elisha #include "mlx4_stats.h"
63c27a02cdSYevgeny Petrilin
64c27a02cdSYevgeny Petrilin #define DRV_NAME "mlx4_en"
65808df6a2STariq Toukan #define DRV_VERSION "4.0-0"
66c27a02cdSYevgeny Petrilin
67c27a02cdSYevgeny Petrilin #define MLX4_EN_MSG_LEVEL (NETIF_MSG_LINK | NETIF_MSG_IFDOWN)
68c27a02cdSYevgeny Petrilin
69c27a02cdSYevgeny Petrilin /*
70c27a02cdSYevgeny Petrilin * Device constants
71c27a02cdSYevgeny Petrilin */
72c27a02cdSYevgeny Petrilin
73c27a02cdSYevgeny Petrilin
74c27a02cdSYevgeny Petrilin #define MLX4_EN_PAGE_SHIFT 12
75c27a02cdSYevgeny Petrilin #define MLX4_EN_PAGE_SIZE (1 << MLX4_EN_PAGE_SHIFT)
76d317966bSAmir Vadai #define DEF_RX_RINGS 16
77d317966bSAmir Vadai #define MAX_RX_RINGS 128
7827055454SAlaa Hleihel #define MIN_RX_RINGS 1
799573e0d3STariq Toukan #define LOG_TXBB_SIZE 6
809573e0d3STariq Toukan #define TXBB_SIZE BIT(LOG_TXBB_SIZE)
81c27a02cdSYevgeny Petrilin #define HEADROOM (2048 / TXBB_SIZE + 1)
82c27a02cdSYevgeny Petrilin #define STAMP_STRIDE 64
83c27a02cdSYevgeny Petrilin #define STAMP_DWORDS (STAMP_STRIDE / 4)
84c27a02cdSYevgeny Petrilin #define STAMP_SHIFT 31
85c27a02cdSYevgeny Petrilin #define STAMP_VAL 0x7fffffff
86c27a02cdSYevgeny Petrilin #define STATS_DELAY (HZ / 4)
87b6c39bfcSAmir Vadai #define SERVICE_TASK_DELAY (HZ / 4)
8882067281SHadar Hen Zion #define MAX_NUM_OF_FS_RULES 256
89c27a02cdSYevgeny Petrilin
901eb8c695SAmir Vadai #define MLX4_EN_FILTER_HASH_SHIFT 4
911eb8c695SAmir Vadai #define MLX4_EN_FILTER_EXPIRY_QUOTA 60
921eb8c695SAmir Vadai
9326782aadSEric Dumazet #define CTRL_SIZE sizeof(struct mlx4_wqe_ctrl_seg)
9426782aadSEric Dumazet #define DS_SIZE sizeof(struct mlx4_wqe_data_seg)
9526782aadSEric Dumazet
9626782aadSEric Dumazet /* Maximal size of the bounce buffer:
9726782aadSEric Dumazet * 256 bytes for LSO headers.
9826782aadSEric Dumazet * CTRL_SIZE for control desc.
9926782aadSEric Dumazet * DS_SIZE if skb->head contains some payload.
10026782aadSEric Dumazet * MAX_SKB_FRAGS frags.
10126782aadSEric Dumazet */
10226782aadSEric Dumazet #define MLX4_TX_BOUNCE_BUFFER_SIZE \
10326782aadSEric Dumazet ALIGN(256 + CTRL_SIZE + DS_SIZE + MAX_SKB_FRAGS * DS_SIZE, TXBB_SIZE)
10426782aadSEric Dumazet
10535f31ff0SEric Dumazet #define MLX4_MAX_DESC_TXBBS (MLX4_TX_BOUNCE_BUFFER_SIZE / TXBB_SIZE)
106c27a02cdSYevgeny Petrilin
107c27a02cdSYevgeny Petrilin /*
108c27a02cdSYevgeny Petrilin * OS related constants and tunables
109c27a02cdSYevgeny Petrilin */
110c27a02cdSYevgeny Petrilin
1110fef9d03SAmir Vadai #define MLX4_EN_PRIV_FLAGS_BLUEFLAME 1
112e38af4faSHadar Hen Zion #define MLX4_EN_PRIV_FLAGS_PHV 2
1130fef9d03SAmir Vadai
114c27a02cdSYevgeny Petrilin #define MLX4_EN_WATCHDOG_TIMEOUT (15 * HZ)
115c27a02cdSYevgeny Petrilin
116117980c4SThadeu Lima de Souza Cascardo /* Use the maximum between 16384 and a single page */
117117980c4SThadeu Lima de Souza Cascardo #define MLX4_EN_ALLOC_SIZE PAGE_ALIGN(16384)
11851151a16SEric Dumazet
119c27a02cdSYevgeny Petrilin #define MLX4_EN_MAX_RX_FRAGS 4
120c27a02cdSYevgeny Petrilin
121bd531e36SYevgeny Petrilin /* Maximum ring sizes */
122bd531e36SYevgeny Petrilin #define MLX4_EN_MAX_TX_SIZE 8192
123bd531e36SYevgeny Petrilin #define MLX4_EN_MAX_RX_SIZE 8192
124bd531e36SYevgeny Petrilin
1254cce66cdSThadeu Lima de Souza Cascardo /* Minimum ring size for our page-allocation scheme to work */
126c27a02cdSYevgeny Petrilin #define MLX4_EN_MIN_RX_SIZE (MLX4_EN_ALLOC_SIZE / SMP_CACHE_BYTES)
127c27a02cdSYevgeny Petrilin #define MLX4_EN_MIN_TX_SIZE (4096 / TXBB_SIZE)
128c27a02cdSYevgeny Petrilin
129f813cad8SYevgeny Petrilin #define MLX4_EN_SMALL_PKT_SIZE 64
130ea1c1af1SAmir Vadai #define MLX4_EN_MIN_TX_RING_P_UP 1
131bc6a4744SAmir Vadai #define MLX4_EN_MAX_TX_RING_P_UP 32
132ec327f7aSInbar Karmy #define MLX4_EN_NUM_UP_LOW 1
133f21ad614SInbar Karmy #define MLX4_EN_NUM_UP_HIGH 8
134c27a02cdSYevgeny Petrilin #define MLX4_EN_DEF_RX_RING_SIZE 1024
13577788b5bSTariq Toukan #define MLX4_EN_DEF_TX_RING_SIZE MLX4_EN_DEF_RX_RING_SIZE
136d317966bSAmir Vadai #define MAX_TX_RINGS (MLX4_EN_MAX_TX_RING_P_UP * \
137f21ad614SInbar Karmy MLX4_EN_NUM_UP_HIGH)
138c27a02cdSYevgeny Petrilin
139fbc6daf1SAmir Vadai #define MLX4_EN_DEFAULT_TX_WORK 256
140fbc6daf1SAmir Vadai
1413db36fb2SYevgeny Petrilin /* Target number of packets to coalesce with interrupt moderation */
1423db36fb2SYevgeny Petrilin #define MLX4_EN_RX_COAL_TARGET 44
143c27a02cdSYevgeny Petrilin #define MLX4_EN_RX_COAL_TIME 0x10
144c27a02cdSYevgeny Petrilin
145e22979d9SYevgeny Petrilin #define MLX4_EN_TX_COAL_PKTS 16
146ecfd2ce1SEric Dumazet #define MLX4_EN_TX_COAL_TIME 0x10
147c27a02cdSYevgeny Petrilin
1486ad4e91cSMoshe Shemesh #define MLX4_EN_MAX_COAL_PKTS U16_MAX
1496ad4e91cSMoshe Shemesh #define MLX4_EN_MAX_COAL_TIME U16_MAX
1506ad4e91cSMoshe Shemesh
151c27a02cdSYevgeny Petrilin #define MLX4_EN_RX_RATE_LOW 400000
152c27a02cdSYevgeny Petrilin #define MLX4_EN_RX_COAL_TIME_LOW 0
153c27a02cdSYevgeny Petrilin #define MLX4_EN_RX_RATE_HIGH 450000
154c27a02cdSYevgeny Petrilin #define MLX4_EN_RX_COAL_TIME_HIGH 128
155c27a02cdSYevgeny Petrilin #define MLX4_EN_RX_SIZE_THRESH 1024
156c27a02cdSYevgeny Petrilin #define MLX4_EN_RX_RATE_THRESH (1000000 / MLX4_EN_RX_COAL_TIME_HIGH)
157c27a02cdSYevgeny Petrilin #define MLX4_EN_SAMPLE_INTERVAL 0
15846afd0fbSYevgeny Petrilin #define MLX4_EN_AVG_PKT_SMALL 256
159c27a02cdSYevgeny Petrilin
160c27a02cdSYevgeny Petrilin #define MLX4_EN_AUTO_CONF 0xffff
161c27a02cdSYevgeny Petrilin
162c27a02cdSYevgeny Petrilin #define MLX4_EN_DEF_RX_PAUSE 1
163c27a02cdSYevgeny Petrilin #define MLX4_EN_DEF_TX_PAUSE 1
164c27a02cdSYevgeny Petrilin
165af901ca1SAndré Goddard Rosa /* Interval between successive polls in the Tx routine when polling is used
166c27a02cdSYevgeny Petrilin instead of interrupts (in per-core Tx rings) - should be power of 2 */
167c27a02cdSYevgeny Petrilin #define MLX4_EN_TX_POLL_MODER 16
168c27a02cdSYevgeny Petrilin #define MLX4_EN_TX_POLL_TIMEOUT (HZ / 4)
169c27a02cdSYevgeny Petrilin
170c27a02cdSYevgeny Petrilin #define SMALL_PACKET_SIZE (256 - NET_IP_ALIGN)
171c27a02cdSYevgeny Petrilin #define HEADER_COPY_SIZE (128 - NET_IP_ALIGN)
172e7c1c2c4SYevgeny Petrilin #define MLX4_LOOPBACK_TEST_PAYLOAD (HEADER_COPY_SIZE - ETH_HLEN)
17378034f5fSEugenia Emantayev #define PREAMBLE_LEN 8
17478034f5fSEugenia Emantayev #define MLX4_SELFTEST_LB_MIN_MTU (MLX4_LOOPBACK_TEST_PAYLOAD + NET_IP_ALIGN + \
17578034f5fSEugenia Emantayev ETH_HLEN + PREAMBLE_LEN)
176c27a02cdSYevgeny Petrilin
17747a38e15SBrenden Blanco /* VLAN_HLEN is added twice,to support skb vlan tagged with multiple
17847a38e15SBrenden Blanco * headers. (For example: ETH_P_8021Q and ETH_P_8021AD).
17947a38e15SBrenden Blanco */
18047a38e15SBrenden Blanco #define MLX4_EN_EFF_MTU(mtu) ((mtu) + ETH_HLEN + (2 * VLAN_HLEN))
181c27a02cdSYevgeny Petrilin #define ETH_BCAST 0xffffffffffffULL
182c27a02cdSYevgeny Petrilin
183e7c1c2c4SYevgeny Petrilin #define MLX4_EN_LOOPBACK_RETRIES 5
184e7c1c2c4SYevgeny Petrilin #define MLX4_EN_LOOPBACK_TIMEOUT 100
185e7c1c2c4SYevgeny Petrilin
186b97b33a3SEugenia Emantayev /* Constants for TX flow */
187b97b33a3SEugenia Emantayev enum {
188b97b33a3SEugenia Emantayev MAX_INLINE = 104, /* 128 - 16 - 4 - 4 */
189b97b33a3SEugenia Emantayev MAX_BF = 256,
190b97b33a3SEugenia Emantayev MIN_PKT_LEN = 17,
191b97b33a3SEugenia Emantayev };
192b97b33a3SEugenia Emantayev
193c27a02cdSYevgeny Petrilin /*
194c27a02cdSYevgeny Petrilin * Configurables
195c27a02cdSYevgeny Petrilin */
196c27a02cdSYevgeny Petrilin
197c27a02cdSYevgeny Petrilin enum cq_type {
19867f8b1dcSTariq Toukan /* keep tx types first */
199ccc109b8STariq Toukan TX,
200ccc109b8STariq Toukan TX_XDP,
20167f8b1dcSTariq Toukan #define MLX4_EN_NUM_TX_TYPES (TX_XDP + 1)
202ccc109b8STariq Toukan RX,
203c27a02cdSYevgeny Petrilin };
204c27a02cdSYevgeny Petrilin
205c27a02cdSYevgeny Petrilin
206c27a02cdSYevgeny Petrilin /*
207c27a02cdSYevgeny Petrilin * Useful macros
208c27a02cdSYevgeny Petrilin */
209c27a02cdSYevgeny Petrilin #define ROUNDUP_LOG2(x) ilog2(roundup_pow_of_two(x))
210c27a02cdSYevgeny Petrilin #define XNOR(x, y) (!(x) == !(y))
211c27a02cdSYevgeny Petrilin
212c27a02cdSYevgeny Petrilin
213c27a02cdSYevgeny Petrilin struct mlx4_en_tx_info {
2149ecc2d86SBrenden Blanco union {
215c27a02cdSYevgeny Petrilin struct sk_buff *skb;
2169ecc2d86SBrenden Blanco struct page *page;
2179ecc2d86SBrenden Blanco };
2183d03641cSEric Dumazet dma_addr_t map0_dma;
2193d03641cSEric Dumazet u32 map0_byte_count;
220c27a02cdSYevgeny Petrilin u32 nr_txbb;
2215b263f53SYevgeny Petrilin u32 nr_bytes;
222c27a02cdSYevgeny Petrilin u8 linear;
223c27a02cdSYevgeny Petrilin u8 data_offset;
22441efea5aSYevgeny Petrilin u8 inl;
225ec693d47SAmir Vadai u8 ts_requested;
2263d03641cSEric Dumazet u8 nr_maps;
22798b16349SEric Dumazet } ____cacheline_aligned_in_smp;
228c27a02cdSYevgeny Petrilin
229c27a02cdSYevgeny Petrilin
230c27a02cdSYevgeny Petrilin #define MLX4_EN_BIT_DESC_OWN 0x80000000
231c27a02cdSYevgeny Petrilin #define MLX4_EN_MEMTYPE_PAD 0x100
232c27a02cdSYevgeny Petrilin
233c27a02cdSYevgeny Petrilin
234c27a02cdSYevgeny Petrilin struct mlx4_en_tx_desc {
235c27a02cdSYevgeny Petrilin struct mlx4_wqe_ctrl_seg ctrl;
236c27a02cdSYevgeny Petrilin union {
237c27a02cdSYevgeny Petrilin struct mlx4_wqe_data_seg data; /* at least one data segment */
238c27a02cdSYevgeny Petrilin struct mlx4_wqe_lso_seg lso;
239c27a02cdSYevgeny Petrilin struct mlx4_wqe_inline_seg inl;
240c27a02cdSYevgeny Petrilin };
241c27a02cdSYevgeny Petrilin };
242c27a02cdSYevgeny Petrilin
243c27a02cdSYevgeny Petrilin #define MLX4_EN_USE_SRQ 0x01000000
244c27a02cdSYevgeny Petrilin
245725c8999SYevgeny Petrilin #define MLX4_EN_CX3_LOW_ID 0x1000
246725c8999SYevgeny Petrilin #define MLX4_EN_CX3_HIGH_ID 0x1005
247725c8999SYevgeny Petrilin
248c27a02cdSYevgeny Petrilin struct mlx4_en_rx_alloc {
249c27a02cdSYevgeny Petrilin struct page *page;
25070fbe079SAmir Vadai u32 page_offset;
251c27a02cdSYevgeny Petrilin };
252c27a02cdSYevgeny Petrilin
253d576acf0SBrenden Blanco #define MLX4_EN_CACHE_SIZE (2 * NAPI_POLL_WEIGHT)
254acd7628dSEric Dumazet
255ba603d9dSMoshe Shemesh enum {
256ba603d9dSMoshe Shemesh MLX4_EN_TX_RING_STATE_RECOVERING,
257ba603d9dSMoshe Shemesh };
258ba603d9dSMoshe Shemesh
2599ecc2d86SBrenden Blanco struct mlx4_en_priv;
2609ecc2d86SBrenden Blanco
261c27a02cdSYevgeny Petrilin struct mlx4_en_tx_ring {
26298b16349SEric Dumazet /* cache line used and dirtied in tx completion
26398b16349SEric Dumazet * (mlx4_en_free_tx_buf())
26498b16349SEric Dumazet */
26598b16349SEric Dumazet u32 last_nr_txbb;
26698b16349SEric Dumazet u32 cons;
26798b16349SEric Dumazet unsigned long wake_queue;
268e3f42f84SEric Dumazet struct netdev_queue *tx_queue;
269e3f42f84SEric Dumazet u32 (*free_tx_desc)(struct mlx4_en_priv *priv,
270e3f42f84SEric Dumazet struct mlx4_en_tx_ring *ring,
271cf97050dSTariq Toukan int index,
272e3f42f84SEric Dumazet u64 timestamp, int napi_mode);
273e3f42f84SEric Dumazet struct mlx4_en_rx_ring *recycle_ring;
27498b16349SEric Dumazet
27598b16349SEric Dumazet /* cache line used and dirtied in mlx4_en_xmit() */
27698b16349SEric Dumazet u32 prod ____cacheline_aligned_in_smp;
277e3f42f84SEric Dumazet unsigned int tx_dropped;
27898b16349SEric Dumazet unsigned long bytes;
27998b16349SEric Dumazet unsigned long packets;
28098b16349SEric Dumazet unsigned long tx_csum;
28198b16349SEric Dumazet unsigned long tso_packets;
28298b16349SEric Dumazet unsigned long xmit_more;
28398b16349SEric Dumazet struct mlx4_bf bf;
28498b16349SEric Dumazet
28598b16349SEric Dumazet /* Following part should be mostly read */
2869ac93627SEric Dumazet void __iomem *doorbell_address;
2876a4e8121SEric Dumazet __be32 doorbell_qpn;
2886a4e8121SEric Dumazet __be32 mr_key;
289e3f42f84SEric Dumazet u32 size; /* number of TXBBs */
290e3f42f84SEric Dumazet u32 size_mask;
291e3f42f84SEric Dumazet u32 full_size;
292e3f42f84SEric Dumazet u32 buf_size;
293c27a02cdSYevgeny Petrilin void *buf;
294c27a02cdSYevgeny Petrilin struct mlx4_en_tx_info *tx_info;
295c27a02cdSYevgeny Petrilin int qpn;
29698b16349SEric Dumazet u8 queue_index;
29787a5c389SYevgeny Petrilin bool bf_enabled;
2980fef9d03SAmir Vadai bool bf_alloced;
299e3f42f84SEric Dumazet u8 hwtstamp_tx_type;
300e3f42f84SEric Dumazet u8 *bounce_buf;
301e3f42f84SEric Dumazet
302e3f42f84SEric Dumazet /* Not used in fast path
303e3f42f84SEric Dumazet * Only queue_stopped might be used if BQL is not properly working.
304e3f42f84SEric Dumazet */
305e3f42f84SEric Dumazet unsigned long queue_stopped;
306ba603d9dSMoshe Shemesh unsigned long state;
307e3f42f84SEric Dumazet struct mlx4_hwq_resources sp_wqres;
308e3f42f84SEric Dumazet struct mlx4_qp sp_qp;
309e3f42f84SEric Dumazet struct mlx4_qp_context sp_context;
310e3f42f84SEric Dumazet cpumask_t sp_affinity_mask;
311e3f42f84SEric Dumazet enum mlx4_qp_state sp_qp_state;
312e3f42f84SEric Dumazet u16 sp_stride;
313e3f42f84SEric Dumazet u16 sp_cqn; /* index of port CQ associated with this ring */
31498b16349SEric Dumazet } ____cacheline_aligned_in_smp;
315c27a02cdSYevgeny Petrilin
316c27a02cdSYevgeny Petrilin struct mlx4_en_rx_desc {
317c27a02cdSYevgeny Petrilin /* actual number of entries depends on rx ring stride */
318966b6b80SGustavo A. R. Silva DECLARE_FLEX_ARRAY(struct mlx4_wqe_data_seg, data);
319c27a02cdSYevgeny Petrilin };
320c27a02cdSYevgeny Petrilin
321c27a02cdSYevgeny Petrilin struct mlx4_en_rx_ring {
322c27a02cdSYevgeny Petrilin struct mlx4_hwq_resources wqres;
323c27a02cdSYevgeny Petrilin u32 size ; /* number of Rx descs*/
324c27a02cdSYevgeny Petrilin u32 actual_size;
325c27a02cdSYevgeny Petrilin u32 size_mask;
326c27a02cdSYevgeny Petrilin u16 stride;
327c27a02cdSYevgeny Petrilin u16 log_stride;
328c27a02cdSYevgeny Petrilin u16 cqn; /* index of port CQ associated with this ring */
329*8533b14bSJakub Kicinski u8 fcs_del;
330c27a02cdSYevgeny Petrilin u32 prod;
331c27a02cdSYevgeny Petrilin u32 cons;
332c27a02cdSYevgeny Petrilin u32 buf_size;
333*8533b14bSJakub Kicinski struct page_pool *pp;
334c27a02cdSYevgeny Petrilin void *buf;
335c27a02cdSYevgeny Petrilin void *rx_info;
336326fe02dSBrenden Blanco struct bpf_prog __rcu *xdp_prog;
337c27a02cdSYevgeny Petrilin unsigned long bytes;
338c27a02cdSYevgeny Petrilin unsigned long packets;
339ad04378cSYevgeny Petrilin unsigned long csum_ok;
340ad04378cSYevgeny Petrilin unsigned long csum_none;
341f8c6455bSShani Michaeli unsigned long csum_complete;
3427d7bfc6aSEric Dumazet unsigned long rx_alloc_pages;
34315fca2c8STariq Toukan unsigned long xdp_drop;
344dee3b2d0SJoshua Roys unsigned long xdp_redirect;
345dee3b2d0SJoshua Roys unsigned long xdp_redirect_fail;
34615fca2c8STariq Toukan unsigned long xdp_tx;
34715fca2c8STariq Toukan unsigned long xdp_tx_full;
348d21ed3a3SEran Ben Elisha unsigned long dropped;
3496166bb0cSJoe Damato unsigned long alloc_fail;
350ec693d47SAmir Vadai int hwtstamp_rx_filter;
3519e311e77SYuval Atias cpumask_var_t affinity_mask;
352ae75415dSJesper Dangaard Brouer struct xdp_rxq_info xdp_rxq;
353c27a02cdSYevgeny Petrilin };
354c27a02cdSYevgeny Petrilin
355c27a02cdSYevgeny Petrilin struct mlx4_en_cq {
356c27a02cdSYevgeny Petrilin struct mlx4_cq mcq;
357c27a02cdSYevgeny Petrilin struct mlx4_hwq_resources wqres;
358c27a02cdSYevgeny Petrilin int ring;
359c27a02cdSYevgeny Petrilin struct net_device *dev;
3606c78511bSTariq Toukan union {
361c27a02cdSYevgeny Petrilin struct napi_struct napi;
3626c78511bSTariq Toukan bool xdp_busy;
3636c78511bSTariq Toukan };
364c27a02cdSYevgeny Petrilin int size;
365c27a02cdSYevgeny Petrilin int buf_size;
366c66fa19cSMatan Barak int vector;
367ccc109b8STariq Toukan enum cq_type type;
368c27a02cdSYevgeny Petrilin u16 moder_time;
369c27a02cdSYevgeny Petrilin u16 moder_cnt;
370c27a02cdSYevgeny Petrilin struct mlx4_cqe *buf;
371c27a02cdSYevgeny Petrilin #define MLX4_EN_OPCODE_ERROR 0x1e
3729e77a2b8SAmir Vadai
37380a62deeSThomas Gleixner const struct cpumask *aff_mask;
37464b62146SJoe Damato int cq_idx;
375c27a02cdSYevgeny Petrilin };
376c27a02cdSYevgeny Petrilin
377c27a02cdSYevgeny Petrilin struct mlx4_en_port_profile {
378c27a02cdSYevgeny Petrilin u32 flags;
37967f8b1dcSTariq Toukan u32 tx_ring_num[MLX4_EN_NUM_TX_TYPES];
380c27a02cdSYevgeny Petrilin u32 rx_ring_num;
381c27a02cdSYevgeny Petrilin u32 tx_ring_size;
382c27a02cdSYevgeny Petrilin u32 rx_ring_size;
383ec25bc04SEugenia Emantayev u8 num_tx_rings_p_up;
384d53b93f2SYevgeny Petrilin u8 rx_pause;
385d53b93f2SYevgeny Petrilin u8 rx_ppp;
386d53b93f2SYevgeny Petrilin u8 tx_pause;
387d53b93f2SYevgeny Petrilin u8 tx_ppp;
388f21ad614SInbar Karmy u8 num_up;
38993d3e367SYevgeny Petrilin int rss_rings;
390b97b33a3SEugenia Emantayev int inline_thold;
391ec25bc04SEugenia Emantayev struct hwtstamp_config hwtstamp_config;
392c27a02cdSYevgeny Petrilin };
393c27a02cdSYevgeny Petrilin
394c27a02cdSYevgeny Petrilin struct mlx4_en_profile {
3950533943cSYevgeny Petrilin int udp_rss;
396c27a02cdSYevgeny Petrilin u8 rss_mask;
397c27a02cdSYevgeny Petrilin u32 active_ports;
398c27a02cdSYevgeny Petrilin u32 small_pkt_int;
399c27a02cdSYevgeny Petrilin u8 no_reset;
4007e1dc5e9SInbar Karmy u8 max_num_tx_rings_p_up;
401c27a02cdSYevgeny Petrilin struct mlx4_en_port_profile prof[MLX4_MAX_PORTS + 1];
402c27a02cdSYevgeny Petrilin };
403c27a02cdSYevgeny Petrilin
404c27a02cdSYevgeny Petrilin struct mlx4_en_dev {
405c27a02cdSYevgeny Petrilin struct mlx4_dev *dev;
406c27a02cdSYevgeny Petrilin struct pci_dev *pdev;
407c27a02cdSYevgeny Petrilin struct mutex state_lock;
408c27a02cdSYevgeny Petrilin struct net_device *pndev[MLX4_MAX_PORTS + 1];
4095da03547SMoni Shoua struct net_device *upper[MLX4_MAX_PORTS + 1];
410c27a02cdSYevgeny Petrilin u32 port_cnt;
411c27a02cdSYevgeny Petrilin bool device_up;
412c27a02cdSYevgeny Petrilin struct mlx4_en_profile profile;
413c27a02cdSYevgeny Petrilin u32 LSO_support;
414c27a02cdSYevgeny Petrilin struct workqueue_struct *workqueue;
415c27a02cdSYevgeny Petrilin struct device *dma_device;
416c27a02cdSYevgeny Petrilin void __iomem *uar_map;
417c27a02cdSYevgeny Petrilin struct mlx4_uar priv_uar;
418c27a02cdSYevgeny Petrilin struct mlx4_mr mr;
419c27a02cdSYevgeny Petrilin u32 priv_pdn;
420c27a02cdSYevgeny Petrilin spinlock_t uar_lock;
421d7e1a487SYevgeny Petrilin u8 mac_removed[MLX4_MAX_PORTS + 1];
422ad7d4eaeSShawn Bohrer u32 nominal_c_mult;
423ec693d47SAmir Vadai struct cyclecounter cycles;
42499f5711eSEric Dumazet seqlock_t clock_lock;
425ec693d47SAmir Vadai struct timecounter clock;
426ec693d47SAmir Vadai unsigned long last_overflow_check;
427ad7d4eaeSShawn Bohrer struct ptp_clock *ptp_clock;
428ad7d4eaeSShawn Bohrer struct ptp_clock_info ptp_clock_info;
429ef5617e3SPetr Pavlu struct notifier_block netdev_nb;
43073d68002SPetr Pavlu struct notifier_block mlx_nb;
431c27a02cdSYevgeny Petrilin };
432c27a02cdSYevgeny Petrilin
433c27a02cdSYevgeny Petrilin
434c27a02cdSYevgeny Petrilin struct mlx4_en_rss_map {
435c27a02cdSYevgeny Petrilin int base_qpn;
436b6b912e0SYevgeny Petrilin struct mlx4_qp qps[MAX_RX_RINGS];
437b6b912e0SYevgeny Petrilin enum mlx4_qp_state state[MAX_RX_RINGS];
4384931c6efSSaeed Mahameed struct mlx4_qp *indir_qp;
439c27a02cdSYevgeny Petrilin enum mlx4_qp_state indir_state;
440c27a02cdSYevgeny Petrilin };
441c27a02cdSYevgeny Petrilin
4422c762679SSaeed Mahameed enum mlx4_en_port_flag {
4432c762679SSaeed Mahameed MLX4_EN_PORT_ANC = 1<<0, /* Auto-negotiation complete */
4442c762679SSaeed Mahameed MLX4_EN_PORT_ANE = 1<<1, /* Auto-negotiation enabled */
4452c762679SSaeed Mahameed };
4462c762679SSaeed Mahameed
447e7c1c2c4SYevgeny Petrilin struct mlx4_en_port_state {
448e7c1c2c4SYevgeny Petrilin int link_state;
449e7c1c2c4SYevgeny Petrilin int link_speed;
4502c762679SSaeed Mahameed int transceiver;
4512c762679SSaeed Mahameed u32 flags;
452e7c1c2c4SYevgeny Petrilin };
453e7c1c2c4SYevgeny Petrilin
4546d199937SYevgeny Petrilin enum mlx4_en_mclist_act {
4556d199937SYevgeny Petrilin MCLIST_NONE,
4566d199937SYevgeny Petrilin MCLIST_REM,
4576d199937SYevgeny Petrilin MCLIST_ADD,
4586d199937SYevgeny Petrilin };
4596d199937SYevgeny Petrilin
4606d199937SYevgeny Petrilin struct mlx4_en_mc_list {
4616d199937SYevgeny Petrilin struct list_head list;
4626d199937SYevgeny Petrilin enum mlx4_en_mclist_act action;
4636d199937SYevgeny Petrilin u8 addr[ETH_ALEN];
4640ff1fb65SHadar Hen Zion u64 reg_id;
465837052d0SOr Gerlitz u64 tunnel_reg_id;
4666d199937SYevgeny Petrilin };
4676d199937SYevgeny Petrilin
468c27a02cdSYevgeny Petrilin struct mlx4_en_frag_info {
469c27a02cdSYevgeny Petrilin u16 frag_size;
470aaca121dSEric Dumazet u32 frag_stride;
471c27a02cdSYevgeny Petrilin };
472c27a02cdSYevgeny Petrilin
473564c274cSAmir Vadai #ifdef CONFIG_MLX4_EN_DCB
474564c274cSAmir Vadai /* Minimal TC BW - setting to 0 will block traffic */
475564c274cSAmir Vadai #define MLX4_EN_BW_MIN 1
476564c274cSAmir Vadai #define MLX4_EN_BW_MAX 100 /* Utilize 100% of the line */
477564c274cSAmir Vadai
478a42b63c1SMoni Shoua #define MLX4_EN_TC_VENDOR 0
479564c274cSAmir Vadai #define MLX4_EN_TC_ETS 7
480564c274cSAmir Vadai
481af7d5185SRana Shahout enum dcb_pfc_type {
482af7d5185SRana Shahout pfc_disabled = 0,
483af7d5185SRana Shahout pfc_enabled_full,
484af7d5185SRana Shahout pfc_enabled_tx,
485af7d5185SRana Shahout pfc_enabled_rx
486af7d5185SRana Shahout };
487af7d5185SRana Shahout
488af7d5185SRana Shahout struct mlx4_en_cee_config {
489af7d5185SRana Shahout bool pfc_state;
490f21ad614SInbar Karmy enum dcb_pfc_type dcb_pfc[MLX4_EN_NUM_UP_HIGH];
491af7d5185SRana Shahout };
492564c274cSAmir Vadai #endif
493564c274cSAmir Vadai
49482067281SHadar Hen Zion struct ethtool_flow_id {
4950d256c0eSHadar Hen Zion struct list_head list;
49682067281SHadar Hen Zion struct ethtool_rx_flow_spec flow_spec;
49782067281SHadar Hen Zion u64 id;
49882067281SHadar Hen Zion };
49982067281SHadar Hen Zion
50079aeaccdSYan Burman enum {
50179aeaccdSYan Burman MLX4_EN_FLAG_PROMISC = (1 << 0),
50279aeaccdSYan Burman MLX4_EN_FLAG_MC_PROMISC = (1 << 1),
50379aeaccdSYan Burman /* whether we need to enable hardware loopback by putting dmac
50479aeaccdSYan Burman * in Tx WQE
50579aeaccdSYan Burman */
50679aeaccdSYan Burman MLX4_EN_FLAG_ENABLE_HW_LOOPBACK = (1 << 2),
50779aeaccdSYan Burman /* whether we need to drop packets that hardware loopback-ed */
508cc5387f7SYan Burman MLX4_EN_FLAG_RX_FILTER_NEEDED = (1 << 3),
509f8c6455bSShani Michaeli MLX4_EN_FLAG_FORCE_PROMISC = (1 << 4),
510f8c6455bSShani Michaeli MLX4_EN_FLAG_RX_CSUM_NON_TCP_UDP = (1 << 5),
511af7d5185SRana Shahout #ifdef CONFIG_MLX4_EN_DCB
512af7d5185SRana Shahout MLX4_EN_FLAG_DCB_ENABLED = (1 << 6),
513af7d5185SRana Shahout #endif
51479aeaccdSYan Burman };
51579aeaccdSYan Burman
51651af33cfSIdo Shamay #define PORT_BEACON_MAX_LIMIT (65535)
517c07cb4b0SYan Burman #define MLX4_EN_MAC_HASH_SIZE (1 << BITS_PER_BYTE)
518c07cb4b0SYan Burman #define MLX4_EN_MAC_HASH_IDX 5
519c07cb4b0SYan Burman
5203da8a36cSEran Ben Elisha struct mlx4_en_stats_bitmap {
5213da8a36cSEran Ben Elisha DECLARE_BITMAP(bitmap, NUM_ALL_STATS);
5223da8a36cSEran Ben Elisha struct mutex mutex; /* for mutual access to stats bitmap */
5233da8a36cSEran Ben Elisha };
5243da8a36cSEran Ben Elisha
525fed91613SMoshe Shemesh enum {
526fed91613SMoshe Shemesh MLX4_EN_STATE_FLAG_RESTARTING,
527fed91613SMoshe Shemesh };
528fed91613SMoshe Shemesh
529c27a02cdSYevgeny Petrilin struct mlx4_en_priv {
530c27a02cdSYevgeny Petrilin struct mlx4_en_dev *mdev;
531c27a02cdSYevgeny Petrilin struct mlx4_en_port_profile *prof;
532c27a02cdSYevgeny Petrilin struct net_device *dev;
533f1b553fbSJiri Pirko unsigned long active_vlans[BITS_TO_LONGS(VLAN_N_VID)];
534e7c1c2c4SYevgeny Petrilin struct mlx4_en_port_state port_state;
535c27a02cdSYevgeny Petrilin spinlock_t stats_lock;
53682067281SHadar Hen Zion struct ethtool_flow_id ethtool_rules[MAX_NUM_OF_FS_RULES];
5370d256c0eSHadar Hen Zion /* To allow rules removal while port is going down */
5380d256c0eSHadar Hen Zion struct list_head ethtool_list;
539c27a02cdSYevgeny Petrilin
5406b4d8d9fSAlexander Guller unsigned long last_moder_packets[MAX_RX_RINGS];
541c27a02cdSYevgeny Petrilin unsigned long last_moder_tx_packets;
5426b4d8d9fSAlexander Guller unsigned long last_moder_bytes[MAX_RX_RINGS];
543c27a02cdSYevgeny Petrilin unsigned long last_moder_jiffies;
5446b4d8d9fSAlexander Guller int last_moder_time[MAX_RX_RINGS];
545c27a02cdSYevgeny Petrilin u16 rx_usecs;
546c27a02cdSYevgeny Petrilin u16 rx_frames;
547c27a02cdSYevgeny Petrilin u16 tx_usecs;
548c27a02cdSYevgeny Petrilin u16 tx_frames;
549c27a02cdSYevgeny Petrilin u32 pkt_rate_low;
550c27a02cdSYevgeny Petrilin u16 rx_usecs_low;
551c27a02cdSYevgeny Petrilin u32 pkt_rate_high;
552c27a02cdSYevgeny Petrilin u16 rx_usecs_high;
5536ad4e91cSMoshe Shemesh u32 sample_interval;
5546ad4e91cSMoshe Shemesh u32 adaptive_rx_coal;
555c27a02cdSYevgeny Petrilin u32 msg_enable;
556e7c1c2c4SYevgeny Petrilin u32 loopback_ok;
557e7c1c2c4SYevgeny Petrilin u32 validate_loopback;
558c27a02cdSYevgeny Petrilin
559c27a02cdSYevgeny Petrilin struct mlx4_hwq_resources res;
560c27a02cdSYevgeny Petrilin int link_state;
561c27a02cdSYevgeny Petrilin bool port_up;
562c27a02cdSYevgeny Petrilin int port;
563c27a02cdSYevgeny Petrilin int registered;
564c27a02cdSYevgeny Petrilin int allocated;
565c27a02cdSYevgeny Petrilin int stride;
5662695bab2SNoa Osherovich unsigned char current_mac[ETH_ALEN + 2];
567c27a02cdSYevgeny Petrilin int mac_index;
568c27a02cdSYevgeny Petrilin unsigned max_mtu;
569c27a02cdSYevgeny Petrilin int base_qpn;
57008ff3235SOr Gerlitz int cqe_factor;
571b1b6b4daSIdo Shamay int cqe_size;
572c27a02cdSYevgeny Petrilin
573c27a02cdSYevgeny Petrilin struct mlx4_en_rss_map rss_map;
5744ef2a435SOr Gerlitz __be32 ctrl_flags;
575c27a02cdSYevgeny Petrilin u32 flags;
576d317966bSAmir Vadai u8 num_tx_rings_p_up;
577fbc6daf1SAmir Vadai u32 tx_work_limit;
57867f8b1dcSTariq Toukan u32 tx_ring_num[MLX4_EN_NUM_TX_TYPES];
579c27a02cdSYevgeny Petrilin u32 rx_ring_num;
580c27a02cdSYevgeny Petrilin u32 rx_skb_size;
581c27a02cdSYevgeny Petrilin struct mlx4_en_frag_info frag_info[MLX4_EN_MAX_RX_FRAGS];
58269ba9431SEric Dumazet u8 num_frags;
58369ba9431SEric Dumazet u8 log_rx_info;
58469ba9431SEric Dumazet u8 dma_dir;
585d85f6c14SEric Dumazet u16 rx_headroom;
586c27a02cdSYevgeny Petrilin
58767f8b1dcSTariq Toukan struct mlx4_en_tx_ring **tx_ring[MLX4_EN_NUM_TX_TYPES];
58841d942d5SEugenia Emantayev struct mlx4_en_rx_ring *rx_ring[MAX_RX_RINGS];
58967f8b1dcSTariq Toukan struct mlx4_en_cq **tx_cq[MLX4_EN_NUM_TX_TYPES];
59041d942d5SEugenia Emantayev struct mlx4_en_cq *rx_cq[MAX_RX_RINGS];
591cabdc8eeSHadar Hen Zion struct mlx4_qp drop_qp;
5920eb74fddSYan Burman struct work_struct rx_mode_task;
593fed91613SMoshe Shemesh struct work_struct restart_task;
594c27a02cdSYevgeny Petrilin struct work_struct linkstate_task;
595c27a02cdSYevgeny Petrilin struct delayed_work stats_task;
596b6c39bfcSAmir Vadai struct delayed_work service_task;
597c27a02cdSYevgeny Petrilin struct mlx4_en_pkt_stats pkstats;
598b42de4d0SEran Ben Elisha struct mlx4_en_counter_stats pf_stats;
5990b131561SMatan Barak struct mlx4_en_flow_stats_rx rx_priority_flowstats[MLX4_NUM_PRIORITIES];
6000b131561SMatan Barak struct mlx4_en_flow_stats_tx tx_priority_flowstats[MLX4_NUM_PRIORITIES];
6010b131561SMatan Barak struct mlx4_en_flow_stats_rx rx_flowstats;
6020b131561SMatan Barak struct mlx4_en_flow_stats_tx tx_flowstats;
603c27a02cdSYevgeny Petrilin struct mlx4_en_port_stats port_stats;
60415fca2c8STariq Toukan struct mlx4_en_xdp_stats xdp_stats;
605f26d0d25SEran Ben Elisha struct mlx4_en_phy_stats phy_stats;
6063da8a36cSEran Ben Elisha struct mlx4_en_stats_bitmap stats_bitmap;
6076d199937SYevgeny Petrilin struct list_head mc_list;
6086d199937SYevgeny Petrilin struct list_head curr_list;
6090ff1fb65SHadar Hen Zion u64 broadcast_id;
610c27a02cdSYevgeny Petrilin struct mlx4_en_stat_out_mbox hw_stats;
6114c3eb3caSEli Cohen int vids[128];
61214c07b13SYevgeny Petrilin bool wol;
613ebf8c9aaSYevgeny Petrilin struct device *ddev;
614c07cb4b0SYan Burman struct hlist_head mac_hash[MLX4_EN_MAC_HASH_SIZE];
615ec693d47SAmir Vadai struct hwtstamp_config hwtstamp_config;
6166de5f7f6SEran Ben Elisha u32 counter_index;
617564c274cSAmir Vadai
618564c274cSAmir Vadai #ifdef CONFIG_MLX4_EN_DCB
619af7d5185SRana Shahout #define MLX4_EN_DCB_ENABLED 0x3
620564c274cSAmir Vadai struct ieee_ets ets;
621109d2446SAmir Vadai u16 maxrate[IEEE_8021QAZ_MAX_TCS];
622708b869bSShani Michaeli enum dcbnl_cndd_states cndd_state[IEEE_8021QAZ_MAX_TCS];
623564ed9b1STariq Toukan struct mlx4_en_cee_config cee_config;
624564ed9b1STariq Toukan u8 dcbx_cap;
625564c274cSAmir Vadai #endif
6261eb8c695SAmir Vadai #ifdef CONFIG_RFS_ACCEL
6271eb8c695SAmir Vadai spinlock_t filters_lock;
6281eb8c695SAmir Vadai int last_filter_id;
6291eb8c695SAmir Vadai struct list_head filters;
6301eb8c695SAmir Vadai struct hlist_head filter_hash[1 << MLX4_EN_FILTER_HASH_SHIFT];
6311eb8c695SAmir Vadai #endif
632837052d0SOr Gerlitz u64 tunnel_reg_id;
6331b136de1SOr Gerlitz __be16 vxlan_port;
6340fef9d03SAmir Vadai
6350fef9d03SAmir Vadai u32 pflags;
636bd635c35SEric Dumazet u8 rss_key[MLX4_EN_RSS_KEY_SIZE];
637947cbb0aSEyal Perry u8 rss_hash_fn;
638fed91613SMoshe Shemesh unsigned long state;
63914c07b13SYevgeny Petrilin };
64014c07b13SYevgeny Petrilin
64114c07b13SYevgeny Petrilin enum mlx4_en_wol {
64214c07b13SYevgeny Petrilin MLX4_EN_WOL_MAGIC = (1ULL << 61),
64314c07b13SYevgeny Petrilin MLX4_EN_WOL_ENABLED = (1ULL << 62),
644c27a02cdSYevgeny Petrilin };
645c27a02cdSYevgeny Petrilin
64616a10ffdSYan Burman struct mlx4_mac_entry {
647c07cb4b0SYan Burman struct hlist_node hlist;
64816a10ffdSYan Burman unsigned char mac[ETH_ALEN + 2];
64916a10ffdSYan Burman u64 reg_id;
650c07cb4b0SYan Burman struct rcu_head rcu;
65116a10ffdSYan Burman };
65216a10ffdSYan Burman
mlx4_en_get_cqe(void * buf,int idx,int cqe_sz)653b1b6b4daSIdo Shamay static inline struct mlx4_cqe *mlx4_en_get_cqe(void *buf, int idx, int cqe_sz)
654b1b6b4daSIdo Shamay {
655b1b6b4daSIdo Shamay return buf + idx * cqe_sz;
656b1b6b4daSIdo Shamay }
657b1b6b4daSIdo Shamay
6580d9fdaa9SOr Gerlitz #define MLX4_EN_WOL_DO_MODIFY (1ULL << 63)
659c27a02cdSYevgeny Petrilin
6603d8f7cc7SDavid Decotigny void mlx4_en_init_ptys2ethtool_map(void);
66179aeaccdSYan Burman void mlx4_en_update_loopback_state(struct net_device *dev,
66279aeaccdSYan Burman netdev_features_t features);
66379aeaccdSYan Burman
664c27a02cdSYevgeny Petrilin void mlx4_en_destroy_netdev(struct net_device *dev);
665c27a02cdSYevgeny Petrilin int mlx4_en_init_netdev(struct mlx4_en_dev *mdev, int port,
666c27a02cdSYevgeny Petrilin struct mlx4_en_port_profile *prof);
667c27a02cdSYevgeny Petrilin
66818cc42a3SYevgeny Petrilin int mlx4_en_start_port(struct net_device *dev);
6693484aac1SAmir Vadai void mlx4_en_stop_port(struct net_device *dev, int detach);
67018cc42a3SYevgeny Petrilin
6716fcd2735SEran Ben Elisha void mlx4_en_set_stats_bitmap(struct mlx4_dev *dev,
6720b131561SMatan Barak struct mlx4_en_stats_bitmap *stats_bitmap,
6730b131561SMatan Barak u8 rx_ppp, u8 rx_pause,
6740b131561SMatan Barak u8 tx_ppp, u8 tx_pause);
675ffa88f37SEran Ben Elisha
676ec25bc04SEugenia Emantayev int mlx4_en_try_alloc_resources(struct mlx4_en_priv *priv,
677ec25bc04SEugenia Emantayev struct mlx4_en_priv *tmp,
678770f8225SMartin KaFai Lau struct mlx4_en_port_profile *prof,
679770f8225SMartin KaFai Lau bool carry_xdp_prog);
680ec25bc04SEugenia Emantayev void mlx4_en_safe_replace_resources(struct mlx4_en_priv *priv,
681ec25bc04SEugenia Emantayev struct mlx4_en_priv *tmp);
68218cc42a3SYevgeny Petrilin
68341d942d5SEugenia Emantayev int mlx4_en_create_cq(struct mlx4_en_priv *priv, struct mlx4_en_cq **pcq,
684163561a4SEugenia Emantayev int entries, int ring, enum cq_type mode, int node);
68541d942d5SEugenia Emantayev void mlx4_en_destroy_cq(struct mlx4_en_priv *priv, struct mlx4_en_cq **pcq);
68676532d0cSAlexander Guller int mlx4_en_activate_cq(struct mlx4_en_priv *priv, struct mlx4_en_cq *cq,
68776532d0cSAlexander Guller int cq_idx);
688c27a02cdSYevgeny Petrilin void mlx4_en_deactivate_cq(struct mlx4_en_priv *priv, struct mlx4_en_cq *cq);
689c27a02cdSYevgeny Petrilin int mlx4_en_set_cq_moder(struct mlx4_en_priv *priv, struct mlx4_en_cq *cq);
690f3eebe88SZhu Yanjun void mlx4_en_arm_cq(struct mlx4_en_priv *priv, struct mlx4_en_cq *cq);
691c27a02cdSYevgeny Petrilin
692c27a02cdSYevgeny Petrilin void mlx4_en_tx_irq(struct mlx4_cq *mcq);
693f663dd9aSJason Wang u16 mlx4_en_select_queue(struct net_device *dev, struct sk_buff *skb,
694a350ecceSPaolo Abeni struct net_device *sb_dev);
69561357325SStephen Hemminger netdev_tx_t mlx4_en_xmit(struct sk_buff *skb, struct net_device *dev);
69615fca2c8STariq Toukan netdev_tx_t mlx4_en_xmit_frame(struct mlx4_en_rx_ring *rx_ring,
69715fca2c8STariq Toukan struct mlx4_en_rx_alloc *frame,
6985dad61b8STariq Toukan struct mlx4_en_priv *priv, unsigned int length,
69936ea7964STariq Toukan int tx_ind, bool *doorbell_pending);
7009ecc2d86SBrenden Blanco void mlx4_en_xmit_doorbell(struct mlx4_en_tx_ring *ring);
701c27a02cdSYevgeny Petrilin
70241d942d5SEugenia Emantayev int mlx4_en_create_tx_ring(struct mlx4_en_priv *priv,
70341d942d5SEugenia Emantayev struct mlx4_en_tx_ring **pring,
704ddae0349SEugenia Emantayev u32 size, u16 stride,
705d03a68f8SIdo Shamay int node, int queue_index);
70641d942d5SEugenia Emantayev void mlx4_en_destroy_tx_ring(struct mlx4_en_priv *priv,
70741d942d5SEugenia Emantayev struct mlx4_en_tx_ring **pring);
708f025fd60STariq Toukan void mlx4_en_init_tx_xdp_ring_descs(struct mlx4_en_priv *priv,
709f025fd60STariq Toukan struct mlx4_en_tx_ring *ring);
710c27a02cdSYevgeny Petrilin int mlx4_en_activate_tx_ring(struct mlx4_en_priv *priv,
711c27a02cdSYevgeny Petrilin struct mlx4_en_tx_ring *ring,
7120e98b523SAmir Vadai int cq, int user_prio);
713c27a02cdSYevgeny Petrilin void mlx4_en_deactivate_tx_ring(struct mlx4_en_priv *priv,
714c27a02cdSYevgeny Petrilin struct mlx4_en_tx_ring *ring);
71502512482SIdo Shamay void mlx4_en_set_num_rx_rings(struct mlx4_en_dev *mdev);
71607841f9dSIdo Shamay void mlx4_en_recover_from_oom(struct mlx4_en_priv *priv);
717c27a02cdSYevgeny Petrilin int mlx4_en_create_rx_ring(struct mlx4_en_priv *priv,
71841d942d5SEugenia Emantayev struct mlx4_en_rx_ring **pring,
719ae75415dSJesper Dangaard Brouer u32 size, u16 stride, int node, int queue_index);
720c27a02cdSYevgeny Petrilin void mlx4_en_destroy_rx_ring(struct mlx4_en_priv *priv,
72141d942d5SEugenia Emantayev struct mlx4_en_rx_ring **pring,
72268355f71SThadeu Lima de Souza Cascardo u32 size, u16 stride);
723c27a02cdSYevgeny Petrilin int mlx4_en_activate_rx_rings(struct mlx4_en_priv *priv);
724c27a02cdSYevgeny Petrilin void mlx4_en_deactivate_rx_ring(struct mlx4_en_priv *priv,
725c27a02cdSYevgeny Petrilin struct mlx4_en_rx_ring *ring);
726c27a02cdSYevgeny Petrilin int mlx4_en_process_rx_cq(struct net_device *dev,
727c27a02cdSYevgeny Petrilin struct mlx4_en_cq *cq,
728c27a02cdSYevgeny Petrilin int budget);
729c27a02cdSYevgeny Petrilin int mlx4_en_poll_rx_cq(struct napi_struct *napi, int budget);
7300276a330SEugenia Emantayev int mlx4_en_poll_tx_cq(struct napi_struct *napi, int budget);
731cf4058dbSEric Dumazet int mlx4_en_process_tx_cq(struct net_device *dev,
7326c78511bSTariq Toukan struct mlx4_en_cq *cq, int napi_budget);
7339ecc2d86SBrenden Blanco u32 mlx4_en_free_tx_desc(struct mlx4_en_priv *priv,
7349ecc2d86SBrenden Blanco struct mlx4_en_tx_ring *ring,
735cf97050dSTariq Toukan int index, u64 timestamp,
7369ecc2d86SBrenden Blanco int napi_mode);
7379ecc2d86SBrenden Blanco u32 mlx4_en_recycle_tx_desc(struct mlx4_en_priv *priv,
7389ecc2d86SBrenden Blanco struct mlx4_en_tx_ring *ring,
739cf97050dSTariq Toukan int index, u64 timestamp,
7409ecc2d86SBrenden Blanco int napi_mode);
741c27a02cdSYevgeny Petrilin void mlx4_en_fill_qp_context(struct mlx4_en_priv *priv, int size, int stride,
7420e98b523SAmir Vadai int is_tx, int rss, int qpn, int cqn, int user_prio,
743c27a02cdSYevgeny Petrilin struct mlx4_qp_context *context);
744966508f7SYevgeny Petrilin void mlx4_en_sqp_event(struct mlx4_qp *qp, enum mlx4_event event);
74574194fb9SMaor Gottlieb int mlx4_en_change_mcast_lb(struct mlx4_en_priv *priv, struct mlx4_qp *qp,
74674194fb9SMaor Gottlieb int loopback);
747c27a02cdSYevgeny Petrilin void mlx4_en_calc_rx_buf(struct net_device *dev);
748c27a02cdSYevgeny Petrilin int mlx4_en_config_rss_steer(struct mlx4_en_priv *priv);
749c27a02cdSYevgeny Petrilin void mlx4_en_release_rss_steer(struct mlx4_en_priv *priv);
750cabdc8eeSHadar Hen Zion int mlx4_en_create_drop_qp(struct mlx4_en_priv *priv);
751cabdc8eeSHadar Hen Zion void mlx4_en_destroy_drop_qp(struct mlx4_en_priv *priv);
752c27a02cdSYevgeny Petrilin int mlx4_en_free_tx_buf(struct net_device *dev, struct mlx4_en_tx_ring *ring);
753c27a02cdSYevgeny Petrilin void mlx4_en_rx_irq(struct mlx4_cq *mcq);
754c27a02cdSYevgeny Petrilin
755c27a02cdSYevgeny Petrilin int mlx4_SET_MCAST_FLTR(struct mlx4_dev *dev, u8 port, u64 mac, u64 clear, u8 mode);
756f1b553fbSJiri Pirko int mlx4_SET_VLAN_FLTR(struct mlx4_dev *dev, struct mlx4_en_priv *priv);
757c27a02cdSYevgeny Petrilin
75840931b85SEric Dumazet void mlx4_en_fold_software_stats(struct net_device *dev);
759c27a02cdSYevgeny Petrilin int mlx4_en_DUMP_ETH_STATS(struct mlx4_en_dev *mdev, u8 port, u8 reset);
760e7c1c2c4SYevgeny Petrilin int mlx4_en_QUERY_PORT(struct mlx4_en_dev *mdev, u8 port);
761e7c1c2c4SYevgeny Petrilin
762564c274cSAmir Vadai #ifdef CONFIG_MLX4_EN_DCB
763564c274cSAmir Vadai extern const struct dcbnl_rtnl_ops mlx4_en_dcbnl_ops;
764540b3a39SOr Gerlitz extern const struct dcbnl_rtnl_ops mlx4_en_dcbnl_pfc_ops;
765564c274cSAmir Vadai #endif
766564c274cSAmir Vadai
767d317966bSAmir Vadai int mlx4_en_setup_tc(struct net_device *dev, u8 up);
768ec327f7aSInbar Karmy int mlx4_en_alloc_tx_queue_per_tc(struct net_device *dev, u8 tc);
769d317966bSAmir Vadai
7701eb8c695SAmir Vadai #ifdef CONFIG_RFS_ACCEL
77141d942d5SEugenia Emantayev void mlx4_en_cleanup_filters(struct mlx4_en_priv *priv);
7721eb8c695SAmir Vadai #endif
7731eb8c695SAmir Vadai
774e7c1c2c4SYevgeny Petrilin #define MLX4_EN_NUM_SELF_TEST 5
775e7c1c2c4SYevgeny Petrilin void mlx4_en_ex_selftest(struct net_device *dev, u32 *flags, u64 *buf);
776b6c39bfcSAmir Vadai void mlx4_en_ptp_overflow_check(struct mlx4_en_dev *mdev);
777c27a02cdSYevgeny Petrilin
7787787fa66SSaeed Mahameed #define DEV_FEATURE_CHANGED(dev, new_features, feature) \
7797787fa66SSaeed Mahameed ((dev->features & feature) ^ (new_features & feature))
7807787fa66SSaeed Mahameed
78100ff801bSKevin(Yudong) Yang int mlx4_en_moderation_update(struct mlx4_en_priv *priv);
7827787fa66SSaeed Mahameed int mlx4_en_reset_config(struct net_device *dev,
7837787fa66SSaeed Mahameed struct hwtstamp_config ts_config,
7847787fa66SSaeed Mahameed netdev_features_t new_features);
7850b131561SMatan Barak void mlx4_en_update_pfc_stats_bitmap(struct mlx4_dev *dev,
7860b131561SMatan Barak struct mlx4_en_stats_bitmap *stats_bitmap,
7870b131561SMatan Barak u8 rx_ppp, u8 rx_pause,
7880b131561SMatan Barak u8 tx_ppp, u8 tx_pause);
7895da03547SMoni Shoua int mlx4_en_netdev_event(struct notifier_block *this,
7905da03547SMoni Shoua unsigned long event, void *ptr);
7915da03547SMoni Shoua
792ab46182dSStanislav Fomichev struct xdp_md;
793ab46182dSStanislav Fomichev int mlx4_en_xdp_rx_timestamp(const struct xdp_md *ctx, u64 *timestamp);
7940cd917a4SJesper Dangaard Brouer int mlx4_en_xdp_rx_hash(const struct xdp_md *ctx, u32 *hash,
7950cd917a4SJesper Dangaard Brouer enum xdp_rss_hash_type *rss_type);
796ab46182dSStanislav Fomichev
797c27a02cdSYevgeny Petrilin /*
798ec693d47SAmir Vadai * Functions for time stamping
799ec693d47SAmir Vadai */
800ec693d47SAmir Vadai u64 mlx4_en_get_cqe_ts(struct mlx4_cqe *cqe);
801ab46182dSStanislav Fomichev u64 mlx4_en_get_hwtstamp(struct mlx4_en_dev *mdev, u64 timestamp);
802ec693d47SAmir Vadai void mlx4_en_fill_hwtstamps(struct mlx4_en_dev *mdev,
803ec693d47SAmir Vadai struct skb_shared_hwtstamps *hwts,
804ec693d47SAmir Vadai u64 timestamp);
805ec693d47SAmir Vadai void mlx4_en_init_timestamp(struct mlx4_en_dev *mdev);
806ad7d4eaeSShawn Bohrer void mlx4_en_remove_timestamp(struct mlx4_en_dev *mdev);
807ec693d47SAmir Vadai
808ec693d47SAmir Vadai /* Globals
809c27a02cdSYevgeny Petrilin */
810c27a02cdSYevgeny Petrilin extern const struct ethtool_ops mlx4_en_ethtool_ops;
8110a645e80SJoe Perches
8120a645e80SJoe Perches
8130a645e80SJoe Perches
8140a645e80SJoe Perches /*
8150a645e80SJoe Perches * printk / logging functions
8160a645e80SJoe Perches */
8170a645e80SJoe Perches
818b9075fa9SJoe Perches __printf(3, 4)
8190c87b29cSJoe Perches void en_print(const char *level, const struct mlx4_en_priv *priv,
820b9075fa9SJoe Perches const char *format, ...);
8210a645e80SJoe Perches
8221a91de28SJoe Perches #define en_dbg(mlevel, priv, format, ...) \
8230a645e80SJoe Perches do { \
8241a91de28SJoe Perches if (NETIF_MSG_##mlevel & (priv)->msg_enable) \
8251a91de28SJoe Perches en_print(KERN_DEBUG, priv, format, ##__VA_ARGS__); \
8260a645e80SJoe Perches } while (0)
8271a91de28SJoe Perches #define en_warn(priv, format, ...) \
8281a91de28SJoe Perches en_print(KERN_WARNING, priv, format, ##__VA_ARGS__)
8291a91de28SJoe Perches #define en_err(priv, format, ...) \
8301a91de28SJoe Perches en_print(KERN_ERR, priv, format, ##__VA_ARGS__)
8311a91de28SJoe Perches #define en_info(priv, format, ...) \
8321a91de28SJoe Perches en_print(KERN_INFO, priv, format, ##__VA_ARGS__)
8330a645e80SJoe Perches
8341a91de28SJoe Perches #define mlx4_err(mdev, format, ...) \
8351a91de28SJoe Perches pr_err(DRV_NAME " %s: " format, \
8361a91de28SJoe Perches dev_name(&(mdev)->pdev->dev), ##__VA_ARGS__)
8371a91de28SJoe Perches #define mlx4_info(mdev, format, ...) \
8381a91de28SJoe Perches pr_info(DRV_NAME " %s: " format, \
8391a91de28SJoe Perches dev_name(&(mdev)->pdev->dev), ##__VA_ARGS__)
8401a91de28SJoe Perches #define mlx4_warn(mdev, format, ...) \
8411a91de28SJoe Perches pr_warn(DRV_NAME " %s: " format, \
8421a91de28SJoe Perches dev_name(&(mdev)->pdev->dev), ##__VA_ARGS__)
8430a645e80SJoe Perches
844c27a02cdSYevgeny Petrilin #endif
845