Merge "qcacmn: Fix DFS kernel panic"
diff --git a/umac/dfs/core/src/dfs.h b/umac/dfs/core/src/dfs.h
index c656e4b..e785b60 100644
--- a/umac/dfs/core/src/dfs.h
+++ b/umac/dfs/core/src/dfs.h
@@ -448,7 +448,7 @@
  */
 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 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 @@
  * @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 f44ab44..92d6c22 100644
--- a/umac/dfs/core/src/misc/dfs.c
+++ b/umac/dfs/core/src/misc/dfs.c
@@ -1054,7 +1054,7 @@
 
 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 @@
 	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 14dba0d..5099393 100644
--- a/umac/dfs/core/src/misc/dfs_cac.c
+++ b/umac/dfs/core/src/misc/dfs_cac.c
@@ -241,7 +241,8 @@
 		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 388babd..638eb1c 100644
--- a/umac/dfs/core/src/misc/dfs_nol.c
+++ b/umac/dfs/core/src/misc/dfs_nol.c
@@ -254,7 +254,7 @@
 				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 fcc1036..61688d8 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 @@
 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 @@
 			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 @@
  */
 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 @@
  */
 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 @@
 		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_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 @@
 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 f2fddc4..0e246d8 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 @@
  */
 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 7f44c0e..3e8ae4d 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 @@
 	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 @@
 			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 @@
 			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 @@
 
 	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 @@
 	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 4ee88c0..1151d2f 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 @@
  */
 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 5ae8a4b..c792454 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 @@
 		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 @@
 		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 @@
 
 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 @@
 				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 @@
 		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_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 @@
 
 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 @@
 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 8bd5367..07d5a14 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 @@
 
 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 fe24244..64779c7 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 @@
 }
 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 cd5b3e2..495c013 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 @@
 			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,