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 snandini
부모 84a16ef8c3
커밋 ac8b95e887
3개의 변경된 파일42개의 추가작업 그리고 1개의 파일을 삭제

파일 보기

@@ -661,11 +661,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)

파일 보기

@@ -2837,6 +2837,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;
@@ -2867,6 +2869,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);
}