qcacld-3.0: Handle TDLS concurrency during CSA

If CSA on SAP/P2P GO causes MCC with the current STA TDLS vdev,
then teardown the TDLS connections, disable off channel and send
disable TDLS to firmware.
If CSA causes MCC -> DBS or MCC -> SCC then allow TDLS and update
the peer off channel list to firmware
Disable TDLS off-channel before SAP/P2P GO vdev restart.
Once CSA is complete, TDLS off-channel will be re-enabled based
on the concurrency.

Add interface manager changes to notify STA channel switch.

Change-Id: I36b359a7e1cf570cfb2b2f0e6abedf148a8fd174
CRs-Fixed: 3445112
This commit is contained in:
Pragaspathi Thilagaraj
2023-03-22 19:36:10 +05:30
committed by Madan Koyyalamudi
szülő 2a0bd88990
commit 282f018e47
16 fájl változott, egészen pontosan 420 új sor hozzáadva és 58 régi sor törölve

Fájl megtekintése

@@ -47,7 +47,7 @@ QDF_STATUS if_mgr_ap_start_bss(struct wlan_objmgr_vdev *vdev,
if (!psoc)
return QDF_STATUS_E_FAILURE;
wlan_tdls_notify_start_bss(psoc);
wlan_tdls_notify_start_bss(psoc, vdev);
if (wlan_vdev_mlme_get_opmode(vdev) == QDF_SAP_MODE ||
wlan_vdev_mlme_get_opmode(vdev) == QDF_P2P_GO_MODE)
@@ -157,10 +157,9 @@ if_mgr_ap_stop_bss_complete(struct wlan_objmgr_vdev *vdev,
return QDF_STATUS_SUCCESS;
}
#ifdef WLAN_FEATURE_P2P_P2P_STA
QDF_STATUS
if_mgr_csa_complete(struct wlan_objmgr_vdev *vdev,
struct if_mgr_event_data *event_data)
if_mgr_ap_csa_complete(struct wlan_objmgr_vdev *vdev,
struct if_mgr_event_data *event_data)
{
struct wlan_objmgr_psoc *psoc;
struct wlan_objmgr_pdev *pdev;
@@ -169,6 +168,7 @@ if_mgr_csa_complete(struct wlan_objmgr_vdev *vdev,
pdev = wlan_vdev_get_pdev(vdev);
if (!pdev)
return QDF_STATUS_E_FAILURE;
psoc = wlan_pdev_get_psoc(pdev);
if (!psoc)
return QDF_STATUS_E_FAILURE;
@@ -176,6 +176,36 @@ if_mgr_csa_complete(struct wlan_objmgr_vdev *vdev,
status = wlan_p2p_check_and_force_scc_go_plus_go(psoc, vdev);
if (QDF_IS_STATUS_ERROR(status))
ifmgr_err("force scc failure with status: %d", status);
wlan_tdls_notify_channel_switch_complete(psoc, wlan_vdev_get_id(vdev));
return status;
}
#endif
QDF_STATUS
if_mgr_ap_csa_start(struct wlan_objmgr_vdev *vdev,
struct if_mgr_event_data *event_data)
{
struct wlan_objmgr_psoc *psoc;
struct wlan_objmgr_pdev *pdev;
enum QDF_OPMODE op_mode;
op_mode = wlan_vdev_mlme_get_opmode(vdev);
if (op_mode != QDF_SAP_MODE && op_mode != QDF_P2P_GO_MODE)
return QDF_STATUS_SUCCESS;
pdev = wlan_vdev_get_pdev(vdev);
if (!pdev)
return QDF_STATUS_E_FAILURE;
psoc = wlan_pdev_get_psoc(pdev);
if (!psoc)
return QDF_STATUS_E_FAILURE;
/*
* Disable TDLS off-channel before VDEV restart
*/
wlan_tdls_notify_channel_switch_start(psoc, vdev);
return QDF_STATUS_SUCCESS;
}

Fájl megtekintése

@@ -39,6 +39,7 @@
#include <wlan_mlo_mgr_sta.h>
#endif
#include "wlan_vdev_mgr_utils_api.h"
#include "wlan_tdls_api.h"
QDF_STATUS if_mgr_connect_start(struct wlan_objmgr_vdev *vdev,
struct if_mgr_event_data *event_data)
@@ -91,6 +92,9 @@ QDF_STATUS if_mgr_connect_start(struct wlan_objmgr_vdev *vdev,
ucfg_nan_disable_concurrency(psoc);
}
if (op_mode == QDF_P2P_CLIENT_MODE)
wlan_tdls_handle_p2p_client_connect(psoc, vdev);
/*
* STA+NDI concurrency gets preference over NDI+NDI. Disable
* first NDI in case an NDI+NDI concurrency exists if FW does
@@ -232,3 +236,23 @@ QDF_STATUS if_mgr_disconnect_complete(struct wlan_objmgr_vdev *vdev,
return QDF_STATUS_SUCCESS;
}
QDF_STATUS
if_mgr_sta_csa_complete(struct wlan_objmgr_vdev *vdev,
struct if_mgr_event_data *event_data)
{
struct wlan_objmgr_psoc *psoc;
struct wlan_objmgr_pdev *pdev;
pdev = wlan_vdev_get_pdev(vdev);
if (!pdev)
return QDF_STATUS_E_FAILURE;
psoc = wlan_pdev_get_psoc(pdev);
if (!psoc)
return QDF_STATUS_E_FAILURE;
wlan_tdls_notify_channel_switch_complete(psoc, wlan_vdev_get_id(vdev));
return QDF_STATUS_SUCCESS;
}