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:14:01 +0000 (09:14 +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 4dd82a1..a6a9688 100644 (file)
@@ -3096,6 +3096,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)
 {
        int rc = 0;
@@ -3103,6 +3104,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);
@@ -3198,7 +3200,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;
 
@@ -3207,22 +3211,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 7873d6d..13802b8 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);