net/bnxt: fix VF probe when MAC address is zero
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: be160484a4
("net/bnxt: check if MAC address is all zeros")
Cc: stable@dpdk.org
Signed-off-by: Kalesh AP <kalesh-anakkur.purayil@broadcom.com>
Signed-off-by: Ajit Khaparde <ajit.khaparde@broadcom.com>
This commit is contained in:
parent
2c43b439e5
commit
72aaa312e9
@ -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.
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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_ */
|
||||
|
Loading…
Reference in New Issue
Block a user