/******************************************************************************
 *
 * Copyright(c) 2005 - 2014 Intel Corporation. All rights reserved.
 * Copyright(c) 2015 - 2017 Intel Deutschland GmbH
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 *  * Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 *  * Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in
 *    distribution.
 *  * Neither the name Intel Corporation nor the names of its
 *    contributors may be used to endorse or promote products derived
 *    from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *
 *****************************************************************************/
#ifndef SRC_CONNECTIVITY_WLAN_DRIVERS_THIRD_PARTY_INTEL_IWLWIFI_FW_NOTIF_WAIT_H_
#define SRC_CONNECTIVITY_WLAN_DRIVERS_THIRD_PARTY_INTEL_IWLWIFI_FW_NOTIF_WAIT_H_

// The notification is a mechanism that the firmware can notify some events
// up to driver, for example, the firmware setup is completed.

#include <lib/sync/completion.h>
#include <threads.h>
#include <zircon/listnode.h>
#include <zircon/types.h>

#include "third_party/iwlwifi/iwl-trans.h"

struct iwl_notif_wait_data {
  list_node_t notif_waits;
  mtx_t notif_wait_lock;
  sync_completion_t notif_waitq;
};

#define MAX_NOTIF_CMDS 5

/**
 * struct iwl_notification_wait - notification wait entry
 * @list: list head for global list
 * @fn: Function called with the notification. If the function
 *  returns true, the wait is over, if it returns false then
 *  the waiter stays blocked. If no function is given, any
 *  of the listed commands will unblock the waiter.
 * @cmds: command IDs
 * @n_cmds: number of command IDs
 * @triggered: waiter should be woken up
 * @aborted: wait was aborted
 *
 * This structure is not used directly, to wait for a
 * notification declare it on the stack, and call
 * iwl_init_notification_wait() with appropriate
 * parameters. Then do whatever will cause the ucode
 * to notify the driver, and to wait for that then
 * call iwl_wait_notification().
 *
 * Each notification is one-shot. If at some point we
 * need to support multi-shot notifications (which
 * can't be allocated on the stack) we need to modify
 * the code for them.
 */
struct iwl_notification_wait {
  list_node_t list;

  bool (*fn)(struct iwl_notif_wait_data* notif_data, struct iwl_rx_packet* pkt, void* data);
  void* fn_data;

  uint16_t cmds[MAX_NOTIF_CMDS];
  size_t n_cmds;
  bool triggered, aborted;
};

///////////////////////////////////////////////////////////////////////////////////////////////////
//
// caller functions -- used by fw/ code
//

void iwl_notification_wait_init(struct iwl_notif_wait_data* notif_data);

// Called by Rx ISR. The Rx packet will be passed to check the command sets in waiting list.
//
bool iwl_notification_wait(struct iwl_notif_wait_data* notif_data, struct iwl_rx_packet* pkt);

void iwl_abort_notification_waits(struct iwl_notif_wait_data* notif_data);

static inline void iwl_notification_notify(struct iwl_notif_wait_data* notif_data) {
  sync_completion_signal(&notif_data->notif_waitq);
}

static inline void iwl_notification_wait_notify(struct iwl_notif_wait_data* notif_data,
                                                struct iwl_rx_packet* pkt) {
  if (iwl_notification_wait(notif_data, pkt)) {
    iwl_notification_notify(notif_data);
  }
}

///////////////////////////////////////////////////////////////////////////////////////////////////
//
// user functions -- used by the other code in driver */
//

// Add the 'wait_entry' into 'notif_data' (the waiting list).
//
// The 'wait_entry' contains:
//
//   - a command set it cares about,
//   - a callback function,
//   - and an argument passed to the callback function.
//
// When a response packet arrives, iwl_notification_wait() will be called to traverse the waiting
// list. If a command is matched, its 'fn' callback will be called to check the content of response
// packet. Then, the 'fn_data' will be passed in 'data' parameter.
//
// The callback function shall return true to indicate that the response packet is what it is
// waiting for. Otherwise, return false to ignore the packet (and stay in un-triggered state).
//
void iwl_init_notification_wait(struct iwl_notif_wait_data* notif_data,
                                struct iwl_notification_wait* wait_entry, const uint16_t* cmds,
                                size_t n_cmds,
                                bool (*fn)(struct iwl_notif_wait_data* notif_data,
                                           struct iwl_rx_packet* pkt, void* data),
                                void* fn_data);

// The actual waiting for 'wait_entry'. No matter the result is successful or not, the 'wait_entry'
// will be removed from the waiting list 'notif_data'.
//
zx_status_t iwl_wait_notification(struct iwl_notif_wait_data* notif_data,
                                  struct iwl_notification_wait* wait_entry, zx_duration_t timeout);

// Used to remove a 'wait_entry' when it is added in iwl_init_notification_wait(), but not used in
// iwl_wait_notification().
//
void iwl_remove_notification(struct iwl_notif_wait_data* notif_data,
                             struct iwl_notification_wait* wait_entry);

#endif  // SRC_CONNECTIVITY_WLAN_DRIVERS_THIRD_PARTY_INTEL_IWLWIFI_FW_NOTIF_WAIT_H_
