From c4667b8b121803db52e490e89192e07ccffe5420 Mon Sep 17 00:00:00 2001 From: Manjunathappa Prakash Date: Mon, 10 Feb 2020 19:35:18 -0800 Subject: [PATCH] qcacmn: Save Rx TLV offset info so as to recover in FISA Packets delivered to FISA via exception err path doesnot have TLVs. FISA handling requires additional TLVs. dp rx core handling skips TLVs, save TLV length info in nbuf->cb so that TLVs are recovered back in FISA. Change-Id: I53fab2e19abcbf82697ea6f53a4ddf3ea0dd0699 CRs-Fixed: 2620844 --- dp/wifi3.0/dp_internal.h | 8 ++++++++ dp/wifi3.0/dp_rx.c | 27 +++++++++------------------ dp/wifi3.0/dp_rx_err.c | 2 +- qdf/linux/src/i_qdf_nbuf.h | 4 +++- qdf/linux/src/i_qdf_nbuf_m.h | 6 +++++- 5 files changed, 26 insertions(+), 21 deletions(-) diff --git a/dp/wifi3.0/dp_internal.h b/dp/wifi3.0/dp_internal.h index 9df9d5bb7b..28e89b0784 100644 --- a/dp/wifi3.0/dp_internal.h +++ b/dp/wifi3.0/dp_internal.h @@ -2084,4 +2084,12 @@ void dp_set_max_page_size(struct qdf_mem_multi_page_t *pages, } #endif /* MAX_ALLOC_PAGE_SIZE */ +/** + * dp_rx_skip_tlvs() - Skip TLVs len + L2 hdr_offset, save in nbuf->cb + * @nbuf: nbuf cb to be updated + * @l2_hdr_offset: l2_hdr_offset + * + * Return: None + */ +void dp_rx_skip_tlvs(qdf_nbuf_t nbuf, uint32_t l3_padding); #endif /* #ifndef _DP_INTERNAL_H_ */ diff --git a/dp/wifi3.0/dp_rx.c b/dp/wifi3.0/dp_rx.c index 8913817324..b94801e1dd 100644 --- a/dp/wifi3.0/dp_rx.c +++ b/dp/wifi3.0/dp_rx.c @@ -1746,26 +1746,18 @@ uint32_t dp_rx_srng_get_num_pending(hal_soc_handle_t hal_soc, } #ifdef WLAN_SUPPORT_RX_FISA -/* - * dp_rx_skip_tlvs() - Skip TLVs only if FISA is not enabled - * @vdev: DP vdev context - * @nbuf: nbuf whose data pointer is adjusted - * @size: size to be adjusted - * - * Return: None - */ -static void dp_rx_skip_tlvs(struct dp_vdev *vdev, qdf_nbuf_t nbuf, int size) +void dp_rx_skip_tlvs(qdf_nbuf_t nbuf, uint32_t l3_padding) { - /* TLVs include FISA info do not skip them yet */ - if (!vdev->osif_fisa_rx) - qdf_nbuf_pull_head(nbuf, size); + QDF_NBUF_CB_RX_PACKET_L3_HDR_PAD(nbuf) = l3_padding; + qdf_nbuf_pull_head(nbuf, l3_padding + RX_PKT_TLVS_LEN); } -#else /* !WLAN_SUPPORT_RX_FISA */ -static void dp_rx_skip_tlvs(struct dp_vdev *vdev, qdf_nbuf_t nbuf, int size) +#else +void dp_rx_skip_tlvs(qdf_nbuf_t nbuf, uint32_t l3_padding) { - qdf_nbuf_pull_head(nbuf, size); + qdf_nbuf_pull_head(nbuf, l3_padding + RX_PKT_TLVS_LEN); } -#endif /* !WLAN_SUPPORT_RX_FISA */ +#endif + /** * dp_rx_process() - Brain of the Rx processing functionality @@ -2213,8 +2205,7 @@ done: RX_PKT_TLVS_LEN; qdf_nbuf_set_pktlen(nbuf, pkt_len); - dp_rx_skip_tlvs(vdev, nbuf, RX_PKT_TLVS_LEN + - msdu_metadata.l3_hdr_pad); + dp_rx_skip_tlvs(nbuf, msdu_metadata.l3_hdr_pad); } /* diff --git a/dp/wifi3.0/dp_rx_err.c b/dp/wifi3.0/dp_rx_err.c index 87846322e4..d8f595ce5d 100644 --- a/dp/wifi3.0/dp_rx_err.c +++ b/dp/wifi3.0/dp_rx_err.c @@ -995,7 +995,7 @@ dp_rx_process_rxdma_err(struct dp_soc *soc, qdf_nbuf_t nbuf, * Advance the packet start pointer by total size of * pre-header TLV's */ - qdf_nbuf_pull_head(nbuf, l2_hdr_offset + RX_PKT_TLVS_LEN); + dp_rx_skip_tlvs(nbuf, l2_hdr_offset); if (err_code == HAL_RXDMA_ERR_WIFI_PARSE) { uint8_t *pkt_type; diff --git a/qdf/linux/src/i_qdf_nbuf.h b/qdf/linux/src/i_qdf_nbuf.h index 63d0875b95..8648d41087 100644 --- a/qdf/linux/src/i_qdf_nbuf.h +++ b/qdf/linux/src/i_qdf_nbuf.h @@ -107,6 +107,7 @@ typedef union { * @rx.dev.priv_cb_m.peer_cached_buf_frm: peer cached buffer * @rx.dev.priv_cb_m.flush_ind: flush indication * @rx.dev.priv_cb_m.packet_buf_pool: packet buff bool + * @rx.dev.priv_cb_m.l3_hdr_pad: L3 header padding offset * @rx.dev.priv_cb_m.tcp_seq_num: TCP sequence number * @rx.dev.priv_cb_m.tcp_ack_num: TCP ACK number * @rx.dev.priv_cb_m.lro_ctx: LRO context @@ -222,7 +223,8 @@ struct qdf_nbuf_cb { peer_cached_buf_frm:1, flush_ind:1, packet_buf_pool:1, - reserved:12, + l3_hdr_pad:3, + reserved:9, reserved1:16; uint32_t tcp_seq_num; uint32_t tcp_ack_num; diff --git a/qdf/linux/src/i_qdf_nbuf_m.h b/qdf/linux/src/i_qdf_nbuf_m.h index 4e2484514e..a75f6ade0e 100644 --- a/qdf/linux/src/i_qdf_nbuf_m.h +++ b/qdf/linux/src/i_qdf_nbuf_m.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014-2019 The Linux Foundation. All rights reserved. + * Copyright (c) 2014-2020 The Linux Foundation. All rights reserved. * * Permission to use, copy, modify, and/or distribute this software for * any purpose with or without fee is hereby granted, provided that the @@ -69,6 +69,10 @@ (((struct qdf_nbuf_cb *)((skb)->cb))->u.rx.dev.priv_cb_m. \ packet_buf_pool) +#define QDF_NBUF_CB_RX_PACKET_L3_HDR_PAD(skb) \ + (((struct qdf_nbuf_cb *)((skb)->cb))->u.rx.dev.priv_cb_m. \ + l3_hdr_pad) + #define __qdf_nbuf_ipa_owned_get(skb) \ QDF_NBUF_CB_TX_IPA_OWNED(skb)