qcacld-3.0: Enable vdev PCL for SBS mode to avoid roaming to MCC
When dual sta connected as SBS mode instead of dbs mode, driver didn't set pcl per vdev, so dual sta had same PCL in firmware, MCC may happened after roaming. Fix: 1. Host pass roaming MCC disallow flag to F/W by checking primary vdev id. 2. For platform SBS supported, when doing dbs or sbs, send PCL from table to F/W directly, allow SCC and SBS<->DBS roaming, don't limit to intra band, only avoid mcc case if no primary vdev. 3. Use policy_mgr_concurrent_sta_on_different_mac to replace policy_mgr_concurrent_sta_doing_dbs, add logic to consider SBS when set PCL to F/W. 4. Change dual sta PCL table to remove mcc channels. 5. When STA channel switch, also update PCL to F/W. 6. For roaming case, do vdev level PCL update for all sta after connection update in policy mgr, or wrong PCL is got. Change-Id: I631c84c96da2bba4011b69e4c076db174205c874 CRs-Fixed: 3336768
This commit is contained in:

committed by
Madan Koyyalamudi

parent
dcabca8772
commit
60c511d230
@@ -938,8 +938,6 @@ cm_fw_roam_sync_propagation(struct wlan_objmgr_psoc *psoc, uint8_t vdev_id,
|
||||
* Send only for legacy STA/MLO STA vdev.
|
||||
*/
|
||||
if (!wlan_vdev_mlme_is_mlo_link_vdev(vdev)) {
|
||||
cm_if_mgr_inform_connect_complete(cm_ctx->vdev,
|
||||
connect_rsp->connect_status);
|
||||
cm_inform_dlm_connect_complete(cm_ctx->vdev, connect_rsp);
|
||||
wlan_tdls_notify_sta_connect(vdev_id,
|
||||
mlme_get_tdls_chan_switch_prohibited(vdev),
|
||||
|
@@ -651,9 +651,12 @@ cm_roam_is_change_in_band_allowed(struct wlan_objmgr_psoc *psoc,
|
||||
uint8_t vdev_id, uint32_t roam_band_mask)
|
||||
{
|
||||
struct wlan_objmgr_vdev *vdev;
|
||||
bool concurrency_is_dbs;
|
||||
bool sta_concurrency_is_with_different_mac;
|
||||
struct wlan_channel *chan;
|
||||
|
||||
if (policy_mgr_is_hw_sbs_capable(psoc))
|
||||
return true;
|
||||
|
||||
vdev = wlan_objmgr_get_vdev_by_id_from_psoc(psoc, vdev_id,
|
||||
WLAN_MLME_NB_ID);
|
||||
if (!vdev) {
|
||||
@@ -668,11 +671,12 @@ cm_roam_is_change_in_band_allowed(struct wlan_objmgr_psoc *psoc,
|
||||
return false;
|
||||
}
|
||||
|
||||
concurrency_is_dbs = policy_mgr_concurrent_sta_doing_dbs(psoc);
|
||||
if (!concurrency_is_dbs)
|
||||
sta_concurrency_is_with_different_mac =
|
||||
policy_mgr_concurrent_sta_on_different_mac(psoc);
|
||||
if (!sta_concurrency_is_with_different_mac)
|
||||
return true;
|
||||
|
||||
mlme_debug("STA + STA concurrency is in DBS. ch freq %d, roam band:%d",
|
||||
mlme_debug("sta concurrency on different mac, ch freq %d, roam band:%d",
|
||||
chan->ch_freq, roam_band_mask);
|
||||
|
||||
if (wlan_reg_freq_to_band(chan->ch_freq) == REG_BAND_2G &&
|
||||
@@ -3654,20 +3658,19 @@ void cm_handle_sta_sta_roaming_enablement(struct wlan_objmgr_psoc *psoc,
|
||||
goto rel_ref;
|
||||
}
|
||||
|
||||
if (policy_mgr_concurrent_sta_doing_dbs(psoc)) {
|
||||
mlme_debug("After roam on vdev_id:%d, STA + STA concurrency is in DBS:%d",
|
||||
if (policy_mgr_concurrent_sta_on_different_mac(psoc)) {
|
||||
mlme_debug("After roam on vdev_id:%d, sta concurrency on different mac:%d",
|
||||
curr_vdev_id, sta_count);
|
||||
for (conn_idx = 0; conn_idx < sta_count; conn_idx++) {
|
||||
temp_vdev_id = vdev_id_list[conn_idx];
|
||||
if (temp_vdev_id == curr_vdev_id) {
|
||||
wlan_cm_roam_activate_pcl_per_vdev(psoc,
|
||||
curr_vdev_id,
|
||||
temp_vdev_id,
|
||||
true);
|
||||
/* Set PCL after sending roam complete */
|
||||
policy_mgr_set_pcl_for_existing_combo(psoc,
|
||||
PM_STA_MODE,
|
||||
curr_vdev_id);
|
||||
} else {
|
||||
temp_vdev_id);
|
||||
if (temp_vdev_id != curr_vdev_id) {
|
||||
/* Enable roaming on secondary vdev */
|
||||
if_mgr_enable_roaming(pdev, vdev, RSO_SET_PCL);
|
||||
}
|
||||
@@ -3881,7 +3884,8 @@ cm_roam_switch_to_init(struct wlan_objmgr_pdev *pdev,
|
||||
enum roam_offload_state cur_state;
|
||||
uint8_t temp_vdev_id, roam_enabled_vdev_id;
|
||||
uint32_t roaming_bitmap;
|
||||
bool dual_sta_roam_active, usr_disabled_roaming, sta_concurrency_is_dbs;
|
||||
bool dual_sta_roam_active, usr_disabled_roaming;
|
||||
bool sta_concurrency_is_with_different_mac;
|
||||
QDF_STATUS status;
|
||||
struct wlan_objmgr_psoc *psoc = wlan_pdev_get_psoc(pdev);
|
||||
struct wlan_mlme_psoc_ext_obj *mlme_obj;
|
||||
@@ -3897,11 +3901,12 @@ cm_roam_switch_to_init(struct wlan_objmgr_pdev *pdev,
|
||||
|
||||
dual_sta_policy = &mlme_obj->cfg.gen.dual_sta_policy;
|
||||
dual_sta_roam_active = wlan_mlme_get_dual_sta_roaming_enabled(psoc);
|
||||
sta_concurrency_is_dbs = policy_mgr_concurrent_sta_doing_dbs(psoc);
|
||||
sta_concurrency_is_with_different_mac =
|
||||
policy_mgr_concurrent_sta_on_different_mac(psoc);
|
||||
cur_state = mlme_get_roam_state(psoc, vdev_id);
|
||||
|
||||
mlme_info("dual_sta_roam_active:%d, is_dbs:%d, state:%d",
|
||||
dual_sta_roam_active, sta_concurrency_is_dbs,
|
||||
mlme_info("dual_sta_roam_active:%d, sta concurrency on different mac:%d, state:%d",
|
||||
dual_sta_roam_active, sta_concurrency_is_with_different_mac,
|
||||
cur_state);
|
||||
|
||||
switch (cur_state) {
|
||||
@@ -3915,10 +3920,11 @@ cm_roam_switch_to_init(struct wlan_objmgr_pdev *pdev,
|
||||
|
||||
/*
|
||||
* Enable roaming on other interface only if STA + STA
|
||||
* concurrency is in DBS.
|
||||
* concurrency on different mac.
|
||||
*/
|
||||
if (dual_sta_roam_active && sta_concurrency_is_dbs) {
|
||||
mlme_info("STA + STA concurrency is in DBS");
|
||||
if (dual_sta_roam_active &&
|
||||
sta_concurrency_is_with_different_mac) {
|
||||
mlme_info("sta concurrency on different mac");
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -4017,7 +4023,7 @@ cm_roam_switch_to_init(struct wlan_objmgr_pdev *pdev,
|
||||
* PCL type to vdev level
|
||||
*/
|
||||
if (roam_enabled_vdev_id != WLAN_UMAC_VDEV_ID_MAX &&
|
||||
dual_sta_roam_active && sta_concurrency_is_dbs)
|
||||
dual_sta_roam_active && sta_concurrency_is_with_different_mac)
|
||||
wlan_cm_roam_activate_pcl_per_vdev(psoc, vdev_id, true);
|
||||
|
||||
/* Set PCL before sending RSO start */
|
||||
|
@@ -2374,6 +2374,8 @@ struct wlan_cm_roam_tx_ops {
|
||||
QDF_STATUS (*send_roam_ho_delay_config)(struct wlan_objmgr_vdev *vdev,
|
||||
uint8_t vdev_id,
|
||||
uint16_t value);
|
||||
QDF_STATUS (*send_roam_mcc_disallow)(struct wlan_objmgr_vdev *vdev,
|
||||
uint8_t vdev_id, uint8_t value);
|
||||
#ifdef FEATURE_RX_LINKSPEED_ROAM_TRIGGER
|
||||
QDF_STATUS (*send_roam_linkspeed_state)(struct wlan_objmgr_vdev *vdev,
|
||||
uint8_t vdev_id, bool value);
|
||||
|
Reference in New Issue
Block a user