diff --git a/dp/wifi3.0/dp_rx.h b/dp/wifi3.0/dp_rx.h index ba785a880f..0413a91cb5 100644 --- a/dp/wifi3.0/dp_rx.h +++ b/dp/wifi3.0/dp_rx.h @@ -43,6 +43,9 @@ #endif #define RX_BUFFER_RESERVATION 0 +#ifdef QCA_WIFI_QCN9224 +#define RX_MON_MIN_HEAD_ROOM 64 +#endif #define DP_DEFAULT_NOISEFLOOR (-96) diff --git a/dp/wifi3.0/monitor/1.0/dp_rx_mon_dest_1.0.c b/dp/wifi3.0/monitor/1.0/dp_rx_mon_dest_1.0.c index 5a706ba522..f8ad36ea9c 100644 --- a/dp/wifi3.0/monitor/1.0/dp_rx_mon_dest_1.0.c +++ b/dp/wifi3.0/monitor/1.0/dp_rx_mon_dest_1.0.c @@ -32,10 +32,6 @@ #include #include -#ifndef IEEE80211_FCO_SUBTYPE_ACTION_NO_ACK -#define IEEE80211_FCO_SUBTYPE_ACTION_NO_ACK 0xe0 -#endif - #ifdef WLAN_TX_PKT_CAPTURE_ENH #include "dp_rx_mon_feature.h" #endif @@ -2077,50 +2073,6 @@ void dp_rx_mon_update_pf_tag_to_buf_headroom(struct dp_soc *soc, #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 QDF_STATUS dp_mon_htt_dest_srng_setup(struct dp_soc *soc, struct dp_pdev *pdev, diff --git a/dp/wifi3.0/monitor/1.0/dp_rx_mon_status_1.0.c b/dp/wifi3.0/monitor/1.0/dp_rx_mon_status_1.0.c index 107529b50d..b3d9d0051e 100644 --- a/dp/wifi3.0/monitor/1.0/dp_rx_mon_status_1.0.c +++ b/dp/wifi3.0/monitor/1.0/dp_rx_mon_status_1.0.c @@ -145,53 +145,6 @@ dp_send_ack_frame_to_stack(struct dp_soc *soc, } #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) static inline void dp_rx_ul_ofdma_ru_size_to_width( diff --git a/dp/wifi3.0/monitor/2.0/dp_rx_mon_status_2.0.c b/dp/wifi3.0/monitor/2.0/dp_rx_mon_status_2.0.c index 87ba1ad1ce..75446e202b 100644 --- a/dp/wifi3.0/monitor/2.0/dp_rx_mon_status_2.0.c +++ b/dp/wifi3.0/monitor/2.0/dp_rx_mon_status_2.0.c @@ -30,3 +30,42 @@ void dp_rx_mon_process_status_tlv(struct dp_soc *soc, { /* 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); +} + diff --git a/dp/wifi3.0/monitor/dp_rx_mon.c b/dp/wifi3.0/monitor/dp_rx_mon.c index 2da001049a..c6ba0d5ee7 100644 --- a/dp/wifi3.0/monitor/dp_rx_mon.c +++ b/dp/wifi3.0/monitor/dp_rx_mon.c @@ -36,6 +36,10 @@ #include "dp_ratetable.h" #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) void 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 */ +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_nbuf_t head_msdu, qdf_nbuf_t tail_msdu) { @@ -1550,3 +1598,50 @@ allocate_dummy_msdu_fail: mon_deliver_non_std_fail: 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); +} diff --git a/dp/wifi3.0/monitor/dp_rx_mon.h b/dp/wifi3.0/monitor/dp_rx_mon.h index 99788f0ce8..fed3d5123d 100644 --- a/dp/wifi3.0/monitor/dp_rx_mon.h +++ b/dp/wifi3.0/monitor/dp_rx_mon.h @@ -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]; } +/** + * 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_ */