xref: /linux/drivers/net/ethernet/mellanox/mlx4/mlx4_en.h (revision 4f9786035f9e519db41375818e1d0b5f20da2f10)
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