qcacmn: use batch peer reference in TX path

In Tx data path get the peer reference and use
until there is a peer_id mismatch. This is to avoid
per packet atomic operations

Change-Id: I59cdbef19001c694654f0967381a9242788d9cbc
This commit is contained in:
Chaithanya Garrepalli
2020-08-25 21:30:20 +05:30
committed by snandini
parent d5f803a63e
commit 7db23eeca2

View File

@@ -3750,17 +3750,24 @@ dp_tx_comp_process_desc_list(struct dp_soc *soc,
struct dp_tx_desc_s *desc;
struct dp_tx_desc_s *next;
struct hal_tx_completion_status ts;
struct dp_peer *peer;
struct dp_peer *peer = NULL;
uint16_t peer_id = DP_INVALID_PEER;
qdf_nbuf_t netbuf;
desc = comp_head;
while (desc) {
if (peer_id != desc->peer_id) {
if (peer)
dp_peer_unref_delete(peer,
DP_MOD_ID_TX_COMP);
peer_id = desc->peer_id;
peer = dp_peer_get_ref_by_id(soc, peer_id,
DP_MOD_ID_TX_COMP);
}
if (qdf_likely(desc->flags & DP_TX_DESC_FLAG_SIMPLE)) {
struct dp_pdev *pdev = desc->pdev;
peer = dp_peer_get_ref_by_id(soc, desc->peer_id,
DP_MOD_ID_TX_COMP);
if (qdf_likely(peer)) {
/*
* Increment peer statistics
@@ -3771,9 +3778,7 @@ dp_tx_comp_process_desc_list(struct dp_soc *soc,
if (desc->tx_status !=
HAL_TX_TQM_RR_FRAME_ACKED)
peer->stats.tx.tx_failed++;
dp_peer_unref_delete(peer, DP_MOD_ID_TX_COMP);
DP_STATS_INC(peer, tx.tx_failed, 1);
}
qdf_assert(pdev);
@@ -3794,8 +3799,7 @@ dp_tx_comp_process_desc_list(struct dp_soc *soc,
continue;
}
hal_tx_comp_get_status(&desc->comp, &ts, soc->hal_soc);
peer = dp_peer_get_ref_by_id(soc, ts.peer_id,
DP_MOD_ID_TX_COMP);
dp_tx_comp_process_tx_status(soc, desc, &ts, peer, ring_id);
netbuf = desc->nbuf;
@@ -3807,14 +3811,13 @@ dp_tx_comp_process_desc_list(struct dp_soc *soc,
dp_tx_comp_process_desc(soc, desc, &ts, peer);
if (peer)
dp_peer_unref_delete(peer, DP_MOD_ID_TX_COMP);
next = desc->next;
dp_tx_desc_release(desc, desc->pool_id);
desc = next;
}
if (peer)
dp_peer_unref_delete(peer, DP_MOD_ID_TX_COMP);
}
/**
@@ -4099,18 +4102,17 @@ more_data:
dp_tx_process_htt_completion(tx_desc,
htt_tx_status, ring_id);
} else {
tx_desc->peer_id =
hal_tx_comp_get_peer_id(tx_comp_hal_desc);
tx_desc->tx_status =
hal_tx_comp_get_tx_status(tx_comp_hal_desc);
/*
* If the fast completion mode is enabled extended
* metadata from descriptor is not copied
*/
if (qdf_likely(tx_desc->flags &
DP_TX_DESC_FLAG_SIMPLE)) {
tx_desc->peer_id =
hal_tx_comp_get_peer_id(tx_comp_hal_desc);
tx_desc->tx_status =
hal_tx_comp_get_tx_status(tx_comp_hal_desc);
DP_TX_DESC_FLAG_SIMPLE))
goto add_to_pool;
}
/*
* If the descriptor is already freed in vdev_detach,