From a2f5ca7c047ad249b44e2a2e03394d15807e432d Mon Sep 17 00:00:00 2001 From: Nisha Menon Date: Mon, 27 Apr 2020 18:52:06 -0700 Subject: [PATCH] qcacmn: Check return status of deliver to stack function Check the return status of the osif->rx function and in case of failure drop the skb. This is needed when OOR error frame is received and if the frame was not delivered to stack it needs to be dropped. Add error counter to periodic stats to determine how many Rx packets were rejected or were dropped since deliver to stack failed. Add the new status check for delivering rx frames to stack under MCC specific flag - DELIVERY_TO_STACK_STATUS_CHECK. Change-Id: I9b1c795f168774669783cc601e68003a7747a279 CRs-Fixed: 2672498 --- dp/wifi3.0/dp_rx.c | 71 +++++++++++++++++++++++++++++++++++++++---- dp/wifi3.0/dp_stats.c | 5 +++ dp/wifi3.0/dp_types.h | 2 ++ 3 files changed, 72 insertions(+), 6 deletions(-) diff --git a/dp/wifi3.0/dp_rx.c b/dp/wifi3.0/dp_rx.c index 29e0a5bec4..dc98373a23 100644 --- a/dp/wifi3.0/dp_rx.c +++ b/dp/wifi3.0/dp_rx.c @@ -1369,6 +1369,70 @@ dp_rx_enqueue_rx(struct dp_peer *peer, qdf_nbuf_t rx_buf_list) } #endif +#ifndef DELIVERY_TO_STACK_STATUS_CHECK +/** + * dp_rx_check_delivery_to_stack() - Deliver pkts to network + * using the appropriate call back functions. + * @soc: soc + * @vdev: vdev + * @peer: peer + * @nbuf_head: skb list head + * @nbuf_tail: skb list tail + * + * Return: None + */ +static void dp_rx_check_delivery_to_stack(struct dp_soc *soc, + struct dp_vdev *vdev, + struct dp_peer *peer, + qdf_nbuf_t nbuf_head) +{ + /* Function pointer initialized only when FISA is enabled */ + if (vdev->osif_fisa_rx) + /* on failure send it via regular path */ + vdev->osif_fisa_rx(soc, vdev, nbuf_head); + else + vdev->osif_rx(vdev->osif_vdev, nbuf_head); +} + +#else +/** + * dp_rx_check_delivery_to_stack() - Deliver pkts to network + * using the appropriate call back functions. + * @soc: soc + * @vdev: vdev + * @peer: peer + * @nbuf_head: skb list head + * @nbuf_tail: skb list tail + * + * Check the return status of the call back function and drop + * the packets if the return status indicates a failure. + * + * Return: None + */ +static void dp_rx_check_delivery_to_stack(struct dp_soc *soc, + struct dp_vdev *vdev, + struct dp_peer *peer, + qdf_nbuf_t nbuf_head) +{ + int num_nbuf = 0; + QDF_STATUS ret_val = QDF_STATUS_E_FAILURE; + + /* Function pointer initialized only when FISA is enabled */ + if (vdev->osif_fisa_rx) + /* on failure send it via regular path */ + ret_val = vdev->osif_fisa_rx(soc, vdev, nbuf_head); + else if (vdev->osif_rx) + ret_val = vdev->osif_rx(vdev->osif_vdev, nbuf_head); + + if (!QDF_IS_STATUS_SUCCESS(ret_val)) { + num_nbuf = dp_rx_drop_nbuf_list(vdev->pdev, nbuf_head); + DP_STATS_INC(soc, rx.err.rejected, num_nbuf); + if (peer) + DP_STATS_DEC(peer, rx.to_stack.num, num_nbuf); + } +} +#endif /* ifdef DELIVERY_TO_STACK_STATUS_CHECK */ + void dp_rx_deliver_to_stack(struct dp_soc *soc, struct dp_vdev *vdev, struct dp_peer *peer, @@ -1409,12 +1473,7 @@ void dp_rx_deliver_to_stack(struct dp_soc *soc, &nbuf_tail, peer->mac_addr.raw); } - /* Function pointer initialized only when FISA is enabled */ - if (vdev->osif_fisa_rx) - /* on failure send it via regular path */ - vdev->osif_fisa_rx(soc, vdev, nbuf_head); - else - vdev->osif_rx(vdev->osif_vdev, nbuf_head); + dp_rx_check_delivery_to_stack(soc, vdev, peer, nbuf_head); } /** diff --git a/dp/wifi3.0/dp_stats.c b/dp/wifi3.0/dp_stats.c index b60be9ea22..215f3e3763 100644 --- a/dp/wifi3.0/dp_stats.c +++ b/dp/wifi3.0/dp_stats.c @@ -5851,6 +5851,8 @@ void dp_txrx_path_stats(struct dp_soc *soc) pdev->soc->stats.rx.err.reo_err_oor_to_stack); DP_PRINT_STATS("REO err oor msdu drop: %u", pdev->soc->stats.rx.err.reo_err_oor_drop); + DP_PRINT_STATS("Rx err msdu rejected: %d", + soc->stats.rx.err.rejected); DP_PRINT_STATS("Reo Statistics"); DP_PRINT_STATS("near_full: %u ", soc->stats.rx.near_full); @@ -6391,6 +6393,9 @@ dp_print_soc_rx_stats(struct dp_soc *soc) DP_PRINT_STATS("REO err oor msdu drop: %d", soc->stats.rx.err.reo_err_oor_drop); + DP_PRINT_STATS("Rx err msdu rejected: %d", + soc->stats.rx.err.rejected); + for (i = 0; i < HAL_RXDMA_ERR_MAX; i++) { index += qdf_snprint(&rxdma_error[index], DP_RXDMA_ERR_LENGTH - index, diff --git a/dp/wifi3.0/dp_types.h b/dp/wifi3.0/dp_types.h index acd9dfb8b9..5135c96b9a 100644 --- a/dp/wifi3.0/dp_types.h +++ b/dp/wifi3.0/dp_types.h @@ -847,6 +847,8 @@ struct dp_soc_stats { uint32_t reo_err_oor_to_stack; /* REO OOR scattered msdu count */ uint32_t reo_err_oor_sg_count; + /* RX msdu rejected count on delivery to vdev stack_fn*/ + uint32_t rejected; } err; /* packet count per core - per ring */