Explorar o código

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
Manjunathappa Prakash %!s(int64=5) %!d(string=hai) anos
pai
achega
c4667b8b12

+ 8 - 0
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_ */

+ 9 - 18
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);
 		}
 
 		/*

+ 1 - 1
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;

+ 3 - 1
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;

+ 5 - 1
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)