diff --git a/dp/wifi3.0/dp_tx_capture.c b/dp/wifi3.0/dp_tx_capture.c index 68fa0293fe..8d2ac9680a 100644 --- a/dp/wifi3.0/dp_tx_capture.c +++ b/dp/wifi3.0/dp_tx_capture.c @@ -3155,6 +3155,8 @@ static void set_mpdu_info( mpdu_info->preamble = DOT11_B; else mpdu_info->preamble = DOT11_A; + + mpdu_info->mcs = CDP_LEGACY_MCS3; } static void dp_gen_ack_frame(struct hal_rx_ppdu_info *ppdu_info, @@ -3186,13 +3188,36 @@ static void dp_gen_ack_frame(struct hal_rx_ppdu_info *ppdu_info, static void dp_gen_block_ack_frame( struct mon_rx_user_status *rx_user_status, + struct mon_rx_user_info *rx_user_info, struct dp_peer *peer, qdf_nbuf_t mpdu_nbuf) { struct dp_vdev *vdev = NULL; + uint32_t tid; + struct dp_tx_tid *tx_tid; struct ieee80211_ctlframe_addr2 *wh_addr2; uint8_t *frm; + tid = rx_user_status->tid; + tx_tid = &peer->tx_capture.tx_tid[tid]; + if (!rx_user_info->bar_frame) { + tx_tid->first_data_seq_ctrl = + rx_user_status->first_data_seq_ctrl; + tx_tid->mpdu_cnt = rx_user_status->mpdu_cnt_fcs_ok + + rx_user_status->mpdu_cnt_fcs_err; + if (tx_tid->mpdu_cnt > DP_MAX_MPDU_64) + qdf_mem_copy(tx_tid->mpdu_fcs_ok_bitmap, + rx_user_status->mpdu_fcs_ok_bitmap, + HAL_RX_NUM_WORDS_PER_PPDU_BITMAP * sizeof( + rx_user_status->mpdu_fcs_ok_bitmap[0])); + else + qdf_mem_copy(tx_tid->mpdu_fcs_ok_bitmap, + rx_user_status->mpdu_fcs_ok_bitmap, + DP_NUM_WORDS_PER_PPDU_BITMAP_64 * sizeof( + rx_user_status->mpdu_fcs_ok_bitmap[0])); + } + + wh_addr2 = (struct ieee80211_ctlframe_addr2 *) qdf_nbuf_data(mpdu_nbuf); @@ -3219,19 +3244,17 @@ static void dp_gen_block_ack_frame( DP_IEEE80211_BAR_CTL_COMBA); frm += 2; *((uint16_t *)frm) = - rx_user_status->first_data_seq_ctrl; + tx_tid->first_data_seq_ctrl; frm += 2; - if ((rx_user_status->mpdu_cnt_fcs_ok + - rx_user_status->mpdu_cnt_fcs_err) - > DP_MAX_MPDU_64) { + if (tx_tid->mpdu_cnt > DP_MAX_MPDU_64) { qdf_mem_copy(frm, - rx_user_status->mpdu_fcs_ok_bitmap, + tx_tid->mpdu_fcs_ok_bitmap, HAL_RX_NUM_WORDS_PER_PPDU_BITMAP * sizeof(rx_user_status->mpdu_fcs_ok_bitmap[0])); frm += DP_NUM_BYTES_PER_PPDU_BITMAP; } else { qdf_mem_copy(frm, - rx_user_status->mpdu_fcs_ok_bitmap, + tx_tid->mpdu_fcs_ok_bitmap, DP_NUM_WORDS_PER_PPDU_BITMAP_64 * sizeof(rx_user_status->mpdu_fcs_ok_bitmap[0])); frm += DP_NUM_BYTES_PER_PPDU_BITMAP_64; @@ -3259,8 +3282,10 @@ QDF_STATUS dp_send_ack_frame_to_stack(struct dp_soc *soc, uint32_t peer_id; struct mon_rx_status *rx_status; struct mon_rx_user_status *rx_user_status; + struct mon_rx_user_info *rx_user_info; uint32_t ast_index; uint32_t i; + bool bar_frame; rx_status = &ppdu_info->rx_status; @@ -3271,11 +3296,30 @@ QDF_STATUS dp_send_ack_frame_to_stack(struct dp_soc *soc, HAL_MPDU_SW_FRAME_GROUP_MGMT_BEACON) return QDF_STATUS_SUCCESS; + if (ppdu_info->sw_frame_group_id == HAL_MPDU_SW_FRAME_GROUP_MGMT_PROBE_REQ && + (ppdu_info->rx_info.mac_addr1[0] & 1)) { + return QDF_STATUS_SUCCESS; + } + + if (ppdu_info->sw_frame_group_id == HAL_MPDU_SW_FRAME_GROUP_CTRL_BAR) + bar_frame = true; + else + bar_frame = false; + for (i = 0; i < ppdu_info->com_info.num_users; i++) { if (i > OFDMA_NUM_USERS) return QDF_STATUS_E_FAULT; rx_user_status = &ppdu_info->rx_user_status[i]; + rx_user_info = &ppdu_info->rx_user_info[i]; + + rx_user_info->bar_frame = bar_frame; + + if (rx_user_info->qos_control_info_valid && + ((rx_user_info->qos_control & + IEEE80211_QOS_ACKPOLICY) >> IEEE80211_QOS_ACKPOLICY_S) + == IEEE80211_BAR_CTL_NOACK) + continue; ast_index = rx_user_status->ast_index; if (ast_index >= @@ -3338,9 +3382,11 @@ QDF_STATUS dp_send_ack_frame_to_stack(struct dp_soc *soc, return QDF_STATUS_E_NOMEM; } - if (rx_status->rs_flags & IEEE80211_AMPDU_FLAG) { - dp_gen_block_ack_frame( - rx_user_status, peer, + if (peer->rx_tid[rx_user_status->tid].ba_status == + DP_RX_BA_ACTIVE) { + dp_gen_block_ack_frame(rx_user_status, + rx_user_info, + peer, tx_capture_info.mpdu_nbuf); tx_capture_info.mpdu_info.tid = rx_user_status->tid; diff --git a/dp/wifi3.0/dp_tx_capture.h b/dp/wifi3.0/dp_tx_capture.h index 605c42efdd..6f85eaf067 100644 --- a/dp/wifi3.0/dp_tx_capture.h +++ b/dp/wifi3.0/dp_tx_capture.h @@ -73,6 +73,9 @@ struct dp_tx_tid { qdf_nbuf_queue_t msdu_comp_q; qdf_nbuf_queue_t pending_ppdu_q; struct cdp_tx_completion_ppdu xretry_ppdu; + uint16_t first_data_seq_ctrl; + uint32_t mpdu_cnt; + uint32_t mpdu_fcs_ok_bitmap[QDF_MON_STATUS_MPDU_FCS_BMAP_NWORDS]; }; struct dp_peer_tx_capture {