|
@@ -809,8 +809,7 @@ void iwlagn_hw_txq_ctx_free(struct iwl_priv *priv)
|
|
|
|
|
|
/* Tx queues */
|
|
|
if (priv->txq) {
|
|
|
- for (txq_id = 0; txq_id < priv->hw_params.max_txq_num;
|
|
|
- txq_id++)
|
|
|
+ for (txq_id = 0; txq_id < priv->hw_params.max_txq_num; txq_id++)
|
|
|
if (txq_id == IWL_CMD_QUEUE_NUM)
|
|
|
iwl_cmd_queue_free(priv);
|
|
|
else
|
|
@@ -825,15 +824,15 @@ void iwlagn_hw_txq_ctx_free(struct iwl_priv *priv)
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * iwlagn_txq_ctx_reset - Reset TX queue context
|
|
|
- * Destroys all DMA structures and initialize them again
|
|
|
+ * iwlagn_txq_ctx_alloc - allocate TX queue context
|
|
|
+ * Allocate all Tx DMA structures and initialize them
|
|
|
*
|
|
|
* @param priv
|
|
|
* @return error code
|
|
|
*/
|
|
|
-int iwlagn_txq_ctx_reset(struct iwl_priv *priv)
|
|
|
+int iwlagn_txq_ctx_alloc(struct iwl_priv *priv)
|
|
|
{
|
|
|
- int ret = 0;
|
|
|
+ int ret;
|
|
|
int txq_id, slots_num;
|
|
|
unsigned long flags;
|
|
|
|
|
@@ -891,8 +890,31 @@ int iwlagn_txq_ctx_reset(struct iwl_priv *priv)
|
|
|
return ret;
|
|
|
}
|
|
|
|
|
|
+void iwlagn_txq_ctx_reset(struct iwl_priv *priv)
|
|
|
+{
|
|
|
+ int txq_id, slots_num;
|
|
|
+ unsigned long flags;
|
|
|
+
|
|
|
+ spin_lock_irqsave(&priv->lock, flags);
|
|
|
+
|
|
|
+ /* Turn off all Tx DMA fifos */
|
|
|
+ priv->cfg->ops->lib->txq_set_sched(priv, 0);
|
|
|
+
|
|
|
+ /* Tell NIC where to find the "keep warm" buffer */
|
|
|
+ iwl_write_direct32(priv, FH_KW_MEM_ADDR_REG, priv->kw.dma >> 4);
|
|
|
+
|
|
|
+ spin_unlock_irqrestore(&priv->lock, flags);
|
|
|
+
|
|
|
+ /* Alloc and init all Tx queues, including the command queue (#4) */
|
|
|
+ for (txq_id = 0; txq_id < priv->hw_params.max_txq_num; txq_id++) {
|
|
|
+ slots_num = txq_id == IWL_CMD_QUEUE_NUM ?
|
|
|
+ TFD_CMD_SLOTS : TFD_TX_CMD_SLOTS;
|
|
|
+ iwl_tx_queue_reset(priv, &priv->txq[txq_id], slots_num, txq_id);
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
/**
|
|
|
- * iwlagn_txq_ctx_stop - Stop all Tx DMA channels, free Tx queue memory
|
|
|
+ * iwlagn_txq_ctx_stop - Stop all Tx DMA channels
|
|
|
*/
|
|
|
void iwlagn_txq_ctx_stop(struct iwl_priv *priv)
|
|
|
{
|
|
@@ -912,9 +934,6 @@ void iwlagn_txq_ctx_stop(struct iwl_priv *priv)
|
|
|
1000);
|
|
|
}
|
|
|
spin_unlock_irqrestore(&priv->lock, flags);
|
|
|
-
|
|
|
- /* Deallocate memory for all Tx queues */
|
|
|
- iwlagn_hw_txq_ctx_free(priv);
|
|
|
}
|
|
|
|
|
|
/*
|