1 /* SPDX-License-Identifier: (GPL-2.0-only OR BSD-3-Clause) */ 2 3 #ifndef _FUNETH_H 4 #define _FUNETH_H 5 6 #include <uapi/linux/if_ether.h> 7 #include <uapi/linux/net_tstamp.h> 8 #include <linux/mutex.h> 9 #include <linux/seqlock.h> 10 #include <linux/xarray.h> 11 #include <net/devlink.h> 12 #include "fun_dev.h" 13 14 #define ADMIN_SQE_SIZE SZ_128 15 #define ADMIN_CQE_SIZE SZ_64 16 #define ADMIN_RSP_MAX_LEN (ADMIN_CQE_SIZE - sizeof(struct fun_cqe_info)) 17 18 #define FUN_MAX_MTU 9024 19 20 #define SQ_DEPTH 512U 21 #define CQ_DEPTH 1024U 22 #define RQ_DEPTH (512U / (PAGE_SIZE / 4096)) 23 24 #define CQ_INTCOAL_USEC 10 25 #define CQ_INTCOAL_NPKT 16 26 #define SQ_INTCOAL_USEC 10 27 #define SQ_INTCOAL_NPKT 16 28 29 #define INVALID_LPORT 0xffff 30 31 #define FUN_PORT_CAP_PAUSE_MASK (FUN_PORT_CAP_TX_PAUSE | FUN_PORT_CAP_RX_PAUSE) 32 33 struct fun_vport_info { 34 u8 mac[ETH_ALEN]; 35 u16 vlan; 36 __be16 vlan_proto; 37 u8 qos; 38 u8 spoofchk:1; 39 u8 trusted:1; 40 unsigned int max_rate; 41 }; 42 43 /* "subclass" of fun_dev for Ethernet functions */ 44 struct fun_ethdev { 45 struct fun_dev fdev; 46 47 /* the function's network ports */ 48 struct net_device **netdevs; 49 unsigned int num_ports; 50 51 /* configuration for the function's virtual ports */ 52 unsigned int num_vports; 53 struct fun_vport_info *vport_info; 54 55 struct mutex state_mutex; /* nests inside RTNL if both taken */ 56 57 unsigned int nsqs_per_port; 58 }; 59 60 static inline struct fun_ethdev *to_fun_ethdev(struct fun_dev *p) 61 { 62 return container_of(p, struct fun_ethdev, fdev); 63 } 64 65 struct fun_qset { 66 struct funeth_rxq **rxqs; 67 struct funeth_txq **txqs; 68 struct funeth_txq **xdpqs; 69 unsigned int nrxqs; 70 unsigned int ntxqs; 71 unsigned int nxdpqs; 72 unsigned int rxq_start; 73 unsigned int txq_start; 74 unsigned int xdpq_start; 75 unsigned int cq_depth; 76 unsigned int rq_depth; 77 unsigned int sq_depth; 78 int state; 79 }; 80 81 /* Per netdevice driver state, i.e., netdev_priv. */ 82 struct funeth_priv { 83 struct fun_dev *fdev; 84 struct pci_dev *pdev; 85 struct net_device *netdev; 86 87 struct funeth_rxq * __rcu *rxqs; 88 struct funeth_txq **txqs; 89 struct funeth_txq * __rcu *xdpqs; 90 91 struct xarray irqs; 92 unsigned int num_tx_irqs; 93 unsigned int num_rx_irqs; 94 unsigned int rx_irq_ofst; 95 96 unsigned int lane_attrs; 97 u16 lport; 98 99 /* link settings */ 100 u64 port_caps; 101 u64 advertising; 102 u64 lp_advertising; 103 unsigned int link_speed; 104 u8 xcvr_type; 105 u8 active_fc; 106 u8 active_fec; 107 u8 link_down_reason; 108 seqcount_t link_seq; 109 110 u32 msg_enable; 111 112 unsigned int num_xdpqs; 113 114 /* ethtool, etc. config parameters */ 115 unsigned int sq_depth; 116 unsigned int rq_depth; 117 unsigned int cq_depth; 118 unsigned int cq_irq_db; 119 u8 tx_coal_usec; 120 u8 tx_coal_count; 121 u8 rx_coal_usec; 122 u8 rx_coal_count; 123 124 struct hwtstamp_config hwtstamp_cfg; 125 126 /* cumulative queue stats from earlier queue instances */ 127 u64 tx_packets; 128 u64 tx_bytes; 129 u64 tx_dropped; 130 u64 rx_packets; 131 u64 rx_bytes; 132 u64 rx_dropped; 133 134 /* RSS */ 135 unsigned int rss_hw_id; 136 enum fun_eth_hash_alg hash_algo; 137 u8 rss_key[FUN_ETH_RSS_MAX_KEY_SIZE]; 138 unsigned int indir_table_nentries; 139 u32 indir_table[FUN_ETH_RSS_MAX_INDIR_ENT]; 140 dma_addr_t rss_dma_addr; 141 void *rss_cfg; 142 143 /* DMA area for port stats */ 144 dma_addr_t stats_dma_addr; 145 __be64 *stats; 146 147 struct bpf_prog *xdp_prog; 148 149 struct devlink_port dl_port; 150 151 /* kTLS state */ 152 unsigned int ktls_id; 153 atomic64_t tx_tls_add; 154 atomic64_t tx_tls_del; 155 atomic64_t tx_tls_resync; 156 }; 157 158 void fun_set_ethtool_ops(struct net_device *netdev); 159 int fun_port_write_cmd(struct funeth_priv *fp, int key, u64 data); 160 int fun_port_read_cmd(struct funeth_priv *fp, int key, u64 *data); 161 int fun_create_and_bind_tx(struct funeth_priv *fp, u32 sqid); 162 int fun_replace_queues(struct net_device *dev, struct fun_qset *newqs, 163 struct netlink_ext_ack *extack); 164 int fun_change_num_queues(struct net_device *dev, unsigned int ntx, 165 unsigned int nrx); 166 void fun_set_ring_count(struct net_device *netdev, unsigned int ntx, 167 unsigned int nrx); 168 int fun_config_rss(struct net_device *dev, int algo, const u8 *key, 169 const u32 *qtable, u8 op); 170 171 #endif /* _FUNETH_H */ 172