static void qlcnic_sriov_vf_cleanup(struct qlcnic_adapter *adapter) { qlcnic_sriov_channel_cfg_cmd(adapter, QLCNIC_BC_CMD_CHANNEL_TERM); qlcnic_sriov_cfg_bc_intr(adapter, 0); __qlcnic_sriov_cleanup(adapter); }
static int qlcnic_sriov_setup_vf(struct qlcnic_adapter *adapter, int pci_using_dac) { int err; adapter->flags |= QLCNIC_VLAN_FILTERING; adapter->ahw->total_nic_func = 1; INIT_LIST_HEAD(&adapter->vf_mc_list); if (!qlcnic_use_msi_x && !!qlcnic_use_msi) dev_warn(&adapter->pdev->dev, "Device does not support MSI interrupts\n"); /* compute and set default and max tx/sds rings */ qlcnic_set_tx_ring_count(adapter, QLCNIC_SINGLE_RING); qlcnic_set_sds_ring_count(adapter, QLCNIC_SINGLE_RING); err = qlcnic_setup_intr(adapter); if (err) { dev_err(&adapter->pdev->dev, "Failed to setup interrupt\n"); goto err_out_disable_msi; } err = qlcnic_83xx_setup_mbx_intr(adapter); if (err) goto err_out_disable_msi; err = qlcnic_sriov_init(adapter, 1); if (err) goto err_out_disable_mbx_intr; err = qlcnic_sriov_cfg_bc_intr(adapter, 1); if (err) goto err_out_cleanup_sriov; err = qlcnic_sriov_channel_cfg_cmd(adapter, QLCNIC_BC_CMD_CHANNEL_INIT); if (err) goto err_out_disable_bc_intr; err = qlcnic_sriov_vf_init_driver(adapter); if (err) goto err_out_send_channel_term; err = qlcnic_sriov_get_vf_acl(adapter); if (err) goto err_out_send_channel_term; err = qlcnic_setup_netdev(adapter, adapter->netdev, pci_using_dac); if (err) goto err_out_send_channel_term; pci_set_drvdata(adapter->pdev, adapter); dev_info(&adapter->pdev->dev, "%s: XGbE port initialized\n", adapter->netdev->name); qlcnic_schedule_work(adapter, qlcnic_sriov_vf_poll_dev_state, adapter->ahw->idc.delay); return 0; err_out_send_channel_term: qlcnic_sriov_channel_cfg_cmd(adapter, QLCNIC_BC_CMD_CHANNEL_TERM); err_out_disable_bc_intr: qlcnic_sriov_cfg_bc_intr(adapter, 0); err_out_cleanup_sriov: __qlcnic_sriov_cleanup(adapter); err_out_disable_mbx_intr: qlcnic_83xx_free_mbx_intr(adapter); err_out_disable_msi: qlcnic_teardown_intr(adapter); return err; }