1 /****************************************************************************** 2 * 3 * Copyright(c) 2007 - 2014 Intel Corporation. All rights reserved. 4 * 5 * Portions of this file are derived from the ipw3945 project, as well 6 * as portions of the ieee80211 subsystem header files. 7 * 8 * This program is free software; you can redistribute it and/or modify it 9 * under the terms of version 2 of the GNU General Public License as 10 * published by the Free Software Foundation. 11 * 12 * This program is distributed in the hope that it will be useful, but WITHOUT 13 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 14 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 15 * more details. 16 * 17 * You should have received a copy of the GNU General Public License along with 18 * this program; if not, write to the Free Software Foundation, Inc., 19 * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA 20 * 21 * The full GNU General Public License is included in this distribution in the 22 * file called LICENSE. 23 * 24 * Contact Information: 25 * Intel Linux Wireless <linuxwifi@intel.com> 26 * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 27 *****************************************************************************/ 28 #ifndef __iwl_tt_setting_h__ 29 #define __iwl_tt_setting_h__ 30 31 #include "commands.h" 32 33 #define IWL_ABSOLUTE_ZERO 0 34 #define IWL_ABSOLUTE_MAX 0xFFFFFFFF 35 #define IWL_TT_INCREASE_MARGIN 5 36 #define IWL_TT_CT_KILL_MARGIN 3 37 38 enum iwl_antenna_ok { 39 IWL_ANT_OK_NONE, 40 IWL_ANT_OK_SINGLE, 41 IWL_ANT_OK_MULTI, 42 }; 43 44 /* Thermal Throttling State Machine states */ 45 enum iwl_tt_state { 46 IWL_TI_0, /* normal temperature, system power state */ 47 IWL_TI_1, /* high temperature detect, low power state */ 48 IWL_TI_2, /* higher temperature detected, lower power state */ 49 IWL_TI_CT_KILL, /* critical temperature detected, lowest power state */ 50 IWL_TI_STATE_MAX 51 }; 52 53 /** 54 * struct iwl_tt_restriction - Thermal Throttling restriction table 55 * @tx_stream: number of tx stream allowed 56 * @is_ht: ht enable/disable 57 * @rx_stream: number of rx stream allowed 58 * 59 * This table is used by advance thermal throttling management 60 * based on the current thermal throttling state, and determines 61 * the number of tx/rx streams and the status of HT operation. 62 */ 63 struct iwl_tt_restriction { 64 enum iwl_antenna_ok tx_stream; 65 enum iwl_antenna_ok rx_stream; 66 bool is_ht; 67 }; 68 69 /** 70 * struct iwl_tt_trans - Thermal Throttling transaction table 71 * @next_state: next thermal throttling mode 72 * @tt_low: low temperature threshold to change state 73 * @tt_high: high temperature threshold to change state 74 * 75 * This is used by the advanced thermal throttling algorithm 76 * to determine the next thermal state to go based on the 77 * current temperature. 78 */ 79 struct iwl_tt_trans { 80 enum iwl_tt_state next_state; 81 u32 tt_low; 82 u32 tt_high; 83 }; 84 85 /** 86 * struct iwl_tt_mgnt - Thermal Throttling Management structure 87 * @advanced_tt: advanced thermal throttle required 88 * @state: current Thermal Throttling state 89 * @tt_power_mode: Thermal Throttling power mode index 90 * being used to set power level when 91 * when thermal throttling state != IWL_TI_0 92 * the tt_power_mode should set to different 93 * power mode based on the current tt state 94 * @tt_previous_temperature: last measured temperature 95 * @iwl_tt_restriction: ptr to restriction tbl, used by advance 96 * thermal throttling to determine how many tx/rx streams 97 * should be used in tt state; and can HT be enabled or not 98 * @iwl_tt_trans: ptr to adv trans table, used by advance thermal throttling 99 * state transaction 100 * @ct_kill_toggle: used to toggle the CSR bit when checking uCode temperature 101 * @ct_kill_exit_tm: timer to exit thermal kill 102 */ 103 struct iwl_tt_mgmt { 104 enum iwl_tt_state state; 105 bool advanced_tt; 106 u8 tt_power_mode; 107 bool ct_kill_toggle; 108 #ifdef CONFIG_IWLWIFI_DEBUG 109 s32 tt_previous_temp; 110 #endif 111 struct iwl_tt_restriction *restriction; 112 struct iwl_tt_trans *transaction; 113 struct timer_list ct_kill_exit_tm; 114 struct timer_list ct_kill_waiting_tm; 115 }; 116 117 u8 iwl_tt_current_power_mode(struct iwl_priv *priv); 118 bool iwl_tt_is_low_power_state(struct iwl_priv *priv); 119 bool iwl_ht_enabled(struct iwl_priv *priv); 120 enum iwl_antenna_ok iwl_tx_ant_restriction(struct iwl_priv *priv); 121 enum iwl_antenna_ok iwl_rx_ant_restriction(struct iwl_priv *priv); 122 void iwl_tt_enter_ct_kill(struct iwl_priv *priv); 123 void iwl_tt_exit_ct_kill(struct iwl_priv *priv); 124 void iwl_tt_handler(struct iwl_priv *priv); 125 void iwl_tt_initialize(struct iwl_priv *priv); 126 void iwl_tt_exit(struct iwl_priv *priv); 127 128 #endif /* __iwl_tt_setting_h__ */ 129