linux/drivers/net/ethernet/netronome/nfp/nfp_net_repr.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) */
   2/* Copyright (C) 2017-2018 Netronome Systems, Inc. */
   3
   4#ifndef NFP_NET_REPR_H
   5#define NFP_NET_REPR_H
   6
   7struct metadata_dst;
   8struct nfp_app;
   9struct nfp_net;
  10struct nfp_port;
  11
  12#include <net/dst_metadata.h>
  13
  14/**
  15 * struct nfp_reprs - container for representor netdevs
  16 * @num_reprs:  Number of elements in reprs array
  17 * @reprs:      Array of representor netdevs
  18 */
  19struct nfp_reprs {
  20        unsigned int num_reprs;
  21        struct net_device __rcu *reprs[];
  22};
  23
  24/**
  25 * struct nfp_repr_pcpu_stats
  26 * @rx_packets: Received packets
  27 * @rx_bytes:   Received bytes
  28 * @tx_packets: Transmitted packets
  29 * @tx_bytes:   Transmitted dropped
  30 * @tx_drops:   Packets dropped on transmit
  31 * @syncp:      Reference count
  32 */
  33struct nfp_repr_pcpu_stats {
  34        u64 rx_packets;
  35        u64 rx_bytes;
  36        u64 tx_packets;
  37        u64 tx_bytes;
  38        u64 tx_drops;
  39        struct u64_stats_sync syncp;
  40};
  41
  42/**
  43 * struct nfp_repr - priv data for representor netdevs
  44 * @netdev:     Back pointer to netdev
  45 * @dst:        Destination for packet TX
  46 * @port:       Port of representor
  47 * @app:        APP handle
  48 * @stats:      Statistic of packets hitting CPU
  49 * @app_priv:   Pointer for APP data
  50 */
  51struct nfp_repr {
  52        struct net_device *netdev;
  53        struct metadata_dst *dst;
  54        struct nfp_port *port;
  55        struct nfp_app *app;
  56        struct nfp_repr_pcpu_stats __percpu *stats;
  57        void *app_priv;
  58};
  59
  60/**
  61 * enum nfp_repr_type - type of representor
  62 * @NFP_REPR_TYPE_PHYS_PORT:    external NIC port
  63 * @NFP_REPR_TYPE_PF:           physical function
  64 * @NFP_REPR_TYPE_VF:           virtual function
  65 * @__NFP_REPR_TYPE_MAX:        number of representor types
  66 */
  67enum nfp_repr_type {
  68        NFP_REPR_TYPE_PHYS_PORT,
  69        NFP_REPR_TYPE_PF,
  70        NFP_REPR_TYPE_VF,
  71
  72        __NFP_REPR_TYPE_MAX,
  73};
  74#define NFP_REPR_TYPE_MAX (__NFP_REPR_TYPE_MAX - 1)
  75
  76extern const struct net_device_ops nfp_repr_netdev_ops;
  77
  78static inline bool nfp_netdev_is_nfp_repr(struct net_device *netdev)
  79{
  80        return netdev->netdev_ops == &nfp_repr_netdev_ops;
  81}
  82
  83static inline int nfp_repr_get_port_id(struct net_device *netdev)
  84{
  85        struct nfp_repr *priv = netdev_priv(netdev);
  86
  87        return priv->dst->u.port_info.port_id;
  88}
  89
  90struct net_device *
  91nfp_repr_get_locked(struct nfp_app *app, struct nfp_reprs *set,
  92                    unsigned int id);
  93
  94void nfp_repr_inc_rx_stats(struct net_device *netdev, unsigned int len);
  95void
  96nfp_repr_transfer_features(struct net_device *netdev, struct net_device *lower);
  97int nfp_repr_init(struct nfp_app *app, struct net_device *netdev,
  98                  u32 cmsg_port_id, struct nfp_port *port,
  99                  struct net_device *pf_netdev);
 100void nfp_repr_free(struct net_device *netdev);
 101struct net_device *
 102nfp_repr_alloc_mqs(struct nfp_app *app, unsigned int txqs, unsigned int rxqs);
 103void nfp_repr_clean_and_free(struct nfp_repr *repr);
 104void nfp_reprs_clean_and_free(struct nfp_app *app, struct nfp_reprs *reprs);
 105void nfp_reprs_clean_and_free_by_type(struct nfp_app *app,
 106                                      enum nfp_repr_type type);
 107struct nfp_reprs *nfp_reprs_alloc(unsigned int num_reprs);
 108int nfp_reprs_resync_phys_ports(struct nfp_app *app);
 109
 110static inline struct net_device *nfp_repr_alloc(struct nfp_app *app)
 111{
 112        return nfp_repr_alloc_mqs(app, 1, 1);
 113}
 114#endif /* NFP_NET_REPR_H */
 115