|
@@ -479,7 +479,7 @@ static uint8_t dp_tx_prepare_htt_metadata(struct dp_vdev *vdev, qdf_nbuf_t nbuf,
|
|
* needed here.
|
|
* needed here.
|
|
*/
|
|
*/
|
|
DP_STATS_INC(vdev,
|
|
DP_STATS_INC(vdev,
|
|
- tx_i.dropped.headroom_insufficient,
|
|
|
|
|
|
+ tx_i[msdu_info->xmit_type].dropped.headroom_insufficient,
|
|
1);
|
|
1);
|
|
qdf_print(" %s[%d] skb_realloc_headroom failed",
|
|
qdf_print(" %s[%d] skb_realloc_headroom failed",
|
|
__func__, __LINE__);
|
|
__func__, __LINE__);
|
|
@@ -811,7 +811,8 @@ struct dp_tx_ext_desc_elem_s *dp_tx_prepare_ext_desc(struct dp_vdev *vdev,
|
|
qdf_mem_zero(&cached_ext_desc[0], HAL_TX_EXT_DESC_WITH_META_DATA);
|
|
qdf_mem_zero(&cached_ext_desc[0], HAL_TX_EXT_DESC_WITH_META_DATA);
|
|
|
|
|
|
if (!msdu_ext_desc) {
|
|
if (!msdu_ext_desc) {
|
|
- DP_STATS_INC(vdev, tx_i.dropped.desc_na.num, 1);
|
|
|
|
|
|
+ DP_STATS_INC(vdev,
|
|
|
|
+ tx_i[msdu_info->xmit_type].dropped.desc_na.num, 1);
|
|
return NULL;
|
|
return NULL;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -997,6 +998,7 @@ dp_tx_send_traffic_end_indication_pkt(struct dp_vdev *vdev,
|
|
e_msdu_info.tx_queue = msdu_info->tx_queue;
|
|
e_msdu_info.tx_queue = msdu_info->tx_queue;
|
|
e_msdu_info.tid = msdu_info->tid;
|
|
e_msdu_info.tid = msdu_info->tid;
|
|
e_msdu_info.exception_fw = 1;
|
|
e_msdu_info.exception_fw = 1;
|
|
|
|
+ e_msdu_info.xmit_type = msdu_info->xmit_type;
|
|
desc_ext->host_tx_desc_pool = 1;
|
|
desc_ext->host_tx_desc_pool = 1;
|
|
desc_ext->traffic_end_indication = 1;
|
|
desc_ext->traffic_end_indication = 1;
|
|
nbuf = dp_tx_send_msdu_single(vdev, end_nbuf, &e_msdu_info,
|
|
nbuf = dp_tx_send_msdu_single(vdev, end_nbuf, &e_msdu_info,
|
|
@@ -1174,6 +1176,7 @@ struct dp_tx_desc_s *dp_tx_prepare_desc_single(struct dp_vdev *vdev,
|
|
struct dp_tx_desc_s *tx_desc;
|
|
struct dp_tx_desc_s *tx_desc;
|
|
struct dp_pdev *pdev = vdev->pdev;
|
|
struct dp_pdev *pdev = vdev->pdev;
|
|
struct dp_soc *soc = pdev->soc;
|
|
struct dp_soc *soc = pdev->soc;
|
|
|
|
+ uint8_t xmit_type = msdu_info->xmit_type;
|
|
|
|
|
|
if (dp_tx_limit_check(vdev, nbuf))
|
|
if (dp_tx_limit_check(vdev, nbuf))
|
|
return NULL;
|
|
return NULL;
|
|
@@ -1185,8 +1188,11 @@ struct dp_tx_desc_s *dp_tx_prepare_desc_single(struct dp_vdev *vdev,
|
|
tx_desc = dp_tx_desc_alloc(soc, desc_pool_id);
|
|
tx_desc = dp_tx_desc_alloc(soc, desc_pool_id);
|
|
|
|
|
|
if (qdf_unlikely(!tx_desc)) {
|
|
if (qdf_unlikely(!tx_desc)) {
|
|
- DP_STATS_INC(vdev, tx_i.dropped.desc_na.num, 1);
|
|
|
|
- DP_STATS_INC(vdev, tx_i.dropped.desc_na_exc_alloc_fail.num, 1);
|
|
|
|
|
|
+ DP_STATS_INC(vdev,
|
|
|
|
+ tx_i[xmit_type].dropped.desc_na.num, 1);
|
|
|
|
+ DP_STATS_INC(vdev,
|
|
|
|
+ tx_i[xmit_type].dropped.desc_na_exc_alloc_fail.num,
|
|
|
|
+ 1);
|
|
return NULL;
|
|
return NULL;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -1261,7 +1267,8 @@ struct dp_tx_desc_s *dp_tx_prepare_desc_single(struct dp_vdev *vdev,
|
|
|
|
|
|
if (qdf_unlikely(qdf_nbuf_headroom(nbuf) < align_pad)) {
|
|
if (qdf_unlikely(qdf_nbuf_headroom(nbuf) < align_pad)) {
|
|
DP_STATS_INC(vdev,
|
|
DP_STATS_INC(vdev,
|
|
- tx_i.dropped.headroom_insufficient, 1);
|
|
|
|
|
|
+ tx_i[xmit_type].dropped.headroom_insufficient,
|
|
|
|
+ 1);
|
|
goto failure;
|
|
goto failure;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -1334,7 +1341,8 @@ static struct dp_tx_desc_s *dp_tx_prepare_desc(struct dp_vdev *vdev,
|
|
tx_desc = dp_tx_desc_alloc(soc, desc_pool_id);
|
|
tx_desc = dp_tx_desc_alloc(soc, desc_pool_id);
|
|
|
|
|
|
if (!tx_desc) {
|
|
if (!tx_desc) {
|
|
- DP_STATS_INC(vdev, tx_i.dropped.desc_na.num, 1);
|
|
|
|
|
|
+ DP_STATS_INC(vdev,
|
|
|
|
+ tx_i[msdu_info->xmit_type].dropped.desc_na.num, 1);
|
|
return NULL;
|
|
return NULL;
|
|
}
|
|
}
|
|
dp_tx_tso_seg_history_add(soc, msdu_info->u.tso_info.curr_seg,
|
|
dp_tx_tso_seg_history_add(soc, msdu_info->u.tso_info.curr_seg,
|
|
@@ -1413,11 +1421,14 @@ static qdf_nbuf_t dp_tx_prepare_raw(struct dp_vdev *vdev, qdf_nbuf_t nbuf,
|
|
struct dp_tx_sg_info_s *sg_info = &msdu_info->u.sg_info;
|
|
struct dp_tx_sg_info_s *sg_info = &msdu_info->u.sg_info;
|
|
qdf_dot3_qosframe_t *qos_wh = (qdf_dot3_qosframe_t *) nbuf->data;
|
|
qdf_dot3_qosframe_t *qos_wh = (qdf_dot3_qosframe_t *) nbuf->data;
|
|
|
|
|
|
- DP_STATS_INC_PKT(vdev, tx_i.raw.raw_pkt, 1, qdf_nbuf_len(nbuf));
|
|
|
|
|
|
+ DP_STATS_INC_PKT(vdev, tx_i[msdu_info->xmit_type].raw.raw_pkt,
|
|
|
|
+ 1, qdf_nbuf_len(nbuf));
|
|
|
|
|
|
/* Continue only if frames are of DATA type */
|
|
/* Continue only if frames are of DATA type */
|
|
if (!DP_FRAME_IS_DATA(qos_wh)) {
|
|
if (!DP_FRAME_IS_DATA(qos_wh)) {
|
|
- DP_STATS_INC(vdev, tx_i.raw.invalid_raw_pkt_datatype, 1);
|
|
|
|
|
|
+ DP_STATS_INC(vdev,
|
|
|
|
+ tx_i[msdu_info->xmit_type].raw.invalid_raw_pkt_datatype,
|
|
|
|
+ 1);
|
|
dp_tx_debug("Pkt. recd is of not data type");
|
|
dp_tx_debug("Pkt. recd is of not data type");
|
|
goto error;
|
|
goto error;
|
|
}
|
|
}
|
|
@@ -1435,7 +1446,9 @@ static qdf_nbuf_t dp_tx_prepare_raw(struct dp_vdev *vdev, qdf_nbuf_t nbuf,
|
|
*/
|
|
*/
|
|
if (i >= DP_TX_MAX_NUM_FRAGS) {
|
|
if (i >= DP_TX_MAX_NUM_FRAGS) {
|
|
dp_err_rl("nbuf cnt exceeds the max number of segs");
|
|
dp_err_rl("nbuf cnt exceeds the max number of segs");
|
|
- DP_STATS_INC(vdev, tx_i.raw.num_frags_overflow_err, 1);
|
|
|
|
|
|
+ DP_STATS_INC(vdev,
|
|
|
|
+ tx_i[msdu_info->xmit_type].raw.num_frags_overflow_err,
|
|
|
|
+ 1);
|
|
goto error;
|
|
goto error;
|
|
}
|
|
}
|
|
if (QDF_STATUS_SUCCESS !=
|
|
if (QDF_STATUS_SUCCESS !=
|
|
@@ -1444,7 +1457,9 @@ static qdf_nbuf_t dp_tx_prepare_raw(struct dp_vdev *vdev, qdf_nbuf_t nbuf,
|
|
QDF_DMA_TO_DEVICE,
|
|
QDF_DMA_TO_DEVICE,
|
|
curr_nbuf->len)) {
|
|
curr_nbuf->len)) {
|
|
dp_tx_err("%s dma map error ", __func__);
|
|
dp_tx_err("%s dma map error ", __func__);
|
|
- DP_STATS_INC(vdev, tx_i.raw.dma_map_error, 1);
|
|
|
|
|
|
+ DP_STATS_INC(vdev,
|
|
|
|
+ tx_i[msdu_info->xmit_type].raw.dma_map_error,
|
|
|
|
+ 1);
|
|
goto error;
|
|
goto error;
|
|
}
|
|
}
|
|
/* Update the count of mapped nbuf's */
|
|
/* Update the count of mapped nbuf's */
|
|
@@ -2190,11 +2205,13 @@ static inline qdf_nbuf_t dp_mesh_tx_comp_free_buff(struct dp_soc *soc,
|
|
{
|
|
{
|
|
qdf_nbuf_t nbuf = tx_desc->nbuf;
|
|
qdf_nbuf_t nbuf = tx_desc->nbuf;
|
|
struct dp_vdev *vdev = NULL;
|
|
struct dp_vdev *vdev = NULL;
|
|
|
|
+ uint8_t xmit_type = qdf_nbuf_get_vdev_xmit_type(nbuf);
|
|
|
|
|
|
vdev = dp_vdev_get_ref_by_id(soc, tx_desc->vdev_id, DP_MOD_ID_MESH);
|
|
vdev = dp_vdev_get_ref_by_id(soc, tx_desc->vdev_id, DP_MOD_ID_MESH);
|
|
if (tx_desc->flags & DP_TX_DESC_FLAG_TO_FW) {
|
|
if (tx_desc->flags & DP_TX_DESC_FLAG_TO_FW) {
|
|
if (vdev)
|
|
if (vdev)
|
|
- DP_STATS_INC(vdev, tx_i.mesh.completion_fw, 1);
|
|
|
|
|
|
+ DP_STATS_INC(vdev,
|
|
|
|
+ tx_i[xmit_type].mesh.completion_fw, 1);
|
|
|
|
|
|
if (delayed_free)
|
|
if (delayed_free)
|
|
return nbuf;
|
|
return nbuf;
|
|
@@ -3051,7 +3068,8 @@ dp_tx_send_msdu_single(struct dp_vdev *vdev, qdf_nbuf_t nbuf,
|
|
if (!paddr) {
|
|
if (!paddr) {
|
|
/* Handle failure */
|
|
/* Handle failure */
|
|
dp_err("qdf_nbuf_map failed");
|
|
dp_err("qdf_nbuf_map failed");
|
|
- DP_STATS_INC(vdev, tx_i.dropped.dma_error, 1);
|
|
|
|
|
|
+ DP_STATS_INC(vdev,
|
|
|
|
+ tx_i[msdu_info->xmit_type].dropped.dma_error, 1);
|
|
drop_code = TX_DMA_MAP_ERR;
|
|
drop_code = TX_DMA_MAP_ERR;
|
|
goto release_desc;
|
|
goto release_desc;
|
|
}
|
|
}
|
|
@@ -3487,6 +3505,7 @@ static qdf_nbuf_t dp_tx_prepare_sg(struct dp_vdev *vdev, qdf_nbuf_t nbuf,
|
|
uint32_t cur_frag, nr_frags, i;
|
|
uint32_t cur_frag, nr_frags, i;
|
|
qdf_dma_addr_t paddr;
|
|
qdf_dma_addr_t paddr;
|
|
struct dp_tx_sg_info_s *sg_info;
|
|
struct dp_tx_sg_info_s *sg_info;
|
|
|
|
+ uint8_t xmit_type = msdu_info->xmit_type;
|
|
|
|
|
|
sg_info = &msdu_info->u.sg_info;
|
|
sg_info = &msdu_info->u.sg_info;
|
|
nr_frags = qdf_nbuf_get_nr_frags(nbuf);
|
|
nr_frags = qdf_nbuf_get_nr_frags(nbuf);
|
|
@@ -3496,7 +3515,8 @@ static qdf_nbuf_t dp_tx_prepare_sg(struct dp_vdev *vdev, qdf_nbuf_t nbuf,
|
|
QDF_DMA_TO_DEVICE,
|
|
QDF_DMA_TO_DEVICE,
|
|
qdf_nbuf_headlen(nbuf))) {
|
|
qdf_nbuf_headlen(nbuf))) {
|
|
dp_tx_err("dma map error");
|
|
dp_tx_err("dma map error");
|
|
- DP_STATS_INC(vdev, tx_i.sg.dma_map_error, 1);
|
|
|
|
|
|
+ DP_STATS_INC(vdev, tx_i[xmit_type].sg.dma_map_error,
|
|
|
|
+ 1);
|
|
qdf_nbuf_free(nbuf);
|
|
qdf_nbuf_free(nbuf);
|
|
return NULL;
|
|
return NULL;
|
|
}
|
|
}
|
|
@@ -3513,7 +3533,9 @@ static qdf_nbuf_t dp_tx_prepare_sg(struct dp_vdev *vdev, qdf_nbuf_t nbuf,
|
|
QDF_DMA_TO_DEVICE,
|
|
QDF_DMA_TO_DEVICE,
|
|
cur_frag)) {
|
|
cur_frag)) {
|
|
dp_tx_err("frag dma map error");
|
|
dp_tx_err("frag dma map error");
|
|
- DP_STATS_INC(vdev, tx_i.sg.dma_map_error, 1);
|
|
|
|
|
|
+ DP_STATS_INC(vdev,
|
|
|
|
+ tx_i[xmit_type].sg.dma_map_error,
|
|
|
|
+ 1);
|
|
goto map_err;
|
|
goto map_err;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -3712,7 +3734,7 @@ static bool dp_check_exc_metadata(struct cdp_tx_exception_metadata *tx_exc)
|
|
bool dp_tx_mcast_enhance(struct dp_vdev *vdev, qdf_nbuf_t nbuf)
|
|
bool dp_tx_mcast_enhance(struct dp_vdev *vdev, qdf_nbuf_t nbuf)
|
|
{
|
|
{
|
|
qdf_ether_header_t *eh;
|
|
qdf_ether_header_t *eh;
|
|
-
|
|
|
|
|
|
+ uint8_t xmit_type = qdf_nbuf_get_vdev_xmit_type(nbuf);
|
|
/* Mcast to Ucast Conversion*/
|
|
/* Mcast to Ucast Conversion*/
|
|
if (qdf_likely(!vdev->mcast_enhancement_en))
|
|
if (qdf_likely(!vdev->mcast_enhancement_en))
|
|
return true;
|
|
return true;
|
|
@@ -3723,7 +3745,7 @@ bool dp_tx_mcast_enhance(struct dp_vdev *vdev, qdf_nbuf_t nbuf)
|
|
dp_verbose_debug("Mcast frm for ME %pK", vdev);
|
|
dp_verbose_debug("Mcast frm for ME %pK", vdev);
|
|
qdf_nbuf_set_next(nbuf, NULL);
|
|
qdf_nbuf_set_next(nbuf, NULL);
|
|
|
|
|
|
- DP_STATS_INC_PKT(vdev, tx_i.mcast_en.mcast_pkt, 1,
|
|
|
|
|
|
+ DP_STATS_INC_PKT(vdev, tx_i[xmit_type].mcast_en.mcast_pkt, 1,
|
|
qdf_nbuf_len(nbuf));
|
|
qdf_nbuf_len(nbuf));
|
|
if (dp_tx_prepare_send_me(vdev, nbuf) ==
|
|
if (dp_tx_prepare_send_me(vdev, nbuf) ==
|
|
QDF_STATUS_SUCCESS) {
|
|
QDF_STATUS_SUCCESS) {
|
|
@@ -3757,12 +3779,15 @@ bool dp_tx_mcast_enhance(struct dp_vdev *vdev, qdf_nbuf_t nbuf)
|
|
*/
|
|
*/
|
|
static inline bool dp_tx_mcast_drop(struct dp_vdev *vdev, qdf_nbuf_t nbuf)
|
|
static inline bool dp_tx_mcast_drop(struct dp_vdev *vdev, qdf_nbuf_t nbuf)
|
|
{
|
|
{
|
|
|
|
+ uint8_t xmit_type = qdf_nbuf_get_vdev_xmit_type(nbuf);
|
|
|
|
+
|
|
/* Drop tx mcast and WDS Extended feature check */
|
|
/* Drop tx mcast and WDS Extended feature check */
|
|
if (qdf_unlikely((vdev->drop_tx_mcast) && (vdev->wds_ext_enabled))) {
|
|
if (qdf_unlikely((vdev->drop_tx_mcast) && (vdev->wds_ext_enabled))) {
|
|
qdf_ether_header_t *eh = (qdf_ether_header_t *)
|
|
qdf_ether_header_t *eh = (qdf_ether_header_t *)
|
|
qdf_nbuf_data(nbuf);
|
|
qdf_nbuf_data(nbuf);
|
|
if (DP_FRAME_IS_MULTICAST((eh)->ether_dhost)) {
|
|
if (DP_FRAME_IS_MULTICAST((eh)->ether_dhost)) {
|
|
- DP_STATS_INC(vdev, tx_i.dropped.tx_mcast_drop, 1);
|
|
|
|
|
|
+ DP_STATS_INC(vdev,
|
|
|
|
+ tx_i[xmit_type].dropped.tx_mcast_drop, 1);
|
|
return true;
|
|
return true;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
@@ -3930,6 +3955,7 @@ dp_tx_send_exception(struct cdp_soc_t *soc_hdl, uint8_t vdev_id,
|
|
struct dp_tx_msdu_info_s msdu_info;
|
|
struct dp_tx_msdu_info_s msdu_info;
|
|
struct dp_vdev *vdev = dp_vdev_get_ref_by_id(soc, vdev_id,
|
|
struct dp_vdev *vdev = dp_vdev_get_ref_by_id(soc, vdev_id,
|
|
DP_MOD_ID_TX_EXCEPTION);
|
|
DP_MOD_ID_TX_EXCEPTION);
|
|
|
|
+ uint8_t xmit_type = qdf_nbuf_get_vdev_xmit_type(nbuf);
|
|
|
|
|
|
if (qdf_unlikely(!vdev))
|
|
if (qdf_unlikely(!vdev))
|
|
goto fail;
|
|
goto fail;
|
|
@@ -3940,10 +3966,11 @@ dp_tx_send_exception(struct cdp_soc_t *soc_hdl, uint8_t vdev_id,
|
|
goto fail;
|
|
goto fail;
|
|
|
|
|
|
msdu_info.tid = tx_exc_metadata->tid;
|
|
msdu_info.tid = tx_exc_metadata->tid;
|
|
|
|
+ msdu_info.xmit_type = xmit_type;
|
|
dp_verbose_debug("skb "QDF_MAC_ADDR_FMT,
|
|
dp_verbose_debug("skb "QDF_MAC_ADDR_FMT,
|
|
QDF_MAC_ADDR_REF(nbuf->data));
|
|
QDF_MAC_ADDR_REF(nbuf->data));
|
|
|
|
|
|
- DP_STATS_INC_PKT(vdev, tx_i.rcvd, 1, qdf_nbuf_len(nbuf));
|
|
|
|
|
|
+ DP_STATS_INC_PKT(vdev, tx_i[xmit_type].rcvd, 1, qdf_nbuf_len(nbuf));
|
|
|
|
|
|
if (qdf_unlikely(!dp_check_exc_metadata(tx_exc_metadata))) {
|
|
if (qdf_unlikely(!dp_check_exc_metadata(tx_exc_metadata))) {
|
|
dp_tx_err("Invalid parameters in exception path");
|
|
dp_tx_err("Invalid parameters in exception path");
|
|
@@ -3959,8 +3986,8 @@ dp_tx_send_exception(struct cdp_soc_t *soc_hdl, uint8_t vdev_id,
|
|
DP_MOD_ID_TX_EXCEPTION);
|
|
DP_MOD_ID_TX_EXCEPTION);
|
|
if (qdf_unlikely(!peer)) {
|
|
if (qdf_unlikely(!peer)) {
|
|
DP_STATS_INC(vdev,
|
|
DP_STATS_INC(vdev,
|
|
- tx_i.dropped.invalid_peer_id_in_exc_path,
|
|
|
|
- 1);
|
|
|
|
|
|
+ tx_i[xmit_type].dropped.invalid_peer_id_in_exc_path,
|
|
|
|
+ 1);
|
|
goto fail;
|
|
goto fail;
|
|
}
|
|
}
|
|
dp_peer_unref_delete(peer, DP_MOD_ID_TX_EXCEPTION);
|
|
dp_peer_unref_delete(peer, DP_MOD_ID_TX_EXCEPTION);
|
|
@@ -3991,7 +4018,8 @@ dp_tx_send_exception(struct cdp_soc_t *soc_hdl, uint8_t vdev_id,
|
|
goto fail;
|
|
goto fail;
|
|
}
|
|
}
|
|
|
|
|
|
- DP_STATS_INC(vdev, tx_i.rcvd.num, msdu_info.num_seg - 1);
|
|
|
|
|
|
+ DP_STATS_INC(vdev,
|
|
|
|
+ tx_i[xmit_type].rcvd.num, msdu_info.num_seg - 1);
|
|
|
|
|
|
goto send_multiple;
|
|
goto send_multiple;
|
|
}
|
|
}
|
|
@@ -4006,14 +4034,14 @@ dp_tx_send_exception(struct cdp_soc_t *soc_hdl, uint8_t vdev_id,
|
|
|
|
|
|
dp_verbose_debug("non-TSO SG frame %pK", vdev);
|
|
dp_verbose_debug("non-TSO SG frame %pK", vdev);
|
|
|
|
|
|
- DP_STATS_INC_PKT(vdev, tx_i.sg.sg_pkt, 1,
|
|
|
|
|
|
+ DP_STATS_INC_PKT(vdev, tx_i[xmit_type].sg.sg_pkt, 1,
|
|
qdf_nbuf_len(nbuf));
|
|
qdf_nbuf_len(nbuf));
|
|
|
|
|
|
goto send_multiple;
|
|
goto send_multiple;
|
|
}
|
|
}
|
|
|
|
|
|
if (qdf_likely(tx_exc_metadata->is_tx_sniffer)) {
|
|
if (qdf_likely(tx_exc_metadata->is_tx_sniffer)) {
|
|
- DP_STATS_INC_PKT(vdev, tx_i.sniffer_rcvd, 1,
|
|
|
|
|
|
+ DP_STATS_INC_PKT(vdev, tx_i[xmit_type].sniffer_rcvd, 1,
|
|
qdf_nbuf_len(nbuf));
|
|
qdf_nbuf_len(nbuf));
|
|
|
|
|
|
dp_tx_add_tx_sniffer_meta_data(vdev, &msdu_info,
|
|
dp_tx_add_tx_sniffer_meta_data(vdev, &msdu_info,
|
|
@@ -4029,7 +4057,8 @@ dp_tx_send_exception(struct cdp_soc_t *soc_hdl, uint8_t vdev_id,
|
|
* to minimize lock contention for these resources.
|
|
* to minimize lock contention for these resources.
|
|
*/
|
|
*/
|
|
dp_tx_get_queue(vdev, nbuf, &msdu_info.tx_queue);
|
|
dp_tx_get_queue(vdev, nbuf, &msdu_info.tx_queue);
|
|
- DP_STATS_INC(vdev, tx_i.rcvd_per_core[msdu_info.tx_queue.desc_pool_id],
|
|
|
|
|
|
+ DP_STATS_INC(vdev,
|
|
|
|
+ tx_i[xmit_type].rcvd_per_core[msdu_info.tx_queue.desc_pool_id],
|
|
1);
|
|
1);
|
|
|
|
|
|
/*
|
|
/*
|
|
@@ -4052,7 +4081,7 @@ dp_tx_send_exception(struct cdp_soc_t *soc_hdl, uint8_t vdev_id,
|
|
*/
|
|
*/
|
|
dp_tx_nawds_handler(soc, vdev, &msdu_info, nbuf,
|
|
dp_tx_nawds_handler(soc, vdev, &msdu_info, nbuf,
|
|
tx_exc_metadata->peer_id);
|
|
tx_exc_metadata->peer_id);
|
|
- DP_STATS_INC_PKT(vdev, tx_i.nawds_mcast,
|
|
|
|
|
|
+ DP_STATS_INC_PKT(vdev, tx_i[xmit_type].nawds_mcast,
|
|
1, qdf_nbuf_len(nbuf));
|
|
1, qdf_nbuf_len(nbuf));
|
|
}
|
|
}
|
|
|
|
|
|
@@ -4062,7 +4091,7 @@ dp_tx_send_exception(struct cdp_soc_t *soc_hdl, uint8_t vdev_id,
|
|
/*
|
|
/*
|
|
* Check exception descriptors
|
|
* Check exception descriptors
|
|
*/
|
|
*/
|
|
- if (dp_tx_exception_limit_check(vdev))
|
|
|
|
|
|
+ if (dp_tx_exception_limit_check(vdev, xmit_type))
|
|
goto fail;
|
|
goto fail;
|
|
|
|
|
|
/* Single linear frame */
|
|
/* Single linear frame */
|
|
@@ -4097,13 +4126,16 @@ dp_tx_send_exception_vdev_id_check(struct cdp_soc_t *soc_hdl,
|
|
struct dp_soc *soc = cdp_soc_t_to_dp_soc(soc_hdl);
|
|
struct dp_soc *soc = cdp_soc_t_to_dp_soc(soc_hdl);
|
|
struct dp_vdev *vdev = dp_vdev_get_ref_by_id(soc, vdev_id,
|
|
struct dp_vdev *vdev = dp_vdev_get_ref_by_id(soc, vdev_id,
|
|
DP_MOD_ID_TX_EXCEPTION);
|
|
DP_MOD_ID_TX_EXCEPTION);
|
|
|
|
+ uint8_t xmit_type = qdf_nbuf_get_vdev_xmit_type(nbuf);
|
|
|
|
|
|
if (qdf_unlikely(!vdev))
|
|
if (qdf_unlikely(!vdev))
|
|
goto fail;
|
|
goto fail;
|
|
|
|
|
|
if (qdf_unlikely(dp_tx_per_pkt_vdev_id_check(nbuf, vdev)
|
|
if (qdf_unlikely(dp_tx_per_pkt_vdev_id_check(nbuf, vdev)
|
|
== QDF_STATUS_E_FAILURE)) {
|
|
== QDF_STATUS_E_FAILURE)) {
|
|
- DP_STATS_INC(vdev, tx_i.dropped.fail_per_pkt_vdev_id_check, 1);
|
|
|
|
|
|
+ DP_STATS_INC(vdev,
|
|
|
|
+ tx_i[xmit_type].dropped.fail_per_pkt_vdev_id_check,
|
|
|
|
+ 1);
|
|
goto fail;
|
|
goto fail;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -4129,6 +4161,7 @@ qdf_nbuf_t dp_tx_send_mesh(struct cdp_soc_t *soc_hdl, uint8_t vdev_id,
|
|
qdf_nbuf_t nbuf_clone = NULL;
|
|
qdf_nbuf_t nbuf_clone = NULL;
|
|
struct dp_vdev *vdev;
|
|
struct dp_vdev *vdev;
|
|
uint8_t no_enc_frame = 0;
|
|
uint8_t no_enc_frame = 0;
|
|
|
|
+ uint8_t xmit_type = qdf_nbuf_get_vdev_xmit_type(nbuf);
|
|
|
|
|
|
nbuf_mesh = qdf_nbuf_unshare(nbuf);
|
|
nbuf_mesh = qdf_nbuf_unshare(nbuf);
|
|
if (!nbuf_mesh) {
|
|
if (!nbuf_mesh) {
|
|
@@ -4169,7 +4202,8 @@ qdf_nbuf_t dp_tx_send_mesh(struct cdp_soc_t *soc_hdl, uint8_t vdev_id,
|
|
|
|
|
|
if (nbuf_clone) {
|
|
if (nbuf_clone) {
|
|
if (!dp_tx_send(soc_hdl, vdev_id, nbuf_clone)) {
|
|
if (!dp_tx_send(soc_hdl, vdev_id, nbuf_clone)) {
|
|
- DP_STATS_INC(vdev, tx_i.mesh.exception_fw, 1);
|
|
|
|
|
|
+ DP_STATS_INC(vdev, tx_i[xmit_type].mesh.exception_fw,
|
|
|
|
+ 1);
|
|
} else {
|
|
} else {
|
|
qdf_nbuf_free(nbuf_clone);
|
|
qdf_nbuf_free(nbuf_clone);
|
|
}
|
|
}
|
|
@@ -4182,7 +4216,7 @@ qdf_nbuf_t dp_tx_send_mesh(struct cdp_soc_t *soc_hdl, uint8_t vdev_id,
|
|
|
|
|
|
nbuf = dp_tx_send(soc_hdl, vdev_id, nbuf);
|
|
nbuf = dp_tx_send(soc_hdl, vdev_id, nbuf);
|
|
if ((!nbuf) && no_enc_frame) {
|
|
if ((!nbuf) && no_enc_frame) {
|
|
- DP_STATS_INC(vdev, tx_i.mesh.exception_fw, 1);
|
|
|
|
|
|
+ DP_STATS_INC(vdev, tx_i[xmit_type].mesh.exception_fw, 1);
|
|
}
|
|
}
|
|
|
|
|
|
dp_vdev_unref_delete(soc, vdev, DP_MOD_ID_MESH);
|
|
dp_vdev_unref_delete(soc, vdev, DP_MOD_ID_MESH);
|
|
@@ -4221,12 +4255,13 @@ qdf_nbuf_t dp_tx_drop(struct cdp_soc_t *soc_hdl, uint8_t vdev_id,
|
|
{
|
|
{
|
|
struct dp_soc *soc = cdp_soc_t_to_dp_soc(soc_hdl);
|
|
struct dp_soc *soc = cdp_soc_t_to_dp_soc(soc_hdl);
|
|
struct dp_vdev *vdev = NULL;
|
|
struct dp_vdev *vdev = NULL;
|
|
|
|
+ uint8_t xmit_type = qdf_nbuf_get_vdev_xmit_type(nbuf);
|
|
|
|
|
|
vdev = soc->vdev_id_map[vdev_id];
|
|
vdev = soc->vdev_id_map[vdev_id];
|
|
if (qdf_unlikely(!vdev))
|
|
if (qdf_unlikely(!vdev))
|
|
return nbuf;
|
|
return nbuf;
|
|
|
|
|
|
- DP_STATS_INC(vdev, tx_i.dropped.drop_ingress, 1);
|
|
|
|
|
|
+ DP_STATS_INC(vdev, tx_i[xmit_type].dropped.drop_ingress, 1);
|
|
return nbuf;
|
|
return nbuf;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -4269,6 +4304,7 @@ qdf_nbuf_t dp_tx_send(struct cdp_soc_t *soc_hdl, uint8_t vdev_id,
|
|
struct dp_tx_msdu_info_s msdu_info = {0};
|
|
struct dp_tx_msdu_info_s msdu_info = {0};
|
|
struct dp_vdev *vdev = NULL;
|
|
struct dp_vdev *vdev = NULL;
|
|
qdf_nbuf_t end_nbuf = NULL;
|
|
qdf_nbuf_t end_nbuf = NULL;
|
|
|
|
+ uint8_t xmit_type;
|
|
|
|
|
|
if (qdf_unlikely(vdev_id >= MAX_VDEV_CNT))
|
|
if (qdf_unlikely(vdev_id >= MAX_VDEV_CNT))
|
|
return nbuf;
|
|
return nbuf;
|
|
@@ -4293,7 +4329,9 @@ qdf_nbuf_t dp_tx_send(struct cdp_soc_t *soc_hdl, uint8_t vdev_id,
|
|
* (TID override disabled)
|
|
* (TID override disabled)
|
|
*/
|
|
*/
|
|
msdu_info.tid = HTT_TX_EXT_TID_INVALID;
|
|
msdu_info.tid = HTT_TX_EXT_TID_INVALID;
|
|
- DP_STATS_INC_PKT(vdev, tx_i.rcvd, 1, qdf_nbuf_len(nbuf));
|
|
|
|
|
|
+ xmit_type = qdf_nbuf_get_vdev_xmit_type(nbuf);
|
|
|
|
+ msdu_info.xmit_type = xmit_type;
|
|
|
|
+ DP_STATS_INC_PKT(vdev, tx_i[xmit_type].rcvd, 1, qdf_nbuf_len(nbuf));
|
|
|
|
|
|
if (qdf_unlikely(vdev->mesh_vdev)) {
|
|
if (qdf_unlikely(vdev->mesh_vdev)) {
|
|
qdf_nbuf_t nbuf_mesh = dp_tx_extract_mesh_meta_data(vdev, nbuf,
|
|
qdf_nbuf_t nbuf_mesh = dp_tx_extract_mesh_meta_data(vdev, nbuf,
|
|
@@ -4314,7 +4352,8 @@ qdf_nbuf_t dp_tx_send(struct cdp_soc_t *soc_hdl, uint8_t vdev_id,
|
|
* to minimize lock contention for these resources.
|
|
* to minimize lock contention for these resources.
|
|
*/
|
|
*/
|
|
dp_tx_get_queue(vdev, nbuf, &msdu_info.tx_queue);
|
|
dp_tx_get_queue(vdev, nbuf, &msdu_info.tx_queue);
|
|
- DP_STATS_INC(vdev, tx_i.rcvd_per_core[msdu_info.tx_queue.desc_pool_id],
|
|
|
|
|
|
+ DP_STATS_INC(vdev,
|
|
|
|
+ tx_i[xmit_type].rcvd_per_core[msdu_info.tx_queue.desc_pool_id],
|
|
1);
|
|
1);
|
|
|
|
|
|
/*
|
|
/*
|
|
@@ -4347,7 +4386,8 @@ qdf_nbuf_t dp_tx_send(struct cdp_soc_t *soc_hdl, uint8_t vdev_id,
|
|
return nbuf;
|
|
return nbuf;
|
|
}
|
|
}
|
|
|
|
|
|
- DP_STATS_INC(vdev, tx_i.rcvd.num, msdu_info.num_seg - 1);
|
|
|
|
|
|
+ DP_STATS_INC(vdev, tx_i[xmit_type].rcvd.num,
|
|
|
|
+ msdu_info.num_seg - 1);
|
|
|
|
|
|
goto send_multiple;
|
|
goto send_multiple;
|
|
}
|
|
}
|
|
@@ -4370,7 +4410,7 @@ qdf_nbuf_t dp_tx_send(struct cdp_soc_t *soc_hdl, uint8_t vdev_id,
|
|
|
|
|
|
dp_verbose_debug("non-TSO SG frame %pK", vdev);
|
|
dp_verbose_debug("non-TSO SG frame %pK", vdev);
|
|
|
|
|
|
- DP_STATS_INC_PKT(vdev, tx_i.sg.sg_pkt, 1,
|
|
|
|
|
|
+ DP_STATS_INC_PKT(vdev, tx_i[xmit_type].sg.sg_pkt, 1,
|
|
qdf_nbuf_len(nbuf));
|
|
qdf_nbuf_len(nbuf));
|
|
|
|
|
|
goto send_multiple;
|
|
goto send_multiple;
|
|
@@ -4420,7 +4460,7 @@ qdf_nbuf_t dp_tx_send(struct cdp_soc_t *soc_hdl, uint8_t vdev_id,
|
|
sa_peer_id);
|
|
sa_peer_id);
|
|
}
|
|
}
|
|
peer_id = DP_INVALID_PEER;
|
|
peer_id = DP_INVALID_PEER;
|
|
- DP_STATS_INC_PKT(vdev, tx_i.nawds_mcast,
|
|
|
|
|
|
+ DP_STATS_INC_PKT(vdev, tx_i[xmit_type].nawds_mcast,
|
|
1, qdf_nbuf_len(nbuf));
|
|
1, qdf_nbuf_len(nbuf));
|
|
}
|
|
}
|
|
|
|
|
|
@@ -4451,6 +4491,7 @@ qdf_nbuf_t dp_tx_send_vdev_id_check(struct cdp_soc_t *soc_hdl,
|
|
{
|
|
{
|
|
struct dp_soc *soc = cdp_soc_t_to_dp_soc(soc_hdl);
|
|
struct dp_soc *soc = cdp_soc_t_to_dp_soc(soc_hdl);
|
|
struct dp_vdev *vdev = NULL;
|
|
struct dp_vdev *vdev = NULL;
|
|
|
|
+ uint8_t xmit_type = qdf_nbuf_get_vdev_xmit_type(nbuf);
|
|
|
|
|
|
if (qdf_unlikely(vdev_id >= MAX_VDEV_CNT))
|
|
if (qdf_unlikely(vdev_id >= MAX_VDEV_CNT))
|
|
return nbuf;
|
|
return nbuf;
|
|
@@ -4468,7 +4509,9 @@ qdf_nbuf_t dp_tx_send_vdev_id_check(struct cdp_soc_t *soc_hdl,
|
|
|
|
|
|
if (qdf_unlikely(dp_tx_per_pkt_vdev_id_check(nbuf, vdev)
|
|
if (qdf_unlikely(dp_tx_per_pkt_vdev_id_check(nbuf, vdev)
|
|
== QDF_STATUS_E_FAILURE)) {
|
|
== QDF_STATUS_E_FAILURE)) {
|
|
- DP_STATS_INC(vdev, tx_i.dropped.fail_per_pkt_vdev_id_check, 1);
|
|
|
|
|
|
+ DP_STATS_INC(vdev,
|
|
|
|
+ tx_i[xmit_type].dropped.fail_per_pkt_vdev_id_check,
|
|
|
|
+ 1);
|
|
return nbuf;
|
|
return nbuf;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -4562,13 +4605,14 @@ void dp_tx_reinject_handler(struct dp_soc *soc,
|
|
struct ieee80211_frame_addr4 *wh = (struct ieee80211_frame_addr4 *)(qdf_nbuf_data(nbuf));
|
|
struct ieee80211_frame_addr4 *wh = (struct ieee80211_frame_addr4 *)(qdf_nbuf_data(nbuf));
|
|
#endif
|
|
#endif
|
|
struct dp_txrx_peer *txrx_peer;
|
|
struct dp_txrx_peer *txrx_peer;
|
|
|
|
+ uint8_t xmit_type = qdf_nbuf_get_vdev_xmit_type(nbuf);
|
|
|
|
|
|
qdf_assert(vdev);
|
|
qdf_assert(vdev);
|
|
|
|
|
|
dp_tx_debug("Tx reinject path");
|
|
dp_tx_debug("Tx reinject path");
|
|
|
|
|
|
- DP_STATS_INC_PKT(vdev, tx_i.reinject_pkts, 1,
|
|
|
|
- qdf_nbuf_len(tx_desc->nbuf));
|
|
|
|
|
|
+ DP_STATS_INC_PKT(vdev, tx_i[xmit_type].reinject_pkts, 1,
|
|
|
|
+ qdf_nbuf_len(tx_desc->nbuf));
|
|
|
|
|
|
if (dp_tx_reinject_mlo_hdl(soc, vdev, tx_desc, nbuf, reinject_reason))
|
|
if (dp_tx_reinject_mlo_hdl(soc, vdev, tx_desc, nbuf, reinject_reason))
|
|
return;
|
|
return;
|
|
@@ -4641,7 +4685,8 @@ void dp_tx_reinject_handler(struct dp_soc *soc,
|
|
qdf_mem_zero(&msdu_info, sizeof(msdu_info));
|
|
qdf_mem_zero(&msdu_info, sizeof(msdu_info));
|
|
dp_tx_get_queue(vdev, nbuf,
|
|
dp_tx_get_queue(vdev, nbuf,
|
|
&msdu_info.tx_queue);
|
|
&msdu_info.tx_queue);
|
|
-
|
|
|
|
|
|
+ msdu_info.xmit_type =
|
|
|
|
+ qdf_nbuf_get_vdev_xmit_type(nbuf);
|
|
nbuf_copy = dp_tx_send_msdu_single(vdev,
|
|
nbuf_copy = dp_tx_send_msdu_single(vdev,
|
|
nbuf_copy,
|
|
nbuf_copy,
|
|
&msdu_info,
|
|
&msdu_info,
|
|
@@ -4669,12 +4714,12 @@ void dp_tx_inspect_handler(struct dp_soc *soc,
|
|
struct dp_tx_desc_s *tx_desc,
|
|
struct dp_tx_desc_s *tx_desc,
|
|
uint8_t *status)
|
|
uint8_t *status)
|
|
{
|
|
{
|
|
-
|
|
|
|
|
|
+ uint8_t xmit_type = qdf_nbuf_get_vdev_xmit_type(tx_desc->nbuf);
|
|
QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_INFO,
|
|
QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_INFO,
|
|
"%s Tx inspect path",
|
|
"%s Tx inspect path",
|
|
__func__);
|
|
__func__);
|
|
|
|
|
|
- DP_STATS_INC_PKT(vdev, tx_i.inspect_pkts, 1,
|
|
|
|
|
|
+ DP_STATS_INC_PKT(vdev, tx_i[xmit_type].inspect_pkts, 1,
|
|
qdf_nbuf_len(tx_desc->nbuf));
|
|
qdf_nbuf_len(tx_desc->nbuf));
|
|
|
|
|
|
DP_TX_FREE_SINGLE_BUF(soc, tx_desc->nbuf);
|
|
DP_TX_FREE_SINGLE_BUF(soc, tx_desc->nbuf);
|
|
@@ -6173,6 +6218,7 @@ static inline bool
|
|
dp_tx_mcast_reinject_handler(struct dp_soc *soc, struct dp_tx_desc_s *desc)
|
|
dp_tx_mcast_reinject_handler(struct dp_soc *soc, struct dp_tx_desc_s *desc)
|
|
{
|
|
{
|
|
struct dp_vdev *vdev = NULL;
|
|
struct dp_vdev *vdev = NULL;
|
|
|
|
+ uint8_t xmit_type;
|
|
|
|
|
|
if (desc->tx_status == HAL_TX_TQM_RR_MULTICAST_DROP) {
|
|
if (desc->tx_status == HAL_TX_TQM_RR_MULTICAST_DROP) {
|
|
if (!soc->arch_ops.dp_tx_mcast_handler ||
|
|
if (!soc->arch_ops.dp_tx_mcast_handler ||
|
|
@@ -6192,7 +6238,8 @@ dp_tx_mcast_reinject_handler(struct dp_soc *soc, struct dp_tx_desc_s *desc)
|
|
dp_vdev_unref_delete(soc, vdev, DP_MOD_ID_REINJECT);
|
|
dp_vdev_unref_delete(soc, vdev, DP_MOD_ID_REINJECT);
|
|
return false;
|
|
return false;
|
|
}
|
|
}
|
|
- DP_STATS_INC_PKT(vdev, tx_i.reinject_pkts, 1,
|
|
|
|
|
|
+ xmit_type = qdf_nbuf_get_vdev_xmit_type(desc->nbuf);
|
|
|
|
+ DP_STATS_INC_PKT(vdev, tx_i[xmit_type].reinject_pkts, 1,
|
|
qdf_nbuf_len(desc->nbuf));
|
|
qdf_nbuf_len(desc->nbuf));
|
|
soc->arch_ops.dp_tx_mcast_handler(soc, vdev, desc->nbuf);
|
|
soc->arch_ops.dp_tx_mcast_handler(soc, vdev, desc->nbuf);
|
|
dp_tx_desc_release(soc, desc, desc->pool_id);
|
|
dp_tx_desc_release(soc, desc, desc->pool_id);
|
|
@@ -7841,6 +7888,8 @@ dp_tx_multipass_send_pkt_to_repeater(struct dp_soc *soc, struct dp_vdev *vdev,
|
|
|
|
|
|
qdf_mem_zero(&msdu_info_copy, sizeof(msdu_info_copy));
|
|
qdf_mem_zero(&msdu_info_copy, sizeof(msdu_info_copy));
|
|
msdu_info_copy.tid = HTT_TX_EXT_TID_INVALID;
|
|
msdu_info_copy.tid = HTT_TX_EXT_TID_INVALID;
|
|
|
|
+ msdu_info_copy.xmit_type =
|
|
|
|
+ qdf_nbuf_get_vdev_xmit_type(nbuf);
|
|
HTT_TX_MSDU_EXT2_DESC_FLAG_VALID_KEY_FLAGS_SET(msdu_info_copy.meta_data[0], 1);
|
|
HTT_TX_MSDU_EXT2_DESC_FLAG_VALID_KEY_FLAGS_SET(msdu_info_copy.meta_data[0], 1);
|
|
nbuf_copy = dp_tx_send_msdu_single(vdev, nbuf_copy,
|
|
nbuf_copy = dp_tx_send_msdu_single(vdev, nbuf_copy,
|
|
&msdu_info_copy,
|
|
&msdu_info_copy,
|