@@ -36,6 +36,14 @@ LOG_MODULE_REGISTER(bt_mesh_adv_ext);
3636#define CONFIG_BT_MESH_RELAY_ADV_SETS 0
3737#endif
3838
39+ #ifdef CONFIG_BT_MESH_ADV_STACK_SIZE
40+ #define MESH_WORKQ_PRIORITY CONFIG_BT_MESH_ADV_PRIO
41+ #define MESH_WORKQ_STACK_SIZE CONFIG_BT_MESH_ADV_STACK_SIZE
42+ #else
43+ #define MESH_WORKQ_PRIORITY 0
44+ #define MESH_WORKQ_STACK_SIZE 0
45+ #endif
46+
3947enum {
4048 /** Controller is currently advertising */
4149 ADV_FLAG_ACTIVE ,
@@ -72,6 +80,15 @@ struct bt_mesh_ext_adv {
7280static void send_pending_adv (struct k_work * work );
7381static bool schedule_send (struct bt_mesh_ext_adv * ext_adv );
7482
83+ static struct k_work_q bt_mesh_workq ;
84+ static K_KERNEL_STACK_DEFINE (thread_stack , MESH_WORKQ_STACK_SIZE ) ;
85+
86+ #if defined(CONFIG_BT_MESH_WORKQ_MESH )
87+ #define MESH_WORKQ &bt_mesh_workq
88+ #else /* CONFIG_BT_MESH_WORKQ_SYS */
89+ #define MESH_WORKQ &k_sys_work_q
90+ #endif /* CONFIG_BT_MESH_WORKQ_MESH */
91+
7592static struct bt_mesh_ext_adv advs [] = {
7693 [0 ] = {
7794 .tags = (
@@ -283,7 +300,7 @@ static bool schedule_send_with_mask(struct bt_mesh_ext_adv *ext_adv, int ignore_
283300 }
284301
285302 atomic_clear_bit (ext_adv -> flags , ADV_FLAG_SCHEDULE_PENDING );
286- k_work_submit (& ext_adv -> work );
303+ bt_mesh_wq_submit (& ext_adv -> work );
287304
288305 return true;
289306}
@@ -432,7 +449,7 @@ int bt_mesh_adv_terminate(struct bt_mesh_adv *adv)
432449
433450 atomic_set_bit (ext_adv -> flags , ADV_FLAG_SENT );
434451
435- k_work_submit (& ext_adv -> work );
452+ bt_mesh_wq_submit (& ext_adv -> work );
436453
437454 return 0 ;
438455 }
@@ -455,6 +472,13 @@ void bt_mesh_adv_init(void)
455472 (void )memcpy (& advs [i ].adv_param , & adv_param , sizeof (adv_param ));
456473 }
457474
475+ if (IS_ENABLED (CONFIG_BT_MESH_WORKQ_MESH )) {
476+ k_work_queue_init (& bt_mesh_workq );
477+ k_work_queue_start (& bt_mesh_workq , thread_stack , MESH_WORKQ_STACK_SIZE ,
478+ K_PRIO_COOP (MESH_WORKQ_PRIORITY ), NULL );
479+ k_thread_name_set (& bt_mesh_workq .thread , "BT MESH WQ" );
480+ }
481+
458482#if defined(CONFIG_BT_LL_SOFTDEVICE )
459483 const sdc_hci_cmd_vs_scan_accept_ext_adv_packets_set_t cmd_params = {
460484 .accept_ext_adv_packets = IS_ENABLED (CONFIG_BT_MESH_ADV_EXT_ACCEPT_EXT_ADV_PACKETS ),
@@ -495,7 +519,7 @@ static void adv_sent(struct bt_le_ext_adv *instance,
495519
496520 atomic_set_bit (ext_adv -> flags , ADV_FLAG_SENT );
497521
498- k_work_submit (& ext_adv -> work );
522+ bt_mesh_wq_submit (& ext_adv -> work );
499523}
500524
501525#if defined(CONFIG_BT_MESH_GATT_SERVER )
@@ -549,13 +573,13 @@ int bt_mesh_adv_enable(void)
549573
550574int bt_mesh_adv_disable (void )
551575{
552- int err ;
553576 struct k_work_sync sync ;
577+ int err ;
554578
555579 for (int i = 0 ; i < ARRAY_SIZE (advs ); i ++ ) {
556580 atomic_set_bit (advs [i ].flags , ADV_FLAG_SUSPENDING );
557581
558- if (k_current_get () != & k_sys_work_q . thread ||
582+ if (k_current_get () != k_work_queue_thread_get ( MESH_WORKQ ) ||
559583 (k_work_busy_get (& advs [i ].work ) & K_WORK_RUNNING ) == 0 ) {
560584 k_work_flush (& advs [i ].work , & sync );
561585 }
@@ -608,3 +632,8 @@ int bt_mesh_adv_bt_data_send(uint8_t num_events, uint16_t adv_interval,
608632{
609633 return bt_data_send (advs , num_events , adv_interval , ad , ad_len );
610634}
635+
636+ int bt_mesh_wq_submit (struct k_work * work )
637+ {
638+ return k_work_submit_to_queue (MESH_WORKQ , work );
639+ }
0 commit comments