[PATCH] wcn36xx: Fix discarded frames due to wrong sequence number

Bryan O'Donoghue bryan.odonoghue at linaro.org
Mon Oct 25 01:36:37 PDT 2021


On 25/10/2021 09:25, Loic Poulain wrote:
> The firmware is offering features such as ARP offload, for which
> firmware crafts its own (QoS)packets without waking up the host.
> Point is that the sequence numbers generated by the firmware are
> not in sync with the host mac80211 layer and can cause packets
> such as firmware ARP reponses to be dropped by the AP (too old SN).
> 
> To fix this we need to let the firmware manages the sequence
> numbers by its own (except for QoS null frames). There is a SN
> counter for each QoS queue and one global/baseline counter for
> Non-QoS.
> 
> Fixes: 84aff52e4f57 ("wcn36xx: Use sequence number allocated by mac80211")
> Signed-off-by: Loic Poulain <loic.poulain at linaro.org>
> ---
>   drivers/net/wireless/ath/wcn36xx/txrx.c | 9 +++++++--
>   1 file changed, 7 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/net/wireless/ath/wcn36xx/txrx.c b/drivers/net/wireless/ath/wcn36xx/txrx.c
> index 81db90f..75951cc 100644
> --- a/drivers/net/wireless/ath/wcn36xx/txrx.c
> +++ b/drivers/net/wireless/ath/wcn36xx/txrx.c
> @@ -427,8 +427,6 @@ static void wcn36xx_set_tx_pdu(struct wcn36xx_tx_bd *bd,
>   		bd->pdu.mpdu_header_off;
>   	bd->pdu.mpdu_len = len;
>   	bd->pdu.tid = tid;
> -	/* Use seq number generated by mac80211 */
> -	bd->pdu.bd_ssn = WCN36XX_TXBD_SSN_FILL_HOST;
>   }
>   
>   static inline struct wcn36xx_vif *get_vif_by_addr(struct wcn36xx *wcn,
> @@ -525,6 +523,9 @@ static void wcn36xx_set_tx_data(struct wcn36xx_tx_bd *bd,
>   		tid = ieee80211_get_tid(hdr);
>   		/* TID->QID is one-to-one mapping */
>   		bd->queue_id = tid;
> +		bd->pdu.bd_ssn = WCN36XX_TXBD_SSN_FILL_DPU_QOS;
> +	} else {
> +		bd->pdu.bd_ssn = WCN36XX_TXBD_SSN_FILL_DPU_NON_QOS;
>   	}
>   
>   	if (info->flags & IEEE80211_TX_INTFL_DONT_ENCRYPT ||
> @@ -536,6 +537,8 @@ static void wcn36xx_set_tx_data(struct wcn36xx_tx_bd *bd,
>   		/* Don't use a regular queue for null packet (no ampdu) */
>   		bd->queue_id = WCN36XX_TX_U_WQ_ID;
>   		bd->bd_rate = WCN36XX_BD_RATE_CTRL;
> +		if (ieee80211_is_qos_nullfunc(hdr->frame_control))
> +			bd->pdu.bd_ssn = WCN36XX_TXBD_SSN_FILL_HOST;
>   	}
>   
>   	if (bcast) {
> @@ -595,6 +598,8 @@ static void wcn36xx_set_tx_mgmt(struct wcn36xx_tx_bd *bd,
>   		bd->queue_id = WCN36XX_TX_U_WQ_ID;
>   	*vif_priv = __vif_priv;
>   
> +	bd->pdu.bd_ssn = WCN36XX_TXBD_SSN_FILL_DPU_NON_QOS;
> +
>   	wcn36xx_set_tx_pdu(bd,
>   			   ieee80211_is_data_qos(hdr->frame_control) ?
>   			   sizeof(struct ieee80211_qos_hdr) :
> 

Tested-by: Bryan O'Donoghue <bryan.odonoghue at linaro.org>



More information about the wcn36xx mailing list