qcacld-3.0: Fix sap_dfs_wakelock not released when SAP stop
When SAP start as pri freq: 5180, 160M, pri freq isn’t DFS freq, but bonded freqs are DFS freq, so sap_dfs_wakelock is held. After SAP restart as pri freq: 5180, 80M, pri freq and bonded freqs are not DFS freq, so sap_dfs_wakelock isn’t released. To fix it, add ch_params_before_ch_switch in sap_context, which includes ch_width/ccfs0/ccfs1, can get all bonded sub channel info. Add ch_params parameter in API hdd_hostapd_channel_allow_suspend and hdd_hostapd_channel_prevent_suspend. Call wlan_mlme_check_chan_param_has_dfs in them instead of sap_chan_bond_dfs_sub_chan with CRs-Fixed: 3777779 Change-Id: I7e32317b2ffab6f8de5990aeed68e7bd02527d6f
This commit is contained in:

committed by
Ravindra Konda

parent
a1fa06e4d6
commit
4f3d9a269a
@@ -364,18 +364,21 @@ hdd_hostapd_deinit_sap_session(struct wlan_hdd_link_info *link_info)
|
|||||||
* Called when, 1. bss stopped, 2. channel switch
|
* Called when, 1. bss stopped, 2. channel switch
|
||||||
*
|
*
|
||||||
* @adapter: pointer to hdd adapter
|
* @adapter: pointer to hdd adapter
|
||||||
* @chan_freq: current channel frequency
|
* @chan_freq: channel frequency
|
||||||
|
* @ch_params: channel params
|
||||||
*
|
*
|
||||||
* Return: None
|
* Return: None
|
||||||
*/
|
*/
|
||||||
static void hdd_hostapd_channel_allow_suspend(struct hdd_adapter *adapter,
|
static void hdd_hostapd_channel_allow_suspend(struct hdd_adapter *adapter,
|
||||||
uint32_t chan_freq)
|
uint32_t chan_freq,
|
||||||
|
struct ch_params *ch_params)
|
||||||
{
|
{
|
||||||
|
|
||||||
struct hdd_context *hdd_ctx = WLAN_HDD_GET_CTX(adapter);
|
struct hdd_context *hdd_ctx = WLAN_HDD_GET_CTX(adapter);
|
||||||
struct hdd_hostapd_state *hostapd_state =
|
struct hdd_hostapd_state *hostapd_state =
|
||||||
WLAN_HDD_GET_HOSTAP_STATE_PTR(adapter->deflink);
|
WLAN_HDD_GET_HOSTAP_STATE_PTR(adapter->deflink);
|
||||||
struct sap_context *sap_ctx;
|
struct sap_context *sap_ctx;
|
||||||
|
bool is_dfs;
|
||||||
|
|
||||||
hdd_debug("bss_state: %d, chan_freq: %d, dfs_ref_cnt: %d",
|
hdd_debug("bss_state: %d, chan_freq: %d, dfs_ref_cnt: %d",
|
||||||
hostapd_state->bss_state, chan_freq,
|
hostapd_state->bss_state, chan_freq,
|
||||||
@@ -391,9 +394,10 @@ static void hdd_hostapd_channel_allow_suspend(struct hdd_adapter *adapter,
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!sap_chan_bond_dfs_sub_chan(sap_ctx,
|
is_dfs = wlan_mlme_check_chan_param_has_dfs(hdd_ctx->pdev,
|
||||||
chan_freq,
|
ch_params,
|
||||||
PHY_CHANNEL_BONDING_STATE_MAX))
|
chan_freq);
|
||||||
|
if (!is_dfs)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
/* Release wakelock when no more DFS channels are used */
|
/* Release wakelock when no more DFS channels are used */
|
||||||
@@ -411,17 +415,20 @@ static void hdd_hostapd_channel_allow_suspend(struct hdd_adapter *adapter,
|
|||||||
* Called when, 1. bss started, 2. channel switch
|
* Called when, 1. bss started, 2. channel switch
|
||||||
*
|
*
|
||||||
* @adapter: pointer to hdd adapter
|
* @adapter: pointer to hdd adapter
|
||||||
* @chan_freq: current channel frequency
|
* @chan_freq: channel frequency
|
||||||
|
* @ch_params: channel params
|
||||||
*
|
*
|
||||||
* Return - None
|
* Return - None
|
||||||
*/
|
*/
|
||||||
static void hdd_hostapd_channel_prevent_suspend(struct hdd_adapter *adapter,
|
static void hdd_hostapd_channel_prevent_suspend(struct hdd_adapter *adapter,
|
||||||
uint32_t chan_freq)
|
uint32_t chan_freq,
|
||||||
|
struct ch_params *ch_params)
|
||||||
{
|
{
|
||||||
struct hdd_context *hdd_ctx = WLAN_HDD_GET_CTX(adapter);
|
struct hdd_context *hdd_ctx = WLAN_HDD_GET_CTX(adapter);
|
||||||
struct hdd_hostapd_state *hostapd_state =
|
struct hdd_hostapd_state *hostapd_state =
|
||||||
WLAN_HDD_GET_HOSTAP_STATE_PTR(adapter->deflink);
|
WLAN_HDD_GET_HOSTAP_STATE_PTR(adapter->deflink);
|
||||||
struct sap_context *sap_ctx;
|
struct sap_context *sap_ctx;
|
||||||
|
bool is_dfs;
|
||||||
|
|
||||||
hdd_debug("bss_state: %d, chan_freq: %d, dfs_ref_cnt: %d",
|
hdd_debug("bss_state: %d, chan_freq: %d, dfs_ref_cnt: %d",
|
||||||
hostapd_state->bss_state, chan_freq,
|
hostapd_state->bss_state, chan_freq,
|
||||||
@@ -437,9 +444,10 @@ static void hdd_hostapd_channel_prevent_suspend(struct hdd_adapter *adapter,
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!sap_chan_bond_dfs_sub_chan(sap_ctx,
|
is_dfs = wlan_mlme_check_chan_param_has_dfs(hdd_ctx->pdev,
|
||||||
chan_freq,
|
&sap_ctx->ch_params,
|
||||||
PHY_CHANNEL_BONDING_STATE_MAX))
|
chan_freq);
|
||||||
|
if (!is_dfs)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
/* Acquire wakelock if we have at least one DFS channel in use */
|
/* Acquire wakelock if we have at least one DFS channel in use */
|
||||||
@@ -2353,7 +2361,8 @@ QDF_STATUS hdd_hostapd_sap_event_cb(struct sap_event *sap_event,
|
|||||||
wlan_hdd_auto_shutdown_enable(hdd_ctx, true);
|
wlan_hdd_auto_shutdown_enable(hdd_ctx, true);
|
||||||
#endif
|
#endif
|
||||||
hdd_hostapd_channel_prevent_suspend(adapter,
|
hdd_hostapd_channel_prevent_suspend(adapter,
|
||||||
ap_ctx->operating_chan_freq);
|
ap_ctx->operating_chan_freq,
|
||||||
|
&sap_config->ch_params);
|
||||||
|
|
||||||
hostapd_state->bss_state = BSS_START;
|
hostapd_state->bss_state = BSS_START;
|
||||||
vdev = hdd_objmgr_get_vdev_by_user(link_info, WLAN_DP_ID);
|
vdev = hdd_objmgr_get_vdev_by_user(link_info, WLAN_DP_ID);
|
||||||
@@ -2428,7 +2437,8 @@ QDF_STATUS hdd_hostapd_sap_event_cb(struct sap_event *sap_event,
|
|||||||
status ? "eSAP_STATUS_FAILURE" : "eSAP_STATUS_SUCCESS");
|
status ? "eSAP_STATUS_FAILURE" : "eSAP_STATUS_SUCCESS");
|
||||||
|
|
||||||
hdd_hostapd_channel_allow_suspend(adapter,
|
hdd_hostapd_channel_allow_suspend(adapter,
|
||||||
ap_ctx->operating_chan_freq);
|
ap_ctx->operating_chan_freq,
|
||||||
|
&ap_ctx->sap_context->ch_params);
|
||||||
|
|
||||||
/* Invalidate the channel info. */
|
/* Invalidate the channel info. */
|
||||||
ap_ctx->operating_chan_freq = 0;
|
ap_ctx->operating_chan_freq = 0;
|
||||||
@@ -3017,10 +3027,12 @@ QDF_STATUS hdd_hostapd_sap_event_cb(struct sap_event *sap_event,
|
|||||||
if (hostapd_state->bss_state != BSS_STOP) {
|
if (hostapd_state->bss_state != BSS_STOP) {
|
||||||
/* Allow suspend for old channel */
|
/* Allow suspend for old channel */
|
||||||
hdd_hostapd_channel_allow_suspend(adapter,
|
hdd_hostapd_channel_allow_suspend(adapter,
|
||||||
ap_ctx->sap_context->freq_before_ch_switch);
|
ap_ctx->sap_context->freq_before_ch_switch,
|
||||||
|
&ap_ctx->sap_context->ch_params_before_ch_switch);
|
||||||
/* Prevent suspend for new channel */
|
/* Prevent suspend for new channel */
|
||||||
hdd_hostapd_channel_prevent_suspend(adapter,
|
hdd_hostapd_channel_prevent_suspend(adapter,
|
||||||
sap_event->sapevt.sap_ch_selected.pri_ch_freq);
|
sap_event->sapevt.sap_ch_selected.pri_ch_freq,
|
||||||
|
&ap_ctx->sap_context->ch_params);
|
||||||
}
|
}
|
||||||
/* SME/PE is already updated for new operation
|
/* SME/PE is already updated for new operation
|
||||||
* channel. So update HDD layer also here. This
|
* channel. So update HDD layer also here. This
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2012-2021 The Linux Foundation. All rights reserved.
|
* Copyright (c) 2012-2021 The Linux Foundation. All rights reserved.
|
||||||
* Copyright (c) 2021-2023 Qualcomm Innovation Center, Inc. All rights reserved.
|
* Copyright (c) 2021-2024 Qualcomm Innovation Center, Inc. All rights reserved.
|
||||||
*
|
*
|
||||||
* Permission to use, copy, modify, and/or distribute this software for
|
* Permission to use, copy, modify, and/or distribute this software for
|
||||||
* any purpose with or without fee is hereby granted, provided that the
|
* any purpose with or without fee is hereby granted, provided that the
|
||||||
@@ -235,6 +235,7 @@ struct sap_context {
|
|||||||
qdf_list_t ft_pending_assoc_ind_list;
|
qdf_list_t ft_pending_assoc_ind_list;
|
||||||
qdf_event_t ft_pending_event;
|
qdf_event_t ft_pending_event;
|
||||||
uint32_t freq_before_ch_switch;
|
uint32_t freq_before_ch_switch;
|
||||||
|
struct ch_params ch_params_before_ch_switch;
|
||||||
#ifdef WLAN_FEATURE_P2P_P2P_STA
|
#ifdef WLAN_FEATURE_P2P_P2P_STA
|
||||||
/*
|
/*
|
||||||
*This param is used for GO+GO force scc logic where after
|
*This param is used for GO+GO force scc logic where after
|
||||||
|
@@ -2025,11 +2025,12 @@ QDF_STATUS wlansap_channel_change_request(struct sap_context *sap_ctx,
|
|||||||
wlan_reg_set_channel_params_for_pwrmode(mac_ctx->pdev, target_chan_freq,
|
wlan_reg_set_channel_params_for_pwrmode(mac_ctx->pdev, target_chan_freq,
|
||||||
0, ch_params,
|
0, ch_params,
|
||||||
REG_CURRENT_PWR_MODE);
|
REG_CURRENT_PWR_MODE);
|
||||||
sap_ctx->ch_params = *ch_params;
|
sap_ctx->ch_params_before_ch_switch = sap_ctx->ch_params;
|
||||||
sap_ctx->freq_before_ch_switch = sap_ctx->chan_freq;
|
sap_ctx->freq_before_ch_switch = sap_ctx->chan_freq;
|
||||||
/* Update the channel as this will be used to
|
/* Update the channel as this will be used to
|
||||||
* send event to supplicant
|
* send event to supplicant
|
||||||
*/
|
*/
|
||||||
|
sap_ctx->ch_params = *ch_params;
|
||||||
sap_ctx->chan_freq = target_chan_freq;
|
sap_ctx->chan_freq = target_chan_freq;
|
||||||
wlansap_get_sec_channel(ch_params->sec_ch_offset, sap_ctx->chan_freq,
|
wlansap_get_sec_channel(ch_params->sec_ch_offset, sap_ctx->chan_freq,
|
||||||
&sap_ctx->sec_ch_freq);
|
&sap_ctx->sec_ch_freq);
|
||||||
|
Reference in New Issue
Block a user