]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
qed: Set the doorbell address correctly
authorMichal Kalderon <michal.kalderon@marvell.com>
Sun, 26 May 2019 12:22:25 +0000 (15:22 +0300)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 26 Jul 2019 07:12:26 +0000 (09:12 +0200)
[ Upstream commit 8366d520019f366fabd6c7a13032bdcd837e18d4 ]

In 100g mode the doorbell bar is united for both engines. Set
the correct offset in the hwfn so that the doorbell returned
for RoCE is in the affined hwfn.

Signed-off-by: Ariel Elior <ariel.elior@marvell.com>
Signed-off-by: Denis Bolotin <denis.bolotin@marvell.com>
Signed-off-by: Michal Kalderon <michal.kalderon@marvell.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/net/ethernet/qlogic/qed/qed_dev.c
drivers/net/ethernet/qlogic/qed/qed_rdma.c

index 866cdc86a3f27c879d4364089597ea499a0b1714..08045fd69fad8475b73f3cb2f8b6439b4ff4d3f2 100644 (file)
@@ -3441,6 +3441,7 @@ static void qed_nvm_info_free(struct qed_hwfn *p_hwfn)
 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;
@@ -3449,6 +3450,7 @@ static int qed_hw_prepare_single(struct qed_hwfn *p_hwfn,
        /* 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);
@@ -3544,7 +3546,9 @@ int qed_hw_prepare(struct qed_dev *cdev,
        /* 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;
 
@@ -3553,22 +3557,25 @@ int qed_hw_prepare(struct qed_dev *cdev,
        /* 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.
index 7873d6dfd91f55607a6d60b23b568488edf7d360..13802b825d65a7c73248e48b21973217417d3287 100644 (file)
@@ -803,7 +803,7 @@ static int qed_rdma_add_user(void *rdma_cxt,
                                     dpi_start_offset +
                                     ((out_params->dpi) * p_hwfn->dpi_size));
 
-       out_params->dpi_phys_addr = p_hwfn->cdev->db_phys_addr +
+       out_params->dpi_phys_addr = p_hwfn->db_phys_addr +
                                    dpi_start_offset +
                                    ((out_params->dpi) * p_hwfn->dpi_size);