From ecafcc060dd95d25d8b4f8926752a6bd4f936dca Mon Sep 17 00:00:00 2001 From: Madhvapathi Sriram Date: Wed, 16 Mar 2022 18:59:12 +0530 Subject: [PATCH] qcacld-3.0: Honor local EDCA parameters configured by user When local EDCA parameters are reconfigured, any user set local TXQ or EDCA parameters are over written. Modify to honor the user set EDCA parameters. Change-Id: I3f04b5c4538822d8c9bae98132dafa272fa6bc71 CRs-Fixed: 3150599 --- core/hdd/src/wlan_hdd_cfg80211.c | 1 + core/mac/inc/sir_mac_prot_def.h | 1 + .../src/pe/lim/lim_process_sme_req_messages.c | 2 ++ core/mac/src/pe/lim/lim_session.c | 9 +++++++- core/mac/src/pe/sch/sch_message.c | 23 +++++++++++++++---- 5 files changed, 30 insertions(+), 6 deletions(-) diff --git a/core/hdd/src/wlan_hdd_cfg80211.c b/core/hdd/src/wlan_hdd_cfg80211.c index fb7f410080..fd42cc7fda 100644 --- a/core/hdd/src/wlan_hdd_cfg80211.c +++ b/core/hdd/src/wlan_hdd_cfg80211.c @@ -20546,6 +20546,7 @@ static int __wlan_hdd_set_txq_params(struct wiphy *wiphy, txq_edca_params.txoplimit = params->txop; txq_edca_params.aci.aci = ieee_ac_to_qca_ac[params->ac]; + txq_edca_params.user_edca_set = 1; status = sme_update_session_txq_edca_params(mac_handle, adapter->vdev_id, diff --git a/core/mac/inc/sir_mac_prot_def.h b/core/mac/inc/sir_mac_prot_def.h index 985d6509b0..7a1bae0a67 100644 --- a/core/mac/inc/sir_mac_prot_def.h +++ b/core/mac/inc/sir_mac_prot_def.h @@ -686,6 +686,7 @@ typedef struct sSirMacEdcaParamRecord { uint16_t mu_edca_timer; }; uint8_t no_ack; + uint8_t user_edca_set; } qdf_packed tSirMacEdcaParamRecord; typedef struct sSirMacQosInfo { diff --git a/core/mac/src/pe/lim/lim_process_sme_req_messages.c b/core/mac/src/pe/lim/lim_process_sme_req_messages.c index 87397c537c..b42b704a20 100644 --- a/core/mac/src/pe/lim/lim_process_sme_req_messages.c +++ b/core/mac/src/pe/lim/lim_process_sme_req_messages.c @@ -6819,6 +6819,8 @@ lim_process_sme_update_session_edca_txq_params(struct mac_context *mac_ctx, msg->txq_edca_params.aci.aifsn; pe_session->gLimEdcaParams[ac].txoplimit = msg->txq_edca_params.txoplimit; + pe_session->gLimEdcaParams[ac].user_edca_set = + msg->txq_edca_params.user_edca_set; lim_send_edca_params(mac_ctx, pe_session->gLimEdcaParams, diff --git a/core/mac/src/pe/lim/lim_session.c b/core/mac/src/pe/lim/lim_session.c index 0880b1cf0f..0e253e4c9d 100644 --- a/core/mac/src/pe/lim/lim_session.c +++ b/core/mac/src/pe/lim/lim_session.c @@ -1,5 +1,6 @@ /* * Copyright (c) 2011-2021 The Linux Foundation. All rights reserved. + * Copyright (c) 2022 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 @@ -540,7 +541,7 @@ struct pe_session *pe_create_session(struct mac_context *mac, uint8_t vdev_id) { QDF_STATUS status; - uint8_t i; + uint8_t i, j; struct pe_session *session_ptr; struct wlan_objmgr_vdev *vdev; @@ -684,6 +685,9 @@ struct pe_session *pe_create_session(struct mac_context *mac, /* following is invalid value since seq number is 12 bit */ session_ptr->prev_auth_seq_num = 0xFFFF; + for (j = 0; j < QCA_WLAN_AC_ALL; j++) + session_ptr->gLimEdcaParams[j].user_edca_set = 0; + return &mac->lim.gpSession[i]; free_session_attrs: @@ -1008,6 +1012,9 @@ void pe_delete_session(struct mac_context *mac_ctx, struct pe_session *session) if (LIM_IS_AP_ROLE(session)) lim_check_and_reset_protection_params(mac_ctx); + for (i = 0; i < QCA_WLAN_AC_ALL; i++) + session->gLimEdcaParams[i].user_edca_set = 0; + vdev = session->vdev; session->vdev = NULL; if (vdev) diff --git a/core/mac/src/pe/sch/sch_message.c b/core/mac/src/pe/sch/sch_message.c index b7e9221ea2..10195f6045 100644 --- a/core/mac/src/pe/sch/sch_message.c +++ b/core/mac/src/pe/sch/sch_message.c @@ -361,15 +361,28 @@ void sch_qos_update_local(struct mac_context *mac, struct pe_session *pe_session { uint32_t params[4][CFG_EDCA_DATA_LEN]; + uint8_t ac, user_edca_set = 0; QDF_STATUS status; - status = sch_get_params(mac, params, true /*local */); - if (QDF_IS_STATUS_ERROR(status)) { - pe_err("sch_get_params(local) failed"); - return; + /* Check if a user preferred EDCA setting is present */ + for (ac = 0; ac < QCA_WLAN_AC_ALL; ac++) { + if (pe_session->gLimEdcaParams[ac].user_edca_set) { + user_edca_set = 1; + break; + } + } + + /* If user preferred EDCA setting present, use it, do not default */ + if (user_edca_set == 0) { + status = sch_get_params(mac, params, true /*local */); + if (QDF_IS_STATUS_ERROR(status)) { + pe_err("sch_get_params(local) failed"); + return; + } + + set_sch_edca_params(mac, params, pe_session); } - set_sch_edca_params(mac, params, pe_session); lim_set_active_edca_params(mac, pe_session->gLimEdcaParams, pe_session); /* For AP, the bssID is stored in LIM Global context. */