From 5616aa6f414da30f351fa726bb5e606b2dce944b Mon Sep 17 00:00:00 2001 From: Mohit Khanna Date: Tue, 6 Apr 2021 03:13:34 -0700 Subject: [PATCH] qcacmn: Set LRO hash keys based on PDEV flag Currently dp_lro_hash_setup is being done in dp_vdev_attach_wifi3 when pdev->vdev_count==1. However, this counter is not getting decremented and may overflow on repeated VDEV attach/detach calls. This may result in LRO keys being programmed again. Use a PDEV flag to determine whether to configure LRO or not. Fix pdev->vdev_count by decrementing it during VDEV detach. Change-Id: I03cba0d95c30831fbe8047828f7bb2cf4a869213 CRs-Fixed: 2906871 --- dp/wifi3.0/dp_main.c | 11 ++++++++--- dp/wifi3.0/dp_types.h | 3 +++ 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/dp/wifi3.0/dp_main.c b/dp/wifi3.0/dp_main.c index c2267781e8de..17a3d7f6ab2d 100644 --- a/dp/wifi3.0/dp_main.c +++ b/dp/wifi3.0/dp_main.c @@ -5537,7 +5537,6 @@ static QDF_STATUS dp_vdev_attach_wifi3(struct cdp_soc_t *cdp_soc, qdf_spinlock_create(&vdev->peer_list_lock); TAILQ_INIT(&vdev->peer_list); dp_peer_multipass_list_init(vdev); - if ((soc->intr_mode == DP_INTR_POLL) && wlan_cfg_get_num_contexts(soc->wlan_cfg_ctx) != 0) { if ((pdev->vdev_count == 0) || @@ -5574,14 +5573,19 @@ static QDF_STATUS dp_vdev_attach_wifi3(struct cdp_soc_t *cdp_soc, vdev->ap_bridge_enabled = true; else vdev->ap_bridge_enabled = false; + QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_INFO, "%s: wlan_cfg_ap_bridge_enabled %d", __func__, vdev->ap_bridge_enabled); dp_tx_vdev_attach(vdev); - if (pdev->vdev_count == 1) - dp_lro_hash_setup(soc, pdev); + if (!pdev->is_lro_hash_configured) { + if (QDF_IS_STATUS_SUCCESS(dp_lro_hash_setup(soc, pdev))) + pdev->is_lro_hash_configured = true; + else + dp_err("LRO hash setup failure!"); + } dp_info("Created vdev %pK ("QDF_MAC_ADDR_FMT")", vdev, QDF_MAC_ADDR_REF(vdev->mac_addr.raw)); @@ -5836,6 +5840,7 @@ static QDF_STATUS dp_vdev_detach_wifi3(struct cdp_soc_t *cdp_soc, if (vdev->opmode != wlan_op_mode_monitor) dp_vdev_pdev_list_remove(soc, pdev, vdev); + pdev->vdev_count--; /* release reference taken above for find */ dp_vdev_unref_delete(soc, vdev, DP_MOD_ID_CDP); diff --git a/dp/wifi3.0/dp_types.h b/dp/wifi3.0/dp_types.h index 7e7fafd8ae3f..cc6fd1aa49e5 100644 --- a/dp/wifi3.0/dp_types.h +++ b/dp/wifi3.0/dp_types.h @@ -2323,6 +2323,9 @@ struct dp_pdev { #endif qdf_nbuf_t mcopy_status_nbuf; + /* flag to indicate whether LRO hash command has been sent to FW */ + uint8_t is_lro_hash_configured; + /* Flag to hold on to monitor destination ring */ bool hold_mon_dest_ring;