qcacmn: Handling MIC failures for QCN9224 target

For QCN9224 target, All the MIC failures are reported
as decrypt error from FW.

So, added changes to handle MIC failures for QCN9224
target .

Change-Id: I32e616e01e3cd6e76ef105d73fd8a87ce2c81cb9
CRs-Fixed: 3192749
这个提交包含在:
Shiva Sankar Gajula
2022-06-03 09:45:30 +05:30
提交者 Madan Koyyalamudi
父节点 de0d00288a
当前提交 5b5d4cb57a
修改 5 个文件,包含 58 行新增0 行删除

查看文件

@@ -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,

查看文件

@@ -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

查看文件

@@ -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);

查看文件

@@ -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

查看文件

@@ -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;