[PATCH] wcn36xx: Fix packet drop on resume
Bryan O'Donoghue
bryan.odonoghue at linaro.org
Mon Oct 25 01:40:07 PDT 2021
On 25/10/2021 09:28, Loic Poulain wrote:
> 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 at linaro.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 a42eae6..a650b9e 100644
> --- a/drivers/net/wireless/ath/wcn36xx/main.c
> +++ b/drivers/net/wireless/ath/wcn36xx/main.c
> @@ -1137,6 +1137,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;
> @@ -1159,6 +1166,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;
>
LGTM
Reviewed-by: Bryan O'Donoghue <bryan.odonoghue at linaro.org>
More information about the wcn36xx
mailing list