Ver código fonte

qcacmn: Add support for Bangradar with detector ID

Provide support for bangradar with detector ID as one of the parameters.
Add the parameter as part of the packed arguments to be sent to FW.

Also add APIs for basic sanity check of bangradar params and packing
bangradar params inside an 32 bit unsigned integer.

CRs-Fixed: 2646549
Change-Id: Ie781bc9421b7ac0d407eb01814c9242c7f988884
Vignesh Mohan 6 anos atrás
pai
commit
2b0ff06748

+ 2 - 0
umac/dfs/core/src/dfs.h

@@ -917,6 +917,8 @@ struct dfs_event_log {
 
 #define FREQ_OFFSET_BOUNDARY_FOR_80MHZ 40
 
+#define FREQ_OFFSET_BOUNDARY_FOR_160MHZ 80
+
 /**
  * struct dfs_mode_switch_defer_params - Parameters storing DFS information
  * before defer, as part of HW mode switch.

+ 8 - 12
umac/dfs/core/src/dfs_full_offload.h

@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017-2019 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2017-2020 The Linux Foundation. All rights reserved.
  *
  *
  * Permission to use, copy, modify, and/or distribute this software for
@@ -31,21 +31,17 @@
  * dfs_fill_emulate_bang_radar_test() - Update dfs unit test arguments and
  * send bangradar command to firmware.
  * @dfs: Pointer to wlan_dfs structure.
- * @segid: Segment Identifier(Primary and Secondary)
- * @is_chirp: Boolean to determine if Chirp or Non Chirp.
- * @freq_offset: Value of frequency offset from centre frequency.
- * @dfs_unit_test: Pointer to Unit test command structure
+ * @bangradar_params: Parameters of the radar to be simulated.
  *
  * Return: If the event is received return 0.
  */
-int dfs_fill_emulate_bang_radar_test(struct wlan_dfs *dfs,
-		uint8_t segid, bool is_chirp, int32_t freq_offset,
-		struct dfs_emulate_bang_radar_test_cmd *dfs_unit_test);
-
+int
+dfs_fill_emulate_bang_radar_test(struct wlan_dfs *dfs,
+				 struct dfs_bangradar_params *bangradar_params);
 #else
-static inline int dfs_fill_emulate_bang_radar_test(struct wlan_dfs *dfs,
-		uint8_t segid, bool is_chirp, int32_t freq_offset,
-		struct dfs_emulate_bang_radar_test_cmd *dfs_unit_test)
+static inline int
+dfs_fill_emulate_bang_radar_test(struct wlan_dfs *dfs,
+				 struct dfs_bangradar_params *bangradar_params)
 {
 	return 0;
 }

+ 50 - 35
umac/dfs/core/src/misc/dfs.c

@@ -341,6 +341,43 @@ static inline bool dfs_get_disable_radar_marking(struct wlan_dfs *dfs)
 	return QDF_STATUS_SUCCESS;
 }
 #endif
+
+static QDF_STATUS
+dfs_check_bangradar_sanity(struct wlan_dfs *dfs,
+			   struct dfs_bangradar_params *bangradar_params)
+{
+	if (!bangradar_params) {
+		dfs_info(dfs, WLAN_DEBUG_DFS_ALWAYS,
+			 "bangradar params is NULL");
+		return -EINVAL;
+	}
+	if (dfs_is_true_160mhz_supported(dfs)) {
+		if (abs(bangradar_params->freq_offset) >
+		    FREQ_OFFSET_BOUNDARY_FOR_160MHZ) {
+			dfs_info(dfs, WLAN_DEBUG_DFS_ALWAYS,
+				 "Frequency Offset out of bound");
+			return -EINVAL;
+		}
+	} else if (abs(bangradar_params->freq_offset) >
+		   FREQ_OFFSET_BOUNDARY_FOR_80MHZ) {
+		dfs_info(dfs, WLAN_DEBUG_DFS_ALWAYS,
+			 "Frequency Offset out of bound");
+		return -EINVAL;
+	}
+	if (bangradar_params->seg_id > SEG_ID_SECONDARY) {
+		dfs_info(dfs, WLAN_DEBUG_DFS_ALWAYS, "Invalid segment ID");
+		return -EINVAL;
+	}
+	if ((bangradar_params->detector_id > dfs_get_agile_detector_id(dfs)) ||
+	    ((bangradar_params->detector_id ==
+	      dfs_get_agile_detector_id(dfs)) &&
+	      !dfs->dfs_is_offload_enabled)) {
+		dfs_info(dfs, WLAN_DEBUG_DFS_ALWAYS, "Invalid detector ID");
+		return -EINVAL;
+	}
+	return QDF_STATUS_SUCCESS;
+}
+
 int dfs_control(struct wlan_dfs *dfs,
 		u_int id,
 		void *indata,
@@ -356,11 +393,8 @@ int dfs_control(struct wlan_dfs *dfs,
 	struct dfsreq_nolinfo *nol;
 	uint32_t *data = NULL;
 	int i;
-	struct dfs_emulate_bang_radar_test_cmd dfs_unit_test;
 	int usenol_pdev_param;
 
-	qdf_mem_zero(&dfs_unit_test, sizeof(dfs_unit_test));
-
 	if (!dfs) {
 		dfs_err(NULL, WLAN_DEBUG_DFS_ALWAYS,  "dfs is NULL");
 		goto bad;
@@ -436,40 +470,21 @@ int dfs_control(struct wlan_dfs *dfs,
 			break;
 		}
 		bangradar_params = (struct dfs_bangradar_params *)indata;
-		if (bangradar_params) {
-			if (abs(bangradar_params->freq_offset) >
-			    FREQ_OFFSET_BOUNDARY_FOR_80MHZ) {
-				dfs_info(dfs, WLAN_DEBUG_DFS_ALWAYS,
-					 "Frequency Offset out of bound");
-				error = -EINVAL;
-				break;
-			} else if (bangradar_params->seg_id >
-				   SEG_ID_SECONDARY) {
-				dfs_info(dfs, WLAN_DEBUG_DFS_ALWAYS,
-					 "Illegal segment ID");
-				error = -EINVAL;
-				break;
-			}
-			dfs->dfs_bangradar_type =
-				bangradar_params->bangradar_type;
-			dfs->dfs_seg_id = bangradar_params->seg_id;
-			dfs->dfs_is_chirp = bangradar_params->is_chirp;
-			dfs->dfs_freq_offset = bangradar_params->freq_offset;
-
-			if (dfs->dfs_is_offload_enabled) {
-				error = dfs_fill_emulate_bang_radar_test
-							(dfs, dfs->dfs_seg_id,
-							 dfs->dfs_is_chirp,
-							 dfs->dfs_freq_offset,
-							 &dfs_unit_test);
-			} else {
-				error = dfs_start_host_based_bangradar(dfs);
-			}
+		error = dfs_check_bangradar_sanity(dfs, bangradar_params);
+		if (error != QDF_STATUS_SUCCESS)
+			break;
+		dfs->dfs_bangradar_type = bangradar_params->bangradar_type;
+		dfs->dfs_seg_id = bangradar_params->seg_id;
+		dfs->dfs_is_chirp = bangradar_params->is_chirp;
+		dfs->dfs_freq_offset = bangradar_params->freq_offset;
+
+		if (dfs->dfs_is_offload_enabled) {
+			error = dfs_fill_emulate_bang_radar_test(
+					dfs,
+					bangradar_params);
 		} else {
-			dfs_info(dfs, WLAN_DEBUG_DFS_ALWAYS,
-				 "bangradar_params is NULL");
+			error = dfs_start_host_based_bangradar(dfs);
 		}
-
 		break;
 	case DFS_GET_THRESH:
 		if (!outdata || !outsize ||

+ 26 - 16
umac/dfs/core/src/misc/dfs_full_offload.c

@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2016-2019 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2016-2020 The Linux Foundation. All rights reserved.
  * Copyright (c) 2002-2006, Atheros Communications Inc.
  *
  * Permission to use, copy, modify, and/or distribute this software for any
@@ -28,10 +28,12 @@
 #include "../dfs_full_offload.h"
 
 #if defined(WLAN_DFS_FULL_OFFLOAD)
-int dfs_fill_emulate_bang_radar_test(struct wlan_dfs *dfs,
-		uint8_t segid, bool is_chirp, int32_t freq_offset,
-		struct dfs_emulate_bang_radar_test_cmd *dfs_unit_test)
+#define ADD_TO_32BYTE(_arg, _shift, _mask) (((_arg) & (_mask)) << (_shift))
+int
+dfs_fill_emulate_bang_radar_test(struct wlan_dfs *dfs,
+				 struct dfs_bangradar_params *bangradar_params)
 {
+	struct dfs_emulate_bang_radar_test_cmd dfs_unit_test;
 	uint32_t packed_args = 0;
 
 	if (!(WLAN_IS_PRIMARY_OR_SECONDARY_CHAN_DFS(dfs->dfs_curchan))) {
@@ -40,22 +42,30 @@ int dfs_fill_emulate_bang_radar_test(struct wlan_dfs *dfs,
 		return -EINVAL;
 	}
 
-	if (segid > SEG_ID_SECONDARY) {
-		dfs_err(dfs, WLAN_DEBUG_DFS_ALWAYS,
-			"Segment id should be 0 or 1");
-		return -EINVAL;
-	}
-	packed_args = (segid) | (is_chirp << SEG_ID_SIZE) |
-			((freq_offset & MASK) << (SEG_ID_SIZE + IS_CHIRP_SIZE));
-	dfs_unit_test->num_args = DFS_UNIT_TEST_NUM_ARGS;
-	dfs_unit_test->args[IDX_CMD_ID] =
+	packed_args =
+		ADD_TO_32BYTE(bangradar_params->seg_id,
+			      SEG_ID_SHIFT,
+			      SEG_ID_MASK) |
+		ADD_TO_32BYTE(bangradar_params->is_chirp,
+			      IS_CHIRP_SHIFT,
+			      IS_CHIRP_MASK) |
+		ADD_TO_32BYTE(bangradar_params->freq_offset,
+			      FREQ_OFF_SHIFT,
+			      FREQ_OFFSET_MASK) |
+		ADD_TO_32BYTE(bangradar_params->detector_id,
+			      DET_ID_SHIFT,
+			      DET_ID_MASK);
+
+	qdf_mem_zero(&dfs_unit_test, sizeof(dfs_unit_test));
+	dfs_unit_test.num_args = DFS_UNIT_TEST_NUM_ARGS;
+	dfs_unit_test.args[IDX_CMD_ID] =
 			DFS_PHYERR_OFFLOAD_TEST_SET_RADAR;
-	dfs_unit_test->args[IDX_PDEV_ID] =
+	dfs_unit_test.args[IDX_PDEV_ID] =
 			wlan_objmgr_pdev_get_pdev_id(dfs->dfs_pdev_obj);
-	dfs_unit_test->args[IDX_RADAR_PARAM1_ID] = packed_args;
+	dfs_unit_test.args[IDX_RADAR_PARAM1_ID] = packed_args;
 
 	if (tgt_dfs_process_emulate_bang_radar_cmd(dfs->dfs_pdev_obj,
-				dfs_unit_test) == QDF_STATUS_E_FAILURE) {
+				&dfs_unit_test) == QDF_STATUS_E_FAILURE) {
 		return -EINVAL;
 	}
 

+ 2 - 0
umac/dfs/dispatcher/inc/wlan_dfs_ioctl.h

@@ -167,12 +167,14 @@ enum dfs_bangradar_types {
  * @seg_id:         Segment ID information.
  * @is_chirp:       Chirp radar or not.
  * @freq_offset:    Frequency offset at which radar was found.
+ * @detector_id:    Detector ID corresponding to primary/agile detectors.
  */
 struct dfs_bangradar_params {
 	enum dfs_bangradar_types bangradar_type;
 	uint8_t seg_id;
 	uint8_t is_chirp;
 	int32_t freq_offset;
+	uint8_t detector_id;
 };
 #define DFS_IOCTL_PARAM_NOVAL  65535
 #define DFS_IOCTL_PARAM_ENABLE 0x8000

+ 17 - 11
umac/dfs/dispatcher/inc/wlan_dfs_tgt_api.h

@@ -47,19 +47,20 @@
  *                         1). Segment ID,
  *                         2). Chirp information (is chirp or non chirp),
  *                         3). Frequency offset.
+ *                         4). Detector ID.
  *
  * The packed argument structure is:
  *
- * ------------------------------32 bits arg-------------------------
+ * ------------------------------32 bits arg----------------------------
  *
- * ------------21 bits-------------|-------8 bits------|1 bit|2 bits|
- * __________________________________________________________________
- *|                                | | | | | | | | | | |     |   |   |
- *|---------21 Unused bits---------|x|x|x| |x|x|x|x| |x|  x  | x | x |
- *|________________________________|_|_|_|_|_|_|_|_|_|_|_____|___|___|
+ * ------------19 bits-------|--2 bits-|-------8 bits------|1 bit|2 bits|
+ * ______________________________________________________________________
+ *|                          |   | |   | | | | | | | | | | |     |   |   |
+ *|------19 Unused bits------| x | | x |x|x|x| |x|x|x|x| |x|  x  | x | x |
+ *|__________________________|___|_|___|_|_|_|_|_|_|_|_|_|_|_____|___|___|
  *
- *                                 |___________________|_____|_______|
- *                                   freq.offset        Chirp  segID
+ *                           |_________|___________________|_____|_______|
+ *                              det.ID     freq.offset      Chirp  seg.ID
  *
  * @DFS_UNIT_TEST_NUM_ARGS:     Number of arguments for bangradar unit test
  *                              command.
@@ -74,9 +75,14 @@ enum {
 	DFS_MAX_NUM_UNIT_TEST_ARGS = DFS_UNIT_TEST_NUM_ARGS
 };
 
-#define SEG_ID_SIZE 2
-#define IS_CHIRP_SIZE 1
-#define MASK 0xFF
+#define SEG_ID_SHIFT         0
+#define IS_CHIRP_SHIFT       2
+#define FREQ_OFF_SHIFT       3
+#define DET_ID_SHIFT        11
+#define SEG_ID_MASK       0x03
+#define IS_CHIRP_MASK     0x01
+#define FREQ_OFFSET_MASK  0xFF
+#define DET_ID_MASK       0x03
 
 /**
  * struct dfs_emulate_bang_radar_test_cmd - Unit test command structure to send