net/qede/base: add OneView APIs
[dpdk.git] / drivers / net / qede / base / ecore_dev.c
index 283c65b..be68a12 100644 (file)
@@ -1,9 +1,7 @@
-/*
- * Copyright (c) 2016 QLogic Corporation.
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright (c) 2016 - 2018 Cavium Inc.
  * All rights reserved.
- * www.qlogic.com
- *
- * See LICENSE.qede_pmd for copyright and licensing details.
+ * www.cavium.com
  */
 
 #include "bcm_osal.h"
@@ -28,7 +26,6 @@
 #include "mcp_public.h"
 #include "ecore_iro.h"
 #include "nvm_cfg.h"
-#include "ecore_dev_api.h"
 #include "ecore_dcbx.h"
 #include "ecore_l2.h"
 
@@ -40,7 +37,7 @@
  * there's more than a single compiled ecore component in system].
  */
 static osal_spinlock_t qm_lock;
-static bool qm_lock_init;
+static u32 qm_lock_ref_cnt;
 
 /******************** Doorbell Recovery *******************/
 /* The doorbell recovery mechanism consists of a list of entries which represent
@@ -228,7 +225,8 @@ enum _ecore_status_t ecore_db_recovery_setup(struct ecore_hwfn *p_hwfn)
 
        OSAL_LIST_INIT(&p_hwfn->db_recovery_info.list);
 #ifdef CONFIG_ECORE_LOCK_ALLOC
-       OSAL_SPIN_LOCK_ALLOC(p_hwfn, &p_hwfn->db_recovery_info.lock);
+       if (OSAL_SPIN_LOCK_ALLOC(p_hwfn, &p_hwfn->db_recovery_info.lock))
+               return ECORE_NOMEM;
 #endif
        OSAL_SPIN_LOCK_INIT(&p_hwfn->db_recovery_info.lock);
        p_hwfn->db_recovery_info.db_recovery_counter = 0;
@@ -363,11 +361,6 @@ void ecore_db_recovery_execute(struct ecore_hwfn *p_hwfn,
 /* Derived */
 #define ECORE_MIN_PWM_REGION   (ECORE_WID_SIZE * ECORE_MIN_DPIS)
 
-enum BAR_ID {
-       BAR_ID_0,               /* used for GRC */
-       BAR_ID_1                /* Used for doorbells */
-};
-
 static u32 ecore_hw_bar_size(struct ecore_hwfn *p_hwfn,
                             struct ecore_ptt *p_ptt,
                             enum BAR_ID bar_id)
@@ -376,13 +369,8 @@ static u32 ecore_hw_bar_size(struct ecore_hwfn *p_hwfn,
                       PGLUE_B_REG_PF_BAR0_SIZE : PGLUE_B_REG_PF_BAR1_SIZE);
        u32 val;
 
-       if (IS_VF(p_hwfn->p_dev)) {
-               /* TODO - assume each VF hwfn has 64Kb for Bar0; Bar1 can be
-                * read from actual register, but we're currently not using
-                * it for actual doorbelling.
-                */
-               return 1 << 17;
-       }
+       if (IS_VF(p_hwfn->p_dev))
+               return ecore_vf_hw_bar_size(p_hwfn, bar_id);
 
        val = ecore_rd(p_hwfn, p_ptt, bar_reg);
        if (val)
@@ -422,7 +410,7 @@ void ecore_init_dp(struct ecore_dev *p_dev,
        }
 }
 
-void ecore_init_struct(struct ecore_dev *p_dev)
+enum _ecore_status_t ecore_init_struct(struct ecore_dev *p_dev)
 {
        u8 i;
 
@@ -434,9 +422,10 @@ void ecore_init_struct(struct ecore_dev *p_dev)
                p_hwfn->b_active = false;
 
 #ifdef CONFIG_ECORE_LOCK_ALLOC
-               OSAL_MUTEX_ALLOC(p_hwfn, &p_hwfn->dmae_info.mutex);
+               if (OSAL_SPIN_LOCK_ALLOC(p_hwfn, &p_hwfn->dmae_info.lock))
+                       goto handle_err;
 #endif
-               OSAL_MUTEX_INIT(&p_hwfn->dmae_info.mutex);
+               OSAL_SPIN_LOCK_INIT(&p_hwfn->dmae_info.lock);
        }
 
        /* hwfn 0 is always active */
@@ -444,6 +433,17 @@ void ecore_init_struct(struct ecore_dev *p_dev)
 
        /* set the default cache alignment to 128 (may be overridden later) */
        p_dev->cache_shift = 7;
+       return ECORE_SUCCESS;
+#ifdef CONFIG_ECORE_LOCK_ALLOC
+handle_err:
+       while (--i) {
+               struct ecore_hwfn *p_hwfn = OSAL_NULL;
+
+               p_hwfn = &p_dev->hwfns[i];
+               OSAL_SPIN_LOCK_DEALLOC(&p_hwfn->dmae_info.lock);
+       }
+       return ECORE_NOMEM;
+#endif
 }
 
 static void ecore_qm_info_free(struct ecore_hwfn *p_hwfn)
@@ -482,7 +482,7 @@ void ecore_resc_free(struct ecore_dev *p_dev)
                ecore_iov_free(p_hwfn);
                ecore_l2_free(p_hwfn);
                ecore_dmae_info_free(p_hwfn);
-               ecore_dcbx_info_free(p_hwfn, p_hwfn->p_dcbx_info);
+               ecore_dcbx_info_free(p_hwfn);
                /* @@@TBD Flush work-queue ? */
 
                /* destroy doorbell recovery mechanism */
@@ -511,11 +511,14 @@ static u32 ecore_get_pq_flags(struct ecore_hwfn *p_hwfn)
        /* feature flags */
        if (IS_ECORE_SRIOV(p_hwfn->p_dev))
                flags |= PQ_FLAGS_VFS;
+       if (IS_ECORE_PACING(p_hwfn))
+               flags |= PQ_FLAGS_RLS;
 
        /* protocol flags */
        switch (p_hwfn->hw_info.personality) {
        case ECORE_PCI_ETH:
-               flags |= PQ_FLAGS_MCOS;
+               if (!IS_ECORE_PACING(p_hwfn))
+                       flags |= PQ_FLAGS_MCOS;
                break;
        case ECORE_PCI_FCOE:
                flags |= PQ_FLAGS_OFLD;
@@ -524,11 +527,14 @@ static u32 ecore_get_pq_flags(struct ecore_hwfn *p_hwfn)
                flags |= PQ_FLAGS_ACK | PQ_FLAGS_OOO | PQ_FLAGS_OFLD;
                break;
        case ECORE_PCI_ETH_ROCE:
-               flags |= PQ_FLAGS_MCOS | PQ_FLAGS_OFLD;
+               flags |= PQ_FLAGS_OFLD | PQ_FLAGS_LLT;
+               if (!IS_ECORE_PACING(p_hwfn))
+                       flags |= PQ_FLAGS_MCOS;
                break;
        case ECORE_PCI_ETH_IWARP:
-               flags |= PQ_FLAGS_MCOS | PQ_FLAGS_ACK | PQ_FLAGS_OOO |
-                        PQ_FLAGS_OFLD;
+               flags |= PQ_FLAGS_ACK | PQ_FLAGS_OOO | PQ_FLAGS_OFLD;
+               if (!IS_ECORE_PACING(p_hwfn))
+                       flags |= PQ_FLAGS_MCOS;
                break;
        default:
                DP_ERR(p_hwfn, "unknown personality %d\n",
@@ -732,6 +738,7 @@ static void ecore_init_qm_pq(struct ecore_hwfn *p_hwfn,
                       "pq overflow! pq %d, max pq %d\n", pq_idx, max_pq);
 
        /* init pq params */
+       qm_info->qm_pq_params[pq_idx].port_id = p_hwfn->port_id;
        qm_info->qm_pq_params[pq_idx].vport_id = qm_info->start_vport +
                                                 qm_info->num_vports;
        qm_info->qm_pq_params[pq_idx].tc_id = tc;
@@ -834,7 +841,7 @@ u16 ecore_get_cm_pq_idx_vf(struct ecore_hwfn *p_hwfn, u16 vf)
        return ecore_get_cm_pq_idx(p_hwfn, PQ_FLAGS_VFS) + vf;
 }
 
-u16 ecore_get_cm_pq_idx_rl(struct ecore_hwfn *p_hwfn, u8 rl)
+u16 ecore_get_cm_pq_idx_rl(struct ecore_hwfn *p_hwfn, u16 rl)
 {
        u16 max_rl = ecore_init_qm_get_num_pf_rls(p_hwfn);
 
@@ -844,6 +851,23 @@ u16 ecore_get_cm_pq_idx_rl(struct ecore_hwfn *p_hwfn, u8 rl)
        return ecore_get_cm_pq_idx(p_hwfn, PQ_FLAGS_RLS) + rl;
 }
 
+u16 ecore_get_qm_vport_idx_rl(struct ecore_hwfn *p_hwfn, u16 rl)
+{
+       u16 start_pq, pq, qm_pq_idx;
+
+       pq = ecore_get_cm_pq_idx_rl(p_hwfn, rl);
+       start_pq = p_hwfn->qm_info.start_pq;
+       qm_pq_idx = pq - start_pq - CM_TX_PQ_BASE;
+
+       if (qm_pq_idx > p_hwfn->qm_info.num_pqs) {
+               DP_ERR(p_hwfn,
+                      "qm_pq_idx %d must be smaller than %d\n",
+                       qm_pq_idx, p_hwfn->qm_info.num_pqs);
+       }
+
+       return p_hwfn->qm_info.qm_pq_params[qm_pq_idx].vport_id;
+}
+
 /* Functions for creating specific types of pqs */
 static void ecore_init_qm_lb_pq(struct ecore_hwfn *p_hwfn)
 {
@@ -1036,10 +1060,9 @@ static void ecore_dp_init_qm_params(struct ecore_hwfn *p_hwfn)
        for (i = 0; i < qm_info->num_pqs; i++) {
                pq = &qm_info->qm_pq_params[i];
                DP_VERBOSE(p_hwfn, ECORE_MSG_HW,
-                          "pq idx %d, vport_id %d, tc %d, wrr_grp %d,"
-                          " rl_valid %d\n",
-                          qm_info->start_pq + i, pq->vport_id, pq->tc_id,
-                          pq->wrr_group, pq->rl_valid);
+                          "pq idx %d, port %d, vport_id %d, tc %d, wrr_grp %d, rl_valid %d\n",
+                          qm_info->start_pq + i, pq->port_id, pq->vport_id,
+                          pq->tc_id, pq->wrr_group, pq->rl_valid);
        }
 }
 
@@ -1094,7 +1117,7 @@ enum _ecore_status_t ecore_qm_reconf(struct ecore_hwfn *p_hwfn,
        ecore_init_clear_rt_data(p_hwfn);
 
        /* prepare QM portion of runtime array */
-       ecore_qm_init_pf(p_hwfn, p_ptt);
+       ecore_qm_init_pf(p_hwfn, p_ptt, false);
 
        /* activate init tool on runtime array */
        rc = ecore_init_run(p_hwfn, p_ptt, PHASE_QM_PF, p_hwfn->rel_pf_id,
@@ -1300,16 +1323,14 @@ enum _ecore_status_t ecore_resc_alloc(struct ecore_dev *p_dev)
                /* DMA info initialization */
                rc = ecore_dmae_info_alloc(p_hwfn);
                if (rc) {
-                       DP_NOTICE(p_hwfn, true,
-                                 "Failed to allocate memory for dmae_info"
-                                 " structure\n");
+                       DP_NOTICE(p_hwfn, false, "Failed to allocate memory for dmae_info structure\n");
                        goto alloc_err;
                }
 
                /* DCBX initialization */
                rc = ecore_dcbx_info_alloc(p_hwfn);
                if (rc) {
-                       DP_NOTICE(p_hwfn, true,
+                       DP_NOTICE(p_hwfn, false,
                                  "Failed to allocate memory for dcbx structure\n");
                        goto alloc_err;
                }
@@ -1318,7 +1339,7 @@ enum _ecore_status_t ecore_resc_alloc(struct ecore_dev *p_dev)
        p_dev->reset_stats = OSAL_ZALLOC(p_dev, GFP_KERNEL,
                                         sizeof(*p_dev->reset_stats));
        if (!p_dev->reset_stats) {
-               DP_NOTICE(p_dev, true, "Failed to allocate reset statistics\n");
+               DP_NOTICE(p_dev, false, "Failed to allocate reset statistics\n");
                goto alloc_no_mem;
        }
 
@@ -1669,7 +1690,8 @@ static enum _ecore_status_t ecore_hw_init_common(struct ecore_hwfn *p_hwfn,
 
        ecore_init_cache_line_size(p_hwfn, p_ptt);
 
-       rc = ecore_init_run(p_hwfn, p_ptt, PHASE_ENGINE, ANY_PHASE_ID, hw_mode);
+       rc = ecore_init_run(p_hwfn, p_ptt, PHASE_ENGINE, ECORE_PATH_ID(p_hwfn),
+                           hw_mode);
        if (rc != ECORE_SUCCESS)
                return rc;
 
@@ -1999,7 +2021,7 @@ ecore_hw_init_pf_doorbell_bar(struct ecore_hwfn *p_hwfn,
                /* Either EDPM is mandatory, or we are attempting to allocate a
                 * WID per CPU.
                 */
-               n_cpus = OSAL_NUM_ACTIVE_CPU();
+               n_cpus = OSAL_NUM_CPUS();
                rc = ecore_hw_init_dpi_size(p_hwfn, p_ptt, pwm_regsize, n_cpus);
        }
 
@@ -2171,6 +2193,11 @@ ecore_hw_init_pf(struct ecore_hwfn *p_hwfn,
        /* perform debug configuration when chip is out of reset */
        OSAL_BEFORE_PF_START((void *)p_hwfn->p_dev, p_hwfn->my_id);
 
+       /* Sanity check before the PF init sequence that uses DMAE */
+       rc = ecore_dmae_sanity(p_hwfn, p_ptt, "pf_phase");
+       if (rc)
+               return rc;
+
        /* PF Init sequence */
        rc = ecore_init_run(p_hwfn, p_ptt, PHASE_PF, rel_pf_id, hw_mode);
        if (rc)
@@ -2216,42 +2243,43 @@ ecore_hw_init_pf(struct ecore_hwfn *p_hwfn,
                        DP_NOTICE(p_hwfn, true,
                                  "Function start ramrod failed\n");
                } else {
-                       prs_reg = ecore_rd(p_hwfn, p_ptt, PRS_REG_SEARCH_TAG1);
-                       DP_VERBOSE(p_hwfn, ECORE_MSG_STORAGE,
-                                  "PRS_REG_SEARCH_TAG1: %x\n", prs_reg);
-
-                       if (p_hwfn->hw_info.personality == ECORE_PCI_FCOE) {
-                               ecore_wr(p_hwfn, p_ptt, PRS_REG_SEARCH_TAG1,
-                                        (1 << 2));
-                               ecore_wr(p_hwfn, p_ptt,
-                                   PRS_REG_PKT_LEN_STAT_TAGS_NOT_COUNTED_FIRST,
-                                   0x100);
-                       }
-                       DP_VERBOSE(p_hwfn, ECORE_MSG_STORAGE,
-                                  "PRS_REG_SEARCH registers after start PFn\n");
-                       prs_reg = ecore_rd(p_hwfn, p_ptt, PRS_REG_SEARCH_TCP);
-                       DP_VERBOSE(p_hwfn, ECORE_MSG_STORAGE,
-                                  "PRS_REG_SEARCH_TCP: %x\n", prs_reg);
-                       prs_reg = ecore_rd(p_hwfn, p_ptt, PRS_REG_SEARCH_UDP);
-                       DP_VERBOSE(p_hwfn, ECORE_MSG_STORAGE,
-                                  "PRS_REG_SEARCH_UDP: %x\n", prs_reg);
-                       prs_reg = ecore_rd(p_hwfn, p_ptt, PRS_REG_SEARCH_FCOE);
-                       DP_VERBOSE(p_hwfn, ECORE_MSG_STORAGE,
-                                  "PRS_REG_SEARCH_FCOE: %x\n", prs_reg);
-                       prs_reg = ecore_rd(p_hwfn, p_ptt, PRS_REG_SEARCH_ROCE);
-                       DP_VERBOSE(p_hwfn, ECORE_MSG_STORAGE,
-                                  "PRS_REG_SEARCH_ROCE: %x\n", prs_reg);
-                       prs_reg = ecore_rd(p_hwfn, p_ptt,
-                                          PRS_REG_SEARCH_TCP_FIRST_FRAG);
-                       DP_VERBOSE(p_hwfn, ECORE_MSG_STORAGE,
-                                  "PRS_REG_SEARCH_TCP_FIRST_FRAG: %x\n",
-                                  prs_reg);
-                       prs_reg = ecore_rd(p_hwfn, p_ptt, PRS_REG_SEARCH_TAG1);
-                       DP_VERBOSE(p_hwfn, ECORE_MSG_STORAGE,
-                                  "PRS_REG_SEARCH_TAG1: %x\n", prs_reg);
+                       return rc;
                }
+               prs_reg = ecore_rd(p_hwfn, p_ptt, PRS_REG_SEARCH_TAG1);
+               DP_VERBOSE(p_hwfn, ECORE_MSG_STORAGE,
+                               "PRS_REG_SEARCH_TAG1: %x\n", prs_reg);
+
+               if (p_hwfn->hw_info.personality == ECORE_PCI_FCOE) {
+                       ecore_wr(p_hwfn, p_ptt, PRS_REG_SEARCH_TAG1,
+                                       (1 << 2));
+                       ecore_wr(p_hwfn, p_ptt,
+                                PRS_REG_PKT_LEN_STAT_TAGS_NOT_COUNTED_FIRST,
+                                0x100);
+               }
+               DP_VERBOSE(p_hwfn, ECORE_MSG_STORAGE,
+                               "PRS_REG_SEARCH registers after start PFn\n");
+               prs_reg = ecore_rd(p_hwfn, p_ptt, PRS_REG_SEARCH_TCP);
+               DP_VERBOSE(p_hwfn, ECORE_MSG_STORAGE,
+                               "PRS_REG_SEARCH_TCP: %x\n", prs_reg);
+               prs_reg = ecore_rd(p_hwfn, p_ptt, PRS_REG_SEARCH_UDP);
+               DP_VERBOSE(p_hwfn, ECORE_MSG_STORAGE,
+                               "PRS_REG_SEARCH_UDP: %x\n", prs_reg);
+               prs_reg = ecore_rd(p_hwfn, p_ptt, PRS_REG_SEARCH_FCOE);
+               DP_VERBOSE(p_hwfn, ECORE_MSG_STORAGE,
+                               "PRS_REG_SEARCH_FCOE: %x\n", prs_reg);
+               prs_reg = ecore_rd(p_hwfn, p_ptt, PRS_REG_SEARCH_ROCE);
+               DP_VERBOSE(p_hwfn, ECORE_MSG_STORAGE,
+                               "PRS_REG_SEARCH_ROCE: %x\n", prs_reg);
+               prs_reg = ecore_rd(p_hwfn, p_ptt,
+                               PRS_REG_SEARCH_TCP_FIRST_FRAG);
+               DP_VERBOSE(p_hwfn, ECORE_MSG_STORAGE,
+                               "PRS_REG_SEARCH_TCP_FIRST_FRAG: %x\n",
+                               prs_reg);
+               prs_reg = ecore_rd(p_hwfn, p_ptt, PRS_REG_SEARCH_TAG1);
+               DP_VERBOSE(p_hwfn, ECORE_MSG_STORAGE,
+                               "PRS_REG_SEARCH_TAG1: %x\n", prs_reg);
        }
-       return rc;
+       return ECORE_SUCCESS;
 }
 
 enum _ecore_status_t ecore_pglueb_set_pfid_enable(struct ecore_hwfn *p_hwfn,
@@ -2293,28 +2321,16 @@ static void ecore_reset_mb_shadow(struct ecore_hwfn *p_hwfn,
                    p_hwfn->mcp_info->mfw_mb_length);
 }
 
-enum _ecore_status_t ecore_vf_start(struct ecore_hwfn *p_hwfn,
-                                   struct ecore_hw_init_params *p_params)
-{
-       if (p_params->p_tunn) {
-               ecore_vf_set_vf_start_tunn_update_param(p_params->p_tunn);
-               ecore_vf_pf_tunnel_param_update(p_hwfn, p_params->p_tunn);
-       }
-
-       p_hwfn->b_int_enabled = 1;
-
-       return ECORE_SUCCESS;
-}
-
 static void ecore_pglueb_clear_err(struct ecore_hwfn *p_hwfn,
-                                    struct ecore_ptt *p_ptt)
+                                  struct ecore_ptt *p_ptt)
 {
        ecore_wr(p_hwfn, p_ptt, PGLUE_B_REG_WAS_ERROR_PF_31_0_CLR,
                 1 << p_hwfn->abs_pf_id);
 }
 
-static void
-ecore_fill_load_req_params(struct ecore_load_req_params *p_load_req,
+static enum _ecore_status_t
+ecore_fill_load_req_params(struct ecore_hwfn *p_hwfn,
+                          struct ecore_load_req_params *p_load_req,
                           struct ecore_drv_load_params *p_drv_load)
 {
        /* Make sure that if ecore-client didn't provide inputs, all the
@@ -2326,15 +2342,64 @@ ecore_fill_load_req_params(struct ecore_load_req_params *p_load_req,
 
        OSAL_MEM_ZERO(p_load_req, sizeof(*p_load_req));
 
-       if (p_drv_load != OSAL_NULL) {
-               p_load_req->drv_role = p_drv_load->is_crash_kernel ?
-                                      ECORE_DRV_ROLE_KDUMP :
-                                      ECORE_DRV_ROLE_OS;
+       if (p_drv_load == OSAL_NULL)
+               goto out;
+
+       p_load_req->drv_role = p_drv_load->is_crash_kernel ?
+                              ECORE_DRV_ROLE_KDUMP :
+                              ECORE_DRV_ROLE_OS;
+       p_load_req->avoid_eng_reset = p_drv_load->avoid_eng_reset;
+       p_load_req->override_force_load = p_drv_load->override_force_load;
+
+       /* Old MFW versions don't support timeout values other than default and
+        * none, so these values are replaced according to the fall-back action.
+        */
+
+       if (p_drv_load->mfw_timeout_val == ECORE_LOAD_REQ_LOCK_TO_DEFAULT ||
+           p_drv_load->mfw_timeout_val == ECORE_LOAD_REQ_LOCK_TO_NONE ||
+           (p_hwfn->mcp_info->capabilities &
+            FW_MB_PARAM_FEATURE_SUPPORT_DRV_LOAD_TO)) {
                p_load_req->timeout_val = p_drv_load->mfw_timeout_val;
-               p_load_req->avoid_eng_reset = p_drv_load->avoid_eng_reset;
-               p_load_req->override_force_load =
-                       p_drv_load->override_force_load;
+               goto out;
+       }
+
+       switch (p_drv_load->mfw_timeout_fallback) {
+       case ECORE_TO_FALLBACK_TO_NONE:
+               p_load_req->timeout_val = ECORE_LOAD_REQ_LOCK_TO_NONE;
+               break;
+       case ECORE_TO_FALLBACK_TO_DEFAULT:
+               p_load_req->timeout_val = ECORE_LOAD_REQ_LOCK_TO_DEFAULT;
+               break;
+       case ECORE_TO_FALLBACK_FAIL_LOAD:
+               DP_NOTICE(p_hwfn, false,
+                         "Received %d as a value for MFW timeout while the MFW supports only default [%d] or none [%d]. Abort.\n",
+                         p_drv_load->mfw_timeout_val,
+                         ECORE_LOAD_REQ_LOCK_TO_DEFAULT,
+                         ECORE_LOAD_REQ_LOCK_TO_NONE);
+               return ECORE_ABORTED;
        }
+
+       DP_INFO(p_hwfn,
+               "Modified the MFW timeout value from %d to %s [%d] due to lack of MFW support\n",
+               p_drv_load->mfw_timeout_val,
+               (p_load_req->timeout_val == ECORE_LOAD_REQ_LOCK_TO_DEFAULT) ?
+               "default" : "none",
+               p_load_req->timeout_val);
+out:
+       return ECORE_SUCCESS;
+}
+
+enum _ecore_status_t ecore_vf_start(struct ecore_hwfn *p_hwfn,
+                                   struct ecore_hw_init_params *p_params)
+{
+       if (p_params->p_tunn) {
+               ecore_vf_set_vf_start_tunn_update_param(p_params->p_tunn);
+               ecore_vf_pf_tunnel_param_update(p_hwfn, p_params->p_tunn);
+       }
+
+       p_hwfn->b_int_enabled = 1;
+
+       return ECORE_SUCCESS;
 }
 
 enum _ecore_status_t ecore_hw_init(struct ecore_dev *p_dev,
@@ -2377,12 +2442,17 @@ enum _ecore_status_t ecore_hw_init(struct ecore_dev *p_dev,
                if (rc != ECORE_SUCCESS)
                        return rc;
 
-               ecore_fill_load_req_params(&load_req_params,
-                                          p_params->p_drv_load_params);
+               ecore_set_spq_block_timeout(p_hwfn, p_params->spq_timeout_ms);
+
+               rc = ecore_fill_load_req_params(p_hwfn, &load_req_params,
+                                               p_params->p_drv_load_params);
+               if (rc != ECORE_SUCCESS)
+                       return rc;
+
                rc = ecore_mcp_load_req(p_hwfn, p_hwfn->p_main_ptt,
                                        &load_req_params);
                if (rc != ECORE_SUCCESS) {
-                       DP_NOTICE(p_hwfn, true,
+                       DP_NOTICE(p_hwfn, false,
                                  "Failed sending a LOAD_REQ command\n");
                        return rc;
                }
@@ -2415,10 +2485,17 @@ enum _ecore_status_t ecore_hw_init(struct ecore_dev *p_dev,
                p_hwfn->first_on_engine = (load_code ==
                                           FW_MSG_CODE_DRV_LOAD_ENGINE);
 
-               if (!qm_lock_init) {
+               if (!qm_lock_ref_cnt) {
+#ifdef CONFIG_ECORE_LOCK_ALLOC
+                       rc = OSAL_SPIN_LOCK_ALLOC(p_hwfn, &qm_lock);
+                       if (rc) {
+                               DP_ERR(p_hwfn, "qm_lock allocation failed\n");
+                               goto qm_lock_fail;
+                       }
+#endif
                        OSAL_SPIN_LOCK_INIT(&qm_lock);
-                       qm_lock_init = true;
                }
+               ++qm_lock_ref_cnt;
 
                /* Clean up chip from previous driver if such remains exist.
                 * This is not needed when the PF is the first one on the
@@ -2434,9 +2511,8 @@ enum _ecore_status_t ecore_hw_init(struct ecore_dev *p_dev,
                        }
                }
 
-               /* Log and clean previous pglue_b errors if such exist */
-               ecore_pglueb_rbc_attn_handler(p_hwfn, p_hwfn->p_main_ptt);
-               ecore_pglueb_clear_err(p_hwfn, p_hwfn->p_main_ptt);
+               /* Log and clear previous pglue_b errors if such exist */
+               ecore_pglueb_rbc_attn_handler(p_hwfn, p_hwfn->p_main_ptt, true);
 
                /* Enable the PF's internal FID_enable in the PXP */
                rc = ecore_pglueb_set_pfid_enable(p_hwfn, p_hwfn->p_main_ptt,
@@ -2444,6 +2520,13 @@ enum _ecore_status_t ecore_hw_init(struct ecore_dev *p_dev,
                if (rc != ECORE_SUCCESS)
                        goto load_err;
 
+               /* Clear the pglue_b was_error indication.
+                * In E4 it must be done after the BME and the internal
+                * FID_enable for the PF are set, since VDMs may cause the
+                * indication to be set again.
+                */
+               ecore_pglueb_clear_err(p_hwfn, p_hwfn->p_main_ptt);
+
                switch (load_code) {
                case FW_MSG_CODE_DRV_LOAD_ENGINE:
                        rc = ecore_hw_init_common(p_hwfn, p_hwfn->p_main_ptt,
@@ -2473,15 +2556,23 @@ enum _ecore_status_t ecore_hw_init(struct ecore_dev *p_dev,
                }
 
                if (rc != ECORE_SUCCESS) {
-                       DP_NOTICE(p_hwfn, true,
+                       DP_NOTICE(p_hwfn, false,
                                  "init phase failed for loadcode 0x%x (rc %d)\n",
                                  load_code, rc);
                        goto load_err;
                }
 
                rc = ecore_mcp_load_done(p_hwfn, p_hwfn->p_main_ptt);
-               if (rc != ECORE_SUCCESS)
+               if (rc != ECORE_SUCCESS) {
+                       DP_NOTICE(p_hwfn, false,
+                                 "Sending load done failed, rc = %d\n", rc);
+                       if (rc == ECORE_NOMEM) {
+                               DP_NOTICE(p_hwfn, false,
+                                         "Sending load done was failed due to memory allocation failure\n");
+                               goto load_err;
+                       }
                        return rc;
+               }
 
                /* send DCBX attention request command */
                DP_VERBOSE(p_hwfn, ECORE_MSG_DCB,
@@ -2491,7 +2582,7 @@ enum _ecore_status_t ecore_hw_init(struct ecore_dev *p_dev,
                                   1 << DRV_MB_PARAM_DCBX_NOTIFY_OFFSET, &resp,
                                   &param);
                if (rc != ECORE_SUCCESS) {
-                       DP_NOTICE(p_hwfn, true,
+                       DP_NOTICE(p_hwfn, false,
                                  "Failed to send DCBX attention request\n");
                        return rc;
                }
@@ -2508,22 +2599,34 @@ enum _ecore_status_t ecore_hw_init(struct ecore_dev *p_dev,
                if (rc != ECORE_SUCCESS)
                        DP_INFO(p_hwfn, "Failed to update firmware version\n");
 
-               if (!b_default_mtu)
+               if (!b_default_mtu) {
                        rc = ecore_mcp_ov_update_mtu(p_hwfn, p_hwfn->p_main_ptt,
                                                      p_hwfn->hw_info.mtu);
-               if (rc != ECORE_SUCCESS)
-                       DP_INFO(p_hwfn, "Failed to update default mtu\n");
+                       if (rc != ECORE_SUCCESS)
+                               DP_INFO(p_hwfn, "Failed to update default mtu\n");
+               }
 
                rc = ecore_mcp_ov_update_driver_state(p_hwfn,
                                                      p_hwfn->p_main_ptt,
                                                ECORE_OV_DRIVER_STATE_DISABLED);
                if (rc != ECORE_SUCCESS)
                        DP_INFO(p_hwfn, "Failed to update driver state\n");
+
+               rc = ecore_mcp_ov_update_eswitch(p_hwfn, p_hwfn->p_main_ptt,
+                                                ECORE_OV_ESWITCH_NONE);
+               if (rc != ECORE_SUCCESS)
+                       DP_INFO(p_hwfn, "Failed to update eswitch mode\n");
        }
 
        return rc;
 
 load_err:
+       --qm_lock_ref_cnt;
+#ifdef CONFIG_ECORE_LOCK_ALLOC
+       if (!qm_lock_ref_cnt)
+               OSAL_SPIN_LOCK_DEALLOC(&qm_lock);
+qm_lock_fail:
+#endif
        /* The MFW load lock should be released regardless of success or failure
         * of initialization.
         * TODO: replace this with an attempt to send cancel_load.
@@ -2558,8 +2661,8 @@ static void ecore_hw_timers_stop(struct ecore_dev *p_dev,
        if (i < ECORE_HW_STOP_RETRY_LIMIT)
                return;
 
-       DP_NOTICE(p_hwfn, true, "Timers linear scans are not over"
-                 " [Connection %02x Tasks %02x]\n",
+       DP_NOTICE(p_hwfn, false,
+                 "Timers linear scans are not over [Connection %02x Tasks %02x]\n",
                  (u8)ecore_rd(p_hwfn, p_ptt, TM_REG_PF_SCAN_ACTIVE_CONN),
                  (u8)ecore_rd(p_hwfn, p_ptt, TM_REG_PF_SCAN_ACTIVE_TASK));
 }
@@ -2624,7 +2727,7 @@ enum _ecore_status_t ecore_hw_stop(struct ecore_dev *p_dev)
                if (!p_dev->recov_in_prog) {
                        rc = ecore_mcp_unload_req(p_hwfn, p_ptt);
                        if (rc != ECORE_SUCCESS) {
-                               DP_NOTICE(p_hwfn, true,
+                               DP_NOTICE(p_hwfn, false,
                                          "Failed sending a UNLOAD_REQ command. rc = %d.\n",
                                          rc);
                                rc2 = ECORE_UNKNOWN_ERROR;
@@ -2639,7 +2742,7 @@ enum _ecore_status_t ecore_hw_stop(struct ecore_dev *p_dev)
 
                rc = ecore_sp_pf_stop(p_hwfn);
                if (rc != ECORE_SUCCESS) {
-                       DP_NOTICE(p_hwfn, true,
+                       DP_NOTICE(p_hwfn, false,
                                  "Failed to close PF against FW [rc = %d]. Continue to stop HW to prevent illegal host access by the device.\n",
                                  rc);
                        rc2 = ECORE_UNKNOWN_ERROR;
@@ -2693,10 +2796,21 @@ enum _ecore_status_t ecore_hw_stop(struct ecore_dev *p_dev)
                ecore_wr(p_hwfn, p_ptt, DORQ_REG_PF_DB_ENABLE, 0);
                ecore_wr(p_hwfn, p_ptt, QM_REG_PF_EN, 0);
 
+               --qm_lock_ref_cnt;
+#ifdef CONFIG_ECORE_LOCK_ALLOC
+               if (!qm_lock_ref_cnt)
+                       OSAL_SPIN_LOCK_DEALLOC(&qm_lock);
+#endif
+
                if (!p_dev->recov_in_prog) {
-                       ecore_mcp_unload_done(p_hwfn, p_ptt);
+                       rc = ecore_mcp_unload_done(p_hwfn, p_ptt);
+                       if (rc == ECORE_NOMEM) {
+                               DP_NOTICE(p_hwfn, false,
+                                        "Failed sending an UNLOAD_DONE command due to a memory allocation failure. Resending.\n");
+                               rc = ecore_mcp_unload_done(p_hwfn, p_ptt);
+                       }
                        if (rc != ECORE_SUCCESS) {
-                               DP_NOTICE(p_hwfn, true,
+                               DP_NOTICE(p_hwfn, false,
                                          "Failed sending a UNLOAD_DONE command. rc = %d.\n",
                                          rc);
                                rc2 = ECORE_UNKNOWN_ERROR;
@@ -2879,12 +2993,15 @@ static void ecore_hw_set_feat(struct ecore_hwfn *p_hwfn)
                                   FEAT_NUM(p_hwfn, ECORE_VF_L2_QUE));
        }
 
-       feat_num[ECORE_FCOE_CQ] = OSAL_MIN_T(u32, sb_cnt.cnt,
-                                            RESC_NUM(p_hwfn,
-                                                     ECORE_CMDQS_CQS));
-       feat_num[ECORE_ISCSI_CQ] = OSAL_MIN_T(u32, sb_cnt.cnt,
-                                             RESC_NUM(p_hwfn,
-                                                      ECORE_CMDQS_CQS));
+       if (ECORE_IS_FCOE_PERSONALITY(p_hwfn))
+               feat_num[ECORE_FCOE_CQ] =
+                       OSAL_MIN_T(u32, sb_cnt.cnt, RESC_NUM(p_hwfn,
+                                                            ECORE_CMDQS_CQS));
+
+       if (ECORE_IS_ISCSI_PERSONALITY(p_hwfn))
+               feat_num[ECORE_ISCSI_CQ] =
+                       OSAL_MIN_T(u32, sb_cnt.cnt, RESC_NUM(p_hwfn,
+                                                            ECORE_CMDQS_CQS));
 
        DP_VERBOSE(p_hwfn, ECORE_MSG_PROBE,
                   "#PF_L2_QUEUE=%d VF_L2_QUEUES=%d #ROCE_CNQ=%d #FCOE_CQ=%d #ISCSI_CQ=%d #SB=%d\n",
@@ -2944,7 +3061,7 @@ __ecore_hw_set_soft_resc_size(struct ecore_hwfn *p_hwfn,
        rc = ecore_mcp_set_resc_max_val(p_hwfn, p_ptt, res_id,
                                        resc_max_val, p_mcp_resp);
        if (rc != ECORE_SUCCESS) {
-               DP_NOTICE(p_hwfn, true,
+               DP_NOTICE(p_hwfn, false,
                          "MFW response failure for a max value setting of resource %d [%s]\n",
                          res_id, ecore_hw_get_resc_name(res_id));
                return rc;
@@ -3190,7 +3307,7 @@ static enum _ecore_status_t ecore_hw_get_resc(struct ecore_hwfn *p_hwfn,
         * resources allocation queries should be atomic. Since several PFs can
         * run in parallel - a resource lock is needed.
         * If either the resource lock or resource set value commands are not
-        * supported - skip the the max values setting, release the lock if
+        * supported - skip the max values setting, release the lock if
         * needed, and proceed to the queries. Other failures, including a
         * failure to acquire the lock, will cause this function to fail.
         * Old drivers that don't acquire the lock can run in parallel, and
@@ -3328,8 +3445,8 @@ ecore_hw_get_nvm_info(struct ecore_hwfn *p_hwfn,
        nvm_cfg1_offset = ecore_rd(p_hwfn, p_ptt, nvm_cfg_addr + 4);
 
        addr = MCP_REG_SCRATCH + nvm_cfg1_offset +
-           OFFSETOF(struct nvm_cfg1, glob) + OFFSETOF(struct nvm_cfg1_glob,
-                                                      core_cfg);
+                  OFFSETOF(struct nvm_cfg1, glob) +
+                  OFFSETOF(struct nvm_cfg1_glob, core_cfg);
 
        core_cfg = ecore_rd(p_hwfn, p_ptt, addr);
 
@@ -3409,8 +3526,8 @@ ecore_hw_get_nvm_info(struct ecore_hwfn *p_hwfn,
        p_caps->speed_capabilities = link->speed.advertised_speeds;
 
        link_temp = ecore_rd(p_hwfn, p_ptt,
-                            port_cfg_addr +
-                            OFFSETOF(struct nvm_cfg1_port, link_settings));
+                                port_cfg_addr +
+                                OFFSETOF(struct nvm_cfg1_port, link_settings));
        switch ((link_temp & NVM_CFG1_PORT_DRV_LINK_SPEED_MASK) >>
                NVM_CFG1_PORT_DRV_LINK_SPEED_OFFSET) {
        case NVM_CFG1_PORT_DRV_LINK_SPEED_AUTONEG:
@@ -3490,8 +3607,8 @@ ecore_hw_get_nvm_info(struct ecore_hwfn *p_hwfn,
 
        /* Read Multi-function information from shmem */
        addr = MCP_REG_SCRATCH + nvm_cfg1_offset +
-           OFFSETOF(struct nvm_cfg1, glob) +
-           OFFSETOF(struct nvm_cfg1_glob, generic_cont0);
+                  OFFSETOF(struct nvm_cfg1, glob) +
+                  OFFSETOF(struct nvm_cfg1_glob, generic_cont0);
 
        generic_cont0 = ecore_rd(p_hwfn, p_ptt, addr);
 
@@ -3504,14 +3621,20 @@ ecore_hw_get_nvm_info(struct ecore_hwfn *p_hwfn,
                break;
        case NVM_CFG1_GLOB_MF_MODE_UFP:
                p_hwfn->p_dev->mf_bits = 1 << ECORE_MF_OVLAN_CLSS |
-                                        1 << ECORE_MF_UFP_SPECIFIC;
+                                        1 << ECORE_MF_UFP_SPECIFIC |
+                                        1 << ECORE_MF_8021Q_TAGGING;
+               break;
+       case NVM_CFG1_GLOB_MF_MODE_BD:
+               p_hwfn->p_dev->mf_bits = 1 << ECORE_MF_OVLAN_CLSS |
+                                        1 << ECORE_MF_LLH_PROTO_CLSS |
+                                        1 << ECORE_MF_8021AD_TAGGING;
                break;
-
        case NVM_CFG1_GLOB_MF_MODE_NPAR1_0:
                p_hwfn->p_dev->mf_bits = 1 << ECORE_MF_LLH_MAC_CLSS |
                                         1 << ECORE_MF_LLH_PROTO_CLSS |
                                         1 << ECORE_MF_LL2_NON_UNICAST |
-                                        1 << ECORE_MF_INTER_PF_SWITCH;
+                                        1 << ECORE_MF_INTER_PF_SWITCH |
+                                        1 << ECORE_MF_DISABLE_ARFS;
                break;
        case NVM_CFG1_GLOB_MF_MODE_DEFAULT:
                p_hwfn->p_dev->mf_bits = 1 << ECORE_MF_LLH_MAC_CLSS |
@@ -3524,6 +3647,9 @@ ecore_hw_get_nvm_info(struct ecore_hwfn *p_hwfn,
        DP_INFO(p_hwfn, "Multi function mode is 0x%lx\n",
                p_hwfn->p_dev->mf_bits);
 
+       if (ECORE_IS_CMT(p_hwfn->p_dev))
+               p_hwfn->p_dev->mf_bits |= (1 << ECORE_MF_DISABLE_ARFS);
+
        /* It's funny since we have another switch, but it's easier
         * to throw this away in linux this way. Long term, it might be
         * better to have have getters for needed ECORE_MF_* fields,
@@ -3531,6 +3657,7 @@ ecore_hw_get_nvm_info(struct ecore_hwfn *p_hwfn,
         */
        switch (mf_mode) {
        case NVM_CFG1_GLOB_MF_MODE_MF_ALLOWED:
+       case NVM_CFG1_GLOB_MF_MODE_BD:
                p_hwfn->p_dev->mf_mode = ECORE_MF_OVLAN;
                break;
        case NVM_CFG1_GLOB_MF_MODE_NPAR1_0:
@@ -3546,25 +3673,25 @@ ecore_hw_get_nvm_info(struct ecore_hwfn *p_hwfn,
 
        /* Read Multi-function information from shmem */
        addr = MCP_REG_SCRATCH + nvm_cfg1_offset +
-           OFFSETOF(struct nvm_cfg1, glob) +
-           OFFSETOF(struct nvm_cfg1_glob, device_capabilities);
+                  OFFSETOF(struct nvm_cfg1, glob) +
+                  OFFSETOF(struct nvm_cfg1_glob, device_capabilities);
 
        device_capabilities = ecore_rd(p_hwfn, p_ptt, addr);
        if (device_capabilities & NVM_CFG1_GLOB_DEVICE_CAPABILITIES_ETHERNET)
                OSAL_SET_BIT(ECORE_DEV_CAP_ETH,
-                            &p_hwfn->hw_info.device_capabilities);
+                               &p_hwfn->hw_info.device_capabilities);
        if (device_capabilities & NVM_CFG1_GLOB_DEVICE_CAPABILITIES_FCOE)
                OSAL_SET_BIT(ECORE_DEV_CAP_FCOE,
-                            &p_hwfn->hw_info.device_capabilities);
+                               &p_hwfn->hw_info.device_capabilities);
        if (device_capabilities & NVM_CFG1_GLOB_DEVICE_CAPABILITIES_ISCSI)
                OSAL_SET_BIT(ECORE_DEV_CAP_ISCSI,
-                            &p_hwfn->hw_info.device_capabilities);
+                               &p_hwfn->hw_info.device_capabilities);
        if (device_capabilities & NVM_CFG1_GLOB_DEVICE_CAPABILITIES_ROCE)
                OSAL_SET_BIT(ECORE_DEV_CAP_ROCE,
-                            &p_hwfn->hw_info.device_capabilities);
+                               &p_hwfn->hw_info.device_capabilities);
        if (device_capabilities & NVM_CFG1_GLOB_DEVICE_CAPABILITIES_IWARP)
                OSAL_SET_BIT(ECORE_DEV_CAP_IWARP,
-                            &p_hwfn->hw_info.device_capabilities);
+                               &p_hwfn->hw_info.device_capabilities);
 
        rc = ecore_mcp_fill_shmem_func_info(p_hwfn, p_ptt);
        if (rc != ECORE_SUCCESS && p_params->b_relaxed_probe) {
@@ -3784,8 +3911,13 @@ ecore_get_hw_info(struct ecore_hwfn *p_hwfn, struct ecore_ptt *p_ptt,
        bool drv_resc_alloc = p_params->drv_resc_alloc;
        enum _ecore_status_t rc;
 
+       if (IS_ECORE_PACING(p_hwfn)) {
+               DP_VERBOSE(p_hwfn->p_dev, ECORE_MSG_IOV,
+                          "Skipping IOV as packet pacing is requested\n");
+       }
+
        /* Since all information is common, only first hwfns should do this */
-       if (IS_LEAD_HWFN(p_hwfn)) {
+       if (IS_LEAD_HWFN(p_hwfn) && !IS_ECORE_PACING(p_hwfn)) {
                rc = ecore_iov_hw_info(p_hwfn);
                if (rc != ECORE_SUCCESS) {
                        if (p_params->b_relaxed_probe)
@@ -3870,7 +4002,10 @@ ecore_get_hw_info(struct ecore_hwfn *p_hwfn, struct ecore_ptt *p_ptt,
         * that can result in performance penalty in some cases. 4
         * represents a good tradeoff between performance and flexibility.
         */
-       p_hwfn->hw_info.num_hw_tc = NUM_PHYS_TCS_4PORT_K2;
+       if (IS_ECORE_PACING(p_hwfn))
+               p_hwfn->hw_info.num_hw_tc = 1;
+       else
+               p_hwfn->hw_info.num_hw_tc = NUM_PHYS_TCS_4PORT_K2;
 
        /* start out with a single active tc. This can be increased either
         * by dcbx negotiation or by upper layer driver
@@ -4041,7 +4176,7 @@ ecore_hw_prepare_single(struct ecore_hwfn *p_hwfn,
        /* Allocate PTT pool */
        rc = ecore_ptt_pool_alloc(p_hwfn);
        if (rc) {
-               DP_NOTICE(p_hwfn, true, "Failed to prepare hwfn's hw\n");
+               DP_NOTICE(p_hwfn, false, "Failed to prepare hwfn's hw\n");
                if (p_params->b_relaxed_probe)
                        p_params->p_relaxed_res = ECORE_HW_PREPARE_FAILED_MEM;
                goto err0;
@@ -4066,7 +4201,7 @@ ecore_hw_prepare_single(struct ecore_hwfn *p_hwfn,
        /* Initialize MCP structure */
        rc = ecore_mcp_cmd_init(p_hwfn, p_hwfn->p_main_ptt);
        if (rc) {
-               DP_NOTICE(p_hwfn, true, "Failed initializing mcp command\n");
+               DP_NOTICE(p_hwfn, false, "Failed initializing mcp command\n");
                if (p_params->b_relaxed_probe)
                        p_params->p_relaxed_res = ECORE_HW_PREPARE_FAILED_MEM;
                goto err1;
@@ -4076,7 +4211,7 @@ ecore_hw_prepare_single(struct ecore_hwfn *p_hwfn,
        rc = ecore_get_hw_info(p_hwfn, p_hwfn->p_main_ptt,
                               p_params->personality, p_params);
        if (rc) {
-               DP_NOTICE(p_hwfn, true, "Failed to get HW information\n");
+               DP_NOTICE(p_hwfn, false, "Failed to get HW information\n");
                goto err2;
        }
 
@@ -4119,7 +4254,7 @@ ecore_hw_prepare_single(struct ecore_hwfn *p_hwfn,
        /* Allocate the init RT array and initialize the init-ops engine */
        rc = ecore_init_alloc(p_hwfn);
        if (rc) {
-               DP_NOTICE(p_hwfn, true, "Failed to allocate the init array\n");
+               DP_NOTICE(p_hwfn, false, "Failed to allocate the init array\n");
                if (p_params->b_relaxed_probe)
                        p_params->p_relaxed_res = ECORE_HW_PREPARE_FAILED_MEM;
                goto err2;
@@ -4157,6 +4292,7 @@ enum _ecore_status_t ecore_hw_prepare(struct ecore_dev *p_dev,
 
        p_dev->chk_reg_fifo = p_params->chk_reg_fifo;
        p_dev->allow_mdump = p_params->allow_mdump;
+       p_hwfn->b_en_pacing = p_params->b_en_pacing;
 
        if (p_params->b_relaxed_probe)
                p_params->p_relaxed_res = ECORE_HW_PREPARE_SUCCESS;
@@ -4192,6 +4328,7 @@ enum _ecore_status_t ecore_hw_prepare(struct ecore_dev *p_dev,
                                                          BAR_ID_1) / 2;
                p_doorbell = (void OSAL_IOMEM *)addr;
 
+               p_dev->hwfns[1].b_en_pacing = p_params->b_en_pacing;
                /* prepare second hw function */
                rc = ecore_hw_prepare_single(&p_dev->hwfns[1], p_regview,
                                             p_doorbell, p_params);
@@ -4209,8 +4346,7 @@ enum _ecore_status_t ecore_hw_prepare(struct ecore_dev *p_dev,
                                ecore_mcp_free(p_hwfn);
                                ecore_hw_hwfn_free(p_hwfn);
                        } else {
-                               DP_NOTICE(p_dev, true,
-                                         "What do we need to free when VF hwfn1 init fails\n");
+                               DP_NOTICE(p_dev, false, "What do we need to free when VF hwfn1 init fails\n");
                        }
                        return rc;
                }
@@ -4241,7 +4377,7 @@ void ecore_hw_remove(struct ecore_dev *p_dev)
                ecore_mcp_free(p_hwfn);
 
 #ifdef CONFIG_ECORE_LOCK_ALLOC
-               OSAL_MUTEX_DEALLOC(&p_hwfn->dmae_info.mutex);
+               OSAL_SPIN_LOCK_DEALLOC(&p_hwfn->dmae_info.lock);
 #endif
        }
 
@@ -4372,7 +4508,7 @@ ecore_chain_alloc_next_ptr(struct ecore_dev *p_dev, struct ecore_chain *p_chain)
                p_virt = OSAL_DMA_ALLOC_COHERENT(p_dev, &p_phys,
                                                 ECORE_CHAIN_PAGE_SIZE);
                if (!p_virt) {
-                       DP_NOTICE(p_dev, true,
+                       DP_NOTICE(p_dev, false,
                                  "Failed to allocate chain memory\n");
                        return ECORE_NOMEM;
                }
@@ -4405,7 +4541,7 @@ ecore_chain_alloc_single(struct ecore_dev *p_dev, struct ecore_chain *p_chain)
 
        p_virt = OSAL_DMA_ALLOC_COHERENT(p_dev, &p_phys, ECORE_CHAIN_PAGE_SIZE);
        if (!p_virt) {
-               DP_NOTICE(p_dev, true, "Failed to allocate chain memory\n");
+               DP_NOTICE(p_dev, false, "Failed to allocate chain memory\n");
                return ECORE_NOMEM;
        }
 
@@ -4420,16 +4556,16 @@ ecore_chain_alloc_pbl(struct ecore_dev *p_dev,
                      struct ecore_chain *p_chain,
                      struct ecore_chain_ext_pbl *ext_pbl)
 {
-       void *p_virt = OSAL_NULL;
-       u8 *p_pbl_virt = OSAL_NULL;
-       void **pp_virt_addr_tbl = OSAL_NULL;
-       dma_addr_t p_phys = 0, p_pbl_phys = 0;
        u32 page_cnt = p_chain->page_cnt, size, i;
+       dma_addr_t p_phys = 0, p_pbl_phys = 0;
+       void **pp_virt_addr_tbl = OSAL_NULL;
+       u8 *p_pbl_virt = OSAL_NULL;
+       void *p_virt = OSAL_NULL;
 
        size = page_cnt * sizeof(*pp_virt_addr_tbl);
        pp_virt_addr_tbl = (void **)OSAL_VZALLOC(p_dev, size);
        if (!pp_virt_addr_tbl) {
-               DP_NOTICE(p_dev, true,
+               DP_NOTICE(p_dev, false,
                          "Failed to allocate memory for the chain virtual addresses table\n");
                return ECORE_NOMEM;
        }
@@ -4453,7 +4589,7 @@ ecore_chain_alloc_pbl(struct ecore_dev *p_dev,
        ecore_chain_init_pbl_mem(p_chain, p_pbl_virt, p_pbl_phys,
                                 pp_virt_addr_tbl);
        if (!p_pbl_virt) {
-               DP_NOTICE(p_dev, true, "Failed to allocate chain pbl memory\n");
+               DP_NOTICE(p_dev, false, "Failed to allocate chain pbl memory\n");
                return ECORE_NOMEM;
        }
 
@@ -4461,7 +4597,7 @@ ecore_chain_alloc_pbl(struct ecore_dev *p_dev,
                p_virt = OSAL_DMA_ALLOC_COHERENT(p_dev, &p_phys,
                                                 ECORE_CHAIN_PAGE_SIZE);
                if (!p_virt) {
-                       DP_NOTICE(p_dev, true,
+                       DP_NOTICE(p_dev, false,
                                  "Failed to allocate chain memory\n");
                        return ECORE_NOMEM;
                }
@@ -4501,7 +4637,7 @@ enum _ecore_status_t ecore_chain_alloc(struct ecore_dev *p_dev,
        rc = ecore_chain_alloc_sanity_check(p_dev, cnt_type, elem_size,
                                            page_cnt);
        if (rc) {
-               DP_NOTICE(p_dev, true,
+               DP_NOTICE(p_dev, false,
                          "Cannot allocate a chain with the given arguments:\n"
                          "[use_mode %d, mode %d, cnt_type %d, num_elems %d, elem_size %zu]\n",
                          intended_use, mode, cnt_type, num_elems, elem_size);
@@ -4637,7 +4773,7 @@ enum _ecore_status_t ecore_llh_add_mac_filter(struct ecore_hwfn *p_hwfn,
                                          struct ecore_ptt *p_ptt, u8 *p_filter)
 {
        u32 high, low, entry_num;
-       enum _ecore_status_t rc;
+       enum _ecore_status_t rc = ECORE_SUCCESS;
 
        if (!OSAL_TEST_BIT(ECORE_MF_LLH_MAC_CLSS,
                           &p_hwfn->p_dev->mf_bits))
@@ -4661,7 +4797,7 @@ enum _ecore_status_t ecore_llh_add_mac_filter(struct ecore_hwfn *p_hwfn,
                   p_filter[0], p_filter[1], p_filter[2], p_filter[3],
                   p_filter[4], p_filter[5], entry_num);
 
-       return ECORE_SUCCESS;
+       return rc;
 }
 
 static enum _ecore_status_t
@@ -4705,7 +4841,7 @@ void ecore_llh_remove_mac_filter(struct ecore_hwfn *p_hwfn,
                             struct ecore_ptt *p_ptt, u8 *p_filter)
 {
        u32 high, low, entry_num;
-       enum _ecore_status_t rc;
+       enum _ecore_status_t rc = ECORE_SUCCESS;
 
        if (!OSAL_TEST_BIT(ECORE_MF_LLH_MAC_CLSS,
                           &p_hwfn->p_dev->mf_bits))
@@ -4780,11 +4916,11 @@ ecore_llh_add_protocol_filter(struct ecore_hwfn *p_hwfn,
                              enum ecore_llh_port_filter_type_t type)
 {
        u32 high, low, entry_num;
-       enum _ecore_status_t rc;
+       enum _ecore_status_t rc = ECORE_SUCCESS;
 
        if (!OSAL_TEST_BIT(ECORE_MF_LLH_PROTO_CLSS,
                           &p_hwfn->p_dev->mf_bits))
-               return ECORE_SUCCESS;
+               return rc;
 
        high = 0;
        low = 0;
@@ -4857,7 +4993,7 @@ ecore_llh_add_protocol_filter(struct ecore_hwfn *p_hwfn,
                break;
        }
 
-       return ECORE_SUCCESS;
+       return rc;
 }
 
 static enum _ecore_status_t
@@ -4924,7 +5060,7 @@ ecore_llh_remove_protocol_filter(struct ecore_hwfn *p_hwfn,
                                 enum ecore_llh_port_filter_type_t type)
 {
        u32 high, low, entry_num;
-       enum _ecore_status_t rc;
+       enum _ecore_status_t rc = ECORE_SUCCESS;
 
        if (!OSAL_TEST_BIT(ECORE_MF_LLH_PROTO_CLSS,
                           &p_hwfn->p_dev->mf_bits))
@@ -5245,13 +5381,6 @@ static enum _ecore_status_t ecore_init_wfq_param(struct ecore_hwfn *p_hwfn,
        non_requested_count = num_vports - req_count;
 
        /* validate possible error cases */
-       if (req_rate > min_pf_rate) {
-               DP_VERBOSE(p_hwfn, ECORE_MSG_LINK,
-                          "Vport [%d] - Requested rate[%d Mbps] is greater than configured PF min rate[%d Mbps]\n",
-                          vport_id, req_rate, min_pf_rate);
-               return ECORE_INVAL;
-       }
-
        if (req_rate < min_pf_rate / ECORE_WFQ_UNIT) {
                DP_VERBOSE(p_hwfn, ECORE_MSG_LINK,
                           "Vport [%d] - Requested rate[%d Mbps] is less than one percent of configured PF min rate[%d Mbps]\n",