From ebf3a9204f015f98358e71fca47feccc3f2e7d1f Mon Sep 17 00:00:00 2001 From: jitiphil Date: Mon, 5 Nov 2018 14:25:00 +0530 Subject: [PATCH] qcacld-3.0: New HTT H2T msg support Current HTT_H2T messages from host driver does not have consistency in message length set by host driver. Some message types include HTC header length also within the message length, while other types have message length itself only. Fix the same by sending same message format based on firmware capability. Change-Id: I885a21530a2d8f852387ae54cf7ee0751aad2516 CRs-Fixed: 2145560 --- core/dp/txrx/ol_tx_ll_fastpath.c | 4 ++++ core/dp/txrx/ol_txrx.c | 23 +++++++++++++++++++++++ core/dp/txrx/ol_txrx.h | 20 ++++++++++++++++++++ core/dp/txrx/ol_txrx_types.h | 1 + core/wma/src/wma_main.c | 16 ++++++++++++++++ 5 files changed, 64 insertions(+) diff --git a/core/dp/txrx/ol_tx_ll_fastpath.c b/core/dp/txrx/ol_tx_ll_fastpath.c index 2a3097558e40..2dd0ba8fa6d7 100644 --- a/core/dp/txrx/ol_tx_ll_fastpath.c +++ b/core/dp/txrx/ol_tx_ll_fastpath.c @@ -269,6 +269,10 @@ ol_tx_prepare_ll_fast(struct ol_txrx_pdev_t *pdev, * with it for the time being, since this is not checked in f/w */ /* TODO : Prefill this, look at multi-fragment case */ + + if (ol_txrx_get_new_htt_msg_format(pdev)) + pkt_download_len = pkt_download_len - HTC_HEADER_LEN; + HTC_TX_DESC_FILL(htc_hdr_vaddr, pkt_download_len, ep_id, 0); return tx_desc; diff --git a/core/dp/txrx/ol_txrx.c b/core/dp/txrx/ol_txrx.c index d13f2b601256..9f378e91b0db 100644 --- a/core/dp/txrx/ol_txrx.c +++ b/core/dp/txrx/ol_txrx.c @@ -5526,6 +5526,8 @@ static struct cdp_cfg_ops ol_ops_cfg = { ol_txrx_wrapper_set_flow_control_parameters, .set_flow_steering = ol_set_cfg_flow_steering, .set_ptp_rx_opt_enabled = ol_set_cfg_ptp_rx_opt_enabled, + .set_new_htt_msg_format = + ol_txrx_set_new_htt_msg_format, }; static struct cdp_peer_ops ol_ops_peer = { @@ -5644,3 +5646,24 @@ struct cdp_soc_t *ol_txrx_soc_attach(void *scn_handle, soc->ops = &ol_txrx_ops; return soc; } + +bool ol_txrx_get_new_htt_msg_format(struct ol_txrx_pdev_t *pdev) +{ + if (!pdev) { + qdf_print("%s: pdev is NULL\n", __func__); + return false; + } + return pdev->new_htt_msg_format; +} + +void ol_txrx_set_new_htt_msg_format(uint8_t val) +{ + struct ol_txrx_pdev_t *pdev = cds_get_context(QDF_MODULE_ID_TXRX); + + if (!pdev) { + qdf_print("%s: pdev is NULL\n", __func__); + return; + } + pdev->new_htt_msg_format = val; +} + diff --git a/core/dp/txrx/ol_txrx.h b/core/dp/txrx/ol_txrx.h index f4db398b460e..83d1d41dc9c1 100644 --- a/core/dp/txrx/ol_txrx.h +++ b/core/dp/txrx/ol_txrx.h @@ -358,4 +358,24 @@ int ol_txrx_register_hl_flow_control(struct cdp_soc_t *soc, int ol_txrx_set_vdev_os_queue_status(u8 vdev_id, enum netif_action_type action); int ol_txrx_set_vdev_tx_desc_limit(u8 vdev_id, u8 chan); #endif + +/** + * ol_txrx_get_new_htt_msg_format() - check htt h2t msg feature + * @pdev - datapath device instance + * + * Check if h2t message length includes htc header length + * + * return if new htt h2t msg feature enabled + */ +bool ol_txrx_get_new_htt_msg_format(struct ol_txrx_pdev_t *pdev); + +/** + * ol_txrx_set_new_htt_msg_format() - set htt h2t msg feature + * @val - enable or disable new htt h2t msg feature + * + * Set if h2t message length includes htc header length + * + * return NONE + */ +void ol_txrx_set_new_htt_msg_format(uint8_t val); #endif /* _OL_TXRX__H_ */ diff --git a/core/dp/txrx/ol_txrx_types.h b/core/dp/txrx/ol_txrx_types.h index 7a36938ba7f1..934e05f77e51 100644 --- a/core/dp/txrx/ol_txrx_types.h +++ b/core/dp/txrx/ol_txrx_types.h @@ -1047,6 +1047,7 @@ struct ol_txrx_pdev_t { void *usr_ctxt; struct ol_txrx_ipa_resources ipa_resource; #endif /* IPA_UC_OFFLOAD */ + bool new_htt_msg_format; }; struct ol_txrx_vdev_t { diff --git a/core/wma/src/wma_main.c b/core/wma/src/wma_main.c index a2b3b9e3a145..336f25726086 100644 --- a/core/wma/src/wma_main.c +++ b/core/wma/src/wma_main.c @@ -6645,6 +6645,9 @@ int wma_rx_service_ready_ext_event(void *handle, uint8_t *event, QDF_STATUS ret; struct target_psoc_info *tgt_hdl; uint32_t conc_scan_config_bits, fw_config_bits; + struct wmi_unified *wmi_handle; + void *soc = cds_get_context(QDF_MODULE_ID_SOC); + target_resource_config *wlan_res_cfg; WMA_LOGD("%s: Enter", __func__); @@ -6653,12 +6656,15 @@ int wma_rx_service_ready_ext_event(void *handle, uint8_t *event, return -EINVAL; } + wmi_handle = get_wmi_unified_hdl_from_psoc(wma_handle->psoc); + tgt_hdl = wlan_psoc_get_tgt_if_handle(wma_handle->psoc); if (!tgt_hdl) { WMA_LOGE("%s: target psoc info is NULL", __func__); return -EINVAL; } + wlan_res_cfg = target_psoc_get_wlan_res_cfg(tgt_hdl); param_buf = (WMI_SERVICE_READY_EXT_EVENTID_param_tlvs *) event; if (!param_buf) { WMA_LOGE("%s: Invalid event", __func__); @@ -6698,6 +6704,16 @@ int wma_rx_service_ready_ext_event(void *handle, uint8_t *event, fw_config_bits); target_psoc_set_num_radios(tgt_hdl, 1); + + if (wmi_service_enabled(wmi_handle, + wmi_service_new_htt_msg_format)) { + cdp_cfg_set_new_htt_msg_format(soc, 1); + wlan_res_cfg->new_htt_msg_format = true; + } else { + cdp_cfg_set_new_htt_msg_format(soc, 0); + wlan_res_cfg->new_htt_msg_format = false; + } + return 0; }