162306a36Sopenharmony_ci/* 262306a36Sopenharmony_ci * Copyright (c) 2007 Mellanox Technologies. All rights reserved. 362306a36Sopenharmony_ci * 462306a36Sopenharmony_ci * This software is available to you under a choice of one of two 562306a36Sopenharmony_ci * licenses. You may choose to be licensed under the terms of the GNU 662306a36Sopenharmony_ci * General Public License (GPL) Version 2, available from the file 762306a36Sopenharmony_ci * COPYING in the main directory of this source tree, or the 862306a36Sopenharmony_ci * OpenIB.org BSD license below: 962306a36Sopenharmony_ci * 1062306a36Sopenharmony_ci * Redistribution and use in source and binary forms, with or 1162306a36Sopenharmony_ci * without modification, are permitted provided that the following 1262306a36Sopenharmony_ci * conditions are met: 1362306a36Sopenharmony_ci * 1462306a36Sopenharmony_ci * - Redistributions of source code must retain the above 1562306a36Sopenharmony_ci * copyright notice, this list of conditions and the following 1662306a36Sopenharmony_ci * disclaimer. 1762306a36Sopenharmony_ci * 1862306a36Sopenharmony_ci * - Redistributions in binary form must reproduce the above 1962306a36Sopenharmony_ci * copyright notice, this list of conditions and the following 2062306a36Sopenharmony_ci * disclaimer in the documentation and/or other materials 2162306a36Sopenharmony_ci * provided with the distribution. 2262306a36Sopenharmony_ci * 2362306a36Sopenharmony_ci * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 2462306a36Sopenharmony_ci * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 2562306a36Sopenharmony_ci * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 2662306a36Sopenharmony_ci * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS 2762306a36Sopenharmony_ci * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN 2862306a36Sopenharmony_ci * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 2962306a36Sopenharmony_ci * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 3062306a36Sopenharmony_ci * SOFTWARE. 3162306a36Sopenharmony_ci * 3262306a36Sopenharmony_ci */ 3362306a36Sopenharmony_ci 3462306a36Sopenharmony_ci#ifndef _MLX4_EN_H_ 3562306a36Sopenharmony_ci#define _MLX4_EN_H_ 3662306a36Sopenharmony_ci 3762306a36Sopenharmony_ci#include <linux/bitops.h> 3862306a36Sopenharmony_ci#include <linux/compiler.h> 3962306a36Sopenharmony_ci#include <linux/ethtool.h> 4062306a36Sopenharmony_ci#include <linux/list.h> 4162306a36Sopenharmony_ci#include <linux/mutex.h> 4262306a36Sopenharmony_ci#include <linux/netdevice.h> 4362306a36Sopenharmony_ci#include <linux/if_vlan.h> 4462306a36Sopenharmony_ci#include <linux/net_tstamp.h> 4562306a36Sopenharmony_ci#ifdef CONFIG_MLX4_EN_DCB 4662306a36Sopenharmony_ci#include <linux/dcbnl.h> 4762306a36Sopenharmony_ci#endif 4862306a36Sopenharmony_ci#include <linux/cpu_rmap.h> 4962306a36Sopenharmony_ci#include <linux/ptp_clock_kernel.h> 5062306a36Sopenharmony_ci#include <linux/irq.h> 5162306a36Sopenharmony_ci#include <net/xdp.h> 5262306a36Sopenharmony_ci#include <linux/notifier.h> 5362306a36Sopenharmony_ci 5462306a36Sopenharmony_ci#include <linux/mlx4/device.h> 5562306a36Sopenharmony_ci#include <linux/mlx4/qp.h> 5662306a36Sopenharmony_ci#include <linux/mlx4/cq.h> 5762306a36Sopenharmony_ci#include <linux/mlx4/srq.h> 5862306a36Sopenharmony_ci#include <linux/mlx4/doorbell.h> 5962306a36Sopenharmony_ci#include <linux/mlx4/cmd.h> 6062306a36Sopenharmony_ci 6162306a36Sopenharmony_ci#include "en_port.h" 6262306a36Sopenharmony_ci#include "mlx4_stats.h" 6362306a36Sopenharmony_ci 6462306a36Sopenharmony_ci#define DRV_NAME "mlx4_en" 6562306a36Sopenharmony_ci#define DRV_VERSION "4.0-0" 6662306a36Sopenharmony_ci 6762306a36Sopenharmony_ci#define MLX4_EN_MSG_LEVEL (NETIF_MSG_LINK | NETIF_MSG_IFDOWN) 6862306a36Sopenharmony_ci 6962306a36Sopenharmony_ci/* 7062306a36Sopenharmony_ci * Device constants 7162306a36Sopenharmony_ci */ 7262306a36Sopenharmony_ci 7362306a36Sopenharmony_ci 7462306a36Sopenharmony_ci#define MLX4_EN_PAGE_SHIFT 12 7562306a36Sopenharmony_ci#define MLX4_EN_PAGE_SIZE (1 << MLX4_EN_PAGE_SHIFT) 7662306a36Sopenharmony_ci#define DEF_RX_RINGS 16 7762306a36Sopenharmony_ci#define MAX_RX_RINGS 128 7862306a36Sopenharmony_ci#define MIN_RX_RINGS 1 7962306a36Sopenharmony_ci#define LOG_TXBB_SIZE 6 8062306a36Sopenharmony_ci#define TXBB_SIZE BIT(LOG_TXBB_SIZE) 8162306a36Sopenharmony_ci#define HEADROOM (2048 / TXBB_SIZE + 1) 8262306a36Sopenharmony_ci#define STAMP_STRIDE 64 8362306a36Sopenharmony_ci#define STAMP_DWORDS (STAMP_STRIDE / 4) 8462306a36Sopenharmony_ci#define STAMP_SHIFT 31 8562306a36Sopenharmony_ci#define STAMP_VAL 0x7fffffff 8662306a36Sopenharmony_ci#define STATS_DELAY (HZ / 4) 8762306a36Sopenharmony_ci#define SERVICE_TASK_DELAY (HZ / 4) 8862306a36Sopenharmony_ci#define MAX_NUM_OF_FS_RULES 256 8962306a36Sopenharmony_ci 9062306a36Sopenharmony_ci#define MLX4_EN_FILTER_HASH_SHIFT 4 9162306a36Sopenharmony_ci#define MLX4_EN_FILTER_EXPIRY_QUOTA 60 9262306a36Sopenharmony_ci 9362306a36Sopenharmony_ci#define CTRL_SIZE sizeof(struct mlx4_wqe_ctrl_seg) 9462306a36Sopenharmony_ci#define DS_SIZE sizeof(struct mlx4_wqe_data_seg) 9562306a36Sopenharmony_ci 9662306a36Sopenharmony_ci/* Maximal size of the bounce buffer: 9762306a36Sopenharmony_ci * 256 bytes for LSO headers. 9862306a36Sopenharmony_ci * CTRL_SIZE for control desc. 9962306a36Sopenharmony_ci * DS_SIZE if skb->head contains some payload. 10062306a36Sopenharmony_ci * MAX_SKB_FRAGS frags. 10162306a36Sopenharmony_ci */ 10262306a36Sopenharmony_ci#define MLX4_TX_BOUNCE_BUFFER_SIZE \ 10362306a36Sopenharmony_ci ALIGN(256 + CTRL_SIZE + DS_SIZE + MAX_SKB_FRAGS * DS_SIZE, TXBB_SIZE) 10462306a36Sopenharmony_ci 10562306a36Sopenharmony_ci#define MLX4_MAX_DESC_TXBBS (MLX4_TX_BOUNCE_BUFFER_SIZE / TXBB_SIZE) 10662306a36Sopenharmony_ci 10762306a36Sopenharmony_ci/* 10862306a36Sopenharmony_ci * OS related constants and tunables 10962306a36Sopenharmony_ci */ 11062306a36Sopenharmony_ci 11162306a36Sopenharmony_ci#define MLX4_EN_PRIV_FLAGS_BLUEFLAME 1 11262306a36Sopenharmony_ci#define MLX4_EN_PRIV_FLAGS_PHV 2 11362306a36Sopenharmony_ci 11462306a36Sopenharmony_ci#define MLX4_EN_WATCHDOG_TIMEOUT (15 * HZ) 11562306a36Sopenharmony_ci 11662306a36Sopenharmony_ci/* Use the maximum between 16384 and a single page */ 11762306a36Sopenharmony_ci#define MLX4_EN_ALLOC_SIZE PAGE_ALIGN(16384) 11862306a36Sopenharmony_ci 11962306a36Sopenharmony_ci#define MLX4_EN_MAX_RX_FRAGS 4 12062306a36Sopenharmony_ci 12162306a36Sopenharmony_ci/* Maximum ring sizes */ 12262306a36Sopenharmony_ci#define MLX4_EN_MAX_TX_SIZE 8192 12362306a36Sopenharmony_ci#define MLX4_EN_MAX_RX_SIZE 8192 12462306a36Sopenharmony_ci 12562306a36Sopenharmony_ci/* Minimum ring size for our page-allocation scheme to work */ 12662306a36Sopenharmony_ci#define MLX4_EN_MIN_RX_SIZE (MLX4_EN_ALLOC_SIZE / SMP_CACHE_BYTES) 12762306a36Sopenharmony_ci#define MLX4_EN_MIN_TX_SIZE (4096 / TXBB_SIZE) 12862306a36Sopenharmony_ci 12962306a36Sopenharmony_ci#define MLX4_EN_SMALL_PKT_SIZE 64 13062306a36Sopenharmony_ci#define MLX4_EN_MIN_TX_RING_P_UP 1 13162306a36Sopenharmony_ci#define MLX4_EN_MAX_TX_RING_P_UP 32 13262306a36Sopenharmony_ci#define MLX4_EN_NUM_UP_LOW 1 13362306a36Sopenharmony_ci#define MLX4_EN_NUM_UP_HIGH 8 13462306a36Sopenharmony_ci#define MLX4_EN_DEF_RX_RING_SIZE 1024 13562306a36Sopenharmony_ci#define MLX4_EN_DEF_TX_RING_SIZE MLX4_EN_DEF_RX_RING_SIZE 13662306a36Sopenharmony_ci#define MAX_TX_RINGS (MLX4_EN_MAX_TX_RING_P_UP * \ 13762306a36Sopenharmony_ci MLX4_EN_NUM_UP_HIGH) 13862306a36Sopenharmony_ci 13962306a36Sopenharmony_ci#define MLX4_EN_DEFAULT_TX_WORK 256 14062306a36Sopenharmony_ci 14162306a36Sopenharmony_ci/* Target number of packets to coalesce with interrupt moderation */ 14262306a36Sopenharmony_ci#define MLX4_EN_RX_COAL_TARGET 44 14362306a36Sopenharmony_ci#define MLX4_EN_RX_COAL_TIME 0x10 14462306a36Sopenharmony_ci 14562306a36Sopenharmony_ci#define MLX4_EN_TX_COAL_PKTS 16 14662306a36Sopenharmony_ci#define MLX4_EN_TX_COAL_TIME 0x10 14762306a36Sopenharmony_ci 14862306a36Sopenharmony_ci#define MLX4_EN_MAX_COAL_PKTS U16_MAX 14962306a36Sopenharmony_ci#define MLX4_EN_MAX_COAL_TIME U16_MAX 15062306a36Sopenharmony_ci 15162306a36Sopenharmony_ci#define MLX4_EN_RX_RATE_LOW 400000 15262306a36Sopenharmony_ci#define MLX4_EN_RX_COAL_TIME_LOW 0 15362306a36Sopenharmony_ci#define MLX4_EN_RX_RATE_HIGH 450000 15462306a36Sopenharmony_ci#define MLX4_EN_RX_COAL_TIME_HIGH 128 15562306a36Sopenharmony_ci#define MLX4_EN_RX_SIZE_THRESH 1024 15662306a36Sopenharmony_ci#define MLX4_EN_RX_RATE_THRESH (1000000 / MLX4_EN_RX_COAL_TIME_HIGH) 15762306a36Sopenharmony_ci#define MLX4_EN_SAMPLE_INTERVAL 0 15862306a36Sopenharmony_ci#define MLX4_EN_AVG_PKT_SMALL 256 15962306a36Sopenharmony_ci 16062306a36Sopenharmony_ci#define MLX4_EN_AUTO_CONF 0xffff 16162306a36Sopenharmony_ci 16262306a36Sopenharmony_ci#define MLX4_EN_DEF_RX_PAUSE 1 16362306a36Sopenharmony_ci#define MLX4_EN_DEF_TX_PAUSE 1 16462306a36Sopenharmony_ci 16562306a36Sopenharmony_ci/* Interval between successive polls in the Tx routine when polling is used 16662306a36Sopenharmony_ci instead of interrupts (in per-core Tx rings) - should be power of 2 */ 16762306a36Sopenharmony_ci#define MLX4_EN_TX_POLL_MODER 16 16862306a36Sopenharmony_ci#define MLX4_EN_TX_POLL_TIMEOUT (HZ / 4) 16962306a36Sopenharmony_ci 17062306a36Sopenharmony_ci#define SMALL_PACKET_SIZE (256 - NET_IP_ALIGN) 17162306a36Sopenharmony_ci#define HEADER_COPY_SIZE (128 - NET_IP_ALIGN) 17262306a36Sopenharmony_ci#define MLX4_LOOPBACK_TEST_PAYLOAD (HEADER_COPY_SIZE - ETH_HLEN) 17362306a36Sopenharmony_ci#define PREAMBLE_LEN 8 17462306a36Sopenharmony_ci#define MLX4_SELFTEST_LB_MIN_MTU (MLX4_LOOPBACK_TEST_PAYLOAD + NET_IP_ALIGN + \ 17562306a36Sopenharmony_ci ETH_HLEN + PREAMBLE_LEN) 17662306a36Sopenharmony_ci 17762306a36Sopenharmony_ci/* VLAN_HLEN is added twice,to support skb vlan tagged with multiple 17862306a36Sopenharmony_ci * headers. (For example: ETH_P_8021Q and ETH_P_8021AD). 17962306a36Sopenharmony_ci */ 18062306a36Sopenharmony_ci#define MLX4_EN_EFF_MTU(mtu) ((mtu) + ETH_HLEN + (2 * VLAN_HLEN)) 18162306a36Sopenharmony_ci#define ETH_BCAST 0xffffffffffffULL 18262306a36Sopenharmony_ci 18362306a36Sopenharmony_ci#define MLX4_EN_LOOPBACK_RETRIES 5 18462306a36Sopenharmony_ci#define MLX4_EN_LOOPBACK_TIMEOUT 100 18562306a36Sopenharmony_ci 18662306a36Sopenharmony_ci/* Constants for TX flow */ 18762306a36Sopenharmony_cienum { 18862306a36Sopenharmony_ci MAX_INLINE = 104, /* 128 - 16 - 4 - 4 */ 18962306a36Sopenharmony_ci MAX_BF = 256, 19062306a36Sopenharmony_ci MIN_PKT_LEN = 17, 19162306a36Sopenharmony_ci}; 19262306a36Sopenharmony_ci 19362306a36Sopenharmony_ci/* 19462306a36Sopenharmony_ci * Configurables 19562306a36Sopenharmony_ci */ 19662306a36Sopenharmony_ci 19762306a36Sopenharmony_cienum cq_type { 19862306a36Sopenharmony_ci /* keep tx types first */ 19962306a36Sopenharmony_ci TX, 20062306a36Sopenharmony_ci TX_XDP, 20162306a36Sopenharmony_ci#define MLX4_EN_NUM_TX_TYPES (TX_XDP + 1) 20262306a36Sopenharmony_ci RX, 20362306a36Sopenharmony_ci}; 20462306a36Sopenharmony_ci 20562306a36Sopenharmony_ci 20662306a36Sopenharmony_ci/* 20762306a36Sopenharmony_ci * Useful macros 20862306a36Sopenharmony_ci */ 20962306a36Sopenharmony_ci#define ROUNDUP_LOG2(x) ilog2(roundup_pow_of_two(x)) 21062306a36Sopenharmony_ci#define XNOR(x, y) (!(x) == !(y)) 21162306a36Sopenharmony_ci 21262306a36Sopenharmony_ci 21362306a36Sopenharmony_cistruct mlx4_en_tx_info { 21462306a36Sopenharmony_ci union { 21562306a36Sopenharmony_ci struct sk_buff *skb; 21662306a36Sopenharmony_ci struct page *page; 21762306a36Sopenharmony_ci }; 21862306a36Sopenharmony_ci dma_addr_t map0_dma; 21962306a36Sopenharmony_ci u32 map0_byte_count; 22062306a36Sopenharmony_ci u32 nr_txbb; 22162306a36Sopenharmony_ci u32 nr_bytes; 22262306a36Sopenharmony_ci u8 linear; 22362306a36Sopenharmony_ci u8 data_offset; 22462306a36Sopenharmony_ci u8 inl; 22562306a36Sopenharmony_ci u8 ts_requested; 22662306a36Sopenharmony_ci u8 nr_maps; 22762306a36Sopenharmony_ci} ____cacheline_aligned_in_smp; 22862306a36Sopenharmony_ci 22962306a36Sopenharmony_ci 23062306a36Sopenharmony_ci#define MLX4_EN_BIT_DESC_OWN 0x80000000 23162306a36Sopenharmony_ci#define MLX4_EN_MEMTYPE_PAD 0x100 23262306a36Sopenharmony_ci 23362306a36Sopenharmony_ci 23462306a36Sopenharmony_cistruct mlx4_en_tx_desc { 23562306a36Sopenharmony_ci struct mlx4_wqe_ctrl_seg ctrl; 23662306a36Sopenharmony_ci union { 23762306a36Sopenharmony_ci struct mlx4_wqe_data_seg data; /* at least one data segment */ 23862306a36Sopenharmony_ci struct mlx4_wqe_lso_seg lso; 23962306a36Sopenharmony_ci struct mlx4_wqe_inline_seg inl; 24062306a36Sopenharmony_ci }; 24162306a36Sopenharmony_ci}; 24262306a36Sopenharmony_ci 24362306a36Sopenharmony_ci#define MLX4_EN_USE_SRQ 0x01000000 24462306a36Sopenharmony_ci 24562306a36Sopenharmony_ci#define MLX4_EN_CX3_LOW_ID 0x1000 24662306a36Sopenharmony_ci#define MLX4_EN_CX3_HIGH_ID 0x1005 24762306a36Sopenharmony_ci 24862306a36Sopenharmony_cistruct mlx4_en_rx_alloc { 24962306a36Sopenharmony_ci struct page *page; 25062306a36Sopenharmony_ci dma_addr_t dma; 25162306a36Sopenharmony_ci u32 page_offset; 25262306a36Sopenharmony_ci}; 25362306a36Sopenharmony_ci 25462306a36Sopenharmony_ci#define MLX4_EN_CACHE_SIZE (2 * NAPI_POLL_WEIGHT) 25562306a36Sopenharmony_ci 25662306a36Sopenharmony_cistruct mlx4_en_page_cache { 25762306a36Sopenharmony_ci u32 index; 25862306a36Sopenharmony_ci struct { 25962306a36Sopenharmony_ci struct page *page; 26062306a36Sopenharmony_ci dma_addr_t dma; 26162306a36Sopenharmony_ci } buf[MLX4_EN_CACHE_SIZE]; 26262306a36Sopenharmony_ci}; 26362306a36Sopenharmony_ci 26462306a36Sopenharmony_cienum { 26562306a36Sopenharmony_ci MLX4_EN_TX_RING_STATE_RECOVERING, 26662306a36Sopenharmony_ci}; 26762306a36Sopenharmony_ci 26862306a36Sopenharmony_cistruct mlx4_en_priv; 26962306a36Sopenharmony_ci 27062306a36Sopenharmony_cistruct mlx4_en_tx_ring { 27162306a36Sopenharmony_ci /* cache line used and dirtied in tx completion 27262306a36Sopenharmony_ci * (mlx4_en_free_tx_buf()) 27362306a36Sopenharmony_ci */ 27462306a36Sopenharmony_ci u32 last_nr_txbb; 27562306a36Sopenharmony_ci u32 cons; 27662306a36Sopenharmony_ci unsigned long wake_queue; 27762306a36Sopenharmony_ci struct netdev_queue *tx_queue; 27862306a36Sopenharmony_ci u32 (*free_tx_desc)(struct mlx4_en_priv *priv, 27962306a36Sopenharmony_ci struct mlx4_en_tx_ring *ring, 28062306a36Sopenharmony_ci int index, 28162306a36Sopenharmony_ci u64 timestamp, int napi_mode); 28262306a36Sopenharmony_ci struct mlx4_en_rx_ring *recycle_ring; 28362306a36Sopenharmony_ci 28462306a36Sopenharmony_ci /* cache line used and dirtied in mlx4_en_xmit() */ 28562306a36Sopenharmony_ci u32 prod ____cacheline_aligned_in_smp; 28662306a36Sopenharmony_ci unsigned int tx_dropped; 28762306a36Sopenharmony_ci unsigned long bytes; 28862306a36Sopenharmony_ci unsigned long packets; 28962306a36Sopenharmony_ci unsigned long tx_csum; 29062306a36Sopenharmony_ci unsigned long tso_packets; 29162306a36Sopenharmony_ci unsigned long xmit_more; 29262306a36Sopenharmony_ci struct mlx4_bf bf; 29362306a36Sopenharmony_ci 29462306a36Sopenharmony_ci /* Following part should be mostly read */ 29562306a36Sopenharmony_ci void __iomem *doorbell_address; 29662306a36Sopenharmony_ci __be32 doorbell_qpn; 29762306a36Sopenharmony_ci __be32 mr_key; 29862306a36Sopenharmony_ci u32 size; /* number of TXBBs */ 29962306a36Sopenharmony_ci u32 size_mask; 30062306a36Sopenharmony_ci u32 full_size; 30162306a36Sopenharmony_ci u32 buf_size; 30262306a36Sopenharmony_ci void *buf; 30362306a36Sopenharmony_ci struct mlx4_en_tx_info *tx_info; 30462306a36Sopenharmony_ci int qpn; 30562306a36Sopenharmony_ci u8 queue_index; 30662306a36Sopenharmony_ci bool bf_enabled; 30762306a36Sopenharmony_ci bool bf_alloced; 30862306a36Sopenharmony_ci u8 hwtstamp_tx_type; 30962306a36Sopenharmony_ci u8 *bounce_buf; 31062306a36Sopenharmony_ci 31162306a36Sopenharmony_ci /* Not used in fast path 31262306a36Sopenharmony_ci * Only queue_stopped might be used if BQL is not properly working. 31362306a36Sopenharmony_ci */ 31462306a36Sopenharmony_ci unsigned long queue_stopped; 31562306a36Sopenharmony_ci unsigned long state; 31662306a36Sopenharmony_ci struct mlx4_hwq_resources sp_wqres; 31762306a36Sopenharmony_ci struct mlx4_qp sp_qp; 31862306a36Sopenharmony_ci struct mlx4_qp_context sp_context; 31962306a36Sopenharmony_ci cpumask_t sp_affinity_mask; 32062306a36Sopenharmony_ci enum mlx4_qp_state sp_qp_state; 32162306a36Sopenharmony_ci u16 sp_stride; 32262306a36Sopenharmony_ci u16 sp_cqn; /* index of port CQ associated with this ring */ 32362306a36Sopenharmony_ci} ____cacheline_aligned_in_smp; 32462306a36Sopenharmony_ci 32562306a36Sopenharmony_cistruct mlx4_en_rx_desc { 32662306a36Sopenharmony_ci /* actual number of entries depends on rx ring stride */ 32762306a36Sopenharmony_ci DECLARE_FLEX_ARRAY(struct mlx4_wqe_data_seg, data); 32862306a36Sopenharmony_ci}; 32962306a36Sopenharmony_ci 33062306a36Sopenharmony_cistruct mlx4_en_rx_ring { 33162306a36Sopenharmony_ci struct mlx4_hwq_resources wqres; 33262306a36Sopenharmony_ci u32 size ; /* number of Rx descs*/ 33362306a36Sopenharmony_ci u32 actual_size; 33462306a36Sopenharmony_ci u32 size_mask; 33562306a36Sopenharmony_ci u16 stride; 33662306a36Sopenharmony_ci u16 log_stride; 33762306a36Sopenharmony_ci u16 cqn; /* index of port CQ associated with this ring */ 33862306a36Sopenharmony_ci u32 prod; 33962306a36Sopenharmony_ci u32 cons; 34062306a36Sopenharmony_ci u32 buf_size; 34162306a36Sopenharmony_ci u8 fcs_del; 34262306a36Sopenharmony_ci void *buf; 34362306a36Sopenharmony_ci void *rx_info; 34462306a36Sopenharmony_ci struct bpf_prog __rcu *xdp_prog; 34562306a36Sopenharmony_ci struct mlx4_en_page_cache page_cache; 34662306a36Sopenharmony_ci unsigned long bytes; 34762306a36Sopenharmony_ci unsigned long packets; 34862306a36Sopenharmony_ci unsigned long csum_ok; 34962306a36Sopenharmony_ci unsigned long csum_none; 35062306a36Sopenharmony_ci unsigned long csum_complete; 35162306a36Sopenharmony_ci unsigned long rx_alloc_pages; 35262306a36Sopenharmony_ci unsigned long xdp_drop; 35362306a36Sopenharmony_ci unsigned long xdp_redirect; 35462306a36Sopenharmony_ci unsigned long xdp_redirect_fail; 35562306a36Sopenharmony_ci unsigned long xdp_tx; 35662306a36Sopenharmony_ci unsigned long xdp_tx_full; 35762306a36Sopenharmony_ci unsigned long dropped; 35862306a36Sopenharmony_ci int hwtstamp_rx_filter; 35962306a36Sopenharmony_ci cpumask_var_t affinity_mask; 36062306a36Sopenharmony_ci struct xdp_rxq_info xdp_rxq; 36162306a36Sopenharmony_ci}; 36262306a36Sopenharmony_ci 36362306a36Sopenharmony_cistruct mlx4_en_cq { 36462306a36Sopenharmony_ci struct mlx4_cq mcq; 36562306a36Sopenharmony_ci struct mlx4_hwq_resources wqres; 36662306a36Sopenharmony_ci int ring; 36762306a36Sopenharmony_ci struct net_device *dev; 36862306a36Sopenharmony_ci union { 36962306a36Sopenharmony_ci struct napi_struct napi; 37062306a36Sopenharmony_ci bool xdp_busy; 37162306a36Sopenharmony_ci }; 37262306a36Sopenharmony_ci int size; 37362306a36Sopenharmony_ci int buf_size; 37462306a36Sopenharmony_ci int vector; 37562306a36Sopenharmony_ci enum cq_type type; 37662306a36Sopenharmony_ci u16 moder_time; 37762306a36Sopenharmony_ci u16 moder_cnt; 37862306a36Sopenharmony_ci struct mlx4_cqe *buf; 37962306a36Sopenharmony_ci#define MLX4_EN_OPCODE_ERROR 0x1e 38062306a36Sopenharmony_ci 38162306a36Sopenharmony_ci const struct cpumask *aff_mask; 38262306a36Sopenharmony_ci}; 38362306a36Sopenharmony_ci 38462306a36Sopenharmony_cistruct mlx4_en_port_profile { 38562306a36Sopenharmony_ci u32 flags; 38662306a36Sopenharmony_ci u32 tx_ring_num[MLX4_EN_NUM_TX_TYPES]; 38762306a36Sopenharmony_ci u32 rx_ring_num; 38862306a36Sopenharmony_ci u32 tx_ring_size; 38962306a36Sopenharmony_ci u32 rx_ring_size; 39062306a36Sopenharmony_ci u8 num_tx_rings_p_up; 39162306a36Sopenharmony_ci u8 rx_pause; 39262306a36Sopenharmony_ci u8 rx_ppp; 39362306a36Sopenharmony_ci u8 tx_pause; 39462306a36Sopenharmony_ci u8 tx_ppp; 39562306a36Sopenharmony_ci u8 num_up; 39662306a36Sopenharmony_ci int rss_rings; 39762306a36Sopenharmony_ci int inline_thold; 39862306a36Sopenharmony_ci struct hwtstamp_config hwtstamp_config; 39962306a36Sopenharmony_ci}; 40062306a36Sopenharmony_ci 40162306a36Sopenharmony_cistruct mlx4_en_profile { 40262306a36Sopenharmony_ci int udp_rss; 40362306a36Sopenharmony_ci u8 rss_mask; 40462306a36Sopenharmony_ci u32 active_ports; 40562306a36Sopenharmony_ci u32 small_pkt_int; 40662306a36Sopenharmony_ci u8 no_reset; 40762306a36Sopenharmony_ci u8 max_num_tx_rings_p_up; 40862306a36Sopenharmony_ci struct mlx4_en_port_profile prof[MLX4_MAX_PORTS + 1]; 40962306a36Sopenharmony_ci}; 41062306a36Sopenharmony_ci 41162306a36Sopenharmony_cistruct mlx4_en_dev { 41262306a36Sopenharmony_ci struct mlx4_dev *dev; 41362306a36Sopenharmony_ci struct pci_dev *pdev; 41462306a36Sopenharmony_ci struct mutex state_lock; 41562306a36Sopenharmony_ci struct net_device *pndev[MLX4_MAX_PORTS + 1]; 41662306a36Sopenharmony_ci struct net_device *upper[MLX4_MAX_PORTS + 1]; 41762306a36Sopenharmony_ci u32 port_cnt; 41862306a36Sopenharmony_ci bool device_up; 41962306a36Sopenharmony_ci struct mlx4_en_profile profile; 42062306a36Sopenharmony_ci u32 LSO_support; 42162306a36Sopenharmony_ci struct workqueue_struct *workqueue; 42262306a36Sopenharmony_ci struct device *dma_device; 42362306a36Sopenharmony_ci void __iomem *uar_map; 42462306a36Sopenharmony_ci struct mlx4_uar priv_uar; 42562306a36Sopenharmony_ci struct mlx4_mr mr; 42662306a36Sopenharmony_ci u32 priv_pdn; 42762306a36Sopenharmony_ci spinlock_t uar_lock; 42862306a36Sopenharmony_ci u8 mac_removed[MLX4_MAX_PORTS + 1]; 42962306a36Sopenharmony_ci u32 nominal_c_mult; 43062306a36Sopenharmony_ci struct cyclecounter cycles; 43162306a36Sopenharmony_ci seqlock_t clock_lock; 43262306a36Sopenharmony_ci struct timecounter clock; 43362306a36Sopenharmony_ci unsigned long last_overflow_check; 43462306a36Sopenharmony_ci struct ptp_clock *ptp_clock; 43562306a36Sopenharmony_ci struct ptp_clock_info ptp_clock_info; 43662306a36Sopenharmony_ci struct notifier_block netdev_nb; 43762306a36Sopenharmony_ci struct notifier_block mlx_nb; 43862306a36Sopenharmony_ci}; 43962306a36Sopenharmony_ci 44062306a36Sopenharmony_ci 44162306a36Sopenharmony_cistruct mlx4_en_rss_map { 44262306a36Sopenharmony_ci int base_qpn; 44362306a36Sopenharmony_ci struct mlx4_qp qps[MAX_RX_RINGS]; 44462306a36Sopenharmony_ci enum mlx4_qp_state state[MAX_RX_RINGS]; 44562306a36Sopenharmony_ci struct mlx4_qp *indir_qp; 44662306a36Sopenharmony_ci enum mlx4_qp_state indir_state; 44762306a36Sopenharmony_ci}; 44862306a36Sopenharmony_ci 44962306a36Sopenharmony_cienum mlx4_en_port_flag { 45062306a36Sopenharmony_ci MLX4_EN_PORT_ANC = 1<<0, /* Auto-negotiation complete */ 45162306a36Sopenharmony_ci MLX4_EN_PORT_ANE = 1<<1, /* Auto-negotiation enabled */ 45262306a36Sopenharmony_ci}; 45362306a36Sopenharmony_ci 45462306a36Sopenharmony_cistruct mlx4_en_port_state { 45562306a36Sopenharmony_ci int link_state; 45662306a36Sopenharmony_ci int link_speed; 45762306a36Sopenharmony_ci int transceiver; 45862306a36Sopenharmony_ci u32 flags; 45962306a36Sopenharmony_ci}; 46062306a36Sopenharmony_ci 46162306a36Sopenharmony_cienum mlx4_en_mclist_act { 46262306a36Sopenharmony_ci MCLIST_NONE, 46362306a36Sopenharmony_ci MCLIST_REM, 46462306a36Sopenharmony_ci MCLIST_ADD, 46562306a36Sopenharmony_ci}; 46662306a36Sopenharmony_ci 46762306a36Sopenharmony_cistruct mlx4_en_mc_list { 46862306a36Sopenharmony_ci struct list_head list; 46962306a36Sopenharmony_ci enum mlx4_en_mclist_act action; 47062306a36Sopenharmony_ci u8 addr[ETH_ALEN]; 47162306a36Sopenharmony_ci u64 reg_id; 47262306a36Sopenharmony_ci u64 tunnel_reg_id; 47362306a36Sopenharmony_ci}; 47462306a36Sopenharmony_ci 47562306a36Sopenharmony_cistruct mlx4_en_frag_info { 47662306a36Sopenharmony_ci u16 frag_size; 47762306a36Sopenharmony_ci u32 frag_stride; 47862306a36Sopenharmony_ci}; 47962306a36Sopenharmony_ci 48062306a36Sopenharmony_ci#ifdef CONFIG_MLX4_EN_DCB 48162306a36Sopenharmony_ci/* Minimal TC BW - setting to 0 will block traffic */ 48262306a36Sopenharmony_ci#define MLX4_EN_BW_MIN 1 48362306a36Sopenharmony_ci#define MLX4_EN_BW_MAX 100 /* Utilize 100% of the line */ 48462306a36Sopenharmony_ci 48562306a36Sopenharmony_ci#define MLX4_EN_TC_VENDOR 0 48662306a36Sopenharmony_ci#define MLX4_EN_TC_ETS 7 48762306a36Sopenharmony_ci 48862306a36Sopenharmony_cienum dcb_pfc_type { 48962306a36Sopenharmony_ci pfc_disabled = 0, 49062306a36Sopenharmony_ci pfc_enabled_full, 49162306a36Sopenharmony_ci pfc_enabled_tx, 49262306a36Sopenharmony_ci pfc_enabled_rx 49362306a36Sopenharmony_ci}; 49462306a36Sopenharmony_ci 49562306a36Sopenharmony_cistruct mlx4_en_cee_config { 49662306a36Sopenharmony_ci bool pfc_state; 49762306a36Sopenharmony_ci enum dcb_pfc_type dcb_pfc[MLX4_EN_NUM_UP_HIGH]; 49862306a36Sopenharmony_ci}; 49962306a36Sopenharmony_ci#endif 50062306a36Sopenharmony_ci 50162306a36Sopenharmony_cistruct ethtool_flow_id { 50262306a36Sopenharmony_ci struct list_head list; 50362306a36Sopenharmony_ci struct ethtool_rx_flow_spec flow_spec; 50462306a36Sopenharmony_ci u64 id; 50562306a36Sopenharmony_ci}; 50662306a36Sopenharmony_ci 50762306a36Sopenharmony_cienum { 50862306a36Sopenharmony_ci MLX4_EN_FLAG_PROMISC = (1 << 0), 50962306a36Sopenharmony_ci MLX4_EN_FLAG_MC_PROMISC = (1 << 1), 51062306a36Sopenharmony_ci /* whether we need to enable hardware loopback by putting dmac 51162306a36Sopenharmony_ci * in Tx WQE 51262306a36Sopenharmony_ci */ 51362306a36Sopenharmony_ci MLX4_EN_FLAG_ENABLE_HW_LOOPBACK = (1 << 2), 51462306a36Sopenharmony_ci /* whether we need to drop packets that hardware loopback-ed */ 51562306a36Sopenharmony_ci MLX4_EN_FLAG_RX_FILTER_NEEDED = (1 << 3), 51662306a36Sopenharmony_ci MLX4_EN_FLAG_FORCE_PROMISC = (1 << 4), 51762306a36Sopenharmony_ci MLX4_EN_FLAG_RX_CSUM_NON_TCP_UDP = (1 << 5), 51862306a36Sopenharmony_ci#ifdef CONFIG_MLX4_EN_DCB 51962306a36Sopenharmony_ci MLX4_EN_FLAG_DCB_ENABLED = (1 << 6), 52062306a36Sopenharmony_ci#endif 52162306a36Sopenharmony_ci}; 52262306a36Sopenharmony_ci 52362306a36Sopenharmony_ci#define PORT_BEACON_MAX_LIMIT (65535) 52462306a36Sopenharmony_ci#define MLX4_EN_MAC_HASH_SIZE (1 << BITS_PER_BYTE) 52562306a36Sopenharmony_ci#define MLX4_EN_MAC_HASH_IDX 5 52662306a36Sopenharmony_ci 52762306a36Sopenharmony_cistruct mlx4_en_stats_bitmap { 52862306a36Sopenharmony_ci DECLARE_BITMAP(bitmap, NUM_ALL_STATS); 52962306a36Sopenharmony_ci struct mutex mutex; /* for mutual access to stats bitmap */ 53062306a36Sopenharmony_ci}; 53162306a36Sopenharmony_ci 53262306a36Sopenharmony_cienum { 53362306a36Sopenharmony_ci MLX4_EN_STATE_FLAG_RESTARTING, 53462306a36Sopenharmony_ci}; 53562306a36Sopenharmony_ci 53662306a36Sopenharmony_cistruct mlx4_en_priv { 53762306a36Sopenharmony_ci struct mlx4_en_dev *mdev; 53862306a36Sopenharmony_ci struct mlx4_en_port_profile *prof; 53962306a36Sopenharmony_ci struct net_device *dev; 54062306a36Sopenharmony_ci unsigned long active_vlans[BITS_TO_LONGS(VLAN_N_VID)]; 54162306a36Sopenharmony_ci struct mlx4_en_port_state port_state; 54262306a36Sopenharmony_ci spinlock_t stats_lock; 54362306a36Sopenharmony_ci struct ethtool_flow_id ethtool_rules[MAX_NUM_OF_FS_RULES]; 54462306a36Sopenharmony_ci /* To allow rules removal while port is going down */ 54562306a36Sopenharmony_ci struct list_head ethtool_list; 54662306a36Sopenharmony_ci 54762306a36Sopenharmony_ci unsigned long last_moder_packets[MAX_RX_RINGS]; 54862306a36Sopenharmony_ci unsigned long last_moder_tx_packets; 54962306a36Sopenharmony_ci unsigned long last_moder_bytes[MAX_RX_RINGS]; 55062306a36Sopenharmony_ci unsigned long last_moder_jiffies; 55162306a36Sopenharmony_ci int last_moder_time[MAX_RX_RINGS]; 55262306a36Sopenharmony_ci u16 rx_usecs; 55362306a36Sopenharmony_ci u16 rx_frames; 55462306a36Sopenharmony_ci u16 tx_usecs; 55562306a36Sopenharmony_ci u16 tx_frames; 55662306a36Sopenharmony_ci u32 pkt_rate_low; 55762306a36Sopenharmony_ci u16 rx_usecs_low; 55862306a36Sopenharmony_ci u32 pkt_rate_high; 55962306a36Sopenharmony_ci u16 rx_usecs_high; 56062306a36Sopenharmony_ci u32 sample_interval; 56162306a36Sopenharmony_ci u32 adaptive_rx_coal; 56262306a36Sopenharmony_ci u32 msg_enable; 56362306a36Sopenharmony_ci u32 loopback_ok; 56462306a36Sopenharmony_ci u32 validate_loopback; 56562306a36Sopenharmony_ci 56662306a36Sopenharmony_ci struct mlx4_hwq_resources res; 56762306a36Sopenharmony_ci int link_state; 56862306a36Sopenharmony_ci bool port_up; 56962306a36Sopenharmony_ci int port; 57062306a36Sopenharmony_ci int registered; 57162306a36Sopenharmony_ci int allocated; 57262306a36Sopenharmony_ci int stride; 57362306a36Sopenharmony_ci unsigned char current_mac[ETH_ALEN + 2]; 57462306a36Sopenharmony_ci int mac_index; 57562306a36Sopenharmony_ci unsigned max_mtu; 57662306a36Sopenharmony_ci int base_qpn; 57762306a36Sopenharmony_ci int cqe_factor; 57862306a36Sopenharmony_ci int cqe_size; 57962306a36Sopenharmony_ci 58062306a36Sopenharmony_ci struct mlx4_en_rss_map rss_map; 58162306a36Sopenharmony_ci __be32 ctrl_flags; 58262306a36Sopenharmony_ci u32 flags; 58362306a36Sopenharmony_ci u8 num_tx_rings_p_up; 58462306a36Sopenharmony_ci u32 tx_work_limit; 58562306a36Sopenharmony_ci u32 tx_ring_num[MLX4_EN_NUM_TX_TYPES]; 58662306a36Sopenharmony_ci u32 rx_ring_num; 58762306a36Sopenharmony_ci u32 rx_skb_size; 58862306a36Sopenharmony_ci struct mlx4_en_frag_info frag_info[MLX4_EN_MAX_RX_FRAGS]; 58962306a36Sopenharmony_ci u8 num_frags; 59062306a36Sopenharmony_ci u8 log_rx_info; 59162306a36Sopenharmony_ci u8 dma_dir; 59262306a36Sopenharmony_ci u16 rx_headroom; 59362306a36Sopenharmony_ci 59462306a36Sopenharmony_ci struct mlx4_en_tx_ring **tx_ring[MLX4_EN_NUM_TX_TYPES]; 59562306a36Sopenharmony_ci struct mlx4_en_rx_ring *rx_ring[MAX_RX_RINGS]; 59662306a36Sopenharmony_ci struct mlx4_en_cq **tx_cq[MLX4_EN_NUM_TX_TYPES]; 59762306a36Sopenharmony_ci struct mlx4_en_cq *rx_cq[MAX_RX_RINGS]; 59862306a36Sopenharmony_ci struct mlx4_qp drop_qp; 59962306a36Sopenharmony_ci struct work_struct rx_mode_task; 60062306a36Sopenharmony_ci struct work_struct restart_task; 60162306a36Sopenharmony_ci struct work_struct linkstate_task; 60262306a36Sopenharmony_ci struct delayed_work stats_task; 60362306a36Sopenharmony_ci struct delayed_work service_task; 60462306a36Sopenharmony_ci struct mlx4_en_pkt_stats pkstats; 60562306a36Sopenharmony_ci struct mlx4_en_counter_stats pf_stats; 60662306a36Sopenharmony_ci struct mlx4_en_flow_stats_rx rx_priority_flowstats[MLX4_NUM_PRIORITIES]; 60762306a36Sopenharmony_ci struct mlx4_en_flow_stats_tx tx_priority_flowstats[MLX4_NUM_PRIORITIES]; 60862306a36Sopenharmony_ci struct mlx4_en_flow_stats_rx rx_flowstats; 60962306a36Sopenharmony_ci struct mlx4_en_flow_stats_tx tx_flowstats; 61062306a36Sopenharmony_ci struct mlx4_en_port_stats port_stats; 61162306a36Sopenharmony_ci struct mlx4_en_xdp_stats xdp_stats; 61262306a36Sopenharmony_ci struct mlx4_en_phy_stats phy_stats; 61362306a36Sopenharmony_ci struct mlx4_en_stats_bitmap stats_bitmap; 61462306a36Sopenharmony_ci struct list_head mc_list; 61562306a36Sopenharmony_ci struct list_head curr_list; 61662306a36Sopenharmony_ci u64 broadcast_id; 61762306a36Sopenharmony_ci struct mlx4_en_stat_out_mbox hw_stats; 61862306a36Sopenharmony_ci int vids[128]; 61962306a36Sopenharmony_ci bool wol; 62062306a36Sopenharmony_ci struct device *ddev; 62162306a36Sopenharmony_ci struct hlist_head mac_hash[MLX4_EN_MAC_HASH_SIZE]; 62262306a36Sopenharmony_ci struct hwtstamp_config hwtstamp_config; 62362306a36Sopenharmony_ci u32 counter_index; 62462306a36Sopenharmony_ci 62562306a36Sopenharmony_ci#ifdef CONFIG_MLX4_EN_DCB 62662306a36Sopenharmony_ci#define MLX4_EN_DCB_ENABLED 0x3 62762306a36Sopenharmony_ci struct ieee_ets ets; 62862306a36Sopenharmony_ci u16 maxrate[IEEE_8021QAZ_MAX_TCS]; 62962306a36Sopenharmony_ci enum dcbnl_cndd_states cndd_state[IEEE_8021QAZ_MAX_TCS]; 63062306a36Sopenharmony_ci struct mlx4_en_cee_config cee_config; 63162306a36Sopenharmony_ci u8 dcbx_cap; 63262306a36Sopenharmony_ci#endif 63362306a36Sopenharmony_ci#ifdef CONFIG_RFS_ACCEL 63462306a36Sopenharmony_ci spinlock_t filters_lock; 63562306a36Sopenharmony_ci int last_filter_id; 63662306a36Sopenharmony_ci struct list_head filters; 63762306a36Sopenharmony_ci struct hlist_head filter_hash[1 << MLX4_EN_FILTER_HASH_SHIFT]; 63862306a36Sopenharmony_ci#endif 63962306a36Sopenharmony_ci u64 tunnel_reg_id; 64062306a36Sopenharmony_ci __be16 vxlan_port; 64162306a36Sopenharmony_ci 64262306a36Sopenharmony_ci u32 pflags; 64362306a36Sopenharmony_ci u8 rss_key[MLX4_EN_RSS_KEY_SIZE]; 64462306a36Sopenharmony_ci u8 rss_hash_fn; 64562306a36Sopenharmony_ci unsigned long state; 64662306a36Sopenharmony_ci}; 64762306a36Sopenharmony_ci 64862306a36Sopenharmony_cienum mlx4_en_wol { 64962306a36Sopenharmony_ci MLX4_EN_WOL_MAGIC = (1ULL << 61), 65062306a36Sopenharmony_ci MLX4_EN_WOL_ENABLED = (1ULL << 62), 65162306a36Sopenharmony_ci}; 65262306a36Sopenharmony_ci 65362306a36Sopenharmony_cistruct mlx4_mac_entry { 65462306a36Sopenharmony_ci struct hlist_node hlist; 65562306a36Sopenharmony_ci unsigned char mac[ETH_ALEN + 2]; 65662306a36Sopenharmony_ci u64 reg_id; 65762306a36Sopenharmony_ci struct rcu_head rcu; 65862306a36Sopenharmony_ci}; 65962306a36Sopenharmony_ci 66062306a36Sopenharmony_cistatic inline struct mlx4_cqe *mlx4_en_get_cqe(void *buf, int idx, int cqe_sz) 66162306a36Sopenharmony_ci{ 66262306a36Sopenharmony_ci return buf + idx * cqe_sz; 66362306a36Sopenharmony_ci} 66462306a36Sopenharmony_ci 66562306a36Sopenharmony_ci#define MLX4_EN_WOL_DO_MODIFY (1ULL << 63) 66662306a36Sopenharmony_ci 66762306a36Sopenharmony_civoid mlx4_en_init_ptys2ethtool_map(void); 66862306a36Sopenharmony_civoid mlx4_en_update_loopback_state(struct net_device *dev, 66962306a36Sopenharmony_ci netdev_features_t features); 67062306a36Sopenharmony_ci 67162306a36Sopenharmony_civoid mlx4_en_destroy_netdev(struct net_device *dev); 67262306a36Sopenharmony_ciint mlx4_en_init_netdev(struct mlx4_en_dev *mdev, int port, 67362306a36Sopenharmony_ci struct mlx4_en_port_profile *prof); 67462306a36Sopenharmony_ci 67562306a36Sopenharmony_ciint mlx4_en_start_port(struct net_device *dev); 67662306a36Sopenharmony_civoid mlx4_en_stop_port(struct net_device *dev, int detach); 67762306a36Sopenharmony_ci 67862306a36Sopenharmony_civoid mlx4_en_set_stats_bitmap(struct mlx4_dev *dev, 67962306a36Sopenharmony_ci struct mlx4_en_stats_bitmap *stats_bitmap, 68062306a36Sopenharmony_ci u8 rx_ppp, u8 rx_pause, 68162306a36Sopenharmony_ci u8 tx_ppp, u8 tx_pause); 68262306a36Sopenharmony_ci 68362306a36Sopenharmony_ciint mlx4_en_try_alloc_resources(struct mlx4_en_priv *priv, 68462306a36Sopenharmony_ci struct mlx4_en_priv *tmp, 68562306a36Sopenharmony_ci struct mlx4_en_port_profile *prof, 68662306a36Sopenharmony_ci bool carry_xdp_prog); 68762306a36Sopenharmony_civoid mlx4_en_safe_replace_resources(struct mlx4_en_priv *priv, 68862306a36Sopenharmony_ci struct mlx4_en_priv *tmp); 68962306a36Sopenharmony_ci 69062306a36Sopenharmony_ciint mlx4_en_create_cq(struct mlx4_en_priv *priv, struct mlx4_en_cq **pcq, 69162306a36Sopenharmony_ci int entries, int ring, enum cq_type mode, int node); 69262306a36Sopenharmony_civoid mlx4_en_destroy_cq(struct mlx4_en_priv *priv, struct mlx4_en_cq **pcq); 69362306a36Sopenharmony_ciint mlx4_en_activate_cq(struct mlx4_en_priv *priv, struct mlx4_en_cq *cq, 69462306a36Sopenharmony_ci int cq_idx); 69562306a36Sopenharmony_civoid mlx4_en_deactivate_cq(struct mlx4_en_priv *priv, struct mlx4_en_cq *cq); 69662306a36Sopenharmony_ciint mlx4_en_set_cq_moder(struct mlx4_en_priv *priv, struct mlx4_en_cq *cq); 69762306a36Sopenharmony_civoid mlx4_en_arm_cq(struct mlx4_en_priv *priv, struct mlx4_en_cq *cq); 69862306a36Sopenharmony_ci 69962306a36Sopenharmony_civoid mlx4_en_tx_irq(struct mlx4_cq *mcq); 70062306a36Sopenharmony_ciu16 mlx4_en_select_queue(struct net_device *dev, struct sk_buff *skb, 70162306a36Sopenharmony_ci struct net_device *sb_dev); 70262306a36Sopenharmony_cinetdev_tx_t mlx4_en_xmit(struct sk_buff *skb, struct net_device *dev); 70362306a36Sopenharmony_cinetdev_tx_t mlx4_en_xmit_frame(struct mlx4_en_rx_ring *rx_ring, 70462306a36Sopenharmony_ci struct mlx4_en_rx_alloc *frame, 70562306a36Sopenharmony_ci struct mlx4_en_priv *priv, unsigned int length, 70662306a36Sopenharmony_ci int tx_ind, bool *doorbell_pending); 70762306a36Sopenharmony_civoid mlx4_en_xmit_doorbell(struct mlx4_en_tx_ring *ring); 70862306a36Sopenharmony_cibool mlx4_en_rx_recycle(struct mlx4_en_rx_ring *ring, 70962306a36Sopenharmony_ci struct mlx4_en_rx_alloc *frame); 71062306a36Sopenharmony_ci 71162306a36Sopenharmony_ciint mlx4_en_create_tx_ring(struct mlx4_en_priv *priv, 71262306a36Sopenharmony_ci struct mlx4_en_tx_ring **pring, 71362306a36Sopenharmony_ci u32 size, u16 stride, 71462306a36Sopenharmony_ci int node, int queue_index); 71562306a36Sopenharmony_civoid mlx4_en_destroy_tx_ring(struct mlx4_en_priv *priv, 71662306a36Sopenharmony_ci struct mlx4_en_tx_ring **pring); 71762306a36Sopenharmony_civoid mlx4_en_init_tx_xdp_ring_descs(struct mlx4_en_priv *priv, 71862306a36Sopenharmony_ci struct mlx4_en_tx_ring *ring); 71962306a36Sopenharmony_ciint mlx4_en_activate_tx_ring(struct mlx4_en_priv *priv, 72062306a36Sopenharmony_ci struct mlx4_en_tx_ring *ring, 72162306a36Sopenharmony_ci int cq, int user_prio); 72262306a36Sopenharmony_civoid mlx4_en_deactivate_tx_ring(struct mlx4_en_priv *priv, 72362306a36Sopenharmony_ci struct mlx4_en_tx_ring *ring); 72462306a36Sopenharmony_civoid mlx4_en_set_num_rx_rings(struct mlx4_en_dev *mdev); 72562306a36Sopenharmony_civoid mlx4_en_recover_from_oom(struct mlx4_en_priv *priv); 72662306a36Sopenharmony_ciint mlx4_en_create_rx_ring(struct mlx4_en_priv *priv, 72762306a36Sopenharmony_ci struct mlx4_en_rx_ring **pring, 72862306a36Sopenharmony_ci u32 size, u16 stride, int node, int queue_index); 72962306a36Sopenharmony_civoid mlx4_en_destroy_rx_ring(struct mlx4_en_priv *priv, 73062306a36Sopenharmony_ci struct mlx4_en_rx_ring **pring, 73162306a36Sopenharmony_ci u32 size, u16 stride); 73262306a36Sopenharmony_ciint mlx4_en_activate_rx_rings(struct mlx4_en_priv *priv); 73362306a36Sopenharmony_civoid mlx4_en_deactivate_rx_ring(struct mlx4_en_priv *priv, 73462306a36Sopenharmony_ci struct mlx4_en_rx_ring *ring); 73562306a36Sopenharmony_ciint mlx4_en_process_rx_cq(struct net_device *dev, 73662306a36Sopenharmony_ci struct mlx4_en_cq *cq, 73762306a36Sopenharmony_ci int budget); 73862306a36Sopenharmony_ciint mlx4_en_poll_rx_cq(struct napi_struct *napi, int budget); 73962306a36Sopenharmony_ciint mlx4_en_poll_tx_cq(struct napi_struct *napi, int budget); 74062306a36Sopenharmony_ciint mlx4_en_process_tx_cq(struct net_device *dev, 74162306a36Sopenharmony_ci struct mlx4_en_cq *cq, int napi_budget); 74262306a36Sopenharmony_ciu32 mlx4_en_free_tx_desc(struct mlx4_en_priv *priv, 74362306a36Sopenharmony_ci struct mlx4_en_tx_ring *ring, 74462306a36Sopenharmony_ci int index, u64 timestamp, 74562306a36Sopenharmony_ci int napi_mode); 74662306a36Sopenharmony_ciu32 mlx4_en_recycle_tx_desc(struct mlx4_en_priv *priv, 74762306a36Sopenharmony_ci struct mlx4_en_tx_ring *ring, 74862306a36Sopenharmony_ci int index, u64 timestamp, 74962306a36Sopenharmony_ci int napi_mode); 75062306a36Sopenharmony_civoid mlx4_en_fill_qp_context(struct mlx4_en_priv *priv, int size, int stride, 75162306a36Sopenharmony_ci int is_tx, int rss, int qpn, int cqn, int user_prio, 75262306a36Sopenharmony_ci struct mlx4_qp_context *context); 75362306a36Sopenharmony_civoid mlx4_en_sqp_event(struct mlx4_qp *qp, enum mlx4_event event); 75462306a36Sopenharmony_ciint mlx4_en_change_mcast_lb(struct mlx4_en_priv *priv, struct mlx4_qp *qp, 75562306a36Sopenharmony_ci int loopback); 75662306a36Sopenharmony_civoid mlx4_en_calc_rx_buf(struct net_device *dev); 75762306a36Sopenharmony_ciint mlx4_en_config_rss_steer(struct mlx4_en_priv *priv); 75862306a36Sopenharmony_civoid mlx4_en_release_rss_steer(struct mlx4_en_priv *priv); 75962306a36Sopenharmony_ciint mlx4_en_create_drop_qp(struct mlx4_en_priv *priv); 76062306a36Sopenharmony_civoid mlx4_en_destroy_drop_qp(struct mlx4_en_priv *priv); 76162306a36Sopenharmony_ciint mlx4_en_free_tx_buf(struct net_device *dev, struct mlx4_en_tx_ring *ring); 76262306a36Sopenharmony_civoid mlx4_en_rx_irq(struct mlx4_cq *mcq); 76362306a36Sopenharmony_ci 76462306a36Sopenharmony_ciint mlx4_SET_MCAST_FLTR(struct mlx4_dev *dev, u8 port, u64 mac, u64 clear, u8 mode); 76562306a36Sopenharmony_ciint mlx4_SET_VLAN_FLTR(struct mlx4_dev *dev, struct mlx4_en_priv *priv); 76662306a36Sopenharmony_ci 76762306a36Sopenharmony_civoid mlx4_en_fold_software_stats(struct net_device *dev); 76862306a36Sopenharmony_ciint mlx4_en_DUMP_ETH_STATS(struct mlx4_en_dev *mdev, u8 port, u8 reset); 76962306a36Sopenharmony_ciint mlx4_en_QUERY_PORT(struct mlx4_en_dev *mdev, u8 port); 77062306a36Sopenharmony_ci 77162306a36Sopenharmony_ci#ifdef CONFIG_MLX4_EN_DCB 77262306a36Sopenharmony_ciextern const struct dcbnl_rtnl_ops mlx4_en_dcbnl_ops; 77362306a36Sopenharmony_ciextern const struct dcbnl_rtnl_ops mlx4_en_dcbnl_pfc_ops; 77462306a36Sopenharmony_ci#endif 77562306a36Sopenharmony_ci 77662306a36Sopenharmony_ciint mlx4_en_setup_tc(struct net_device *dev, u8 up); 77762306a36Sopenharmony_ciint mlx4_en_alloc_tx_queue_per_tc(struct net_device *dev, u8 tc); 77862306a36Sopenharmony_ci 77962306a36Sopenharmony_ci#ifdef CONFIG_RFS_ACCEL 78062306a36Sopenharmony_civoid mlx4_en_cleanup_filters(struct mlx4_en_priv *priv); 78162306a36Sopenharmony_ci#endif 78262306a36Sopenharmony_ci 78362306a36Sopenharmony_ci#define MLX4_EN_NUM_SELF_TEST 5 78462306a36Sopenharmony_civoid mlx4_en_ex_selftest(struct net_device *dev, u32 *flags, u64 *buf); 78562306a36Sopenharmony_civoid mlx4_en_ptp_overflow_check(struct mlx4_en_dev *mdev); 78662306a36Sopenharmony_ci 78762306a36Sopenharmony_ci#define DEV_FEATURE_CHANGED(dev, new_features, feature) \ 78862306a36Sopenharmony_ci ((dev->features & feature) ^ (new_features & feature)) 78962306a36Sopenharmony_ci 79062306a36Sopenharmony_ciint mlx4_en_moderation_update(struct mlx4_en_priv *priv); 79162306a36Sopenharmony_ciint mlx4_en_reset_config(struct net_device *dev, 79262306a36Sopenharmony_ci struct hwtstamp_config ts_config, 79362306a36Sopenharmony_ci netdev_features_t new_features); 79462306a36Sopenharmony_civoid mlx4_en_update_pfc_stats_bitmap(struct mlx4_dev *dev, 79562306a36Sopenharmony_ci struct mlx4_en_stats_bitmap *stats_bitmap, 79662306a36Sopenharmony_ci u8 rx_ppp, u8 rx_pause, 79762306a36Sopenharmony_ci u8 tx_ppp, u8 tx_pause); 79862306a36Sopenharmony_ciint mlx4_en_netdev_event(struct notifier_block *this, 79962306a36Sopenharmony_ci unsigned long event, void *ptr); 80062306a36Sopenharmony_ci 80162306a36Sopenharmony_cistruct xdp_md; 80262306a36Sopenharmony_ciint mlx4_en_xdp_rx_timestamp(const struct xdp_md *ctx, u64 *timestamp); 80362306a36Sopenharmony_ciint mlx4_en_xdp_rx_hash(const struct xdp_md *ctx, u32 *hash, 80462306a36Sopenharmony_ci enum xdp_rss_hash_type *rss_type); 80562306a36Sopenharmony_ci 80662306a36Sopenharmony_ci/* 80762306a36Sopenharmony_ci * Functions for time stamping 80862306a36Sopenharmony_ci */ 80962306a36Sopenharmony_ciu64 mlx4_en_get_cqe_ts(struct mlx4_cqe *cqe); 81062306a36Sopenharmony_ciu64 mlx4_en_get_hwtstamp(struct mlx4_en_dev *mdev, u64 timestamp); 81162306a36Sopenharmony_civoid mlx4_en_fill_hwtstamps(struct mlx4_en_dev *mdev, 81262306a36Sopenharmony_ci struct skb_shared_hwtstamps *hwts, 81362306a36Sopenharmony_ci u64 timestamp); 81462306a36Sopenharmony_civoid mlx4_en_init_timestamp(struct mlx4_en_dev *mdev); 81562306a36Sopenharmony_civoid mlx4_en_remove_timestamp(struct mlx4_en_dev *mdev); 81662306a36Sopenharmony_ci 81762306a36Sopenharmony_ci/* Globals 81862306a36Sopenharmony_ci */ 81962306a36Sopenharmony_ciextern const struct ethtool_ops mlx4_en_ethtool_ops; 82062306a36Sopenharmony_ci 82162306a36Sopenharmony_ci 82262306a36Sopenharmony_ci 82362306a36Sopenharmony_ci/* 82462306a36Sopenharmony_ci * printk / logging functions 82562306a36Sopenharmony_ci */ 82662306a36Sopenharmony_ci 82762306a36Sopenharmony_ci__printf(3, 4) 82862306a36Sopenharmony_civoid en_print(const char *level, const struct mlx4_en_priv *priv, 82962306a36Sopenharmony_ci const char *format, ...); 83062306a36Sopenharmony_ci 83162306a36Sopenharmony_ci#define en_dbg(mlevel, priv, format, ...) \ 83262306a36Sopenharmony_cido { \ 83362306a36Sopenharmony_ci if (NETIF_MSG_##mlevel & (priv)->msg_enable) \ 83462306a36Sopenharmony_ci en_print(KERN_DEBUG, priv, format, ##__VA_ARGS__); \ 83562306a36Sopenharmony_ci} while (0) 83662306a36Sopenharmony_ci#define en_warn(priv, format, ...) \ 83762306a36Sopenharmony_ci en_print(KERN_WARNING, priv, format, ##__VA_ARGS__) 83862306a36Sopenharmony_ci#define en_err(priv, format, ...) \ 83962306a36Sopenharmony_ci en_print(KERN_ERR, priv, format, ##__VA_ARGS__) 84062306a36Sopenharmony_ci#define en_info(priv, format, ...) \ 84162306a36Sopenharmony_ci en_print(KERN_INFO, priv, format, ##__VA_ARGS__) 84262306a36Sopenharmony_ci 84362306a36Sopenharmony_ci#define mlx4_err(mdev, format, ...) \ 84462306a36Sopenharmony_ci pr_err(DRV_NAME " %s: " format, \ 84562306a36Sopenharmony_ci dev_name(&(mdev)->pdev->dev), ##__VA_ARGS__) 84662306a36Sopenharmony_ci#define mlx4_info(mdev, format, ...) \ 84762306a36Sopenharmony_ci pr_info(DRV_NAME " %s: " format, \ 84862306a36Sopenharmony_ci dev_name(&(mdev)->pdev->dev), ##__VA_ARGS__) 84962306a36Sopenharmony_ci#define mlx4_warn(mdev, format, ...) \ 85062306a36Sopenharmony_ci pr_warn(DRV_NAME " %s: " format, \ 85162306a36Sopenharmony_ci dev_name(&(mdev)->pdev->dev), ##__VA_ARGS__) 85262306a36Sopenharmony_ci 85362306a36Sopenharmony_ci#endif 854