diff --git a/components/mlme/core/src/wlan_mlme_main.c b/components/mlme/core/src/wlan_mlme_main.c index 1e630d55d7..b7c0e60851 100644 --- a/components/mlme/core/src/wlan_mlme_main.c +++ b/components/mlme/core/src/wlan_mlme_main.c @@ -479,6 +479,14 @@ static void mlme_init_qos_cfg(struct wlan_objmgr_psoc *psoc, cfg_get(psoc, CFG_TX_AGGR_SW_RETRY_VI); qos_aggr_params->tx_aggr_sw_retry_threshold_vo = cfg_get(psoc, CFG_TX_AGGR_SW_RETRY_VO); + qos_aggr_params->tx_non_aggr_sw_retry_threshold_be = + cfg_get(psoc, CFG_TX_NON_AGGR_SW_RETRY_BE); + qos_aggr_params->tx_non_aggr_sw_retry_threshold_bk = + cfg_get(psoc, CFG_TX_NON_AGGR_SW_RETRY_BK); + qos_aggr_params->tx_non_aggr_sw_retry_threshold_vi = + cfg_get(psoc, CFG_TX_NON_AGGR_SW_RETRY_VI); + qos_aggr_params->tx_non_aggr_sw_retry_threshold_vo = + cfg_get(psoc, CFG_TX_NON_AGGR_SW_RETRY_VO); qos_aggr_params->sap_max_inactivity_override = cfg_get(psoc, CFG_SAP_MAX_INACTIVITY_OVERRIDE); } diff --git a/components/mlme/dispatcher/inc/cfg_qos.h b/components/mlme/dispatcher/inc/cfg_qos.h index 26d909ba3f..0213b961fe 100644 --- a/components/mlme/dispatcher/inc/cfg_qos.h +++ b/components/mlme/dispatcher/inc/cfg_qos.h @@ -294,6 +294,110 @@ CFG_VALUE_OR_DEFAULT, \ "Tx aggregation retry value for VO") +/* + * + * gTxNonAggSwRetryBE - Configure Tx non aggregation sw retry for BE + * @Min: 0 + * @Max: 64 + * @Default: 0 + * + * gTxNonAggSwRetryBE gives an option to configure Tx non aggregation sw + * retry for BE. This can be useful in debugging throughput issues. + * + * Related: None + * + * Supported Feature: STA + * + * Usage: Internal + * + * + */ +#define CFG_TX_NON_AGGR_SW_RETRY_BE CFG_INI_UINT( \ + "gTxNonAggSwRetryBE", \ + 0, \ + 64, \ + 0, \ + CFG_VALUE_OR_DEFAULT, \ + "Tx non aggregation retry value for BE") + +/* + * + * gTxNonAggSwRetryBK - Configure Tx non aggregation sw retry for BK + * @Min: 0 + * @Max: 64 + * @Default: 0 + * + * gTxNonAggSwRetryBK gives an option to configure Tx non aggregation sw + * retry for BK. This can be useful in debugging throughput issues. + * + * Related: None + * + * Supported Feature: STA + * + * Usage: Internal + * + * + */ +#define CFG_TX_NON_AGGR_SW_RETRY_BK CFG_INI_UINT( \ + "gTxNonAggSwRetryBK", \ + 0, \ + 64, \ + 0, \ + CFG_VALUE_OR_DEFAULT, \ + "Tx non aggregation retry value for BK") + +/* + * + * gTxNonAggSwRetryVI - Configure Tx non aggregation sw retry for VI + * @Min: 0 + * @Max: 64 + * @Default: 0 + * + * gTxNonAggSwRetryVI gives an option to configure Tx non aggregation sw + * retry for VI. This can be useful in debugging throughput issues. + * + * Related: None + * + * Supported Feature: STA + * + * Usage: Internal + * + * + */ +#define CFG_TX_NON_AGGR_SW_RETRY_VI CFG_INI_UINT( \ + "gTxNonAggSwRetryVI", \ + 0, \ + 64, \ + 0, \ + CFG_VALUE_OR_DEFAULT, \ + "Tx non aggregation retry value for VI") + +/* + * + * gTxNonAggSwRetryVO - Configure Tx non aggregation sw retry for VO + * @Min: 0 + * @Max: 64 + * @Default: 0 + * + * gTxNonAggSwRetryVO gives an option to configure Tx non aggregation sw + * retry for VO. This can be useful in debugging throughput issues. + * + * Related: None + * + * Supported Feature: STA + * + * Usage: Internal + * + * + */ +#define CFG_TX_NON_AGGR_SW_RETRY_VO CFG_INI_UINT( \ + "gTxNonAggSwRetryVO", \ + 0, \ + 64, \ + 0, \ + CFG_VALUE_OR_DEFAULT, \ + "Tx non aggregation retry value for VO") + /* * * gSapMaxInactivityOverride - Configure @@ -322,6 +426,7 @@ "SAP maximum inactivity override flag") #define CFG_QOS_ALL \ + CFG(CFG_SAP_MAX_INACTIVITY_OVERRIDE) \ CFG(CFG_TX_AGGREGATION_SIZE) \ CFG(CFG_TX_AGGREGATION_SIZEBE) \ CFG(CFG_TX_AGGREGATION_SIZEBK) \ @@ -332,6 +437,9 @@ CFG(CFG_TX_AGGR_SW_RETRY_BK) \ CFG(CFG_TX_AGGR_SW_RETRY_VI) \ CFG(CFG_TX_AGGR_SW_RETRY_VO) \ - CFG(CFG_SAP_MAX_INACTIVITY_OVERRIDE) + CFG(CFG_TX_NON_AGGR_SW_RETRY_BE) \ + CFG(CFG_TX_NON_AGGR_SW_RETRY_BK) \ + CFG(CFG_TX_NON_AGGR_SW_RETRY_VI) \ + CFG(CFG_TX_NON_AGGR_SW_RETRY_VO) #endif /* __CFG_MLME_QOS_H */ diff --git a/components/mlme/dispatcher/inc/wlan_mlme_public_struct.h b/components/mlme/dispatcher/inc/wlan_mlme_public_struct.h index c71624e78f..743afa4f70 100644 --- a/components/mlme/dispatcher/inc/wlan_mlme_public_struct.h +++ b/components/mlme/dispatcher/inc/wlan_mlme_public_struct.h @@ -486,10 +486,14 @@ struct wlan_mlme_vht_caps { * @tx_aggregation_size_vi: No. of MPDUs for VI queue for TX aggr * @tx_aggregation_size_vo: No. of MPDUs for VO queue for TX aggr * @rx_aggregation_size: No. of MPDUs for RX aggr - * @tx_aggr_sw_retry_threshold_be: Tx aggregation sw retry for BE - * @tx_aggr_sw_retry_threshold_bk: Tx aggregation sw retry for BK - * @tx_aggr_sw_retry_threshold_vi: Tx aggregation sw retry for VI - * @tx_aggr_sw_retry_threshold_vo: Tx aggregation sw retry for VO + * @tx_aggr_sw_retry_threshold_be: aggr sw retry threshold for BE + * @tx_aggr_sw_retry_threshold_bk: aggr sw retry threshold for BK + * @tx_aggr_sw_retry_threshold_vi: aggr sw retry threshold for VI + * @tx_aggr_sw_retry_threshold_vo: aggr sw retry threshold for VO + * @tx_non_aggr_sw_retry_threshold_be: non aggr sw retry threshold for BE + * @tx_non_aggr_sw_retry_threshold_bk: non aggr sw retry threshold for BK + * @tx_non_aggr_sw_retry_threshold_vi: non aggr sw retry threshold for VI + * @tx_non_aggr_sw_retry_threshold_vo: non aggr sw retry threshold for VO * @sap_max_inactivity_override: Override updating ap_sta_inactivity from * hostapd.conf */ @@ -504,6 +508,10 @@ struct wlan_mlme_qos { uint32_t tx_aggr_sw_retry_threshold_bk; uint32_t tx_aggr_sw_retry_threshold_vi; uint32_t tx_aggr_sw_retry_threshold_vo; + uint32_t tx_non_aggr_sw_retry_threshold_be; + uint32_t tx_non_aggr_sw_retry_threshold_bk; + uint32_t tx_non_aggr_sw_retry_threshold_vi; + uint32_t tx_non_aggr_sw_retry_threshold_vo; bool sap_max_inactivity_override; }; diff --git a/core/mac/inc/sir_api.h b/core/mac/inc/sir_api.h index 454c46a25f..377b410269 100644 --- a/core/mac/inc/sir_api.h +++ b/core/mac/inc/sir_api.h @@ -6309,19 +6309,27 @@ struct sir_set_tx_rx_aggregation_size { }; /** - * struct sir_set_tx_aggr_sw_retry_threshold - set sw retry threshold + * struct sir_set_tx_sw_retry_threshold - set sw retry threshold * @vdev_id: vdev id of the session - * @tx_aggr_sw_retry_threshold_be: sw retry threshold for BE - * @tx_aggr_sw_retry_threshold_bk: sw retry threshold for BK - * @tx_aggr_sw_retry_threshold_vi: sw retry threshold for VI - * @tx_aggr_sw_retry_threshold_vo: sw retry threshold for VO + * @tx_aggr_sw_retry_threshold_be: aggr sw retry threshold for BE + * @tx_aggr_sw_retry_threshold_bk: aggr sw retry threshold for BK + * @tx_aggr_sw_retry_threshold_vi: aggr sw retry threshold for VI + * @tx_aggr_sw_retry_threshold_vo: aggr sw retry threshold for VO + * @tx_non_aggr_sw_retry_threshold_be: non aggr sw retry threshold for BE + * @tx_non_aggr_sw_retry_threshold_bk: non aggr sw retry threshold for BK + * @tx_non_aggr_sw_retry_threshold_vi: non aggr sw retry threshold for VI + * @tx_non_aggr_sw_retry_threshold_vo: non aggr sw retry threshold for VO */ -struct sir_set_tx_aggr_sw_retry_threshold { +struct sir_set_tx_sw_retry_threshold { uint8_t vdev_id; uint32_t tx_aggr_sw_retry_threshold_be; uint32_t tx_aggr_sw_retry_threshold_bk; uint32_t tx_aggr_sw_retry_threshold_vi; uint32_t tx_aggr_sw_retry_threshold_vo; + uint32_t tx_non_aggr_sw_retry_threshold_be; + uint32_t tx_non_aggr_sw_retry_threshold_bk; + uint32_t tx_non_aggr_sw_retry_threshold_vi; + uint32_t tx_non_aggr_sw_retry_threshold_vo; }; /** diff --git a/core/sme/src/csr/csr_api_roam.c b/core/sme/src/csr/csr_api_roam.c index 923de50097..79fbb25c56 100644 --- a/core/sme/src/csr/csr_api_roam.c +++ b/core/sme/src/csr/csr_api_roam.c @@ -16948,28 +16948,36 @@ QDF_STATUS csr_issue_add_sta_for_session_req(tpAniSirGlobal pMac, add_sta_self_req->tx_aggregation_size = qos_aggr->tx_aggregation_size; add_sta_self_req->tx_aggregation_size_be = - qos_aggr->tx_aggregation_size_be; + qos_aggr->tx_aggregation_size_be; add_sta_self_req->tx_aggregation_size_bk = - qos_aggr->tx_aggregation_size_bk; + qos_aggr->tx_aggregation_size_bk; add_sta_self_req->tx_aggregation_size_vi = - qos_aggr->tx_aggregation_size_vi; + qos_aggr->tx_aggregation_size_vi; add_sta_self_req->tx_aggregation_size_vo = - qos_aggr->tx_aggregation_size_vo; + qos_aggr->tx_aggregation_size_vo; add_sta_self_req->rx_aggregation_size = qos_aggr->rx_aggregation_size; add_sta_self_req->tx_aggr_sw_retry_threshold_be = - qos_aggr->tx_aggr_sw_retry_threshold_be; + qos_aggr->tx_aggr_sw_retry_threshold_be; add_sta_self_req->tx_aggr_sw_retry_threshold_bk = - qos_aggr->tx_aggr_sw_retry_threshold_bk; + qos_aggr->tx_aggr_sw_retry_threshold_bk; add_sta_self_req->tx_aggr_sw_retry_threshold_vi = - qos_aggr->tx_aggr_sw_retry_threshold_vi; + qos_aggr->tx_aggr_sw_retry_threshold_vi; add_sta_self_req->tx_aggr_sw_retry_threshold_vo = - qos_aggr->tx_aggr_sw_retry_threshold_vo; + qos_aggr->tx_aggr_sw_retry_threshold_vo; + add_sta_self_req->tx_non_aggr_sw_retry_threshold_be = + qos_aggr->tx_non_aggr_sw_retry_threshold_be; + add_sta_self_req->tx_non_aggr_sw_retry_threshold_bk = + qos_aggr->tx_non_aggr_sw_retry_threshold_bk; + add_sta_self_req->tx_non_aggr_sw_retry_threshold_vi = + qos_aggr->tx_non_aggr_sw_retry_threshold_vi; + add_sta_self_req->tx_non_aggr_sw_retry_threshold_vo = + qos_aggr->tx_non_aggr_sw_retry_threshold_vo; add_sta_self_req->enable_bcast_probe_rsp = pMac->mlme_cfg->oce.enable_bcast_probe_rsp; add_sta_self_req->fils_max_chan_guard_time = - pMac->mlme_cfg->sta.fils_max_chan_guard_time; + pMac->mlme_cfg->sta.fils_max_chan_guard_time; add_sta_self_req->pkt_err_disconn_th = pMac->mlme_cfg->gen.dropped_pkt_disconnect_thresh; add_sta_self_req->oce_feature_bitmap = diff --git a/core/wma/inc/wma_api.h b/core/wma/inc/wma_api.h index 7308b3ee7f..c5c710d72d 100644 --- a/core/wma/inc/wma_api.h +++ b/core/wma/inc/wma_api.h @@ -286,7 +286,8 @@ QDF_STATUS wma_set_tx_rx_aggregation_size_per_ac (struct sir_set_tx_rx_aggregation_size *tx_rx_aggregation_size); /** * wma_set_sw_retry_threshold() - set sw retry threshold per AC for tx - * @tx_rx_aggregation_size: value needs to set to firmware + * @handle: wma handle + * @tx_sw_retry_threshold: value needs to set to firmware * * This function sends WMI command to set the sw retry threshold per AC * for Tx. @@ -294,7 +295,8 @@ QDF_STATUS wma_set_tx_rx_aggregation_size_per_ac * Return: QDF_STATUS. */ QDF_STATUS wma_set_sw_retry_threshold - (struct sir_set_tx_aggr_sw_retry_threshold *tx_rx_aggregation_size); + (WMA_HANDLE handle, + struct sir_set_tx_sw_retry_threshold *tx_sw_retry_threshold); /** * wma_get_sar_limit() - get SAR limits from the target * @handle: wma handle diff --git a/core/wma/inc/wma_if.h b/core/wma/inc/wma_if.h index 54922116db..dc46fbecf1 100644 --- a/core/wma/inc/wma_if.h +++ b/core/wma/inc/wma_if.h @@ -1174,10 +1174,14 @@ typedef struct sMaxTxPowerPerBandParams { * @enable_bcast_probe_rsp: enable broadcast probe response * @fils_max_chan_guard_time: FILS max channel guard time * @pkt_err_disconn_th: packet drop threshold - * @tx_aggr_sw_retry_threshold_be: sw retry threashold for be - * @tx_aggr_sw_retry_threshold_bk: sw retry threashold for bk - * @tx_aggr_sw_retry_threshold_vi: sw retry threashold for vi - * @tx_aggr_sw_retry_threshold_vo: sw retry threashold for vo + * @tx_aggr_sw_retry_threshold_be: aggr sw retry threshold for be + * @tx_aggr_sw_retry_threshold_bk: aggr sw retry threshold for bk + * @tx_aggr_sw_retry_threshold_vi: aggr sw retry threshold for vi + * @tx_aggr_sw_retry_threshold_vo: aggr sw retry threshold for vo + * @tx_non_aggr_sw_retry_threshold_be: non aggr sw retry threshold for be + * @tx_non_aggr_sw_retry_threshold_bk: non aggr sw retry threshold for bk + * @tx_non_aggr_sw_retry_threshold_vi: non aggr sw retry threshold for vi + * @tx_non_aggr_sw_retry_threshold_vo: non aggr sw retry threshold for vo */ struct add_sta_self_params { tSirMacAddr self_mac_addr; @@ -1202,6 +1206,10 @@ struct add_sta_self_params { uint32_t tx_aggr_sw_retry_threshold_bk; uint32_t tx_aggr_sw_retry_threshold_vi; uint32_t tx_aggr_sw_retry_threshold_vo; + uint32_t tx_non_aggr_sw_retry_threshold_be; + uint32_t tx_non_aggr_sw_retry_threshold_bk; + uint32_t tx_non_aggr_sw_retry_threshold_vi; + uint32_t tx_non_aggr_sw_retry_threshold_vo; }; /** diff --git a/core/wma/src/wma_dev_if.c b/core/wma/src/wma_dev_if.c index 23f0e9afbb..d8653f28bd 100644 --- a/core/wma/src/wma_dev_if.c +++ b/core/wma/src/wma_dev_if.c @@ -2345,7 +2345,7 @@ struct cdp_vdev *wma_vdev_attach(tp_wma_handle wma_handle, struct vdev_create_params params = { 0 }; u_int8_t vdev_id; struct sir_set_tx_rx_aggregation_size tx_rx_aggregation_size; - struct sir_set_tx_aggr_sw_retry_threshold tx_aggr_sw_retry_threshold; + struct sir_set_tx_sw_retry_threshold tx_sw_retry_threshold; void *soc = cds_get_context(QDF_MODULE_ID_SOC); struct wlan_objmgr_peer *obj_peer; struct wlan_objmgr_vdev *vdev; @@ -2458,15 +2458,25 @@ struct cdp_vdev *wma_vdev_attach(tp_wma_handle wma_handle, tx_rx_aggregation_size.tx_aggregation_size_vo = self_sta_req->tx_aggregation_size_vo; - tx_aggr_sw_retry_threshold.tx_aggr_sw_retry_threshold_be = + tx_sw_retry_threshold.tx_aggr_sw_retry_threshold_be = self_sta_req->tx_aggr_sw_retry_threshold_be; - tx_aggr_sw_retry_threshold.tx_aggr_sw_retry_threshold_bk = + tx_sw_retry_threshold.tx_aggr_sw_retry_threshold_bk = self_sta_req->tx_aggr_sw_retry_threshold_bk; - tx_aggr_sw_retry_threshold.tx_aggr_sw_retry_threshold_vi = + tx_sw_retry_threshold.tx_aggr_sw_retry_threshold_vi = self_sta_req->tx_aggr_sw_retry_threshold_vi; - tx_aggr_sw_retry_threshold.tx_aggr_sw_retry_threshold_vo = + tx_sw_retry_threshold.tx_aggr_sw_retry_threshold_vo = self_sta_req->tx_aggr_sw_retry_threshold_vo; - tx_aggr_sw_retry_threshold.vdev_id = self_sta_req->session_id; + + tx_sw_retry_threshold.tx_non_aggr_sw_retry_threshold_be = + self_sta_req->tx_non_aggr_sw_retry_threshold_be; + tx_sw_retry_threshold.tx_non_aggr_sw_retry_threshold_bk = + self_sta_req->tx_non_aggr_sw_retry_threshold_bk; + tx_sw_retry_threshold.tx_non_aggr_sw_retry_threshold_vi = + self_sta_req->tx_non_aggr_sw_retry_threshold_vi; + tx_sw_retry_threshold.tx_non_aggr_sw_retry_threshold_vo = + self_sta_req->tx_non_aggr_sw_retry_threshold_vo; + + tx_sw_retry_threshold.vdev_id = self_sta_req->session_id; switch (self_sta_req->type) { @@ -2488,7 +2498,8 @@ struct cdp_vdev *wma_vdev_attach(tp_wma_handle wma_handle, wma_set_sta_sa_query_param(wma_handle, vdev_id); } - ret = wma_set_sw_retry_threshold(&tx_aggr_sw_retry_threshold); + ret = wma_set_sw_retry_threshold(wma_handle, + &tx_sw_retry_threshold); if (QDF_IS_STATUS_ERROR(ret)) WMA_LOGE("failed to set retry threshold(err=%d)", ret); break; diff --git a/core/wma/src/wma_features.c b/core/wma/src/wma_features.c index 71b22ad6ad..832e703068 100644 --- a/core/wma/src/wma_features.c +++ b/core/wma/src/wma_features.c @@ -4790,72 +4790,112 @@ QDF_STATUS wma_set_tx_rx_aggregation_size_per_ac( return QDF_STATUS_SUCCESS; } -QDF_STATUS wma_set_sw_retry_threshold( - struct sir_set_tx_aggr_sw_retry_threshold *tx_sw_retry_threshold) +static QDF_STATUS wma_set_sw_retry_by_qos( + tp_wma_handle handle, uint8_t vdev_id, + wmi_vdev_custom_sw_retry_type_t retry_type, + wmi_traffic_ac ac_type, + uint32_t sw_retry) { - tp_wma_handle wma_handle; wmi_vdev_set_custom_sw_retry_th_cmd_fixed_param *cmd; int32_t len; wmi_buf_t buf; u_int8_t *buf_ptr; int ret; - int queue_num; - uint32_t tx_aggr_retry[WMI_AC_MAX]; - wma_handle = cds_get_context(QDF_MODULE_ID_WMA); + len = sizeof(*cmd); + buf = wmi_buf_alloc(handle->wmi_handle, len); + + if (!buf) + return QDF_STATUS_E_NOMEM; + + buf_ptr = (u_int8_t *)wmi_buf_data(buf); + cmd = (wmi_vdev_set_custom_sw_retry_th_cmd_fixed_param *)buf_ptr; + + WMITLV_SET_HDR(&cmd->tlv_header, + WMITLV_TAG_STRUC_wmi_vdev_set_custom_sw_retry_th_cmd_fixed_param, + WMITLV_GET_STRUCT_TLVLEN( + wmi_vdev_set_custom_sw_retry_th_cmd_fixed_param)); + + cmd->vdev_id = vdev_id; + cmd->ac_type = ac_type; + cmd->sw_retry_type = retry_type; + cmd->sw_retry_th = sw_retry; + + wma_debug("ac_type: %d re_type: %d threshold: %d vid: %d", + cmd->ac_type, cmd->sw_retry_type, + cmd->sw_retry_th, cmd->vdev_id); + + ret = wmi_unified_cmd_send(handle->wmi_handle, + buf, len, + WMI_VDEV_SET_CUSTOM_SW_RETRY_TH_CMDID); + + if (ret) { + wmi_buf_free(buf); + return QDF_STATUS_E_FAILURE; + } + + return QDF_STATUS_SUCCESS; +} + +QDF_STATUS wma_set_sw_retry_threshold( + WMA_HANDLE handle, + struct sir_set_tx_sw_retry_threshold *tx_sw_retry_threshold) +{ + QDF_STATUS ret; + tp_wma_handle wma_handle; + uint8_t vdev_id; + int retry_type, queue_num; + uint32_t tx_sw_retry[WMI_VDEV_CUSTOM_SW_RETRY_TYPE_MAX][WMI_AC_MAX]; + uint32_t sw_retry; + + wma_handle = (tp_wma_handle)handle; if (!tx_sw_retry_threshold) { - WMA_LOGE("%s: invalid pointer", __func__); + wma_err("%s: invalid pointer", __func__); return QDF_STATUS_E_INVAL; } if (!wma_handle) { - WMA_LOGE("%s: WMA context is invald!", __func__); + wma_err("%s: WMA context is invalid!", __func__); return QDF_STATUS_E_INVAL; } - tx_aggr_retry[0] = + tx_sw_retry[WMI_VDEV_CUSTOM_SW_RETRY_TYPE_AGGR][WMI_AC_BE] = tx_sw_retry_threshold->tx_aggr_sw_retry_threshold_be; - tx_aggr_retry[1] = + tx_sw_retry[WMI_VDEV_CUSTOM_SW_RETRY_TYPE_AGGR][WMI_AC_BK] = tx_sw_retry_threshold->tx_aggr_sw_retry_threshold_bk; - tx_aggr_retry[2] = + tx_sw_retry[WMI_VDEV_CUSTOM_SW_RETRY_TYPE_AGGR][WMI_AC_VI] = tx_sw_retry_threshold->tx_aggr_sw_retry_threshold_vi; - tx_aggr_retry[3] = + tx_sw_retry[WMI_VDEV_CUSTOM_SW_RETRY_TYPE_AGGR][WMI_AC_VO] = tx_sw_retry_threshold->tx_aggr_sw_retry_threshold_vo; - for (queue_num = 0; queue_num < WMI_AC_MAX; queue_num++) { - if (tx_aggr_retry[queue_num] == 0) - continue; + tx_sw_retry[WMI_VDEV_CUSTOM_SW_RETRY_TYPE_NONAGGR][WMI_AC_BE] = + tx_sw_retry_threshold->tx_non_aggr_sw_retry_threshold_be; + tx_sw_retry[WMI_VDEV_CUSTOM_SW_RETRY_TYPE_NONAGGR][WMI_AC_BK] = + tx_sw_retry_threshold->tx_non_aggr_sw_retry_threshold_bk; + tx_sw_retry[WMI_VDEV_CUSTOM_SW_RETRY_TYPE_NONAGGR][WMI_AC_VI] = + tx_sw_retry_threshold->tx_non_aggr_sw_retry_threshold_vi; + tx_sw_retry[WMI_VDEV_CUSTOM_SW_RETRY_TYPE_NONAGGR][WMI_AC_VO] = + tx_sw_retry_threshold->tx_non_aggr_sw_retry_threshold_vo; - len = sizeof(*cmd); - buf = wmi_buf_alloc(wma_handle->wmi_handle, len); - if (!buf) - return QDF_STATUS_E_NOMEM; + retry_type = WMI_VDEV_CUSTOM_SW_RETRY_TYPE_NONAGGR; + while (retry_type < WMI_VDEV_CUSTOM_SW_RETRY_TYPE_MAX) { + for (queue_num = 0; queue_num < WMI_AC_MAX; queue_num++) { + if (tx_sw_retry[retry_type][queue_num] == 0) + continue; - buf_ptr = (u_int8_t *)wmi_buf_data(buf); - cmd = - (wmi_vdev_set_custom_sw_retry_th_cmd_fixed_param *)buf_ptr; + vdev_id = tx_sw_retry_threshold->vdev_id; + sw_retry = tx_sw_retry[retry_type][queue_num]; + ret = wma_set_sw_retry_by_qos(wma_handle, + vdev_id, + retry_type, + queue_num, + sw_retry); - WMITLV_SET_HDR(&cmd->tlv_header, - WMITLV_TAG_STRUC_wmi_vdev_set_custom_sw_retry_th_cmd_fixed_param, - WMITLV_GET_STRUCT_TLVLEN( - wmi_vdev_set_custom_sw_retry_th_cmd_fixed_param)); - - cmd->vdev_id = tx_sw_retry_threshold->vdev_id; - cmd->ac_type = queue_num; - cmd->sw_retry_type = WMI_VDEV_CUSTOM_SW_RETRY_TYPE_AGGR; - cmd->sw_retry_th = tx_aggr_retry[queue_num]; - - WMA_LOGD("queue: %d type: %d threshold: %d vdev: %d", - queue_num, cmd->sw_retry_type, - cmd->sw_retry_th, cmd->vdev_id); - - ret = wmi_unified_cmd_send(wma_handle->wmi_handle, buf, len, - WMI_VDEV_SET_CUSTOM_SW_RETRY_TH_CMDID); - if (ret) { - wmi_buf_free(buf); - return QDF_STATUS_E_FAILURE; + if (QDF_IS_STATUS_ERROR(ret)) + return ret; } + retry_type++; } return QDF_STATUS_SUCCESS;