qlcnic_alloc_mbx_args() may fail due to failure in memory allocation.
This patch checks for failure of qlcnic_alloc_mbx_args() to avoid
potential invalid memory access.
Signed-off-by: Shahed Shaikh <shahed.shaikh@qlogic.com>
Signed-off-by: Jitendra Kalsaria <jitendra.kalsaria@qlogic.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
        int i, err = 0;
 
        adapter = container_of(work, struct qlcnic_adapter, idc_aen_work.work);
-       qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_IDC_ACK);
+       err = qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_IDC_ACK);
+       if (err)
+               return;
 
        for (i = 1; i < QLC_83XX_MBX_AEN_CNT; i++)
                cmd.req.arg[i] = adapter->ahw->mbox_aen[i];
                cap |= QLC_83XX_FW_CAP_LRO_MSS;
 
        /* set mailbox hdr and capabilities */
-       qlcnic_alloc_mbx_args(&cmd, adapter,
-                             QLCNIC_CMD_CREATE_RX_CTX);
+       err = qlcnic_alloc_mbx_args(&cmd, adapter,
+                                   QLCNIC_CMD_CREATE_RX_CTX);
+       if (err)
+               return err;
 
        if (qlcnic_sriov_pf_check(adapter) || qlcnic_sriov_vf_check(adapter))
                cmd.req.arg[0] |= (0x3 << 29);
                mbx.intr_id = 0xffff;
        mbx.src = 0;
 
-       qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_CREATE_TX_CTX);
+       err = qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_CREATE_TX_CTX);
+       if (err)
+               return err;
 
        if (qlcnic_sriov_pf_check(adapter) || qlcnic_sriov_vf_check(adapter))
                cmd.req.arg[0] |= (0x3 << 29);
 
        if (state) {
                /* Get LED configuration */
-               qlcnic_alloc_mbx_args(&cmd, adapter,
-                                     QLCNIC_CMD_GET_LED_CONFIG);
+               status = qlcnic_alloc_mbx_args(&cmd, adapter,
+                                              QLCNIC_CMD_GET_LED_CONFIG);
+               if (status)
+                       return status;
+
                status = qlcnic_issue_cmd(adapter, &cmd);
                if (status) {
                        dev_err(&adapter->pdev->dev,
                /* Set LED Configuration */
                mbx_in = (LSW(QLC_83XX_LED_CONFIG) << 16) |
                          LSW(QLC_83XX_LED_CONFIG);
-               qlcnic_alloc_mbx_args(&cmd, adapter,
-                                     QLCNIC_CMD_SET_LED_CONFIG);
+               status = qlcnic_alloc_mbx_args(&cmd, adapter,
+                                              QLCNIC_CMD_SET_LED_CONFIG);
+               if (status)
+                       return status;
+
                cmd.req.arg[1] = mbx_in;
                cmd.req.arg[2] = mbx_in;
                cmd.req.arg[3] = mbx_in;
 
        } else {
                /* Restoring default LED configuration */
-               qlcnic_alloc_mbx_args(&cmd, adapter,
-                                     QLCNIC_CMD_SET_LED_CONFIG);
+               status = qlcnic_alloc_mbx_args(&cmd, adapter,
+                                              QLCNIC_CMD_SET_LED_CONFIG);
+               if (status)
+                       return status;
+
                cmd.req.arg[1] = adapter->ahw->mbox_reg[0];
                cmd.req.arg[2] = adapter->ahw->mbox_reg[1];
                cmd.req.arg[3] = adapter->ahw->mbox_reg[2];
                return;
 
        if (enable) {
-               qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_INIT_NIC_FUNC);
+               status = qlcnic_alloc_mbx_args(&cmd, adapter,
+                                              QLCNIC_CMD_INIT_NIC_FUNC);
+               if (status)
+                       return;
+
                cmd.req.arg[1] = BIT_0 | BIT_31;
        } else {
-               qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_STOP_NIC_FUNC);
+               status = qlcnic_alloc_mbx_args(&cmd, adapter,
+                                              QLCNIC_CMD_STOP_NIC_FUNC);
+               if (status)
+                       return;
+
                cmd.req.arg[1] = BIT_0 | BIT_31;
        }
        status = qlcnic_issue_cmd(adapter, &cmd);
        struct qlcnic_cmd_args cmd;
        int err;
 
-       qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_SET_PORT_CONFIG);
+       err = qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_SET_PORT_CONFIG);
+       if (err)
+               return err;
+
        cmd.req.arg[1] = adapter->ahw->port_config;
        err = qlcnic_issue_cmd(adapter, &cmd);
        if (err)
        struct qlcnic_cmd_args cmd;
        int err;
 
-       qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_GET_PORT_CONFIG);
+       err = qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_GET_PORT_CONFIG);
+       if (err)
+               return err;
+
        err = qlcnic_issue_cmd(adapter, &cmd);
        if (err)
                dev_info(&adapter->pdev->dev, "Get Port config failed\n");
        u32 temp;
        struct qlcnic_cmd_args cmd;
 
-       qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_GET_LINK_EVENT);
+       err = qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_GET_LINK_EVENT);
+       if (err)
+               return err;
+
        temp = adapter->recv_ctx->context_id << 16;
        cmd.req.arg[1] = (enable ? 1 : 0) | BIT_8 | temp;
        err = qlcnic_issue_cmd(adapter, &cmd);
        if (adapter->recv_ctx->state == QLCNIC_HOST_CTX_STATE_FREED)
                return -EIO;
 
-       qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_CONFIGURE_MAC_RX_MODE);
+       err = qlcnic_alloc_mbx_args(&cmd, adapter,
+                                   QLCNIC_CMD_CONFIGURE_MAC_RX_MODE);
+       if (err)
+               return err;
+
        qlcnic_83xx_set_interface_id_promisc(adapter, &temp);
        cmd.req.arg[1] = (mode ? 1 : 0) | temp;
        err = qlcnic_issue_cmd(adapter, &cmd);
        u32 temp = 0, temp_ip;
        struct qlcnic_cmd_args cmd;
 
-       qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_CONFIGURE_IP_ADDR);
+       err = qlcnic_alloc_mbx_args(&cmd, adapter,
+                                   QLCNIC_CMD_CONFIGURE_IP_ADDR);
+       if (err)
+               return;
+
        qlcnic_83xx_set_interface_id_ipaddr(adapter, &temp);
 
        if (mode == QLCNIC_IP_UP)
        if (adapter->recv_ctx->state == QLCNIC_HOST_CTX_STATE_FREED)
                return 0;
 
-       qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_CONFIGURE_HW_LRO);
+       err = qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_CONFIGURE_HW_LRO);
+       if (err)
+               return err;
+
        temp = adapter->recv_ctx->context_id << 16;
        arg1 = lro_bit_mask | temp;
        cmd.req.arg[1] = arg1;
                            0xae7b30b4d0ca2bcbULL, 0x43a38fb04167253dULL,
                            0x255b0ec26d5a56daULL };
 
-       qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_CONFIGURE_RSS);
-
+       err = qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_CONFIGURE_RSS);
+       if (err)
+               return err;
        /*
         * RSS request:
         * bits 3-0: Rsvd
        struct qlcnic_cmd_args cmd;
        u32 mac_low, mac_high;
 
-       qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_MAC_ADDRESS);
+       err = qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_MAC_ADDRESS);
+       if (err)
+               return err;
+
        qlcnic_83xx_configure_mac(adapter, mac, QLCNIC_GET_CURRENT_MAC, &cmd);
        err = qlcnic_issue_cmd(adapter, &cmd);
 
        if (adapter->recv_ctx->state == QLCNIC_HOST_CTX_STATE_FREED)
                return;
 
-       qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_CONFIG_INTR_COAL);
+       err = qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_CONFIG_INTR_COAL);
+       if (err)
+               return;
+
        if (coal->type == QLCNIC_INTR_COAL_TYPE_RX) {
                temp = adapter->recv_ctx->context_id;
                cmd.req.arg[1] = QLCNIC_INTR_COAL_TYPE_RX | temp << 16;
                return err;
        }
 
-       qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_TOGGLE_ESWITCH);
+       err = qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_TOGGLE_ESWITCH);
+       if (err)
+               return err;
+
        cmd.req.arg[1] = (port & 0xf) | BIT_4;
        err = qlcnic_issue_cmd(adapter, &cmd);
 
                return err;
        }
 
-       qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_SET_NIC_INFO);
+       err = qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_SET_NIC_INFO);
+       if (err)
+               return err;
+
        cmd.req.arg[1] = (nic->pci_func << 16);
        cmd.req.arg[2] = 0x1 << 16;
        cmd.req.arg[3] = nic->phys_port | (nic->switch_mode << 16);
        u8 op = 0;
        struct qlcnic_cmd_args cmd;
 
-       qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_GET_NIC_INFO);
+       err = qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_GET_NIC_INFO);
+       if (err)
+               return err;
+
        if (func_id != adapter->ahw->pci_func) {
                temp = func_id << 16;
                cmd.req.arg[1] = op | BIT_31 | temp;
        int i, err = 0, j = 0;
        u32 temp;
 
-       qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_GET_PCI_INFO);
+       err = qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_GET_PCI_INFO);
+       if (err)
+               return err;
+
        err = qlcnic_issue_cmd(adapter, &cmd);
 
        ahw->act_pci_func = 0;
        struct qlcnic_cmd_args cmd;
 
        max_ints = adapter->ahw->num_msix - 1;
-       qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_CONFIG_INTRPT);
+       err = qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_CONFIG_INTRPT);
+       if (err)
+               return err;
+
        cmd.req.arg[1] = max_ints;
 
        if (qlcnic_sriov_vf_check(adapter))
                dev_info(&adapter->pdev->dev, "link state down\n");
                return config;
        }
-       qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_GET_LINK_STATUS);
+
+       err = qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_GET_LINK_STATUS);
+       if (err)
+               return err;
+
        err = qlcnic_issue_cmd(adapter, &cmd);
        if (err) {
                dev_info(&adapter->pdev->dev,
        struct net_device *netdev = adapter->netdev;
        int ret = 0;
 
-       qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_GET_STATISTICS);
+       ret = qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_GET_STATISTICS);
+       if (ret)
+               return;
        /* Get Tx stats */
        cmd.req.arg[1] = BIT_1 | (adapter->tx_ring->ctx_id << 16);
        cmd.rsp.num = QLC_83XX_TX_STAT_REGS;
                goto fail_diag_irq;
 
        ahw->diag_cnt = 0;
-       qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_INTRPT_TEST);
+       ret = qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_INTRPT_TEST);
+       if (ret)
+               goto fail_diag_irq;
 
        if (adapter->flags & QLCNIC_MSIX_ENABLED)
                intrpt_id = ahw->intr_tbl[0].id;
 
        audit_mask = QLCRDX(adapter->ahw, QLC_83XX_IDC_DRV_AUDIT);
 
        if (IS_QLC_83XX_USED(adapter, presence_mask, audit_mask)) {
-               qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_STOP_NIC_FUNC);
+               status = qlcnic_alloc_mbx_args(&cmd, adapter,
+                                              QLCNIC_CMD_STOP_NIC_FUNC);
+               if (status)
+                       return;
+
                cmd.req.arg[1] = BIT_31;
                status = qlcnic_issue_cmd(adapter, &cmd);
                if (status)
 
                 _QLCNIC_LINUX_MAJOR, _QLCNIC_LINUX_MINOR,
                 _QLCNIC_LINUX_SUBVERSION);
 
-       qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_SET_DRV_VER);
+       err = qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_SET_DRV_VER);
+       if (err)
+               return err;
+
        memcpy(&arg1, drv_string, sizeof(u32));
        memcpy(&arg2, drv_string + 4, sizeof(u32));
        memcpy(&arg3, drv_string + 8, sizeof(u32));
 
        if (recv_ctx->state != QLCNIC_HOST_CTX_STATE_ACTIVE)
                return err;
-       qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_SET_MTU);
+       err = qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_SET_MTU);
+       if (err)
+               return err;
+
        cmd.req.arg[1] = recv_ctx->context_id;
        cmd.req.arg[2] = mtu;
 
        }
 
        phys_addr = hostrq_phys_addr;
-       qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_CREATE_RX_CTX);
+       err = qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_CREATE_RX_CTX);
+       if (err)
+               goto out_free_rsp;
+
        cmd.req.arg[1] = MSD(phys_addr);
        cmd.req.arg[2] = LSD(phys_addr);
        cmd.req.arg[3] = rq_size;
        recv_ctx->context_id = le16_to_cpu(prsp->context_id);
        recv_ctx->virt_port = prsp->virt_port;
 
+       qlcnic_free_mbx_args(&cmd);
 out_free_rsp:
        dma_free_coherent(&adapter->pdev->dev, rsp_size, prsp,
-               cardrsp_phys_addr);
-       qlcnic_free_mbx_args(&cmd);
+                         cardrsp_phys_addr);
 out_free_rq:
        dma_free_coherent(&adapter->pdev->dev, rq_size, prq, hostrq_phys_addr);
        return err;
        struct qlcnic_cmd_args cmd;
        struct qlcnic_recv_context *recv_ctx = adapter->recv_ctx;
 
-       qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_DESTROY_RX_CTX);
+       err = qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_DESTROY_RX_CTX);
+       if (err)
+               return;
+
        cmd.req.arg[1] = recv_ctx->context_id;
        err = qlcnic_issue_cmd(adapter, &cmd);
        if (err)
 
        phys_addr = rq_phys_addr;
 
-       qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_CREATE_TX_CTX);
+       err = qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_CREATE_TX_CTX);
+       if (err)
+               goto out_free_rsp;
+
        cmd.req.arg[1] = MSD(phys_addr);
        cmd.req.arg[2] = LSD(phys_addr);
        cmd.req.arg[3] = rq_size;
                err = -EIO;
        }
 
+       qlcnic_free_mbx_args(&cmd);
+
+out_free_rsp:
        dma_free_coherent(&adapter->pdev->dev, rsp_size, rsp_addr,
                          rsp_phys_addr);
-
 out_free_rq:
        dma_free_coherent(&adapter->pdev->dev, rq_size, rq_addr, rq_phys_addr);
-       qlcnic_free_mbx_args(&cmd);
 
        return err;
 }
                                   struct qlcnic_host_tx_ring *tx_ring)
 {
        struct qlcnic_cmd_args cmd;
+       int ret;
 
-       qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_DESTROY_TX_CTX);
+       ret = qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_DESTROY_TX_CTX);
+       if (ret)
+               return;
 
        cmd.req.arg[1] = tx_ring->ctx_id;
        if (qlcnic_issue_cmd(adapter, &cmd))
        int err;
        struct qlcnic_cmd_args cmd;
 
-       qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_CONFIG_PORT);
+       err = qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_CONFIG_PORT);
+       if (err)
+               return err;
+
        cmd.req.arg[1] = config;
        err = qlcnic_issue_cmd(adapter, &cmd);
        qlcnic_free_mbx_args(&cmd);
        struct qlcnic_cmd_args cmd;
        u32 mac_low, mac_high;
 
-       qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_MAC_ADDRESS);
+       err = qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_MAC_ADDRESS);
+       if (err)
+               return err;
+
        cmd.req.arg[1] = adapter->ahw->pci_func | BIT_8;
        err = qlcnic_issue_cmd(adapter, &cmd);
 
 
        nic_info = nic_info_addr;
 
-       qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_GET_NIC_INFO);
+       err = qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_GET_NIC_INFO);
+       if (err)
+               goto out_free_dma;
+
        cmd.req.arg[1] = MSD(nic_dma_t);
        cmd.req.arg[2] = LSD(nic_dma_t);
        cmd.req.arg[3] = (func_id << 16 | nic_size);
                npar_info->max_mtu = le16_to_cpu(nic_info->max_mtu);
        }
 
+       qlcnic_free_mbx_args(&cmd);
+out_free_dma:
        dma_free_coherent(&adapter->pdev->dev, nic_size, nic_info_addr,
                          nic_dma_t);
-       qlcnic_free_mbx_args(&cmd);
 
        return err;
 }
        nic_info->min_tx_bw = cpu_to_le16(nic->min_tx_bw);
        nic_info->max_tx_bw = cpu_to_le16(nic->max_tx_bw);
 
-       qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_SET_NIC_INFO);
+       err = qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_SET_NIC_INFO);
+       if (err)
+               goto out_free_dma;
+
        cmd.req.arg[1] = MSD(nic_dma_t);
        cmd.req.arg[2] = LSD(nic_dma_t);
        cmd.req.arg[3] = ((nic->pci_func << 16) | nic_size);
                err = -EIO;
        }
 
-       dma_free_coherent(&adapter->pdev->dev, nic_size, nic_info_addr,
-               nic_dma_t);
        qlcnic_free_mbx_args(&cmd);
+out_free_dma:
+       dma_free_coherent(&adapter->pdev->dev, nic_size, nic_info_addr,
+                         nic_dma_t);
 
        return err;
 }
                return -ENOMEM;
 
        npar = pci_info_addr;
-       qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_GET_PCI_INFO);
+       err = qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_GET_PCI_INFO);
+       if (err)
+               goto out_free_dma;
+
        cmd.req.arg[1] = MSD(pci_info_dma_t);
        cmd.req.arg[2] = LSD(pci_info_dma_t);
        cmd.req.arg[3] = pci_size;
                err = -EIO;
        }
 
+       qlcnic_free_mbx_args(&cmd);
+out_free_dma:
        dma_free_coherent(&adapter->pdev->dev, pci_size, pci_info_addr,
                pci_info_dma_t);
-       qlcnic_free_mbx_args(&cmd);
 
        return err;
 }
        arg1 = id | (enable_mirroring ? BIT_4 : 0);
        arg1 |= pci_func << 8;
 
-       qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_SET_PORTMIRRORING);
+       err = qlcnic_alloc_mbx_args(&cmd, adapter,
+                                   QLCNIC_CMD_SET_PORTMIRRORING);
+       if (err)
+               return err;
+
        cmd.req.arg[1] = arg1;
        err = qlcnic_issue_cmd(adapter, &cmd);
 
        arg1 = func | QLCNIC_STATS_VERSION << 8 | QLCNIC_STATS_PORT << 12;
        arg1 |= rx_tx << 15 | stats_size << 16;
 
-       qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_GET_ESWITCH_STATS);
+       err = qlcnic_alloc_mbx_args(&cmd, adapter,
+                                   QLCNIC_CMD_GET_ESWITCH_STATS);
+       if (err)
+               goto out_free_dma;
+
        cmd.req.arg[1] = arg1;
        cmd.req.arg[2] = MSD(stats_dma_t);
        cmd.req.arg[3] = LSD(stats_dma_t);
                esw_stats->numbytes = le64_to_cpu(stats->numbytes);
        }
 
-       dma_free_coherent(&adapter->pdev->dev, stats_size, stats_addr,
-               stats_dma_t);
        qlcnic_free_mbx_args(&cmd);
+out_free_dma:
+       dma_free_coherent(&adapter->pdev->dev, stats_size, stats_addr,
+                         stats_dma_t);
 
        return err;
 }
        if (!stats_addr)
                return -ENOMEM;
 
-       qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_GET_MAC_STATS);
+       err = qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_GET_MAC_STATS);
+       if (err)
+               goto out_free_dma;
+
        cmd.req.arg[1] = stats_size << 16;
        cmd.req.arg[2] = MSD(stats_dma_t);
        cmd.req.arg[3] = LSD(stats_dma_t);
                        "%s: Get mac stats failed, err=%d.\n", __func__, err);
        }
 
-       dma_free_coherent(&adapter->pdev->dev, stats_size, stats_addr,
-               stats_dma_t);
-
        qlcnic_free_mbx_args(&cmd);
 
+out_free_dma:
+       dma_free_coherent(&adapter->pdev->dev, stats_size, stats_addr,
+                         stats_dma_t);
+
        return err;
 }
 
        arg1 = port | QLCNIC_STATS_VERSION << 8 | func_esw << 12;
        arg1 |= BIT_14 | rx_tx << 15;
 
-       qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_GET_ESWITCH_STATS);
+       err = qlcnic_alloc_mbx_args(&cmd, adapter,
+                                   QLCNIC_CMD_GET_ESWITCH_STATS);
+       if (err)
+               return err;
+
        cmd.req.arg[1] = arg1;
        err = qlcnic_issue_cmd(adapter, &cmd);
        qlcnic_free_mbx_args(&cmd);
        struct device *dev = &adapter->pdev->dev;
        struct qlcnic_cmd_args cmd;
        u8 pci_func = *arg1 >> 8;
-       int err = -EIO;
+       int err;
+
+       err = qlcnic_alloc_mbx_args(&cmd, adapter,
+                                   QLCNIC_CMD_GET_ESWITCH_PORT_CONFIG);
+       if (err)
+               return err;
 
-       qlcnic_alloc_mbx_args(&cmd, adapter,
-                             QLCNIC_CMD_GET_ESWITCH_PORT_CONFIG);
        cmd.req.arg[1] = *arg1;
        err = qlcnic_issue_cmd(adapter, &cmd);
        *arg1 = cmd.rsp.arg[1];
                return err;
        }
 
-       qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_CONFIGURE_ESWITCH);
+       err = qlcnic_alloc_mbx_args(&cmd, adapter,
+                                   QLCNIC_CMD_CONFIGURE_ESWITCH);
+       if (err)
+               return err;
+
        cmd.req.arg[1] = arg1;
        cmd.req.arg[2] = arg2;
        err = qlcnic_issue_cmd(adapter, &cmd);
 
                goto clear_diag_irq;
 
        ahw->diag_cnt = 0;
-       qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_INTRPT_TEST);
+       ret = qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_INTRPT_TEST);
+       if (ret)
+               goto free_diag_res;
 
        cmd.req.arg[1] = ahw->pci_func;
        ret = qlcnic_issue_cmd(adapter, &cmd);
 
 done:
        qlcnic_free_mbx_args(&cmd);
+
+free_diag_res:
        qlcnic_diag_free_res(netdev, max_sds_rings);
 
 clear_diag_irq: