Skip to content

Commit

Permalink
net/funeth: probing and netdev ops
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Dimitris Michailidis authored and David S. Miller committed Feb 27, 2022
1 parent e1ffcc6 commit ee6373d
Show file tree
Hide file tree
Showing 2 changed files with 2,262 additions and 0 deletions.
171 changes: 171 additions & 0 deletions drivers/net/ethernet/fungible/funeth/funeth.h
Original file line number Diff line number Diff line change
@@ -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 */
Loading

0 comments on commit ee6373d

Please sign in to comment.