Skip to content

Commit 50f3034

Browse files
akihikodakianguy11
authored andcommitted
igb: Enable SR-IOV after reinit
Enabling SR-IOV causes the virtual functions to make requests to the PF via the mailbox. Notably, E1000_VF_RESET request will happen during the initialization of the VF. However, unless the reinit is done, the VMMB interrupt, which delivers mailbox interrupt from VF to PF will be kept masked and such requests will be silently ignored. Enable SR-IOV at the very end of the procedure to configure the device for SR-IOV so that the PF is configured properly for SR-IOV when a VF is activated. Fixes: fa44f2f ("igb: Enable SR-IOV configuration via PCI sysfs interface") Signed-off-by: Akihiko Odaki <akihiko.odaki@daynix.com> Tested-by: Marek Szlosek <marek.szlosek@intel.com> Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com>
1 parent 65f6985 commit 50f3034

File tree

1 file changed

+58
-77
lines changed

1 file changed

+58
-77
lines changed

drivers/net/ethernet/intel/igb/igb_main.c

Lines changed: 58 additions & 77 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,7 @@ static void igb_free_all_rx_resources(struct igb_adapter *);
109109
static void igb_setup_mrqc(struct igb_adapter *);
110110
static int igb_probe(struct pci_dev *, const struct pci_device_id *);
111111
static void igb_remove(struct pci_dev *pdev);
112+
static void igb_init_queue_configuration(struct igb_adapter *adapter);
112113
static int igb_sw_init(struct igb_adapter *);
113114
int igb_open(struct net_device *);
114115
int igb_close(struct net_device *);
@@ -175,9 +176,7 @@ static void igb_nfc_filter_restore(struct igb_adapter *adapter);
175176

176177
#ifdef CONFIG_PCI_IOV
177178
static int igb_vf_configure(struct igb_adapter *adapter, int vf);
178-
static int igb_pci_enable_sriov(struct pci_dev *dev, int num_vfs);
179-
static int igb_disable_sriov(struct pci_dev *dev);
180-
static int igb_pci_disable_sriov(struct pci_dev *dev);
179+
static int igb_disable_sriov(struct pci_dev *dev, bool reinit);
181180
#endif
182181

183182
static int igb_suspend(struct device *);
@@ -3665,7 +3664,7 @@ static int igb_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
36653664
kfree(adapter->shadow_vfta);
36663665
igb_clear_interrupt_scheme(adapter);
36673666
#ifdef CONFIG_PCI_IOV
3668-
igb_disable_sriov(pdev);
3667+
igb_disable_sriov(pdev, false);
36693668
#endif
36703669
pci_iounmap(pdev, adapter->io_addr);
36713670
err_ioremap:
@@ -3679,7 +3678,38 @@ static int igb_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
36793678
}
36803679

36813680
#ifdef CONFIG_PCI_IOV
3682-
static int igb_disable_sriov(struct pci_dev *pdev)
3681+
static int igb_sriov_reinit(struct pci_dev *dev)
3682+
{
3683+
struct net_device *netdev = pci_get_drvdata(dev);
3684+
struct igb_adapter *adapter = netdev_priv(netdev);
3685+
struct pci_dev *pdev = adapter->pdev;
3686+
3687+
rtnl_lock();
3688+
3689+
if (netif_running(netdev))
3690+
igb_close(netdev);
3691+
else
3692+
igb_reset(adapter);
3693+
3694+
igb_clear_interrupt_scheme(adapter);
3695+
3696+
igb_init_queue_configuration(adapter);
3697+
3698+
if (igb_init_interrupt_scheme(adapter, true)) {
3699+
rtnl_unlock();
3700+
dev_err(&pdev->dev, "Unable to allocate memory for queues\n");
3701+
return -ENOMEM;
3702+
}
3703+
3704+
if (netif_running(netdev))
3705+
igb_open(netdev);
3706+
3707+
rtnl_unlock();
3708+
3709+
return 0;
3710+
}
3711+
3712+
static int igb_disable_sriov(struct pci_dev *pdev, bool reinit)
36833713
{
36843714
struct net_device *netdev = pci_get_drvdata(pdev);
36853715
struct igb_adapter *adapter = netdev_priv(netdev);
@@ -3713,10 +3743,10 @@ static int igb_disable_sriov(struct pci_dev *pdev)
37133743
adapter->flags |= IGB_FLAG_DMAC;
37143744
}
37153745

3716-
return 0;
3746+
return reinit ? igb_sriov_reinit(pdev) : 0;
37173747
}
37183748

3719-
static int igb_enable_sriov(struct pci_dev *pdev, int num_vfs)
3749+
static int igb_enable_sriov(struct pci_dev *pdev, int num_vfs, bool reinit)
37203750
{
37213751
struct net_device *netdev = pci_get_drvdata(pdev);
37223752
struct igb_adapter *adapter = netdev_priv(netdev);
@@ -3781,19 +3811,24 @@ static int igb_enable_sriov(struct pci_dev *pdev, int num_vfs)
37813811
"Unable to allocate memory for VF MAC filter list\n");
37823812
}
37833813

3784-
/* only call pci_enable_sriov() if no VFs are allocated already */
3785-
if (!old_vfs) {
3786-
err = pci_enable_sriov(pdev, adapter->vfs_allocated_count);
3787-
if (err)
3788-
goto err_out;
3789-
}
37903814
dev_info(&pdev->dev, "%d VFs allocated\n",
37913815
adapter->vfs_allocated_count);
37923816
for (i = 0; i < adapter->vfs_allocated_count; i++)
37933817
igb_vf_configure(adapter, i);
37943818

37953819
/* DMA Coalescing is not supported in IOV mode. */
37963820
adapter->flags &= ~IGB_FLAG_DMAC;
3821+
3822+
if (reinit) {
3823+
err = igb_sriov_reinit(pdev);
3824+
if (err)
3825+
goto err_out;
3826+
}
3827+
3828+
/* only call pci_enable_sriov() if no VFs are allocated already */
3829+
if (!old_vfs)
3830+
err = pci_enable_sriov(pdev, adapter->vfs_allocated_count);
3831+
37973832
goto out;
37983833

37993834
err_out:
@@ -3863,7 +3898,7 @@ static void igb_remove(struct pci_dev *pdev)
38633898
igb_release_hw_control(adapter);
38643899

38653900
#ifdef CONFIG_PCI_IOV
3866-
igb_disable_sriov(pdev);
3901+
igb_disable_sriov(pdev, false);
38673902
#endif
38683903

38693904
unregister_netdev(netdev);
@@ -3909,7 +3944,7 @@ static void igb_probe_vfs(struct igb_adapter *adapter)
39093944
igb_reset_interrupt_capability(adapter);
39103945

39113946
pci_sriov_set_totalvfs(pdev, 7);
3912-
igb_enable_sriov(pdev, max_vfs);
3947+
igb_enable_sriov(pdev, max_vfs, false);
39133948

39143949
#endif /* CONFIG_PCI_IOV */
39153950
}
@@ -9518,71 +9553,17 @@ static void igb_shutdown(struct pci_dev *pdev)
95189553
}
95199554
}
95209555

9521-
#ifdef CONFIG_PCI_IOV
9522-
static int igb_sriov_reinit(struct pci_dev *dev)
9523-
{
9524-
struct net_device *netdev = pci_get_drvdata(dev);
9525-
struct igb_adapter *adapter = netdev_priv(netdev);
9526-
struct pci_dev *pdev = adapter->pdev;
9527-
9528-
rtnl_lock();
9529-
9530-
if (netif_running(netdev))
9531-
igb_close(netdev);
9532-
else
9533-
igb_reset(adapter);
9534-
9535-
igb_clear_interrupt_scheme(adapter);
9536-
9537-
igb_init_queue_configuration(adapter);
9538-
9539-
if (igb_init_interrupt_scheme(adapter, true)) {
9540-
rtnl_unlock();
9541-
dev_err(&pdev->dev, "Unable to allocate memory for queues\n");
9542-
return -ENOMEM;
9543-
}
9544-
9545-
if (netif_running(netdev))
9546-
igb_open(netdev);
9547-
9548-
rtnl_unlock();
9549-
9550-
return 0;
9551-
}
9552-
9553-
static int igb_pci_disable_sriov(struct pci_dev *dev)
9554-
{
9555-
int err = igb_disable_sriov(dev);
9556-
9557-
if (!err)
9558-
err = igb_sriov_reinit(dev);
9559-
9560-
return err;
9561-
}
9562-
9563-
static int igb_pci_enable_sriov(struct pci_dev *dev, int num_vfs)
9564-
{
9565-
int err = igb_enable_sriov(dev, num_vfs);
9566-
9567-
if (err)
9568-
goto out;
9569-
9570-
err = igb_sriov_reinit(dev);
9571-
if (!err)
9572-
return num_vfs;
9573-
9574-
out:
9575-
return err;
9576-
}
9577-
9578-
#endif
95799556
static int igb_pci_sriov_configure(struct pci_dev *dev, int num_vfs)
95809557
{
95819558
#ifdef CONFIG_PCI_IOV
9582-
if (num_vfs == 0)
9583-
return igb_pci_disable_sriov(dev);
9584-
else
9585-
return igb_pci_enable_sriov(dev, num_vfs);
9559+
int err;
9560+
9561+
if (num_vfs == 0) {
9562+
return igb_disable_sriov(dev, true);
9563+
} else {
9564+
err = igb_enable_sriov(dev, num_vfs, true);
9565+
return err ? err : num_vfs;
9566+
}
95869567
#endif
95879568
return 0;
95889569
}

0 commit comments

Comments
 (0)