[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