]> Gitweb @ Texas Instruments - Open Source Git Repositories - git.TI.com/gitweb - processor-sdk/open-amp.git/blobdiff - lib/rpmsg/remote_device.c
rpmsg: remote_device: notify remote it's resetted in ready().
[processor-sdk/open-amp.git] / lib / rpmsg / remote_device.c
index 9ddfa93c0edb0718e3d254ef5e68a3de23c1492a..930c9e61a20c8a64f905b1a62ef61457dc115f57 100644 (file)
@@ -214,20 +214,21 @@ void rpmsg_rdev_deinit(struct remote_device *rdev)
                _destroy_endpoint(rdev, rp_ept);
        }
 
-       if (rdev->rvq) {
-               virtqueue_free(rdev->rvq);
-       }
-       if (rdev->tvq) {
-               virtqueue_free(rdev->tvq);
-       }
+       metal_mutex_acquire(&rdev->lock);
+       rdev->rvq = 0;
+       rdev->tvq = 0;
        if (rdev->mem_pool) {
                sh_mem_delete_pool(rdev->mem_pool);
+               rdev->mem_pool = 0;
        }
-       metal_mutex_deinit(&rdev->lock);
+       metal_mutex_release(&rdev->lock);
+       hil_free_vqs(&rdev->virt_dev);
+
        if (rdev->proc) {
                hil_delete_proc(rdev->proc);
                rdev->proc = 0;
        }
+       metal_mutex_deinit(&rdev->lock);
 
        metal_free_memory(rdev);
 }
@@ -304,27 +305,11 @@ struct rpmsg_endpoint *rpmsg_rdev_get_endpoint_from_addr(struct remote_device *r
  */
 int rpmsg_rdev_notify(struct remote_device *rdev)
 {
-       int status = RPMSG_SUCCESS;
-
-       if (rdev->role == RPMSG_REMOTE) {
-               status = hil_get_status(rdev->proc);
-
-               /*
-                * Let the remote device know that Master is ready for
-                * communication.
-                */
-               if (!status)
-                       virtqueue_kick(rdev->rvq);
-
-       } else {
-               status = hil_set_status(rdev->proc);
-       }
+       struct virtio_device *vdev = &rdev->virt_dev;
 
-       if (status == RPMSG_SUCCESS) {
-               rdev->state = RPMSG_DEV_STATE_ACTIVE;
-       }
+       hil_vdev_notify(vdev);
 
-       return status;
+       return RPMSG_SUCCESS;
 }
 
 /**
@@ -381,10 +366,14 @@ int rpmsg_rdev_remote_ready(struct remote_device *rdev)
        uint8_t status;
        if (rdev->role == RPMSG_MASTER) {
                while (1) {
-                       /* Busy wait until the remote is ready */
                        status = vdev->func->get_status(vdev);
-                       if (status & VIRTIO_CONFIG_STATUS_DRIVER_OK)
+                       /* Busy wait until the remote is ready */
+                       if (status & VIRTIO_CONFIG_STATUS_NEEDS_RESET) {
+                               rpmsg_rdev_set_status(vdev, 0);
+                               hil_vdev_notify(vdev);
+                       } else if (status & VIRTIO_CONFIG_STATUS_DRIVER_OK) {
                                return true;
+                       }
                        metal_cpu_yield();
                }
        } else {
@@ -571,3 +560,4 @@ void rpmsg_rdev_reset(struct virtio_device *dev)
 
        return;
 }
+