Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ef0ec676 authored by Jakub Kicinski's avatar Jakub Kicinski Committed by David S. Miller
Browse files

nfp: add pointer to vNIC config memory to nfp_port structure



Simplify the statistics handling code by keeping pointer to vNIC's
config memory in nfp_port.  Note that this is referring to the
representor side of vNICs, vNIC side has the pointer in nfp_net.

Signed-off-by: default avatarJakub Kicinski <jakub.kicinski@netronome.com>
Reviewed-by: default avatarSimon Horman <simon.horman@netronome.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 098ce840
Loading
Loading
Loading
Loading
+7 −1
Original line number Diff line number Diff line
@@ -159,12 +159,18 @@ nfp_flower_spawn_vnic_reprs(struct nfp_app *app,
			goto err_reprs_clean;
		}

		/* For now we only support 1 PF */
		WARN_ON(repr_type == NFP_REPR_TYPE_PF && i);

		port = nfp_port_alloc(app, port_type, reprs->reprs[i]);
		if (repr_type == NFP_REPR_TYPE_PF) {
			port->pf_id = i;
			port->vnic = priv->nn->dp.ctrl_bar;
		} else {
			port->pf_id = 0; /* For now we only support 1 PF */
			port->pf_id = 0;
			port->vf_id = i;
			port->vnic =
				app->pf->vf_cfg_mem + i * NFP_NET_CFG_BAR_SZ;
		}

		eth_hw_addr_random(reprs->reprs[i]);
+9 −36
Original line number Diff line number Diff line
@@ -96,50 +96,25 @@ nfp_repr_phy_port_get_stats64(struct nfp_port *port,
}

static void
nfp_repr_vf_get_stats64(const struct nfp_app *app, u8 vf,
nfp_repr_vnic_get_stats64(struct nfp_port *port,
			  struct rtnl_link_stats64 *stats)
{
	u8 __iomem *mem;

	mem = app->pf->vf_cfg_mem + vf * NFP_NET_CFG_BAR_SZ;

	/* TX and RX stats are flipped as we are returning the stats as seen
	 * at the switch port corresponding to the VF.
	 */
	stats->tx_packets = readq(mem + NFP_NET_CFG_STATS_RX_FRAMES);
	stats->tx_bytes = readq(mem + NFP_NET_CFG_STATS_RX_OCTETS);
	stats->tx_dropped = readq(mem + NFP_NET_CFG_STATS_RX_DISCARDS);
	stats->tx_packets = readq(port->vnic + NFP_NET_CFG_STATS_RX_FRAMES);
	stats->tx_bytes = readq(port->vnic + NFP_NET_CFG_STATS_RX_OCTETS);
	stats->tx_dropped = readq(port->vnic + NFP_NET_CFG_STATS_RX_DISCARDS);

	stats->rx_packets = readq(mem + NFP_NET_CFG_STATS_TX_FRAMES);
	stats->rx_bytes = readq(mem + NFP_NET_CFG_STATS_TX_OCTETS);
	stats->rx_dropped = readq(mem + NFP_NET_CFG_STATS_TX_DISCARDS);
}

static void
nfp_repr_pf_get_stats64(const struct nfp_app *app, u8 pf,
			struct rtnl_link_stats64 *stats)
{
	u8 __iomem *mem;

	if (pf)
		return;

	mem = nfp_cpp_area_iomem(app->pf->data_vnic_bar);

	stats->tx_packets = readq(mem + NFP_NET_CFG_STATS_RX_FRAMES);
	stats->tx_bytes = readq(mem + NFP_NET_CFG_STATS_RX_OCTETS);
	stats->tx_dropped = readq(mem + NFP_NET_CFG_STATS_RX_DISCARDS);

	stats->rx_packets = readq(mem + NFP_NET_CFG_STATS_TX_FRAMES);
	stats->rx_bytes = readq(mem + NFP_NET_CFG_STATS_TX_OCTETS);
	stats->rx_dropped = readq(mem + NFP_NET_CFG_STATS_TX_DISCARDS);
	stats->rx_packets = readq(port->vnic + NFP_NET_CFG_STATS_TX_FRAMES);
	stats->rx_bytes = readq(port->vnic + NFP_NET_CFG_STATS_TX_OCTETS);
	stats->rx_dropped = readq(port->vnic + NFP_NET_CFG_STATS_TX_DISCARDS);
}

static void
nfp_repr_get_stats64(struct net_device *netdev, struct rtnl_link_stats64 *stats)
{
	struct nfp_repr *repr = netdev_priv(netdev);
	struct nfp_app *app = repr->app;

	if (WARN_ON(!repr->port))
		return;
@@ -151,10 +126,8 @@ nfp_repr_get_stats64(struct net_device *netdev, struct rtnl_link_stats64 *stats)
		nfp_repr_phy_port_get_stats64(repr->port, stats);
		break;
	case NFP_PORT_PF_PORT:
		nfp_repr_pf_get_stats64(app, repr->port->pf_id, stats);
		break;
	case NFP_PORT_VF_PORT:
		nfp_repr_vf_get_stats64(app, repr->port->vf_id, stats);
		nfp_repr_vnic_get_stats64(repr->port, stats);
	default:
		break;
	}
+2 −0
Original line number Diff line number Diff line
@@ -79,6 +79,7 @@ enum nfp_port_flags {
 * @eth_stats:	for %NFP_PORT_PHYS_PORT MAC stats if available
 * @pf_id:	for %NFP_PORT_PF_PORT, %NFP_PORT_VF_PORT ID of the PCI PF (0-3)
 * @vf_id:	for %NFP_PORT_VF_PORT ID of the PCI VF within @pf_id
 * @vnic:	for %NFP_PORT_PF_PORT, %NFP_PORT_VF_PORT vNIC ctrl memory
 * @port_list:	entry on pf's list of ports
 */
struct nfp_port {
@@ -102,6 +103,7 @@ struct nfp_port {
		struct {
			unsigned int pf_id;
			unsigned int vf_id;
			u8 __iomem *vnic;
		};
	};