qcacld-3.0: Clear whole operations bitmap when RSO deinit

To avoid roaming enable failed for operations bitmap set/clear mismatch for
SAP+STA or STA+STA concurrency, clear whole operations bitmap when RSO
deinit, then roaming can be enabled again after STA disconnect and
reconnect.

Add log when set/get operations bitmap to help debug.

Change-Id: Ie1f1a213dcdefb393ec3e1e2c6a8a71ab17b226c
CRs-Fixed: 2834199
This commit is contained in:
Jianmin Zhu 2020-12-11 16:08:19 +08:00 • committed by Gerrit - the friendly Code Review server
commit 9123e51697
3 changed files with 42 additions and 1 deletions

View file

@ -666,11 +666,21 @@ mlme_get_operations_bitmap(struct wlan_objmgr_psoc *psoc, uint8_t vdev_id);
* @reqs: RSO stop requestor
* @clear: clear bit if true else set bit
*
* Return: bitmap value
* Return: None
*/
void
mlme_set_operations_bitmap(struct wlan_objmgr_psoc *psoc, uint8_t vdev_id,
enum wlan_cm_rso_control_requestor reqs, bool clear);
/**
* mlme_clear_operations_bitmap() - Clear mlme operations bitmap which
* indicates what mlme operations are in progress
* @psoc: PSOC pointer
* @vdev_id: vdev for which the mlme operation bitmap is requested
*
* Return: None
*/
void
mlme_clear_operations_bitmap(struct wlan_objmgr_psoc *psoc, uint8_t vdev_id);
#define MLME_IS_ROAM_STATE_RSO_ENABLED(psoc, vdev_id) \
(mlme_get_roam_state(psoc, vdev_id) == WLAN_ROAM_RSO_ENABLED)

View file

@ -2832,6 +2832,8 @@ mlme_get_operations_bitmap(struct wlan_objmgr_psoc *psoc, uint8_t vdev_id)
}
bitmap = mlme_priv->mlme_roam.roam_sm.mlme_operations_bitmap;
mlme_legacy_debug("vdev[%d] bitmap[0x%x]", vdev_id,
mlme_priv->mlme_roam.roam_sm.mlme_operations_bitmap);
wlan_objmgr_vdev_release_ref(vdev, WLAN_MLME_OBJMGR_ID);
return bitmap;
@ -2862,6 +2864,34 @@ mlme_set_operations_bitmap(struct wlan_objmgr_psoc *psoc, uint8_t vdev_id,
mlme_priv->mlme_roam.roam_sm.mlme_operations_bitmap &= ~reqs;
else
mlme_priv->mlme_roam.roam_sm.mlme_operations_bitmap |= reqs;
mlme_legacy_debug("vdev[%d] bitmap[0x%x], reqs: %d, clear: %d", vdev_id,
mlme_priv->mlme_roam.roam_sm.mlme_operations_bitmap,
reqs, clear);
wlan_objmgr_vdev_release_ref(vdev, WLAN_MLME_OBJMGR_ID);
}
void
mlme_clear_operations_bitmap(struct wlan_objmgr_psoc *psoc, uint8_t vdev_id)
{
struct wlan_objmgr_vdev *vdev;
struct mlme_legacy_priv *mlme_priv;
vdev = wlan_objmgr_get_vdev_by_id_from_psoc(psoc, vdev_id,
WLAN_MLME_OBJMGR_ID);
if (!vdev) {
mlme_legacy_err("vdev object is NULL");
return;
}
mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev);
if (!mlme_priv) {
mlme_legacy_err("vdev legacy private object is NULL");
wlan_objmgr_vdev_release_ref(vdev, WLAN_MLME_OBJMGR_ID);
return;
}
mlme_priv->mlme_roam.roam_sm.mlme_operations_bitmap = 0;
wlan_objmgr_vdev_release_ref(vdev, WLAN_MLME_OBJMGR_ID);
}

View file

@ -877,6 +877,7 @@ cm_roam_switch_to_deinit(struct wlan_objmgr_pdev *pdev,
return status;
mlme_set_roam_state(psoc, vdev_id, WLAN_ROAM_DEINIT);
mlme_clear_operations_bitmap(psoc, vdev_id);
if (reason != REASON_SUPPLICANT_INIT_ROAMING)
wlan_cm_enable_roaming_on_connected_sta(pdev, vdev_id);