1bfcc09ddSBjoern A. Zeeb /* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */ 2bfcc09ddSBjoern A. Zeeb /* 3*a4128aadSBjoern A. Zeeb * Copyright (C) 2005-2014, 2018-2022, 2024 Intel Corporation 4bfcc09ddSBjoern A. Zeeb */ 5bfcc09ddSBjoern A. Zeeb #ifndef __iwl_modparams_h__ 6bfcc09ddSBjoern A. Zeeb #define __iwl_modparams_h__ 7bfcc09ddSBjoern A. Zeeb 8bfcc09ddSBjoern A. Zeeb #include <linux/types.h> 9bfcc09ddSBjoern A. Zeeb #include <linux/spinlock.h> 10bfcc09ddSBjoern A. Zeeb #include <linux/gfp.h> 11bfcc09ddSBjoern A. Zeeb #ifdef CONFIG_IWLWIFI_DEBUG 12bfcc09ddSBjoern A. Zeeb #include "iwl-debug.h" 13bfcc09ddSBjoern A. Zeeb #endif 14bfcc09ddSBjoern A. Zeeb 15bfcc09ddSBjoern A. Zeeb extern struct iwl_mod_params iwlwifi_mod_params; 16bfcc09ddSBjoern A. Zeeb 17bfcc09ddSBjoern A. Zeeb enum iwl_power_level { 18bfcc09ddSBjoern A. Zeeb IWL_POWER_INDEX_1, 19bfcc09ddSBjoern A. Zeeb IWL_POWER_INDEX_2, 20bfcc09ddSBjoern A. Zeeb IWL_POWER_INDEX_3, 21bfcc09ddSBjoern A. Zeeb IWL_POWER_INDEX_4, 22bfcc09ddSBjoern A. Zeeb IWL_POWER_INDEX_5, 23bfcc09ddSBjoern A. Zeeb IWL_POWER_NUM 24bfcc09ddSBjoern A. Zeeb }; 25bfcc09ddSBjoern A. Zeeb 26bfcc09ddSBjoern A. Zeeb enum iwl_disable_11n { 27bfcc09ddSBjoern A. Zeeb IWL_DISABLE_HT_ALL = BIT(0), 28bfcc09ddSBjoern A. Zeeb IWL_DISABLE_HT_TXAGG = BIT(1), 29bfcc09ddSBjoern A. Zeeb IWL_DISABLE_HT_RXAGG = BIT(2), 30bfcc09ddSBjoern A. Zeeb IWL_ENABLE_HT_TXAGG = BIT(3), 31bfcc09ddSBjoern A. Zeeb }; 32bfcc09ddSBjoern A. Zeeb 33bfcc09ddSBjoern A. Zeeb enum iwl_amsdu_size { 34bfcc09ddSBjoern A. Zeeb IWL_AMSDU_DEF = 0, 35bfcc09ddSBjoern A. Zeeb IWL_AMSDU_4K = 1, 36bfcc09ddSBjoern A. Zeeb IWL_AMSDU_8K = 2, 37bfcc09ddSBjoern A. Zeeb IWL_AMSDU_12K = 3, 38bfcc09ddSBjoern A. Zeeb /* Add 2K at the end to avoid breaking current API */ 39bfcc09ddSBjoern A. Zeeb IWL_AMSDU_2K = 4, 40bfcc09ddSBjoern A. Zeeb }; 41bfcc09ddSBjoern A. Zeeb 42bfcc09ddSBjoern A. Zeeb enum iwl_uapsd_disable { 43bfcc09ddSBjoern A. Zeeb IWL_DISABLE_UAPSD_BSS = BIT(0), 44bfcc09ddSBjoern A. Zeeb IWL_DISABLE_UAPSD_P2P_CLIENT = BIT(1), 45bfcc09ddSBjoern A. Zeeb }; 46bfcc09ddSBjoern A. Zeeb 47bfcc09ddSBjoern A. Zeeb /** 48bfcc09ddSBjoern A. Zeeb * struct iwl_mod_params 49bfcc09ddSBjoern A. Zeeb * 50bfcc09ddSBjoern A. Zeeb * Holds the module parameters 51bfcc09ddSBjoern A. Zeeb * 52bfcc09ddSBjoern A. Zeeb * @swcrypto: using hardware encryption, default = 0 53bfcc09ddSBjoern A. Zeeb * @disable_11n: disable 11n capabilities, default = 0, 54bfcc09ddSBjoern A. Zeeb * use IWL_[DIS,EN]ABLE_HT_* constants 55bfcc09ddSBjoern A. Zeeb * @amsdu_size: See &enum iwl_amsdu_size. 56bfcc09ddSBjoern A. Zeeb * @fw_restart: restart firmware, default = 1 57bfcc09ddSBjoern A. Zeeb * @bt_coex_active: enable bt coex, default = true 58bfcc09ddSBjoern A. Zeeb * @led_mode: system default, default = 0 59bfcc09ddSBjoern A. Zeeb * @power_save: enable power save, default = false 60bfcc09ddSBjoern A. Zeeb * @power_level: power level, default = 1 61bfcc09ddSBjoern A. Zeeb * @debug_level: levels are IWL_DL_* 62bfcc09ddSBjoern A. Zeeb * @nvm_file: specifies a external NVM file 63bfcc09ddSBjoern A. Zeeb * @uapsd_disable: disable U-APSD, see &enum iwl_uapsd_disable, default = 64bfcc09ddSBjoern A. Zeeb * IWL_DISABLE_UAPSD_BSS | IWL_DISABLE_UAPSD_P2P_CLIENT 65bfcc09ddSBjoern A. Zeeb * @disable_11ac: disable VHT capabilities, default = false. 66bfcc09ddSBjoern A. Zeeb * @remove_when_gone: remove an inaccessible device from the PCIe bus. 67bfcc09ddSBjoern A. Zeeb * @enable_ini: enable new FW debug infratructure (INI TLVs) 689af1bba4SBjoern A. Zeeb * @disable_11be: disable EHT capabilities, default = false. 69bfcc09ddSBjoern A. Zeeb */ 70bfcc09ddSBjoern A. Zeeb struct iwl_mod_params { 71bfcc09ddSBjoern A. Zeeb int swcrypto; 72bfcc09ddSBjoern A. Zeeb unsigned int disable_11n; 73bfcc09ddSBjoern A. Zeeb int amsdu_size; 74bfcc09ddSBjoern A. Zeeb bool fw_restart; 75bfcc09ddSBjoern A. Zeeb bool bt_coex_active; 76bfcc09ddSBjoern A. Zeeb int led_mode; 77bfcc09ddSBjoern A. Zeeb bool power_save; 78bfcc09ddSBjoern A. Zeeb int power_level; 79bfcc09ddSBjoern A. Zeeb #ifdef CONFIG_IWLWIFI_DEBUG 80d9836fb4SBjoern A. Zeeb #if defined(__linux__) 81d9836fb4SBjoern A. Zeeb u32 debug_level; 82d9836fb4SBjoern A. Zeeb #elif defined(__FreeBSD__) 83bfcc09ddSBjoern A. Zeeb enum iwl_dl debug_level; 84bfcc09ddSBjoern A. Zeeb #endif 85d9836fb4SBjoern A. Zeeb #endif 86bfcc09ddSBjoern A. Zeeb char *nvm_file; 87bfcc09ddSBjoern A. Zeeb u32 uapsd_disable; 88bfcc09ddSBjoern A. Zeeb bool disable_11ac; 89bfcc09ddSBjoern A. Zeeb /** 90bfcc09ddSBjoern A. Zeeb * @disable_11ax: disable HE capabilities, default = false 91bfcc09ddSBjoern A. Zeeb */ 92bfcc09ddSBjoern A. Zeeb bool disable_11ax; 93bfcc09ddSBjoern A. Zeeb bool remove_when_gone; 94fac1f593SBjoern A. Zeeb u32 enable_ini; 95fac1f593SBjoern A. Zeeb bool disable_11be; 96bfcc09ddSBjoern A. Zeeb }; 97bfcc09ddSBjoern A. Zeeb 98bfcc09ddSBjoern A. Zeeb static inline bool iwl_enable_rx_ampdu(void) 99bfcc09ddSBjoern A. Zeeb { 100bfcc09ddSBjoern A. Zeeb if (iwlwifi_mod_params.disable_11n & IWL_DISABLE_HT_RXAGG) 101bfcc09ddSBjoern A. Zeeb return false; 102bfcc09ddSBjoern A. Zeeb return true; 103bfcc09ddSBjoern A. Zeeb } 104bfcc09ddSBjoern A. Zeeb 105bfcc09ddSBjoern A. Zeeb static inline bool iwl_enable_tx_ampdu(void) 106bfcc09ddSBjoern A. Zeeb { 107bfcc09ddSBjoern A. Zeeb if (iwlwifi_mod_params.disable_11n & IWL_DISABLE_HT_TXAGG) 108bfcc09ddSBjoern A. Zeeb return false; 109bfcc09ddSBjoern A. Zeeb if (iwlwifi_mod_params.disable_11n & IWL_ENABLE_HT_TXAGG) 110bfcc09ddSBjoern A. Zeeb return true; 111bfcc09ddSBjoern A. Zeeb 112bfcc09ddSBjoern A. Zeeb /* enabled by default */ 113bfcc09ddSBjoern A. Zeeb return true; 114bfcc09ddSBjoern A. Zeeb } 115bfcc09ddSBjoern A. Zeeb 116*a4128aadSBjoern A. Zeeb /* Verify amsdu_size module parameter and convert it to a rxb size */ 117*a4128aadSBjoern A. Zeeb static inline enum iwl_amsdu_size 118*a4128aadSBjoern A. Zeeb iwl_amsdu_size_to_rxb_size(void) 119*a4128aadSBjoern A. Zeeb { 120*a4128aadSBjoern A. Zeeb switch (iwlwifi_mod_params.amsdu_size) { 121*a4128aadSBjoern A. Zeeb case IWL_AMSDU_8K: 122*a4128aadSBjoern A. Zeeb return IWL_AMSDU_8K; 123*a4128aadSBjoern A. Zeeb case IWL_AMSDU_12K: 124*a4128aadSBjoern A. Zeeb return IWL_AMSDU_12K; 125*a4128aadSBjoern A. Zeeb default: 126*a4128aadSBjoern A. Zeeb pr_err("%s: Unsupported amsdu_size: %d\n", KBUILD_MODNAME, 127*a4128aadSBjoern A. Zeeb iwlwifi_mod_params.amsdu_size); 128*a4128aadSBjoern A. Zeeb fallthrough; 129*a4128aadSBjoern A. Zeeb case IWL_AMSDU_DEF: 130*a4128aadSBjoern A. Zeeb case IWL_AMSDU_4K: 131*a4128aadSBjoern A. Zeeb return IWL_AMSDU_4K; 132*a4128aadSBjoern A. Zeeb } 133*a4128aadSBjoern A. Zeeb } 134*a4128aadSBjoern A. Zeeb 135bfcc09ddSBjoern A. Zeeb #endif /* #__iwl_modparams_h__ */ 136