diff --git a/components/pmo/core/inc/wlan_pmo_suspend_resume.h b/components/pmo/core/inc/wlan_pmo_suspend_resume.h index 156ba9cbe118..0cc7a6b72b6d 100644 --- a/components/pmo/core/inc/wlan_pmo_suspend_resume.h +++ b/components/pmo/core/inc/wlan_pmo_suspend_resume.h @@ -1,5 +1,6 @@ /* * Copyright (c) 2017-2018, 2020-2021 The Linux Foundation. All rights reserved. + * Copyright (c) 2023 Qualcomm Innovation Center, Inc. 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 @@ -290,10 +291,12 @@ int pmo_core_psoc_clear_target_wake_up(struct wlan_objmgr_psoc *psoc); * pmo_core_psoc_target_suspend_acknowledge() - update target susspend status * @context: HTC_INIT_INFO->context * @wow_nack: true when wow is rejected + * @reason_code : WoW status reason code * * Return: none */ -void pmo_core_psoc_target_suspend_acknowledge(void *context, bool wow_nack); +void pmo_core_psoc_target_suspend_acknowledge(void *context, bool wow_nack, + uint16_t reason_code); /** * pmo_core_psoc_wakeup_host_event_received() - received host wake up event diff --git a/components/pmo/core/inc/wlan_pmo_wow.h b/components/pmo/core/inc/wlan_pmo_wow.h index df559cc39bb1..593ed833f0f1 100644 --- a/components/pmo/core/inc/wlan_pmo_wow.h +++ b/components/pmo/core/inc/wlan_pmo_wow.h @@ -1,5 +1,6 @@ /* * Copyright (c) 2017-2021 The Linux Foundation. All rights reserved. + * Copyright (c) 2023 Qualcomm Innovation Center, Inc. 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 @@ -421,14 +422,17 @@ bool pmo_core_is_wow_enabled(struct pmo_psoc_priv_obj *psoc_ctx) * pmo_core_set_wow_nack() - Set wow nack flag * @psoc_ctx: Pointer to objmgr psoc handle * @value: true if received wow nack from else false + * @reason_code: WoW status reason code * * Return: None */ static inline -void pmo_core_set_wow_nack(struct pmo_psoc_priv_obj *psoc_ctx, bool value) +void pmo_core_set_wow_nack(struct pmo_psoc_priv_obj *psoc_ctx, bool value, + uint16_t reason_code) { qdf_spin_lock_bh(&psoc_ctx->lock); psoc_ctx->wow.wow_nack = value; + psoc_ctx->wow.reason_code = reason_code; qdf_spin_unlock_bh(&psoc_ctx->lock); } @@ -449,6 +453,25 @@ bool pmo_core_get_wow_nack(struct pmo_psoc_priv_obj *psoc_ctx) return value; } + +/** + * pmo_core_get_wow_reason_code() - Get wow status reason code + * @psoc_ctx: Pointer to objmgr psoc handle + * + * Return: wow status reason code + */ +static inline +uint16_t pmo_core_get_wow_reason_code(struct pmo_psoc_priv_obj *psoc_ctx) +{ + uint16_t value; + + qdf_spin_lock_bh(&psoc_ctx->lock); + value = psoc_ctx->wow.reason_code; + qdf_spin_unlock_bh(&psoc_ctx->lock); + + return value; +} + /** * pmo_core_update_wow_enable_cmd_sent() - update wow enable cmd sent flag * @psoc_ctx: Pointer to objmgr psoc handle diff --git a/components/pmo/core/src/wlan_pmo_suspend_resume.c b/components/pmo/core/src/wlan_pmo_suspend_resume.c index 3a3c144a70ab..dba62a0b43c8 100644 --- a/components/pmo/core/src/wlan_pmo_suspend_resume.c +++ b/components/pmo/core/src/wlan_pmo_suspend_resume.c @@ -1,6 +1,6 @@ /* * Copyright (c) 2017-2021 The Linux Foundation. All rights reserved. - * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved. + * Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. 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 @@ -735,12 +735,13 @@ pmo_core_enable_wow_in_fw(struct wlan_objmgr_psoc *psoc, struct pmo_psoc_cfg *psoc_cfg = &psoc_ctx->psoc_cfg; QDF_STATUS status; void *hif_ctx; + uint16_t reason_code; pmo_enter(); hif_ctx = pmo_core_psoc_get_hif_handle(psoc); qdf_event_reset(&psoc_ctx->wow.target_suspend); - pmo_core_set_wow_nack(psoc_ctx, false); + pmo_core_set_wow_nack(psoc_ctx, false, 0); host_credits = pmo_tgt_psoc_get_host_credits(psoc); wmi_pending_cmds = pmo_tgt_psoc_get_pending_cmnds(psoc); pmo_debug("Credits:%d; Pending_Cmds: %d", @@ -847,7 +848,8 @@ pmo_core_enable_wow_in_fw(struct wlan_objmgr_psoc *psoc, } if (pmo_core_get_wow_nack(psoc_ctx)) { - pmo_err("FW not ready to WOW"); + reason_code = pmo_core_get_wow_reason_code(psoc_ctx); + pmo_err("FW not ready to WOW reason code: %d", reason_code); pmo_tgt_update_target_suspend_flag(psoc, false); status = QDF_STATUS_E_AGAIN; goto out; @@ -1514,7 +1516,8 @@ out: return status; } -void pmo_core_psoc_target_suspend_acknowledge(void *context, bool wow_nack) +void pmo_core_psoc_target_suspend_acknowledge(void *context, bool wow_nack, + uint16_t reason_code) { struct pmo_psoc_priv_obj *psoc_ctx; struct wlan_objmgr_psoc *psoc = (struct wlan_objmgr_psoc *)context; @@ -1535,7 +1538,7 @@ void pmo_core_psoc_target_suspend_acknowledge(void *context, bool wow_nack) psoc_ctx = pmo_psoc_get_priv(psoc); - pmo_core_set_wow_nack(psoc_ctx, wow_nack); + pmo_core_set_wow_nack(psoc_ctx, wow_nack, reason_code); qdf_event_set(&psoc_ctx->wow.target_suspend); if (!pmo_tgt_psoc_get_runtime_pm_in_progress(psoc)) { if (wow_nack) diff --git a/components/pmo/dispatcher/inc/wlan_pmo_ucfg_api.h b/components/pmo/dispatcher/inc/wlan_pmo_ucfg_api.h index e506331d8a7f..96a4bc13b4a3 100644 --- a/components/pmo/dispatcher/inc/wlan_pmo_ucfg_api.h +++ b/components/pmo/dispatcher/inc/wlan_pmo_ucfg_api.h @@ -1,5 +1,6 @@ /* * Copyright (c) 2017-2021 The Linux Foundation. All rights reserved. + * Copyright (c) 2023 Qualcomm Innovation Center, Inc. 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 @@ -993,11 +994,14 @@ int ucfg_pmo_psoc_clear_target_wake_up(struct wlan_objmgr_psoc *psoc); /** * ucfg_pmo_psoc_target_suspend_acknowledge() - Clear initial wake up status - * @psoc: objmgr psoc handle + * @context: caller-provided context + * @wow_nack: Was WoW NACK'ed + * @reason_code: WoW status reason code * * Return: None */ -void ucfg_pmo_psoc_target_suspend_acknowledge(void *context, bool wow_nack); +void ucfg_pmo_psoc_target_suspend_acknowledge(void *context, bool wow_nack, + uint16_t reason_code); /** * ucfg_pmo_psoc_wakeup_host_event_received() - got host wake up evennt from fwr @@ -1665,7 +1669,8 @@ ucfg_pmo_psoc_clear_target_wake_up(struct wlan_objmgr_psoc *psoc) } static inline void -ucfg_pmo_psoc_target_suspend_acknowledge(void *context, bool wow_nack) +ucfg_pmo_psoc_target_suspend_acknowledge(void *context, bool wow_nack, + uint16_t reason_code) { } diff --git a/components/pmo/dispatcher/inc/wlan_pmo_wow_public_struct.h b/components/pmo/dispatcher/inc/wlan_pmo_wow_public_struct.h index a38e36c8e84b..e1cc1e8625b7 100644 --- a/components/pmo/dispatcher/inc/wlan_pmo_wow_public_struct.h +++ b/components/pmo/dispatcher/inc/wlan_pmo_wow_public_struct.h @@ -1,6 +1,6 @@ /* * Copyright (c) 2017-2021 The Linux Foundation. All rights reserved. - * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved. + * Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. 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 @@ -224,6 +224,7 @@ enum pmo_wow_state { * @target_suspend: target suspend event * @target_resume: target resume event * @wow_nack: wow negative ack flag + * @reason_code : wow status reason code * @wow_initial_wake_up: target initial wake up is received * @wow_wake_lock: wow wake lock * @lphb_cache: lphb cache @@ -245,7 +246,8 @@ struct pmo_wow { enum pmo_wow_state wow_state; qdf_event_t target_suspend; qdf_event_t target_resume; - int wow_nack; + bool wow_nack; + uint16_t reason_code; atomic_t wow_initial_wake_up; qdf_wake_lock_t wow_wake_lock; /* diff --git a/components/pmo/dispatcher/src/wlan_pmo_ucfg_api.c b/components/pmo/dispatcher/src/wlan_pmo_ucfg_api.c index c1676d611d47..5663480501c8 100644 --- a/components/pmo/dispatcher/src/wlan_pmo_ucfg_api.c +++ b/components/pmo/dispatcher/src/wlan_pmo_ucfg_api.c @@ -1,5 +1,6 @@ /* * Copyright (c) 2017-2021 The Linux Foundation. All rights reserved. + * Copyright (c) 2023 Qualcomm Innovation Center, Inc. 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 @@ -486,9 +487,11 @@ int ucfg_pmo_psoc_clear_target_wake_up(struct wlan_objmgr_psoc *psoc) return pmo_core_psoc_clear_target_wake_up(psoc); } -void ucfg_pmo_psoc_target_suspend_acknowledge(void *context, bool wow_nack) +void ucfg_pmo_psoc_target_suspend_acknowledge(void *context, bool wow_nack, + uint16_t reason_code) { - pmo_core_psoc_target_suspend_acknowledge(context, wow_nack); + pmo_core_psoc_target_suspend_acknowledge(context, wow_nack, + reason_code); } void ucfg_pmo_psoc_wakeup_host_event_received(struct wlan_objmgr_psoc *psoc) diff --git a/core/hdd/src/wlan_hdd_station_info.c b/core/hdd/src/wlan_hdd_station_info.c index ca95b647404b..06debdd2027c 100644 --- a/core/hdd/src/wlan_hdd_station_info.c +++ b/core/hdd/src/wlan_hdd_station_info.c @@ -363,6 +363,9 @@ static int hdd_convert_dot11mode(uint32_t dot11mode) case eCSR_CFG_DOT11_MODE_11AC: ret_val = QCA_WLAN_802_11_MODE_11AC; break; + case eCSR_CFG_DOT11_MODE_11AX: + ret_val = QCA_WLAN_802_11_MODE_11AX; + break; case eCSR_CFG_DOT11_MODE_AUTO: case eCSR_CFG_DOT11_MODE_ABG: default: diff --git a/core/mac/inc/qwlan_version.h b/core/mac/inc/qwlan_version.h index 63f733f4ccf7..a22196838e55 100644 --- a/core/mac/inc/qwlan_version.h +++ b/core/mac/inc/qwlan_version.h @@ -32,9 +32,9 @@ #define QWLAN_VERSION_MAJOR 2 #define QWLAN_VERSION_MINOR 0 #define QWLAN_VERSION_PATCH 8 -#define QWLAN_VERSION_EXTRA "X" -#define QWLAN_VERSION_BUILD 32 +#define QWLAN_VERSION_EXTRA "B" +#define QWLAN_VERSION_BUILD 33 -#define QWLAN_VERSIONSTR "2.0.8.32X" +#define QWLAN_VERSIONSTR "2.0.8.33B" #endif /* QWLAN_VERSION_H */ diff --git a/core/mac/src/pe/lim/lim_send_management_frames.c b/core/mac/src/pe/lim/lim_send_management_frames.c index d505e6704d02..ea07afe0a7cb 100644 --- a/core/mac/src/pe/lim/lim_send_management_frames.c +++ b/core/mac/src/pe/lim/lim_send_management_frames.c @@ -1,6 +1,6 @@ /* * Copyright (c) 2011-2020 The Linux Foundation. All rights reserved. - * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved. + * Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. 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 @@ -2646,7 +2646,7 @@ lim_send_assoc_req_mgmt_frame(struct mac_context *mac_ctx, QDF_TRACE_HEX_DUMP(QDF_MODULE_ID_PE, QDF_TRACE_LEVEL_DEBUG, frame, (uint16_t)(sizeof(tSirMacMgmtHdr) + payload)); - min_rid = lim_get_min_session_txrate(pe_session); + min_rid = lim_get_min_session_txrate(pe_session, NULL); lim_diag_event_report(mac_ctx, WLAN_PE_DIAG_ASSOC_START_EVENT, pe_session, QDF_STATUS_SUCCESS, QDF_STATUS_SUCCESS); lim_diag_mgmt_tx_event_report(mac_ctx, mac_hdr, @@ -3133,7 +3133,7 @@ alloc_packet: session->peSessionId, mac_hdr->fc.subType)); mac_ctx->auth_ack_status = LIM_ACK_NOT_RCD; - min_rid = lim_get_min_session_txrate(session); + min_rid = lim_get_min_session_txrate(session, NULL); peer_rssi = mac_ctx->lim.bss_rssi; lim_diag_mgmt_tx_event_report(mac_ctx, mac_hdr, session, QDF_STATUS_SUCCESS, QDF_STATUS_SUCCESS); @@ -5700,6 +5700,9 @@ static void lim_tx_mgmt_frame(struct mac_context *mac_ctx, uint8_t vdev_id, struct pe_session *session; uint16_t auth_ack_status; enum rateid min_rid = RATEID_DEFAULT; + qdf_freq_t *pre_auth_freq = NULL; + qdf_freq_t channel_freq = 0; + enum QDF_OPMODE opmode; session = pe_find_session_by_vdev_id(mac_ctx, vdev_id); if (!session) { @@ -5712,7 +5715,24 @@ static void lim_tx_mgmt_frame(struct mac_context *mac_ctx, uint8_t vdev_id, qdf_mtrace(QDF_MODULE_ID_PE, QDF_MODULE_ID_WMA, TRACE_CODE_TX_MGMT, session->peSessionId, 0); - min_rid = lim_get_min_session_txrate(session); + opmode = wlan_get_opmode_from_vdev_id(mac_ctx->pdev, vdev_id); + if (opmode != QDF_NAN_DISC_MODE && fc->subType == SIR_MAC_MGMT_AUTH) { + tpSirFTPreAuthReq pre_auth_req; + uint16_t auth_algo = *(uint16_t *)(frame + + sizeof(tSirMacMgmtHdr)); + + if (auth_algo == eSIR_AUTH_TYPE_SAE) { + if (session->ftPEContext.pFTPreAuthReq) { + pre_auth_req = + session->ftPEContext.pFTPreAuthReq; + channel_freq = + pre_auth_req->pre_auth_channel_freq; + } + pre_auth_freq = &channel_freq; + } + pe_debug("TX SAE pre-auth frame on freq %d", channel_freq); + } + min_rid = lim_get_min_session_txrate(session, pre_auth_freq); qdf_status = wma_tx_frameWithTxComplete(mac_ctx, packet, (uint16_t)msg_len, diff --git a/core/mac/src/pe/lim/lim_utils.c b/core/mac/src/pe/lim/lim_utils.c index 6e85825a8c3f..1922b487c16a 100644 --- a/core/mac/src/pe/lim/lim_utils.c +++ b/core/mac/src/pe/lim/lim_utils.c @@ -1,6 +1,6 @@ /* * Copyright (c) 2011-2020 The Linux Foundation. All rights reserved. - * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved. + * Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. 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 @@ -8248,15 +8248,27 @@ QDF_STATUS lim_util_get_type_subtype(void *pkt, uint8_t *type, return QDF_STATUS_SUCCESS; } -enum rateid lim_get_min_session_txrate(struct pe_session *session) +enum rateid lim_get_min_session_txrate(struct pe_session *session, + qdf_freq_t *pre_auth_freq) { enum rateid rid = RATEID_DEFAULT; uint8_t min_rate = SIR_MAC_RATE_54, curr_rate, i; - tSirMacRateSet *rateset = &session->rateSet; + tSirMacRateSet *rateset; if (!session) return rid; + rateset = &session->rateSet; + + if (pre_auth_freq) { + pe_debug("updated rateset to pre auth freq %d", + *pre_auth_freq); + if ((*pre_auth_freq)) + csr_get_basic_rates(rateset, *pre_auth_freq); + else + return rid; + } + for (i = 0; i < rateset->numRates; i++) { /* Ignore MSB - set to indicate basic rate */ curr_rate = rateset->rate[i] & 0x7F; diff --git a/core/mac/src/pe/lim/lim_utils.h b/core/mac/src/pe/lim/lim_utils.h index 6b2e0103741b..eaa7d7585adc 100644 --- a/core/mac/src/pe/lim/lim_utils.h +++ b/core/mac/src/pe/lim/lim_utils.h @@ -1,6 +1,6 @@ /* * Copyright (c) 2012-2020 The Linux Foundation. All rights reserved. - * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved. + * Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. 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 @@ -1687,13 +1687,15 @@ QDF_STATUS lim_util_get_type_subtype(void *pkt, uint8_t *type, /** * lim_get_min_session_txrate() - Get the minimum rate supported in the session * @session: Pointer to PE session + * @pre_auth_freq: Pointer to pre_auth_freq * * This API will find the minimum rate supported by the given PE session and * return the enum rateid corresponding to the rate. * * Return: enum rateid */ -enum rateid lim_get_min_session_txrate(struct pe_session *session); +enum rateid lim_get_min_session_txrate(struct pe_session *session, + qdf_freq_t *pre_auth_freq); /** * lim_send_dfs_chan_sw_ie_update() - updates the channel switch IE in beacon diff --git a/core/sme/inc/csr_api.h b/core/sme/inc/csr_api.h index d2b522974b6b..72da90d303ef 100644 --- a/core/sme/inc/csr_api.h +++ b/core/sme/inc/csr_api.h @@ -1485,6 +1485,15 @@ QDF_STATUS csr_mlme_vdev_disconnect_all_p2p_client_event(uint8_t vdev_id); */ QDF_STATUS csr_mlme_vdev_stop_bss(uint8_t vdev_id); +/* + * csr_get_basic_rates() - Get basic rate for a band + * @b_rates: Basic rate + * @chan_freq: frequency for which basic rate is required + * + * Return: void + */ +void csr_get_basic_rates(tSirMacRateSet *b_rates, uint32_t chan_freq); + /* * csr_mlme_get_concurrent_operation_freq() - Callback for MLME module to * get the concurrent operation frequency diff --git a/core/sme/src/csr/csr_api_roam.c b/core/sme/src/csr/csr_api_roam.c index 0b75b2e3a1e8..d09e2611c8ea 100644 --- a/core/sme/src/csr/csr_api_roam.c +++ b/core/sme/src/csr/csr_api_roam.c @@ -1839,6 +1839,13 @@ csr_check_band_freq_match(enum band_info band, uint32_t freq) if (band == BAND_5G && WLAN_REG_IS_5GHZ_CH_FREQ(freq)) return true; + /* + * Not adding the band check for now as band_info will be soon + * replaced with reg_wifi_band enum + */ + if (WLAN_REG_IS_6GHZ_CHAN_FREQ(freq)) + return true; + return false; } @@ -14951,7 +14958,7 @@ csr_update_sae_single_pmk_ap_cap(struct mac_context *mac, } #endif -static void csr_get_basic_rates(tSirMacRateSet *b_rates, uint32_t chan_freq) +void csr_get_basic_rates(tSirMacRateSet *b_rates, uint32_t chan_freq) { /* * Some IOT APs don't send supported rates in diff --git a/os_if/sync/src/osif_vdev_sync.c b/os_if/sync/src/osif_vdev_sync.c index 6442f239bcc5..1c1740f7c3c6 100644 --- a/os_if/sync/src/osif_vdev_sync.c +++ b/os_if/sync/src/osif_vdev_sync.c @@ -1,5 +1,6 @@ /* * Copyright (c) 2018-2019 The Linux Foundation. All rights reserved. + * Copyright (c) 2023 Qualcomm Innovation Center, Inc. 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 @@ -255,6 +256,9 @@ int __osif_vdev_sync_trans_start(struct net_device *net_dev, dsc_vdev_trans_start); osif_vdev_sync_unlock(); + if (!errno) + osif_vdev_sync_wait_for_ops(*out_vdev_sync); + return errno; } @@ -269,6 +273,9 @@ int __osif_vdev_sync_trans_start_wait(struct net_device *net_dev, out_vdev_sync, desc, dsc_vdev_trans_start_wait); + if (!errno) + osif_vdev_sync_wait_for_ops(*out_vdev_sync); + return errno; }