diff --git a/hal/wifi3.0/hal_api_mon.h b/hal/wifi3.0/hal_api_mon.h index be1ffeed11b7..064501d350d3 100644 --- a/hal/wifi3.0/hal_api_mon.h +++ b/hal/wifi3.0/hal_api_mon.h @@ -118,6 +118,24 @@ #define HAL_TID_INVALID 31 #define HAL_AST_IDX_INVALID 0xFFFF +#ifdef GET_MSDU_AGGREGATION +#define HAL_RX_GET_MSDU_AGGREGATION(rx_desc, rs)\ +{\ + struct rx_msdu_end *rx_msdu_end;\ + bool first_msdu, last_msdu; \ + rx_msdu_end = &rx_desc->msdu_end_tlv.rx_msdu_end;\ + first_msdu = HAL_RX_GET(rx_msdu_end, RX_MSDU_END_5, FIRST_MSDU);\ + last_msdu = HAL_RX_GET(rx_msdu_end, RX_MSDU_END_5, LAST_MSDU);\ + if (first_msdu && last_msdu)\ + rs->rs_flags &= (~IEEE80211_AMSDU_FLAG);\ + else\ + rs->rs_flags |= (IEEE80211_AMSDU_FLAG); \ +} \ + +#else +#define HAL_RX_GET_MSDU_AGGREGATION(rx_desc, rs) +#endif + enum { HAL_HW_RX_DECAP_FORMAT_RAW = 0, HAL_HW_RX_DECAP_FORMAT_NWIFI, @@ -391,6 +409,7 @@ void hal_rx_mon_hw_desc_get_mpdu_status(void *hw_desc_addr, }; rx_msdu_start = &rx_desc->msdu_start_tlv.rx_msdu_start; + HAL_RX_GET_MSDU_AGGREGATION(rx_desc, rs); rs->ant_signal_db = HAL_RX_GET(rx_msdu_start, RX_MSDU_START_5, USER_RSSI); @@ -572,6 +591,12 @@ hal_rx_status_get_tlv_info(void *rx_tlv, struct hal_rx_ppdu_info *ppdu_info) ppdu_info->com_info.mpdu_cnt_fcs_err = HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_2, MPDU_CNT_FCS_ERR); + if ((ppdu_info->com_info.mpdu_cnt_fcs_ok | + ppdu_info->com_info.mpdu_cnt_fcs_err) > 1) + ppdu_info->rx_status.rs_flags |= IEEE80211_AMPDU_FLAG; + else + ppdu_info->rx_status.rs_flags &= + (~IEEE80211_AMPDU_FLAG); break; } diff --git a/qdf/inc/qdf_nbuf.h b/qdf/inc/qdf_nbuf.h index 64e1be37e646..9b390573ba61 100644 --- a/qdf/inc/qdf_nbuf.h +++ b/qdf/inc/qdf_nbuf.h @@ -119,6 +119,12 @@ #define TSO_DEBUG(fmt, args ...) #endif +#define IEEE80211_AMPDU_FLAG 0x01 + +#ifdef GET_MSDU_AGGREGATION +#define IEEE80211_AMSDU_FLAG 0x02 +#endif + /** * struct mon_rx_status - This will have monitor mode rx_status extracted from * htt_rx_desc used later to update radiotap information. @@ -161,6 +167,7 @@ * @ast_index: AST table hash index * @tid: QoS traffic tid number * @rs_fcs_err: FCS error flag + * @rs_flags: Flags to indicate AMPDU or AMSDU aggregation * @he_per_user_1: HE per user info1 * @he_per_user_2: HE per user info2 * @he_per_user_position: HE per user position info @@ -224,6 +231,7 @@ struct mon_rx_status { uint32_t ast_index; uint32_t tid; uint8_t rs_fcs_err; + uint8_t rs_flags; /* New HE radiotap fields */ uint16_t he_per_user_1; uint16_t he_per_user_2;