Przeglądaj źródła

qcacld-3.0: Fix channel selection failure after radar is detected

sap_dfs_is_channel_in_nol_list will return true even for the channels
which are not in the nol list.

When sap_dfs_is_channel_in_nol_list gets bonded channels, it gets the
bonded channels of current channel of the sap rather than the input
channels, so after radar is detected, the current channel of the sap
is in nol list, and sap_dfs_is_channel_in_nol_list returns true for
all input channels.

sap_dfs_is_channel_in_nol_list should get the bonded channels of input
channels.

CRs-fixed: 2105496
Change-Id: I7c5fc06c66c004aa5c1a208376d1ab4b88956a6f
bings 7 lat temu
rodzic
commit
d60c0b4795
1 zmienionych plików z 94 dodań i 12 usunięć
  1. 94 12
      core/sap/src/sap_fsm.c

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

@@ -1162,6 +1162,91 @@ sap_is_channel_bonding_etsi_weather_channel(struct sap_context *sap_ctx)
 	return false;
 }
 
+/*
+ * sap_get_bonding_channels() - get bonding channels from primary channel.
+ * @sapContext: Handle to SAP context.
+ * @channel: Channel to get bonded channels.
+ * @channels: Bonded channel list
+ * @size: Max bonded channels
+ * @chanBondState: The channel bonding mode of the passed channel.
+ *
+ * Return: Number of sub channels
+ */
+static uint8_t sap_get_bonding_channels(struct sap_context *sapContext,
+					uint8_t channel,
+					uint8_t *channels, uint8_t size,
+					ePhyChanBondState chanBondState)
+{
+	tHalHandle hHal = CDS_GET_HAL_CB();
+	tpAniSirGlobal pMac;
+	uint8_t numChannel;
+
+	if (channels == NULL)
+		return 0;
+
+	if (size < MAX_BONDED_CHANNELS)
+		return 0;
+
+	if (NULL != hHal)
+		pMac = PMAC_STRUCT(hHal);
+	else
+		return 0;
+
+	QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_DEBUG,
+		  FL("cbmode: %d, channel: %d"), chanBondState, channel);
+
+	switch (chanBondState) {
+	case PHY_SINGLE_CHANNEL_CENTERED:
+		numChannel = 1;
+		channels[0] = channel;
+		break;
+	case PHY_DOUBLE_CHANNEL_HIGH_PRIMARY:
+		numChannel = 2;
+		channels[0] = channel - 4;
+		channels[1] = channel;
+		break;
+	case PHY_DOUBLE_CHANNEL_LOW_PRIMARY:
+		numChannel = 2;
+		channels[0] = channel;
+		channels[1] = channel + 4;
+		break;
+	case PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_LOW:
+		numChannel = 4;
+		channels[0] = channel;
+		channels[1] = channel + 4;
+		channels[2] = channel + 8;
+		channels[3] = channel + 12;
+		break;
+	case PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_LOW:
+		numChannel = 4;
+		channels[0] = channel - 4;
+		channels[1] = channel;
+		channels[2] = channel + 4;
+		channels[3] = channel + 8;
+		break;
+	case PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_HIGH:
+		numChannel = 4;
+		channels[0] = channel - 8;
+		channels[1] = channel - 4;
+		channels[2] = channel;
+		channels[3] = channel + 4;
+		break;
+	case PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_HIGH:
+		numChannel = 4;
+		channels[0] = channel - 12;
+		channels[1] = channel - 8;
+		channels[2] = channel - 4;
+		channels[3] = channel;
+		break;
+	default:
+		numChannel = 1;
+		channels[0] = channel;
+		break;
+	}
+
+	return numChannel;
+}
+
 /**
  * sap_ch_params_to_bonding_channels() - get bonding channels from channel param
  * @ch_params: channel params ( bw, pri and sec channel info)
@@ -1502,8 +1587,14 @@ sap_dfs_is_channel_in_nol_list(struct sap_context *sap_context,
 	}
 
 	/* get the bonded channels */
-	num_channels = sap_ch_params_to_bonding_channels(
+	if (channel_number == sap_context->channel && chan_bondState >=
+						PHY_CHANNEL_BONDING_STATE_MAX)
+		num_channels = sap_ch_params_to_bonding_channels(
 					&sap_context->ch_params, channels);
+	else
+		num_channels = sap_get_bonding_channels(sap_context,
+					channel_number, channels,
+					MAX_BONDED_CHANNELS, chan_bondState);
 
 	pdev = mac_ctx->pdev;
 	if (!pdev) {
@@ -2978,7 +3069,6 @@ static QDF_STATUS sap_fsm_state_ch_select(struct sap_context *sap_ctx,
 {
 	uint32_t msg = sap_event->event;
 	QDF_STATUS qdf_status = QDF_STATUS_E_FAILURE;
-	uint32_t cbmode;
 	bool b_leak_chan = false;
 #ifdef WLAN_ENABLE_CHNL_MATRIX_RESTRICTION
 	uint8_t temp_chan;
@@ -2986,20 +3076,12 @@ static QDF_STATUS sap_fsm_state_ch_select(struct sap_context *sap_ctx,
 #endif
 
 	if (msg == eSAP_MAC_SCAN_COMPLETE) {
-		/* get the bonding mode */
-		if (sap_ctx->channel <= 14)
-			cbmode = sme_get_cb_phy_state_from_cb_ini_value(
-					sme_get_channel_bonding_mode24_g(hal));
-		else
-			cbmode = sme_get_cb_phy_state_from_cb_ini_value(
-					sme_get_channel_bonding_mode5_g(hal));
-
 #ifdef WLAN_ENABLE_CHNL_MATRIX_RESTRICTION
 		temp_chan = sap_ctx->channel;
 		p_nol = mac_ctx->sap.SapDfsInfo.sapDfsChannelNolList;
 
 		sap_mark_leaking_ch(sap_ctx,
-			cbmode, p_nol, 1, &temp_chan);
+			sap_ctx->ch_params.ch_width, p_nol, 1, &temp_chan);
 
 		/*
 		 * if selelcted channel has leakage to channels
@@ -3012,7 +3094,7 @@ static QDF_STATUS sap_fsm_state_ch_select(struct sap_context *sap_ctx,
 		 * has leakage to the channels in NOL
 		 */
 		if (sap_dfs_is_channel_in_nol_list(sap_ctx, sap_ctx->channel,
-			cbmode) || b_leak_chan) {
+			PHY_CHANNEL_BONDING_STATE_MAX) || b_leak_chan) {
 			uint8_t ch;
 
 			/* find a new available channel */