qcacld-3.0: Handle SAP concurrency in CSA and NAN/NDI case

TWT is supported in STA/SAP vdevs and it's allowed only in
DBS/Standalone case and not in SCC/MCC. Disable SAP TWT if
1. Concurrency occurs in SAP + NAN/NDI vdev
2. SCC/MCC occurs after CSA

Change-Id: Id1400bd5555d2f48590d7d3ad7c70162d1dd92fb
CRs-Fixed: 2942959
Tento commit je obsažen v:
Jyoti Kumari
2021-05-10 13:21:43 +05:30
odevzdal Madan Koyyalamudi
rodič 4301f71222
revize 7b38805edc
9 změnil soubory, kde provedl 51 přidání a 6 odebrání

Zobrazit soubor

@@ -787,6 +787,7 @@ struct nan_datapath_host_event {
* @ndp_delete_peers: LIM callback for deleting NDP peer
* @delete_peers_by_addr: LIM callback for deleting peer by MAC address
* @update_ndi_conn: WMA callback to update NDI's connection info
* @nan_concurrency_update: Callback to handle nan concurrency
*/
struct nan_callbacks {
/* callback to os_if layer from umac */
@@ -811,6 +812,7 @@ struct nan_callbacks {
QDF_STATUS (*update_ndi_conn)(uint8_t vdev_id,
struct nan_datapath_channel_info
*chan_info);
void (*nan_concurrency_update)(void);
};
/**

Zobrazit soubor

@@ -827,6 +827,7 @@ static QDF_STATUS nan_handle_enable_rsp(struct nan_event_params *nan_event)
QDF_STATUS status;
void (*call_back)(void *cookie);
uint8_t vdev_id;
void (*nan_conc_callback)(void);
psoc = nan_event->psoc;
psoc_nan_obj = nan_get_psoc_priv_obj(psoc);
@@ -874,6 +875,9 @@ fail:
policy_mgr_check_n_start_opportunistic_timer(psoc);
done:
nan_conc_callback = psoc_nan_obj->cb_obj.nan_concurrency_update;
if (nan_conc_callback)
nan_conc_callback();
call_back = psoc_nan_obj->cb_obj.ucfg_nan_request_process_cb;
if (call_back)
call_back(psoc_nan_obj->nan_disc_request_ctx);
@@ -886,6 +890,7 @@ QDF_STATUS nan_disable_cleanup(struct wlan_objmgr_psoc *psoc)
struct nan_psoc_priv_obj *psoc_nan_obj;
QDF_STATUS status;
uint8_t vdev_id;
void (*nan_conc_callback)(void);
if (!psoc) {
nan_err("psoc is NULL");
@@ -917,6 +922,9 @@ QDF_STATUS nan_disable_cleanup(struct wlan_objmgr_psoc *psoc)
nan_err("Cannot set NAN state to disabled!");
return QDF_STATUS_E_FAILURE;
}
nan_conc_callback = psoc_nan_obj->cb_obj.nan_concurrency_update;
if (nan_conc_callback)
nan_conc_callback();
return status;
}

Zobrazit soubor

@@ -532,6 +532,8 @@ int ucfg_nan_register_hdd_callbacks(struct wlan_objmgr_psoc *psoc,
cb_obj->os_if_nan_event_handler;
psoc_obj->cb_obj.ucfg_nan_request_process_cb =
ucfg_nan_request_process_cb;
psoc_obj->cb_obj.nan_concurrency_update =
cb_obj->nan_concurrency_update;
return 0;
}

Zobrazit soubor

@@ -1,5 +1,5 @@
/*
* Copyright (c) 2014-2020 The Linux Foundation. All rights reserved.
* Copyright (c) 2014-2021 The Linux Foundation. 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
@@ -79,4 +79,12 @@ static inline bool wlan_hdd_nan_is_supported(struct hdd_context *hdd_ctx)
return false;
}
#endif /* WLAN_FEATURE_NAN */
/**
* hdd_nan_concurrency_update() - NAN concurrency
*
* Return: None
*/
void hdd_nan_concurrency_update(void);
#endif /* __WLAN_HDD_NAN_H */

Zobrazit soubor

@@ -87,6 +87,8 @@
#include "wlan_hdd_bootup_marker.h"
#include "wlan_roam_debug.h"
#include "wlan_hdd_twt.h"
/* These are needed to recognize WPA and RSN suite types */
#define HDD_WPA_OUI_SIZE 4
#define HDD_RSN_OUI_SIZE 4
@@ -4044,6 +4046,7 @@ static void hdd_roam_channel_switch_handler(struct hdd_adapter *adapter,
hdd_debug("set hw mode change not done");
policy_mgr_check_concurrent_intf_and_restart_sap(hdd_ctx->psoc);
wlan_twt_concurrency_update(hdd_ctx);
}
#ifdef WLAN_FEATURE_HOST_ROAM

Zobrazit soubor

@@ -3705,6 +3705,8 @@ static void hdd_nan_register_callbacks(struct hdd_context *hdd_ctx)
cb_obj.new_peer_ind = hdd_ndp_new_peer_handler;
cb_obj.peer_departed_ind = hdd_ndp_peer_departed_handler;
cb_obj.nan_concurrency_update = hdd_nan_concurrency_update;
os_if_nan_register_hdd_callbacks(hdd_ctx->psoc, &cb_obj);
}
#else

Zobrazit soubor

@@ -112,3 +112,17 @@ int wlan_hdd_cfg80211_nan_ext_request(struct wiphy *wiphy,
return errno;
}
void hdd_nan_concurrency_update(void)
{
struct hdd_context *hdd_ctx = cds_get_context(QDF_MODULE_ID_HDD);
int ret;
hdd_enter();
ret = wlan_hdd_validate_context(hdd_ctx);
if (ret)
return;
wlan_twt_concurrency_update(hdd_ctx);
hdd_exit();
}

Zobrazit soubor

@@ -885,13 +885,15 @@ void hdd_ndp_session_end_handler(struct hdd_adapter *adapter)
/**
* hdd_ndp_new_peer_handler() - NDP new peer indication handler
* @adapter: pointer to adapter context
* @ind_params: indication parameters
* @vdev_id: vdev id
* @sta_id: station id
* @peer_mac_addr: peer mac address
* @first_peer: first peer
*
* Return: none
*/
int hdd_ndp_new_peer_handler(uint8_t vdev_id, uint16_t sta_id,
struct qdf_mac_addr *peer_mac_addr, bool fist_peer)
struct qdf_mac_addr *peer_mac_addr, bool first_peer)
{
struct hdd_context *hdd_ctx;
struct hdd_adapter *adapter;
@@ -930,7 +932,7 @@ int hdd_ndp_new_peer_handler(uint8_t vdev_id, uint16_t sta_id,
roam_info->fAuthRequired);
/* perform following steps for first new peer ind */
if (fist_peer) {
if (first_peer) {
hdd_debug("Set ctx connection state to connected");
/* Disable LRO/GRO for NDI Mode */
if (hdd_ctx->ol_enable &&
@@ -953,6 +955,8 @@ int hdd_ndp_new_peer_handler(uint8_t vdev_id, uint16_t sta_id,
*/
if (!NDI_CONCURRENCY_SUPPORTED(hdd_ctx->psoc))
hdd_indicate_active_ndp_cnt(hdd_ctx->psoc, vdev_id, 1);
wlan_twt_concurrency_update(hdd_ctx);
}
qdf_mem_free(roam_info);
return 0;
@@ -1031,5 +1035,7 @@ void hdd_ndp_peer_departed_handler(uint8_t vdev_id, uint16_t sta_id,
*/
if (!NDI_CONCURRENCY_SUPPORTED(hdd_ctx->psoc))
hdd_indicate_active_ndp_cnt(hdd_ctx->psoc, vdev_id, 0);
wlan_twt_concurrency_update(hdd_ctx);
}
}

Zobrazit soubor

@@ -131,7 +131,7 @@ void hdd_ndi_drv_ndi_create_rsp_handler(uint8_t vdev_id,
struct nan_datapath_inf_create_rsp *ndi_rsp);
void hdd_ndi_drv_ndi_delete_rsp_handler(uint8_t vdev_id);
int hdd_ndp_new_peer_handler(uint8_t vdev_id, uint16_t sta_id,
struct qdf_mac_addr *peer_mac_addr, bool fist_peer);
struct qdf_mac_addr *peer_mac_addr, bool first_peer);
void hdd_ndp_peer_departed_handler(uint8_t vdev_id, uint16_t sta_id,
struct qdf_mac_addr *peer_mac_addr, bool last_peer);
#endif /* __WLAN_HDD_NAN_DATAPATH_H */