[PATCH 19.11 1/4] net/hns3: fix residual MAC after setting default MAC
Christian Ehrhardt
christian.ehrhardt at canonical.com
Mon Jan 10 08:45:36 CET 2022
On Sat, Dec 25, 2021 at 11:58 AM Huisong Li <lihuisong at huawei.com> wrote:
>
> [ upstream commit 19e67d8ebced5cb12829f75c70e6c497b5925e82 ]
>
Thank you, queued for 19.11.12 (later this year)
> This problem occurs in the following scenarios:
> 1) reset is encountered when the adapter is running.
> 2) set a new default MAC address.
>
> After the above two steps, the old default MAC address should be not
> take effect. But the current behavior is contrary to that. This is due
> to the change of the "default_addr_setted" in hw->mac from 'true' to
> 'false' after the reset. As a result, the old MAC address is not removed
> when the new default MAC address is set. This variable controls whether
> to delete the old default MAC address when setting the default MAC
> address. It is only used when the mac_addr_set API is called for the
> first time. In fact, when a unicast MAC address is deleted, if the
> address isn't in the MAC address table, the driver doesn't return
> failure. So this patch remove the redundant and troublesome variables to
> resolve this problem.
>
> Fixes: 7d7f9f80bbfb ("net/hns3: support MAC address related operations")
>
> Signed-off-by: Huisong Li <lihuisong at huawei.com>
> Signed-off-by: Min Hu (Connor) <humin29 at huawei.com>
> ---
> drivers/net/hns3/hns3_ethdev.c | 58 ++++++++++------------------------
> drivers/net/hns3/hns3_ethdev.h | 1 -
> 2 files changed, 16 insertions(+), 43 deletions(-)
>
> diff --git a/drivers/net/hns3/hns3_ethdev.c b/drivers/net/hns3/hns3_ethdev.c
> index 157dd34d4f..a2676f84b0 100644
> --- a/drivers/net/hns3/hns3_ethdev.c
> +++ b/drivers/net/hns3/hns3_ethdev.c
> @@ -1545,7 +1545,7 @@ hns3_remove_mc_addr_common(struct hns3_hw *hw, struct rte_ether_addr *mac_addr)
>
> static int
> hns3_add_mac_addr(struct rte_eth_dev *dev, struct rte_ether_addr *mac_addr,
> - uint32_t idx, __attribute__ ((unused)) uint32_t pool)
> + __rte_unused uint32_t idx, __rte_unused uint32_t pool)
> {
> struct hns3_hw *hw = HNS3_DEV_PRIVATE_TO_HW(dev->data->dev_private);
> char mac_str[RTE_ETHER_ADDR_FMT_SIZE];
> @@ -1576,8 +1576,6 @@ hns3_add_mac_addr(struct rte_eth_dev *dev, struct rte_ether_addr *mac_addr,
> return ret;
> }
>
> - if (idx == 0)
> - hw->mac.default_addr_setted = true;
> rte_spinlock_unlock(&hw->lock);
>
> return ret;
> @@ -1642,35 +1640,18 @@ hns3_set_default_mac_addr(struct rte_eth_dev *dev,
> struct hns3_hw *hw = HNS3_DEV_PRIVATE_TO_HW(dev->data->dev_private);
> struct rte_ether_addr *oaddr;
> char mac_str[RTE_ETHER_ADDR_FMT_SIZE];
> - bool default_addr_setted;
> - bool rm_succes = false;
> int ret, ret_val;
>
> - /* check if mac addr is valid */
> - if (!rte_is_valid_assigned_ether_addr(mac_addr)) {
> - rte_ether_format_addr(mac_str, RTE_ETHER_ADDR_FMT_SIZE,
> - mac_addr);
> - hns3_err(hw, "Failed to set mac addr, addr(%s) invalid",
> - mac_str);
> - return -EINVAL;
> - }
> -
> - oaddr = (struct rte_ether_addr *)hw->mac.mac_addr;
> - default_addr_setted = hw->mac.default_addr_setted;
> - if (default_addr_setted && !!rte_is_same_ether_addr(mac_addr, oaddr))
> - return 0;
> -
> rte_spinlock_lock(&hw->lock);
> - if (default_addr_setted) {
> - ret = hns3_remove_uc_addr_common(hw, oaddr);
> - if (ret) {
> - rte_ether_format_addr(mac_str, RTE_ETHER_ADDR_FMT_SIZE,
> - oaddr);
> - hns3_warn(hw, "Remove old uc mac address(%s) fail: %d",
> - mac_str, ret);
> - rm_succes = false;
> - } else
> - rm_succes = true;
> + oaddr = (struct rte_ether_addr *)hw->mac.mac_addr;
> + ret = hns3_remove_uc_addr_common(hw, oaddr);
> + if (ret) {
> + rte_ether_format_addr(mac_str, RTE_ETHER_ADDR_FMT_SIZE,
> + oaddr);
> + hns3_warn(hw, "Remove old uc mac address(%s) fail: %d",
> + mac_str, ret);
> + rte_spinlock_unlock(&hw->lock);
> + return ret;
> }
>
> ret = hns3_add_uc_addr_common(hw, mac_addr);
> @@ -1689,7 +1670,6 @@ hns3_set_default_mac_addr(struct rte_eth_dev *dev,
>
> rte_ether_addr_copy(mac_addr,
> (struct rte_ether_addr *)hw->mac.mac_addr);
> - hw->mac.default_addr_setted = true;
> rte_spinlock_unlock(&hw->lock);
>
> return 0;
> @@ -1705,16 +1685,12 @@ hns3_set_default_mac_addr(struct rte_eth_dev *dev,
> }
>
> err_add_uc_addr:
> - if (rm_succes) {
> - ret_val = hns3_add_uc_addr_common(hw, oaddr);
> - if (ret_val) {
> - rte_ether_format_addr(mac_str, RTE_ETHER_ADDR_FMT_SIZE,
> - oaddr);
> - hns3_warn(hw,
> - "Failed to restore old uc mac addr(%s): %d",
> - mac_str, ret_val);
> - hw->mac.default_addr_setted = false;
> - }
> + ret_val = hns3_add_uc_addr_common(hw, oaddr);
> + if (ret_val) {
> + rte_ether_format_addr(mac_str, RTE_ETHER_ADDR_FMT_SIZE,
> + oaddr);
> + hns3_warn(hw, "Failed to restore old uc mac addr(%s): %d",
> + mac_str, ret_val);
> }
> rte_spinlock_unlock(&hw->lock);
>
> @@ -2880,7 +2856,6 @@ hns3_get_board_configuration(struct hns3_hw *hw)
> hw->rss_dis_flag = false;
> memcpy(hw->mac.mac_addr, cfg.mac_addr, RTE_ETHER_ADDR_LEN);
> hw->mac.phy_addr = cfg.phy_addr;
> - hw->mac.default_addr_setted = false;
> hw->num_tx_desc = cfg.tqp_desc_num;
> hw->num_rx_desc = cfg.tqp_desc_num;
> hw->dcb_info.num_pg = 1;
> @@ -4699,7 +4674,6 @@ hns3_do_stop(struct hns3_adapter *hns)
> reset_queue = true;
> } else
> reset_queue = false;
> - hw->mac.default_addr_setted = false;
> return hns3_stop_queues(hns, reset_queue);
> }
>
> diff --git a/drivers/net/hns3/hns3_ethdev.h b/drivers/net/hns3/hns3_ethdev.h
> index 6c3ac6f8a9..be0fac4fd2 100644
> --- a/drivers/net/hns3/hns3_ethdev.h
> +++ b/drivers/net/hns3/hns3_ethdev.h
> @@ -144,7 +144,6 @@ enum hns3_media_type {
>
> struct hns3_mac {
> uint8_t mac_addr[RTE_ETHER_ADDR_LEN];
> - bool default_addr_setted; /* whether default addr(mac_addr) is set */
> uint8_t media_type;
> uint8_t phy_addr;
> uint8_t link_duplex : 1; /* ETH_LINK_[HALF/FULL]_DUPLEX */
> --
> 2.33.0
>
--
Christian Ehrhardt
Staff Engineer, Ubuntu Server
Canonical Ltd
More information about the stable
mailing list