aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRajesh Borundia <rajesh.borundia@qlogic.com>2014-05-09 02:51:29 -0400
committerDavid S. Miller <davem@davemloft.net>2014-05-09 13:08:57 -0400
commit132a3f2bee7600366244097658c4c89ac99a8981 (patch)
tree9f04577618d93f7da585944dbc759b13580185ed
parenta3ab3c13f1fe6eea92468ddd1681d41e133fe703 (diff)
qlcnic: Allow SR-IOV VF probe in hypervisor.
o Add support for SR-IOV VF probe in hypervisor to enable assignment of VFs within hypervisor. o SR-IOV VF can be uplinked to bridge/macvtap device with this change. o Refactor SR-IOV enable/disable code. We cannot take rtnl lock while enabling/disabling SR-IOV as VF probe will take an rtnl lock. o Disable spoofchk by default. Signed-off-by: Rajesh Borundia <rajesh.borundia@qlogic.com> Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c5
-rw-r--r--drivers/net/ethernet/qlogic/qlcnic/qlcnic_sriov_common.c2
-rw-r--r--drivers/net/ethernet/qlogic/qlcnic/qlcnic_sriov_pf.c34
3 files changed, 24 insertions, 17 deletions
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c
index 7023d358baa9..28ebe1ba5a0b 100644
--- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c
+++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c
@@ -2398,9 +2398,6 @@ qlcnic_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
2398 int err, pci_using_dac = -1; 2398 int err, pci_using_dac = -1;
2399 char board_name[QLCNIC_MAX_BOARD_NAME_LEN + 19]; /* MAC + ": " + name */ 2399 char board_name[QLCNIC_MAX_BOARD_NAME_LEN + 19]; /* MAC + ": " + name */
2400 2400
2401 if (pdev->is_virtfn)
2402 return -ENODEV;
2403
2404 err = pci_enable_device(pdev); 2401 err = pci_enable_device(pdev);
2405 if (err) 2402 if (err)
2406 return err; 2403 return err;
@@ -2680,9 +2677,9 @@ static void qlcnic_remove(struct pci_dev *pdev)
2680 return; 2677 return;
2681 2678
2682 netdev = adapter->netdev; 2679 netdev = adapter->netdev;
2683 qlcnic_sriov_pf_disable(adapter);
2684 2680
2685 qlcnic_cancel_idc_work(adapter); 2681 qlcnic_cancel_idc_work(adapter);
2682 qlcnic_sriov_pf_disable(adapter);
2686 ahw = adapter->ahw; 2683 ahw = adapter->ahw;
2687 2684
2688 unregister_netdev(netdev); 2685 unregister_netdev(netdev);
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_sriov_common.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_sriov_common.c
index 0638c1810d54..4eccc2b74f67 100644
--- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_sriov_common.c
+++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_sriov_common.c
@@ -198,7 +198,7 @@ int qlcnic_sriov_init(struct qlcnic_adapter *adapter, int num_vfs)
198 } 198 }
199 sriov->vf_info[i].vp = vp; 199 sriov->vf_info[i].vp = vp;
200 vp->max_tx_bw = MAX_BW; 200 vp->max_tx_bw = MAX_BW;
201 vp->spoofchk = true; 201 vp->spoofchk = false;
202 random_ether_addr(vp->mac); 202 random_ether_addr(vp->mac);
203 dev_info(&adapter->pdev->dev, 203 dev_info(&adapter->pdev->dev,
204 "MAC Address %pM is configured for VF %d\n", 204 "MAC Address %pM is configured for VF %d\n",
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_sriov_pf.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_sriov_pf.c
index c7926ce85fec..df409086e4d3 100644
--- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_sriov_pf.c
+++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_sriov_pf.c
@@ -472,12 +472,12 @@ static int qlcnic_pci_sriov_disable(struct qlcnic_adapter *adapter)
472 return -EPERM; 472 return -EPERM;
473 } 473 }
474 474
475 qlcnic_sriov_pf_disable(adapter);
476
475 rtnl_lock(); 477 rtnl_lock();
476 if (netif_running(netdev)) 478 if (netif_running(netdev))
477 __qlcnic_down(adapter, netdev); 479 __qlcnic_down(adapter, netdev);
478 480
479 qlcnic_sriov_pf_disable(adapter);
480
481 qlcnic_sriov_free_vlans(adapter); 481 qlcnic_sriov_free_vlans(adapter);
482 482
483 qlcnic_sriov_pf_cleanup(adapter); 483 qlcnic_sriov_pf_cleanup(adapter);
@@ -596,7 +596,6 @@ static int __qlcnic_pci_sriov_enable(struct qlcnic_adapter *adapter,
596 596
597 qlcnic_sriov_alloc_vlans(adapter); 597 qlcnic_sriov_alloc_vlans(adapter);
598 598
599 err = qlcnic_sriov_pf_enable(adapter, num_vfs);
600 return err; 599 return err;
601 600
602del_flr_queue: 601del_flr_queue:
@@ -627,25 +626,36 @@ static int qlcnic_pci_sriov_enable(struct qlcnic_adapter *adapter, int num_vfs)
627 __qlcnic_down(adapter, netdev); 626 __qlcnic_down(adapter, netdev);
628 627
629 err = __qlcnic_pci_sriov_enable(adapter, num_vfs); 628 err = __qlcnic_pci_sriov_enable(adapter, num_vfs);
630 if (err) { 629 if (err)
631 netdev_info(netdev, "Failed to enable SR-IOV on port %d\n", 630 goto error;
632 adapter->portnum);
633 631
634 err = -EIO; 632 if (netif_running(netdev))
635 if (qlcnic_83xx_configure_opmode(adapter)) 633 __qlcnic_up(adapter, netdev);
636 goto error; 634
637 } else { 635 rtnl_unlock();
636 err = qlcnic_sriov_pf_enable(adapter, num_vfs);
637 if (!err) {
638 netdev_info(netdev, 638 netdev_info(netdev,
639 "SR-IOV is enabled successfully on port %d\n", 639 "SR-IOV is enabled successfully on port %d\n",
640 adapter->portnum); 640 adapter->portnum);
641 /* Return number of vfs enabled */ 641 /* Return number of vfs enabled */
642 err = num_vfs; 642 return num_vfs;
643 } 643 }
644
645 rtnl_lock();
644 if (netif_running(netdev)) 646 if (netif_running(netdev))
645 __qlcnic_up(adapter, netdev); 647 __qlcnic_down(adapter, netdev);
646 648
647error: 649error:
650 if (!qlcnic_83xx_configure_opmode(adapter)) {
651 if (netif_running(netdev))
652 __qlcnic_up(adapter, netdev);
653 }
654
648 rtnl_unlock(); 655 rtnl_unlock();
656 netdev_info(netdev, "Failed to enable SR-IOV on port %d\n",
657 adapter->portnum);
658
649 return err; 659 return err;
650} 660}
651 661