From 8c01b66c0e45f6672eb489df32c4bdd9cb279143 Mon Sep 17 00:00:00 2001 From: Shashikala Prabhu Date: Wed, 19 Jul 2017 18:53:33 +0530 Subject: [PATCH] qcacmn: Fix DFS kernel panic Due to dfs and 'ic' flag mismatch, ieee80211_find_channel() was returning channel as NULL. Change-Id: I2c8a09b5a1018d7daf2a925bcad7063a6b0e2988 CRs-Fixed: 2067959 --- umac/dfs/core/src/dfs.h | 14 ++++++++++++-- umac/dfs/core/src/misc/dfs.c | 10 +++++++++- umac/dfs/core/src/misc/dfs_cac.c | 3 ++- umac/dfs/core/src/misc/dfs_nol.c | 2 +- umac/dfs/dispatcher/inc/wlan_dfs_mlme_api.h | 14 +++++++------- umac/dfs/dispatcher/inc/wlan_dfs_tgt_api.h | 2 +- umac/dfs/dispatcher/inc/wlan_dfs_ucfg_api.h | 16 ++++++++-------- umac/dfs/dispatcher/inc/wlan_dfs_utils_api.h | 9 +++++++++ umac/dfs/dispatcher/src/wlan_dfs_mlme_api.c | 18 +++++++++--------- umac/dfs/dispatcher/src/wlan_dfs_tgt_api.c | 2 +- umac/dfs/dispatcher/src/wlan_dfs_utils_api.c | 15 +++++++++++++++ .../lmac_if/inc/wlan_lmac_if_def.h | 2 +- 12 files changed, 75 insertions(+), 32 deletions(-) diff --git a/umac/dfs/core/src/dfs.h b/umac/dfs/core/src/dfs.h index c656e4b9773d..e785b60da827 100644 --- a/umac/dfs/core/src/dfs.h +++ b/umac/dfs/core/src/dfs.h @@ -448,7 +448,7 @@ struct dfs_filtertype { */ struct dfs_ieee80211_channel { uint16_t dfs_ch_freq; - uint32_t dfs_ch_flags; + uint64_t dfs_ch_flags; uint16_t dfs_ch_flagext; uint8_t dfs_ch_ieee; uint8_t dfs_ch_vhtop_ch_freq_seg1; @@ -1743,7 +1743,7 @@ void ol_if_dfs_clist_update(struct wlan_dfs *dfs, */ void dfs_set_current_channel(struct wlan_dfs *dfs, uint16_t dfs_ch_freq, - uint32_t dfs_ch_flags, + uint64_t dfs_ch_flags, uint16_t dfs_ch_flagext, uint8_t dfs_ch_ieee, uint8_t dfs_ch_vhtop_ch_freq_seg1, @@ -1922,4 +1922,14 @@ void dfs_main_timer_reset(struct wlan_dfs *dfs); * @dfs: Pointer to wlan_dfs structure. */ void dfs_stop(struct wlan_dfs *dfs); + +/** + * dfs_update_cur_chan_flags() - Update DFS channel flag and flagext. + * @dfs: Pointer to wlan_dfs structure. + * @flags: New channel flags + * @flagext: New Extended flags + */ +void dfs_update_cur_chan_flags(struct wlan_dfs *dfs, + uint64_t flags, + uint16_t flagext); #endif /* _DFS_H_ */ diff --git a/umac/dfs/core/src/misc/dfs.c b/umac/dfs/core/src/misc/dfs.c index f44ab4470847..92d6c229fa51 100644 --- a/umac/dfs/core/src/misc/dfs.c +++ b/umac/dfs/core/src/misc/dfs.c @@ -1054,7 +1054,7 @@ int dfs_get_thresholds(struct wlan_dfs *dfs, void dfs_set_current_channel(struct wlan_dfs *dfs, uint16_t dfs_ch_freq, - uint32_t dfs_ch_flags, + uint64_t dfs_ch_flags, uint16_t dfs_ch_flagext, uint8_t dfs_ch_ieee, uint8_t dfs_ch_vhtop_ch_freq_seg1, @@ -1081,3 +1081,11 @@ u_int dfs_ieee80211_chan2freq(struct dfs_ieee80211_channel *chan) return chan == IEEE80211_CHAN_ANYC ? IEEE80211_CHAN_ANY : chan->dfs_ch_freq; } + +void dfs_update_cur_chan_flags(struct wlan_dfs *dfs, + uint64_t flags, + uint16_t flagext) +{ + dfs->dfs_curchan->dfs_ch_flags = flags; + dfs->dfs_curchan->dfs_ch_flagext = flagext; +} diff --git a/umac/dfs/core/src/misc/dfs_cac.c b/umac/dfs/core/src/misc/dfs_cac.c index 14dba0d8a095..5099393bcc81 100644 --- a/umac/dfs/core/src/misc/dfs_cac.c +++ b/umac/dfs/core/src/misc/dfs_cac.c @@ -241,7 +241,8 @@ int dfs_random_channel(struct wlan_dfs *dfs, uint8_t skip_curchan) { int chanStart, n = 0; - uint32_t curChanFlags = 0, chan_flags, chan_flagext = 0; + uint64_t curChanFlags = 0, chan_flags; + uint16_t chan_flagext = 0; int numGChannels = 0; int numAChannels = 0; int j = 0; diff --git a/umac/dfs/core/src/misc/dfs_nol.c b/umac/dfs/core/src/misc/dfs_nol.c index 388babdf4ff8..638eb1c34c0b 100644 --- a/umac/dfs/core/src/misc/dfs_nol.c +++ b/umac/dfs/core/src/misc/dfs_nol.c @@ -254,7 +254,7 @@ void dfs_print_nolhistory(struct wlan_dfs *dfs) i); if (IEEE80211_IS_CHAN_HISTORY_RADAR(c)) { DFS_PRINTK( - "nolhistory:%d channel=%d MHz Flags=%X\n", + "nolhistory:%d channel=%d MHz Flags=%llx\n", j, c->dfs_ch_freq, c->dfs_ch_flags); j++; } diff --git a/umac/dfs/dispatcher/inc/wlan_dfs_mlme_api.h b/umac/dfs/dispatcher/inc/wlan_dfs_mlme_api.h index fcc1036996bc..61688d825557 100644 --- a/umac/dfs/dispatcher/inc/wlan_dfs_mlme_api.h +++ b/umac/dfs/dispatcher/inc/wlan_dfs_mlme_api.h @@ -38,7 +38,7 @@ extern struct dfs_to_mlme global_dfs_to_mlme; void dfs_mlme_channel_mark_radar(struct wlan_objmgr_pdev *pdev, uint16_t freq, uint8_t vhtop_ch_freq_seg2, - uint32_t flags); + uint64_t flags); /** * dfs_mlme_start_rcsa() - Send RCSA to RootAP. @@ -58,7 +58,7 @@ void dfs_mlme_mark_dfs(struct wlan_objmgr_pdev *pdev, uint8_t ieee, uint16_t freq, uint8_t vhtop_ch_freq_seg2, - uint32_t flags); + uint64_t flags); /** * dfs_mlme_start_csa() - Sends CSA in ieeeChan @@ -130,7 +130,7 @@ void dfs_mlme_find_any_valid_channel(struct wlan_objmgr_pdev *pdev, */ QDF_STATUS dfs_mlme_get_extchan(struct wlan_objmgr_pdev *pdev, uint16_t *dfs_ch_freq, - uint32_t *dfs_ch_flags, + uint64_t *dfs_ch_flags, uint16_t *dfs_ch_flagext, uint8_t *dfs_ch_ieee, uint8_t *dfs_ch_vhtop_ch_freq_seg1, @@ -152,7 +152,7 @@ void dfs_mlme_set_no_chans_available(struct wlan_objmgr_pdev *pdev, */ int dfs_mlme_ieee2mhz(struct wlan_objmgr_pdev *pdev, int ieee, - int flag); + uint64_t flag); /** * dfs_mlme_find_dot11_channel() - Get dot11 channel from ieee, cfreq2 and mode. @@ -173,7 +173,7 @@ void dfs_mlme_find_dot11_channel(struct wlan_objmgr_pdev *pdev, uint8_t des_cfreq2, int mode, uint16_t *dfs_ch_freq, - uint32_t *dfs_ch_flags, + uint64_t *dfs_ch_flags, uint16_t *dfs_ch_flagext, uint8_t *dfs_ch_ieee, uint8_t *dfs_ch_vhtop_ch_freq_seg1, @@ -193,7 +193,7 @@ void dfs_mlme_find_dot11_channel(struct wlan_objmgr_pdev *pdev, */ void dfs_mlme_get_dfs_ch_channels(struct wlan_objmgr_pdev *pdev, uint16_t *dfs_ch_freq, - uint32_t *dfs_ch_flags, + uint64_t *dfs_ch_flags, uint16_t *dfs_ch_flagext, uint8_t *dfs_ch_ieee, uint8_t *dfs_ch_vhtop_ch_freq_seg1, @@ -239,6 +239,6 @@ void dfs_mlme_clist_update(struct wlan_objmgr_pdev *pdev, int dfs_mlme_get_cac_timeout(struct wlan_objmgr_pdev *pdev, uint16_t dfs_ch_freq, uint8_t dfs_ch_vhtop_ch_freq_seg2, - uint32_t dfs_ch_flags); + uint64_t dfs_ch_flags); #endif /* _WLAN_DFS_MLME_API_H_ */ diff --git a/umac/dfs/dispatcher/inc/wlan_dfs_tgt_api.h b/umac/dfs/dispatcher/inc/wlan_dfs_tgt_api.h index f2fddc4163d2..0e246d8f4d63 100644 --- a/umac/dfs/dispatcher/inc/wlan_dfs_tgt_api.h +++ b/umac/dfs/dispatcher/inc/wlan_dfs_tgt_api.h @@ -43,7 +43,7 @@ extern struct dfs_to_mlme global_dfs_to_mlme; */ QDF_STATUS tgt_dfs_set_current_channel(struct wlan_objmgr_pdev *pdev, uint16_t dfs_ch_freq, - uint32_t dfs_ch_flags, + uint64_t dfs_ch_flags, uint16_t dfs_ch_flagext, uint8_t dfs_ch_ieee, uint8_t dfs_ch_vhtop_ch_freq_seg1, diff --git a/umac/dfs/dispatcher/inc/wlan_dfs_ucfg_api.h b/umac/dfs/dispatcher/inc/wlan_dfs_ucfg_api.h index 7f44c0e52852..3e8ae4d0d6a3 100644 --- a/umac/dfs/dispatcher/inc/wlan_dfs_ucfg_api.h +++ b/umac/dfs/dispatcher/inc/wlan_dfs_ucfg_api.h @@ -70,13 +70,13 @@ struct dfs_to_mlme { QDF_STATUS (*dfs_channel_mark_radar)(struct wlan_objmgr_pdev *pdev, uint16_t freq, uint8_t vhtop_ch_freq_seg2, - uint32_t flags); + uint64_t flags); QDF_STATUS (*dfs_start_rcsa)(struct wlan_objmgr_pdev *pdev); QDF_STATUS (*mlme_mark_dfs)(struct wlan_objmgr_pdev *pdev, uint8_t ieee, uint16_t freq, uint8_t vhtop_ch_freq_seg2, - uint32_t flags); + uint64_t flags); QDF_STATUS (*mlme_start_csa)(struct wlan_objmgr_pdev *pdev, uint8_t ieeeChan); QDF_STATUS (*mlme_proc_cac)(struct wlan_objmgr_pdev *pdev); @@ -98,7 +98,7 @@ struct dfs_to_mlme { int *ret_val); QDF_STATUS (*mlme_get_extchan)(struct wlan_objmgr_pdev *pdev, uint16_t *dfs_ch_freq, - uint32_t *dfs_ch_flags, + uint64_t *dfs_ch_flags, uint16_t *dfs_ch_flagext, uint8_t *dfs_ch_ieee, uint8_t *dfs_ch_vhtop_ch_freq_seg1, @@ -107,14 +107,14 @@ struct dfs_to_mlme { int val); QDF_STATUS (*mlme_ieee2mhz)(struct wlan_objmgr_pdev *pdev, int ieee, - int flag, + uint64_t flag, int *freq); QDF_STATUS (*mlme_find_dot11_channel)(struct wlan_objmgr_pdev *pdev, uint8_t ieee, uint8_t des_cfreq2, int mode, uint16_t *dfs_ch_freq, - uint32_t *dfs_ch_flags, + uint64_t *dfs_ch_flags, uint16_t *dfs_ch_flagext, uint8_t *dfs_ch_ieee, uint8_t *dfs_ch_vhtop_ch_freq_seg1, @@ -122,14 +122,14 @@ struct dfs_to_mlme { QDF_STATUS (*mlme_get_dfs_ch_channels)(struct wlan_objmgr_pdev *pdev, uint16_t *dfs_ch_freq, - uint32_t *dfs_ch_flags, + uint64_t *dfs_ch_flags, uint16_t *dfs_ch_flagext, uint8_t *dfs_ch_ieee, uint8_t *dfs_ch_vhtop_ch_freq_seg1, uint8_t *dfs_ch_vhtop_ch_freq_seg2, int index); QDF_STATUS (*mlme_dfs_ch_flags_ext)(struct wlan_objmgr_pdev *pdev, - uint32_t *flag_ext); + uint16_t *flag_ext); QDF_STATUS (*mlme_channel_change_by_precac)( struct wlan_objmgr_pdev *pdev); QDF_STATUS (*mlme_nol_timeout_notification)( @@ -140,7 +140,7 @@ struct dfs_to_mlme { QDF_STATUS (*mlme_get_cac_timeout)(struct wlan_objmgr_pdev *pdev, uint16_t dfs_ch_freq, uint8_t c_vhtop_ch_freq_seg2, - uint32_t dfs_ch_flags, + uint64_t dfs_ch_flags, int *cac_timeout); }; diff --git a/umac/dfs/dispatcher/inc/wlan_dfs_utils_api.h b/umac/dfs/dispatcher/inc/wlan_dfs_utils_api.h index 4ee88c0c9bc0..1151d2f0e721 100644 --- a/umac/dfs/dispatcher/inc/wlan_dfs_utils_api.h +++ b/umac/dfs/dispatcher/inc/wlan_dfs_utils_api.h @@ -427,4 +427,13 @@ uint8_t utils_dfs_freq_to_chan(uint32_t freq); */ uint32_t utils_dfs_chan_to_freq(uint8_t chan); +/** + * utils_dfs_update_cur_chan_flags() - Update DFS channel flag and flagext. + * @pdev: Pointer to DFS pdev object. + * @flags: New channel flags + * @flagext: New Extended flags + */ +QDF_STATUS utils_dfs_update_cur_chan_flags(struct wlan_objmgr_pdev *pdev, + uint64_t flags, + uint16_t flagext); #endif /* _WLAN_DFS_UTILS_API_H_ */ diff --git a/umac/dfs/dispatcher/src/wlan_dfs_mlme_api.c b/umac/dfs/dispatcher/src/wlan_dfs_mlme_api.c index 5ae8a4b8012f..c792454d001a 100644 --- a/umac/dfs/dispatcher/src/wlan_dfs_mlme_api.c +++ b/umac/dfs/dispatcher/src/wlan_dfs_mlme_api.c @@ -33,7 +33,7 @@ void dfs_mlme_channel_mark_radar(struct wlan_objmgr_pdev *pdev, uint16_t freq, uint8_t vhtop_ch_freq_seg2, - uint32_t flags) + uint64_t flags) { if (global_dfs_to_mlme.dfs_channel_mark_radar != NULL) global_dfs_to_mlme.dfs_channel_mark_radar(pdev, @@ -53,7 +53,7 @@ void dfs_mlme_mark_dfs(struct wlan_objmgr_pdev *pdev, uint8_t ieee, uint16_t freq, uint8_t vhtop_ch_freq_seg2, - uint32_t flags) + uint64_t flags) { if (global_dfs_to_mlme.mlme_mark_dfs != NULL) global_dfs_to_mlme.mlme_mark_dfs(pdev, @@ -82,7 +82,7 @@ void dfs_mlme_mark_dfs(struct wlan_objmgr_pdev *pdev, uint8_t ieee, uint16_t freq, uint8_t vhtop_ch_freq_seg2, - uint32_t flags) + uint64_t flags) { if (!pdev) { DFS_PRINTK("%s: null pdev\n", __func__); @@ -174,7 +174,7 @@ void dfs_mlme_find_any_valid_channel(struct wlan_objmgr_pdev *pdev, QDF_STATUS dfs_mlme_get_extchan(struct wlan_objmgr_pdev *pdev, uint16_t *dfs_ch_freq, - uint32_t *dfs_ch_flags, + uint64_t *dfs_ch_flags, uint16_t *dfs_ch_flagext, uint8_t *dfs_ch_ieee, uint8_t *dfs_ch_vhtop_ch_freq_seg1, @@ -201,7 +201,7 @@ void dfs_mlme_set_no_chans_available(struct wlan_objmgr_pdev *pdev, val); } -int dfs_mlme_ieee2mhz(struct wlan_objmgr_pdev *pdev, int ieee, int flag) +int dfs_mlme_ieee2mhz(struct wlan_objmgr_pdev *pdev, int ieee, uint64_t flag) { int freq = 0; @@ -219,7 +219,7 @@ void dfs_mlme_find_dot11_channel(struct wlan_objmgr_pdev *pdev, uint8_t des_cfreq2, int mode, uint16_t *dfs_ch_freq, - uint32_t *dfs_ch_flags, + uint64_t *dfs_ch_flags, uint16_t *dfs_ch_flagext, uint8_t *dfs_ch_ieee, uint8_t *dfs_ch_vhtop_ch_freq_seg1, @@ -240,7 +240,7 @@ void dfs_mlme_find_dot11_channel(struct wlan_objmgr_pdev *pdev, void dfs_mlme_get_dfs_ch_channels(struct wlan_objmgr_pdev *pdev, uint16_t *dfs_ch_freq, - uint32_t *dfs_ch_flags, + uint64_t *dfs_ch_flags, uint16_t *dfs_ch_flagext, uint8_t *dfs_ch_ieee, uint8_t *dfs_ch_vhtop_ch_freq_seg1, @@ -260,7 +260,7 @@ void dfs_mlme_get_dfs_ch_channels(struct wlan_objmgr_pdev *pdev, uint32_t dfs_mlme_dfs_ch_flags_ext(struct wlan_objmgr_pdev *pdev) { - uint32_t flag_ext = 0; + uint16_t flag_ext = 0; if (global_dfs_to_mlme.mlme_dfs_ch_flags_ext != NULL) global_dfs_to_mlme.mlme_dfs_ch_flags_ext(pdev, @@ -296,7 +296,7 @@ void dfs_mlme_clist_update(struct wlan_objmgr_pdev *pdev, int dfs_mlme_get_cac_timeout(struct wlan_objmgr_pdev *pdev, uint16_t dfs_ch_freq, uint8_t dfs_ch_vhtop_ch_freq_seg2, - uint32_t dfs_ch_flags) + uint64_t dfs_ch_flags) { int cac_timeout = 0; diff --git a/umac/dfs/dispatcher/src/wlan_dfs_tgt_api.c b/umac/dfs/dispatcher/src/wlan_dfs_tgt_api.c index 8bd536778fac..07d5a14c401e 100644 --- a/umac/dfs/dispatcher/src/wlan_dfs_tgt_api.c +++ b/umac/dfs/dispatcher/src/wlan_dfs_tgt_api.c @@ -37,7 +37,7 @@ wlan_psoc_get_dfs_txops(struct wlan_objmgr_psoc *psoc) QDF_STATUS tgt_dfs_set_current_channel(struct wlan_objmgr_pdev *pdev, uint16_t dfs_ch_freq, - uint32_t dfs_ch_flags, + uint64_t dfs_ch_flags, uint16_t dfs_ch_flagext, uint8_t dfs_ch_ieee, uint8_t dfs_ch_vhtop_ch_freq_seg1, diff --git a/umac/dfs/dispatcher/src/wlan_dfs_utils_api.c b/umac/dfs/dispatcher/src/wlan_dfs_utils_api.c index fe2424460d70..64779c7c8bf1 100644 --- a/umac/dfs/dispatcher/src/wlan_dfs_utils_api.c +++ b/umac/dfs/dispatcher/src/wlan_dfs_utils_api.c @@ -392,6 +392,21 @@ QDF_STATUS utils_dfs_get_nol_chfreq_and_chwidth(struct wlan_objmgr_pdev *pdev, } EXPORT_SYMBOL(utils_dfs_get_nol_chfreq_and_chwidth); +QDF_STATUS utils_dfs_update_cur_chan_flags(struct wlan_objmgr_pdev *pdev, + uint64_t flags, + uint16_t flagext) +{ + struct wlan_dfs *dfs; + + dfs = global_dfs_to_mlme.pdev_get_comp_private_obj(pdev); + if (dfs == NULL) + return QDF_STATUS_E_FAILURE; + + dfs_update_cur_chan_flags(dfs, flags, flagext); + + return QDF_STATUS_SUCCESS; +} + static void utils_dfs_get_max_phy_mode(struct wlan_objmgr_pdev *pdev, uint32_t *phy_mode) { diff --git a/umac/global_umac_dispatcher/lmac_if/inc/wlan_lmac_if_def.h b/umac/global_umac_dispatcher/lmac_if/inc/wlan_lmac_if_def.h index cd5b3e2baa54..495c0138e388 100644 --- a/umac/global_umac_dispatcher/lmac_if/inc/wlan_lmac_if_def.h +++ b/umac/global_umac_dispatcher/lmac_if/inc/wlan_lmac_if_def.h @@ -846,7 +846,7 @@ struct wlan_lmac_if_dfs_rx_ops { int *precac_timeout); QDF_STATUS (*dfs_set_current_channel)(struct wlan_objmgr_pdev *pdev, uint16_t ic_freq, - uint32_t ic_flags, + uint64_t ic_flags, uint16_t ic_flagext, uint8_t ic_ieee, uint8_t ic_vhtop_ch_freq_seg1,