iwlwifi: Thermal Throttling Management - Part 1
[linux-2.6.git] / drivers / net / wireless / iwlwifi / iwl-power.h
1 /******************************************************************************
2  *
3  * Copyright(c) 2007 - 2009 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 <ilw@linux.intel.com>
26  * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
27  *****************************************************************************/
28 #ifndef __iwl_power_setting_h__
29 #define __iwl_power_setting_h__
30
31 #include <net/mac80211.h>
32 #include "iwl-commands.h"
33
34 struct iwl_priv;
35
36 #define IWL_TT_INCREASE_MARGIN  5
37
38 /* Thermal Throttling State Machine states */
39 enum  iwl_tt_state {
40         IWL_TI_0,       /* normal temperature, system power state */
41         IWL_TI_1,       /* high temperature detect, low power state */
42         IWL_TI_2,       /* higher temperature detected, lower power state */
43         IWL_TI_CT_KILL, /* critical temperature detected, lowest power state */
44         IWL_TI_STATE_MAX
45 };
46
47 /**
48  * struct iwl_tt_mgnt - Thermal Throttling Management structure
49  * @state:          current Thermal Throttling state
50  * @tt_power_mode:  Thermal Throttling power mode index
51  *                  being used to set power level when
52  *                  when thermal throttling state != IWL_TI_0
53  *                  the tt_power_mode should set to different
54  *                  power mode based on the current tt state
55  * @sys_power_mode: previous system power mode
56  *                  before transition into TT state
57  * @tt_previous_temperature: last measured temperature
58  */
59 struct iwl_tt_mgmt {
60         enum iwl_tt_state state;
61         u8 tt_power_mode;
62         u8 sys_power_mode;
63 #ifdef CONFIG_IWLWIFI_DEBUG
64         s32 tt_previous_temp;
65 #endif
66 };
67
68 enum {
69         IWL_POWER_MODE_CAM, /* Continuously Aware Mode, always on */
70         IWL_POWER_INDEX_1,
71         IWL_POWER_INDEX_2,
72         IWL_POWER_INDEX_3,
73         IWL_POWER_INDEX_4,
74         IWL_POWER_INDEX_5,
75         IWL_POWER_NUM
76 };
77
78 /* Power management (not Tx power) structures */
79
80 struct iwl_power_vec_entry {
81         struct iwl_powertable_cmd cmd;
82         u8 no_dtim;
83 };
84
85 struct iwl_power_mgr {
86         struct iwl_power_vec_entry pwr_range_0[IWL_POWER_NUM];
87         struct iwl_power_vec_entry pwr_range_1[IWL_POWER_NUM];
88         struct iwl_power_vec_entry pwr_range_2[IWL_POWER_NUM];
89         u32 dtim_period;
90         /* final power level that used to calculate final power command */
91         u8 power_mode;
92         u8 user_power_setting; /* set by user through sysfs */
93         u8 power_disabled; /* set by mac80211's CONF_PS */
94         struct iwl_tt_mgmt tt; /* Thermal Throttling Management */
95         bool ct_kill_toggle;   /* use to toggle the CSR bit when
96                                 * checking uCode temperature
97                                 */
98         struct timer_list ct_kill_exit_tm;
99 };
100
101 int iwl_power_update_mode(struct iwl_priv *priv, bool force);
102 int iwl_power_set_user_mode(struct iwl_priv *priv, u16 mode);
103 void iwl_tt_enter_ct_kill(struct iwl_priv *priv);
104 void iwl_tt_exit_ct_kill(struct iwl_priv *priv);
105 void iwl_tt_handler(struct iwl_priv *priv);
106 void iwl_tt_initialize(struct iwl_priv *priv);
107 void iwl_tt_exit(struct iwl_priv *priv);
108 void iwl_power_initialize(struct iwl_priv *priv);
109
110 #endif  /* __iwl_power_setting_h__ */