On Wed, Sep 3, 2008 at 6:26 AM, Zhu Yi <yi.zhu@xxxxxxxxx> wrote: > From: Tomas Winkler <tomas.winkler@xxxxxxxxx> > > This patch removes GFP_DMA from allocation tx command buffers > GFP_DMA allows allocation only for memory under 16M which causes > allocation problems suspend/resume flows. > > Using kmalloc is temporal solution and some consistent/coherent > allocation schema will be more correct. Since iwlwifi hardware > supports 64bit address this solution should work on x86 (32 and > 64bit) for now. This patch also fixes memory freeing in error path. > > Signed-off-by: Tomas Winkler <tomas.winkler@xxxxxxxxx> > Signed-off-by: Ian Schram <ischram@xxxxxxxxxx> > Signed-off-by: Zhu Yi <yi.zhu@xxxxxxxxx> Note: this address the same fix as commit 49898852e6aa8a6de9a5bc0bab2cf305b3583bbf Author: John W. Linville <linville@xxxxxxxxxxxxx> Date: Tue Sep 2 15:07:18 2008 -0400 One line conflicts. Need just to merge the error path handling. Tomas > drivers/net/wireless/iwlwifi/iwl-tx.c | 29 ++++++++++++++++++----------- > 1 files changed, 18 insertions(+), 11 deletions(-) > > diff --git a/drivers/net/wireless/iwlwifi/iwl-tx.c b/drivers/net/wireless/iwlwifi/iwl-tx.c > index 6cba5e9..68567fa 100644 > --- a/drivers/net/wireless/iwlwifi/iwl-tx.c > +++ b/drivers/net/wireless/iwlwifi/iwl-tx.c > @@ -402,12 +402,11 @@ static int iwl_hw_tx_queue_init(struct iwl_priv *priv, > /** > * iwl_tx_queue_init - Allocate and initialize one tx/cmd queue > */ > -static int iwl_tx_queue_init(struct iwl_priv *priv, > - struct iwl_tx_queue *txq, > +static int iwl_tx_queue_init(struct iwl_priv *priv, struct iwl_tx_queue *txq, > int slots_num, u32 txq_id) > { > int i, len; > - int rc = 0; > + int ret; > > /* > * Alloc buffer array for commands (Tx or other types of commands). > @@ -426,19 +425,16 @@ static int iwl_tx_queue_init(struct iwl_priv *priv, > continue; > } > > - txq->cmd[i] = kmalloc(len, GFP_KERNEL | GFP_DMA); > + txq->cmd[i] = kmalloc(len, GFP_KERNEL); > if (!txq->cmd[i]) > - return -ENOMEM; > + goto err; > } > > /* Alloc driver data array and TFD circular buffer */ > - rc = iwl_tx_queue_alloc(priv, txq, txq_id); > - if (rc) { > - for (i = 0; i < slots_num; i++) > - kfree(txq->cmd[i]); > + ret = iwl_tx_queue_alloc(priv, txq, txq_id); > + if (ret) > + goto err; > > - return -ENOMEM; > - } > txq->need_update = 0; > > /* TFD_QUEUE_SIZE_MAX must be power-of-two size, otherwise > @@ -452,6 +448,17 @@ static int iwl_tx_queue_init(struct iwl_priv *priv, > iwl_hw_tx_queue_init(priv, txq); > > return 0; > +err: > + for (i = 0; i < slots_num; i++) { > + kfree(txq->cmd[i]); > + txq->cmd[i] = NULL; > + } > + > + if (txq_id == IWL_CMD_QUEUE_NUM) { > + kfree(txq->cmd[slots_num]); > + txq->cmd[slots_num] = NULL; > + } > + return -ENOMEM; > } > /** > * iwl_hw_txq_ctx_free - Free TXQ Context > -- > 1.5.3.6 > > -- > To unsubscribe from this list: send the line "unsubscribe linux-wireless" in > the body of a message to majordomo@xxxxxxxxxxxxxxx > More majordomo info at http://vger.kernel.org/majordomo-info.html > -- To unsubscribe from this list: send the line "unsubscribe linux-wireless" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html