diff --git a/dp/wifi3.0/dp_rx_err.c b/dp/wifi3.0/dp_rx_err.c index c639cfb03b..62c3a41670 100644 --- a/dp/wifi3.0/dp_rx_err.c +++ b/dp/wifi3.0/dp_rx_err.c @@ -2665,6 +2665,7 @@ dp_rx_wbm_err_process(struct dp_intr *int_ctx, struct dp_soc *soc, struct dp_srng *dp_rxdma_srng; struct rx_desc_pool *rx_desc_pool; uint8_t *rx_tlv_hdr; + bool is_tkip_mic_err; qdf_nbuf_t nbuf_head = NULL; qdf_nbuf_t nbuf_tail = NULL; qdf_nbuf_t nbuf, next; @@ -3062,6 +3063,20 @@ done: break; case HAL_RXDMA_ERR_DECRYPT: + /* All the TKIP-MIC failures are treated as Decrypt Errors + * for QCN9224 Targets + */ + is_tkip_mic_err = hal_rx_msdu_end_is_tkip_mic_err(hal_soc, rx_tlv_hdr); + + if (is_tkip_mic_err && txrx_peer) { + dp_rx_process_mic_error(soc, nbuf, + rx_tlv_hdr, + txrx_peer); + DP_PEER_PER_PKT_STATS_INC(txrx_peer, + rx.err.mic_err, + 1); + break; + } if (txrx_peer) { DP_PEER_PER_PKT_STATS_INC(txrx_peer, diff --git a/hal/wifi3.0/be/hal_be_rx_tlv.h b/hal/wifi3.0/be/hal_be_rx_tlv.h index d728ecc443..4bf6fb1852 100644 --- a/hal/wifi3.0/be/hal_be_rx_tlv.h +++ b/hal/wifi3.0/be/hal_be_rx_tlv.h @@ -274,6 +274,9 @@ struct rx_pkt_tlvs { #define HAL_RX_TLV_DA_IS_MCBC_GET(_rx_pkt_tlv) \ HAL_RX_MSDU_END(_rx_pkt_tlv).da_is_mcbc +#define HAL_RX_TLV_IS_TKIP_MIC_ERR_GET(_rx_pkt_tlv) \ + HAL_RX_MSDU_END(_rx_pkt_tlv).tkip_mic_err + #define HAL_RX_TLV_SA_IS_VALID_GET(_rx_pkt_tlv) \ HAL_RX_MSDU_END(_rx_pkt_tlv).sa_is_valid @@ -963,6 +966,21 @@ hal_rx_tlv_da_is_mcbc_get_be(uint8_t *buf) return HAL_RX_TLV_DA_IS_MCBC_GET(rx_pkt_tlvs); } +/** + * hal_rx_tlv_is_tkip_mic_err_get_be(): API to get tkip Mic error + * from rx_msdu_end TLV + * + * @ buf: pointer to the start of RX PKT TLV headers + * Return: tkip_mic_err + */ +static inline uint8_t +hal_rx_tlv_is_tkip_mic_err_get_be(uint8_t *buf) +{ + struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf; + + return HAL_RX_TLV_IS_TKIP_MIC_ERR_GET(rx_pkt_tlvs); +} + /** * hal_rx_tlvd_sa_is_valid_get_be(): API to get the sa_is_valid bit from * rx_msdu_end TLV diff --git a/hal/wifi3.0/hal_internal.h b/hal/wifi3.0/hal_internal.h index 68f6166ab9..260cdcdc39 100644 --- a/hal/wifi3.0/hal_internal.h +++ b/hal/wifi3.0/hal_internal.h @@ -840,6 +840,7 @@ struct hal_hw_txrx_ops { /* rx */ uint8_t (*hal_rx_get_rx_fragment_number)(uint8_t *buf); uint8_t (*hal_rx_msdu_end_da_is_mcbc_get)(uint8_t *buf); + uint8_t (*hal_rx_msdu_end_is_tkip_mic_err)(uint8_t *buf); uint8_t (*hal_rx_msdu_end_sa_is_valid_get)(uint8_t *buf); uint16_t (*hal_rx_msdu_end_sa_idx_get)(uint8_t *buf); uint32_t (*hal_rx_desc_is_first_msdu)(void *hw_desc_addr); diff --git a/hal/wifi3.0/hal_rx.h b/hal/wifi3.0/hal_rx.h index ee9bb72ea3..6ee8402e82 100644 --- a/hal/wifi3.0/hal_rx.h +++ b/hal/wifi3.0/hal_rx.h @@ -1124,6 +1124,26 @@ hal_rx_msdu_end_da_is_mcbc_get(hal_soc_handle_t hal_soc_hdl, uint8_t *buf) return hal_soc->ops->hal_rx_msdu_end_da_is_mcbc_get(buf); } +/** + * hal_rx_msdu_end_is_tkip_mic_err: API to check if pkt has mic error + * from rx_msdu_end TLV + * + * @buf: pointer to the start of RX PKT TLV headers + * + * Return: tkip_mic_err + */ +static inline uint8_t +hal_rx_msdu_end_is_tkip_mic_err(hal_soc_handle_t hal_soc_hdl, + uint8_t *buf) +{ + struct hal_soc *hal_soc = (struct hal_soc *)hal_soc_hdl; + + if (hal_soc->ops->hal_rx_msdu_end_is_tkip_mic_err) + return hal_soc->ops->hal_rx_msdu_end_is_tkip_mic_err(buf); + else + return 0; +} + /** * hal_rx_msdu_end_first_msdu_get: API to get first msdu status * from rx_msdu_end TLV diff --git a/hal/wifi3.0/qcn9224/hal_9224.c b/hal/wifi3.0/qcn9224/hal_9224.c index 1b72de834a..f1103d8837 100644 --- a/hal/wifi3.0/qcn9224/hal_9224.c +++ b/hal/wifi3.0/qcn9224/hal_9224.c @@ -985,6 +985,7 @@ static void hal_rx_dump_msdu_end_tlv_9224(void *msduend, "sa_is_valid: %d " "da_is_valid: %d " "da_is_mcbc: %d " + "tkip_mic_err: %d " "l3_header_padding: %d " "first_msdu: %d " "last_msdu: %d " @@ -1010,6 +1011,7 @@ static void hal_rx_dump_msdu_end_tlv_9224(void *msduend, msdu_end->sa_is_valid, msdu_end->da_is_valid, msdu_end->da_is_mcbc, + msdu_end->tkip_mic_err, msdu_end->l3_header_padding, msdu_end->first_msdu, msdu_end->last_msdu, @@ -1782,6 +1784,8 @@ static void hal_hw_txrx_ops_attach_qcn9224(struct hal_soc *hal_soc) hal_rx_get_rx_fragment_number_be, hal_soc->ops->hal_rx_msdu_end_da_is_mcbc_get = hal_rx_tlv_da_is_mcbc_get_be; + hal_soc->ops->hal_rx_msdu_end_is_tkip_mic_err = + hal_rx_tlv_is_tkip_mic_err_get_be; hal_soc->ops->hal_rx_msdu_end_sa_is_valid_get = hal_rx_tlv_sa_is_valid_get_be; hal_soc->ops->hal_rx_msdu_end_sa_idx_get = hal_rx_tlv_sa_idx_get_be;