Loading dp/wifi3.0/dp_internal.h +3 −1 Original line number Diff line number Diff line Loading @@ -2311,11 +2311,13 @@ dp_get_pdev_from_soc_pdev_id_wifi3(struct dp_soc *soc, * @tid: TID * @ba_window_size: BlockAck window size * @start_seq: Starting sequence number * @bar_update: BAR update triggered * * Return: QDF_STATUS code */ QDF_STATUS dp_rx_tid_update_wifi3(struct dp_peer *peer, int tid, uint32_t ba_window_size, uint32_t start_seq); ba_window_size, uint32_t start_seq, bool bar_update); /** * dp_get_peer_mac_list(): function to get peer mac list of vdev Loading dp/wifi3.0/dp_peer.c +11 −9 Original line number Diff line number Diff line Loading @@ -2325,7 +2325,8 @@ static bool dp_get_peer_vdev_roaming_in_progress(struct dp_peer *peer) } QDF_STATUS dp_rx_tid_update_wifi3(struct dp_peer *peer, int tid, uint32_t ba_window_size, uint32_t start_seq) ba_window_size, uint32_t start_seq, bool bar_update) { struct dp_rx_tid *rx_tid = &peer->rx_tid[tid]; struct dp_soc *soc = peer->vdev->pdev->soc; Loading Loading @@ -2357,7 +2358,7 @@ QDF_STATUS dp_rx_tid_update_wifi3(struct dp_peer *peer, int tid, uint32_t if (dp_get_peer_vdev_roaming_in_progress(peer)) return QDF_STATUS_E_PERM; if (soc->cdp_soc.ol_ops->peer_rx_reorder_queue_setup) if (soc->cdp_soc.ol_ops->peer_rx_reorder_queue_setup && !bar_update) soc->cdp_soc.ol_ops->peer_rx_reorder_queue_setup( soc->ctrl_psoc, peer->vdev->pdev->pdev_id, peer->vdev->vdev_id, peer->mac_addr.raw, Loading Loading @@ -2548,7 +2549,7 @@ QDF_STATUS dp_rx_tid_setup_wifi3(struct dp_peer *peer, int tid, rx_tid->ba_win_size = ba_window_size; if (rx_tid->hw_qdesc_vaddr_unaligned) return dp_rx_tid_update_wifi3(peer, tid, ba_window_size, start_seq); start_seq, false); rx_tid->delba_tx_status = 0; rx_tid->ppdu_id_2k = 0; rx_tid->num_of_addba_req = 0; Loading Loading @@ -3297,7 +3298,7 @@ int dp_addba_resp_tx_completion_wifi3(struct cdp_soc_t *cdp_soc, if (status) { rx_tid->num_addba_rsp_failed++; dp_rx_tid_update_wifi3(peer, tid, 1, IEEE80211_SEQ_MAX); IEEE80211_SEQ_MAX, false); rx_tid->ba_status = DP_RX_BA_INACTIVE; qdf_spin_unlock_bh(&rx_tid->tid_lock); dp_err("RxTid- %d addba rsp tx completion failed", tid); Loading @@ -3324,7 +3325,8 @@ int dp_addba_resp_tx_completion_wifi3(struct cdp_soc_t *cdp_soc, if (dp_rx_tid_update_wifi3(peer, tid, rx_tid->ba_win_size, rx_tid->startseqnum)) { rx_tid->startseqnum, false)) { dp_err("Failed update REO SSN"); } Loading Loading @@ -3493,7 +3495,7 @@ int dp_addba_requestprocess_wifi3(struct cdp_soc_t *cdp_soc, rx_tid->num_of_addba_req++; if ((rx_tid->ba_status == DP_RX_BA_ACTIVE && rx_tid->hw_qdesc_vaddr_unaligned)) { dp_rx_tid_update_wifi3(peer, tid, 1, IEEE80211_SEQ_MAX); dp_rx_tid_update_wifi3(peer, tid, 1, IEEE80211_SEQ_MAX, false); rx_tid->ba_status = DP_RX_BA_INACTIVE; peer->active_ba_session_cnt--; QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_DEBUG, Loading Loading @@ -3632,7 +3634,7 @@ int dp_delba_process_wifi3(struct cdp_soc_t *cdp_soc, uint8_t *peer_mac, */ rx_tid->delba_rcode = reasoncode; rx_tid->num_of_delba_req++; dp_rx_tid_update_wifi3(peer, tid, 1, IEEE80211_SEQ_MAX); dp_rx_tid_update_wifi3(peer, tid, 1, IEEE80211_SEQ_MAX, false); rx_tid->ba_status = DP_RX_BA_INACTIVE; peer->active_ba_session_cnt--; Loading Loading @@ -3695,12 +3697,12 @@ int dp_delba_tx_completion_wifi3(struct cdp_soc_t *cdp_soc, uint8_t *peer_mac, rx_tid->delba_tx_status = 0; } if (rx_tid->ba_status == DP_RX_BA_ACTIVE) { dp_rx_tid_update_wifi3(peer, tid, 1, IEEE80211_SEQ_MAX); dp_rx_tid_update_wifi3(peer, tid, 1, IEEE80211_SEQ_MAX, false); rx_tid->ba_status = DP_RX_BA_INACTIVE; peer->active_ba_session_cnt--; } if (rx_tid->ba_status == DP_RX_BA_IN_PROGRESS) { dp_rx_tid_update_wifi3(peer, tid, 1, IEEE80211_SEQ_MAX); dp_rx_tid_update_wifi3(peer, tid, 1, IEEE80211_SEQ_MAX, false); rx_tid->ba_status = DP_RX_BA_INACTIVE; } qdf_spin_unlock_bh(&rx_tid->tid_lock); 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_rx_err.c +3 −3 Original line number Diff line number Diff line Loading @@ -819,7 +819,8 @@ void dp_rx_err_handle_bar(struct dp_soc *soc, status = dp_rx_tid_update_wifi3(peer, tid, peer->rx_tid[tid].ba_win_size, start_seq_num); start_seq_num, true); if (status != QDF_STATUS_SUCCESS) { dp_err_rl("failed to handle bar frame update rx tid"); DP_STATS_INC(soc, rx.err.bar_handle_fail_count, 1); Loading Loading @@ -949,8 +950,7 @@ dp_2k_jump_handle(struct dp_soc *soc, peer = dp_peer_get_ref_by_id(soc, peer_id, DP_MOD_ID_RX_ERR); if (!peer) { QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR, "peer not found"); dp_info_rl("%pK: peer not found", soc); goto free_nbuf; } Loading Loading
dp/wifi3.0/dp_internal.h +3 −1 Original line number Diff line number Diff line Loading @@ -2311,11 +2311,13 @@ dp_get_pdev_from_soc_pdev_id_wifi3(struct dp_soc *soc, * @tid: TID * @ba_window_size: BlockAck window size * @start_seq: Starting sequence number * @bar_update: BAR update triggered * * Return: QDF_STATUS code */ QDF_STATUS dp_rx_tid_update_wifi3(struct dp_peer *peer, int tid, uint32_t ba_window_size, uint32_t start_seq); ba_window_size, uint32_t start_seq, bool bar_update); /** * dp_get_peer_mac_list(): function to get peer mac list of vdev Loading
dp/wifi3.0/dp_peer.c +11 −9 Original line number Diff line number Diff line Loading @@ -2325,7 +2325,8 @@ static bool dp_get_peer_vdev_roaming_in_progress(struct dp_peer *peer) } QDF_STATUS dp_rx_tid_update_wifi3(struct dp_peer *peer, int tid, uint32_t ba_window_size, uint32_t start_seq) ba_window_size, uint32_t start_seq, bool bar_update) { struct dp_rx_tid *rx_tid = &peer->rx_tid[tid]; struct dp_soc *soc = peer->vdev->pdev->soc; Loading Loading @@ -2357,7 +2358,7 @@ QDF_STATUS dp_rx_tid_update_wifi3(struct dp_peer *peer, int tid, uint32_t if (dp_get_peer_vdev_roaming_in_progress(peer)) return QDF_STATUS_E_PERM; if (soc->cdp_soc.ol_ops->peer_rx_reorder_queue_setup) if (soc->cdp_soc.ol_ops->peer_rx_reorder_queue_setup && !bar_update) soc->cdp_soc.ol_ops->peer_rx_reorder_queue_setup( soc->ctrl_psoc, peer->vdev->pdev->pdev_id, peer->vdev->vdev_id, peer->mac_addr.raw, Loading Loading @@ -2548,7 +2549,7 @@ QDF_STATUS dp_rx_tid_setup_wifi3(struct dp_peer *peer, int tid, rx_tid->ba_win_size = ba_window_size; if (rx_tid->hw_qdesc_vaddr_unaligned) return dp_rx_tid_update_wifi3(peer, tid, ba_window_size, start_seq); start_seq, false); rx_tid->delba_tx_status = 0; rx_tid->ppdu_id_2k = 0; rx_tid->num_of_addba_req = 0; Loading Loading @@ -3297,7 +3298,7 @@ int dp_addba_resp_tx_completion_wifi3(struct cdp_soc_t *cdp_soc, if (status) { rx_tid->num_addba_rsp_failed++; dp_rx_tid_update_wifi3(peer, tid, 1, IEEE80211_SEQ_MAX); IEEE80211_SEQ_MAX, false); rx_tid->ba_status = DP_RX_BA_INACTIVE; qdf_spin_unlock_bh(&rx_tid->tid_lock); dp_err("RxTid- %d addba rsp tx completion failed", tid); Loading @@ -3324,7 +3325,8 @@ int dp_addba_resp_tx_completion_wifi3(struct cdp_soc_t *cdp_soc, if (dp_rx_tid_update_wifi3(peer, tid, rx_tid->ba_win_size, rx_tid->startseqnum)) { rx_tid->startseqnum, false)) { dp_err("Failed update REO SSN"); } Loading Loading @@ -3493,7 +3495,7 @@ int dp_addba_requestprocess_wifi3(struct cdp_soc_t *cdp_soc, rx_tid->num_of_addba_req++; if ((rx_tid->ba_status == DP_RX_BA_ACTIVE && rx_tid->hw_qdesc_vaddr_unaligned)) { dp_rx_tid_update_wifi3(peer, tid, 1, IEEE80211_SEQ_MAX); dp_rx_tid_update_wifi3(peer, tid, 1, IEEE80211_SEQ_MAX, false); rx_tid->ba_status = DP_RX_BA_INACTIVE; peer->active_ba_session_cnt--; QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_DEBUG, Loading Loading @@ -3632,7 +3634,7 @@ int dp_delba_process_wifi3(struct cdp_soc_t *cdp_soc, uint8_t *peer_mac, */ rx_tid->delba_rcode = reasoncode; rx_tid->num_of_delba_req++; dp_rx_tid_update_wifi3(peer, tid, 1, IEEE80211_SEQ_MAX); dp_rx_tid_update_wifi3(peer, tid, 1, IEEE80211_SEQ_MAX, false); rx_tid->ba_status = DP_RX_BA_INACTIVE; peer->active_ba_session_cnt--; Loading Loading @@ -3695,12 +3697,12 @@ int dp_delba_tx_completion_wifi3(struct cdp_soc_t *cdp_soc, uint8_t *peer_mac, rx_tid->delba_tx_status = 0; } if (rx_tid->ba_status == DP_RX_BA_ACTIVE) { dp_rx_tid_update_wifi3(peer, tid, 1, IEEE80211_SEQ_MAX); dp_rx_tid_update_wifi3(peer, tid, 1, IEEE80211_SEQ_MAX, false); rx_tid->ba_status = DP_RX_BA_INACTIVE; peer->active_ba_session_cnt--; } if (rx_tid->ba_status == DP_RX_BA_IN_PROGRESS) { dp_rx_tid_update_wifi3(peer, tid, 1, IEEE80211_SEQ_MAX); dp_rx_tid_update_wifi3(peer, tid, 1, IEEE80211_SEQ_MAX, false); rx_tid->ba_status = DP_RX_BA_INACTIVE; } qdf_spin_unlock_bh(&rx_tid->tid_lock); 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_rx_err.c +3 −3 Original line number Diff line number Diff line Loading @@ -819,7 +819,8 @@ void dp_rx_err_handle_bar(struct dp_soc *soc, status = dp_rx_tid_update_wifi3(peer, tid, peer->rx_tid[tid].ba_win_size, start_seq_num); start_seq_num, true); if (status != QDF_STATUS_SUCCESS) { dp_err_rl("failed to handle bar frame update rx tid"); DP_STATS_INC(soc, rx.err.bar_handle_fail_count, 1); Loading Loading @@ -949,8 +950,7 @@ dp_2k_jump_handle(struct dp_soc *soc, peer = dp_peer_get_ref_by_id(soc, peer_id, DP_MOD_ID_RX_ERR); if (!peer) { QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR, "peer not found"); dp_info_rl("%pK: peer not found", soc); goto free_nbuf; } Loading