nfp: add pointer to vNIC config memory to nfp_port structure
authorJakub Kicinski <jakub.kicinski@netronome.com>
Fri, 18 Aug 2017 22:48:19 +0000 (15:48 -0700)
committerDavid S. Miller <davem@davemloft.net>
Sat, 19 Aug 2017 05:39:28 +0000 (22:39 -0700)
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: Jakub Kicinski <jakub.kicinski@netronome.com>
Reviewed-by: Simon Horman <simon.horman@netronome.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/netronome/nfp/flower/main.c
drivers/net/ethernet/netronome/nfp/nfp_net_repr.c
drivers/net/ethernet/netronome/nfp/nfp_port.h

index 3088e959f2a3bf09f9cf729b34992b8c75afd978..126a6b5233bfafc6cd34aaf35cf528aaec254124 100644 (file)
@@ -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]);
index 28e932eab8124c24a80e956d06157e20914454b0..0f9878d1bf40ba79e2721c4113aed9469098e998 100644 (file)
@@ -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,
-                       struct rtnl_link_stats64 *stats)
+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;
        }
index de8ec609b57eda2c41397bf3fcff5fbf745fa946..81c0340181339f01058eb917d6a49345250301b2 100644 (file)
@@ -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;
                };
        };