Bläddra i källkod

qcacld-3.0: Fix cac duration issue with weather channel

Make sure to update cac duration correctly if any of the
bonded channel is weather channel.

Change-Id: If96654427abd32757a592a1e89113c185127f221
CRs-Fixed: 2034640
Arif Hussain 8 år sedan
förälder
incheckning
72edc5955a
1 ändrade filer med 95 tillägg och 12 borttagningar
  1. 95 12
      core/sap/src/sap_fsm.c

+ 95 - 12
core/sap/src/sap_fsm.c

@@ -1159,6 +1159,67 @@ static bool sap_is_channel_bonding_etsi_weather_channel(ptSapContext sap_ctx)
 	return false;
 }
 
+/**
+ * sap_ch_params_to_bonding_channels() - get bonding channels from channel param
+ * @ch_params: channel params ( bw, pri and sec channel info)
+ * @channels: bonded channel list
+ *
+ * Return: Number of sub channels
+ */
+static uint8_t sap_ch_params_to_bonding_channels(
+		struct ch_params *ch_params,
+		uint8_t *channels)
+{
+	uint8_t center_chan = ch_params->center_freq_seg0;
+	uint8_t nchannels = 0;
+
+	switch (ch_params->ch_width) {
+	case CH_WIDTH_160MHZ:
+		nchannels = 8;
+		center_chan = ch_params->center_freq_seg1;
+		channels[0] = center_chan - 14;
+		channels[1] = center_chan - 10;
+		channels[2] = center_chan - 6;
+		channels[3] = center_chan - 2;
+		channels[4] = center_chan + 2;
+		channels[5] = center_chan + 6;
+		channels[6] = center_chan + 10;
+		channels[7] = center_chan + 14;
+		break;
+	case CH_WIDTH_80P80MHZ:
+		nchannels = 8;
+		channels[0] = center_chan - 6;
+		channels[1] = center_chan - 2;
+		channels[2] = center_chan + 2;
+		channels[3] = center_chan + 6;
+
+		center_chan = ch_params->center_freq_seg1;
+		channels[4] = center_chan - 6;
+		channels[5] = center_chan - 2;
+		channels[6] = center_chan + 2;
+		channels[7] = center_chan + 6;
+		break;
+	case CH_WIDTH_80MHZ:
+		nchannels = 4;
+		channels[0] = center_chan - 6;
+		channels[1] = center_chan - 2;
+		channels[2] = center_chan + 2;
+		channels[3] = center_chan + 6;
+		break;
+	case CH_WIDTH_40MHZ:
+		nchannels = 2;
+		channels[0] = center_chan - 2;
+		channels[1] = center_chan + 2;
+		break;
+	default:
+		nchannels = 1;
+		channels[0] = center_chan;
+		break;
+	}
+
+	return nchannels;
+}
+
 /**
  * sap_get_cac_dur_dfs_region() - get cac duration and dfs region.
  * @sap_ctxt: sap context
@@ -1173,6 +1234,10 @@ static void sap_get_cac_dur_dfs_region(ptSapContext sap_ctx,
 		uint32_t *cac_duration_ms,
 		uint32_t *dfs_region)
 {
+	int i;
+	uint8_t channels[MAX_BONDED_CHANNELS];
+	uint8_t num_channels;
+	struct ch_params *ch_params = &sap_ctx->ch_params;
 	tHalHandle hal = NULL;
 	tpAniSirGlobal mac = NULL;
 
@@ -1190,21 +1255,45 @@ static void sap_get_cac_dur_dfs_region(ptSapContext sap_ctx,
 	}
 
 	mac = PMAC_STRUCT(hal);
+	wlan_reg_get_dfs_region(mac->psoc, dfs_region);
 	if (mac->sap.SapDfsInfo.ignore_cac) {
 		*cac_duration_ms = 0;
 		QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_DEBUG,
 			  "%s: ignore_cac is set", __func__);
 		return;
 	}
+	*cac_duration_ms = DEFAULT_CAC_TIMEOUT;
 
-	wlan_reg_get_dfs_region(mac->psoc, dfs_region);
+	QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO,
+		  FL("sapdfs: dfs_region=%d, chwidth=%d, seg0=%d, seg1=%d"),
+		  *dfs_region, ch_params->ch_width,
+		  ch_params->center_freq_seg0, ch_params->center_freq_seg1);
+
+	if (*dfs_region != DFS_ETSI_REG) {
+		QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO,
+			  FL("sapdfs: defult cac duration"));
+		return;
+	}
 
-	if ((*dfs_region == DFS_ETSI_REG) &&
-	    ((IS_ETSI_WEATHER_CH(sap_ctx->channel)) ||
-	    (sap_is_channel_bonding_etsi_weather_channel(sap_ctx))))
+	if (sap_is_channel_bonding_etsi_weather_channel(sap_ctx)) {
 		*cac_duration_ms = ETSI_WEATHER_CH_CAC_TIMEOUT;
-	else
-		*cac_duration_ms = DEFAULT_CAC_TIMEOUT;
+		QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO,
+			  FL("sapdfs: bonding_etsi_weather_channel"));
+		return;
+	}
+
+	qdf_mem_zero(channels, sizeof(channels));
+	num_channels = sap_ch_params_to_bonding_channels(ch_params, channels);
+	for (i = 0; i < num_channels; i++) {
+		if (IS_ETSI_WEATHER_CH(channels[i])) {
+			*cac_duration_ms = ETSI_WEATHER_CH_CAC_TIMEOUT;
+			QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO,
+				  FL("sapdfs: ch=%d is etsi weather channel"),
+				  channels[i]);
+			return;
+		}
+	}
+
 }
 
 void sap_dfs_set_current_channel(void *ctx)
@@ -4331,12 +4420,6 @@ int sap_start_dfs_cac_timer(ptSapContext sap_ctx)
 	if (0 == cac_dur)
 		return 0;
 
-	if ((dfs_region == DFS_ETSI_REG) &&
-	    ((IS_ETSI_WEATHER_CH(sap_ctx->channel)) ||
-	     (sap_is_channel_bonding_etsi_weather_channel(sap_ctx)))) {
-		cac_dur = ETSI_WEATHER_CH_CAC_TIMEOUT;
-	}
-
 #ifdef QCA_WIFI_NAPIER_EMULATION
 	cac_dur = cac_dur / 100;
 #endif