diff options
| -rw-r--r-- | CORE/CLD_TXRX/HTT/htt_h2t.c | 10 | ||||
| -rw-r--r-- | CORE/CLD_TXRX/HTT/htt_internal.h | 6 | ||||
| -rw-r--r-- | CORE/CLD_TXRX/HTT/htt_t2h.c | 41 | ||||
| -rw-r--r-- | CORE/CLD_TXRX/HTT/htt_tx.c | 17 | ||||
| -rw-r--r-- | CORE/CLD_TXRX/HTT/htt_types.h | 8 | ||||
| -rw-r--r-- | CORE/CLD_TXRX/TXRX/ol_tx_sched.c | 2 |
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); |
