From 66cf86da8b3abcd0bdcdedfafe9fccec5e35edb2 Mon Sep 17 00:00:00 2001 From: Xiang Xiao Date: Mon, 7 Jan 2019 00:26:09 +0800 Subject: [PATCH] check VIRTIO_RPMSG_F_NS before send the namespace message Signed-off-by: Xiang Xiao --- lib/include/openamp/rpmsg.h | 2 ++ lib/rpmsg/rpmsg.c | 4 ++-- lib/rpmsg/rpmsg_virtio.c | 3 ++- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/lib/include/openamp/rpmsg.h b/lib/include/openamp/rpmsg.h index 1884acb..bc05505 100644 --- a/lib/include/openamp/rpmsg.h +++ b/lib/include/openamp/rpmsg.h @@ -97,6 +97,7 @@ struct rpmsg_device_ops { * @ns_bind_cb: callback handler for name service announcement without local * endpoints waiting to bind. * @ops: RPMsg device operations + * @support_ns: create/destroy namespace message */ struct rpmsg_device { struct metal_list endpoints; @@ -105,6 +106,7 @@ struct rpmsg_device { metal_mutex_t lock; rpmsg_ns_bind_cb ns_bind_cb; struct rpmsg_device_ops ops; + bool support_ns; }; /** diff --git a/lib/rpmsg/rpmsg.c b/lib/rpmsg/rpmsg.c index 0571955..e8bb397 100644 --- a/lib/rpmsg/rpmsg.c +++ b/lib/rpmsg/rpmsg.c @@ -227,7 +227,7 @@ int rpmsg_create_ept(struct rpmsg_endpoint *ept, struct rpmsg_device *rdev, rpmsg_init_ept(ept, name, addr, dest, cb, unbind_cb); rpmsg_register_endpoint(rdev, ept); - if (ept->dest_addr == RPMSG_ADDR_ANY) { + if (rdev->support_ns && ept->dest_addr == RPMSG_ADDR_ANY) { /* Send NS announcement to remote processor */ metal_mutex_release(&rdev->lock); status = rpmsg_send_ns_message(ept, RPMSG_NS_CREATE); @@ -257,7 +257,7 @@ void rpmsg_destroy_ept(struct rpmsg_endpoint *ept) return; rdev = ept->rdev; - if (ept->addr != RPMSG_NS_EPT_ADDR) + if (rdev->support_ns && ept->addr != RPMSG_NS_EPT_ADDR) (void)rpmsg_send_ns_message(ept, RPMSG_NS_DESTROY); metal_mutex_acquire(&rdev->lock); rpmsg_unregister_endpoint(ept); diff --git a/lib/rpmsg/rpmsg_virtio.c b/lib/rpmsg/rpmsg_virtio.c index 222bb15..c86e2b3 100644 --- a/lib/rpmsg/rpmsg_virtio.c +++ b/lib/rpmsg/rpmsg_virtio.c @@ -538,6 +538,7 @@ int rpmsg_init_vdev(struct rpmsg_virtio_device *rvdev, } #endif /*!VIRTIO_MASTER_ONLY*/ vdev->features = rpmsg_virtio_get_features(rvdev); + rdev->support_ns = !!(vdev->features & (1 << VIRTIO_RPMSG_F_NS)); #ifndef VIRTIO_SLAVE_ONLY if (role == RPMSG_MASTER) { @@ -633,7 +634,7 @@ int rpmsg_init_vdev(struct rpmsg_virtio_device *rvdev, * Create name service announcement endpoint if device supports name * service announcement feature. */ - if (vdev->features & (1 << VIRTIO_RPMSG_F_NS)) { + if (rdev->support_ns) { rpmsg_init_ept(&rdev->ns_ept, "NS", RPMSG_NS_EPT_ADDR, RPMSG_NS_EPT_ADDR, rpmsg_virtio_ns_callback, NULL);