qcacld-3.0: Restrict the band in SET PCL command

Restrict the band of PCL to the connected band if
intra band roaming is enabled

Change-Id: I78e9a29d7f8eb226e899e944e4d2980629c52a01
CRs-Fixed: 2302607
This commit is contained in:
Varun Reddy Yeturu
2018-09-10 21:36:22 -07:00
committed by nshrivas
父節點 c0edc4ada3
當前提交 951de5dc27
共有 5 個文件被更改,包括 76 次插入28 次删除

查看文件

@@ -7143,4 +7143,14 @@ struct sir_sae_msg {
uint8_t sae_status;
};
/**
* struct set_pcl_req - Request message to set the PCL
* @chan_weights: PCL channel weights
* @band: Supported band
*/
struct set_pcl_req {
struct wmi_pcl_chan_weights chan_weights;
enum band_info band;
};
#endif /* __SIR_API_H */

查看文件

@@ -13247,6 +13247,28 @@ QDF_STATUS sme_reset_rssi_threshold_breached_cb(mac_handle_t mac_handle)
return sme_set_rssi_threshold_breached_cb(mac_handle, NULL);
}
static enum band_info sme_get_connected_roaming_vdev_band(void)
{
enum band_info band = BAND_ALL;
tpAniSirGlobal mac = sme_get_mac_context();
struct csr_roam_session *session;
uint8_t session_id, channel;
if (!mac) {
sme_debug("MAC Context is NULL");
return band;
}
session_id = csr_get_roam_enabled_sta_sessionid(mac);
if (session_id != CSR_SESSION_ID_INVALID) {
session = CSR_GET_SESSION(mac, session_id);
channel = session->connectedProfile.operationChannel;
band = csr_get_rf_band(channel);
return band;
}
return band;
}
/*
* sme_pdev_set_pcl() - Send WMI_PDEV_SET_PCL_CMDID to the WMA
* @hal: Handle returned by macOpen
@@ -13260,8 +13282,8 @@ QDF_STATUS sme_pdev_set_pcl(struct policy_mgr_pcl_list *msg)
QDF_STATUS status = QDF_STATUS_SUCCESS;
tpAniSirGlobal mac = sme_get_mac_context();
struct scheduler_msg message = {0};
struct wmi_pcl_chan_weights *req_msg;
uint32_t len, i;
struct set_pcl_req *req_msg;
uint32_t i;
if (!mac) {
sme_err("mac is NULL");
@@ -13273,20 +13295,23 @@ QDF_STATUS sme_pdev_set_pcl(struct policy_mgr_pcl_list *msg)
return QDF_STATUS_E_FAILURE;
}
len = sizeof(*req_msg);
req_msg = qdf_mem_malloc(len);
req_msg = qdf_mem_malloc(sizeof(*req_msg));
if (!req_msg) {
sme_err("qdf_mem_malloc failed");
return QDF_STATUS_E_NOMEM;
}
req_msg->band = BAND_ALL;
if (CSR_IS_ROAM_INTRA_BAND_ENABLED(mac)) {
req_msg->band = sme_get_connected_roaming_vdev_band();
sme_debug("Connected STA band %d", req_msg->band);
}
for (i = 0; i < msg->pcl_len; i++) {
req_msg->pcl_list[i] = msg->pcl_list[i];
req_msg->weight_list[i] = msg->weight_list[i];
req_msg->chan_weights.pcl_list[i] = msg->pcl_list[i];
req_msg->chan_weights.weight_list[i] = msg->weight_list[i];
}
req_msg->pcl_len = msg->pcl_len;
req_msg->chan_weights.pcl_len = msg->pcl_len;
status = sme_acquire_global_lock(&mac->sme);
if (status != QDF_STATUS_SUCCESS) {

查看文件

@@ -19717,6 +19717,7 @@ csr_roam_offload_scan(tpAniSirGlobal mac_ctx, uint8_t session_id,
struct roam_ext_params *roam_params_src;
uint8_t i, temp_session_id;
uint8_t op_channel;
bool prev_roaming_state;
sme_debug("RSO Command %d, Session id %d, Reason %d", command,
session_id, reason);
@@ -19994,18 +19995,22 @@ csr_roam_offload_scan(tpAniSirGlobal mac_ctx, uint8_t session_id,
QDF_TRACE_HEX_DUMP(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
req_buf->assoc_ie.addIEdata, req_buf->assoc_ie.length);
prev_roaming_state = roam_info->b_roam_scan_offload_started;
if (ROAM_SCAN_OFFLOAD_START == command)
roam_info->b_roam_scan_offload_started = true;
else if (ROAM_SCAN_OFFLOAD_STOP == command)
roam_info->b_roam_scan_offload_started = false;
policy_mgr_pdev_set_pcl(mac_ctx->psoc, QDF_STA_MODE);
if (!QDF_IS_STATUS_SUCCESS(
csr_roam_send_rso_cmd(mac_ctx, session_id, req_buf))) {
QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
"%s: Not able to post message to PE",
__func__);
roam_info->b_roam_scan_offload_started = prev_roaming_state;
policy_mgr_pdev_set_pcl(mac_ctx->psoc, QDF_STA_MODE);
return QDF_STATUS_E_FAILURE;
}
if (ROAM_SCAN_OFFLOAD_START == command)
roam_info->b_roam_scan_offload_started = true;
else if (ROAM_SCAN_OFFLOAD_STOP == command)
roam_info->b_roam_scan_offload_started = false;
/* update the last sent cmd */
roam_info->last_sent_cmd = command;

查看文件

@@ -1752,7 +1752,7 @@ QDF_STATUS wma_set_rssi_monitoring(tp_wma_handle wma,
#endif /* FEATURE_RSSI_MONITOR */
QDF_STATUS wma_send_pdev_set_pcl_cmd(tp_wma_handle wma_handle,
struct wmi_pcl_chan_weights *msg);
struct set_pcl_req *msg);
QDF_STATUS wma_send_pdev_set_hw_mode_cmd(tp_wma_handle wma_handle,
struct policy_mgr_hw_mode *msg);

查看文件

@@ -8369,7 +8369,7 @@ static QDF_STATUS wma_mc_process_msg(struct scheduler_msg *msg)
break;
case SIR_HAL_PDEV_SET_PCL_TO_FW:
wma_send_pdev_set_pcl_cmd(wma_handle,
(struct wmi_pcl_chan_weights *)msg->bodyptr);
(struct set_pcl_req *)msg->bodyptr);
qdf_mem_free(msg->bodyptr);
break;
case SIR_HAL_PDEV_SET_HW_MODE:
@@ -8637,7 +8637,7 @@ static wmi_pcl_chan_weight wma_map_pcl_weights(uint32_t pcl_weight)
* Return: Success if the cmd is sent successfully to the firmware
*/
QDF_STATUS wma_send_pdev_set_pcl_cmd(tp_wma_handle wma_handle,
struct wmi_pcl_chan_weights *msg)
struct set_pcl_req *msg)
{
uint32_t i;
QDF_STATUS status;
@@ -8649,26 +8649,33 @@ QDF_STATUS wma_send_pdev_set_pcl_cmd(tp_wma_handle wma_handle,
}
for (i = 0; i < wma_handle->saved_chan.num_channels; i++) {
msg->saved_chan_list[i] =
msg->chan_weights.saved_chan_list[i] =
wma_handle->saved_chan.channel_list[i];
}
msg->saved_num_chan = wma_handle->saved_chan.num_channels;
msg->chan_weights.saved_num_chan = wma_handle->saved_chan.num_channels;
status = policy_mgr_get_valid_chan_weights(wma_handle->psoc,
(struct policy_mgr_pcl_chan_weights *)msg);
(struct policy_mgr_pcl_chan_weights *)&msg->chan_weights);
for (i = 0; i < msg->saved_num_chan; i++) {
msg->weighed_valid_list[i] =
wma_map_pcl_weights(msg->weighed_valid_list[i]);
for (i = 0; i < msg->chan_weights.saved_num_chan; i++) {
msg->chan_weights.weighed_valid_list[i] =
wma_map_pcl_weights(
msg->chan_weights.weighed_valid_list[i]);
/* Dont allow roaming on 2G when 5G_ONLY configured */
if ((wma_handle->bandcapability == BAND_5G) &&
(msg->saved_chan_list[i] <= MAX_24GHZ_CHANNEL)) {
msg->weighed_valid_list[i] =
if (((wma_handle->bandcapability == BAND_5G) ||
(msg->band == BAND_5G)) &&
(WLAN_REG_IS_24GHZ_CH(
msg->chan_weights.saved_chan_list[i]))) {
msg->chan_weights.weighed_valid_list[i] =
WEIGHT_OF_DISALLOWED_CHANNELS;
}
if ((msg->band == BAND_2G) &&
WLAN_REG_IS_5GHZ_CH(msg->chan_weights.saved_chan_list[i]))
msg->chan_weights.weighed_valid_list[i] =
WEIGHT_OF_DISALLOWED_CHANNELS;
WMA_LOGD("%s: chan:%d weight[%d]=%d", __func__,
msg->saved_chan_list[i], i,
msg->weighed_valid_list[i]);
msg->chan_weights.saved_chan_list[i], i,
msg->chan_weights.weighed_valid_list[i]);
}
if (!QDF_IS_STATUS_SUCCESS(status)) {
@@ -8676,7 +8683,8 @@ QDF_STATUS wma_send_pdev_set_pcl_cmd(tp_wma_handle wma_handle,
return status;
}
if (wmi_unified_pdev_set_pcl_cmd(wma_handle->wmi_handle, msg))
if (wmi_unified_pdev_set_pcl_cmd(wma_handle->wmi_handle,
&msg->chan_weights))
return QDF_STATUS_E_FAILURE;
return QDF_STATUS_SUCCESS;