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