qcacld-3.0: Release TDLS wakelock upon peer teardown

Currently TDLS module acquires WIFI_POWER_EVENT_WAKELOCK_TDLS
wakelock and prevents run time suspend when TDLS is enabled for
a peer. While releasing the wakelock and allowing suspend, it
checks for the connected peer count in tdls_update_pmo_status().
But the peer count is not decremented here yet.

Below is the current call sequence:
tdls_disable_offchan_and_teardown_links()
	-> 1. Call tdls_reset_peer() -> this calls
	      tdls_set_peer_link_status() ->
	      tdls_update_pmo_status()
	-> 2. tdls_decrement_peer_count() - Sets the
	      connected peer count to 0

Update the sequence as below:
call tdls_decrement_peer_count() first and then call
tdls_reset_peer().

CRs-Fixed: 3735021
Change-Id: Idf91a0c96c9660df466143f8ac115f694b3070d2
Esse commit está contido em:
Pragaspathi Thilagaraj
2024-02-16 15:49:18 +05:30
commit de Ravindra Konda
commit 1b03ebf40c
2 arquivos alterados com 30 adições e 9 exclusões

Ver arquivo

@@ -1,6 +1,6 @@
/*
* Copyright (c) 2017-2021 The Linux Foundation. All rights reserved.
* Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved.
* Copyright (c) 2022-2024 Qualcomm Innovation Center, Inc. All rights reserved.
*
* Permission to use, copy, modify, and/or distribute this software for
* any purpose with or without fee is hereby granted, provided that the
@@ -665,10 +665,11 @@ void tdls_indicate_teardown(struct tdls_vdev_priv_obj *tdls_vdev,
return;
}
tdls_set_peer_link_status(curr_peer,
TDLS_LINK_TEARING,
tdls_set_peer_link_status(curr_peer, TDLS_LINK_TEARING,
TDLS_LINK_UNSPECIFIED);
tdls_notice("Teardown reason %d", reason);
tdls_notice("vdev:%d Teardown reason %d peer:" QDF_MAC_ADDR_FMT,
wlan_vdev_get_id(tdls_vdev->vdev), reason,
QDF_MAC_ADDR_REF(curr_peer->peer_mac.bytes));
if (tdls_soc->tdls_dp_vdev_update)
tdls_soc->tdls_dp_vdev_update(
@@ -1561,13 +1562,14 @@ void tdls_disable_offchan_and_teardown_links(
tdls_indicate_teardown(tdls_vdev, curr_peer,
TDLS_TEARDOWN_PEER_UNSPEC_REASON);
tdls_decrement_peer_count(vdev, tdls_soc);
/*
* Del Sta happened already as part of tdls_delete_all_tdls_peers
* Hence clear tdls vdev data structure.
*/
tdls_reset_peer(tdls_vdev, curr_peer->peer_mac.bytes);
tdls_decrement_peer_count(vdev, tdls_soc);
tdls_soc->tdls_conn_info[staidx].valid_entry = false;
tdls_soc->tdls_conn_info[staidx].session_id = 255;
tdls_soc->tdls_conn_info[staidx].index =

Ver arquivo

@@ -1,6 +1,6 @@
/*
* Copyright (c) 2017-2021 The Linux Foundation. All rights reserved.
* Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved.
* Copyright (c) 2022-2024 Qualcomm Innovation Center, Inc. All rights reserved.
*
* Permission to use, copy, modify, and/or distribute this software for
* any purpose with or without fee is hereby granted, provided that the
@@ -759,6 +759,7 @@ static void tdls_prevent_suspend(struct tdls_soc_priv_obj *tdls_soc)
WIFI_POWER_EVENT_WAKELOCK_TDLS);
qdf_runtime_pm_prevent_suspend(&tdls_soc->runtime_lock);
tdls_soc->is_prevent_suspend = true;
tdls_debug("Acquire WIFI_POWER_EVENT_WAKELOCK_TDLS");
}
/**
@@ -778,6 +779,7 @@ static void tdls_allow_suspend(struct tdls_soc_priv_obj *tdls_soc)
WIFI_POWER_EVENT_WAKELOCK_TDLS);
qdf_runtime_pm_allow_suspend(&tdls_soc->runtime_lock);
tdls_soc->is_prevent_suspend = false;
tdls_debug("Release WIFI_POWER_EVENT_WAKELOCK_TDLS");
}
/**
@@ -865,6 +867,21 @@ void tdls_set_link_status(struct tdls_vdev_priv_obj *vdev_obj,
}
}
static inline char *
tdls_link_status_str(enum tdls_link_state link_status)
{
switch (link_status) {
CASE_RETURN_STRING(TDLS_LINK_IDLE);
CASE_RETURN_STRING(TDLS_LINK_DISCOVERING);
CASE_RETURN_STRING(TDLS_LINK_DISCOVERED);
CASE_RETURN_STRING(TDLS_LINK_CONNECTING);
CASE_RETURN_STRING(TDLS_LINK_CONNECTED);
CASE_RETURN_STRING(TDLS_LINK_TEARING);
default:
return "UNKNOWN";
}
}
void tdls_set_peer_link_status(struct tdls_peer *peer,
enum tdls_link_state link_status,
enum tdls_link_state_reason link_reason)
@@ -878,12 +895,14 @@ void tdls_set_peer_link_status(struct tdls_peer *peer,
enum tdls_link_state old_status;
vdev_obj = peer->vdev_priv;
tdls_debug("vdev %d state %d reason %d peer:" QDF_MAC_ADDR_FMT,
wlan_vdev_get_id(vdev_obj->vdev), link_status, link_reason,
QDF_MAC_ADDR_REF(peer->peer_mac.bytes));
old_status = peer->link_status;
peer->link_status = link_status;
tdls_debug("vdev:%d new state: %s old state:%s reason %d peer:" QDF_MAC_ADDR_FMT,
wlan_vdev_get_id(vdev_obj->vdev),
tdls_link_status_str(link_status),
tdls_link_status_str(old_status), link_reason,
QDF_MAC_ADDR_REF(peer->peer_mac.bytes));
tdls_update_pmo_status(vdev_obj, old_status, link_status);
if (link_status >= TDLS_LINK_DISCOVERED)