Jelajahi Sumber

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
Jingxiang Ge 2 tahun lalu
induk
melakukan
fa2c01c5c4

+ 3 - 1
components/cp_stats/dispatcher/src/wlan_cp_stats_mc_tgt_api.c

@@ -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);
 

+ 5 - 1
core/hdd/src/wlan_hdd_stats.c

@@ -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;
 	}

+ 14 - 1
os_if/cp_stats/src/wlan_cfg80211_mc_cp_stats.c

@@ -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);