nfp_net_repr.h (3107B)
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 */