qcacmn: Add support for DP RX checksum offload
add support for TCP, UDP and IP checksum offload in RX path
Change-Id: Id148523419cc48d094e100f51d39e6f95b21928f
diff --git a/dp/wifi3.0/dp_rx.c b/dp/wifi3.0/dp_rx.c
index a219791..abb6577 100644
--- a/dp/wifi3.0/dp_rx.c
+++ b/dp/wifi3.0/dp_rx.c
@@ -1131,6 +1131,17 @@
}
pdev = vdev->pdev;
+ if (qdf_likely(
+ !hal_rx_attn_tcp_udp_cksum_fail_get(rx_tlv_hdr)
+ &&
+ !hal_rx_attn_ip_cksum_fail_get(rx_tlv_hdr))) {
+ qdf_nbuf_rx_cksum_t cksum = {0};
+
+ cksum.l4_result =
+ QDF_NBUF_RX_CKSUM_TCP_UDP_UNNECESSARY;
+
+ qdf_nbuf_set_rx_cksum(nbuf, &cksum);
+ }
sgi = hal_rx_msdu_start_sgi_get(rx_tlv_hdr);
mcs = hal_rx_msdu_start_rate_mcs_get(rx_tlv_hdr);
diff --git a/dp/wifi3.0/hal_rx.h b/dp/wifi3.0/hal_rx.h
index 66adf4f..a5f4437 100644
--- a/dp/wifi3.0/hal_rx.h
+++ b/dp/wifi3.0/hal_rx.h
@@ -683,6 +683,56 @@
return first_mpdu;
}
+#define HAL_RX_ATTN_TCP_UDP_CKSUM_FAIL_GET(_rx_attn) \
+ (_HAL_MS((*_OFFSET_TO_WORD_PTR(_rx_attn, \
+ RX_ATTENTION_1_TCP_UDP_CHKSUM_FAIL_OFFSET)), \
+ RX_ATTENTION_1_TCP_UDP_CHKSUM_FAIL_MASK, \
+ RX_ATTENTION_1_TCP_UDP_CHKSUM_FAIL_LSB))
+
+/*
+ * hal_rx_attn_tcp_udp_cksum_fail_get(): get tcp_udp cksum fail bit
+ * from rx attention
+ * @buf: pointer to rx_pkt_tlvs
+ *
+ * Return: tcp_udp_cksum_fail
+ */
+static inline bool
+hal_rx_attn_tcp_udp_cksum_fail_get(uint8_t *buf)
+{
+ struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
+ struct rx_attention *rx_attn = &pkt_tlvs->attn_tlv.rx_attn;
+ bool tcp_udp_cksum_fail;
+
+ tcp_udp_cksum_fail = HAL_RX_ATTN_TCP_UDP_CKSUM_FAIL_GET(rx_attn);
+
+ return tcp_udp_cksum_fail;
+}
+
+#define HAL_RX_ATTN_IP_CKSUM_FAIL_GET(_rx_attn) \
+ (_HAL_MS((*_OFFSET_TO_WORD_PTR(_rx_attn, \
+ RX_ATTENTION_1_IP_CHKSUM_FAIL_OFFSET)), \
+ RX_ATTENTION_1_IP_CHKSUM_FAIL_MASK, \
+ RX_ATTENTION_1_IP_CHKSUM_FAIL_LSB))
+
+/*
+ * hal_rx_attn_ip_cksum_fail_get(): get ip cksum fail bit
+ * from rx attention
+ * @buf: pointer to rx_pkt_tlvs
+ *
+ * Return: ip_cksum_fail
+ */
+static inline bool
+hal_rx_attn_ip_cksum_fail_get(uint8_t *buf)
+{
+ struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
+ struct rx_attention *rx_attn = &pkt_tlvs->attn_tlv.rx_attn;
+ bool ip_cksum_fail;
+
+ ip_cksum_fail = HAL_RX_ATTN_IP_CKSUM_FAIL_GET(rx_attn);
+
+ return ip_cksum_fail;
+}
+
/*
* Get peer_meta_data from RX_MPDU_INFO within RX_MPDU_START
*/