summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTiger Yu <tfyu@codeaurora.org>2018-06-19 17:36:19 +0800
committerTiger Yu <tfyu@codeaurora.org>2018-06-19 17:56:15 +0800
commit18793328aadcf93755752dfc270df9c78dbe7f32 (patch)
tree651db769ef95502068e8bde4a5de4693682f5901
parente4f8e359f67ff3428097e2e5d3918c2bbae9321b (diff)
qcacld-2.0: Replenish more pdev credits from htt credits
Replenish more pdev credits from htt credits even the available bus delta is not enough when credits updating from target. This can enhance the quality of TX bundling to improve the TX performance. Change-Id: I714f179a66f8dc1133a79092b2f28dca08c8f364 CRs-Fixed: 2253547
-rw-r--r--CORE/CLD_TXRX/HTT/htt_t2h.c34
-rw-r--r--CORE/CLD_TXRX/HTT/htt_tx.c2
-rw-r--r--CORE/CLD_TXRX/TXRX/ol_tx_send.c4
3 files changed, 38 insertions, 2 deletions
diff --git a/CORE/CLD_TXRX/HTT/htt_t2h.c b/CORE/CLD_TXRX/HTT/htt_t2h.c
index 6b04135c80eb..9d35a8af5c92 100644
--- a/CORE/CLD_TXRX/HTT/htt_t2h.c
+++ b/CORE/CLD_TXRX/HTT/htt_t2h.c
@@ -423,6 +423,7 @@ htt_t2h_lp_msg_handler(void *context, adf_nbuf_t htt_t2h_msg )
u_int32_t htt_credit_delta_abs;
int32_t htt_credit_delta;
int sign, old_credit;
+ int delta2 = 0;
htt_credit_delta_abs = HTT_TX_CREDIT_DELTA_ABS_GET(*msg_word);
sign = HTT_TX_CREDIT_SIGN_BIT_GET(*msg_word) ? -1 : 1;
@@ -445,6 +446,39 @@ htt_t2h_lp_msg_handler(void *context, adf_nbuf_t htt_t2h_msg )
adf_os_atomic_add(htt_credit_delta,
&pdev->htt_tx_credit.target_delta);
htt_credit_delta = htt_tx_credit_update(pdev);
+
+
+ if (htt_credit_delta >= 0) {
+ if ((adf_os_atomic_read(&pdev->txrx_pdev->target_tx_credit) +
+ htt_credit_delta) < HTT_MAX_BUS_CREDIT) {
+ if (adf_os_atomic_read(&pdev->htt_tx_credit.target_delta) > 0) {
+ delta2 = HTT_MAX_BUS_CREDIT -
+ adf_os_atomic_read(&pdev->txrx_pdev->target_tx_credit)
+ - htt_credit_delta;
+ delta2 = (adf_os_atomic_read(&pdev->htt_tx_credit.target_delta) < delta2) ?
+ adf_os_atomic_read(&pdev->htt_tx_credit.target_delta) : delta2;
+
+ adf_os_atomic_add(-delta2, &pdev->htt_tx_credit.target_delta);
+ adf_os_atomic_add(delta2, &pdev->txrx_pdev->target_tx_credit);
+ adf_os_atomic_add(-delta2, &pdev->htt_tx_credit.bus_delta);
+ }
+ }
+ } else {
+ if (adf_os_atomic_read(&pdev->txrx_pdev->target_tx_credit) < HTT_MAX_BUS_CREDIT) {
+ if (adf_os_atomic_read(&pdev->htt_tx_credit.target_delta) > 0) {
+ delta2 = HTT_MAX_BUS_CREDIT -
+ adf_os_atomic_read(&pdev->txrx_pdev->target_tx_credit);
+ delta2 = (adf_os_atomic_read(&pdev->htt_tx_credit.target_delta) < delta2) ?
+ adf_os_atomic_read(&pdev->htt_tx_credit.target_delta) : delta2;
+
+ adf_os_atomic_add(-delta2, &pdev->htt_tx_credit.target_delta);
+ adf_os_atomic_add(delta2, &pdev->txrx_pdev->target_tx_credit);
+ adf_os_atomic_add(-delta2, &pdev->htt_tx_credit.bus_delta);
+ }
+ }
+ }
+
+
HTT_TX_MUTEX_RELEASE(&pdev->credit_mutex);
}
diff --git a/CORE/CLD_TXRX/HTT/htt_tx.c b/CORE/CLD_TXRX/HTT/htt_tx.c
index 364151ac2e69..a2bdf4a23f57 100644
--- a/CORE/CLD_TXRX/HTT/htt_tx.c
+++ b/CORE/CLD_TXRX/HTT/htt_tx.c
@@ -946,7 +946,7 @@ int htt_tx_credit_update(struct htt_pdev_t *pdev)
int credit_delta;
credit_delta = MIN(adf_os_atomic_read(&pdev->htt_tx_credit.target_delta),
adf_os_atomic_read(&pdev->htt_tx_credit.bus_delta));
- if (credit_delta) {
+ if (credit_delta > 0) {
adf_os_atomic_add(-credit_delta, &pdev->htt_tx_credit.target_delta);
adf_os_atomic_add(-credit_delta, &pdev->htt_tx_credit.bus_delta);
}
diff --git a/CORE/CLD_TXRX/TXRX/ol_tx_send.c b/CORE/CLD_TXRX/TXRX/ol_tx_send.c
index 8122f27972e4..7823b3aa0f59 100644
--- a/CORE/CLD_TXRX/TXRX/ol_tx_send.c
+++ b/CORE/CLD_TXRX/TXRX/ol_tx_send.c
@@ -540,7 +540,9 @@ ol_tx_discard_target_frms(ol_txrx_pdev_handle pdev)
void
ol_tx_credit_completion_handler(ol_txrx_pdev_handle pdev, int credits)
{
- ol_tx_target_credit_update(pdev, credits);
+ if (credits > 0)
+ ol_tx_target_credit_update(pdev, credits);
+
if (pdev->cfg.is_high_latency) {
ol_tx_sched(pdev);
}