qcacld-3.0: Converge on struct plm_req_params

The driver currently defines two different data structures to hold
PLM Request parameters:
- legacy struct plm_req
- unified WMI struct plm_req_params

To align with the converged software architecture remove the legacy
definition and exclusively use the unified WMI definition.

Change-Id: I7675686aba9590a4507a8f9ebffcbf181ee00a21
CRs-Fixed: 2411817
This commit is contained in:
Jeff Johnson
2019-02-26 08:02:11 -08:00
gecommit door nshrivas
bovenliggende a40d629fbd
commit 36583f0647
6 gewijzigde bestanden met toevoegingen van 104 en 170 verwijderingen

Bestand weergeven

@@ -1504,7 +1504,7 @@ hdd_parse_set_roam_scan_channels(struct hdd_adapter *adapter, const char *comman
* Return: 0 for success non-zero for failure
*/
static QDF_STATUS hdd_parse_plm_cmd(uint8_t *command,
struct plm_req *req)
struct plm_req_params *req)
{
uint8_t *in_ptr = NULL;
int count, content = 0, ret = 0;
@@ -1598,8 +1598,8 @@ static QDF_STATUS hdd_parse_plm_cmd(uint8_t *command,
if (content < 0)
return QDF_STATUS_E_FAILURE;
req->numBursts = content;
hdd_debug("num burst %d", req->numBursts);
req->num_bursts = content;
hdd_debug("num bursts %d", req->num_bursts);
in_ptr = strpbrk(in_ptr, " ");
if (NULL == in_ptr)
@@ -1621,8 +1621,8 @@ static QDF_STATUS hdd_parse_plm_cmd(uint8_t *command,
if (content <= 0)
return QDF_STATUS_E_FAILURE;
req->burstInt = content;
hdd_debug("burst Int %d", req->burstInt);
req->burst_int = content;
hdd_debug("burst int %d", req->burst_int);
in_ptr = strpbrk(in_ptr, " ");
if (NULL == in_ptr)
@@ -1644,8 +1644,8 @@ static QDF_STATUS hdd_parse_plm_cmd(uint8_t *command,
if (content <= 0)
return QDF_STATUS_E_FAILURE;
req->measDuration = content;
hdd_debug("measDur %d", req->measDuration);
req->meas_duration = content;
hdd_debug("meas duration %d", req->meas_duration);
in_ptr = strpbrk(in_ptr, " ");
if (NULL == in_ptr)
@@ -1667,8 +1667,8 @@ static QDF_STATUS hdd_parse_plm_cmd(uint8_t *command,
if (content <= 0)
return QDF_STATUS_E_FAILURE;
req->burstLen = content;
hdd_debug("burstLen %d", req->burstLen);
req->burst_len = content;
hdd_debug("burst len %d", req->burst_len);
in_ptr = strpbrk(in_ptr, " ");
if (NULL == in_ptr)
@@ -1690,9 +1690,8 @@ static QDF_STATUS hdd_parse_plm_cmd(uint8_t *command,
if (content <= 0)
return QDF_STATUS_E_FAILURE;
req->desiredTxPwr = content;
hdd_debug("desiredTxPwr %d",
req->desiredTxPwr);
req->desired_tx_pwr = content;
hdd_debug("desired tx pwr %d", req->desired_tx_pwr);
for (count = 0; count < QDF_MAC_ADDR_SIZE; count++) {
in_ptr = strpbrk(in_ptr, " ");
@@ -1716,8 +1715,8 @@ static QDF_STATUS hdd_parse_plm_cmd(uint8_t *command,
req->mac_addr.bytes[count] = content;
}
hdd_debug("MC addr " MAC_ADDRESS_STR,
MAC_ADDR_ARRAY(req->mac_addr.bytes));
hdd_debug("MAC addr " MAC_ADDRESS_STR,
MAC_ADDR_ARRAY(req->mac_addr.bytes));
in_ptr = strpbrk(in_ptr, " ");
@@ -1741,11 +1740,11 @@ static QDF_STATUS hdd_parse_plm_cmd(uint8_t *command,
return QDF_STATUS_E_FAILURE;
content = QDF_MIN(content, CFG_VALID_CHANNEL_LIST_LEN);
req->plmNumCh = content;
hdd_debug("numch: %d", req->plmNumCh);
req->plm_num_ch = content;
hdd_debug("num ch: %d", req->plm_num_ch);
/* Channel numbers */
for (count = 0; count < req->plmNumCh; count++) {
for (count = 0; count < req->plm_num_ch; count++) {
in_ptr = strpbrk(in_ptr, " ");
if (NULL == in_ptr)
@@ -1765,8 +1764,8 @@ static QDF_STATUS hdd_parse_plm_cmd(uint8_t *command,
content > WNI_CFG_CURRENT_CHANNEL_STAMAX)
return QDF_STATUS_E_FAILURE;
req->plmChList[count] = content;
hdd_debug(" ch- %d", req->plmChList[count]);
req->plm_ch_list[count] = content;
hdd_debug(" ch- %d", req->plm_ch_list[count]);
}
}
/* If PLM START */
@@ -5579,11 +5578,11 @@ exit:
/**
* drv_cmd_ccx_plm_req() - Set ESE PLM request
* @adapter: Pointer to the HDD adapter
* @hdd_ctx: Pointer to the HDD context
* @command: Driver command string
* @adapter: Pointer to the HDD adapter
* @hdd_ctx: Pointer to the HDD context
* @command: Driver command string
* @command_len: Driver command string length
* @priv_data: Private data coming with the driver command. Unused here
* @priv_data: Private data coming with the driver command. Unused here
*
* This function handles driver command that sets the ESE PLM request
*
@@ -5595,36 +5594,21 @@ static int drv_cmd_ccx_plm_req(struct hdd_adapter *adapter,
uint8_t command_len,
struct hdd_priv_data *priv_data)
{
int ret = 0;
uint8_t *value = command;
QDF_STATUS status = QDF_STATUS_SUCCESS;
struct plm_req *req = NULL;
QDF_STATUS status;
struct plm_req_params *req;
req = qdf_mem_malloc(sizeof(struct plm_req));
if (NULL == req) {
ret = -ENOMEM;
goto exit;
req = qdf_mem_malloc(sizeof(*req));
if (!req)
return -ENOMEM;
status = hdd_parse_plm_cmd(command, req);
if (QDF_IS_STATUS_SUCCESS(status)) {
req->vdev_id = adapter->vdev_id;
status = sme_set_plm_request(hdd_ctx->mac_handle, req);
}
qdf_mem_free(req);
status = hdd_parse_plm_cmd(value, req);
if (QDF_STATUS_SUCCESS != status) {
qdf_mem_free(req);
req = NULL;
ret = -EINVAL;
goto exit;
}
req->sessionId = adapter->vdev_id;
status = sme_set_plm_request(hdd_ctx->mac_handle, req);
if (QDF_STATUS_SUCCESS != status) {
qdf_mem_free(req);
req = NULL;
ret = -EINVAL;
goto exit;
}
exit:
return ret;
return qdf_status_to_os_return(status);
}
/**

Bestand weergeven

@@ -869,24 +869,6 @@ typedef struct sEsePEContext {
tEseTSMContext tsm;
} tEsePEContext, *tpEsePEContext;
struct plm_req {
uint16_t diag_token; /* Dialog token */
uint16_t meas_token; /* measurement token */
uint16_t numBursts; /* total number of bursts */
uint16_t burstInt; /* burst interval in seconds */
uint16_t measDuration; /* in TU's,STA goes off-ch */
/* no of times the STA should cycle through PLM ch list */
uint8_t burstLen;
int8_t desiredTxPwr; /* desired tx power */
struct qdf_mac_addr mac_addr; /* MC dest addr */
/* no of channels */
uint8_t plmNumCh;
/* channel numbers */
uint8_t plmChList[CFG_VALID_CHANNEL_LIST_LEN];
uint8_t sessionId;
bool enable;
};
#endif /* FEATURE_WLAN_ESE */
/* / Definition for join request */

Bestand weergeven

@@ -627,8 +627,10 @@ QDF_STATUS sme_set_ese_beacon_request(mac_handle_t mac_handle,
*
* Return: QDF_STATUS enumeration
*/
QDF_STATUS sme_set_plm_request(mac_handle_t mac_handle, struct plm_req *req);
QDF_STATUS sme_set_plm_request(mac_handle_t mac_handle,
struct plm_req_params *req);
#endif /*FEATURE_WLAN_ESE */
QDF_STATUS sme_get_modify_profile_fields(mac_handle_t mac_handle,
uint8_t sessionId,
tCsrRoamModifyProfileFields *

Bestand weergeven

@@ -1450,7 +1450,8 @@ QDF_STATUS sme_update_is_ese_feature_enabled(mac_handle_t mac_handle,
return QDF_STATUS_SUCCESS;
}
QDF_STATUS sme_set_plm_request(mac_handle_t mac_handle, struct plm_req *req)
QDF_STATUS sme_set_plm_request(mac_handle_t mac_handle,
struct plm_req_params *req)
{
QDF_STATUS status;
bool ret = false;
@@ -1458,71 +1459,80 @@ QDF_STATUS sme_set_plm_request(mac_handle_t mac_handle, struct plm_req *req)
uint8_t ch_list[CFG_VALID_CHANNEL_LIST_LEN] = { 0 };
uint8_t count, valid_count = 0;
struct scheduler_msg msg = {0};
struct csr_roam_session *pSession = CSR_GET_SESSION(mac,
req->sessionId);
struct csr_roam_session *session;
struct plm_req_params *body;
status = sme_acquire_global_lock(&mac->sme);
if (!QDF_IS_STATUS_SUCCESS(status))
return status;
if (!pSession) {
sme_err("session %d not found", req->sessionId);
session = CSR_GET_SESSION(mac, req->vdev_id);
if (!session) {
sme_err("session %d not found", req->vdev_id);
sme_release_global_lock(&mac->sme);
return QDF_STATUS_E_FAILURE;
}
if (!pSession->sessionActive) {
if (!session->sessionActive) {
QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
FL("Invalid Sessionid"));
sme_release_global_lock(&mac->sme);
return QDF_STATUS_E_FAILURE;
}
if (!req->enable)
/* per contract must make a copy of the params when messaging */
body = qdf_mem_malloc(sizeof(*body));
if (!req)
return QDF_STATUS_E_NOMEM;
*body = *req;
if (!body->enable)
goto send_plm_start;
/* validating channel numbers */
for (count = 0; count < req->plmNumCh; count++) {
ret = csr_is_supported_channel(mac, req->plmChList[count]);
if (ret && req->plmChList[count] > 14) {
if (CHANNEL_STATE_DFS == wlan_reg_get_channel_state(
mac->pdev,
req->plmChList[count])) {
for (count = 0; count < body->plm_num_ch; count++) {
uint8_t ch = body->plm_ch_list[count];
ret = csr_is_supported_channel(mac, ch);
if (!ret) {
/* Not supported, ignore the channel */
QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
FL("Unsupported channel %d ignored for PLM"),
ch);
continue;
}
if (ch > 14) {
enum channel_state state =
wlan_reg_get_channel_state(mac->pdev, ch);
if (state == CHANNEL_STATE_DFS) {
/* DFS channel is provided, no PLM bursts can be
* transmitted. Ignoring these channels.
*/
QDF_TRACE(QDF_MODULE_ID_SME,
QDF_TRACE_LEVEL_DEBUG,
FL("DFS channel %d ignored for PLM"),
req->plmChList[count]);
ch);
continue;
}
} else if (!ret) {
/* Not supported, ignore the channel */
QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
FL("Unsupported channel %d ignored for PLM"),
req->plmChList[count]);
continue;
}
ch_list[valid_count] = req->plmChList[count];
valid_count++;
ch_list[valid_count++] = ch;
} /* End of for () */
/* Copying back the valid channel list to plm struct */
qdf_mem_zero((void *)req->plmChList,
req->plmNumCh);
qdf_mem_zero(body->plm_ch_list, body->plm_num_ch);
if (valid_count)
qdf_mem_copy(req->plmChList, ch_list,
valid_count);
qdf_mem_copy(body->plm_ch_list, ch_list, valid_count);
/* All are invalid channels, FW need to send the PLM
* report with "incapable" bit set.
*/
req->plmNumCh = valid_count;
body->plm_num_ch = valid_count;
send_plm_start:
/* PLM START */
msg.type = WMA_SET_PLM_REQ;
msg.reserved = 0;
msg.bodyptr = req;
msg.bodyptr = body;
if (!QDF_IS_STATUS_SUCCESS(scheduler_post_message(QDF_MODULE_ID_SME,
QDF_MODULE_ID_WMA,
@@ -1531,11 +1541,12 @@ send_plm_start:
QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
FL("Not able to post WMA_SET_PLM_REQ to WMA"));
sme_release_global_lock(&mac->sme);
qdf_mem_free(body);
return QDF_STATUS_E_FAILURE;
}
sme_release_global_lock(&mac->sme);
return status;
return QDF_STATUS_SUCCESS;
}
/**

Bestand weergeven

@@ -1117,9 +1117,7 @@ void wma_add_ts_req(tp_wma_handle wma, struct add_ts_param *msg);
#ifdef FEATURE_WLAN_ESE
QDF_STATUS wma_process_tsm_stats_req(tp_wma_handle wma_handler,
void *pTsmStatsMsg);
QDF_STATUS wma_plm_start(tp_wma_handle wma, const struct plm_req *plm);
QDF_STATUS wma_plm_stop(tp_wma_handle wma, const struct plm_req *plm);
void wma_config_plm(tp_wma_handle wma, struct plm_req *plm);
void wma_config_plm(tp_wma_handle wma, struct plm_req_params *plm);
#endif
QDF_STATUS wma_process_mcbc_set_filter_req(tp_wma_handle wma_handle,

Bestand weergeven

@@ -3276,27 +3276,23 @@ send_resp:
/**
* wma_plm_start() - plm start request
* @wma: wma handle
* @plm: plm request parameters
* @params: plm request parameters
*
* This function request FW to start PLM.
*
* Return: QDF status
*/
QDF_STATUS wma_plm_start(tp_wma_handle wma, const struct plm_req *plm)
static QDF_STATUS wma_plm_start(tp_wma_handle wma,
struct plm_req_params *params)
{
struct plm_req_params params = {0};
uint32_t num_channels;
uint32_t *channel_list = NULL;
uint32_t i;
QDF_STATUS status;
if (NULL == plm || NULL == wma) {
WMA_LOGE("%s: input pointer is NULL ", __func__);
return QDF_STATUS_E_FAILURE;
}
WMA_LOGD("PLM Start");
num_channels = plm->plmNumCh;
num_channels = params->plm_num_ch;
if (num_channels) {
channel_list = qdf_mem_malloc(sizeof(uint32_t) * num_channels);
@@ -3304,41 +3300,23 @@ QDF_STATUS wma_plm_start(tp_wma_handle wma, const struct plm_req *plm)
return QDF_STATUS_E_FAILURE;
for (i = 0; i < num_channels; i++) {
channel_list[i] = plm->plmChList[i];
channel_list[i] = params->plm_ch_list[i];
if (channel_list[i] < WMA_NLO_FREQ_THRESH)
channel_list[i] =
cds_chan_to_freq(channel_list[i]);
}
}
params.diag_token = plm->diag_token;
params.meas_token = plm->meas_token;
params.num_bursts = plm->numBursts;
params.burst_int = plm->burstInt;
params.meas_duration = plm->measDuration;
params.burst_len = plm->burstLen;
params.desired_tx_pwr = plm->desiredTxPwr;
params.plm_num_ch = plm->plmNumCh;
params.vdev_id = plm->sessionId;
params.enable = plm->enable;
qdf_mem_copy(&params.mac_addr, &plm->mac_addr,
sizeof(struct qdf_mac_addr));
qdf_mem_copy(params.plm_ch_list, plm->plmChList,
WMI_CFG_VALID_CHANNEL_LIST_LEN);
status = wmi_unified_plm_start_cmd(wma->wmi_handle,
&params, channel_list);
if (QDF_IS_STATUS_ERROR(status)) {
qdf_mem_free(channel_list);
return status;
}
status = wmi_unified_plm_start_cmd(wma->wmi_handle, params,
channel_list);
qdf_mem_free(channel_list);
wma->interfaces[plm->sessionId].plm_in_progress = true;
if (QDF_IS_STATUS_ERROR(status))
return status;
wma->interfaces[params->vdev_id].plm_in_progress = true;
WMA_LOGD("Plm start request sent successfully for vdev %d",
plm->sessionId);
params->vdev_id);
return status;
}
@@ -3346,53 +3324,32 @@ QDF_STATUS wma_plm_start(tp_wma_handle wma, const struct plm_req *plm)
/**
* wma_plm_stop() - plm stop request
* @wma: wma handle
* @plm: plm request parameters
* @params: plm request parameters
*
* This function request FW to stop PLM.
*
* Return: QDF status
*/
QDF_STATUS wma_plm_stop(tp_wma_handle wma, const struct plm_req *plm)
static QDF_STATUS wma_plm_stop(tp_wma_handle wma,
struct plm_req_params *params)
{
struct plm_req_params params = {0};
QDF_STATUS status;
if (NULL == plm || NULL == wma) {
WMA_LOGE("%s: input pointer is NULL ", __func__);
return QDF_STATUS_E_FAILURE;
}
if (false == wma->interfaces[plm->sessionId].plm_in_progress) {
if (!wma->interfaces[params->vdev_id].plm_in_progress) {
WMA_LOGE("No active plm req found, skip plm stop req");
return QDF_STATUS_E_FAILURE;
}
WMA_LOGD("PLM Stop");
params.diag_token = plm->diag_token;
params.meas_token = plm->meas_token;
params.num_bursts = plm->numBursts;
params.burst_int = plm->burstInt;
params.meas_duration = plm->measDuration;
params.burst_len = plm->burstLen;
params.desired_tx_pwr = plm->desiredTxPwr;
params.plm_num_ch = plm->plmNumCh;
params.vdev_id = plm->sessionId;
params.enable = plm->enable;
qdf_mem_copy(&params.mac_addr, &plm->mac_addr,
sizeof(struct qdf_mac_addr));
qdf_mem_copy(params.plm_ch_list, plm->plmChList,
WMI_CFG_VALID_CHANNEL_LIST_LEN);
status = wmi_unified_plm_stop_cmd(wma->wmi_handle,
&params);
status = wmi_unified_plm_stop_cmd(wma->wmi_handle, params);
if (QDF_IS_STATUS_ERROR(status))
return status;
wma->interfaces[plm->sessionId].plm_in_progress = false;
wma->interfaces[params->vdev_id].plm_in_progress = false;
WMA_LOGD("Plm stop request sent successfully for vdev %d",
plm->sessionId);
params->vdev_id);
return status;
}
@@ -3400,25 +3357,25 @@ QDF_STATUS wma_plm_stop(tp_wma_handle wma, const struct plm_req *plm)
/**
* wma_config_plm() - config PLM
* @wma: wma handle
* @plm: plm request parameters
* @params: plm request parameters
*
* Return: none
*/
void wma_config_plm(tp_wma_handle wma, struct plm_req *plm)
void wma_config_plm(tp_wma_handle wma, struct plm_req_params *params)
{
QDF_STATUS ret;
if (NULL == plm || NULL == wma)
if (!params || !wma)
return;
if (plm->enable)
ret = wma_plm_start(wma, plm);
if (params->enable)
ret = wma_plm_start(wma, params);
else
ret = wma_plm_stop(wma, plm);
ret = wma_plm_stop(wma, params);
if (ret)
WMA_LOGE("%s: PLM %s failed %d", __func__,
plm->enable ? "start" : "stop", ret);
params->enable ? "start" : "stop", ret);
}
#endif