be2net: add support to get vf config
Signed-off-by: Ajit Khaparde <ajitk@serverengines.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
9cd9000bde
commit
64600ea5f3
|
@ -220,6 +220,12 @@ struct be_rx_obj {
|
||||||
struct be_rx_page_info page_info_tbl[RX_Q_LEN];
|
struct be_rx_page_info page_info_tbl[RX_Q_LEN];
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct be_vf_cfg {
|
||||||
|
unsigned char vf_mac_addr[ETH_ALEN];
|
||||||
|
u32 vf_if_handle;
|
||||||
|
u32 vf_pmac_id;
|
||||||
|
};
|
||||||
|
|
||||||
#define BE_NUM_MSIX_VECTORS 2 /* 1 each for Tx and Rx */
|
#define BE_NUM_MSIX_VECTORS 2 /* 1 each for Tx and Rx */
|
||||||
#define BE_INVALID_PMAC_ID 0xffffffff
|
#define BE_INVALID_PMAC_ID 0xffffffff
|
||||||
struct be_adapter {
|
struct be_adapter {
|
||||||
|
@ -289,8 +295,7 @@ struct be_adapter {
|
||||||
struct completion flash_compl;
|
struct completion flash_compl;
|
||||||
|
|
||||||
bool sriov_enabled;
|
bool sriov_enabled;
|
||||||
u32 vf_if_handle[BE_MAX_VF];
|
struct be_vf_cfg vf_cfg[BE_MAX_VF];
|
||||||
u32 vf_pmac_id[BE_MAX_VF];
|
|
||||||
u8 base_eq_id;
|
u8 base_eq_id;
|
||||||
u8 is_virtfn;
|
u8 is_virtfn;
|
||||||
};
|
};
|
||||||
|
|
|
@ -656,18 +656,44 @@ static int be_set_vf_mac(struct net_device *netdev, int vf, u8 *mac)
|
||||||
if (!is_valid_ether_addr(mac) || (vf >= num_vfs))
|
if (!is_valid_ether_addr(mac) || (vf >= num_vfs))
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
if (adapter->vf_pmac_id[vf] != BE_INVALID_PMAC_ID)
|
if (adapter->vf_cfg[vf].vf_pmac_id != BE_INVALID_PMAC_ID)
|
||||||
status = be_cmd_pmac_del(adapter, adapter->vf_if_handle[vf],
|
status = be_cmd_pmac_del(adapter,
|
||||||
adapter->vf_pmac_id[vf]);
|
adapter->vf_cfg[vf].vf_if_handle,
|
||||||
|
adapter->vf_cfg[vf].vf_pmac_id);
|
||||||
|
|
||||||
status = be_cmd_pmac_add(adapter, mac, adapter->vf_if_handle[vf],
|
status = be_cmd_pmac_add(adapter, mac,
|
||||||
&adapter->vf_pmac_id[vf]);
|
adapter->vf_cfg[vf].vf_if_handle,
|
||||||
if (!status)
|
&adapter->vf_cfg[vf].vf_pmac_id);
|
||||||
|
|
||||||
|
if (status)
|
||||||
dev_err(&adapter->pdev->dev, "MAC %pM set on VF %d Failed\n",
|
dev_err(&adapter->pdev->dev, "MAC %pM set on VF %d Failed\n",
|
||||||
mac, vf);
|
mac, vf);
|
||||||
|
else
|
||||||
|
memcpy(adapter->vf_cfg[vf].vf_mac_addr, mac, ETH_ALEN);
|
||||||
|
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int be_get_vf_config(struct net_device *netdev, int vf,
|
||||||
|
struct ifla_vf_info *vi)
|
||||||
|
{
|
||||||
|
struct be_adapter *adapter = netdev_priv(netdev);
|
||||||
|
|
||||||
|
if (!adapter->sriov_enabled)
|
||||||
|
return -EPERM;
|
||||||
|
|
||||||
|
if (vf >= num_vfs)
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
|
vi->vf = vf;
|
||||||
|
vi->tx_rate = 0;
|
||||||
|
vi->vlan = 0;
|
||||||
|
vi->qos = 0;
|
||||||
|
memcpy(&vi->mac, adapter->vf_cfg[vf].vf_mac_addr, ETH_ALEN);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static void be_rx_rate_update(struct be_adapter *adapter)
|
static void be_rx_rate_update(struct be_adapter *adapter)
|
||||||
{
|
{
|
||||||
struct be_drvr_stats *stats = drvr_stats(adapter);
|
struct be_drvr_stats *stats = drvr_stats(adapter);
|
||||||
|
@ -1904,14 +1930,15 @@ static int be_setup(struct be_adapter *adapter)
|
||||||
cap_flags = en_flags = BE_IF_FLAGS_UNTAGGED
|
cap_flags = en_flags = BE_IF_FLAGS_UNTAGGED
|
||||||
| BE_IF_FLAGS_BROADCAST;
|
| BE_IF_FLAGS_BROADCAST;
|
||||||
status = be_cmd_if_create(adapter, cap_flags, en_flags,
|
status = be_cmd_if_create(adapter, cap_flags, en_flags,
|
||||||
mac, true, &adapter->vf_if_handle[vf],
|
mac, true,
|
||||||
|
&adapter->vf_cfg[vf].vf_if_handle,
|
||||||
NULL, vf+1);
|
NULL, vf+1);
|
||||||
if (status) {
|
if (status) {
|
||||||
dev_err(&adapter->pdev->dev,
|
dev_err(&adapter->pdev->dev,
|
||||||
"Interface Create failed for VF %d\n", vf);
|
"Interface Create failed for VF %d\n", vf);
|
||||||
goto if_destroy;
|
goto if_destroy;
|
||||||
}
|
}
|
||||||
adapter->vf_pmac_id[vf] = BE_INVALID_PMAC_ID;
|
adapter->vf_cfg[vf].vf_pmac_id = BE_INVALID_PMAC_ID;
|
||||||
vf++;
|
vf++;
|
||||||
}
|
}
|
||||||
} else if (!be_physfn(adapter)) {
|
} else if (!be_physfn(adapter)) {
|
||||||
|
@ -1945,8 +1972,9 @@ tx_qs_destroy:
|
||||||
be_tx_queues_destroy(adapter);
|
be_tx_queues_destroy(adapter);
|
||||||
if_destroy:
|
if_destroy:
|
||||||
for (vf = 0; vf < num_vfs; vf++)
|
for (vf = 0; vf < num_vfs; vf++)
|
||||||
if (adapter->vf_if_handle[vf])
|
if (adapter->vf_cfg[vf].vf_if_handle)
|
||||||
be_cmd_if_destroy(adapter, adapter->vf_if_handle[vf]);
|
be_cmd_if_destroy(adapter,
|
||||||
|
adapter->vf_cfg[vf].vf_if_handle);
|
||||||
be_cmd_if_destroy(adapter, adapter->if_handle);
|
be_cmd_if_destroy(adapter, adapter->if_handle);
|
||||||
do_none:
|
do_none:
|
||||||
return status;
|
return status;
|
||||||
|
@ -2189,7 +2217,8 @@ static struct net_device_ops be_netdev_ops = {
|
||||||
.ndo_vlan_rx_register = be_vlan_register,
|
.ndo_vlan_rx_register = be_vlan_register,
|
||||||
.ndo_vlan_rx_add_vid = be_vlan_add_vid,
|
.ndo_vlan_rx_add_vid = be_vlan_add_vid,
|
||||||
.ndo_vlan_rx_kill_vid = be_vlan_rem_vid,
|
.ndo_vlan_rx_kill_vid = be_vlan_rem_vid,
|
||||||
.ndo_set_vf_mac = be_set_vf_mac
|
.ndo_set_vf_mac = be_set_vf_mac,
|
||||||
|
.ndo_get_vf_config = be_get_vf_config
|
||||||
};
|
};
|
||||||
|
|
||||||
static void be_netdev_init(struct net_device *netdev)
|
static void be_netdev_init(struct net_device *netdev)
|
||||||
|
|
Loading…
Reference in New Issue