static int qed_hw_prepare_single(struct qed_hwfn *p_hwfn,
                                 void __iomem *p_regview,
                                 void __iomem *p_doorbells,
+                                u64 db_phys_addr,
                                 enum qed_pci_personality personality)
 {
        struct qed_dev *cdev = p_hwfn->cdev;
        /* Split PCI bars evenly between hwfns */
        p_hwfn->regview = p_regview;
        p_hwfn->doorbells = p_doorbells;
+       p_hwfn->db_phys_addr = db_phys_addr;
 
        if (IS_VF(p_hwfn->cdev))
                return qed_vf_hw_prepare(p_hwfn);
        /* Initialize the first hwfn - will learn number of hwfns */
        rc = qed_hw_prepare_single(p_hwfn,
                                   cdev->regview,
-                                  cdev->doorbells, personality);
+                                  cdev->doorbells,
+                                  cdev->db_phys_addr,
+                                  personality);
        if (rc)
                return rc;
 
        /* Initialize the rest of the hwfns */
        if (cdev->num_hwfns > 1) {
                void __iomem *p_regview, *p_doorbell;
-               u8 __iomem *addr;
+               u64 db_phys_addr;
+               u32 offset;
 
                /* adjust bar offset for second engine */
-               addr = cdev->regview +
-                      qed_hw_bar_size(p_hwfn, p_hwfn->p_main_ptt,
-                                      BAR_ID_0) / 2;
-               p_regview = addr;
+               offset = qed_hw_bar_size(p_hwfn, p_hwfn->p_main_ptt,
+                                        BAR_ID_0) / 2;
+               p_regview = cdev->regview + offset;
 
-               addr = cdev->doorbells +
-                      qed_hw_bar_size(p_hwfn, p_hwfn->p_main_ptt,
-                                      BAR_ID_1) / 2;
-               p_doorbell = addr;
+               offset = qed_hw_bar_size(p_hwfn, p_hwfn->p_main_ptt,
+                                        BAR_ID_1) / 2;
+
+               p_doorbell = cdev->doorbells + offset;
+
+               db_phys_addr = cdev->db_phys_addr + offset;
 
                /* prepare second hw function */
                rc = qed_hw_prepare_single(&cdev->hwfns[1], p_regview,
-                                          p_doorbell, personality);
+                                          p_doorbell, db_phys_addr,
+                                          personality);
 
                /* in case of error, need to free the previously
                 * initiliazed hwfn 0.