From 20985867e3b2c672ae9bdaaa74a604be3e6c0eb0 Mon Sep 17 00:00:00 2001 From: Jinwei Chen Date: Fri, 30 Oct 2020 01:47:01 -0700 Subject: [PATCH] qcacld-3.0: Bypass FISA if reo_destination_indication mismatch For wow or active offload mode, FW will re-inject some RX frames to REO with reo_destination_indication 1 (REO2SW1) to REO entrance ring, but the original reo_destination_indication in RX buffer pkt_tlv is 6 (REO2FW) or other flow steering value (>=16), then REO2SW ring mismatch will happen that break FISA function in host. Bypass FISA if reo_destination_indication mismatch between REO ring descriptor and pkt TLVS. Change-Id: I8736b8a96513c2e49fe41fb460f81cb0ef01ed01 CRs-Fixed: 2807461 --- core/dp/txrx3.0/dp_fisa_rx.c | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/core/dp/txrx3.0/dp_fisa_rx.c b/core/dp/txrx3.0/dp_fisa_rx.c index 677edf407532..889cfe135fa6 100644 --- a/core/dp/txrx3.0/dp_fisa_rx.c +++ b/core/dp/txrx3.0/dp_fisa_rx.c @@ -920,18 +920,15 @@ dp_rx_get_fisa_flow(struct dp_rx_fst *fisa_hdl, struct dp_vdev *vdev, return sw_ft_entry; rx_tlv_hdr = qdf_nbuf_data(nbuf); - /* - * Get reo_destination_indication from RX_PKT_TLV-->msdu_end, - * if reo_destination_indication == 6, it means this frame is - * reinjected by FW offload module, these frames should not go to FISA - * since REO2SW1 will be selected by FW offload module. If same flow - * frames hash select other REO2SW rings, same flow UDP frames will go - * to different REO2SW ring. - */ hal_rx_msdu_get_reo_destination_indication(hal_soc_hdl, rx_tlv_hdr, &reo_destination_indication); - - if (qdf_unlikely(reo_destination_indication == REO_DESTINATION_FW)) + /* + * Compare reo_destination_indication between reo ring descriptor + * and rx_pkt_tlvs, if they are different, then likely these kind + * of frames re-injected by FW or touched by other module already, + * skip FISA to avoid REO2SW ring mismatch issue for same flow. + */ + if (reo_destination_indication != qdf_nbuf_get_rx_reo_dest_ind(nbuf)) return sw_ft_entry; hal_rx_msdu_get_flow_params(hal_soc_hdl, rx_tlv_hdr, &flow_invalid,