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> 39c27a02cdSYevgeny Petrilin #include <linux/list.h> 40c27a02cdSYevgeny Petrilin #include <linux/mutex.h> 41c27a02cdSYevgeny Petrilin #include <linux/netdevice.h> 42f1b553fbSJiri Pirko #include <linux/if_vlan.h> 43ec693d47SAmir Vadai #include <linux/net_tstamp.h> 44564c274cSAmir Vadai #ifdef CONFIG_MLX4_EN_DCB 45564c274cSAmir Vadai #include <linux/dcbnl.h> 46564c274cSAmir Vadai #endif 471eb8c695SAmir Vadai #include <linux/cpu_rmap.h> 48ad7d4eaeSShawn Bohrer #include <linux/ptp_clock_kernel.h> 49c27a02cdSYevgeny Petrilin 50c27a02cdSYevgeny Petrilin #include <linux/mlx4/device.h> 51c27a02cdSYevgeny Petrilin #include <linux/mlx4/qp.h> 52c27a02cdSYevgeny Petrilin #include <linux/mlx4/cq.h> 53c27a02cdSYevgeny Petrilin #include <linux/mlx4/srq.h> 54c27a02cdSYevgeny Petrilin #include <linux/mlx4/doorbell.h> 55e7c1c2c4SYevgeny Petrilin #include <linux/mlx4/cmd.h> 56c27a02cdSYevgeny Petrilin 57c27a02cdSYevgeny Petrilin #include "en_port.h" 58b4b6e842SEran Ben Elisha #include "mlx4_stats.h" 59c27a02cdSYevgeny Petrilin 60c27a02cdSYevgeny Petrilin #define DRV_NAME "mlx4_en" 61169a1d85SAmir Vadai #define DRV_VERSION "2.2-1" 62169a1d85SAmir Vadai #define DRV_RELDATE "Feb 2014" 63c27a02cdSYevgeny Petrilin 64c27a02cdSYevgeny Petrilin #define MLX4_EN_MSG_LEVEL (NETIF_MSG_LINK | NETIF_MSG_IFDOWN) 65c27a02cdSYevgeny Petrilin 66c27a02cdSYevgeny Petrilin /* 67c27a02cdSYevgeny Petrilin * Device constants 68c27a02cdSYevgeny Petrilin */ 69c27a02cdSYevgeny Petrilin 70c27a02cdSYevgeny Petrilin 71c27a02cdSYevgeny Petrilin #define MLX4_EN_PAGE_SHIFT 12 72c27a02cdSYevgeny Petrilin #define MLX4_EN_PAGE_SIZE (1 << MLX4_EN_PAGE_SHIFT) 73d317966bSAmir Vadai #define DEF_RX_RINGS 16 74d317966bSAmir Vadai #define MAX_RX_RINGS 128 751fb9876eSYevgeny Petrilin #define MIN_RX_RINGS 4 76c27a02cdSYevgeny Petrilin #define TXBB_SIZE 64 77c27a02cdSYevgeny Petrilin #define HEADROOM (2048 / TXBB_SIZE + 1) 78c27a02cdSYevgeny Petrilin #define STAMP_STRIDE 64 79c27a02cdSYevgeny Petrilin #define STAMP_DWORDS (STAMP_STRIDE / 4) 80c27a02cdSYevgeny Petrilin #define STAMP_SHIFT 31 81c27a02cdSYevgeny Petrilin #define STAMP_VAL 0x7fffffff 82c27a02cdSYevgeny Petrilin #define STATS_DELAY (HZ / 4) 83b6c39bfcSAmir Vadai #define SERVICE_TASK_DELAY (HZ / 4) 8482067281SHadar Hen Zion #define MAX_NUM_OF_FS_RULES 256 85c27a02cdSYevgeny Petrilin 861eb8c695SAmir Vadai #define MLX4_EN_FILTER_HASH_SHIFT 4 871eb8c695SAmir Vadai #define MLX4_EN_FILTER_EXPIRY_QUOTA 60 881eb8c695SAmir Vadai 89c27a02cdSYevgeny Petrilin /* Typical TSO descriptor with 16 gather entries is 352 bytes... */ 90c27a02cdSYevgeny Petrilin #define MAX_DESC_SIZE 512 91c27a02cdSYevgeny Petrilin #define MAX_DESC_TXBBS (MAX_DESC_SIZE / TXBB_SIZE) 92c27a02cdSYevgeny Petrilin 93c27a02cdSYevgeny Petrilin /* 94c27a02cdSYevgeny Petrilin * OS related constants and tunables 95c27a02cdSYevgeny Petrilin */ 96c27a02cdSYevgeny Petrilin 970fef9d03SAmir Vadai #define MLX4_EN_PRIV_FLAGS_BLUEFLAME 1 98e38af4faSHadar Hen Zion #define MLX4_EN_PRIV_FLAGS_PHV 2 990fef9d03SAmir Vadai 100c27a02cdSYevgeny Petrilin #define MLX4_EN_WATCHDOG_TIMEOUT (15 * HZ) 101c27a02cdSYevgeny Petrilin 102117980c4SThadeu Lima de Souza Cascardo /* Use the maximum between 16384 and a single page */ 103117980c4SThadeu Lima de Souza Cascardo #define MLX4_EN_ALLOC_SIZE PAGE_ALIGN(16384) 10451151a16SEric Dumazet 105c27a02cdSYevgeny Petrilin #define MLX4_EN_MAX_RX_FRAGS 4 106c27a02cdSYevgeny Petrilin 107bd531e36SYevgeny Petrilin /* Maximum ring sizes */ 108bd531e36SYevgeny Petrilin #define MLX4_EN_MAX_TX_SIZE 8192 109bd531e36SYevgeny Petrilin #define MLX4_EN_MAX_RX_SIZE 8192 110bd531e36SYevgeny Petrilin 1114cce66cdSThadeu Lima de Souza Cascardo /* Minimum ring size for our page-allocation scheme to work */ 112c27a02cdSYevgeny Petrilin #define MLX4_EN_MIN_RX_SIZE (MLX4_EN_ALLOC_SIZE / SMP_CACHE_BYTES) 113c27a02cdSYevgeny Petrilin #define MLX4_EN_MIN_TX_SIZE (4096 / TXBB_SIZE) 114c27a02cdSYevgeny Petrilin 115f813cad8SYevgeny Petrilin #define MLX4_EN_SMALL_PKT_SIZE 64 116ea1c1af1SAmir Vadai #define MLX4_EN_MIN_TX_RING_P_UP 1 117bc6a4744SAmir Vadai #define MLX4_EN_MAX_TX_RING_P_UP 32 118564c274cSAmir Vadai #define MLX4_EN_NUM_UP 8 119f813cad8SYevgeny Petrilin #define MLX4_EN_DEF_TX_RING_SIZE 512 120c27a02cdSYevgeny Petrilin #define MLX4_EN_DEF_RX_RING_SIZE 1024 121d317966bSAmir Vadai #define MAX_TX_RINGS (MLX4_EN_MAX_TX_RING_P_UP * \ 122d317966bSAmir Vadai MLX4_EN_NUM_UP) 123c27a02cdSYevgeny Petrilin 124fbc6daf1SAmir Vadai #define MLX4_EN_DEFAULT_TX_WORK 256 1259ecc2d86SBrenden Blanco #define MLX4_EN_DOORBELL_BUDGET 8 126fbc6daf1SAmir Vadai 1273db36fb2SYevgeny Petrilin /* Target number of packets to coalesce with interrupt moderation */ 1283db36fb2SYevgeny Petrilin #define MLX4_EN_RX_COAL_TARGET 44 129c27a02cdSYevgeny Petrilin #define MLX4_EN_RX_COAL_TIME 0x10 130c27a02cdSYevgeny Petrilin 131e22979d9SYevgeny Petrilin #define MLX4_EN_TX_COAL_PKTS 16 132ecfd2ce1SEric Dumazet #define MLX4_EN_TX_COAL_TIME 0x10 133c27a02cdSYevgeny Petrilin 134c27a02cdSYevgeny Petrilin #define MLX4_EN_RX_RATE_LOW 400000 135c27a02cdSYevgeny Petrilin #define MLX4_EN_RX_COAL_TIME_LOW 0 136c27a02cdSYevgeny Petrilin #define MLX4_EN_RX_RATE_HIGH 450000 137c27a02cdSYevgeny Petrilin #define MLX4_EN_RX_COAL_TIME_HIGH 128 138c27a02cdSYevgeny Petrilin #define MLX4_EN_RX_SIZE_THRESH 1024 139c27a02cdSYevgeny Petrilin #define MLX4_EN_RX_RATE_THRESH (1000000 / MLX4_EN_RX_COAL_TIME_HIGH) 140c27a02cdSYevgeny Petrilin #define MLX4_EN_SAMPLE_INTERVAL 0 14146afd0fbSYevgeny Petrilin #define MLX4_EN_AVG_PKT_SMALL 256 142c27a02cdSYevgeny Petrilin 143c27a02cdSYevgeny Petrilin #define MLX4_EN_AUTO_CONF 0xffff 144c27a02cdSYevgeny Petrilin 145c27a02cdSYevgeny Petrilin #define MLX4_EN_DEF_RX_PAUSE 1 146c27a02cdSYevgeny Petrilin #define MLX4_EN_DEF_TX_PAUSE 1 147c27a02cdSYevgeny Petrilin 148af901ca1SAndré Goddard Rosa /* Interval between successive polls in the Tx routine when polling is used 149c27a02cdSYevgeny Petrilin instead of interrupts (in per-core Tx rings) - should be power of 2 */ 150c27a02cdSYevgeny Petrilin #define MLX4_EN_TX_POLL_MODER 16 151c27a02cdSYevgeny Petrilin #define MLX4_EN_TX_POLL_TIMEOUT (HZ / 4) 152c27a02cdSYevgeny Petrilin 153c27a02cdSYevgeny Petrilin #define SMALL_PACKET_SIZE (256 - NET_IP_ALIGN) 154c27a02cdSYevgeny Petrilin #define HEADER_COPY_SIZE (128 - NET_IP_ALIGN) 155e7c1c2c4SYevgeny Petrilin #define MLX4_LOOPBACK_TEST_PAYLOAD (HEADER_COPY_SIZE - ETH_HLEN) 156c27a02cdSYevgeny Petrilin 157c27a02cdSYevgeny Petrilin #define MLX4_EN_MIN_MTU 46 15847a38e15SBrenden Blanco /* VLAN_HLEN is added twice,to support skb vlan tagged with multiple 15947a38e15SBrenden Blanco * headers. (For example: ETH_P_8021Q and ETH_P_8021AD). 16047a38e15SBrenden Blanco */ 16147a38e15SBrenden Blanco #define MLX4_EN_EFF_MTU(mtu) ((mtu) + ETH_HLEN + (2 * VLAN_HLEN)) 162c27a02cdSYevgeny Petrilin #define ETH_BCAST 0xffffffffffffULL 163c27a02cdSYevgeny Petrilin 164e7c1c2c4SYevgeny Petrilin #define MLX4_EN_LOOPBACK_RETRIES 5 165e7c1c2c4SYevgeny Petrilin #define MLX4_EN_LOOPBACK_TIMEOUT 100 166e7c1c2c4SYevgeny Petrilin 167c27a02cdSYevgeny Petrilin #ifdef MLX4_EN_PERF_STAT 168c27a02cdSYevgeny Petrilin /* Number of samples to 'average' */ 169c27a02cdSYevgeny Petrilin #define AVG_SIZE 128 170c27a02cdSYevgeny Petrilin #define AVG_FACTOR 1024 171c27a02cdSYevgeny Petrilin 172c27a02cdSYevgeny Petrilin #define INC_PERF_COUNTER(cnt) (++(cnt)) 173c27a02cdSYevgeny Petrilin #define ADD_PERF_COUNTER(cnt, add) ((cnt) += (add)) 174c27a02cdSYevgeny Petrilin #define AVG_PERF_COUNTER(cnt, sample) \ 175c27a02cdSYevgeny Petrilin ((cnt) = ((cnt) * (AVG_SIZE - 1) + (sample) * AVG_FACTOR) / AVG_SIZE) 176c27a02cdSYevgeny Petrilin #define GET_PERF_COUNTER(cnt) (cnt) 177c27a02cdSYevgeny Petrilin #define GET_AVG_PERF_COUNTER(cnt) ((cnt) / AVG_FACTOR) 178c27a02cdSYevgeny Petrilin 179c27a02cdSYevgeny Petrilin #else 180c27a02cdSYevgeny Petrilin 181c27a02cdSYevgeny Petrilin #define INC_PERF_COUNTER(cnt) do {} while (0) 182c27a02cdSYevgeny Petrilin #define ADD_PERF_COUNTER(cnt, add) do {} while (0) 183c27a02cdSYevgeny Petrilin #define AVG_PERF_COUNTER(cnt, sample) do {} while (0) 184c27a02cdSYevgeny Petrilin #define GET_PERF_COUNTER(cnt) (0) 185c27a02cdSYevgeny Petrilin #define GET_AVG_PERF_COUNTER(cnt) (0) 186c27a02cdSYevgeny Petrilin #endif /* MLX4_EN_PERF_STAT */ 187c27a02cdSYevgeny Petrilin 188b97b33a3SEugenia Emantayev /* Constants for TX flow */ 189b97b33a3SEugenia Emantayev enum { 190b97b33a3SEugenia Emantayev MAX_INLINE = 104, /* 128 - 16 - 4 - 4 */ 191b97b33a3SEugenia Emantayev MAX_BF = 256, 192b97b33a3SEugenia Emantayev MIN_PKT_LEN = 17, 193b97b33a3SEugenia Emantayev }; 194b97b33a3SEugenia Emantayev 195c27a02cdSYevgeny Petrilin /* 196c27a02cdSYevgeny Petrilin * Configurables 197c27a02cdSYevgeny Petrilin */ 198c27a02cdSYevgeny Petrilin 199c27a02cdSYevgeny Petrilin enum cq_type { 20067f8b1dcSTariq Toukan /* keep tx types first */ 201ccc109b8STariq Toukan TX, 202ccc109b8STariq Toukan TX_XDP, 20367f8b1dcSTariq Toukan #define MLX4_EN_NUM_TX_TYPES (TX_XDP + 1) 204ccc109b8STariq Toukan RX, 205c27a02cdSYevgeny Petrilin }; 206c27a02cdSYevgeny Petrilin 207c27a02cdSYevgeny Petrilin 208c27a02cdSYevgeny Petrilin /* 209c27a02cdSYevgeny Petrilin * Useful macros 210c27a02cdSYevgeny Petrilin */ 211c27a02cdSYevgeny Petrilin #define ROUNDUP_LOG2(x) ilog2(roundup_pow_of_two(x)) 212c27a02cdSYevgeny Petrilin #define XNOR(x, y) (!(x) == !(y)) 213c27a02cdSYevgeny Petrilin 214c27a02cdSYevgeny Petrilin 215c27a02cdSYevgeny Petrilin struct mlx4_en_tx_info { 2169ecc2d86SBrenden Blanco union { 217c27a02cdSYevgeny Petrilin struct sk_buff *skb; 2189ecc2d86SBrenden Blanco struct page *page; 2199ecc2d86SBrenden Blanco }; 2203d03641cSEric Dumazet dma_addr_t map0_dma; 2213d03641cSEric Dumazet u32 map0_byte_count; 222c27a02cdSYevgeny Petrilin u32 nr_txbb; 2235b263f53SYevgeny Petrilin u32 nr_bytes; 224c27a02cdSYevgeny Petrilin u8 linear; 225c27a02cdSYevgeny Petrilin u8 data_offset; 22641efea5aSYevgeny Petrilin u8 inl; 227ec693d47SAmir Vadai u8 ts_requested; 2283d03641cSEric Dumazet u8 nr_maps; 22998b16349SEric Dumazet } ____cacheline_aligned_in_smp; 230c27a02cdSYevgeny Petrilin 231c27a02cdSYevgeny Petrilin 232c27a02cdSYevgeny Petrilin #define MLX4_EN_BIT_DESC_OWN 0x80000000 233c27a02cdSYevgeny Petrilin #define CTRL_SIZE sizeof(struct mlx4_wqe_ctrl_seg) 234c27a02cdSYevgeny Petrilin #define MLX4_EN_MEMTYPE_PAD 0x100 235c27a02cdSYevgeny Petrilin #define DS_SIZE sizeof(struct mlx4_wqe_data_seg) 236c27a02cdSYevgeny Petrilin 237c27a02cdSYevgeny Petrilin 238c27a02cdSYevgeny Petrilin struct mlx4_en_tx_desc { 239c27a02cdSYevgeny Petrilin struct mlx4_wqe_ctrl_seg ctrl; 240c27a02cdSYevgeny Petrilin union { 241c27a02cdSYevgeny Petrilin struct mlx4_wqe_data_seg data; /* at least one data segment */ 242c27a02cdSYevgeny Petrilin struct mlx4_wqe_lso_seg lso; 243c27a02cdSYevgeny Petrilin struct mlx4_wqe_inline_seg inl; 244c27a02cdSYevgeny Petrilin }; 245c27a02cdSYevgeny Petrilin }; 246c27a02cdSYevgeny Petrilin 247c27a02cdSYevgeny Petrilin #define MLX4_EN_USE_SRQ 0x01000000 248c27a02cdSYevgeny Petrilin 249725c8999SYevgeny Petrilin #define MLX4_EN_CX3_LOW_ID 0x1000 250725c8999SYevgeny Petrilin #define MLX4_EN_CX3_HIGH_ID 0x1005 251725c8999SYevgeny Petrilin 252c27a02cdSYevgeny Petrilin struct mlx4_en_rx_alloc { 253c27a02cdSYevgeny Petrilin struct page *page; 2544cce66cdSThadeu Lima de Souza Cascardo dma_addr_t dma; 25570fbe079SAmir Vadai u32 page_offset; 256c27a02cdSYevgeny Petrilin }; 257c27a02cdSYevgeny Petrilin 258d576acf0SBrenden Blanco #define MLX4_EN_CACHE_SIZE (2 * NAPI_POLL_WEIGHT) 259acd7628dSEric Dumazet 260d576acf0SBrenden Blanco struct mlx4_en_page_cache { 261d576acf0SBrenden Blanco u32 index; 262acd7628dSEric Dumazet struct { 263acd7628dSEric Dumazet struct page *page; 264acd7628dSEric Dumazet dma_addr_t dma; 265acd7628dSEric Dumazet } buf[MLX4_EN_CACHE_SIZE]; 266d576acf0SBrenden Blanco }; 267d576acf0SBrenden Blanco 2689ecc2d86SBrenden Blanco struct mlx4_en_priv; 2699ecc2d86SBrenden Blanco 270c27a02cdSYevgeny Petrilin struct mlx4_en_tx_ring { 27198b16349SEric Dumazet /* cache line used and dirtied in tx completion 27298b16349SEric Dumazet * (mlx4_en_free_tx_buf()) 27398b16349SEric Dumazet */ 27498b16349SEric Dumazet u32 last_nr_txbb; 27598b16349SEric Dumazet u32 cons; 27698b16349SEric Dumazet unsigned long wake_queue; 277e3f42f84SEric Dumazet struct netdev_queue *tx_queue; 278e3f42f84SEric Dumazet u32 (*free_tx_desc)(struct mlx4_en_priv *priv, 279e3f42f84SEric Dumazet struct mlx4_en_tx_ring *ring, 280e3f42f84SEric Dumazet int index, u8 owner, 281e3f42f84SEric Dumazet u64 timestamp, int napi_mode); 282e3f42f84SEric Dumazet struct mlx4_en_rx_ring *recycle_ring; 28398b16349SEric Dumazet 28498b16349SEric Dumazet /* cache line used and dirtied in mlx4_en_xmit() */ 28598b16349SEric Dumazet u32 prod ____cacheline_aligned_in_smp; 286e3f42f84SEric Dumazet unsigned int tx_dropped; 28798b16349SEric Dumazet unsigned long bytes; 28898b16349SEric Dumazet unsigned long packets; 28998b16349SEric Dumazet unsigned long tx_csum; 29098b16349SEric Dumazet unsigned long tso_packets; 29198b16349SEric Dumazet unsigned long xmit_more; 29298b16349SEric Dumazet struct mlx4_bf bf; 29398b16349SEric Dumazet 29498b16349SEric Dumazet /* Following part should be mostly read */ 2956a4e8121SEric Dumazet __be32 doorbell_qpn; 2966a4e8121SEric Dumazet __be32 mr_key; 297e3f42f84SEric Dumazet u32 size; /* number of TXBBs */ 298e3f42f84SEric Dumazet u32 size_mask; 299e3f42f84SEric Dumazet u32 full_size; 300e3f42f84SEric Dumazet u32 buf_size; 301c27a02cdSYevgeny Petrilin void *buf; 302c27a02cdSYevgeny Petrilin struct mlx4_en_tx_info *tx_info; 303c27a02cdSYevgeny Petrilin int qpn; 30498b16349SEric Dumazet u8 queue_index; 30587a5c389SYevgeny Petrilin bool bf_enabled; 3060fef9d03SAmir Vadai bool bf_alloced; 307e3f42f84SEric Dumazet u8 hwtstamp_tx_type; 308e3f42f84SEric Dumazet u8 *bounce_buf; 309e3f42f84SEric Dumazet 310e3f42f84SEric Dumazet /* Not used in fast path 311e3f42f84SEric Dumazet * Only queue_stopped might be used if BQL is not properly working. 312e3f42f84SEric Dumazet */ 313e3f42f84SEric Dumazet unsigned long queue_stopped; 314e3f42f84SEric Dumazet struct mlx4_hwq_resources sp_wqres; 315e3f42f84SEric Dumazet struct mlx4_qp sp_qp; 316e3f42f84SEric Dumazet struct mlx4_qp_context sp_context; 317e3f42f84SEric Dumazet cpumask_t sp_affinity_mask; 318e3f42f84SEric Dumazet enum mlx4_qp_state sp_qp_state; 319e3f42f84SEric Dumazet u16 sp_stride; 320e3f42f84SEric Dumazet u16 sp_cqn; /* index of port CQ associated with this ring */ 32198b16349SEric Dumazet } ____cacheline_aligned_in_smp; 322c27a02cdSYevgeny Petrilin 323c27a02cdSYevgeny Petrilin struct mlx4_en_rx_desc { 324c27a02cdSYevgeny Petrilin /* actual number of entries depends on rx ring stride */ 325c27a02cdSYevgeny Petrilin struct mlx4_wqe_data_seg data[0]; 326c27a02cdSYevgeny Petrilin }; 327c27a02cdSYevgeny Petrilin 328c27a02cdSYevgeny Petrilin struct mlx4_en_rx_ring { 329c27a02cdSYevgeny Petrilin struct mlx4_hwq_resources wqres; 330c27a02cdSYevgeny Petrilin u32 size ; /* number of Rx descs*/ 331c27a02cdSYevgeny Petrilin u32 actual_size; 332c27a02cdSYevgeny Petrilin u32 size_mask; 333c27a02cdSYevgeny Petrilin u16 stride; 334c27a02cdSYevgeny Petrilin u16 log_stride; 335c27a02cdSYevgeny Petrilin u16 cqn; /* index of port CQ associated with this ring */ 336c27a02cdSYevgeny Petrilin u32 prod; 337c27a02cdSYevgeny Petrilin u32 cons; 338c27a02cdSYevgeny Petrilin u32 buf_size; 3394a5f4dd8SYevgeny Petrilin u8 fcs_del; 340c27a02cdSYevgeny Petrilin void *buf; 341c27a02cdSYevgeny Petrilin void *rx_info; 342326fe02dSBrenden Blanco struct bpf_prog __rcu *xdp_prog; 343d576acf0SBrenden Blanco struct mlx4_en_page_cache page_cache; 344c27a02cdSYevgeny Petrilin unsigned long bytes; 345c27a02cdSYevgeny Petrilin unsigned long packets; 346ad04378cSYevgeny Petrilin unsigned long csum_ok; 347ad04378cSYevgeny Petrilin unsigned long csum_none; 348f8c6455bSShani Michaeli unsigned long csum_complete; 349*7d7bfc6aSEric Dumazet unsigned long rx_alloc_pages; 35015fca2c8STariq Toukan unsigned long xdp_drop; 35115fca2c8STariq Toukan unsigned long xdp_tx; 35215fca2c8STariq Toukan unsigned long xdp_tx_full; 353d21ed3a3SEran Ben Elisha unsigned long dropped; 354ec693d47SAmir Vadai int hwtstamp_rx_filter; 3559e311e77SYuval Atias cpumask_var_t affinity_mask; 356c27a02cdSYevgeny Petrilin }; 357c27a02cdSYevgeny Petrilin 358c27a02cdSYevgeny Petrilin struct mlx4_en_cq { 359c27a02cdSYevgeny Petrilin struct mlx4_cq mcq; 360c27a02cdSYevgeny Petrilin struct mlx4_hwq_resources wqres; 361c27a02cdSYevgeny Petrilin int ring; 362c27a02cdSYevgeny Petrilin struct net_device *dev; 363c27a02cdSYevgeny Petrilin struct napi_struct napi; 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 37335f6f453SAmir Vadai struct irq_desc *irq_desc; 374c27a02cdSYevgeny Petrilin }; 375c27a02cdSYevgeny Petrilin 376c27a02cdSYevgeny Petrilin struct mlx4_en_port_profile { 377c27a02cdSYevgeny Petrilin u32 flags; 37867f8b1dcSTariq Toukan u32 tx_ring_num[MLX4_EN_NUM_TX_TYPES]; 379c27a02cdSYevgeny Petrilin u32 rx_ring_num; 380c27a02cdSYevgeny Petrilin u32 tx_ring_size; 381c27a02cdSYevgeny Petrilin u32 rx_ring_size; 382ec25bc04SEugenia Emantayev u8 num_tx_rings_p_up; 383d53b93f2SYevgeny Petrilin u8 rx_pause; 384d53b93f2SYevgeny Petrilin u8 rx_ppp; 385d53b93f2SYevgeny Petrilin u8 tx_pause; 386d53b93f2SYevgeny Petrilin u8 tx_ppp; 38793d3e367SYevgeny Petrilin int rss_rings; 388b97b33a3SEugenia Emantayev int inline_thold; 389ec25bc04SEugenia Emantayev struct hwtstamp_config hwtstamp_config; 390c27a02cdSYevgeny Petrilin }; 391c27a02cdSYevgeny Petrilin 392c27a02cdSYevgeny Petrilin struct mlx4_en_profile { 3930533943cSYevgeny Petrilin int udp_rss; 394c27a02cdSYevgeny Petrilin u8 rss_mask; 395c27a02cdSYevgeny Petrilin u32 active_ports; 396c27a02cdSYevgeny Petrilin u32 small_pkt_int; 397c27a02cdSYevgeny Petrilin u8 no_reset; 398bc6a4744SAmir Vadai u8 num_tx_rings_p_up; 399c27a02cdSYevgeny Petrilin struct mlx4_en_port_profile prof[MLX4_MAX_PORTS + 1]; 400c27a02cdSYevgeny Petrilin }; 401c27a02cdSYevgeny Petrilin 402c27a02cdSYevgeny Petrilin struct mlx4_en_dev { 403c27a02cdSYevgeny Petrilin struct mlx4_dev *dev; 404c27a02cdSYevgeny Petrilin struct pci_dev *pdev; 405c27a02cdSYevgeny Petrilin struct mutex state_lock; 406c27a02cdSYevgeny Petrilin struct net_device *pndev[MLX4_MAX_PORTS + 1]; 4075da03547SMoni Shoua struct net_device *upper[MLX4_MAX_PORTS + 1]; 408c27a02cdSYevgeny Petrilin u32 port_cnt; 409c27a02cdSYevgeny Petrilin bool device_up; 410c27a02cdSYevgeny Petrilin struct mlx4_en_profile profile; 411c27a02cdSYevgeny Petrilin u32 LSO_support; 412c27a02cdSYevgeny Petrilin struct workqueue_struct *workqueue; 413c27a02cdSYevgeny Petrilin struct device *dma_device; 414c27a02cdSYevgeny Petrilin void __iomem *uar_map; 415c27a02cdSYevgeny Petrilin struct mlx4_uar priv_uar; 416c27a02cdSYevgeny Petrilin struct mlx4_mr mr; 417c27a02cdSYevgeny Petrilin u32 priv_pdn; 418c27a02cdSYevgeny Petrilin spinlock_t uar_lock; 419d7e1a487SYevgeny Petrilin u8 mac_removed[MLX4_MAX_PORTS + 1]; 420ad7d4eaeSShawn Bohrer u32 nominal_c_mult; 421ec693d47SAmir Vadai struct cyclecounter cycles; 42299f5711eSEric Dumazet seqlock_t clock_lock; 423ec693d47SAmir Vadai struct timecounter clock; 424ec693d47SAmir Vadai unsigned long last_overflow_check; 425ad7d4eaeSShawn Bohrer struct ptp_clock *ptp_clock; 426ad7d4eaeSShawn Bohrer struct ptp_clock_info ptp_clock_info; 4275da03547SMoni Shoua struct notifier_block nb; 428c27a02cdSYevgeny Petrilin }; 429c27a02cdSYevgeny Petrilin 430c27a02cdSYevgeny Petrilin 431c27a02cdSYevgeny Petrilin struct mlx4_en_rss_map { 432c27a02cdSYevgeny Petrilin int base_qpn; 433b6b912e0SYevgeny Petrilin struct mlx4_qp qps[MAX_RX_RINGS]; 434b6b912e0SYevgeny Petrilin enum mlx4_qp_state state[MAX_RX_RINGS]; 435c27a02cdSYevgeny Petrilin struct mlx4_qp indir_qp; 436c27a02cdSYevgeny Petrilin enum mlx4_qp_state indir_state; 437c27a02cdSYevgeny Petrilin }; 438c27a02cdSYevgeny Petrilin 4392c762679SSaeed Mahameed enum mlx4_en_port_flag { 4402c762679SSaeed Mahameed MLX4_EN_PORT_ANC = 1<<0, /* Auto-negotiation complete */ 4412c762679SSaeed Mahameed MLX4_EN_PORT_ANE = 1<<1, /* Auto-negotiation enabled */ 4422c762679SSaeed Mahameed }; 4432c762679SSaeed Mahameed 444e7c1c2c4SYevgeny Petrilin struct mlx4_en_port_state { 445e7c1c2c4SYevgeny Petrilin int link_state; 446e7c1c2c4SYevgeny Petrilin int link_speed; 4472c762679SSaeed Mahameed int transceiver; 4482c762679SSaeed Mahameed u32 flags; 449e7c1c2c4SYevgeny Petrilin }; 450e7c1c2c4SYevgeny Petrilin 4516d199937SYevgeny Petrilin enum mlx4_en_mclist_act { 4526d199937SYevgeny Petrilin MCLIST_NONE, 4536d199937SYevgeny Petrilin MCLIST_REM, 4546d199937SYevgeny Petrilin MCLIST_ADD, 4556d199937SYevgeny Petrilin }; 4566d199937SYevgeny Petrilin 4576d199937SYevgeny Petrilin struct mlx4_en_mc_list { 4586d199937SYevgeny Petrilin struct list_head list; 4596d199937SYevgeny Petrilin enum mlx4_en_mclist_act action; 4606d199937SYevgeny Petrilin u8 addr[ETH_ALEN]; 4610ff1fb65SHadar Hen Zion u64 reg_id; 462837052d0SOr Gerlitz u64 tunnel_reg_id; 4636d199937SYevgeny Petrilin }; 4646d199937SYevgeny Petrilin 465c27a02cdSYevgeny Petrilin struct mlx4_en_frag_info { 466c27a02cdSYevgeny Petrilin u16 frag_size; 467aaca121dSEric Dumazet u32 frag_stride; 468c27a02cdSYevgeny Petrilin }; 469c27a02cdSYevgeny Petrilin 470564c274cSAmir Vadai #ifdef CONFIG_MLX4_EN_DCB 471564c274cSAmir Vadai /* Minimal TC BW - setting to 0 will block traffic */ 472564c274cSAmir Vadai #define MLX4_EN_BW_MIN 1 473564c274cSAmir Vadai #define MLX4_EN_BW_MAX 100 /* Utilize 100% of the line */ 474564c274cSAmir Vadai 475564c274cSAmir Vadai #define MLX4_EN_TC_ETS 7 476564c274cSAmir Vadai 477af7d5185SRana Shahout enum dcb_pfc_type { 478af7d5185SRana Shahout pfc_disabled = 0, 479af7d5185SRana Shahout pfc_enabled_full, 480af7d5185SRana Shahout pfc_enabled_tx, 481af7d5185SRana Shahout pfc_enabled_rx 482af7d5185SRana Shahout }; 483af7d5185SRana Shahout 484af7d5185SRana Shahout struct mlx4_en_cee_config { 485af7d5185SRana Shahout bool pfc_state; 486564ed9b1STariq Toukan enum dcb_pfc_type dcb_pfc[MLX4_EN_NUM_UP]; 487af7d5185SRana Shahout }; 488564c274cSAmir Vadai #endif 489564c274cSAmir Vadai 49082067281SHadar Hen Zion struct ethtool_flow_id { 4910d256c0eSHadar Hen Zion struct list_head list; 49282067281SHadar Hen Zion struct ethtool_rx_flow_spec flow_spec; 49382067281SHadar Hen Zion u64 id; 49482067281SHadar Hen Zion }; 49582067281SHadar Hen Zion 49679aeaccdSYan Burman enum { 49779aeaccdSYan Burman MLX4_EN_FLAG_PROMISC = (1 << 0), 49879aeaccdSYan Burman MLX4_EN_FLAG_MC_PROMISC = (1 << 1), 49979aeaccdSYan Burman /* whether we need to enable hardware loopback by putting dmac 50079aeaccdSYan Burman * in Tx WQE 50179aeaccdSYan Burman */ 50279aeaccdSYan Burman MLX4_EN_FLAG_ENABLE_HW_LOOPBACK = (1 << 2), 50379aeaccdSYan Burman /* whether we need to drop packets that hardware loopback-ed */ 504cc5387f7SYan Burman MLX4_EN_FLAG_RX_FILTER_NEEDED = (1 << 3), 505f8c6455bSShani Michaeli MLX4_EN_FLAG_FORCE_PROMISC = (1 << 4), 506f8c6455bSShani Michaeli MLX4_EN_FLAG_RX_CSUM_NON_TCP_UDP = (1 << 5), 507af7d5185SRana Shahout #ifdef CONFIG_MLX4_EN_DCB 508af7d5185SRana Shahout MLX4_EN_FLAG_DCB_ENABLED = (1 << 6), 509af7d5185SRana Shahout #endif 51079aeaccdSYan Burman }; 51179aeaccdSYan Burman 51251af33cfSIdo Shamay #define PORT_BEACON_MAX_LIMIT (65535) 513c07cb4b0SYan Burman #define MLX4_EN_MAC_HASH_SIZE (1 << BITS_PER_BYTE) 514c07cb4b0SYan Burman #define MLX4_EN_MAC_HASH_IDX 5 515c07cb4b0SYan Burman 5163da8a36cSEran Ben Elisha struct mlx4_en_stats_bitmap { 5173da8a36cSEran Ben Elisha DECLARE_BITMAP(bitmap, NUM_ALL_STATS); 5183da8a36cSEran Ben Elisha struct mutex mutex; /* for mutual access to stats bitmap */ 5193da8a36cSEran Ben Elisha }; 5203da8a36cSEran Ben Elisha 521c27a02cdSYevgeny Petrilin struct mlx4_en_priv { 522c27a02cdSYevgeny Petrilin struct mlx4_en_dev *mdev; 523c27a02cdSYevgeny Petrilin struct mlx4_en_port_profile *prof; 524c27a02cdSYevgeny Petrilin struct net_device *dev; 525f1b553fbSJiri Pirko unsigned long active_vlans[BITS_TO_LONGS(VLAN_N_VID)]; 526e7c1c2c4SYevgeny Petrilin struct mlx4_en_port_state port_state; 527c27a02cdSYevgeny Petrilin spinlock_t stats_lock; 52882067281SHadar Hen Zion struct ethtool_flow_id ethtool_rules[MAX_NUM_OF_FS_RULES]; 5290d256c0eSHadar Hen Zion /* To allow rules removal while port is going down */ 5300d256c0eSHadar Hen Zion struct list_head ethtool_list; 531c27a02cdSYevgeny Petrilin 5326b4d8d9fSAlexander Guller unsigned long last_moder_packets[MAX_RX_RINGS]; 533c27a02cdSYevgeny Petrilin unsigned long last_moder_tx_packets; 5346b4d8d9fSAlexander Guller unsigned long last_moder_bytes[MAX_RX_RINGS]; 535c27a02cdSYevgeny Petrilin unsigned long last_moder_jiffies; 5366b4d8d9fSAlexander Guller int last_moder_time[MAX_RX_RINGS]; 537c27a02cdSYevgeny Petrilin u16 rx_usecs; 538c27a02cdSYevgeny Petrilin u16 rx_frames; 539c27a02cdSYevgeny Petrilin u16 tx_usecs; 540c27a02cdSYevgeny Petrilin u16 tx_frames; 541c27a02cdSYevgeny Petrilin u32 pkt_rate_low; 542c27a02cdSYevgeny Petrilin u16 rx_usecs_low; 543c27a02cdSYevgeny Petrilin u32 pkt_rate_high; 544c27a02cdSYevgeny Petrilin u16 rx_usecs_high; 545c27a02cdSYevgeny Petrilin u16 sample_interval; 546c27a02cdSYevgeny Petrilin u16 adaptive_rx_coal; 547c27a02cdSYevgeny Petrilin u32 msg_enable; 548e7c1c2c4SYevgeny Petrilin u32 loopback_ok; 549e7c1c2c4SYevgeny Petrilin u32 validate_loopback; 550c27a02cdSYevgeny Petrilin 551c27a02cdSYevgeny Petrilin struct mlx4_hwq_resources res; 552c27a02cdSYevgeny Petrilin int link_state; 553c27a02cdSYevgeny Petrilin int last_link_state; 554c27a02cdSYevgeny Petrilin bool port_up; 555c27a02cdSYevgeny Petrilin int port; 556c27a02cdSYevgeny Petrilin int registered; 557c27a02cdSYevgeny Petrilin int allocated; 558c27a02cdSYevgeny Petrilin int stride; 5592695bab2SNoa Osherovich unsigned char current_mac[ETH_ALEN + 2]; 560c27a02cdSYevgeny Petrilin int mac_index; 561c27a02cdSYevgeny Petrilin unsigned max_mtu; 562c27a02cdSYevgeny Petrilin int base_qpn; 56308ff3235SOr Gerlitz int cqe_factor; 564b1b6b4daSIdo Shamay int cqe_size; 565c27a02cdSYevgeny Petrilin 566c27a02cdSYevgeny Petrilin struct mlx4_en_rss_map rss_map; 5674ef2a435SOr Gerlitz __be32 ctrl_flags; 568c27a02cdSYevgeny Petrilin u32 flags; 569d317966bSAmir Vadai u8 num_tx_rings_p_up; 570fbc6daf1SAmir Vadai u32 tx_work_limit; 57167f8b1dcSTariq Toukan u32 tx_ring_num[MLX4_EN_NUM_TX_TYPES]; 572c27a02cdSYevgeny Petrilin u32 rx_ring_num; 573c27a02cdSYevgeny Petrilin u32 rx_skb_size; 574c27a02cdSYevgeny Petrilin struct mlx4_en_frag_info frag_info[MLX4_EN_MAX_RX_FRAGS]; 57569ba9431SEric Dumazet u8 num_frags; 57669ba9431SEric Dumazet u8 log_rx_info; 57769ba9431SEric Dumazet u8 dma_dir; 578d85f6c14SEric Dumazet u16 rx_headroom; 579c27a02cdSYevgeny Petrilin 58067f8b1dcSTariq Toukan struct mlx4_en_tx_ring **tx_ring[MLX4_EN_NUM_TX_TYPES]; 58141d942d5SEugenia Emantayev struct mlx4_en_rx_ring *rx_ring[MAX_RX_RINGS]; 58267f8b1dcSTariq Toukan struct mlx4_en_cq **tx_cq[MLX4_EN_NUM_TX_TYPES]; 58341d942d5SEugenia Emantayev struct mlx4_en_cq *rx_cq[MAX_RX_RINGS]; 584cabdc8eeSHadar Hen Zion struct mlx4_qp drop_qp; 5850eb74fddSYan Burman struct work_struct rx_mode_task; 586c27a02cdSYevgeny Petrilin struct work_struct watchdog_task; 587c27a02cdSYevgeny Petrilin struct work_struct linkstate_task; 588c27a02cdSYevgeny Petrilin struct delayed_work stats_task; 589b6c39bfcSAmir Vadai struct delayed_work service_task; 5901b136de1SOr Gerlitz struct work_struct vxlan_add_task; 5911b136de1SOr Gerlitz struct work_struct vxlan_del_task; 592c27a02cdSYevgeny Petrilin struct mlx4_en_perf_stats pstats; 593c27a02cdSYevgeny Petrilin struct mlx4_en_pkt_stats pkstats; 594b42de4d0SEran Ben Elisha struct mlx4_en_counter_stats pf_stats; 5950b131561SMatan Barak struct mlx4_en_flow_stats_rx rx_priority_flowstats[MLX4_NUM_PRIORITIES]; 5960b131561SMatan Barak struct mlx4_en_flow_stats_tx tx_priority_flowstats[MLX4_NUM_PRIORITIES]; 5970b131561SMatan Barak struct mlx4_en_flow_stats_rx rx_flowstats; 5980b131561SMatan Barak struct mlx4_en_flow_stats_tx tx_flowstats; 599c27a02cdSYevgeny Petrilin struct mlx4_en_port_stats port_stats; 60015fca2c8STariq Toukan struct mlx4_en_xdp_stats xdp_stats; 6013da8a36cSEran Ben Elisha struct mlx4_en_stats_bitmap stats_bitmap; 6026d199937SYevgeny Petrilin struct list_head mc_list; 6036d199937SYevgeny Petrilin struct list_head curr_list; 6040ff1fb65SHadar Hen Zion u64 broadcast_id; 605c27a02cdSYevgeny Petrilin struct mlx4_en_stat_out_mbox hw_stats; 6064c3eb3caSEli Cohen int vids[128]; 60714c07b13SYevgeny Petrilin bool wol; 608ebf8c9aaSYevgeny Petrilin struct device *ddev; 609c07cb4b0SYan Burman struct hlist_head mac_hash[MLX4_EN_MAC_HASH_SIZE]; 610ec693d47SAmir Vadai struct hwtstamp_config hwtstamp_config; 6116de5f7f6SEran Ben Elisha u32 counter_index; 612564c274cSAmir Vadai 613564c274cSAmir Vadai #ifdef CONFIG_MLX4_EN_DCB 614af7d5185SRana Shahout #define MLX4_EN_DCB_ENABLED 0x3 615564c274cSAmir Vadai struct ieee_ets ets; 616109d2446SAmir Vadai u16 maxrate[IEEE_8021QAZ_MAX_TCS]; 617708b869bSShani Michaeli enum dcbnl_cndd_states cndd_state[IEEE_8021QAZ_MAX_TCS]; 618564ed9b1STariq Toukan struct mlx4_en_cee_config cee_config; 619564ed9b1STariq Toukan u8 dcbx_cap; 620564c274cSAmir Vadai #endif 6211eb8c695SAmir Vadai #ifdef CONFIG_RFS_ACCEL 6221eb8c695SAmir Vadai spinlock_t filters_lock; 6231eb8c695SAmir Vadai int last_filter_id; 6241eb8c695SAmir Vadai struct list_head filters; 6251eb8c695SAmir Vadai struct hlist_head filter_hash[1 << MLX4_EN_FILTER_HASH_SHIFT]; 6261eb8c695SAmir Vadai #endif 627837052d0SOr Gerlitz u64 tunnel_reg_id; 6281b136de1SOr Gerlitz __be16 vxlan_port; 6290fef9d03SAmir Vadai 6300fef9d03SAmir Vadai u32 pflags; 631bd635c35SEric Dumazet u8 rss_key[MLX4_EN_RSS_KEY_SIZE]; 632947cbb0aSEyal Perry u8 rss_hash_fn; 63314c07b13SYevgeny Petrilin }; 63414c07b13SYevgeny Petrilin 63514c07b13SYevgeny Petrilin enum mlx4_en_wol { 63614c07b13SYevgeny Petrilin MLX4_EN_WOL_MAGIC = (1ULL << 61), 63714c07b13SYevgeny Petrilin MLX4_EN_WOL_ENABLED = (1ULL << 62), 638c27a02cdSYevgeny Petrilin }; 639c27a02cdSYevgeny Petrilin 64016a10ffdSYan Burman struct mlx4_mac_entry { 641c07cb4b0SYan Burman struct hlist_node hlist; 64216a10ffdSYan Burman unsigned char mac[ETH_ALEN + 2]; 64316a10ffdSYan Burman u64 reg_id; 644c07cb4b0SYan Burman struct rcu_head rcu; 64516a10ffdSYan Burman }; 64616a10ffdSYan Burman 647b1b6b4daSIdo Shamay static inline struct mlx4_cqe *mlx4_en_get_cqe(void *buf, int idx, int cqe_sz) 648b1b6b4daSIdo Shamay { 649b1b6b4daSIdo Shamay return buf + idx * cqe_sz; 650b1b6b4daSIdo Shamay } 651b1b6b4daSIdo Shamay 6520d9fdaa9SOr Gerlitz #define MLX4_EN_WOL_DO_MODIFY (1ULL << 63) 653c27a02cdSYevgeny Petrilin 6543d8f7cc7SDavid Decotigny void mlx4_en_init_ptys2ethtool_map(void); 65579aeaccdSYan Burman void mlx4_en_update_loopback_state(struct net_device *dev, 65679aeaccdSYan Burman netdev_features_t features); 65779aeaccdSYan Burman 658c27a02cdSYevgeny Petrilin void mlx4_en_destroy_netdev(struct net_device *dev); 659c27a02cdSYevgeny Petrilin int mlx4_en_init_netdev(struct mlx4_en_dev *mdev, int port, 660c27a02cdSYevgeny Petrilin struct mlx4_en_port_profile *prof); 661c27a02cdSYevgeny Petrilin 66218cc42a3SYevgeny Petrilin int mlx4_en_start_port(struct net_device *dev); 6633484aac1SAmir Vadai void mlx4_en_stop_port(struct net_device *dev, int detach); 66418cc42a3SYevgeny Petrilin 6656fcd2735SEran Ben Elisha void mlx4_en_set_stats_bitmap(struct mlx4_dev *dev, 6660b131561SMatan Barak struct mlx4_en_stats_bitmap *stats_bitmap, 6670b131561SMatan Barak u8 rx_ppp, u8 rx_pause, 6680b131561SMatan Barak u8 tx_ppp, u8 tx_pause); 669ffa88f37SEran Ben Elisha 670ec25bc04SEugenia Emantayev int mlx4_en_try_alloc_resources(struct mlx4_en_priv *priv, 671ec25bc04SEugenia Emantayev struct mlx4_en_priv *tmp, 672770f8225SMartin KaFai Lau struct mlx4_en_port_profile *prof, 673770f8225SMartin KaFai Lau bool carry_xdp_prog); 674ec25bc04SEugenia Emantayev void mlx4_en_safe_replace_resources(struct mlx4_en_priv *priv, 675ec25bc04SEugenia Emantayev struct mlx4_en_priv *tmp); 67618cc42a3SYevgeny Petrilin 67741d942d5SEugenia Emantayev int mlx4_en_create_cq(struct mlx4_en_priv *priv, struct mlx4_en_cq **pcq, 678163561a4SEugenia Emantayev int entries, int ring, enum cq_type mode, int node); 67941d942d5SEugenia Emantayev void mlx4_en_destroy_cq(struct mlx4_en_priv *priv, struct mlx4_en_cq **pcq); 68076532d0cSAlexander Guller int mlx4_en_activate_cq(struct mlx4_en_priv *priv, struct mlx4_en_cq *cq, 68176532d0cSAlexander Guller int cq_idx); 682c27a02cdSYevgeny Petrilin void mlx4_en_deactivate_cq(struct mlx4_en_priv *priv, struct mlx4_en_cq *cq); 683c27a02cdSYevgeny Petrilin int mlx4_en_set_cq_moder(struct mlx4_en_priv *priv, struct mlx4_en_cq *cq); 684c27a02cdSYevgeny Petrilin int mlx4_en_arm_cq(struct mlx4_en_priv *priv, struct mlx4_en_cq *cq); 685c27a02cdSYevgeny Petrilin 686c27a02cdSYevgeny Petrilin void mlx4_en_tx_irq(struct mlx4_cq *mcq); 687f663dd9aSJason Wang u16 mlx4_en_select_queue(struct net_device *dev, struct sk_buff *skb, 68899932d4fSDaniel Borkmann void *accel_priv, select_queue_fallback_t fallback); 68961357325SStephen Hemminger netdev_tx_t mlx4_en_xmit(struct sk_buff *skb, struct net_device *dev); 69015fca2c8STariq Toukan netdev_tx_t mlx4_en_xmit_frame(struct mlx4_en_rx_ring *rx_ring, 69115fca2c8STariq Toukan struct mlx4_en_rx_alloc *frame, 6929ecc2d86SBrenden Blanco struct net_device *dev, unsigned int length, 6939ecc2d86SBrenden Blanco int tx_ind, int *doorbell_pending); 6949ecc2d86SBrenden Blanco void mlx4_en_xmit_doorbell(struct mlx4_en_tx_ring *ring); 6959ecc2d86SBrenden Blanco bool mlx4_en_rx_recycle(struct mlx4_en_rx_ring *ring, 6969ecc2d86SBrenden Blanco struct mlx4_en_rx_alloc *frame); 697c27a02cdSYevgeny Petrilin 69841d942d5SEugenia Emantayev int mlx4_en_create_tx_ring(struct mlx4_en_priv *priv, 69941d942d5SEugenia Emantayev struct mlx4_en_tx_ring **pring, 700ddae0349SEugenia Emantayev u32 size, u16 stride, 701d03a68f8SIdo Shamay int node, int queue_index); 70241d942d5SEugenia Emantayev void mlx4_en_destroy_tx_ring(struct mlx4_en_priv *priv, 70341d942d5SEugenia Emantayev struct mlx4_en_tx_ring **pring); 704c27a02cdSYevgeny Petrilin int mlx4_en_activate_tx_ring(struct mlx4_en_priv *priv, 705c27a02cdSYevgeny Petrilin struct mlx4_en_tx_ring *ring, 7060e98b523SAmir Vadai int cq, int user_prio); 707c27a02cdSYevgeny Petrilin void mlx4_en_deactivate_tx_ring(struct mlx4_en_priv *priv, 708c27a02cdSYevgeny Petrilin struct mlx4_en_tx_ring *ring); 70902512482SIdo Shamay void mlx4_en_set_num_rx_rings(struct mlx4_en_dev *mdev); 71007841f9dSIdo Shamay void mlx4_en_recover_from_oom(struct mlx4_en_priv *priv); 711c27a02cdSYevgeny Petrilin int mlx4_en_create_rx_ring(struct mlx4_en_priv *priv, 71241d942d5SEugenia Emantayev struct mlx4_en_rx_ring **pring, 713163561a4SEugenia Emantayev u32 size, u16 stride, int node); 714c27a02cdSYevgeny Petrilin void mlx4_en_destroy_rx_ring(struct mlx4_en_priv *priv, 71541d942d5SEugenia Emantayev struct mlx4_en_rx_ring **pring, 71668355f71SThadeu Lima de Souza Cascardo u32 size, u16 stride); 717c27a02cdSYevgeny Petrilin int mlx4_en_activate_rx_rings(struct mlx4_en_priv *priv); 718c27a02cdSYevgeny Petrilin void mlx4_en_deactivate_rx_ring(struct mlx4_en_priv *priv, 719c27a02cdSYevgeny Petrilin struct mlx4_en_rx_ring *ring); 720c27a02cdSYevgeny Petrilin int mlx4_en_process_rx_cq(struct net_device *dev, 721c27a02cdSYevgeny Petrilin struct mlx4_en_cq *cq, 722c27a02cdSYevgeny Petrilin int budget); 723c27a02cdSYevgeny Petrilin int mlx4_en_poll_rx_cq(struct napi_struct *napi, int budget); 7240276a330SEugenia Emantayev int mlx4_en_poll_tx_cq(struct napi_struct *napi, int budget); 7259ecc2d86SBrenden Blanco u32 mlx4_en_free_tx_desc(struct mlx4_en_priv *priv, 7269ecc2d86SBrenden Blanco struct mlx4_en_tx_ring *ring, 7279ecc2d86SBrenden Blanco int index, u8 owner, u64 timestamp, 7289ecc2d86SBrenden Blanco int napi_mode); 7299ecc2d86SBrenden Blanco u32 mlx4_en_recycle_tx_desc(struct mlx4_en_priv *priv, 7309ecc2d86SBrenden Blanco struct mlx4_en_tx_ring *ring, 7319ecc2d86SBrenden Blanco int index, u8 owner, u64 timestamp, 7329ecc2d86SBrenden Blanco int napi_mode); 733c27a02cdSYevgeny Petrilin void mlx4_en_fill_qp_context(struct mlx4_en_priv *priv, int size, int stride, 7340e98b523SAmir Vadai int is_tx, int rss, int qpn, int cqn, int user_prio, 735c27a02cdSYevgeny Petrilin struct mlx4_qp_context *context); 736966508f7SYevgeny Petrilin void mlx4_en_sqp_event(struct mlx4_qp *qp, enum mlx4_event event); 73774194fb9SMaor Gottlieb int mlx4_en_change_mcast_lb(struct mlx4_en_priv *priv, struct mlx4_qp *qp, 73874194fb9SMaor Gottlieb int loopback); 739c27a02cdSYevgeny Petrilin void mlx4_en_calc_rx_buf(struct net_device *dev); 740c27a02cdSYevgeny Petrilin int mlx4_en_config_rss_steer(struct mlx4_en_priv *priv); 741c27a02cdSYevgeny Petrilin void mlx4_en_release_rss_steer(struct mlx4_en_priv *priv); 742cabdc8eeSHadar Hen Zion int mlx4_en_create_drop_qp(struct mlx4_en_priv *priv); 743cabdc8eeSHadar Hen Zion void mlx4_en_destroy_drop_qp(struct mlx4_en_priv *priv); 744c27a02cdSYevgeny Petrilin int mlx4_en_free_tx_buf(struct net_device *dev, struct mlx4_en_tx_ring *ring); 745c27a02cdSYevgeny Petrilin void mlx4_en_rx_irq(struct mlx4_cq *mcq); 746c27a02cdSYevgeny Petrilin 747c27a02cdSYevgeny Petrilin int mlx4_SET_MCAST_FLTR(struct mlx4_dev *dev, u8 port, u64 mac, u64 clear, u8 mode); 748f1b553fbSJiri Pirko int mlx4_SET_VLAN_FLTR(struct mlx4_dev *dev, struct mlx4_en_priv *priv); 749c27a02cdSYevgeny Petrilin 75040931b85SEric Dumazet void mlx4_en_fold_software_stats(struct net_device *dev); 751c27a02cdSYevgeny Petrilin int mlx4_en_DUMP_ETH_STATS(struct mlx4_en_dev *mdev, u8 port, u8 reset); 752e7c1c2c4SYevgeny Petrilin int mlx4_en_QUERY_PORT(struct mlx4_en_dev *mdev, u8 port); 753e7c1c2c4SYevgeny Petrilin 754564c274cSAmir Vadai #ifdef CONFIG_MLX4_EN_DCB 755564c274cSAmir Vadai extern const struct dcbnl_rtnl_ops mlx4_en_dcbnl_ops; 756540b3a39SOr Gerlitz extern const struct dcbnl_rtnl_ops mlx4_en_dcbnl_pfc_ops; 757564c274cSAmir Vadai #endif 758564c274cSAmir Vadai 759d317966bSAmir Vadai int mlx4_en_setup_tc(struct net_device *dev, u8 up); 760d317966bSAmir Vadai 7611eb8c695SAmir Vadai #ifdef CONFIG_RFS_ACCEL 76241d942d5SEugenia Emantayev void mlx4_en_cleanup_filters(struct mlx4_en_priv *priv); 7631eb8c695SAmir Vadai #endif 7641eb8c695SAmir Vadai 765e7c1c2c4SYevgeny Petrilin #define MLX4_EN_NUM_SELF_TEST 5 766e7c1c2c4SYevgeny Petrilin void mlx4_en_ex_selftest(struct net_device *dev, u32 *flags, u64 *buf); 767b6c39bfcSAmir Vadai void mlx4_en_ptp_overflow_check(struct mlx4_en_dev *mdev); 768c27a02cdSYevgeny Petrilin 7697787fa66SSaeed Mahameed #define DEV_FEATURE_CHANGED(dev, new_features, feature) \ 7707787fa66SSaeed Mahameed ((dev->features & feature) ^ (new_features & feature)) 7717787fa66SSaeed Mahameed 7727787fa66SSaeed Mahameed int mlx4_en_reset_config(struct net_device *dev, 7737787fa66SSaeed Mahameed struct hwtstamp_config ts_config, 7747787fa66SSaeed Mahameed netdev_features_t new_features); 7750b131561SMatan Barak void mlx4_en_update_pfc_stats_bitmap(struct mlx4_dev *dev, 7760b131561SMatan Barak struct mlx4_en_stats_bitmap *stats_bitmap, 7770b131561SMatan Barak u8 rx_ppp, u8 rx_pause, 7780b131561SMatan Barak u8 tx_ppp, u8 tx_pause); 7795da03547SMoni Shoua int mlx4_en_netdev_event(struct notifier_block *this, 7805da03547SMoni Shoua unsigned long event, void *ptr); 7815da03547SMoni Shoua 782c27a02cdSYevgeny Petrilin /* 783ec693d47SAmir Vadai * Functions for time stamping 784ec693d47SAmir Vadai */ 785ec693d47SAmir Vadai u64 mlx4_en_get_cqe_ts(struct mlx4_cqe *cqe); 786ec693d47SAmir Vadai void mlx4_en_fill_hwtstamps(struct mlx4_en_dev *mdev, 787ec693d47SAmir Vadai struct skb_shared_hwtstamps *hwts, 788ec693d47SAmir Vadai u64 timestamp); 789ec693d47SAmir Vadai void mlx4_en_init_timestamp(struct mlx4_en_dev *mdev); 790ad7d4eaeSShawn Bohrer void mlx4_en_remove_timestamp(struct mlx4_en_dev *mdev); 791ec693d47SAmir Vadai 792ec693d47SAmir Vadai /* Globals 793c27a02cdSYevgeny Petrilin */ 794c27a02cdSYevgeny Petrilin extern const struct ethtool_ops mlx4_en_ethtool_ops; 7950a645e80SJoe Perches 7960a645e80SJoe Perches 7970a645e80SJoe Perches 7980a645e80SJoe Perches /* 7990a645e80SJoe Perches * printk / logging functions 8000a645e80SJoe Perches */ 8010a645e80SJoe Perches 802b9075fa9SJoe Perches __printf(3, 4) 8030c87b29cSJoe Perches void en_print(const char *level, const struct mlx4_en_priv *priv, 804b9075fa9SJoe Perches const char *format, ...); 8050a645e80SJoe Perches 8061a91de28SJoe Perches #define en_dbg(mlevel, priv, format, ...) \ 8070a645e80SJoe Perches do { \ 8081a91de28SJoe Perches if (NETIF_MSG_##mlevel & (priv)->msg_enable) \ 8091a91de28SJoe Perches en_print(KERN_DEBUG, priv, format, ##__VA_ARGS__); \ 8100a645e80SJoe Perches } while (0) 8111a91de28SJoe Perches #define en_warn(priv, format, ...) \ 8121a91de28SJoe Perches en_print(KERN_WARNING, priv, format, ##__VA_ARGS__) 8131a91de28SJoe Perches #define en_err(priv, format, ...) \ 8141a91de28SJoe Perches en_print(KERN_ERR, priv, format, ##__VA_ARGS__) 8151a91de28SJoe Perches #define en_info(priv, format, ...) \ 8161a91de28SJoe Perches en_print(KERN_INFO, priv, format, ##__VA_ARGS__) 8170a645e80SJoe Perches 8181a91de28SJoe Perches #define mlx4_err(mdev, format, ...) \ 8191a91de28SJoe Perches pr_err(DRV_NAME " %s: " format, \ 8201a91de28SJoe Perches dev_name(&(mdev)->pdev->dev), ##__VA_ARGS__) 8211a91de28SJoe Perches #define mlx4_info(mdev, format, ...) \ 8221a91de28SJoe Perches pr_info(DRV_NAME " %s: " format, \ 8231a91de28SJoe Perches dev_name(&(mdev)->pdev->dev), ##__VA_ARGS__) 8241a91de28SJoe Perches #define mlx4_warn(mdev, format, ...) \ 8251a91de28SJoe Perches pr_warn(DRV_NAME " %s: " format, \ 8261a91de28SJoe Perches dev_name(&(mdev)->pdev->dev), ##__VA_ARGS__) 8270a645e80SJoe Perches 828c27a02cdSYevgeny Petrilin #endif 829