From 2b0ff06748392ef0d650dee621c8b6fb3ac16917 Mon Sep 17 00:00:00 2001 From: Vignesh Mohan Date: Mon, 8 Jul 2019 17:38:28 +0530 Subject: [PATCH] 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 --- umac/dfs/core/src/dfs.h | 2 + umac/dfs/core/src/dfs_full_offload.h | 20 +++--- umac/dfs/core/src/misc/dfs.c | 83 +++++++++++++--------- umac/dfs/core/src/misc/dfs_full_offload.c | 42 ++++++----- umac/dfs/dispatcher/inc/wlan_dfs_ioctl.h | 2 + umac/dfs/dispatcher/inc/wlan_dfs_tgt_api.h | 28 +++++--- 6 files changed, 104 insertions(+), 73 deletions(-) diff --git a/umac/dfs/core/src/dfs.h b/umac/dfs/core/src/dfs.h index e634153414e1..fe0d4c325d2b 100644 --- a/umac/dfs/core/src/dfs.h +++ b/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. diff --git a/umac/dfs/core/src/dfs_full_offload.h b/umac/dfs/core/src/dfs_full_offload.h index de49e3e3adcd..5d2d626472c4 100644 --- a/umac/dfs/core/src/dfs_full_offload.h +++ b/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; } diff --git a/umac/dfs/core/src/misc/dfs.c b/umac/dfs/core/src/misc/dfs.c index 3384bd623c49..ad71a8df1f49 100644 --- a/umac/dfs/core/src/misc/dfs.c +++ b/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; + 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, dfs->dfs_seg_id, - dfs->dfs_is_chirp, - dfs->dfs_freq_offset, - &dfs_unit_test); - } else { - error = dfs_start_host_based_bangradar(dfs); - } + 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 || diff --git a/umac/dfs/core/src/misc/dfs_full_offload.c b/umac/dfs/core/src/misc/dfs_full_offload.c index 026cfcc0d62b..7529429fcc9e 100644 --- a/umac/dfs/core/src/misc/dfs_full_offload.c +++ b/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; } diff --git a/umac/dfs/dispatcher/inc/wlan_dfs_ioctl.h b/umac/dfs/dispatcher/inc/wlan_dfs_ioctl.h index a17d29b32d64..84a8129ae596 100644 --- a/umac/dfs/dispatcher/inc/wlan_dfs_ioctl.h +++ b/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 diff --git a/umac/dfs/dispatcher/inc/wlan_dfs_tgt_api.h b/umac/dfs/dispatcher/inc/wlan_dfs_tgt_api.h index 738814b0668e..a2bd5042b25b 100644 --- a/umac/dfs/dispatcher/inc/wlan_dfs_tgt_api.h +++ b/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