qcacmn: FR65980: Process log contents to pktlog buffers

This change will enable packet logging for the fragments
from RX monitor status ring and send it to the pktlog module
for post processing through WDI event.

Change-Id: I283a20e7d0fa1f9b88223a989beda529beff6718
CRs-Fixed: 3074184
This commit is contained in:
Adwait Nayak
2021-11-19 14:10:05 +05:30
committed by Madan Koyyalamudi
parent de2c451d24
commit c3f8294cc4
6 changed files with 151 additions and 95 deletions

View File

@@ -43,6 +43,9 @@
#endif #endif
#define RX_BUFFER_RESERVATION 0 #define RX_BUFFER_RESERVATION 0
#ifdef QCA_WIFI_QCN9224
#define RX_MON_MIN_HEAD_ROOM 64
#endif
#define DP_DEFAULT_NOISEFLOOR (-96) #define DP_DEFAULT_NOISEFLOOR (-96)

View File

@@ -32,10 +32,6 @@
#include <dp_mon_1.0.h> #include <dp_mon_1.0.h>
#include <dp_rx_mon_1.0.h> #include <dp_rx_mon_1.0.h>
#ifndef IEEE80211_FCO_SUBTYPE_ACTION_NO_ACK
#define IEEE80211_FCO_SUBTYPE_ACTION_NO_ACK 0xe0
#endif
#ifdef WLAN_TX_PKT_CAPTURE_ENH #ifdef WLAN_TX_PKT_CAPTURE_ENH
#include "dp_rx_mon_feature.h" #include "dp_rx_mon_feature.h"
#endif #endif
@@ -2077,50 +2073,6 @@ void dp_rx_mon_update_pf_tag_to_buf_headroom(struct dp_soc *soc,
#endif #endif
#endif #endif
QDF_STATUS dp_rx_mon_process_dest_pktlog(struct dp_soc *soc,
uint32_t mac_id,
qdf_nbuf_t mpdu)
{
uint32_t event, msdu_timestamp = 0;
struct dp_pdev *pdev = dp_get_pdev_for_lmac_id(soc, mac_id);
void *data;
struct ieee80211_frame *wh;
uint8_t type, subtype;
struct dp_mon_pdev *mon_pdev;
if (!pdev)
return QDF_STATUS_E_INVAL;
mon_pdev = pdev->monitor_pdev;
if (mon_pdev->rx_pktlog_cbf) {
if (qdf_nbuf_get_nr_frags(mpdu))
data = qdf_nbuf_get_frag_addr(mpdu, 0);
else
data = qdf_nbuf_data(mpdu);
/* CBF logging required, doesn't matter if it is a full mode
* or lite mode.
* Need to look for mpdu with:
* TYPE = ACTION, SUBTYPE = NO ACK in the header
*/
event = WDI_EVENT_RX_CBF;
wh = (struct ieee80211_frame *)data;
type = (wh)->i_fc[0] & IEEE80211_FC0_TYPE_MASK;
subtype = (wh)->i_fc[0] & IEEE80211_FC0_SUBTYPE_MASK;
if (type == IEEE80211_FC0_TYPE_MGT &&
subtype == IEEE80211_FCO_SUBTYPE_ACTION_NO_ACK) {
msdu_timestamp = mon_pdev->ppdu_info.rx_status.tsft;
dp_rx_populate_cbf_hdr(soc,
mac_id, event,
mpdu,
msdu_timestamp);
}
}
return QDF_STATUS_SUCCESS;
}
#ifdef QCA_MONITOR_PKT_SUPPORT #ifdef QCA_MONITOR_PKT_SUPPORT
QDF_STATUS dp_mon_htt_dest_srng_setup(struct dp_soc *soc, QDF_STATUS dp_mon_htt_dest_srng_setup(struct dp_soc *soc,
struct dp_pdev *pdev, struct dp_pdev *pdev,

View File

@@ -145,53 +145,6 @@ dp_send_ack_frame_to_stack(struct dp_soc *soc,
} }
#endif #endif
/**
* dp_rx_process_peer_based_pktlog() - Process Rx pktlog if peer based
* filtering enabled
* @soc: core txrx main context
* @ppdu_info: Structure for rx ppdu info
* @status_nbuf: Qdf nbuf abstraction for linux skb
* @pdev_id: mac_id/pdev_id correspondinggly for MCL and WIN
*
* Return: none
*/
static inline void
dp_rx_process_peer_based_pktlog(struct dp_soc *soc,
struct hal_rx_ppdu_info *ppdu_info,
qdf_nbuf_t status_nbuf, uint32_t pdev_id)
{
struct dp_peer *peer;
struct mon_rx_user_status *rx_user_status;
uint32_t num_users = ppdu_info->com_info.num_users;
uint16_t sw_peer_id;
/* Sanity check for num_users */
if (!num_users)
return;
qdf_assert_always(num_users <= CDP_MU_MAX_USERS);
rx_user_status = &ppdu_info->rx_user_status[num_users - 1];
sw_peer_id = rx_user_status->sw_peer_id;
peer = dp_peer_get_ref_by_id(soc, sw_peer_id,
DP_MOD_ID_RX_PPDU_STATS);
if (!peer)
return;
if ((peer->peer_id != HTT_INVALID_PEER) &&
(peer->peer_based_pktlog_filter)) {
dp_wdi_event_handler(
WDI_EVENT_RX_DESC, soc,
status_nbuf,
peer->peer_id,
WDI_NO_VAL, pdev_id);
}
dp_peer_unref_delete(peer,
DP_MOD_ID_RX_PPDU_STATS);
}
#if defined(HTT_UL_OFDMA_USER_INFO_V0_W0_VALID_M) #if defined(HTT_UL_OFDMA_USER_INFO_V0_W0_VALID_M)
static inline void static inline void
dp_rx_ul_ofdma_ru_size_to_width( dp_rx_ul_ofdma_ru_size_to_width(

View File

@@ -30,3 +30,42 @@ void dp_rx_mon_process_status_tlv(struct dp_soc *soc,
{ {
/* API to process status tlv */ /* API to process status tlv */
} }
static inline void
dp_rx_process_pktlog(struct dp_soc *soc,
struct hal_rx_ppdu_info *ppdu_info,
void *status_frag, struct dp_pdev *pdev)
{
struct dp_mon_pdev *mon_pdev;
qdf_nbuf_t nbuf = NULL;
nbuf = qdf_nbuf_alloc(soc->osdev, RX_MON_MIN_HEAD_ROOM,
RX_BUFFER_RESERVATION, 0, FALSE);
if (!nbuf)
return;
qdf_nbuf_add_rx_frag(status_frag, nbuf,
(ppdu_info->data -
(unsigned char *)status_frag),
ppdu_info->hdr_len,
RX_MON_MIN_HEAD_ROOM, FALSE);
mon_pdev = pdev->monitor_pdev;
if (mon_pdev->dp_peer_based_pktlog) {
dp_rx_process_peer_based_pktlog(soc, ppdu_info,
nbuf, pdev->pdev_id);
} else {
if (mon_pdev->rx_pktlog_mode == DP_RX_PKTLOG_FULL)
pktlog_mode = WDI_EVENT_RX_DESC;
else if (mon_pdev->rx_pktlog_mode == DP_RX_PKTLOG_LITE)
pktlog_mode = WDI_EVENT_LITE_RX;
if (pktlog_mode != WDI_NO_VAL)
dp_wdi_event_handler(pktlog_mode, soc,
nbuf, HTT_INVALID_PEER,
WDI_NO_VAL, pdev->pdev_id);
}
qdf_nbuf_free(nbuf);
}

View File

@@ -36,6 +36,10 @@
#include "dp_ratetable.h" #include "dp_ratetable.h"
#endif #endif
#ifndef IEEE80211_FCO_SUBTYPE_ACTION_NO_ACK
#define IEEE80211_FCO_SUBTYPE_ACTION_NO_ACK 0xe0
#endif
#if defined(WLAN_CFR_ENABLE) && defined(WLAN_ENH_CFR_ENABLE) #if defined(WLAN_CFR_ENABLE) && defined(WLAN_ENH_CFR_ENABLE)
void void
dp_rx_mon_handle_cfr_mu_info(struct dp_pdev *pdev, dp_rx_mon_handle_cfr_mu_info(struct dp_pdev *pdev,
@@ -1403,6 +1407,50 @@ dp_send_mgmt_packet_to_stack(struct dp_soc *soc,
} }
#endif /* QCA_MCOPY_SUPPORT */ #endif /* QCA_MCOPY_SUPPORT */
QDF_STATUS dp_rx_mon_process_dest_pktlog(struct dp_soc *soc,
uint32_t mac_id,
qdf_nbuf_t mpdu)
{
uint32_t event, msdu_timestamp = 0;
struct dp_pdev *pdev = dp_get_pdev_for_lmac_id(soc, mac_id);
void *data;
struct ieee80211_frame *wh;
uint8_t type, subtype;
struct dp_mon_pdev *mon_pdev;
if (!pdev)
return QDF_STATUS_E_INVAL;
mon_pdev = pdev->monitor_pdev;
if (mon_pdev->rx_pktlog_cbf) {
if (qdf_nbuf_get_nr_frags(mpdu))
data = qdf_nbuf_get_frag_addr(mpdu, 0);
else
data = qdf_nbuf_data(mpdu);
/* CBF logging required, doesn't matter if it is a full mode
* or lite mode.
* Need to look for mpdu with:
* TYPE = ACTION, SUBTYPE = NO ACK in the header
*/
event = WDI_EVENT_RX_CBF;
wh = (struct ieee80211_frame *)data;
type = (wh)->i_fc[0] & IEEE80211_FC0_TYPE_MASK;
subtype = (wh)->i_fc[0] & IEEE80211_FC0_SUBTYPE_MASK;
if (type == IEEE80211_FC0_TYPE_MGT &&
subtype == IEEE80211_FCO_SUBTYPE_ACTION_NO_ACK) {
msdu_timestamp = mon_pdev->ppdu_info.rx_status.tsft;
dp_rx_populate_cbf_hdr(soc,
mac_id, event,
mpdu,
msdu_timestamp);
}
}
return QDF_STATUS_SUCCESS;
}
QDF_STATUS dp_rx_mon_deliver(struct dp_soc *soc, uint32_t mac_id, QDF_STATUS dp_rx_mon_deliver(struct dp_soc *soc, uint32_t mac_id,
qdf_nbuf_t head_msdu, qdf_nbuf_t tail_msdu) qdf_nbuf_t head_msdu, qdf_nbuf_t tail_msdu)
{ {
@@ -1550,3 +1598,50 @@ allocate_dummy_msdu_fail:
mon_deliver_non_std_fail: mon_deliver_non_std_fail:
return QDF_STATUS_E_INVAL; return QDF_STATUS_E_INVAL;
} }
/**
* dp_rx_process_peer_based_pktlog() - Process Rx pktlog if peer based
* filtering enabled
* @soc: core txrx main context
* @ppdu_info: Structure for rx ppdu info
* @status_nbuf: Qdf nbuf abstraction for linux skb
* @pdev_id: mac_id/pdev_id correspondinggly for MCL and WIN
*
* Return: none
*/
void
dp_rx_process_peer_based_pktlog(struct dp_soc *soc,
struct hal_rx_ppdu_info *ppdu_info,
qdf_nbuf_t status_nbuf, uint32_t pdev_id)
{
struct dp_peer *peer;
struct mon_rx_user_status *rx_user_status;
uint32_t num_users = ppdu_info->com_info.num_users;
uint16_t sw_peer_id;
/* Sanity check for num_users */
if (!num_users)
return;
qdf_assert_always(num_users <= CDP_MU_MAX_USERS);
rx_user_status = &ppdu_info->rx_user_status[num_users - 1];
sw_peer_id = rx_user_status->sw_peer_id;
peer = dp_peer_get_ref_by_id(soc, sw_peer_id,
DP_MOD_ID_RX_PPDU_STATS);
if (!peer)
return;
if ((peer->peer_id != HTT_INVALID_PEER) &&
(peer->peer_based_pktlog_filter)) {
dp_wdi_event_handler(
WDI_EVENT_RX_DESC, soc,
status_nbuf,
peer->peer_id,
WDI_NO_VAL, pdev_id);
}
dp_peer_unref_delete(peer,
DP_MOD_ID_RX_PPDU_STATS);
}

View File

@@ -702,4 +702,18 @@ struct rx_desc_pool *dp_rx_get_mon_desc_pool(struct dp_soc *soc,
return &soc->rx_desc_buf[pdev_id]; return &soc->rx_desc_buf[pdev_id];
} }
/**
* dp_rx_process_peer_based_pktlog() - Process Rx pktlog if peer based
* filtering enabled
* @soc: core txrx main context
* @ppdu_info: Structure for rx ppdu info
* @status_nbuf: Qdf nbuf abstraction for linux skb
* @pdev_id: mac_id/pdev_id correspondinggly for MCL and WIN
*
* Return: none
*/
void
dp_rx_process_peer_based_pktlog(struct dp_soc *soc,
struct hal_rx_ppdu_info *ppdu_info,
qdf_nbuf_t status_nbuf, uint32_t pdev_id);
#endif /* _DP_RX_MON_H_ */ #endif /* _DP_RX_MON_H_ */