diff --git a/dp/inc/cdp_txrx_cmn_struct.h b/dp/inc/cdp_txrx_cmn_struct.h index e8c6b31256..866146db83 100644 --- a/dp/inc/cdp_txrx_cmn_struct.h +++ b/dp/inc/cdp_txrx_cmn_struct.h @@ -1513,7 +1513,7 @@ struct cdp_rx_indication_ppdu { uint8_t rx_ratecode; uint8_t fcs_error_mpdus; uint16_t frame_ctrl; - uint32_t rssi_chain[SS_COUNT][MAX_BW]; + int8_t rssi_chain[SS_COUNT][MAX_BW]; struct cdp_stats_cookie *cookie; }; diff --git a/dp/wifi3.0/dp_internal.h b/dp/wifi3.0/dp_internal.h index 38e9811466..39e5dada55 100644 --- a/dp/wifi3.0/dp_internal.h +++ b/dp/wifi3.0/dp_internal.h @@ -24,6 +24,7 @@ #define RX_BUFFER_SIZE_PKTLOG_LITE 1024 +#define DP_RSSI_INVAL 0x80 #define DP_RSSI_AVG_WEIGHT 2 /* * Formula to derive avg_rssi is taken from wifi2.o firmware diff --git a/dp/wifi3.0/dp_rx_mon_status.c b/dp/wifi3.0/dp_rx_mon_status.c index f00306ffc8..cb7be933c0 100644 --- a/dp/wifi3.0/dp_rx_mon_status.c +++ b/dp/wifi3.0/dp_rx_mon_status.c @@ -51,6 +51,25 @@ dp_rx_mon_enh_capture_process(struct dp_pdev *pdev, uint32_t tlv_status, } #endif +#ifdef FEATURE_PERPKT_INFO +static inline void +dp_rx_populate_rx_rssi_chain(struct hal_rx_ppdu_info *ppdu_info, + struct cdp_rx_indication_ppdu *cdp_rx_ppdu) +{ + uint8_t chain, bw; + int8_t rssi; + + for (chain = 0; chain < SS_COUNT; chain++) { + for (bw = 0; bw < MAX_BW; bw++) { + rssi = ppdu_info->rx_status.rssi_chain[chain][bw]; + if (rssi != DP_RSSI_INVAL) + cdp_rx_ppdu->rssi_chain[chain][bw] = rssi; + else + cdp_rx_ppdu->rssi_chain[chain][bw] = 0; + } + } +} + /** * dp_rx_populate_cdp_indication_ppdu() - Populate cdp rx indication structure * @pdev: pdev ctx @@ -59,7 +78,6 @@ dp_rx_mon_enh_capture_process(struct dp_pdev *pdev, uint32_t tlv_status, * * Return: none */ -#ifdef FEATURE_PERPKT_INFO static inline void dp_rx_populate_cdp_indication_ppdu(struct dp_pdev *pdev, struct hal_rx_ppdu_info *ppdu_info, @@ -138,6 +156,8 @@ dp_rx_populate_cdp_indication_ppdu(struct dp_pdev *pdev, cdp_rx_ppdu->peer_id = peer->peer_ids[0]; cdp_rx_ppdu->vdev_id = peer->vdev->vdev_id; cdp_rx_ppdu->u.ltf_size = ppdu_info->rx_status.ltf_size; + + dp_rx_populate_rx_rssi_chain(ppdu_info, cdp_rx_ppdu); } #else static inline void diff --git a/hal/wifi3.0/hal_generic_api.h b/hal/wifi3.0/hal_generic_api.h index 531bf16667..fae5bb0212 100644 --- a/hal/wifi3.0/hal_generic_api.h +++ b/hal/wifi3.0/hal_generic_api.h @@ -265,6 +265,53 @@ hal_rx_handle_ofdma_info(void *rx_tlv, } #endif +#define HAL_RX_UPDATE_RSSI_PER_CHAIN_BW(chain, word_1, word_2, \ + ppdu_info, rssi_info_tlv) \ + { \ + ppdu_info->rx_status.rssi_chain[chain][0] = \ + HAL_RX_GET(rssi_info_tlv, RECEIVE_RSSI_INFO_##word_1,\ + RSSI_PRI20_CHAIN##chain); \ + ppdu_info->rx_status.rssi_chain[chain][1] = \ + HAL_RX_GET(rssi_info_tlv, RECEIVE_RSSI_INFO_##word_1,\ + RSSI_EXT20_CHAIN##chain); \ + ppdu_info->rx_status.rssi_chain[chain][2] = \ + HAL_RX_GET(rssi_info_tlv, RECEIVE_RSSI_INFO_##word_1,\ + RSSI_EXT40_LOW20_CHAIN##chain); \ + ppdu_info->rx_status.rssi_chain[chain][3] = \ + HAL_RX_GET(rssi_info_tlv, RECEIVE_RSSI_INFO_##word_1,\ + RSSI_EXT40_HIGH20_CHAIN##chain); \ + ppdu_info->rx_status.rssi_chain[chain][4] = \ + HAL_RX_GET(rssi_info_tlv, RECEIVE_RSSI_INFO_##word_2,\ + RSSI_EXT80_LOW20_CHAIN##chain); \ + ppdu_info->rx_status.rssi_chain[chain][5] = \ + HAL_RX_GET(rssi_info_tlv, RECEIVE_RSSI_INFO_##word_2,\ + RSSI_EXT80_LOW_HIGH20_CHAIN##chain); \ + ppdu_info->rx_status.rssi_chain[chain][6] = \ + HAL_RX_GET(rssi_info_tlv, RECEIVE_RSSI_INFO_##word_2,\ + RSSI_EXT80_HIGH_LOW20_CHAIN##chain); \ + ppdu_info->rx_status.rssi_chain[chain][7] = \ + HAL_RX_GET(rssi_info_tlv, RECEIVE_RSSI_INFO_##word_2,\ + RSSI_EXT80_HIGH20_CHAIN##chain); \ + } \ + +#define HAL_RX_PPDU_UPDATE_RSSI(ppdu_info, rssi_info_tlv) \ + {HAL_RX_UPDATE_RSSI_PER_CHAIN_BW(0, 0, 1, ppdu_info, rssi_info_tlv) \ + HAL_RX_UPDATE_RSSI_PER_CHAIN_BW(1, 2, 3, ppdu_info, rssi_info_tlv) \ + HAL_RX_UPDATE_RSSI_PER_CHAIN_BW(2, 4, 5, ppdu_info, rssi_info_tlv) \ + HAL_RX_UPDATE_RSSI_PER_CHAIN_BW(3, 6, 7, ppdu_info, rssi_info_tlv) \ + HAL_RX_UPDATE_RSSI_PER_CHAIN_BW(4, 8, 9, ppdu_info, rssi_info_tlv) \ + HAL_RX_UPDATE_RSSI_PER_CHAIN_BW(5, 10, 11, ppdu_info, rssi_info_tlv) \ + HAL_RX_UPDATE_RSSI_PER_CHAIN_BW(6, 12, 13, ppdu_info, rssi_info_tlv) \ + HAL_RX_UPDATE_RSSI_PER_CHAIN_BW(7, 14, 15, ppdu_info, rssi_info_tlv)} \ + +static inline uint32_t +hal_rx_update_rssi_chain(struct hal_rx_ppdu_info *ppdu_info, + uint8_t *rssi_info_tlv) +{ + HAL_RX_PPDU_UPDATE_RSSI(ppdu_info, rssi_info_tlv) + return 0; +} + /** * hal_rx_status_get_tlv_info() - process receive info TLV * @rx_tlv_hdr: pointer to TLV header @@ -1103,6 +1150,7 @@ hal_rx_status_get_tlv_info_generic(void *rx_tlv_hdr, void *ppduinfo, default: break; } + hal_rx_update_rssi_chain(ppdu_info, rssi_info_tlv); value = HAL_RX_GET(rssi_info_tlv, RECEIVE_RSSI_INFO_0, RSSI_PRI20_CHAIN0); ppdu_info->rx_status.rssi[0] = value; diff --git a/qdf/inc/qdf_nbuf.h b/qdf/inc/qdf_nbuf.h index 372151cbe6..35ee1ab729 100644 --- a/qdf/inc/qdf_nbuf.h +++ b/qdf/inc/qdf_nbuf.h @@ -236,6 +236,7 @@ * @first_data_seq_ctrl: Sequence ctrl field of first data frame * @rxpcu_filter_pass: Flag which indicates whether RX packets are received in * BSS mode(not in promisc mode) + * @rssi_chain: Rssi chain per nss per bw */ struct mon_rx_status { uint64_t tsft; @@ -315,6 +316,7 @@ struct mon_rx_status { uint16_t first_data_seq_ctrl; uint8_t ltf_size; uint8_t rxpcu_filter_pass; + int8_t rssi_chain[8][8]; }; /**