summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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);
}