Move virtual finction cleanup code into igb_cleanup_vf() and for the sake of symmetry rename igb_probe_vfs() as igb_init_vf(). Although these functions aren't entirely symmetrical it should aid maintenance by making the relationship between initialisation and cleanup more obvious. Note that there appears to be no way for adapter->vfs_allocated_count to be non-zero for the case where CONFIG_PCI_IOV is not set, so reseting this value was moved to inside the relvant #ifdef. Signed-off-by: Simon Horman Index: net-next-2.6/drivers/net/igb/igb_main.c =================================================================== --- net-next-2.6.orig/drivers/net/igb/igb_main.c 2009-11-05 04:38:58.000000000 +0900 +++ net-next-2.6/drivers/net/igb/igb_main.c 2009-11-05 16:36:07.000000000 +0900 @@ -87,6 +87,7 @@ void igb_update_stats(struct igb_adapter static int igb_probe(struct pci_dev *, const struct pci_device_id *); static void __devexit igb_remove(struct pci_dev *pdev); static int igb_sw_init(struct igb_adapter *); +static void igb_cleanup_vf(struct igb_adapter * adapter); static int igb_open(struct net_device *); static int igb_close(struct net_device *); static void igb_configure_tx(struct igb_adapter *); @@ -650,21 +651,7 @@ static void igb_set_interrupt_capability /* If we can't do MSI-X, try MSI */ msi_only: -#ifdef CONFIG_PCI_IOV - /* disable SR-IOV for non MSI-X configurations */ - if (adapter->vf_data) { - struct e1000_hw *hw = &adapter->hw; - /* disable iov and allow time for transactions to clear */ - pci_disable_sriov(adapter->pdev); - msleep(500); - - kfree(adapter->vf_data); - adapter->vf_data = NULL; - wr32(E1000_IOVCTL, E1000_IOVCTL_REUSE_VFQ); - msleep(100); - dev_info(&adapter->pdev->dev, "IOV Disabled\n"); - } -#endif + igb_cleanup_vf(adapter); adapter->vfs_allocated_count = 0; adapter->flags |= IGB_FLAG_QUEUE_PAIRS; adapter->num_rx_queues = 1; @@ -1734,7 +1721,7 @@ static void __devexit igb_remove(struct } /** - * igb_probe_vfs - Initialize vf data storage and add VFs to pci config space + * igb_init_vf - Initialize vf data storage and add VFs to pci config space * @adapter: board private structure to initialize * * This function initializes the vf specific data storage and then attempts to @@ -1742,7 +1729,7 @@ static void __devexit igb_remove(struct * mor expensive time wise to disable SR-IOV than it is to allocate and free * the memory for the VFs. **/ -static void __devinit igb_probe_vfs(struct igb_adapter * adapter) +static void __devinit igb_init_vf(struct igb_adapter * adapter) { #ifdef CONFIG_PCI_IOV struct pci_dev *pdev = adapter->pdev; @@ -1782,6 +1769,35 @@ static void __devinit igb_probe_vfs(stru } /** + * igb_cleanup_vf - Clean up vf data and remove vfs from pci config space + * @adapter: board private structure to initialize + * + * This function cleans-up the vf specific data storage and then attempts to + * deallocate the VFs. + **/ +static void igb_cleanup_vf(struct igb_adapter * adapter) +{ +#ifdef CONFIG_PCI_IOV + struct e1000_hw *hw = &adapter->hw; + + if (!adapter->vf_data) + return; + + /* disable iov and allow time for transactions to clear */ + pci_disable_sriov(adapter->pdev); + msleep(500); + + kfree(adapter->vf_data); + adapter->vf_data = NULL; + adapter->vfs_allocated_count = 0; + + wr32(E1000_IOVCTL, E1000_IOVCTL_REUSE_VFQ); + msleep(100); + dev_info(&adapter->pdev->dev, "IOV Disabled\n"); +#endif +} + +/** * igb_sw_init - Initialize general software structures (struct igb_adapter) * @adapter: board private structure to initialize * @@ -1816,7 +1832,7 @@ static int __devinit igb_sw_init(struct return -ENOMEM; } - igb_probe_vfs(adapter); + igb_init_vf(adapter); /* Explicitly disable IRQ since the NIC can be in any state. */ igb_irq_disable(adapter); -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html