ソースを参照

qcacld-3.0: Properly update channel width and bonding parameters

Currently as part of application triggered channel switch both the
channel bandwith and bonding mode are limited to 20MHz.
Change made to properly update the channel width and bonding
parameters.

Change-Id: I48297eed74c9e3bfed6fefa67f664f3503fac1f6
CRs-Fixed: 944647
Edhar, Mahesh Kumar 9 年 前
コミット
bd8b391bf5
1 ファイル変更133 行追加28 行削除
  1. 133 28
      core/sap/src/sap_module.c

+ 133 - 28
core/sap/src/sap_module.c

@@ -1394,6 +1394,133 @@ CDF_STATUS wlansap_deauth_sta(void *pCtx,
 	return cdf_status;
 }
 
+/**
+ * wlansap_update_bw80_cbmode() - fucntion to update channel bonding mode for
+ *                                VHT80 channel.
+ * @channel: target channel
+ * @sme_config: sme configuration context
+ *
+ * Return: none
+ */
+static inline void wlansap_update_bw80_cbmode(uint32_t channel,
+		tSmeConfigParams *sme_config)
+{
+	if (channel == 36 || channel == 52 || channel == 100 ||
+		channel == 116 || channel == 149 || channel == 132) {
+		sme_config->csrConfig.channelBondingMode5GHz =
+			eCSR_INI_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_LOW;
+	} else if (channel == 40 || channel == 56 || channel == 104 ||
+			channel == 120 || channel == 153 || channel == 136) {
+		sme_config->csrConfig.channelBondingMode5GHz =
+			eCSR_INI_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_LOW;
+	} else if (channel == 44 || channel == 60 || channel == 108 ||
+			channel == 124 || channel == 157 || channel == 140) {
+		sme_config->csrConfig.channelBondingMode5GHz =
+			eCSR_INI_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_HIGH;
+	} else if (channel == 48 || channel == 64 || channel == 112 ||
+		channel == 128 || channel == 144 || channel == 161) {
+		sme_config->csrConfig.channelBondingMode5GHz =
+			eCSR_INI_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_HIGH;
+	}
+}
+
+/**
+ * wlansap_update_csa_channel_params() - fucntion to populate channel width and
+ *                                        bonding modes.
+ * @sap_context: sap adapter context
+ * @channel: target channel
+ *
+ * Return: The CDF_STATUS code associated with performing the operation
+ */
+static CDF_STATUS wlansap_update_csa_channel_params(ptSapContext sap_context,
+	uint32_t channel)
+{
+	void *hal;
+	tpAniSirGlobal mac_ctx;
+	tSmeConfigParams *sme_config;
+	uint8_t bw;
+
+	hal = CDS_GET_HAL_CB(sap_context->p_cds_gctx);
+	if (!hal) {
+		CDF_TRACE(CDF_MODULE_ID_SAP, CDF_TRACE_LEVEL_ERROR,
+			"%s: Invalid hal pointer from p_cds_gctx", __func__);
+		return CDF_STATUS_E_FAULT;
+	}
+
+	mac_ctx = PMAC_STRUCT(hal);
+
+	sme_config = cdf_mem_malloc(sizeof(*sme_config));
+	if (!sme_config) {
+		CDF_TRACE(CDF_MODULE_ID_SAP, CDF_TRACE_LEVEL_ERROR,
+			FL("memory allocation failed for sme_config"));
+		return CDF_STATUS_E_NOMEM;
+	}
+
+	sme_get_config_param(mac_ctx, sme_config);
+	if (channel <= RF_CHAN_14) {
+		/*
+		 * currently OBSS scan is done in hostapd, so to avoid
+		 * SAP coming up in HT40 on channel switch we are
+		 * disabling channel bonding in 2.4Ghz.
+		 */
+		sme_config->csrConfig.channelBondingMode24GHz =
+			eCSR_INI_SINGLE_CHANNEL_CENTERED;
+		mac_ctx->sap.SapDfsInfo.new_cbMode = 0;
+		mac_ctx->sap.SapDfsInfo.new_chanWidth = 0;
+
+	} else {
+
+		if (sap_context->ch_width_orig >= CH_WIDTH_80MHZ)
+			bw = BW80;
+		else if (sap_context->ch_width_orig == CH_WIDTH_40MHZ)
+			bw = BW40_HIGH_PRIMARY;
+		else
+			bw = BW20;
+
+		for (; bw >= BW20; bw--) {
+			uint16_t op_class;
+
+			op_class = cds_regdm_get_opclass_from_channel(
+					mac_ctx->scan.countryCodeCurrent,
+					channel, bw);
+			if (!op_class)
+				continue;
+
+			if (bw == BW80) {
+				wlansap_update_bw80_cbmode(channel, sme_config);
+				mac_ctx->sap.SapDfsInfo.new_cbMode =
+				   sme_config->csrConfig.channelBondingMode5GHz;
+				mac_ctx->sap.SapDfsInfo.new_chanWidth =
+					CH_WIDTH_80MHZ;
+			} else if (bw == BW40_HIGH_PRIMARY) {
+				mac_ctx->sap.SapDfsInfo.new_chanWidth =
+					CH_WIDTH_40MHZ;
+				sme_config->csrConfig.channelBondingMode5GHz =
+				mac_ctx->sap.SapDfsInfo.new_cbMode =
+				   eCSR_INI_DOUBLE_CHANNEL_HIGH_PRIMARY;
+			} else if (bw == BW40_LOW_PRIMARY) {
+				mac_ctx->sap.SapDfsInfo.new_chanWidth =
+				   CH_WIDTH_40MHZ;
+				sme_config->csrConfig.channelBondingMode5GHz =
+				mac_ctx->sap.SapDfsInfo.new_cbMode =
+				   eCSR_INI_DOUBLE_CHANNEL_LOW_PRIMARY;
+			} else {
+				mac_ctx->sap.SapDfsInfo.new_chanWidth =
+				   CH_WIDTH_20MHZ;
+				sme_config->csrConfig.channelBondingMode5GHz =
+				mac_ctx->sap.SapDfsInfo.new_cbMode =
+				   eCSR_INI_SINGLE_CHANNEL_CENTERED;
+			}
+			break;
+		}
+
+	}
+
+	sme_update_config(mac_ctx, sme_config);
+	cdf_mem_free(sme_config);
+	return CDF_STATUS_SUCCESS;
+}
+
 /*==========================================================================
    FUNCTION    wlansap_set_channel_change_with_csa
 
@@ -1427,7 +1554,7 @@ wlansap_set_channel_change_with_csa(void *p_cds_gctx, uint32_t targetChannel)
 	tpAniSirGlobal pMac = NULL;
 	void *hHal = NULL;
 	bool valid;
-	tSmeConfigParams *sme_config;
+	CDF_STATUS status;
 
 	sapContext = CDS_GET_SAP_CB(p_cds_gctx);
 	if (NULL == sapContext) {
@@ -1436,6 +1563,7 @@ wlansap_set_channel_change_with_csa(void *p_cds_gctx, uint32_t targetChannel)
 
 		return CDF_STATUS_E_FAULT;
 	}
+
 	hHal = CDS_GET_HAL_CB(sapContext->p_cds_gctx);
 	if (NULL == hHal) {
 		CDF_TRACE(CDF_MODULE_ID_SAP, CDF_TRACE_LEVEL_ERROR,
@@ -1473,39 +1601,16 @@ wlansap_set_channel_change_with_csa(void *p_cds_gctx, uint32_t targetChannel)
 		 * state.
 		 */
 		if (eSAP_STARTED == sapContext->sapsMachine) {
-			/*
-			 * currently OBSS scan is done in hostapd, so to avoid
-			 * SAP coming up in HT40 on channel switch we are
-			 * disabling channel bonding in 2.4Ghz.
-			 */
-			if (targetChannel <= RF_CHAN_14) {
-				sme_config =
-					cdf_mem_malloc(sizeof(*sme_config));
-				if (!sme_config) {
-					CDF_TRACE(CDF_MODULE_ID_SAP,
-						CDF_TRACE_LEVEL_ERROR,
-						FL("memory allocation failed for sme_config"));
-					return CDF_STATUS_E_NOMEM;
-				}
-				sme_get_config_param(pMac, sme_config);
-				sme_config->csrConfig.channelBondingMode24GHz =
-					eCSR_INI_SINGLE_CHANNEL_CENTERED;
-				sme_update_config(pMac, sme_config);
-				cdf_mem_free(sme_config);
-			}
+			status = wlansap_update_csa_channel_params(sapContext,
+					targetChannel);
+			if (status != CDF_STATUS_SUCCESS)
+				return status;
 
 			/*
 			 * Copy the requested target channel
 			 * to sap context.
 			 */
 			pMac->sap.SapDfsInfo.target_channel = targetChannel;
-			/*
-			 * TODO: need to identify the allowed channel width and
-			 * bonding mode.
-			 */
-			pMac->sap.SapDfsInfo.new_chanWidth = 0;
-			pMac->sap.SapDfsInfo.new_cbMode = 0;
-
 			/*
 			 * Set the CSA IE required flag.
 			 */