Since driver callbacks return status code now, there is no necessity to enable or disable all-multicast mode once again if it is already successfully enabled or disabled.
Configuration restore at startup tries to ensure that configured all-multicast mode is applied and start will return error if it fails. Also it avoids theoretical cases when already configured all-multicast mode is applied once again and fails. In this cases it is unclear which value should be reported on get (configured or opposite). Signed-off-by: Andrew Rybchenko <arybche...@solarflare.com> --- lib/librte_ethdev/rte_ethdev.c | 40 ++++++++++++++++++++-------------- 1 file changed, 24 insertions(+), 16 deletions(-) diff --git a/lib/librte_ethdev/rte_ethdev.c b/lib/librte_ethdev/rte_ethdev.c index 8115226c91..e1921e8225 100644 --- a/lib/librte_ethdev/rte_ethdev.c +++ b/lib/librte_ethdev/rte_ethdev.c @@ -1416,16 +1416,22 @@ rte_eth_dev_config_restore(struct rte_eth_dev *dev, } /* replay all multicast configuration */ - if (rte_eth_allmulticast_get(port_id) == 1) { - ret = rte_eth_allmulticast_enable(port_id); + /* + * use callbacks directly since we don't need port_id check and + * would like to bypass the same value set + */ + if (rte_eth_allmulticast_get(port_id) == 1 && + *dev->dev_ops->allmulticast_enable != NULL) { + ret = (*dev->dev_ops->allmulticast_enable)(dev); if (ret != 0 && ret != -ENOTSUP) { RTE_ETHDEV_LOG(ERR, "Failed to enable allmulticast mode for device (port %u): %s\n", port_id, rte_strerror(-ret)); return ret; } - } else if (rte_eth_allmulticast_get(port_id) == 0) { - ret = rte_eth_allmulticast_disable(port_id); + } else if (rte_eth_allmulticast_get(port_id) == 0 && + *dev->dev_ops->allmulticast_disable != NULL) { + ret = (*dev->dev_ops->allmulticast_disable)(dev); if (ret != 0 && ret != -ENOTSUP) { RTE_ETHDEV_LOG(ERR, "Failed to disable allmulticast mode for device (port %u): %s\n", @@ -1962,16 +1968,17 @@ int rte_eth_allmulticast_enable(uint16_t port_id) { struct rte_eth_dev *dev; - uint8_t old_allmulticast; - int diag; + int diag = 0; RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV); dev = &rte_eth_devices[port_id]; RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->allmulticast_enable, -ENOTSUP); - old_allmulticast = dev->data->all_multicast; - diag = (*dev->dev_ops->allmulticast_enable)(dev); - dev->data->all_multicast = (diag == 0) ? 1 : old_allmulticast; + + if (dev->data->all_multicast == 0) { + diag = (*dev->dev_ops->allmulticast_enable)(dev); + dev->data->all_multicast = (diag == 0) ? 1 : 0; + } return eth_err(port_id, diag); } @@ -1980,18 +1987,19 @@ int rte_eth_allmulticast_disable(uint16_t port_id) { struct rte_eth_dev *dev; - uint8_t old_allmulticast; - int diag; + int diag = 0; RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV); dev = &rte_eth_devices[port_id]; RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->allmulticast_disable, -ENOTSUP); - old_allmulticast = dev->data->all_multicast; - dev->data->all_multicast = 0; - diag = (*dev->dev_ops->allmulticast_disable)(dev); - if (diag != 0) - dev->data->all_multicast = old_allmulticast; + + if (dev->data->all_multicast == 1) { + dev->data->all_multicast = 0; + diag = (*dev->dev_ops->allmulticast_disable)(dev); + if (diag != 0) + dev->data->all_multicast = 1; + } return eth_err(port_id, diag); } -- 2.17.1