qcacld-3.0: Introduce new ini for dual sta roaming

Add new ini enable_dual_sta_roam_offload to enable/disable dual
sta romaing feature. Enabling this ini will allow firmware to
roam on both the vdev if firmware supports dual sta roaming and
the hw is dbs capable.

This ini will be checked in the dual sta roaming offload state
machine to enable roaming on both the STA or to fallback to the
current implementation where first connected sta will have rso
enabled.

Change-Id: I04f141ac31e0f168b6f19fe878bca219a36cfae7
CRs-Fixed: 2709036
This commit is contained in:
Pragaspathi Thilagaraj
2020-05-26 11:52:42 +05:30
committed by nshrivas
parent 1f299f5e53
commit 3bbb4610b6
10 changed files with 230 additions and 0 deletions

View File

@@ -163,6 +163,16 @@ wmi_unified_send_roam_preauth_status(wmi_unified_t wmi_handle,
params);
return QDF_STATUS_E_FAILURE;
}
QDF_STATUS wmi_unified_vdev_set_pcl_cmd(wmi_unified_t wmi_handle,
struct set_pcl_cmd_params *params)
{
if (wmi_handle->ops->send_vdev_set_pcl_cmd)
return wmi_handle->ops->send_vdev_set_pcl_cmd(wmi_handle,
params);
return QDF_STATUS_E_FAILURE;
}
#endif /* WLAN_FEATURE_ROAM_OFFLOAD */
QDF_STATUS wmi_unified_roam_scan_offload_mode_cmd(

View File

@@ -922,6 +922,73 @@ static QDF_STATUS send_roam_invoke_cmd_tlv(wmi_unified_t wmi_handle,
return QDF_STATUS_SUCCESS;
}
/**
* send_vdev_set_pcl_cmd_tlv() - Send WMI_VDEV_SET_PCL_CMDID to FW
* @wmi_handle: wmi handle
* @params: Set VDEV PCL params
*
* WMI_VDEV_SET_PCL_CMDID provides the Preferred Channel List (PCL) to WLAN
* firmware. The roaming module is the consumer of this information
* in the WLAN firmware. The channel list will be used when a VDEV needs
* to migrate to a new channel without host driver involvement. An example of
* this behavior is Legacy Fast Roaming (LFR 3.0).
*
* WMI_VDEV_SET_PCL_CMDID will carry only the weight list and not the actual
* channel list. The weights corresponds to the channels sent in
* WMI_SCAN_CHAN_LIST_CMDID. The channels from PCL would be having a higher
* weightage compared to the non PCL channels.
*
* When roaming is enabled on STA 1, PDEV pcl will be sent. When STA2 is
* up, VDEV pcl will be sent on STA 1 after calculating pcl again applying
* the bandmask and VDEV pcl will be sent for STA2. When one of the STA
* is disconnected, PDEV pcl will be sent on the other STA again.
*
* Return: Success if the cmd is sent successfully to the firmware
*/
static QDF_STATUS
send_vdev_set_pcl_cmd_tlv(wmi_unified_t wmi_handle,
struct set_pcl_cmd_params *params)
{
wmi_vdev_set_pcl_cmd_fixed_param *cmd;
wmi_buf_t buf;
uint8_t *buf_ptr;
uint32_t *ch_weight, i;
size_t len;
uint32_t chan_len;
chan_len = params->weights->saved_num_chan;
len = sizeof(*cmd) + WMI_TLV_HDR_SIZE + (chan_len * sizeof(uint32_t));
buf = wmi_buf_alloc(wmi_handle, len);
if (!buf)
return QDF_STATUS_E_NOMEM;
cmd = (wmi_vdev_set_pcl_cmd_fixed_param *)wmi_buf_data(buf);
buf_ptr = (uint8_t *)cmd;
WMITLV_SET_HDR(&cmd->tlv_header,
WMITLV_TAG_STRUC_wmi_vdev_set_pcl_cmd_fixed_param,
WMITLV_GET_STRUCT_TLVLEN(wmi_vdev_set_pcl_cmd_fixed_param));
cmd->vdev_id = params->vdev_id;
buf_ptr += sizeof(wmi_vdev_set_pcl_cmd_fixed_param);
/* Channel weights uint32 Array TLV */
WMITLV_SET_HDR(buf_ptr, WMITLV_TAG_ARRAY_UINT32,
(chan_len * sizeof(uint32_t)));
ch_weight = (uint32_t *)(buf_ptr + WMI_TLV_HDR_SIZE);
for (i = 0; i < chan_len; i++)
ch_weight[i] = params->weights->weighed_valid_list[i];
wmi_mtrace(WMI_VDEV_SET_PCL_CMDID, params->vdev_id, 0);
if (wmi_unified_cmd_send(wmi_handle, buf, len,
WMI_VDEV_SET_PCL_CMDID)) {
WMI_LOGE("%s: Failed to send WMI_VDEV_SET_PCL_CMDID", __func__);
wmi_buf_free(buf);
return QDF_STATUS_E_FAILURE;
}
return QDF_STATUS_SUCCESS;
}
void wmi_roam_offload_attach_tlv(wmi_unified_t wmi_handle)
{
struct wmi_ops *ops = wmi_handle->ops;
@@ -930,6 +997,7 @@ void wmi_roam_offload_attach_tlv(wmi_unified_t wmi_handle)
ops->send_process_roam_synch_complete_cmd =
send_process_roam_synch_complete_cmd_tlv;
ops->send_roam_invoke_cmd = send_roam_invoke_cmd_tlv;
ops->send_vdev_set_pcl_cmd = send_vdev_set_pcl_cmd_tlv;
}
#endif /* WLAN_FEATURE_ROAM_OFFLOAD */