From: Kalesh AP <kalesh-anakkur.pura...@broadcom.com> VF driver should not fail probe if the host PF driver has not assigned any MAC address for the VF. It should generate a random MAC address and configure the MAC and then continue probing the device.
Fixes: be160484a48d ("net/bnxt: check if MAC address is all zeros") Signed-off-by: Kalesh AP <kalesh-anakkur.pura...@broadcom.com> Reviewed-by: Ajit Khaparde <ajit.khapa...@broadcom.com> --- drivers/net/bnxt/bnxt_ethdev.c | 62 +++++++++++++++++++++++----------- drivers/net/bnxt/bnxt_hwrm.c | 25 ++++++++++++++ drivers/net/bnxt/bnxt_hwrm.h | 1 + drivers/net/bnxt/bnxt_util.c | 11 ++++++ drivers/net/bnxt/bnxt_util.h | 1 + 5 files changed, 80 insertions(+), 20 deletions(-) diff --git a/drivers/net/bnxt/bnxt_ethdev.c b/drivers/net/bnxt/bnxt_ethdev.c index 1ce6e81e5..523a8f1c5 100644 --- a/drivers/net/bnxt/bnxt_ethdev.c +++ b/drivers/net/bnxt/bnxt_ethdev.c @@ -3753,6 +3753,46 @@ static int bnxt_alloc_stats_mem(struct bnxt *bp) return 0; } +static int bnxt_setup_mac_addr(struct rte_eth_dev *eth_dev) +{ + struct bnxt *bp = eth_dev->data->dev_private; + int rc = 0; + + eth_dev->data->mac_addrs = rte_zmalloc("bnxt_mac_addr_tbl", + RTE_ETHER_ADDR_LEN * + bp->max_l2_ctx, + 0); + if (eth_dev->data->mac_addrs == NULL) { + PMD_DRV_LOG(ERR, "Failed to alloc MAC addr tbl\n"); + return -ENOMEM; + } + + if (bnxt_check_zero_bytes(bp->dflt_mac_addr, RTE_ETHER_ADDR_LEN)) { + if (BNXT_PF(bp)) + return -EINVAL; + + /* Generate a random MAC address, if none was assigned by PF */ + PMD_DRV_LOG(INFO, "VF MAC address not assigned by Host PF\n"); + bnxt_eth_hw_addr_random(bp->mac_addr); + PMD_DRV_LOG(INFO, + "Assign random MAC:%02X:%02X:%02X:%02X:%02X:%02X\n", + bp->mac_addr[0], bp->mac_addr[1], bp->mac_addr[2], + bp->mac_addr[3], bp->mac_addr[4], bp->mac_addr[5]); + + rc = bnxt_hwrm_set_mac(bp); + if (!rc) + memcpy(&bp->eth_dev->data->mac_addrs[0], bp->mac_addr, + RTE_ETHER_ADDR_LEN); + return rc; + } + + /* Copy the permanent MAC from the FUNC_QCAPS response */ + memcpy(bp->mac_addr, bp->dflt_mac_addr, RTE_ETHER_ADDR_LEN); + memcpy(ð_dev->data->mac_addrs[0], bp->mac_addr, RTE_ETHER_ADDR_LEN); + + return rc; +} + #define ALLOW_FUNC(x) \ { \ uint32_t arg = (x); \ @@ -3840,28 +3880,10 @@ bnxt_dev_init(struct rte_eth_dev *eth_dev) rc = -EBUSY; goto error_free; } - eth_dev->data->mac_addrs = rte_zmalloc("bnxt_mac_addr_tbl", - RTE_ETHER_ADDR_LEN * bp->max_l2_ctx, 0); - if (eth_dev->data->mac_addrs == NULL) { - PMD_DRV_LOG(ERR, - "Failed to alloc %u bytes needed to store MAC addr tbl", - RTE_ETHER_ADDR_LEN * bp->max_l2_ctx); - rc = -ENOMEM; - goto error_free; - } - if (bnxt_check_zero_bytes(bp->dflt_mac_addr, RTE_ETHER_ADDR_LEN)) { - PMD_DRV_LOG(ERR, - "Invalid MAC addr %02X:%02X:%02X:%02X:%02X:%02X\n", - bp->dflt_mac_addr[0], bp->dflt_mac_addr[1], - bp->dflt_mac_addr[2], bp->dflt_mac_addr[3], - bp->dflt_mac_addr[4], bp->dflt_mac_addr[5]); - rc = -EINVAL; + rc = bnxt_setup_mac_addr(eth_dev); + if (rc) goto error_free; - } - /* Copy the permanent MAC from the qcap response address now. */ - memcpy(bp->mac_addr, bp->dflt_mac_addr, sizeof(bp->mac_addr)); - memcpy(ð_dev->data->mac_addrs[0], bp->mac_addr, RTE_ETHER_ADDR_LEN); /* THOR does not support ring groups. * But we will use the array to save RSS context IDs. diff --git a/drivers/net/bnxt/bnxt_hwrm.c b/drivers/net/bnxt/bnxt_hwrm.c index f691922bd..a9356c6b8 100644 --- a/drivers/net/bnxt/bnxt_hwrm.c +++ b/drivers/net/bnxt/bnxt_hwrm.c @@ -4607,3 +4607,28 @@ int bnxt_hwrm_tunnel_redirect_info(struct bnxt *bp, uint8_t tun_type, return rc; } + +int bnxt_hwrm_set_mac(struct bnxt *bp) +{ + struct hwrm_func_vf_cfg_output *resp = bp->hwrm_cmd_resp_addr; + struct hwrm_func_vf_cfg_input req = {0}; + int rc = 0; + + if (!BNXT_VF(bp)) + return 0; + + HWRM_PREP(req, FUNC_VF_CFG, BNXT_USE_CHIMP_MB); + + req.enables = + rte_cpu_to_le_32(HWRM_FUNC_VF_CFG_INPUT_ENABLES_DFLT_MAC_ADDR); + memcpy(req.dflt_mac_addr, bp->mac_addr, RTE_ETHER_ADDR_LEN); + + rc = bnxt_hwrm_send_message(bp, &req, sizeof(req), BNXT_USE_CHIMP_MB); + + HWRM_CHECK_RESULT(); + + memcpy(bp->dflt_mac_addr, bp->mac_addr, RTE_ETHER_ADDR_LEN); + HWRM_UNLOCK(); + + return rc; +} diff --git a/drivers/net/bnxt/bnxt_hwrm.h b/drivers/net/bnxt/bnxt_hwrm.h index e35462cb4..37aaa1a9e 100644 --- a/drivers/net/bnxt/bnxt_hwrm.h +++ b/drivers/net/bnxt/bnxt_hwrm.h @@ -196,4 +196,5 @@ int bnxt_hwrm_tunnel_redirect_free(struct bnxt *bp, uint8_t type); int bnxt_hwrm_tunnel_redirect_query(struct bnxt *bp, uint32_t *type); int bnxt_hwrm_tunnel_redirect_info(struct bnxt *bp, uint8_t tun_type, uint16_t *dst_fid); +int bnxt_hwrm_set_mac(struct bnxt *bp); #endif diff --git a/drivers/net/bnxt/bnxt_util.c b/drivers/net/bnxt/bnxt_util.c index 7d3342719..dda40af28 100644 --- a/drivers/net/bnxt/bnxt_util.c +++ b/drivers/net/bnxt/bnxt_util.c @@ -4,6 +4,7 @@ */ #include <inttypes.h> +#include <rte_ether.h> #include "bnxt_util.h" @@ -16,3 +17,13 @@ int bnxt_check_zero_bytes(const uint8_t *bytes, int len) return 0; return 1; } + +void bnxt_eth_hw_addr_random(uint8_t *mac_addr) +{ + rte_eth_random_addr(mac_addr); + + /* Set Organizationally Unique Identifier (OUI) prefix */ + mac_addr[0] = 0x00; + mac_addr[1] = 0x0a; + mac_addr[2] = 0xf7; +} diff --git a/drivers/net/bnxt/bnxt_util.h b/drivers/net/bnxt/bnxt_util.h index 2378833cc..9f1868a78 100644 --- a/drivers/net/bnxt/bnxt_util.h +++ b/drivers/net/bnxt/bnxt_util.h @@ -7,5 +7,6 @@ #define _BNXT_UTIL_H_ int bnxt_check_zero_bytes(const uint8_t *bytes, int len); +void bnxt_eth_hw_addr_random(uint8_t *mac_addr); #endif /* _BNXT_UTIL_H_ */ -- 2.20.1 (Apple Git-117)