qcacld-3.0: Configure non aggr TX packet retransmission

Wireless application needs to tune parameters per AC based.
Such as VI/VO queue use the different re-transmission attempts
while other queue keeps the default value. It helps to improve
the video/audio performance in noisy environment. this change
add the ability to config re-transmission attempts of non
aggregation QOS packets.

Change-Id: I95404302463275803e3feff3038f04c900b14705
CRs-Fixed: 2323555
This commit is contained in:
stonez
2018-10-17 13:37:48 +08:00
committed by nshrivas
parent 8e66eb6163
commit 26388d085a
9 changed files with 275 additions and 74 deletions

View File

@@ -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);
}

View File

@@ -294,6 +294,110 @@
CFG_VALUE_OR_DEFAULT, \
"Tx aggregation retry value for VO")
/*
* <ini>
* 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
*
* </ini>
*/
#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")
/*
* <ini>
* 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
*
* </ini>
*/
#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")
/*
* <ini>
* 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
*
* </ini>
*/
#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")
/*
* <ini>
* 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
*
* </ini>
*/
#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")
/*
* <ini>
* 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 */

View File

@@ -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;
};

View File

@@ -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;
};
/**

View File

@@ -16965,6 +16965,14 @@ QDF_STATUS csr_issue_add_sta_for_session_req(tpAniSirGlobal pMac,
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;
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;

View File

@@ -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

View File

@@ -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;
};
/**

View File

@@ -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;

View File

@@ -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);
if (!tx_sw_retry_threshold) {
WMA_LOGE("%s: invalid pointer", __func__);
return QDF_STATUS_E_INVAL;
}
if (!wma_handle) {
WMA_LOGE("%s: WMA context is invald!", __func__);
return QDF_STATUS_E_INVAL;
}
tx_aggr_retry[0] =
tx_sw_retry_threshold->tx_aggr_sw_retry_threshold_be;
tx_aggr_retry[1] =
tx_sw_retry_threshold->tx_aggr_sw_retry_threshold_bk;
tx_aggr_retry[2] =
tx_sw_retry_threshold->tx_aggr_sw_retry_threshold_vi;
tx_aggr_retry[3] =
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;
len = sizeof(*cmd);
buf = wmi_buf_alloc(wma_handle->wmi_handle, len);
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;
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 = 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];
cmd->vdev_id = vdev_id;
cmd->ac_type = ac_type;
cmd->sw_retry_type = retry_type;
cmd->sw_retry_th = sw_retry;
WMA_LOGD("queue: %d type: %d threshold: %d vdev: %d",
queue_num, cmd->sw_retry_type,
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(wma_handle->wmi_handle, buf, len,
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_err("%s: invalid pointer", __func__);
return QDF_STATUS_E_INVAL;
}
if (!wma_handle) {
wma_err("%s: WMA context is invalid!", __func__);
return QDF_STATUS_E_INVAL;
}
tx_sw_retry[WMI_VDEV_CUSTOM_SW_RETRY_TYPE_AGGR][WMI_AC_BE] =
tx_sw_retry_threshold->tx_aggr_sw_retry_threshold_be;
tx_sw_retry[WMI_VDEV_CUSTOM_SW_RETRY_TYPE_AGGR][WMI_AC_BK] =
tx_sw_retry_threshold->tx_aggr_sw_retry_threshold_bk;
tx_sw_retry[WMI_VDEV_CUSTOM_SW_RETRY_TYPE_AGGR][WMI_AC_VI] =
tx_sw_retry_threshold->tx_aggr_sw_retry_threshold_vi;
tx_sw_retry[WMI_VDEV_CUSTOM_SW_RETRY_TYPE_AGGR][WMI_AC_VO] =
tx_sw_retry_threshold->tx_aggr_sw_retry_threshold_vo;
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;
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;
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);
if (QDF_IS_STATUS_ERROR(ret))
return ret;
}
retry_type++;
}
return QDF_STATUS_SUCCESS;