@@ -33,6 +33,14 @@ LOG_MODULE_REGISTER(bt_mesh_adv_ext);
3333#define CONFIG_BT_MESH_RELAY_ADV_SETS 0
3434#endif
3535
36+ #ifdef CONFIG_BT_MESH_ADV_STACK_SIZE
37+ #define MESH_WORKQ_PRIORITY CONFIG_BT_MESH_ADV_PRIO
38+ #define MESH_WORKQ_STACK_SIZE CONFIG_BT_MESH_ADV_STACK_SIZE
39+ #else
40+ #define MESH_WORKQ_PRIORITY 0
41+ #define MESH_WORKQ_STACK_SIZE 0
42+ #endif
43+
3644enum {
3745 /** Controller is currently advertising */
3846 ADV_FLAG_ACTIVE ,
@@ -69,6 +77,15 @@ struct bt_mesh_ext_adv {
6977static void send_pending_adv (struct k_work * work );
7078static bool schedule_send (struct bt_mesh_ext_adv * ext_adv );
7179
80+ static struct k_work_q bt_mesh_workq ;
81+ static K_KERNEL_STACK_DEFINE (thread_stack , MESH_WORKQ_STACK_SIZE ) ;
82+
83+ #if defined(CONFIG_BT_MESH_WORKQ_MESH )
84+ #define MESH_WORKQ &bt_mesh_workq
85+ #else /* CONFIG_BT_MESH_WORKQ_SYS */
86+ #define MESH_WORKQ &k_sys_work_q
87+ #endif /* CONFIG_BT_MESH_WORKQ_MESH */
88+
7289static struct bt_mesh_ext_adv advs [] = {
7390 [0 ] = {
7491 .tags = (
@@ -258,7 +275,7 @@ static bool schedule_send_with_mask(struct bt_mesh_ext_adv *ext_adv, int ignore_
258275 }
259276
260277 atomic_clear_bit (ext_adv -> flags , ADV_FLAG_SCHEDULE_PENDING );
261- k_work_submit (& ext_adv -> work );
278+ bt_mesh_wq_submit (& ext_adv -> work );
262279
263280 return true;
264281}
@@ -407,7 +424,7 @@ int bt_mesh_adv_terminate(struct bt_mesh_adv *adv)
407424
408425 atomic_set_bit (ext_adv -> flags , ADV_FLAG_SENT );
409426
410- k_work_submit (& ext_adv -> work );
427+ bt_mesh_wq_submit (& ext_adv -> work );
411428
412429 return 0 ;
413430 }
@@ -429,6 +446,13 @@ void bt_mesh_adv_init(void)
429446 for (int i = 0 ; i < ARRAY_SIZE (advs ); i ++ ) {
430447 (void )memcpy (& advs [i ].adv_param , & adv_param , sizeof (adv_param ));
431448 }
449+
450+ if (IS_ENABLED (CONFIG_BT_MESH_WORKQ_MESH )) {
451+ k_work_queue_init (& bt_mesh_workq );
452+ k_work_queue_start (& bt_mesh_workq , thread_stack , MESH_WORKQ_STACK_SIZE ,
453+ K_PRIO_COOP (MESH_WORKQ_PRIORITY ), NULL );
454+ k_thread_name_set (& bt_mesh_workq .thread , "BT MESH WQ" );
455+ }
432456}
433457
434458static struct bt_mesh_ext_adv * adv_instance_find (struct bt_le_ext_adv * instance )
@@ -458,7 +482,7 @@ static void adv_sent(struct bt_le_ext_adv *instance,
458482
459483 atomic_set_bit (ext_adv -> flags , ADV_FLAG_SENT );
460484
461- k_work_submit (& ext_adv -> work );
485+ bt_mesh_wq_submit (& ext_adv -> work );
462486}
463487
464488#if defined(CONFIG_BT_MESH_GATT_SERVER )
@@ -503,13 +527,13 @@ int bt_mesh_adv_enable(void)
503527
504528int bt_mesh_adv_disable (void )
505529{
506- int err ;
507530 struct k_work_sync sync ;
531+ int err ;
508532
509533 for (int i = 0 ; i < ARRAY_SIZE (advs ); i ++ ) {
510534 atomic_set_bit (advs [i ].flags , ADV_FLAG_SUSPENDING );
511535
512- if (k_current_get () != & k_sys_work_q . thread ||
536+ if (k_current_get () != k_work_queue_thread_get ( MESH_WORKQ ) ||
513537 (k_work_busy_get (& advs [i ].work ) & K_WORK_RUNNING ) == 0 ) {
514538 k_work_flush (& advs [i ].work , & sync );
515539 }
@@ -562,3 +586,8 @@ int bt_mesh_adv_bt_data_send(uint8_t num_events, uint16_t adv_interval,
562586{
563587 return bt_data_send (advs , num_events , adv_interval , ad , ad_len );
564588}
589+
590+ int bt_mesh_wq_submit (struct k_work * work )
591+ {
592+ return k_work_submit_to_queue (MESH_WORKQ , work );
593+ }
0 commit comments