diff --git a/umac/cmn_services/serialization/src/wlan_serialization_internal.c b/umac/cmn_services/serialization/src/wlan_serialization_internal.c index 2285f5f35168..6901fa74db1c 100644 --- a/umac/cmn_services/serialization/src/wlan_serialization_internal.c +++ b/umac/cmn_services/serialization/src/wlan_serialization_internal.c @@ -243,9 +243,12 @@ wlan_serialization_activate_multiple_cmd( struct wlan_objmgr_psoc *psoc = NULL; pdev_queue = &ser_pdev_obj->pdev_q[SER_PDEV_QUEUE_COMP_NON_SCAN]; - active_queue = &pdev_queue->active_list; + wlan_serialization_acquire_lock(&pdev_queue->pdev_queue_lock); + + active_queue = &pdev_queue->active_list; qsize = wlan_serialization_list_size(active_queue); + while (qsize--) { peek_status = wlan_serialization_get_cmd_from_queue( active_queue, &nnode); @@ -264,6 +267,18 @@ wlan_serialization_activate_multiple_cmd( continue; } + qdf_atomic_clear_bit(CMD_MARKED_FOR_ACTIVATION, + &active_cmd_list->cmd_in_use); + + qdf_atomic_set_bit(CMD_IS_ACTIVE, + &active_cmd_list->cmd_in_use); + + vdev_id = wlan_vdev_get_id(active_cmd_list->cmd.vdev); + pdev_queue->vdev_active_cmd_bitmap |= (1 << vdev_id); + + if (active_cmd_list->cmd.is_blocking) + pdev_queue->blocking_cmd_active = 1; + /* * Command is already pushed to active queue. * Now start the timer. @@ -277,25 +292,19 @@ wlan_serialization_activate_multiple_cmd( active_cmd_list->cmd.cmd_id, "WLAN_SER_CB_ACTIVATE_CMD"); + wlan_serialization_release_lock(&pdev_queue->pdev_queue_lock); + status = active_cmd_list->cmd.cmd_cb(&active_cmd_list->cmd, WLAN_SER_CB_ACTIVATE_CMD); - qdf_atomic_clear_bit(CMD_MARKED_FOR_ACTIVATION, - &active_cmd_list->cmd_in_use); - - qdf_atomic_set_bit(CMD_IS_ACTIVE, - &active_cmd_list->cmd_in_use); - - vdev_id = wlan_vdev_get_id(active_cmd_list->cmd.vdev); - pdev_queue->vdev_active_cmd_bitmap |= (1 << vdev_id); - - if (active_cmd_list->cmd.is_blocking) - pdev_queue->blocking_cmd_active = 1; - if (QDF_IS_STATUS_ERROR(status)) wlan_serialization_dequeue_cmd(&active_cmd_list->cmd, true); + + wlan_serialization_acquire_lock(&pdev_queue->pdev_queue_lock); } + + wlan_serialization_release_lock(&pdev_queue->pdev_queue_lock); return status; }