net/i40e: support NIC reset
Reset a NIC by calling dev_uninit() and then dev_init(). Go through the same way in NIC PCI remove without release of ethdev resource and then NIC PCI probe function without ethdev resource allocation. Signed-off-by: Wei Dai <wei.dai@intel.com>
This commit is contained in:
parent
03b92b70da
commit
c162832a09
@ -250,6 +250,7 @@ static int i40e_dev_configure(struct rte_eth_dev *dev);
|
||||
static int i40e_dev_start(struct rte_eth_dev *dev);
|
||||
static void i40e_dev_stop(struct rte_eth_dev *dev);
|
||||
static void i40e_dev_close(struct rte_eth_dev *dev);
|
||||
static int i40e_dev_reset(struct rte_eth_dev *dev);
|
||||
static void i40e_dev_promiscuous_enable(struct rte_eth_dev *dev);
|
||||
static void i40e_dev_promiscuous_disable(struct rte_eth_dev *dev);
|
||||
static void i40e_dev_allmulticast_enable(struct rte_eth_dev *dev);
|
||||
@ -449,6 +450,7 @@ static const struct eth_dev_ops i40e_eth_dev_ops = {
|
||||
.dev_start = i40e_dev_start,
|
||||
.dev_stop = i40e_dev_stop,
|
||||
.dev_close = i40e_dev_close,
|
||||
.dev_reset = i40e_dev_reset,
|
||||
.promiscuous_enable = i40e_dev_promiscuous_enable,
|
||||
.promiscuous_disable = i40e_dev_promiscuous_disable,
|
||||
.allmulticast_enable = i40e_dev_allmulticast_enable,
|
||||
@ -2165,6 +2167,32 @@ i40e_dev_close(struct rte_eth_dev *dev)
|
||||
I40E_WRITE_FLUSH(hw);
|
||||
}
|
||||
|
||||
/*
|
||||
* Reset PF device only to re-initialize resources in PMD layer
|
||||
*/
|
||||
static int
|
||||
i40e_dev_reset(struct rte_eth_dev *dev)
|
||||
{
|
||||
int ret;
|
||||
|
||||
/* When a DPDK PMD PF begin to reset PF port, it should notify all
|
||||
* its VF to make them align with it. The detailed notification
|
||||
* mechanism is PMD specific. As to i40e PF, it is rather complex.
|
||||
* To avoid unexpected behavior in VF, currently reset of PF with
|
||||
* SR-IOV activation is not supported. It might be supported later.
|
||||
*/
|
||||
if (dev->data->sriov.active)
|
||||
return -ENOTSUP;
|
||||
|
||||
ret = eth_i40e_dev_uninit(dev);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
ret = eth_i40e_dev_init(dev);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void
|
||||
i40e_dev_promiscuous_enable(struct rte_eth_dev *dev)
|
||||
{
|
||||
|
@ -122,6 +122,7 @@ static void i40evf_vlan_offload_set(struct rte_eth_dev *dev, int mask);
|
||||
static int i40evf_vlan_pvid_set(struct rte_eth_dev *dev, uint16_t pvid,
|
||||
int on);
|
||||
static void i40evf_dev_close(struct rte_eth_dev *dev);
|
||||
static int i40evf_dev_reset(struct rte_eth_dev *dev);
|
||||
static void i40evf_dev_promiscuous_enable(struct rte_eth_dev *dev);
|
||||
static void i40evf_dev_promiscuous_disable(struct rte_eth_dev *dev);
|
||||
static void i40evf_dev_allmulticast_enable(struct rte_eth_dev *dev);
|
||||
@ -203,6 +204,7 @@ static const struct eth_dev_ops i40evf_eth_dev_ops = {
|
||||
.xstats_get_names = i40evf_dev_xstats_get_names,
|
||||
.xstats_reset = i40evf_dev_xstats_reset,
|
||||
.dev_close = i40evf_dev_close,
|
||||
.dev_reset = i40evf_dev_reset,
|
||||
.dev_infos_get = i40evf_dev_info_get,
|
||||
.dev_supported_ptypes_get = i40e_dev_supported_ptypes_get,
|
||||
.vlan_filter_set = i40evf_vlan_filter_set,
|
||||
@ -2373,6 +2375,23 @@ i40evf_dev_close(struct rte_eth_dev *dev)
|
||||
i40evf_disable_irq0(hw);
|
||||
}
|
||||
|
||||
/*
|
||||
* Reset VF device only to re-initialize resources in PMD layer
|
||||
*/
|
||||
static int
|
||||
i40evf_dev_reset(struct rte_eth_dev *dev)
|
||||
{
|
||||
int ret;
|
||||
|
||||
ret = i40evf_dev_uninit(dev);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
ret = i40evf_dev_init(dev);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int
|
||||
i40evf_get_rss_lut(struct i40e_vsi *vsi, uint8_t *lut, uint16_t lut_size)
|
||||
{
|
||||
|
Loading…
Reference in New Issue
Block a user