The mailbox address was computed assuming 1 ring per VF. Read the
actual rings-per-VF from OCTEP_EPF_RINFO and use it when calculating
OCTEP_PF_MBOX_DATA offsets, fixing VF initialization when rings
per VF > 1.

Fixes: 8b6c724cdab8 ("virtio: vdpa: vDPA driver for Marvell OCTEON DPU devices")
Signed-off-by: Srujana Challa <[email protected]>
---
 drivers/vdpa/octeon_ep/octep_vdpa_main.c | 7 ++++++-
 1 file changed, 6 insertions(+), 1 deletion(-)

diff --git a/drivers/vdpa/octeon_ep/octep_vdpa_main.c 
b/drivers/vdpa/octeon_ep/octep_vdpa_main.c
index 31a02e7fd7f2..9946480ee704 100644
--- a/drivers/vdpa/octeon_ep/octep_vdpa_main.c
+++ b/drivers/vdpa/octeon_ep/octep_vdpa_main.c
@@ -1,6 +1,7 @@
 // SPDX-License-Identifier: GPL-2.0-only
 /* Copyright (C) 2024 Marvell. */
 
+#include <linux/bitfield.h>
 #include <linux/interrupt.h>
 #include <linux/io-64-nonatomic-lo-hi.h>
 #include <linux/module.h>
@@ -722,6 +723,8 @@ static int octep_sriov_enable(struct pci_dev *pdev, int 
num_vfs)
        bool done = false;
        int index = 0;
        int ret, i;
+       u8 rpvf;
+       u64 val;
 
        ret = pci_enable_sriov(pdev, num_vfs);
        if (ret)
@@ -741,9 +744,11 @@ static int octep_sriov_enable(struct pci_dev *pdev, int 
num_vfs)
                }
        }
 
+       val = readq(addr + OCTEP_EPF_RINFO(0));
+       rpvf = FIELD_GET(GENMASK_ULL(35, 32), val);
        if (done) {
                for (i = 0; i < pf->enabled_vfs; i++)
-                       writeq(OCTEP_DEV_READY_SIGNATURE, addr + 
OCTEP_PF_MBOX_DATA(i));
+                       writeq(OCTEP_DEV_READY_SIGNATURE, addr + 
OCTEP_PF_MBOX_DATA(i * rpvf));
        }
 
        return num_vfs;
-- 
2.25.1


Reply via email to