|
@@ -356,13 +356,39 @@ static void dp_tx_tso_desc_release(struct dp_soc *soc,
|
|
|
}
|
|
|
#endif
|
|
|
|
|
|
+#ifdef WLAN_SUPPORT_PPEDS
|
|
|
+static inline int
|
|
|
+dp_tx_release_ds_tx_desc(struct dp_soc *soc, struct dp_tx_desc_s *tx_desc,
|
|
|
+ uint8_t desc_pool_id)
|
|
|
+{
|
|
|
+ if (tx_desc->flags & DP_TX_DESC_FLAG_PPEDS) {
|
|
|
+ __dp_tx_outstanding_dec(soc);
|
|
|
+ dp_tx_desc_free(soc, tx_desc, desc_pool_id);
|
|
|
+
|
|
|
+ return 1;
|
|
|
+ }
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+#else
|
|
|
+static inline int
|
|
|
+dp_tx_release_ds_tx_desc(struct dp_soc *soc, struct dp_tx_desc_s *tx_desc,
|
|
|
+ uint8_t desc_pool_id)
|
|
|
+{
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+#endif
|
|
|
+
|
|
|
void
|
|
|
-dp_tx_desc_release(struct dp_tx_desc_s *tx_desc, uint8_t desc_pool_id)
|
|
|
+dp_tx_desc_release(struct dp_soc *soc, struct dp_tx_desc_s *tx_desc,
|
|
|
+ uint8_t desc_pool_id)
|
|
|
{
|
|
|
struct dp_pdev *pdev = tx_desc->pdev;
|
|
|
- struct dp_soc *soc;
|
|
|
uint8_t comp_status = 0;
|
|
|
|
|
|
+ if (dp_tx_release_ds_tx_desc(soc, tx_desc, desc_pool_id))
|
|
|
+ return;
|
|
|
+
|
|
|
qdf_assert(pdev);
|
|
|
|
|
|
soc = pdev->soc;
|
|
@@ -1259,7 +1285,7 @@ struct dp_tx_desc_s *dp_tx_prepare_desc_single(struct dp_vdev *vdev,
|
|
|
return tx_desc;
|
|
|
|
|
|
failure:
|
|
|
- dp_tx_desc_release(tx_desc, desc_pool_id);
|
|
|
+ dp_tx_desc_release(soc, tx_desc, desc_pool_id);
|
|
|
return NULL;
|
|
|
}
|
|
|
|
|
@@ -1345,7 +1371,7 @@ static struct dp_tx_desc_s *dp_tx_prepare_desc(struct dp_vdev *vdev,
|
|
|
|
|
|
return tx_desc;
|
|
|
failure:
|
|
|
- dp_tx_desc_release(tx_desc, desc_pool_id);
|
|
|
+ dp_tx_desc_release(soc, tx_desc, desc_pool_id);
|
|
|
return NULL;
|
|
|
}
|
|
|
|
|
@@ -2410,7 +2436,7 @@ dp_tx_send_msdu_single(struct dp_vdev *vdev, qdf_nbuf_t nbuf,
|
|
|
return NULL;
|
|
|
|
|
|
release_desc:
|
|
|
- dp_tx_desc_release(tx_desc, tx_q->desc_pool_id);
|
|
|
+ dp_tx_desc_release(soc, tx_desc, tx_q->desc_pool_id);
|
|
|
|
|
|
fail_return:
|
|
|
dp_tx_get_tid(vdev, nbuf, msdu_info);
|
|
@@ -2728,7 +2754,8 @@ qdf_nbuf_t dp_tx_send_msdu_multiple(struct dp_vdev *vdev, qdf_nbuf_t nbuf,
|
|
|
*/
|
|
|
qdf_nbuf_free(msdu_info->u.sg_info
|
|
|
.curr_seg->nbuf);
|
|
|
- dp_tx_desc_release(tx_desc, tx_q->desc_pool_id);
|
|
|
+ dp_tx_desc_release(soc, tx_desc,
|
|
|
+ tx_q->desc_pool_id);
|
|
|
if (msdu_info->u.sg_info.curr_seg->next) {
|
|
|
msdu_info->u.sg_info.curr_seg =
|
|
|
msdu_info->u.sg_info
|
|
@@ -2754,14 +2781,15 @@ qdf_nbuf_t dp_tx_send_msdu_multiple(struct dp_vdev *vdev, qdf_nbuf_t nbuf,
|
|
|
*/
|
|
|
dp_tx_comp_free_buf(soc, tx_desc, false);
|
|
|
i++;
|
|
|
- dp_tx_desc_release(tx_desc, tx_q->desc_pool_id);
|
|
|
+ dp_tx_desc_release(soc, tx_desc,
|
|
|
+ tx_q->desc_pool_id);
|
|
|
continue;
|
|
|
}
|
|
|
|
|
|
if (msdu_info->frm_type == dp_tx_frm_sg)
|
|
|
dp_tx_sg_unmap_buf(soc, nbuf, msdu_info);
|
|
|
|
|
|
- dp_tx_desc_release(tx_desc, tx_q->desc_pool_id);
|
|
|
+ dp_tx_desc_release(soc, tx_desc, tx_q->desc_pool_id);
|
|
|
goto done;
|
|
|
}
|
|
|
|
|
@@ -3838,7 +3866,7 @@ dp_tx_reinject_mlo_hdl(struct dp_soc *soc, struct dp_vdev *vdev,
|
|
|
if (soc->arch_ops.dp_tx_mcast_handler)
|
|
|
soc->arch_ops.dp_tx_mcast_handler(soc, vdev, nbuf);
|
|
|
|
|
|
- dp_tx_desc_release(tx_desc, tx_desc->pool_id);
|
|
|
+ dp_tx_desc_release(soc, tx_desc, tx_desc->pool_id);
|
|
|
return true;
|
|
|
}
|
|
|
|
|
@@ -3982,7 +4010,7 @@ void dp_tx_reinject_handler(struct dp_soc *soc,
|
|
|
qdf_nbuf_free(nbuf);
|
|
|
}
|
|
|
|
|
|
- dp_tx_desc_release(tx_desc, tx_desc->pool_id);
|
|
|
+ dp_tx_desc_release(soc, tx_desc, tx_desc->pool_id);
|
|
|
}
|
|
|
|
|
|
void dp_tx_inspect_handler(struct dp_soc *soc,
|
|
@@ -3999,7 +4027,7 @@ void dp_tx_inspect_handler(struct dp_soc *soc,
|
|
|
qdf_nbuf_len(tx_desc->nbuf));
|
|
|
|
|
|
DP_TX_FREE_SINGLE_BUF(soc, tx_desc->nbuf);
|
|
|
- dp_tx_desc_release(tx_desc, tx_desc->pool_id);
|
|
|
+ dp_tx_desc_release(soc, tx_desc, tx_desc->pool_id);
|
|
|
}
|
|
|
|
|
|
#ifdef MESH_MODE_SUPPORT
|
|
@@ -5481,7 +5509,7 @@ dp_tx_mcast_reinject_handler(struct dp_soc *soc, struct dp_tx_desc_s *desc)
|
|
|
DP_STATS_INC_PKT(vdev, tx_i.reinject_pkts, 1,
|
|
|
qdf_nbuf_len(desc->nbuf));
|
|
|
soc->arch_ops.dp_tx_mcast_handler(soc, vdev, desc->nbuf);
|
|
|
- dp_tx_desc_release(desc, desc->pool_id);
|
|
|
+ dp_tx_desc_release(soc, desc, desc->pool_id);
|
|
|
dp_vdev_unref_delete(soc, vdev, DP_MOD_ID_REINJECT);
|
|
|
return true;
|
|
|
}
|
|
@@ -5690,7 +5718,7 @@ dp_tx_comp_process_desc_list(struct dp_soc *soc,
|
|
|
|
|
|
dp_tx_comp_process_desc(soc, desc, &ts, txrx_peer);
|
|
|
|
|
|
- dp_tx_desc_release(desc, desc->pool_id);
|
|
|
+ dp_tx_desc_release(soc, desc, desc->pool_id);
|
|
|
desc = next;
|
|
|
}
|
|
|
dp_tx_nbuf_dev_kfree_list(&h);
|
|
@@ -5943,7 +5971,8 @@ more_data:
|
|
|
tx_desc->id);
|
|
|
tx_desc->flags |= DP_TX_DESC_FLAG_TX_COMP_ERR;
|
|
|
dp_tx_comp_free_buf(soc, tx_desc, false);
|
|
|
- dp_tx_desc_release(tx_desc, tx_desc->pool_id);
|
|
|
+ dp_tx_desc_release(soc, tx_desc,
|
|
|
+ tx_desc->pool_id);
|
|
|
goto next_desc;
|
|
|
}
|
|
|
|
|
@@ -6126,6 +6155,26 @@ void dp_tx_vdev_update_search_flags(struct dp_vdev *vdev)
|
|
|
vdev->search_type = HAL_TX_ADDR_SEARCH_DEFAULT;
|
|
|
}
|
|
|
|
|
|
+#ifdef WLAN_SUPPORT_PPEDS
|
|
|
+static inline bool
|
|
|
+dp_is_tx_desc_flush_match(struct dp_pdev *pdev,
|
|
|
+ struct dp_vdev *vdev,
|
|
|
+ struct dp_tx_desc_s *tx_desc)
|
|
|
+{
|
|
|
+ if (!(tx_desc && (tx_desc->flags & DP_TX_DESC_FLAG_ALLOCATED)))
|
|
|
+ return false;
|
|
|
+
|
|
|
+ if (tx_desc->flags & DP_TX_DESC_FLAG_PPEDS)
|
|
|
+ return true;
|
|
|
+ /*
|
|
|
+ * if vdev is given, then only check whether desc
|
|
|
+ * vdev match. if vdev is NULL, then check whether
|
|
|
+ * desc pdev match.
|
|
|
+ */
|
|
|
+ return vdev ? (tx_desc->vdev_id == vdev->vdev_id) :
|
|
|
+ (tx_desc->pdev == pdev);
|
|
|
+}
|
|
|
+#else
|
|
|
static inline bool
|
|
|
dp_is_tx_desc_flush_match(struct dp_pdev *pdev,
|
|
|
struct dp_vdev *vdev,
|
|
@@ -6142,6 +6191,7 @@ dp_is_tx_desc_flush_match(struct dp_pdev *pdev,
|
|
|
return vdev ? (tx_desc->vdev_id == vdev->vdev_id) :
|
|
|
(tx_desc->pdev == pdev);
|
|
|
}
|
|
|
+#endif
|
|
|
|
|
|
#ifdef QCA_LL_TX_FLOW_CONTROL_V2
|
|
|
void dp_tx_desc_flush(struct dp_pdev *pdev, struct dp_vdev *vdev,
|
|
@@ -6201,7 +6251,7 @@ void dp_tx_desc_flush(struct dp_pdev *pdev, struct dp_vdev *vdev,
|
|
|
tx_desc->flags |= DP_TX_DESC_FLAG_FLUSH;
|
|
|
dp_tx_comp_free_buf(soc, tx_desc,
|
|
|
false);
|
|
|
- dp_tx_desc_release(tx_desc, i);
|
|
|
+ dp_tx_desc_release(soc, tx_desc, i);
|
|
|
} else {
|
|
|
tx_desc->vdev_id = DP_INVALID_VDEV_ID;
|
|
|
}
|
|
@@ -6263,10 +6313,9 @@ void dp_tx_desc_flush(struct dp_pdev *pdev, struct dp_vdev *vdev,
|
|
|
|
|
|
if (dp_is_tx_desc_flush_match(pdev, vdev, tx_desc)) {
|
|
|
if (force_free) {
|
|
|
- tx_desc->flags |= DP_TX_DESC_FLAG_FLUSH;
|
|
|
dp_tx_comp_free_buf(soc, tx_desc,
|
|
|
false);
|
|
|
- dp_tx_desc_release(tx_desc, i);
|
|
|
+ dp_tx_desc_release(soc, tx_desc, i);
|
|
|
} else {
|
|
|
dp_tx_desc_reset_vdev(soc, tx_desc,
|
|
|
i);
|