|
@@ -5187,6 +5187,260 @@ void lim_set_vht_caps(struct mac_context *p_mac, struct pe_session *p_session_en
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+/*
|
|
|
+ * Firmware will send RTS for every frame and also will disable SIFS bursting
|
|
|
+ * if value 0x11 is sent for RTS profile.
|
|
|
+ */
|
|
|
+#define A_EDCA_SCC_RTS_PROFILE_VALUE 0x11
|
|
|
+#define MAX_NUMBER_OF_SINGLE_PORT_CONC_CONNECTIONS 2
|
|
|
+
|
|
|
+static void lim_update_sta_edca_params(struct mac_context *mac,
|
|
|
+ struct pe_session *sta_session)
|
|
|
+{
|
|
|
+ uint8_t i;
|
|
|
+
|
|
|
+ for (i = QCA_WLAN_AC_BE; i < QCA_WLAN_AC_ALL; i++) {
|
|
|
+ sta_session->gLimEdcaParamsActive[i] =
|
|
|
+ sta_session->gLimEdcaParams[i];
|
|
|
+ }
|
|
|
+ lim_send_edca_params(mac,
|
|
|
+ sta_session->gLimEdcaParamsActive,
|
|
|
+ sta_session->vdev_id, false);
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * lim_check_conc_and_send_edca() - Function to check and update EDCA params
|
|
|
+ * and RTS profile based on STA/SAP
|
|
|
+ * concurrency. If updated, it will also send
|
|
|
+ * the updated parameters to FW. It will update
|
|
|
+ * EDCA params and RTS profile such that:
|
|
|
+ * 1) For STA and SAP concurrency, send STA's AP EDCA params to fw.
|
|
|
+ * Also, for SAP or P2P Go, update the value in Broadcast EDCA params
|
|
|
+ * as well so that it should be broadcasted to other stations connected
|
|
|
+ * to that BSS. Also, update the RTS profile value to 0x11 for which
|
|
|
+ * FW will send RTS for every frame and will also disable SIFS
|
|
|
+ * bursting.
|
|
|
+ *
|
|
|
+ * 2) For standalone STA (can even happen after SAP/P2P Go
|
|
|
+ * disconnects), if the parameters are updated, reset them to original
|
|
|
+ * parameters and send them to FW. Also, update the RTS profile
|
|
|
+ * value to which it was set before.
|
|
|
+ *
|
|
|
+ * 3) For standalone SAP (can even happen after STA disconnects),
|
|
|
+ * if the parameters are updated, reset them to original
|
|
|
+ * parameters and send them to FW and reset the Broadcast EDCA params
|
|
|
+ * as well so that it should be broadcasted to other stations connected
|
|
|
+ * to that BSS Also, update the RTS profile value to which it was set
|
|
|
+ * before.
|
|
|
+ *
|
|
|
+ * This update is needed because throughput drop was seen because of
|
|
|
+ * inconsistency in the EDCA params used in STA-SAP or STA-P2P_GO concurrency.
|
|
|
+ *
|
|
|
+ * Return: void
|
|
|
+ */
|
|
|
+
|
|
|
+static void lim_check_conc_and_send_edca(struct mac_context *mac,
|
|
|
+ struct pe_session *sta_session,
|
|
|
+ struct pe_session *sap_session)
|
|
|
+{
|
|
|
+ bool params_update_required = false;
|
|
|
+ uint8_t i;
|
|
|
+ tpDphHashNode sta_ds = NULL;
|
|
|
+ QDF_STATUS status;
|
|
|
+ uint16_t assoc_id;
|
|
|
+
|
|
|
+ if (sta_session && sap_session &&
|
|
|
+ (sta_session->curr_op_freq ==
|
|
|
+ sap_session->curr_op_freq)) {
|
|
|
+ /* RTS profile update to FW */
|
|
|
+ wma_cli_set_command(sap_session->vdev_id,
|
|
|
+ WMI_VDEV_PARAM_ENABLE_RTSCTS,
|
|
|
+ A_EDCA_SCC_RTS_PROFILE_VALUE,
|
|
|
+ VDEV_CMD);
|
|
|
+ wma_cli_set_command(sta_session->vdev_id,
|
|
|
+ WMI_VDEV_PARAM_ENABLE_RTSCTS,
|
|
|
+ A_EDCA_SCC_RTS_PROFILE_VALUE,
|
|
|
+ VDEV_CMD);
|
|
|
+
|
|
|
+ sta_ds = dph_lookup_hash_entry(mac,
|
|
|
+ sta_session->bssId,
|
|
|
+ &assoc_id,
|
|
|
+ &sta_session->dph.dphHashTable);
|
|
|
+
|
|
|
+ if (!sta_ds) {
|
|
|
+ pe_debug("No STA DS entry found for " QDF_MAC_ADDR_FMT,
|
|
|
+ QDF_MAC_ADDR_REF(sta_session->bssId));
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (!sta_ds->qos.peer_edca_params.length) {
|
|
|
+ pe_debug("No sta_ds edca_params present");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ /*
|
|
|
+ * Here what we do is disable A-EDCA by sending the edca params of
|
|
|
+ * connected AP which we got as part of assoc resp So as these EDCA
|
|
|
+ * params are updated per mac , its fine to send for SAP which will
|
|
|
+ * be used for STA as well on the same channel. No need to send for
|
|
|
+ * both SAP and STA.
|
|
|
+ */
|
|
|
+
|
|
|
+ sap_session->gLimEdcaParamsBC[QCA_WLAN_AC_BE] =
|
|
|
+ sta_ds->qos.peer_edca_params.acbe;
|
|
|
+ sap_session->gLimEdcaParamsBC[QCA_WLAN_AC_BK] =
|
|
|
+ sta_ds->qos.peer_edca_params.acbk;
|
|
|
+ sap_session->gLimEdcaParamsBC[QCA_WLAN_AC_VI] =
|
|
|
+ sta_ds->qos.peer_edca_params.acvi;
|
|
|
+ sap_session->gLimEdcaParamsBC[QCA_WLAN_AC_VO] =
|
|
|
+ sta_ds->qos.peer_edca_params.acvo;
|
|
|
+
|
|
|
+ sap_session->gLimEdcaParamsActive[QCA_WLAN_AC_BE] =
|
|
|
+ sta_ds->qos.peer_edca_params.acbe;
|
|
|
+ sap_session->gLimEdcaParamsActive[QCA_WLAN_AC_BK] =
|
|
|
+ sta_ds->qos.peer_edca_params.acbk;
|
|
|
+ sap_session->gLimEdcaParamsActive[QCA_WLAN_AC_VI] =
|
|
|
+ sta_ds->qos.peer_edca_params.acvi;
|
|
|
+ sap_session->gLimEdcaParamsActive[QCA_WLAN_AC_VO] =
|
|
|
+ sta_ds->qos.peer_edca_params.acvo;
|
|
|
+
|
|
|
+ for (i = QCA_WLAN_AC_BE; i < QCA_WLAN_AC_ALL; i++) {
|
|
|
+ sta_session->gLimEdcaParamsActive[i] =
|
|
|
+ sap_session->gLimEdcaParamsActive[i];
|
|
|
+ }
|
|
|
+ /* For AP, the bssID is stored in LIM Global context. */
|
|
|
+ lim_send_edca_params(mac, sap_session->gLimEdcaParamsActive,
|
|
|
+ sap_session->vdev_id, false);
|
|
|
+
|
|
|
+ sap_session->gLimEdcaParamSetCount++;
|
|
|
+ status = sch_set_fixed_beacon_fields(mac, sap_session);
|
|
|
+ if (QDF_IS_STATUS_ERROR(status))
|
|
|
+ pe_debug("Unable to set beacon fields!");
|
|
|
+
|
|
|
+ } else if (!sap_session && sta_session) {
|
|
|
+ /*
|
|
|
+ * Enable A-EDCA for standalone STA. The original EDCA parameters are
|
|
|
+ * stored in gLimEdcaParams (computed by sch_beacon_edca_process()),
|
|
|
+ * if active parameters are not equal that means they have been updated
|
|
|
+ * because of conncurrency and are need to be restored now
|
|
|
+ */
|
|
|
+
|
|
|
+ wma_cli_set_command(sta_session->vdev_id,
|
|
|
+ WMI_VDEV_PARAM_ENABLE_RTSCTS,
|
|
|
+ cfg_get(mac->psoc,
|
|
|
+ CFG_ENABLE_FW_RTS_PROFILE),
|
|
|
+ VDEV_CMD);
|
|
|
+ for (i = QCA_WLAN_AC_BE; i < QCA_WLAN_AC_ALL; i++) {
|
|
|
+ if (qdf_mem_cmp(&sta_session->gLimEdcaParamsActive[i],
|
|
|
+ &sta_session->gLimEdcaParams[i],
|
|
|
+ sizeof(tSirMacEdcaParamRecord))) {
|
|
|
+ pe_debug("local sta EDCA params are not equal to Active EDCA params, hence update required");
|
|
|
+ params_update_required = true;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if (params_update_required) {
|
|
|
+ lim_update_sta_edca_params(mac,
|
|
|
+ sta_session);
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ /*
|
|
|
+ * For STA+SAP/GO DBS, STA+SAP/GO MCC or standalone SAP/GO
|
|
|
+ */
|
|
|
+
|
|
|
+ wma_cli_set_command(sap_session->vdev_id,
|
|
|
+ WMI_VDEV_PARAM_ENABLE_RTSCTS,
|
|
|
+ cfg_get(mac->psoc,
|
|
|
+ CFG_ENABLE_FW_RTS_PROFILE),
|
|
|
+ VDEV_CMD);
|
|
|
+ if (sta_session)
|
|
|
+ wma_cli_set_command(sta_session->vdev_id,
|
|
|
+ WMI_VDEV_PARAM_ENABLE_RTSCTS,
|
|
|
+ cfg_get(mac->psoc,
|
|
|
+ CFG_ENABLE_FW_RTS_PROFILE),
|
|
|
+ VDEV_CMD);
|
|
|
+
|
|
|
+ for (i = QCA_WLAN_AC_BE; i < QCA_WLAN_AC_ALL; i++) {
|
|
|
+ if (qdf_mem_cmp(&sap_session->gLimEdcaParamsActive[i],
|
|
|
+ &sap_session->gLimEdcaParams[i],
|
|
|
+ sizeof(tSirMacEdcaParamRecord))) {
|
|
|
+ pe_debug("local sap EDCA params are not equal to Active EDCA params, hence update required");
|
|
|
+ params_update_required = true;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if (params_update_required) {
|
|
|
+ for (i = QCA_WLAN_AC_BE; i < QCA_WLAN_AC_ALL; i++) {
|
|
|
+ sap_session->gLimEdcaParamsActive[i] =
|
|
|
+ sap_session->gLimEdcaParams[i];
|
|
|
+ }
|
|
|
+ lim_send_edca_params(mac,
|
|
|
+ sap_session->gLimEdcaParamsActive,
|
|
|
+ sap_session->vdev_id, false);
|
|
|
+ sch_qos_update_broadcast(mac, sap_session);
|
|
|
+
|
|
|
+ /*
|
|
|
+ * In case of mcc, where cb can come from scc to mcc swtich where we
|
|
|
+ * need to restore the default parameters
|
|
|
+ */
|
|
|
+ if (sta_session) {
|
|
|
+ lim_update_sta_edca_params(mac,
|
|
|
+ sta_session);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+void lim_send_conc_params_update(void)
|
|
|
+{
|
|
|
+ struct pe_session *sta_session = NULL;
|
|
|
+ struct pe_session *sap_session = NULL;
|
|
|
+ uint8_t i;
|
|
|
+ struct mac_context *mac = cds_get_context(QDF_MODULE_ID_PE);
|
|
|
+
|
|
|
+ if (!mac->mlme_cfg->edca_params.enable_edca_params ||
|
|
|
+ (policy_mgr_get_connection_count(mac->psoc) >
|
|
|
+ MAX_NUMBER_OF_SINGLE_PORT_CONC_CONNECTIONS)) {
|
|
|
+ pe_debug("A-EDCA not enabled or max number of connections: %d",
|
|
|
+ policy_mgr_get_connection_count(mac->psoc));
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ for (i = 0; i < mac->lim.maxBssId; i++) {
|
|
|
+ /*
|
|
|
+ * Finding whether STA or Go session exists
|
|
|
+ */
|
|
|
+ if (sta_session && sap_session)
|
|
|
+ break;
|
|
|
+
|
|
|
+ if ((mac->lim.gpSession[i].valid) &&
|
|
|
+ (mac->lim.gpSession[i].limSystemRole ==
|
|
|
+ eLIM_STA_ROLE)) {
|
|
|
+ sta_session = &mac->lim.gpSession[i];
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ if ((mac->lim.gpSession[i].valid) &&
|
|
|
+ ((mac->lim.gpSession[i].limSystemRole == eLIM_AP_ROLE) ||
|
|
|
+ (mac->lim.gpSession[i].limSystemRole ==
|
|
|
+ eLIM_P2P_DEVICE_GO))) {
|
|
|
+ sap_session = &mac->lim.gpSession[i];
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if (!(sta_session || sap_session)) {
|
|
|
+ pe_debug("No sta or sap or P2P go session");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ pe_debug("Valid STA session: %d Valid SAP session: %d",
|
|
|
+ (sta_session ? sta_session->valid : 0),
|
|
|
+ (sap_session ? sap_session->valid : 0));
|
|
|
+ lim_check_conc_and_send_edca(mac, sta_session, sap_session);
|
|
|
+}
|
|
|
+
|
|
|
/**
|
|
|
* lim_validate_received_frame_a1_addr() - To validate received frame's A1 addr
|
|
|
* @mac_ctx: pointer to mac context
|