// Copyright 2021 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef SRC_CONNECTIVITY_WLAN_DRIVERS_THIRD_PARTY_INTEL_IWLWIFI_PLATFORM_TASK_H_
#define SRC_CONNECTIVITY_WLAN_DRIVERS_THIRD_PARTY_INTEL_IWLWIFI_PLATFORM_TASK_H_

// This file defines the work queue interface, equivalent to schedule_work() and friends in Linux.
// These are tasks that are run in Linux in process context; as such these tasks are allowed to
// sleep, block, etc.

#include <zircon/types.h>

#include "kernel.h"

#if defined(__cplusplus)
extern "C" {
#endif  // defined(__cplusplus)

struct iwl_task;
typedef void (*iwl_task_func)(void* data);

// Create a task.
zx_status_t iwl_task_create(struct device* dev, iwl_task_func func, void* data,
                            struct iwl_task** out_task);

// Post the task to the work queue dispatcher, to be run after `delay`.  If the task is already
// posted, it will be cancelled first.
zx_status_t iwl_task_post(struct iwl_task* task, zx_duration_t delay);

// Wait for the task to complete.  If the task has not been posted, it will return immediately.
zx_status_t iwl_task_wait(struct iwl_task* task);

// Cancel the task on the work queue.  This call does not block: once this call returns, the task is
// is no longer queued to the work queue; it has either been dequeued and dispatched (but may be
// currently executing), or cancelled.  May return:
// * ZX_OK if the task was cancelled.
// * ZX_ERR_NOT_FOUND if the task was not queued and thus not cancelled.
// * Other errors in other error cases.
zx_status_t iwl_task_cancel(struct iwl_task* task);

// Cancel the task on the work queue, synchronously.  This call blocks and guarantees that the task
// is not queued to the work queue and is no longer running.
// * ZX_OK if the task was cancelled.
// * ZX_ERR_NOT_FOUND if the task was not queued and thus not cancelled.
// * Other errors in other error cases.
zx_status_t iwl_task_cancel_sync(struct iwl_task* task);

// Release (and deallocate) the task, synchronously.  If the task is running, it will be
// synchronously.
void iwl_task_release_sync(struct iwl_task* task);

#if defined(__cplusplus)
}  // extern "C"
#endif  // defined(__cplusplus)

#endif  // SRC_CONNECTIVITY_WLAN_DRIVERS_THIRD_PARTY_INTEL_IWLWIFI_PLATFORM_TASK_H_
