summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGanesh Babu Kumaravel <kganesh@qti.qualcomm.com>2014-09-23 16:31:49 +0530
committerAnjaneeDevi Kapparapu <c_akappa@qti.qualcomm.com>2014-10-15 18:43:58 +0530
commit821322cf820f5985281dbf0fe9c3ae3bbcedcc07 (patch)
tree5fd84580fc8724aa71633e6b8728589fb3f38596
parent3b7d911bb18c856153963f74d42ce75c6323b0ac (diff)
qcacld:Bus Credit Changes for High Latency(SDIO)
In HL i.e SDIO we want to control the outstanding bus download so the following changes are done to accomplish the same. HTT maintains delta of bus credit and target credit w.r.t txrx credit. HTT will update its credit on tx download complete and credit update indication from Fw and inturn will update txrx credit. Change-Id: I56c8af239f4d231aefdd09ab23dfaebea0cde44e CRs-Fixed: 738649
-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);