diff --git a/core/mac/src/pe/lim/lim_utils.c b/core/mac/src/pe/lim/lim_utils.c index 27d081aa9c..6e75b5183d 100644 --- a/core/mac/src/pe/lim/lim_utils.c +++ b/core/mac/src/pe/lim/lim_utils.c @@ -5756,6 +5756,9 @@ QDF_STATUS lim_send_ies_per_band(struct mac_context *mac_ctx, status = lim_send_he_caps_ie(mac_ctx, session, vdev_id); + if (QDF_IS_STATUS_SUCCESS(status)) + status = lim_send_he_6g_band_caps_ie(mac_ctx, session, vdev_id); + return status; } @@ -7478,6 +7481,47 @@ QDF_STATUS lim_populate_he_mcs_set(struct mac_context *mac_ctx, } #endif +#if defined(CONFIG_BAND_6GHZ) && defined(WLAN_FEATURE_11AX) +QDF_STATUS lim_send_he_6g_band_caps_ie(struct mac_context *mac_ctx, + struct pe_session *session, + uint8_t vdev_id) +{ + uint8_t he_6g_band_caps_ie[DOT11F_IE_HE_6GHZ_BAND_CAP_MIN_LEN + 3]; + tDot11fIEhe_6ghz_band_cap he_6g_band_cap; + QDF_STATUS status; + uint32_t size = 0; + uint32_t result; + + qdf_mem_zero(&he_6g_band_cap, sizeof(he_6g_band_cap)); + populate_dot11f_he_6ghz_cap(mac_ctx, session, &he_6g_band_cap); + if (!he_6g_band_cap.present) { + pe_debug("no HE 6g band cap for vdev %d", vdev_id); + return QDF_STATUS_SUCCESS; + } + + qdf_mem_zero(he_6g_band_caps_ie, sizeof(he_6g_band_caps_ie)); + result = dot11f_pack_ie_he_6ghz_band_cap(mac_ctx, &he_6g_band_cap, + he_6g_band_caps_ie, + sizeof(he_6g_band_caps_ie), + &size); + if (result != DOT11F_PARSE_SUCCESS) { + pe_err("pack erro for HE 6g band cap for vdev %d", vdev_id); + return QDF_STATUS_E_FAILURE; + } + pe_debug("send HE 6ghz band cap: 0x%01x 0x%01x for vdev %d", + he_6g_band_caps_ie[3], he_6g_band_caps_ie[4], + vdev_id); + status = lim_send_ie(mac_ctx, vdev_id, DOT11F_EID_HE_6GHZ_BAND_CAP, + CDS_BAND_5GHZ, &he_6g_band_caps_ie[2], + DOT11F_IE_HE_6GHZ_BAND_CAP_MIN_LEN + 1); + if (QDF_IS_STATUS_ERROR(status)) + pe_err("Unable send HE 6g band Cap IE for 5GHZ band, status: %d", + status); + + return status; +} +#endif + int lim_assoc_rej_get_remaining_delta(struct sir_rssi_disallow_lst *node) { diff --git a/core/mac/src/pe/lim/lim_utils.h b/core/mac/src/pe/lim/lim_utils.h index b6ca4f1be3..843e0328fc 100644 --- a/core/mac/src/pe/lim/lim_utils.h +++ b/core/mac/src/pe/lim/lim_utils.h @@ -1551,6 +1551,30 @@ lim_update_he_6ghz_band_caps(struct mac_context *mac, } #endif +#if defined(CONFIG_BAND_6GHZ) && defined(WLAN_FEATURE_11AX) +/** + * lim_send_he_6g_band_caps_ie() - Send HE 6ghz band caps to FW + * @mac_ctx: Global MAC context + * @session: session ptr + * @vdev_id: vdev id + * + * Send HE 6ghz band capabilities IE to firmware + * + * Return: QDF_STATUS_SUCCESS on success + */ +QDF_STATUS lim_send_he_6g_band_caps_ie(struct mac_context *mac_ctx, + struct pe_session *session, + uint8_t vdev_id); +#else +static inline +QDF_STATUS lim_send_he_6g_band_caps_ie(struct mac_context *mac_ctx, + struct pe_session *session, + uint8_t vdev_id) +{ + return QDF_STATUS_SUCCESS; +} +#endif + /** * lim_decrement_pending_mgmt_count: Decrement mgmt frame count * @mac_ctx: Pointer to global MAC structure diff --git a/core/mac/src/sys/legacy/src/utils/src/parser_api.c b/core/mac/src/sys/legacy/src/utils/src/parser_api.c index 7685a0e9f3..9383cf1a37 100644 --- a/core/mac/src/sys/legacy/src/utils/src/parser_api.c +++ b/core/mac/src/sys/legacy/src/utils/src/parser_api.c @@ -6177,7 +6177,7 @@ populate_dot11f_he_6ghz_cap(struct mac_context *mac_ctx, struct mlme_ht_capabilities_info *ht_cap_info; struct mlme_vht_capabilities_info *vht_cap_info; - if (!session || !session->he_6ghz_band) + if (session && !session->he_6ghz_band) return QDF_STATUS_SUCCESS; ht_cap_info = &mac_ctx->mlme_cfg->ht_caps.ht_cap_info; @@ -6186,8 +6186,12 @@ populate_dot11f_he_6ghz_cap(struct mac_context *mac_ctx, he_6g_cap->present = 1; he_6g_cap->min_mpdu_start_spacing = mac_ctx->mlme_cfg->ht_caps.ampdu_params.mpdu_density; - he_6g_cap->max_ampdu_len_exp = - session->vht_config.max_ampdu_lenexp; + if (session) + he_6g_cap->max_ampdu_len_exp = + session->vht_config.max_ampdu_lenexp; + else + he_6g_cap->max_ampdu_len_exp = + vht_cap_info->ampdu_len_exponent & 0x7; he_6g_cap->max_mpdu_len = vht_cap_info->ampdu_len; he_6g_cap->sm_pow_save = ht_cap_info->mimo_power_save; he_6g_cap->rd_responder = 0;