Skip to content

Commit f5739e1

Browse files
leo11261CV-Bowen
authored andcommitted
rpmsg: call unbound_cb if service used as server/client when it is destroyed
Before this patch, the rpmsg services will not be destroied after call the rpmsg_device_destory(). And will cause error after call rpmsg_device_created() at the secound connecting witt peer. Signed-off-by: liaoao <[email protected]> Signed-off-by: Bowen Wang <[email protected]>
1 parent adda070 commit f5739e1

File tree

2 files changed

+26
-20
lines changed

2 files changed

+26
-20
lines changed

drivers/rpmsg/rpmsg.c

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -232,6 +232,7 @@ int rpmsg_register_callback(FAR void *priv,
232232
cb->ns_bind = ns_bind;
233233

234234
nxrmutex_lock(&g_rpmsg_lock);
235+
metal_list_add_tail(&g_rpmsg_cb, &cb->node);
235236
metal_list_for_each(&g_rpmsg, node)
236237
{
237238
FAR struct rpmsg_s *rpmsg =
@@ -275,7 +276,6 @@ int rpmsg_register_callback(FAR void *priv,
275276
nxrmutex_unlock(&rpmsg->lock);
276277
}
277278

278-
metal_list_add_tail(&g_rpmsg_cb, &cb->node);
279279
nxrmutex_unlock(&g_rpmsg_lock);
280280

281281
return 0;
@@ -418,6 +418,7 @@ void rpmsg_device_destory(FAR struct rpmsg_s *rpmsg)
418418
{
419419
FAR struct metal_list *node;
420420
FAR struct metal_list *tmp;
421+
FAR struct rpmsg_endpoint *ept;
421422

422423
#ifdef CONFIG_RPMSG_PING
423424
rpmsg_ping_deinit(&rpmsg->ping);
@@ -450,6 +451,24 @@ void rpmsg_device_destory(FAR struct rpmsg_s *rpmsg)
450451
}
451452

452453
nxrmutex_unlock(&g_rpmsg_lock);
454+
455+
/* Release all ept attached to current rpmsg device */
456+
457+
metal_mutex_acquire(&rpmsg->rdev->lock);
458+
metal_list_for_each_safe(&rpmsg->rdev->endpoints, tmp, node)
459+
{
460+
ept = metal_container_of(node, struct rpmsg_endpoint, node);
461+
if (ept->ns_unbind_cb)
462+
{
463+
ept->ns_unbind_cb(ept);
464+
}
465+
else
466+
{
467+
rpmsg_destroy_ept(ept);
468+
}
469+
}
470+
471+
metal_mutex_release(&rpmsg->rdev->lock);
453472
}
454473

455474
int rpmsg_register(FAR const char *path, FAR struct rpmsg_s *rpmsg,

drivers/rpmsg/rpmsg_port.c

Lines changed: 6 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -612,9 +612,6 @@ int rpmsg_port_initialize(FAR struct rpmsg_port_s *port,
612612
rdev->support_ack = true;
613613
rdev->support_ns = true;
614614

615-
rpmsg_register_endpoint(rdev, &rdev->ns_ept, "NS", RPMSG_NS_EPT_ADDR,
616-
RPMSG_NS_EPT_ADDR, rpmsg_port_ns_callback, NULL,
617-
port);
618615
port->ops->register_callback(port, rpmsg_port_rx_callback);
619616

620617
return 0;
@@ -626,22 +623,9 @@ int rpmsg_port_initialize(FAR struct rpmsg_port_s *port,
626623

627624
void rpmsg_port_uninitialize(FAR struct rpmsg_port_s *port)
628625
{
629-
FAR struct rpmsg_device *rdev = &port->rdev;
630-
FAR struct metal_list *node;
631-
FAR struct rpmsg_endpoint *ept;
632-
633-
while (!metal_list_is_empty(&rdev->endpoints))
634-
{
635-
node = rdev->endpoints.next;
636-
ept = metal_container_of(node, struct rpmsg_endpoint, node);
637-
rpmsg_destroy_ept(ept);
638-
if (ept->ns_unbind_cb)
639-
{
640-
ept->ns_unbind_cb(ept);
641-
}
642-
}
626+
FAR struct rpmsg_s *rpmsg = &port->rpmsg;
643627

644-
metal_mutex_deinit(&rdev->lock);
628+
metal_mutex_deinit(&rpmsg->rdev->lock);
645629
rpmsg_port_destroy_queues(port);
646630
}
647631

@@ -747,6 +731,9 @@ int rpmsg_port_register(FAR struct rpmsg_port_s *port,
747731
return ret;
748732
}
749733

734+
rpmsg_register_endpoint(&port->rdev, &port->rdev.ns_ept, "NS",
735+
RPMSG_NS_EPT_ADDR, RPMSG_NS_EPT_ADDR,
736+
rpmsg_port_ns_callback, NULL, port);
750737
rpmsg_device_created(&port->rpmsg);
751738
return ret;
752739
}
@@ -760,9 +747,9 @@ void rpmsg_port_unregister(FAR struct rpmsg_port_s *port)
760747
char name[64];
761748

762749
snprintf(name, sizeof(name), "/dev/rpmsg/%s", port->cpuname);
763-
rpmsg_unregister(name, &port->rpmsg);
764750

765751
rpmsg_device_destory(&port->rpmsg);
752+
rpmsg_unregister(name, &port->rpmsg);
766753
}
767754

768755
/****************************************************************************

0 commit comments

Comments
 (0)