From 7d2d64c76cb5b0ebacbb989cb8055d3ce2e4c3a1 Mon Sep 17 00:00:00 2001 From: Kalesh AP Date: Thu, 18 Jul 2019 09:06:00 +0530 Subject: [PATCH] net/bnxt: fix device init error path 1. bnxt_dev_init() invokes bnxt_dev_uninit() on failure. So there is no need to do individual function cleanups in failure path. 2. rearrange the check for primary process to remove an unwanted goto. 3. fix to invoke bnxt_hwrm_func_buf_unrgtr() in bnxt_dev_uninit() when it is needed. Fixes: b7778e8a1c00 ("net/bnxt: refactor to properly allocate resources for PF/VF") Cc: stable@dpdk.org Signed-off-by: Kalesh AP Reviewed-by: Somnath Kotur --- drivers/net/bnxt/bnxt_ethdev.c | 28 ++++++++++++++-------------- drivers/net/bnxt/bnxt_hwrm.c | 3 +++ 2 files changed, 17 insertions(+), 14 deletions(-) diff --git a/drivers/net/bnxt/bnxt_ethdev.c b/drivers/net/bnxt/bnxt_ethdev.c index 70d24494a1..4d1c9adb9e 100644 --- a/drivers/net/bnxt/bnxt_ethdev.c +++ b/drivers/net/bnxt/bnxt_ethdev.c @@ -3853,8 +3853,16 @@ bnxt_dev_init(struct rte_eth_dev *eth_dev) bp->dev_stopped = 1; + eth_dev->dev_ops = &bnxt_dev_ops; + eth_dev->rx_pkt_burst = &bnxt_recv_pkts; + eth_dev->tx_pkt_burst = &bnxt_xmit_pkts; + + /* + * For secondary processes, we don't initialise any further + * as primary has already done this work. + */ if (rte_eal_process_type() != RTE_PROC_PRIMARY) - goto skip_init; + return 0; if (bnxt_vf_pciid(pci_dev->id.device_id)) bp->flags |= BNXT_FLAG_VF; @@ -3871,12 +3879,6 @@ bnxt_dev_init(struct rte_eth_dev *eth_dev) "Board initialization failed rc: %x\n", rc); goto error; } -skip_init: - eth_dev->dev_ops = &bnxt_dev_ops; - eth_dev->rx_pkt_burst = &bnxt_recv_pkts; - eth_dev->tx_pkt_burst = &bnxt_xmit_pkts; - if (rte_eal_process_type() != RTE_PROC_PRIMARY) - return 0; rc = bnxt_alloc_hwrm_resources(bp); if (rc) { @@ -4021,21 +4023,16 @@ skip_init: rc = bnxt_alloc_mem(bp); if (rc) - goto error_free_int; + goto error_free; rc = bnxt_request_int(bp); if (rc) - goto error_free_int; + goto error_free; bnxt_init_nic(bp); return 0; -error_free_int: - bnxt_disable_int(bp); - bnxt_hwrm_func_buf_unrgtr(bp); - bnxt_free_int(bp); - bnxt_free_mem(bp); error_free: bnxt_dev_uninit(eth_dev); error: @@ -4055,6 +4052,9 @@ bnxt_dev_uninit(struct rte_eth_dev *eth_dev) bnxt_disable_int(bp); bnxt_free_int(bp); bnxt_free_mem(bp); + + bnxt_hwrm_func_buf_unrgtr(bp); + if (bp->grp_info != NULL) { rte_free(bp->grp_info); bp->grp_info = NULL; diff --git a/drivers/net/bnxt/bnxt_hwrm.c b/drivers/net/bnxt/bnxt_hwrm.c index 9c5e5ad772..27c4f2d88b 100644 --- a/drivers/net/bnxt/bnxt_hwrm.c +++ b/drivers/net/bnxt/bnxt_hwrm.c @@ -3199,6 +3199,9 @@ int bnxt_hwrm_func_buf_unrgtr(struct bnxt *bp) struct hwrm_func_buf_unrgtr_input req = {.req_type = 0 }; struct hwrm_func_buf_unrgtr_output *resp = bp->hwrm_cmd_resp_addr; + if (!(BNXT_PF(bp) && bp->pdev->max_vfs)) + return 0; + HWRM_PREP(req, FUNC_BUF_UNRGTR, BNXT_USE_CHIMP_MB); rc = bnxt_hwrm_send_message(bp, &req, sizeof(req), BNXT_USE_CHIMP_MB); -- 2.20.1