diff options
| -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); } |
