/******************************************************************************
 *
 * Copyright(c) 2005 - 2014 Intel Corporation. All rights reserved.
 * 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_MODPARAMS_H_
#define SRC_CONNECTIVITY_WLAN_DRIVERS_THIRD_PARTY_INTEL_IWLWIFI_IWL_MODPARAMS_H_

#include <stdbool.h>
#include <stdint.h>

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

extern struct iwl_mod_params iwlwifi_mod_params;

enum iwl_power_level {
  IWL_POWER_INDEX_1,
  IWL_POWER_INDEX_2,
  IWL_POWER_INDEX_3,
  IWL_POWER_INDEX_4,
  IWL_POWER_INDEX_5,
  IWL_POWER_NUM
};

enum iwl_disable_11n {
  IWL_DISABLE_HT_ALL = BIT(0),
  IWL_DISABLE_HT_TXAGG = BIT(1),
  IWL_DISABLE_HT_RXAGG = BIT(2),
  IWL_ENABLE_HT_TXAGG = BIT(3),
};

enum iwl_amsdu_size {
  IWL_AMSDU_DEF = 0,
  IWL_AMSDU_4K = 1,
  IWL_AMSDU_8K = 2,
  IWL_AMSDU_12K = 3,
  /* Add 2K at the end to avoid breaking current API */
  IWL_AMSDU_2K = 4,
};

enum iwl_uapsd_disable {
  IWL_DISABLE_UAPSD_BSS = BIT(0),
  IWL_DISABLE_UAPSD_P2P_CLIENT = BIT(1),
};

/**
 * struct iwl_mod_params
 *
 * Holds the module parameters
 *
 * @swcrypto: using hardware encryption, default = 0
 * @disable_11n: disable 11n capabilities, default = 0,
 *  use IWL_[DIS,EN]ABLE_HT_* constants
 * @amsdu_size: See &enum iwl_amsdu_size.
 * @fw_restart: restart firmware, default = 1
 * @bt_coex_active: enable bt coex, default = true
 * @led_mode: system default, default = 0
 * @power_save: enable power save, default = false
 * @power_level: power level, default = 1
 * @debug_level: levels are IWL_DL_*
 * @antenna_coupling: antenna coupling in dB, default = 0
 * @nvm_file: specifies a external NVM file
 * @uapsd_disable: disable U-APSD, see &enum iwl_uapsd_disable, default =
 *  IWL_DISABLE_UAPSD_BSS | IWL_DISABLE_UAPSD_P2P_CLIENT
 * @xvt_default_mode: xVT is the default operation mode, default = false
 * @d0i3_disable: disable d0i3, default = 1,
 * @d0i3_timeout: time to wait after no refs are taken before
 *  entering D0i3 (in msecs)
 * @lar_disable: disable LAR (regulatory), default = 0
 * @fw_monitor: allow to use firmware monitor
 * @disable_11ac: disable VHT capabilities, default = false.
 * @disable_msix: disable MSI-X and fall back to MSI on PCIe, default = false.
 * @remove_when_gone: remove an inaccessible device from the PCIe bus.
 * @enable_ini: enable new FW debug infratructure (INI TLVs)
 */
struct iwl_mod_params {
  int swcrypto;
  unsigned int disable_11n;
  int amsdu_size;
  bool fw_restart;
  bool bt_coex_active;
  int led_mode;
  bool power_save;
  int power_level;
#ifdef CPTCFG_IWLWIFI_DEBUG
  uint32_t debug_level;
#endif
  int antenna_coupling;
#if IS_ENABLED(CPTCFG_IWLXVT)
  bool xvt_default_mode;
#endif
#if IS_ENABLED(CPTCFG_IWLTEST)
  bool trans_test;
#endif
  char* nvm_file;
  uint32_t uapsd_disable;
  bool d0i3_disable;
  unsigned int d0i3_timeout;
  bool lar_disable;
  bool fw_monitor;
  bool disable_11ac;
  /**
   * @disable_11ax: disable HE capabilities, default = false
   */
  bool disable_11ax;
  bool disable_msix;
  bool remove_when_gone;
  bool enable_ini;
};

#endif  // SRC_CONNECTIVITY_WLAN_DRIVERS_THIRD_PARTY_INTEL_IWLWIFI_IWL_MODPARAMS_H_
