Loading dp/wifi3.0/dp_rx.c +19 −11 Original line number Diff line number Diff line Loading @@ -2783,18 +2783,26 @@ uint32_t dp_rx_process(struct dp_intr *int_ctx, hal_ring_handle_t hal_ring_hdl, * Check if DMA completed -- msdu_done is the last bit * to be written */ if (qdf_unlikely(!qdf_nbuf_is_rx_chfrag_cont(nbuf) && !hal_rx_attn_msdu_done_get(rx_tlv_hdr))) { dp_err("MSDU DONE failure"); if (qdf_likely(!qdf_nbuf_is_rx_chfrag_cont(nbuf))) { if (qdf_unlikely(!hal_rx_attn_msdu_done_get( rx_tlv_hdr))) { dp_err_rl("MSDU DONE failure"); DP_STATS_INC(soc, rx.err.msdu_done_fail, 1); hal_rx_dump_pkt_tlvs(hal_soc, rx_tlv_hdr, QDF_TRACE_LEVEL_INFO); tid_stats->fail_cnt[MSDU_DONE_FAILURE]++; qdf_nbuf_free(nbuf); qdf_assert(0); qdf_nbuf_free(nbuf); nbuf = next; continue; } else if (qdf_unlikely(hal_rx_attn_msdu_len_err_get( rx_tlv_hdr))) { DP_STATS_INC(soc, rx.err.msdu_len_err, 1); qdf_nbuf_free(nbuf); nbuf = next; continue; } } DP_HIST_PACKET_COUNT_INC(vdev->pdev->pdev_id); /* Loading dp/wifi3.0/dp_rx_defrag.c +57 −0 Original line number Diff line number Diff line Loading @@ -51,6 +51,17 @@ const struct dp_rx_defrag_cipher dp_f_wep = { 0, }; /* * The header and mic length are same for both * GCMP-128 and GCMP-256. */ const struct dp_rx_defrag_cipher dp_f_gcmp = { "AES-GCMP", WLAN_IEEE80211_GCMP_HEADERLEN, WLAN_IEEE80211_GCMP_MICLEN, WLAN_IEEE80211_GCMP_MICLEN, }; /* * dp_rx_defrag_frames_free(): Free fragment chain * @frames: Fragment chain Loading Loading @@ -1419,6 +1430,36 @@ static QDF_STATUS dp_rx_defrag_reo_reinject(struct dp_peer *peer, } #endif /* * dp_rx_defrag_gcmp_demic(): Remove MIC information from GCMP fragment * @nbuf: Pointer to the fragment buffer * @hdrlen: 802.11 header length * * Remove MIC information from GCMP fragment * * Returns: QDF_STATUS */ static QDF_STATUS dp_rx_defrag_gcmp_demic(qdf_nbuf_t nbuf, uint16_t hdrlen) { uint8_t *ivp, *orig_hdr; int rx_desc_len = SIZE_OF_DATA_RX_TLV; /* start of the 802.11 header */ orig_hdr = (uint8_t *)(qdf_nbuf_data(nbuf) + rx_desc_len); /* * GCMP header is located after 802.11 header and EXTIV * field should always be set to 1 for GCMP protocol. */ ivp = orig_hdr + hdrlen; if (!(ivp[IEEE80211_WEP_IVLEN] & IEEE80211_WEP_EXTIV)) return QDF_STATUS_E_DEFRAG_ERROR; qdf_nbuf_trim_tail(nbuf, dp_f_gcmp.ic_trailer); return QDF_STATUS_SUCCESS; } /* * dp_rx_defrag(): Defragment the fragment chain * @peer: Pointer to the peer Loading Loading @@ -1528,6 +1569,22 @@ static QDF_STATUS dp_rx_defrag(struct dp_peer *peer, unsigned tid, /* If success, increment header to be stripped later */ hdr_space += dp_f_wep.ic_header; break; case cdp_sec_type_aes_gcmp: case cdp_sec_type_aes_gcmp_256: while (cur) { tmp_next = qdf_nbuf_next(cur); if (dp_rx_defrag_gcmp_demic(cur, hdr_space)) { QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR, "dp_rx_defrag: GCMP demic failed"); return QDF_STATUS_E_DEFRAG_ERROR; } cur = tmp_next; } hdr_space += dp_f_gcmp.ic_header; break; default: break; } Loading dp/wifi3.0/dp_types.h +2 −0 Original line number Diff line number Diff line Loading @@ -1036,6 +1036,8 @@ struct dp_soc_stats { uint32_t intrabss_eapol_drop; /* Non Eapol pkt drop cnt due to peer not authorized */ uint32_t peer_unauth_rx_pkt_drop; /* MSDU len err count */ uint32_t msdu_len_err; } err; /* packet count per core - per ring */ Loading hal/wifi3.0/hal_internal.h +7 −0 Original line number Diff line number Diff line Loading @@ -290,12 +290,14 @@ struct hal_reg_write_q_elem { * @dequeues: writes dequeued from delayed work (not written yet) * @coalesces: writes not enqueued since srng is already queued up * @direct: writes not enqueued and written to register directly * @dequeue_delay: dequeue operation be delayed */ struct hal_reg_write_srng_stats { uint32_t enqueues; uint32_t dequeues; uint32_t coalesces; uint32_t direct; uint32_t dequeue_delay; }; /** Loading Loading @@ -324,6 +326,7 @@ enum hal_reg_sched_delay { * @q_depth: current queue depth in delayed register write queue * @max_q_depth: maximum queue for delayed register write queue * @sched_delay: = kernel work sched delay + bus wakeup delay, histogram * @dequeue_delay: dequeue operation be delayed */ struct hal_reg_write_soc_stats { qdf_atomic_t enqueues; Loading @@ -334,6 +337,7 @@ struct hal_reg_write_soc_stats { qdf_atomic_t q_depth; uint32_t max_q_depth; uint32_t sched_delay[REG_WRITE_SCHED_DELAY_HIST_MAX]; uint32_t dequeue_delay; }; #ifdef FEATURE_HAL_DELAYED_REG_WRITE_V2 Loading Loading @@ -474,6 +478,9 @@ struct hal_srng { uint32_t last_reg_wr_val; /* flag to indicate whether srng is already queued for delayed write */ uint8_t reg_write_in_progress; /* last dequeue elem time stamp */ qdf_time_t last_dequeue_time; /* srng specific delayed write stats */ struct hal_reg_write_srng_stats wstats; #endif Loading hal/wifi3.0/hal_rx.h +22 −0 Original line number Diff line number Diff line Loading @@ -4035,4 +4035,26 @@ uint32_t hal_rx_attn_offset_get(hal_soc_handle_t hal_soc_hdl) return hal_soc->ops->hal_rx_attn_offset_get(); } #define HAL_RX_ATTN_MSDU_LEN_ERR_GET(_rx_attn) \ (_HAL_MS((*_OFFSET_TO_WORD_PTR(_rx_attn, \ RX_ATTENTION_1_MSDU_LENGTH_ERR_OFFSET)), \ RX_ATTENTION_1_MSDU_LENGTH_ERR_MASK, \ RX_ATTENTION_1_MSDU_LENGTH_ERR_LSB)) /** * hal_rx_attn_msdu_len_err_get(): Get msdu_len_err value from * rx attention tlvs * @buf: pointer to rx pkt tlvs hdr * * Return: msdu_len_err value */ static inline uint32_t hal_rx_attn_msdu_len_err_get(uint8_t *buf) { struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf; struct rx_attention *rx_attn = &pkt_tlvs->attn_tlv.rx_attn; return HAL_RX_ATTN_MSDU_LEN_ERR_GET(rx_attn); } #endif /* _HAL_RX_H */ Loading
dp/wifi3.0/dp_rx.c +19 −11 Original line number Diff line number Diff line Loading @@ -2783,18 +2783,26 @@ uint32_t dp_rx_process(struct dp_intr *int_ctx, hal_ring_handle_t hal_ring_hdl, * Check if DMA completed -- msdu_done is the last bit * to be written */ if (qdf_unlikely(!qdf_nbuf_is_rx_chfrag_cont(nbuf) && !hal_rx_attn_msdu_done_get(rx_tlv_hdr))) { dp_err("MSDU DONE failure"); if (qdf_likely(!qdf_nbuf_is_rx_chfrag_cont(nbuf))) { if (qdf_unlikely(!hal_rx_attn_msdu_done_get( rx_tlv_hdr))) { dp_err_rl("MSDU DONE failure"); DP_STATS_INC(soc, rx.err.msdu_done_fail, 1); hal_rx_dump_pkt_tlvs(hal_soc, rx_tlv_hdr, QDF_TRACE_LEVEL_INFO); tid_stats->fail_cnt[MSDU_DONE_FAILURE]++; qdf_nbuf_free(nbuf); qdf_assert(0); qdf_nbuf_free(nbuf); nbuf = next; continue; } else if (qdf_unlikely(hal_rx_attn_msdu_len_err_get( rx_tlv_hdr))) { DP_STATS_INC(soc, rx.err.msdu_len_err, 1); qdf_nbuf_free(nbuf); nbuf = next; continue; } } DP_HIST_PACKET_COUNT_INC(vdev->pdev->pdev_id); /* Loading
dp/wifi3.0/dp_rx_defrag.c +57 −0 Original line number Diff line number Diff line Loading @@ -51,6 +51,17 @@ const struct dp_rx_defrag_cipher dp_f_wep = { 0, }; /* * The header and mic length are same for both * GCMP-128 and GCMP-256. */ const struct dp_rx_defrag_cipher dp_f_gcmp = { "AES-GCMP", WLAN_IEEE80211_GCMP_HEADERLEN, WLAN_IEEE80211_GCMP_MICLEN, WLAN_IEEE80211_GCMP_MICLEN, }; /* * dp_rx_defrag_frames_free(): Free fragment chain * @frames: Fragment chain Loading Loading @@ -1419,6 +1430,36 @@ static QDF_STATUS dp_rx_defrag_reo_reinject(struct dp_peer *peer, } #endif /* * dp_rx_defrag_gcmp_demic(): Remove MIC information from GCMP fragment * @nbuf: Pointer to the fragment buffer * @hdrlen: 802.11 header length * * Remove MIC information from GCMP fragment * * Returns: QDF_STATUS */ static QDF_STATUS dp_rx_defrag_gcmp_demic(qdf_nbuf_t nbuf, uint16_t hdrlen) { uint8_t *ivp, *orig_hdr; int rx_desc_len = SIZE_OF_DATA_RX_TLV; /* start of the 802.11 header */ orig_hdr = (uint8_t *)(qdf_nbuf_data(nbuf) + rx_desc_len); /* * GCMP header is located after 802.11 header and EXTIV * field should always be set to 1 for GCMP protocol. */ ivp = orig_hdr + hdrlen; if (!(ivp[IEEE80211_WEP_IVLEN] & IEEE80211_WEP_EXTIV)) return QDF_STATUS_E_DEFRAG_ERROR; qdf_nbuf_trim_tail(nbuf, dp_f_gcmp.ic_trailer); return QDF_STATUS_SUCCESS; } /* * dp_rx_defrag(): Defragment the fragment chain * @peer: Pointer to the peer Loading Loading @@ -1528,6 +1569,22 @@ static QDF_STATUS dp_rx_defrag(struct dp_peer *peer, unsigned tid, /* If success, increment header to be stripped later */ hdr_space += dp_f_wep.ic_header; break; case cdp_sec_type_aes_gcmp: case cdp_sec_type_aes_gcmp_256: while (cur) { tmp_next = qdf_nbuf_next(cur); if (dp_rx_defrag_gcmp_demic(cur, hdr_space)) { QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR, "dp_rx_defrag: GCMP demic failed"); return QDF_STATUS_E_DEFRAG_ERROR; } cur = tmp_next; } hdr_space += dp_f_gcmp.ic_header; break; default: break; } Loading
dp/wifi3.0/dp_types.h +2 −0 Original line number Diff line number Diff line Loading @@ -1036,6 +1036,8 @@ struct dp_soc_stats { uint32_t intrabss_eapol_drop; /* Non Eapol pkt drop cnt due to peer not authorized */ uint32_t peer_unauth_rx_pkt_drop; /* MSDU len err count */ uint32_t msdu_len_err; } err; /* packet count per core - per ring */ Loading
hal/wifi3.0/hal_internal.h +7 −0 Original line number Diff line number Diff line Loading @@ -290,12 +290,14 @@ struct hal_reg_write_q_elem { * @dequeues: writes dequeued from delayed work (not written yet) * @coalesces: writes not enqueued since srng is already queued up * @direct: writes not enqueued and written to register directly * @dequeue_delay: dequeue operation be delayed */ struct hal_reg_write_srng_stats { uint32_t enqueues; uint32_t dequeues; uint32_t coalesces; uint32_t direct; uint32_t dequeue_delay; }; /** Loading Loading @@ -324,6 +326,7 @@ enum hal_reg_sched_delay { * @q_depth: current queue depth in delayed register write queue * @max_q_depth: maximum queue for delayed register write queue * @sched_delay: = kernel work sched delay + bus wakeup delay, histogram * @dequeue_delay: dequeue operation be delayed */ struct hal_reg_write_soc_stats { qdf_atomic_t enqueues; Loading @@ -334,6 +337,7 @@ struct hal_reg_write_soc_stats { qdf_atomic_t q_depth; uint32_t max_q_depth; uint32_t sched_delay[REG_WRITE_SCHED_DELAY_HIST_MAX]; uint32_t dequeue_delay; }; #ifdef FEATURE_HAL_DELAYED_REG_WRITE_V2 Loading Loading @@ -474,6 +478,9 @@ struct hal_srng { uint32_t last_reg_wr_val; /* flag to indicate whether srng is already queued for delayed write */ uint8_t reg_write_in_progress; /* last dequeue elem time stamp */ qdf_time_t last_dequeue_time; /* srng specific delayed write stats */ struct hal_reg_write_srng_stats wstats; #endif Loading
hal/wifi3.0/hal_rx.h +22 −0 Original line number Diff line number Diff line Loading @@ -4035,4 +4035,26 @@ uint32_t hal_rx_attn_offset_get(hal_soc_handle_t hal_soc_hdl) return hal_soc->ops->hal_rx_attn_offset_get(); } #define HAL_RX_ATTN_MSDU_LEN_ERR_GET(_rx_attn) \ (_HAL_MS((*_OFFSET_TO_WORD_PTR(_rx_attn, \ RX_ATTENTION_1_MSDU_LENGTH_ERR_OFFSET)), \ RX_ATTENTION_1_MSDU_LENGTH_ERR_MASK, \ RX_ATTENTION_1_MSDU_LENGTH_ERR_LSB)) /** * hal_rx_attn_msdu_len_err_get(): Get msdu_len_err value from * rx attention tlvs * @buf: pointer to rx pkt tlvs hdr * * Return: msdu_len_err value */ static inline uint32_t hal_rx_attn_msdu_len_err_get(uint8_t *buf) { struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf; struct rx_attention *rx_attn = &pkt_tlvs->attn_tlv.rx_attn; return HAL_RX_ATTN_MSDU_LEN_ERR_GET(rx_attn); } #endif /* _HAL_RX_H */