wlan_workqueue.c 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. /*
  2. * Copyright (c) 2006-2023, RT-Thread Development Team
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. * 2018-08-19 tyx the first version
  9. */
  10. #include <rthw.h>
  11. #include <rtthread.h>
  12. #include <wlan_workqueue.h>
  13. #include <ipc/workqueue.h>
  14. #define DBG_TAG "WLAN.work"
  15. #define DBG_LVL DBG_INFO
  16. #include <rtdbg.h>
  17. #ifdef RT_WLAN_WORK_THREAD_ENABLE
  18. struct rt_wlan_work
  19. {
  20. struct rt_work work;
  21. void (*fun)(void *parameter);
  22. void *parameter;
  23. };
  24. static struct rt_workqueue *wlan_workqueue;
  25. static void rt_wlan_workqueue_fun(struct rt_work *work, void *work_data)
  26. {
  27. struct rt_wlan_work *wlan_work = work_data;
  28. wlan_work->fun(wlan_work->parameter);
  29. rt_free(wlan_work);
  30. }
  31. struct rt_workqueue *rt_wlan_get_workqueue(void)
  32. {
  33. return wlan_workqueue;
  34. }
  35. rt_err_t rt_wlan_workqueue_dowork(void (*func)(void *parameter), void *parameter)
  36. {
  37. struct rt_wlan_work *wlan_work;
  38. rt_err_t err = RT_EOK;
  39. LOG_D("F:%s is run", __FUNCTION__);
  40. if (func == RT_NULL)
  41. {
  42. LOG_E("F:%s L:%d func is null", __FUNCTION__, __LINE__);
  43. return -RT_EINVAL;
  44. }
  45. if (wlan_workqueue == RT_NULL)
  46. {
  47. LOG_E("F:%s L:%d not init wlan work queue", __FUNCTION__, __LINE__);
  48. return -RT_ERROR;
  49. }
  50. wlan_work = rt_malloc(sizeof(struct rt_wlan_work));
  51. if (wlan_work == RT_NULL)
  52. {
  53. LOG_E("F:%s L:%d create work failed", __FUNCTION__, __LINE__);
  54. return -RT_ENOMEM;
  55. }
  56. wlan_work->fun = func;
  57. wlan_work->parameter = parameter;
  58. rt_work_init(&wlan_work->work, rt_wlan_workqueue_fun, wlan_work);
  59. err = rt_workqueue_dowork(wlan_workqueue, &wlan_work->work);
  60. if (err != RT_EOK)
  61. {
  62. LOG_E("F:%s L:%d do work failed", __FUNCTION__, __LINE__);
  63. rt_free(wlan_work);
  64. return err;
  65. }
  66. return err;
  67. }
  68. int rt_wlan_workqueue_init(void)
  69. {
  70. static rt_int8_t _init_flag = 0;
  71. if (_init_flag == 0)
  72. {
  73. wlan_workqueue = rt_workqueue_create(RT_WLAN_WORKQUEUE_THREAD_NAME, RT_WLAN_WORKQUEUE_THREAD_SIZE,
  74. RT_WLAN_WORKQUEUE_THREAD_PRIO);
  75. if (wlan_workqueue == RT_NULL)
  76. {
  77. LOG_E("F:%s L:%d wlan work queue create failed", __FUNCTION__, __LINE__);
  78. return -1;
  79. }
  80. _init_flag = 1;
  81. return 0;
  82. }
  83. return 0;
  84. }
  85. INIT_PREV_EXPORT(rt_wlan_workqueue_init);
  86. #endif