iwlwifi: split POWER_PMI status bit
Move the POWER_PMI to the op_mode where it is changed. The trans needs to check it frequently, so shadow the status in the trans and update it in trans when it infrequently changes. Signed-off-by: Don Fry <donald.h.fry@intel.com> Signed-off-by: Wey-Yi Guy <wey-yi.w.guy@intel.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
This commit is contained in:
committed by
John W. Linville
parent
17acd0b64e
commit
47107e8444
@ -856,7 +856,7 @@ static u8 iwl_count_chain_bitmap(u32 chain_bitmap)
|
|||||||
void iwlagn_set_rxon_chain(struct iwl_priv *priv, struct iwl_rxon_context *ctx)
|
void iwlagn_set_rxon_chain(struct iwl_priv *priv, struct iwl_rxon_context *ctx)
|
||||||
{
|
{
|
||||||
bool is_single = is_single_rx_stream(priv);
|
bool is_single = is_single_rx_stream(priv);
|
||||||
bool is_cam = !test_bit(STATUS_POWER_PMI, &priv->shrd->status);
|
bool is_cam = !test_bit(STATUS_POWER_PMI, &priv->status);
|
||||||
u8 idle_rx_cnt, active_rx_cnt, valid_rx_cnt;
|
u8 idle_rx_cnt, active_rx_cnt, valid_rx_cnt;
|
||||||
u32 active_chains;
|
u32 active_chains;
|
||||||
u16 rx_chain;
|
u16 rx_chain;
|
||||||
|
@ -392,6 +392,15 @@ static inline int iwl_is_ready_rf(struct iwl_priv *priv)
|
|||||||
return iwl_is_ready(priv);
|
return iwl_is_ready(priv);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline void iwl_dvm_set_pmi(struct iwl_priv *priv, bool state)
|
||||||
|
{
|
||||||
|
if (state)
|
||||||
|
set_bit(STATUS_POWER_PMI, &priv->status);
|
||||||
|
else
|
||||||
|
clear_bit(STATUS_POWER_PMI, &priv->status);
|
||||||
|
iwl_trans_set_pmi(trans(priv), state);
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_IWLWIFI_DEBUG
|
#ifdef CONFIG_IWLWIFI_DEBUG
|
||||||
#define IWL_DEBUG_QUIET_RFKILL(m, fmt, args...) \
|
#define IWL_DEBUG_QUIET_RFKILL(m, fmt, args...) \
|
||||||
do { \
|
do { \
|
||||||
|
@ -555,7 +555,7 @@ static ssize_t iwl_dbgfs_status_read(struct file *file,
|
|||||||
pos += scnprintf(buf + pos, bufsz - pos, "STATUS_SCAN_HW:\t\t %d\n",
|
pos += scnprintf(buf + pos, bufsz - pos, "STATUS_SCAN_HW:\t\t %d\n",
|
||||||
test_bit(STATUS_SCAN_HW, &priv->status));
|
test_bit(STATUS_SCAN_HW, &priv->status));
|
||||||
pos += scnprintf(buf + pos, bufsz - pos, "STATUS_POWER_PMI:\t %d\n",
|
pos += scnprintf(buf + pos, bufsz - pos, "STATUS_POWER_PMI:\t %d\n",
|
||||||
test_bit(STATUS_POWER_PMI, &priv->shrd->status));
|
test_bit(STATUS_POWER_PMI, &priv->status));
|
||||||
pos += scnprintf(buf + pos, bufsz - pos, "STATUS_FW_ERROR:\t %d\n",
|
pos += scnprintf(buf + pos, bufsz - pos, "STATUS_FW_ERROR:\t %d\n",
|
||||||
test_bit(STATUS_FW_ERROR, &priv->status));
|
test_bit(STATUS_FW_ERROR, &priv->status));
|
||||||
return simple_read_from_buffer(user_buf, count, ppos, buf, pos);
|
return simple_read_from_buffer(user_buf, count, ppos, buf, pos);
|
||||||
|
@ -403,12 +403,12 @@ int iwl_power_set_mode(struct iwl_priv *priv, struct iwl_powertable_cmd *cmd,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (cmd->flags & IWL_POWER_DRIVER_ALLOW_SLEEP_MSK)
|
if (cmd->flags & IWL_POWER_DRIVER_ALLOW_SLEEP_MSK)
|
||||||
set_bit(STATUS_POWER_PMI, &priv->shrd->status);
|
iwl_dvm_set_pmi(priv, true);
|
||||||
|
|
||||||
ret = iwl_set_power(priv, cmd);
|
ret = iwl_set_power(priv, cmd);
|
||||||
if (!ret) {
|
if (!ret) {
|
||||||
if (!(cmd->flags & IWL_POWER_DRIVER_ALLOW_SLEEP_MSK))
|
if (!(cmd->flags & IWL_POWER_DRIVER_ALLOW_SLEEP_MSK))
|
||||||
clear_bit(STATUS_POWER_PMI, &priv->shrd->status);
|
iwl_dvm_set_pmi(priv, false);
|
||||||
|
|
||||||
if (update_chains)
|
if (update_chains)
|
||||||
iwl_update_chain_flags(priv);
|
iwl_update_chain_flags(priv);
|
||||||
|
@ -850,7 +850,7 @@ static int iwlagn_request_scan(struct iwl_priv *priv, struct ieee80211_vif *vif)
|
|||||||
* In power save mode while associated use one chain,
|
* In power save mode while associated use one chain,
|
||||||
* otherwise use all chains
|
* otherwise use all chains
|
||||||
*/
|
*/
|
||||||
if (test_bit(STATUS_POWER_PMI, &priv->shrd->status) &&
|
if (test_bit(STATUS_POWER_PMI, &priv->status) &&
|
||||||
!(priv->hw->conf.flags & IEEE80211_CONF_IDLE)) {
|
!(priv->hw->conf.flags & IEEE80211_CONF_IDLE)) {
|
||||||
/* rx_ant has been set to all valid chains previously */
|
/* rx_ant has been set to all valid chains previously */
|
||||||
active_chains = rx_ant &
|
active_chains = rx_ant &
|
||||||
|
@ -146,8 +146,11 @@ void iwl_rx_queue_update_write_ptr(struct iwl_trans *trans,
|
|||||||
q->write_actual = (q->write & ~0x7);
|
q->write_actual = (q->write & ~0x7);
|
||||||
iwl_write32(trans, FH_RSCSR_CHNL0_WPTR, q->write_actual);
|
iwl_write32(trans, FH_RSCSR_CHNL0_WPTR, q->write_actual);
|
||||||
} else {
|
} else {
|
||||||
|
struct iwl_trans_pcie *trans_pcie =
|
||||||
|
IWL_TRANS_GET_PCIE_TRANS(trans);
|
||||||
|
|
||||||
/* If power-saving is in use, make sure device is awake */
|
/* If power-saving is in use, make sure device is awake */
|
||||||
if (test_bit(STATUS_POWER_PMI, &trans->shrd->status)) {
|
if (test_bit(STATUS_POWER_PMI, &trans_pcie->status)) {
|
||||||
reg = iwl_read32(trans, CSR_UCODE_DRV_GP1);
|
reg = iwl_read32(trans, CSR_UCODE_DRV_GP1);
|
||||||
|
|
||||||
if (reg & CSR_UCODE_DRV_GP1_BIT_MAC_SLEEP) {
|
if (reg & CSR_UCODE_DRV_GP1_BIT_MAC_SLEEP) {
|
||||||
|
@ -104,8 +104,10 @@ void iwl_txq_update_write_ptr(struct iwl_trans *trans, struct iwl_tx_queue *txq)
|
|||||||
iwl_write32(trans, HBUS_TARG_WRPTR,
|
iwl_write32(trans, HBUS_TARG_WRPTR,
|
||||||
txq->q.write_ptr | (txq_id << 8));
|
txq->q.write_ptr | (txq_id << 8));
|
||||||
} else {
|
} else {
|
||||||
|
struct iwl_trans_pcie *trans_pcie =
|
||||||
|
IWL_TRANS_GET_PCIE_TRANS(trans);
|
||||||
/* if we're trying to save power */
|
/* if we're trying to save power */
|
||||||
if (test_bit(STATUS_POWER_PMI, &trans->shrd->status)) {
|
if (test_bit(STATUS_POWER_PMI, &trans_pcie->status)) {
|
||||||
/* wake up nic if it's powered down ...
|
/* wake up nic if it's powered down ...
|
||||||
* uCode will wake up, and interrupt us again, so next
|
* uCode will wake up, and interrupt us again, so next
|
||||||
* time we'll skip this part. */
|
* time we'll skip this part. */
|
||||||
|
@ -1518,6 +1518,16 @@ static void iwl_trans_pcie_free(struct iwl_trans *trans)
|
|||||||
kfree(trans);
|
kfree(trans);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void iwl_trans_pcie_set_pmi(struct iwl_trans *trans, bool state)
|
||||||
|
{
|
||||||
|
struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans);
|
||||||
|
|
||||||
|
if (state)
|
||||||
|
set_bit(STATUS_POWER_PMI, &trans_pcie->status);
|
||||||
|
else
|
||||||
|
clear_bit(STATUS_POWER_PMI, &trans_pcie->status);
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_PM_SLEEP
|
#ifdef CONFIG_PM_SLEEP
|
||||||
static int iwl_trans_pcie_suspend(struct iwl_trans *trans)
|
static int iwl_trans_pcie_suspend(struct iwl_trans *trans)
|
||||||
{
|
{
|
||||||
@ -2038,6 +2048,7 @@ const struct iwl_trans_ops trans_ops_pcie = {
|
|||||||
.write32 = iwl_trans_pcie_write32,
|
.write32 = iwl_trans_pcie_write32,
|
||||||
.read32 = iwl_trans_pcie_read32,
|
.read32 = iwl_trans_pcie_read32,
|
||||||
.configure = iwl_trans_pcie_configure,
|
.configure = iwl_trans_pcie_configure,
|
||||||
|
.set_pmi = iwl_trans_pcie_set_pmi,
|
||||||
};
|
};
|
||||||
|
|
||||||
struct iwl_trans *iwl_trans_pcie_alloc(struct iwl_shared *shrd,
|
struct iwl_trans *iwl_trans_pcie_alloc(struct iwl_shared *shrd,
|
||||||
|
@ -364,6 +364,7 @@ struct iwl_trans_config {
|
|||||||
* @configure: configure parameters required by the transport layer from
|
* @configure: configure parameters required by the transport layer from
|
||||||
* the op_mode. May be called several times before start_fw, can't be
|
* the op_mode. May be called several times before start_fw, can't be
|
||||||
* called after that.
|
* called after that.
|
||||||
|
* @set_pmi: set the power pmi state
|
||||||
*/
|
*/
|
||||||
struct iwl_trans_ops {
|
struct iwl_trans_ops {
|
||||||
|
|
||||||
@ -400,6 +401,7 @@ struct iwl_trans_ops {
|
|||||||
u32 (*read32)(struct iwl_trans *trans, u32 ofs);
|
u32 (*read32)(struct iwl_trans *trans, u32 ofs);
|
||||||
void (*configure)(struct iwl_trans *trans,
|
void (*configure)(struct iwl_trans *trans,
|
||||||
const struct iwl_trans_config *trans_cfg);
|
const struct iwl_trans_config *trans_cfg);
|
||||||
|
void (*set_pmi)(struct iwl_trans *trans, bool state);
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -611,6 +613,11 @@ static inline u32 iwl_trans_read32(struct iwl_trans *trans, u32 ofs)
|
|||||||
return trans->ops->read32(trans, ofs);
|
return trans->ops->read32(trans, ofs);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline void iwl_trans_set_pmi(struct iwl_trans *trans, bool state)
|
||||||
|
{
|
||||||
|
trans->ops->set_pmi(trans, state);
|
||||||
|
}
|
||||||
|
|
||||||
/*****************************************************
|
/*****************************************************
|
||||||
* Transport layers implementations + their allocation function
|
* Transport layers implementations + their allocation function
|
||||||
******************************************************/
|
******************************************************/
|
||||||
|
Reference in New Issue
Block a user