|
@@ -185,6 +185,128 @@ static int rssi_mcs_tbl[][14] = {
|
|
|
|
|
|
static bool get_station_fw_request_needed = true;
|
|
|
|
|
|
+/*
|
|
|
+ * copy_station_stats_to_adapter() - Copy station stats to adapter
|
|
|
+ * @adapter: Pointer to the adapter
|
|
|
+ * @stats: Pointer to the station stats event
|
|
|
+ *
|
|
|
+ * Return: 0 if success, non-zero for failure
|
|
|
+ */
|
|
|
+static int copy_station_stats_to_adapter(struct hdd_adapter *adapter,
|
|
|
+ struct stats_event *stats)
|
|
|
+{
|
|
|
+ int ret = 0;
|
|
|
+ struct wlan_mlme_nss_chains *dynamic_cfg;
|
|
|
+ uint32_t tx_nss, rx_nss;
|
|
|
+ struct wlan_objmgr_vdev *vdev;
|
|
|
+ uint16_t he_mcs_12_13_map;
|
|
|
+
|
|
|
+ vdev = hdd_objmgr_get_vdev(adapter);
|
|
|
+ if (!vdev)
|
|
|
+ return -EINVAL;
|
|
|
+
|
|
|
+ /* save summary stats to legacy location */
|
|
|
+ qdf_mem_copy(adapter->hdd_stats.summary_stat.retry_cnt,
|
|
|
+ stats->vdev_summary_stats[0].stats.retry_cnt,
|
|
|
+ sizeof(adapter->hdd_stats.summary_stat.retry_cnt));
|
|
|
+ qdf_mem_copy(
|
|
|
+ adapter->hdd_stats.summary_stat.multiple_retry_cnt,
|
|
|
+ stats->vdev_summary_stats[0].stats.multiple_retry_cnt,
|
|
|
+ sizeof(adapter->hdd_stats.summary_stat.multiple_retry_cnt));
|
|
|
+ qdf_mem_copy(adapter->hdd_stats.summary_stat.tx_frm_cnt,
|
|
|
+ stats->vdev_summary_stats[0].stats.tx_frm_cnt,
|
|
|
+ sizeof(adapter->hdd_stats.summary_stat.tx_frm_cnt));
|
|
|
+ qdf_mem_copy(adapter->hdd_stats.summary_stat.fail_cnt,
|
|
|
+ stats->vdev_summary_stats[0].stats.fail_cnt,
|
|
|
+ sizeof(adapter->hdd_stats.summary_stat.fail_cnt));
|
|
|
+ adapter->hdd_stats.summary_stat.snr =
|
|
|
+ stats->vdev_summary_stats[0].stats.snr;
|
|
|
+ adapter->hdd_stats.summary_stat.rssi =
|
|
|
+ stats->vdev_summary_stats[0].stats.rssi;
|
|
|
+ adapter->hdd_stats.summary_stat.rx_frm_cnt =
|
|
|
+ stats->vdev_summary_stats[0].stats.rx_frm_cnt;
|
|
|
+ adapter->hdd_stats.summary_stat.frm_dup_cnt =
|
|
|
+ stats->vdev_summary_stats[0].stats.frm_dup_cnt;
|
|
|
+ adapter->hdd_stats.summary_stat.rts_fail_cnt =
|
|
|
+ stats->vdev_summary_stats[0].stats.rts_fail_cnt;
|
|
|
+ adapter->hdd_stats.summary_stat.ack_fail_cnt =
|
|
|
+ stats->vdev_summary_stats[0].stats.ack_fail_cnt;
|
|
|
+ adapter->hdd_stats.summary_stat.rts_succ_cnt =
|
|
|
+ stats->vdev_summary_stats[0].stats.rts_succ_cnt;
|
|
|
+ adapter->hdd_stats.summary_stat.rx_discard_cnt =
|
|
|
+ stats->vdev_summary_stats[0].stats.rx_discard_cnt;
|
|
|
+ adapter->hdd_stats.summary_stat.rx_error_cnt =
|
|
|
+ stats->vdev_summary_stats[0].stats.rx_error_cnt;
|
|
|
+ adapter->hdd_stats.peer_stats.rx_count =
|
|
|
+ stats->peer_adv_stats->rx_count;
|
|
|
+ adapter->hdd_stats.peer_stats.rx_bytes =
|
|
|
+ stats->peer_adv_stats->rx_bytes;
|
|
|
+ adapter->hdd_stats.peer_stats.fcs_count =
|
|
|
+ stats->peer_adv_stats->fcs_count;
|
|
|
+
|
|
|
+ dynamic_cfg = mlme_get_dynamic_vdev_config(vdev);
|
|
|
+ if (!dynamic_cfg) {
|
|
|
+ hdd_err("nss chain dynamic config NULL");
|
|
|
+ ret = -EINVAL;
|
|
|
+ goto out;
|
|
|
+ }
|
|
|
+
|
|
|
+ switch (hdd_conn_get_connected_band(&adapter->session.station)) {
|
|
|
+ case BAND_2G:
|
|
|
+ tx_nss = dynamic_cfg->tx_nss[NSS_CHAINS_BAND_2GHZ];
|
|
|
+ rx_nss = dynamic_cfg->rx_nss[NSS_CHAINS_BAND_2GHZ];
|
|
|
+ break;
|
|
|
+ case BAND_5G:
|
|
|
+ tx_nss = dynamic_cfg->tx_nss[NSS_CHAINS_BAND_5GHZ];
|
|
|
+ rx_nss = dynamic_cfg->rx_nss[NSS_CHAINS_BAND_5GHZ];
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ tx_nss = wlan_vdev_mlme_get_nss(vdev);
|
|
|
+ rx_nss = wlan_vdev_mlme_get_nss(vdev);
|
|
|
+ }
|
|
|
+
|
|
|
+ /* Intersection of self and AP's NSS capability */
|
|
|
+ if (tx_nss > wlan_vdev_mlme_get_nss(vdev))
|
|
|
+ tx_nss = wlan_vdev_mlme_get_nss(vdev);
|
|
|
+
|
|
|
+ if (rx_nss > wlan_vdev_mlme_get_nss(vdev))
|
|
|
+ rx_nss = wlan_vdev_mlme_get_nss(vdev);
|
|
|
+
|
|
|
+ /* save class a stats to legacy location */
|
|
|
+ adapter->hdd_stats.class_a_stat.tx_nss = tx_nss;
|
|
|
+ adapter->hdd_stats.class_a_stat.rx_nss = rx_nss;
|
|
|
+ adapter->hdd_stats.class_a_stat.tx_rate = stats->tx_rate;
|
|
|
+ adapter->hdd_stats.class_a_stat.rx_rate = stats->rx_rate;
|
|
|
+ adapter->hdd_stats.class_a_stat.tx_rx_rate_flags = stats->tx_rate_flags;
|
|
|
+
|
|
|
+ he_mcs_12_13_map = wlan_vdev_mlme_get_he_mcs_12_13_map(vdev);
|
|
|
+ adapter->hdd_stats.class_a_stat.tx_mcs_index =
|
|
|
+ sme_get_mcs_idx(stats->tx_rate, stats->tx_rate_flags,
|
|
|
+ he_mcs_12_13_map,
|
|
|
+ &adapter->hdd_stats.class_a_stat.tx_nss,
|
|
|
+ &adapter->hdd_stats.class_a_stat.tx_dcm,
|
|
|
+ &adapter->hdd_stats.class_a_stat.tx_gi,
|
|
|
+ &adapter->hdd_stats.class_a_stat.
|
|
|
+ tx_mcs_rate_flags);
|
|
|
+ adapter->hdd_stats.class_a_stat.rx_mcs_index =
|
|
|
+ sme_get_mcs_idx(stats->rx_rate, stats->tx_rate_flags,
|
|
|
+ he_mcs_12_13_map,
|
|
|
+ &adapter->hdd_stats.class_a_stat.rx_nss,
|
|
|
+ &adapter->hdd_stats.class_a_stat.rx_dcm,
|
|
|
+ &adapter->hdd_stats.class_a_stat.rx_gi,
|
|
|
+ &adapter->hdd_stats.class_a_stat.
|
|
|
+ rx_mcs_rate_flags);
|
|
|
+
|
|
|
+ /* save per chain rssi to legacy location */
|
|
|
+ qdf_mem_copy(adapter->hdd_stats.per_chain_rssi_stats.rssi,
|
|
|
+ stats->vdev_chain_rssi[0].chain_rssi,
|
|
|
+ sizeof(stats->vdev_chain_rssi[0].chain_rssi));
|
|
|
+ adapter->hdd_stats.bcn_protect_stats = stats->bcn_protect_stats;
|
|
|
+out:
|
|
|
+ hdd_objmgr_put_vdev(vdev);
|
|
|
+ return ret;
|
|
|
+}
|
|
|
+
|
|
|
#ifdef WLAN_FEATURE_LINK_LAYER_STATS
|
|
|
|
|
|
/**
|
|
@@ -1599,128 +1721,6 @@ hdd_update_station_stats_cached_timestamp(struct hdd_adapter *adapter)
|
|
|
}
|
|
|
#endif /* FEATURE_CLUB_LL_STATS_AND_GET_STATION */
|
|
|
|
|
|
-/*
|
|
|
- * copy_station_stats_to_adapter() - Copy station stats to adapter
|
|
|
- * @adapter: Pointer to the adapter
|
|
|
- * @stats: Pointer to the station stats event
|
|
|
- *
|
|
|
- * Return: 0 if success, non-zero for failure
|
|
|
- */
|
|
|
-static int copy_station_stats_to_adapter(struct hdd_adapter *adapter,
|
|
|
- struct stats_event *stats)
|
|
|
-{
|
|
|
- int ret = 0;
|
|
|
- struct wlan_mlme_nss_chains *dynamic_cfg;
|
|
|
- uint32_t tx_nss, rx_nss;
|
|
|
- struct wlan_objmgr_vdev *vdev;
|
|
|
- uint16_t he_mcs_12_13_map;
|
|
|
-
|
|
|
- vdev = hdd_objmgr_get_vdev(adapter);
|
|
|
- if (!vdev)
|
|
|
- return -EINVAL;
|
|
|
-
|
|
|
- /* save summary stats to legacy location */
|
|
|
- qdf_mem_copy(adapter->hdd_stats.summary_stat.retry_cnt,
|
|
|
- stats->vdev_summary_stats[0].stats.retry_cnt,
|
|
|
- sizeof(adapter->hdd_stats.summary_stat.retry_cnt));
|
|
|
- qdf_mem_copy(
|
|
|
- adapter->hdd_stats.summary_stat.multiple_retry_cnt,
|
|
|
- stats->vdev_summary_stats[0].stats.multiple_retry_cnt,
|
|
|
- sizeof(adapter->hdd_stats.summary_stat.multiple_retry_cnt));
|
|
|
- qdf_mem_copy(adapter->hdd_stats.summary_stat.tx_frm_cnt,
|
|
|
- stats->vdev_summary_stats[0].stats.tx_frm_cnt,
|
|
|
- sizeof(adapter->hdd_stats.summary_stat.tx_frm_cnt));
|
|
|
- qdf_mem_copy(adapter->hdd_stats.summary_stat.fail_cnt,
|
|
|
- stats->vdev_summary_stats[0].stats.fail_cnt,
|
|
|
- sizeof(adapter->hdd_stats.summary_stat.fail_cnt));
|
|
|
- adapter->hdd_stats.summary_stat.snr =
|
|
|
- stats->vdev_summary_stats[0].stats.snr;
|
|
|
- adapter->hdd_stats.summary_stat.rssi =
|
|
|
- stats->vdev_summary_stats[0].stats.rssi;
|
|
|
- adapter->hdd_stats.summary_stat.rx_frm_cnt =
|
|
|
- stats->vdev_summary_stats[0].stats.rx_frm_cnt;
|
|
|
- adapter->hdd_stats.summary_stat.frm_dup_cnt =
|
|
|
- stats->vdev_summary_stats[0].stats.frm_dup_cnt;
|
|
|
- adapter->hdd_stats.summary_stat.rts_fail_cnt =
|
|
|
- stats->vdev_summary_stats[0].stats.rts_fail_cnt;
|
|
|
- adapter->hdd_stats.summary_stat.ack_fail_cnt =
|
|
|
- stats->vdev_summary_stats[0].stats.ack_fail_cnt;
|
|
|
- adapter->hdd_stats.summary_stat.rts_succ_cnt =
|
|
|
- stats->vdev_summary_stats[0].stats.rts_succ_cnt;
|
|
|
- adapter->hdd_stats.summary_stat.rx_discard_cnt =
|
|
|
- stats->vdev_summary_stats[0].stats.rx_discard_cnt;
|
|
|
- adapter->hdd_stats.summary_stat.rx_error_cnt =
|
|
|
- stats->vdev_summary_stats[0].stats.rx_error_cnt;
|
|
|
- adapter->hdd_stats.peer_stats.rx_count =
|
|
|
- stats->peer_adv_stats->rx_count;
|
|
|
- adapter->hdd_stats.peer_stats.rx_bytes =
|
|
|
- stats->peer_adv_stats->rx_bytes;
|
|
|
- adapter->hdd_stats.peer_stats.fcs_count =
|
|
|
- stats->peer_adv_stats->fcs_count;
|
|
|
-
|
|
|
- dynamic_cfg = mlme_get_dynamic_vdev_config(vdev);
|
|
|
- if (!dynamic_cfg) {
|
|
|
- hdd_err("nss chain dynamic config NULL");
|
|
|
- ret = -EINVAL;
|
|
|
- goto out;
|
|
|
- }
|
|
|
-
|
|
|
- switch (hdd_conn_get_connected_band(&adapter->session.station)) {
|
|
|
- case BAND_2G:
|
|
|
- tx_nss = dynamic_cfg->tx_nss[NSS_CHAINS_BAND_2GHZ];
|
|
|
- rx_nss = dynamic_cfg->rx_nss[NSS_CHAINS_BAND_2GHZ];
|
|
|
- break;
|
|
|
- case BAND_5G:
|
|
|
- tx_nss = dynamic_cfg->tx_nss[NSS_CHAINS_BAND_5GHZ];
|
|
|
- rx_nss = dynamic_cfg->rx_nss[NSS_CHAINS_BAND_5GHZ];
|
|
|
- break;
|
|
|
- default:
|
|
|
- tx_nss = wlan_vdev_mlme_get_nss(vdev);
|
|
|
- rx_nss = wlan_vdev_mlme_get_nss(vdev);
|
|
|
- }
|
|
|
-
|
|
|
- /* Intersection of self and AP's NSS capability */
|
|
|
- if (tx_nss > wlan_vdev_mlme_get_nss(vdev))
|
|
|
- tx_nss = wlan_vdev_mlme_get_nss(vdev);
|
|
|
-
|
|
|
- if (rx_nss > wlan_vdev_mlme_get_nss(vdev))
|
|
|
- rx_nss = wlan_vdev_mlme_get_nss(vdev);
|
|
|
-
|
|
|
- /* save class a stats to legacy location */
|
|
|
- adapter->hdd_stats.class_a_stat.tx_nss = tx_nss;
|
|
|
- adapter->hdd_stats.class_a_stat.rx_nss = rx_nss;
|
|
|
- adapter->hdd_stats.class_a_stat.tx_rate = stats->tx_rate;
|
|
|
- adapter->hdd_stats.class_a_stat.rx_rate = stats->rx_rate;
|
|
|
- adapter->hdd_stats.class_a_stat.tx_rx_rate_flags = stats->tx_rate_flags;
|
|
|
-
|
|
|
- he_mcs_12_13_map = wlan_vdev_mlme_get_he_mcs_12_13_map(vdev);
|
|
|
- adapter->hdd_stats.class_a_stat.tx_mcs_index =
|
|
|
- sme_get_mcs_idx(stats->tx_rate, stats->tx_rate_flags,
|
|
|
- he_mcs_12_13_map,
|
|
|
- &adapter->hdd_stats.class_a_stat.tx_nss,
|
|
|
- &adapter->hdd_stats.class_a_stat.tx_dcm,
|
|
|
- &adapter->hdd_stats.class_a_stat.tx_gi,
|
|
|
- &adapter->hdd_stats.class_a_stat.
|
|
|
- tx_mcs_rate_flags);
|
|
|
- adapter->hdd_stats.class_a_stat.rx_mcs_index =
|
|
|
- sme_get_mcs_idx(stats->rx_rate, stats->tx_rate_flags,
|
|
|
- he_mcs_12_13_map,
|
|
|
- &adapter->hdd_stats.class_a_stat.rx_nss,
|
|
|
- &adapter->hdd_stats.class_a_stat.rx_dcm,
|
|
|
- &adapter->hdd_stats.class_a_stat.rx_gi,
|
|
|
- &adapter->hdd_stats.class_a_stat.
|
|
|
- rx_mcs_rate_flags);
|
|
|
-
|
|
|
- /* save per chain rssi to legacy location */
|
|
|
- qdf_mem_copy(adapter->hdd_stats.per_chain_rssi_stats.rssi,
|
|
|
- stats->vdev_chain_rssi[0].chain_rssi,
|
|
|
- sizeof(stats->vdev_chain_rssi[0].chain_rssi));
|
|
|
- adapter->hdd_stats.bcn_protect_stats = stats->bcn_protect_stats;
|
|
|
-out:
|
|
|
- hdd_objmgr_put_vdev(vdev);
|
|
|
- return ret;
|
|
|
-}
|
|
|
-
|
|
|
#ifdef FEATURE_CLUB_LL_STATS_AND_GET_STATION
|
|
|
/**
|
|
|
* cache_station_stats_cb() - cache_station_stats_cb callback function
|
|
@@ -3545,6 +3545,19 @@ static QDF_STATUS wlan_hdd_stats_request_needed(struct hdd_adapter *adapter)
|
|
|
{
|
|
|
return QDF_STATUS_SUCCESS;
|
|
|
}
|
|
|
+
|
|
|
+static inline
|
|
|
+int wlan_hdd_qmi_get_sync_resume(struct hdd_context *hdd_ctx,
|
|
|
+ struct device *dev)
|
|
|
+{
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+static inline int wlan_hdd_qmi_put_suspend(struct hdd_context *hdd_ctx,
|
|
|
+ struct device *dev)
|
|
|
+{
|
|
|
+ return 0;
|
|
|
+}
|
|
|
#endif /* WLAN_FEATURE_LINK_LAYER_STATS */
|
|
|
|
|
|
#ifdef WLAN_FEATURE_STATS_EXT
|