/******************************************************************************
 *
 * Copyright(c) 2005 - 2014 Intel Corporation. All rights reserved.
 * Copyright(c) 2013 - 2014 Intel Mobile Communications GmbH
 * Copyright(c) 2015        Intel Deutschland GmbH
 * Copyright(c) 2018 Intel Corporation
 * 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
 *    the documentation and/or other materials provided with the
 *    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_IWL_OP_MODE_H_
#define SRC_CONNECTIVITY_WLAN_DRIVERS_THIRD_PARTY_INTEL_IWLWIFI_IWL_OP_MODE_H_

#include "third_party/iwlwifi/platform/compiler.h"
#include "third_party/iwlwifi/platform/kernel.h"

#ifdef CPTCFG_IWLWIFI_DEVICE_TESTMODE
#include "fw/testmode.h"
#endif

struct iwl_op_mode;
struct iwl_trans;
struct sk_buff;
struct iwl_device_cmd;
struct iwl_host_cmd;
struct iwl_rx_cmd_buffer;
struct iwl_fw;
struct iwl_cfg;
struct iwl_tm_data;

/**
 * DOC: Operational mode - what is it ?
 *
 * The operational mode (a.k.a. op_mode) is the layer that implements
 * mac80211's handlers. It knows two APIs: mac80211's and the fw's. It uses
 * the transport API to access the HW. The op_mode doesn't need to know how the
 * underlying HW works, since the transport layer takes care of that.
 *
 * There can be several op_mode: i.e. different fw APIs will require two
 * different op_modes. This is why the op_mode is virtualized.
 */

/**
 * DOC: Life cycle of the Operational mode
 *
 * The operational mode has a very simple life cycle.
 *
 *  1) The driver layer (iwl-drv.c) chooses the op_mode based on the
 *     capabilities advertised by the fw file (in TLV format).
 *  2) The driver layer starts the op_mode (ops->start)
 *  3) The op_mode registers mac80211
 *  4) The op_mode is governed by mac80211
 *  5) The driver layer stops the op_mode
 */

#ifdef CPTCFG_IWLWIFI_DEVICE_TESTMODE
/**
 * struct iwl_test_ops: callback to the op mode
 * @send_hcmd: Handler that sends host cmd in the specific op_mode. If this
 *  handler is not registered then sending host cmd will not be supported.
 * @cmd_exec_start: Handler that is used for user preparations before
 *  executing a command. It is optional.
 * @cmd_exec: Handler that is used to execute user's test-mode commands.
 *  It is optional. If this handler is not given, the default handler will
 *  execute.
 * @cmd_exec_end: Handler that is used for user to cleanup after a command
 *  was executed. It is optional.
 *
 * The structure defines the callbacks that the op_mode should handle,
 * inorder to handle logic that is out of the scope of iwl_test.
 */
struct iwl_test_ops {
  int (*send_hcmd)(void* op_mode, struct iwl_host_cmd* host_cmd);
  int (*cmd_exec_start)(struct iwl_testmode* testmode);
  int (*cmd_exec)(struct iwl_testmode* testmode, uint32_t cmd, struct iwl_tm_data* data_in,
                  struct iwl_tm_data* data_out, bool* cmd_supported);
  void (*cmd_exec_end)(struct iwl_testmode* testmode);
};
#endif

/**
 * struct iwl_op_mode_ops - op_mode specific operations
 *
 * The op_mode exports its ops so that external components can start it and
 * interact with it. The driver layer typically calls the start and stop
 * handlers, the transport layer calls the others.
 *
 * All the handlers MUST be implemented, except @rx_rss which can be left
 * out *iff* the opmode will never run on hardware with multi-queue capability.
 *
 * @start: start the op_mode. The transport layer is already allocated.
 *  May sleep
 * @stop: stop the op_mode. Must free all the memory allocated.
 *  May sleep
 * @rx: Rx notification to the op_mode. rxb is the Rx buffer itself. Cmd is the
 *  HCMD this Rx responds to. Can't sleep.
 * @rx_rss: data queue RX notification to the op_mode, for (data) notifications
 *  received on the RSS queue(s). The queue parameter indicates which of the
 *  RSS queues received this frame; it will always be non-zero.
 *  This method must not sleep.
 * @async_cb: called when an ASYNC command with CMD_WANT_ASYNC_CALLBACK set
 *  completes. Must be atomic.
 * @queue_full: notifies that a HW queue is full.
 *  Must be atomic and called with BH disabled.
 * @queue_not_full: notifies that a HW queue is not full any more.
 *  Must be atomic and called with BH disabled.
 * @hw_rf_kill:notifies of a change in the HW rf kill switch. True means that
 *  the radio is killed. Return %true if the device should be stopped by
 *  the transport immediately after the call. May sleep.
 * @free_skb: allows the transport layer to free skbs that haven't been
 *  reclaimed by the op_mode. This can happen when the driver is freed and
 *  there are Tx packets pending in the transport layer.
 *  Must be atomic
 * @nic_error: error notification. Must be atomic and must be called with BH
 *  disabled.
 * @cmd_queue_full: Called when the command queue gets full. Must be atomic and
 *  called with BH disabled.
 * @nic_config: configure NIC, called before firmware is started.
 *  May sleep
 * @wimax_active: invoked when WiMax becomes active. May sleep
 * @enter_d0i3: configure the fw to enter d0i3. return 1 to indicate d0i3
 *  entrance is aborted (e.g. due to held reference). May sleep.
 * @exit_d0i3: configure the fw to exit d0i3. May sleep.
 */
struct iwl_op_mode_ops {
  struct iwl_op_mode* (*start)(struct iwl_trans* trans, const struct iwl_cfg* cfg,
                               const struct iwl_fw* fw, struct dentry* dbgfs_dir);
  void (*stop)(struct iwl_op_mode* op_mode);
  void (*rx)(struct iwl_op_mode* op_mode, struct napi_struct* napi, struct iwl_rx_cmd_buffer* rxb);
  void (*rx_rss)(struct iwl_op_mode* op_mode, struct napi_struct* napi,
                 struct iwl_rx_cmd_buffer* rxb, unsigned int queue);
  void (*async_cb)(struct iwl_op_mode* op_mode, const struct iwl_device_cmd* cmd);
  void (*queue_full)(struct iwl_op_mode* op_mode, int queue);
  void (*queue_not_full)(struct iwl_op_mode* op_mode, int queue);
  bool (*hw_rf_kill)(struct iwl_op_mode* op_mode, bool state);
  void (*free_skb)(struct iwl_op_mode* op_mode, struct sk_buff* skb);
  void (*nic_error)(struct iwl_op_mode* op_mode);
  void (*cmd_queue_full)(struct iwl_op_mode* op_mode);
  void (*nic_config)(struct iwl_op_mode* op_mode);
  void (*wimax_active)(struct iwl_op_mode* op_mode);
#ifdef CPTCFG_IWLWIFI_DEVICE_TESTMODE
  struct iwl_test_ops test_ops;
#endif
  int (*enter_d0i3)(struct iwl_op_mode* op_mode);
  int (*exit_d0i3)(struct iwl_op_mode* op_mode);
};

int iwl_opmode_register(const char* name, const struct iwl_op_mode_ops* ops);
void iwl_opmode_deregister(const char* name);

/**
 * struct iwl_op_mode - operational mode
 * @ops: pointer to its own ops
 *
 * This holds an implementation of the mac80211 / fw API.
 */
struct iwl_op_mode {
  const struct iwl_op_mode_ops* ops;

  void* op_mode_specific;
};

static inline void iwl_op_mode_stop(struct iwl_op_mode* op_mode) { op_mode->ops->stop(op_mode); }

static inline void iwl_op_mode_rx(struct iwl_op_mode* op_mode, struct napi_struct* napi,
                                  struct iwl_rx_cmd_buffer* rxb) {
  return op_mode->ops->rx(op_mode, napi, rxb);
}

static inline void iwl_op_mode_rx_rss(struct iwl_op_mode* op_mode, struct napi_struct* napi,
                                      struct iwl_rx_cmd_buffer* rxb, unsigned int queue) {
  op_mode->ops->rx_rss(op_mode, napi, rxb, queue);
}

static inline void iwl_op_mode_async_cb(struct iwl_op_mode* op_mode,
                                        const struct iwl_device_cmd* cmd) {
  if (op_mode->ops->async_cb) {
    op_mode->ops->async_cb(op_mode, cmd);
  }
}

static inline void iwl_op_mode_queue_full(struct iwl_op_mode* op_mode, int queue) {
  op_mode->ops->queue_full(op_mode, queue);
}

static inline void iwl_op_mode_queue_not_full(struct iwl_op_mode* op_mode, int queue) {
  op_mode->ops->queue_not_full(op_mode, queue);
}

static inline bool __must_check iwl_op_mode_hw_rf_kill(struct iwl_op_mode* op_mode, bool state) {
  return op_mode->ops->hw_rf_kill(op_mode, state);
}

static inline void iwl_op_mode_free_skb(struct iwl_op_mode* op_mode, struct sk_buff* skb) {
  op_mode->ops->free_skb(op_mode, skb);
}

static inline void iwl_op_mode_nic_error(struct iwl_op_mode* op_mode) {
  op_mode->ops->nic_error(op_mode);
}

static inline void iwl_op_mode_cmd_queue_full(struct iwl_op_mode* op_mode) {
  op_mode->ops->cmd_queue_full(op_mode);
}

static inline void iwl_op_mode_nic_config(struct iwl_op_mode* op_mode) {
  op_mode->ops->nic_config(op_mode);
}

static inline void iwl_op_mode_wimax_active(struct iwl_op_mode* op_mode) {
  op_mode->ops->wimax_active(op_mode);
}

static inline int iwl_op_mode_enter_d0i3(struct iwl_op_mode* op_mode) {
  if (!op_mode->ops->enter_d0i3) {
    return 0;
  }
  return op_mode->ops->enter_d0i3(op_mode);
}

static inline int iwl_op_mode_exit_d0i3(struct iwl_op_mode* op_mode) {
  if (!op_mode->ops->exit_d0i3) {
    return 0;
  }
  return op_mode->ops->exit_d0i3(op_mode);
}

#endif  // SRC_CONNECTIVITY_WLAN_DRIVERS_THIRD_PARTY_INTEL_IWLWIFI_IWL_OP_MODE_H_
