From b8e9bcdf4c143e0534818942abc92827ab7a04b9 Mon Sep 17 00:00:00 2001 From: Amir Patel Date: Tue, 11 Feb 2020 00:25:29 +0530 Subject: [PATCH] qcacmn: Read ppdu_id from reo_entrance ring For qcn9000, As part HW enhancements, PPDU_ID is sent in reo_entrance_ring descriptor instead of RX_MPDU_START tlv. Add support to read ppdu id from descriptor. Modify existing hal API hal_rx_hw_desc_get_ppduid_get () arguments to pass RxDMA ring HW descriptor. Usage: a. Use hal_rx_hw_desc_get_ppduid_get () - to get ppdu id from rx_tlv_hdr or hw descriptor based on target. for qcn9000, this API gets ppdu_id from HW descriptor, for other platforms, gets ppdu_id from rx_tv_hdr b. Use hal_rx_get_ppdu_id () - to get ppdu_id from rx_tlv_hdr Change-Id: I5838227c12cde50cbb2a9da7a0d8056b8b9b7ef5 --- dp/wifi3.0/dp_rx_err.c | 4 +-- dp/wifi3.0/dp_rx_mon_dest.c | 8 +++--- hal/wifi3.0/hal_internal.h | 4 ++- hal/wifi3.0/hal_rx.h | 30 +++++++++++++++++++--- hal/wifi3.0/qca6290/hal_6290.c | 8 +++--- hal/wifi3.0/qca6390/hal_6390.c | 8 +++--- hal/wifi3.0/qca6490/hal_6490.c | 8 +++--- hal/wifi3.0/qca8074v1/hal_8074v1.c | 36 +++++++++++++++++++++++--- hal/wifi3.0/qca8074v2/hal_8074v2.c | 35 ++++++++++++++++++++++--- hal/wifi3.0/qcn9000/hal_9000.c | 41 +++++++++++++++++++++++------- 10 files changed, 146 insertions(+), 36 deletions(-) diff --git a/dp/wifi3.0/dp_rx_err.c b/dp/wifi3.0/dp_rx_err.c index 1a3abb9506..87846322e4 100644 --- a/dp/wifi3.0/dp_rx_err.c +++ b/dp/wifi3.0/dp_rx_err.c @@ -447,8 +447,8 @@ dp_rx_chain_msdus(struct dp_soc *soc, qdf_nbuf_t nbuf, QDF_NBUF_CB_RX_NUM_ELEMENTS_IN_LIST (dp_pdev->invalid_peer_head_msdu) >= DP_MAX_INVALID_BUFFERS)) { qdf_nbuf_set_rx_chfrag_start(nbuf, 1); - dp_pdev->ppdu_id = hal_rx_hw_desc_get_ppduid_get(soc->hal_soc, - rx_tlv_hdr); + dp_pdev->ppdu_id = hal_rx_get_ppdu_id(soc->hal_soc, + rx_tlv_hdr); dp_pdev->first_nbuf = true; /* If the new nbuf received is the first msdu of the diff --git a/dp/wifi3.0/dp_rx_mon_dest.c b/dp/wifi3.0/dp_rx_mon_dest.c index 0b46146cd7..c497d28fc5 100644 --- a/dp/wifi3.0/dp_rx_mon_dest.c +++ b/dp/wifi3.0/dp_rx_mon_dest.c @@ -371,8 +371,9 @@ dp_rx_mon_mpdu_pop(struct dp_soc *soc, uint32_t mac_id, __func__, i, *ppdu_id, num_msdus); if (is_first_msdu) { - if (!HAL_RX_HW_DESC_MPDU_VALID( - rx_desc_tlv)) { + if (!hal_rx_mpdu_start_tlv_tag_valid( + soc->hal_soc, + rx_desc_tlv)) { drop_mpdu = true; qdf_nbuf_free(msdu); msdu = NULL; @@ -383,7 +384,8 @@ dp_rx_mon_mpdu_pop(struct dp_soc *soc, uint32_t mac_id, msdu_ppdu_id = hal_rx_hw_desc_get_ppduid_get( soc->hal_soc, - rx_desc_tlv); + rx_desc_tlv, + rxdma_dst_ring_desc); is_first_msdu = false; QDF_TRACE(QDF_MODULE_ID_DP, diff --git a/hal/wifi3.0/hal_internal.h b/hal/wifi3.0/hal_internal.h index d2ec603405..8e7a36f7dc 100644 --- a/hal/wifi3.0/hal_internal.h +++ b/hal/wifi3.0/hal_internal.h @@ -432,7 +432,8 @@ struct hal_hw_txrx_ops { uint8_t (*hal_rx_get_mpdu_sequence_control_valid)(uint8_t *buf); bool (*hal_rx_is_unicast)(uint8_t *buf); uint32_t (*hal_rx_tid_get)(hal_soc_handle_t hal_soc_hdl, uint8_t *buf); - uint32_t (*hal_rx_hw_desc_get_ppduid_get)(void *hw_desc_addr); + uint32_t (*hal_rx_hw_desc_get_ppduid_get)(void *rx_tlv_hdr, + void *rxdma_dst_ring_desc); uint32_t (*hal_rx_mpdu_start_mpdu_qos_control_valid_get)(uint8_t *buf); uint32_t (*hal_rx_msdu_end_sa_sw_peer_id_get)(uint8_t *buf); void * (*hal_rx_msdu0_buffer_addr_lsb)(void *link_desc_addr); @@ -470,6 +471,7 @@ struct hal_hw_txrx_ops { bool (*hal_rx_get_fisa_flow_agg_continuation)(uint8_t *buf); uint8_t (*hal_rx_get_fisa_flow_agg_count)(uint8_t *buf); bool (*hal_rx_get_fisa_timeout)(uint8_t *buf); + uint8_t (*hal_rx_mpdu_start_tlv_tag_valid)(void *rx_tlv_hdr); }; /** diff --git a/hal/wifi3.0/hal_rx.h b/hal/wifi3.0/hal_rx.h index c239b7a1d3..f5c413e695 100644 --- a/hal/wifi3.0/hal_rx.h +++ b/hal/wifi3.0/hal_rx.h @@ -3243,17 +3243,20 @@ hal_rx_msdu_flow_idx_invalid(hal_soc_handle_t hal_soc_hdl, /** * hal_rx_hw_desc_get_ppduid_get() - Retrieve ppdu id * @hal_soc_hdl: hal_soc handle - * @hw_desc_addr: hardware descriptor address + * @rx_tlv_hdr: Rx_tlv_hdr + * @rxdma_dst_ring_desc: Rx HW descriptor * - * Return: 0 - success/ non-zero failure + * Return: ppdu id */ static inline uint32_t hal_rx_hw_desc_get_ppduid_get(hal_soc_handle_t hal_soc_hdl, - void *hw_desc_addr) + void *rx_tlv_hdr, + void *rxdma_dst_ring_desc) { struct hal_soc *hal_soc = (struct hal_soc *)hal_soc_hdl; - return hal_soc->ops->hal_rx_hw_desc_get_ppduid_get(hw_desc_addr); + return hal_soc->ops->hal_rx_hw_desc_get_ppduid_get(rx_tlv_hdr, + rxdma_dst_ring_desc); } /** @@ -3616,4 +3619,23 @@ hal_rx_get_fisa_timeout(hal_soc_handle_t hal_soc_hdl, uint8_t *buf) return 0; } + +/** + * hal_rx_mpdu_start_tlv_tag_valid - API to check if RX_MPDU_START tlv + * tag is valid + * + * @hal_soc_hdl: HAL SOC handle + * @rx_tlv_hdr: start address of rx_pkt_tlvs + * + * Return: true if RX_MPDU_START tlv tag is valid, else false + */ + +static inline uint8_t +hal_rx_mpdu_start_tlv_tag_valid(hal_soc_handle_t hal_soc_hdl, + void *rx_tlv_hdr) +{ + struct hal_soc *hal = (struct hal_soc *)hal_soc_hdl; + + return hal->ops->hal_rx_mpdu_start_tlv_tag_valid(rx_tlv_hdr); +} #endif /* _HAL_RX_H */ diff --git a/hal/wifi3.0/qca6290/hal_6290.c b/hal/wifi3.0/qca6290/hal_6290.c index 822a7a9b22..bcc76f9e4e 100644 --- a/hal/wifi3.0/qca6290/hal_6290.c +++ b/hal/wifi3.0/qca6290/hal_6290.c @@ -595,14 +595,16 @@ static uint32_t hal_rx_tid_get_6290(hal_soc_handle_t hal_soc_hdl, uint8_t *buf) /** * hal_rx_hw_desc_get_ppduid_get_6290(): retrieve ppdu id - * @hw_desc_addr: hw addr + * @rx_tlv_hdr: start address of rx_pkt_tlvs + * @rxdma_dst_ring_desc: Rx HW descriptor * * Return: ppdu id */ -static uint32_t hal_rx_hw_desc_get_ppduid_get_6290(void *hw_desc_addr) +static uint32_t hal_rx_hw_desc_get_ppduid_get_6290(void *rx_tlv_hdr, + void *rxdma_dst_ring_desc) { struct rx_mpdu_info *rx_mpdu_info; - struct rx_pkt_tlvs *rx_desc = (struct rx_pkt_tlvs *)hw_desc_addr; + struct rx_pkt_tlvs *rx_desc = (struct rx_pkt_tlvs *)rx_tlv_hdr; rx_mpdu_info = &rx_desc->mpdu_start_tlv.rx_mpdu_start.rx_mpdu_info_details; diff --git a/hal/wifi3.0/qca6390/hal_6390.c b/hal/wifi3.0/qca6390/hal_6390.c index 4e52c193f5..bc7ffb9d3a 100644 --- a/hal/wifi3.0/qca6390/hal_6390.c +++ b/hal/wifi3.0/qca6390/hal_6390.c @@ -593,14 +593,16 @@ static uint32_t hal_rx_tid_get_6390(hal_soc_handle_t hal_soc_hdl, uint8_t *buf) /** * hal_rx_hw_desc_get_ppduid_get_6390(): retrieve ppdu id - * @hw_desc_addr: hw addr + * @rx_tlv_hdr: start address of rx_pkt_tlvs + * @rxdma_dst_ring_desc: Rx HW descriptor * * Return: ppdu id */ -static uint32_t hal_rx_hw_desc_get_ppduid_get_6390(void *hw_desc_addr) +static uint32_t hal_rx_hw_desc_get_ppduid_get_6390(void *rx_tlv_hdr, + void *rxdma_dst_ring_desc) { struct rx_mpdu_info *rx_mpdu_info; - struct rx_pkt_tlvs *rx_desc = (struct rx_pkt_tlvs *)hw_desc_addr; + struct rx_pkt_tlvs *rx_desc = (struct rx_pkt_tlvs *)rx_tlv_hdr; rx_mpdu_info = &rx_desc->mpdu_start_tlv.rx_mpdu_start.rx_mpdu_info_details; diff --git a/hal/wifi3.0/qca6490/hal_6490.c b/hal/wifi3.0/qca6490/hal_6490.c index 36a8bd314f..86c9f2007c 100644 --- a/hal/wifi3.0/qca6490/hal_6490.c +++ b/hal/wifi3.0/qca6490/hal_6490.c @@ -973,14 +973,16 @@ static uint32_t hal_rx_tid_get_6490(hal_soc_handle_t hal_soc_hdl, uint8_t *buf) /** * hal_rx_hw_desc_get_ppduid_get_6490(): retrieve ppdu id - * @hw_desc_addr: hw addr + * @rx_tlv_hdr: start address of rx_pkt_tlvs + * @rxdma_dst_ring_desc: Rx HW descriptor * * Return: ppdu id */ -static uint32_t hal_rx_hw_desc_get_ppduid_get_6490(void *hw_desc_addr) +static uint32_t hal_rx_hw_desc_get_ppduid_get_6490(void *rx_tlv_hdr, + void *rxdma_dst_ring_desc) { struct rx_mpdu_info *rx_mpdu_info; - struct rx_pkt_tlvs *rx_desc = (struct rx_pkt_tlvs *)hw_desc_addr; + struct rx_pkt_tlvs *rx_desc = (struct rx_pkt_tlvs *)rx_tlv_hdr; rx_mpdu_info = &rx_desc->mpdu_start_tlv.rx_mpdu_start.rx_mpdu_info_details; diff --git a/hal/wifi3.0/qca8074v1/hal_8074v1.c b/hal/wifi3.0/qca8074v1/hal_8074v1.c index 8e26a2924c..c9ec638212 100644 --- a/hal/wifi3.0/qca8074v1/hal_8074v1.c +++ b/hal/wifi3.0/qca8074v1/hal_8074v1.c @@ -603,14 +603,16 @@ static uint32_t hal_rx_tid_get_8074v1(hal_soc_handle_t hal_soc_hdl, /** * hal_rx_hw_desc_get_ppduid_get_8074v1(): retrieve ppdu id - * @hw_desc_addr: hw addr + * @rx_tlv_hdr: Rx tlv header + * @rxdma_dst_ring_desc: Rx HW descriptor * * Return: ppdu id */ -static uint32_t hal_rx_hw_desc_get_ppduid_get_8074v1(void *hw_desc_addr) +static uint32_t hal_rx_hw_desc_get_ppduid_get_8074v1(void *rx_tlv_hdr, + void *rxdma_dst_ring_desc) { struct rx_mpdu_info *rx_mpdu_info; - struct rx_pkt_tlvs *rx_desc = (struct rx_pkt_tlvs *)hw_desc_addr; + struct rx_pkt_tlvs *rx_desc = (struct rx_pkt_tlvs *)rx_tlv_hdr; rx_mpdu_info = &rx_desc->mpdu_start_tlv.rx_mpdu_start.rx_mpdu_info_details; @@ -815,7 +817,13 @@ static uint8_t hal_rx_get_filter_category_8074v1(uint8_t *buf) static uint32_t hal_rx_get_ppdu_id_8074v1(uint8_t *buf) { - return HAL_RX_GET_PPDU_ID(buf); + struct rx_mpdu_info *rx_mpdu_info; + struct rx_pkt_tlvs *rx_desc = (struct rx_pkt_tlvs *)buf; + + rx_mpdu_info = + &rx_desc->mpdu_start_tlv.rx_mpdu_start.rx_mpdu_info_details; + + return HAL_RX_GET_PPDU_ID(rx_mpdu_info); } /** @@ -985,6 +993,25 @@ uint16_t hal_rx_get_rx_sequence_8074v1(uint8_t *buf) return HAL_RX_MPDU_GET_SEQUENCE_NUMBER(rx_mpdu_info); } +/** + * hal_rx_mpdu_start_tlv_tag_valid_8074v1 () - API to check if RX_MPDU_START + * tlv tag is valid + * + * @rx_tlv_hdr: start address of rx_pkt_tlvs + * + * Return: true if RX_MPDU_START is valied, else false. + */ +uint8_t hal_rx_mpdu_start_tlv_tag_valid_8074v1(void *rx_tlv_hdr) +{ + struct rx_pkt_tlvs *rx_desc = (struct rx_pkt_tlvs *)rx_tlv_hdr; + uint32_t tlv_tag; + + tlv_tag = HAL_RX_GET_USER_TLV32_TYPE( + &rx_desc->mpdu_start_tlv); + + return tlv_tag == WIFIRX_MPDU_START_E ? true : false; +} + struct hal_hw_txrx_ops qca8074_hal_hw_txrx_ops = { /* init and setup */ @@ -1083,6 +1110,7 @@ struct hal_hw_txrx_ops qca8074_hal_hw_txrx_ops = { NULL, NULL, NULL, + hal_rx_mpdu_start_tlv_tag_valid_8074v1, }; struct hal_hw_srng_config hw_srng_table_8074[] = { diff --git a/hal/wifi3.0/qca8074v2/hal_8074v2.c b/hal/wifi3.0/qca8074v2/hal_8074v2.c index b19d1dd682..0393c201ef 100644 --- a/hal/wifi3.0/qca8074v2/hal_8074v2.c +++ b/hal/wifi3.0/qca8074v2/hal_8074v2.c @@ -588,14 +588,16 @@ static uint32_t hal_rx_tid_get_8074v2(hal_soc_handle_t hal_soc_hdl, /** * hal_rx_hw_desc_get_ppduid_get_8074v2(): retrieve ppdu id - * @hw_desc_addr: hw addr + * @rx_tlv_hdr: packtet rx tlv header + * @rxdma_dst_ring_desc: rxdma HW descriptor * * Return: ppdu id */ -static uint32_t hal_rx_hw_desc_get_ppduid_get_8074v2(void *hw_desc_addr) +static uint32_t hal_rx_hw_desc_get_ppduid_get_8074v2(void *rx_tlv_hdr, + void *rxdma_dst_ring_desc) { struct rx_mpdu_info *rx_mpdu_info; - struct rx_pkt_tlvs *rx_desc = (struct rx_pkt_tlvs *)hw_desc_addr; + struct rx_pkt_tlvs *rx_desc = (struct rx_pkt_tlvs *)rx_tlv_hdr; rx_mpdu_info = &rx_desc->mpdu_start_tlv.rx_mpdu_start.rx_mpdu_info_details; @@ -800,7 +802,13 @@ static uint8_t hal_rx_get_filter_category_8074v2(uint8_t *buf) static uint32_t hal_rx_get_ppdu_id_8074v2(uint8_t *buf) { - return HAL_RX_GET_PPDU_ID(buf); + struct rx_mpdu_info *rx_mpdu_info; + struct rx_pkt_tlvs *rx_desc = (struct rx_pkt_tlvs *)buf; + + rx_mpdu_info = + &rx_desc->mpdu_start_tlv.rx_mpdu_start.rx_mpdu_info_details; + + return HAL_RX_GET_PPDU_ID(rx_mpdu_info); } /** @@ -983,6 +991,24 @@ static inline qdf_iomem_t hal_get_window_address_8074v2(struct hal_soc *hal_soc, return addr; } +/** + * hal_rx_mpdu_start_tlv_tag_valid_8074v2 () - API to check if RX_MPDU_START + * tlv tag is valid + * + * @rx_tlv_hdr: start address of rx_pkt_tlvs + * + * Return: true if RX_MPDU_START is valied, else false. + */ +uint8_t hal_rx_mpdu_start_tlv_tag_valid_8074v2(void *rx_tlv_hdr) +{ + struct rx_pkt_tlvs *rx_desc = (struct rx_pkt_tlvs *)rx_tlv_hdr; + uint32_t tlv_tag; + + tlv_tag = HAL_RX_GET_USER_TLV32_TYPE(&rx_desc->mpdu_start_tlv); + + return tlv_tag == WIFIRX_MPDU_START_E ? true : false; +} + struct hal_hw_txrx_ops qca8074v2_hal_hw_txrx_ops = { /* init and setup */ @@ -1088,6 +1114,7 @@ struct hal_hw_txrx_ops qca8074v2_hal_hw_txrx_ops = { NULL, NULL, NULL, + hal_rx_mpdu_start_tlv_tag_valid_8074v2, }; struct hal_hw_srng_config hw_srng_table_8074v2[] = { diff --git a/hal/wifi3.0/qcn9000/hal_9000.c b/hal/wifi3.0/qcn9000/hal_9000.c index cca448de5f..0381e2ccdc 100644 --- a/hal/wifi3.0/qcn9000/hal_9000.c +++ b/hal/wifi3.0/qcn9000/hal_9000.c @@ -193,6 +193,24 @@ static uint8_t hal_rx_get_tlv_9000(void *rx_tlv) return HAL_RX_GET(rx_tlv, PHYRX_RSSI_LEGACY_0, RECEIVE_BANDWIDTH); } +/** + * hal_rx_mpdu_start_tlv_tag_valid_9000 () - API to check if RX_MPDU_START + * tlv tag is valid + * + *@rx_tlv_hdr: start address of rx_pkt_tlvs + * + * Return: true if RX_MPDU_START is valied, else false. + */ +uint8_t hal_rx_mpdu_start_tlv_tag_valid_9000(void *rx_tlv_hdr) +{ + struct rx_pkt_tlvs *rx_desc = (struct rx_pkt_tlvs *)rx_tlv_hdr; + uint32_t tlv_tag; + + tlv_tag = HAL_RX_GET_USER_TLV32_TYPE(&rx_desc->mpdu_start_tlv); + + return tlv_tag == WIFIRX_MPDU_START_E ? true : false; +} + /** * hal_rx_proc_phyrx_other_receive_info_tlv_9000(): API to get tlv info * @@ -918,19 +936,17 @@ static uint32_t hal_rx_tid_get_9000(hal_soc_handle_t hal_soc_hdl, uint8_t *buf) /** * hal_rx_hw_desc_get_ppduid_get_9000(): retrieve ppdu id - * @hw_desc_addr: hw addr + * @rx_tlv_hdr: rx tlv header + * @rxdma_dst_ring_desc: rxdma HW descriptor * * Return: ppdu id */ -static uint32_t hal_rx_hw_desc_get_ppduid_get_9000(void *hw_desc_addr) +static uint32_t hal_rx_hw_desc_get_ppduid_get_9000(void *rx_tlv_hdr, + void *rxdma_dst_ring_desc) { - struct rx_mpdu_info *rx_mpdu_info; - struct rx_pkt_tlvs *rx_desc = (struct rx_pkt_tlvs *)hw_desc_addr; + struct reo_entrance_ring *reo_ent = rxdma_dst_ring_desc; - rx_mpdu_info = - &rx_desc->mpdu_start_tlv.rx_mpdu_start.rx_mpdu_info_details; - - return HAL_RX_GET(rx_mpdu_info, RX_MPDU_INFO_9, PHY_PPDU_ID); + return reo_ent->phy_ppdu_id; } /** @@ -1130,7 +1146,13 @@ static uint8_t hal_rx_get_filter_category_9000(uint8_t *buf) static uint32_t hal_rx_get_ppdu_id_9000(uint8_t *buf) { - return HAL_RX_GET_PPDU_ID(buf); + struct rx_mpdu_info *rx_mpdu_info; + struct rx_pkt_tlvs *rx_desc = (struct rx_pkt_tlvs *)buf; + + rx_mpdu_info = + &rx_desc->mpdu_start_tlv.rx_mpdu_start.rx_mpdu_info_details; + + return HAL_RX_GET_PPDU_ID(rx_mpdu_info); } /** @@ -1466,6 +1488,7 @@ struct hal_hw_txrx_ops qcn9000_hal_hw_txrx_ops = { NULL, NULL, NULL, + hal_rx_mpdu_start_tlv_tag_valid_9000, }; struct hal_hw_srng_config hw_srng_table_9000[] = {