summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CORE/CLD_TXRX/HTT/htt_h2t.c10
-rw-r--r--CORE/CLD_TXRX/HTT/htt_internal.h6
-rw-r--r--CORE/CLD_TXRX/HTT/htt_t2h.c41
-rw-r--r--CORE/CLD_TXRX/HTT/htt_tx.c17
-rw-r--r--CORE/CLD_TXRX/HTT/htt_types.h8
-rw-r--r--CORE/CLD_TXRX/TXRX/ol_tx_sched.c2
6 files changed, 78 insertions, 6 deletions
diff --git a/CORE/CLD_TXRX/HTT/htt_h2t.c b/CORE/CLD_TXRX/HTT/htt_h2t.c
index 78cf63ee2767..fc70c99fdfe5 100644
--- a/CORE/CLD_TXRX/HTT/htt_h2t.c
+++ b/CORE/CLD_TXRX/HTT/htt_h2t.c
@@ -87,6 +87,16 @@ htt_h2t_send_complete(void *context, HTC_PACKET *htc_pkt)
send_complete_part2(
htt_pkt->pdev_ctxt, htc_pkt->Status, netbuf, htt_pkt->msdu_id);
}
+
+ if (pdev->cfg.is_high_latency && !pdev->cfg.default_tx_comp_req) {
+ int32_t credit_delta;
+ adf_os_atomic_add(1, &pdev->htt_tx_credit.bus_delta);
+ credit_delta = htt_tx_credit_update(pdev);
+ if (credit_delta) {
+ ol_tx_credit_completion_handler(pdev->txrx_pdev, credit_delta);
+ }
+ }
+
/* free the htt_htc_pkt / HTC_PACKET object */
htt_htc_pkt_free(pdev, htt_pkt);
}
diff --git a/CORE/CLD_TXRX/HTT/htt_internal.h b/CORE/CLD_TXRX/HTT/htt_internal.h
index 7ec53bfffc6a..ad154fc8c0cb 100644
--- a/CORE/CLD_TXRX/HTT/htt_internal.h
+++ b/CORE/CLD_TXRX/HTT/htt_internal.h
@@ -419,4 +419,10 @@ int
htt_rx_ipa_uc_detach(struct htt_pdev_t *pdev);
#endif /* IPA_UC_OFFLOAD */
+/* Maximum Outstanding Bus Download */
+#define HTT_MAX_BUS_CREDIT 17
+
+int
+htt_tx_credit_update(struct htt_pdev_t *pdev);
+
#endif /* _HTT_INTERNAL__H_ */
diff --git a/CORE/CLD_TXRX/HTT/htt_t2h.c b/CORE/CLD_TXRX/HTT/htt_t2h.c
index a6c78dcf16dd..5f404f3b4f53 100644
--- a/CORE/CLD_TXRX/HTT/htt_t2h.c
+++ b/CORE/CLD_TXRX/HTT/htt_t2h.c
@@ -48,7 +48,9 @@
#include <pktlog_ac_fmt.h>
#include <wdi_event.h>
#include <ol_htt_tx_api.h>
-#include <ol_txrx_types.h>
+#include <ol_txrx_stats.h>
+#include <wdi_event_api.h>
+#include <ol_txrx_ctrl_api.h>
/*--- target->host HTT message dispatch function ----------------------------*/
#ifndef DEBUG_CREDIT
@@ -283,10 +285,19 @@ htt_t2h_lp_msg_handler(void *context, adf_nbuf_t htt_t2h_msg )
case HTT_T2H_MSG_TYPE_MGMT_TX_COMPL_IND:
{
struct htt_mgmt_tx_compl_ind *compl_msg;
+ int32_t credit_delta = 1;
compl_msg = (struct htt_mgmt_tx_compl_ind *)(msg_word + 1);
+
if (pdev->cfg.is_high_latency) {
- ol_tx_target_credit_update(pdev->txrx_pdev, 1);
+ if (!pdev->cfg.default_tx_comp_req) {
+ adf_os_atomic_add(credit_delta,
+ &pdev->htt_tx_credit.target_delta);
+ credit_delta = htt_tx_credit_update(pdev);
+ }
+ if (credit_delta) {
+ ol_tx_target_credit_update(pdev->txrx_pdev, credit_delta);
+ }
}
ol_tx_single_completion_handler(
pdev->txrx_pdev, compl_msg->status, compl_msg->desc_id);
@@ -341,7 +352,16 @@ htt_t2h_lp_msg_handler(void *context, adf_nbuf_t htt_t2h_msg )
htt_credit_delta_abs = HTT_TX_CREDIT_DELTA_ABS_GET(*msg_word);
sign = HTT_TX_CREDIT_SIGN_BIT_GET(*msg_word) ? -1 : 1;
htt_credit_delta = sign * htt_credit_delta_abs;
- ol_tx_credit_completion_handler(pdev->txrx_pdev, htt_credit_delta);
+
+ if (pdev->cfg.is_high_latency &&
+ !pdev->cfg.default_tx_comp_req) {
+ 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) {
+ ol_tx_credit_completion_handler(pdev->txrx_pdev, htt_credit_delta);
+ }
break;
}
@@ -484,9 +504,20 @@ if (adf_os_unlikely(pdev->rx_ring.rx_reset)) {
compl->payload[num_msdus];
}
}
+
if (pdev->cfg.is_high_latency) {
- ol_tx_target_credit_update(
- pdev->txrx_pdev, num_msdus /* 1 credit per MSDU */);
+ if (!pdev->cfg.default_tx_comp_req) {
+ int credit_delta;
+ adf_os_atomic_add(num_msdus,
+ &pdev->htt_tx_credit.target_delta);
+ credit_delta = htt_tx_credit_update(pdev);
+ if (credit_delta) {
+ ol_tx_target_credit_update(pdev->txrx_pdev,
+ credit_delta);
+ }
+ } else {
+ ol_tx_target_credit_update(pdev->txrx_pdev, num_msdus);
+ }
}
ol_tx_completion_handler(
pdev->txrx_pdev, num_msdus, status, msg_word + 1);
diff --git a/CORE/CLD_TXRX/HTT/htt_tx.c b/CORE/CLD_TXRX/HTT/htt_tx.c
index bddc9031e04e..123f4543535e 100644
--- a/CORE/CLD_TXRX/HTT/htt_tx.c
+++ b/CORE/CLD_TXRX/HTT/htt_tx.c
@@ -144,6 +144,11 @@ htt_tx_attach(struct htt_pdev_t *pdev, int desc_pool_elems)
}
*p = NULL;
+ if (pdev->cfg.is_high_latency) {
+ adf_os_atomic_init(&pdev->htt_tx_credit.target_delta);
+ adf_os_atomic_init(&pdev->htt_tx_credit.bus_delta);
+ adf_os_atomic_add(HTT_MAX_BUS_CREDIT,&pdev->htt_tx_credit.bus_delta);
+ }
return 0; /* success */
}
@@ -732,3 +737,15 @@ int htt_tx_ipa_uc_detach(struct htt_pdev_t *pdev)
return 0;
}
#endif /* IPA_UC_OFFLOAD */
+
+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) {
+ adf_os_atomic_add(-credit_delta, &pdev->htt_tx_credit.target_delta);
+ adf_os_atomic_add(-credit_delta, &pdev->htt_tx_credit.bus_delta);
+ }
+ return credit_delta;
+}
diff --git a/CORE/CLD_TXRX/HTT/htt_types.h b/CORE/CLD_TXRX/HTT/htt_types.h
index 56369a42c303..fb51ba365e8c 100644
--- a/CORE/CLD_TXRX/HTT/htt_types.h
+++ b/CORE/CLD_TXRX/HTT/htt_types.h
@@ -190,6 +190,12 @@ struct ipa_uc_rx_ring_elem_t
};
#endif /* IPA_UC_OFFLOAD */
+struct htt_tx_credit_t
+{
+ adf_os_atomic_t bus_delta;
+ adf_os_atomic_t target_delta;
+};
+
struct htt_pdev_t {
ol_pdev_handle ctrl_pdev;
ol_txrx_pdev_handle txrx_pdev;
@@ -344,6 +350,8 @@ struct htt_pdev_t {
struct htt_ipa_uc_tx_resource_t ipa_uc_tx_rsc;
struct htt_ipa_uc_rx_resource_t ipa_uc_rx_rsc;
#endif /* IPA_UC_OFFLOAD */
+
+ struct htt_tx_credit_t htt_tx_credit;
};
#endif /* _HTT_TYPES__H_ */
diff --git a/CORE/CLD_TXRX/TXRX/ol_tx_sched.c b/CORE/CLD_TXRX/TXRX/ol_tx_sched.c
index c60b7ea4acb5..c65fc3514cdc 100644
--- a/CORE/CLD_TXRX/TXRX/ol_tx_sched.c
+++ b/CORE/CLD_TXRX/TXRX/ol_tx_sched.c
@@ -503,7 +503,7 @@ struct ol_tx_sched_wrr_adv_category_info_t {
// wts thresh (frms) reserv wts
OL_TX_SCHED_WRR_ADV_CAT_CFG_SPEC(VO, 1, 16, 24, 0, 1);
OL_TX_SCHED_WRR_ADV_CAT_CFG_SPEC(VI, 3, 16, 16, 1, 4);
-OL_TX_SCHED_WRR_ADV_CAT_CFG_SPEC(BE, 10, 12, 12, 1, 8);
+OL_TX_SCHED_WRR_ADV_CAT_CFG_SPEC(BE, 10, 16, 16, 1, 8);
OL_TX_SCHED_WRR_ADV_CAT_CFG_SPEC(BK, 12, 6, 6, 1, 8);
OL_TX_SCHED_WRR_ADV_CAT_CFG_SPEC(NON_QOS_DATA,12, 6, 4, 1, 8);
OL_TX_SCHED_WRR_ADV_CAT_CFG_SPEC(UCAST_MGMT, 1, 1, 4, 0, 1);