diff options
| author | Tiger Yu <tfyu@codeaurora.org> | 2018-06-19 17:36:19 +0800 |
|---|---|---|
| committer | Tiger Yu <tfyu@codeaurora.org> | 2018-06-19 17:56:15 +0800 |
| commit | 18793328aadcf93755752dfc270df9c78dbe7f32 (patch) | |
| tree | 651db769ef95502068e8bde4a5de4693682f5901 | |
| parent | e4f8e359f67ff3428097e2e5d3918c2bbae9321b (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.c | 34 | ||||
| -rw-r--r-- | CORE/CLD_TXRX/HTT/htt_tx.c | 2 | ||||
| -rw-r--r-- | CORE/CLD_TXRX/TXRX/ol_tx_send.c | 4 |
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); } |
