Skip to content

Commit

Permalink
iwlwifi: create disable SCD Tx FIFOs handler
Browse files Browse the repository at this point in the history
This patch moves disabeling Tx FIFOs in NIC SCD to seperate handlers
in 4965 and 5000 cards.

Signed-off-by: Ron Rindjunsky <ron.rindjunsky@intel.com>
Signed-off-by: Tomas Winkler <tomas.winkler@intel.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
  • Loading branch information
Ron Rindjunsky authored and John W. Linville committed May 14, 2008
1 parent 47c5196 commit 5a676bb
Show file tree
Hide file tree
Showing 3 changed files with 50 additions and 14 deletions.
40 changes: 26 additions & 14 deletions drivers/net/wireless/iwlwifi/iwl-4965.c
Original file line number Diff line number Diff line change
Expand Up @@ -470,6 +470,27 @@ static void iwl4965_kw_free(struct iwl_priv *priv)
}
}

static int iwl4965_disable_tx_fifo(struct iwl_priv *priv)
{
unsigned long flags;
int ret;

spin_lock_irqsave(&priv->lock, flags);

ret = iwl_grab_nic_access(priv);
if (unlikely(ret)) {
IWL_ERROR("Tx fifo reset failed");
spin_unlock_irqrestore(&priv->lock, flags);
return ret;
}

iwl_write_prph(priv, IWL49_SCD_TXFACT, 0);
iwl_release_nic_access(priv);
spin_unlock_irqrestore(&priv->lock, flags);

return 0;
}

/**
* iwl4965_txq_ctx_reset - Reset TX queue context
* Destroys all DMA structures and initialise them again
Expand All @@ -481,7 +502,6 @@ static int iwl4965_txq_ctx_reset(struct iwl_priv *priv)
{
int rc = 0;
int txq_id, slots_num;
unsigned long flags;

iwl4965_kw_free(priv);

Expand All @@ -495,19 +515,10 @@ static int iwl4965_txq_ctx_reset(struct iwl_priv *priv)
goto error_kw;
}

spin_lock_irqsave(&priv->lock, flags);

rc = iwl_grab_nic_access(priv);
if (unlikely(rc)) {
IWL_ERROR("TX reset failed");
spin_unlock_irqrestore(&priv->lock, flags);
/* Turn off all Tx DMA fifos */
rc = priv->cfg->ops->lib->disable_tx_fifo(priv);
if (unlikely(rc))
goto error_reset;
}

/* Turn off all Tx DMA channels */
iwl_write_prph(priv, IWL49_SCD_TXFACT, 0);
iwl_release_nic_access(priv);
spin_unlock_irqrestore(&priv->lock, flags);

/* Tell 4965 where to find the keep-warm buffer */
rc = iwl4965_kw_init(priv);
Expand Down Expand Up @@ -538,6 +549,7 @@ static int iwl4965_txq_ctx_reset(struct iwl_priv *priv)
error_kw:
return rc;
}

static int iwl4965_apm_init(struct iwl_priv *priv)
{
unsigned long flags;
Expand Down Expand Up @@ -621,7 +633,6 @@ static void iwl4965_nic_config(struct iwl_priv *priv)
spin_unlock_irqrestore(&priv->lock, flags);
}


int iwl4965_hw_nic_init(struct iwl_priv *priv)
{
unsigned long flags;
Expand Down Expand Up @@ -4044,6 +4055,7 @@ static struct iwl_lib_ops iwl4965_lib = {
.free_shared_mem = iwl4965_free_shared_mem,
.txq_update_byte_cnt_tbl = iwl4965_txq_update_byte_cnt_tbl,
.hw_nic_init = iwl4965_hw_nic_init,
.disable_tx_fifo = iwl4965_disable_tx_fifo,
.rx_handler_setup = iwl4965_rx_handler_setup,
.is_valid_rtc_data_addr = iwl4965_hw_valid_rtc_data_addr,
.alive_notify = iwl4965_alive_notify,
Expand Down
22 changes: 22 additions & 0 deletions drivers/net/wireless/iwlwifi/iwl-5000.c
Original file line number Diff line number Diff line change
Expand Up @@ -430,6 +430,27 @@ static u16 iwl5000_build_addsta_hcmd(const struct iwl_addsta_cmd *cmd, u8 *data)
}


static int iwl5000_disable_tx_fifo(struct iwl_priv *priv)
{
unsigned long flags;
int ret;

spin_lock_irqsave(&priv->lock, flags);

ret = iwl_grab_nic_access(priv);
if (unlikely(ret)) {
IWL_ERROR("Tx fifo reset failed");
spin_unlock_irqrestore(&priv->lock, flags);
return ret;
}

iwl_write_prph(priv, IWL50_SCD_TXFACT, 0);
iwl_release_nic_access(priv);
spin_unlock_irqrestore(&priv->lock, flags);

return 0;
}

static struct iwl_hcmd_ops iwl5000_hcmd = {
};

Expand All @@ -446,6 +467,7 @@ static struct iwl_lib_ops iwl5000_lib = {
.alloc_shared_mem = iwl5000_alloc_shared_mem,
.free_shared_mem = iwl5000_free_shared_mem,
.txq_update_byte_cnt_tbl = iwl5000_txq_update_byte_cnt_tbl,
.disable_tx_fifo = iwl5000_disable_tx_fifo,
.apm_ops = {
.init = iwl5000_apm_init,
.config = iwl5000_nic_config,
Expand Down
2 changes: 2 additions & 0 deletions drivers/net/wireless/iwlwifi/iwl-core.h
Original file line number Diff line number Diff line change
Expand Up @@ -110,6 +110,8 @@ struct iwl_lib_ops {
void (*rx_handler_setup)(struct iwl_priv *priv);
/* nic init */
int (*hw_nic_init)(struct iwl_priv *priv);
/* nic Tx fifo handling */
int (*disable_tx_fifo)(struct iwl_priv *priv);
/* alive notification */
int (*alive_notify)(struct iwl_priv *priv);
/* check validity of rtc data address */
Expand Down

0 comments on commit 5a676bb

Please sign in to comment.