- add pci_sriov_set_totalvfs()
- add
patches/collateral-evolutions/network/82-ethernet/igb_pci_sriov_configure.patch
Thought of backporting struct pci_driver like this:
struct backport_pci_driver {
[...]
};
but that introduces the following.
CC [M] /dev/shm/next/drivers/net/ethernet/intel/igb/igb_main.o
/dev/shm/next/drivers/net/ethernet/intel/igb/igb_main.c: In function
‘igb_init_module’:
/dev/shm/next/drivers/net/ethernet/intel/igb/igb_main.c:698: warning: passing
argument 1 of ‘__pci_register_driver’ from incompatible pointer type
include/linux/pci.h:1002: note: expected ‘struct pci_driver *’ but argument is
of type ‘struct backport_pci_driver *’
/dev/shm/next/drivers/net/ethernet/intel/igb/igb_main.c: In function
‘igb_exit_module’:
/dev/shm/next/drivers/net/ethernet/intel/igb/igb_main.c:715: warning: passing
argument 1 of ‘pci_unregister_driver’ from incompatible pointer type
include/linux/pci.h:1011: note: expected ‘struct pci_driver *’ but argument is
of type ‘struct backport_pci_driver *’
Adding these as well would drag along several pci dependencies and I'm not sure
this is really safe. Opinions?
For now I've just commented out the code.
Signed-off-by: Stefan Assmann <[email protected]>
---
backport/backport-include/linux/pci.h | 5 +++-
backport/compat/compat-3.8.c | 32 ++++++++++++++++++++++
.../82-ethernet/igb_pci_sriov_configure.patch | 14 ++++++++++
3 files changed, 50 insertions(+), 1 deletion(-)
create mode 100644
patches/collateral-evolutions/network/82-ethernet/igb_pci_sriov_configure.patch
diff --git a/backport/backport-include/linux/pci.h
b/backport/backport-include/linux/pci.h
index b56761f..c3360f1 100644
--- a/backport/backport-include/linux/pci.h
+++ b/backport/backport-include/linux/pci.h
@@ -178,6 +178,10 @@ bool pci_pme_capable(struct pci_dev *dev, pci_power_t
state);
.subvendor = (subvend), .subdevice = (subdev)
#endif /* PCI_DEVICE_SUB */
+#if LINUX_VERSION_CODE < KERNEL_VERSION(3,8,0)
+int pci_sriov_set_totalvfs(struct pci_dev *dev, u16 numvfs);
+#endif /* LINUX_VERSION_CODE < KERNEL_VERSION(3,8,0) */
+
#if LINUX_VERSION_CODE < KERNEL_VERSION(3,10,0)
/* Taken from drivers/pci/pci.h */
struct pci_sriov {
@@ -202,5 +206,4 @@ struct pci_sriov {
extern int pci_vfs_assigned(struct pci_dev *dev);
#endif /* LINUX_VERSION_CODE < KERNEL_VERSION(3,10,0) */
-
#endif /* _BACKPORT_LINUX_PCI_H */
diff --git a/backport/compat/compat-3.8.c b/backport/compat/compat-3.8.c
index c6824bf..1404f29 100644
--- a/backport/compat/compat-3.8.c
+++ b/backport/compat/compat-3.8.c
@@ -18,6 +18,8 @@
#include <linux/netdevice.h>
#include <linux/random.h>
#include <linux/of.h>
+#include <linux/pci.h>
+#include <linux/pci_regs.h>
#if (LINUX_VERSION_CODE < KERNEL_VERSION(3,7,8))
void netdev_set_default_ethtool_ops(struct net_device *dev,
@@ -514,3 +516,33 @@ int of_property_read_u8_array(const struct device_node *np,
}
EXPORT_SYMBOL_GPL(of_property_read_u8_array);
#endif /* CONFIG_OF */
+
+/**
+ * pci_sriov_set_totalvfs -- reduce the TotalVFs available
+ * @dev: the PCI PF device
+ * @numvfs: number that should be used for TotalVFs supported
+ *
+ * Should be called from PF driver's probe routine with
+ * device's mutex held.
+ *
+ * Returns 0 if PF is an SRIOV-capable device and
+ * value of numvfs valid. If not a PF return -ENOSYS;
+ * if numvfs is invalid return -EINVAL;
+ * if VFs already enabled, return -EBUSY.
+ */
+int pci_sriov_set_totalvfs(struct pci_dev *dev, u16 numvfs)
+{
+ if (!dev->is_physfn)
+ return -ENOSYS;
+ if (numvfs > dev->sriov->total_VFs)
+ return -EINVAL;
+
+ /* Shouldn't change if VFs already enabled */
+ if (dev->sriov->ctrl & PCI_SRIOV_CTRL_VFE)
+ return -EBUSY;
+ else
+ dev->sriov->driver_max_VFs = numvfs;
+
+ return 0;
+}
+EXPORT_SYMBOL_GPL(pci_sriov_set_totalvfs);
diff --git
a/patches/collateral-evolutions/network/82-ethernet/igb_pci_sriov_configure.patch
b/patches/collateral-evolutions/network/82-ethernet/igb_pci_sriov_configure.patch
new file mode 100644
index 0000000..bd9b3dd
--- /dev/null
+++
b/patches/collateral-evolutions/network/82-ethernet/igb_pci_sriov_configure.patch
@@ -0,0 +1,14 @@
+diff --git a/drivers/net/ethernet/intel/igb/igb_main.c
b/drivers/net/ethernet/intel/igb/igb_main.c
+index f2a5abf..433463d 100644
+--- a/drivers/net/ethernet/intel/igb/igb_main.c
++++ b/drivers/net/ethernet/intel/igb/igb_main.c
+@@ -249,7 +249,9 @@ static struct pci_driver igb_driver = {
+ .driver.pm = &igb_pm_ops,
+ #endif
+ .shutdown = igb_shutdown,
++#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,8,0)
+ .sriov_configure = igb_pci_sriov_configure,
++#endif
+ .err_handler = &igb_err_handler
+ };
+
--
1.8.3.1
--
To unsubscribe from this list: send the line "unsubscribe backports" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html