|
@@ -12744,6 +12744,102 @@ dp_flush_rate_stats_req(struct cdp_soc_t *soc_hdl,
|
|
|
}
|
|
|
#endif
|
|
|
|
|
|
+#if defined(FEATURE_PERPKT_INFO) && WDI_EVENT_ENABLE
|
|
|
+#ifdef WLAN_FEATURE_11BE_MLO
|
|
|
+/**
|
|
|
+ * dp_get_peer_extd_rate_link_stats(): function to get peer
|
|
|
+ * extended rate and link stats
|
|
|
+ * @soc_hdl: dp soc handler
|
|
|
+ * @mac_addr: mac address of peer
|
|
|
+ *
|
|
|
+ * Return: QDF_STATUS
|
|
|
+ */
|
|
|
+static QDF_STATUS
|
|
|
+dp_get_peer_extd_rate_link_stats(struct cdp_soc_t *soc_hdl, uint8_t *mac_addr)
|
|
|
+{
|
|
|
+ uint8_t i;
|
|
|
+ struct dp_peer *link_peer;
|
|
|
+ struct dp_soc *link_peer_soc;
|
|
|
+ struct dp_mld_link_peers link_peers_info;
|
|
|
+ struct dp_peer *peer = NULL;
|
|
|
+ struct dp_soc *soc = (struct dp_soc *)soc_hdl;
|
|
|
+
|
|
|
+ if (!mac_addr) {
|
|
|
+ dp_err("NULL peer mac addr\n");
|
|
|
+ return QDF_STATUS_E_FAILURE;
|
|
|
+ }
|
|
|
+
|
|
|
+ peer = dp_peer_find_hash_find(soc, mac_addr, 0,
|
|
|
+ DP_VDEV_ALL, DP_MOD_ID_CDP);
|
|
|
+ if (!peer) {
|
|
|
+ dp_err("Invalid peer\n");
|
|
|
+ return QDF_STATUS_E_FAILURE;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (IS_MLO_DP_MLD_PEER(peer)) {
|
|
|
+ dp_get_link_peers_ref_from_mld_peer(soc, peer,
|
|
|
+ &link_peers_info,
|
|
|
+ DP_MOD_ID_CDP);
|
|
|
+ for (i = 0; i < link_peers_info.num_links; i++) {
|
|
|
+ link_peer = link_peers_info.link_peers[i];
|
|
|
+ link_peer_soc = link_peer->vdev->pdev->soc;
|
|
|
+ dp_wdi_event_handler(WDI_EVENT_FLUSH_RATE_STATS_REQ,
|
|
|
+ link_peer_soc,
|
|
|
+ dp_monitor_peer_get_peerstats_ctx
|
|
|
+ (link_peer_soc, link_peer),
|
|
|
+ link_peer->peer_id,
|
|
|
+ WDI_NO_VAL,
|
|
|
+ link_peer->vdev->pdev->pdev_id);
|
|
|
+ }
|
|
|
+ dp_release_link_peers_ref(&link_peers_info, DP_MOD_ID_CDP);
|
|
|
+ } else {
|
|
|
+ dp_wdi_event_handler(
|
|
|
+ WDI_EVENT_FLUSH_RATE_STATS_REQ, soc,
|
|
|
+ dp_monitor_peer_get_peerstats_ctx(soc, peer),
|
|
|
+ peer->peer_id,
|
|
|
+ WDI_NO_VAL, peer->vdev->pdev->pdev_id);
|
|
|
+ }
|
|
|
+
|
|
|
+ dp_peer_unref_delete(peer, DP_MOD_ID_CDP);
|
|
|
+ return QDF_STATUS_SUCCESS;
|
|
|
+}
|
|
|
+#else
|
|
|
+static QDF_STATUS
|
|
|
+dp_get_peer_extd_rate_link_stats(struct cdp_soc_t *soc_hdl, uint8_t *mac_addr)
|
|
|
+{
|
|
|
+ struct dp_peer *peer = NULL;
|
|
|
+ struct dp_soc *soc = (struct dp_soc *)soc_hdl;
|
|
|
+
|
|
|
+ if (!mac_addr) {
|
|
|
+ dp_err("NULL peer mac addr\n");
|
|
|
+ return QDF_STATUS_E_FAILURE;
|
|
|
+ }
|
|
|
+
|
|
|
+ peer = dp_peer_find_hash_find(soc, mac_addr, 0,
|
|
|
+ DP_VDEV_ALL, DP_MOD_ID_CDP);
|
|
|
+ if (!peer) {
|
|
|
+ dp_err("Invalid peer\n");
|
|
|
+ return QDF_STATUS_E_FAILURE;
|
|
|
+ }
|
|
|
+
|
|
|
+ dp_wdi_event_handler(
|
|
|
+ WDI_EVENT_FLUSH_RATE_STATS_REQ, soc,
|
|
|
+ dp_monitor_peer_get_peerstats_ctx(soc, peer),
|
|
|
+ peer->peer_id,
|
|
|
+ WDI_NO_VAL, peer->vdev->pdev->pdev_id);
|
|
|
+
|
|
|
+ dp_peer_unref_delete(peer, DP_MOD_ID_CDP);
|
|
|
+ return QDF_STATUS_SUCCESS;
|
|
|
+}
|
|
|
+#endif
|
|
|
+#else
|
|
|
+static inline QDF_STATUS
|
|
|
+dp_get_peer_extd_rate_link_stats(struct cdp_soc_t *soc_hdl, uint8_t *mac_addr)
|
|
|
+{
|
|
|
+ return QDF_STATUS_SUCCESS;
|
|
|
+}
|
|
|
+#endif
|
|
|
+
|
|
|
static void *dp_peer_get_peerstats_ctx(struct cdp_soc_t *soc_hdl,
|
|
|
uint8_t vdev_id,
|
|
|
uint8_t *mac_addr)
|
|
@@ -13684,6 +13780,8 @@ static struct cdp_host_stats_ops dp_ops_host_stats = {
|
|
|
.txrx_pdev_telemetry_stats = dp_get_pdev_telemetry_stats,
|
|
|
.txrx_peer_telemetry_stats = dp_get_peer_telemetry_stats,
|
|
|
#endif
|
|
|
+ .txrx_get_peer_extd_rate_link_stats =
|
|
|
+ dp_get_peer_extd_rate_link_stats,
|
|
|
/* TODO */
|
|
|
};
|
|
|
|