@@ -109,6 +109,7 @@ static void igb_free_all_rx_resources(struct igb_adapter *);
109
109
static void igb_setup_mrqc (struct igb_adapter * );
110
110
static int igb_probe (struct pci_dev * , const struct pci_device_id * );
111
111
static void igb_remove (struct pci_dev * pdev );
112
+ static void igb_init_queue_configuration (struct igb_adapter * adapter );
112
113
static int igb_sw_init (struct igb_adapter * );
113
114
int igb_open (struct net_device * );
114
115
int igb_close (struct net_device * );
@@ -175,9 +176,7 @@ static void igb_nfc_filter_restore(struct igb_adapter *adapter);
175
176
176
177
#ifdef CONFIG_PCI_IOV
177
178
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 );
181
180
#endif
182
181
183
182
static int igb_suspend (struct device * );
@@ -3665,7 +3664,7 @@ static int igb_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
3665
3664
kfree (adapter -> shadow_vfta );
3666
3665
igb_clear_interrupt_scheme (adapter );
3667
3666
#ifdef CONFIG_PCI_IOV
3668
- igb_disable_sriov (pdev );
3667
+ igb_disable_sriov (pdev , false );
3669
3668
#endif
3670
3669
pci_iounmap (pdev , adapter -> io_addr );
3671
3670
err_ioremap :
@@ -3679,7 +3678,38 @@ static int igb_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
3679
3678
}
3680
3679
3681
3680
#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 )
3683
3713
{
3684
3714
struct net_device * netdev = pci_get_drvdata (pdev );
3685
3715
struct igb_adapter * adapter = netdev_priv (netdev );
@@ -3713,10 +3743,10 @@ static int igb_disable_sriov(struct pci_dev *pdev)
3713
3743
adapter -> flags |= IGB_FLAG_DMAC ;
3714
3744
}
3715
3745
3716
- return 0 ;
3746
+ return reinit ? igb_sriov_reinit ( pdev ) : 0 ;
3717
3747
}
3718
3748
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 )
3720
3750
{
3721
3751
struct net_device * netdev = pci_get_drvdata (pdev );
3722
3752
struct igb_adapter * adapter = netdev_priv (netdev );
@@ -3781,19 +3811,24 @@ static int igb_enable_sriov(struct pci_dev *pdev, int num_vfs)
3781
3811
"Unable to allocate memory for VF MAC filter list\n" );
3782
3812
}
3783
3813
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
- }
3790
3814
dev_info (& pdev -> dev , "%d VFs allocated\n" ,
3791
3815
adapter -> vfs_allocated_count );
3792
3816
for (i = 0 ; i < adapter -> vfs_allocated_count ; i ++ )
3793
3817
igb_vf_configure (adapter , i );
3794
3818
3795
3819
/* DMA Coalescing is not supported in IOV mode. */
3796
3820
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
+
3797
3832
goto out ;
3798
3833
3799
3834
err_out :
@@ -3863,9 +3898,7 @@ static void igb_remove(struct pci_dev *pdev)
3863
3898
igb_release_hw_control (adapter );
3864
3899
3865
3900
#ifdef CONFIG_PCI_IOV
3866
- rtnl_lock ();
3867
- igb_disable_sriov (pdev );
3868
- rtnl_unlock ();
3901
+ igb_disable_sriov (pdev , false);
3869
3902
#endif
3870
3903
3871
3904
unregister_netdev (netdev );
@@ -3911,7 +3944,7 @@ static void igb_probe_vfs(struct igb_adapter *adapter)
3911
3944
igb_reset_interrupt_capability (adapter );
3912
3945
3913
3946
pci_sriov_set_totalvfs (pdev , 7 );
3914
- igb_enable_sriov (pdev , max_vfs );
3947
+ igb_enable_sriov (pdev , max_vfs , false );
3915
3948
3916
3949
#endif /* CONFIG_PCI_IOV */
3917
3950
}
@@ -9520,71 +9553,17 @@ static void igb_shutdown(struct pci_dev *pdev)
9520
9553
}
9521
9554
}
9522
9555
9523
- #ifdef CONFIG_PCI_IOV
9524
- static int igb_sriov_reinit (struct pci_dev * dev )
9525
- {
9526
- struct net_device * netdev = pci_get_drvdata (dev );
9527
- struct igb_adapter * adapter = netdev_priv (netdev );
9528
- struct pci_dev * pdev = adapter -> pdev ;
9529
-
9530
- rtnl_lock ();
9531
-
9532
- if (netif_running (netdev ))
9533
- igb_close (netdev );
9534
- else
9535
- igb_reset (adapter );
9536
-
9537
- igb_clear_interrupt_scheme (adapter );
9538
-
9539
- igb_init_queue_configuration (adapter );
9540
-
9541
- if (igb_init_interrupt_scheme (adapter , true)) {
9542
- rtnl_unlock ();
9543
- dev_err (& pdev -> dev , "Unable to allocate memory for queues\n" );
9544
- return - ENOMEM ;
9545
- }
9546
-
9547
- if (netif_running (netdev ))
9548
- igb_open (netdev );
9549
-
9550
- rtnl_unlock ();
9551
-
9552
- return 0 ;
9553
- }
9554
-
9555
- static int igb_pci_disable_sriov (struct pci_dev * dev )
9556
- {
9557
- int err = igb_disable_sriov (dev );
9558
-
9559
- if (!err )
9560
- err = igb_sriov_reinit (dev );
9561
-
9562
- return err ;
9563
- }
9564
-
9565
- static int igb_pci_enable_sriov (struct pci_dev * dev , int num_vfs )
9566
- {
9567
- int err = igb_enable_sriov (dev , num_vfs );
9568
-
9569
- if (err )
9570
- goto out ;
9571
-
9572
- err = igb_sriov_reinit (dev );
9573
- if (!err )
9574
- return num_vfs ;
9575
-
9576
- out :
9577
- return err ;
9578
- }
9579
-
9580
- #endif
9581
9556
static int igb_pci_sriov_configure (struct pci_dev * dev , int num_vfs )
9582
9557
{
9583
9558
#ifdef CONFIG_PCI_IOV
9584
- if (num_vfs == 0 )
9585
- return igb_pci_disable_sriov (dev );
9586
- else
9587
- 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
+ }
9588
9567
#endif
9589
9568
return 0 ;
9590
9569
}
0 commit comments