1 /* 2 * Copyright (C) 2017 Netronome Systems, Inc. 3 * 4 * This software is dual licensed under the GNU General License Version 2, 5 * June 1991 as shown in the file COPYING in the top-level directory of this 6 * source tree or the BSD 2-Clause License provided below. You have the 7 * option to license this software under the complete terms of either license. 8 * 9 * The BSD 2-Clause License: 10 * 11 * Redistribution and use in source and binary forms, with or 12 * without modification, are permitted provided that the following 13 * conditions are met: 14 * 15 * 1. Redistributions of source code must retain the above 16 * copyright notice, this list of conditions and the following 17 * disclaimer. 18 * 19 * 2. Redistributions in binary form must reproduce the above 20 * copyright notice, this list of conditions and the following 21 * disclaimer in the documentation and/or other materials 22 * provided with the distribution. 23 * 24 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 25 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 26 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 27 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS 28 * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN 29 * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 30 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 31 * SOFTWARE. 32 */ 33 34 #ifndef NFP_NET_REPR_H 35 #define NFP_NET_REPR_H 36 37 struct metadata_dst; 38 struct nfp_app; 39 struct nfp_net; 40 struct nfp_port; 41 42 #include <net/dst_metadata.h> 43 44 /** 45 * struct nfp_reprs - container for representor netdevs 46 * @num_reprs: Number of elements in reprs array 47 * @reprs: Array of representor netdevs 48 */ 49 struct nfp_reprs { 50 unsigned int num_reprs; 51 struct net_device __rcu *reprs[0]; 52 }; 53 54 /** 55 * struct nfp_repr_pcpu_stats 56 * @rx_packets: Received packets 57 * @rx_bytes: Received bytes 58 * @tx_packets: Transmitted packets 59 * @tx_bytes: Transmitted dropped 60 * @tx_drops: Packets dropped on transmit 61 * @syncp: Reference count 62 */ 63 struct nfp_repr_pcpu_stats { 64 u64 rx_packets; 65 u64 rx_bytes; 66 u64 tx_packets; 67 u64 tx_bytes; 68 u64 tx_drops; 69 struct u64_stats_sync syncp; 70 }; 71 72 /** 73 * struct nfp_repr - priv data for representor netdevs 74 * @netdev: Back pointer to netdev 75 * @dst: Destination for packet TX 76 * @port: Port of representor 77 * @app: APP handle 78 * @stats: Statistic of packets hitting CPU 79 * @app_priv: Pointer for APP data 80 */ 81 struct nfp_repr { 82 struct net_device *netdev; 83 struct metadata_dst *dst; 84 struct nfp_port *port; 85 struct nfp_app *app; 86 struct nfp_repr_pcpu_stats __percpu *stats; 87 void *app_priv; 88 }; 89 90 /** 91 * enum nfp_repr_type - type of representor 92 * @NFP_REPR_TYPE_PHYS_PORT: external NIC port 93 * @NFP_REPR_TYPE_PF: physical function 94 * @NFP_REPR_TYPE_VF: virtual function 95 * @__NFP_REPR_TYPE_MAX: number of representor types 96 */ 97 enum nfp_repr_type { 98 NFP_REPR_TYPE_PHYS_PORT, 99 NFP_REPR_TYPE_PF, 100 NFP_REPR_TYPE_VF, 101 102 __NFP_REPR_TYPE_MAX, 103 }; 104 #define NFP_REPR_TYPE_MAX (__NFP_REPR_TYPE_MAX - 1) 105 106 extern const struct net_device_ops nfp_repr_netdev_ops; 107 108 static inline bool nfp_netdev_is_nfp_repr(struct net_device *netdev) 109 { 110 return netdev->netdev_ops == &nfp_repr_netdev_ops; 111 } 112 113 static inline int nfp_repr_get_port_id(struct net_device *netdev) 114 { 115 struct nfp_repr *priv = netdev_priv(netdev); 116 117 return priv->dst->u.port_info.port_id; 118 } 119 120 struct net_device * 121 nfp_repr_get_locked(struct nfp_app *app, struct nfp_reprs *set, 122 unsigned int id); 123 124 void nfp_repr_inc_rx_stats(struct net_device *netdev, unsigned int len); 125 int nfp_repr_init(struct nfp_app *app, struct net_device *netdev, 126 u32 cmsg_port_id, struct nfp_port *port, 127 struct net_device *pf_netdev); 128 void nfp_repr_free(struct net_device *netdev); 129 struct net_device * 130 nfp_repr_alloc_mqs(struct nfp_app *app, unsigned int txqs, unsigned int rxqs); 131 void nfp_repr_clean_and_free(struct nfp_repr *repr); 132 void nfp_reprs_clean_and_free(struct nfp_app *app, struct nfp_reprs *reprs); 133 void nfp_reprs_clean_and_free_by_type(struct nfp_app *app, 134 enum nfp_repr_type type); 135 struct nfp_reprs *nfp_reprs_alloc(unsigned int num_reprs); 136 int nfp_reprs_resync_phys_ports(struct nfp_app *app); 137 138 static inline struct net_device *nfp_repr_alloc(struct nfp_app *app) 139 { 140 return nfp_repr_alloc_mqs(app, 1, 1); 141 } 142 #endif /* NFP_NET_REPR_H */ 143