From 6f35bb0636db2fdc0f8b8c980655b0c8053ddfc0 Mon Sep 17 00:00:00 2001 From: Shaakir Mohamed Date: Fri, 15 Sep 2017 15:52:21 -0700 Subject: [PATCH] qcacmn: Add usenol support for full offload In fulloffload mode, based on the value of the usenol variable decide whether to add the channel to NOL or not. In future, we need to merge this code with non-full offload. That will remove redundant code. Change-Id: I2bb403c3983a4a1eac906e6c13a3ec6a13fdc436 CRs-fixed: 2102829 --- umac/dfs/core/src/dfs.h | 24 +++++++------- umac/dfs/core/src/filtering/dfs_radar.c | 8 ++--- umac/dfs/core/src/misc/dfs.c | 33 ++++++++++++++------ umac/dfs/core/src/misc/dfs_cac.c | 5 --- umac/dfs/core/src/misc/dfs_nol.c | 5 +-- umac/dfs/dispatcher/inc/wlan_dfs_utils_api.h | 10 +++--- umac/dfs/dispatcher/src/wlan_dfs_tgt_api.c | 32 ++++++++++++++++--- umac/dfs/dispatcher/src/wlan_dfs_utils_api.c | 10 +++--- 8 files changed, 80 insertions(+), 47 deletions(-) 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)