172 lines · c
1/* SPDX-License-Identifier: (GPL-2.0-only OR BSD-3-Clause) */2 3#ifndef _FUNETH_H4#define _FUNETH_H5 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_12815#define ADMIN_CQE_SIZE SZ_6416#define ADMIN_RSP_MAX_LEN (ADMIN_CQE_SIZE - sizeof(struct fun_cqe_info))17 18#define FUN_MAX_MTU 902419 20#define SQ_DEPTH 512U21#define CQ_DEPTH 1024U22#define RQ_DEPTH (512U / (PAGE_SIZE / 4096))23 24#define CQ_INTCOAL_USEC 1025#define CQ_INTCOAL_NPKT 1626#define SQ_INTCOAL_USEC 1027#define SQ_INTCOAL_NPKT 1628 29#define INVALID_LPORT 0xffff30 31#define FUN_PORT_CAP_PAUSE_MASK (FUN_PORT_CAP_TX_PAUSE | FUN_PORT_CAP_RX_PAUSE)32 33struct 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 */44struct 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 60static inline struct fun_ethdev *to_fun_ethdev(struct fun_dev *p)61{62 return container_of(p, struct fun_ethdev, fdev);63}64 65struct 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. */82struct 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 158void fun_set_ethtool_ops(struct net_device *netdev);159int fun_port_write_cmd(struct funeth_priv *fp, int key, u64 data);160int fun_port_read_cmd(struct funeth_priv *fp, int key, u64 *data);161int fun_create_and_bind_tx(struct funeth_priv *fp, u32 sqid);162int fun_replace_queues(struct net_device *dev, struct fun_qset *newqs,163 struct netlink_ext_ack *extack);164int fun_change_num_queues(struct net_device *dev, unsigned int ntx,165 unsigned int nrx);166void fun_set_ring_count(struct net_device *netdev, unsigned int ntx,167 unsigned int nrx);168int fun_config_rss(struct net_device *dev, int algo, const u8 *key,169 const u32 *qtable, u8 op);170 171#endif /* _FUNETH_H */172