Fix error handling when MAC configuration fails.<br />This is issue was discovered during internal testing.<br /> <br />Fixes: 1c8f68b64cfc ("net/zxdh: optimize MAC operations")<br />Cc: stable@dpdk.org<br /> <br />Signed-off-by: Junlong Wang <wang.junlong1@zte.com.cn> <br />---<br /> drivers/net/zxdh/zxdh_ethdev.c     | 13 +++++++++<br /> drivers/net/zxdh/zxdh_ethdev_ops.c | 34 +++++++++++++++++++-----<br /> drivers/net/zxdh/zxdh_msg.c        | 10 +++----<br /> drivers/net/zxdh/zxdh_tables.c     | 42 ++++++++++++++++--------------<br /> 4 files changed, 67 insertions(+), 32 deletions(-)<br /> <br />diff --git a/drivers/net/zxdh/zxdh_ethdev.c b/drivers/net/zxdh/zxdh_ethdev.c<br />index 80053678cb..57c47f3bf8 100644<br />--- a/drivers/net/zxdh/zxdh_ethdev.c<br />+++ b/drivers/net/zxdh/zxdh_ethdev.c<br />@@ -1265,6 +1265,7 @@ static int<br /> zxdh_mac_config(struct rte_eth_dev *eth_dev)<br /> {<br />     struct zxdh_hw *hw = eth_dev->data->dev_private;<br />+    struct zxdh_msg_info msg_info = {0};<br />     int ret = 0;<br />  <br />     if (hw->is_pf) {<br />@@ -1274,6 +1275,18 @@ zxdh_mac_config(struct rte_eth_dev *eth_dev)<br />             PMD_DRV_LOG(ERR, "Failed to add mac: port 0x%x", hw->vport.vport);<br />             return ret;<br />         }<br />+        hw->uc_num++;<br />+    } else {<br />+        struct zxdh_mac_filter *mac_filter = &msg_info.data.mac_filter_msg;<br />+        mac_filter->filter_flag = 0xff;<br />+        mac_filter->mac = eth_dev->data->mac_addrs[0];<br />+        zxdh_msg_head_build(hw, ZXDH_MAC_ADD, &msg_info);<br />+        ret = zxdh_vf_send_msg_to_pf(eth_dev, &msg_info, sizeof(msg_info), NULL, 0);<br />+        if (ret) {<br />+            PMD_DRV_LOG(ERR, "Failed to send msg: msg type %d", ZXDH_MAC_ADD);<br />+            return ret;<br />+        }<br />+        hw->uc_num++;<br />     }<br />     return ret;<br /> }<br />diff --git a/drivers/net/zxdh/zxdh_ethdev_ops.c b/drivers/net/zxdh/zxdh_ethdev_ops.c<br />index 268f78900c..8c71721472 100644<br />--- a/drivers/net/zxdh/zxdh_ethdev_ops.c<br />+++ b/drivers/net/zxdh/zxdh_ethdev_ops.c<br />@@ -413,7 +413,10 @@ zxdh_dev_mac_addr_set(struct rte_eth_dev *dev, struct rte_ether_addr *addr)<br />     struct zxdh_hw *hw = (struct zxdh_hw *)dev->data->dev_private;<br />     struct rte_ether_addr *old_addr = &dev->data->mac_addrs[0];<br />     struct zxdh_msg_info msg_info = {0};<br />-    uint16_t ret = 0;<br />+    uint8_t zxdh_msg_reply_info[ZXDH_ST_SZ_BYTES(msg_reply_info)] = {0};<br />+    void *reply_body_addr = ZXDH_ADDR_OF(msg_reply_info, zxdh_msg_reply_info, reply_body);<br />+    void *mac_reply_msg_addr = ZXDH_ADDR_OF(msg_reply_body, reply_body_addr, mac_reply_msg);<br />+    int ret = 0;<br />  <br />     if (!rte_is_valid_assigned_ether_addr(addr)) {<br />         PMD_DRV_LOG(ERR, "mac address is invalid!");<br />@@ -425,7 +428,7 @@ zxdh_dev_mac_addr_set(struct rte_eth_dev *dev, struct rte_ether_addr *addr)<br />     if (hw->is_pf) {<br />         ret = zxdh_add_mac_table(hw, hw->vport.vport, addr, hw->hash_search_index, 0, 0);<br />         if (ret) {<br />-            if (ret == ZXDH_EEXIST_MAC_FLAG) {<br />+            if (ret == -EADDRINUSE) {<br />                 PMD_DRV_LOG(ERR, "pf mac add failed! mac is in used, code:%d", ret);<br />                 return -EADDRINUSE;<br />             }<br />@@ -446,9 +449,11 @@ zxdh_dev_mac_addr_set(struct rte_eth_dev *dev, struct rte_ether_addr *addr)<br />         mac_filter->filter_flag = ZXDH_MAC_UNFILTER;<br />         mac_filter->mac = *addr;<br />         zxdh_msg_head_build(hw, ZXDH_MAC_ADD, &msg_info);<br />-        ret = zxdh_vf_send_msg_to_pf(dev, &msg_info, sizeof(msg_info), NULL, 0);<br />+        ret = zxdh_vf_send_msg_to_pf(dev, &msg_info, sizeof(msg_info),<br />+                zxdh_msg_reply_info, ZXDH_ST_SZ_BYTES(msg_reply_info));<br />         if (ret) {<br />-            if (ret == ZXDH_EEXIST_MAC_FLAG) {<br />+            uint8_t flag = ZXDH_GET(mac_reply_msg, mac_reply_msg_addr, mac_flag);<br />+            if (flag == ZXDH_EEXIST_MAC_FLAG) {<br />                 PMD_DRV_LOG(ERR, "pf mac add failed! mac is in used, code:%d", ret);<br />                 return -EADDRINUSE;<br />             }<br />@@ -482,7 +487,11 @@ zxdh_dev_mac_addr_add(struct rte_eth_dev *dev, struct rte_ether_addr *mac_addr,<br /> {<br />     struct zxdh_hw *hw = dev->data->dev_private;<br />     struct zxdh_msg_info msg_info = {0};<br />-    uint16_t i, ret;<br />+    uint8_t zxdh_msg_reply_info[ZXDH_ST_SZ_BYTES(msg_reply_info)] = {0};<br />+    void *reply_body_addr = ZXDH_ADDR_OF(msg_reply_info, zxdh_msg_reply_info, reply_body);<br />+    void *mac_reply_msg_addr = ZXDH_ADDR_OF(msg_reply_body, reply_body_addr, mac_reply_msg);<br />+    uint16_t i;<br />+    int ret;<br />  <br />     if (index >= ZXDH_MAX_MAC_ADDRS) {<br />         PMD_DRV_LOG(ERR, "Add mac index (%u) is out of range", index);<br />@@ -503,6 +512,10 @@ zxdh_dev_mac_addr_add(struct rte_eth_dev *dev, struct rte_ether_addr *mac_addr,<br />                 ret = zxdh_add_mac_table(hw, hw->vport.vport,<br />                             mac_addr, hw->hash_search_index, 0, 0);<br />                 if (ret) {<br />+                    if (ret == -EADDRINUSE) {<br />+                        PMD_DRV_LOG(ERR, "pf mac add failed mac is in used");<br />+                        return -EADDRINUSE;<br />+                    }<br />                     PMD_DRV_LOG(ERR, "mac_addr_add failed, code:%d", ret);<br />                     return ret;<br />                 }<br />@@ -536,9 +549,16 @@ zxdh_dev_mac_addr_add(struct rte_eth_dev *dev, struct rte_ether_addr *mac_addr,<br />         zxdh_msg_head_build(hw, ZXDH_MAC_ADD, &msg_info);<br />         if (rte_is_unicast_ether_addr(mac_addr)) {<br />             if (hw->uc_num < ZXDH_MAX_UC_MAC_ADDRS) {<br />-                ret = zxdh_vf_send_msg_to_pf(dev, &msg_info,<br />-                            sizeof(msg_info), NULL, 0);<br />+                ret = zxdh_vf_send_msg_to_pf(dev, &msg_info, sizeof(msg_info),<br />+                        zxdh_msg_reply_info,<br />+                        ZXDH_ST_SZ_BYTES(msg_reply_info));<br />                 if (ret) {<br />+                    uint8_t flag = ZXDH_GET(mac_reply_msg,<br />+                        mac_reply_msg_addr, mac_flag);<br />+                    if (flag == ZXDH_EEXIST_MAC_FLAG) {<br />+                        PMD_DRV_LOG(ERR, "pf mac add failed mac is in used");<br />+                        return -EADDRINUSE;<br />+                    }<br />                     PMD_DRV_LOG(ERR, "Failed to send msg: port 0x%x msg type %d",<br />                             hw->vport.vport, ZXDH_MAC_ADD);<br />                     return ret;<br />diff --git a/drivers/net/zxdh/zxdh_msg.c b/drivers/net/zxdh/zxdh_msg.c<br />index 02ecd93b12..452c7ab2e3 100644<br />--- a/drivers/net/zxdh/zxdh_msg.c<br />+++ b/drivers/net/zxdh/zxdh_msg.c<br />@@ -1349,11 +1349,11 @@ zxdh_add_vf_mac_table(struct zxdh_hw *hw, uint16_t vport, void *cfg_data,<br />     union zxdh_virport_num port = {0};<br />     struct zxdh_mac_filter *mac_filter = (struct zxdh_mac_filter *)cfg_data;<br />     struct rte_ether_addr *addr = &mac_filter->mac;<br />-    int i = 0, ret = 0;<br />-    uint16_t vf_id = port.vfid;<br />-    port.vport = vport;<br />     void *reply_data_addr = ZXDH_ADDR_OF(msg_reply_body, reply_body, reply_data);<br />     void *mac_reply_msg_addr = ZXDH_ADDR_OF(msg_reply_body, reply_body, mac_reply_msg);<br />+    port.vport = vport;<br />+    uint16_t vf_id = port.vfid;<br />+    int i = 0, ret = 0;<br />  <br />     for (i = 0; i < ZXDH_MAX_MAC_ADDRS; i++)<br />         if (rte_is_same_ether_addr(&hw->vfinfo[vf_id].vf_mac[i], addr))<br />@@ -1396,12 +1396,12 @@ static int<br /> zxdh_del_vf_mac_table(struct zxdh_hw *hw, uint16_t vport, void *cfg_data,<br />     void *res_info, uint16_t *res_len)<br /> {<br />-    int ret, i = 0;<br />     struct zxdh_mac_filter *mac_filter = (struct zxdh_mac_filter *)cfg_data;<br />     union zxdh_virport_num  port = (union zxdh_virport_num)vport;<br />     char str[ZXDH_MSG_REPLY_BODY_MAX_LEN] = "del mac";<br />-    uint16_t  vf_id = port.vfid;<br />     void *reply_data_addr = ZXDH_ADDR_OF(msg_reply_body, res_info, reply_data);<br />+    uint16_t vf_id = port.vfid;<br />+    int ret, i = 0;<br />  <br />     PMD_DRV_LOG(DEBUG, "[PF GET MSG FROM VF]--vf mac to del.");<br />     ret = zxdh_del_mac_table(hw, vport, &mac_filter->mac, hw->hash_search_index, 0, 0);<br />diff --git a/drivers/net/zxdh/zxdh_tables.c b/drivers/net/zxdh/zxdh_tables.c<br />index 29741e53ed..14974c021b 100644<br />--- a/drivers/net/zxdh/zxdh_tables.c<br />+++ b/drivers/net/zxdh/zxdh_tables.c<br />@@ -8,8 +8,8 @@<br /> #include "zxdh_tables.h" <br /> #include "zxdh_logs.h" <br />  <br />-#define ZXDH_UNIMAC_HASH_INDEX(index)        (ZXDH_SDT_L2_ENTRY_TABLE0 + (index))<br />-#define ZXDH_MULTIMAC_HASH_INDEX(index)      (ZXDH_SDT_MC_TABLE0 + (index))<br />+#define ZXDH_UNICAST_MAC_HASH_INDEX(index)        (ZXDH_SDT_L2_ENTRY_TABLE0 + (index))<br />+#define ZXDH_MULTICAST_MAC_HASH_INDEX(index)      (ZXDH_SDT_MC_TABLE0 + (index))<br /> #define ZXDH_MC_GROUP_NUM                 4<br /> #define ZXDH_BASE_VFID                    1152<br /> #define ZXDH_TABLE_HIT_FLAG               128<br />@@ -244,8 +244,8 @@ zxdh_add_mac_table(struct zxdh_hw *hw, uint16_t vport, struct rte_ether_addr *ad<br />     struct zxdh_mac_multicast_table multicast_table = {0};<br />     union zxdh_virport_num vport_num = (union zxdh_virport_num)vport;<br />     uint16_t vfid = zxdh_vport_to_vfid(vport_num);<br />-    uint32_t ret;<br />     uint16_t group_id = 0;<br />+    int32_t ret;<br />  <br />     if (rte_is_unicast_ether_addr(addr)) {<br />         rte_memcpy(unicast_table.key.dmac_addr, addr, sizeof(struct rte_ether_addr));<br />@@ -257,7 +257,7 @@ zxdh_add_mac_table(struct zxdh_hw *hw, uint16_t vport, struct rte_ether_addr *ad<br />             .p_rst = (uint8_t *)&unicast_table.entry<br />         };<br />         ZXDH_DTB_USER_ENTRY_T entry_get = {<br />-            .sdt_no = ZXDH_UNIMAC_HASH_INDEX(hash_search_idx),<br />+            .sdt_no = ZXDH_UNICAST_MAC_HASH_INDEX(hash_search_idx),<br />             .p_entry_data = (void *)&dtb_hash_entry<br />         };<br />  <br />@@ -294,19 +294,20 @@ zxdh_add_mac_table(struct zxdh_hw *hw, uint16_t vport, struct rte_ether_addr *ad<br />             };<br />  <br />             ZXDH_DTB_USER_ENTRY_T entry_get = {<br />-                .sdt_no = ZXDH_MULTIMAC_HASH_INDEX(hash_search_idx),<br />+                .sdt_no = ZXDH_MULTICAST_MAC_HASH_INDEX(hash_search_idx),<br />                 .p_entry_data = (void *)&dtb_hash_entry<br />             };<br />  <br />             ret = zxdh_np_dtb_table_entry_get(hw->slot_id, hw->dev_sd->dtb_sd.queueid,<br />                     &entry_get, 1);<br />             uint8_t index = (vport_num.vfid % 64) / 32;<br />+            uint8_t value = (vport_num.vfid % 64) % 32;<br />             if (ret == 0) {<br />                 if (vport_num.vf_flag) {<br />                     if (group_id == vport_num.vfid / 64)<br />                         multicast_table.entry.mc_bitmap[index] |=<br />                             rte_cpu_to_be_32(UINT32_C(1) << <br />-                            (31 - index));<br />+                            (31 - value));<br />                 } else {<br />                     if (group_id == vport_num.vfid / 64)<br />                         multicast_table.entry.mc_pf_enable =<br />@@ -317,7 +318,7 @@ zxdh_add_mac_table(struct zxdh_hw *hw, uint16_t vport, struct rte_ether_addr *ad<br />                     if (group_id == vport_num.vfid / 64)<br />                         multicast_table.entry.mc_bitmap[index] |=<br />                             rte_cpu_to_be_32(UINT32_C(1) << <br />-                            (31 - index));<br />+                            (31 - value));<br />                     else<br />                         multicast_table.entry.mc_bitmap[index] =<br />                             false;<br />@@ -347,10 +348,9 @@ zxdh_del_mac_table(struct zxdh_hw *hw, uint16_t vport, struct rte_ether_addr *ad<br />     struct zxdh_mac_unicast_table unicast_table = {0};<br />     struct zxdh_mac_multicast_table multicast_table = {0};<br />     union zxdh_virport_num vport_num = (union zxdh_virport_num)vport;<br />-    union zxdh_virport_num port = (union zxdh_virport_num)vport;<br />-    uint16_t vfid = zxdh_vport_to_vfid(port);<br />-    uint32_t ret, del_flag = 0;<br />-    uint16_t group_id = 0;<br />+    uint16_t vfid = zxdh_vport_to_vfid(vport_num);<br />+    uint16_t del_flag, group_id = 0;<br />+    int32_t ret = 0;<br />  <br />     if (rte_is_unicast_ether_addr(addr)) {<br />         rte_memcpy(unicast_table.key.dmac_addr, addr, sizeof(struct rte_ether_addr));<br />@@ -365,7 +365,7 @@ zxdh_del_mac_table(struct zxdh_hw *hw, uint16_t vport, struct rte_ether_addr *ad<br />         };<br />  <br />         ZXDH_DTB_USER_ENTRY_T entry_get = {<br />-            .sdt_no = ZXDH_UNIMAC_HASH_INDEX(hash_search_idx),<br />+            .sdt_no = ZXDH_UNICAST_MAC_HASH_INDEX(hash_search_idx),<br />             .p_entry_data = (void *)&dtb_hash_entry<br />         };<br />         ret = zxdh_np_dtb_table_entry_get(hw->slot_id, hw->dev_sd->dtb_sd.queueid,<br />@@ -393,16 +393,17 @@ zxdh_del_mac_table(struct zxdh_hw *hw, uint16_t vport, struct rte_ether_addr *ad<br />         };<br />  <br />         ZXDH_DTB_USER_ENTRY_T entry_get = {<br />-            .sdt_no = ZXDH_MULTIMAC_HASH_INDEX(hash_search_idx),<br />+            .sdt_no = ZXDH_MULTICAST_MAC_HASH_INDEX(hash_search_idx),<br />             .p_entry_data = (void *)&dtb_hash_entry<br />         };<br />  <br />         ret = zxdh_np_dtb_table_entry_get(hw->slot_id, hw->dev_sd->dtb_sd.queueid,<br />                 &entry_get, 1);<br />         uint8_t index = (vport_num.vfid % 64) / 32;<br />+        uint8_t value = (vport_num.vfid % 64) % 32;<br />         if (vport_num.vf_flag)<br />             multicast_table.entry.mc_bitmap[index] &=<br />-                ~(rte_cpu_to_be_32(UINT32_C(1) << (31 - index)));<br />+                ~(rte_cpu_to_be_32(UINT32_C(1) << (31 - value)));<br />         else<br />             multicast_table.entry.mc_pf_enable = 0;<br />  <br />@@ -422,7 +423,7 @@ zxdh_del_mac_table(struct zxdh_hw *hw, uint16_t vport, struct rte_ether_addr *ad<br />                 .p_rst = (uint8_t *)&multicast_table.entry<br />             };<br />             ZXDH_DTB_USER_ENTRY_T entry_get = {<br />-                .sdt_no = ZXDH_MULTIMAC_HASH_INDEX(hash_search_idx),<br />+                .sdt_no = ZXDH_MULTICAST_MAC_HASH_INDEX(hash_search_idx),<br />                 .p_entry_data = (void *)&dtb_hash_entry<br />             };<br />  <br />@@ -447,7 +448,7 @@ zxdh_del_mac_table(struct zxdh_hw *hw, uint16_t vport, struct rte_ether_addr *ad<br />                     .p_rst = (uint8_t *)&multicast_table.entry<br />                 };<br />                 ZXDH_DTB_USER_ENTRY_T entry_get = {<br />-                    .sdt_no  = ZXDH_MULTIMAC_HASH_INDEX(hash_search_idx),<br />+                    .sdt_no  = ZXDH_MULTICAST_MAC_HASH_INDEX(hash_search_idx),<br />                     .p_entry_data = (void *)&dtb_hash_entry<br />                 };<br />  <br />@@ -604,6 +605,7 @@ zxdh_dev_unicast_table_set(struct zxdh_hw *hw, uint16_t vport, bool enable)<br />     struct zxdh_unitcast_table uc_table = {0};<br />     struct zxdh_port_attr_table port_attr = {0};<br />     union zxdh_virport_num vport_num = (union zxdh_virport_num)vport;<br />+    uint16_t vfid = zxdh_vport_to_vfid(vport_num);<br />     int16_t ret = 0;<br />  <br />     ZXDH_DTB_ERAM_ENTRY_INFO_T uc_table_entry = {<br />@@ -617,7 +619,7 @@ zxdh_dev_unicast_table_set(struct zxdh_hw *hw, uint16_t vport, bool enable)<br />  <br />     ret = zxdh_np_dtb_table_entry_get(hw->slot_id, dtb_data->queueid, &entry, 1);<br />     if (ret) {<br />-        PMD_DRV_LOG(ERR, "unicast_table_get_failed:%d", hw->vfid);<br />+        PMD_DRV_LOG(ERR, "unicast_table_get_failed:%d", vfid);<br />         return -ret;<br />     }<br />  <br />@@ -634,20 +636,20 @@ zxdh_dev_unicast_table_set(struct zxdh_hw *hw, uint16_t vport, bool enable)<br />  <br />     ret = zxdh_np_dtb_table_entry_write(hw->slot_id, dtb_data->queueid, 1, &entry);<br />     if (ret) {<br />-        PMD_DRV_LOG(ERR, "unicast_table_set_failed:%d", hw->vfid);<br />+        PMD_DRV_LOG(ERR, "unicast_table_set_failed:%d", vfid);<br />         return -ret;<br />     }<br />  <br />     ret = zxdh_get_port_attr(hw, vport, &port_attr);<br />     if (ret) {<br />-        PMD_DRV_LOG(ERR, "port_attr_table_get_failed:%d", hw->vfid);<br />+        PMD_DRV_LOG(ERR, "port_attr_table_get_failed:%d", vfid);<br />         return -ret;<br />     }<br />  <br />     port_attr.promisc_enable = enable;<br />     ret = zxdh_set_port_attr(hw, vport, &port_attr);<br />     if (ret) {<br />-        PMD_DRV_LOG(ERR, "port_attr_table_set_failed:%d", hw->vfid);<br />+        PMD_DRV_LOG(ERR, "port_attr_table_set_failed:%d", vfid);<br />         return -ret;<br />     }<br />  <br />--  <br />2.27.0<br />