tenxpress.o txc43128_phy.o falcon_boards.o \
                           mcdi.o mcdi_port.o mcdi_mon.o ptp.o
 sfc-$(CONFIG_SFC_MTD)  += mtd.o
-sfc-$(CONFIG_SFC_SRIOV)        += sriov.o siena_sriov.o
+sfc-$(CONFIG_SFC_SRIOV)        += sriov.o siena_sriov.o ef10_sriov.o
 
 obj-$(CONFIG_SFC)      += sfc.o
 
        .ptp_set_ts_sync_events = efx_ef10_ptp_set_ts_sync_events,
        .ptp_set_ts_config = efx_ef10_ptp_set_ts_config,
 #ifdef CONFIG_SFC_SRIOV
+       .sriov_configure = efx_ef10_sriov_configure,
        .sriov_init = efx_ef10_sriov_init,
        .sriov_fini = efx_ef10_sriov_fini,
        .sriov_mac_address_changed = efx_ef10_sriov_mac_address_changed,
 
--- /dev/null
+/****************************************************************************
+ * Driver for Solarflare network controllers and boards
+ * Copyright 2015 Solarflare Communications Inc.
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 as published
+ * by the Free Software Foundation, incorporated herein by reference.
+ */
+#include <linux/pci.h>
+#include <linux/module.h>
+#include "net_driver.h"
+#include "ef10_sriov.h"
+#include "efx.h"
+#include "nic.h"
+#include "mcdi_pcol.h"
+
+static int efx_ef10_pci_sriov_enable(struct efx_nic *efx, int num_vfs)
+{
+       int rc = 0;
+       struct pci_dev *dev = efx->pci_dev;
+
+       efx->vf_count = num_vfs;
+       rc = pci_enable_sriov(dev, num_vfs);
+       if (rc) {
+               efx->vf_count = 0;
+               netif_err(efx, probe, efx->net_dev,
+                         "Failed to enable SRIOV VFs\n");
+       }
+       return rc;
+}
+
+static int efx_ef10_pci_sriov_disable(struct efx_nic *efx)
+{
+       struct pci_dev *dev = efx->pci_dev;
+
+       efx->vf_count = 0;
+       pci_disable_sriov(dev);
+       return 0;
+}
+
+int efx_ef10_sriov_configure(struct efx_nic *efx, int num_vfs)
+{
+       if (num_vfs == 0)
+               return efx_ef10_pci_sriov_disable(efx);
+       else
+               return efx_ef10_pci_sriov_enable(efx, num_vfs);
+}
 
        return false;
 }
 
+int efx_ef10_sriov_configure(struct efx_nic *efx, int num_vfs);
+
 static inline int efx_ef10_sriov_init(struct efx_nic *efx)
 {
        return -EOPNOTSUPP;
 
        return rc;
 }
 
+/* efx_pci_sriov_configure returns the actual number of Virtual Functions
+ * enabled on success
+ */
+#ifdef CONFIG_SFC_SRIOV
+static int efx_pci_sriov_configure(struct pci_dev *dev, int num_vfs)
+{
+       int rc;
+       struct efx_nic *efx = pci_get_drvdata(dev);
+
+       if (efx->type->sriov_configure) {
+               rc = efx->type->sriov_configure(efx, num_vfs);
+               if (rc)
+                       return rc;
+               else
+                       return num_vfs;
+       } else
+               return -EOPNOTSUPP;
+}
+#endif
+
 static int efx_pm_freeze(struct device *dev)
 {
        struct efx_nic *efx = pci_get_drvdata(to_pci_dev(dev));
        .remove         = efx_pci_remove,
        .driver.pm      = &efx_pm_ops,
        .err_handler    = &efx_err_handlers,
+#ifdef CONFIG_SFC_SRIOV
+       .sriov_configure = efx_pci_sriov_configure,
+#endif
 };
 
 /**************************************************************************
 
        int (*ptp_set_ts_sync_events)(struct efx_nic *efx, bool en, bool temp);
        int (*ptp_set_ts_config)(struct efx_nic *efx,
                                 struct hwtstamp_config *init);
+       int (*sriov_configure)(struct efx_nic *efx, int num_vfs);
        int (*sriov_init)(struct efx_nic *efx);
        void (*sriov_fini)(struct efx_nic *efx);
        void (*sriov_mac_address_changed)(struct efx_nic *efx);
 
        .ptp_write_host_time = siena_ptp_write_host_time,
        .ptp_set_ts_config = siena_ptp_set_ts_config,
 #ifdef CONFIG_SFC_SRIOV
+       .sriov_configure = efx_siena_sriov_configure,
        .sriov_init = efx_siena_sriov_init,
        .sriov_fini = efx_siena_sriov_fini,
        .sriov_mac_address_changed = efx_siena_sriov_mac_address_changed,
 
 {
        return efx->vf_count != 0;
 }
+
+int efx_siena_sriov_configure(struct efx_nic *efx, int num_vfs)
+{
+       return 0;
+}
 
        ((EFX_MAX_VF_EVQ_SIZE + 2 * EFX_MAX_DMAQ_SIZE) *        \
         sizeof(efx_qword_t) / EFX_BUF_SIZE)
 
+int efx_siena_sriov_configure(struct efx_nic *efx, int num_vfs);
 int efx_siena_sriov_init(struct efx_nic *efx);
 void efx_siena_sriov_fini(struct efx_nic *efx);
 void efx_siena_sriov_mac_address_changed(struct efx_nic *efx);