qcacld-3.0: Acquire wakelock during roaming if key installation is pending
Currently, wakelock is only taken during initial connection if pairwise key installation is pending and not during roaming. This may lead to EAPOL delay/timeout during roaming as runtime pm and suspend is allowed during roaming. To fix this issue, acquire wakelock if key installation is pending during roaming. This change also refactors the code and release the wakelock in wma_remove_peer if EAPOL fails during initial connection or roaming. Change-Id: Id4cac30b3c383ca3d3e963571846f8a30eaa1006 CRs-Fixed: 3189799
Esse commit está contido em:

commit de
Madan Koyyalamudi

pai
7ae7404328
commit
d912895695
@@ -49,6 +49,7 @@
|
||||
/* 120 seconds, for WPS */
|
||||
#define WAIT_FOR_WPS_KEY_TIMEOUT_PERIOD (120 * QDF_MC_TIMER_TO_SEC_UNIT)
|
||||
|
||||
#define MLME_PEER_SET_KEY_WAKELOCK_TIMEOUT WAKELOCK_DURATION_RECOMMENDED
|
||||
/* QCN IE definitions */
|
||||
#define QCN_IE_HDR_LEN 6
|
||||
|
||||
@@ -156,6 +157,9 @@ struct sae_auth_retry {
|
||||
* @allow_kickout: True if the peer can be kicked out. Peer can't be kicked
|
||||
* out if it is being steered
|
||||
* @nss: Peer NSS
|
||||
* @peer_set_key_wakelock: wakelock to protect peer set key op with firmware
|
||||
* @peer_set_key_runtime_wakelock: runtime pm wakelock for set key
|
||||
* @is_key_wakelock_set: flag to check if key wakelock is pending to release
|
||||
*/
|
||||
struct peer_mlme_priv_obj {
|
||||
uint8_t last_pn_valid;
|
||||
@@ -171,6 +175,9 @@ struct peer_mlme_priv_obj {
|
||||
bool allow_kickout;
|
||||
#endif
|
||||
uint8_t nss;
|
||||
qdf_wake_lock_t peer_set_key_wakelock;
|
||||
qdf_runtime_lock_t peer_set_key_runtime_wakelock;
|
||||
bool is_key_wakelock_set;
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -1143,4 +1150,30 @@ wlan_mlo_sta_mlo_concurency_set_link(struct wlan_objmgr_vdev *vdev,
|
||||
QDF_STATUS wlan_mlme_get_mac_vdev_id(struct wlan_objmgr_pdev *pdev,
|
||||
uint8_t vdev_id,
|
||||
struct qdf_mac_addr *self_mac);
|
||||
|
||||
/**
|
||||
* wlan_acquire_peer_key_wakelock -api to get key wakelock
|
||||
* @pdev: pdev
|
||||
* @mac_addr: peer mac addr
|
||||
*
|
||||
* This function acquires wakelock and prevent runtime pm during key
|
||||
* installation
|
||||
*
|
||||
* Return: None
|
||||
*/
|
||||
void wlan_acquire_peer_key_wakelock(struct wlan_objmgr_pdev *pdev,
|
||||
uint8_t *mac_addr);
|
||||
|
||||
/**
|
||||
* wlan_release_peer_key_wakelock -api to release key wakelock
|
||||
* @pdev: pdev
|
||||
* @mac_addr: peer mac addr
|
||||
*
|
||||
* This function releases wakelock and allow runtime pm after key
|
||||
* installation
|
||||
*
|
||||
* Return: None
|
||||
*/
|
||||
void wlan_release_peer_key_wakelock(struct wlan_objmgr_pdev *pdev,
|
||||
uint8_t *mac_addr);
|
||||
#endif
|
||||
|
@@ -177,6 +177,89 @@ QDF_STATUS mlme_get_peer_mic_len(struct wlan_objmgr_psoc *psoc, uint8_t pdev_id,
|
||||
return QDF_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
void
|
||||
wlan_acquire_peer_key_wakelock(struct wlan_objmgr_pdev *pdev, uint8_t *mac_addr)
|
||||
{
|
||||
uint8_t pdev_id;
|
||||
struct wlan_objmgr_peer *peer;
|
||||
struct peer_mlme_priv_obj *peer_priv;
|
||||
struct wlan_objmgr_psoc *psoc;
|
||||
|
||||
psoc = wlan_pdev_get_psoc(pdev);
|
||||
if (!psoc)
|
||||
return;
|
||||
|
||||
pdev_id = wlan_objmgr_pdev_get_pdev_id(pdev);
|
||||
peer = wlan_objmgr_get_peer(psoc, pdev_id, mac_addr,
|
||||
WLAN_LEGACY_MAC_ID);
|
||||
if (!peer)
|
||||
return;
|
||||
|
||||
peer_priv = wlan_objmgr_peer_get_comp_private_obj(peer,
|
||||
WLAN_UMAC_COMP_MLME);
|
||||
if (!peer_priv) {
|
||||
wlan_objmgr_peer_release_ref(peer, WLAN_LEGACY_MAC_ID);
|
||||
return;
|
||||
}
|
||||
|
||||
if (peer_priv->is_key_wakelock_set) {
|
||||
wlan_objmgr_peer_release_ref(peer, WLAN_LEGACY_MAC_ID);
|
||||
return;
|
||||
}
|
||||
|
||||
mlme_debug(QDF_MAC_ADDR_FMT ": Acquire set key wake lock for %d ms",
|
||||
QDF_MAC_ADDR_REF(mac_addr),
|
||||
MLME_PEER_SET_KEY_WAKELOCK_TIMEOUT);
|
||||
qdf_wake_lock_timeout_acquire(&peer_priv->peer_set_key_wakelock,
|
||||
MLME_PEER_SET_KEY_WAKELOCK_TIMEOUT);
|
||||
qdf_runtime_pm_prevent_suspend(
|
||||
&peer_priv->peer_set_key_runtime_wakelock);
|
||||
peer_priv->is_key_wakelock_set = true;
|
||||
|
||||
wlan_objmgr_peer_release_ref(peer, WLAN_LEGACY_MAC_ID);
|
||||
}
|
||||
|
||||
void
|
||||
wlan_release_peer_key_wakelock(struct wlan_objmgr_pdev *pdev, uint8_t *mac_addr)
|
||||
{
|
||||
uint8_t pdev_id;
|
||||
struct wlan_objmgr_peer *peer;
|
||||
struct peer_mlme_priv_obj *peer_priv;
|
||||
struct wlan_objmgr_psoc *psoc;
|
||||
|
||||
psoc = wlan_pdev_get_psoc(pdev);
|
||||
if (!psoc)
|
||||
return;
|
||||
|
||||
pdev_id = wlan_objmgr_pdev_get_pdev_id(pdev);
|
||||
peer = wlan_objmgr_get_peer(psoc, pdev_id, mac_addr,
|
||||
WLAN_LEGACY_MAC_ID);
|
||||
if (!peer)
|
||||
return;
|
||||
|
||||
peer_priv = wlan_objmgr_peer_get_comp_private_obj(peer,
|
||||
WLAN_UMAC_COMP_MLME);
|
||||
if (!peer_priv) {
|
||||
wlan_objmgr_peer_release_ref(peer, WLAN_LEGACY_MAC_ID);
|
||||
return;
|
||||
}
|
||||
|
||||
if (!peer_priv->is_key_wakelock_set) {
|
||||
wlan_objmgr_peer_release_ref(peer, WLAN_LEGACY_MAC_ID);
|
||||
return;
|
||||
}
|
||||
|
||||
peer_priv->is_key_wakelock_set = false;
|
||||
mlme_debug(QDF_MAC_ADDR_FMT ": Release set key wake lock",
|
||||
QDF_MAC_ADDR_REF(mac_addr));
|
||||
qdf_wake_lock_release(&peer_priv->peer_set_key_wakelock,
|
||||
WIFI_POWER_EVENT_WAKELOCK_WMI_CMD_RSP);
|
||||
qdf_runtime_pm_allow_suspend(
|
||||
&peer_priv->peer_set_key_runtime_wakelock);
|
||||
|
||||
wlan_objmgr_peer_release_ref(peer, WLAN_LEGACY_MAC_ID);
|
||||
}
|
||||
|
||||
QDF_STATUS
|
||||
mlme_peer_object_created_notification(struct wlan_objmgr_peer *peer,
|
||||
void *arg)
|
||||
@@ -203,6 +286,10 @@ mlme_peer_object_created_notification(struct wlan_objmgr_peer *peer,
|
||||
qdf_mem_free(peer_priv);
|
||||
}
|
||||
|
||||
qdf_wake_lock_create(&peer_priv->peer_set_key_wakelock, "peer_set_key");
|
||||
qdf_runtime_lock_init(&peer_priv->peer_set_key_runtime_wakelock);
|
||||
peer_priv->is_key_wakelock_set = false;
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
@@ -225,6 +312,10 @@ mlme_peer_object_destroyed_notification(struct wlan_objmgr_peer *peer,
|
||||
return QDF_STATUS_E_FAILURE;
|
||||
}
|
||||
|
||||
peer_priv->is_key_wakelock_set = false;
|
||||
qdf_runtime_lock_deinit(&peer_priv->peer_set_key_runtime_wakelock);
|
||||
qdf_wake_lock_destroy(&peer_priv->peer_set_key_wakelock);
|
||||
|
||||
status = wlan_objmgr_peer_component_obj_detach(peer,
|
||||
WLAN_UMAC_COMP_MLME,
|
||||
peer_priv);
|
||||
|
Referência em uma nova issue
Block a user