wlan_workqueue.c 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. /*
  2. * Copyright (c) 2006-2018, 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_ENABLE
  15. #define DBG_LEVEL DBG_INFO
  16. #define DBG_SECTION_NAME "WLAN.work"
  17. #define DBG_COLOR
  18. #include <rtdbg.h>
  19. struct rt_wlan_work
  20. {
  21. struct rt_work work;
  22. void (*fun)(void *parameter);
  23. void *parameter;
  24. };
  25. static struct rt_workqueue *wlan_workqueue;
  26. static void rt_wlan_workqueue_fun(struct rt_work *work, void *work_data)
  27. {
  28. struct rt_wlan_work *wlan_work = work_data;
  29. wlan_work->fun(wlan_work->parameter);
  30. rt_free(wlan_work);
  31. }
  32. struct rt_workqueue *rt_wlan_get_workqueue(void)
  33. {
  34. return wlan_workqueue;
  35. }
  36. rt_err_t rt_wlan_workqueue_dowork(void (*func)(void *parameter), void *parameter)
  37. {
  38. struct rt_wlan_work *wlan_work;
  39. rt_err_t err = RT_EOK;
  40. LOG_D("F:%s is run", __FUNCTION__);
  41. if (func == RT_NULL)
  42. {
  43. LOG_E("F:%s L:%d func is null", __FUNCTION__, __LINE__);
  44. return -RT_EINVAL;
  45. }
  46. if (wlan_workqueue == RT_NULL)
  47. {
  48. LOG_E("F:%s L:%d not init wlan work queue", __FUNCTION__, __LINE__);
  49. return -RT_ERROR;
  50. }
  51. wlan_work = rt_malloc(sizeof(struct rt_wlan_work));
  52. if (wlan_work == RT_NULL)
  53. {
  54. LOG_E("F:%s L:%d create work failed", __FUNCTION__, __LINE__);
  55. return -RT_ENOMEM;
  56. }
  57. wlan_work->fun = func;
  58. wlan_work->parameter = parameter;
  59. rt_work_init(&wlan_work->work, rt_wlan_workqueue_fun, wlan_work);
  60. err = rt_workqueue_dowork(wlan_workqueue, &wlan_work->work);
  61. if (err != RT_EOK)
  62. {
  63. LOG_E("F:%s L:%d do work failed", __FUNCTION__, __LINE__);
  64. rt_free(wlan_work);
  65. return err;
  66. }
  67. return err;
  68. }
  69. int rt_wlan_workqueue_init(void)
  70. {
  71. static rt_int8_t _init_flag = 0;
  72. if (_init_flag == 0)
  73. {
  74. wlan_workqueue = rt_workqueue_create(RT_WLAN_WORKQUEUE_THREAD_NAME, RT_WLAN_WORKQUEUE_THREAD_SIZE,
  75. RT_WLAN_WORKQUEUE_THREAD_PRIO);
  76. if (wlan_workqueue == RT_NULL)
  77. {
  78. LOG_E("F:%s L:%d wlan work queue create failed", __FUNCTION__, __LINE__);
  79. return -1;
  80. }
  81. _init_flag = 1;
  82. return 0;
  83. }
  84. return 0;
  85. }
  86. INIT_PREV_EXPORT(rt_wlan_workqueue_init);