如果一个PCIe设备有SR-IOV的功能,则在PF的probe函数中调用pci_enable_sriov(dev, NR_VIRTFN); 就可以是能VF功能。下面是一个例子:
static int dev_probe(struct pci_dev *dev, const struct pci_device_id *id)
{
pci_enable_sriov(dev, NR_VIRTFN);
…
return 0;
}
static void dev_remove(struct pci_dev *dev)
{
pci_disable_sriov(dev);
…
}
static int dev_suspend(struct pci_dev *dev, pm_message_t state)
{
…
return 0;
}
static int dev_resume(struct pci_dev *dev)
{
…
return 0;
}
static void dev_shutdown(struct pci_dev *dev)
{
…
}
static int dev_sriov_configure(struct pci_dev *dev, int numvfs)
{
if (numvfs > 0) {
…
pci_enable_sriov(dev, numvfs);
…
return numvfs;
}
if (numvfs == 0) {
….
pci_disable_sriov(dev);
…
return 0;
}
}
static struct pci_driver dev_driver = {
.name = “SR-IOV Physical Function driver”,
.id_table = dev_id_table,
.probe = dev_probe,
.remove = dev_remove,
.suspend = dev_suspend,
.resume = dev_resume,
.shutdown = dev_shutdown,
.sriov_configure = dev_sriov_configure,
};
以82599为例的话ixgbe_probe->ixgbe_enable_sriov->ixgbe_enable_sriov
static struct pci_driver ixgbe_driver = {
.name = ixgbe_driver_name,
.id_table = ixgbe_pci_tbl,
.probe = ixgbe_probe,
.remove = ixgbe_remove,
#ifdef CONFIG_PM
.suspend = ixgbe_suspend,
.resume = ixgbe_resume,
#endif
.shutdown = ixgbe_shutdown,
.sriov_configure = ixgbe_pci_sriov_configure,
.err_handler = &ixgbe_err_handler
};