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:

committed by
Madan Koyyalamudi

szülő
2a0bd88990
commit
282f018e47
@@ -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;
|
||||
}
|
||||
|
@@ -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;
|
||||
}
|
||||
|
Reference in New Issue
Block a user