Skip to content

Commit

Permalink
iwlwifi: refactor stop master function
Browse files Browse the repository at this point in the history
This patch refactors stop master function for 4965 and 5000.
Currently it duplicates the function.

Signed-off-by: Tomas Winkler <tomas.winkler@intel.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
  • Loading branch information
Tomas Winkler authored and John W. Linville committed Jun 3, 2008
1 parent f118a91 commit 46315e0
Show file tree
Hide file tree
Showing 3 changed files with 52 additions and 38 deletions.
60 changes: 25 additions & 35 deletions drivers/net/wireless/iwlwifi/iwl-4965.c
Original file line number Diff line number Diff line change
Expand Up @@ -579,39 +579,6 @@ static void iwl4965_nic_config(struct iwl_priv *priv)
spin_unlock_irqrestore(&priv->lock, flags);
}

int iwl4965_hw_nic_stop_master(struct iwl_priv *priv)
{
int rc = 0;
u32 reg_val;
unsigned long flags;

spin_lock_irqsave(&priv->lock, flags);

/* set stop master bit */
iwl_set_bit(priv, CSR_RESET, CSR_RESET_REG_FLAG_STOP_MASTER);

reg_val = iwl_read32(priv, CSR_GP_CNTRL);

if (CSR_GP_CNTRL_REG_FLAG_MAC_POWER_SAVE ==
(reg_val & CSR_GP_CNTRL_REG_MSK_POWER_SAVE_TYPE))
IWL_DEBUG_INFO("Card in power save, master is already "
"stopped\n");
else {
rc = iwl_poll_bit(priv, CSR_RESET,
CSR_RESET_REG_FLAG_MASTER_DISABLED,
CSR_RESET_REG_FLAG_MASTER_DISABLED, 100);
if (rc < 0) {
spin_unlock_irqrestore(&priv->lock, flags);
return rc;
}
}

spin_unlock_irqrestore(&priv->lock, flags);
IWL_DEBUG_INFO("stop master\n");

return rc;
}

/**
* iwl4965_hw_txq_ctx_stop - Stop all Tx DMA channels, free Tx queue memory
*/
Expand Down Expand Up @@ -642,11 +609,34 @@ void iwl4965_hw_txq_ctx_stop(struct iwl_priv *priv)
iwl_hw_txq_ctx_free(priv);
}

static int iwl4965_apm_stop_master(struct iwl_priv *priv)
{
int ret = 0;
unsigned long flags;

spin_lock_irqsave(&priv->lock, flags);

/* set stop master bit */
iwl_set_bit(priv, CSR_RESET, CSR_RESET_REG_FLAG_STOP_MASTER);

ret = iwl_poll_bit(priv, CSR_RESET,
CSR_RESET_REG_FLAG_MASTER_DISABLED,
CSR_RESET_REG_FLAG_MASTER_DISABLED, 100);
if (ret < 0)
goto out;

out:
spin_unlock_irqrestore(&priv->lock, flags);
IWL_DEBUG_INFO("stop master\n");

return ret;
}

static void iwl4965_apm_stop(struct iwl_priv *priv)
{
unsigned long flags;

iwl4965_hw_nic_stop_master(priv);
iwl4965_apm_stop_master(priv);

spin_lock_irqsave(&priv->lock, flags);

Expand All @@ -663,7 +653,7 @@ static int iwl4965_apm_reset(struct iwl_priv *priv)
int ret = 0;
unsigned long flags;

iwl4965_hw_nic_stop_master(priv);
iwl4965_apm_stop_master(priv);

spin_lock_irqsave(&priv->lock, flags);

Expand Down
29 changes: 27 additions & 2 deletions drivers/net/wireless/iwlwifi/iwl-5000.c
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,31 @@ static const u16 iwl5000_default_queue_to_tx_fifo[] = {
IWL_TX_FIFO_HCCA_2
};

/* FIXME: same implementation as 4965 */
static int iwl5000_apm_stop_master(struct iwl_priv *priv)
{
int ret = 0;
unsigned long flags;

spin_lock_irqsave(&priv->lock, flags);

/* set stop master bit */
iwl_set_bit(priv, CSR_RESET, CSR_RESET_REG_FLAG_STOP_MASTER);

ret = iwl_poll_bit(priv, CSR_RESET,
CSR_RESET_REG_FLAG_MASTER_DISABLED,
CSR_RESET_REG_FLAG_MASTER_DISABLED, 100);
if (ret < 0)
goto out;

out:
spin_unlock_irqrestore(&priv->lock, flags);
IWL_DEBUG_INFO("stop master\n");

return ret;
}


static int iwl5000_apm_init(struct iwl_priv *priv)
{
int ret = 0;
Expand Down Expand Up @@ -105,7 +130,7 @@ static void iwl5000_apm_stop(struct iwl_priv *priv)
{
unsigned long flags;

iwl4965_hw_nic_stop_master(priv);
iwl5000_apm_stop_master(priv);

spin_lock_irqsave(&priv->lock, flags);

Expand All @@ -124,7 +149,7 @@ static int iwl5000_apm_reset(struct iwl_priv *priv)
int ret = 0;
unsigned long flags;

iwl4965_hw_nic_stop_master(priv);
iwl5000_apm_stop_master(priv);

spin_lock_irqsave(&priv->lock, flags);

Expand Down
1 change: 0 additions & 1 deletion drivers/net/wireless/iwlwifi/iwl-dev.h
Original file line number Diff line number Diff line change
Expand Up @@ -686,7 +686,6 @@ extern void iwl4965_hw_setup_deferred_work(struct iwl_priv *priv);
extern void iwl4965_hw_cancel_deferred_work(struct iwl_priv *priv);
extern int iwl4965_hw_rxq_stop(struct iwl_priv *priv);
extern int iwl4965_hw_set_hw_params(struct iwl_priv *priv);
extern int iwl4965_hw_nic_stop_master(struct iwl_priv *priv);
extern void iwl4965_hw_txq_ctx_stop(struct iwl_priv *priv);
extern int iwl4965_hw_get_temperature(struct iwl_priv *priv);
extern unsigned int iwl4965_hw_get_beacon_cmd(struct iwl_priv *priv,
Expand Down

0 comments on commit 46315e0

Please sign in to comment.