ソースを参照

qcacmn: Move edge extrabins at the end of bin_pwr array

Move the left band and right band edge extra bins to
the end of the Spectral bin_pwr array.

CRs-Fixed: 3002177
Change-Id: Iea93879763a7e2c56cdb5f4d3d163e2d4b082b26
Jhalak Naik 3 年 前
コミット
e59d430af2

+ 69 - 9
target_if/spectral/target_if_spectral_netlink.c

@@ -102,6 +102,7 @@ target_if_spectral_fill_samp_msg(struct target_if_spectral *spectral,
 		uint16_t *binptr_16;
 		uint16_t pwr_16;
 		size_t pwr_count;
+		uint16_t num_edge_bins;
 		uint16_t idx;
 		uint16_t start_bin_index;
 
@@ -127,10 +128,7 @@ target_if_spectral_fill_samp_msg(struct target_if_spectral *spectral,
 		rb_edge_bins->start_bin_idx =
 					map_det_info->rb_extrabins_start_idx;
 		rb_edge_bins->num_bins = map_det_info->rb_extrabins_num;
-		if (lb_edge_bins->num_bins)
-			start_bin_index = lb_edge_bins->start_bin_idx;
-		else
-			start_bin_index = detector_info->start_bin_idx;
+		start_bin_index = detector_info->start_bin_idx;
 
 		detector_info->rssi = params->rssi;
 
@@ -155,10 +153,9 @@ target_if_spectral_fill_samp_msg(struct target_if_spectral *spectral,
 		bin_pwr_data = &params->bin_pwr_data
 					[map_det_info->src_start_bin_idx];
 		pwr_count = detector_info->end_bin_idx -
-			    detector_info->start_bin_idx +
-			    lb_edge_bins->num_bins +
-			    rb_edge_bins->num_bins + 1;
-		spec_samp_msg->bin_pwr_count += pwr_count;
+			    detector_info->start_bin_idx + 1;
+		num_edge_bins = lb_edge_bins->num_bins +
+				rb_edge_bins->num_bins;
 		/*
 		 * To check whether FFT bin values exceed 8 bits, we add a
 		 * check before copying values to samp_data->bin_pwr.
@@ -171,6 +168,19 @@ target_if_spectral_fill_samp_msg(struct target_if_spectral *spectral,
 		if (swar->fftbin_size_war ==
 				SPECTRAL_FFTBIN_SIZE_WAR_4BYTE_TO_1BYTE) {
 			binptr_32 = (uint32_t *)bin_pwr_data;
+			if (lb_edge_bins->num_bins > 0) {
+				for (idx = 0; idx < lb_edge_bins->num_bins;
+				     idx++) {
+				/* Read only the first 2 bytes of the DWORD */
+					pwr_16 = *((uint16_t *)binptr_32++);
+					if (qdf_unlikely(pwr_16 >
+					    MAX_FFTBIN_VALUE))
+						pwr_16 = MAX_FFTBIN_VALUE;
+					spec_samp_msg->bin_pwr
+					  [lb_edge_bins->start_bin_idx + idx]
+					  = pwr_16;
+				}
+			}
 			for (idx = 0; idx < pwr_count; idx++) {
 				/* Read only the first 2 bytes of the DWORD */
 				pwr_16 = *((uint16_t *)binptr_32++);
@@ -179,9 +189,34 @@ target_if_spectral_fill_samp_msg(struct target_if_spectral *spectral,
 				spec_samp_msg->bin_pwr[start_bin_index + idx]
 							= pwr_16;
 			}
+			if (rb_edge_bins->num_bins > 0) {
+				for (idx = 0; idx < rb_edge_bins->num_bins;
+				     idx++) {
+				/* Read only the first 2 bytes of the DWORD */
+					pwr_16 = *((uint16_t *)binptr_32++);
+					if (qdf_unlikely(pwr_16 >
+					    MAX_FFTBIN_VALUE))
+						pwr_16 = MAX_FFTBIN_VALUE;
+					spec_samp_msg->bin_pwr
+					  [rb_edge_bins->start_bin_idx + idx]
+					  = pwr_16;
+				}
+			}
 		} else if (swar->fftbin_size_war ==
 				SPECTRAL_FFTBIN_SIZE_WAR_2BYTE_TO_1BYTE) {
 			binptr_16 = (uint16_t *)bin_pwr_data;
+			if (lb_edge_bins->num_bins > 0) {
+				for (idx = 0; idx < lb_edge_bins->num_bins;
+				     idx++) {
+					pwr_16 = *(binptr_16++);
+					if (qdf_unlikely(pwr_16 >
+					    MAX_FFTBIN_VALUE))
+						pwr_16 = MAX_FFTBIN_VALUE;
+					spec_samp_msg->bin_pwr
+					  [lb_edge_bins->start_bin_idx + idx]
+					  = pwr_16;
+				}
+			}
 			for (idx = 0; idx < pwr_count; idx++) {
 				pwr_16 = *(binptr_16++);
 				if (qdf_unlikely(pwr_16 > MAX_FFTBIN_VALUE))
@@ -189,10 +224,35 @@ target_if_spectral_fill_samp_msg(struct target_if_spectral *spectral,
 				spec_samp_msg->bin_pwr[start_bin_index + idx]
 							= pwr_16;
 			}
+			if (rb_edge_bins->num_bins > 0) {
+				for (idx = 0; idx < rb_edge_bins->num_bins;
+				     idx++) {
+					pwr_16 = *(binptr_16++);
+					if (qdf_unlikely(pwr_16 >
+					    MAX_FFTBIN_VALUE))
+						pwr_16 = MAX_FFTBIN_VALUE;
+					spec_samp_msg->bin_pwr
+					  [rb_edge_bins->start_bin_idx + idx]
+					  = pwr_16;
+				}
+			}
 		} else {
+			if (lb_edge_bins->num_bins > 0)
+				qdf_mem_copy(&spec_samp_msg->bin_pwr
+					     [lb_edge_bins->start_bin_idx],
+					     &bin_pwr_data[0],
+					     lb_edge_bins->num_bins);
 			qdf_mem_copy(&spec_samp_msg->bin_pwr[start_bin_index],
-				     bin_pwr_data, pwr_count);
+				     &bin_pwr_data[lb_edge_bins->num_bins],
+				     pwr_count);
+			if (rb_edge_bins->num_bins > 0)
+				qdf_mem_copy(&spec_samp_msg->bin_pwr
+					     [rb_edge_bins->start_bin_idx],
+					     &bin_pwr_data[pwr_count +
+					     lb_edge_bins->num_bins],
+					     rb_edge_bins->num_bins);
 		}
+		spec_samp_msg->bin_pwr_count += (pwr_count + num_edge_bins);
 	}
 
 	if (det_map->send_to_upper_layers) {

+ 25 - 11
target_if/spectral/target_if_spectral_phyerr.c

@@ -1069,6 +1069,8 @@ target_if_populate_fft_bins_info(struct target_if_spectral *spectral,
 	detector_list = &spectral->detector_list[smode][ch_width];
 
 	for (det = 0; det < detector_list->num_detectors; det++) {
+		uint16_t lb_extrabins_offset = 0;
+
 		det_map = &spectral->det_map
 				[detector_list->detectors[det]];
 		dest_det_info = &det_map->dest_det_info[0];
@@ -1079,12 +1081,14 @@ target_if_populate_fft_bins_info(struct target_if_spectral *spectral,
 			if (ch_width == CH_WIDTH_160MHZ &&
 			    is_fragmentation_160 &&
 			    spectral->report_info[smode].pri20_freq >
-			    spectral->report_info[smode].sscan_cfreq1)
-				start_bin = num_fft_bins +
+			    spectral->report_info[smode].sscan_cfreq1) {
+				start_bin = num_fft_bins;
+				lb_extrabins_offset =
 					dest_det_info->lb_extrabins_num +
 					dest_det_info->rb_extrabins_num;
-			else
+			} else {
 				start_bin = 0;
+			}
 			break;
 		case 1:
 			if (ch_width == CH_WIDTH_160MHZ &&
@@ -1092,24 +1096,34 @@ target_if_populate_fft_bins_info(struct target_if_spectral *spectral,
 			    spectral->report_info[smode].pri20_freq >
 			    spectral->report_info[smode].sscan_cfreq1)
 				start_bin = 0;
-			else
-				start_bin = num_fft_bins +
+			else {
+				start_bin = num_fft_bins;
+				lb_extrabins_offset =
 					dest_det_info->lb_extrabins_num +
 					dest_det_info->rb_extrabins_num;
+			}
 			break;
 		default:
 			return QDF_STATUS_E_FAILURE;
 		}
-		dest_det_info->dest_start_bin_idx = start_bin +
-					dest_det_info->lb_extrabins_num;
+		dest_det_info->dest_start_bin_idx = start_bin;
 		dest_det_info->dest_end_bin_idx =
 					dest_det_info->dest_start_bin_idx +
 					num_fft_bins - 1;
-		if (dest_det_info->lb_extrabins_num)
-			dest_det_info->lb_extrabins_start_idx = start_bin;
+		if (dest_det_info->lb_extrabins_num) {
+			if (is_ch_width_160_or_80p80(ch_width)) {
+				dest_det_info->lb_extrabins_start_idx =
+							2 * num_fft_bins +
+							lb_extrabins_offset;
+			} else {
+				dest_det_info->lb_extrabins_start_idx =
+								num_fft_bins;
+			}
+		}
 		if (dest_det_info->rb_extrabins_num)
-			dest_det_info->rb_extrabins_start_idx = 1 +
-					dest_det_info->dest_end_bin_idx;
+			dest_det_info->rb_extrabins_start_idx =
+					dest_det_info->lb_extrabins_start_idx +
+					dest_det_info->lb_extrabins_num;
 		dest_det_info->src_start_bin_idx = 0;
 	}