diff --git a/dp/inc/cdp_txrx_stats_struct.h b/dp/inc/cdp_txrx_stats_struct.h index 43f0cef748..eaa1c83310 100644 --- a/dp/inc/cdp_txrx_stats_struct.h +++ b/dp/inc/cdp_txrx_stats_struct.h @@ -770,6 +770,10 @@ struct cdp_pdev_stats { struct { /* desc alloc failed errors */ uint32_t desc_alloc_fail; + /* ip csum errors */ + uint32_t ip_csum_err; + /* tcp/udp csum errors */ + uint32_t tcp_udp_csum_err; } err; /* buffers added back in freelist */ diff --git a/dp/wifi3.0/dp_main.c b/dp/wifi3.0/dp_main.c index cffbc23d20..3ba97fcf94 100644 --- a/dp/wifi3.0/dp_main.c +++ b/dp/wifi3.0/dp_main.c @@ -5190,6 +5190,10 @@ dp_print_pdev_rx_stats(struct dp_pdev *pdev) pdev->stats.replenish.rxdma_err); DP_PRINT_STATS(" Desc Alloc Failed: = %d", pdev->stats.err.desc_alloc_fail); + DP_PRINT_STATS("IP checksum error = %d", + pdev->stats.err.ip_csum_err); + DP_PRINT_STATS("TCP/UDP checksum error = %d", + pdev->stats.err.tcp_udp_csum_err); /* Get bar_recv_cnt */ dp_aggregate_pdev_ctrl_frames_stats(pdev); diff --git a/dp/wifi3.0/dp_rx.c b/dp/wifi3.0/dp_rx.c index 579164f146..1e17c456e4 100644 --- a/dp/wifi3.0/dp_rx.c +++ b/dp/wifi3.0/dp_rx.c @@ -1061,15 +1061,20 @@ static inline void dp_rx_deliver_to_stack(struct dp_vdev *vdev, * * Return: void */ -static inline void dp_rx_cksum_offload(qdf_nbuf_t nbuf, uint8_t *rx_tlv_hdr) +static inline void dp_rx_cksum_offload(struct dp_pdev *pdev, + qdf_nbuf_t nbuf, + uint8_t *rx_tlv_hdr) { qdf_nbuf_rx_cksum_t cksum = {0}; + bool ip_csum_err = hal_rx_attn_ip_cksum_fail_get(rx_tlv_hdr); + bool tcp_udp_csum_er = hal_rx_attn_tcp_udp_cksum_fail_get(rx_tlv_hdr); - if (qdf_likely(!hal_rx_attn_tcp_udp_cksum_fail_get(rx_tlv_hdr) && - !hal_rx_attn_ip_cksum_fail_get(rx_tlv_hdr))) { + if (qdf_likely(!ip_csum_err && !tcp_udp_csum_er)) { cksum.l4_result = QDF_NBUF_RX_CKSUM_TCP_UDP_UNNECESSARY; - qdf_nbuf_set_rx_cksum(nbuf, &cksum); + } else { + DP_STATS_INCC(pdev, err.ip_csum_err, 1, ip_csum_err); + DP_STATS_INCC(pdev, err.tcp_udp_csum_err, 1, tcp_udp_csum_er); } } @@ -1561,7 +1566,7 @@ done: continue; } - dp_rx_cksum_offload(nbuf, rx_tlv_hdr); + dp_rx_cksum_offload(vdev->pdev, nbuf, rx_tlv_hdr); dp_set_rx_queue(nbuf, ring_id);