|
@@ -732,6 +732,11 @@ void dp_peer_tid_queue_cleanup(struct dp_peer *peer)
|
|
ppdu_desc = (struct cdp_tx_completion_ppdu *)
|
|
ppdu_desc = (struct cdp_tx_completion_ppdu *)
|
|
qdf_nbuf_data(ppdu_nbuf);
|
|
qdf_nbuf_data(ppdu_nbuf);
|
|
|
|
|
|
|
|
+ QDF_TRACE(QDF_MODULE_ID_TX_CAPTURE,
|
|
|
|
+ QDF_TRACE_LEVEL_INFO_MED,
|
|
|
|
+ "ppdu_id:%u tsf:%llu removed from pending ppdu q",
|
|
|
|
+ ppdu_desc->ppdu_id,
|
|
|
|
+ ppdu_desc->ppdu_start_timestamp);
|
|
/*
|
|
/*
|
|
* check if peer id is matching
|
|
* check if peer id is matching
|
|
* the user peer_id
|
|
* the user peer_id
|
|
@@ -1581,6 +1586,10 @@ void dp_process_ppdu_stats_update_failed_bitmap(struct dp_pdev *pdev,
|
|
uint32_t k;
|
|
uint32_t k;
|
|
uint32_t ba_bitmap = 0;
|
|
uint32_t ba_bitmap = 0;
|
|
int last_set_bit;
|
|
int last_set_bit;
|
|
|
|
+ uint32_t last_ba_set_bit = 0;
|
|
|
|
+ uint8_t extra_ba_mpdus = 0;
|
|
|
|
+ uint32_t last_ba_seq = 0;
|
|
|
|
+ uint32_t enq_ba_bitmap[CDP_BA_256_BIT_MAP_SIZE_DWORDS] = {0};
|
|
|
|
|
|
user = (struct cdp_tx_completion_ppdu_user *)data;
|
|
user = (struct cdp_tx_completion_ppdu_user *)data;
|
|
|
|
|
|
@@ -1628,6 +1637,10 @@ void dp_process_ppdu_stats_update_failed_bitmap(struct dp_pdev *pdev,
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ if (num_mpdu > mpdu_tried) {
|
|
|
|
+ extra_ba_mpdus = 1;
|
|
|
|
+ }
|
|
|
|
+
|
|
/* Adjust failed_bitmap to start from same seq_no as enq_bitmap */
|
|
/* Adjust failed_bitmap to start from same seq_no as enq_bitmap */
|
|
last_set_bit = 0;
|
|
last_set_bit = 0;
|
|
if (start_seq <= ba_seq_no) {
|
|
if (start_seq <= ba_seq_no) {
|
|
@@ -1641,12 +1654,31 @@ void dp_process_ppdu_stats_update_failed_bitmap(struct dp_pdev *pdev,
|
|
carry = ((ba_bitmap & (bitmask << (32 - diff))) >>
|
|
carry = ((ba_bitmap & (bitmask << (32 - diff))) >>
|
|
(32 - diff));
|
|
(32 - diff));
|
|
|
|
|
|
- user->failed_bitmap[i] = user->enq_bitmap[i] &
|
|
|
|
- user->failed_bitmap[i];
|
|
|
|
|
|
+ if (user->failed_bitmap[i]) {
|
|
|
|
+ last_ba_set_bit = i * 32 +
|
|
|
|
+ qdf_fls(user->failed_bitmap[i]) - 1;
|
|
|
|
+ if (extra_ba_mpdus) {
|
|
|
|
+ enq_ba_bitmap[i] =
|
|
|
|
+ user->failed_bitmap[i];
|
|
|
|
+ QDF_TRACE(QDF_MODULE_ID_TX_CAPTURE,
|
|
|
|
+ QDF_TRACE_LEVEL_INFO_MED,
|
|
|
|
+ "i=%d failed_bitmap[%d] = 0x%x last_ba_set_bit:%d\n",
|
|
|
|
+ i, i, user->failed_bitmap[i],
|
|
|
|
+ last_ba_set_bit);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
if (user->enq_bitmap[i]) {
|
|
if (user->enq_bitmap[i]) {
|
|
last_set_bit = i * 32 +
|
|
last_set_bit = i * 32 +
|
|
qdf_fls(user->enq_bitmap[i]) - 1;
|
|
qdf_fls(user->enq_bitmap[i]) - 1;
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+ if (extra_ba_mpdus) {
|
|
|
|
+ user->enq_bitmap[i] = enq_ba_bitmap[i];
|
|
|
|
+ } else {
|
|
|
|
+ user->failed_bitmap[i] = user->enq_bitmap[i] &
|
|
|
|
+ user->failed_bitmap[i];
|
|
|
|
+ }
|
|
}
|
|
}
|
|
} else {
|
|
} else {
|
|
/* array index */
|
|
/* array index */
|
|
@@ -1654,7 +1686,7 @@ void dp_process_ppdu_stats_update_failed_bitmap(struct dp_pdev *pdev,
|
|
diff = diff & 0x1F;
|
|
diff = diff & 0x1F;
|
|
|
|
|
|
bitmask = (1 << diff) - 1;
|
|
bitmask = (1 << diff) - 1;
|
|
- for (i = 0; i < size; i++, k++) {
|
|
|
|
|
|
+ for (i = 0; i < size && (k < (size - 1)); i++, k++) {
|
|
ba_bitmap = user->ba_bitmap[k];
|
|
ba_bitmap = user->ba_bitmap[k];
|
|
user->failed_bitmap[i] = ba_bitmap >> diff;
|
|
user->failed_bitmap[i] = ba_bitmap >> diff;
|
|
/* get next ba_bitmap */
|
|
/* get next ba_bitmap */
|
|
@@ -1663,18 +1695,53 @@ void dp_process_ppdu_stats_update_failed_bitmap(struct dp_pdev *pdev,
|
|
user->failed_bitmap[i] |=
|
|
user->failed_bitmap[i] |=
|
|
((carry & bitmask) << (32 - diff));
|
|
((carry & bitmask) << (32 - diff));
|
|
|
|
|
|
- user->failed_bitmap[i] = user->enq_bitmap[i] &
|
|
|
|
- user->failed_bitmap[i];
|
|
|
|
|
|
+ if (user->failed_bitmap[i]) {
|
|
|
|
+ last_ba_set_bit = i * 32 +
|
|
|
|
+ qdf_fls(user->failed_bitmap[i]) - 1;
|
|
|
|
+ if (extra_ba_mpdus) {
|
|
|
|
+ enq_ba_bitmap[i] =
|
|
|
|
+ user->failed_bitmap[i];
|
|
|
|
+ QDF_TRACE(QDF_MODULE_ID_TX_CAPTURE,
|
|
|
|
+ QDF_TRACE_LEVEL_INFO_MED,
|
|
|
|
+ "i=%d failed_bitmap[%d] = 0x%x last_ba_set_bit:%d\n",
|
|
|
|
+ i, i, user->failed_bitmap[i],
|
|
|
|
+ last_ba_set_bit);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
if (user->enq_bitmap[i]) {
|
|
if (user->enq_bitmap[i]) {
|
|
last_set_bit = i * 32 +
|
|
last_set_bit = i * 32 +
|
|
qdf_fls(user->enq_bitmap[i]) - 1;
|
|
qdf_fls(user->enq_bitmap[i]) - 1;
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+ if (extra_ba_mpdus) {
|
|
|
|
+ user->enq_bitmap[i] = enq_ba_bitmap[i];
|
|
|
|
+ } else {
|
|
|
|
+ user->failed_bitmap[i] = user->enq_bitmap[i] &
|
|
|
|
+ user->failed_bitmap[i];
|
|
|
|
+ }
|
|
}
|
|
}
|
|
}
|
|
}
|
|
user->last_enq_seq = user->start_seq + last_set_bit;
|
|
user->last_enq_seq = user->start_seq + last_set_bit;
|
|
user->ba_size = user->last_enq_seq - user->start_seq + 1;
|
|
user->ba_size = user->last_enq_seq - user->start_seq + 1;
|
|
|
|
+
|
|
|
|
+ last_ba_seq = user->start_seq + last_ba_set_bit;
|
|
|
|
+
|
|
|
|
+ if (extra_ba_mpdus) {
|
|
|
|
+ QDF_TRACE(QDF_MODULE_ID_TX_CAPTURE,
|
|
|
|
+ QDF_TRACE_LEVEL_INFO_MED,
|
|
|
|
+ "ppdu_id:%u ba_size:%u modified_ba_size:%u last_ba_set_bit:%u start_seq: %u\n",
|
|
|
|
+ ppdu_id,
|
|
|
|
+ user->ba_size,
|
|
|
|
+ last_ba_seq - user->start_seq + 1,
|
|
|
|
+ last_ba_set_bit, user->start_seq);
|
|
|
|
+ user->ba_size = last_ba_seq - user->start_seq + 1;
|
|
|
|
+
|
|
|
|
+ user->last_enq_seq = last_ba_seq;
|
|
|
|
+ }
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+
|
|
/*
|
|
/*
|
|
* dp_soc_set_txrx_ring_map_single()
|
|
* dp_soc_set_txrx_ring_map_single()
|
|
* @dp_soc: DP handler for soc
|
|
* @dp_soc: DP handler for soc
|
|
@@ -4661,7 +4728,8 @@ dp_check_ppdu_and_deliver(struct dp_pdev *pdev,
|
|
|
|
|
|
for (i = 0; (i < user->ba_size) && mpdus_tried; i++) {
|
|
for (i = 0; (i < user->ba_size) && mpdus_tried; i++) {
|
|
if (qdf_likely(user->tid != DP_NON_QOS_TID) &&
|
|
if (qdf_likely(user->tid != DP_NON_QOS_TID) &&
|
|
- !(SEQ_BIT(user->enq_bitmap, i)))
|
|
|
|
|
|
+ !(SEQ_BIT(user->enq_bitmap, i)) &&
|
|
|
|
+ !mpdu_tried)
|
|
continue;
|
|
continue;
|
|
mpdus_tried--;
|
|
mpdus_tried--;
|
|
/* missed seq number */
|
|
/* missed seq number */
|
|
@@ -4732,6 +4800,25 @@ dp_check_ppdu_and_deliver(struct dp_pdev *pdev,
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ for (/* get i from previous stored value*/;
|
|
|
|
+ i < user->ba_size; i++) {
|
|
|
|
+ qdf_nbuf_queue_t *tmp_q;
|
|
|
|
+
|
|
|
|
+ /* missed seq number */
|
|
|
|
+ seq_no = start_seq + i;
|
|
|
|
+
|
|
|
|
+ tmp_q = &user->mpdu_q;
|
|
|
|
+ /* any error case we need to handle */
|
|
|
|
+ mpdu_nbuf = qdf_nbuf_queue_remove(tmp_q);
|
|
|
|
+ /* check mpdu_nbuf NULL */
|
|
|
|
+ if (!mpdu_nbuf)
|
|
|
|
+ continue;
|
|
|
|
+
|
|
|
|
+ user->mpdus[seq_no - start_seq] = mpdu_nbuf;
|
|
|
|
+ dp_tx_cap_stats_mpdu_update(peer,
|
|
|
|
+ PEER_MPDU_ARR, 1);
|
|
|
|
+ }
|
|
|
|
+
|
|
mpdu_tried = user->mpdu_tried_ucast +
|
|
mpdu_tried = user->mpdu_tried_ucast +
|
|
user->mpdu_tried_mcast;
|
|
user->mpdu_tried_mcast;
|
|
for (i = 0; i < CDP_BA_256_BIT_MAP_SIZE_DWORDS; i++)
|
|
for (i = 0; i < CDP_BA_256_BIT_MAP_SIZE_DWORDS; i++)
|
|
@@ -5057,6 +5144,8 @@ dequeue_msdu_again:
|
|
|
|
|
|
if (qdf_nbuf_is_queue_empty(
|
|
if (qdf_nbuf_is_queue_empty(
|
|
&head_msdu)) {
|
|
&head_msdu)) {
|
|
|
|
+ if (user->completion_status == 2)
|
|
|
|
+ goto nbuf_add_ref;
|
|
user->skip = 1;
|
|
user->skip = 1;
|
|
goto free_nbuf_dec_ref;
|
|
goto free_nbuf_dec_ref;
|
|
}
|
|
}
|
|
@@ -5117,6 +5206,7 @@ dequeue_msdu_again:
|
|
mpdu_suc);
|
|
mpdu_suc);
|
|
dp_tx_cap_stats_mpdu_update(peer, PEER_MPDU_TRI,
|
|
dp_tx_cap_stats_mpdu_update(peer, PEER_MPDU_TRI,
|
|
mpdu_tri);
|
|
mpdu_tri);
|
|
|
|
+nbuf_add_ref:
|
|
dp_peer_unref_delete(peer, DP_MOD_ID_TX_CAPTURE);
|
|
dp_peer_unref_delete(peer, DP_MOD_ID_TX_CAPTURE);
|
|
/* get reference count */
|
|
/* get reference count */
|
|
ref_cnt = qdf_nbuf_get_users(nbuf_ppdu);
|
|
ref_cnt = qdf_nbuf_get_users(nbuf_ppdu);
|
|
@@ -6412,8 +6502,7 @@ static QDF_STATUS debug_ppdu_desc_log_show(qdf_debugfs_file_t file, void *arg)
|
|
user->delayed_ba);
|
|
user->delayed_ba);
|
|
|
|
|
|
qdf_debugfs_printf(file,
|
|
qdf_debugfs_printf(file,
|
|
- "\tS_SEQ:%d ENQ_BITMAP[",
|
|
|
|
- user->start_seq);
|
|
|
|
|
|
+ "\tS_SEQ:%d ENQ_BITMAP[", user->start_seq);
|
|
for (i = 0; i < CDP_BA_256_BIT_MAP_SIZE_DWORDS; i++)
|
|
for (i = 0; i < CDP_BA_256_BIT_MAP_SIZE_DWORDS; i++)
|
|
qdf_debugfs_printf(file, " 0x%x",
|
|
qdf_debugfs_printf(file, " 0x%x",
|
|
user->enq_bitmap[i]);
|
|
user->enq_bitmap[i]);
|