Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d9211362 authored by Sai Pavan Akhil Remella's avatar Sai Pavan Akhil Remella Committed by Madan Koyyalamudi
Browse files

qcacld-3.0: Fix invalid tx power in iw dev

Host driver rate limits successive get_txpower
calls within 3 seconds, and sends cached stats
from the hdd_stats. However, max_tx_power is
not updated in the hdd_stats. Therefore,
the cached tx power is always 0 dBm.

Also, the hdd_stats would be only updated when
CP stats are received from the firmware for
get_station/dump_station calls. get_station is not
periodically queried for SAP interface from the
framework. Therefore, tx power for SAP interface will
always be 0 even if hdd_stats gets updated.

To fix this, instead of hdd_stats, return the
max tx power from the pdev stats cached on the pdev.

Change-Id: I0c8d8baab790c7344bd8913158f8eda63736474e
CRs-Fixed: 3230649
parent 3c11d374
Loading
Loading
Loading
Loading
+7 −0
Original line number Diff line number Diff line
/*
 * Copyright (c) 2018-2021 The Linux Foundation. All rights reserved.
 * Copyright (c) 2021-2022 Qualcomm Innovation Center, Inc. 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
@@ -385,6 +386,12 @@ QDF_STATUS ucfg_send_big_data_stats_request(struct wlan_objmgr_vdev *vdev,
{
	return QDF_STATUS_SUCCESS;
}

static inline void
ucfg_mc_cp_stats_get_tx_power(struct wlan_objmgr_vdev *vdev,
			      int *dbm)
{}

#endif /* QCA_SUPPORT_CP_STATS */

#endif /* __WLAN_CP_STATS_MC_UCFG_API_H__ */
+9 −1
Original line number Diff line number Diff line
@@ -88,6 +88,7 @@
#include "wlan_hdd_object_manager.h"
#include <linux/igmp.h>
#include "qdf_types.h"
#include <wlan_cp_stats_mc_ucfg_api.h>
/* Preprocessor definitions and constants */
#ifdef QCA_WIFI_NAPIER_EMULATION
#define HDD_SSR_BRING_UP_TIME 3000000
@@ -2916,6 +2917,7 @@ static int __wlan_hdd_cfg80211_get_txpower(struct wiphy *wiphy,
	int status;
	struct hdd_station_ctx *sta_ctx;
	static bool is_rate_limited;
	struct wlan_objmgr_vdev *vdev;

	hdd_enter_dev(ndev);

@@ -2967,7 +2969,13 @@ static int __wlan_hdd_cfg80211_get_txpower(struct wiphy *wiphy,
	    is_rate_limited) {
		hdd_debug("Modules not enabled/rate limited, use cached stats");
		/* Send cached data to upperlayer*/
		*dbm = adapter->hdd_stats.class_a_stat.max_pwr;
		vdev = hdd_objmgr_get_vdev(adapter);
		if (!vdev) {
			hdd_err("vdev is NULL");
			return -EINVAL;
		}
		ucfg_mc_cp_stats_get_tx_power(vdev, dbm);
		hdd_objmgr_put_vdev(vdev);
		return 0;
	}