qcacld-3.0: Refactor ML AP config APIs

To store/load MLO SAP configuration on each link's AP context
in adapter, change the function argument of below APIs to take
link info pointer instead of adapter.
Existing callers moved to deflink.

1) wlan_hdd_mlo_reset()
2) wlan_hdd_mlo_update()
3) wlan_hdd_mlo_sap_reinit()

Change-Id: I35d1459b22d290dccfb8710586a8facd59425265
CRs-Fixed: 3463288
这个提交包含在:
Vinod Kumar Pirla
2023-02-27 01:09:15 -08:00
提交者 Rahul Choudhary
父节点 c54d9ffdd0
当前提交 c6c6fce5cd
修改 3 个文件,包含 83 行新增102 行删除

查看文件

@@ -6119,33 +6119,28 @@ static void wlan_hdd_set_sap_mcc_chnl_avoid(struct hdd_context *hdd_ctx)
#ifdef WLAN_FEATURE_11BE_MLO #ifdef WLAN_FEATURE_11BE_MLO
/** /**
* wlan_hdd_mlo_update() - handle mlo scenario for start bss * wlan_hdd_mlo_update() - handle mlo scenario for start bss
* @hdd_ctx: Pointer to hdd context * @link_info: Pointer to hostapd adapter
* @config: Pointer to sap config
* @adapter: Pointer to hostapd adapter
* @beacon: Pointer to beacon
* *
* Return: QDF_STATUS * Return: QDF_STATUS
*/ */
static QDF_STATUS wlan_hdd_mlo_update(struct hdd_context *hdd_ctx, static QDF_STATUS wlan_hdd_mlo_update(struct wlan_hdd_link_info *link_info)
struct sap_config *config,
struct hdd_adapter *adapter,
struct hdd_beacon_data *beacon)
{ {
uint8_t link_id = 0;
uint8_t num_link = 0;
bool is_ml_ap; bool is_ml_ap;
uint8_t link_id = 0, num_link = 0;
struct hdd_context *hdd_ctx = link_info->adapter->hdd_ctx;
struct sap_config *config = &link_info->session.ap.sap_config;
struct hdd_beacon_data *beacon = link_info->session.ap.beacon;
if (config->SapHw_mode == eCSR_DOT11_MODE_11be || if (config->SapHw_mode == eCSR_DOT11_MODE_11be ||
config->SapHw_mode == eCSR_DOT11_MODE_11be_ONLY) { config->SapHw_mode == eCSR_DOT11_MODE_11be_ONLY) {
wlan_hdd_get_mlo_link_id(beacon, &link_id, &num_link); wlan_hdd_get_mlo_link_id(beacon, &link_id, &num_link);
hdd_debug("MLO SAP vdev id %d, link id %d total link %d", hdd_debug("MLO SAP vdev id %d, link id %d total link %d",
adapter->deflink->vdev_id, link_id, num_link); link_info->vdev_id, link_id, num_link);
if (!num_link) { if (!num_link) {
hdd_debug("start 11be AP without mlo"); hdd_debug("start 11be AP without mlo");
return QDF_STATUS_SUCCESS; return QDF_STATUS_SUCCESS;
} }
if (!mlo_ap_vdev_attach(adapter->deflink->vdev, if (!mlo_ap_vdev_attach(link_info->vdev, link_id, num_link)) {
link_id, num_link)) {
hdd_err("MLO SAP attach fails"); hdd_err("MLO SAP attach fails");
return QDF_STATUS_E_INVAL; return QDF_STATUS_E_INVAL;
} }
@@ -6155,9 +6150,9 @@ static QDF_STATUS wlan_hdd_mlo_update(struct hdd_context *hdd_ctx,
config->num_link = num_link; config->num_link = num_link;
} }
is_ml_ap = wlan_vdev_mlme_is_mlo_ap(adapter->deflink->vdev); is_ml_ap = wlan_vdev_mlme_is_mlo_ap(link_info->vdev);
if (!policy_mgr_is_mlo_sap_concurrency_allowed( if (!policy_mgr_is_mlo_sap_concurrency_allowed(hdd_ctx->psoc,
hdd_ctx->psoc, is_ml_ap)) { is_ml_ap)) {
hdd_err("MLO SAP concurrency check fails"); hdd_err("MLO SAP concurrency check fails");
return QDF_STATUS_E_INVAL; return QDF_STATUS_E_INVAL;
} }
@@ -6165,20 +6160,22 @@ static QDF_STATUS wlan_hdd_mlo_update(struct hdd_context *hdd_ctx,
return QDF_STATUS_SUCCESS; return QDF_STATUS_SUCCESS;
} }
void wlan_hdd_mlo_reset(struct hdd_adapter *adapter) void wlan_hdd_mlo_reset(struct wlan_hdd_link_info *link_info)
{ {
if (wlan_vdev_mlme_is_mlo_ap(adapter->deflink->vdev)) { struct sap_config *sap_config;
adapter->deflink->session.ap.sap_config.mlo_sap = false;
adapter->deflink->session.ap.sap_config.link_id = 0; if (!wlan_vdev_mlme_is_mlo_ap(link_info->vdev))
adapter->deflink->session.ap.sap_config.num_link = 0; return;
mlo_ap_vdev_detach(adapter->deflink->vdev);
} sap_config = &link_info->session.ap.sap_config;
sap_config->mlo_sap = false;
sap_config->link_id = 0;
sap_config->num_link = 0;
mlo_ap_vdev_detach(link_info->vdev);
} }
#else #else
static QDF_STATUS wlan_hdd_mlo_update(struct hdd_context *hdd_ctx, static inline QDF_STATUS
struct sap_config *config, wlan_hdd_mlo_update(struct wlan_hdd_link_info *link_info)
struct hdd_adapter *adapter,
struct hdd_beacon_data *beacon)
{ {
return QDF_STATUS_SUCCESS; return QDF_STATUS_SUCCESS;
} }
@@ -6729,12 +6726,13 @@ int wlan_hdd_cfg80211_start_bss(struct hdd_adapter *adapter,
if (!cds_is_sub_20_mhz_enabled()) if (!cds_is_sub_20_mhz_enabled())
wlan_hdd_set_sap_hwmode(adapter->deflink); wlan_hdd_set_sap_hwmode(adapter->deflink);
if (QDF_IS_STATUS_ERROR(wlan_hdd_mlo_update(hdd_ctx, config, qdf_status = wlan_hdd_mlo_update(adapter->deflink);
adapter, beacon))) { if (QDF_IS_STATUS_ERROR(qdf_status)) {
ret = -EINVAL; ret = -EINVAL;
goto error; goto error;
} }
status = ucfg_mlme_get_vht_for_24ghz(hdd_ctx->psoc, &bval);
qdf_status = ucfg_mlme_get_vht_for_24ghz(hdd_ctx->psoc, &bval);
if (QDF_IS_STATUS_ERROR(qdf_status)) if (QDF_IS_STATUS_ERROR(qdf_status))
hdd_err("Failed to get vht_for_24ghz"); hdd_err("Failed to get vht_for_24ghz");
@@ -6760,8 +6758,7 @@ int wlan_hdd_cfg80211_start_bss(struct hdd_adapter *adapter,
config->SapHw_mode = csr_convert_from_reg_phy_mode(updated_phy_mode); config->SapHw_mode = csr_convert_from_reg_phy_mode(updated_phy_mode);
if (config->sap_orig_hw_mode != config->SapHw_mode) if (config->sap_orig_hw_mode != config->SapHw_mode)
hdd_info("orig phymode %d new phymode %d", hdd_info("orig phymode %d new phymode %d",
config->sap_orig_hw_mode, config->sap_orig_hw_mode, config->SapHw_mode);
config->SapHw_mode);
qdf_mem_zero(sme_config, sizeof(*sme_config)); qdf_mem_zero(sme_config, sizeof(*sme_config));
sme_get_config_param(mac_handle, sme_config); sme_get_config_param(mac_handle, sme_config);
/* Override hostapd.conf wmm_enabled only for 11n and 11AC configs (IOT) /* Override hostapd.conf wmm_enabled only for 11n and 11AC configs (IOT)
@@ -6778,10 +6775,8 @@ int wlan_hdd_cfg80211_start_bss(struct hdd_adapter *adapter,
sme_config->csr_config.WMMSupportMode = WMM_USER_MODE_NO_QOS; sme_config->csr_config.WMMSupportMode = WMM_USER_MODE_NO_QOS;
sme_update_config(mac_handle, sme_config); sme_update_config(mac_handle, sme_config);
if (((adapter->device_mode == QDF_SAP_MODE) && if ((adapter->device_mode == QDF_SAP_MODE && sap_force_11n_for_11ac) ||
(sap_force_11n_for_11ac)) || (adapter->device_mode == QDF_P2P_GO_MODE && go_force_11n_for_11ac)) {
((adapter->device_mode == QDF_P2P_GO_MODE) &&
(go_force_11n_for_11ac))) {
if (config->ch_width_orig > CH_WIDTH_40MHZ) if (config->ch_width_orig > CH_WIDTH_40MHZ)
config->ch_width_orig = CH_WIDTH_40MHZ; config->ch_width_orig = CH_WIDTH_40MHZ;
} }
@@ -6962,7 +6957,7 @@ int wlan_hdd_cfg80211_start_bss(struct hdd_adapter *adapter,
goto free; goto free;
error: error:
wlan_hdd_mlo_reset(adapter); wlan_hdd_mlo_reset(adapter->deflink);
/* Revert the indoor to passive marking if START BSS fails */ /* Revert the indoor to passive marking if START BSS fails */
if (indoor_chnl_marking && adapter->device_mode == QDF_SAP_MODE) { if (indoor_chnl_marking && adapter->device_mode == QDF_SAP_MODE) {
hdd_update_indoor_channel(hdd_ctx, false); hdd_update_indoor_channel(hdd_ctx, false);

查看文件

@@ -477,13 +477,13 @@ wlan_hdd_configure_twt_responder(struct hdd_context *hdd_ctx,
#ifdef WLAN_FEATURE_11BE_MLO #ifdef WLAN_FEATURE_11BE_MLO
/** /**
* wlan_hdd_mlo_reset() - reset mlo configuration if start bss fails * wlan_hdd_mlo_reset() - reset mlo configuration if start bss fails
* @adapter: Pointer to hostapd adapter * @link_info: Pointer to link_info in hostapd adapter
* *
* Return: void * Return: void
*/ */
void wlan_hdd_mlo_reset(struct hdd_adapter *adapter); void wlan_hdd_mlo_reset(struct wlan_hdd_link_info *link_info);
#else #else
static inline void wlan_hdd_mlo_reset(struct hdd_adapter *adapter) static inline void wlan_hdd_mlo_reset(struct wlan_hdd_link_info *link_info)
{ {
} }
#endif /* end WLAN_FEATURE_11BE_MLO */ #endif /* end WLAN_FEATURE_11BE_MLO */

查看文件

@@ -17164,29 +17164,25 @@ void wlan_hdd_stop_sap(struct hdd_adapter *ap_adapter)
#if defined(WLAN_FEATURE_11BE_MLO) && defined(CFG80211_11BE_BASIC) #if defined(WLAN_FEATURE_11BE_MLO) && defined(CFG80211_11BE_BASIC)
/** /**
* wlan_hdd_mlo_sap_reinit() - handle mlo scenario for ssr * wlan_hdd_mlo_sap_reinit() - handle mlo scenario for ssr
* @hdd_ctx: Pointer to hdd context * @link_info: Pointer of link_info in adapter
* @config: Pointer to sap config
* @adapter: Pointer to hostapd adapter
* *
* Return: QDF_STATUS * Return: QDF_STATUS
*/ */
static QDF_STATUS wlan_hdd_mlo_sap_reinit(struct hdd_context *hdd_ctx, static QDF_STATUS wlan_hdd_mlo_sap_reinit(struct wlan_hdd_link_info *link_info)
struct sap_config *config,
struct hdd_adapter *adapter)
{ {
bool is_ml_ap; struct hdd_context *hdd_ctx = link_info->adapter->hdd_ctx;
struct sap_config *config = &link_info->session.ap.sap_config;
if (config->mlo_sap) { if (config->mlo_sap) {
if (!mlo_ap_vdev_attach(adapter->deflink->vdev, config->link_id, if (!mlo_ap_vdev_attach(link_info->vdev, config->link_id,
config->num_link)) { config->num_link)) {
hdd_err("SAP mlo mgr attach fail"); hdd_err("SAP mlo mgr attach fail");
return QDF_STATUS_E_INVAL; return QDF_STATUS_E_INVAL;
} }
} }
is_ml_ap = wlan_vdev_mlme_is_mlo_ap(adapter->deflink->vdev); if (!policy_mgr_is_mlo_sap_concurrency_allowed(hdd_ctx->psoc,
if (!policy_mgr_is_mlo_sap_concurrency_allowed( config->mlo_sap)) {
hdd_ctx->psoc, is_ml_ap)) {
hdd_err("MLO SAP concurrency check fails"); hdd_err("MLO SAP concurrency check fails");
return QDF_STATUS_E_INVAL; return QDF_STATUS_E_INVAL;
} }
@@ -17194,9 +17190,8 @@ static QDF_STATUS wlan_hdd_mlo_sap_reinit(struct hdd_context *hdd_ctx,
return QDF_STATUS_SUCCESS; return QDF_STATUS_SUCCESS;
} }
#else #else
static QDF_STATUS wlan_hdd_mlo_sap_reinit(struct hdd_context *hdd_ctx, static inline QDF_STATUS
struct sap_config *config, wlan_hdd_mlo_sap_reinit(struct wlan_hdd_link_info *link_info)
struct hdd_adapter *adapter)
{ {
return QDF_STATUS_SUCCESS; return QDF_STATUS_SUCCESS;
} }
@@ -17212,7 +17207,7 @@ static QDF_STATUS wlan_hdd_mlo_sap_reinit(struct hdd_context *hdd_ctx,
*/ */
void wlan_hdd_start_sap(struct hdd_adapter *ap_adapter, bool reinit) void wlan_hdd_start_sap(struct hdd_adapter *ap_adapter, bool reinit)
{ {
struct hdd_ap_ctx *hdd_ap_ctx; struct hdd_ap_ctx *ap_ctx;
struct hdd_hostapd_state *hostapd_state; struct hdd_hostapd_state *hostapd_state;
QDF_STATUS qdf_status; QDF_STATUS qdf_status;
struct hdd_context *hdd_ctx; struct hdd_context *hdd_ctx;
@@ -17229,34 +17224,33 @@ void wlan_hdd_start_sap(struct hdd_adapter *ap_adapter, bool reinit)
} }
hdd_ctx = WLAN_HDD_GET_CTX(ap_adapter); hdd_ctx = WLAN_HDD_GET_CTX(ap_adapter);
hdd_ap_ctx = WLAN_HDD_GET_AP_CTX_PTR(ap_adapter->deflink); ap_ctx = WLAN_HDD_GET_AP_CTX_PTR(ap_adapter->deflink);
hostapd_state = WLAN_HDD_GET_HOSTAP_STATE_PTR(ap_adapter->deflink); hostapd_state = WLAN_HDD_GET_HOSTAP_STATE_PTR(ap_adapter->deflink);
sap_config = &ap_adapter->deflink->session.ap.sap_config; sap_config = &ap_ctx->sap_config;
mutex_lock(&hdd_ctx->sap_lock); mutex_lock(&hdd_ctx->sap_lock);
if (test_bit(SOFTAP_BSS_STARTED, &ap_adapter->deflink->link_flags)) if (test_bit(SOFTAP_BSS_STARTED, &ap_adapter->deflink->link_flags))
goto end; goto end;
if (0 != wlan_hdd_cfg80211_update_apies(ap_adapter)) { if (wlan_hdd_cfg80211_update_apies(ap_adapter)) {
hdd_err("SAP Not able to set AP IEs"); hdd_err("SAP Not able to set AP IEs");
goto end; goto end;
} }
wlan_reg_set_channel_params_for_pwrmode( wlan_reg_set_channel_params_for_pwrmode(hdd_ctx->pdev,
hdd_ctx->pdev, sap_config->chan_freq, 0,
hdd_ap_ctx->sap_config.chan_freq, &sap_config->ch_params,
0, &hdd_ap_ctx->sap_config.ch_params, REG_CURRENT_PWR_MODE);
REG_CURRENT_PWR_MODE); qdf_status = wlan_hdd_mlo_sap_reinit(ap_adapter->deflink);
if (QDF_IS_STATUS_ERROR(wlan_hdd_mlo_sap_reinit(hdd_ctx, sap_config, if (QDF_IS_STATUS_ERROR(qdf_status)) {
ap_adapter))) {
hdd_err("SAP Not able to do mlo attach"); hdd_err("SAP Not able to do mlo attach");
goto end; goto end;
} }
qdf_event_reset(&hostapd_state->qdf_event); qdf_event_reset(&hostapd_state->qdf_event);
if (wlansap_start_bss(hdd_ap_ctx->sap_context, hdd_hostapd_sap_event_cb, qdf_status = wlansap_start_bss(ap_ctx->sap_context,
&hdd_ap_ctx->sap_config, hdd_hostapd_sap_event_cb, sap_config,
ap_adapter->dev) ap_adapter->dev);
!= QDF_STATUS_SUCCESS) if (QDF_IS_STATUS_ERROR(qdf_status))
goto end; goto end;
hdd_debug("Waiting for SAP to start"); hdd_debug("Waiting for SAP to start");
@@ -17283,7 +17277,7 @@ void wlan_hdd_start_sap(struct hdd_adapter *ap_adapter, bool reinit)
return; return;
end: end:
wlan_hdd_mlo_reset(ap_adapter); wlan_hdd_mlo_reset(ap_adapter->deflink);
wlansap_reset_sap_config_add_ie(sap_config, eUPDATE_IE_ALL); wlansap_reset_sap_config_add_ie(sap_config, eUPDATE_IE_ALL);
mutex_unlock(&hdd_ctx->sap_lock); mutex_unlock(&hdd_ctx->sap_lock);
/* SAP context and beacon cleanup will happen during driver unload /* SAP context and beacon cleanup will happen during driver unload
@@ -17291,10 +17285,8 @@ end:
*/ */
hdd_err("SAP restart after SSR failed! Reload WLAN and try SAP again"); hdd_err("SAP restart after SSR failed! Reload WLAN and try SAP again");
/* Free the beacon memory in case of failure in the sap restart */ /* Free the beacon memory in case of failure in the sap restart */
if (ap_adapter->deflink->session.ap.beacon) { qdf_mem_free(ap_ctx->beacon);
qdf_mem_free(ap_adapter->deflink->session.ap.beacon); ap_ctx->beacon = NULL;
ap_adapter->deflink->session.ap.beacon = NULL;
}
} }
#ifdef QCA_CONFIG_SMP #ifdef QCA_CONFIG_SMP
@@ -19921,29 +19913,26 @@ bool hdd_is_connection_in_progress(uint8_t *out_vdev_id,
*/ */
void hdd_restart_sap(struct hdd_adapter *ap_adapter) void hdd_restart_sap(struct hdd_adapter *ap_adapter)
{ {
struct hdd_ap_ctx *hdd_ap_ctx; struct hdd_hostapd_state *hapd_state;
struct hdd_hostapd_state *hostapd_state; QDF_STATUS status;
QDF_STATUS qdf_status;
struct hdd_context *hdd_ctx = WLAN_HDD_GET_CTX(ap_adapter); struct hdd_context *hdd_ctx = WLAN_HDD_GET_CTX(ap_adapter);
struct sap_config *sap_config; struct sap_config *sap_config;
void *sap_ctx; void *sap_ctx;
hdd_ap_ctx = WLAN_HDD_GET_AP_CTX_PTR(ap_adapter->deflink); sap_config =
sap_config = &hdd_ap_ctx->sap_config; &(WLAN_HDD_GET_AP_CTX_PTR(ap_adapter->deflink)->sap_config);
sap_ctx = hdd_ap_ctx->sap_context; sap_ctx = WLAN_HDD_GET_SAP_CTX_PTR(ap_adapter->deflink);
mutex_lock(&hdd_ctx->sap_lock); mutex_lock(&hdd_ctx->sap_lock);
if (test_bit(SOFTAP_BSS_STARTED, &ap_adapter->deflink->link_flags)) { if (test_bit(SOFTAP_BSS_STARTED, &ap_adapter->deflink->link_flags)) {
wlan_hdd_del_station(ap_adapter, NULL); wlan_hdd_del_station(ap_adapter, NULL);
hostapd_state = hapd_state = WLAN_HDD_GET_HOSTAP_STATE_PTR(ap_adapter->deflink);
WLAN_HDD_GET_HOSTAP_STATE_PTR(ap_adapter->deflink); qdf_event_reset(&hapd_state->qdf_stop_bss_event);
qdf_event_reset(&hostapd_state->qdf_stop_bss_event);
if (QDF_STATUS_SUCCESS == wlansap_stop_bss(sap_ctx)) { if (QDF_STATUS_SUCCESS == wlansap_stop_bss(sap_ctx)) {
qdf_status = qdf_wait_single_event( status = qdf_wait_single_event(&hapd_state->qdf_stop_bss_event,
&hostapd_state->qdf_stop_bss_event, SME_CMD_STOP_BSS_TIMEOUT);
SME_CMD_STOP_BSS_TIMEOUT);
if (!QDF_IS_STATUS_SUCCESS(qdf_status)) { if (!QDF_IS_STATUS_SUCCESS(status)) {
hdd_err("SAP Stop Failed"); hdd_err("SAP Stop Failed");
goto end; goto end;
} }
@@ -19960,35 +19949,32 @@ void hdd_restart_sap(struct hdd_adapter *ap_adapter)
goto end; goto end;
} }
qdf_status = wlan_hdd_mlo_sap_reinit(hdd_ctx, sap_config, status = wlan_hdd_mlo_sap_reinit(ap_adapter->deflink);
ap_adapter); if (QDF_IS_STATUS_ERROR(status)) {
if (QDF_IS_STATUS_ERROR(qdf_status)) {
hdd_err("SAP Not able to do mlo attach"); hdd_err("SAP Not able to do mlo attach");
goto deinit_mlo; goto deinit_mlo;
} }
qdf_event_reset(&hostapd_state->qdf_event); qdf_event_reset(&hapd_state->qdf_event);
if (wlansap_start_bss(sap_ctx, hdd_hostapd_sap_event_cb, status = wlansap_start_bss(sap_ctx, hdd_hostapd_sap_event_cb,
sap_config, sap_config, ap_adapter->dev);
ap_adapter->dev) != QDF_STATUS_SUCCESS) { if (QDF_IS_STATUS_ERROR(status)) {
hdd_err("SAP Start Bss fail"); hdd_err("SAP Start Bss fail");
goto deinit_mlo; goto deinit_mlo;
} }
hdd_info("Waiting for SAP to start"); hdd_info("Waiting for SAP to start");
qdf_status = status = qdf_wait_single_event(&hapd_state->qdf_event,
qdf_wait_single_event(&hostapd_state->qdf_event, SME_CMD_START_BSS_TIMEOUT);
SME_CMD_START_BSS_TIMEOUT); if (!QDF_IS_STATUS_SUCCESS(status)) {
if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
hdd_err("SAP Start failed"); hdd_err("SAP Start failed");
goto deinit_mlo; goto deinit_mlo;
} }
wlansap_reset_sap_config_add_ie(sap_config, wlansap_reset_sap_config_add_ie(sap_config, eUPDATE_IE_ALL);
eUPDATE_IE_ALL);
hdd_err("SAP Start Success"); hdd_err("SAP Start Success");
hdd_medium_assess_init(); hdd_medium_assess_init();
set_bit(SOFTAP_BSS_STARTED, &ap_adapter->deflink->link_flags); set_bit(SOFTAP_BSS_STARTED, &ap_adapter->deflink->link_flags);
if (hostapd_state->bss_state == BSS_START) { if (hapd_state->bss_state == BSS_START) {
policy_mgr_incr_active_session(hdd_ctx->psoc, policy_mgr_incr_active_session(hdd_ctx->psoc,
ap_adapter->device_mode, ap_adapter->device_mode,
ap_adapter->deflink->vdev_id); ap_adapter->deflink->vdev_id);
@@ -20001,7 +19987,7 @@ void hdd_restart_sap(struct hdd_adapter *ap_adapter)
return; return;
deinit_mlo: deinit_mlo:
wlan_hdd_mlo_reset(ap_adapter); wlan_hdd_mlo_reset(ap_adapter->deflink);
end: end:
wlansap_reset_sap_config_add_ie(sap_config, eUPDATE_IE_ALL); wlansap_reset_sap_config_add_ie(sap_config, eUPDATE_IE_ALL);
mutex_unlock(&hdd_ctx->sap_lock); mutex_unlock(&hdd_ctx->sap_lock);