[DTV00841130] cfg80211: Fix compile errors for linux-4.9.y

[Description]
Fix compile errors for linux-4.9.y due to:
- linux-4.8.y cfg80211: changed type of cfg80211_scan_done's 2nd parameter
  from bool to struct cfg80211_scan_info
- linux-4.7.y cfg80211: removed IEEE80211_BAND_ and changed to
  use NL80211_BAND_ (in nl80211)

Define KAL_BAND_ and replace all references of NL80211_BAND_ and
IEEE80211_BAND_. Define a new KAL function kalCfg80211ScanDone to replace
direct calls of cfg80211_scan_done.

Test build ok with following Linux kernel versions:
3.10, 3.13, 3.18, 4.1, 4.4, 4.9

Test mt7668u STA wlan0 interface connection ok with:
Ubuntu 16.04 + linux-4.4.63

Change-Id: I93ac374883ec10c094554ffd6023b62309b1d046
CR-Id: DTV00841130
Signed-off-by: George Kuo <george.kuo@mediatek.com>
diff --git a/mgmt/rlm_domain.c b/mgmt/rlm_domain.c
index a907b5c..8464bb0 100644
--- a/mgmt/rlm_domain.c
+++ b/mgmt/rlm_domain.c
@@ -822,15 +822,15 @@
 
 	if (eSpecificBand == BAND_2G4) {
 		i = 0;
-		max_count = rlmDomainGetActiveChannelCount(IEEE80211_BAND_2GHZ);
+		max_count = rlmDomainGetActiveChannelCount(KAL_BAND_2GHZ);
 	} else if (eSpecificBand == BAND_5G) {
-		i = rlmDomainGetActiveChannelCount(IEEE80211_BAND_2GHZ);
-		max_count = rlmDomainGetActiveChannelCount(IEEE80211_BAND_5GHZ) +
-			rlmDomainGetActiveChannelCount(IEEE80211_BAND_2GHZ);
+		i = rlmDomainGetActiveChannelCount(KAL_BAND_2GHZ);
+		max_count = rlmDomainGetActiveChannelCount(KAL_BAND_5GHZ) +
+			rlmDomainGetActiveChannelCount(KAL_BAND_2GHZ);
 	} else {
 		i = 0;
-		max_count = rlmDomainGetActiveChannelCount(IEEE80211_BAND_5GHZ) +
-			rlmDomainGetActiveChannelCount(IEEE80211_BAND_2GHZ);
+		max_count = rlmDomainGetActiveChannelCount(KAL_BAND_5GHZ) +
+			rlmDomainGetActiveChannelCount(KAL_BAND_2GHZ);
 	}
 
 	ucNum = 0;
@@ -839,7 +839,7 @@
 		if (fgNoDfs && (prCh->flags & IEEE80211_CHAN_RADAR))
 			continue; /*not match*/
 
-		if (i < rlmDomainGetActiveChannelCount(IEEE80211_BAND_2GHZ))
+		if (i < rlmDomainGetActiveChannelCount(KAL_BAND_2GHZ))
 			band = BAND_2G4;
 		else
 			band = BAND_5G;
@@ -941,8 +941,8 @@
 
 
 	pWiphy = priv_to_wiphy(prAdapter->prGlueInfo);
-	max_channel_count = pWiphy->bands[IEEE80211_BAND_2GHZ]->n_channels
-						+ pWiphy->bands[IEEE80211_BAND_5GHZ]->n_channels;
+	max_channel_count = pWiphy->bands[KAL_BAND_2GHZ]->n_channels
+						+ pWiphy->bands[KAL_BAND_5GHZ]->n_channels;
 
 	if (max_channel_count == 0) {
 		DBGLOG(RLM, ERROR, "%s, invalid channel count.\n", __func__);
@@ -1153,11 +1153,11 @@
 
 	if (eBand == BAND_2G4) {
 		start_idx = 0;
-		end_idx = rlmDomainGetActiveChannelCount(IEEE80211_BAND_2GHZ);
+		end_idx = rlmDomainGetActiveChannelCount(KAL_BAND_2GHZ);
 	} else {
-		start_idx = rlmDomainGetActiveChannelCount(IEEE80211_BAND_2GHZ);
-		end_idx = rlmDomainGetActiveChannelCount(IEEE80211_BAND_2GHZ) +
-					rlmDomainGetActiveChannelCount(IEEE80211_BAND_5GHZ);
+		start_idx = rlmDomainGetActiveChannelCount(KAL_BAND_2GHZ);
+		end_idx = rlmDomainGetActiveChannelCount(KAL_BAND_2GHZ) +
+					rlmDomainGetActiveChannelCount(KAL_BAND_5GHZ);
 	}
 
 	for (idx = start_idx; idx < end_idx; idx++) {
@@ -2405,22 +2405,22 @@
 	UINT32 ch_cnt;
 	struct wiphy *wiphy;
 	u8 band_idx, ch_idx;
-	P_CMD_SET_COUNTRY_CHANNEL_POWER_LIMIT_V2_T prCmd[IEEE80211_NUM_BANDS] = {NULL};
-	UINT_32 u4SetCmdTableMaxSize[IEEE80211_NUM_BANDS] = {0};
+	P_CMD_SET_COUNTRY_CHANNEL_POWER_LIMIT_V2_T prCmd[KAL_NUM_BANDS] = {NULL};
+	UINT_32 u4SetCmdTableMaxSize[KAL_NUM_BANDS] = {0};
 	const INT_8 *prChannelList = NULL;
 
 
 	DBGLOG(RLM, INFO, "rlmDomainSendPwrLimitCmd()\n");
 
 	wiphy = priv_to_wiphy(prAdapter->prGlueInfo);
-	for (band_idx = 0; band_idx < IEEE80211_NUM_BANDS; band_idx++) {
-		if (band_idx != IEEE80211_BAND_2GHZ && band_idx != IEEE80211_BAND_5GHZ)
+	for (band_idx = 0; band_idx < KAL_NUM_BANDS; band_idx++) {
+		if (band_idx != KAL_BAND_2GHZ && band_idx != KAL_BAND_5GHZ)
 			continue;
 
-		prChannelList = (band_idx == IEEE80211_BAND_2GHZ) ?
+		prChannelList = (band_idx == KAL_BAND_2GHZ) ?
 			gTx_Pwr_Limit_2g_Ch : gTx_Pwr_Limit_5g_Ch;
 
-		ch_cnt = (band_idx == IEEE80211_BAND_2GHZ) ? TX_PWR_LIMIT_2G_CH_NUM :
+		ch_cnt = (band_idx == KAL_BAND_2GHZ) ? TX_PWR_LIMIT_2G_CH_NUM :
 			TX_PWR_LIMIT_5G_CH_NUM;
 
 		if (!ch_cnt)
@@ -2455,7 +2455,7 @@
 		kalMemSet(prCmd[band_idx], MAX_TX_POWER, u4SetCmdTableMaxSize[band_idx]);
 
 		prCmd[band_idx]->ucNum = ch_cnt;
-		prCmd[band_idx]->eband = (band_idx == IEEE80211_BAND_2GHZ) ? BAND_2G4 : BAND_5G;
+		prCmd[band_idx]->eband = (band_idx == KAL_BAND_2GHZ) ? BAND_2G4 : BAND_5G;
 		prCmd[band_idx]->countryCode = rlmDomainGetCountryCode();
 
 		DBGLOG(RLM, INFO, "%s, active n_channels=%d, band=%d\n", __func__, ch_cnt, prCmd[band_idx]->eband);
@@ -2472,15 +2472,15 @@
 	 */
 	rlmDomainGetTxPwrLimit(rlmDomainGetCountryCode(),
 							prAdapter->prGlueInfo,
-							prCmd[IEEE80211_BAND_2GHZ],
-							prCmd[IEEE80211_BAND_5GHZ]);
+							prCmd[KAL_BAND_2GHZ],
+							prCmd[KAL_BAND_5GHZ]);
 
 
-	for (band_idx = 0; band_idx < IEEE80211_NUM_BANDS; band_idx++) {
+	for (band_idx = 0; band_idx < KAL_NUM_BANDS; band_idx++) {
 		UINT_8 ucRemainChNum, i, ucTempChNum, prCmdBatchNum;
 		UINT_32 u4BufSize = 0;
 		P_CMD_SET_COUNTRY_CHANNEL_POWER_LIMIT_V2_T prTempCmd = NULL;
-		ENUM_BAND_T eBand = (band_idx == IEEE80211_BAND_2GHZ) ?
+		ENUM_BAND_T eBand = (band_idx == KAL_BAND_2GHZ) ?
 				BAND_2G4 : BAND_5G;
 
 		if (!prCmd[band_idx])
@@ -2537,7 +2537,7 @@
 	}
 
 error:
-	for (band_idx = 0; band_idx < IEEE80211_NUM_BANDS; band_idx++) {
+	for (band_idx = 0; band_idx < KAL_NUM_BANDS; band_idx++) {
 		if (prCmd[band_idx])
 			cnmMemFree(prAdapter, prCmd[band_idx]);
 	}
@@ -2718,17 +2718,17 @@
 void rlmDomainAddActiveChannel(u8 band)
 
 {
-	if (band == IEEE80211_BAND_2GHZ)
+	if (band == KAL_BAND_2GHZ)
 		g_mtk_regd_control.n_channel_active_2g += 1;
-	else if (band == IEEE80211_BAND_5GHZ)
+	else if (band == KAL_BAND_5GHZ)
 		g_mtk_regd_control.n_channel_active_5g += 1;
 }
 
 u8 rlmDomainGetActiveChannelCount(u8 band)
 {
-	if (band == IEEE80211_BAND_2GHZ)
+	if (band == KAL_BAND_2GHZ)
 		return g_mtk_regd_control.n_channel_active_2g;
-	else if (band == IEEE80211_BAND_5GHZ)
+	else if (band == KAL_BAND_5GHZ)
 		return g_mtk_regd_control.n_channel_active_5g;
 	else
 		return 0;
@@ -2943,17 +2943,7 @@
 	rlmDomainSetRefWiphy(pWiphy);
 
 	ch_count = 0;
-	for (band_idx = 0; band_idx < IEEE80211_NUM_BANDS; band_idx++) {
-		/**
-		 * enum nl80211_band - Frequency band
-		 * @NL80211_BAND_2GHZ: 2.4 GHz ISM band
-		 * @NL80211_BAND_5GHZ: around 5 GHz band (4.9 - 5.7 GHz)
-		 * @NL80211_BAND_60GHZ: around 60 GHz band (58.32 - 64.80 GHz)
-		 * @NUM_NL80211_BANDS: number of bands, avoid using this in userspace
-		 *	 since newer kernel versions may support more bands
-		 */
-
-		/*select band*/
+	for (band_idx = 0; band_idx < KAL_NUM_BANDS; band_idx++) {
 		sband = pWiphy->bands[band_idx];
 		if (!sband)
 			continue;
@@ -2996,8 +2986,8 @@
 	u32 ch_count, idx;
 	struct channel *pCh;
 
-	prBuff->n_channels_2g = rlmDomainGetActiveChannelCount(IEEE80211_BAND_2GHZ);
-	prBuff->n_channels_5g = rlmDomainGetActiveChannelCount(IEEE80211_BAND_5GHZ);
+	prBuff->n_channels_2g = rlmDomainGetActiveChannelCount(KAL_BAND_2GHZ);
+	prBuff->n_channels_5g = rlmDomainGetActiveChannelCount(KAL_BAND_5GHZ);
 	ch_count = prBuff->n_channels_2g + prBuff->n_channels_5g;
 
 	if (ch_count > max_ch_count) {
diff --git a/os/linux/gl_cfg80211.c b/os/linux/gl_cfg80211.c
index 9952451..587ec05 100644
--- a/os/linux/gl_cfg80211.c
+++ b/os/linux/gl_cfg80211.c
@@ -1649,10 +1649,10 @@
 		prMsgChnlReq->ucChannelNum = nicFreq2ChannelNum(chan->center_freq * 1000);
 
 		switch (chan->band) {
-		case IEEE80211_BAND_2GHZ:
+		case KAL_BAND_2GHZ:
 			prMsgChnlReq->eBand = BAND_2G4;
 			break;
-		case IEEE80211_BAND_5GHZ:
+		case KAL_BAND_5GHZ:
 			prMsgChnlReq->eBand = BAND_5G;
 			break;
 		default:
@@ -3201,17 +3201,7 @@
 	DBGLOG(RLM, INFO, "%s()\n", __func__);
 
 	/* to reset cha->flags*/
-	for (band_idx = 0; band_idx < IEEE80211_NUM_BANDS; band_idx++) {
-		/**
-		 * enum nl80211_band - Frequency band
-		 * @NL80211_BAND_2GHZ: 2.4 GHz ISM band
-		 * @NL80211_BAND_5GHZ: around 5 GHz band (4.9 - 5.7 GHz)
-		 * @NL80211_BAND_60GHZ: around 60 GHz band (58.32 - 64.80 GHz)
-		 * @NUM_NL80211_BANDS: number of bands, avoid using this in userspace
-		 *	 since newer kernel versions may support more bands
-		 */
-
-		/*select band*/
+	for (band_idx = 0; band_idx < KAL_NUM_BANDS; band_idx++) {
 		sband = pWiphy->bands[band_idx];
 		if (!sband)
 			continue;
diff --git a/os/linux/gl_init.c b/os/linux/gl_init.c
index 63617bf..a78c6b1 100644
--- a/os/linux/gl_init.c
+++ b/os/linux/gl_init.c
@@ -182,7 +182,7 @@
 
 #define CHAN2G(_channel, _freq, _flags)         \
 {                                           \
-	.band               = IEEE80211_BAND_2GHZ,  \
+	.band               = KAL_BAND_2GHZ,  \
 	.center_freq        = (_freq),              \
 	.hw_value           = (_channel),           \
 	.flags              = (_flags),             \
@@ -208,7 +208,7 @@
 
 #define CHAN5G(_channel, _flags)                    \
 {                                               \
-	.band               = IEEE80211_BAND_5GHZ,      \
+	.band               = KAL_BAND_5GHZ,      \
 	.center_freq        = 5000 + (5 * (_channel)),  \
 	.hw_value           = (_channel),               \
 	.flags              = (_flags),                 \
@@ -309,7 +309,7 @@
 
 /* public for both Legacy Wi-Fi / P2P access */
 struct ieee80211_supported_band mtk_band_2ghz = {
-	.band = IEEE80211_BAND_2GHZ,
+	.band = KAL_BAND_2GHZ,
 	.channels = mtk_2ghz_channels,
 	.n_channels = ARRAY_SIZE(mtk_2ghz_channels),
 	.bitrates = mtk_g_rates,
@@ -319,7 +319,7 @@
 
 /* public for both Legacy Wi-Fi / P2P access */
 struct ieee80211_supported_band mtk_band_5ghz = {
-	.band = IEEE80211_BAND_5GHZ,
+	.band = KAL_BAND_5GHZ,
 	.channels = mtk_5ghz_channels,
 	.n_channels = ARRAY_SIZE(mtk_5ghz_channels),
 	.bitrates = mtk_a_rates,
@@ -1205,7 +1205,8 @@
 	GLUE_RELEASE_SPIN_LOCK(prGlueInfo, SPIN_LOCK_NET_DEV);
 
 	if (prScanRequest)
-		cfg80211_scan_done(prScanRequest, TRUE);
+		kalCfg80211ScanDone(prScanRequest, TRUE);
+
 	netif_tx_stop_all_queues(prDev);
 
 	return 0;		/* success */
@@ -1469,11 +1470,11 @@
 	prWiphy->max_scan_ssids = 1;	/* FIXME: for combo scan */
 	prWiphy->max_scan_ie_len = 512;
 	prWiphy->interface_modes = BIT(NL80211_IFTYPE_STATION) | BIT(NL80211_IFTYPE_ADHOC);
-	prWiphy->bands[IEEE80211_BAND_2GHZ] = &mtk_band_2ghz;
+	prWiphy->bands[KAL_BAND_2GHZ] = &mtk_band_2ghz;
 	/* always assign 5Ghz bands here, if the chip is not support 5Ghz,
-	 *  bands[IEEE80211_BAND_5GHZ] will be assign to NULL
+	 *  bands[KAL_BAND_5GHZ] will be assign to NULL
 	 */
-	prWiphy->bands[IEEE80211_BAND_5GHZ] = &mtk_band_5ghz;
+	prWiphy->bands[KAL_BAND_5GHZ] = &mtk_band_5ghz;
 	prWiphy->signal_type = CFG80211_SIGNAL_TYPE_MBM;
 	prWiphy->cipher_suites = (const u32 *)mtk_cipher_suites;
 	prWiphy->n_cipher_suites = ARRAY_SIZE(mtk_cipher_suites);
@@ -2285,7 +2286,7 @@
 
 		/* Disable 5G band for AIS */
 		if (prAdapter->fgEnable5GBand == FALSE)
-			prWdev->wiphy->bands[IEEE80211_BAND_5GHZ] = NULL;
+			prWdev->wiphy->bands[KAL_BAND_5GHZ] = NULL;
 
 		g_u4HaltFlag = 0;
 
diff --git a/os/linux/gl_kal.c b/os/linux/gl_kal.c
index ab4c051..e519ea3 100644
--- a/os/linux/gl_kal.c
+++ b/os/linux/gl_kal.c
@@ -1035,12 +1035,12 @@
 				prChannel =
 				    ieee80211_get_channel(priv_to_wiphy(prGlueInfo),
 							  ieee80211_channel_to_frequency
-							  (ucChannelNum, IEEE80211_BAND_2GHZ));
+							  (ucChannelNum, KAL_BAND_2GHZ));
 			} else {
 				prChannel =
 				    ieee80211_get_channel(priv_to_wiphy(prGlueInfo),
 							  ieee80211_channel_to_frequency
-							  (ucChannelNum, IEEE80211_BAND_5GHZ));
+							  (ucChannelNum, KAL_BAND_5GHZ));
 			}
 
 			/* ensure BSS exists */
@@ -1087,11 +1087,11 @@
 				if (ucChannelNum <= 14) {
 					prChannel = ieee80211_get_channel(priv_to_wiphy(prGlueInfo),
 									  ieee80211_channel_to_frequency
-									  (ucChannelNum, IEEE80211_BAND_2GHZ));
+									  (ucChannelNum, KAL_BAND_2GHZ));
 				} else {
 					prChannel = ieee80211_get_channel(priv_to_wiphy(prGlueInfo),
 									  ieee80211_channel_to_frequency
-									  (ucChannelNum, IEEE80211_BAND_5GHZ));
+									  (ucChannelNum, KAL_BAND_5GHZ));
 				}
 
 				cfg80211_roamed(prGlueInfo->prDevHandler,
@@ -1182,8 +1182,9 @@
 		GLUE_RELEASE_SPIN_LOCK(prGlueInfo, SPIN_LOCK_NET_DEV);
 
 		/* 2. then CFG80211 Indication */
-		if (prScanRequest != NULL)
-			cfg80211_scan_done(prScanRequest, FALSE);
+		if (prScanRequest)
+			kalCfg80211ScanDone(prScanRequest, FALSE);
+
 		break;
 
 #if 0
@@ -4053,10 +4054,10 @@
 	/* search through channel entries */
 	if (ucChannelNum <= 14) {
 		prChannel =
-		    ieee80211_get_channel(wiphy, ieee80211_channel_to_frequency(ucChannelNum, IEEE80211_BAND_2GHZ));
+		    ieee80211_get_channel(wiphy, ieee80211_channel_to_frequency(ucChannelNum, KAL_BAND_2GHZ));
 	} else {
 		prChannel =
-		    ieee80211_get_channel(wiphy, ieee80211_channel_to_frequency(ucChannelNum, IEEE80211_BAND_5GHZ));
+		    ieee80211_get_channel(wiphy, ieee80211_channel_to_frequency(ucChannelNum, KAL_BAND_5GHZ));
 	}
 
 	if (prChannel != NULL && prGlueInfo->fgIsRegistered == TRUE) {
@@ -4107,11 +4108,11 @@
 		if (ucChannelNum <= 14) {
 			prChannel =
 			    ieee80211_get_channel(priv_to_wiphy(prGlueInfo),
-						  ieee80211_channel_to_frequency(ucChannelNum, IEEE80211_BAND_2GHZ));
+						  ieee80211_channel_to_frequency(ucChannelNum, KAL_BAND_2GHZ));
 		} else {
 			prChannel =
 			    ieee80211_get_channel(priv_to_wiphy(prGlueInfo),
-						  ieee80211_channel_to_frequency(ucChannelNum, IEEE80211_BAND_5GHZ));
+						  ieee80211_channel_to_frequency(ucChannelNum, KAL_BAND_5GHZ));
 		}
 
 		switch (eSco) {
@@ -4164,11 +4165,11 @@
 		if (ucChannelNum <= 14) {
 			prChannel =
 			    ieee80211_get_channel(priv_to_wiphy(prGlueInfo),
-						  ieee80211_channel_to_frequency(ucChannelNum, IEEE80211_BAND_2GHZ));
+						  ieee80211_channel_to_frequency(ucChannelNum, KAL_BAND_2GHZ));
 		} else {
 			prChannel =
 			    ieee80211_get_channel(priv_to_wiphy(prGlueInfo),
-						  ieee80211_channel_to_frequency(ucChannelNum, IEEE80211_BAND_5GHZ));
+						  ieee80211_channel_to_frequency(ucChannelNum, KAL_BAND_5GHZ));
 		}
 
 		switch (eSco) {
diff --git a/os/linux/gl_p2p.c b/os/linux/gl_p2p.c
index 419fe81..6044cbb 100644
--- a/os/linux/gl_p2p.c
+++ b/os/linux/gl_p2p.c
@@ -1048,8 +1048,8 @@
 	prWiphy->iface_combinations = p_mtk_iface_combinations_p2p;
 	prWiphy->n_iface_combinations = mtk_iface_combinations_p2p_num;
 
-	prWiphy->bands[IEEE80211_BAND_2GHZ] = &mtk_band_2ghz;
-	prWiphy->bands[IEEE80211_BAND_5GHZ] = &mtk_band_5ghz;
+	prWiphy->bands[KAL_BAND_2GHZ] = &mtk_band_2ghz;
+	prWiphy->bands[KAL_BAND_5GHZ] = &mtk_band_5ghz;
 
 	prWiphy->mgmt_stypes = mtk_cfg80211_default_mgmt_stypes;
 	prWiphy->max_remain_on_channel_duration = 5000;
@@ -1364,7 +1364,7 @@
 
 	if (prScanRequest) {
 		DBGLOG(INIT, INFO, "p2pStop and abort scan!!\n");
-		cfg80211_scan_done(prScanRequest, TRUE);
+		kalCfg80211ScanDone(prScanRequest, TRUE);
 	}
 
 	/* 1. stop TX queue */
diff --git a/os/linux/gl_p2p_cfg80211.c b/os/linux/gl_p2p_cfg80211.c
index 58cd879..16b37be 100644
--- a/os/linux/gl_p2p_cfg80211.c
+++ b/os/linux/gl_p2p_cfg80211.c
@@ -174,10 +174,10 @@
 			prRfChnlInfo->ucChannelNum = nicFreq2ChannelNum(channel->center_freq * 1000);
 
 			switch (channel->band) {
-			case IEEE80211_BAND_2GHZ:
+			case KAL_BAND_2GHZ:
 				prRfChnlInfo->eBand = BAND_2G4;
 				break;
-			case IEEE80211_BAND_5GHZ:
+			case KAL_BAND_5GHZ:
 				prRfChnlInfo->eBand = BAND_5G;
 				break;
 			default:
@@ -528,7 +528,7 @@
 		/* Check the wdev with backup scan req due to */
 		/* the kernel will free this request by error handling */
 		if (prP2pGlueDevInfo->rBackupScanRequest.wdev == UnregRoleHander->ieee80211_ptr) {
-			cfg80211_scan_done(&(prP2pGlueDevInfo->rBackupScanRequest), TRUE);
+			kalCfg80211ScanDone(&(prP2pGlueDevInfo->rBackupScanRequest), TRUE);
 			/* clear the request to avoid the Role FSM calls the scan_done again */
 			prP2pGlueDevInfo->prScanRequest = NULL;
 		}
@@ -963,10 +963,10 @@
 			       "Scanning Channel:%d,  freq: %d\n", prRfChannelInfo->ucChannelNum,
 			       prChannel->center_freq);
 			switch (prChannel->band) {
-			case IEEE80211_BAND_2GHZ:
+			case KAL_BAND_2GHZ:
 				prRfChannelInfo->eBand = BAND_2G4;
 				break;
-			case IEEE80211_BAND_5GHZ:
+			case KAL_BAND_5GHZ:
 				prRfChannelInfo->eBand = BAND_5G;
 				break;
 			default:
diff --git a/os/linux/gl_p2p_kal.c b/os/linux/gl_p2p_kal.c
index c1f42ab..938dfa3 100644
--- a/os/linux/gl_p2p_kal.c
+++ b/os/linux/gl_p2p_kal.c
@@ -984,7 +984,7 @@
 			scanReportBss2Cfg80211(prGlueInfo->prAdapter, BSS_TYPE_P2P_DEVICE, NULL);
 
 			DBGLOG(INIT, INFO, "DBG:p2p_cfg_scan_done\n");
-			cfg80211_scan_done(prScanRequest, fgIsAbort);
+			kalCfg80211ScanDone(prScanRequest, fgIsAbort);
 		}
 		KAL_RELEASE_MUTEX(prGlueInfo->prAdapter, MUTEX_DEL_INF);
 
@@ -1384,12 +1384,12 @@
 
 		switch (prChannelInfo->eBand) {
 		case BAND_2G4:
-			prTargetChannelEntry = wiphy->bands[IEEE80211_BAND_2GHZ]->channels;
-			u4TblSize = wiphy->bands[IEEE80211_BAND_2GHZ]->n_channels;
+			prTargetChannelEntry = wiphy->bands[KAL_BAND_2GHZ]->channels;
+			u4TblSize = wiphy->bands[KAL_BAND_2GHZ]->n_channels;
 			break;
 		case BAND_5G:
-			prTargetChannelEntry = wiphy->bands[IEEE80211_BAND_5GHZ]->channels;
-			u4TblSize = wiphy->bands[IEEE80211_BAND_5GHZ]->n_channels;
+			prTargetChannelEntry = wiphy->bands[KAL_BAND_5GHZ]->channels;
+			u4TblSize = wiphy->bands[KAL_BAND_5GHZ]->n_channels;
 			break;
 		default:
 			break;
diff --git a/os/linux/gl_wext_priv.c b/os/linux/gl_wext_priv.c
index a5d38f8..8ebca1b 100644
--- a/os/linux/gl_wext_priv.c
+++ b/os/linux/gl_wext_priv.c
@@ -6752,15 +6752,15 @@
 	 **/
 	if (i4Argc >= 2 && (apcArgv[1][0] == '2') && (apcArgv[1][1] == 'g')) {
 		start_idx = 0;
-		end_idx = rlmDomainGetActiveChannelCount(IEEE80211_BAND_2GHZ);
+		end_idx = rlmDomainGetActiveChannelCount(KAL_BAND_2GHZ);
 	} else if (i4Argc >= 2 && (apcArgv[1][0] == '5') && (apcArgv[1][1] == 'g')) {
-		start_idx = rlmDomainGetActiveChannelCount(IEEE80211_BAND_2GHZ);
-		end_idx = rlmDomainGetActiveChannelCount(IEEE80211_BAND_2GHZ)
-				+ rlmDomainGetActiveChannelCount(IEEE80211_BAND_5GHZ);
+		start_idx = rlmDomainGetActiveChannelCount(KAL_BAND_2GHZ);
+		end_idx = rlmDomainGetActiveChannelCount(KAL_BAND_2GHZ)
+				+ rlmDomainGetActiveChannelCount(KAL_BAND_5GHZ);
 	} else {
 		start_idx = 0;
-		end_idx = rlmDomainGetActiveChannelCount(IEEE80211_BAND_2GHZ)
-				+ rlmDomainGetActiveChannelCount(IEEE80211_BAND_5GHZ);
+		end_idx = rlmDomainGetActiveChannelCount(KAL_BAND_2GHZ)
+				+ rlmDomainGetActiveChannelCount(KAL_BAND_5GHZ);
 		if (i4Argc >= 2)
 			/* Dump only specified channel */
 			u4Ret = kalkStrtou32(apcArgv[1], 0, &ch_num);
diff --git a/os/linux/include/gl_kal.h b/os/linux/include/gl_kal.h
index 4067987..76b1646 100644
--- a/os/linux/include/gl_kal.h
+++ b/os/linux/include/gl_kal.h
@@ -437,6 +437,50 @@
 #define IEEE80211_CHAN_PASSIVE_STR		"NO_IR"
 #endif
 
+#if KERNEL_VERSION(4, 7, 0) <= CFG80211_VERSION_CODE
+/**
+ * enum nl80211_band - Frequency band
+ * @NL80211_BAND_2GHZ: 2.4 GHz ISM band
+ * @NL80211_BAND_5GHZ: around 5 GHz band (4.9 - 5.7 GHz)
+ * @NL80211_BAND_60GHZ: around 60 GHz band (58.32 - 64.80 GHz)
+ * @NUM_NL80211_BANDS: number of bands, avoid using this in userspace
+ *	 since newer kernel versions may support more bands
+ */
+#define KAL_BAND_2GHZ NL80211_BAND_2GHZ
+#define KAL_BAND_5GHZ NL80211_BAND_5GHZ
+#define KAL_NUM_BANDS NUM_NL80211_BANDS
+#else
+#define KAL_BAND_2GHZ IEEE80211_BAND_2GHZ
+#define KAL_BAND_5GHZ IEEE80211_BAND_5GHZ
+#define KAL_NUM_BANDS IEEE80211_NUM_BANDS
+#endif
+
+/**
+ * kalCfg80211ScanDone - abstraction of cfg80211_scan_done
+ *
+ * @request: the corresponding scan request (sanity checked by callers!)
+ * @aborted: set to true if the scan was aborted for any reason,
+ *	userspace will be notified of that
+ *
+ * Since linux-4.8.y the 2nd parameter is changed from bool to
+ * struct cfg80211_scan_info, but we don't use all fields yet.
+ */
+#if KERNEL_VERSION(4, 8, 0) <= CFG80211_VERSION_CODE
+static inline void kalCfg80211ScanDone(struct cfg80211_scan_request *request,
+				       bool aborted)
+{
+	struct cfg80211_scan_info info = { .aborted = aborted };
+
+	cfg80211_scan_done(request, &info);
+}
+#else
+static inline void kalCfg80211ScanDone(struct cfg80211_scan_request *request,
+				       bool aborted)
+{
+	cfg80211_scan_done(request, aborted);
+}
+#endif
+
 /* Consider on some Android platform, using request_firmware_direct()
  * may cause system failed to load firmware. So we still use
  * request_firmware().
diff --git a/os/linux/include/gl_p2p_ioctl.h b/os/linux/include/gl_p2p_ioctl.h
index 4b2462a..550e5e8 100644
--- a/os/linux/include/gl_p2p_ioctl.h
+++ b/os/linux/include/gl_p2p_ioctl.h
@@ -344,7 +344,7 @@
 
 #define CHAN2G(_channel, _freq, _flags)             \
 {                                               \
-	.band               = IEEE80211_BAND_2GHZ,  \
+	.band               = KAL_BAND_2GHZ,  \
 	.center_freq        = (_freq),              \
 	.hw_value           = (_channel),           \
 	.flags              = (_flags),             \
@@ -354,7 +354,7 @@
 
 #define CHAN5G(_channel, _flags)                        \
 {                                                   \
-	.band               = IEEE80211_BAND_5GHZ,      \
+	.band               = KAL_BAND_5GHZ,      \
 	.center_freq        = 5000 + (5 * (_channel)),  \
 	.hw_value           = (_channel),               \
 	.flags              = (_flags),                 \