diff options
author | Rajesh Borundia <rajesh.borundia@qlogic.com> | 2014-05-09 02:51:29 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2014-05-09 13:08:57 -0400 |
commit | 132a3f2bee7600366244097658c4c89ac99a8981 (patch) | |
tree | 9f04577618d93f7da585944dbc759b13580185ed | |
parent | a3ab3c13f1fe6eea92468ddd1681d41e133fe703 (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.c | 5 | ||||
-rw-r--r-- | drivers/net/ethernet/qlogic/qlcnic/qlcnic_sriov_common.c | 2 | ||||
-rw-r--r-- | drivers/net/ethernet/qlogic/qlcnic/qlcnic_sriov_pf.c | 34 |
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 | ||
602 | del_flr_queue: | 601 | del_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 | ||
647 | error: | 649 | error: |
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 | ||