net/qede/base: revise management FW mbox access scheme
[dpdk.git] / drivers / net / qede / base / ecore_spq.c
index ba26d45..29ba660 100644 (file)
@@ -87,6 +87,7 @@ static enum _ecore_status_t ecore_spq_block(struct ecore_hwfn *p_hwfn,
                                            u8 *p_fw_ret, bool skip_quick_poll)
 {
        struct ecore_spq_comp_done *comp_done;
+       struct ecore_ptt *p_ptt;
        enum _ecore_status_t rc;
 
        /* A relatively short polling period w/o sleeping, to allow the FW to
@@ -103,8 +104,13 @@ static enum _ecore_status_t ecore_spq_block(struct ecore_hwfn *p_hwfn,
        if (rc == ECORE_SUCCESS)
                return ECORE_SUCCESS;
 
+       p_ptt = ecore_ptt_acquire(p_hwfn);
+       if (!p_ptt)
+               return ECORE_AGAIN;
+
        DP_INFO(p_hwfn, "Ramrod is stuck, requesting MCP drain\n");
-       rc = ecore_mcp_drain(p_hwfn, p_hwfn->p_main_ptt);
+       rc = ecore_mcp_drain(p_hwfn, p_ptt);
+       ecore_ptt_release(p_hwfn, p_ptt);
        if (rc != ECORE_SUCCESS) {
                DP_NOTICE(p_hwfn, true, "MCP drain failed\n");
                goto err;
@@ -190,6 +196,9 @@ static void ecore_spq_hw_initialize(struct ecore_hwfn *p_hwfn,
 
        p_cxt = cxt_info.p_cxt;
 
+       /* @@@TBD we zero the context until we have ilt_reset implemented. */
+       OSAL_MEM_ZERO(p_cxt, sizeof(*p_cxt));
+
        if (ECORE_IS_BB(p_hwfn->p_dev) || ECORE_IS_AH(p_hwfn->p_dev)) {
                SET_FIELD(p_cxt->xstorm_ag_context.flags10,
                          E4_XSTORM_CORE_CONN_AG_CTX_DQ_CF_EN, 1);
@@ -355,7 +364,7 @@ enum _ecore_status_t ecore_eq_completion(struct ecore_hwfn *p_hwfn,
        return rc;
 }
 
-struct ecore_eq *ecore_eq_alloc(struct ecore_hwfn *p_hwfn, u16 num_elem)
+enum _ecore_status_t ecore_eq_alloc(struct ecore_hwfn *p_hwfn, u16 num_elem)
 {
        struct ecore_eq *p_eq;
 
@@ -364,7 +373,7 @@ struct ecore_eq *ecore_eq_alloc(struct ecore_hwfn *p_hwfn, u16 num_elem)
        if (!p_eq) {
                DP_NOTICE(p_hwfn, true,
                          "Failed to allocate `struct ecore_eq'\n");
-               return OSAL_NULL;
+               return ECORE_NOMEM;
        }
 
        /* Allocate and initialize EQ chain*/
@@ -374,7 +383,7 @@ struct ecore_eq *ecore_eq_alloc(struct ecore_hwfn *p_hwfn, u16 num_elem)
                              ECORE_CHAIN_CNT_TYPE_U16,
                              num_elem,
                              sizeof(union event_ring_element),
-                             &p_eq->chain, OSAL_NULL)) {
+                             &p_eq->chain, OSAL_NULL) != ECORE_SUCCESS) {
                DP_NOTICE(p_hwfn, true, "Failed to allocate eq chain\n");
                goto eq_allocate_fail;
        }
@@ -383,24 +392,28 @@ struct ecore_eq *ecore_eq_alloc(struct ecore_hwfn *p_hwfn, u16 num_elem)
        ecore_int_register_cb(p_hwfn, ecore_eq_completion,
                              p_eq, &p_eq->eq_sb_index, &p_eq->p_fw_cons);
 
-       return p_eq;
+       p_hwfn->p_eq = p_eq;
+       return ECORE_SUCCESS;
 
 eq_allocate_fail:
-       ecore_eq_free(p_hwfn, p_eq);
-       return OSAL_NULL;
+       OSAL_FREE(p_hwfn->p_dev, p_eq);
+       return ECORE_NOMEM;
 }
 
-void ecore_eq_setup(struct ecore_hwfn *p_hwfn, struct ecore_eq *p_eq)
+void ecore_eq_setup(struct ecore_hwfn *p_hwfn)
 {
-       ecore_chain_reset(&p_eq->chain);
+       ecore_chain_reset(&p_hwfn->p_eq->chain);
 }
 
-void ecore_eq_free(struct ecore_hwfn *p_hwfn, struct ecore_eq *p_eq)
+void ecore_eq_free(struct ecore_hwfn *p_hwfn)
 {
-       if (!p_eq)
+       if (!p_hwfn->p_eq)
                return;
-       ecore_chain_free(p_hwfn->p_dev, &p_eq->chain);
-       OSAL_FREE(p_hwfn->p_dev, p_eq);
+
+       ecore_chain_free(p_hwfn->p_dev, &p_hwfn->p_eq->chain);
+
+       OSAL_FREE(p_hwfn->p_dev, p_hwfn->p_eq);
+       p_hwfn->p_eq = OSAL_NULL;
 }
 
 /***************************************************************************
@@ -523,7 +536,9 @@ enum _ecore_status_t ecore_spq_alloc(struct ecore_hwfn *p_hwfn)
        p_spq->p_virt = p_virt;
        p_spq->p_phys = p_phys;
 
+#ifdef CONFIG_ECORE_LOCK_ALLOC
        OSAL_SPIN_LOCK_ALLOC(p_hwfn, &p_spq->lock);
+#endif
 
        p_hwfn->p_spq = p_spq;
        return ECORE_SUCCESS;
@@ -552,7 +567,10 @@ void ecore_spq_free(struct ecore_hwfn *p_hwfn)
        }
 
        ecore_chain_free(p_hwfn->p_dev, &p_spq->chain);
+#ifdef CONFIG_ECORE_LOCK_ALLOC
        OSAL_SPIN_LOCK_DEALLOC(&p_spq->lock);
+#endif
+
        OSAL_FREE(p_hwfn->p_dev, p_spq);
 }
 
@@ -943,7 +961,7 @@ enum _ecore_status_t ecore_spq_completion(struct ecore_hwfn *p_hwfn,
        return rc;
 }
 
-struct ecore_consq *ecore_consq_alloc(struct ecore_hwfn *p_hwfn)
+enum _ecore_status_t ecore_consq_alloc(struct ecore_hwfn *p_hwfn)
 {
        struct ecore_consq *p_consq;
 
@@ -953,7 +971,7 @@ struct ecore_consq *ecore_consq_alloc(struct ecore_hwfn *p_hwfn)
        if (!p_consq) {
                DP_NOTICE(p_hwfn, true,
                          "Failed to allocate `struct ecore_consq'\n");
-               return OSAL_NULL;
+               return ECORE_NOMEM;
        }
 
        /* Allocate and initialize EQ chain */
@@ -963,27 +981,29 @@ struct ecore_consq *ecore_consq_alloc(struct ecore_hwfn *p_hwfn)
                              ECORE_CHAIN_CNT_TYPE_U16,
                              ECORE_CHAIN_PAGE_SIZE / 0x80,
                              0x80,
-                             &p_consq->chain, OSAL_NULL)) {
+                             &p_consq->chain, OSAL_NULL) != ECORE_SUCCESS) {
                DP_NOTICE(p_hwfn, true, "Failed to allocate consq chain");
                goto consq_allocate_fail;
        }
 
-       return p_consq;
+       p_hwfn->p_consq = p_consq;
+       return ECORE_SUCCESS;
 
 consq_allocate_fail:
-       ecore_consq_free(p_hwfn, p_consq);
-       return OSAL_NULL;
+       OSAL_FREE(p_hwfn->p_dev, p_consq);
+       return ECORE_NOMEM;
 }
 
-void ecore_consq_setup(struct ecore_hwfn *p_hwfn, struct ecore_consq *p_consq)
+void ecore_consq_setup(struct ecore_hwfn *p_hwfn)
 {
-       ecore_chain_reset(&p_consq->chain);
+       ecore_chain_reset(&p_hwfn->p_consq->chain);
 }
 
-void ecore_consq_free(struct ecore_hwfn *p_hwfn, struct ecore_consq *p_consq)
+void ecore_consq_free(struct ecore_hwfn *p_hwfn)
 {
-       if (!p_consq)
+       if (!p_hwfn->p_consq)
                return;
-       ecore_chain_free(p_hwfn->p_dev, &p_consq->chain);
-       OSAL_FREE(p_hwfn->p_dev, p_consq);
+
+       ecore_chain_free(p_hwfn->p_dev, &p_hwfn->p_consq->chain);
+       OSAL_FREE(p_hwfn->p_dev, p_hwfn->p_consq);
 }