unsigned int data_avail;
        int index;
        bool busy;
+       bool hwrng_register_done;
 };
 
 static bool probe_done;
                return err;
        }
 
-       err = hwrng_register(&vi->hwrng);
-       if (err) {
-               vdev->config->del_vqs(vdev);
-               vi->vq = NULL;
-               kfree(vi);
-               ida_simple_remove(&rng_index_ida, index);
-               return err;
-       }
-
        probe_done = true;
        return 0;
 }
 static void remove_common(struct virtio_device *vdev)
 {
        struct virtrng_info *vi = vdev->priv;
+
        vdev->config->reset(vdev);
        vi->busy = false;
-       hwrng_unregister(&vi->hwrng);
+       if (vi->hwrng_register_done)
+               hwrng_unregister(&vi->hwrng);
        vdev->config->del_vqs(vdev);
        ida_simple_remove(&rng_index_ida, vi->index);
        kfree(vi);
        remove_common(vdev);
 }
 
+static void virtrng_scan(struct virtio_device *vdev)
+{
+       struct virtrng_info *vi = vdev->priv;
+       int err;
+
+       err = hwrng_register(&vi->hwrng);
+       if (!err)
+               vi->hwrng_register_done = true;
+}
+
 #ifdef CONFIG_PM_SLEEP
 static int virtrng_freeze(struct virtio_device *vdev)
 {
        .id_table =     id_table,
        .probe =        virtrng_probe,
        .remove =       virtrng_remove,
+       .scan =         virtrng_scan,
 #ifdef CONFIG_PM_SLEEP
        .freeze =       virtrng_freeze,
        .restore =      virtrng_restore,