iwlwifi: add power save to 5000 HW
This patch adds support for power save for 5000 HW. Signed-off-by: Mohamed Abbas <mohamed.abbas@intel.com> Signed-off-by: Tomas Winkler <tomas.winkler@intel.com> Signed-off-by: Zhu Yi <yi.zhu@intel.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
This commit is contained in:
parent
adf044c877
commit
ca579617d8
7 changed files with 18 additions and 24 deletions
|
@ -875,18 +875,6 @@ static int iwl4965_hw_set_hw_params(struct iwl_priv *priv)
|
|||
return 0;
|
||||
}
|
||||
|
||||
/* set card power command */
|
||||
static int iwl4965_set_power(struct iwl_priv *priv,
|
||||
void *cmd)
|
||||
{
|
||||
int ret = 0;
|
||||
|
||||
ret = iwl_send_cmd_pdu_async(priv, POWER_TABLE_CMD,
|
||||
sizeof(struct iwl4965_powertable_cmd),
|
||||
cmd, NULL);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static s32 iwl4965_math_div_round(s32 num, s32 denom, s32 *res)
|
||||
{
|
||||
s32 sign = 1;
|
||||
|
@ -2440,7 +2428,6 @@ static struct iwl_lib_ops iwl4965_lib = {
|
|||
.check_version = iwl4965_eeprom_check_version,
|
||||
.query_addr = iwlcore_eeprom_query_addr,
|
||||
},
|
||||
.set_power = iwl4965_set_power,
|
||||
.send_tx_power = iwl4965_send_tx_power,
|
||||
.update_chain_flags = iwl4965_update_chain_flags,
|
||||
.temperature = iwl4965_temperature_calib,
|
||||
|
|
|
@ -1474,6 +1474,7 @@ static struct iwl_lib_ops iwl5000_lib = {
|
|||
.alive_notify = iwl5000_alive_notify,
|
||||
.send_tx_power = iwl5000_send_tx_power,
|
||||
.temperature = iwl5000_temperature,
|
||||
.update_chain_flags = iwl4965_update_chain_flags,
|
||||
.apm_ops = {
|
||||
.init = iwl5000_apm_init,
|
||||
.reset = iwl5000_apm_reset,
|
||||
|
|
|
@ -1993,7 +1993,7 @@ struct iwl4965_spectrum_notification {
|
|||
*****************************************************************************/
|
||||
|
||||
/**
|
||||
* struct iwl4965_powertable_cmd - Power Table Command
|
||||
* struct iwl_powertable_cmd - Power Table Command
|
||||
* @flags: See below:
|
||||
*
|
||||
* POWER_TABLE_CMD = 0x77 (command, has simple generic response)
|
||||
|
@ -2027,7 +2027,7 @@ struct iwl4965_spectrum_notification {
|
|||
#define IWL_POWER_PCI_PM_MSK __constant_cpu_to_le16(1 << 3)
|
||||
#define IWL_POWER_FAST_PD __constant_cpu_to_le16(1 << 4)
|
||||
|
||||
struct iwl4965_powertable_cmd {
|
||||
struct iwl_powertable_cmd {
|
||||
__le16 flags;
|
||||
u8 keep_alive_seconds;
|
||||
u8 debug_flags;
|
||||
|
|
|
@ -139,7 +139,6 @@ struct iwl_lib_ops {
|
|||
int (*set_pwr_src)(struct iwl_priv *priv, enum iwl_pwr_src src);
|
||||
} apm_ops;
|
||||
/* power */
|
||||
int (*set_power)(struct iwl_priv *priv, void *cmd);
|
||||
int (*send_tx_power) (struct iwl_priv *priv);
|
||||
void (*update_chain_flags)(struct iwl_priv *priv);
|
||||
void (*temperature) (struct iwl_priv *priv);
|
||||
|
|
|
@ -283,7 +283,7 @@ struct iwl_cmd {
|
|||
u32 val32;
|
||||
struct iwl4965_bt_cmd bt;
|
||||
struct iwl4965_rxon_time_cmd rxon_time;
|
||||
struct iwl4965_powertable_cmd powertable;
|
||||
struct iwl_powertable_cmd powertable;
|
||||
struct iwl_qosparam_cmd qosparam;
|
||||
struct iwl_tx_cmd tx;
|
||||
struct iwl4965_tx_beacon_cmd tx_beacon;
|
||||
|
@ -590,6 +590,7 @@ extern unsigned int iwl4965_fill_beacon_frame(struct iwl_priv *priv,
|
|||
const u8 *dest, int left);
|
||||
extern void iwl4965_update_chain_flags(struct iwl_priv *priv);
|
||||
int iwl4965_set_pwr_src(struct iwl_priv *priv, enum iwl_pwr_src src);
|
||||
extern int iwl4965_set_power(struct iwl_priv *priv, void *cmd);
|
||||
|
||||
extern const u8 iwl_bcast_addr[ETH_ALEN];
|
||||
|
||||
|
|
|
@ -112,6 +112,13 @@ static struct iwl_power_vec_entry range_2[IWL_POWER_AC] = {
|
|||
{{SLP, SLP_TOUT(25), SLP_TOUT(25), SLP_VEC(4, 7, 10, 10, 0xFF)}, 0}
|
||||
};
|
||||
|
||||
/* set card power command */
|
||||
static int iwl_set_power(struct iwl_priv *priv, void *cmd)
|
||||
{
|
||||
return iwl_send_cmd_pdu_async(priv, POWER_TABLE_CMD,
|
||||
sizeof(struct iwl_powertable_cmd),
|
||||
cmd, NULL);
|
||||
}
|
||||
/* decide the right power level according to association status
|
||||
* and battery status
|
||||
*/
|
||||
|
@ -162,7 +169,7 @@ static int iwl_power_init_handle(struct iwl_priv *priv)
|
|||
if (ret != 0)
|
||||
return 0;
|
||||
else {
|
||||
struct iwl4965_powertable_cmd *cmd;
|
||||
struct iwl_powertable_cmd *cmd;
|
||||
|
||||
IWL_DEBUG_POWER("adjust power command flags\n");
|
||||
|
||||
|
@ -180,7 +187,7 @@ static int iwl_power_init_handle(struct iwl_priv *priv)
|
|||
|
||||
/* adjust power command according to dtim period and power level*/
|
||||
static int iwl_update_power_command(struct iwl_priv *priv,
|
||||
struct iwl4965_powertable_cmd *cmd,
|
||||
struct iwl_powertable_cmd *cmd,
|
||||
u16 mode)
|
||||
{
|
||||
int ret = 0, i;
|
||||
|
@ -204,7 +211,7 @@ static int iwl_update_power_command(struct iwl_priv *priv,
|
|||
range = &pow_data->pwr_range_2[0];
|
||||
|
||||
period = pow_data->dtim_period;
|
||||
memcpy(cmd, &range[mode].cmd, sizeof(struct iwl4965_powertable_cmd));
|
||||
memcpy(cmd, &range[mode].cmd, sizeof(struct iwl_powertable_cmd));
|
||||
|
||||
if (period == 0) {
|
||||
period = 1;
|
||||
|
@ -280,7 +287,7 @@ int iwl_power_update_mode(struct iwl_priv *priv, u8 refresh)
|
|||
|
||||
if (!iwl_is_rfkill(priv) && !setting->power_disabled &&
|
||||
((setting->power_mode != final_mode) || refresh)) {
|
||||
struct iwl4965_powertable_cmd cmd;
|
||||
struct iwl_powertable_cmd cmd;
|
||||
|
||||
if (final_mode != IWL_POWER_MODE_CAM)
|
||||
set_bit(STATUS_POWER_PMI, &priv->status);
|
||||
|
@ -291,8 +298,7 @@ int iwl_power_update_mode(struct iwl_priv *priv, u8 refresh)
|
|||
if (final_mode == IWL_POWER_INDEX_5)
|
||||
cmd.flags |= IWL_POWER_FAST_PD;
|
||||
|
||||
if (priv->cfg->ops->lib->set_power)
|
||||
ret = priv->cfg->ops->lib->set_power(priv, &cmd);
|
||||
ret = iwl_set_power(priv, &cmd);
|
||||
|
||||
if (final_mode == IWL_POWER_MODE_CAM)
|
||||
clear_bit(STATUS_POWER_PMI, &priv->status);
|
||||
|
|
|
@ -46,7 +46,7 @@ struct iwl_priv;
|
|||
/* Power management (not Tx power) structures */
|
||||
|
||||
struct iwl_power_vec_entry {
|
||||
struct iwl4965_powertable_cmd cmd;
|
||||
struct iwl_powertable_cmd cmd;
|
||||
u8 no_dtim;
|
||||
};
|
||||
|
||||
|
|
Reference in a new issue