From 085ce4026b1b3c75b6223e35e77e2d356293c0ca Mon Sep 17 00:00:00 2001 From: Kai Chen Date: Tue, 14 Jan 2020 17:25:17 -0800 Subject: [PATCH] qcacmn: fix the issue for block ack/ack for tx capture mode fix the issue for block ack/ack for tx capture mode. 1. Hanndle BAR frame. 2. set rate for ACK frame. 3. Check block ack session and use block ack if block ack session is established. 4. no ACK for broadcast probe request. 5. not ack if the ack policy is set to no ack in qos control. Change-Id: I4f22c1c976334978fb971b42319fb3a6e43a00c2 --- hal/wifi3.0/hal_api_mon.h | 15 ++++++ hal/wifi3.0/hal_generic_api.h | 77 +++++++++++++++++++++++++++ hal/wifi3.0/hal_rx.h | 4 ++ hal/wifi3.0/qca6290/hal_6290_rx.h | 5 +- hal/wifi3.0/qca6390/hal_6390_rx.h | 5 +- hal/wifi3.0/qca6490/hal_6490_rx.h | 5 +- hal/wifi3.0/qca6750/hal_6750_rx.h | 3 ++ hal/wifi3.0/qca8074v1/hal_8074v1_rx.h | 5 +- hal/wifi3.0/qca8074v2/hal_8074v2_rx.h | 3 ++ hal/wifi3.0/qcn9000/hal_9000_rx.h | 5 +- 10 files changed, 122 insertions(+), 5 deletions(-) diff --git a/hal/wifi3.0/hal_api_mon.h b/hal/wifi3.0/hal_api_mon.h index cc874f00f58c..f1939b6d8364 100644 --- a/hal/wifi3.0/hal_api_mon.h +++ b/hal/wifi3.0/hal_api_mon.h @@ -543,10 +543,25 @@ struct hal_rx_ppdu_cfr_info { struct hal_rx_ppdu_cfr_info {}; #endif +struct mon_rx_info { + uint8_t qos_control_info_valid; + uint16_t qos_control; + uint8_t mac_addr1_valid; + uint8_t mac_addr1[QDF_MAC_ADDR_SIZE]; +}; + +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 { struct hal_rx_ppdu_common_info com_info; struct mon_rx_status rx_status; struct mon_rx_user_status rx_user_status[HAL_MAX_UL_MU_USERS]; + struct mon_rx_info rx_info; + struct mon_rx_user_info rx_user_info[HAL_MAX_UL_MU_USERS]; struct hal_rx_msdu_payload_info msdu_info; struct hal_rx_msdu_payload_info fcs_ok_msdu_info; struct hal_rx_nac_info nac_info; diff --git a/hal/wifi3.0/hal_generic_api.h b/hal/wifi3.0/hal_generic_api.h index b42be51751f2..c8c9bc2ab560 100644 --- a/hal/wifi3.0/hal_generic_api.h +++ b/hal/wifi3.0/hal_generic_api.h @@ -310,6 +310,30 @@ hal_rx_populate_mu_user_info(void *rx_tlv, void *ppduinfo, hal_rx_populate_byte_count(rx_tlv, ppdu_info, mon_rx_user_status); } +#ifdef WLAN_TX_PKT_CAPTURE_ENH +static inline void +hal_rx_populate_tx_capture_user_info(void *ppduinfo, + uint32_t user_id) +{ + struct hal_rx_ppdu_info *ppdu_info; + struct mon_rx_info *mon_rx_info; + struct mon_rx_user_info *mon_rx_user_info; + + ppdu_info = (struct hal_rx_ppdu_info *)ppduinfo; + mon_rx_info = &ppdu_info->rx_info; + mon_rx_user_info = &ppdu_info->rx_user_info[user_id]; + mon_rx_user_info->qos_control_info_valid = + mon_rx_info->qos_control_info_valid; + mon_rx_user_info->qos_control = mon_rx_info->qos_control; +} +#else +static inline void +hal_rx_populate_tx_capture_user_info(void *ppduinfo, + uint32_t user_id) +{ +} +#endif + #define HAL_RX_UPDATE_RSSI_PER_CHAIN_BW(chain, word_1, word_2, \ ppdu_info, rssi_info_tlv) \ { \ @@ -357,6 +381,50 @@ hal_rx_update_rssi_chain(struct hal_rx_ppdu_info *ppdu_info, return 0; } +#ifdef WLAN_TX_PKT_CAPTURE_ENH +static inline void +hal_get_qos_control(void *rx_tlv, + struct hal_rx_ppdu_info *ppdu_info) +{ + ppdu_info->rx_info.qos_control_info_valid = + HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_3, + QOS_CONTROL_INFO_VALID); + + if (ppdu_info->rx_info.qos_control_info_valid) + ppdu_info->rx_info.qos_control = + HAL_RX_GET(rx_tlv, + RX_PPDU_END_USER_STATS_5, + QOS_CONTROL_FIELD); +} + +static inline void +hal_get_mac_addr1(uint8_t *rx_mpdu_start, + struct hal_rx_ppdu_info *ppdu_info) +{ + if (ppdu_info->sw_frame_group_id + == HAL_MPDU_SW_FRAME_GROUP_MGMT_PROBE_REQ) { + ppdu_info->rx_info.mac_addr1_valid = + HAL_RX_GET_MAC_ADDR1_VALID(rx_mpdu_start); + + *(uint32_t *)&ppdu_info->rx_info.mac_addr1[0] = + HAL_RX_GET(rx_mpdu_start, + RX_MPDU_INFO_15, + MAC_ADDR_AD1_31_0); + } +} +#else +static inline void +hal_get_qos_control(void *rx_tlv, + struct hal_rx_ppdu_info *ppdu_info) +{ +} + +static inline void +hal_get_mac_addr1(uint8_t *rx_mpdu_start, + struct hal_rx_ppdu_info *ppdu_info) +{ +} +#endif /** * hal_rx_status_get_tlv_info() - process receive info TLV * @rx_tlv_hdr: pointer to TLV header @@ -504,6 +572,8 @@ hal_rx_status_get_tlv_info_generic(void *rx_tlv_hdr, void *ppduinfo, HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_4, FRAME_CONTROL_FIELD); + + hal_get_qos_control(rx_tlv, ppdu_info); } ppdu_info->rx_status.data_sequence_control_info_valid = @@ -564,6 +634,10 @@ hal_rx_status_get_tlv_info_generic(void *rx_tlv_hdr, void *ppduinfo, hal_rx_populate_mu_user_info(rx_tlv, ppdu_info, mon_rx_user_status); + + hal_rx_populate_tx_capture_user_info(ppdu_info, + user_id); + } break; } @@ -1392,6 +1466,9 @@ hal_rx_status_get_tlv_info_generic(void *rx_tlv_hdr, void *ppduinfo, ppdu_info->nac_info.frame_control; } + hal_get_mac_addr1(rx_mpdu_start, + ppdu_info); + ppdu_info->nac_info.mac_addr2_valid = HAL_RX_GET_MAC_ADDR2_VALID(rx_mpdu_start); diff --git a/hal/wifi3.0/hal_rx.h b/hal/wifi3.0/hal_rx.h index 2f8277b17253..b6228c3db520 100644 --- a/hal/wifi3.0/hal_rx.h +++ b/hal/wifi3.0/hal_rx.h @@ -1137,7 +1137,9 @@ hal_rx_msdu_start_toeplitz_get(uint8_t *buf) * @ HAL_MPDU_SW_FRAME_GROUP_UNICAST_DATA: unicast data frame * @ HAL_MPDU_SW_FRAME_GROUP_NULL_DATA: NULL data frame * @ HAL_MPDU_SW_FRAME_GROUP_MGMT: management frame + * @ HAL_MPDU_SW_FRAME_GROUP_MGMT_PROBE_REQ: probe req frame * @ HAL_MPDU_SW_FRAME_GROUP_CTRL: control frame + * @ HAL_MPDU_SW_FRAME_GROUP_CTRL_BAR: BAR frame * @ HAL_MPDU_SW_FRAME_GROUP_UNSUPPORTED: unsupported * @ HAL_MPDU_SW_FRAME_GROUP_MAX: max limit */ @@ -1147,8 +1149,10 @@ enum hal_rx_mpdu_info_sw_frame_group_id_type { HAL_MPDU_SW_FRAME_GROUP_UNICAST_DATA, HAL_MPDU_SW_FRAME_GROUP_NULL_DATA, HAL_MPDU_SW_FRAME_GROUP_MGMT, + HAL_MPDU_SW_FRAME_GROUP_MGMT_PROBE_REQ = 8, HAL_MPDU_SW_FRAME_GROUP_MGMT_BEACON = 12, HAL_MPDU_SW_FRAME_GROUP_CTRL = 20, + HAL_MPDU_SW_FRAME_GROUP_CTRL_BAR = 28, HAL_MPDU_SW_FRAME_GROUP_UNSUPPORTED = 36, HAL_MPDU_SW_FRAME_GROUP_MAX = 37, }; diff --git a/hal/wifi3.0/qca6290/hal_6290_rx.h b/hal/wifi3.0/qca6290/hal_6290_rx.h index 5ad1241fa815..9417cf728f59 100644 --- a/hal/wifi3.0/qca6290/hal_6290_rx.h +++ b/hal/wifi3.0/qca6290/hal_6290_rx.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016-2019 The Linux Foundation. All rights reserved. + * Copyright (c) 2016-2020 The Linux Foundation. All rights reserved. * * Permission to use, copy, modify, and/or distribute this software for * any purpose with or without fee is hereby granted, provided that the @@ -255,6 +255,9 @@ #define HAL_RX_GET_TO_DS_FLAG(rx_mpdu_start) \ HAL_RX_GET(rx_mpdu_start, RX_MPDU_INFO_2, TO_DS) +#define HAL_RX_GET_MAC_ADDR1_VALID(rx_mpdu_start) \ + HAL_RX_GET(rx_mpdu_start, RX_MPDU_INFO_2, MAC_ADDR_AD1_VALID) + #define HAL_RX_GET_MAC_ADDR2_VALID(rx_mpdu_start) \ HAL_RX_GET(rx_mpdu_start, RX_MPDU_INFO_2, MAC_ADDR_AD2_VALID) diff --git a/hal/wifi3.0/qca6390/hal_6390_rx.h b/hal/wifi3.0/qca6390/hal_6390_rx.h index b8f1bd5b245e..5786948aad09 100644 --- a/hal/wifi3.0/qca6390/hal_6390_rx.h +++ b/hal/wifi3.0/qca6390/hal_6390_rx.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016-2019 The Linux Foundation. All rights reserved. + * Copyright (c) 2016-2020 The Linux Foundation. All rights reserved. * * Permission to use, copy, modify, and/or distribute this software for * any purpose with or without fee is hereby granted, provided that the @@ -261,6 +261,9 @@ #define HAL_RX_GET_TO_DS_FLAG(rx_mpdu_start) \ HAL_RX_GET(rx_mpdu_start, RX_MPDU_INFO_2, TO_DS) +#define HAL_RX_GET_MAC_ADDR1_VALID(rx_mpdu_start) \ + HAL_RX_GET(rx_mpdu_start, RX_MPDU_INFO_2, MAC_ADDR_AD1_VALID) + #define HAL_RX_GET_MAC_ADDR2_VALID(rx_mpdu_start) \ HAL_RX_GET(rx_mpdu_start, RX_MPDU_INFO_2, MAC_ADDR_AD2_VALID) diff --git a/hal/wifi3.0/qca6490/hal_6490_rx.h b/hal/wifi3.0/qca6490/hal_6490_rx.h index 5e565f397d21..e7ae7e78f701 100644 --- a/hal/wifi3.0/qca6490/hal_6490_rx.h +++ b/hal/wifi3.0/qca6490/hal_6490_rx.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019 The Linux Foundation. All rights reserved. + * Copyright (c) 2019-2020 The Linux Foundation. All rights reserved. * * Permission to use, copy, modify, and/or distribute this software for * any purpose with or without fee is hereby granted, provided that the @@ -264,6 +264,9 @@ #define HAL_RX_GET_TO_DS_FLAG(rx_mpdu_start) \ HAL_RX_GET(rx_mpdu_start, RX_MPDU_INFO_11, TO_DS) +#define HAL_RX_GET_MAC_ADDR1_VALID(rx_mpdu_start) \ + HAL_RX_GET(rx_mpdu_start, RX_MPDU_INFO_11, MAC_ADDR_AD1_VALID) + #define HAL_RX_GET_MAC_ADDR2_VALID(rx_mpdu_start) \ HAL_RX_GET(rx_mpdu_start, RX_MPDU_INFO_11, MAC_ADDR_AD2_VALID) diff --git a/hal/wifi3.0/qca6750/hal_6750_rx.h b/hal/wifi3.0/qca6750/hal_6750_rx.h index 4e1be34d092b..cad936681f90 100644 --- a/hal/wifi3.0/qca6750/hal_6750_rx.h +++ b/hal/wifi3.0/qca6750/hal_6750_rx.h @@ -264,6 +264,9 @@ #define HAL_RX_GET_TO_DS_FLAG(rx_mpdu_start) \ HAL_RX_GET(rx_mpdu_start, RX_MPDU_INFO_11, TO_DS) +#define HAL_RX_GET_MAC_ADDR1_VALID(rx_mpdu_start) \ + HAL_RX_GET(rx_mpdu_start, RX_MPDU_INFO_11, MAC_ADDR_AD1_VALID) + #define HAL_RX_GET_MAC_ADDR2_VALID(rx_mpdu_start) \ HAL_RX_GET(rx_mpdu_start, RX_MPDU_INFO_11, MAC_ADDR_AD2_VALID) diff --git a/hal/wifi3.0/qca8074v1/hal_8074v1_rx.h b/hal/wifi3.0/qca8074v1/hal_8074v1_rx.h index 00941fd31a26..6df3e2d79928 100644 --- a/hal/wifi3.0/qca8074v1/hal_8074v1_rx.h +++ b/hal/wifi3.0/qca8074v1/hal_8074v1_rx.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016-2019 The Linux Foundation. All rights reserved. + * Copyright (c) 2016-2020 The Linux Foundation. All rights reserved. * * Permission to use, copy, modify, and/or distribute this software for * any purpose with or without fee is hereby granted, provided that the @@ -244,6 +244,9 @@ #define HAL_RX_GET_TO_DS_FLAG(rx_mpdu_start) \ HAL_RX_GET(rx_mpdu_start, RX_MPDU_INFO_2, TO_DS) +#define HAL_RX_GET_MAC_ADDR1_VALID(rx_mpdu_start) \ + HAL_RX_GET(rx_mpdu_start, RX_MPDU_INFO_2, MAC_ADDR_AD1_VALID) + #define HAL_RX_GET_MAC_ADDR2_VALID(rx_mpdu_start) \ HAL_RX_GET(rx_mpdu_start, RX_MPDU_INFO_2, MAC_ADDR_AD2_VALID) diff --git a/hal/wifi3.0/qca8074v2/hal_8074v2_rx.h b/hal/wifi3.0/qca8074v2/hal_8074v2_rx.h index 502808ecb591..8ceae3823277 100644 --- a/hal/wifi3.0/qca8074v2/hal_8074v2_rx.h +++ b/hal/wifi3.0/qca8074v2/hal_8074v2_rx.h @@ -253,6 +253,9 @@ #define HAL_RX_GET_TO_DS_FLAG(rx_mpdu_start) \ HAL_RX_GET(rx_mpdu_start, RX_MPDU_INFO_2, TO_DS) +#define HAL_RX_GET_MAC_ADDR1_VALID(rx_mpdu_start) \ + HAL_RX_GET(rx_mpdu_start, RX_MPDU_INFO_2, MAC_ADDR_AD1_VALID) + #define HAL_RX_GET_MAC_ADDR2_VALID(rx_mpdu_start) \ HAL_RX_GET(rx_mpdu_start, RX_MPDU_INFO_2, MAC_ADDR_AD2_VALID) diff --git a/hal/wifi3.0/qcn9000/hal_9000_rx.h b/hal/wifi3.0/qcn9000/hal_9000_rx.h index 4d36fe633eb5..45528561301e 100644 --- a/hal/wifi3.0/qcn9000/hal_9000_rx.h +++ b/hal/wifi3.0/qcn9000/hal_9000_rx.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016-2019 The Linux Foundation. All rights reserved. + * Copyright (c) 2016-2020 The Linux Foundation. All rights reserved. * * Permission to use, copy, modify, and/or distribute this software for * any purpose with or without fee is hereby granted, provided that the @@ -38,6 +38,9 @@ #define HAL_RX_GET_TO_DS_FLAG(rx_mpdu_start) \ HAL_RX_GET(rx_mpdu_start, RX_MPDU_INFO_11, TO_DS) +#define HAL_RX_GET_MAC_ADDR1_VALID(rx_mpdu_start) \ + HAL_RX_GET(rx_mpdu_start, RX_MPDU_INFO_11, MAC_ADDR_AD1_VALID) + #define HAL_RX_GET_MAC_ADDR2_VALID(rx_mpdu_start) \ HAL_RX_GET(rx_mpdu_start, RX_MPDU_INFO_11, MAC_ADDR_AD2_VALID)