diff --git a/arch/sim/src/sim/sim_initialize.c b/arch/sim/src/sim/sim_initialize.c index a584d26da1..6f5718a7a6 100644 --- a/arch/sim/src/sim/sim_initialize.c +++ b/arch/sim/src/sim/sim_initialize.c @@ -187,10 +187,6 @@ static int sim_loop_task(int argc, char **argv) host_usrsock_loop(); #endif -#ifdef CONFIG_RPTUN - sim_rptun_loop(); -#endif - #ifdef CONFIG_SIM_HCISOCKET sim_bthcisock_loop(); #endif diff --git a/arch/sim/src/sim/sim_internal.h b/arch/sim/src/sim/sim_internal.h index b8cccd946b..67432a026a 100644 --- a/arch/sim/src/sim/sim_internal.h +++ b/arch/sim/src/sim/sim_internal.h @@ -350,7 +350,6 @@ void sim_netdriver_loop(void); #ifdef CONFIG_RPTUN int sim_rptun_init(const char *shmemname, const char *cpuname, bool master); -void sim_rptun_loop(void); #endif /* sim_hcisocket.c **********************************************************/ diff --git a/arch/sim/src/sim/sim_rptun.c b/arch/sim/src/sim/sim_rptun.c index 86d58d33da..ba06d8bd10 100644 --- a/arch/sim/src/sim/sim_rptun.c +++ b/arch/sim/src/sim/sim_rptun.c @@ -25,9 +25,16 @@ #include #include #include +#include #include "sim_internal.h" +/**************************************************************************** + * Pre-processor Definitions + ****************************************************************************/ + +#define SIM_RPTUN_WORK_DELAY 1 + /**************************************************************************** * Private Types ****************************************************************************/ @@ -43,7 +50,6 @@ struct sim_rptun_shmem_s struct sim_rptun_dev_s { - struct list_node node; struct rptun_dev_s rptun; rptun_callback_t callback; void *arg; @@ -53,6 +59,10 @@ struct sim_rptun_dev_s struct simple_addrenv_s addrenv[2]; char cpuname[RPMSG_NAME_SIZE + 1]; char shmemname[RPMSG_NAME_SIZE + 1]; + + /* Work queue for transmit */ + + struct work_s worker; }; /**************************************************************************** @@ -195,6 +205,35 @@ static int sim_rptun_register_callback(struct rptun_dev_s *dev, return 0; } +static void sim_rptun_work(void *arg) +{ + struct sim_rptun_dev_s *dev = arg; + + if (dev->shmem != NULL) + { + bool should_notify = false; + + if (dev->master && dev->seq != dev->shmem->seqs) + { + dev->seq = dev->shmem->seqs; + should_notify = true; + } + else if (!dev->master && dev->seq != dev->shmem->seqm) + { + dev->seq = dev->shmem->seqm; + should_notify = true; + } + + if (should_notify && dev->callback != NULL) + { + dev->callback(dev->arg, RPTUN_NOTIFY_ALL); + } + } + + work_queue(HPWORK, &dev->worker, + sim_rptun_work, dev, SIM_RPTUN_WORK_DELAY); +} + /**************************************************************************** * Private Data ****************************************************************************/ @@ -213,42 +252,10 @@ static const struct rptun_ops_s g_sim_rptun_ops = .register_callback = sim_rptun_register_callback, }; -static struct list_node g_dev_list = LIST_INITIAL_VALUE(g_dev_list); - /**************************************************************************** * Public Functions ****************************************************************************/ -void sim_rptun_loop(void) -{ - struct sim_rptun_dev_s *dev; - - list_for_every_entry(&g_dev_list, dev, - struct sim_rptun_dev_s, node) - { - if (dev->shmem != NULL) - { - bool should_notify = false; - - if (dev->master && dev->seq != dev->shmem->seqs) - { - dev->seq = dev->shmem->seqs; - should_notify = true; - } - else if (!dev->master && dev->seq != dev->shmem->seqm) - { - dev->seq = dev->shmem->seqm; - should_notify = true; - } - - if (should_notify && dev->callback != NULL) - { - dev->callback(dev->arg, RPTUN_NOTIFY_ALL); - } - } - } -} - int sim_rptun_init(const char *shmemname, const char *cpuname, bool master) { struct sim_rptun_dev_s *dev; @@ -264,14 +271,13 @@ int sim_rptun_init(const char *shmemname, const char *cpuname, bool master) dev->rptun.ops = &g_sim_rptun_ops; strlcpy(dev->cpuname, cpuname, RPMSG_NAME_SIZE); strlcpy(dev->shmemname, shmemname, RPMSG_NAME_SIZE); - list_add_tail(&g_dev_list, &dev->node); ret = rptun_initialize(&dev->rptun); if (ret < 0) { - list_delete(&dev->node); kmm_free(dev); + return ret; } - return ret; + return work_queue(HPWORK, &dev->worker, sim_rptun_work, dev, 0); }