Bladeren bron

qcacld-3.0: Fix issues in channel bonding APIs

Fix calculation of sec_ch_offset. Also fix the check for
HT40 flag to calculate the channel BW. Also fix check for
secondary channel.

CRs-Fixed: 1022025
Change-Id: If37780ea64698ab616131a550cd877368c56faa6
Amar Singhal 9 jaren geleden
bovenliggende
commit
a5bd9e8c27
1 gewijzigde bestanden met toevoegingen van 20 en 11 verwijderingen
  1. 20 11
      core/cds/src/cds_reg_service.c

+ 20 - 11
core/cds/src/cds_reg_service.c

@@ -346,7 +346,7 @@ enum channel_state cds_get_2g_bonded_channel_state(uint16_t oper_ch,
 		return CHANNEL_STATE_INVALID;
 
 	if (CH_WIDTH_40MHZ == ch_width) {
-		if ((sec_ch + 4 != oper_ch) ||
+		if ((sec_ch + 4 != oper_ch) &&
 		    (oper_ch + 4 != sec_ch))
 			return CHANNEL_STATE_INVALID;
 		chan_state2 = cds_get_channel_state(sec_ch);
@@ -372,8 +372,8 @@ enum channel_state cds_get_2g_bonded_channel_state(uint16_t oper_ch,
 		bw_enabled = !(reg_channels[chan_enum].flags &
 			       IEEE80211_CHAN_NO_20MHZ);
 	else if (CH_WIDTH_40MHZ == ch_width)
-		bw_enabled = !(reg_channels[chan_enum].flags &
-			       IEEE80211_CHAN_NO_HT40);
+		bw_enabled = !((reg_channels[chan_enum].flags &
+				IEEE80211_CHAN_NO_HT40) == IEEE80211_CHAN_NO_HT40);
 
 	if (bw_enabled)
 		return chan_state;
@@ -417,8 +417,8 @@ enum channel_state cds_get_5g_bonded_channel_state(
 		bw_enabled = !(reg_channels[chan_enum].flags &
 			       IEEE80211_CHAN_NO_20MHZ);
 	else if (CH_WIDTH_40MHZ == ch_width)
-		bw_enabled = !(reg_channels[chan_enum].flags &
-			       IEEE80211_CHAN_NO_HT40);
+		bw_enabled = !((reg_channels[chan_enum].flags &
+				IEEE80211_CHAN_NO_HT40) == IEEE80211_CHAN_NO_HT40);
 	else if (CH_WIDTH_80MHZ == ch_width)
 		bw_enabled = !(reg_channels[chan_enum].flags &
 			       IEEE80211_CHAN_NO_80MHZ);
@@ -449,6 +449,7 @@ static void cds_set_5g_channel_params(uint16_t oper_ch,
 	enum channel_state chan_state = CHANNEL_STATE_ENABLE;
 	enum channel_state chan_state2 = CHANNEL_STATE_ENABLE;
 	const struct bonded_chan *bonded_chan_ptr;
+	const struct bonded_chan *bonded_chan_ptr2;
 
 	if (CH_WIDTH_MAX <= ch_params->ch_width)
 		ch_params->ch_width = CH_WIDTH_80P80MHZ;
@@ -470,21 +471,27 @@ static void cds_set_5g_channel_params(uint16_t oper_ch,
 			chan_state = chan_state2;
 		if ((CHANNEL_STATE_ENABLE == chan_state) ||
 		    (CHANNEL_STATE_DFS == chan_state)) {
-			if (CH_WIDTH_20MHZ >= ch_params->ch_width)
+			if (CH_WIDTH_20MHZ >= ch_params->ch_width) {
 				ch_params->sec_ch_offset
 					= PHY_SINGLE_CHANNEL_CENTERED;
-			else if (CH_WIDTH_40MHZ == ch_params->ch_width) {
-				if (oper_ch == bonded_chan_ptr->start_ch)
+				ch_params->center_freq_seg0 = oper_ch;
+			} else if (CH_WIDTH_40MHZ <= ch_params->ch_width) {
+				cds_search_5g_bonded_chan_array(oper_ch,
+							bonded_chan_40mhz_array,
+					QDF_ARRAY_SIZE(bonded_chan_40mhz_array),
+							     &bonded_chan_ptr2);
+				if (oper_ch == bonded_chan_ptr2->start_ch)
 					ch_params->sec_ch_offset =
 						PHY_DOUBLE_CHANNEL_LOW_PRIMARY;
 				else
 					ch_params->sec_ch_offset =
 						PHY_DOUBLE_CHANNEL_HIGH_PRIMARY;
+				ch_params->center_freq_seg0 =
+					(bonded_chan_ptr2->start_ch +
+					 bonded_chan_ptr2->end_ch)/2;
+
 			}
 
-			ch_params->center_freq_seg0 =
-				(bonded_chan_ptr->start_ch +
-				 bonded_chan_ptr->end_ch)/2;
 			break;
 		}
 
@@ -528,6 +535,8 @@ static void cds_set_2g_channel_params(uint16_t oper_ch,
 				else
 					ch_params->sec_ch_offset =
 						PHY_DOUBLE_CHANNEL_HIGH_PRIMARY;
+				ch_params->center_freq_seg0 =
+					(oper_ch + sec_ch_2g)/2;
 			} else
 				ch_params->sec_ch_offset =
 					PHY_SINGLE_CHANNEL_CENTERED;