|
@@ -2111,12 +2111,18 @@ lim_get_bss_11be_mode_allowed(struct mac_context *mac_ctx,
|
|
|
(struct qdf_mac_addr *)
|
|
|
bss_desc->bssId);
|
|
|
|
|
|
+ /*
|
|
|
+ * If AP advertises multiple AKMs(WPA2 PSK + WPA3), allow connection
|
|
|
+ * in 11BE mode as our connection is going to be WPA3
|
|
|
+ */
|
|
|
if (scan_entry) {
|
|
|
is_eht_allowed =
|
|
|
wlan_cm_is_eht_allowed_for_current_security(scan_entry);
|
|
|
util_scan_free_cache_entry(scan_entry);
|
|
|
- if (!is_eht_allowed)
|
|
|
+ if (!is_eht_allowed) {
|
|
|
+ pe_debug("Downgrade to 11ax mode due to AP security validation failure");
|
|
|
return false;
|
|
|
+ }
|
|
|
}
|
|
|
return mlme_get_bss_11be_allowed(
|
|
|
mac_ctx->psoc,
|
|
@@ -5589,12 +5595,18 @@ void lim_parse_tpe_ie(struct mac_context *mac, struct pe_session *session,
|
|
|
qdf_freq_t curr_op_freq, curr_freq;
|
|
|
enum reg_6g_client_type client_mobility_type;
|
|
|
struct ch_params ch_params = {0};
|
|
|
- tDot11fIEtransmit_power_env single_tpe;
|
|
|
+ tDot11fIEtransmit_power_env single_tpe, local_tpe, reg_tpe;
|
|
|
/*
|
|
|
* PSD is power spectral density, incoming TPE could contain
|
|
|
* non PSD info, or PSD info, or both, so need to keep track of them
|
|
|
*/
|
|
|
bool use_local_tpe, non_psd_set = false, psd_set = false;
|
|
|
+ bool both_tpe_present = false;
|
|
|
+ bool local_eirp_set = false, local_psd_set = false;
|
|
|
+ bool reg_eirp_set = false, reg_psd_set = false;
|
|
|
+ uint8_t local_eirp_idx = 0, local_psd_idx = 0;
|
|
|
+ uint8_t reg_eirp_idx = 0, reg_psd_idx = 0;
|
|
|
+ uint8_t min_count = 0;
|
|
|
|
|
|
vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(session->vdev);
|
|
|
if (!vdev_mlme)
|
|
@@ -5632,34 +5644,35 @@ void lim_parse_tpe_ie(struct mac_context *mac, struct pe_session *session,
|
|
|
else if (!local_tpe_count)
|
|
|
use_local_tpe = false;
|
|
|
else
|
|
|
- use_local_tpe = wlan_mlme_is_local_tpe_pref(mac->psoc);
|
|
|
+ both_tpe_present = true;
|
|
|
|
|
|
for (i = 0; i < num_tpe_ies; i++) {
|
|
|
single_tpe = tpe_ies[i];
|
|
|
if (single_tpe.present &&
|
|
|
(single_tpe.max_tx_pwr_category == client_mobility_type)) {
|
|
|
- if (use_local_tpe) {
|
|
|
- if (single_tpe.max_tx_pwr_interpret ==
|
|
|
- LOCAL_EIRP) {
|
|
|
- non_psd_index = i;
|
|
|
- non_psd_set = true;
|
|
|
- }
|
|
|
- if (single_tpe.max_tx_pwr_interpret ==
|
|
|
- LOCAL_EIRP_PSD) {
|
|
|
- psd_index = i;
|
|
|
- psd_set = true;
|
|
|
- }
|
|
|
- } else {
|
|
|
- if (single_tpe.max_tx_pwr_interpret ==
|
|
|
- REGULATORY_CLIENT_EIRP) {
|
|
|
- non_psd_index = i;
|
|
|
- non_psd_set = true;
|
|
|
- }
|
|
|
- if (single_tpe.max_tx_pwr_interpret ==
|
|
|
- REGULATORY_CLIENT_EIRP_PSD) {
|
|
|
- psd_index = i;
|
|
|
- psd_set = true;
|
|
|
- }
|
|
|
+ if (single_tpe.max_tx_pwr_interpret == LOCAL_EIRP) {
|
|
|
+ non_psd_index = i;
|
|
|
+ non_psd_set = true;
|
|
|
+ local_eirp_idx = non_psd_index;
|
|
|
+ local_eirp_set = non_psd_set;
|
|
|
+ } else if (single_tpe.max_tx_pwr_interpret ==
|
|
|
+ LOCAL_EIRP_PSD) {
|
|
|
+ psd_index = i;
|
|
|
+ psd_set = true;
|
|
|
+ local_psd_idx = psd_index;
|
|
|
+ local_psd_set = psd_set;
|
|
|
+ } else if (single_tpe.max_tx_pwr_interpret ==
|
|
|
+ REGULATORY_CLIENT_EIRP) {
|
|
|
+ non_psd_index = i;
|
|
|
+ non_psd_set = true;
|
|
|
+ reg_eirp_idx = non_psd_index;
|
|
|
+ reg_eirp_set = non_psd_set;
|
|
|
+ } else if (single_tpe.max_tx_pwr_interpret ==
|
|
|
+ REGULATORY_CLIENT_EIRP_PSD) {
|
|
|
+ psd_index = i;
|
|
|
+ psd_set = true;
|
|
|
+ reg_psd_idx = psd_index;
|
|
|
+ reg_psd_set = psd_set;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
@@ -5761,6 +5774,35 @@ void lim_parse_tpe_ie(struct mac_context *mac, struct pe_session *session,
|
|
|
single_tpe.tx_power[single_tpe.max_tx_pwr_count];
|
|
|
vdev_mlme->reg_tpc_obj.is_psd_power = false;
|
|
|
}
|
|
|
+
|
|
|
+ if (both_tpe_present) {
|
|
|
+ pe_debug("Local: eirp: %d psd: %d, Regulatory: eirp: %d psd %d",
|
|
|
+ local_eirp_set, local_psd_set, reg_eirp_set,
|
|
|
+ reg_psd_set);
|
|
|
+ if (local_eirp_set && reg_eirp_set) {
|
|
|
+ local_tpe = tpe_ies[local_eirp_idx];
|
|
|
+ reg_tpe = tpe_ies[reg_eirp_idx];
|
|
|
+ } else if (local_psd_set && reg_psd_set) {
|
|
|
+ local_tpe = tpe_ies[local_psd_idx];
|
|
|
+ reg_tpe = tpe_ies[reg_psd_idx];
|
|
|
+ } else {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ min_count = QDF_MIN(local_tpe.max_tx_pwr_count,
|
|
|
+ reg_tpe.max_tx_pwr_count);
|
|
|
+ for (i = 0; i < min_count + 1; i++) {
|
|
|
+ if (vdev_mlme->reg_tpc_obj.tpe[i] !=
|
|
|
+ QDF_MIN(local_tpe.tx_power[i], reg_tpe.tx_power[i]))
|
|
|
+ *has_tpe_updated = true;
|
|
|
+ vdev_mlme->reg_tpc_obj.tpe[i] =
|
|
|
+ QDF_MIN(local_tpe.tx_power[i],
|
|
|
+ reg_tpe.tx_power[i]);
|
|
|
+ pe_debug("TPE: Local: %d, Reg: %d, power updated: %d",
|
|
|
+ local_tpe.tx_power[i], reg_tpe.tx_power[i],
|
|
|
+ *has_tpe_updated);
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
void lim_process_tpe_ie_from_beacon(struct mac_context *mac,
|
|
@@ -6833,7 +6875,7 @@ void lim_delete_all_peers(struct pe_session *session)
|
|
|
if (!sta_ds)
|
|
|
continue;
|
|
|
lim_mlo_notify_peer_disconn(session, sta_ds);
|
|
|
- status = lim_del_sta(mac_ctx, sta_ds, true, session);
|
|
|
+ status = lim_del_sta(mac_ctx, sta_ds, false, session);
|
|
|
if (QDF_STATUS_SUCCESS == status) {
|
|
|
lim_delete_dph_hash_entry(mac_ctx, sta_ds->staAddr,
|
|
|
sta_ds->assocId, session);
|
|
@@ -8655,6 +8697,211 @@ static void lim_process_sme_deauth_req(struct mac_context *mac_ctx,
|
|
|
__lim_process_sme_deauth_req(mac_ctx, (uint32_t *)msg->bodyptr);
|
|
|
}
|
|
|
|
|
|
+void lim_send_bcn_rsp(struct mac_context *mac_ctx, tpSendbeaconParams rsp)
|
|
|
+{
|
|
|
+ if (!rsp) {
|
|
|
+ pe_err("rsp is NULL");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ /* Success case response is sent from beacon_tx completion/timeout */
|
|
|
+ if (rsp->reason == REASON_CH_WIDTH_UPDATE &&
|
|
|
+ QDF_IS_STATUS_SUCCESS(rsp->status))
|
|
|
+ return;
|
|
|
+
|
|
|
+ pe_debug("Send beacon resp status %d for reason %d",
|
|
|
+ rsp->status, rsp->reason);
|
|
|
+
|
|
|
+ lim_nss_or_ch_width_update_rsp(mac_ctx, rsp->vdev_id,
|
|
|
+ rsp->status, rsp->reason);
|
|
|
+}
|
|
|
+
|
|
|
+static void
|
|
|
+lim_update_bcn_with_new_ch_width(struct mac_context *mac_ctx,
|
|
|
+ struct pe_session *session,
|
|
|
+ enum phy_ch_width ch_width)
|
|
|
+{
|
|
|
+ QDF_STATUS status;
|
|
|
+
|
|
|
+ session->gLimOperatingMode.present = 1;
|
|
|
+ session->gLimOperatingMode.chanWidth = ch_width;
|
|
|
+
|
|
|
+ pe_debug("ch width %d",
|
|
|
+ session->gLimOperatingMode.chanWidth);
|
|
|
+
|
|
|
+ session->bw_update_include_ch_sw_ie = true;
|
|
|
+ status = qdf_mc_timer_start(&session->ap_ecsa_timer,
|
|
|
+ MAX_WAIT_FOR_CH_WIDTH_UPDATE_COMPLETE);
|
|
|
+ if (QDF_IS_STATUS_ERROR(status))
|
|
|
+ pe_err("cannot start ap_ecsa_timer");
|
|
|
+
|
|
|
+ /* Send nss update request from here */
|
|
|
+ status = sch_set_fixed_beacon_fields(mac_ctx, session);
|
|
|
+ if (QDF_IS_STATUS_ERROR(status)) {
|
|
|
+ pe_err("Unable to set op mode IE in beacon");
|
|
|
+ goto end;
|
|
|
+ }
|
|
|
+
|
|
|
+ status = lim_send_beacon_ind(mac_ctx, session,
|
|
|
+ REASON_CH_WIDTH_UPDATE);
|
|
|
+ if (QDF_IS_STATUS_SUCCESS(status))
|
|
|
+ return;
|
|
|
+
|
|
|
+ pe_err("Unable to send beacon");
|
|
|
+end:
|
|
|
+ /*
|
|
|
+ * send resp only in case of failure,
|
|
|
+ * success case response will be from wma.
|
|
|
+ */
|
|
|
+ lim_nss_or_ch_width_update_rsp(mac_ctx, session->vdev_id, status,
|
|
|
+ REASON_CH_WIDTH_UPDATE);
|
|
|
+}
|
|
|
+
|
|
|
+static enum phy_ch_width
|
|
|
+lim_calculate_peer_ch_width(struct pe_session *session,
|
|
|
+ uint8_t *mac_addr,
|
|
|
+ enum phy_ch_width new_ch_width)
|
|
|
+{
|
|
|
+ enum phy_ch_width peer_org_bw, updated_bw;
|
|
|
+ struct peer_oper_mode_event data = {0};
|
|
|
+ QDF_STATUS status;
|
|
|
+
|
|
|
+ peer_org_bw = wlan_mlme_get_peer_ch_width(
|
|
|
+ wlan_vdev_get_psoc(session->vdev), mac_addr);
|
|
|
+
|
|
|
+ updated_bw = new_ch_width;
|
|
|
+
|
|
|
+ qdf_mem_copy(&data.peer_mac_address.bytes, mac_addr, QDF_MAC_ADDR_SIZE);
|
|
|
+ status = wlan_mlme_get_peer_indicated_ch_width(
|
|
|
+ wlan_vdev_get_psoc(session->vdev), &data);
|
|
|
+ if (QDF_IS_STATUS_SUCCESS(status))
|
|
|
+ updated_bw = data.new_bw;
|
|
|
+
|
|
|
+ pe_debug("Peer: " QDF_MAC_ADDR_FMT " original bw: %d, updated bw: %d, new bw: %d",
|
|
|
+ QDF_MAC_ADDR_REF(mac_addr), peer_org_bw, updated_bw,
|
|
|
+ new_ch_width);
|
|
|
+
|
|
|
+ return qdf_min(peer_org_bw, qdf_min(updated_bw, new_ch_width));
|
|
|
+}
|
|
|
+
|
|
|
+static void
|
|
|
+lim_update_new_ch_width_to_fw(struct mac_context *mac_ctx,
|
|
|
+ struct pe_session *session,
|
|
|
+ enum phy_ch_width ch_bandwidth)
|
|
|
+{
|
|
|
+ uint8_t i;
|
|
|
+ tpDphHashNode psta;
|
|
|
+ tUpdateVHTOpMode params;
|
|
|
+
|
|
|
+ wlan_mlme_set_ap_oper_ch_width(session->vdev, ch_bandwidth);
|
|
|
+
|
|
|
+ for (i = 0; i <= mac_ctx->lim.max_sta_of_pe_session; i++) {
|
|
|
+ psta = session->dph.dphHashTable.pDphNodeArray + i;
|
|
|
+ if (!psta || !psta->added)
|
|
|
+ continue;
|
|
|
+
|
|
|
+ params.opMode = lim_calculate_peer_ch_width(session,
|
|
|
+ psta->staAddr, ch_bandwidth);
|
|
|
+ params.smesessionId = session->smeSessionId;
|
|
|
+ qdf_mem_copy(params.peer_mac, psta->staAddr,
|
|
|
+ sizeof(tSirMacAddr));
|
|
|
+
|
|
|
+ lim_send_mode_update(mac_ctx, ¶ms, session);
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * lim_process_sap_ch_width_update() - process sme nss update req
|
|
|
+ *
|
|
|
+ * @mac_ctx: Pointer to Global MAC structure
|
|
|
+ * @msg_buf: pointer to the SME message buffer
|
|
|
+ *
|
|
|
+ * This function processes SME request messages from HDD or upper layer
|
|
|
+ * application.
|
|
|
+ *
|
|
|
+ * Return: None
|
|
|
+ */
|
|
|
+static void
|
|
|
+lim_process_sap_ch_width_update(struct mac_context *mac_ctx,
|
|
|
+ uint32_t *msg_buf)
|
|
|
+{
|
|
|
+ struct sir_sap_ch_width_update *req;
|
|
|
+ struct pe_session *session = NULL;
|
|
|
+ uint8_t vdev_id;
|
|
|
+ struct sir_bcn_update_rsp *param;
|
|
|
+ struct scheduler_msg msg_return = {0};
|
|
|
+ uint8_t primary_channel;
|
|
|
+ struct ch_params ch_params = {0};
|
|
|
+
|
|
|
+ if (!msg_buf) {
|
|
|
+ pe_err("Buffer is Pointing to NULL");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ req = (struct sir_sap_ch_width_update *)msg_buf;
|
|
|
+ vdev_id = req->vdev_id;
|
|
|
+ session = pe_find_session_by_vdev_id(mac_ctx, req->vdev_id);
|
|
|
+ if (!session) {
|
|
|
+ pe_err("vdev %d session not found", req->vdev_id);
|
|
|
+ goto fail;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (session->opmode != QDF_SAP_MODE) {
|
|
|
+ pe_err("Invalid opmode %d", session->opmode);
|
|
|
+ goto fail;
|
|
|
+ }
|
|
|
+
|
|
|
+ ch_params.ch_width = req->ch_width;
|
|
|
+ wlan_reg_set_channel_params_for_pwrmode(mac_ctx->pdev,
|
|
|
+ session->curr_op_freq,
|
|
|
+ 0,
|
|
|
+ &ch_params,
|
|
|
+ REG_CURRENT_PWR_MODE);
|
|
|
+
|
|
|
+ session->gLimChannelSwitch.switchCount = 1;
|
|
|
+ session->gLimChannelSwitch.sw_target_freq = session->curr_op_freq;
|
|
|
+ primary_channel = wlan_reg_freq_to_chan(mac_ctx->pdev,
|
|
|
+ session->curr_op_freq);
|
|
|
+ session->gLimChannelSwitch.primaryChannel = primary_channel;
|
|
|
+ session->gLimChannelSwitch.ch_width = req->ch_width;
|
|
|
+ session->gLimChannelSwitch.ch_center_freq_seg0 =
|
|
|
+ ch_params.center_freq_seg0;
|
|
|
+ session->gLimChannelSwitch.ch_center_freq_seg1 =
|
|
|
+ ch_params.center_freq_seg1;
|
|
|
+
|
|
|
+ wlan_mlme_set_ap_oper_ch_width(session->vdev, req->ch_width);
|
|
|
+
|
|
|
+ /* Send ECSA to the peers */
|
|
|
+ send_extended_chan_switch_action_frame(mac_ctx,
|
|
|
+ session->curr_op_freq,
|
|
|
+ req->ch_width, session);
|
|
|
+
|
|
|
+ /* Send beacon template to firmware */
|
|
|
+ lim_update_bcn_with_new_ch_width(mac_ctx, session, req->ch_width);
|
|
|
+ /* Send updated bw info of each peer to firmware */
|
|
|
+ lim_update_new_ch_width_to_fw(mac_ctx, session, req->ch_width);
|
|
|
+
|
|
|
+ /*
|
|
|
+ * Release the SER command only after this, otherwise it may cause
|
|
|
+ * out of sync issues if any other WMI commands go to fw
|
|
|
+ */
|
|
|
+ return;
|
|
|
+
|
|
|
+fail:
|
|
|
+ param = qdf_mem_malloc(sizeof(*param));
|
|
|
+ if (!param)
|
|
|
+ return;
|
|
|
+
|
|
|
+ pe_err("vdev %d: send bandwidth update fail", vdev_id);
|
|
|
+ param->status = QDF_STATUS_E_FAILURE;
|
|
|
+ param->vdev_id = INVALID_VDEV_ID;
|
|
|
+ param->reason = REASON_CH_WIDTH_UPDATE;
|
|
|
+ msg_return.type = eWNI_SME_SAP_CH_WIDTH_UPDATE_RSP;
|
|
|
+ msg_return.bodyptr = param;
|
|
|
+ msg_return.bodyval = 0;
|
|
|
+ sys_process_mmh_msg(mac_ctx, &msg_return);
|
|
|
+}
|
|
|
+
|
|
|
/**
|
|
|
* lim_process_sme_req_messages()
|
|
|
*
|
|
@@ -8864,6 +9111,9 @@ bool lim_process_sme_req_messages(struct mac_context *mac,
|
|
|
lim_process_sme_send_vdev_pause(mac,
|
|
|
(struct sme_vdev_pause *)msg_buf);
|
|
|
break;
|
|
|
+ case eWNI_SME_SAP_CH_WIDTH_UPDATE_REQ:
|
|
|
+ lim_process_sap_ch_width_update(mac, msg_buf);
|
|
|
+ break;
|
|
|
default:
|
|
|
qdf_mem_free((void *)pMsg->bodyptr);
|
|
|
pMsg->bodyptr = NULL;
|
|
@@ -9479,36 +9729,42 @@ void send_extended_chan_switch_action_frame(struct mac_context *mac_ctx,
|
|
|
uint8_t op_class = 0;
|
|
|
uint8_t switch_mode = 0, i;
|
|
|
tpDphHashNode psta;
|
|
|
- uint8_t switch_count;
|
|
|
uint8_t new_channel = 0;
|
|
|
+ enum phy_ch_width ch_width;
|
|
|
+ tLimChannelSwitchInfo *ch_switch = &session_entry->gLimChannelSwitch;
|
|
|
|
|
|
op_class =
|
|
|
lim_op_class_from_bandwidth(mac_ctx, new_channel_freq,
|
|
|
ch_bandwidth,
|
|
|
- session_entry->gLimChannelSwitch.sec_ch_offset);
|
|
|
+ ch_switch->sec_ch_offset);
|
|
|
new_channel = wlan_reg_freq_to_chan(mac_ctx->pdev, new_channel_freq);
|
|
|
if (LIM_IS_AP_ROLE(session_entry) &&
|
|
|
(mac_ctx->sap.SapDfsInfo.disable_dfs_ch_switch == false))
|
|
|
- switch_mode = session_entry->gLimChannelSwitch.switchMode;
|
|
|
-
|
|
|
- switch_count = session_entry->gLimChannelSwitch.switchCount;
|
|
|
+ switch_mode = ch_switch->switchMode;
|
|
|
|
|
|
if (LIM_IS_AP_ROLE(session_entry)) {
|
|
|
for (i = 0; i <= mac_ctx->lim.max_sta_of_pe_session; i++) {
|
|
|
psta =
|
|
|
session_entry->dph.dphHashTable.pDphNodeArray + i;
|
|
|
- if (psta && psta->added)
|
|
|
- lim_send_extended_chan_switch_action_frame(
|
|
|
- mac_ctx,
|
|
|
- psta->staAddr,
|
|
|
+ if (!psta || !psta->added)
|
|
|
+ continue;
|
|
|
+ ch_width = lim_calculate_peer_ch_width(session_entry,
|
|
|
+ psta->staAddr,
|
|
|
+ ch_bandwidth);
|
|
|
+ op_class = lim_op_class_from_bandwidth(mac_ctx,
|
|
|
+ new_channel_freq, ch_width,
|
|
|
+ ch_switch->sec_ch_offset);
|
|
|
+ lim_send_extended_chan_switch_action_frame(
|
|
|
+ mac_ctx, psta->staAddr,
|
|
|
switch_mode, op_class, new_channel,
|
|
|
- switch_count, session_entry);
|
|
|
+ ch_switch->switchCount, session_entry);
|
|
|
}
|
|
|
} else if (LIM_IS_STA_ROLE(session_entry)) {
|
|
|
lim_send_extended_chan_switch_action_frame(mac_ctx,
|
|
|
session_entry->bssId,
|
|
|
switch_mode, op_class, new_channel,
|
|
|
- switch_count, session_entry);
|
|
|
+ ch_switch->switchCount,
|
|
|
+ session_entry);
|
|
|
}
|
|
|
|
|
|
}
|
|
@@ -9786,52 +10042,6 @@ static void lim_process_ext_change_channel(struct mac_context *mac_ctx,
|
|
|
session_entry);
|
|
|
}
|
|
|
|
|
|
-/**
|
|
|
- * lim_nss_update_rsp() - send NSS update response to SME
|
|
|
- * @mac_ctx Pointer to Global MAC structure
|
|
|
- * @vdev_id: vdev id
|
|
|
- * @status: nss update status
|
|
|
- *
|
|
|
- * Return: None
|
|
|
- */
|
|
|
-static void lim_nss_update_rsp(struct mac_context *mac_ctx,
|
|
|
- uint8_t vdev_id, QDF_STATUS status)
|
|
|
-{
|
|
|
- struct scheduler_msg msg = {0};
|
|
|
- struct sir_bcn_update_rsp *nss_rsp;
|
|
|
- QDF_STATUS qdf_status;
|
|
|
-
|
|
|
- nss_rsp = qdf_mem_malloc(sizeof(*nss_rsp));
|
|
|
- if (!nss_rsp)
|
|
|
- return;
|
|
|
-
|
|
|
- nss_rsp->vdev_id = vdev_id;
|
|
|
- nss_rsp->status = status;
|
|
|
- nss_rsp->reason = REASON_NSS_UPDATE;
|
|
|
-
|
|
|
- msg.type = eWNI_SME_NSS_UPDATE_RSP;
|
|
|
- msg.bodyptr = nss_rsp;
|
|
|
- msg.bodyval = 0;
|
|
|
- qdf_status = scheduler_post_message(QDF_MODULE_ID_PE, QDF_MODULE_ID_SME,
|
|
|
- QDF_MODULE_ID_SME, &msg);
|
|
|
- if (QDF_IS_STATUS_ERROR(qdf_status))
|
|
|
- qdf_mem_free(nss_rsp);
|
|
|
-}
|
|
|
-
|
|
|
-void lim_send_bcn_rsp(struct mac_context *mac_ctx, tpSendbeaconParams rsp)
|
|
|
-{
|
|
|
- if (!rsp) {
|
|
|
- pe_err("rsp is NULL");
|
|
|
- return;
|
|
|
- }
|
|
|
-
|
|
|
- pe_debug("Send beacon resp status %d for reason %d",
|
|
|
- rsp->status, rsp->reason);
|
|
|
-
|
|
|
- if (rsp->reason == REASON_NSS_UPDATE)
|
|
|
- lim_nss_update_rsp(mac_ctx, rsp->vdev_id, rsp->status);
|
|
|
-}
|
|
|
-
|
|
|
/**
|
|
|
* lim_process_nss_update_request() - process sme nss update req
|
|
|
*
|
|
@@ -9907,7 +10117,8 @@ end:
|
|
|
* send resp only in case of failure,
|
|
|
* success case response will be from wma.
|
|
|
*/
|
|
|
- lim_nss_update_rsp(mac_ctx, vdev_id, status);
|
|
|
+ lim_nss_or_ch_width_update_rsp(mac_ctx, vdev_id, status,
|
|
|
+ REASON_NSS_UPDATE);
|
|
|
}
|
|
|
|
|
|
/**
|