| From 0d8d72abd999145e7a7337ac116159c771f8702f Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Fri, 18 Jun 2021 11:01:16 +0300 |
| Subject: iwlwifi: pcie: free IML DMA memory allocation |
| |
| From: Johannes Berg <johannes.berg@intel.com> |
| |
| [ Upstream commit 310f60f53a86eba680d9bc20a371e13b06a5f903 ] |
| |
| In the case of gen3 devices with image loader (IML) support, |
| we were leaking the IML DMA allocation and never freeing it. |
| Fix that. |
| |
| Signed-off-by: Johannes Berg <johannes.berg@intel.com> |
| Signed-off-by: Luca Coelho <luciano.coelho@intel.com> |
| Link: https://lore.kernel.org/r/iwlwifi.20210618105614.07e117dbedb7.I7bb9ebbe0617656986c2a598ea5e827b533bd3b9@changeid |
| Signed-off-by: Luca Coelho <luciano.coelho@intel.com> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| .../wireless/intel/iwlwifi/pcie/ctxt-info-gen3.c | 15 ++++++++++----- |
| .../net/wireless/intel/iwlwifi/pcie/internal.h | 3 +++ |
| 2 files changed, 13 insertions(+), 5 deletions(-) |
| |
| diff --git a/drivers/net/wireless/intel/iwlwifi/pcie/ctxt-info-gen3.c b/drivers/net/wireless/intel/iwlwifi/pcie/ctxt-info-gen3.c |
| index a1cecf4a0e82..addf786fbcaf 100644 |
| --- a/drivers/net/wireless/intel/iwlwifi/pcie/ctxt-info-gen3.c |
| +++ b/drivers/net/wireless/intel/iwlwifi/pcie/ctxt-info-gen3.c |
| @@ -63,7 +63,6 @@ int iwl_pcie_ctxt_info_gen3_init(struct iwl_trans *trans, |
| struct iwl_prph_scratch *prph_scratch; |
| struct iwl_prph_scratch_ctrl_cfg *prph_sc_ctrl; |
| struct iwl_prph_info *prph_info; |
| - void *iml_img; |
| u32 control_flags = 0; |
| int ret; |
| |
| @@ -157,14 +156,15 @@ int iwl_pcie_ctxt_info_gen3_init(struct iwl_trans *trans, |
| trans_pcie->prph_scratch = prph_scratch; |
| |
| /* Allocate IML */ |
| - iml_img = dma_alloc_coherent(trans->dev, trans->iml_len, |
| - &trans_pcie->iml_dma_addr, GFP_KERNEL); |
| - if (!iml_img) { |
| + trans_pcie->iml = dma_alloc_coherent(trans->dev, trans->iml_len, |
| + &trans_pcie->iml_dma_addr, |
| + GFP_KERNEL); |
| + if (!trans_pcie->iml) { |
| ret = -ENOMEM; |
| goto err_free_ctxt_info; |
| } |
| |
| - memcpy(iml_img, trans->iml, trans->iml_len); |
| + memcpy(trans_pcie->iml, trans->iml, trans->iml_len); |
| |
| iwl_enable_fw_load_int_ctx_info(trans); |
| |
| @@ -212,6 +212,11 @@ void iwl_pcie_ctxt_info_gen3_free(struct iwl_trans *trans) |
| trans_pcie->ctxt_info_dma_addr = 0; |
| trans_pcie->ctxt_info_gen3 = NULL; |
| |
| + dma_free_coherent(trans->dev, trans->iml_len, trans_pcie->iml, |
| + trans_pcie->iml_dma_addr); |
| + trans_pcie->iml_dma_addr = 0; |
| + trans_pcie->iml = NULL; |
| + |
| iwl_pcie_ctxt_info_free_fw_img(trans); |
| |
| dma_free_coherent(trans->dev, sizeof(*trans_pcie->prph_scratch), |
| diff --git a/drivers/net/wireless/intel/iwlwifi/pcie/internal.h b/drivers/net/wireless/intel/iwlwifi/pcie/internal.h |
| index e9d67ba3e56d..f581822b2a7d 100644 |
| --- a/drivers/net/wireless/intel/iwlwifi/pcie/internal.h |
| +++ b/drivers/net/wireless/intel/iwlwifi/pcie/internal.h |
| @@ -447,6 +447,8 @@ struct iwl_self_init_dram { |
| * Context information addresses will be taken from here. |
| * This is driver's local copy for keeping track of size and |
| * count for allocating and freeing the memory. |
| + * @iml: image loader image virtual address |
| + * @iml_dma_addr: image loader image DMA address |
| * @trans: pointer to the generic transport area |
| * @scd_base_addr: scheduler sram base address in SRAM |
| * @scd_bc_tbls: pointer to the byte count table of the scheduler |
| @@ -492,6 +494,7 @@ struct iwl_trans_pcie { |
| }; |
| struct iwl_prph_info *prph_info; |
| struct iwl_prph_scratch *prph_scratch; |
| + void *iml; |
| dma_addr_t ctxt_info_dma_addr; |
| dma_addr_t prph_info_dma_addr; |
| dma_addr_t prph_scratch_dma_addr; |
| -- |
| 2.30.2 |
| |