p_ramrod->gsi_offload_flag = p_ll2_conn->input.gsi_enable;
 
-       return qed_spq_post(p_hwfn, p_ent, NULL);
+       rc = qed_spq_post(p_hwfn, p_ent, NULL);
+       if (rc)
+               return rc;
+
+       rc = qed_db_recovery_add(p_hwfn->cdev, p_tx->doorbell_addr,
+                                &p_tx->db_msg, DB_REC_WIDTH_32B,
+                                DB_REC_KERNEL);
+       return rc;
 }
 
 static int qed_sp_ll2_rx_queue_stop(struct qed_hwfn *p_hwfn,
 static int qed_sp_ll2_tx_queue_stop(struct qed_hwfn *p_hwfn,
                                    struct qed_ll2_info *p_ll2_conn)
 {
+       struct qed_ll2_tx_queue *p_tx = &p_ll2_conn->tx_queue;
        struct qed_spq_entry *p_ent = NULL;
        struct qed_sp_init_data init_data;
        int rc = -EINVAL;
+       qed_db_recovery_del(p_hwfn->cdev, p_tx->doorbell_addr, &p_tx->db_msg);
 
        /* Get SPQ entry */
        memset(&init_data, 0, sizeof(init_data));
        p_tx->doorbell_addr = (u8 __iomem *)p_hwfn->doorbells +
                                            qed_db_addr(p_ll2_conn->cid,
                                                        DQ_DEMS_LEGACY);
+       /* prepare db data */
+       SET_FIELD(p_tx->db_msg.params, CORE_DB_DATA_DEST, DB_DEST_XCM);
+       SET_FIELD(p_tx->db_msg.params, CORE_DB_DATA_AGG_CMD, DB_AGG_CMD_SET);
+       SET_FIELD(p_tx->db_msg.params, CORE_DB_DATA_AGG_VAL_SEL,
+                 DQ_XCM_CORE_TX_BD_PROD_CMD);
+       p_tx->db_msg.agg_flags = DQ_XCM_CORE_DQ_CF_CMD;
+
 
        rc = qed_ll2_establish_connection_rx(p_hwfn, p_ll2_conn);
        if (rc)
        bool b_notify = p_ll2_conn->tx_queue.cur_send_packet->notify_fw;
        struct qed_ll2_tx_queue *p_tx = &p_ll2_conn->tx_queue;
        struct qed_ll2_tx_packet *p_pkt = NULL;
-       struct core_db_data db_msg = { 0, 0, 0 };
        u16 bd_prod;
 
        /* If there are missing BDs, don't do anything now */
                list_move_tail(&p_pkt->list_entry, &p_tx->active_descq);
        }
 
-       SET_FIELD(db_msg.params, CORE_DB_DATA_DEST, DB_DEST_XCM);
-       SET_FIELD(db_msg.params, CORE_DB_DATA_AGG_CMD, DB_AGG_CMD_SET);
-       SET_FIELD(db_msg.params, CORE_DB_DATA_AGG_VAL_SEL,
-                 DQ_XCM_CORE_TX_BD_PROD_CMD);
-       db_msg.agg_flags = DQ_XCM_CORE_DQ_CF_CMD;
-       db_msg.spq_prod = cpu_to_le16(bd_prod);
+       p_tx->db_msg.spq_prod = cpu_to_le16(bd_prod);
 
        /* Make sure the BDs data is updated before ringing the doorbell */
        wmb();
 
-       DIRECT_REG_WR(p_tx->doorbell_addr, *((u32 *)&db_msg));
+       DIRECT_REG_WR(p_tx->doorbell_addr, *((u32 *)&p_tx->db_msg));
 
        DP_VERBOSE(p_hwfn,
                   (NETIF_MSG_TX_QUEUED | QED_MSG_LL2),
                   "LL2 [q 0x%02x cid 0x%08x type 0x%08x] Doorbelled [producer 0x%04x]\n",
                   p_ll2_conn->queue_id,
                   p_ll2_conn->cid,
-                  p_ll2_conn->input.conn_type, db_msg.spq_prod);
+                  p_ll2_conn->input.conn_type, p_tx->db_msg.spq_prod);
 }
 
 int qed_ll2_prepare_tx_packet(void *cxt,