From b1a940fa7636fc3664716b8b12e4ea14bcaa2669 Mon Sep 17 00:00:00 2001 From: Kai Chen Date: Mon, 10 Feb 2020 12:54:15 -0800 Subject: [PATCH] qcacmn: Fix issue on block ACK on response to BAR Fix the issue on block ACK on response to BAR frame. Parse BAR frame received from monitor destination ring and generate block ack frame from BAR frame and previous block ACK frame. Change-Id: Ifc242b3850630aa25827b003a1e2078a9228358a --- dp/wifi3.0/dp_rx_mon_dest.c | 26 ++++++++++++++++++++++++-- hal/wifi3.0/hal_api_mon.h | 21 ++++++++++++++++++++- 2 files changed, 44 insertions(+), 3 deletions(-) diff --git a/dp/wifi3.0/dp_rx_mon_dest.c b/dp/wifi3.0/dp_rx_mon_dest.c index 501b7cb170..feeb81bdc1 100644 --- a/dp/wifi3.0/dp_rx_mon_dest.c +++ b/dp/wifi3.0/dp_rx_mon_dest.c @@ -37,11 +37,25 @@ dp_handle_tx_capture(struct dp_soc *soc, struct dp_pdev *pdev, { struct hal_rx_ppdu_info *ppdu_info = &pdev->ppdu_info; - if (pdev->tx_capture_enabled != CDP_TX_ENH_CAPTURE_DISABLED && - ppdu_info->sw_frame_group_id == HAL_MPDU_SW_FRAME_GROUP_CTRL_NDPA) + if (pdev->tx_capture_enabled + == CDP_TX_ENH_CAPTURE_DISABLED) + return; + + if ((ppdu_info->sw_frame_group_id == + HAL_MPDU_SW_FRAME_GROUP_CTRL_NDPA) || + (ppdu_info->sw_frame_group_id == + HAL_MPDU_SW_FRAME_GROUP_CTRL_BAR)) dp_handle_tx_capture_from_dest(soc, pdev, mon_mpdu); } +static void +dp_tx_capture_get_user_id(struct dp_pdev *dp_pdev, void *rx_desc_tlv) +{ + if (dp_pdev->tx_capture_enabled + != CDP_TX_ENH_CAPTURE_DISABLED) + dp_pdev->ppdu_info.rx_info.user_id = + HAL_RX_HW_DESC_MPDU_USER_ID(rx_desc_tlv); +} #else static inline void dp_handle_tx_capture(struct dp_soc *soc, struct dp_pdev *pdev, @@ -49,6 +63,10 @@ dp_handle_tx_capture(struct dp_soc *soc, struct dp_pdev *pdev, { } +static void +dp_tx_capture_get_user_id(struct dp_pdev *dp_pdev, void *rx_desc_tlv) +{ +} #endif @@ -299,6 +317,10 @@ dp_rx_mon_mpdu_pop(struct dp_soc *soc, uint32_t mac_id, *ppdu_id = msdu_ppdu_id; return rx_bufs_used; } + + dp_tx_capture_get_user_id(dp_pdev, + rx_desc_tlv); + dp_pdev->mon_last_linkdesc_paddr = buf_info.paddr; } diff --git a/hal/wifi3.0/hal_api_mon.h b/hal/wifi3.0/hal_api_mon.h index 5913d9a7ab..eff3a7aced 100644 --- a/hal/wifi3.0/hal_api_mon.h +++ b/hal/wifi3.0/hal_api_mon.h @@ -224,6 +224,25 @@ bool HAL_RX_HW_DESC_MPDU_VALID(void *hw_desc_addr) return tlv_tag == WIFIRX_MPDU_START_E ? true : false; } +/* + * HAL_RX_HW_DESC_MPDU_VALID() - check MPDU start TLV user id in MPDU + * start TLV of Hardware TLV descriptor + * @hw_desc_addr: Hardware desciptor address + * + * Return: unit32_t: user id + */ +static inline +uint32_t HAL_RX_HW_DESC_MPDU_USER_ID(void *hw_desc_addr) +{ + struct rx_mon_pkt_tlvs *rx_desc = + (struct rx_mon_pkt_tlvs *)hw_desc_addr; + uint32_t user_id; + + user_id = HAL_RX_GET_USER_TLV32_USERID( + &rx_desc->mpdu_start_tlv); + + return user_id; +} /* TODO: Move all Rx descriptor functions to hal_rx.h to avoid duplication */ @@ -544,12 +563,12 @@ struct mon_rx_info { uint16_t qos_control; uint8_t mac_addr1_valid; uint8_t mac_addr1[QDF_MAC_ADDR_SIZE]; + uint32_t user_id; }; struct mon_rx_user_info { uint16_t qos_control; uint8_t qos_control_info_valid; - uint32_t bar_frame:1; }; struct hal_rx_ppdu_info {