qcacld-3.0: Fix link tx bitrate unknown issue on p2p0

In wlan_hdd_get_station_stats, NULL checking for
pdev_stats fails as it doesn't pass pdev stats info
to hdd layer. stats will not pass to userspace, it will
display tx bitrate unknown in command "iw p2p0 link" or
"iw p2p0 station dump".

issue only happen on p2p0 and not on wlan0. as wlan0 can
use cached stats in __wlan_hdd_cfg80211_ll_stats_get.

Fix is pass pdev stats info to hdd layer in
get_station_stats_cb.

regression cause is:
Iaefc5629872431cbc6c24090b1edb6cebdad995a

Change-Id: I33b608988aa288e0f8139524de5e20fcbba4f2be
CRs-Fixed: 3457955
This commit is contained in:
Jingxiang Ge 2023-04-06 17:53:03 +08:00 committed by Madan Koyyalamudi
parent 3900e1eb53
commit fa2c01c5c4
3 changed files with 22 additions and 3 deletions

View File

@ -1141,7 +1141,9 @@ tgt_send_pdev_mc_cp_stats(struct wlan_objmgr_psoc *psoc,
wlan_cp_stats_pdev_obj_lock(pdev_cp_stats_priv);
pdev_mc_stats = pdev_cp_stats_priv->pdev_stats;
ev->pdev_stats->max_pwr = pdev_mc_stats->max_pwr;
qdf_mem_copy(ev->pdev_stats,
pdev_mc_stats,
sizeof(*pdev_mc_stats));
wlan_cp_stats_pdev_obj_unlock(pdev_cp_stats_priv);
wlan_objmgr_vdev_release_ref(vdev, WLAN_CP_STATS_ID);

View File

@ -7642,7 +7642,11 @@ int wlan_hdd_get_station_stats(struct hdd_adapter *adapter)
if (!stats->vdev_summary_stats || !stats->vdev_chain_rssi ||
!stats->peer_adv_stats || !stats->pdev_stats) {
hdd_err("Invalid stats");
hdd_err("Invalid: %s%s%s%s",
stats->vdev_summary_stats ? "" : "vdev_summary_stats",
stats->vdev_chain_rssi ? "" : "vdev_chain_rssi",
stats->peer_adv_stats ? "" : "peer_adv_stats",
stats->pdev_stats ? "" : "pdev_stats");
ret = -EINVAL;
goto out;
}

View File

@ -585,7 +585,7 @@ static void get_station_stats_cb(struct stats_event *ev, void *cookie)
{
struct stats_event *priv;
struct osif_request *request;
uint32_t summary_size, rssi_size, peer_adv_size = 0;
uint32_t summary_size, rssi_size, peer_adv_size = 0, pdev_size;
request = osif_request_get(cookie);
if (!request) {
@ -635,6 +635,15 @@ static void get_station_stats_cb(struct stats_event *ev, void *cookie)
peer_adv_size);
}
if (ev->num_pdev_stats && ev->pdev_stats) {
pdev_size = sizeof(*ev->pdev_stats) * ev->num_pdev_stats;
priv->pdev_stats = qdf_mem_malloc(pdev_size);
if (!priv->pdev_stats)
goto station_stats_cb_fail;
qdf_mem_copy(priv->pdev_stats, ev->pdev_stats, pdev_size);
}
priv->num_summary_stats = ev->num_summary_stats;
priv->num_chain_rssi_stats = ev->num_chain_rssi_stats;
priv->tx_rate = ev->tx_rate;
@ -1105,6 +1114,10 @@ wlan_cfg80211_mc_cp_stats_get_station_stats(struct wlan_objmgr_vdev *vdev,
if (priv->peer_adv_stats)
out->peer_adv_stats = priv->peer_adv_stats;
priv->peer_adv_stats = NULL;
if (priv->pdev_stats)
out->pdev_stats = priv->pdev_stats;
priv->pdev_stats = NULL;
out->bcn_protect_stats = priv->bcn_protect_stats;
osif_request_put(request);