diff --git a/dp/wifi3.0/dp_internal.h b/dp/wifi3.0/dp_internal.h index 9df9d5bb7b2c..28e89b078416 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 89138173246c..b94801e1dd9f 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 87846322e4e7..d8f595ce5dc2 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 63d0875b9518..8648d410874f 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 4e2484514e9c..a75f6ade0e2a 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)