Signed-off-by: Andy Pei <andy....@intel.com>
---
 drivers/vdpa/ifc/base/ifcvf.c |  2 +-
 drivers/vdpa/ifc/base/ifcvf.h |  3 +++
 drivers/vdpa/ifc/ifcvf_vdpa.c | 32 +++++++++++++++++++++++---------
 3 files changed, 27 insertions(+), 10 deletions(-)

diff --git a/drivers/vdpa/ifc/base/ifcvf.c b/drivers/vdpa/ifc/base/ifcvf.c
index a8a4728..7018048 100644
--- a/drivers/vdpa/ifc/base/ifcvf.c
+++ b/drivers/vdpa/ifc/base/ifcvf.c
@@ -116,7 +116,7 @@
        IFCVF_WRITE_REG8(status, &hw->common_cfg->device_status);
 }
 
-STATIC void
+void
 ifcvf_reset(struct ifcvf_hw *hw)
 {
        ifcvf_set_status(hw, 0);
diff --git a/drivers/vdpa/ifc/base/ifcvf.h b/drivers/vdpa/ifc/base/ifcvf.h
index 7367094..f22d18b 100644
--- a/drivers/vdpa/ifc/base/ifcvf.h
+++ b/drivers/vdpa/ifc/base/ifcvf.h
@@ -157,6 +157,9 @@ struct ifcvf_hw {
 int
 ifcvf_init_hw(struct ifcvf_hw *hw, PCI_DEV *dev);
 
+void
+ifcvf_reset(struct ifcvf_hw *hw);
+
 u64
 ifcvf_get_features(struct ifcvf_hw *hw);
 
diff --git a/drivers/vdpa/ifc/ifcvf_vdpa.c b/drivers/vdpa/ifc/ifcvf_vdpa.c
index 546f9bd..ff233bc 100644
--- a/drivers/vdpa/ifc/ifcvf_vdpa.c
+++ b/drivers/vdpa/ifc/ifcvf_vdpa.c
@@ -359,23 +359,32 @@ struct rte_vdpa_dev_info {
 vdpa_ifcvf_blk_pause(struct ifcvf_internal *internal)
 {
        struct ifcvf_hw *hw = &internal->hw;
-       struct rte_vhost_vring vq;
        int i, vid;
        uint64_t features = 0;
        uint64_t log_base = 0, log_size = 0;
        uint64_t len;
+       u32 ring_state = 0;
 
        vid = internal->vid;
 
        if (internal->device_type == IFCVF_BLK) {
                for (i = 0; i < hw->nr_vring; i++) {
-                       rte_vhost_get_vhost_vring(internal->vid, i, &vq);
-                       while (vq.avail->idx != vq.used->idx) {
-                               ifcvf_notify_queue(hw, i);
-                               usleep(10);
-                       }
-                       hw->vring[i].last_avail_idx = vq.avail->idx;
-                       hw->vring[i].last_used_idx = vq.used->idx;
+                       do {
+                               if (hw->lm_cfg != NULL)
+                                       ring_state = *(u32 *)(hw->lm_cfg +
+                                               IFCVF_LM_RING_STATE_OFFSET +
+                                               i * IFCVF_LM_CFG_SIZE);
+                               hw->vring[i].last_avail_idx =
+                                       (u16)(ring_state & IFCVF_16_BIT_MASK);
+                               hw->vring[i].last_used_idx =
+                                       (u16)(ring_state >> 16);
+                               if (hw->vring[i].last_avail_idx !=
+                                       hw->vring[i].last_used_idx) {
+                                       ifcvf_notify_queue(hw, i);
+                                       usleep(10);
+                               }
+                       } while (hw->vring[i].last_avail_idx !=
+                               hw->vring[i].last_used_idx);
                }
        }
 
@@ -766,7 +775,12 @@ struct rte_vdpa_dev_info {
                if (ret)
                        goto err;
 
-               vdpa_ifcvf_stop(internal);
+               if (internal->device_type == IFCVF_BLK) {
+                       vdpa_ifcvf_blk_pause(internal);
+                       ifcvf_reset(&internal->hw);
+               } else {
+                       vdpa_ifcvf_stop(internal);
+               }
 
                ret = vdpa_disable_vfio_intr(internal);
                if (ret)
-- 
1.8.3.1

Reply via email to