diff --git a/drivers/rpmsg/rpmsg.c b/drivers/rpmsg/rpmsg.c index f2c9f44469..de50bb488a 100644 --- a/drivers/rpmsg/rpmsg.c +++ b/drivers/rpmsg/rpmsg.c @@ -97,15 +97,25 @@ rpmsg_get_by_rdev(FAR struct rpmsg_device *rdev) static int rpmsg_dev_ioctl_(FAR struct rpmsg_s *rpmsg, int cmd, unsigned long arg) { - int ret = OK; + int ret = -ENOTTY; switch (cmd) { case RPMSGIOC_PANIC: - rpmsg->ops->panic(rpmsg); + if (rpmsg->ops->panic) + { + rpmsg->ops->panic(rpmsg); + ret = OK; + } + break; case RPMSGIOC_DUMP: - rpmsg->ops->dump(rpmsg); + if (rpmsg->ops->dump) + { + rpmsg->ops->dump(rpmsg); + ret = OK; + } + break; #ifdef CONFIG_RPMSG_PING case RPMSGIOC_PING: @@ -113,7 +123,11 @@ static int rpmsg_dev_ioctl_(FAR struct rpmsg_s *rpmsg, int cmd, break; #endif default: - ret = rpmsg->ops->ioctl(rpmsg, cmd, arg); + if (rpmsg->ops->ioctl) + { + ret = rpmsg->ops->ioctl(rpmsg, cmd, arg); + } + break; } @@ -123,7 +137,8 @@ static int rpmsg_dev_ioctl_(FAR struct rpmsg_s *rpmsg, int cmd, static int rpmsg_dev_ioctl(FAR struct file *filep, int cmd, unsigned long arg) { - FAR struct rpmsg_s *rpmsg = filep->f_inode->i_private; + FAR struct rpmsg_s *rpmsg = + (FAR struct rpmsg_s *)filep->f_inode->i_private; return rpmsg_dev_ioctl_(rpmsg, cmd, arg); } @@ -171,37 +186,19 @@ int rpmsg_post(FAR struct rpmsg_endpoint *ept, FAR sem_t *sem) FAR const char *rpmsg_get_cpuname(FAR struct rpmsg_device *rdev) { FAR struct rpmsg_s *rpmsg = rpmsg_get_by_rdev(rdev); - - if (!rpmsg) - { - return NULL; - } - - return rpmsg->ops->get_cpuname(rpmsg); + return rpmsg ? rpmsg->ops->get_cpuname(rpmsg) : NULL; } int rpmsg_get_tx_buffer_size(FAR struct rpmsg_device *rdev) { FAR struct rpmsg_s *rpmsg = rpmsg_get_by_rdev(rdev); - - if (!rpmsg) - { - return -EINVAL; - } - - return rpmsg->ops->get_tx_buffer_size(rpmsg); + return rpmsg ? rpmsg->ops->get_tx_buffer_size(rpmsg) : -EINVAL; } int rpmsg_get_rx_buffer_size(FAR struct rpmsg_device *rdev) { FAR struct rpmsg_s *rpmsg = rpmsg_get_by_rdev(rdev); - - if (!rpmsg) - { - return -EINVAL; - } - - return rpmsg->ops->get_rx_buffer_size(rpmsg); + return rpmsg ? rpmsg->ops->get_rx_buffer_size(rpmsg) : -EINVAL; } int rpmsg_register_callback(FAR void *priv, @@ -213,10 +210,9 @@ int rpmsg_register_callback(FAR void *priv, FAR struct metal_list *node; FAR struct metal_list *bnode; FAR struct rpmsg_cb_s *cb; - FAR struct rpmsg_s *rpmsg; cb = kmm_zalloc(sizeof(struct rpmsg_cb_s)); - if (!cb) + if (cb == NULL) { return -ENOMEM; } @@ -228,11 +224,12 @@ int rpmsg_register_callback(FAR void *priv, cb->ns_bind = ns_bind; nxrmutex_lock(&g_rpmsg_lock); - metal_list_for_each(&g_rpmsg, node) { - rpmsg = metal_container_of(node, struct rpmsg_s, node); - if (!rpmsg->rdev->ns_unbind_cb) + FAR struct rpmsg_s *rpmsg = + metal_container_of(node, struct rpmsg_s, node); + + if (rpmsg->rdev->ns_unbind_cb == NULL) { continue; } @@ -248,15 +245,14 @@ int rpmsg_register_callback(FAR void *priv, } DEBUGASSERT(ns_match != NULL); + again: - nxrmutex_lock(&rpmsg->lock); - metal_list_for_each(&rpmsg->bind, bnode) { - FAR struct rpmsg_bind_s *bind; + FAR struct rpmsg_bind_s *bind = + metal_container_of(bnode, struct rpmsg_bind_s, node); - bind = metal_container_of(bnode, struct rpmsg_bind_s, node); if (ns_match(rpmsg->rdev, priv, bind->name, bind->dest)) { metal_list_del(bnode); @@ -287,12 +283,11 @@ void rpmsg_unregister_callback(FAR void *priv, FAR struct metal_list *pnode; nxrmutex_lock(&g_rpmsg_lock); - metal_list_for_each(&g_rpmsg_cb, node) { - FAR struct rpmsg_cb_s *cb = NULL; + FAR struct rpmsg_cb_s *cb = + metal_container_of(node, struct rpmsg_cb_s, node); - cb = metal_container_of(node, struct rpmsg_cb_s, node); if (cb->priv == priv && cb->device_created == device_created && cb->device_destroy == device_destroy && @@ -301,7 +296,6 @@ void rpmsg_unregister_callback(FAR void *priv, { metal_list_del(&cb->node); kmm_free(cb); - break; } } @@ -310,9 +304,9 @@ void rpmsg_unregister_callback(FAR void *priv, { metal_list_for_each(&g_rpmsg, pnode) { - FAR struct rpmsg_s *rpmsg; + FAR struct rpmsg_s *rpmsg = + metal_container_of(pnode, struct rpmsg_s, node); - rpmsg = metal_container_of(pnode, struct rpmsg_s, node); if (rpmsg->rdev->ns_unbind_cb) { device_destroy(rpmsg->rdev, priv); @@ -331,12 +325,11 @@ void rpmsg_ns_bind(FAR struct rpmsg_device *rdev, FAR struct metal_list *node; nxrmutex_lock(&g_rpmsg_lock); - metal_list_for_each(&g_rpmsg_cb, node) { - FAR struct rpmsg_cb_s *cb; + FAR struct rpmsg_cb_s *cb = + metal_container_of(node, struct rpmsg_cb_s, node); - cb = metal_container_of(node, struct rpmsg_cb_s, node); if (cb->ns_match && cb->ns_match(rdev, cb->priv, name, dest)) { rpmsg_bind_cb_t ns_bind = cb->ns_bind; @@ -345,7 +338,6 @@ void rpmsg_ns_bind(FAR struct rpmsg_device *rdev, nxrmutex_unlock(&g_rpmsg_lock); DEBUGASSERT(ns_bind != NULL); ns_bind(rdev, cb_priv, name, dest); - return; } } @@ -373,12 +365,10 @@ void rpmsg_ns_unbind(FAR struct rpmsg_device *rdev, FAR struct metal_list *node; nxrmutex_lock(&rpmsg->lock); - metal_list_for_each(&rpmsg->bind, node) { - FAR struct rpmsg_bind_s *bind; - - bind = metal_container_of(node, struct rpmsg_bind_s, node); + FAR struct rpmsg_bind_s *bind = + metal_container_of(node, struct rpmsg_bind_s, node); if (bind->dest == dest && !strncmp(bind->name, name, RPMSG_NAME_SIZE)) { @@ -393,14 +383,14 @@ void rpmsg_ns_unbind(FAR struct rpmsg_device *rdev, void rpmsg_device_created(FAR struct rpmsg_s *rpmsg) { - FAR struct rpmsg_cb_s *cb; FAR struct metal_list *node; nxrmutex_lock(&g_rpmsg_lock); - metal_list_for_each(&g_rpmsg_cb, node) { - cb = metal_container_of(node, struct rpmsg_cb_s, node); + FAR struct rpmsg_cb_s *cb = + metal_container_of(node, struct rpmsg_cb_s, node); + if (cb->device_created) { cb->device_created(rpmsg->rdev, cb->priv); @@ -416,7 +406,6 @@ void rpmsg_device_created(FAR struct rpmsg_s *rpmsg) void rpmsg_device_destory(FAR struct rpmsg_s *rpmsg) { - FAR struct rpmsg_cb_s *cb; FAR struct metal_list *node; FAR struct metal_list *tmp; @@ -425,25 +414,25 @@ void rpmsg_device_destory(FAR struct rpmsg_s *rpmsg) #endif nxrmutex_lock(&rpmsg->lock); - metal_list_for_each_safe(&rpmsg->bind, node, tmp) { - FAR struct rpmsg_bind_s *bind; + FAR struct rpmsg_bind_s *bind = + metal_container_of(node, struct rpmsg_bind_s, node); - bind = metal_container_of(node, struct rpmsg_bind_s, node); metal_list_del(node); kmm_free(bind); } nxrmutex_unlock(&rpmsg->lock); - nxrmutex_lock(&g_rpmsg_lock); - /* Broadcast device_destroy to all registers */ + nxrmutex_lock(&g_rpmsg_lock); metal_list_for_each(&g_rpmsg_cb, node) { - cb = metal_container_of(node, struct rpmsg_cb_s, node); + FAR struct rpmsg_cb_s *cb = + metal_container_of(node, struct rpmsg_cb_s, node); + if (cb->device_destroy) { cb->device_destroy(rpmsg->rdev, cb->priv); @@ -457,23 +446,18 @@ int rpmsg_register(FAR const char *path, FAR struct rpmsg_s *rpmsg, FAR const struct rpmsg_ops_s *ops) { struct metal_init_params params = METAL_INIT_DEFAULTS; - static bool onceinit = false; int ret; - if (!onceinit) + ret = metal_init(¶ms); + if (ret < 0) { - ret = metal_init(¶ms); - if (ret < 0) - { - return ret; - } - - onceinit = true; + return ret; } ret = register_driver(path, &g_rpmsg_dev_ops, 0222, rpmsg); if (ret < 0) { + metal_finish(); return ret; } @@ -497,8 +481,9 @@ void rpmsg_unregister(FAR const char *path, FAR struct rpmsg_s *rpmsg) nxrmutex_unlock(&g_rpmsg_lock); nxrmutex_destroy(&rpmsg->lock); - unregister_driver(path); + + metal_finish(); } int rpmsg_ioctl(FAR const char *cpuname, int cmd, unsigned long arg) @@ -507,12 +492,10 @@ int rpmsg_ioctl(FAR const char *cpuname, int cmd, unsigned long arg) int ret = OK; nxrmutex_lock(&g_rpmsg_lock); - metal_list_for_each(&g_rpmsg, node) { - FAR struct rpmsg_s *rpmsg; - - rpmsg = metal_container_of(node, struct rpmsg_s, node); + FAR struct rpmsg_s *rpmsg = + metal_container_of(node, struct rpmsg_s, node); if (!cpuname || !strcmp(rpmsg_get_cpuname(rpmsg->rdev), cpuname)) {