lkml.org 
[lkml]   [2021]   [Sep]   [9]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH AUTOSEL 5.14 228/252] iwlwifi: pcie: free RBs during configure
    Date
    From: Johannes Berg <johannes.berg@intel.com>

    [ Upstream commit 6ac5720086c8b176794eb74c5cc09f8b79017f38 ]

    When switching op-modes, or more generally when reconfiguring,
    we might switch the RB size. In _iwl_pcie_rx_init() we have a
    comment saying we must free all RBs since we might switch the
    size, but this is actually too late: the switch has been done
    and we'll free the buffers with the wrong size.

    Fix this by always freeing the buffers, if any, at the start
    of configure, instead of only after the size may have changed.

    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.20210802170640.42d7c93279c4.I07f74e65aab0e3d965a81206fcb289dc92d74878@changeid
    Signed-off-by: Luca Coelho <luciano.coelho@intel.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    drivers/net/wireless/intel/iwlwifi/pcie/rx.c | 5 ++++-
    drivers/net/wireless/intel/iwlwifi/pcie/trans.c | 3 +++
    2 files changed, 7 insertions(+), 1 deletion(-)

    diff --git a/drivers/net/wireless/intel/iwlwifi/pcie/rx.c b/drivers/net/wireless/intel/iwlwifi/pcie/rx.c
    index 4f6f4b2720f0..ff7ca3c57f34 100644
    --- a/drivers/net/wireless/intel/iwlwifi/pcie/rx.c
    +++ b/drivers/net/wireless/intel/iwlwifi/pcie/rx.c
    @@ -487,6 +487,9 @@ void iwl_pcie_free_rbs_pool(struct iwl_trans *trans)
    struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans);
    int i;

    + if (!trans_pcie->rx_pool)
    + return;
    +
    for (i = 0; i < RX_POOL_SIZE(trans_pcie->num_rx_bufs); i++) {
    if (!trans_pcie->rx_pool[i].page)
    continue;
    @@ -1062,7 +1065,7 @@ static int _iwl_pcie_rx_init(struct iwl_trans *trans)
    INIT_LIST_HEAD(&rba->rbd_empty);
    spin_unlock_bh(&rba->lock);

    - /* free all first - we might be reconfigured for a different size */
    + /* free all first - we overwrite everything here */
    iwl_pcie_free_rbs_pool(trans);

    for (i = 0; i < RX_QUEUE_SIZE; i++)
    diff --git a/drivers/net/wireless/intel/iwlwifi/pcie/trans.c b/drivers/net/wireless/intel/iwlwifi/pcie/trans.c
    index bee6b4574226..65cc25cbb9ec 100644
    --- a/drivers/net/wireless/intel/iwlwifi/pcie/trans.c
    +++ b/drivers/net/wireless/intel/iwlwifi/pcie/trans.c
    @@ -1866,6 +1866,9 @@ static void iwl_trans_pcie_configure(struct iwl_trans *trans,
    {
    struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans);

    + /* free all first - we might be reconfigured for a different size */
    + iwl_pcie_free_rbs_pool(trans);
    +
    trans->txqs.cmd.q_id = trans_cfg->cmd_queue;
    trans->txqs.cmd.fifo = trans_cfg->cmd_fifo;
    trans->txqs.cmd.wdg_timeout = trans_cfg->cmd_q_wdg_timeout;
    --
    2.30.2
    \
     
     \ /
      Last update: 2021-09-09 14:07    [W:4.148 / U:0.160 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site