lkml.org 
[lkml]   [2021]   [Nov]   [15]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.15 306/917] wcn36xx: Fix packet drop on resume
    Date
    From: Loic Poulain <loic.poulain@linaro.org>

    [ Upstream commit df0697801d8aa2eebfe7f0b7388879639f8fe7cc ]

    If the system is resumed because of an incoming packet, the wcn36xx RX
    interrupts is fired before actual resuming of the wireless/mac80211
    stack, causing any received packets to be simply dropped. E.g. a ping
    request causes a system resume, but is dropped and so never forwarded
    to the IP stack.

    This change fixes that, disabling DMA interrupts on suspend to no pass
    packets until mac80211 is resumed and ready to handle them.

    Note that it's not incompatible with RX irq wake.

    Signed-off-by: Loic Poulain <loic.poulain@linaro.org>
    Reviewed-by: Bryan O'Donoghue <bryan.odonoghue@linaro.org>
    Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
    Link: https://lore.kernel.org/r/1635150496-19290-1-git-send-email-loic.poulain@linaro.org
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    drivers/net/wireless/ath/wcn36xx/main.c | 11 +++++++++++
    1 file changed, 11 insertions(+)

    diff --git a/drivers/net/wireless/ath/wcn36xx/main.c b/drivers/net/wireless/ath/wcn36xx/main.c
    index bd1c83aeea606..39d86e3031bd7 100644
    --- a/drivers/net/wireless/ath/wcn36xx/main.c
    +++ b/drivers/net/wireless/ath/wcn36xx/main.c
    @@ -1115,6 +1115,13 @@ static int wcn36xx_suspend(struct ieee80211_hw *hw, struct cfg80211_wowlan *wow)
    goto out;
    ret = wcn36xx_smd_wlan_host_suspend_ind(wcn);
    }
    +
    + /* Disable IRQ, we don't want to handle any packet before mac80211 is
    + * resumed and ready to receive packets.
    + */
    + disable_irq(wcn->tx_irq);
    + disable_irq(wcn->rx_irq);
    +
    out:
    mutex_unlock(&wcn->conf_mutex);
    return ret;
    @@ -1137,6 +1144,10 @@ static int wcn36xx_resume(struct ieee80211_hw *hw)
    wcn36xx_smd_ipv6_ns_offload(wcn, vif, false);
    wcn36xx_smd_arp_offload(wcn, vif, false);
    }
    +
    + enable_irq(wcn->tx_irq);
    + enable_irq(wcn->rx_irq);
    +
    mutex_unlock(&wcn->conf_mutex);

    return 0;
    --
    2.33.0


    \
     
     \ /
      Last update: 2021-11-16 00:36    [W:3.968 / U:0.008 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site