net/funeth: probing and netdev ops
This is the first part of the Fungible ethernet driver. It deals with device probing, net_device creation, and netdev ops. Signed-off-by: Dimitris Michailidis <dmichail@fungible.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
e1ffcc6681
commit
ee6373ddf3
2 changed files with 2262 additions and 0 deletions
171
drivers/net/ethernet/fungible/funeth/funeth.h
Normal file
171
drivers/net/ethernet/fungible/funeth/funeth.h
Normal file
|
@ -0,0 +1,171 @@
|
|||
/* SPDX-License-Identifier: (GPL-2.0-only OR BSD-3-Clause) */
|
||||
|
||||
#ifndef _FUNETH_H
|
||||
#define _FUNETH_H
|
||||
|
||||
#include <uapi/linux/if_ether.h>
|
||||
#include <uapi/linux/net_tstamp.h>
|
||||
#include <linux/mutex.h>
|
||||
#include <linux/seqlock.h>
|
||||
#include <linux/xarray.h>
|
||||
#include <net/devlink.h>
|
||||
#include "fun_dev.h"
|
||||
|
||||
#define ADMIN_SQE_SIZE SZ_128
|
||||
#define ADMIN_CQE_SIZE SZ_64
|
||||
#define ADMIN_RSP_MAX_LEN (ADMIN_CQE_SIZE - sizeof(struct fun_cqe_info))
|
||||
|
||||
#define FUN_MAX_MTU 9024
|
||||
|
||||
#define SQ_DEPTH 512U
|
||||
#define CQ_DEPTH 1024U
|
||||
#define RQ_DEPTH (512U / (PAGE_SIZE / 4096))
|
||||
|
||||
#define CQ_INTCOAL_USEC 10
|
||||
#define CQ_INTCOAL_NPKT 16
|
||||
#define SQ_INTCOAL_USEC 10
|
||||
#define SQ_INTCOAL_NPKT 16
|
||||
|
||||
#define INVALID_LPORT 0xffff
|
||||
|
||||
#define FUN_PORT_CAP_PAUSE_MASK (FUN_PORT_CAP_TX_PAUSE | FUN_PORT_CAP_RX_PAUSE)
|
||||
|
||||
struct fun_vport_info {
|
||||
u8 mac[ETH_ALEN];
|
||||
u16 vlan;
|
||||
__be16 vlan_proto;
|
||||
u8 qos;
|
||||
u8 spoofchk:1;
|
||||
u8 trusted:1;
|
||||
unsigned int max_rate;
|
||||
};
|
||||
|
||||
/* "subclass" of fun_dev for Ethernet functions */
|
||||
struct fun_ethdev {
|
||||
struct fun_dev fdev;
|
||||
|
||||
/* the function's network ports */
|
||||
struct net_device **netdevs;
|
||||
unsigned int num_ports;
|
||||
|
||||
/* configuration for the function's virtual ports */
|
||||
unsigned int num_vports;
|
||||
struct fun_vport_info *vport_info;
|
||||
|
||||
struct mutex state_mutex; /* nests inside RTNL if both taken */
|
||||
|
||||
unsigned int nsqs_per_port;
|
||||
};
|
||||
|
||||
static inline struct fun_ethdev *to_fun_ethdev(struct fun_dev *p)
|
||||
{
|
||||
return container_of(p, struct fun_ethdev, fdev);
|
||||
}
|
||||
|
||||
struct fun_qset {
|
||||
struct funeth_rxq **rxqs;
|
||||
struct funeth_txq **txqs;
|
||||
struct funeth_txq **xdpqs;
|
||||
unsigned int nrxqs;
|
||||
unsigned int ntxqs;
|
||||
unsigned int nxdpqs;
|
||||
unsigned int rxq_start;
|
||||
unsigned int txq_start;
|
||||
unsigned int xdpq_start;
|
||||
unsigned int cq_depth;
|
||||
unsigned int rq_depth;
|
||||
unsigned int sq_depth;
|
||||
int state;
|
||||
};
|
||||
|
||||
/* Per netdevice driver state, i.e., netdev_priv. */
|
||||
struct funeth_priv {
|
||||
struct fun_dev *fdev;
|
||||
struct pci_dev *pdev;
|
||||
struct net_device *netdev;
|
||||
|
||||
struct funeth_rxq * __rcu *rxqs;
|
||||
struct funeth_txq **txqs;
|
||||
struct funeth_txq * __rcu *xdpqs;
|
||||
|
||||
struct xarray irqs;
|
||||
unsigned int num_tx_irqs;
|
||||
unsigned int num_rx_irqs;
|
||||
unsigned int rx_irq_ofst;
|
||||
|
||||
unsigned int lane_attrs;
|
||||
u16 lport;
|
||||
|
||||
/* link settings */
|
||||
u64 port_caps;
|
||||
u64 advertising;
|
||||
u64 lp_advertising;
|
||||
unsigned int link_speed;
|
||||
u8 xcvr_type;
|
||||
u8 active_fc;
|
||||
u8 active_fec;
|
||||
u8 link_down_reason;
|
||||
seqcount_t link_seq;
|
||||
|
||||
u32 msg_enable;
|
||||
|
||||
unsigned int num_xdpqs;
|
||||
|
||||
/* ethtool, etc. config parameters */
|
||||
unsigned int sq_depth;
|
||||
unsigned int rq_depth;
|
||||
unsigned int cq_depth;
|
||||
unsigned int cq_irq_db;
|
||||
u8 tx_coal_usec;
|
||||
u8 tx_coal_count;
|
||||
u8 rx_coal_usec;
|
||||
u8 rx_coal_count;
|
||||
|
||||
struct hwtstamp_config hwtstamp_cfg;
|
||||
|
||||
/* cumulative queue stats from earlier queue instances */
|
||||
u64 tx_packets;
|
||||
u64 tx_bytes;
|
||||
u64 tx_dropped;
|
||||
u64 rx_packets;
|
||||
u64 rx_bytes;
|
||||
u64 rx_dropped;
|
||||
|
||||
/* RSS */
|
||||
unsigned int rss_hw_id;
|
||||
enum fun_eth_hash_alg hash_algo;
|
||||
u8 rss_key[FUN_ETH_RSS_MAX_KEY_SIZE];
|
||||
unsigned int indir_table_nentries;
|
||||
u32 indir_table[FUN_ETH_RSS_MAX_INDIR_ENT];
|
||||
dma_addr_t rss_dma_addr;
|
||||
void *rss_cfg;
|
||||
|
||||
/* DMA area for port stats */
|
||||
dma_addr_t stats_dma_addr;
|
||||
__be64 *stats;
|
||||
|
||||
struct bpf_prog *xdp_prog;
|
||||
|
||||
struct devlink_port dl_port;
|
||||
|
||||
/* kTLS state */
|
||||
unsigned int ktls_id;
|
||||
atomic64_t tx_tls_add;
|
||||
atomic64_t tx_tls_del;
|
||||
atomic64_t tx_tls_resync;
|
||||
};
|
||||
|
||||
void fun_set_ethtool_ops(struct net_device *netdev);
|
||||
int fun_port_write_cmd(struct funeth_priv *fp, int key, u64 data);
|
||||
int fun_port_read_cmd(struct funeth_priv *fp, int key, u64 *data);
|
||||
int fun_create_and_bind_tx(struct funeth_priv *fp, u32 sqid);
|
||||
int fun_replace_queues(struct net_device *dev, struct fun_qset *newqs,
|
||||
struct netlink_ext_ack *extack);
|
||||
int fun_change_num_queues(struct net_device *dev, unsigned int ntx,
|
||||
unsigned int nrx);
|
||||
void fun_set_ring_count(struct net_device *netdev, unsigned int ntx,
|
||||
unsigned int nrx);
|
||||
int fun_config_rss(struct net_device *dev, int algo, const u8 *key,
|
||||
const u32 *qtable, u8 op);
|
||||
|
||||
#endif /* _FUNETH_H */
|
2091
drivers/net/ethernet/fungible/funeth/funeth_main.c
Normal file
2091
drivers/net/ethernet/fungible/funeth/funeth_main.c
Normal file
File diff suppressed because it is too large
Load diff
Loading…
Add table
Reference in a new issue