blob: 5d18b1fcb14018e9d36017eb1f6fc16ff095589f [file] [log] [blame]
// 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.
// This file defines the IRQ timer interface, equivalent to timer_setup() and friends in Linux.
// These are tasks that are run in Linux in interrupt context; as such these tasks are not allowed
// to sleep, block, etc.
#include <zircon/types.h>
#include "src/iwlwifi/platform/kernel.h"
#if defined(__cplusplus)
extern "C" {
#endif // defined(__cplusplus)
struct iwl_irq_timer;
typedef void (*iwl_irq_timer_func)(void* data);
// Create a timer.
zx_status_t iwl_irq_timer_create(struct device* dev, iwl_irq_timer_func func, void* data,
struct iwl_irq_timer** out_timer);
// Start a timer, to be run after `delay`. If the timer is already started, it will be stopped
// first.
zx_status_t iwl_irq_timer_start(struct iwl_irq_timer* timer, zx_duration_t delay);
// Cancel the timer. This call does not block: once this call returns, the timer is no longer
// queued for execution; it has either been dequeued and dispatched (but may be currently
// executing), or cancelled.
// * 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_irq_timer_stop(struct iwl_irq_timer* timer);
// Release (and deallocate) the timer, synchronously. If the timer is running, it will be
// cancelled.
void iwl_irq_timer_release_sync(struct iwl_irq_timer* timer);
#if defined(__cplusplus)
} // extern "C"
#endif // defined(__cplusplus)