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]);
 
 }
 
 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;
                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;
        }