diff --git a/umac/dfs/core/src/dfs.h b/umac/dfs/core/src/dfs.h index 86551bb8f0..cee7b3c05d 100644 --- a/umac/dfs/core/src/dfs.h +++ b/umac/dfs/core/src/dfs.h @@ -548,7 +548,6 @@ struct dfs_nolelem { /** * struct dfs_info - DFS Info. - * @rn_use_nol: Use the NOL when radar found (default: TRUE). * @rn_ftindex: Number of different types of radars. * @rn_lastfull_ts: Last 64 bit timstamp from recv interrupt. * @rn_last_ts: last 15 bit ts from recv descriptor. @@ -564,7 +563,6 @@ struct dfs_nolelem { * @dfs_last_bin5_dur: Last bin5 during. */ struct dfs_info { - int rn_use_nol; uint32_t rn_ftindex; uint64_t rn_lastfull_ts; uint16_t rn_last_ts; @@ -782,6 +780,7 @@ struct dfs_event_log { * @dfs_precac_done_list: PreCAC done list. * @dfs_precac_nol_list: PreCAC NOL List. * @dfs_is_offload_enabled: Set if DFS offload enabled. + * @dfs_use_nol: Use the NOL when radar found (default: TRUE). */ struct wlan_dfs { uint32_t dfs_debug_mask; @@ -871,6 +870,7 @@ struct wlan_dfs { struct dfs_ieee80211_channel *dfs_curchan; struct wlan_objmgr_pdev *dfs_pdev_obj; bool dfs_is_offload_enabled; + int dfs_use_nol; }; /** @@ -1527,12 +1527,6 @@ void dfs_cancel_cac_timer(struct wlan_dfs *dfs); */ void dfs_start_cac_timer(struct wlan_dfs *dfs); -/** - * dfs_get_usenol() - Returns use_nol flag. - * @dfs: Pointer to wlan_dfs structure. - */ -uint16_t dfs_get_usenol(struct wlan_dfs *dfs); - /** * dfs_set_update_nol_flag() - Sets update_nol flag. * @dfs: Pointer to wlan_dfs structure. @@ -1548,10 +1542,10 @@ void dfs_set_update_nol_flag(struct wlan_dfs *dfs, bool dfs_get_update_nol_flag(struct wlan_dfs *dfs); /** - * dfs_get_rn_use_nol() - Get usenol. + * dfs_get_use_nol() - Get usenol. * @dfs: Pointer to wlan_dfs structure. */ -int dfs_get_rn_use_nol(struct wlan_dfs *dfs); +int dfs_get_use_nol(struct wlan_dfs *dfs); /** * dfs_get_nol_timeout() - Get NOL timeout. @@ -1924,10 +1918,16 @@ void bin5_rules_check_internal(struct wlan_dfs *dfs, int *index); /** - * dfs_main_timer_init() - Initialize dfs timers. + * dfs_main_task_timer_init() - Initialize dfs task timer. * @dfs: Pointer to wlan_dfs structure. */ -void dfs_main_timer_init(struct wlan_dfs *dfs); +void dfs_main_task_timer_init(struct wlan_dfs *dfs); + +/** + * dfs_main_task_testtimer_init() - Initialize dfs task testtimer. + * @dfs: Pointer to wlan_dfs structure. + */ +void dfs_main_task_testtimer_init(struct wlan_dfs *dfs); /** * dfs_main_timer_reset() - Stop dfs timers. diff --git a/umac/dfs/core/src/filtering/dfs_radar.c b/umac/dfs/core/src/filtering/dfs_radar.c index bcbeef7e48..e6a5f8e65f 100644 --- a/umac/dfs/core/src/filtering/dfs_radar.c +++ b/umac/dfs/core/src/filtering/dfs_radar.c @@ -493,7 +493,7 @@ void dfs_radar_found_action(struct wlan_dfs *dfs) { bool wait_for_csa = false; - if (dfs->dfs_rinfo.rn_use_nol == 1) { + if (dfs->dfs_use_nol == 1) { /* * If precac is running and the radar found in secondary * VHT80 mark the channel as radar and add to NOL list. @@ -530,7 +530,7 @@ void dfs_radar_found_action(struct wlan_dfs *dfs) * from precac-required-list and precac-done-list to * precac-nol-list. */ - if (dfs->dfs_rinfo.rn_use_nol == 1) { + if (dfs->dfs_use_nol == 1) { dfs_mark_precac_dfs(dfs, dfs->is_radar_found_on_secondary_seg); } @@ -553,7 +553,7 @@ void dfs_radar_found_action(struct wlan_dfs *dfs) * NOL code isn't used, that flag is never cleared. This * needs to be fixed. See EV 105776. */ - if (dfs->dfs_rinfo.rn_use_nol == 1) { + if (dfs->dfs_use_nol == 1) { dfs_mlme_start_rcsa(dfs->dfs_pdev_obj, &wait_for_csa); if (wait_for_csa) @@ -572,7 +572,7 @@ void dfs_radar_found_action(struct wlan_dfs *dfs) */ dfs_radar_disable(dfs); dfs_second_segment_radar_disable(dfs); - } else if (dfs->dfs_rinfo.rn_use_nol == 0) { + } else if (dfs->dfs_use_nol == 0) { /* * For the test mode, don't do a CSA here; but setup * the test timer so we get a CSA _back_ to the diff --git a/umac/dfs/core/src/misc/dfs.c b/umac/dfs/core/src/misc/dfs.c index e8cc6cf2e1..7154d2b6e4 100644 --- a/umac/dfs/core/src/misc/dfs.c +++ b/umac/dfs/core/src/misc/dfs.c @@ -95,19 +95,21 @@ int dfs_get_debug_info(struct wlan_dfs *dfs, void *data) return (int)dfs->dfs_proc_phyerr; } -void dfs_main_timer_init(struct wlan_dfs *dfs) +void dfs_main_task_timer_init(struct wlan_dfs *dfs) { qdf_timer_init(NULL, &(dfs->wlan_dfs_task_timer), dfs_task, (void *)(dfs), QDF_TIMER_TYPE_WAKE_APPS); +} +void dfs_main_task_testtimer_init(struct wlan_dfs *dfs) +{ qdf_timer_init(NULL, - &(dfs->wlan_dfstesttimer), - dfs_testtimer_task, - (void *)dfs, - QDF_TIMER_TYPE_WAKE_APPS); + &(dfs->wlan_dfstesttimer), + dfs_testtimer_task, (void *)dfs, + QDF_TIMER_TYPE_WAKE_APPS); } int dfs_create_object(struct wlan_dfs **dfs) @@ -187,7 +189,7 @@ int dfs_main_attach(struct wlan_dfs *dfs) dfs->dfs_enable = 1; /*Verify : Passing NULL to qdf_timer_init().*/ - dfs_main_timer_init(dfs); + dfs_main_task_timer_init(dfs); WLAN_DFSQ_LOCK_INIT(dfs); STAILQ_INIT(&dfs->dfs_radarq); @@ -250,7 +252,7 @@ int dfs_main_attach(struct wlan_dfs *dfs) else if (usenol == 2) dfs_info(dfs, WLAN_DEBUG_DFS_ALWAYS, "NOL disabled; no CSA"); - dfs->dfs_rinfo.rn_use_nol = usenol; + dfs->dfs_use_nol = usenol; /* Init the cached extension channel busy for false alarm reduction */ dfs->dfs_rinfo.ext_chan_busy_ts = lmac_get_tsf64(dfs->dfs_pdev_obj); @@ -309,6 +311,14 @@ int dfs_attach(struct wlan_dfs *dfs) if (!dfs->dfs_is_offload_enabled) { ret = dfs_main_attach(dfs); + + /* + * For full offload we have a wmi handler registered to process a radar + * event from firmware in the event of a radar detect.So ,init of timer, + * dfs_task is not required for full offload. dfs_task timer is called + * in dfs_main_timer_init within dfs_main_attach for partial offload + * in the event of radar detect. + */ if (ret) { dfs_err(dfs, WLAN_DEBUG_DFS_ALWAYS, "dfs_main_attach failed"); return ret; @@ -318,6 +328,11 @@ int dfs_attach(struct wlan_dfs *dfs) dfs_zero_cac_attach(dfs); dfs_nol_attach(dfs); + /* + * Init of timer ,dfs_testtimer_task is required by both partial + * and full offload, indicating test mode timer initilization for both. + */ + dfs_main_task_testtimer_init(dfs); return 0; } @@ -844,7 +859,7 @@ int dfs_control(struct wlan_dfs *dfs, break; } *outsize = sizeof(uint32_t); - *((uint32_t *)outdata) = dfs->dfs_rinfo.rn_use_nol; + *((uint32_t *)outdata) = dfs->dfs_use_nol; dfs_info(dfs, WLAN_DEBUG_DFS_ALWAYS, "#Phyerr=%d, #false detect=%d, #queued=%d", @@ -892,7 +907,7 @@ int dfs_control(struct wlan_dfs *dfs, error = -EINVAL; break; } - dfs->dfs_rinfo.rn_use_nol = *(uint32_t *)indata; + dfs->dfs_use_nol = *(uint32_t *)indata; break; case DFS_GET_NOL: if (!outdata || !outsize || diff --git a/umac/dfs/core/src/misc/dfs_cac.c b/umac/dfs/core/src/misc/dfs_cac.c index 0c9650bffe..c837c8a980 100644 --- a/umac/dfs/core/src/misc/dfs_cac.c +++ b/umac/dfs/core/src/misc/dfs_cac.c @@ -78,11 +78,6 @@ void dfs_cac_valid_reset(struct wlan_dfs *dfs, } } -uint16_t dfs_get_usenol(struct wlan_dfs *dfs) -{ - return dfs ? (uint16_t)dfs->dfs_rinfo.rn_use_nol : 0; -} - void dfs_set_update_nol_flag(struct wlan_dfs *dfs, bool val) { dfs->update_nol = val; diff --git a/umac/dfs/core/src/misc/dfs_nol.c b/umac/dfs/core/src/misc/dfs_nol.c index fa20bdc0e2..1eb531983a 100644 --- a/umac/dfs/core/src/misc/dfs_nol.c +++ b/umac/dfs/core/src/misc/dfs_nol.c @@ -108,6 +108,7 @@ void dfs_nol_attach(struct wlan_dfs *dfs) { dfs->wlan_dfs_nol_timeout = DFS_NOL_TIMEOUT_S; dfs_nol_timer_init(dfs); + dfs->dfs_use_nol = 1; } /** @@ -486,9 +487,9 @@ void dfs_nol_timer_cleanup(struct wlan_dfs *dfs) dfs->dfs_nol = NULL; } -int dfs_get_rn_use_nol(struct wlan_dfs *dfs) +int dfs_get_use_nol(struct wlan_dfs *dfs) { - return dfs->dfs_rinfo.rn_use_nol; + return dfs->dfs_use_nol; } int dfs_get_nol_timeout(struct wlan_dfs *dfs) diff --git a/umac/dfs/dispatcher/inc/wlan_dfs_utils_api.h b/umac/dfs/dispatcher/inc/wlan_dfs_utils_api.h index c2a9b16da2..edb5d32858 100644 --- a/umac/dfs/dispatcher/inc/wlan_dfs_utils_api.h +++ b/umac/dfs/dispatcher/inc/wlan_dfs_utils_api.h @@ -228,15 +228,15 @@ QDF_STATUS utils_dfs_get_update_nol_flag(struct wlan_objmgr_pdev *pdev, bool *nol_flag); /** - * utils_dfs_get_rn_use_nol() - Get usenol. + * utils_dfs_get_dfs_use_nol() - Get usenol. * @pdev: Pointer to DFS pdev object. - * @rn_use_nol: Pointer to rn_use_nol. + * @dfs_use_nol: Pointer to dfs_use_nol. * - * wrapper function for dfs_get_rn_use_nol(). this + * wrapper function for dfs_get_dfs_use_nol(). this * function called from outside of dfs component. */ -QDF_STATUS utils_dfs_get_rn_use_nol(struct wlan_objmgr_pdev *pdev, - int *rn_use_nol); +QDF_STATUS utils_dfs_get_dfs_use_nol(struct wlan_objmgr_pdev *pdev, + int *dfs_use_nol); /** * utils_dfs_get_nol_timeout() - Get NOL timeout. diff --git a/umac/dfs/dispatcher/src/wlan_dfs_tgt_api.c b/umac/dfs/dispatcher/src/wlan_dfs_tgt_api.c index 18171517b6..28e127ac03 100644 --- a/umac/dfs/dispatcher/src/wlan_dfs_tgt_api.c +++ b/umac/dfs/dispatcher/src/wlan_dfs_tgt_api.c @@ -233,12 +233,34 @@ QDF_STATUS tgt_dfs_process_radar_ind(struct wlan_objmgr_pdev *pdev, return QDF_STATUS_E_FAILURE; } - dfs_process_radar_found_indication(dfs, radar_found); - dfs_mlme_mark_dfs(pdev, dfs->dfs_curchan->dfs_ch_ieee, - dfs->dfs_curchan->dfs_ch_freq, - dfs->dfs_curchan->dfs_ch_vhtop_ch_freq_seg2, - dfs->dfs_curchan->dfs_ch_flags); + /* + * Check if the current channel is a non DFS channel + */ + if (!(IEEE80211_IS_CHAN_DFS(dfs->dfs_curchan) || + ((IEEE80211_IS_CHAN_11AC_VHT160(dfs->dfs_curchan) || + IEEE80211_IS_CHAN_11AC_VHT80_80(dfs->dfs_curchan)) && + IEEE80211_IS_CHAN_DFS_CFREQ2(dfs->dfs_curchan)))) { + dfs_err(dfs, WLAN_DEBUG_DFS_ALWAYS, "radar event on a non-DFS channel"); + return QDF_STATUS_E_FAILURE; + } + if (dfs->dfs_use_nol) { + dfs_process_radar_found_indication(dfs, radar_found); + dfs_mlme_mark_dfs(pdev, dfs->dfs_curchan->dfs_ch_ieee, + dfs->dfs_curchan->dfs_ch_freq, + dfs->dfs_curchan->dfs_ch_vhtop_ch_freq_seg2, + dfs->dfs_curchan->dfs_ch_flags); + } else{ + + /* We are in test mode and should send a CSA back + * to same channel. + */ + qdf_timer_stop(&dfs->wlan_dfstesttimer); + dfs->wlan_dfstest = 1; + dfs->wlan_dfstest_ieeechan = dfs->dfs_curchan->dfs_ch_ieee; + dfs->wlan_dfstesttime = 1; /* 1ms */ + qdf_timer_mod(&dfs->wlan_dfstesttimer, dfs->wlan_dfstesttime); + } return QDF_STATUS_SUCCESS; } EXPORT_SYMBOL(tgt_dfs_process_radar_ind); diff --git a/umac/dfs/dispatcher/src/wlan_dfs_utils_api.c b/umac/dfs/dispatcher/src/wlan_dfs_utils_api.c index 28528f8771..76381aa08b 100644 --- a/umac/dfs/dispatcher/src/wlan_dfs_utils_api.c +++ b/umac/dfs/dispatcher/src/wlan_dfs_utils_api.c @@ -193,7 +193,7 @@ QDF_STATUS utils_dfs_get_usenol(struct wlan_objmgr_pdev *pdev, uint16_t *usenol) if (!dfs) return QDF_STATUS_E_FAILURE; - *usenol = dfs_get_usenol(dfs); + *usenol = dfs_get_use_nol(dfs); return QDF_STATUS_SUCCESS; } @@ -243,8 +243,8 @@ QDF_STATUS utils_dfs_get_update_nol_flag(struct wlan_objmgr_pdev *pdev, } EXPORT_SYMBOL(utils_dfs_get_update_nol_flag); -QDF_STATUS utils_dfs_get_rn_use_nol(struct wlan_objmgr_pdev *pdev, - int *rn_use_nol) +QDF_STATUS utils_dfs_get_dfs_use_nol(struct wlan_objmgr_pdev *pdev, + int *dfs_use_nol) { struct wlan_dfs *dfs; @@ -252,11 +252,11 @@ QDF_STATUS utils_dfs_get_rn_use_nol(struct wlan_objmgr_pdev *pdev, if (!dfs) return QDF_STATUS_E_FAILURE; - *rn_use_nol = dfs_get_rn_use_nol(dfs); + *dfs_use_nol = dfs_get_use_nol(dfs); return QDF_STATUS_SUCCESS; } -EXPORT_SYMBOL(utils_dfs_get_rn_use_nol); +EXPORT_SYMBOL(utils_dfs_get_dfs_use_nol); QDF_STATUS utils_dfs_get_nol_timeout(struct wlan_objmgr_pdev *pdev, int *dfs_nol_timeout)