mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-10 22:40:54 -04:00
qcacld-3.0: Add support to send ADDBA with user config
Add support to send ADDBA request with user configured buffer size and tid and ADDBA response with user configured buffer size. Change-Id: I2a1dfedadeb68a1cfca9a6eba8e7775d0bb51d1a CRs-Fixed: 2193872
This commit is contained in:
parent
aa6bc1b069
commit
bc87bec984
9 changed files with 194 additions and 9 deletions
|
|
@ -6294,6 +6294,12 @@ wlan_hdd_wifi_test_config_policy[
|
|||
.type = NLA_U8},
|
||||
[QCA_WLAN_VENDOR_ATTR_WIFI_TEST_CONFIG_WEP_TKIP_IN_HE] = {
|
||||
.type = NLA_U8},
|
||||
[QCA_WLAN_VENDOR_ATTR_WIFI_TEST_CONFIG_ADD_DEL_BA_SESSION] = {
|
||||
.type = NLA_U8},
|
||||
[QCA_WLAN_VENDOR_ATTR_WIFI_TEST_CONFIG_BA_TID] = {
|
||||
.type = NLA_U8},
|
||||
[QCA_WLAN_VENDOR_ATTR_WIFI_TEST_CONFIG_ADDBA_BUFF_SIZE] = {
|
||||
.type = NLA_U8},
|
||||
};
|
||||
|
||||
/**
|
||||
|
|
@ -7274,6 +7280,8 @@ __wlan_hdd_cfg80211_set_wifi_test_config(struct wiphy *wiphy,
|
|||
uint8_t set_val = 0;
|
||||
tSmeConfigParams *sme_config;
|
||||
bool update_sme_cfg = false;
|
||||
uint8_t tid = 0;
|
||||
uint16_t buff_size = 0;
|
||||
|
||||
ENTER_DEV(dev);
|
||||
|
||||
|
|
@ -7284,26 +7292,28 @@ __wlan_hdd_cfg80211_set_wifi_test_config(struct wiphy *wiphy,
|
|||
}
|
||||
sme_get_config_param(hdd_ctx->hHal, sme_config);
|
||||
|
||||
|
||||
if (QDF_GLOBAL_FTM_MODE == hdd_get_conparam()) {
|
||||
hdd_err("Command not allowed in FTM mode");
|
||||
return -EPERM;
|
||||
ret_val = -EPERM;
|
||||
goto send_err;
|
||||
}
|
||||
|
||||
ret_val = wlan_hdd_validate_context(hdd_ctx);
|
||||
if (ret_val)
|
||||
return ret_val;
|
||||
goto send_err;
|
||||
|
||||
if (hdd_ctx->driver_status == DRIVER_MODULES_CLOSED) {
|
||||
hdd_err("Driver Modules are closed, can not start logger");
|
||||
return -EINVAL;
|
||||
ret_val = -EINVAL;
|
||||
goto send_err;
|
||||
}
|
||||
|
||||
if (wlan_cfg80211_nla_parse(tb,
|
||||
QCA_WLAN_VENDOR_ATTR_WIFI_TEST_CONFIG_MAX,
|
||||
data, data_len, wlan_hdd_wifi_test_config_policy)) {
|
||||
hdd_err("invalid attr");
|
||||
return -EINVAL;
|
||||
ret_val = -EINVAL;
|
||||
goto send_err;
|
||||
}
|
||||
|
||||
if (tb[QCA_WLAN_VENDOR_ATTR_WIFI_TEST_CONFIG_ACCEPT_ADDBA_REQ]) {
|
||||
|
|
@ -7314,7 +7324,7 @@ __wlan_hdd_cfg80211_set_wifi_test_config(struct wiphy *wiphy,
|
|||
ret_val = sme_set_addba_accept(hdd_ctx->hHal,
|
||||
adapter->session_id, cfg_val);
|
||||
if (ret_val)
|
||||
return ret_val;
|
||||
goto send_err;
|
||||
}
|
||||
|
||||
if (tb[QCA_WLAN_VENDOR_ATTR_WIFI_TEST_CONFIG_HE_MCS]) {
|
||||
|
|
@ -7324,7 +7334,7 @@ __wlan_hdd_cfg80211_set_wifi_test_config(struct wiphy *wiphy,
|
|||
ret_val = sme_update_he_mcs(hdd_ctx->hHal, adapter->session_id,
|
||||
cfg_val);
|
||||
if (ret_val)
|
||||
return ret_val;
|
||||
goto send_err;
|
||||
}
|
||||
|
||||
if (tb[QCA_WLAN_VENDOR_ATTR_WIFI_TEST_CONFIG_WMM_ENABLE]) {
|
||||
|
|
@ -7382,9 +7392,52 @@ __wlan_hdd_cfg80211_set_wifi_test_config(struct wiphy *wiphy,
|
|||
update_sme_cfg = true;
|
||||
}
|
||||
|
||||
if (tb[QCA_WLAN_VENDOR_ATTR_WIFI_TEST_CONFIG_ADD_DEL_BA_SESSION]) {
|
||||
if (tb[QCA_WLAN_VENDOR_ATTR_WIFI_TEST_CONFIG_BA_TID]) {
|
||||
tid = nla_get_u8(tb[
|
||||
QCA_WLAN_VENDOR_ATTR_WIFI_TEST_CONFIG_BA_TID]);
|
||||
} else {
|
||||
hdd_err("TID is not set for ADD/DEL BA cfg");
|
||||
ret_val = -EINVAL;
|
||||
goto send_err;
|
||||
}
|
||||
cfg_val = nla_get_u8(tb[
|
||||
QCA_WLAN_VENDOR_ATTR_WIFI_TEST_CONFIG_ADD_DEL_BA_SESSION]);
|
||||
if (cfg_val == QCA_WLAN_ADD_BA) {
|
||||
if (tb[
|
||||
QCA_WLAN_VENDOR_ATTR_WIFI_TEST_CONFIG_ADDBA_BUFF_SIZE])
|
||||
buff_size = nla_get_u8(tb[
|
||||
QCA_WLAN_VENDOR_ATTR_WIFI_TEST_CONFIG_ADDBA_BUFF_SIZE]);
|
||||
ret_val = sme_send_addba_req(hdd_ctx->hHal,
|
||||
adapter->session_id, tid, buff_size);
|
||||
} else if (cfg_val == QCA_WLAN_DELETE_BA) {
|
||||
} else {
|
||||
hdd_err("Invalid BA session cfg");
|
||||
ret_val = -EINVAL;
|
||||
goto send_err;
|
||||
}
|
||||
} else if (tb[QCA_WLAN_VENDOR_ATTR_WIFI_TEST_CONFIG_ADDBA_BUFF_SIZE]) {
|
||||
buff_size = nla_get_u8(tb[
|
||||
QCA_WLAN_VENDOR_ATTR_WIFI_TEST_CONFIG_ADDBA_BUFF_SIZE]);
|
||||
hdd_debug("set buff size to %d for all tids", buff_size);
|
||||
ret_val = sme_set_ba_buff_size(hdd_ctx->hHal,
|
||||
adapter->session_id, buff_size);
|
||||
if (ret_val)
|
||||
goto send_err;
|
||||
if (buff_size > 64)
|
||||
/* Configure ADDBA req buffer size to 256 */
|
||||
set_val = 3;
|
||||
else
|
||||
/* Configure ADDBA req buffer size to 64 */
|
||||
set_val = 2;
|
||||
ret_val = wma_cli_set_command(adapter->session_id,
|
||||
WMI_VDEV_PARAM_BA_MODE, set_val, VDEV_CMD);
|
||||
}
|
||||
|
||||
if (update_sme_cfg)
|
||||
sme_update_config(hdd_ctx->hHal, sme_config);
|
||||
|
||||
send_err:
|
||||
qdf_mem_free(sme_config);
|
||||
|
||||
return ret_val;
|
||||
|
|
|
|||
|
|
@ -955,6 +955,7 @@ typedef struct sAniSirGlobal {
|
|||
/* 11k Offload Support */
|
||||
bool is_11k_offload_supported;
|
||||
uint8_t reject_addba_req;
|
||||
uint16_t usr_cfg_ba_buff_size;
|
||||
} tAniSirGlobal;
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -3969,6 +3969,11 @@ typedef struct sSirModifyIE {
|
|||
|
||||
} tSirModifyIE, *tpSirModifyIE;
|
||||
|
||||
struct send_add_ba_req {
|
||||
uint8_t mac_addr[QDF_MAC_ADDR_SIZE];
|
||||
struct addba_send_params param;
|
||||
};
|
||||
|
||||
/* Message format for Update IE message sent to PE */
|
||||
typedef struct sSirModifyIEsInd {
|
||||
uint16_t msgType;
|
||||
|
|
|
|||
|
|
@ -696,6 +696,8 @@ struct sir_mgmt_msg {
|
|||
#define SIR_HAL_INVOKE_NEIGHBOR_REPORT (SIR_HAL_ITC_MSG_TYPES_BEGIN + 395)
|
||||
#define SIR_HAL_OBSS_COLOR_COLLISION_REQ (SIR_HAL_ITC_MSG_TYPES_BEGIN + 396)
|
||||
#define SIR_HAL_OBSS_COLOR_COLLISION_INFO (SIR_HAL_ITC_MSG_TYPES_BEGIN + 397)
|
||||
|
||||
#define SIR_HAL_SEND_ADDBA_REQ (SIR_HAL_ITC_MSG_TYPES_BEGIN + 398)
|
||||
#define SIR_HAL_MSG_TYPES_END (SIR_HAL_MSG_TYPES_BEGIN + 0x1FF)
|
||||
|
||||
/* CFG message types */
|
||||
|
|
|
|||
|
|
@ -4749,8 +4749,10 @@ QDF_STATUS lim_send_addba_response_frame(tpAniSirGlobal mac_ctx,
|
|||
}
|
||||
frm.addba_param_set.tid = tid;
|
||||
frm.addba_param_set.buff_size = buff_size;
|
||||
frm.addba_param_set.amsdu_supp = SIR_MAC_BA_POLICY_IMMEDIATE;
|
||||
frm.addba_param_set.policy = SIR_MAC_BA_AMSDU_SUPPORTED;
|
||||
if (mac_ctx->usr_cfg_ba_buff_size)
|
||||
frm.addba_param_set.buff_size = mac_ctx->usr_cfg_ba_buff_size;
|
||||
frm.addba_param_set.amsdu_supp = SIR_MAC_BA_AMSDU_SUPPORTED;
|
||||
frm.addba_param_set.policy = SIR_MAC_BA_POLICY_IMMEDIATE;
|
||||
frm.ba_timeout.timeout = batimeout;
|
||||
if (addba_extn_present) {
|
||||
frm.addba_extn_element.present = 1;
|
||||
|
|
|
|||
|
|
@ -2118,6 +2118,29 @@ static inline QDF_STATUS sme_handle_sae_msg(tHalHandle hal, uint8_t session_id,
|
|||
}
|
||||
#endif
|
||||
|
||||
/**
|
||||
* sme_set_ba_buff_size() - sets BA buffer size
|
||||
* @hal: Pointer to HAL
|
||||
* @session_id: SME session id
|
||||
* @buff_size: BA buffer size
|
||||
*
|
||||
* Return: 0 on success else err code
|
||||
*/
|
||||
int sme_set_ba_buff_size(tHalHandle hal, uint8_t session_id,
|
||||
uint16_t buff_size);
|
||||
|
||||
/**
|
||||
* sme_send_addba_req() - send ADDBA request with user config
|
||||
* @hal: Pointer to HAL
|
||||
* @session_id: SME session id
|
||||
* @tid: tid val for BA session
|
||||
* @buff_size: BA buffer size
|
||||
*
|
||||
* Return: 0 on success else err code
|
||||
*/
|
||||
int sme_send_addba_req(tHalHandle hal, uint8_t session_id, uint8_t tid,
|
||||
uint16_t buff_size);
|
||||
|
||||
#ifdef WLAN_FEATURE_11AX
|
||||
/**
|
||||
* sme_update_he_cap_nss() - sets the nss based on user request
|
||||
|
|
|
|||
|
|
@ -10089,6 +10089,74 @@ int sme_set_addba_accept(tHalHandle hal, uint8_t session_id, int value)
|
|||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
int sme_set_ba_buff_size(tHalHandle hal, uint8_t session_id,
|
||||
uint16_t buff_size)
|
||||
{
|
||||
tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
|
||||
if (!buff_size) {
|
||||
sme_err("invalid buff size %d", buff_size);
|
||||
return -EINVAL;
|
||||
}
|
||||
mac_ctx->usr_cfg_ba_buff_size = buff_size;
|
||||
sme_debug("addba buff size is set to %d",
|
||||
mac_ctx->usr_cfg_ba_buff_size);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
#define DEFAULT_BA_BUFF_SIZE 64
|
||||
int sme_send_addba_req(tHalHandle hal, uint8_t session_id, uint8_t tid,
|
||||
uint16_t buff_size)
|
||||
{
|
||||
tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
|
||||
uint16_t ba_buff = 0;
|
||||
QDF_STATUS status;
|
||||
struct scheduler_msg msg = {0};
|
||||
struct send_add_ba_req *send_ba_req;
|
||||
struct csr_roam_session *csr_session = NULL;
|
||||
|
||||
if (!csr_is_conn_state_connected_infra(mac_ctx, session_id)) {
|
||||
sme_err("STA not infra/connected state session_id: %d",
|
||||
session_id);
|
||||
return -EINVAL;
|
||||
}
|
||||
csr_session = CSR_GET_SESSION(mac_ctx, session_id);
|
||||
if (!csr_session) {
|
||||
sme_err("CSR session is NULL");
|
||||
return -EINVAL;
|
||||
}
|
||||
send_ba_req = qdf_mem_malloc(sizeof(*send_ba_req));
|
||||
if (!send_ba_req) {
|
||||
sme_err("mem alloc failed");
|
||||
return -EIO;
|
||||
}
|
||||
qdf_mem_copy(send_ba_req->mac_addr,
|
||||
csr_session->connectedProfile.bssid.bytes,
|
||||
QDF_MAC_ADDR_SIZE);
|
||||
ba_buff = buff_size;
|
||||
if (!buff_size) {
|
||||
if (mac_ctx->usr_cfg_ba_buff_size)
|
||||
ba_buff = mac_ctx->usr_cfg_ba_buff_size;
|
||||
else
|
||||
ba_buff = DEFAULT_BA_BUFF_SIZE;
|
||||
}
|
||||
send_ba_req->param.vdev_id = session_id;
|
||||
send_ba_req->param.tidno = tid;
|
||||
send_ba_req->param.buffersize = ba_buff;
|
||||
msg.type = WMA_SEND_ADDBA_REQ;
|
||||
msg.bodyptr = send_ba_req;
|
||||
status = scheduler_post_msg(QDF_MODULE_ID_WMA, &msg);
|
||||
if (QDF_STATUS_SUCCESS != status) {
|
||||
sme_err("Failed to post WMA_SEND_ADDBA_REQ");
|
||||
qdf_mem_free(send_ba_req);
|
||||
return -EIO;
|
||||
}
|
||||
sme_debug("ADDBA_REQ sent to FW: tid %d buff_size %d", tid, ba_buff);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
#define HT20_SHORT_GI_MCS7_RATE 722
|
||||
/*
|
||||
* sme_send_rate_update_ind() -
|
||||
|
|
|
|||
|
|
@ -344,6 +344,7 @@
|
|||
|
||||
#define WMA_RATE_UPDATE_IND SIR_HAL_RATE_UPDATE_IND
|
||||
|
||||
#define WMA_SEND_ADDBA_REQ SIR_HAL_SEND_ADDBA_REQ
|
||||
#define WMA_INIT_THERMAL_INFO_CMD SIR_HAL_INIT_THERMAL_INFO_CMD
|
||||
#define WMA_SET_THERMAL_LEVEL SIR_HAL_SET_THERMAL_LEVEL
|
||||
#define WMA_RMC_ENABLE_IND SIR_HAL_RMC_ENABLE_IND
|
||||
|
|
|
|||
|
|
@ -660,6 +660,31 @@ QDF_STATUS wma_form_unit_test_cmd_and_send(uint32_t vdev_id,
|
|||
return status;
|
||||
}
|
||||
|
||||
static void wma_process_send_addba_req(tp_wma_handle wma_handle,
|
||||
struct send_add_ba_req *send_addba)
|
||||
{
|
||||
QDF_STATUS status;
|
||||
|
||||
if (!wma_handle || !wma_handle->wmi_handle) {
|
||||
WMA_LOGE(FL("Invalid WMA/WMI handle"));
|
||||
qdf_mem_free(send_addba);
|
||||
return;
|
||||
}
|
||||
|
||||
status = wmi_unified_addba_send_cmd_send(wma_handle->wmi_handle,
|
||||
send_addba->mac_addr,
|
||||
&send_addba->param);
|
||||
if (QDF_STATUS_SUCCESS != status) {
|
||||
WMA_LOGE(FL("Failed to process WMA_SEND_ADDBA_REQ"));
|
||||
}
|
||||
WMA_LOGD(FL("sent ADDBA req to" MAC_ADDRESS_STR "tid %d buff_size %d"),
|
||||
MAC_ADDR_ARRAY(send_addba->mac_addr),
|
||||
send_addba->param.tidno,
|
||||
send_addba->param.buffersize);
|
||||
|
||||
qdf_mem_free(send_addba);
|
||||
}
|
||||
|
||||
/**
|
||||
* wma_ipa_get_stat() - get IPA data path stats from FW
|
||||
*
|
||||
|
|
@ -7745,6 +7770,11 @@ static QDF_STATUS wma_mc_process_msg(struct scheduler_msg *msg)
|
|||
(tSirTxPowerLimit *) msg->bodyptr);
|
||||
qdf_mem_free(msg->bodyptr);
|
||||
break;
|
||||
case WMA_SEND_ADDBA_REQ:
|
||||
wma_process_send_addba_req(wma_handle,
|
||||
(struct send_add_ba_req *)msg->bodyptr);
|
||||
break;
|
||||
|
||||
#ifdef FEATURE_WLAN_CH_AVOID
|
||||
case WMA_CH_AVOID_UPDATE_REQ:
|
||||
wma_process_ch_avoid_update_req(wma_handle,
|
||||
|
|
|
|||
Loading…
Reference in a new issue