qcacld-3.0: Register for wdi event WDI_PKT_CAPTURE_PPDU_STATS
WDI_PKT_CAPTURE_PPDU_STATS event is sent when packet capture related htt ppdu stats tlv is received from firmware. Register for WDI_PKT_CAPTURE_PPDU_STATS wdi event and add logic to insert received ppdu stats to a list. Change-Id: Ie78cf4b161c90a0bcf514a3e71a82c3c3e358c24 CRs-Fixed: 3004480
This commit is contained in:

committed by
Madan Koyyalamudi

parent
2bef5e1a61
commit
98bf0f00c3
@@ -188,6 +188,17 @@ struct pkt_capture_tx_hdr_elem_t {
|
||||
uint16_t seqno;
|
||||
};
|
||||
|
||||
/**
|
||||
* pkt_capture_ppdu_stats_q_node - node structure to be enqueued
|
||||
* in ppdu_stats_q
|
||||
* @node: list node
|
||||
* @buf: buffer data received from ppdu_stats
|
||||
*/
|
||||
struct pkt_capture_ppdu_stats_q_node {
|
||||
qdf_list_node_t node;
|
||||
uint32_t buf[];
|
||||
};
|
||||
|
||||
/**
|
||||
* pkt_capture_tx_get_txcomplete_data_hdr() - extract Tx data hdr from Tx
|
||||
* completion for pkt capture mode
|
||||
|
@@ -59,6 +59,8 @@ struct pkt_capture_cb_context {
|
||||
* @rx_ops: rx ops
|
||||
* @tx_ops: tx ops
|
||||
* @rx_avg_rssi: avg rssi of rx data packets
|
||||
* @ppdu_stats_q: list used for storing smu related ppdu stats
|
||||
* @lock_q: spinlock for ppdu_stats q
|
||||
*/
|
||||
struct pkt_capture_vdev_priv {
|
||||
struct wlan_objmgr_vdev *vdev;
|
||||
@@ -67,6 +69,8 @@ struct pkt_capture_vdev_priv {
|
||||
struct wlan_pkt_capture_rx_ops rx_ops;
|
||||
struct wlan_pkt_capture_tx_ops tx_ops;
|
||||
int32_t rx_avg_rssi;
|
||||
qdf_list_t ppdu_stats_q;
|
||||
qdf_spinlock_t lock_q;
|
||||
};
|
||||
|
||||
/**
|
||||
|
@@ -23,6 +23,7 @@
|
||||
|
||||
#ifdef WLAN_FEATURE_PKT_CAPTURE_V2
|
||||
#include <dp_types.h>
|
||||
#include "htt_ppdu_stats.h"
|
||||
#endif
|
||||
#include "wlan_pkt_capture_main.h"
|
||||
#include "cfg_ucfg_api.h"
|
||||
@@ -40,6 +41,7 @@ wdi_event_subscribe PKT_CAPTURE_TX_SUBSCRIBER;
|
||||
wdi_event_subscribe PKT_CAPTURE_RX_SUBSCRIBER;
|
||||
wdi_event_subscribe PKT_CAPTURE_RX_NO_PEER_SUBSCRIBER;
|
||||
wdi_event_subscribe PKT_CAPTURE_OFFLOAD_TX_SUBSCRIBER;
|
||||
wdi_event_subscribe PKT_CAPTURE_PPDU_STATS_SUBSCRIBER;
|
||||
|
||||
/**
|
||||
* pkt_capture_wdi_event_subscribe() - Subscribe pkt capture callbacks
|
||||
@@ -89,6 +91,16 @@ static void pkt_capture_wdi_event_subscribe(struct wlan_objmgr_psoc *psoc)
|
||||
|
||||
cdp_wdi_event_sub(soc, pdev_id, &PKT_CAPTURE_OFFLOAD_TX_SUBSCRIBER,
|
||||
WDI_EVENT_PKT_CAPTURE_OFFLOAD_TX_DATA);
|
||||
|
||||
/* subscribe for packet capture mode related ppdu stats */
|
||||
PKT_CAPTURE_PPDU_STATS_SUBSCRIBER.callback =
|
||||
pkt_capture_callback;
|
||||
|
||||
PKT_CAPTURE_PPDU_STATS_SUBSCRIBER.context =
|
||||
wlan_psoc_get_dp_handle(psoc);
|
||||
|
||||
cdp_wdi_event_sub(soc, pdev_id, &PKT_CAPTURE_PPDU_STATS_SUBSCRIBER,
|
||||
WDI_EVENT_PKT_CAPTURE_PPDU_STATS);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -117,6 +129,10 @@ static void pkt_capture_wdi_event_unsubscribe(struct wlan_objmgr_psoc *psoc)
|
||||
/* unsubscribing for offload tx data packets */
|
||||
cdp_wdi_event_unsub(soc, pdev_id, &PKT_CAPTURE_OFFLOAD_TX_SUBSCRIBER,
|
||||
WDI_EVENT_PKT_CAPTURE_OFFLOAD_TX_DATA);
|
||||
|
||||
/* unsubscribe ppdu smu stats */
|
||||
cdp_wdi_event_unsub(soc, pdev_id, &PKT_CAPTURE_PPDU_STATS_SUBSCRIBER,
|
||||
WDI_EVENT_PKT_CAPTURE_PPDU_STATS);
|
||||
}
|
||||
|
||||
enum pkt_capture_mode
|
||||
@@ -140,6 +156,7 @@ pkt_capture_get_pktcap_mode_v2()
|
||||
}
|
||||
|
||||
#define RX_OFFLOAD_PKT 1
|
||||
#define PPDU_STATS_Q_MAX_SIZE 500
|
||||
|
||||
static void
|
||||
pkt_capture_process_rx_data_no_peer(void *soc, uint16_t vdev_id, uint8_t *bssid,
|
||||
@@ -181,6 +198,57 @@ pkt_capture_process_rx_data_no_peer(void *soc, uint16_t vdev_id, uint8_t *bssid,
|
||||
bssid, psoc, 0);
|
||||
}
|
||||
|
||||
static void
|
||||
pkt_capture_process_ppdu_stats(void *log_data)
|
||||
{
|
||||
struct wlan_objmgr_vdev *vdev;
|
||||
struct pkt_capture_vdev_priv *vdev_priv;
|
||||
struct pkt_capture_ppdu_stats_q_node *q_node;
|
||||
htt_ppdu_stats_for_smu_tlv *smu;
|
||||
uint32_t stats_len;
|
||||
|
||||
vdev = pkt_capture_get_vdev();
|
||||
if (qdf_unlikely(!vdev))
|
||||
return;
|
||||
|
||||
vdev_priv = pkt_capture_vdev_get_priv(vdev);
|
||||
if (qdf_unlikely(!vdev_priv))
|
||||
return;
|
||||
|
||||
smu = (htt_ppdu_stats_for_smu_tlv *)log_data;
|
||||
|
||||
qdf_spin_lock(&vdev_priv->lock_q);
|
||||
if (qdf_list_size(&vdev_priv->ppdu_stats_q) <
|
||||
PPDU_STATS_Q_MAX_SIZE) {
|
||||
/*
|
||||
* win size indicates the size of block ack bitmap, currently
|
||||
* we support only 256 bit ba bitmap.
|
||||
*/
|
||||
if (smu->win_size > 8) {
|
||||
qdf_spin_unlock(&vdev_priv->lock_q);
|
||||
pkt_capture_err("win size %d > 8 not supported\n",
|
||||
smu->win_size);
|
||||
return;
|
||||
}
|
||||
|
||||
stats_len = sizeof(htt_ppdu_stats_for_smu_tlv) +
|
||||
smu->win_size * sizeof(uint32_t);
|
||||
|
||||
q_node = qdf_mem_malloc(sizeof(*q_node) + stats_len);
|
||||
if (!q_node) {
|
||||
qdf_spin_unlock(&vdev_priv->lock_q);
|
||||
pkt_capture_err("stats node and buf allocation fail\n");
|
||||
return;
|
||||
}
|
||||
|
||||
qdf_mem_copy(q_node->buf, log_data, stats_len);
|
||||
/* Insert received ppdu stats in queue */
|
||||
qdf_list_insert_back(&vdev_priv->ppdu_stats_q,
|
||||
&q_node->node);
|
||||
}
|
||||
qdf_spin_unlock(&vdev_priv->lock_q);
|
||||
}
|
||||
|
||||
void pkt_capture_callback(void *soc, enum WDI_EVENT event, void *log_data,
|
||||
u_int16_t vdev_id, uint32_t status)
|
||||
{
|
||||
@@ -380,8 +448,13 @@ void pkt_capture_callback(void *soc, enum WDI_EVENT event, void *log_data,
|
||||
pkt_capture_offload_deliver_indication_handler(
|
||||
log_data,
|
||||
vdev_id, bssid, soc);
|
||||
break;
|
||||
}
|
||||
|
||||
case WDI_EVENT_PKT_CAPTURE_PPDU_STATS:
|
||||
pkt_capture_process_ppdu_stats(log_data);
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
@@ -763,6 +836,9 @@ pkt_capture_vdev_create_notification(struct wlan_objmgr_vdev *vdev, void *arg)
|
||||
pkt_capture_err("Failed to open mon thread");
|
||||
goto open_mon_thread_fail;
|
||||
}
|
||||
qdf_spinlock_create(&vdev_priv->lock_q);
|
||||
qdf_list_create(&vdev_priv->ppdu_stats_q, PPDU_STATS_Q_MAX_SIZE);
|
||||
|
||||
return status;
|
||||
|
||||
open_mon_thread_fail:
|
||||
@@ -784,6 +860,8 @@ QDF_STATUS
|
||||
pkt_capture_vdev_destroy_notification(struct wlan_objmgr_vdev *vdev, void *arg)
|
||||
{
|
||||
struct pkt_capture_vdev_priv *vdev_priv;
|
||||
struct pkt_capture_ppdu_stats_q_node *stats_node;
|
||||
qdf_list_node_t *node;
|
||||
QDF_STATUS status;
|
||||
|
||||
if ((wlan_vdev_mlme_get_opmode(vdev) != QDF_STA_MODE) ||
|
||||
@@ -796,6 +874,15 @@ pkt_capture_vdev_destroy_notification(struct wlan_objmgr_vdev *vdev, void *arg)
|
||||
return QDF_STATUS_E_FAILURE;
|
||||
}
|
||||
|
||||
while (qdf_list_remove_front(&vdev_priv->ppdu_stats_q, &node)
|
||||
== QDF_STATUS_SUCCESS) {
|
||||
stats_node = qdf_container_of(
|
||||
node, struct pkt_capture_ppdu_stats_q_node, node);
|
||||
qdf_mem_free(stats_node);
|
||||
}
|
||||
qdf_list_destroy(&vdev_priv->ppdu_stats_q);
|
||||
qdf_spinlock_destroy(&vdev_priv->lock_q);
|
||||
|
||||
status = wlan_objmgr_vdev_component_obj_detach(
|
||||
vdev,
|
||||
WLAN_UMAC_COMP_PKT_CAPTURE,
|
||||
@@ -806,6 +893,7 @@ pkt_capture_vdev_destroy_notification(struct wlan_objmgr_vdev *vdev, void *arg)
|
||||
pkt_capture_close_mon_thread(vdev_priv->mon_ctx);
|
||||
pkt_capture_mon_context_destroy(vdev_priv);
|
||||
pkt_capture_callback_ctx_destroy(vdev_priv);
|
||||
|
||||
qdf_mem_free(vdev_priv);
|
||||
gp_pkt_capture_vdev = NULL;
|
||||
return status;
|
||||
|
Reference in New Issue
Block a user