mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-16 16:54:20 +08:00
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
@ -875,18 +875,6 @@ static int iwl4965_hw_set_hw_params(struct iwl_priv *priv)
|
|||||||
return 0;
|
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)
|
static s32 iwl4965_math_div_round(s32 num, s32 denom, s32 *res)
|
||||||
{
|
{
|
||||||
s32 sign = 1;
|
s32 sign = 1;
|
||||||
@ -2440,7 +2428,6 @@ static struct iwl_lib_ops iwl4965_lib = {
|
|||||||
.check_version = iwl4965_eeprom_check_version,
|
.check_version = iwl4965_eeprom_check_version,
|
||||||
.query_addr = iwlcore_eeprom_query_addr,
|
.query_addr = iwlcore_eeprom_query_addr,
|
||||||
},
|
},
|
||||||
.set_power = iwl4965_set_power,
|
|
||||||
.send_tx_power = iwl4965_send_tx_power,
|
.send_tx_power = iwl4965_send_tx_power,
|
||||||
.update_chain_flags = iwl4965_update_chain_flags,
|
.update_chain_flags = iwl4965_update_chain_flags,
|
||||||
.temperature = iwl4965_temperature_calib,
|
.temperature = iwl4965_temperature_calib,
|
||||||
|
@ -1474,6 +1474,7 @@ static struct iwl_lib_ops iwl5000_lib = {
|
|||||||
.alive_notify = iwl5000_alive_notify,
|
.alive_notify = iwl5000_alive_notify,
|
||||||
.send_tx_power = iwl5000_send_tx_power,
|
.send_tx_power = iwl5000_send_tx_power,
|
||||||
.temperature = iwl5000_temperature,
|
.temperature = iwl5000_temperature,
|
||||||
|
.update_chain_flags = iwl4965_update_chain_flags,
|
||||||
.apm_ops = {
|
.apm_ops = {
|
||||||
.init = iwl5000_apm_init,
|
.init = iwl5000_apm_init,
|
||||||
.reset = iwl5000_apm_reset,
|
.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:
|
* @flags: See below:
|
||||||
*
|
*
|
||||||
* POWER_TABLE_CMD = 0x77 (command, has simple generic response)
|
* 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_PCI_PM_MSK __constant_cpu_to_le16(1 << 3)
|
||||||
#define IWL_POWER_FAST_PD __constant_cpu_to_le16(1 << 4)
|
#define IWL_POWER_FAST_PD __constant_cpu_to_le16(1 << 4)
|
||||||
|
|
||||||
struct iwl4965_powertable_cmd {
|
struct iwl_powertable_cmd {
|
||||||
__le16 flags;
|
__le16 flags;
|
||||||
u8 keep_alive_seconds;
|
u8 keep_alive_seconds;
|
||||||
u8 debug_flags;
|
u8 debug_flags;
|
||||||
|
@ -139,7 +139,6 @@ struct iwl_lib_ops {
|
|||||||
int (*set_pwr_src)(struct iwl_priv *priv, enum iwl_pwr_src src);
|
int (*set_pwr_src)(struct iwl_priv *priv, enum iwl_pwr_src src);
|
||||||
} apm_ops;
|
} apm_ops;
|
||||||
/* power */
|
/* power */
|
||||||
int (*set_power)(struct iwl_priv *priv, void *cmd);
|
|
||||||
int (*send_tx_power) (struct iwl_priv *priv);
|
int (*send_tx_power) (struct iwl_priv *priv);
|
||||||
void (*update_chain_flags)(struct iwl_priv *priv);
|
void (*update_chain_flags)(struct iwl_priv *priv);
|
||||||
void (*temperature) (struct iwl_priv *priv);
|
void (*temperature) (struct iwl_priv *priv);
|
||||||
|
@ -283,7 +283,7 @@ struct iwl_cmd {
|
|||||||
u32 val32;
|
u32 val32;
|
||||||
struct iwl4965_bt_cmd bt;
|
struct iwl4965_bt_cmd bt;
|
||||||
struct iwl4965_rxon_time_cmd rxon_time;
|
struct iwl4965_rxon_time_cmd rxon_time;
|
||||||
struct iwl4965_powertable_cmd powertable;
|
struct iwl_powertable_cmd powertable;
|
||||||
struct iwl_qosparam_cmd qosparam;
|
struct iwl_qosparam_cmd qosparam;
|
||||||
struct iwl_tx_cmd tx;
|
struct iwl_tx_cmd tx;
|
||||||
struct iwl4965_tx_beacon_cmd tx_beacon;
|
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);
|
const u8 *dest, int left);
|
||||||
extern void iwl4965_update_chain_flags(struct iwl_priv *priv);
|
extern void iwl4965_update_chain_flags(struct iwl_priv *priv);
|
||||||
int iwl4965_set_pwr_src(struct iwl_priv *priv, enum iwl_pwr_src src);
|
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];
|
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}
|
{{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
|
/* decide the right power level according to association status
|
||||||
* and battery status
|
* and battery status
|
||||||
*/
|
*/
|
||||||
@ -162,7 +169,7 @@ static int iwl_power_init_handle(struct iwl_priv *priv)
|
|||||||
if (ret != 0)
|
if (ret != 0)
|
||||||
return 0;
|
return 0;
|
||||||
else {
|
else {
|
||||||
struct iwl4965_powertable_cmd *cmd;
|
struct iwl_powertable_cmd *cmd;
|
||||||
|
|
||||||
IWL_DEBUG_POWER("adjust power command flags\n");
|
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*/
|
/* adjust power command according to dtim period and power level*/
|
||||||
static int iwl_update_power_command(struct iwl_priv *priv,
|
static int iwl_update_power_command(struct iwl_priv *priv,
|
||||||
struct iwl4965_powertable_cmd *cmd,
|
struct iwl_powertable_cmd *cmd,
|
||||||
u16 mode)
|
u16 mode)
|
||||||
{
|
{
|
||||||
int ret = 0, i;
|
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];
|
range = &pow_data->pwr_range_2[0];
|
||||||
|
|
||||||
period = pow_data->dtim_period;
|
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) {
|
if (period == 0) {
|
||||||
period = 1;
|
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 &&
|
if (!iwl_is_rfkill(priv) && !setting->power_disabled &&
|
||||||
((setting->power_mode != final_mode) || refresh)) {
|
((setting->power_mode != final_mode) || refresh)) {
|
||||||
struct iwl4965_powertable_cmd cmd;
|
struct iwl_powertable_cmd cmd;
|
||||||
|
|
||||||
if (final_mode != IWL_POWER_MODE_CAM)
|
if (final_mode != IWL_POWER_MODE_CAM)
|
||||||
set_bit(STATUS_POWER_PMI, &priv->status);
|
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)
|
if (final_mode == IWL_POWER_INDEX_5)
|
||||||
cmd.flags |= IWL_POWER_FAST_PD;
|
cmd.flags |= IWL_POWER_FAST_PD;
|
||||||
|
|
||||||
if (priv->cfg->ops->lib->set_power)
|
ret = iwl_set_power(priv, &cmd);
|
||||||
ret = priv->cfg->ops->lib->set_power(priv, &cmd);
|
|
||||||
|
|
||||||
if (final_mode == IWL_POWER_MODE_CAM)
|
if (final_mode == IWL_POWER_MODE_CAM)
|
||||||
clear_bit(STATUS_POWER_PMI, &priv->status);
|
clear_bit(STATUS_POWER_PMI, &priv->status);
|
||||||
|
@ -46,7 +46,7 @@ struct iwl_priv;
|
|||||||
/* Power management (not Tx power) structures */
|
/* Power management (not Tx power) structures */
|
||||||
|
|
||||||
struct iwl_power_vec_entry {
|
struct iwl_power_vec_entry {
|
||||||
struct iwl4965_powertable_cmd cmd;
|
struct iwl_powertable_cmd cmd;
|
||||||
u8 no_dtim;
|
u8 no_dtim;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user