diff --git a/core/hdd/src/wlan_hdd_assoc.c b/core/hdd/src/wlan_hdd_assoc.c
index e8f6a31..211d092 100644
--- a/core/hdd/src/wlan_hdd_assoc.c
+++ b/core/hdd/src/wlan_hdd_assoc.c
@@ -917,12 +917,12 @@
  * @pAdapter: pointer to adapter
  * @staId: station identifier
  *
- * Return: CDF_STATUS enumeration
+ * Return: QDF_STATUS enumeration
  */
-static CDF_STATUS
+static QDF_STATUS
 hdd_roam_deregister_sta(hdd_adapter_t *pAdapter, uint8_t staId)
 {
-	CDF_STATUS cdf_status;
+	QDF_STATUS qdf_status;
 	hdd_station_ctx_t *pHddStaCtx = WLAN_HDD_GET_STATION_CTX_PTR(pAdapter);
 
 	if (eConnectionState_IbssDisconnected ==
@@ -933,13 +933,13 @@
 		 */
 	}
 
-	cdf_status = ol_txrx_clear_peer(staId);
-	if (!CDF_IS_STATUS_SUCCESS(cdf_status)) {
+	qdf_status = ol_txrx_clear_peer(staId);
+	if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
 		hddLog(LOGE,
 			FL("ol_txrx_clear_peer() failed for staID %d. Status(%d) [0x%08X]"),
-			staId, cdf_status, cdf_status);
+			staId, qdf_status, qdf_status);
 	}
-	return cdf_status;
+	return qdf_status;
 }
 
 /**
@@ -955,16 +955,16 @@
  * 2. Clean up internal connection states and data structures;
  * 3. Send disconnect indication to supplicant.
  *
- * Return: CDF_STATUS enumeration
+ * Return: QDF_STATUS enumeration
  */
-static CDF_STATUS hdd_dis_connect_handler(hdd_adapter_t *pAdapter,
+static QDF_STATUS hdd_dis_connect_handler(hdd_adapter_t *pAdapter,
 					  tCsrRoamInfo *pRoamInfo,
 					  uint32_t roamId,
 					  eRoamCmdStatus roamStatus,
 					  eCsrRoamResult roamResult)
 {
-	CDF_STATUS status = CDF_STATUS_SUCCESS;
-	CDF_STATUS vstatus;
+	QDF_STATUS status = QDF_STATUS_SUCCESS;
+	QDF_STATUS vstatus;
 	struct net_device *dev = pAdapter->dev;
 	hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
 	hdd_station_ctx_t *pHddStaCtx = WLAN_HDD_GET_STATION_CTX_PTR(pAdapter);
@@ -973,7 +973,7 @@
 
 	if (dev == NULL) {
 		hddLog(LOGE, FL("net_dev is released return"));
-		return CDF_STATUS_E_FAILURE;
+		return QDF_STATUS_E_FAILURE;
 	}
 	/* notify apps that we can't pass traffic anymore */
 	hddLog(LOG1, FL("Disabling queues"));
@@ -1083,10 +1083,10 @@
 		uint8_t i;
 		sta_id = pHddStaCtx->broadcast_ibss_staid;
 		vstatus = hdd_roam_deregister_sta(pAdapter, sta_id);
-		if (!CDF_IS_STATUS_SUCCESS(vstatus)) {
+		if (!QDF_IS_STATUS_SUCCESS(vstatus)) {
 			hdd_err("hdd_roam_deregister_sta() failed for staID %d Status=%d [0x%x]",
 					sta_id, status, status);
-			status = CDF_STATUS_E_FAILURE;
+			status = QDF_STATUS_E_FAILURE;
 		}
 		pHddCtx->sta_to_adapter[sta_id] = NULL;
 		/* Clear all the peer sta register with TL. */
@@ -1096,11 +1096,11 @@
 			sta_id = pHddStaCtx->conn_info.staId[i];
 			hddLog(LOG1, FL("Deregister StaID %d"), sta_id);
 			vstatus = hdd_roam_deregister_sta(pAdapter, sta_id);
-			if (!CDF_IS_STATUS_SUCCESS(vstatus)) {
+			if (!QDF_IS_STATUS_SUCCESS(vstatus)) {
 				hddLog(LOGE,
 					FL("hdd_roamDeregisterSTA() failed to for staID %d. Status= %d [0x%x]"),
 					sta_id, status, status);
-				status = CDF_STATUS_E_FAILURE;
+				status = QDF_STATUS_E_FAILURE;
 			}
 			/* set the staid and peer mac as 0, all other
 			 * reset are done in hdd_connRemoveConnectInfo.
@@ -1117,11 +1117,11 @@
 		 * for now, only one.
 		 */
 		vstatus = hdd_roam_deregister_sta(pAdapter, sta_id);
-		if (!CDF_IS_STATUS_SUCCESS(vstatus)) {
+		if (!QDF_IS_STATUS_SUCCESS(vstatus)) {
 			hddLog(LOGE,
 				FL("hdd_roam_deregister_sta() failed to for staID %d. Status= %d [0x%x]"),
 				sta_id, status, status);
-			status = CDF_STATUS_E_FAILURE;
+			status = QDF_STATUS_E_FAILURE;
 		}
 		pHddCtx->sta_to_adapter[sta_id] = NULL;
 	}
@@ -1181,38 +1181,38 @@
  *
  * Return: CDF status
  */
-CDF_STATUS hdd_change_peer_state(hdd_adapter_t *pAdapter,
+QDF_STATUS hdd_change_peer_state(hdd_adapter_t *pAdapter,
 				 uint8_t sta_id,
 				 enum ol_txrx_peer_state sta_state,
 				 bool roam_synch_in_progress)
 {
 	struct ol_txrx_peer_t *peer;
-	CDF_STATUS err;
+	QDF_STATUS err;
 	struct ol_txrx_pdev_t *pdev = cds_get_context(CDF_MODULE_ID_TXRX);
 
 	if (!pdev) {
 		hdd_err("Failed to get txrx context");
-		return CDF_STATUS_E_FAULT;
+		return QDF_STATUS_E_FAULT;
 	}
 
 	if (sta_id >= WLAN_MAX_STA_COUNT) {
 		hddLog(LOGE, "Invalid sta id :%d", sta_id);
-		return CDF_STATUS_E_INVAL;
+		return QDF_STATUS_E_INVAL;
 	}
 
 	peer = ol_txrx_peer_find_by_local_id(pdev, sta_id);
 	if (!peer)
-		return CDF_STATUS_E_FAULT;
+		return QDF_STATUS_E_FAULT;
 
 	err = ol_txrx_peer_state_update(pdev,
 			(u_int8_t *) peer->mac_addr.raw, sta_state);
-	if (err != CDF_STATUS_SUCCESS) {
+	if (err != QDF_STATUS_SUCCESS) {
 		hddLog(LOGE, "peer state update failed");
-		return CDF_STATUS_E_FAULT;
+		return QDF_STATUS_E_FAULT;
 	}
 #ifdef WLAN_FEATURE_ROAM_OFFLOAD
 	if (roam_synch_in_progress)
-		return CDF_STATUS_SUCCESS;
+		return QDF_STATUS_SUCCESS;
 #endif
 
 	if (sta_state == ol_txrx_peer_state_auth) {
@@ -1224,9 +1224,9 @@
 		err = sme_set_peer_authorized(peer->mac_addr.raw,
 				hdd_set_peer_authorized_event,
 				pAdapter->sessionId);
-		if (err != CDF_STATUS_SUCCESS) {
+		if (err != QDF_STATUS_SUCCESS) {
 			hddLog(LOGE, "Failed to set the peer state to authorized");
-			return CDF_STATUS_E_FAULT;
+			return QDF_STATUS_E_FAULT;
 		}
 
 		if (pAdapter->device_mode == WLAN_HDD_INFRA_STATION ||
@@ -1247,7 +1247,7 @@
 #endif
 		}
 	}
-	return CDF_STATUS_SUCCESS;
+	return QDF_STATUS_SUCCESS;
 }
 
 /**
@@ -1258,20 +1258,20 @@
  * @pPeerMacAddress: peer MAC address
  * @pBssDesc: pointer to BSS description
  *
- * Return: CDF_STATUS enumeration
+ * Return: QDF_STATUS enumeration
  */
-static CDF_STATUS hdd_roam_register_sta(hdd_adapter_t *pAdapter,
+static QDF_STATUS hdd_roam_register_sta(hdd_adapter_t *pAdapter,
 					tCsrRoamInfo *pRoamInfo,
 					uint8_t staId,
 					struct cdf_mac_addr *pPeerMacAddress,
 					tSirBssDescription *pBssDesc)
 {
-	CDF_STATUS cdf_status = CDF_STATUS_E_FAILURE;
+	QDF_STATUS qdf_status = QDF_STATUS_E_FAILURE;
 	struct ol_txrx_desc_type staDesc = { 0 };
 	hdd_station_ctx_t *pHddStaCtx = WLAN_HDD_GET_STATION_CTX_PTR(pAdapter);
 
 	if (NULL == pBssDesc)
-		return CDF_STATUS_E_FAILURE;
+		return QDF_STATUS_E_FAILURE;
 
 	/* Get the Station ID from the one saved during the association */
 	staDesc.sta_id = staId;
@@ -1291,13 +1291,13 @@
 		staDesc.is_wapi_supported = 0;
 #endif /* FEATURE_WLAN_WAPI */
 
-	cdf_status = ol_txrx_register_peer(hdd_rx_packet_cbk,
+	qdf_status = ol_txrx_register_peer(hdd_rx_packet_cbk,
 						&staDesc);
-	if (!CDF_IS_STATUS_SUCCESS(cdf_status)) {
+	if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
 		hddLog(LOGW,
 			"ol_txrx_register_peer() failed to register. Status=%d [0x%08X]",
-			cdf_status, cdf_status);
-		return cdf_status;
+			qdf_status, qdf_status);
+		return qdf_status;
 	}
 
 	if (!pRoamInfo->fAuthRequired) {
@@ -1305,7 +1305,7 @@
 		 * Connections that do not need Upper layer auth, transition
 		 * TLSHIM directly to 'Authenticated' state
 		 */
-		cdf_status =
+		qdf_status =
 			hdd_change_peer_state(pAdapter, staDesc.sta_id,
 						ol_txrx_peer_state_auth,
 #ifdef WLAN_FEATURE_ROAM_OFFLOAD
@@ -1320,7 +1320,7 @@
 		hddLog(LOG3,
 			"ULA auth StaId= %d. Changing TL state to CONNECTED at Join time",
 			 pHddStaCtx->conn_info.staId[0]);
-		cdf_status =
+		qdf_status =
 			hdd_change_peer_state(pAdapter, staDesc.sta_id,
 						ol_txrx_peer_state_conn,
 #ifdef WLAN_FEATURE_ROAM_OFFLOAD
@@ -1331,7 +1331,7 @@
 						);
 		hdd_conn_set_authenticated(pAdapter, false);
 	}
-	return cdf_status;
+	return qdf_status;
 }
 
 /**
@@ -1541,9 +1541,9 @@
  * @roamStatus: roam status
  * @roamResult: roam result
  *
- * Return: CDF_STATUS enumeration
+ * Return: QDF_STATUS enumeration
  */
-static CDF_STATUS hdd_roam_set_key_complete_handler(hdd_adapter_t *pAdapter,
+static QDF_STATUS hdd_roam_set_key_complete_handler(hdd_adapter_t *pAdapter,
 						    tCsrRoamInfo *pRoamInfo,
 						    uint32_t roamId,
 						    eRoamCmdStatus roamStatus,
@@ -1551,13 +1551,13 @@
 {
 	eCsrEncryptionType connectedCipherAlgo;
 	bool fConnected = false;
-	CDF_STATUS cdf_status = CDF_STATUS_E_FAILURE;
+	QDF_STATUS qdf_status = QDF_STATUS_E_FAILURE;
 	hdd_station_ctx_t *pHddStaCtx = WLAN_HDD_GET_STATION_CTX_PTR(pAdapter);
 	ENTER();
 
 	if (NULL == pRoamInfo) {
 		hddLog(LOG2, FL("pRoamInfo is NULL"));
-		return CDF_STATUS_E_FAILURE;
+		return QDF_STATUS_E_FAILURE;
 	}
 	/*
 	 * if (WPA), tell TL to go to 'authenticated' after the keys are set.
@@ -1579,11 +1579,11 @@
 				pHddStaCtx->roam_info.roamingState =
 					HDD_ROAM_STATE_NONE;
 			} else {
-				cdf_status = hdd_ibss_get_sta_id(
+				qdf_status = hdd_ibss_get_sta_id(
 							pHddStaCtx,
 							&pRoamInfo->peerMac,
 							&staId);
-				if (CDF_STATUS_SUCCESS == cdf_status) {
+				if (QDF_STATUS_SUCCESS == qdf_status) {
 					hddLog(LOG2,
 						"WLAN TL STA Ptk Installed for STAID=%d",
 						staId);
@@ -1623,11 +1623,11 @@
 			  eCSR_ENCRYPT_TYPE_WEP104_STATICKEY)) {
 				if (pHddStaCtx->conn_info.gtk_installed &&
 					pHddStaCtx->conn_info.ptk_installed)
-					cdf_status =
+					qdf_status =
 					    hdd_change_sta_state_authenticated(pAdapter,
 						pRoamInfo);
 			} else if (pHddStaCtx->conn_info.ptk_installed) {
-				cdf_status =
+				qdf_status =
 				    hdd_change_sta_state_authenticated(pAdapter,
 					pRoamInfo);
 			}
@@ -1650,7 +1650,7 @@
 	}
 
 	EXIT();
-	return CDF_STATUS_SUCCESS;
+	return QDF_STATUS_SUCCESS;
 }
 
 /**
@@ -1661,7 +1661,7 @@
  */
 void hdd_perform_roam_set_key_complete(hdd_adapter_t *pAdapter)
 {
-	CDF_STATUS cdf_ret_status = CDF_STATUS_SUCCESS;
+	QDF_STATUS cdf_ret_status = QDF_STATUS_SUCCESS;
 	hdd_station_ctx_t *pHddStaCtx = WLAN_HDD_GET_STATION_CTX_PTR(pAdapter);
 	tCsrRoamInfo roamInfo;
 	roamInfo.fAuthRequired = false;
@@ -1676,7 +1676,7 @@
 					   pHddStaCtx->roam_info.roamId,
 					   pHddStaCtx->roam_info.roamStatus,
 					   eCSR_ROAM_RESULT_AUTHENTICATED);
-	if (cdf_ret_status != CDF_STATUS_SUCCESS)
+	if (cdf_ret_status != QDF_STATUS_SUCCESS)
 		hddLog(LOGE, FL("Set Key complete failure"));
 
 	pHddStaCtx->roam_info.deferKeyComplete = false;
@@ -1690,9 +1690,9 @@
  * @roamStatus: roam status
  * @roamResult: roam result
  *
- * Return: CDF_STATUS enumeration
+ * Return: QDF_STATUS enumeration
  */
-static CDF_STATUS hdd_association_completion_handler(hdd_adapter_t *pAdapter,
+static QDF_STATUS hdd_association_completion_handler(hdd_adapter_t *pAdapter,
 						     tCsrRoamInfo *pRoamInfo,
 						     uint32_t roamId,
 						     eRoamCmdStatus roamStatus,
@@ -1701,7 +1701,7 @@
 	struct net_device *dev = pAdapter->dev;
 	hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
 	hdd_station_ctx_t *pHddStaCtx = WLAN_HDD_GET_STATION_CTX_PTR(pAdapter);
-	CDF_STATUS cdf_status = CDF_STATUS_E_FAILURE;
+	QDF_STATUS qdf_status = QDF_STATUS_E_FAILURE;
 	uint8_t reqRsnIe[DOT11F_IE_RSN_MAX_LEN];
 	uint32_t reqRsnLength = DOT11F_IE_RSN_MAX_LEN;
 	int ft_carrier_on = false;
@@ -1710,7 +1710,7 @@
 
 	if (!pHddCtx) {
 		hdd_err("HDD context is NULL");
-		return CDF_STATUS_E_FAILURE;
+		return QDF_STATUS_E_FAILURE;
 	}
 
 	/* HDD has initiated disconnect, do not send connect result indication
@@ -1726,7 +1726,7 @@
 	if (eCSR_ROAM_RESULT_ASSOCIATED == roamResult) {
 		if (NULL == pRoamInfo) {
 			hddLog(LOGE, FL("pRoamInfo is NULL"));
-			return CDF_STATUS_E_FAILURE;
+			return QDF_STATUS_E_FAILURE;
 		}
 		if (!hddDisconInProgress) {
 			hddLog(LOG1, FL("Set HDD connState to eConnectionState_Associated"));
@@ -1853,7 +1853,7 @@
 				wlan_hdd_netif_queue_control(pAdapter,
 					WLAN_NETIF_CARRIER_OFF,
 					WLAN_CONTROL_PATH);
-				return CDF_STATUS_E_FAILURE;
+				return QDF_STATUS_E_FAILURE;
 			}
 			if (pRoamInfo->u.pConnectedProfile->AuthType ==
 			    eCSR_AUTH_TYPE_FT_RSN
@@ -2083,7 +2083,7 @@
 				/*
 				 * Register the Station with TL after associated
 				 */
-				cdf_status = hdd_roam_register_sta(pAdapter,
+				qdf_status = hdd_roam_register_sta(pAdapter,
 								   pRoamInfo,
 								   pHddStaCtx->
 								   conn_info.
@@ -2107,7 +2107,7 @@
 						reqRsnIe, reqRsnLength);
 			/* Reassoc successfully */
 			if (pRoamInfo->fAuthRequired) {
-				cdf_status =
+				qdf_status =
 					hdd_change_peer_state(pAdapter,
 						pHddStaCtx->conn_info.staId[0],
 						ol_txrx_peer_state_conn,
@@ -2122,7 +2122,7 @@
 				hddLog(LOG2,
 					FL("staId: %d Changing TL state to AUTHENTICATED"),
 					  pHddStaCtx->conn_info.staId[0]);
-				cdf_status =
+				qdf_status =
 					hdd_change_peer_state(pAdapter,
 						pHddStaCtx->conn_info.staId[0],
 						ol_txrx_peer_state_auth,
@@ -2135,7 +2135,7 @@
 				hdd_conn_set_authenticated(pAdapter, true);
 			}
 
-			if (CDF_IS_STATUS_SUCCESS(cdf_status)) {
+			if (QDF_IS_STATUS_SUCCESS(qdf_status)) {
 				/*
 				 * Perform any WMM-related association
 				 * processing
@@ -2155,10 +2155,10 @@
 						   WLAN_CONTROL_PATH);
 		}
 
-		if (!CDF_IS_STATUS_SUCCESS(cdf_status)) {
+		if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
 			hddLog(LOGE,
 				"STA register with TL failed. status(=%d) [%08X]",
-				cdf_status, cdf_status);
+				qdf_status, qdf_status);
 		}
 #ifdef WLAN_FEATURE_11W
 		cdf_mem_zero(&pAdapter->hdd_stats.hddPmfStats,
@@ -2293,19 +2293,19 @@
 					   WLAN_CONTROL_PATH);
 	}
 
-	if (CDF_STATUS_SUCCESS != cds_check_and_restart_sap(
+	if (QDF_STATUS_SUCCESS != cds_check_and_restart_sap(
 					roamResult, pHddStaCtx))
-		return CDF_STATUS_E_FAILURE;
+		return QDF_STATUS_E_FAILURE;
 
 	if (NULL != pRoamInfo && NULL != pRoamInfo->pBssDesc) {
 		cds_force_sap_on_scc(roamResult,
 				pRoamInfo->pBssDesc->channelId);
 	} else {
 		hdd_err("pRoamInfo profile is not set properly");
-		return CDF_STATUS_E_FAILURE;
+		return QDF_STATUS_E_FAILURE;
 	}
 
-	return CDF_STATUS_SUCCESS;
+	return QDF_STATUS_SUCCESS;
 }
 
 /**
@@ -2561,9 +2561,9 @@
  *
  * We update the status of the IBSS to connected in this function.
  *
- * Return: CDF_STATUS enumeration
+ * Return: QDF_STATUS enumeration
  */
-static CDF_STATUS roam_ibss_connect_handler(hdd_adapter_t *pAdapter,
+static QDF_STATUS roam_ibss_connect_handler(hdd_adapter_t *pAdapter,
 					    tCsrRoamInfo *pRoamInfo)
 {
 	struct cfg80211_bss *bss;
@@ -2585,13 +2585,13 @@
 		hddLog(LOGE,
 		       FL("%s: unable to create IBSS entry"),
 		       pAdapter->dev->name);
-		return CDF_STATUS_E_FAILURE;
+		return QDF_STATUS_E_FAILURE;
 	}
 	cfg80211_put_bss(
 		WLAN_HDD_GET_CTX(pAdapter)->wiphy,
 		bss);
 
-	return CDF_STATUS_SUCCESS;
+	return QDF_STATUS_SUCCESS;
 }
 
 /**
@@ -2604,9 +2604,9 @@
  *
  * This function indicates the Mic failure to the supplicant
  *
- * Return: CDF_STATUS enumeration
+ * Return: QDF_STATUS enumeration
  */
-static CDF_STATUS
+static QDF_STATUS
 hdd_roam_mic_error_indication_handler(hdd_adapter_t *pAdapter,
 				      tCsrRoamInfo *pRoamInfo,
 				      uint32_t roamId,
@@ -2652,7 +2652,7 @@
 
 	}
 
-	return CDF_STATUS_SUCCESS;
+	return QDF_STATUS_SUCCESS;
 }
 
 /**
@@ -2665,16 +2665,16 @@
  *
  * The Ibss connection status is updated regularly here in this function.
  *
- * Return: CDF_STATUS enumeration
+ * Return: QDF_STATUS enumeration
  */
-static CDF_STATUS
+static QDF_STATUS
 roam_roam_connect_status_update_handler(hdd_adapter_t *pAdapter,
 					tCsrRoamInfo *pRoamInfo,
 					uint32_t roamId,
 					eRoamCmdStatus roamStatus,
 					eCsrRoamResult roamResult)
 {
-	CDF_STATUS cdf_status;
+	QDF_STATUS qdf_status;
 
 	hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
 	switch (roamResult) {
@@ -2702,15 +2702,15 @@
 		pHddCtx->sta_to_adapter[pRoamInfo->staId] = pAdapter;
 
 		/* Register the Station with TL for the new peer. */
-		cdf_status = hdd_roam_register_sta(pAdapter,
+		qdf_status = hdd_roam_register_sta(pAdapter,
 						   pRoamInfo,
 						   pRoamInfo->staId,
 						   &pRoamInfo->peerMac,
 						   pRoamInfo->pBssDesc);
-		if (!CDF_IS_STATUS_SUCCESS(cdf_status)) {
+		if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
 			hddLog(LOGE,
-				"Cannot register STA with TL for IBSS. Failed with cdf_status = %d [%08X]",
-				cdf_status, cdf_status);
+				"Cannot register STA with TL for IBSS. Failed with qdf_status = %d [%08X]",
+				qdf_status, qdf_status);
 		}
 		pHddStaCtx->ibss_sta_generation++;
 		memset(&staInfo, 0, sizeof(staInfo));
@@ -2737,18 +2737,18 @@
 			hddLog(LOG2, "New peer joined set PTK encType=%d",
 				  pHddStaCtx->ibss_enc_key.encType);
 
-			cdf_status =
+			qdf_status =
 				sme_roam_set_key(WLAN_HDD_GET_HAL_CTX
 							 (pAdapter),
 						 pAdapter->sessionId,
 						 &pHddStaCtx->ibss_enc_key,
 						 &roamId);
 
-			if (CDF_STATUS_SUCCESS != cdf_status) {
+			if (QDF_STATUS_SUCCESS != qdf_status) {
 				hddLog(LOGE,
 				       FL("sme_roam_set_key failed, status=%d"),
-				       cdf_status);
-				return CDF_STATUS_E_FAILURE;
+				       qdf_status);
+				return QDF_STATUS_E_FAILURE;
 			}
 		}
 		hddLog(LOG1, FL("Enabling queues"));
@@ -2814,7 +2814,7 @@
 
 	}
 
-	return CDF_STATUS_SUCCESS;
+	return QDF_STATUS_SUCCESS;
 }
 
 #ifdef FEATURE_WLAN_TDLS
@@ -2828,13 +2828,13 @@
  * Construct the staDesc and register with TL the new STA.
  * This is called as part of ADD_STA in the TDLS setup.
  *
- * Return: CDF_STATUS enumeration
+ * Return: QDF_STATUS enumeration
  */
-CDF_STATUS hdd_roam_register_tdlssta(hdd_adapter_t *pAdapter,
+QDF_STATUS hdd_roam_register_tdlssta(hdd_adapter_t *pAdapter,
 				     const uint8_t *peerMac, uint16_t staId,
 				     uint8_t ucastSig)
 {
-	CDF_STATUS cdf_status = CDF_STATUS_E_FAILURE;
+	QDF_STATUS qdf_status = QDF_STATUS_E_FAILURE;
 	struct ol_txrx_desc_type staDesc = { 0 };
 
 	/*
@@ -2849,15 +2849,15 @@
 
 
 	/* Register the Station with TL...  */
-	cdf_status = ol_txrx_register_peer(hdd_rx_packet_cbk,
+	qdf_status = ol_txrx_register_peer(hdd_rx_packet_cbk,
 						&staDesc);
-	if (!CDF_IS_STATUS_SUCCESS(cdf_status)) {
+	if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
 		hddLog(LOGE, FL("ol_txrx_register_peer() failed to register. Status=%d [0x%08X]"),
-			cdf_status, cdf_status);
-		return cdf_status;
+			qdf_status, qdf_status);
+		return qdf_status;
 	}
 
-	return cdf_status;
+	return qdf_status;
 }
 
 /**
@@ -2865,18 +2865,18 @@
  * @pAdapter: pointer to adapter
  * @staId: station identifier
  *
- * Return: CDF_STATUS enumeration
+ * Return: QDF_STATUS enumeration
  */
-static CDF_STATUS hdd_roam_deregister_tdlssta(hdd_adapter_t *pAdapter,
+static QDF_STATUS hdd_roam_deregister_tdlssta(hdd_adapter_t *pAdapter,
 					      uint8_t staId)
 {
-	CDF_STATUS cdf_status;
-	cdf_status = ol_txrx_clear_peer(staId);
-	if (!CDF_IS_STATUS_SUCCESS(cdf_status)) {
+	QDF_STATUS qdf_status;
+	qdf_status = ol_txrx_clear_peer(staId);
+	if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
 		hddLog(LOGW, FL("ol_txrx_clear_peer() failed for staID %d. Status=%d [0x%08X]"),
-			staId, cdf_status, cdf_status);
+			staId, qdf_status, qdf_status);
 	}
-	return cdf_status;
+	return qdf_status;
 }
 
 /**
@@ -2891,9 +2891,9 @@
  * TL in case of new TDLS client is added and deregistration at the time
  * TDLS client is deleted.
  *
- * Return: CDF_STATUS enumeration
+ * Return: QDF_STATUS enumeration
  */
-static CDF_STATUS
+static QDF_STATUS
 hdd_roam_tdls_status_update_handler(hdd_adapter_t *pAdapter,
 				    tCsrRoamInfo *pRoamInfo,
 				    uint32_t roamId,
@@ -2903,7 +2903,7 @@
 	hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
 	tdlsCtx_t *pHddTdlsCtx = WLAN_HDD_GET_TDLS_CTX_PTR(pAdapter);
 	tSmeTdlsPeerStateParams smeTdlsPeerStateParams;
-	CDF_STATUS status = CDF_STATUS_E_FAILURE;
+	QDF_STATUS status = QDF_STATUS_E_FAILURE;
 	uint8_t staIdx;
 	hddTdlsPeer_t *curr_peer;
 	uint32_t reason;
@@ -2978,7 +2978,7 @@
 							 peerMac,
 							 &pRoamInfo->
 							 peerMac);
-					status = CDF_STATUS_SUCCESS;
+					status = QDF_STATUS_SUCCESS;
 					break;
 				}
 			}
@@ -2991,7 +2991,7 @@
 							     staId)) {
 					hddLog(LOGE,
 						"wlan_hdd_tdls_set_sta_id() failed");
-					return CDF_STATUS_E_FAILURE;
+					return QDF_STATUS_E_FAILURE;
 				}
 
 				(WLAN_HDD_GET_CTX(pAdapter))->
@@ -3008,7 +3008,7 @@
 							    pRoamInfo->
 							    ucastSig);
 			} else {
-				status = CDF_STATUS_E_FAILURE;
+				status = QDF_STATUS_E_FAILURE;
 				hddLog(LOGE,
 					FL("no available slot in conn_info. staId %d cannot be stored"),
 					pRoamInfo->staId);
@@ -3078,7 +3078,7 @@
 					     tdlsConnInfo[staIdx].
 					     peerMac,
 					     CDF_MAC_ADDR_SIZE);
-				status = CDF_STATUS_SUCCESS;
+				status = QDF_STATUS_SUCCESS;
 				break;
 			}
 		}
@@ -3096,7 +3096,7 @@
 						pRoamInfo->peerMac.bytes, true);
 		wlan_hdd_tdls_indicate_teardown(pAdapter, curr_peer,
 						pRoamInfo->reasonCode);
-		status = CDF_STATUS_SUCCESS;
+		status = QDF_STATUS_SUCCESS;
 		break;
 	}
 	case eCSR_ROAM_RESULT_DELETE_ALL_TDLS_PEER_IND:
@@ -3156,7 +3156,7 @@
 					sme_update_tdls_peer_state(
 						pHddCtx->hHal,
 						&smeTdlsPeerStateParams);
-				if (CDF_STATUS_SUCCESS != status) {
+				if (QDF_STATUS_SUCCESS != status) {
 					hddLog(LOGE,
 						  FL("sme_update_tdls_peer_state failed for "
 						  MAC_ADDRESS_STR),
@@ -3176,7 +3176,7 @@
 				pHddCtx->tdlsConnInfo[staIdx].
 				sessionId = 255;
 
-				status = CDF_STATUS_SUCCESS;
+				status = QDF_STATUS_SUCCESS;
 			}
 		}
 		break;
@@ -3190,7 +3190,7 @@
 				FL("concurrency detected. ignore SHOULD_DISCOVER concurrency_mode: 0x%x, active_sessions: %d"),
 				 pHddCtx->concurrency_mode,
 				 pHddCtx->no_of_active_sessions[CDF_STA_MODE]);
-			status = CDF_STATUS_E_FAILURE;
+			status = QDF_STATUS_E_FAILURE;
 			break;
 		}
 
@@ -3199,7 +3199,7 @@
 					       pRoamInfo->peerMac.bytes);
 		if (!curr_peer) {
 			hddLog(LOGE, FL("curr_peer is null"));
-			status = CDF_STATUS_E_FAILURE;
+			status = QDF_STATUS_E_FAILURE;
 		} else {
 			if (eTDLS_LINK_CONNECTED ==
 			    curr_peer->link_status) {
@@ -3218,7 +3218,7 @@
 					hddLog(LOG2,
 						FL
 						("TDLS ExternalControl enabled but curr_peer is not forced, ignore SHOULD_DISCOVER"));
-					status = CDF_STATUS_SUCCESS;
+					status = QDF_STATUS_SUCCESS;
 					break;
 				} else {
 					hddLog(LOG2,
@@ -3232,7 +3232,7 @@
 				wlan_hdd_tdls_pre_setup_init_work
 					(pHddTdlsCtx, curr_peer);
 			}
-			status = CDF_STATUS_SUCCESS;
+			status = QDF_STATUS_SUCCESS;
 		}
 		break;
 	}
@@ -3244,7 +3244,7 @@
 						pRoamInfo->peerMac.bytes, true);
 		if (!curr_peer) {
 			hddLog(LOGE, FL("curr_peer is null"));
-			status = CDF_STATUS_E_FAILURE;
+			status = QDF_STATUS_E_FAILURE;
 		} else {
 			if (eTDLS_LINK_CONNECTED ==
 			    curr_peer->link_status) {
@@ -3281,7 +3281,7 @@
 					  ("TDLS link is not connected, ignore SHOULD_TEARDOWN, reason: %d"),
 					  pRoamInfo->reasonCode);
 			}
-			status = CDF_STATUS_SUCCESS;
+			status = QDF_STATUS_SUCCESS;
 		}
 		break;
 	}
@@ -3293,7 +3293,7 @@
 						pRoamInfo->peerMac.bytes, true);
 		if (!curr_peer) {
 			hddLog(LOGE, FL("curr_peer is null"));
-			status = CDF_STATUS_E_FAILURE;
+			status = QDF_STATUS_E_FAILURE;
 		} else {
 			if (eTDLS_LINK_CONNECTED ==
 			    curr_peer->link_status) {
@@ -3329,7 +3329,7 @@
 					  ("TDLS link is not connected, ignore SHOULD_PEER_DISCONNECTED, reason: %d"),
 					  pRoamInfo->reasonCode);
 			}
-			status = CDF_STATUS_SUCCESS;
+			status = QDF_STATUS_SUCCESS;
 		}
 		break;
 	}
@@ -3835,17 +3835,17 @@
  * @roamStatus: roam status
  * @roamResult: roam result
  *
- * Return: CDF_STATUS enumeration
+ * Return: QDF_STATUS enumeration
  */
-CDF_STATUS
+QDF_STATUS
 hdd_sme_roam_callback(void *pContext, tCsrRoamInfo *pRoamInfo, uint32_t roamId,
 		      eRoamCmdStatus roamStatus, eCsrRoamResult roamResult)
 {
-	CDF_STATUS cdf_ret_status = CDF_STATUS_SUCCESS;
+	QDF_STATUS cdf_ret_status = QDF_STATUS_SUCCESS;
 	hdd_adapter_t *pAdapter = (hdd_adapter_t *) pContext;
 	hdd_wext_state_t *pWextState = NULL;
 	hdd_station_ctx_t *pHddStaCtx = NULL;
-	CDF_STATUS status = CDF_STATUS_SUCCESS;
+	QDF_STATUS status = QDF_STATUS_SUCCESS;
 	hdd_context_t *pHddCtx = NULL;
 
 	hddLog(LOG2,
@@ -3855,7 +3855,7 @@
 	/* Sanity check */
 	if ((NULL == pAdapter) || (WLAN_HDD_ADAPTER_MAGIC != pAdapter->magic)) {
 		hddLog(LOGP, "invalid adapter or adapter has invalid magic");
-		return CDF_STATUS_E_FAILURE;
+		return QDF_STATUS_E_FAILURE;
 	}
 
 	pWextState = WLAN_HDD_GET_WEXT_STATE_PTR(pAdapter);
@@ -3916,8 +3916,8 @@
 				WLAN_CONTROL_PATH);
 		status = hdd_roam_deregister_sta(pAdapter,
 					pHddStaCtx->conn_info.staId[0]);
-		if (!CDF_IS_STATUS_SUCCESS(status))
-			cdf_ret_status = CDF_STATUS_E_FAILURE;
+		if (!QDF_IS_STATUS_SUCCESS(status))
+			cdf_ret_status = QDF_STATUS_E_FAILURE;
 		pHddStaCtx->ft_carrier_on = true;
 		pHddStaCtx->hdd_ReassocScenario = true;
 		hddLog(LOG1,
@@ -4075,39 +4075,39 @@
 #ifdef FEATURE_WLAN_LFR_METRICS
 	case eCSR_ROAM_PREAUTH_INIT_NOTIFY:
 		/* This event is to notify pre-auth initiation */
-		if (CDF_STATUS_SUCCESS !=
+		if (QDF_STATUS_SUCCESS !=
 		    wlan_hdd_cfg80211_roam_metrics_preauth(pAdapter,
 							   pRoamInfo)) {
-			cdf_ret_status = CDF_STATUS_E_FAILURE;
+			cdf_ret_status = QDF_STATUS_E_FAILURE;
 		}
 		break;
 	case eCSR_ROAM_PREAUTH_STATUS_SUCCESS:
 		/*
 		 * This event will notify pre-auth completion in case of success
 		 */
-		if (CDF_STATUS_SUCCESS !=
+		if (QDF_STATUS_SUCCESS !=
 		    wlan_hdd_cfg80211_roam_metrics_preauth_status(pAdapter,
 							 pRoamInfo, 1)) {
-			cdf_ret_status = CDF_STATUS_E_FAILURE;
+			cdf_ret_status = QDF_STATUS_E_FAILURE;
 		}
 		break;
 	case eCSR_ROAM_PREAUTH_STATUS_FAILURE:
 		/*
 		 * This event will notify pre-auth completion incase of failure.
 		 */
-		if (CDF_STATUS_SUCCESS !=
+		if (QDF_STATUS_SUCCESS !=
 		    wlan_hdd_cfg80211_roam_metrics_preauth_status(pAdapter,
 								pRoamInfo, 0)) {
-			cdf_ret_status = CDF_STATUS_E_FAILURE;
+			cdf_ret_status = QDF_STATUS_E_FAILURE;
 		}
 		break;
 	case eCSR_ROAM_HANDOVER_SUCCESS:
 		/* This event is to notify handover success.
 		   It will be only invoked on success */
-		if (CDF_STATUS_SUCCESS !=
+		if (QDF_STATUS_SUCCESS !=
 		    wlan_hdd_cfg80211_roam_metrics_handover(pAdapter,
 							    pRoamInfo)) {
-			cdf_ret_status = CDF_STATUS_E_FAILURE;
+			cdf_ret_status = QDF_STATUS_E_FAILURE;
 		}
 		break;
 #endif
@@ -4321,7 +4321,7 @@
 				 uint16_t gen_ie_len, uint8_t *gen_ie)
 {
 	tHalHandle halHandle = WLAN_HDD_GET_HAL_CTX(pAdapter);
-	CDF_STATUS result;
+	QDF_STATUS result;
 	tDot11fIERSN dot11RSNIE;
 	tDot11fIEWPA dot11WPAIE;
 	uint32_t i;
@@ -4723,14 +4723,14 @@
 	if (hdd_conn_get_connected_bss_type(pHddStaCtx, &connectedBssType) ||
 	    (eMib_dot11DesiredBssType_independent ==
 	     pHddStaCtx->conn_info.connDot11DesiredBssType)) {
-		CDF_STATUS cdf_status;
+		QDF_STATUS qdf_status;
 
 		/* Need to issue a disconnect to CSR. */
 		INIT_COMPLETION(pAdapter->disconnect_comp_var);
-		cdf_status = sme_roam_disconnect(hHal, pAdapter->sessionId,
+		qdf_status = sme_roam_disconnect(hHal, pAdapter->sessionId,
 					 eCSR_DISCONNECT_REASON_UNSPECIFIED);
 
-		if (CDF_STATUS_SUCCESS == cdf_status) {
+		if (QDF_STATUS_SUCCESS == qdf_status) {
 			rc = wait_for_completion_timeout(&pAdapter->
 						 disconnect_comp_var,
 						 msecs_to_jiffies
@@ -4751,7 +4751,7 @@
 
 	status = hdd_wmm_get_uapsd_mask(pAdapter,
 					&pWextState->roamProfile.uapsd_mask);
-	if (CDF_STATUS_SUCCESS != status)
+	if (QDF_STATUS_SUCCESS != status)
 		pWextState->roamProfile.uapsd_mask = 0;
 
 	pWextState->roamProfile.SSIDs.numOfSSIDs = 1;
diff --git a/core/hdd/src/wlan_hdd_cfg.c b/core/hdd/src/wlan_hdd_cfg.c
index dc76115..194af13 100644
--- a/core/hdd/src/wlan_hdd_cfg.c
+++ b/core/hdd/src/wlan_hdd_cfg.c
@@ -3766,10 +3766,10 @@
  * @pBuf: buffer to store the configuration
  * @buflen: size of the buffer
  *
- * Return: CDF_STATUS_SUCCESS if the configuration and buffer size can carry
- *		the content, otherwise CDF_STATUS_E_RESOURCES
+ * Return: QDF_STATUS_SUCCESS if the configuration and buffer size can carry
+ *		the content, otherwise QDF_STATUS_E_RESOURCES
  */
-static CDF_STATUS hdd_cfg_get_config(REG_TABLE_ENTRY *reg_table,
+static QDF_STATUS hdd_cfg_get_config(REG_TABLE_ENTRY *reg_table,
 				     unsigned long cRegTableEntries,
 				     uint8_t *ini_struct,
 				     hdd_context_t *pHddCtx, char *pBuf,
@@ -3842,7 +3842,7 @@
 			buflen -= curlen;
 		} else {
 			/* buffer space exhausted, return what we have */
-			return CDF_STATUS_E_RESOURCES;
+			return QDF_STATUS_E_RESOURCES;
 		}
 #else
 		printk(KERN_INFO "%s", configStr);
@@ -3855,7 +3855,7 @@
 	snprintf(pCur, buflen, "WLAN configuration written to system log");
 #endif /* RETURN_IN_BUFFER */
 
-	return CDF_STATUS_SUCCESS;
+	return QDF_STATUS_SUCCESS;
 }
 
 /** struct tCfgIniEntry - ini configuration entry
@@ -3875,13 +3875,13 @@
  * @name: the interested configuration to find
  * @value: the value to read back
  *
- * Return: CDF_STATUS_SUCCESS if the interested configuration is found,
- *		otherwise CDF_STATUS_E_FAILURE
+ * Return: QDF_STATUS_SUCCESS if the interested configuration is found,
+ *		otherwise QDF_STATUS_E_FAILURE
  */
-static CDF_STATUS find_cfg_item(tCfgIniEntry *iniTable, unsigned long entries,
+static QDF_STATUS find_cfg_item(tCfgIniEntry *iniTable, unsigned long entries,
 				char *name, char **value)
 {
-	CDF_STATUS status = CDF_STATUS_E_FAILURE;
+	QDF_STATUS status = QDF_STATUS_E_FAILURE;
 	unsigned long i;
 
 	for (i = 0; i < entries; i++) {
@@ -3890,7 +3890,7 @@
 			CDF_TRACE(CDF_MODULE_ID_HDD, CDF_TRACE_LEVEL_INFO_HIGH,
 				  "Found %s entry for Name=[%s] Value=[%s] ",
 				  WLAN_INI_FILE, name, *value);
-			return CDF_STATUS_SUCCESS;
+			return QDF_STATUS_SUCCESS;
 		}
 	}
 
@@ -3959,15 +3959,15 @@
  * @entries: number fo the configuration entries
  * It overwrites the MAC address if config file exist.
  *
- * Return: CDF_STATUS_SUCCESS if the ini configuration file is correctly parsed,
- *		otherwise CDF_STATUS_E_INVAL
+ * Return: QDF_STATUS_SUCCESS if the ini configuration file is correctly parsed,
+ *		otherwise QDF_STATUS_E_INVAL
  */
-static CDF_STATUS hdd_apply_cfg_ini(hdd_context_t *pHddCtx,
+static QDF_STATUS hdd_apply_cfg_ini(hdd_context_t *pHddCtx,
 				    tCfgIniEntry *iniTable,
 				    unsigned long entries)
 {
-	CDF_STATUS match_status = CDF_STATUS_E_FAILURE;
-	CDF_STATUS ret_status = CDF_STATUS_SUCCESS;
+	QDF_STATUS match_status = QDF_STATUS_E_FAILURE;
+	QDF_STATUS ret_status = QDF_STATUS_SUCCESS;
 	unsigned int idx;
 	void *pField;
 	char *value_str = NULL;
@@ -3996,13 +3996,13 @@
 			find_cfg_item(iniTable, entries, pRegEntry->RegName,
 				      &value_str);
 
-		if ((match_status != CDF_STATUS_SUCCESS)
+		if ((match_status != QDF_STATUS_SUCCESS)
 		    && (pRegEntry->Flags & VAR_FLAGS_REQUIRED)) {
 			/* If we could not read the cfg item and it is required, this is an error. */
 			hddLog(LOGE,
 			       "%s: Failed to read required config parameter %s",
 			       __func__, pRegEntry->RegName);
-			ret_status = CDF_STATUS_E_FAILURE;
+			ret_status = QDF_STATUS_E_FAILURE;
 			break;
 		}
 
@@ -4011,7 +4011,7 @@
 			/* If successfully read from the registry, use the value read.
 			 * If not, use the default value.
 			 */
-			if (match_status == CDF_STATUS_SUCCESS
+			if (match_status == QDF_STATUS_SUCCESS
 			    && (WLAN_PARAM_Integer == pRegEntry->RegType)) {
 				rv = kstrtou32(value_str, 10, &value);
 				if (rv < 0) {
@@ -4020,7 +4020,7 @@
 					       __func__, pRegEntry->RegName);
 					value = pRegEntry->VarDefault;
 				}
-			} else if (match_status == CDF_STATUS_SUCCESS
+			} else if (match_status == QDF_STATUS_SUCCESS
 				   && (WLAN_PARAM_HexInteger ==
 				       pRegEntry->RegType)) {
 				rv = kstrtou32(value_str, 16, &value);
@@ -4079,7 +4079,7 @@
 			/* If successfully read from the registry, use the value read.
 			 * If not, use the default value.
 			 */
-			if (CDF_STATUS_SUCCESS == match_status) {
+			if (QDF_STATUS_SUCCESS == match_status) {
 				rv = kstrtos32(value_str, 10, &svalue);
 				if (rv < 0) {
 					hddLog(CDF_TRACE_LEVEL_WARN,
@@ -4149,7 +4149,7 @@
 				  (char *)pRegEntry->VarDefault);
 #endif
 
-			if (match_status == CDF_STATUS_SUCCESS) {
+			if (match_status == QDF_STATUS_SUCCESS) {
 				len_value_str = strlen(value_str);
 
 				if (len_value_str > (pRegEntry->VarSize - 1)) {
@@ -4192,7 +4192,7 @@
 				continue;
 			}
 			candidate = (char *)pRegEntry->VarDefault;
-			if (match_status == CDF_STATUS_SUCCESS) {
+			if (match_status == QDF_STATUS_SUCCESS) {
 				len_value_str = strlen(value_str);
 				if (len_value_str != (CDF_MAC_ADDR_SIZE * 2)) {
 					hddLog(LOGE,
@@ -4217,7 +4217,7 @@
 		}
 
 		/* did we successfully parse a cfg item for this parameter? */
-		if ((match_status == CDF_STATUS_SUCCESS) &&
+		if ((match_status == QDF_STATUS_SUCCESS) &&
 		    (idx < MAX_CFG_INI_ITEMS)) {
 			set_bit(idx, (void *)&pHddCtx->config->bExplicitCfg);
 		}
@@ -4234,10 +4234,10 @@
  * @pHddCtx: the pointer to hdd context
  * @command: the command to run
  *
- * Return: CDF_STATUS_SUCCESS if the command is found and able to execute,
- *		otherwise the appropriate CDF_STATUS will be returned
+ * Return: QDF_STATUS_SUCCESS if the command is found and able to execute,
+ *		otherwise the appropriate QDF_STATUS will be returned
  */
-static CDF_STATUS hdd_execute_config_command(REG_TABLE_ENTRY *reg_table,
+static QDF_STATUS hdd_execute_config_command(REG_TABLE_ENTRY *reg_table,
 					     unsigned long tableSize,
 					     uint8_t *ini_struct,
 					     hdd_context_t *pHddCtx,
@@ -4254,11 +4254,11 @@
 	size_t len_value_str;
 	unsigned int idx;
 	unsigned int i;
-	CDF_STATUS vstatus;
+	QDF_STATUS vstatus;
 	int rv;
 
 	/* assume failure until proven otherwise */
-	vstatus = CDF_STATUS_E_FAILURE;
+	vstatus = QDF_STATUS_E_FAILURE;
 
 	/* clone the command so that we can manipulate it */
 	clone = kstrdup(command, GFP_ATOMIC);
@@ -4329,7 +4329,7 @@
 		/* does not support dynamic configuration */
 		hddLog(LOGE, "%s: Global_Registry_Table.%s does not support "
 		       "dynamic configuration", __func__, name);
-		vstatus = CDF_STATUS_E_PERM;
+		vstatus = QDF_STATUS_E_PERM;
 		goto done;
 	}
 
@@ -4438,7 +4438,7 @@
 	}
 
 	/* if we get here, we had a successful modification */
-	vstatus = CDF_STATUS_SUCCESS;
+	vstatus = QDF_STATUS_SUCCESS;
 
 	/* config table has been modified, is there a notifier? */
 	if (NULL != pRegEntry->pfnDynamicnotify) {
@@ -5241,10 +5241,10 @@
  *
  * It overwrites the MAC address if config file exist.
  *
- * Return: CDF_STATUS_SUCCESS if the MAC address is found from cfg file
- *      and overwritten, otherwise CDF_STATUS_E_INVAL
+ * Return: QDF_STATUS_SUCCESS if the MAC address is found from cfg file
+ *      and overwritten, otherwise QDF_STATUS_E_INVAL
  */
-CDF_STATUS hdd_update_mac_config(hdd_context_t *pHddCtx)
+QDF_STATUS hdd_update_mac_config(hdd_context_t *pHddCtx)
 {
 	int status, i = 0;
 	const struct firmware *fw = NULL;
@@ -5253,7 +5253,7 @@
 	tCfgIniEntry macTable[CDF_MAX_CONCURRENCY_PERSONA];
 	tSirMacAddr customMacAddr;
 
-	CDF_STATUS cdf_status = CDF_STATUS_SUCCESS;
+	QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
 
 	memset(macTable, 0, sizeof(macTable));
 	status = request_firmware(&fw, WLAN_MAC_FILE, pHddCtx->parent_dev);
@@ -5261,12 +5261,12 @@
 	if (status) {
 		hddLog(CDF_TRACE_LEVEL_WARN, "%s: request_firmware failed %d",
 		       __func__, status);
-		cdf_status = CDF_STATUS_E_FAILURE;
-		return cdf_status;
+		qdf_status = QDF_STATUS_E_FAILURE;
+		return qdf_status;
 	}
 	if (!fw || !fw->data || !fw->size) {
 		hddLog(CDF_TRACE_LEVEL_FATAL, "%s: invalid firmware", __func__);
-		cdf_status = CDF_STATUS_E_INVAL;
+		qdf_status = QDF_STATUS_E_INVAL;
 		goto config_exit;
 	}
 
@@ -5313,7 +5313,7 @@
 		hddLog(CDF_TRACE_LEVEL_ERROR,
 		       "%s: invalid number of Mac address provided, nMac = %d",
 		       __func__, i);
-		cdf_status = CDF_STATUS_E_INVAL;
+		qdf_status = QDF_STATUS_E_INVAL;
 		goto config_exit;
 	}
 
@@ -5326,7 +5326,7 @@
 
 config_exit:
 	release_firmware(fw);
-	return cdf_status;
+	return qdf_status;
 }
 
 /**
@@ -5336,10 +5336,10 @@
  * This function reads the qcom_cfg.ini file and
  * parses each 'Name=Value' pair in the ini file
  *
- * Return: CDF_STATUS_SUCCESS if the qcom_cfg.ini is correctly read,
- *		otherwise CDF_STATUS_E_INVAL
+ * Return: QDF_STATUS_SUCCESS if the qcom_cfg.ini is correctly read,
+ *		otherwise QDF_STATUS_E_INVAL
  */
-CDF_STATUS hdd_parse_config_ini(hdd_context_t *pHddCtx)
+QDF_STATUS hdd_parse_config_ini(hdd_context_t *pHddCtx)
 {
 	int status, i = 0;
 	/** Pointer for firmware image data */
@@ -5349,7 +5349,7 @@
 	char *name, *value;
 	/* cfgIniTable is static to avoid excess stack usage */
 	static tCfgIniEntry cfgIniTable[MAX_CFG_INI_ITEMS];
-	CDF_STATUS cdf_status = CDF_STATUS_SUCCESS;
+	QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
 
 	memset(cfgIniTable, 0, sizeof(cfgIniTable));
 
@@ -5358,13 +5358,13 @@
 	if (status) {
 		hddLog(CDF_TRACE_LEVEL_FATAL, "%s: request_firmware failed %d",
 		       __func__, status);
-		cdf_status = CDF_STATUS_E_FAILURE;
+		qdf_status = QDF_STATUS_E_FAILURE;
 		goto config_exit;
 	}
 	if (!fw || !fw->data || !fw->size) {
 		hddLog(CDF_TRACE_LEVEL_FATAL, "%s: %s download failed",
 		       __func__, WLAN_INI_FILE);
-		cdf_status = CDF_STATUS_E_FAILURE;
+		qdf_status = QDF_STATUS_E_FAILURE;
 		goto config_exit;
 	}
 
@@ -5375,7 +5375,7 @@
 	if (NULL == buffer) {
 		hddLog(CDF_TRACE_LEVEL_FATAL, FL("cdf_mem_malloc failure"));
 		release_firmware(fw);
-		return CDF_STATUS_E_NOMEM;
+		return QDF_STATUS_E_NOMEM;
 	}
 	pTemp = buffer;
 
@@ -5426,9 +5426,9 @@
 	}
 
 	/* Loop through the registry table and apply all these configs */
-	cdf_status = hdd_apply_cfg_ini(pHddCtx, cfgIniTable, i);
+	qdf_status = hdd_apply_cfg_ini(pHddCtx, cfgIniTable, i);
 #ifdef FEATURE_NAPI
-	if (CDF_STATUS_SUCCESS == cdf_status)
+	if (QDF_STATUS_SUCCESS == qdf_status)
 		hdd_napi_event(NAPI_EVT_INI_FILE,
 			       (void *)pHddCtx->config->napi_enable);
 #endif /* FEATURE_NAPI */
@@ -5436,7 +5436,7 @@
 config_exit:
 	release_firmware(fw);
 	cdf_mem_free(pTemp);
-	return cdf_status;
+	return qdf_status;
 }
 
 /**
@@ -5489,18 +5489,18 @@
  * @pHddCtx: the pointer to hdd context
  * @val: the value to configure
  *
- * Return: CDF_STATUS_SUCCESS if command set correctly,
- *		otherwise the CDF_STATUS return from SME layer
+ * Return: QDF_STATUS_SUCCESS if command set correctly,
+ *		otherwise the QDF_STATUS return from SME layer
  */
-CDF_STATUS hdd_set_idle_ps_config(hdd_context_t *pHddCtx, uint32_t val)
+QDF_STATUS hdd_set_idle_ps_config(hdd_context_t *pHddCtx, uint32_t val)
 {
-	CDF_STATUS status = CDF_STATUS_SUCCESS;
+	QDF_STATUS status = QDF_STATUS_SUCCESS;
 
 	hddLog(LOG1, "hdd_set_idle_ps_config: Enter Val %d", val);
 
 	status = sme_set_idle_powersave_config(pHddCtx->pcds_context,
 			pHddCtx->hHal, val);
-	if (CDF_STATUS_SUCCESS != status)
+	if (QDF_STATUS_SUCCESS != status)
 		hddLog(LOGE, "Fail to Set Idle PS Config val %d", val);
 	return status;
 }
@@ -5544,16 +5544,16 @@
  * This API is called to convert string (each byte separated by
  * a comma) into an u8 array
  *
- * Return: CDF_STATUS
+ * Return: QDF_STATUS
  */
 
-static CDF_STATUS hdd_convert_string_to_array(char *str, uint8_t *array,
+static QDF_STATUS hdd_convert_string_to_array(char *str, uint8_t *array,
 			       uint8_t *len, uint8_t array_max_len, bool to_hex)
 {
 	char *format, *s = str;
 
 	if (str == NULL || array == NULL || len == NULL)
-		return CDF_STATUS_E_INVAL;
+		return QDF_STATUS_E_INVAL;
 
 	format = (to_hex) ? "%02x" : "%d";
 
@@ -5573,7 +5573,7 @@
 			s++;
 	}
 
-	return CDF_STATUS_SUCCESS;
+	return QDF_STATUS_SUCCESS;
 }
 
 /**
@@ -5586,9 +5586,9 @@
  * This API is called to convert hexadecimal string (each byte separated by
  * a comma) into an u8 array
  *
- * Return: CDF_STATUS
+ * Return: QDF_STATUS
  */
-CDF_STATUS hdd_hex_string_to_u8_array(char *str, uint8_t *hex_array,
+QDF_STATUS hdd_hex_string_to_u8_array(char *str, uint8_t *hex_array,
 				      uint8_t *len, uint8_t array_max_len)
 {
 	return hdd_convert_string_to_array(str, hex_array, len,
@@ -5605,10 +5605,10 @@
  * This API is called to convert decimal string (each byte separated by
  * a comma) into an u8 array
  *
- * Return: CDF_STATUS
+ * Return: QDF_STATUS
  */
 
-CDF_STATUS hdd_string_to_u8_array(char *str, uint8_t *array,
+QDF_STATUS hdd_string_to_u8_array(char *str, uint8_t *array,
 				  uint8_t *len, uint8_t array_max_len)
 {
 	return hdd_convert_string_to_array(str, array, len,
@@ -5621,8 +5621,8 @@
  * @intArray: the pointer of buffer to store the u8 value
  * @len: size of the buffer
  *
- * Return: CDF_STATUS_SUCCESS if the configuration could be updated corectly,
- *		otherwise CDF_STATUS_E_INVAL
+ * Return: QDF_STATUS_SUCCESS if the configuration could be updated corectly,
+ *		otherwise QDF_STATUS_E_INVAL
  */
 bool hdd_update_config_dat(hdd_context_t *pHddCtx)
 {
@@ -5635,20 +5635,20 @@
 
 	if (sme_cfg_set_int(pHddCtx->hHal, WNI_CFG_SHORT_GI_20MHZ,
 			    pConfig->ShortGI20MhzEnable) ==
-			CDF_STATUS_E_FAILURE) {
+			QDF_STATUS_E_FAILURE) {
 		fStatus = false;
 		hddLog(LOGE, "Could not pass on WNI_CFG_SHORT_GI_20MHZ to CFG");
 	}
 
 	if (sme_cfg_set_int(pHddCtx->hHal, WNI_CFG_FIXED_RATE, pConfig->TxRate)
-			    == CDF_STATUS_E_FAILURE) {
+			    == QDF_STATUS_E_FAILURE) {
 		fStatus = false;
 		hddLog(LOGE, "Could not pass on WNI_CFG_FIXED_RATE to CFG");
 	}
 
 	if (sme_cfg_set_int(pHddCtx->hHal, WNI_CFG_MAX_RX_AMPDU_FACTOR,
 			    pConfig->MaxRxAmpduFactor) ==
-			CDF_STATUS_E_FAILURE) {
+			QDF_STATUS_E_FAILURE) {
 		fStatus = false;
 		hddLog(LOGE,
 		       "Could not pass on WNI_CFG_HT_AMPDU_PARAMS_MAX_RX_AMPDU_FACTOR to CFG");
@@ -5656,7 +5656,7 @@
 
 	if (sme_cfg_set_int(pHddCtx->hHal, WNI_CFG_MPDU_DENSITY,
 			    pConfig->ht_mpdu_density) ==
-			CDF_STATUS_E_FAILURE) {
+			QDF_STATUS_E_FAILURE) {
 		fStatus = false;
 		hddLog(LOGE,
 		       "Could not pass on WNI_CFG_MPDU_DENSITY to CFG");
@@ -5664,7 +5664,7 @@
 
 	if (sme_cfg_set_int
 		    (pHddCtx->hHal, WNI_CFG_SHORT_PREAMBLE,
-		     pConfig->fIsShortPreamble) == CDF_STATUS_E_FAILURE) {
+		     pConfig->fIsShortPreamble) == QDF_STATUS_E_FAILURE) {
 		fStatus = false;
 		hddLog(LOGE,
 			"Could not pass on WNI_CFG_SHORT_PREAMBLE to CFG");
@@ -5673,7 +5673,7 @@
 	if (sme_cfg_set_int(pHddCtx->hHal,
 				WNI_CFG_PASSIVE_MINIMUM_CHANNEL_TIME,
 				pConfig->nPassiveMinChnTime)
-				== CDF_STATUS_E_FAILURE) {
+				== QDF_STATUS_E_FAILURE) {
 		fStatus = false;
 		hddLog(LOGE,
 		       "Could not pass on WNI_CFG_PASSIVE_MINIMUM_CHANNEL_TIME"
@@ -5683,7 +5683,7 @@
 	if (sme_cfg_set_int(pHddCtx->hHal,
 				WNI_CFG_PASSIVE_MAXIMUM_CHANNEL_TIME,
 				pConfig->nPassiveMaxChnTime)
-				== CDF_STATUS_E_FAILURE) {
+				== QDF_STATUS_E_FAILURE) {
 		fStatus = false;
 		hddLog(LOGE,
 		       "Could not pass on WNI_CFG_PASSIVE_MAXIMUM_CHANNEL_TIME"
@@ -5692,7 +5692,7 @@
 
 	if (sme_cfg_set_int
 		    (pHddCtx->hHal, WNI_CFG_BEACON_INTERVAL,
-		     pConfig->nBeaconInterval) == CDF_STATUS_E_FAILURE) {
+		     pConfig->nBeaconInterval) == QDF_STATUS_E_FAILURE) {
 		fStatus = false;
 		hddLog(LOGE,
 		       "Could not pass on WNI_CFG_BEACON_INTERVAL to CFG");
@@ -5700,21 +5700,21 @@
 
 	if (sme_cfg_set_int
 		    (pHddCtx->hHal, WNI_CFG_MAX_PS_POLL,
-		     pConfig->nMaxPsPoll) == CDF_STATUS_E_FAILURE) {
+		     pConfig->nMaxPsPoll) == QDF_STATUS_E_FAILURE) {
 		fStatus = false;
 		hddLog(LOGE, "Could not pass on WNI_CFG_MAX_PS_POLL to CFG");
 	}
 
 	if (sme_cfg_set_int
 		    (pHddCtx->hHal, WNI_CFG_CURRENT_RX_ANTENNA,
-		     pConfig->nRxAnt) == CDF_STATUS_E_FAILURE) {
+		     pConfig->nRxAnt) == QDF_STATUS_E_FAILURE) {
 		fStatus = false;
 		hddLog(LOGE,
 		       "Could not pass on WNI_CFG_CURRENT_RX_ANTENNA to CFG");
 	}
 
 	if (sme_cfg_set_int (pHddCtx->hHal, WNI_CFG_LOW_GAIN_OVERRIDE,
-		    pConfig->fIsLowGainOverride) == CDF_STATUS_E_FAILURE) {
+		    pConfig->fIsLowGainOverride) == QDF_STATUS_E_FAILURE) {
 		fStatus = false;
 		hddLog(LOGE,
 		       "Could not pass on WNI_CFG_LOW_GAIN_OVERRIDE to HAL");
@@ -5722,7 +5722,7 @@
 
 	if (sme_cfg_set_int
 		    (pHddCtx->hHal, WNI_CFG_RSSI_FILTER_PERIOD,
-		    pConfig->nRssiFilterPeriod) == CDF_STATUS_E_FAILURE) {
+		    pConfig->nRssiFilterPeriod) == QDF_STATUS_E_FAILURE) {
 		fStatus = false;
 		hddLog(LOGE,
 		       "Could not pass on WNI_CFG_RSSI_FILTER_PERIOD to CFG");
@@ -5730,7 +5730,7 @@
 
 	if (sme_cfg_set_int
 		    (pHddCtx->hHal, WNI_CFG_IGNORE_DTIM,
-		     pConfig->fIgnoreDtim) == CDF_STATUS_E_FAILURE) {
+		     pConfig->fIgnoreDtim) == QDF_STATUS_E_FAILURE) {
 		fStatus = false;
 		hddLog(LOGE,
 		       "Could not pass on WNI_IGNORE_DTIM to CFG");
@@ -5739,7 +5739,7 @@
 	if (sme_cfg_set_int
 		    (pHddCtx->hHal, WNI_CFG_PS_ENABLE_HEART_BEAT,
 		    pConfig->fEnableFwHeartBeatMonitoring)
-		    == CDF_STATUS_E_FAILURE) {
+		    == QDF_STATUS_E_FAILURE) {
 		fStatus = false;
 		hddLog(LOGE,
 		       "Could not pass on WNI_CFG_PS_HEART_BEAT to CFG");
@@ -5748,7 +5748,7 @@
 	if (sme_cfg_set_int
 		    (pHddCtx->hHal, WNI_CFG_PS_ENABLE_BCN_FILTER,
 		    pConfig->fEnableFwBeaconFiltering) ==
-		    CDF_STATUS_E_FAILURE) {
+		    QDF_STATUS_E_FAILURE) {
 		fStatus = false;
 		hddLog(LOGE,
 		       "Could not pass on WNI_CFG_PS_BCN_FILTER to CFG");
@@ -5757,7 +5757,7 @@
 	if (sme_cfg_set_int
 		    (pHddCtx->hHal, WNI_CFG_PS_ENABLE_RSSI_MONITOR,
 		    pConfig->fEnableFwRssiMonitoring) ==
-		    CDF_STATUS_E_FAILURE) {
+		    QDF_STATUS_E_FAILURE) {
 		fStatus = false;
 		hddLog(LOGE,
 		       "Could not pass on WNI_CFG_PS_RSSI_MONITOR to CFG");
@@ -5765,7 +5765,7 @@
 
 	if (sme_cfg_set_int
 		    (pHddCtx->hHal, WNI_CFG_PS_DATA_INACTIVITY_TIMEOUT,
-		    pConfig->nDataInactivityTimeout) == CDF_STATUS_E_FAILURE) {
+		    pConfig->nDataInactivityTimeout) == QDF_STATUS_E_FAILURE) {
 		fStatus = false;
 		hddLog(LOGE,
 		       "Could not pass on WNI_CFG_PS_DATA_INACTIVITY_TIMEOUT to CFG");
@@ -5773,7 +5773,7 @@
 
 	if (sme_cfg_set_int
 		    (pHddCtx->hHal, WNI_CFG_ENABLE_LTE_COEX,
-		     pConfig->enableLTECoex) == CDF_STATUS_E_FAILURE) {
+		     pConfig->enableLTECoex) == QDF_STATUS_E_FAILURE) {
 		fStatus = false;
 		hddLog(LOGE,
 		       "Could not pass on WNI_CFG_ENABLE_LTE_COEX to CFG");
@@ -5781,7 +5781,7 @@
 
 	if (sme_cfg_set_int
 		    (pHddCtx->hHal, WNI_CFG_ENABLE_PHY_AGC_LISTEN_MODE,
-		    pConfig->nEnableListenMode) == CDF_STATUS_E_FAILURE) {
+		    pConfig->nEnableListenMode) == QDF_STATUS_E_FAILURE) {
 		fStatus = false;
 		hddLog(LOGE,
 		       "Could not pass on WNI_CFG_ENABLE_PHY_AGC_LISTEN_MODE to CFG");
@@ -5789,7 +5789,7 @@
 
 	if (sme_cfg_set_int
 		    (pHddCtx->hHal, WNI_CFG_AP_KEEP_ALIVE_TIMEOUT,
-		    pConfig->apKeepAlivePeriod) == CDF_STATUS_E_FAILURE) {
+		    pConfig->apKeepAlivePeriod) == QDF_STATUS_E_FAILURE) {
 		fStatus = false;
 		hddLog(LOGE,
 		       "Could not pass on WNI_CFG_AP_KEEP_ALIVE_TIMEOUT to CFG");
@@ -5797,7 +5797,7 @@
 
 	if (sme_cfg_set_int
 		    (pHddCtx->hHal, WNI_CFG_GO_KEEP_ALIVE_TIMEOUT,
-		    pConfig->goKeepAlivePeriod) == CDF_STATUS_E_FAILURE) {
+		    pConfig->goKeepAlivePeriod) == QDF_STATUS_E_FAILURE) {
 		fStatus = false;
 		hddLog(LOGE,
 		       "Could not pass on WNI_CFG_GO_KEEP_ALIVE_TIMEOUT to CFG");
@@ -5805,7 +5805,7 @@
 
 	if (sme_cfg_set_int
 		    (pHddCtx->hHal, WNI_CFG_AP_LINK_MONITOR_TIMEOUT,
-		    pConfig->apLinkMonitorPeriod) == CDF_STATUS_E_FAILURE) {
+		    pConfig->apLinkMonitorPeriod) == QDF_STATUS_E_FAILURE) {
 		fStatus = false;
 		hddLog(LOGE,
 		       "Could not pass on WNI_CFG_AP_LINK_MONITOR_TIMEOUT to CFG");
@@ -5813,7 +5813,7 @@
 
 	if (sme_cfg_set_int
 		    (pHddCtx->hHal, WNI_CFG_GO_LINK_MONITOR_TIMEOUT,
-		    pConfig->goLinkMonitorPeriod) == CDF_STATUS_E_FAILURE) {
+		    pConfig->goLinkMonitorPeriod) == QDF_STATUS_E_FAILURE) {
 		fStatus = false;
 		hddLog(LOGE,
 		       "Could not pass on WNI_CFG_GO_LINK_MONITOR_TIMEOUT to CFG");
@@ -5822,7 +5822,7 @@
 #if defined WLAN_FEATURE_VOWIFI
 	if (sme_cfg_set_int
 		    (pHddCtx->hHal, WNI_CFG_MCAST_BCAST_FILTER_SETTING,
-		    pConfig->mcastBcastFilterSetting) == CDF_STATUS_E_FAILURE)
+		    pConfig->mcastBcastFilterSetting) == QDF_STATUS_E_FAILURE)
 		fStatus = false;
 		hddLog(LOGE,
 		       "Could not pass on WNI_CFG_MCAST_BCAST_FILTER_SETTING to CFG");
@@ -5830,7 +5830,7 @@
 
 	if (sme_cfg_set_int
 		    (pHddCtx->hHal, WNI_CFG_SINGLE_TID_RC,
-		    pConfig->bSingleTidRc) == CDF_STATUS_E_FAILURE) {
+		    pConfig->bSingleTidRc) == QDF_STATUS_E_FAILURE) {
 		fStatus = false;
 		hddLog(LOGE,
 		       "Could not pass on WNI_CFG_SINGLE_TID_RC to CFG");
@@ -5838,7 +5838,7 @@
 
 	if (sme_cfg_set_int
 		    (pHddCtx->hHal, WNI_CFG_TELE_BCN_WAKEUP_EN,
-		    pConfig->teleBcnWakeupEn) == CDF_STATUS_E_FAILURE) {
+		    pConfig->teleBcnWakeupEn) == QDF_STATUS_E_FAILURE) {
 		fStatus = false;
 		hddLog(LOGE,
 		       "Could not pass on WNI_CFG_TELE_BCN_WAKEUP_EN to CFG");
@@ -5847,7 +5847,7 @@
 	if (sme_cfg_set_int
 		    (pHddCtx->hHal, WNI_CFG_TELE_BCN_TRANS_LI,
 		    pConfig->nTeleBcnTransListenInterval) ==
-		    CDF_STATUS_E_FAILURE) {
+		    QDF_STATUS_E_FAILURE) {
 		fStatus = false;
 		hddLog(LOGE,
 		       "Could not pass on WNI_CFG_TELE_BCN_TRANS_LI to CFG");
@@ -5856,7 +5856,7 @@
 	if (sme_cfg_set_int
 		    (pHddCtx->hHal, WNI_CFG_TELE_BCN_MAX_LI,
 		    pConfig->nTeleBcnMaxListenInterval) ==
-		    CDF_STATUS_E_FAILURE) {
+		    QDF_STATUS_E_FAILURE) {
 		fStatus = false;
 		hddLog(LOGE,
 		       "Could not pass on WNI_CFG_TELE_BCN_MAX_LI to CFG");
@@ -5865,7 +5865,7 @@
 	if (sme_cfg_set_int
 		    (pHddCtx->hHal, WNI_CFG_TELE_BCN_TRANS_LI_IDLE_BCNS,
 		    pConfig->nTeleBcnTransLiNumIdleBeacons) ==
-		    CDF_STATUS_E_FAILURE) {
+		    QDF_STATUS_E_FAILURE) {
 		fStatus = false;
 		hddLog(LOGE,
 		       "Could not pass on WNI_CFG_TELE_BCN_TRANS_LI_IDLE_BCNS to CFG");
@@ -5874,7 +5874,7 @@
 	if (sme_cfg_set_int
 		    (pHddCtx->hHal, WNI_CFG_TELE_BCN_MAX_LI_IDLE_BCNS,
 		    pConfig->nTeleBcnMaxLiNumIdleBeacons) ==
-		    CDF_STATUS_E_FAILURE) {
+		    QDF_STATUS_E_FAILURE) {
 		fStatus = false;
 		hddLog(LOGE,
 		       "Could not pass on WNI_CFG_TELE_BCN_MAX_LI_IDLE_BCNS to CFG");
@@ -5882,7 +5882,7 @@
 
 	if (sme_cfg_set_int
 		    (pHddCtx->hHal, WNI_CFG_RF_SETTLING_TIME_CLK,
-		    pConfig->rfSettlingTimeUs) == CDF_STATUS_E_FAILURE) {
+		    pConfig->rfSettlingTimeUs) == QDF_STATUS_E_FAILURE) {
 		fStatus = false;
 		hddLog(LOGE,
 		       "Could not pass on WNI_CFG_RF_SETTLING_TIME_CLK to CFG");
@@ -5891,14 +5891,14 @@
 	if (sme_cfg_set_int
 		    (pHddCtx->hHal, WNI_CFG_INFRA_STA_KEEP_ALIVE_PERIOD,
 		    pConfig->infraStaKeepAlivePeriod) ==
-		    CDF_STATUS_E_FAILURE) {
+		    QDF_STATUS_E_FAILURE) {
 		fStatus = false;
 		hddLog(LOGE,
 		       "Could not pass on WNI_CFG_INFRA_STA_KEEP_ALIVE_PERIOD to CFG");
 	}
 	if (sme_cfg_set_int
 		    (pHddCtx->hHal, WNI_CFG_DYNAMIC_PS_POLL_VALUE,
-		    pConfig->dynamicPsPollValue) == CDF_STATUS_E_FAILURE) {
+		    pConfig->dynamicPsPollValue) == QDF_STATUS_E_FAILURE) {
 		fStatus = false;
 		hddLog(LOGE,
 		       "Could not pass on WNI_CFG_DYNAMIC_PS_POLL_VALUE to CFG");
@@ -5906,7 +5906,7 @@
 
 	if (sme_cfg_set_int
 		    (pHddCtx->hHal, WNI_CFG_PS_NULLDATA_AP_RESP_TIMEOUT,
-		    pConfig->nNullDataApRespTimeout) == CDF_STATUS_E_FAILURE) {
+		    pConfig->nNullDataApRespTimeout) == QDF_STATUS_E_FAILURE) {
 		fStatus = false;
 		hddLog(LOGE,
 		       "Could not pass on WNI_CFG_PS_NULLDATA_DELAY_TIMEOUT to CFG");
@@ -5915,21 +5915,21 @@
 	if (sme_cfg_set_int
 		    (pHddCtx->hHal, WNI_CFG_AP_DATA_AVAIL_POLL_PERIOD,
 		    pConfig->apDataAvailPollPeriodInMs) ==
-		    CDF_STATUS_E_FAILURE) {
+		    QDF_STATUS_E_FAILURE) {
 		fStatus = false;
 		hddLog(LOGE,
 		       "Could not pass on WNI_CFG_AP_DATA_AVAIL_POLL_PERIOD to CFG");
 	}
 	if (sme_cfg_set_int
 		    (pHddCtx->hHal, WNI_CFG_FRAGMENTATION_THRESHOLD,
-		    pConfig->FragmentationThreshold) == CDF_STATUS_E_FAILURE) {
+		    pConfig->FragmentationThreshold) == QDF_STATUS_E_FAILURE) {
 		fStatus = false;
 		hddLog(LOGE,
 		       "Could not pass on WNI_CFG_FRAGMENTATION_THRESHOLD to CFG");
 	}
 	if (sme_cfg_set_int
 		    (pHddCtx->hHal, WNI_CFG_RTS_THRESHOLD,
-		     pConfig->RTSThreshold) == CDF_STATUS_E_FAILURE) {
+		     pConfig->RTSThreshold) == QDF_STATUS_E_FAILURE) {
 		fStatus = false;
 		hddLog(LOGE,
 		       "Could not pass on WNI_CFG_RTS_THRESHOLD to CFG");
@@ -5937,7 +5937,7 @@
 
 	if (sme_cfg_set_int
 		    (pHddCtx->hHal, WNI_CFG_11D_ENABLED,
-		     pConfig->Is11dSupportEnabled) == CDF_STATUS_E_FAILURE) {
+		     pConfig->Is11dSupportEnabled) == QDF_STATUS_E_FAILURE) {
 		fStatus = false;
 		hddLog(LOGE,
 		       "Could not pass on WNI_CFG_11D_ENABLED to CFG");
@@ -5945,7 +5945,7 @@
 
 	if (sme_cfg_set_int(pHddCtx->hHal, WNI_CFG_DFS_MASTER_ENABLED,
 			    pConfig->enableDFSMasterCap) ==
-			CDF_STATUS_E_FAILURE) {
+			QDF_STATUS_E_FAILURE) {
 		fStatus = false;
 		hddLog(LOGE,
 		       "Failure: Could not set value for WNI_CFG_DFS_MASTER_ENABLED");
@@ -5953,7 +5953,7 @@
 
 	if (sme_cfg_set_int(pHddCtx->hHal, WNI_CFG_VHT_ENABLE_TXBF_20MHZ,
 			    pConfig->enableTxBFin20MHz) ==
-			CDF_STATUS_E_FAILURE) {
+			QDF_STATUS_E_FAILURE) {
 		fStatus = false;
 		hddLog(LOGE,
 		       "Could not set value for WNI_CFG_VHT_ENABLE_TXBF_20MHZ");
@@ -5961,7 +5961,7 @@
 
 	if (sme_cfg_set_int
 		    (pHddCtx->hHal, WNI_CFG_HEART_BEAT_THRESHOLD,
-		    pConfig->HeartbeatThresh24) == CDF_STATUS_E_FAILURE) {
+		    pConfig->HeartbeatThresh24) == QDF_STATUS_E_FAILURE) {
 		fStatus = false;
 		hddLog(LOGE,
 		       "Could not pass on WNI_CFG_HEART_BEAT_THRESHOLD to CFG");
@@ -5970,7 +5970,7 @@
 	if (sme_cfg_set_int
 		    (pHddCtx->hHal, WNI_CFG_AP_DATA_AVAIL_POLL_PERIOD,
 		    pConfig->apDataAvailPollPeriodInMs) ==
-		    CDF_STATUS_E_FAILURE) {
+		    QDF_STATUS_E_FAILURE) {
 		fStatus = false;
 		hddLog(LOGE,
 		       "Could not pass on WNI_CFG_AP_DATA_AVAIL_POLL_PERIOD to CFG");
@@ -5978,7 +5978,7 @@
 
 	if (sme_cfg_set_int(pHddCtx->hHal, WNI_CFG_ENABLE_CLOSE_LOOP,
 			    pConfig->enableCloseLoop) ==
-			CDF_STATUS_E_FAILURE) {
+			QDF_STATUS_E_FAILURE) {
 		fStatus = false;
 		hddLog(LOGE,
 		       "Could not pass on WNI_CFG_ENABLE_CLOSE_LOOP to CFG");
@@ -5986,7 +5986,7 @@
 
 	if (sme_cfg_set_int(pHddCtx->hHal, WNI_CFG_TX_PWR_CTRL_ENABLE,
 			    pConfig->enableAutomaticTxPowerControl)
-			== CDF_STATUS_E_FAILURE) {
+			== QDF_STATUS_E_FAILURE) {
 		fStatus = false;
 		hddLog(LOGE,
 		       "Could not pass on WNI_CFG_TX_PWR_CTRL_ENABLE to CFG");
@@ -5994,14 +5994,14 @@
 
 	if (sme_cfg_set_int(pHddCtx->hHal, WNI_CFG_SHORT_GI_40MHZ,
 			    pConfig->ShortGI40MhzEnable) ==
-			CDF_STATUS_E_FAILURE) {
+			QDF_STATUS_E_FAILURE) {
 		fStatus = false;
 		hddLog(LOGE, "Could not pass on WNI_CFG_SHORT_GI_40MHZ to CFG");
 	}
 
 	if (sme_cfg_set_int
 		    (pHddCtx->hHal, WNI_CFG_ENABLE_MC_ADDR_LIST,
-		    pConfig->fEnableMCAddrList) == CDF_STATUS_E_FAILURE) {
+		    pConfig->fEnableMCAddrList) == QDF_STATUS_E_FAILURE) {
 		fStatus = false;
 		hddLog(LOGE,
 		       "Could not pass on WNI_CFG_ENABLE_MC_ADDR_LIST to CFG");
@@ -6023,7 +6023,7 @@
 			temp = (temp & 0xFFF3) | (pConfig->vhtRxMCS2x2 << 2);
 			if (sme_cfg_set_int(pHddCtx->hHal,
 					WNI_CFG_VHT_BASIC_MCS_SET, temp) ==
-					CDF_STATUS_E_FAILURE) {
+					QDF_STATUS_E_FAILURE) {
 			fStatus = false;
 			hddLog(LOGE,
 			       "Could not pass on WNI_CFG_VHT_BASIC_MCS_SET to CFG");
@@ -6036,7 +6036,7 @@
 			temp = (temp & 0xFFF3) | (pConfig->vhtRxMCS2x2 << 2);
 			if (sme_cfg_set_int(pHddCtx->hHal,
 					WNI_CFG_VHT_RX_MCS_MAP, temp)
-				== CDF_STATUS_E_FAILURE) {
+				== QDF_STATUS_E_FAILURE) {
 			fStatus = false;
 			hddLog(LOGE,
 			       "Could not pass on WNI_CFG_VHT_RX_MCS_MAP to CFG");
@@ -6051,7 +6051,7 @@
 			  pConfig->enable2x2);
 
 		if (sme_cfg_set_int(pHddCtx->hHal, WNI_CFG_VHT_TX_MCS_MAP,
-					temp) == CDF_STATUS_E_FAILURE) {
+					temp) == QDF_STATUS_E_FAILURE) {
 			fStatus = false;
 			hddLog(LOGE,
 			       "Could not pass on WNI_CFG_VHT_TX_MCS_MAP to CFG");
@@ -6060,7 +6060,7 @@
 		if (sme_cfg_set_int
 			    (pHddCtx->hHal, WNI_CFG_VHT_SHORT_GI_80MHZ,
 			    pConfig->ShortGI40MhzEnable) ==
-			    CDF_STATUS_E_FAILURE) {
+			    QDF_STATUS_E_FAILURE) {
 			fStatus = false;
 			hddLog(LOGE,
 			       "Could not pass WNI_VHT_SHORT_GI_80MHZ to CFG");
@@ -6070,7 +6070,7 @@
 		if (sme_cfg_set_int(pHddCtx->hHal,
 			     WNI_CFG_VHT_AMPDU_LEN_EXPONENT,
 			     pConfig->fVhtAmpduLenExponent) ==
-			    CDF_STATUS_E_FAILURE) {
+			    QDF_STATUS_E_FAILURE) {
 			fStatus = false;
 			hddLog(LOGE,
 			       "Could not pass on WNI_CFG_VHT_AMPDU_LEN_EXPONENT to CFG");
@@ -6084,7 +6084,7 @@
 				if (sme_cfg_set_int(pHddCtx->hHal,
 					    WNI_CFG_VHT_MU_BEAMFORMEE_CAP,
 					    pConfig->enableMuBformee
-					    ) == CDF_STATUS_E_FAILURE) {
+					    ) == QDF_STATUS_E_FAILURE) {
 					fStatus = false;
 					hddLog(LOGE,
 						"Could not pass on WNI_CFG_VHT_MU_BEAMFORMEE_CAP to CFG");
@@ -6092,7 +6092,7 @@
 			}
 		}
 		if (sme_cfg_set_int(pHddCtx->hHal, WNI_CFG_VHT_MAX_MPDU_LENGTH,
-			    pConfig->vhtMpduLen) == CDF_STATUS_E_FAILURE) {
+			    pConfig->vhtMpduLen) == QDF_STATUS_E_FAILURE) {
 			fStatus = false;
 			hddLog(LOGE,
 			       "Could not pass on WNI_CFG_VHT_MAX_MPDU_LENGTH to CFG");
@@ -6102,14 +6102,14 @@
 			if (sme_cfg_set_int(pHddCtx->hHal,
 					WNI_CFG_VHT_SU_BEAMFORMER_CAP,
 					pConfig->enable_su_tx_bformer) ==
-				CDF_STATUS_E_FAILURE) {
+				QDF_STATUS_E_FAILURE) {
 				fStatus = false;
 				hdd_err("set SU_BEAMFORMER_CAP to CFG failed");
 			}
 			if (sme_cfg_set_int(pHddCtx->hHal,
 					WNI_CFG_VHT_NUM_SOUNDING_DIMENSIONS,
 					NUM_OF_SOUNDING_DIMENSIONS) ==
-				CDF_STATUS_E_FAILURE) {
+				QDF_STATUS_E_FAILURE) {
 				fStatus = false;
 				hdd_err("failed to set NUM_OF_SOUNDING_DIM");
 			}
@@ -6117,7 +6117,7 @@
 	}
 
 	if (sme_cfg_set_int(pHddCtx->hHal, WNI_CFG_HT_RX_STBC,
-			    pConfig->enableRxSTBC) == CDF_STATUS_E_FAILURE) {
+			    pConfig->enableRxSTBC) == QDF_STATUS_E_FAILURE) {
 		fStatus = false;
 		hddLog(LOGE, "Could not pass on WNI_CFG_HT_RX_STBC to CFG");
 	}
@@ -6129,25 +6129,25 @@
 	phtCapInfo->advCodingCap = pConfig->enableRxLDPC;
 	val = val16;
 	if (sme_cfg_set_int(pHddCtx->hHal, WNI_CFG_HT_CAP_INFO, val)
-			== CDF_STATUS_E_FAILURE) {
+			== QDF_STATUS_E_FAILURE) {
 		fStatus = false;
 		hddLog(LOGE, "Could not pass on WNI_CFG_HT_CAP_INFO to CFG");
 	}
 
 	if (sme_cfg_set_int(pHddCtx->hHal, WNI_CFG_VHT_RXSTBC,
-			    pConfig->enableRxSTBC) == CDF_STATUS_E_FAILURE) {
+			    pConfig->enableRxSTBC) == QDF_STATUS_E_FAILURE) {
 		fStatus = false;
 		hddLog(LOGE, "Could not pass on WNI_CFG_VHT_RXSTBC to CFG");
 	}
 
 	if (sme_cfg_set_int(pHddCtx->hHal, WNI_CFG_VHT_TXSTBC,
-			    pConfig->enableTxSTBC) == CDF_STATUS_E_FAILURE) {
+			    pConfig->enableTxSTBC) == QDF_STATUS_E_FAILURE) {
 		fStatus = false;
 		hddLog(LOGE, "Could not pass on WNI_CFG_VHT_TXSTBC to CFG");
 	}
 
 	if (sme_cfg_set_int(pHddCtx->hHal, WNI_CFG_VHT_LDPC_CODING_CAP,
-			    pConfig->enableRxLDPC) == CDF_STATUS_E_FAILURE) {
+			    pConfig->enableRxLDPC) == QDF_STATUS_E_FAILURE) {
 		fStatus = false;
 		hddLog(LOGE,
 		       "Could not pass on WNI_CFG_VHT_LDPC_CODING_CAP to CFG");
@@ -6162,7 +6162,7 @@
 
 	}
 	if (sme_cfg_set_int(pHddCtx->hHal, WNI_CFG_ASSOC_STA_LIMIT, val) ==
-			CDF_STATUS_E_FAILURE) {
+			QDF_STATUS_E_FAILURE) {
 		fStatus = false;
 		hddLog(LOGE,
 		       "Could not pass on WNI_CFG_ASSOC_STA_LIMIT to CFG");
@@ -6170,7 +6170,7 @@
 #endif
 	if (sme_cfg_set_int(pHddCtx->hHal, WNI_CFG_ENABLE_LPWR_IMG_TRANSITION,
 			    pConfig->enableLpwrImgTransition)
-			== CDF_STATUS_E_FAILURE) {
+			== QDF_STATUS_E_FAILURE) {
 		fStatus = false;
 		hddLog(LOGE,
 		       "Could not pass on WNI_CFG_ENABLE_LPWR_IMG_TRANSITION to CFG");
@@ -6179,14 +6179,14 @@
 	if (sme_cfg_set_int
 		    (pHddCtx->hHal, WNI_CFG_ENABLE_MCC_ADAPTIVE_SCHED,
 		    pConfig->enableMCCAdaptiveScheduler) ==
-		    CDF_STATUS_E_FAILURE) {
+		    QDF_STATUS_E_FAILURE) {
 		fStatus = false;
 		hddLog(LOGE,
 		       "Could not pass on WNI_CFG_ENABLE_MCC_ADAPTIVE_SCHED to CFG");
 	}
 	if (sme_cfg_set_int
 		    (pHddCtx->hHal, WNI_CFG_DISABLE_LDPC_WITH_TXBF_AP,
-		    pConfig->disableLDPCWithTxbfAP) == CDF_STATUS_E_FAILURE) {
+		    pConfig->disableLDPCWithTxbfAP) == QDF_STATUS_E_FAILURE) {
 		fStatus = false;
 		hddLog(LOGE,
 		       "Could not pass on WNI_CFG_DISABLE_LDPC_WITH_TXBF_AP to CFG");
@@ -6194,7 +6194,7 @@
 
 	if (sme_cfg_set_int
 		    (pHddCtx->hHal, WNI_CFG_DYNAMIC_THRESHOLD_ZERO,
-		    pConfig->retryLimitZero) == CDF_STATUS_E_FAILURE) {
+		    pConfig->retryLimitZero) == QDF_STATUS_E_FAILURE) {
 		fStatus = false;
 		hddLog(LOGE,
 		       "Could not pass on WNI_CFG_DYNAMIC_THRESHOLD_ZERO to CFG");
@@ -6202,7 +6202,7 @@
 
 	if (sme_cfg_set_int
 		    (pHddCtx->hHal, WNI_CFG_DYNAMIC_THRESHOLD_ONE,
-		    pConfig->retryLimitOne) == CDF_STATUS_E_FAILURE) {
+		    pConfig->retryLimitOne) == QDF_STATUS_E_FAILURE) {
 		fStatus = false;
 		hddLog(LOGE,
 		       "Could not pass on WNI_CFG_DYNAMIC_THRESHOLD_ONE to CFG");
@@ -6210,7 +6210,7 @@
 
 	if (sme_cfg_set_int
 		    (pHddCtx->hHal, WNI_CFG_DYNAMIC_THRESHOLD_TWO,
-		    pConfig->retryLimitTwo) == CDF_STATUS_E_FAILURE) {
+		    pConfig->retryLimitTwo) == QDF_STATUS_E_FAILURE) {
 		fStatus = false;
 		hddLog(LOGE,
 		       "Could not pass on WNI_CFG_DYNAMIC_THRESHOLD_TWO to CFG");
@@ -6218,7 +6218,7 @@
 
 	if (sme_cfg_set_int
 		    (pHddCtx->hHal, WNI_CFG_MAX_MEDIUM_TIME,
-		     pConfig->cfgMaxMediumTime) == CDF_STATUS_E_FAILURE) {
+		     pConfig->cfgMaxMediumTime) == QDF_STATUS_E_FAILURE) {
 		fStatus = false;
 		hddLog(LOGE,
 		       "Could not pass on WNI_CFG_MAX_MEDIUM_TIME to CFG");
@@ -6226,28 +6226,28 @@
 #ifdef FEATURE_WLAN_TDLS
 
 	if (sme_cfg_set_int(pHddCtx->hHal, WNI_CFG_TDLS_QOS_WMM_UAPSD_MASK,
-			    pConfig->fTDLSUapsdMask) == CDF_STATUS_E_FAILURE) {
+			    pConfig->fTDLSUapsdMask) == QDF_STATUS_E_FAILURE) {
 		fStatus = false;
 		hddLog(LOGE,
 		       "Could not pass on WNI_CFG_TDLS_QOS_WMM_UAPSD_MASK to CFG");
 	}
 	if (sme_cfg_set_int(pHddCtx->hHal, WNI_CFG_TDLS_BUF_STA_ENABLED,
 			    pConfig->fEnableTDLSBufferSta) ==
-			CDF_STATUS_E_FAILURE) {
+			QDF_STATUS_E_FAILURE) {
 		fStatus = false;
 		hddLog(LOGE,
 		       "Could not pass on WNI_CFG_TDLS_BUF_STA_ENABLED to CFG");
 	}
 	if (sme_cfg_set_int(pHddCtx->hHal, WNI_CFG_TDLS_PUAPSD_INACT_TIME,
 			    pConfig->fTDLSPuapsdInactivityTimer) ==
-			CDF_STATUS_E_FAILURE) {
+			QDF_STATUS_E_FAILURE) {
 		fStatus = false;
 		hddLog(LOGE,
 		       "Could not pass on WNI_CFG_TDLS_PUAPSD_INACT_TIME to CFG");
 	}
 	if (sme_cfg_set_int(pHddCtx->hHal, WNI_CFG_TDLS_RX_FRAME_THRESHOLD,
 			    pConfig->fTDLSRxFrameThreshold) ==
-			CDF_STATUS_E_FAILURE) {
+			QDF_STATUS_E_FAILURE) {
 		fStatus = false;
 		hddLog(LOGE,
 		       "Could not pass on WNI_CFG_TDLS_RX_FRAME_THRESHOLD to CFG");
@@ -6255,14 +6255,14 @@
 
 	if (sme_cfg_set_int(pHddCtx->hHal, WNI_CFG_TDLS_OFF_CHANNEL_ENABLED,
 			    pConfig->fEnableTDLSOffChannel) ==
-			CDF_STATUS_E_FAILURE) {
+			QDF_STATUS_E_FAILURE) {
 		fStatus = false;
 		hddLog(LOGE,
 		       "Could not pass on WNI_CFG_TDLS_BUF_STA_ENABLED to CFG");
 	}
 	if (sme_cfg_set_int(pHddCtx->hHal, WNI_CFG_TDLS_WMM_MODE_ENABLED,
 			    pConfig->fEnableTDLSWmmMode) ==
-			CDF_STATUS_E_FAILURE) {
+			QDF_STATUS_E_FAILURE) {
 		fStatus = false;
 		hddLog(LOGE,
 		       "Could not pass on WNI_CFG_TDLS_WMM_MODE_ENABLED to CFG");
@@ -6271,7 +6271,7 @@
 
 	if (sme_cfg_set_int(pHddCtx->hHal, WNI_CFG_ENABLE_ADAPT_RX_DRAIN,
 			    pConfig->fEnableAdaptRxDrain) ==
-			CDF_STATUS_E_FAILURE) {
+			QDF_STATUS_E_FAILURE) {
 		fStatus = false;
 		hddLog(LOGE,
 		       "Could not pass on WNI_CFG_ENABLE_ADAPT_RX_DRAIN to CFG");
@@ -6279,7 +6279,7 @@
 
 	if (sme_cfg_set_int(pHddCtx->hHal, WNI_CFG_FLEX_CONNECT_POWER_FACTOR,
 			    pConfig->flexConnectPowerFactor) ==
-			CDF_STATUS_E_FAILURE) {
+			QDF_STATUS_E_FAILURE) {
 		fStatus = false;
 		hddLog(LOGE, "Failure: Could not pass on "
 		       "WNI_CFG_FLEX_CONNECT_POWER_FACTOR to CFG");
@@ -6287,7 +6287,7 @@
 
 	if (sme_cfg_set_int(pHddCtx->hHal, WNI_CFG_ANTENNA_DIVESITY,
 			    pConfig->antennaDiversity) ==
-			CDF_STATUS_E_FAILURE) {
+			QDF_STATUS_E_FAILURE) {
 		fStatus = false;
 		hddLog(LOGE,
 		       "Could not pass on WNI_CFG_ANTENNA_DIVESITY to CFG");
@@ -6296,7 +6296,7 @@
 	if (sme_cfg_set_int(pHddCtx->hHal,
 			    WNI_CFG_DEFAULT_RATE_INDEX_24GHZ,
 			    pConfig->defaultRateIndex24Ghz) ==
-			CDF_STATUS_E_FAILURE) {
+			QDF_STATUS_E_FAILURE) {
 		fStatus = false;
 		hddLog(LOGE,
 		       "Could not pass on WNI_CFG_DEFAULT_RATE_INDEX_24GHZ to CFG");
@@ -6305,7 +6305,7 @@
 	if (sme_cfg_set_int(pHddCtx->hHal,
 			    WNI_CFG_DEBUG_P2P_REMAIN_ON_CHANNEL,
 			    pConfig->debugP2pRemainOnChannel) ==
-			CDF_STATUS_E_FAILURE) {
+			QDF_STATUS_E_FAILURE) {
 		fStatus = false;
 		hddLog(LOGE,
 		       "Could not pass on WNI_CFG_DEBUG_P2P_REMAIN_ON_CHANNEL to CFG");
@@ -6313,7 +6313,7 @@
 #ifdef WLAN_FEATURE_11W
 	if (sme_cfg_set_int(pHddCtx->hHal, WNI_CFG_PMF_SA_QUERY_MAX_RETRIES,
 			    pConfig->pmfSaQueryMaxRetries) ==
-			CDF_STATUS_E_FAILURE) {
+			QDF_STATUS_E_FAILURE) {
 		fStatus = false;
 		hddLog(LOGE,
 		       "Could not pass on WNI_CFG_SA_QUERY_MAX_RETRIES to CFG");
@@ -6321,7 +6321,7 @@
 
 	if (sme_cfg_set_int(pHddCtx->hHal, WNI_CFG_PMF_SA_QUERY_RETRY_INTERVAL,
 			    pConfig->pmfSaQueryRetryInterval) ==
-			CDF_STATUS_E_FAILURE) {
+			QDF_STATUS_E_FAILURE) {
 		fStatus = false;
 		hddLog(LOGE,
 		       "Could not pass on WNI_CFG_SA_QUERY_RETRY_INTERVAL to CFG");
@@ -6330,7 +6330,7 @@
 
 	if (sme_cfg_set_int(pHddCtx->hHal, WNI_CFG_IBSS_ATIM_WIN_SIZE,
 			    pConfig->ibssATIMWinSize) ==
-			CDF_STATUS_E_FAILURE) {
+			QDF_STATUS_E_FAILURE) {
 		fStatus = false;
 		hddLog(LOGE,
 		       "Could not pass on WNI_CFG_IBSS_ATIM_WIN_SIZE to CFG");
@@ -6368,12 +6368,12 @@
  *
  * @pHddCtx: the pointer to hdd context
  *
- * Return: CDF_STATUS_SUCCESS if configuration is correctly applied,
- *		otherwise the appropriate CDF_STATUS would be returned
+ * Return: QDF_STATUS_SUCCESS if configuration is correctly applied,
+ *		otherwise the appropriate QDF_STATUS would be returned
  */
-CDF_STATUS hdd_set_sme_config(hdd_context_t *pHddCtx)
+QDF_STATUS hdd_set_sme_config(hdd_context_t *pHddCtx)
 {
-	CDF_STATUS status = CDF_STATUS_SUCCESS;
+	QDF_STATUS status = QDF_STATUS_SUCCESS;
 	tSmeConfigParams *smeConfig;
 	uint8_t rrm_capab_len;
 
@@ -6383,7 +6383,7 @@
 	if (NULL == smeConfig) {
 		CDF_TRACE(CDF_MODULE_ID_HDD, CDF_TRACE_LEVEL_ERROR,
 			  "%s: unable to allocate smeConfig", __func__);
-		return CDF_STATUS_E_NOMEM;
+		return QDF_STATUS_E_NOMEM;
 	}
 	cdf_mem_zero(smeConfig, sizeof(*smeConfig));
 
@@ -6672,7 +6672,7 @@
 	smeConfig->csrConfig.first_scan_bucket_threshold =
 		pHddCtx->config->first_scan_bucket_threshold;
 	status = sme_update_config(pHddCtx->hHal, smeConfig);
-	if (!CDF_IS_STATUS_SUCCESS(status)) {
+	if (!QDF_IS_STATUS_SUCCESS(status)) {
 		hddLog(LOGE, "sme_update_config() return failure %d",
 		       status);
 	}
@@ -6686,9 +6686,9 @@
  * @pHddCtx: the pointer to hdd context
  * @command: the command to run
  *
- * Return: the CDF_STATUS return from hdd_execute_config_command
+ * Return: the QDF_STATUS return from hdd_execute_config_command
  */
-CDF_STATUS hdd_execute_global_config_command(hdd_context_t *pHddCtx,
+QDF_STATUS hdd_execute_global_config_command(hdd_context_t *pHddCtx,
 					     char *command)
 {
 	return hdd_execute_config_command(g_registry_table,
@@ -6703,10 +6703,10 @@
  * @pBuf: buffer to store the configuration
  * @buflen: size of the buffer
  *
- * Return: CDF_STATUS_SUCCESS if the configuration and buffer size can carry
- *		the content, otherwise CDF_STATUS_E_RESOURCES
+ * Return: QDF_STATUS_SUCCESS if the configuration and buffer size can carry
+ *		the content, otherwise QDF_STATUS_E_RESOURCES
  */
-CDF_STATUS hdd_cfg_get_global_config(hdd_context_t *pHddCtx, char *pBuf,
+QDF_STATUS hdd_cfg_get_global_config(hdd_context_t *pHddCtx, char *pBuf,
 				     int buflen)
 {
 	return hdd_cfg_get_config(g_registry_table,
@@ -6744,10 +6744,10 @@
  * This function is used to modify the number of spatial streams
  * supported when not in connected state.
  *
- * Return: CDF_STATUS_SUCCESS if nss is correctly updated,
- *              otherwise CDF_STATUS_E_FAILURE would be returned
+ * Return: QDF_STATUS_SUCCESS if nss is correctly updated,
+ *              otherwise QDF_STATUS_E_FAILURE would be returned
  */
-CDF_STATUS hdd_update_nss(hdd_context_t *hdd_ctx, uint8_t nss)
+QDF_STATUS hdd_update_nss(hdd_context_t *hdd_ctx, uint8_t nss)
 {
 	struct hdd_config *hdd_config = hdd_ctx->config;
 	uint32_t temp = 0;
@@ -6762,19 +6762,19 @@
 
 	if ((nss == 2) && (hdd_ctx->num_rf_chains != 2)) {
 		hddLog(LOGE, "No support for 2 spatial streams");
-		return CDF_STATUS_E_INVAL;
+		return QDF_STATUS_E_INVAL;
 	}
 
 	enable2x2 = (nss == 1) ? 0 : 1;
 
 	if (hdd_config->enable2x2 == enable2x2) {
 		hddLog(LOGE, "NSS same as requested");
-		return CDF_STATUS_SUCCESS;
+		return QDF_STATUS_SUCCESS;
 	}
 
 	if (true == sme_is_any_session_in_connected_state(hdd_ctx->hHal)) {
 		hddLog(LOGE, "Connected sessions present, Do not change NSS");
-		return CDF_STATUS_E_INVAL;
+		return QDF_STATUS_E_INVAL;
 	}
 
 	hdd_config->enable2x2 = enable2x2;
@@ -6792,7 +6792,7 @@
 	/* Update Rx Highest Long GI data Rate */
 	if (sme_cfg_set_int(hdd_ctx->hHal,
 			    WNI_CFG_VHT_RX_HIGHEST_SUPPORTED_DATA_RATE,
-			    rx_supp_data_rate) == CDF_STATUS_E_FAILURE) {
+			    rx_supp_data_rate) == QDF_STATUS_E_FAILURE) {
 		status = false;
 		hddLog(LOGE,
 			"Could not pass on WNI_CFG_VHT_RX_HIGHEST_SUPPORTED_DATA_RATE to CFG");
@@ -6801,7 +6801,7 @@
 	/* Update Tx Highest Long GI data Rate */
 	if (sme_cfg_set_int(hdd_ctx->hHal,
 			    WNI_CFG_VHT_TX_HIGHEST_SUPPORTED_DATA_RATE,
-			    tx_supp_data_rate) == CDF_STATUS_E_FAILURE) {
+			    tx_supp_data_rate) == QDF_STATUS_E_FAILURE) {
 		status = false;
 		hddLog(LOGE,
 			"Could not pass on WNI_CFG_VHT_TX_HIGHEST_SUPPORTED_DATA_RATE to CFG");
@@ -6816,7 +6816,7 @@
 		ht_cap_info->txSTBC = hdd_config->enableTxSTBC;
 	temp = val16;
 	if (sme_cfg_set_int(hdd_ctx->hHal, WNI_CFG_HT_CAP_INFO,
-			    temp) == CDF_STATUS_E_FAILURE) {
+			    temp) == QDF_STATUS_E_FAILURE) {
 		status = false;
 		hddLog(LOGE, "Could not pass on WNI_CFG_HT_CAP_INFO to CFG");
 	}
@@ -6829,7 +6829,7 @@
 		temp |= 0x000C;
 
 	if (sme_cfg_set_int(hdd_ctx->hHal, WNI_CFG_VHT_BASIC_MCS_SET,
-			    temp) == CDF_STATUS_E_FAILURE) {
+			    temp) == QDF_STATUS_E_FAILURE) {
 		status = false;
 		hddLog(LOGE,
 			"Could not pass on WNI_CFG_VHT_BASIC_MCS_SET to CFG");
@@ -6843,7 +6843,7 @@
 		temp |= 0x000C;
 
 	if (sme_cfg_set_int(hdd_ctx->hHal, WNI_CFG_VHT_RX_MCS_MAP,
-			    temp) == CDF_STATUS_E_FAILURE) {
+			    temp) == QDF_STATUS_E_FAILURE) {
 		status = false;
 		hddLog(LOGE, "Could not pass on WNI_CFG_VHT_RX_MCS_MAP to CFG");
 	}
@@ -6856,7 +6856,7 @@
 		temp |= 0x000C;
 
 	if (sme_cfg_set_int(hdd_ctx->hHal, WNI_CFG_VHT_TX_MCS_MAP,
-			    temp) == CDF_STATUS_E_FAILURE) {
+			    temp) == QDF_STATUS_E_FAILURE) {
 		status = false;
 		hddLog(LOGE, "Could not pass on WNI_CFG_VHT_TX_MCS_MAP to CFG");
 	}
@@ -6874,14 +6874,14 @@
 	if (sme_cfg_set_str(hdd_ctx->hHal, WNI_CFG_SUPPORTED_MCS_SET,
 			    mcs_set,
 			    SIZE_OF_SUPPORTED_MCS_SET) ==
-				CDF_STATUS_E_FAILURE) {
+				QDF_STATUS_E_FAILURE) {
 		status = false;
 		hddLog(LOGE, "Could not pass on MCS SET to CFG");
 	}
 #undef WLAN_HDD_RX_MCS_ALL_NSTREAM_RATES
 
-	if (CDF_STATUS_SUCCESS != sme_update_nss(hdd_ctx->hHal, nss))
+	if (QDF_STATUS_SUCCESS != sme_update_nss(hdd_ctx->hHal, nss))
 		status = false;
 
-	return (status == false) ? CDF_STATUS_E_FAILURE : CDF_STATUS_SUCCESS;
+	return (status == false) ? QDF_STATUS_E_FAILURE : QDF_STATUS_SUCCESS;
 }
diff --git a/core/hdd/src/wlan_hdd_cfg80211.c b/core/hdd/src/wlan_hdd_cfg80211.c
index 018e3b5..ce41c1e 100644
--- a/core/hdd/src/wlan_hdd_cfg80211.c
+++ b/core/hdd/src/wlan_hdd_cfg80211.c
@@ -1529,7 +1529,7 @@
 	status = cds_get_pcl(CDS_SAP_MODE,
 					sap_config->acs_cfg.pcl_channels,
 					&sap_config->acs_cfg.pcl_ch_count);
-	if (CDF_STATUS_SUCCESS != status)
+	if (QDF_STATUS_SUCCESS != status)
 		hddLog(LOGE, FL("Get PCL failed"));
 
 	wlan_hdd_set_acs_ch_range(sap_config, ht_enabled, vht_enabled);
@@ -1938,7 +1938,7 @@
 	tpSirScanMacOui pReqMsg = NULL;
 	hdd_context_t *pHddCtx = wiphy_priv(wiphy);
 	struct nlattr *tb[QCA_WLAN_VENDOR_ATTR_SET_SCANNING_MAC_OUI_MAX + 1];
-	CDF_STATUS status;
+	QDF_STATUS status;
 	int ret;
 
 	ENTER();
@@ -1977,7 +1977,7 @@
 	hddLog(LOG1, FL("Oui (%02x:%02x:%02x)"), pReqMsg->oui[0],
 	       pReqMsg->oui[1], pReqMsg->oui[2]);
 	status = sme_set_scanning_mac_oui(pHddCtx->hHal, pReqMsg);
-	if (!CDF_IS_STATUS_SUCCESS(status)) {
+	if (!QDF_IS_STATUS_SUCCESS(status)) {
 		hddLog(CDF_TRACE_LEVEL_ERROR,
 		       FL("sme_set_scanning_mac_oui failed(err=%d)"), status);
 		goto fail;
@@ -2058,7 +2058,7 @@
 	struct sk_buff *skb = NULL;
 	uint32_t dbs_capability = 0;
 	bool one_by_one_dbs, two_by_two_dbs;
-	CDF_STATUS ret = CDF_STATUS_E_FAILURE;
+	QDF_STATUS ret = QDF_STATUS_E_FAILURE;
 	int ret_val;
 
 	uint8_t feature_flags[(NUM_QCA_WLAN_VENDOR_FEATURES + 7) / 8] = {0};
@@ -2097,7 +2097,7 @@
 		goto nla_put_failure;
 
 	ret = wma_get_dbs_hw_modes(&one_by_one_dbs, &two_by_two_dbs);
-	if (CDF_STATUS_SUCCESS == ret) {
+	if (QDF_STATUS_SUCCESS == ret) {
 		if (one_by_one_dbs)
 			dbs_capability = DRV_DBS_CAPABILITY_1X1;
 
@@ -2483,13 +2483,13 @@
 	hdd_adapter_list_node_t *adapter_node = NULL, *next = NULL;
 	hdd_ap_ctx_t *ap_ctx;
 	hdd_station_ctx_t *sta_ctx;
-	CDF_STATUS cdf_status;
+	QDF_STATUS qdf_status;
 
-	cdf_status = hdd_get_front_adapter(hdd_ctx,
+	qdf_status = hdd_get_front_adapter(hdd_ctx,
 					   &adapter_node);
 
 	while ((NULL != adapter_node) &&
-	       (CDF_STATUS_SUCCESS == cdf_status)) {
+	       (QDF_STATUS_SUCCESS == qdf_status)) {
 		adapter = adapter_node->pAdapter;
 
 		if ((device_mode == adapter->device_mode) &&
@@ -2532,7 +2532,7 @@
 			}
 		}
 
-		cdf_status = hdd_get_next_adapter(hdd_ctx,
+		qdf_status = hdd_get_next_adapter(hdd_ctx,
 						  adapter_node,
 						  &next);
 		adapter_node = next;
@@ -2559,7 +2559,7 @@
 				   uint32_t no_dfs_flag)
 {
 	tHalHandle h_hal = WLAN_HDD_GET_HAL_CTX(adapter);
-	CDF_STATUS status;
+	QDF_STATUS status;
 	int ret_val = -EPERM;
 
 	if (no_dfs_flag == hdd_ctx->config->enableDFSChnlScan) {
@@ -2588,7 +2588,7 @@
 		status = sme_handle_dfs_chan_scan(
 			h_hal, hdd_ctx->config->enableDFSChnlScan);
 
-		if (CDF_STATUS_SUCCESS == status) {
+		if (QDF_STATUS_SUCCESS == status) {
 			ret_val = 0;
 
 			/*
@@ -2598,7 +2598,7 @@
 			 * all sessions
 			 */
 			status = sme_scan_flush_result(h_hal);
-			if (CDF_STATUS_SUCCESS != status)
+			if (QDF_STATUS_SUCCESS != status)
 				ret_val = -EPERM;
 		}
 
@@ -3135,7 +3135,7 @@
 	u32 modulated_dtim;
 	u16 stats_avg_factor;
 	u32 guard_time;
-	CDF_STATUS status;
+	QDF_STATUS status;
 
 	if (CDF_GLOBAL_FTM_MODE == hdd_get_conparam()) {
 		hdd_err("Command not allowed in FTM mode");
@@ -3163,7 +3163,7 @@
 						      adapter->sessionId,
 						      modulated_dtim);
 
-		if (CDF_STATUS_SUCCESS != status)
+		if (QDF_STATUS_SUCCESS != status)
 			ret_val = -EPERM;
 	}
 
@@ -3174,7 +3174,7 @@
 							adapter->sessionId,
 							stats_avg_factor);
 
-		if (CDF_STATUS_SUCCESS != status)
+		if (QDF_STATUS_SUCCESS != status)
 			ret_val = -EPERM;
 	}
 
@@ -3186,7 +3186,7 @@
 						  adapter->sessionId,
 						  guard_time);
 
-		if (CDF_STATUS_SUCCESS != status)
+		if (QDF_STATUS_SUCCESS != status)
 			ret_val = -EPERM;
 	}
 
@@ -3251,7 +3251,7 @@
 		const void *data,
 		int data_len)
 {
-	CDF_STATUS status;
+	QDF_STATUS status;
 	hdd_context_t *hdd_ctx = wiphy_priv(wiphy);
 	struct nlattr *tb[QCA_WLAN_VENDOR_ATTR_WIFI_LOGGER_START_MAX + 1];
 	struct sir_wifi_start_log start_log;
@@ -3313,7 +3313,7 @@
 	}
 
 	status = sme_wifi_start_logger(hdd_ctx->hHal, start_log);
-	if (!CDF_IS_STATUS_SUCCESS(status)) {
+	if (!QDF_IS_STATUS_SUCCESS(status)) {
 		hddLog(LOGE, FL("sme_wifi_start_logger failed(err=%d)"),
 				status);
 		return -EINVAL;
@@ -3374,7 +3374,7 @@
 		const void *data,
 		int data_len)
 {
-	CDF_STATUS status;
+	QDF_STATUS status;
 	uint32_t ring_id;
 	hdd_context_t *hdd_ctx = wiphy_priv(wiphy);
 	struct nlattr *tb
@@ -3417,7 +3417,7 @@
 	status = cds_flush_logs(WLAN_LOG_TYPE_NON_FATAL,
 			WLAN_LOG_INDICATOR_FRAMEWORK,
 			WLAN_LOG_REASON_CODE_UNUSED);
-	if (CDF_STATUS_SUCCESS != status) {
+	if (QDF_STATUS_SUCCESS != status) {
 		hddLog(LOGE, FL("Failed to trigger bug report"));
 		return -EINVAL;
 	}
@@ -3553,7 +3553,7 @@
 			struct nlattr **tb)
 {
 	struct sSirAddPeriodicTxPtrn *add_req;
-	CDF_STATUS status;
+	QDF_STATUS status;
 	uint32_t request_id, ret, len;
 	uint8_t pattern_id = 0;
 	struct cdf_mac_addr dst_addr;
@@ -3661,7 +3661,7 @@
 	hddLog(LOG1, FL("pattern id: %d"), add_req->ucPtrnId);
 
 	status = sme_add_periodic_tx_ptrn(hdd_ctx->hHal, add_req);
-	if (!CDF_IS_STATUS_SUCCESS(status)) {
+	if (!QDF_IS_STATUS_SUCCESS(status)) {
 		hddLog(LOGE,
 			FL("sme_add_periodic_tx_ptrn failed (err=%d)"), status);
 		goto fail;
@@ -3691,7 +3691,7 @@
 			struct nlattr **tb)
 {
 	struct sSirDelPeriodicTxPtrn *del_req;
-	CDF_STATUS status;
+	QDF_STATUS status;
 	uint32_t request_id, ret;
 	uint8_t pattern_id = 0;
 
@@ -3725,7 +3725,7 @@
 			 request_id, del_req->ucPtrnId);
 
 	status = sme_del_periodic_tx_ptrn(hdd_ctx->hHal, del_req);
-	if (!CDF_IS_STATUS_SUCCESS(status)) {
+	if (!QDF_IS_STATUS_SUCCESS(status)) {
 		hddLog(LOGE,
 			FL("sme_del_periodic_tx_ptrn failed (err=%d)"), status);
 		goto fail;
@@ -3878,7 +3878,7 @@
 	hdd_context_t *hdd_ctx = wiphy_priv(wiphy);
 	struct nlattr *tb[PARAM_MAX + 1];
 	struct rssi_monitor_req req;
-	CDF_STATUS status;
+	QDF_STATUS status;
 	int ret;
 	uint32_t control;
 	static const struct nla_policy policy[PARAM_MAX + 1] = {
@@ -3951,7 +3951,7 @@
 			req.request_id, req.session_id, req.control);
 
 	status = sme_set_rssi_monitoring(hdd_ctx->hHal, &req);
-	if (!CDF_IS_STATUS_SUCCESS(status)) {
+	if (!QDF_IS_STATUS_SUCCESS(status)) {
 		hddLog(LOGE,
 			FL("sme_set_rssi_monitoring failed(err=%d)"), status);
 		return -EINVAL;
@@ -4069,7 +4069,7 @@
 {
 	hdd_context_t *hdd_ctx = wiphy_priv(wiphy);
 	int i, ret = 0;
-	CDF_STATUS status;
+	QDF_STATUS status;
 	uint8_t pcl[MAX_NUM_CHAN];
 	uint32_t pcl_len = 0;
 	uint32_t freq_list[MAX_NUM_CHAN];
@@ -4103,7 +4103,7 @@
 	hdd_debug("Userspace requested pref freq list");
 
 	status = cds_get_pcl(intf_mode, pcl, &pcl_len);
-	if (status != CDF_STATUS_SUCCESS) {
+	if (status != QDF_STATUS_SUCCESS) {
 		hdd_err("Get pcl failed");
 		return -EINVAL;
 	}
@@ -4234,19 +4234,19 @@
 
 	if (hdd_ctx->config->policy_manager_enabled) {
 		ret = cdf_reset_connection_update();
-		if (!CDF_IS_STATUS_SUCCESS(ret))
+		if (!QDF_IS_STATUS_SUCCESS(ret))
 			hdd_err("clearing event failed");
 
 		ret = cds_current_connections_update(adapter->sessionId,
 					channel_hint,
 					CDS_UPDATE_REASON_SET_OPER_CHAN);
-		if (CDF_STATUS_E_FAILURE == ret) {
+		if (QDF_STATUS_E_FAILURE == ret) {
 			/* return in the failure case */
 			hdd_err("ERROR: connections update failed!!");
 			return -EINVAL;
 		}
 
-		if (CDF_STATUS_SUCCESS == ret) {
+		if (QDF_STATUS_SUCCESS == ret) {
 			/*
 			 * Success is the only case for which we expect hw mode
 			 * change to take place, hence we need to wait.
@@ -4254,7 +4254,7 @@
 			 * through
 			 */
 			ret = cdf_wait_for_connection_update();
-			if (!CDF_IS_STATUS_SUCCESS(ret)) {
+			if (!QDF_IS_STATUS_SUCCESS(ret)) {
 				hdd_err("ERROR: cdf wait for event failed!!");
 				return -EINVAL;
 			}
@@ -4507,7 +4507,7 @@
 	hdd_context_t *hdd_ctx  = wiphy_priv(wiphy);
 	struct nlattr *tb[QCA_WLAN_VENDOR_ATTR_OTA_TEST_MAX + 1];
 	uint8_t ota_enable = 0;
-	CDF_STATUS status;
+	QDF_STATUS status;
 	uint32_t current_roam_state;
 
 	if (CDF_GLOBAL_FTM_MODE == hdd_get_conparam()) {
@@ -4543,14 +4543,14 @@
 			sme_get_current_roam_state(hal, adapter->sessionId);
 	status = sme_stop_roaming(hal, adapter->sessionId,
 					eCsrHddIssued);
-	if (status != CDF_STATUS_SUCCESS) {
+	if (status != QDF_STATUS_SUCCESS) {
 		hdd_err("Enable/Disable roaming failed");
 		return -EINVAL;
 	}
 
 	status = sme_ps_enable_disable(hal, adapter->sessionId,
 					SME_PS_DISABLE);
-	if (status != CDF_STATUS_SUCCESS) {
+	if (status != QDF_STATUS_SUCCESS) {
 		hdd_err("Enable/Disable power save failed");
 		/* restore previous roaming setting */
 		if (current_roam_state == eCSR_ROAMING_STATE_JOINING ||
@@ -4562,7 +4562,7 @@
 			status = sme_stop_roaming(hal, adapter->sessionId,
 						eCsrHddIssued);
 
-		if (status != CDF_STATUS_SUCCESS)
+		if (status != QDF_STATUS_SUCCESS)
 			hdd_err("Restoring roaming state failed");
 
 		return -EINVAL;
@@ -5743,7 +5743,7 @@
  * This function validates whether given channel is part of valid
  * channel list.
  */
-CDF_STATUS wlan_hdd_validate_operation_channel(hdd_adapter_t *pAdapter,
+QDF_STATUS wlan_hdd_validate_operation_channel(hdd_adapter_t *pAdapter,
 					       int channel)
 {
 
@@ -5767,7 +5767,7 @@
 		if (fValidChannel != true) {
 			hddLog(CDF_TRACE_LEVEL_ERROR,
 			       "%s: Invalid Channel [%d]", __func__, channel);
-			return CDF_STATUS_E_FAILURE;
+			return QDF_STATUS_E_FAILURE;
 		}
 	} else {
 		if (0 != sme_cfg_get_str(hHal, WNI_CFG_VALID_CHANNEL_LIST,
@@ -5775,7 +5775,7 @@
 			hddLog(CDF_TRACE_LEVEL_ERROR,
 			       "%s: failed to get valid channel list",
 			       __func__);
-			return CDF_STATUS_E_FAILURE;
+			return QDF_STATUS_E_FAILURE;
 		}
 		for (indx = 0; indx < num_ch; indx++) {
 			if (channel == valid_ch[indx]) {
@@ -5786,10 +5786,10 @@
 		if (indx >= num_ch) {
 			hddLog(CDF_TRACE_LEVEL_ERROR,
 			       "%s: Invalid Channel [%d]", __func__, channel);
-			return CDF_STATUS_E_FAILURE;
+			return QDF_STATUS_E_FAILURE;
 		}
 	}
-	return CDF_STATUS_SUCCESS;
+	return QDF_STATUS_SUCCESS;
 
 }
 
@@ -5836,7 +5836,7 @@
 		temp = srv_ip[num];
 		pDhcpSrvInfo->dhcpSrvIP |= (temp << (8 * num));
 	}
-	if (CDF_STATUS_SUCCESS !=
+	if (QDF_STATUS_SUCCESS !=
 	    sme_set_dhcp_srv_offload(pHddCtx->hHal, pDhcpSrvInfo)) {
 		hddLog(CDF_TRACE_LEVEL_ERROR,
 		       "%s: sme_setDHCPSrvOffload fail!", __func__);
@@ -5857,7 +5857,7 @@
 	hdd_adapter_t *pAdapter = WLAN_HDD_GET_PRIV_PTR(dev);
 	hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
 	int ret = 0;
-	CDF_STATUS cdf_ret_status;
+	QDF_STATUS cdf_ret_status;
 
 	ENTER();
 
@@ -5894,7 +5894,7 @@
 							      pAdapter->sessionCtx.
 							      ap.
 							      apDisableIntraBssFwd);
-		if (!CDF_IS_STATUS_SUCCESS(cdf_ret_status)) {
+		if (!QDF_IS_STATUS_SUCCESS(cdf_ret_status)) {
 			ret = -EINVAL;
 		}
 	}
@@ -5929,7 +5929,7 @@
 	hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
 	hdd_wext_state_t *wext;
 	struct wireless_dev *wdev;
-	CDF_STATUS status;
+	QDF_STATUS status;
 
 	ENTER();
 
@@ -6011,7 +6011,7 @@
 	struct hdd_config *pConfig = NULL;
 	eMib_dot11DesiredBssType connectedBssType;
 	unsigned long rc;
-	CDF_STATUS vstatus;
+	QDF_STATUS vstatus;
 	int status;
 
 	ENTER();
@@ -6063,7 +6063,7 @@
 		case NL80211_IFTYPE_STATION:
 		case NL80211_IFTYPE_P2P_CLIENT:
 			vstatus = wlan_hdd_change_iface_to_sta_mode(ndev, type);
-			if (vstatus != CDF_STATUS_SUCCESS)
+			if (vstatus != QDF_STATUS_SUCCESS)
 				return -EINVAL;
 
 			hdd_register_tx_flow_control(pAdapter,
@@ -6129,7 +6129,7 @@
 			hdd_set_ap_ops(pAdapter->dev);
 
 			vstatus = hdd_init_ap_mode(pAdapter);
-			if (vstatus != CDF_STATUS_SUCCESS) {
+			if (vstatus != QDF_STATUS_SUCCESS) {
 				hddLog(LOGP,
 				       FL
 					       ("Error initializing the ap mode"));
@@ -6163,7 +6163,7 @@
 		case NL80211_IFTYPE_P2P_CLIENT:
 		case NL80211_IFTYPE_ADHOC:
 			status = wlan_hdd_change_iface_to_sta_mode(ndev, type);
-			if (status != CDF_STATUS_SUCCESS)
+			if (status != QDF_STATUS_SUCCESS)
 				return status;
 
 			if ((NL80211_IFTYPE_P2P_CLIENT == type) ||
@@ -6208,7 +6208,7 @@
 		    || (eCSR_BSS_TYPE_START_IBSS == LastBSSType)) {
 			/* Need to issue a disconnect to CSR. */
 			INIT_COMPLETION(pAdapter->disconnect_comp_var);
-			if (CDF_STATUS_SUCCESS ==
+			if (QDF_STATUS_SUCCESS ==
 			    sme_roam_disconnect(WLAN_HDD_GET_HAL_CTX(pAdapter),
 						pAdapter->sessionId,
 						eCSR_DISCONNECT_REASON_UNSPECIFIED)) {
@@ -6297,7 +6297,7 @@
 				   struct station_parameters *params)
 #endif
 {
-	CDF_STATUS status = CDF_STATUS_SUCCESS;
+	QDF_STATUS status = QDF_STATUS_SUCCESS;
 	hdd_adapter_t *pAdapter = WLAN_HDD_GET_PRIV_PTR(dev);
 	hdd_context_t *pHddCtx;
 	hdd_station_ctx_t *pHddStaCtx;
@@ -6337,7 +6337,7 @@
 							    &STAMacAddress,
 							    ol_txrx_peer_state_auth);
 
-			if (status != CDF_STATUS_SUCCESS) {
+			if (status != QDF_STATUS_SUCCESS) {
 				hddLog(CDF_TRACE_LEVEL_INFO,
 				       FL
 					       ("Not able to change TL state to AUTHENTICATED"));
@@ -6514,7 +6514,7 @@
 							     &StaParams,
 							     isBufSta,
 							     isOffChannelSupported);
-			if (CDF_STATUS_SUCCESS != status) {
+			if (QDF_STATUS_SUCCESS != status) {
 				hddLog(CDF_TRACE_LEVEL_ERROR,
 				       FL
 					       ("wlan_hdd_tdls_set_peer_caps failed!"));
@@ -6524,7 +6524,7 @@
 			status =
 				wlan_hdd_tdls_add_station(wiphy, dev, mac, 1,
 							  &StaParams);
-			if (CDF_STATUS_SUCCESS != status) {
+			if (QDF_STATUS_SUCCESS != status) {
 				hddLog(CDF_TRACE_LEVEL_ERROR,
 				       FL("wlan_hdd_tdls_add_station failed!"));
 				return -EINVAL;
@@ -6588,7 +6588,7 @@
 	v_CONTEXT_t p_cds_context = (WLAN_HDD_GET_CTX(pAdapter))->pcds_context;
 #endif
 	hdd_hostapd_state_t *pHostapdState;
-	CDF_STATUS cdf_ret_status;
+	QDF_STATUS cdf_ret_status;
 	hdd_context_t *pHddCtx;
 	hdd_ap_ctx_t *ap_ctx = WLAN_HDD_GET_AP_CTX_PTR(pAdapter);
 
@@ -6771,7 +6771,7 @@
 #else
 			status = wlansap_set_key_sta(p_cds_context, &setKey);
 #endif
-			if (status != CDF_STATUS_SUCCESS) {
+			if (status != QDF_STATUS_SUCCESS) {
 				CDF_TRACE(CDF_MODULE_ID_HDD,
 					  CDF_TRACE_LEVEL_ERROR,
 					  "[%4d] wlansap_set_key_sta returned ERROR status= %d",
@@ -6828,11 +6828,11 @@
 		   request */
 		cdf_ret_status = sme_ft_update_key(WLAN_HDD_GET_HAL_CTX(pAdapter),
 						   pAdapter->sessionId, &setKey);
-		if (cdf_ret_status == CDF_STATUS_FT_PREAUTH_KEY_SUCCESS) {
+		if (cdf_ret_status == QDF_STATUS_FT_PREAUTH_KEY_SUCCESS) {
 			hddLog(CDF_TRACE_LEVEL_INFO_MED,
 			       "%s: Update PreAuth Key success", __func__);
 			return 0;
-		} else if (cdf_ret_status == CDF_STATUS_FT_PREAUTH_KEY_FAILED) {
+		} else if (cdf_ret_status == QDF_STATUS_FT_PREAUTH_KEY_FAILED) {
 			hddLog(CDF_TRACE_LEVEL_ERROR,
 			       "%s: Update PreAuth Key failed", __func__);
 			return -EINVAL;
@@ -7486,7 +7486,7 @@
 {
 	tHalHandle hHal = WLAN_HDD_GET_HAL_CTX(pAdapter);
 	tCsrScanResultInfo *pScanResult;
-	CDF_STATUS status = 0;
+	QDF_STATUS status = 0;
 	tScanResultHandle pResult;
 	struct cfg80211_bss *bss_status = NULL;
 	hdd_context_t *pHddCtx;
@@ -7615,7 +7615,7 @@
  * Return: CDF status
  */
 #define MAX_LFR_METRICS_EVENT_LENGTH 100
-CDF_STATUS wlan_hdd_cfg80211_roam_metrics_preauth(hdd_adapter_t *pAdapter,
+QDF_STATUS wlan_hdd_cfg80211_roam_metrics_preauth(hdd_adapter_t *pAdapter,
 						  tCsrRoamInfo *pRoamInfo)
 {
 	unsigned char metrics_notification[MAX_LFR_METRICS_EVENT_LENGTH + 1];
@@ -7625,7 +7625,7 @@
 
 	if (NULL == pAdapter) {
 		hddLog(LOGE, FL("pAdapter is NULL!"));
-		return CDF_STATUS_E_FAILURE;
+		return QDF_STATUS_E_FAILURE;
 	}
 
 	/* create the event */
@@ -7643,7 +7643,7 @@
 
 	EXIT();
 
-	return CDF_STATUS_SUCCESS;
+	return QDF_STATUS_SUCCESS;
 }
 
 /**
@@ -7656,7 +7656,7 @@
  *
  * Return: CDF status
  */
-CDF_STATUS
+QDF_STATUS
 wlan_hdd_cfg80211_roam_metrics_preauth_status(hdd_adapter_t *pAdapter,
 					      tCsrRoamInfo *pRoamInfo,
 					      bool preauth_status)
@@ -7668,7 +7668,7 @@
 
 	if (NULL == pAdapter) {
 		hddLog(LOGE, FL("pAdapter is NULL!"));
-		return CDF_STATUS_E_FAILURE;
+		return QDF_STATUS_E_FAILURE;
 	}
 
 	/* create the event */
@@ -7694,7 +7694,7 @@
 
 	EXIT();
 
-	return CDF_STATUS_SUCCESS;
+	return QDF_STATUS_SUCCESS;
 }
 
 /**
@@ -7706,7 +7706,7 @@
  *
  * Return: CDF status
  */
-CDF_STATUS wlan_hdd_cfg80211_roam_metrics_handover(hdd_adapter_t *pAdapter,
+QDF_STATUS wlan_hdd_cfg80211_roam_metrics_handover(hdd_adapter_t *pAdapter,
 						   tCsrRoamInfo *pRoamInfo)
 {
 	unsigned char metrics_notification[MAX_LFR_METRICS_EVENT_LENGTH + 1];
@@ -7716,7 +7716,7 @@
 
 	if (NULL == pAdapter) {
 		hddLog(LOGE, FL("pAdapter is NULL!"));
-		return CDF_STATUS_E_FAILURE;
+		return QDF_STATUS_E_FAILURE;
 	}
 
 	/* create the event */
@@ -7735,7 +7735,7 @@
 
 	EXIT();
 
-	return CDF_STATUS_SUCCESS;
+	return QDF_STATUS_SUCCESS;
 }
 #endif
 
@@ -7957,7 +7957,7 @@
 			 */
 			status = hdd_set_ibss_power_save_params(pAdapter);
 
-			if (CDF_STATUS_SUCCESS != status) {
+			if (QDF_STATUS_SUCCESS != status) {
 				hddLog(LOGE,
 				       FL("Set IBSS Power Save Params Failed"));
 				return -EINVAL;
@@ -8034,7 +8034,7 @@
 					  pAdapter->sessionId, pRoamProfile,
 					  &roamId);
 
-		if ((CDF_STATUS_SUCCESS != status) &&
+		if ((QDF_STATUS_SUCCESS != status) &&
 		    (WLAN_HDD_INFRA_STATION == pAdapter->device_mode ||
 		     WLAN_HDD_P2P_CLIENT == pAdapter->device_mode)) {
 			hddLog(LOGE,
@@ -8757,7 +8757,7 @@
 		 * ssid and the previous connect command in CSR. Else we might
 		 * hit some race conditions leading to SME and HDD out of sync.
 		 */
-		if (CDF_STATUS_CMD_NOT_QUEUED == status) {
+		if (QDF_STATUS_CMD_NOT_QUEUED == status) {
 			hdd_info("Already disconnected or connect was in sme/roam pending list and removed by disconnect");
 		} else if (0 != status) {
 			hdd_err("csrRoamDisconnect failure, returned %d",
@@ -8770,7 +8770,7 @@
 		rc = wait_for_completion_timeout(
 			&pAdapter->disconnect_comp_var,
 			msecs_to_jiffies(WLAN_WAIT_TIME_DISCONNECT));
-		if (!rc && (CDF_STATUS_CMD_NOT_QUEUED != status)) {
+		if (!rc && (QDF_STATUS_CMD_NOT_QUEUED != status)) {
 			hdd_err("Sme disconnect event timed out session Id %d staDebugState %d",
 				pAdapter->sessionId, pHddStaCtx->staDebugState);
 			result = -ETIMEDOUT;
@@ -8958,7 +8958,7 @@
 	 * the previous connect command in CSR. Else we might hit some
 	 * race conditions leading to SME and HDD out of sync.
 	 */
-	if (CDF_STATUS_CMD_NOT_QUEUED == status) {
+	if (QDF_STATUS_CMD_NOT_QUEUED == status) {
 		hdd_info("Already disconnected or connect was in sme/roam pending list and removed by disconnect");
 	} else if (0 != status) {
 		hddLog(LOGE,
@@ -8972,7 +8972,7 @@
 					 msecs_to_jiffies
 						 (WLAN_WAIT_TIME_DISCONNECT));
 
-	if (!rc && (CDF_STATUS_CMD_NOT_QUEUED != status)) {
+	if (!rc && (QDF_STATUS_CMD_NOT_QUEUED != status)) {
 		hddLog(LOGE,
 			FL("Failed to disconnect, timed out"));
 		result = -ETIMEDOUT;
@@ -9370,20 +9370,20 @@
 	}
 	if (pHddCtx->config->policy_manager_enabled) {
 		status = cdf_reset_connection_update();
-		if (!CDF_IS_STATUS_SUCCESS(status))
+		if (!QDF_IS_STATUS_SUCCESS(status))
 			hdd_err("ERR: clear event failed");
 
 		status = cds_current_connections_update(pAdapter->sessionId,
 						channelNum,
 						CDS_UPDATE_REASON_JOIN_IBSS);
-		if (CDF_STATUS_E_FAILURE == status) {
+		if (QDF_STATUS_E_FAILURE == status) {
 			hdd_err("ERROR: connections update failed!!");
 			return -EINVAL;
 		}
 
-		if (CDF_STATUS_SUCCESS == status) {
+		if (QDF_STATUS_SUCCESS == status) {
 			status = cdf_wait_for_connection_update();
-			if (!CDF_IS_STATUS_SUCCESS(status)) {
+			if (!QDF_IS_STATUS_SUCCESS(status)) {
 				hdd_err("ERROR: cdf wait for event failed!!");
 				return -EINVAL;
 			}
@@ -9409,7 +9409,7 @@
 	/* enable selected protection checks in IBSS mode */
 	pRoamProfile->cfg_protection = IBSS_CFG_PROTECTION_ENABLE_MASK;
 
-	if (CDF_STATUS_E_FAILURE == sme_cfg_set_int(pHddCtx->hHal,
+	if (QDF_STATUS_E_FAILURE == sme_cfg_set_int(pHddCtx->hHal,
 						    WNI_CFG_IBSS_ATIM_WIN_SIZE,
 						    pHddCtx->config->
 						    ibssATIMWinSize)) {
@@ -9420,7 +9420,7 @@
 	/* BSSID is provided by upper layers hence no need to AUTO generate */
 	if (NULL != params->bssid) {
 		if (sme_cfg_set_int(pHddCtx->hHal, WNI_CFG_IBSS_AUTO_BSSID, 0)
-				== CDF_STATUS_E_FAILURE) {
+				== QDF_STATUS_E_FAILURE) {
 			hddLog(LOGE,
 				FL("ccmCfgStInt failed for WNI_CFG_IBSS_AUTO_BSSID"));
 			return -EIO;
@@ -9428,7 +9428,7 @@
 		cdf_mem_copy(bssid.bytes, params->bssid, CDF_MAC_ADDR_SIZE);
 	} else if (pHddCtx->config->isCoalesingInIBSSAllowed == 0) {
 		if (sme_cfg_set_int(pHddCtx->hHal, WNI_CFG_IBSS_AUTO_BSSID, 0)
-				== CDF_STATUS_E_FAILURE) {
+				== QDF_STATUS_E_FAILURE) {
 			hddLog(LOGE,
 				FL("ccmCfgStInt failed for WNI_CFG_IBSS_AUTO_BSSID"));
 			return -EIO;
@@ -9519,7 +9519,7 @@
 	tCsrRoamProfile *pRoamProfile;
 	hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
 	int status;
-	CDF_STATUS hal_status;
+	QDF_STATUS hal_status;
 	unsigned long rc;
 
 	ENTER();
@@ -9559,7 +9559,7 @@
 	hal_status = sme_roam_disconnect(WLAN_HDD_GET_HAL_CTX(pAdapter),
 					 pAdapter->sessionId,
 					 eCSR_DISCONNECT_REASON_IBSS_LEAVE);
-	if (!CDF_IS_STATUS_SUCCESS(hal_status)) {
+	if (!QDF_IS_STATUS_SUCCESS(hal_status)) {
 		hddLog(LOGE,
 		       FL("sme_roam_disconnect failed hal_status(%d)"),
 		       hal_status);
@@ -9829,7 +9829,6 @@
 {
 	hdd_adapter_t *pAdapter = WLAN_HDD_GET_PRIV_PTR(dev);
 	hdd_context_t *pHddCtx;
-	CDF_STATUS cdf_status = CDF_STATUS_E_FAILURE;
 	QDF_STATUS qdf_status = QDF_STATUS_E_FAILURE;
 	hdd_hostapd_state_t *hapd_state;
 	int status;
@@ -9895,10 +9894,10 @@
 					qdf_event_reset(&hapd_state->cdf_event);
 					hdd_softap_sta_disassoc(pAdapter,
 								mac);
-					cdf_status =
+					qdf_status =
 						hdd_softap_sta_deauth(pAdapter,
 							pDelStaParams);
-					if (CDF_IS_STATUS_SUCCESS(cdf_status)) {
+					if (QDF_IS_STATUS_SUCCESS(qdf_status)) {
 						pAdapter->aStaInfo[i].
 						isDeauthInProgress = true;
 						qdf_status =
@@ -9914,11 +9913,11 @@
 				}
 			}
 		} else {
-			cdf_status =
+			qdf_status =
 				hdd_softap_get_sta_id(pAdapter,
 					      (struct cdf_mac_addr *) mac,
 					      &staId);
-			if (!CDF_IS_STATUS_SUCCESS(cdf_status)) {
+			if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
 				hddLog(LOG1,
 				       FL("Skip DEL STA as this is not used::"
 					  MAC_ADDRESS_STR),
@@ -9958,9 +9957,9 @@
 
 			qdf_event_reset(&hapd_state->cdf_event);
 			hdd_softap_sta_disassoc(pAdapter, mac);
-			cdf_status = hdd_softap_sta_deauth(pAdapter,
+			qdf_status = hdd_softap_sta_deauth(pAdapter,
 							   pDelStaParams);
-			if (!CDF_IS_STATUS_SUCCESS(cdf_status)) {
+			if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
 				pAdapter->aStaInfo[staId].isDeauthInProgress =
 					false;
 				hddLog(LOG1,
@@ -10131,7 +10130,7 @@
 	hdd_adapter_t *pAdapter = WLAN_HDD_GET_PRIV_PTR(dev);
 	hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
 	tHalHandle halHandle;
-	CDF_STATUS result = CDF_STATUS_SUCCESS;
+	QDF_STATUS result = QDF_STATUS_SUCCESS;
 	int status;
 	tPmkidCacheInfo pmk_id;
 
@@ -10175,7 +10174,7 @@
 			 pAdapter->sessionId, result));
 
 	EXIT();
-	return CDF_IS_STATUS_SUCCESS(result) ? 0 : -EINVAL;
+	return QDF_IS_STATUS_SUCCESS(result) ? 0 : -EINVAL;
 }
 
 /**
@@ -10247,7 +10246,7 @@
 			 TRACE_CODE_HDD_CFG80211_DEL_PMKSA,
 			 pAdapter->sessionId, 0));
 	/* Delete the PMKID CSR cache */
-	if (CDF_STATUS_SUCCESS !=
+	if (QDF_STATUS_SUCCESS !=
 	    sme_roam_del_pmkid_from_cache(halHandle,
 					  pAdapter->sessionId, pmksa->bssid,
 					  false)) {
@@ -10315,7 +10314,7 @@
 	halHandle = WLAN_HDD_GET_HAL_CTX(pAdapter);
 
 	/* Flush the PMKID cache in CSR */
-	if (CDF_STATUS_SUCCESS !=
+	if (QDF_STATUS_SUCCESS !=
 	    sme_roam_del_pmkid_from_cache(halHandle, pAdapter->sessionId, NULL,
 					  true)) {
 		hddLog(LOGE, FL("Cannot flush PMKIDCache"));
@@ -10447,7 +10446,7 @@
 		return;
 	}
 
-	if (CDF_STATUS_SUCCESS != pGtkOffloadGetInfoRsp->ulStatus) {
+	if (QDF_STATUS_SUCCESS != pGtkOffloadGetInfoRsp->ulStatus) {
 		hddLog(LOGE, FL("wlan Failed to get replay counter value"));
 		return;
 	}
@@ -10496,7 +10495,7 @@
 	tHalHandle hHal;
 	int result;
 	tSirGtkOffloadParams hddGtkOffloadReqParams;
-	CDF_STATUS status = CDF_STATUS_E_FAILURE;
+	QDF_STATUS status = QDF_STATUS_E_FAILURE;
 
 	ENTER();
 
@@ -10551,7 +10550,7 @@
 			sme_set_gtk_offload(hHal, &hddGtkOffloadReqParams,
 					    pAdapter->sessionId);
 
-		if (CDF_STATUS_SUCCESS != status) {
+		if (QDF_STATUS_SUCCESS != status) {
 			hddLog(LOGE, FL("sme_set_gtk_offload failed, status(%d)"),
 			       status);
 			return -EINVAL;
@@ -10608,7 +10607,7 @@
 	v_CONTEXT_t p_cds_context = NULL;
 	hdd_context_t *pHddCtx;
 	int status;
-	CDF_STATUS cdf_status = CDF_STATUS_SUCCESS;
+	QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
 
 	ENTER();
 
@@ -10695,13 +10694,13 @@
 			}
 		}
 #ifdef WLAN_FEATURE_MBSSID
-		cdf_status =
+		qdf_status =
 			wlansap_set_mac_acl(WLAN_HDD_GET_SAP_CTX_PTR(pAdapter),
 					    pConfig);
 #else
-		cdf_status = wlansap_set_mac_acl(p_cds_context, pConfig);
+		qdf_status = wlansap_set_mac_acl(p_cds_context, pConfig);
 #endif
-		if (!CDF_IS_STATUS_SUCCESS(cdf_status)) {
+		if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
 			hddLog(LOGE, FL("SAP Set Mac Acl fail"));
 			return -EINVAL;
 		}
@@ -10837,7 +10836,7 @@
 		void *buf;
 		tSirLPHBReq *hb_params = NULL;
 		tSirLPHBReq *hb_params_temp = NULL;
-		CDF_STATUS smeStatus;
+		QDF_STATUS smeStatus;
 
 		if (!tb[WLAN_HDD_TM_ATTR_DATA]) {
 			hddLog(LOGE, FL("Testmode INV DATA"));
@@ -10865,7 +10864,7 @@
 			sme_lphb_config_req((tHalHandle) (pHddCtx->hHal),
 					    hb_params,
 					    wlan_hdd_cfg80211_lphb_ind_handler);
-		if (CDF_STATUS_SUCCESS != smeStatus) {
+		if (QDF_STATUS_SUCCESS != smeStatus) {
 			hddLog(LOGE, "LPHB Config Fail, disable");
 			cdf_mem_free(hb_params);
 		}
@@ -10878,7 +10877,7 @@
 	{
 		int buf_len;
 		void *buf;
-		CDF_STATUS status;
+		QDF_STATUS status;
 		if (!tb[WLAN_HDD_TM_ATTR_DATA]) {
 			hddLog(LOGE,
 			       FL
@@ -10893,7 +10892,7 @@
 
 		status = wlan_hdd_ftm_testmode_cmd(buf, buf_len);
 
-		if (status != CDF_STATUS_SUCCESS)
+		if (status != QDF_STATUS_SUCCESS)
 			err = -EBUSY;
 		break;
 	}
@@ -11000,7 +10999,7 @@
 {
 	hdd_adapter_t *pAdapter = WLAN_HDD_GET_PRIV_PTR(dev);
 	hdd_context_t *pHddCtx;
-	CDF_STATUS status;
+	QDF_STATUS status;
 	tSmeConfigParams sme_config;
 	bool cbModeChange;
 
@@ -11062,7 +11061,7 @@
 	/* Change SAP ht2040 mode */
 	status = hdd_set_sap_ht2040_mode(pAdapter,
 					 cfg80211_get_chandef_type(chandef));
-	if (status != CDF_STATUS_SUCCESS) {
+	if (status != QDF_STATUS_SUCCESS) {
 		hddLog(LOGE, FL("Error!!! Cannot set SAP HT20/40 mode!"));
 		return -EINVAL;
 	}
diff --git a/core/hdd/src/wlan_hdd_cfg80211.h b/core/hdd/src/wlan_hdd_cfg80211.h
index c830c06..1096227 100644
--- a/core/hdd/src/wlan_hdd_cfg80211.h
+++ b/core/hdd/src/wlan_hdd_cfg80211.h
@@ -2266,16 +2266,16 @@
 					int index, bool preauth);
 
 #ifdef FEATURE_WLAN_LFR_METRICS
-CDF_STATUS wlan_hdd_cfg80211_roam_metrics_preauth(hdd_adapter_t *pAdapter,
+QDF_STATUS wlan_hdd_cfg80211_roam_metrics_preauth(hdd_adapter_t *pAdapter,
 						tCsrRoamInfo *pRoamInfo);
 
-CDF_STATUS wlan_hdd_cfg80211_roam_metrics_preauth_status(hdd_adapter_t *
+QDF_STATUS wlan_hdd_cfg80211_roam_metrics_preauth_status(hdd_adapter_t *
 							 pAdapter,
 							 tCsrRoamInfo *
 							 pRoamInfo,
 							 bool preauth_status);
 
-CDF_STATUS wlan_hdd_cfg80211_roam_metrics_handover(hdd_adapter_t *pAdapter,
+QDF_STATUS wlan_hdd_cfg80211_roam_metrics_handover(hdd_adapter_t *pAdapter,
 						   tCsrRoamInfo *pRoamInfo);
 #endif
 
@@ -2304,7 +2304,7 @@
 
 extern void hdd_conn_set_connection_state(hdd_adapter_t *pAdapter,
 					  eConnectionState connState);
-CDF_STATUS wlan_hdd_validate_operation_channel(hdd_adapter_t *pAdapter,
+QDF_STATUS wlan_hdd_validate_operation_channel(hdd_adapter_t *pAdapter,
 					       int channel);
 #ifdef FEATURE_WLAN_TDLS
 int wlan_hdd_cfg80211_send_tdls_discover_req(struct wiphy *wiphy,
diff --git a/core/hdd/src/wlan_hdd_conc_ut.c b/core/hdd/src/wlan_hdd_conc_ut.c
index 5647010..c3cda33 100644
--- a/core/hdd/src/wlan_hdd_conc_ut.c
+++ b/core/hdd/src/wlan_hdd_conc_ut.c
@@ -630,11 +630,11 @@
 	bool status = false;
 	enum cds_pcl_type pcl_type;
 	char reason[20] = {0};
-	CDF_STATUS ret;
+	QDF_STATUS ret;
 
 	/* flush the entire table first */
 	ret = cds_init_policy_mgr();
-	if (!CDF_IS_STATUS_SUCCESS(ret)) {
+	if (!QDF_IS_STATUS_SUCCESS(ret)) {
 		hdd_err("Policy manager initialization failed");
 		return;
 	}
@@ -681,7 +681,7 @@
 	enum cds_one_connection_mode second_index;
 	char reason[20] = {0};
 	bool status = false;
-	CDF_STATUS ret;
+	QDF_STATUS ret;
 
 	for (sub_type = CDS_STA_MODE;
 		sub_type < CDS_MAX_NUM_OF_MODE; sub_type++) {
@@ -689,7 +689,7 @@
 
 		/* flush the entire table first */
 		ret = cds_init_policy_mgr();
-		if (!CDF_IS_STATUS_SUCCESS(ret)) {
+		if (!QDF_IS_STATUS_SUCCESS(ret)) {
 			hdd_err("Policy manager initialization failed");
 			return;
 		}
@@ -761,7 +761,7 @@
 	enum cds_two_connection_mode third_index;
 	char reason[20] = {0};
 	bool status = false;
-	CDF_STATUS ret;
+	QDF_STATUS ret;
 
 	/* let's set the chain_mask, mac_ids*/
 	if (chain_mask == CDS_TWO_TWO) {
@@ -787,7 +787,7 @@
 		type_1 = wlan_hdd_valid_type_of_persona(sub_type_1);
 		/* flush the entire table first */
 		ret = cds_init_policy_mgr();
-		if (!CDF_IS_STATUS_SUCCESS(ret)) {
+		if (!QDF_IS_STATUS_SUCCESS(ret)) {
 			hdd_err("Policy manager initialization failed");
 			return;
 		}
diff --git a/core/hdd/src/wlan_hdd_debugfs.c b/core/hdd/src/wlan_hdd_debugfs.c
index 7cb79d3..9af6336 100644
--- a/core/hdd/src/wlan_hdd_debugfs.c
+++ b/core/hdd/src/wlan_hdd_debugfs.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013-2015 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2013-2016 The Linux Foundation. All rights reserved.
  *
  * Previously licensed under the ISC license by Qualcomm Atheros, Inc.
  *
@@ -321,7 +321,7 @@
 	char *pattern_buf;
 	uint16_t pattern_len = 0;
 	uint16_t i = 0;
-	CDF_STATUS status;
+	QDF_STATUS status;
 	int ret;
 
 	ENTER();
@@ -411,7 +411,7 @@
 		/* Delete pattern */
 		status = sme_del_periodic_tx_ptrn(pHddCtx->hHal,
 						  delPeriodicTxPtrnParams);
-		if (CDF_STATUS_SUCCESS != status) {
+		if (QDF_STATUS_SUCCESS != status) {
 			CDF_TRACE(CDF_MODULE_ID_HDD, CDF_TRACE_LEVEL_ERROR,
 				  "%s: sme_del_periodic_tx_ptrn() failed!",
 				  __func__);
@@ -489,7 +489,7 @@
 	/* Add pattern */
 	status = sme_add_periodic_tx_ptrn(pHddCtx->hHal,
 					  addPeriodicTxPtrnParams);
-	if (CDF_STATUS_SUCCESS != status) {
+	if (QDF_STATUS_SUCCESS != status) {
 		CDF_TRACE(CDF_MODULE_ID_HDD, CDF_TRACE_LEVEL_ERROR,
 			  "%s: sme_add_periodic_tx_ptrn() failed!", __func__);
 
@@ -610,33 +610,33 @@
  * NB: The current implementation only supports debugfs operations
  * on the primary interface, i.e. wlan0
  *
- * Return: CDF_STATUS_SUCCESS if all files registered,
- *	   CDF_STATUS_E_FAILURE on failure
+ * Return: QDF_STATUS_SUCCESS if all files registered,
+ *	   QDF_STATUS_E_FAILURE on failure
  */
-CDF_STATUS hdd_debugfs_init(hdd_adapter_t *pAdapter)
+QDF_STATUS hdd_debugfs_init(hdd_adapter_t *pAdapter)
 {
 	hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
 	pHddCtx->debugfs_phy = debugfs_create_dir("wlan_wcnss", 0);
 
 	if (NULL == pHddCtx->debugfs_phy)
-		return CDF_STATUS_E_FAILURE;
+		return QDF_STATUS_E_FAILURE;
 
 	if (NULL == debugfs_create_file("wow_enable", S_IRUSR | S_IWUSR,
 					pHddCtx->debugfs_phy, pAdapter,
 					&fops_wowenable))
-		return CDF_STATUS_E_FAILURE;
+		return QDF_STATUS_E_FAILURE;
 
 	if (NULL == debugfs_create_file("wow_pattern", S_IRUSR | S_IWUSR,
 					pHddCtx->debugfs_phy, pAdapter,
 					&fops_wowpattern))
-		return CDF_STATUS_E_FAILURE;
+		return QDF_STATUS_E_FAILURE;
 
 	if (NULL == debugfs_create_file("pattern_gen", S_IRUSR | S_IWUSR,
 					pHddCtx->debugfs_phy, pAdapter,
 					&fops_patterngen))
-		return CDF_STATUS_E_FAILURE;
+		return QDF_STATUS_E_FAILURE;
 
-	return CDF_STATUS_SUCCESS;
+	return QDF_STATUS_SUCCESS;
 }
 
 /**
diff --git a/core/hdd/src/wlan_hdd_driver_ops.c b/core/hdd/src/wlan_hdd_driver_ops.c
index c66dcbb..f09f1ba 100644
--- a/core/hdd/src/wlan_hdd_driver_ops.c
+++ b/core/hdd/src/wlan_hdd_driver_ops.c
@@ -38,7 +38,6 @@
 #include <soc/qcom/icnss.h>
 #endif /* HIF_PCI */
 #include "cds_api.h"
-#include "cdf_status.h"
 #include "qdf_status.h"
 #include "cdf_lock.h"
 #include "cds_sched.h"
@@ -182,7 +181,7 @@
  */
 static int hdd_init_cds_hif_context(void *hif)
 {
-	CDF_STATUS status;
+	QDF_STATUS status;
 
 	status = cds_set_context(CDF_MODULE_ID_HIF, hif);
 
@@ -199,7 +198,7 @@
  */
 static void hdd_deinit_cds_hif_context(void)
 {
-	CDF_STATUS status;
+	QDF_STATUS status;
 
 	status = cds_set_context(CDF_MODULE_ID_HIF, NULL);
 
@@ -224,7 +223,7 @@
 static int hdd_hif_open(struct device *dev, void *bdev, const hif_bus_id *bid,
 			enum ath_hal_bus_type bus_type, bool reinit)
 {
-	CDF_STATUS status;
+	QDF_STATUS status;
 	int ret = 0;
 	struct hif_opaque_softc *hif_ctx;
 	cdf_device_t cdf_ctx = cds_get_context(CDF_MODULE_ID_CDF_DEVICE);
@@ -259,7 +258,7 @@
 	status = hif_enable(hif_ctx, dev, bdev, bid, bus_type,
 			    (reinit == true) ?  HIF_ENABLE_TYPE_REINIT :
 			    HIF_ENABLE_TYPE_PROBE);
-	if (!CDF_IS_STATUS_SUCCESS(status)) {
+	if (!QDF_IS_STATUS_SUCCESS(status)) {
 		hdd_err("hif_enable error = %d, reinit = %d",
 			status, reinit);
 		ret = cdf_status_to_os_return(status);
@@ -328,7 +327,7 @@
 	enum ath_hal_bus_type bus_type, bool reinit)
 {
 	void *hif_ctx;
-	CDF_STATUS status;
+	QDF_STATUS status;
 	int ret = 0;
 	cdf_device_t cdf_dev;
 	uint32_t mode = cds_get_conparam();
@@ -358,7 +357,7 @@
 
 	if (WLAN_IS_EPPING_ENABLED(mode)) {
 		status = epping_open();
-		if (status != CDF_STATUS_SUCCESS)
+		if (status != QDF_STATUS_SUCCESS)
 			goto err_hdd_deinit;
 	}
 
@@ -374,7 +373,7 @@
 
 	status = ol_cds_init(cdf_dev, hif_ctx);
 
-	if (status != CDF_STATUS_SUCCESS) {
+	if (status != QDF_STATUS_SUCCESS) {
 		pr_err("%s No Memory to Create BMI Context\n", __func__);
 		goto err_hif_close;
 	}
@@ -599,7 +598,7 @@
  *
  * @state: state
  *
- * Return: CDF_STATUS
+ * Return: QDF_STATUS
  */
 int wlan_hdd_bus_suspend(pm_message_t state)
 {
diff --git a/core/hdd/src/wlan_hdd_ext_scan.c b/core/hdd/src/wlan_hdd_ext_scan.c
index f33a6e2..65d31d5 100644
--- a/core/hdd/src/wlan_hdd_ext_scan.c
+++ b/core/hdd/src/wlan_hdd_ext_scan.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012-2015 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2012-2016 The Linux Foundation. All rights reserved.
  *
  * Previously licensed under the ISC license by Qualcomm Atheros, Inc.
  *
@@ -1714,7 +1714,7 @@
 	hdd_context_t *pHddCtx = wiphy_priv(wiphy);
 	struct nlattr *tb[QCA_WLAN_VENDOR_ATTR_EXTSCAN_SUBCMD_CONFIG_PARAM_MAX +
 			  1];
-	CDF_STATUS status;
+	QDF_STATUS status;
 
 	ENTER();
 
@@ -1759,7 +1759,7 @@
 	spin_unlock(&context->context_lock);
 
 	status = sme_ext_scan_get_capabilities(pHddCtx->hHal, pReqMsg);
-	if (!CDF_IS_STATUS_SUCCESS(status)) {
+	if (!QDF_IS_STATUS_SUCCESS(status)) {
 		hddLog(LOGE, FL("sme_ext_scan_get_capabilities failed(err=%d)"),
 			status);
 		goto fail;
@@ -1846,7 +1846,7 @@
 	struct nlattr *tb[QCA_WLAN_VENDOR_ATTR_EXTSCAN_SUBCMD_CONFIG_PARAM_MAX +
 			  1];
 	struct hdd_ext_scan_context *context;
-	CDF_STATUS status;
+	QDF_STATUS status;
 	int retval = 0;
 	unsigned long rc;
 
@@ -1900,7 +1900,7 @@
 	spin_unlock(&context->context_lock);
 
 	status = sme_get_cached_results(pHddCtx->hHal, pReqMsg);
-	if (!CDF_IS_STATUS_SUCCESS(status)) {
+	if (!QDF_IS_STATUS_SUCCESS(status)) {
 		hddLog(LOGE,
 		       FL("sme_get_cached_results failed(err=%d)"), status);
 		goto fail;
@@ -1993,7 +1993,7 @@
 	struct nlattr *apTh;
 	struct hdd_ext_scan_context *context;
 	uint32_t request_id;
-	CDF_STATUS status;
+	QDF_STATUS status;
 	uint8_t i;
 	int rem, retval;
 	unsigned long rc;
@@ -2111,7 +2111,7 @@
 	spin_unlock(&context->context_lock);
 
 	status = sme_set_bss_hotlist(pHddCtx->hHal, pReqMsg);
-	if (!CDF_IS_STATUS_SUCCESS(status)) {
+	if (!QDF_IS_STATUS_SUCCESS(status)) {
 		hddLog(LOGE, FL("sme_set_bss_hotlist failed(err=%d)"), status);
 		goto fail;
 	}
@@ -2190,7 +2190,7 @@
 	struct nlattr *apTh;
 	struct hdd_ext_scan_context *context;
 	uint32_t request_id;
-	CDF_STATUS status;
+	QDF_STATUS status;
 	uint8_t i;
 	int rem, retval;
 	unsigned long rc;
@@ -2330,7 +2330,7 @@
 	spin_unlock(&context->context_lock);
 
 	status = sme_set_significant_change(pHddCtx->hHal, pReqMsg);
-	if (!CDF_IS_STATUS_SUCCESS(status)) {
+	if (!QDF_IS_STATUS_SUCCESS(status)) {
 		hddLog(LOGE,
 		       FL("sme_set_significant_change failed(err=%d)"), status);
 		cdf_mem_free(pReqMsg);
@@ -2472,7 +2472,7 @@
 			  1];
 	uint32_t requestId, maxChannels;
 	tWifiBand wifiBand;
-	CDF_STATUS status;
+	QDF_STATUS status;
 	struct sk_buff *reply_skb;
 	uint8_t i;
 	int ret;
@@ -2527,7 +2527,7 @@
 	status = sme_get_valid_channels_by_band((tHalHandle) (pHddCtx->hHal),
 						wifiBand, chan_list,
 						&num_channels);
-	if (CDF_STATUS_SUCCESS != status) {
+	if (QDF_STATUS_SUCCESS != status) {
 		hddLog(LOGE,
 		       FL("sme_get_valid_channels_by_band failed (err=%d)"),
 		       status);
@@ -2693,7 +2693,7 @@
 	struct nlattr *buckets;
 	struct nlattr *channels;
 	int rem1, rem2;
-	CDF_STATUS status;
+	QDF_STATUS status;
 	uint8_t bkt_index, j, num_channels, total_channels = 0;
 	uint32_t chan_list[WNI_CFG_VALID_CHANNEL_LIST_LEN] = {0};
 
@@ -2821,7 +2821,7 @@
 			status = sme_get_valid_channels_by_band(hdd_ctx->hHal,
 						req_msg->buckets[bkt_index].band,
 						chan_list, &num_channels);
-			if (!CDF_IS_STATUS_SUCCESS(status)) {
+			if (!QDF_IS_STATUS_SUCCESS(status)) {
 				hddLog(LOGE,
 				       FL("sme_GetValidChannelsByBand failed (err=%d)"),
 				       status);
@@ -3138,7 +3138,7 @@
 	struct nlattr *tb[PARAM_MAX + 1];
 	struct hdd_ext_scan_context *context;
 	uint32_t request_id, num_buckets;
-	CDF_STATUS status;
+	QDF_STATUS status;
 	int retval;
 	unsigned long rc;
 
@@ -3250,7 +3250,7 @@
 	spin_unlock(&context->context_lock);
 
 	status = sme_ext_scan_start(pHddCtx->hHal, pReqMsg);
-	if (!CDF_IS_STATUS_SUCCESS(status)) {
+	if (!QDF_IS_STATUS_SUCCESS(status)) {
 		hddLog(LOGE,
 			FL("sme_ext_scan_start failed(err=%d)"), status);
 		goto fail;
@@ -3347,7 +3347,7 @@
 	hdd_context_t *pHddCtx = wiphy_priv(wiphy);
 	struct nlattr *tb[PARAM_MAX + 1];
 	struct hdd_ext_scan_context *context;
-	CDF_STATUS status;
+	QDF_STATUS status;
 	uint32_t request_id;
 	int retval;
 	unsigned long rc;
@@ -3393,7 +3393,7 @@
 	spin_unlock(&context->context_lock);
 
 	status = sme_ext_scan_stop(pHddCtx->hHal, pReqMsg);
-	if (!CDF_IS_STATUS_SUCCESS(status)) {
+	if (!QDF_IS_STATUS_SUCCESS(status)) {
 		hddLog(LOGE,
 		       FL("sme_ext_scan_stop failed(err=%d)"), status);
 		goto fail;
@@ -3475,7 +3475,7 @@
 			  1];
 	struct hdd_ext_scan_context *context;
 	uint32_t request_id;
-	CDF_STATUS status;
+	QDF_STATUS status;
 	int retval;
 	unsigned long rc;
 
@@ -3522,7 +3522,7 @@
 	spin_unlock(&context->context_lock);
 
 	status = sme_reset_bss_hotlist(pHddCtx->hHal, pReqMsg);
-	if (!CDF_IS_STATUS_SUCCESS(status)) {
+	if (!QDF_IS_STATUS_SUCCESS(status)) {
 		hddLog(LOGE,
 		       FL("sme_reset_bss_hotlist failed(err=%d)"), status);
 		goto fail;
@@ -3600,7 +3600,7 @@
 			  1];
 	struct hdd_ext_scan_context *context;
 	uint32_t request_id;
-	CDF_STATUS status;
+	QDF_STATUS status;
 	int retval;
 	unsigned long rc;
 
@@ -3647,7 +3647,7 @@
 	spin_unlock(&context->context_lock);
 
 	status = sme_reset_significant_change(pHddCtx->hHal, pReqMsg);
-	if (!CDF_IS_STATUS_SUCCESS(status)) {
+	if (!QDF_IS_STATUS_SUCCESS(status)) {
 		hddLog(LOGE, FL("sme_reset_significant_change failed(err=%d)"),
 			status);
 		cdf_mem_free(pReqMsg);
@@ -3812,7 +3812,7 @@
 	hdd_context_t *hdd_ctx           = wiphy_priv(wiphy);
 	struct nlattr *tb[
 		QCA_WLAN_VENDOR_ATTR_PNO_MAX + 1];
-	CDF_STATUS status;
+	QDF_STATUS status;
 	uint32_t num_networks, len;
 	int ret_val;
 
@@ -3869,7 +3869,7 @@
 		goto fail;
 
 	status = sme_set_epno_list(hdd_ctx->hHal, req_msg);
-	if (!CDF_IS_STATUS_SUCCESS(status)) {
+	if (!QDF_IS_STATUS_SUCCESS(status)) {
 		hddLog(LOGE, FL("sme_set_epno_list failed(err=%d)"), status);
 		goto fail;
 	}
@@ -4018,7 +4018,7 @@
 	hdd_adapter_t *adapter             = WLAN_HDD_GET_PRIV_PTR(dev);
 	hdd_context_t *hdd_ctx             = wiphy_priv(wiphy);
 	struct nlattr *tb[QCA_WLAN_VENDOR_ATTR_PNO_MAX + 1];
-	CDF_STATUS status;
+	QDF_STATUS status;
 	uint32_t num_networks = 0;
 	int ret;
 
@@ -4072,7 +4072,7 @@
 		goto fail;
 
 	status = sme_set_passpoint_list(hdd_ctx->hHal, req_msg);
-	if (!CDF_IS_STATUS_SUCCESS(status)) {
+	if (!QDF_IS_STATUS_SUCCESS(status)) {
 		hddLog(LOGE,
 			FL("sme_set_passpoint_list failed(err=%d)"), status);
 		goto fail;
@@ -4135,7 +4135,7 @@
 	hdd_adapter_t *adapter             = WLAN_HDD_GET_PRIV_PTR(dev);
 	hdd_context_t *hdd_ctx             = wiphy_priv(wiphy);
 	struct nlattr *tb[QCA_WLAN_VENDOR_ATTR_PNO_MAX + 1];
-	CDF_STATUS status;
+	QDF_STATUS status;
 	int ret;
 
 	ENTER();
@@ -4174,7 +4174,7 @@
 			req_msg->request_id, req_msg->session_id);
 
 	status = sme_reset_passpoint_list(hdd_ctx->hHal, req_msg);
-	if (!CDF_IS_STATUS_SUCCESS(status)) {
+	if (!QDF_IS_STATUS_SUCCESS(status)) {
 		hddLog(LOGE,
 			FL("sme_reset_passpoint_list failed(err=%d)"), status);
 		goto fail;
@@ -4264,7 +4264,7 @@
 	uint32_t request_id;
 	char ssid_string[SIR_MAC_MAX_SSID_LENGTH + 1];
 	int ssid_len, i, rem;
-	CDF_STATUS status;
+	QDF_STATUS status;
 	int retval;
 	unsigned long rc;
 
@@ -4384,7 +4384,7 @@
 	spin_unlock(&context->context_lock);
 
 	status = sme_set_ssid_hotlist(hdd_ctx->hHal, request);
-	if (!CDF_IS_STATUS_SUCCESS(status)) {
+	if (!QDF_IS_STATUS_SUCCESS(status)) {
 		hddLog(LOGE,
 		       FL("sme_set_ssid_hotlist failed(err=%d)"), status);
 		goto fail;
@@ -4484,7 +4484,7 @@
 	struct nlattr *tb[PARAM_MAX + 1];
 	struct hdd_ext_scan_context *context;
 	uint32_t request_id;
-	CDF_STATUS status;
+	QDF_STATUS status;
 	int retval;
 	unsigned long rc;
 
@@ -4534,7 +4534,7 @@
 	spin_unlock(&context->context_lock);
 
 	status = sme_set_ssid_hotlist(hdd_ctx->hHal, request);
-	if (!CDF_IS_STATUS_SUCCESS(status)) {
+	if (!QDF_IS_STATUS_SUCCESS(status)) {
 		hddLog(LOGE,
 		       FL("sme_reset_ssid_hotlist failed(err=%d)"), status);
 		goto fail;
diff --git a/core/hdd/src/wlan_hdd_ftm.c b/core/hdd/src/wlan_hdd_ftm.c
index 6558552..645e7a0 100644
--- a/core/hdd/src/wlan_hdd_ftm.c
+++ b/core/hdd/src/wlan_hdd_ftm.c
@@ -99,16 +99,16 @@
 	ftmMsg.bodyptr = (uint8_t *) cmd_ptr;
 	ftmMsg.bodyval = 0;
 
-	if (CDF_STATUS_SUCCESS != cds_mq_post_message(CDF_MODULE_ID_WMA,
+	if (QDF_STATUS_SUCCESS != cds_mq_post_message(CDF_MODULE_ID_WMA,
 						      &ftmMsg)) {
 		hddLog(CDF_TRACE_LEVEL_ERROR, "%s: : Failed to post Msg to HAL",
 		       __func__);
 
-		return CDF_STATUS_E_FAILURE;
+		return QDF_STATUS_E_FAILURE;
 	}
 
 	EXIT();
-	return CDF_STATUS_SUCCESS;
+	return QDF_STATUS_SUCCESS;
 }
 
 /**
@@ -161,16 +161,16 @@
  * - All the WLAN SW components should have been opened. This includes MAC.
  *
  * Returns:
- *	CDF_STATUS_SUCCESS - Scheduler was successfully initialized and
+ *	QDF_STATUS_SUCCESS - Scheduler was successfully initialized and
  *	is ready to be used.
- *	CDF_STATUS_E_RESOURCES - System resources (other than memory)
+ *	QDF_STATUS_E_RESOURCES - System resources (other than memory)
  *	are unavailable to initialize the scheduler
- *	CDF_STATUS_E_FAILURE - Failure to initialize the scheduler
+ *	QDF_STATUS_E_FAILURE - Failure to initialize the scheduler
  */
-static CDF_STATUS wlan_ftm_cds_open(v_CONTEXT_t p_cds_context,
+static QDF_STATUS wlan_ftm_cds_open(v_CONTEXT_t p_cds_context,
 				    uint32_t hddContextSize)
 {
-	CDF_STATUS vStatus = CDF_STATUS_SUCCESS;
+	QDF_STATUS vStatus = QDF_STATUS_SUCCESS;
 	int iter = 0;
 	tSirRetStatus sirStatus = eSIR_SUCCESS;
 	tMacOpenParameters mac_openParms;
@@ -191,7 +191,7 @@
 		CDF_TRACE(CDF_MODULE_ID_CDF, CDF_TRACE_LEVEL_ERROR,
 			  "%s: Trying to open CDS without a PreOpen", __func__);
 		CDF_ASSERT(0);
-		return CDF_STATUS_E_FAILURE;
+		return QDF_STATUS_E_FAILURE;
 	}
 
 	/* Initialize the probe event */
@@ -199,7 +199,7 @@
 		CDF_TRACE(CDF_MODULE_ID_CDF, CDF_TRACE_LEVEL_ERROR,
 			  "%s: Unable to init probeEvent", __func__);
 		CDF_ASSERT(0);
-		return CDF_STATUS_E_FAILURE;
+		return QDF_STATUS_E_FAILURE;
 	}
 
 	if (qdf_event_create(&(gp_cds_context->wmaCompleteEvent)) !=
@@ -213,7 +213,7 @@
 
 	/* Initialize the free message queue */
 	vStatus = cds_mq_init(&gp_cds_context->freeVosMq);
-	if (!CDF_IS_STATUS_SUCCESS(vStatus)) {
+	if (!QDF_IS_STATUS_SUCCESS(vStatus)) {
 
 		/* Critical Error ...  Cannot proceed further */
 		CDF_TRACE(CDF_MODULE_ID_CDF, CDF_TRACE_LEVEL_ERROR,
@@ -235,7 +235,7 @@
 	vStatus = cds_sched_open(gp_cds_context, &gp_cds_context->cdf_sched,
 				 sizeof(cds_sched_context));
 
-	if (!CDF_IS_STATUS_SUCCESS(vStatus)) {
+	if (!QDF_IS_STATUS_SUCCESS(vStatus)) {
 		/* Critical Error ...  Cannot proceed further */
 		CDF_TRACE(CDF_MODULE_ID_CDF, CDF_TRACE_LEVEL_ERROR,
 			  "%s: Failed to open CDS Scheduler %d", __func__,
@@ -300,7 +300,7 @@
 
 	vStatus = wma_open(gp_cds_context,
 			   wlan_hdd_ftm_update_tgt_cfg, NULL, &mac_openParms);
-	if (!CDF_IS_STATUS_SUCCESS(vStatus)) {
+	if (!QDF_IS_STATUS_SUCCESS(vStatus)) {
 		/* Critical Error ...  Cannot proceed further */
 		CDF_TRACE(CDF_MODULE_ID_CDF, CDF_TRACE_LEVEL_ERROR,
 			  "%s: Failed to open WMA module %d", __func__,
@@ -346,7 +346,7 @@
 #ifndef QCA_WIFI_FTM
 	/* Now proceed to open the SME */
 	vStatus = sme_open(gp_cds_context->pMACContext);
-	if (!CDF_IS_STATUS_SUCCESS(vStatus)) {
+	if (!QDF_IS_STATUS_SUCCESS(vStatus)) {
 		/* Critical Error ...  Cannot proceed further */
 		CDF_TRACE(CDF_MODULE_ID_CDF, CDF_TRACE_LEVEL_ERROR,
 			  "%s: Failed to open SME %d", __func__, vStatus);
@@ -355,16 +355,16 @@
 
 	vStatus = sme_init_chan_list(gp_cds_context->pMACContext,
 				     hdd_ctx->reg.alpha2, hdd_ctx->reg.cc_src);
-	if (!CDF_IS_STATUS_SUCCESS(vStatus)) {
+	if (!QDF_IS_STATUS_SUCCESS(vStatus)) {
 		CDF_TRACE(CDF_MODULE_ID_CDF, CDF_TRACE_LEVEL_ERROR,
 			  "%s: Failed to init sme channel list", __func__);
 	} else {
 		CDF_TRACE(CDF_MODULE_ID_CDF, CDF_TRACE_LEVEL_INFO_HIGH,
 			  "%s: CDS successfully Opened", __func__);
-		return CDF_STATUS_SUCCESS;
+		return QDF_STATUS_SUCCESS;
 	}
 #else
-	return CDF_STATUS_SUCCESS;
+	return QDF_STATUS_SUCCESS;
 #endif
 
 #ifndef QCA_WIFI_FTM
@@ -397,7 +397,7 @@
 err_probe_event:
 	qdf_event_destroy(&gp_cds_context->ProbeEvent);
 
-	return CDF_STATUS_E_FAILURE;
+	return QDF_STATUS_E_FAILURE;
 
 } /* wlan_ftm_cds_open() */
 
@@ -407,38 +407,37 @@
  *
  * The wlan_ftm_cds_close() function closes the CDF Module
  *
- * Return: CDF_STATUS_SUCCESS - successfully closed
+ * Return: QDF_STATUS_SUCCESS - successfully closed
  */
-static CDF_STATUS wlan_ftm_cds_close(v_CONTEXT_t cds_context)
+static QDF_STATUS wlan_ftm_cds_close(v_CONTEXT_t cds_context)
 {
-	CDF_STATUS cdf_status;
 	QDF_STATUS qdf_status;
 	p_cds_contextType gp_cds_context = (p_cds_contextType) cds_context;
 
 #ifndef QCA_WIFI_FTM
-	cdf_status = sme_close(((p_cds_contextType) cds_context)->pMACContext);
-	if (!CDF_IS_STATUS_SUCCESS(cdf_status)) {
+	qdf_status = sme_close(((p_cds_contextType) cds_context)->pMACContext);
+	if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
 		CDF_TRACE(CDF_MODULE_ID_CDF, CDF_TRACE_LEVEL_ERROR,
-			  "%s: Failed to close SME %d", __func__, cdf_status);
-		CDF_ASSERT(CDF_IS_STATUS_SUCCESS(cdf_status));
+			  "%s: Failed to close SME %d", __func__, qdf_status);
+		CDF_ASSERT(QDF_IS_STATUS_SUCCESS(qdf_status));
 	}
 #endif
 
-	cdf_status = mac_close(((p_cds_contextType) cds_context)->pMACContext);
-	if (!CDF_IS_STATUS_SUCCESS(cdf_status)) {
+	qdf_status = mac_close(((p_cds_contextType) cds_context)->pMACContext);
+	if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
 		CDF_TRACE(CDF_MODULE_ID_CDF, CDF_TRACE_LEVEL_ERROR,
-			  "%s: Failed to close MAC %d", __func__, cdf_status);
-		CDF_ASSERT(CDF_IS_STATUS_SUCCESS(cdf_status));
+			  "%s: Failed to close MAC %d", __func__, qdf_status);
+		CDF_ASSERT(QDF_IS_STATUS_SUCCESS(qdf_status));
 	}
 
 	((p_cds_contextType) cds_context)->pMACContext = NULL;
 
 
-	cdf_status = wma_close(cds_context);
-	if (!CDF_IS_STATUS_SUCCESS(cdf_status)) {
+	qdf_status = wma_close(cds_context);
+	if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
 		CDF_TRACE(CDF_MODULE_ID_CDF, CDF_TRACE_LEVEL_ERROR,
-			  "%s: Failed to close WMA %d", __func__, cdf_status);
-		CDF_ASSERT(CDF_IS_STATUS_SUCCESS(cdf_status));
+			  "%s: Failed to close WMA %d", __func__, qdf_status);
+		CDF_ASSERT(QDF_IS_STATUS_SUCCESS(qdf_status));
 	}
 #if  defined(QCA_WIFI_FTM)
 	if (gp_cds_context->htc_ctx) {
@@ -446,11 +445,11 @@
 		htc_destroy(gp_cds_context->htc_ctx);
 		gp_cds_context->htc_ctx = NULL;
 	}
-	cdf_status = wma_wmi_service_close(cds_context);
-	if (!CDF_IS_STATUS_SUCCESS(cdf_status)) {
+	qdf_status = wma_wmi_service_close(cds_context);
+	if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
 		CDF_TRACE(CDF_MODULE_ID_CDF, CDF_TRACE_LEVEL_ERROR,
 			  "%s: Failed to close wma_wmi_service", __func__);
-		CDF_ASSERT(CDF_IS_STATUS_SUCCESS(cdf_status));
+		CDF_ASSERT(QDF_IS_STATUS_SUCCESS(qdf_status));
 	}
 
 	hif_disable_isr(gp_cds_context->pHIFContext);
@@ -474,7 +473,7 @@
 		CDF_ASSERT(QDF_IS_STATUS_SUCCESS(qdf_status));
 	}
 
-	return CDF_STATUS_SUCCESS;
+	return QDF_STATUS_SUCCESS;
 }
 
 /**
@@ -484,12 +483,12 @@
  * The cds_ftm_pre_start() function performs all pre-start activities
  * in FTM mode.
  *
- * Return: CDF_STATUS_SUCCESS if pre-start was successful, an
+ * Return: QDF_STATUS_SUCCESS if pre-start was successful, an
  *	   appropriate CDF_STATUS_E_* error code otherwise
  */
-static CDF_STATUS cds_ftm_pre_start(v_CONTEXT_t cds_context)
+static QDF_STATUS cds_ftm_pre_start(v_CONTEXT_t cds_context)
 {
-	CDF_STATUS vStatus = CDF_STATUS_SUCCESS;
+	QDF_STATUS vStatus = QDF_STATUS_SUCCESS;
 	QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
 	p_cds_contextType p_cds_context = (p_cds_contextType) cds_context;
 #if  defined(QCA_WIFI_FTM)
@@ -502,7 +501,7 @@
 		CDF_ASSERT(0);
 		CDF_TRACE(CDF_MODULE_ID_SYS, CDF_TRACE_LEVEL_ERROR,
 			  "%s: WMA NULL context", __func__);
-		return CDF_STATUS_E_FAILURE;
+		return QDF_STATUS_E_FAILURE;
 	}
 
 	/* Reset WMA wait event */
@@ -510,11 +509,11 @@
 
 	/*call WMA pre start */
 	vStatus = wma_pre_start(p_cds_context);
-	if (!CDF_IS_STATUS_SUCCESS(vStatus)) {
+	if (!QDF_IS_STATUS_SUCCESS(vStatus)) {
 		CDF_TRACE(CDF_MODULE_ID_SYS, CDF_TRACE_LEVEL_ERROR,
 			  "Failed to WMA prestart ");
 		CDF_ASSERT(0);
-		return CDF_STATUS_E_FAILURE;
+		return QDF_STATUS_E_FAILURE;
 	}
 
 	/* Need to update time out of complete */
@@ -531,20 +530,20 @@
 				  __func__);
 		}
 		CDF_ASSERT(0);
-		return CDF_STATUS_E_FAILURE;
+		return QDF_STATUS_E_FAILURE;
 	}
 #if  defined(QCA_WIFI_FTM)
 	vStatus = htc_start(gp_cds_context->htc_ctx);
-	if (!CDF_IS_STATUS_SUCCESS(vStatus)) {
+	if (!QDF_IS_STATUS_SUCCESS(vStatus)) {
 		CDF_TRACE(CDF_MODULE_ID_SYS, CDF_TRACE_LEVEL_FATAL,
 			  "Failed to Start HTC");
 		CDF_ASSERT(0);
-		return CDF_STATUS_E_FAILURE;
+		return QDF_STATUS_E_FAILURE;
 	}
 	wma_wait_for_ready_event(gp_cds_context->pWMAContext);
 #endif /* QCA_WIFI_FTM */
 
-	return CDF_STATUS_SUCCESS;
+	return QDF_STATUS_SUCCESS;
 }
 
 /**
@@ -558,7 +557,7 @@
  */
 int wlan_hdd_ftm_open(hdd_context_t *hdd_ctx)
 {
-	CDF_STATUS vStatus = CDF_STATUS_SUCCESS;
+	QDF_STATUS vStatus = QDF_STATUS_SUCCESS;
 	p_cds_contextType p_cds_context = NULL;
 
 	CDF_TRACE(CDF_MODULE_ID_HDD, CDF_TRACE_LEVEL_INFO_HIGH,
@@ -575,7 +574,7 @@
 
 	vStatus = wlan_ftm_cds_open(p_cds_context, 0);
 
-	if (!CDF_IS_STATUS_SUCCESS(vStatus)) {
+	if (!QDF_IS_STATUS_SUCCESS(vStatus)) {
 		hddLog(CDF_TRACE_LEVEL_FATAL, "%s: cds_open failed", __func__);
 		goto err_cdf_status_failure;
 	}
@@ -656,7 +655,7 @@
  */
 int wlan_hdd_ftm_close(hdd_context_t *hdd_ctx)
 {
-	CDF_STATUS cdf_status;
+	QDF_STATUS qdf_status;
 	v_CONTEXT_t cds_context = hdd_ctx->pcds_context;
 
 	hdd_adapter_t *adapter = hdd_get_adapter(hdd_ctx, WLAN_HDD_FTM);
@@ -675,11 +674,11 @@
 
 	hdd_close_all_adapters(hdd_ctx, false);
 
-	cdf_status = cds_sched_close(cds_context);
-	if (!CDF_IS_STATUS_SUCCESS(cdf_status)) {
+	qdf_status = cds_sched_close(cds_context);
+	if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
 		CDF_TRACE(CDF_MODULE_ID_CDF, CDF_TRACE_LEVEL_ERROR,
 			  "%s: Failed to close CDS Scheduler", __func__);
-		CDF_ASSERT(CDF_IS_STATUS_SUCCESS(cdf_status));
+		CDF_ASSERT(QDF_IS_STATUS_SUCCESS(qdf_status));
 	}
 	/* Close CDS */
 	wlan_ftm_cds_close(cds_context);
@@ -746,7 +745,7 @@
  */
 static int wlan_hdd_ftm_start(hdd_context_t *hdd_ctx)
 {
-	CDF_STATUS vStatus = CDF_STATUS_SUCCESS;
+	QDF_STATUS vStatus = QDF_STATUS_SUCCESS;
 	p_cds_contextType p_cds_context =
 		(p_cds_contextType) (hdd_ctx->pcds_context);
 
@@ -771,7 +770,7 @@
 	}
 
 	/* Vos preStart is calling */
-	if (!CDF_IS_STATUS_SUCCESS(cds_ftm_pre_start(hdd_ctx->pcds_context))) {
+	if (!QDF_IS_STATUS_SUCCESS(cds_ftm_pre_start(hdd_ctx->pcds_context))) {
 		hddLog(CDF_TRACE_LEVEL_FATAL, "%s: cds_pre_enable failed",
 		       __func__);
 		goto err_status_failure;
@@ -780,7 +779,7 @@
 	sme_register_ftm_msg_processor(hdd_ctx->hHal, hdd_ftm_mc_process_msg);
 
 	vStatus = wma_start(p_cds_context);
-	if (vStatus != CDF_STATUS_SUCCESS) {
+	if (vStatus != QDF_STATUS_SUCCESS) {
 		CDF_TRACE(CDF_MODULE_ID_CDF, CDF_TRACE_LEVEL_ERROR,
 			  "%s: Failed to start WMA", __func__);
 		goto err_status_failure;
@@ -856,7 +855,7 @@
 			if (wlan_hdd_ftm_testmode_cmd(pqcmbr_data->buf,
 						      pqcmbr_data->
 						      length)
-			    != CDF_STATUS_SUCCESS) {
+			    != QDF_STATUS_SUCCESS) {
 				ret = -EBUSY;
 			} else {
 				ret = 0;
@@ -1013,9 +1012,9 @@
  * @data: FTM testmode command
  * @len: length of @data
  *
- * Return: CDF_STATUS_SUCCESS on success, CDF_STATUS_E_* on error
+ * Return: QDF_STATUS_SUCCESS on success, CDF_STATUS_E_* on error
  */
-CDF_STATUS wlan_hdd_ftm_testmode_cmd(void *data, int len)
+QDF_STATUS wlan_hdd_ftm_testmode_cmd(void *data, int len)
 {
 	struct ar6k_testmode_cmd_data *cmd_data;
 
@@ -1025,7 +1024,7 @@
 	if (!cmd_data) {
 		CDF_TRACE(CDF_MODULE_ID_HDD, CDF_TRACE_LEVEL_ERROR,
 			  ("Failed to allocate FTM command data"));
-		return CDF_STATUS_E_NOMEM;
+		return QDF_STATUS_E_NOMEM;
 	}
 
 	cmd_data->data = cdf_mem_malloc(len);
@@ -1034,7 +1033,7 @@
 		CDF_TRACE(CDF_MODULE_ID_HDD, CDF_TRACE_LEVEL_ERROR,
 			  ("Failed to allocate FTM command data buffer"));
 		cdf_mem_free(cmd_data);
-		return CDF_STATUS_E_NOMEM;
+		return QDF_STATUS_E_NOMEM;
 	}
 
 	cmd_data->len = len;
@@ -1043,9 +1042,9 @@
 	if (wlan_ftm_postmsg((uint8_t *) cmd_data, sizeof(*cmd_data))) {
 		cdf_mem_free(cmd_data->data);
 		cdf_mem_free(cmd_data);
-		return CDF_STATUS_E_FAILURE;
+		return QDF_STATUS_E_FAILURE;
 	}
 
-	return CDF_STATUS_SUCCESS;
+	return QDF_STATUS_SUCCESS;
 }
 #endif /*QCA_WIFI_FTM */
diff --git a/core/hdd/src/wlan_hdd_green_ap.c b/core/hdd/src/wlan_hdd_green_ap.c
index fed68aa..c41e8f4 100644
--- a/core/hdd/src/wlan_hdd_green_ap.c
+++ b/core/hdd/src/wlan_hdd_green_ap.c
@@ -302,19 +302,19 @@
  * hdd_wlan_green_ap_attach() - Attach Green AP context to HDD context
  * @hdd_ctx: Global HDD contect
  *
- * Return: CDF_STATUS_SUCCESS on success, otherwise CDF_STATUS_E_* error
+ * Return: QDF_STATUS_SUCCESS on success, otherwise CDF_STATUS_E_* error
  */
-static CDF_STATUS hdd_wlan_green_ap_attach(struct hdd_context_s *hdd_ctx)
+static QDF_STATUS hdd_wlan_green_ap_attach(struct hdd_context_s *hdd_ctx)
 {
 	struct hdd_green_ap_ctx *green_ap;
-	CDF_STATUS status = CDF_STATUS_SUCCESS;
+	QDF_STATUS status = QDF_STATUS_SUCCESS;
 
 	ENTER();
 
 	green_ap = cdf_mem_malloc(sizeof(*green_ap));
 	if (!green_ap) {
 		hdd_alert("Memory allocation for Green-AP failed!");
-		status = CDF_STATUS_E_NOMEM;
+		status = QDF_STATUS_E_NOMEM;
 		goto error;
 	}
 
@@ -340,18 +340,18 @@
  * hdd_wlan_green_ap_deattach() - Detach Green AP context from HDD context
  * @hdd_ctx: Global HDD contect
  *
- * Return: CDF_STATUS_SUCCESS on success, otherwise CDF_STATUS_E_* error
+ * Return: QDF_STATUS_SUCCESS on success, otherwise CDF_STATUS_E_* error
  */
-static CDF_STATUS hdd_wlan_green_ap_deattach(struct hdd_context_s *hdd_ctx)
+static QDF_STATUS hdd_wlan_green_ap_deattach(struct hdd_context_s *hdd_ctx)
 {
 	struct hdd_green_ap_ctx *green_ap = hdd_ctx->green_ap_ctx;
-	CDF_STATUS status = CDF_STATUS_SUCCESS;
+	QDF_STATUS status = QDF_STATUS_SUCCESS;
 
 	ENTER();
 
 	if (green_ap == NULL) {
 		hdd_notice("Green-AP is not enabled");
-		status = CDF_STATUS_E_NOSUPPORT;
+		status = QDF_STATUS_E_NOSUPPORT;
 		goto done;
 	}
 
@@ -361,7 +361,7 @@
 		cdf_mc_timer_stop(&green_ap->ps_timer);
 
 	/* Destroy the Green AP timer */
-	if (!CDF_IS_STATUS_SUCCESS(cdf_mc_timer_destroy(&green_ap->ps_timer)))
+	if (!QDF_IS_STATUS_SUCCESS(cdf_mc_timer_destroy(&green_ap->ps_timer)))
 		hdd_notice("Cannot deallocate Green-AP's timer");
 
 	/* release memory */
@@ -383,7 +383,7 @@
  */
 void hdd_wlan_green_ap_init(struct hdd_context_s *hdd_ctx)
 {
-	if (!CDF_IS_STATUS_SUCCESS(hdd_wlan_green_ap_attach(hdd_ctx)))
+	if (!QDF_IS_STATUS_SUCCESS(hdd_wlan_green_ap_attach(hdd_ctx)))
 		hdd_err("Failed to allocate Green-AP resource");
 }
 
@@ -395,7 +395,7 @@
  */
 void hdd_wlan_green_ap_deinit(struct hdd_context_s *hdd_ctx)
 {
-	if (!CDF_IS_STATUS_SUCCESS(hdd_wlan_green_ap_deattach(hdd_ctx)))
+	if (!QDF_IS_STATUS_SUCCESS(hdd_wlan_green_ap_deattach(hdd_ctx)))
 		hdd_err("Cannot deallocate Green-AP resource");
 }
 
diff --git a/core/hdd/src/wlan_hdd_hostapd.c b/core/hdd/src/wlan_hdd_hostapd.c
index f10dcb8..85a6c92 100644
--- a/core/hdd/src/wlan_hdd_hostapd.c
+++ b/core/hdd/src/wlan_hdd_hostapd.c
@@ -376,10 +376,10 @@
 }
 
 #ifdef QCA_HT_2040_COEX
-CDF_STATUS hdd_set_sap_ht2040_mode(hdd_adapter_t *pHostapdAdapter,
+QDF_STATUS hdd_set_sap_ht2040_mode(hdd_adapter_t *pHostapdAdapter,
 				   uint8_t channel_type)
 {
-	CDF_STATUS cdf_ret_status = CDF_STATUS_E_FAILURE;
+	QDF_STATUS cdf_ret_status = QDF_STATUS_E_FAILURE;
 	void *hHal = NULL;
 
 	hddLog(LOGE, FL("change HT20/40 mode"));
@@ -388,17 +388,17 @@
 		hHal = WLAN_HDD_GET_HAL_CTX(pHostapdAdapter);
 		if (NULL == hHal) {
 			hddLog(LOGE, FL("Hal ctx is null"));
-			return CDF_STATUS_E_FAULT;
+			return QDF_STATUS_E_FAULT;
 		}
 		cdf_ret_status =
 			sme_set_ht2040_mode(hHal, pHostapdAdapter->sessionId,
 					channel_type, true);
-		if (cdf_ret_status == CDF_STATUS_E_FAILURE) {
+		if (cdf_ret_status == QDF_STATUS_E_FAILURE) {
 			hddLog(LOGE, FL("Failed to change HT20/40 mode"));
-			return CDF_STATUS_E_FAILURE;
+			return QDF_STATUS_E_FAILURE;
 		}
 	}
-	return CDF_STATUS_SUCCESS;
+	return QDF_STATUS_SUCCESS;
 }
 #endif
 
@@ -456,7 +456,7 @@
 	uint8_t we_custom_event[64];
 	union iwreq_data wrqu;
 #ifdef DISABLE_CONCURRENCY_AUTOSAVE
-	CDF_STATUS cdf_status;
+	QDF_STATUS qdf_status;
 	hdd_adapter_t *pHostapdAdapter;
 	hdd_ap_ctx_t *pHddApCtx;
 #endif /* DISABLE_CONCURRENCY_AUTOSAVE */
@@ -483,11 +483,11 @@
 		 */
 		pHostapdAdapter = netdev_priv(dev);
 		pHddApCtx = WLAN_HDD_GET_AP_CTX_PTR(pHostapdAdapter);
-		cdf_status =
+		qdf_status =
 			cdf_mc_timer_start(&pHddApCtx->hdd_ap_inactivity_timer,
 					(WLAN_HDD_GET_CTX(pHostapdAdapter))->
 					config->nAPAutoShutOff * 1000);
-		if (!CDF_IS_STATUS_SUCCESS(cdf_status)) {
+		if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
 			hddLog(LOGE, FL("Failed to init AP inactivity timer"));
 		}
 		EXIT();
@@ -532,7 +532,7 @@
 {
 	struct net_device *dev;
 	hdd_context_t *pHddCtx = NULL;
-	CDF_STATUS status = CDF_STATUS_SUCCESS;
+	QDF_STATUS status = QDF_STATUS_SUCCESS;
 	dev = (struct net_device *)usrDataForCallback;
 	ENTER();
 
@@ -552,7 +552,7 @@
 			wlansap_stop_bss((WLAN_HDD_GET_CTX(pHostapdAdapter))->
 					 pcds_context);
 #endif
-		if (CDF_IS_STATUS_SUCCESS(status))
+		if (QDF_IS_STATUS_SUCCESS(status))
 			hddLog(LOGE, FL("Deleting SAP/P2P link!!!!!!"));
 
 		clear_bit(SOFTAP_BSS_STARTED, &pHostapdAdapter->event_flags);
@@ -560,7 +560,7 @@
 					     pHostapdAdapter->sessionId);
 	}
 	EXIT();
-	return (status == CDF_STATUS_SUCCESS) ? 0 : -EBUSY;
+	return (status == QDF_STATUS_SUCCESS) ? 0 : -EBUSY;
 }
 
 /**
@@ -592,7 +592,7 @@
 		MTRACE(cdf_trace(CDF_MODULE_ID_HDD,
 				TRACE_CODE_HDD_ISSUE_JOIN_REQ,
 				sta_adapter->sessionId, roam_id));
-		if (CDF_STATUS_SUCCESS !=
+		if (QDF_STATUS_SUCCESS !=
 			sme_issue_stored_joinreq(hal_handle,
 				&roam_id,
 				sta_adapter->sessionId)) {
@@ -701,7 +701,7 @@
  * Return: Success on intimating userspace
  *
  */
-CDF_STATUS hdd_chan_change_notify(hdd_adapter_t *hostapd_adapter,
+QDF_STATUS hdd_chan_change_notify(hdd_adapter_t *hostapd_adapter,
 		struct net_device *dev,
 		uint8_t oper_chan)
 {
@@ -715,7 +715,7 @@
 
 	if (NULL == hal) {
 		hdd_err("hal is NULL");
-		return CDF_STATUS_E_FAILURE;
+		return QDF_STATUS_E_FAILURE;
 	}
 
 	freq = cds_chan_to_freq(oper_chan);
@@ -724,7 +724,7 @@
 
 	if (!chan) {
 		hdd_err("Invalid input frequency for channel conversion");
-		return CDF_STATUS_E_FAILURE;
+		return QDF_STATUS_E_FAILURE;
 	}
 
 	phy_mode = hdd_sap_get_phymode(hostapd_adapter);
@@ -766,7 +766,7 @@
 
 	cfg80211_ch_switch_notify(dev, &chandef);
 
-	return CDF_STATUS_SUCCESS;
+	return QDF_STATUS_SUCCESS;
 }
 
 /**
@@ -782,7 +782,7 @@
  * Return: Success on sending notifying userspace
  *
  */
-CDF_STATUS hdd_send_radar_event(hdd_context_t *hdd_context,
+QDF_STATUS hdd_send_radar_event(hdd_context_t *hdd_context,
 		eSapHddEvent event,
 		struct wlan_dfs_info dfs_info,
 		struct wireless_dev *wdev)
@@ -795,7 +795,7 @@
 
 	if (!hdd_context) {
 		hddLog(LOGE, FL("HDD context is NULL"));
-		return CDF_STATUS_E_FAILURE;
+		return QDF_STATUS_E_FAILURE;
 	}
 
 	freq = cds_chan_to_freq(dfs_info.channel);
@@ -817,7 +817,7 @@
 		data_size = sizeof(uint32_t);
 		break;
 	default:
-		return CDF_STATUS_E_FAILURE;
+		return QDF_STATUS_E_FAILURE;
 	}
 
 	vendor_event = cfg80211_vendor_event_alloc(hdd_context->wiphy,
@@ -828,7 +828,7 @@
 	if (!vendor_event) {
 		hddLog(LOGE,
 			FL("cfg80211_vendor_event_alloc failed for %d"), index);
-		return CDF_STATUS_E_FAILURE;
+		return QDF_STATUS_E_FAILURE;
 	}
 
 	ret = nla_put_u32(vendor_event, NL80211_ATTR_WIPHY_FREQ, freq);
@@ -836,14 +836,14 @@
 	if (ret) {
 		hddLog(LOGE, FL("NL80211_ATTR_WIPHY_FREQ put fail"));
 		kfree_skb(vendor_event);
-		return CDF_STATUS_E_FAILURE;
+		return QDF_STATUS_E_FAILURE;
 	}
 
 	cfg80211_vendor_event(vendor_event, GFP_KERNEL);
-	return CDF_STATUS_SUCCESS;
+	return QDF_STATUS_SUCCESS;
 }
 
-CDF_STATUS hdd_hostapd_sap_event_cb(tpSap_Event pSapEvent,
+QDF_STATUS hdd_hostapd_sap_event_cb(tpSap_Event pSapEvent,
 				    void *usrDataForCallback)
 {
 	hdd_adapter_t *pHostapdAdapter;
@@ -856,7 +856,6 @@
 	int we_event = 0;
 	int i = 0;
 	uint8_t staId;
-	CDF_STATUS cdf_status;
 	QDF_STATUS qdf_status;
 	bool bWPSState;
 	bool bAuthRequired = true;
@@ -873,7 +872,7 @@
 	struct wlan_dfs_info dfs_info;
 	uint8_t cc_len = WLAN_SVC_COUNTRY_CODE_LEN;
 	hdd_adapter_t *con_sap_adapter;
-	CDF_STATUS status = CDF_STATUS_SUCCESS;
+	QDF_STATUS status = QDF_STATUS_SUCCESS;
 #if defined CONFIG_CNSS
 	int ret = 0;
 #endif
@@ -881,7 +880,7 @@
 	dev = (struct net_device *)usrDataForCallback;
 	if (!dev) {
 		hddLog(LOGE, FL("usrDataForCallback is null"));
-		return CDF_STATUS_E_FAILURE;
+		return QDF_STATUS_E_FAILURE;
 	}
 
 	pHostapdAdapter = netdev_priv(dev);
@@ -889,7 +888,7 @@
 	if ((NULL == pHostapdAdapter) ||
 	    (WLAN_HDD_ADAPTER_MAGIC != pHostapdAdapter->magic)) {
 		hddLog(LOGE, "invalid adapter or adapter has invalid magic");
-		return CDF_STATUS_E_FAILURE;
+		return QDF_STATUS_E_FAILURE;
 	}
 
 	pHostapdState = WLAN_HDD_GET_HOSTAP_STATE_PTR(pHostapdAdapter);
@@ -897,7 +896,7 @@
 
 	if (!pSapEvent) {
 		hddLog(LOGE, FL("pSapEvent is null"));
-		return CDF_STATUS_E_FAILURE;
+		return QDF_STATUS_E_FAILURE;
 	}
 
 	sapEvent = pSapEvent->sapHddEventCode;
@@ -906,14 +905,14 @@
 
 	if (!pHddCtx) {
 		hddLog(LOGE, FL("HDD context is null"));
-		return CDF_STATUS_E_FAILURE;
+		return QDF_STATUS_E_FAILURE;
 	}
 
 	cfg = pHddCtx->config;
 
 	if (!cfg) {
 		hddLog(LOGE, FL("HDD config is null"));
-		return CDF_STATUS_E_FAILURE;
+		return QDF_STATUS_E_FAILURE;
 	}
 
 	dfs_info.channel = pHddApCtx->operatingChannel;
@@ -932,12 +931,12 @@
 		pHostapdAdapter->sessionId =
 			pSapEvent->sapevt.sapStartBssCompleteEvent.sessionId;
 
-		pHostapdState->cdf_status =
+		pHostapdState->qdf_status =
 			pSapEvent->sapevt.sapStartBssCompleteEvent.status;
 		qdf_status = qdf_event_set(&pHostapdState->cdf_event);
 
 		if (!QDF_IS_STATUS_SUCCESS(qdf_status)
-		    || pHostapdState->cdf_status) {
+		    || pHostapdState->qdf_status) {
 			hddLog(LOGE, ("ERROR: startbss event failed!!"));
 			goto stopbss;
 		} else {
@@ -951,12 +950,12 @@
 				hdd_softap_tx_resume_cb);
 
 			/* @@@ need wep logic here to set privacy bit */
-			cdf_status =
+			qdf_status =
 				hdd_softap_register_bc_sta(pHostapdAdapter,
 							   pHddApCtx->uPrivacy);
-			if (!CDF_IS_STATUS_SUCCESS(cdf_status)) {
+			if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
 				hddLog(LOGW, FL("Failed to register BC STA %d"),
-				       cdf_status);
+				       qdf_status);
 				hdd_stop_bss_link(pHostapdAdapter,
 						  usrDataForCallback);
 			}
@@ -978,23 +977,23 @@
 		    (WLAN_HDD_GET_CTX(pHostapdAdapter))->config->
 		     nAPAutoShutOff) {
 			/* AP Inactivity timer init and start */
-			cdf_status =
+			qdf_status =
 				cdf_mc_timer_init(&pHddApCtx->
 						  hdd_ap_inactivity_timer,
 						  CDF_TIMER_TYPE_SW,
 						  hdd_hostapd_inactivity_timer_cb,
 						  dev);
-			if (!CDF_IS_STATUS_SUCCESS(cdf_status))
+			if (!QDF_IS_STATUS_SUCCESS(qdf_status))
 				hddLog(LOGE,
 					FL("Failed to init inactivity timer"));
 
-			cdf_status =
+			qdf_status =
 				cdf_mc_timer_start(&pHddApCtx->
 						   hdd_ap_inactivity_timer,
 						   (WLAN_HDD_GET_CTX
 						    (pHostapdAdapter))->config->
 						    nAPAutoShutOff * 1000);
-			if (!CDF_IS_STATUS_SUCCESS(cdf_status))
+			if (!QDF_IS_STATUS_SUCCESS(qdf_status))
 				hddLog(LOGE,
 					FL("Failed to init inactivity timer"));
 
@@ -1024,7 +1023,7 @@
 				pcds_context,
 #endif
 				&pHddApCtx->groupKey);
-			if (!CDF_IS_STATUS_SUCCESS(status))
+			if (!QDF_IS_STATUS_SUCCESS(status))
 				hddLog(LOGE, FL("wlansap_set_key_sta failed"));
 		} else {
 			for (i = 0; i < CSR_MAX_NUM_KEY; i++) {
@@ -1041,7 +1040,7 @@
 #endif
 					&pHddApCtx->
 					wepKey[i]);
-				if (!CDF_IS_STATUS_SUCCESS(status)) {
+				if (!QDF_IS_STATUS_SUCCESS(status)) {
 					hddLog(LOGE,
 					       FL("set_key failed idx %d"), i);
 				}
@@ -1151,7 +1150,7 @@
 					    &dfs_info,
 					    sizeof(struct wlan_dfs_info));
 		pHddCtx->dev_dfs_cac_status = DFS_CAC_IN_PROGRESS;
-		if (CDF_STATUS_SUCCESS !=
+		if (QDF_STATUS_SUCCESS !=
 			hdd_send_radar_event(pHddCtx, eSAP_DFS_CAC_START,
 				dfs_info, &pHostapdAdapter->wdev)) {
 			hddLog(LOGE, FL("Unable to indicate CAC start NL event"));
@@ -1172,7 +1171,7 @@
 		 * space applications are waiting on CAC end for their state
 		 * management.
 		 */
-		if (CDF_STATUS_SUCCESS !=
+		if (QDF_STATUS_SUCCESS !=
 			hdd_send_radar_event(pHddCtx, eSAP_DFS_CAC_END,
 				dfs_info, &pHostapdAdapter->wdev)) {
 			hdd_err("Unable to indicate CAC end (interrupted) event");
@@ -1186,7 +1185,7 @@
 					    sizeof(struct wlan_dfs_info));
 		pHddApCtx->dfs_cac_block_tx = false;
 		pHddCtx->dev_dfs_cac_status = DFS_CAC_ALREADY_DONE;
-		if (CDF_STATUS_SUCCESS !=
+		if (QDF_STATUS_SUCCESS !=
 			hdd_send_radar_event(pHddCtx, eSAP_DFS_CAC_END,
 				dfs_info, &pHostapdAdapter->wdev)) {
 			hddLog(LOGE, FL("Unable to indicate CAC end NL event"));
@@ -1200,7 +1199,7 @@
 					    &dfs_info,
 					    sizeof(struct wlan_dfs_info));
 		pHddCtx->dev_dfs_cac_status = DFS_CAC_NEVER_DONE;
-		if (CDF_STATUS_SUCCESS !=
+		if (QDF_STATUS_SUCCESS !=
 			hdd_send_radar_event(pHddCtx, eSAP_DFS_RADAR_DETECT,
 				dfs_info, &pHostapdAdapter->wdev)) {
 			hddLog(LOGE, FL("Unable to indicate Radar detect NL event"));
@@ -1223,7 +1222,7 @@
 		hddLog(LOG1, FL("SET Key: configured status = %s"),
 		       pSapEvent->sapevt.sapStationSetKeyCompleteEvent.
 		       status ? "eSAP_STATUS_FAILURE" : "eSAP_STATUS_SUCCESS");
-		return CDF_STATUS_SUCCESS;
+		return QDF_STATUS_SUCCESS;
 	case eSAP_STA_MIC_FAILURE_EVENT:
 	{
 		memset(&msg, '\0', sizeof(msg));
@@ -1288,7 +1287,7 @@
 		}
 
 		if (bAuthRequired || bWPSState == true) {
-			cdf_status = hdd_softap_register_sta(
+			qdf_status = hdd_softap_register_sta(
 						pHostapdAdapter,
 						true,
 						pHddApCtx->uPrivacy,
@@ -1300,13 +1299,13 @@
 						pSapEvent->sapevt.
 						sapStationAssocReassocCompleteEvent.
 						wmmEnabled);
-			if (!CDF_IS_STATUS_SUCCESS(cdf_status))
+			if (!QDF_IS_STATUS_SUCCESS(qdf_status))
 				hddLog(LOGW,
 				       FL("Failed to register STA %d "
-					  MAC_ADDRESS_STR ""), cdf_status,
+					  MAC_ADDRESS_STR ""), qdf_status,
 				       MAC_ADDR_ARRAY(wrqu.addr.sa_data));
 		} else {
-			cdf_status = hdd_softap_register_sta(
+			qdf_status = hdd_softap_register_sta(
 						pHostapdAdapter,
 						false,
 						pHddApCtx->uPrivacy,
@@ -1318,16 +1317,16 @@
 						pSapEvent->sapevt.
 						sapStationAssocReassocCompleteEvent.
 						wmmEnabled);
-			if (!CDF_IS_STATUS_SUCCESS(cdf_status))
+			if (!QDF_IS_STATUS_SUCCESS(qdf_status))
 				hddLog(LOGW,
 				       FL("Failed to register STA %d "
-					  MAC_ADDRESS_STR ""), cdf_status,
+					  MAC_ADDRESS_STR ""), qdf_status,
 				       MAC_ADDR_ARRAY(wrqu.addr.sa_data));
 		}
 
 		staId =
 		   pSapEvent->sapevt.sapStationAssocReassocCompleteEvent.staId;
-		if (CDF_IS_STATUS_SUCCESS(cdf_status)) {
+		if (QDF_IS_STATUS_SUCCESS(qdf_status)) {
 			pHostapdAdapter->aStaInfo[staId].nss =
 				pSapEvent->sapevt.
 				sapStationAssocReassocCompleteEvent.
@@ -1376,10 +1375,10 @@
 		/* Stop AP inactivity timer */
 		if (pHddApCtx->hdd_ap_inactivity_timer.state ==
 		    CDF_TIMER_STATE_RUNNING) {
-			cdf_status =
+			qdf_status =
 				cdf_mc_timer_stop(&pHddApCtx->
 						  hdd_ap_inactivity_timer);
-			if (!CDF_IS_STATUS_SUCCESS(cdf_status)) {
+			if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
 				hddLog(LOGE,
 				       FL("Failed to start inactivity timer"));
 			}
@@ -1454,14 +1453,14 @@
 		else
 			hddLog(LOG1, " MAC initiated disassociation");
 		we_event = IWEVEXPIRED;
-		cdf_status =
+		qdf_status =
 			hdd_softap_get_sta_id(pHostapdAdapter,
 					      &pSapEvent->sapevt.
 					      sapStationDisassocCompleteEvent.staMac,
 					      &staId);
-		if (!CDF_IS_STATUS_SUCCESS(cdf_status)) {
+		if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
 			hddLog(LOGE, FL("ERROR: HDD Failed to find sta id!!"));
-			return CDF_STATUS_E_FAILURE;
+			return QDF_STATUS_E_FAILURE;
 		}
 #ifdef IPA_OFFLOAD
 		if (hdd_ipa_is_enabled(pHddCtx)) {
@@ -1506,7 +1505,7 @@
 			if (pHddApCtx->bApActive == false) {
 				if (pHddApCtx->hdd_ap_inactivity_timer.state ==
 				    CDF_TIMER_STATE_STOPPED) {
-					cdf_status =
+					qdf_status =
 						cdf_mc_timer_start(&pHddApCtx->
 								   hdd_ap_inactivity_timer,
 								   (WLAN_HDD_GET_CTX
@@ -1514,7 +1513,7 @@
 								   config->
 								   nAPAutoShutOff *
 								   1000);
-					if (!CDF_IS_STATUS_SUCCESS(cdf_status))
+					if (!QDF_IS_STATUS_SUCCESS(qdf_status))
 						hddLog(LOGE,
 						       FL("Failed to init AP inactivity timer"));
 				} else
@@ -1535,10 +1534,10 @@
 				 bytes[0], GFP_KERNEL);
 
 		/* Update the beacon Interval if it is P2P GO */
-		cdf_status = cds_change_mcc_go_beacon_interval(pHostapdAdapter);
-		if (CDF_STATUS_SUCCESS != cdf_status) {
+		qdf_status = cds_change_mcc_go_beacon_interval(pHostapdAdapter);
+		if (QDF_STATUS_SUCCESS != qdf_status) {
 			hddLog(LOGE, FL("failed to update Beacon interval %d"),
-				cdf_status);
+				qdf_status);
 		}
 		if (pHostapdAdapter->device_mode == WLAN_HDD_P2P_GO) {
 			/* send peer status indication to oem app */
@@ -1589,7 +1588,7 @@
 		wireless_send_event(dev, IWEVCUSTOM, &wreq,
 				    (char *)message);
 
-		return CDF_STATUS_SUCCESS;
+		return QDF_STATUS_SUCCESS;
 	}
 	case eSAP_ASSOC_STA_CALLBACK_EVENT:
 		pAssocStasArray =
@@ -1611,17 +1610,17 @@
 		}
 		cdf_mem_free(pSapEvent->sapevt.sapAssocStaListEvent.pAssocStas);        /* Release caller allocated memory here */
 		pSapEvent->sapevt.sapAssocStaListEvent.pAssocStas = NULL;
-		return CDF_STATUS_SUCCESS;
+		return QDF_STATUS_SUCCESS;
 	case eSAP_REMAIN_CHAN_READY:
 		hdd_remain_chan_ready_handler(pHostapdAdapter,
 			pSapEvent->sapevt.sap_roc_ind.scan_id);
-		return CDF_STATUS_SUCCESS;
+		return QDF_STATUS_SUCCESS;
 	case eSAP_SEND_ACTION_CNF:
 		hdd_send_action_cnf(pHostapdAdapter,
 				    (eSAP_STATUS_SUCCESS ==
 				     pSapEvent->sapevt.sapActionCnf.
 				     actionSendSuccess) ? true : false);
-		return CDF_STATUS_SUCCESS;
+		return QDF_STATUS_SUCCESS;
 	case eSAP_UNKNOWN_STA_JOIN:
 		snprintf(unknownSTAEvent, IW_CUSTOM_MAX,
 			 "JOIN_UNKNOWN_STA-%02x:%02x:%02x:%02x:%02x:%02x",
@@ -1657,21 +1656,21 @@
 		hddLog(LOG1, "%s", maxAssocExceededEvent);
 		break;
 	case eSAP_STA_ASSOC_IND:
-		return CDF_STATUS_SUCCESS;
+		return QDF_STATUS_SUCCESS;
 
 	case eSAP_DISCONNECT_ALL_P2P_CLIENT:
 		hddLog(LOG1, FL(" Disconnecting all the P2P Clients...."));
 		hdd_clear_all_sta(pHostapdAdapter, usrDataForCallback);
-		return CDF_STATUS_SUCCESS;
+		return QDF_STATUS_SUCCESS;
 
 	case eSAP_MAC_TRIG_STOP_BSS_EVENT:
-		cdf_status =
+		qdf_status =
 			hdd_stop_bss_link(pHostapdAdapter, usrDataForCallback);
-		if (!CDF_IS_STATUS_SUCCESS(cdf_status)) {
+		if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
 			hddLog(LOGW, FL("hdd_stop_bss_link failed %d"),
-			       cdf_status);
+			       qdf_status);
 		}
-		return CDF_STATUS_SUCCESS;
+		return QDF_STATUS_SUCCESS;
 
 	case eSAP_CHANNEL_CHANGE_EVENT:
 		hddLog(LOG1, FL("Received eSAP_CHANNEL_CHANGE_EVENT event"));
@@ -1706,7 +1705,7 @@
 		 */
 		if (pHostapdAdapter->device_mode == WLAN_HDD_SOFTAP &&
 						pHddCtx->config->force_sap_acs)
-			return CDF_STATUS_SUCCESS;
+			return QDF_STATUS_SUCCESS;
 		else
 			return hdd_chan_change_notify(pHostapdAdapter, dev,
 				   pSapEvent->sapevt.sap_ch_selected.pri_ch);
@@ -1717,13 +1716,13 @@
 		hddLog(LOG1, FL("Reusing Last ACS scan result for %d sec"),
 		       ACS_SCAN_EXPIRY_TIMEOUT_S);
 		cdf_mc_timer_stop(&pHddCtx->skip_acs_scan_timer);
-		cdf_status = cdf_mc_timer_start(&pHddCtx->skip_acs_scan_timer,
+		qdf_status = cdf_mc_timer_start(&pHddCtx->skip_acs_scan_timer,
 						ACS_SCAN_EXPIRY_TIMEOUT_S *
 						1000);
-		if (!CDF_IS_STATUS_SUCCESS(cdf_status))
+		if (!QDF_IS_STATUS_SUCCESS(qdf_status))
 			hddLog(LOGE,
 			       FL("Failed to start ACS scan expiry timer"));
-		return CDF_STATUS_SUCCESS;
+		return QDF_STATUS_SUCCESS;
 #endif
 
 	case eSAP_DFS_NOL_GET:
@@ -1740,14 +1739,14 @@
 		if (ret > 0) {
 			hddLog(LOG2,
 				FL("Get %d bytes of dfs nol from cnss"), ret);
-			return CDF_STATUS_SUCCESS;
+			return QDF_STATUS_SUCCESS;
 		} else {
 			hddLog(LOG2,
 				FL("No dfs nol entry in CNSS, ret: %d"), ret);
-			return CDF_STATUS_E_FAULT;
+			return QDF_STATUS_E_FAULT;
 		}
 #else
-		return CDF_STATUS_E_FAILURE;
+		return QDF_STATUS_E_FAILURE;
 #endif
 	case eSAP_DFS_NOL_SET:
 		hddLog(LOG1, FL("Received eSAP_DFS_NOL_SET event"));
@@ -1768,9 +1767,9 @@
 			       pSapEvent->sapevt.sapDfsNolInfo.sDfsList);
 		}
 #else
-		return CDF_STATUS_E_FAILURE;
+		return QDF_STATUS_E_FAILURE;
 #endif
-		return CDF_STATUS_SUCCESS;
+		return QDF_STATUS_SUCCESS;
 	case eSAP_ACS_CHANNEL_SELECTED:
 		hddLog(LOG1, FL("ACS Completed for wlan%d"),
 					pHostapdAdapter->dev->ifindex);
@@ -1789,7 +1788,7 @@
 		/* send vendor event to hostapd only for hostapd based acs*/
 		if (!pHddCtx->config->force_sap_acs)
 			wlan_hdd_cfg80211_acs_ch_select_evt(pHostapdAdapter);
-		return CDF_STATUS_SUCCESS;
+		return QDF_STATUS_SUCCESS;
 	case eSAP_ECSA_CHANGE_CHAN_IND:
 		hddLog(LOG1,
 		  FL("Channel change indication from peer for channel %d"),
@@ -1797,18 +1796,18 @@
 		if (hdd_softap_set_channel_change(dev,
 			 pSapEvent->sapevt.sap_chan_cng_ind.new_chan,
 			 CH_WIDTH_MAX))
-			return CDF_STATUS_E_FAILURE;
+			return QDF_STATUS_E_FAILURE;
 		else
-			return CDF_STATUS_SUCCESS;
+			return QDF_STATUS_SUCCESS;
 
 	default:
 		hddLog(LOG1, "SAP message is not handled");
 		goto stopbss;
-		return CDF_STATUS_SUCCESS;
+		return QDF_STATUS_SUCCESS;
 	}
 	wireless_send_event(dev, we_event, &wrqu,
 			    (char *)we_custom_event_generic);
-	return CDF_STATUS_SUCCESS;
+	return QDF_STATUS_SUCCESS;
 
 stopbss:
 	{
@@ -1829,19 +1828,19 @@
 		    nAPAutoShutOff) {
 			if (CDF_TIMER_STATE_RUNNING ==
 			    pHddApCtx->hdd_ap_inactivity_timer.state) {
-				cdf_status =
+				qdf_status =
 					cdf_mc_timer_stop(&pHddApCtx->
 							  hdd_ap_inactivity_timer);
-				if (!CDF_IS_STATUS_SUCCESS(cdf_status)) {
+				if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
 					hddLog(LOGE,
 					       FL("Failed to stop AP inactivity timer"));
 				}
 			}
 
-			cdf_status =
+			qdf_status =
 				cdf_mc_timer_destroy(&pHddApCtx->
 						hdd_ap_inactivity_timer);
-			if (!CDF_IS_STATUS_SUCCESS(cdf_status))
+			if (!QDF_IS_STATUS_SUCCESS(qdf_status))
 				hddLog(LOGE, FL("Failed to Destroy AP inactivity timer"));
 		}
 #ifdef FEATURE_WLAN_AUTO_SHUTDOWN
@@ -1853,11 +1852,11 @@
 		hdd_hostapd_stop(dev);
 
 		/* reclaim all resources allocated to the BSS */
-		cdf_status = hdd_softap_stop_bss(pHostapdAdapter);
-		if (!CDF_IS_STATUS_SUCCESS(cdf_status)) {
+		qdf_status = hdd_softap_stop_bss(pHostapdAdapter);
+		if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
 			hddLog(LOGW,
 			       FL("hdd_softap_stop_bss failed %d"),
-			       cdf_status);
+			       qdf_status);
 		}
 
 		/* once the event is set, structure dev/pHostapdAdapter should
@@ -1879,7 +1878,7 @@
 		/* Send SCC/MCC Switching event to IPA */
 		hdd_ipa_send_mcc_scc_msg(pHddCtx, pHddCtx->mcc_mode);
 	}
-	return CDF_STATUS_SUCCESS;
+	return QDF_STATUS_SUCCESS;
 }
 
 int hdd_softap_unpack_ie(tHalHandle halHandle,
@@ -1910,7 +1909,7 @@
 		/* Validity checks */
 		if ((gen_ie_len < DOT11F_IE_RSN_MIN_LEN) ||
 		    (gen_ie_len > DOT11F_IE_RSN_MAX_LEN)) {
-			return CDF_STATUS_E_FAILURE;
+			return QDF_STATUS_E_FAILURE;
 		}
 		/* Skip past the EID byte and length byte */
 		pRsnIe = gen_ie + 2;
@@ -1946,7 +1945,7 @@
 		/* Validity checks */
 		if ((gen_ie_len < DOT11F_IE_WPA_MIN_LEN) ||
 		    (gen_ie_len > DOT11F_IE_WPA_MAX_LEN)) {
-			return CDF_STATUS_E_FAILURE;
+			return QDF_STATUS_E_FAILURE;
 		}
 		/* Skip past the EID byte and length byte - and four byte WiFi OUI */
 		pRsnIe = gen_ie + 2 + 4;
@@ -1976,9 +1975,9 @@
 		*pMFPRequired = false;
 	} else {
 		hddLog(LOGW, FL("gen_ie[0]: %d"), gen_ie[0]);
-		return CDF_STATUS_E_FAILURE;
+		return QDF_STATUS_E_FAILURE;
 	}
-	return CDF_STATUS_SUCCESS;
+	return QDF_STATUS_SUCCESS;
 }
 
 /**
@@ -1996,7 +1995,7 @@
 int hdd_softap_set_channel_change(struct net_device *dev, int target_channel,
 				 phy_ch_width target_bw)
 {
-	CDF_STATUS status;
+	QDF_STATUS status;
 	int ret = 0;
 	hdd_adapter_t *pHostapdAdapter = (netdev_priv(dev));
 	hdd_context_t *pHddCtx = NULL;
@@ -2068,7 +2067,7 @@
 		target_channel,
 		target_bw);
 
-	if (CDF_STATUS_SUCCESS != status) {
+	if (QDF_STATUS_SUCCESS != status) {
 		hddLog(LOGE,
 		       FL("SAP set channel failed for channel = %d, bw:%d"),
 		       target_channel, target_bw);
@@ -2092,7 +2091,7 @@
 			       struct iw_request_info *info,
 			       union iwreq_data *wrqu, char *extra)
 {
-	CDF_STATUS vstatus;
+	QDF_STATUS vstatus;
 	int ret = 0;            /* success */
 	hdd_adapter_t *pAdapter = (netdev_priv(dev));
 	hdd_context_t *pHddCtx;
@@ -2112,7 +2111,7 @@
 	hddLog(LOG1, FL("Received data %s"), extra);
 
 	vstatus = hdd_execute_global_config_command(pHddCtx, extra);
-	if (CDF_STATUS_SUCCESS != vstatus) {
+	if (QDF_STATUS_SUCCESS != vstatus) {
 		ret = -EINVAL;
 	}
 
@@ -2258,7 +2257,7 @@
 	return;
 }
 
-static CDF_STATUS hdd_print_acl(hdd_adapter_t *pHostapdAdapter)
+static QDF_STATUS hdd_print_acl(hdd_adapter_t *pHostapdAdapter)
 {
 	eSapMacAddrACL acl_mode;
 	struct cdf_mac_addr MacList[MAX_ACL_MAC_ADDRESS];
@@ -2271,7 +2270,7 @@
 	p_cds_gctx = (WLAN_HDD_GET_CTX(pHostapdAdapter))->pcds_context;
 #endif
 	cdf_mem_zero(&MacList[0], sizeof(MacList));
-	if (CDF_STATUS_SUCCESS == wlansap_get_acl_mode(p_cds_gctx, &acl_mode)) {
+	if (QDF_STATUS_SUCCESS == wlansap_get_acl_mode(p_cds_gctx, &acl_mode)) {
 		pr_info("******** ACL MODE *********\n");
 		switch (acl_mode) {
 		case eSAP_ACCEPT_UNLESS_DENIED:
@@ -2288,32 +2287,32 @@
 			break;
 		default:
 			pr_info("Invalid SAP ACL Mode = %d\n", acl_mode);
-			return CDF_STATUS_E_FAILURE;
+			return QDF_STATUS_E_FAILURE;
 		}
 	} else {
-		return CDF_STATUS_E_FAILURE;
+		return QDF_STATUS_E_FAILURE;
 	}
 
-	if (CDF_STATUS_SUCCESS == wlansap_get_acl_accept_list(p_cds_gctx,
+	if (QDF_STATUS_SUCCESS == wlansap_get_acl_accept_list(p_cds_gctx,
 							      &MacList[0],
 							      &listnum)) {
 		pr_info("******* WHITE LIST ***********\n");
 		if (listnum <= MAX_ACL_MAC_ADDRESS)
 			print_mac_list(&MacList[0], listnum);
 	} else {
-		return CDF_STATUS_E_FAILURE;
+		return QDF_STATUS_E_FAILURE;
 	}
 
-	if (CDF_STATUS_SUCCESS == wlansap_get_acl_deny_list(p_cds_gctx,
+	if (QDF_STATUS_SUCCESS == wlansap_get_acl_deny_list(p_cds_gctx,
 							    &MacList[0],
 							    &listnum)) {
 		pr_info("******* BLACK LIST ***********\n");
 		if (listnum <= MAX_ACL_MAC_ADDRESS)
 			print_mac_list(&MacList[0], listnum);
 	} else {
-		return CDF_STATUS_E_FAILURE;
+		return QDF_STATUS_E_FAILURE;
 	}
-	return CDF_STATUS_SUCCESS;
+	return QDF_STATUS_SUCCESS;
 }
 
 int
@@ -2326,7 +2325,7 @@
 	int *value = (int *)extra;
 	int sub_cmd = value[0];
 	int set_value = value[1];
-	CDF_STATUS status;
+	QDF_STATUS status;
 	int ret = 0;            /* success */
 	v_CONTEXT_t p_cds_context;
 	hdd_context_t *hdd_ctx;
@@ -2358,7 +2357,7 @@
 		break;
 
 	case QCSAP_PARAM_CLR_ACL:
-		if (CDF_STATUS_SUCCESS != wlansap_clear_acl(
+		if (QDF_STATUS_SUCCESS != wlansap_clear_acl(
 #ifdef WLAN_FEATURE_MBSSID
 			    WLAN_HDD_GET_SAP_CTX_PTR
 				    (pHostapdAdapter)
@@ -2427,7 +2426,7 @@
 			}
 			status = sme_cfg_set_int(hHal, WNI_CFG_ASSOC_STA_LIMIT,
 					set_value);
-			if (status != CDF_STATUS_SUCCESS) {
+			if (status != QDF_STATUS_SUCCESS) {
 				hddLog(LOGE,
 				       FL("setMaxAssoc failure, status %d"),
 				       status);
@@ -2438,11 +2437,11 @@
 
 	case QCSAP_PARAM_HIDE_SSID:
 	{
-		CDF_STATUS status = CDF_STATUS_SUCCESS;
+		QDF_STATUS status = QDF_STATUS_SUCCESS;
 		status =
 			sme_hide_ssid(hHal, pHostapdAdapter->sessionId,
 				      set_value);
-		if (CDF_STATUS_SUCCESS != status) {
+		if (QDF_STATUS_SUCCESS != status) {
 			hddLog(LOGE, FL("QCSAP_PARAM_HIDE_SSID failed"));
 			return status;
 		}
@@ -2463,7 +2462,7 @@
 		rateUpdate.mcastDataRate5GHz = set_value;
 		rateUpdate.bcastDataRate = -1;
 		status = sme_send_rate_update_ind(hHal, &rateUpdate);
-		if (CDF_STATUS_SUCCESS != status) {
+		if (QDF_STATUS_SUCCESS != status) {
 			hddLog(LOGE, FL("SET_MC_RATE failed"));
 			ret = -1;
 		}
@@ -2990,7 +2989,7 @@
 	tHalHandle hHal = WLAN_HDD_GET_HAL_CTX(pHostapdAdapter);
 	int *value = (int *)extra;
 	int sub_cmd = value[0];
-	CDF_STATUS status;
+	QDF_STATUS status;
 	int ret;
 	hdd_context_t *hdd_ctx;
 
@@ -3006,7 +3005,7 @@
 		status =
 			sme_cfg_get_int(hHal, WNI_CFG_ASSOC_STA_LIMIT,
 					(uint32_t *) value);
-		if (CDF_STATUS_SUCCESS != status) {
+		if (QDF_STATUS_SUCCESS != status) {
 			hddLog(LOGE,
 			       FL("failed to get WNI_CFG_ASSOC_STA_LIMIT from cfg %d"),
 			       status);
@@ -3132,7 +3131,7 @@
 	{
 		hddLog(LOG1, FL("QCSAP_GET_ACL"));
 		if (hdd_print_acl(pHostapdAdapter) !=
-		    CDF_STATUS_SUCCESS) {
+		    QDF_STATUS_SUCCESS) {
 			hddLog(LOGE,
 			       FL
 			       ("QCSAP_GET_ACL returned Error: not completed"));
@@ -3236,7 +3235,7 @@
 	uint8_t pPeerStaMac[CDF_MAC_ADDR_SIZE];
 	int listType, cmd, i;
 	int ret;
-	CDF_STATUS cdf_status = CDF_STATUS_SUCCESS;
+	QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
 	hdd_context_t *hdd_ctx;
 
 	ENTER();
@@ -3266,16 +3265,16 @@
 	       MAC_ADDR_ARRAY(pPeerStaMac), listType, cmd);
 
 #ifdef WLAN_FEATURE_MBSSID
-	cdf_status =
+	qdf_status =
 		wlansap_modify_acl(WLAN_HDD_GET_SAP_CTX_PTR(pHostapdAdapter),
 				   pPeerStaMac, (eSapACLType) listType,
 				   (eSapACLCmdType) cmd);
 #else
-	cdf_status =
+	qdf_status =
 		wlansap_modify_acl(p_cds_context, pPeerStaMac,
 				   (eSapACLType) listType, (eSapACLCmdType) cmd);
 #endif
-	if (!CDF_IS_STATUS_SUCCESS(cdf_status)) {
+	if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
 		hddLog(LOGE, FL("Modify ACL failed"));
 		ret = -EIO;
 	}
@@ -3365,7 +3364,7 @@
 	cdf_copy_macaddr(&selfMac, &pHostapdAdapter->macAddressCurrent);
 
 	set_value = value[0];
-	if (CDF_STATUS_SUCCESS !=
+	if (QDF_STATUS_SUCCESS !=
 	    sme_set_max_tx_power(hHal, bssid, selfMac, set_value)) {
 		hddLog(LOGE, FL("Setting maximum tx power failed"));
 		return -EIO;
@@ -3414,7 +3413,7 @@
 	cdf_copy_macaddr(&bssid, &pHostapdAdapter->macAddressCurrent);
 
 	set_value = value[0];
-	if (CDF_STATUS_SUCCESS !=
+	if (QDF_STATUS_SUCCESS !=
 	    sme_set_tx_power(hHal, pHostapdAdapter->sessionId, bssid,
 			     pHostapdAdapter->device_mode, set_value)) {
 		hddLog(LOGE, FL("Setting tx power failed"));
@@ -3661,9 +3660,9 @@
 	}
 
 	if (wlan_hdd_validate_operation_channel(adapter, value[0]) !=
-					 CDF_STATUS_SUCCESS ||
+					 QDF_STATUS_SUCCESS ||
 		wlan_hdd_validate_operation_channel(adapter, value[1]) !=
-					 CDF_STATUS_SUCCESS) {
+					 QDF_STATUS_SUCCESS) {
 		return -EINVAL;
 	} else {
 		hdd_ctx->config->force_sap_acs_st_ch = value[0];
@@ -3704,7 +3703,7 @@
 	if (0 != ret)
 		return ret;
 
-	if (CDF_STATUS_SUCCESS != sme_get_freq_band(hHal, &curBand)) {
+	if (QDF_STATUS_SUCCESS != sme_get_freq_band(hHal, &curBand)) {
 		hddLog(LOGE, FL("not able get the current frequency band"));
 		return -EIO;
 	}
@@ -3767,7 +3766,7 @@
 #ifndef WLAN_FEATURE_MBSSID
 	v_CONTEXT_t cds_ctx;
 #endif
-	CDF_STATUS status;
+	QDF_STATUS status;
 	uint32_t length = DOT11F_IE_RSN_MAX_LEN;
 	uint8_t genIeBytes[DOT11F_IE_RSN_MAX_LEN];
 
@@ -3799,7 +3798,7 @@
 		cds_ctx,
 #endif
 		&length, genIeBytes);
-	if (status == CDF_STATUS_SUCCESS) {
+	if (status == QDF_STATUS_SUCCESS) {
 		length = CDF_MIN(length, DOT11F_IE_RSN_MAX_LEN);
 		if (wrqu->data.length < length ||
 		copy_to_user(wrqu->data.pointer, (void *)genIeBytes, length)) {
@@ -3993,7 +3992,7 @@
 	hdd_ap_ctx_t *pHddApCtx = WLAN_HDD_GET_AP_CTX_PTR(pHostapdAdapter);
 	hdd_context_t *hdd_ctx;
 	int ret;
-	CDF_STATUS vstatus;
+	QDF_STATUS vstatus;
 	struct iw_encode_ext *ext = (struct iw_encode_ext *)extra;
 	int key_index;
 	struct iw_point *encoding = &wrqu->encoding;
@@ -4123,7 +4122,7 @@
 	vstatus = wlansap_set_key_sta(cds_ctx, &setKey);
 #endif
 
-	if (vstatus != CDF_STATUS_SUCCESS) {
+	if (vstatus != QDF_STATUS_SUCCESS) {
 		hddLog(LOGE, FL("wlansap_set_key_sta failed, status= %d"),
 		       vstatus);
 		ret = -EINVAL;
@@ -4330,7 +4329,7 @@
 
 	if (pHostapdState->bssState == BSS_STOP) {
 		if (sme_cfg_get_int(hHal, WNI_CFG_CURRENT_CHANNEL, &channel)
-		    != CDF_STATUS_SUCCESS) {
+		    != QDF_STATUS_SUCCESS) {
 			return -EIO;
 		} else {
 			status = hdd_wlan_get_freq(channel, &freq);
@@ -4442,7 +4441,7 @@
 	v_CONTEXT_t cds_ctx;
 #endif
 	hdd_hostapd_state_t *pHostapdState;
-	CDF_STATUS cdf_ret_status = CDF_STATUS_SUCCESS;
+	QDF_STATUS cdf_ret_status = QDF_STATUS_SUCCESS;
 	uint8_t *wps_genie;
 	uint8_t *fwps_genie;
 	uint8_t *pos;
@@ -5035,7 +5034,7 @@
 		    union iwreq_data *wrqu, char *extra)
 {
 	hdd_adapter_t *pHostapdAdapter = (netdev_priv(dev));
-	CDF_STATUS status = CDF_STATUS_SUCCESS;
+	QDF_STATUS status = QDF_STATUS_SUCCESS;
 	QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
 	hdd_context_t *hdd_ctx;
 
@@ -5059,7 +5058,7 @@
 			wlansap_stop_bss((WLAN_HDD_GET_CTX(pHostapdAdapter))->
 					 pcds_context);
 #endif
-		if (CDF_IS_STATUS_SUCCESS(status)) {
+		if (QDF_IS_STATUS_SUCCESS(status)) {
 			qdf_status =
 				qdf_wait_single_event(&pHostapdState->
 						      cdf_stop_bss_event,
@@ -5076,7 +5075,7 @@
 					     pHostapdAdapter->sessionId);
 	}
 	EXIT();
-	return (status == CDF_STATUS_SUCCESS) ? 0 : -EBUSY;
+	return (status == QDF_STATUS_SUCCESS) ? 0 : -EBUSY;
 }
 
 static int iw_softap_stopbss(struct net_device *dev,
@@ -5129,7 +5128,7 @@
 }
 
 static
-CDF_STATUS hdd_softap_get_sta_info(hdd_adapter_t *pAdapter, uint8_t *pBuf,
+QDF_STATUS hdd_softap_get_sta_info(hdd_adapter_t *pAdapter, uint8_t *pBuf,
 				   int buf_len) {
 	uint8_t i;
 	uint8_t maxSta = 0;
@@ -5147,7 +5146,7 @@
 
 	hdd_ctx = WLAN_HDD_GET_CTX(pAdapter);
 	if (0 != wlan_hdd_validate_context(hdd_ctx))
-		return CDF_STATUS_E_FAULT;
+		return QDF_STATUS_E_FAULT;
 
 	len = scnprintf(pBuf, buf_len, sta_info_header);
 	pBuf += len;
@@ -5176,7 +5175,7 @@
 		}
 	}
 	EXIT();
-	return CDF_STATUS_SUCCESS;
+	return QDF_STATUS_SUCCESS;
 }
 
 static int __iw_softap_get_sta_info(struct net_device *dev,
@@ -5184,7 +5183,7 @@
 				    union iwreq_data *wrqu, char *extra)
 {
 	hdd_adapter_t *pHostapdAdapter = netdev_priv(dev);
-	CDF_STATUS status;
+	QDF_STATUS status;
 	hdd_context_t *hdd_ctx;
 	int ret;
 
@@ -5199,7 +5198,7 @@
 		hdd_softap_get_sta_info(pHostapdAdapter, extra,
 					WE_SAP_MAX_STA_INFO);
 
-	if (!CDF_IS_STATUS_SUCCESS(status)) {
+	if (!QDF_IS_STATUS_SUCCESS(status)) {
 		hddLog(LOGE, FL("Failed to get sta info: %d"), status);
 		return -EINVAL;
 	}
@@ -5241,7 +5240,7 @@
 	v_CONTEXT_t cds_ctx;
 #endif
 	hdd_context_t *hdd_ctx;
-	CDF_STATUS cdf_ret_status = CDF_STATUS_SUCCESS;
+	QDF_STATUS cdf_ret_status = QDF_STATUS_SUCCESS;
 	uint8_t *genie = (uint8_t *)extra;
 	int ret;
 
@@ -5332,7 +5331,7 @@
 	int len = sizeof(uint32_t) + 1;
 	struct cdf_mac_addr macAddress;
 	char pmacAddress[MAC_ADDRESS_STR_LEN + 1];
-	CDF_STATUS status = CDF_STATUS_E_FAILURE;
+	QDF_STATUS status = QDF_STATUS_E_FAILURE;
 	int rc, valid, i;
 
 	ENTER();
@@ -5360,7 +5359,7 @@
 	/* If no mac address is passed and/or its length is less than 17,
 	 * link speed for first connected client will be returned.
 	 */
-	if (wrqu->data.length < 17 || !CDF_IS_STATUS_SUCCESS(status)) {
+	if (wrqu->data.length < 17 || !QDF_IS_STATUS_SUCCESS(status)) {
 		for (i = 0; i < WLAN_MAX_STA_COUNT; i++) {
 			if (pHostapdAdapter->aStaInfo[i].isUsed &&
 			    (!cdf_is_macaddr_broadcast
@@ -5369,18 +5368,18 @@
 					&macAddress,
 					&pHostapdAdapter->aStaInfo[i].
 					 macAddrSTA);
-				status = CDF_STATUS_SUCCESS;
+				status = QDF_STATUS_SUCCESS;
 				break;
 			}
 		}
 	}
-	if (!CDF_IS_STATUS_SUCCESS(status)) {
+	if (!QDF_IS_STATUS_SUCCESS(status)) {
 		hddLog(LOGE, FL("Invalid peer macaddress"));
 		return -EINVAL;
 	}
 	status = wlan_hdd_get_linkspeed_for_peermac(pHostapdAdapter,
 						    macAddress);
-	if (!CDF_IS_STATUS_SUCCESS(status)) {
+	if (!QDF_IS_STATUS_SUCCESS(status)) {
 		hddLog(LOGE, FL("Unable to retrieve SME linkspeed"));
 		return -EINVAL;
 	}
@@ -5977,7 +5976,7 @@
 
 static int hdd_set_hostapd(hdd_adapter_t *pAdapter)
 {
-	return CDF_STATUS_SUCCESS;
+	return QDF_STATUS_SUCCESS;
 }
 
 void hdd_set_ap_ops(struct net_device *pWlanHostapdDev)
@@ -5985,12 +5984,12 @@
 	pWlanHostapdDev->netdev_ops = &net_ops_struct;
 }
 
-CDF_STATUS hdd_init_ap_mode(hdd_adapter_t *pAdapter)
+QDF_STATUS hdd_init_ap_mode(hdd_adapter_t *pAdapter)
 {
 	hdd_hostapd_state_t *phostapdBuf;
 	struct net_device *dev = pAdapter->dev;
 	hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
-	CDF_STATUS status;
+	QDF_STATUS status;
 	QDF_STATUS qdf_status;
 #ifdef WLAN_FEATURE_MBSSID
 	v_CONTEXT_t p_cds_context = (WLAN_HDD_GET_CTX(pAdapter))->pcds_context;
@@ -6004,13 +6003,13 @@
 	sapContext = wlansap_open(p_cds_context);
 	if (sapContext == NULL) {
 		hddLog(LOGE, ("ERROR: wlansap_open failed!!"));
-		return CDF_STATUS_E_FAULT;
+		return QDF_STATUS_E_FAULT;
 	}
 
 	pAdapter->sessionCtx.ap.sapContext = sapContext;
 
 	status = wlansap_start(sapContext);
-	if (!CDF_IS_STATUS_SUCCESS(status)) {
+	if (!QDF_IS_STATUS_SUCCESS(status)) {
 		hddLog(LOGE, ("ERROR: wlansap_start failed!!"));
 		wlansap_close(sapContext);
 		return status;
@@ -6028,7 +6027,7 @@
 	/* Set up the pointer to the Wireless Extensions state structure */
 	/* NOP */
 	status = hdd_set_hostapd(pAdapter);
-	if (!CDF_IS_STATUS_SUCCESS(status)) {
+	if (!QDF_IS_STATUS_SUCCESS(status)) {
 		hddLog(LOGE, ("ERROR: hdd_set_hostapd failed!!"));
 #ifdef WLAN_FEATURE_MBSSID
 		wlansap_close(sapContext);
@@ -6065,12 +6064,12 @@
 
 	/* Initialize the data path module */
 	status = hdd_softap_init_tx_rx(pAdapter);
-	if (!CDF_IS_STATUS_SUCCESS(status)) {
+	if (!QDF_IS_STATUS_SUCCESS(status)) {
 		hddLog(LOGP, FL("hdd_softap_init_tx_rx failed"));
 	}
 
 	status = hdd_wmm_adapter_init(pAdapter);
-	if (!CDF_IS_STATUS_SUCCESS(status)) {
+	if (!QDF_IS_STATUS_SUCCESS(status)) {
 		hddLog(LOGE,
 		       "hdd_wmm_adapter_init() failed code %08d [x%08x]",
 		       status, status);
@@ -6192,10 +6191,10 @@
  *
  * Return: CDF status
  */
-CDF_STATUS hdd_register_hostapd(hdd_adapter_t *pAdapter,
+QDF_STATUS hdd_register_hostapd(hdd_adapter_t *pAdapter,
 				uint8_t rtnl_lock_held) {
 	struct net_device *dev = pAdapter->dev;
-	CDF_STATUS status = CDF_STATUS_SUCCESS;
+	QDF_STATUS status = QDF_STATUS_SUCCESS;
 
 	ENTER();
 
@@ -6203,17 +6202,17 @@
 		if (strnchr(dev->name, strlen(dev->name), '%')) {
 			if (dev_alloc_name(dev, dev->name) < 0) {
 				hddLog(LOGE, FL("Failed:dev_alloc_name"));
-				return CDF_STATUS_E_FAILURE;
+				return QDF_STATUS_E_FAILURE;
 			}
 		}
 		if (register_netdevice(dev)) {
 			hddLog(LOGE, FL("Failed:register_netdevice"));
-			return CDF_STATUS_E_FAILURE;
+			return QDF_STATUS_E_FAILURE;
 		}
 	} else {
 		if (register_netdev(dev)) {
 			hddLog(LOGE, FL("Failed:register_netdev"));
-			return CDF_STATUS_E_FAILURE;
+			return QDF_STATUS_E_FAILURE;
 		}
 	}
 	set_bit(NET_DEVICE_REGISTERED, &pAdapter->event_flags);
@@ -6227,12 +6226,12 @@
  * @pAdapter: Pointer to hostapd adapter
  * @rtnl_held: true if rtnl lock held; false otherwise
  *
- * Return: CDF_STATUS enumaration
+ * Return: QDF_STATUS enumaration
  */
-CDF_STATUS hdd_unregister_hostapd(hdd_adapter_t *pAdapter, bool rtnl_held)
+QDF_STATUS hdd_unregister_hostapd(hdd_adapter_t *pAdapter, bool rtnl_held)
 {
 #ifdef WLAN_FEATURE_MBSSID
-	CDF_STATUS status;
+	QDF_STATUS status;
 	void *sapContext = WLAN_HDD_GET_SAP_CTX_PTR(pAdapter);
 #endif
 
@@ -6257,11 +6256,11 @@
 
 #ifdef WLAN_FEATURE_MBSSID
 	status = wlansap_stop(sapContext);
-	if (!CDF_IS_STATUS_SUCCESS(status))
+	if (!QDF_IS_STATUS_SUCCESS(status))
 		hddLog(LOGE, FL("Failed:wlansap_stop"));
 
 	status = wlansap_close(sapContext);
-	if (!CDF_IS_STATUS_SUCCESS(status))
+	if (!QDF_IS_STATUS_SUCCESS(status))
 		hddLog(LOGE, FL("Failed:WLANSAP_close"));
 	pAdapter->sessionCtx.ap.sapContext = NULL;
 #endif
@@ -6405,7 +6404,7 @@
 
 	if ((WLAN_HDD_SOFTAP != pAdapter->device_mode) &&
 	    (WLAN_HDD_P2P_GO != pAdapter->device_mode)) {
-		if (CDF_STATUS_SUCCESS !=
+		if (QDF_STATUS_SUCCESS !=
 		    wlan_hdd_validate_operation_channel(pAdapter, channel)) {
 			hddLog(LOGE, FL("Invalid Channel [%d]"), channel);
 			return -EINVAL;
@@ -6443,7 +6442,7 @@
 		   ) {
 		sap_config = &((WLAN_HDD_GET_AP_CTX_PTR(pAdapter))->sapConfig);
 		if (WLAN_HDD_P2P_GO == pAdapter->device_mode) {
-			if (CDF_STATUS_SUCCESS !=
+			if (QDF_STATUS_SUCCESS !=
 			    wlan_hdd_validate_operation_channel(pAdapter,
 								channel)) {
 				hddLog(LOGE,
@@ -6454,7 +6453,7 @@
 			sap_config->ch_params.center_freq_seg1 = channel_seg2;
 		} else {
 			/* set channel to what hostapd configured */
-			if (CDF_STATUS_SUCCESS !=
+			if (QDF_STATUS_SUCCESS !=
 				wlan_hdd_validate_operation_channel(pAdapter,
 								channel)) {
 				hddLog(LOGE,
@@ -6919,7 +6918,7 @@
 		if (sme_update_add_ie(WLAN_HDD_GET_HAL_CTX(adapter),
 				      &updateIE,
 				      eUPDATE_IE_PROBE_BCN) ==
-		    CDF_STATUS_E_FAILURE) {
+		    QDF_STATUS_E_FAILURE) {
 			hddLog(LOGE,
 			       FL("Could not pass on Add Ie probe beacon data"));
 			ret = -EINVAL;
@@ -6942,7 +6941,7 @@
 		if (sme_update_add_ie(WLAN_HDD_GET_HAL_CTX(adapter),
 				      &updateIE,
 				      eUPDATE_IE_PROBE_RESP) ==
-		    CDF_STATUS_E_FAILURE) {
+		    QDF_STATUS_E_FAILURE) {
 			hddLog(LOGE,
 			       FL("Could not pass on PROBE_RESP add Ie data"));
 			ret = -EINVAL;
@@ -6965,7 +6964,7 @@
 		if (sme_update_add_ie(WLAN_HDD_GET_HAL_CTX(adapter),
 				      &updateIE,
 				      eUPDATE_IE_ASSOC_RESP) ==
-		    CDF_STATUS_E_FAILURE) {
+		    QDF_STATUS_E_FAILURE) {
 			hddLog(LOGE,
 				FL("Could not pass on Add Ie Assoc Response data"));
 			ret = -EINVAL;
@@ -7049,9 +7048,9 @@
  * This function get ACS related INI paramters and populated
  * sap config and smeConfig for ACS needed configurations.
  *
- * Return: The CDF_STATUS code associated with performing the operation.
+ * Return: The QDF_STATUS code associated with performing the operation.
  */
-CDF_STATUS wlan_hdd_config_acs(hdd_context_t *hdd_ctx, hdd_adapter_t *adapter)
+QDF_STATUS wlan_hdd_config_acs(hdd_context_t *hdd_ctx, hdd_adapter_t *adapter)
 {
 	tsap_Config_t *sap_config;
 	struct hdd_config *ini_config;
@@ -7165,7 +7164,7 @@
 	}
 #endif
 
-	return CDF_STATUS_SUCCESS;
+	return QDF_STATUS_SUCCESS;
 }
 
 /**
@@ -7316,7 +7315,7 @@
 	eCsrAuthType RSNAuthType;
 	eCsrEncryptionType RSNEncryptType;
 	eCsrEncryptionType mcRSNEncryptType;
-	int status = CDF_STATUS_SUCCESS, ret;
+	int status = QDF_STATUS_SUCCESS, ret;
 	int qdf_status = QDF_STATUS_SUCCESS;
 	tpWLAN_SAPEventCB pSapEventCallback;
 	hdd_hostapd_state_t *pHostapdState;
@@ -7394,7 +7393,7 @@
 			}
 		}
 
-		if (CDF_STATUS_SUCCESS !=
+		if (QDF_STATUS_SUCCESS !=
 			    wlan_hdd_validate_operation_channel(pHostapdAdapter,
 							pConfig->channel)) {
 			hddLog(LOGE, FL("Invalid Channel [%d]"),
@@ -7493,7 +7492,7 @@
 					     pConfig->RSNWPAReqIE[1] + 2,
 					     pConfig->RSNWPAReqIE);
 
-		if (CDF_STATUS_SUCCESS == status) {
+		if (QDF_STATUS_SUCCESS == status) {
 			/* Now copy over all the security attributes you have
 			 * parsed out. Use the cipher type in the RSN IE
 			 */
@@ -7541,7 +7540,7 @@
 					 pConfig->RSNWPAReqIE[1] + 2,
 					 pConfig->RSNWPAReqIE);
 
-			if (CDF_STATUS_SUCCESS == status) {
+			if (QDF_STATUS_SUCCESS == status) {
 				/* Now copy over all the security attributes
 				 * you have parsed out. Use the cipher type
 				 * in the RSN IE
@@ -7789,7 +7788,7 @@
 #endif
 		pSapEventCallback, pConfig,
 		pHostapdAdapter->dev);
-	if (!CDF_IS_STATUS_SUCCESS(status)) {
+	if (!QDF_IS_STATUS_SUCCESS(status)) {
 		wlansap_reset_sap_config_add_ie(pConfig, eUPDATE_IE_ALL);
 		cds_set_connection_in_progress(false);
 		hddLog(LOGE, FL("SAP Start Bss fail"));
@@ -7862,7 +7861,7 @@
 	hdd_context_t *pHddCtx = NULL;
 	hdd_scaninfo_t *pScanInfo = NULL;
 	hdd_adapter_t *staAdapter = NULL;
-	CDF_STATUS status = CDF_STATUS_E_FAILURE;
+	QDF_STATUS status = QDF_STATUS_E_FAILURE;
 	QDF_STATUS qdf_status = QDF_STATUS_E_FAILURE;
 	tSirUpdateIE updateIE;
 	beacon_data_t *old;
@@ -7897,7 +7896,7 @@
 		pAdapter->device_mode);
 
 	status = hdd_get_front_adapter(pHddCtx, &pAdapterNode);
-	while (NULL != pAdapterNode && CDF_STATUS_SUCCESS == status) {
+	while (NULL != pAdapterNode && QDF_STATUS_SUCCESS == status) {
 		staAdapter = pAdapterNode->pAdapter;
 
 		if (WLAN_HDD_INFRA_STATION == staAdapter->device_mode ||
@@ -7968,7 +7967,7 @@
 #else
 		status = wlansap_stop_bss(pHddCtx->pcds_context);
 #endif
-		if (CDF_IS_STATUS_SUCCESS(status)) {
+		if (QDF_IS_STATUS_SUCCESS(status)) {
 			qdf_status =
 				qdf_wait_single_event(&pHostapdState->
 						      cdf_stop_bss_event,
@@ -7989,7 +7988,7 @@
 	}
 	mutex_unlock(&pHddCtx->sap_lock);
 
-	if (status != CDF_STATUS_SUCCESS) {
+	if (status != QDF_STATUS_SUCCESS) {
 		hddLog(LOGE, FL("Stopping the BSS"));
 		return -EINVAL;
 	}
@@ -8002,13 +8001,13 @@
 	updateIE.notify = true;
 	if (sme_update_add_ie(WLAN_HDD_GET_HAL_CTX(pAdapter),
 			      &updateIE,
-			      eUPDATE_IE_PROBE_BCN) == CDF_STATUS_E_FAILURE) {
+			      eUPDATE_IE_PROBE_BCN) == QDF_STATUS_E_FAILURE) {
 		hddLog(LOGE, FL("Could not pass on PROBE_RSP_BCN data to PE"));
 	}
 
 	if (sme_update_add_ie(WLAN_HDD_GET_HAL_CTX(pAdapter),
 			      &updateIE,
-			      eUPDATE_IE_ASSOC_RESP) == CDF_STATUS_E_FAILURE) {
+			      eUPDATE_IE_ASSOC_RESP) == QDF_STATUS_E_FAILURE) {
 		hddLog(LOGE, FL("Could not pass on ASSOC_RSP data to PE"));
 	}
 	/* Reset WNI_CFG_PROBE_RSP Flags */
@@ -8139,20 +8138,20 @@
 	}
 	if (pHddCtx->config->policy_manager_enabled) {
 		status = cdf_reset_connection_update();
-		if (!CDF_IS_STATUS_SUCCESS(status))
+		if (!QDF_IS_STATUS_SUCCESS(status))
 			hdd_err("ERR: clear event failed");
 
 		status = cds_current_connections_update(pAdapter->sessionId,
 				channel,
 				CDS_UPDATE_REASON_START_AP);
-		if (CDF_STATUS_E_FAILURE == status) {
+		if (QDF_STATUS_E_FAILURE == status) {
 			hdd_err("ERROR: connections update failed!!");
 			return -EINVAL;
 		}
 
-		if (CDF_STATUS_SUCCESS == status) {
+		if (QDF_STATUS_SUCCESS == status) {
 			status = cdf_wait_for_connection_update();
-			if (!CDF_IS_STATUS_SUCCESS(status)) {
+			if (!QDF_IS_STATUS_SUCCESS(status)) {
 				hdd_err("ERROR: cdf wait for event failed!!");
 				return -EINVAL;
 			}
@@ -8292,7 +8291,7 @@
 
 	status = wlan_hdd_cfg80211_alloc_new_beacon(pAdapter, &new, params, 0);
 
-	if (status != CDF_STATUS_SUCCESS) {
+	if (status != QDF_STATUS_SUCCESS) {
 		hddLog(LOGE, FL("new beacon alloc failed"));
 		return -EINVAL;
 	}
diff --git a/core/hdd/src/wlan_hdd_hostapd.h b/core/hdd/src/wlan_hdd_hostapd.h
index 1fb38df..cf53354 100644
--- a/core/hdd/src/wlan_hdd_hostapd.h
+++ b/core/hdd/src/wlan_hdd_hostapd.h
@@ -50,9 +50,9 @@
 hdd_adapter_t *hdd_wlan_create_ap_dev(hdd_context_t *pHddCtx,
 				      tSirMacAddr macAddr, uint8_t *name);
 
-CDF_STATUS hdd_register_hostapd(hdd_adapter_t *pAdapter, uint8_t rtnl_held);
+QDF_STATUS hdd_register_hostapd(hdd_adapter_t *pAdapter, uint8_t rtnl_held);
 
-CDF_STATUS hdd_unregister_hostapd(hdd_adapter_t *pAdapter, bool rtnl_held);
+QDF_STATUS hdd_unregister_hostapd(hdd_adapter_t *pAdapter, bool rtnl_held);
 
 eCsrAuthType
 hdd_translate_rsn_to_csr_auth_type(uint8_t auth_suite[4]);
@@ -73,7 +73,7 @@
 eCsrEncryptionType
 hdd_translate_wpa_to_csr_encryption_type(uint8_t cipher_suite[4]);
 
-CDF_STATUS hdd_softap_sta_deauth(hdd_adapter_t *,
+QDF_STATUS hdd_softap_sta_deauth(hdd_adapter_t *,
 		struct tagCsrDelStaParams *);
 void hdd_softap_sta_disassoc(hdd_adapter_t *, uint8_t *);
 void hdd_softap_tkip_mic_fail_counter_measure(hdd_adapter_t *, bool);
@@ -85,9 +85,9 @@
 			 bool *pMFPRequired,
 			 uint16_t gen_ie_len, uint8_t *gen_ie);
 
-CDF_STATUS hdd_hostapd_sap_event_cb(tpSap_Event pSapEvent,
+QDF_STATUS hdd_hostapd_sap_event_cb(tpSap_Event pSapEvent,
 				    void *usrDataForCallback);
-CDF_STATUS hdd_init_ap_mode(hdd_adapter_t *pAdapter);
+QDF_STATUS hdd_init_ap_mode(hdd_adapter_t *pAdapter);
 void hdd_set_ap_ops(struct net_device *pWlanHostapdDev);
 int hdd_hostapd_stop(struct net_device *dev);
 void hdd_hostapd_channel_wakelock_init(hdd_context_t *pHddCtx);
@@ -96,7 +96,7 @@
 void hdd_restart_softap(hdd_context_t *pHddCtx, hdd_adapter_t *pAdapter);
 #endif /* FEATURE_WLAN_FORCE_SAP_SCC */
 #ifdef QCA_HT_2040_COEX
-CDF_STATUS hdd_set_sap_ht2040_mode(hdd_adapter_t *pHostapdAdapter,
+QDF_STATUS hdd_set_sap_ht2040_mode(hdd_adapter_t *pHostapdAdapter,
 				   uint8_t channel_type);
 #endif
 
@@ -112,5 +112,5 @@
 				    struct net_device *dev,
 				    struct cfg80211_beacon_data *params);
 
-CDF_STATUS wlan_hdd_config_acs(hdd_context_t *hdd_ctx, hdd_adapter_t *adapter);
+QDF_STATUS wlan_hdd_config_acs(hdd_context_t *hdd_ctx, hdd_adapter_t *adapter);
 #endif /* end #if !defined(WLAN_HDD_HOSTAPD_H) */
diff --git a/core/hdd/src/wlan_hdd_ioctl.c b/core/hdd/src/wlan_hdd_ioctl.c
index f86143e..79e1068 100644
--- a/core/hdd/src/wlan_hdd_ioctl.c
+++ b/core/hdd/src/wlan_hdd_ioctl.c
@@ -180,13 +180,13 @@
 }
 
 static
-CDF_STATUS hdd_get_tsm_stats(hdd_adapter_t *adapter,
+QDF_STATUS hdd_get_tsm_stats(hdd_adapter_t *adapter,
 			     const uint8_t tid,
 			     tAniTrafStrmMetrics *tsm_metrics)
 {
 	hdd_station_ctx_t *hdd_sta_ctx = NULL;
-	CDF_STATUS hstatus;
-	CDF_STATUS vstatus = CDF_STATUS_SUCCESS;
+	QDF_STATUS hstatus;
+	QDF_STATUS vstatus = QDF_STATUS_SUCCESS;
 	unsigned long rc;
 	struct statsContext context;
 	hdd_context_t *hdd_ctx = NULL;
@@ -194,7 +194,7 @@
 	if (NULL == adapter) {
 		hddLog(CDF_TRACE_LEVEL_ERROR,
 		       "%s: adapter is NULL", __func__);
-		return CDF_STATUS_E_FAULT;
+		return QDF_STATUS_E_FAULT;
 	}
 
 	hdd_ctx = WLAN_HDD_GET_CTX(adapter);
@@ -210,10 +210,10 @@
 				    hdd_sta_ctx->conn_info.staId[0],
 				    hdd_sta_ctx->conn_info.bssId,
 				    &context, hdd_ctx->pcds_context, tid);
-	if (CDF_STATUS_SUCCESS != hstatus) {
+	if (QDF_STATUS_SUCCESS != hstatus) {
 		hddLog(CDF_TRACE_LEVEL_ERROR,
 		       "%s: Unable to retrieve statistics", __func__);
-		vstatus = CDF_STATUS_E_FAULT;
+		vstatus = QDF_STATUS_E_FAULT;
 	} else {
 		/* request was sent -- wait for the response */
 		rc = wait_for_completion_timeout(&context.completion,
@@ -222,7 +222,7 @@
 			hddLog(CDF_TRACE_LEVEL_ERROR,
 			       "%s: SME timed out while retrieving statistics",
 			       __func__);
-			vstatus = CDF_STATUS_E_TIMEOUT;
+			vstatus = QDF_STATUS_E_TIMEOUT;
 		}
 	}
 
@@ -243,7 +243,7 @@
 	context.magic = 0;
 	spin_unlock(&hdd_context_lock);
 
-	if (CDF_STATUS_SUCCESS == vstatus) {
+	if (QDF_STATUS_SUCCESS == vstatus) {
 		tsm_metrics->UplinkPktQueueDly =
 			adapter->tsmStats.UplinkPktQueueDly;
 		cdf_mem_copy(tsm_metrics->UplinkPktQueueDlyHist,
@@ -566,7 +566,7 @@
 	}
 
 	/* Check channel number is a valid channel number */
-	if (CDF_STATUS_SUCCESS !=
+	if (QDF_STATUS_SUCCESS !=
 	    wlan_hdd_validate_operation_channel(adapter, channel)) {
 		hddLog(CDF_TRACE_LEVEL_ERROR, "%s: Invalid Channel %d",
 		       __func__, channel);
@@ -1107,7 +1107,7 @@
 {
 	uint8_t channel_list[WNI_CFG_VALID_CHANNEL_LIST_LEN] = { 0 };
 	uint8_t num_chan = 0;
-	CDF_STATUS status;
+	QDF_STATUS status;
 	hdd_context_t *hdd_ctx = WLAN_HDD_GET_CTX(adapter);
 	int ret;
 
@@ -1135,7 +1135,7 @@
 		sme_change_roam_scan_channel_list(hdd_ctx->hHal,
 						  adapter->sessionId,
 						  channel_list, num_chan);
-	if (CDF_STATUS_SUCCESS != status) {
+	if (QDF_STATUS_SUCCESS != status) {
 		CDF_TRACE(CDF_MODULE_ID_HDD, CDF_TRACE_LEVEL_ERROR,
 			  "%s: Failed to update channel list information",
 			  __func__);
@@ -1174,7 +1174,7 @@
 	uint8_t num_chan;
 	int i;
 	hdd_context_t *hdd_ctx = WLAN_HDD_GET_CTX(adapter);
-	CDF_STATUS status;
+	QDF_STATUS status;
 	int ret = 0;
 
 	/* array of values begins after "SETROAMSCANCHANNELS " */
@@ -1208,7 +1208,7 @@
 		sme_change_roam_scan_channel_list(hdd_ctx->hHal,
 						  adapter->sessionId,
 						  channel_list, num_chan);
-	if (CDF_STATUS_SUCCESS != status) {
+	if (QDF_STATUS_SUCCESS != status) {
 		CDF_TRACE(CDF_MODULE_ID_HDD, CDF_TRACE_LEVEL_ERROR,
 			  "%s: Failed to update channel list information",
 			  __func__);
@@ -1278,7 +1278,7 @@
  *
  * Return: 0 for success non-zero for failure
  */
-CDF_STATUS hdd_parse_plm_cmd(uint8_t *pValue, tSirPlmReq *pPlmRequest)
+QDF_STATUS hdd_parse_plm_cmd(uint8_t *pValue, tSirPlmReq *pPlmRequest)
 {
 	uint8_t *cmdPtr = NULL;
 	int count, content = 0, ret = 0;
@@ -1287,11 +1287,11 @@
 	/* move to argument list */
 	cmdPtr = strnchr(pValue, strlen(pValue), SPACE_ASCII_VALUE);
 	if (NULL == cmdPtr)
-		return CDF_STATUS_E_FAILURE;
+		return QDF_STATUS_E_FAILURE;
 
 	/* no space after the command */
 	if (SPACE_ASCII_VALUE != *cmdPtr)
-		return CDF_STATUS_E_FAILURE;
+		return QDF_STATUS_E_FAILURE;
 
 	/* remove empty spaces */
 	while ((SPACE_ASCII_VALUE == *cmdPtr) && ('\0' != *cmdPtr))
@@ -1300,17 +1300,17 @@
 	/* START/STOP PLM req */
 	ret = sscanf(cmdPtr, "%31s ", buf);
 	if (1 != ret)
-		return CDF_STATUS_E_FAILURE;
+		return QDF_STATUS_E_FAILURE;
 
 	ret = kstrtos32(buf, 10, &content);
 	if (ret < 0)
-		return CDF_STATUS_E_FAILURE;
+		return QDF_STATUS_E_FAILURE;
 
 	pPlmRequest->enable = content;
 	cmdPtr = strpbrk(cmdPtr, " ");
 
 	if (NULL == cmdPtr)
-		return CDF_STATUS_E_FAILURE;
+		return QDF_STATUS_E_FAILURE;
 
 	/* remove empty spaces */
 	while ((SPACE_ASCII_VALUE == *cmdPtr) && ('\0' != *cmdPtr))
@@ -1319,11 +1319,11 @@
 	/* Dialog token of radio meas req containing meas reqIE */
 	ret = sscanf(cmdPtr, "%31s ", buf);
 	if (1 != ret)
-		return CDF_STATUS_E_FAILURE;
+		return QDF_STATUS_E_FAILURE;
 
 	ret = kstrtos32(buf, 10, &content);
 	if (ret < 0)
-		return CDF_STATUS_E_FAILURE;
+		return QDF_STATUS_E_FAILURE;
 
 	pPlmRequest->diag_token = content;
 	hddLog(CDF_TRACE_LEVEL_DEBUG, "diag token %d",
@@ -1331,7 +1331,7 @@
 	cmdPtr = strpbrk(cmdPtr, " ");
 
 	if (NULL == cmdPtr)
-		return CDF_STATUS_E_FAILURE;
+		return QDF_STATUS_E_FAILURE;
 
 	/* remove empty spaces */
 	while ((SPACE_ASCII_VALUE == *cmdPtr) && ('\0' != *cmdPtr))
@@ -1340,11 +1340,11 @@
 	/* measurement token of meas req IE */
 	ret = sscanf(cmdPtr, "%31s ", buf);
 	if (1 != ret)
-		return CDF_STATUS_E_FAILURE;
+		return QDF_STATUS_E_FAILURE;
 
 	ret = kstrtos32(buf, 10, &content);
 	if (ret < 0)
-		return CDF_STATUS_E_FAILURE;
+		return QDF_STATUS_E_FAILURE;
 
 	pPlmRequest->meas_token = content;
 	hddLog(CDF_TRACE_LEVEL_DEBUG, "meas token %d",
@@ -1357,7 +1357,7 @@
 		cmdPtr = strpbrk(cmdPtr, " ");
 
 		if (NULL == cmdPtr)
-			return CDF_STATUS_E_FAILURE;
+			return QDF_STATUS_E_FAILURE;
 
 		/* remove empty spaces */
 		while ((SPACE_ASCII_VALUE == *cmdPtr) && ('\0' != *cmdPtr))
@@ -1366,14 +1366,14 @@
 		/* total number of bursts after which STA stops sending */
 		ret = sscanf(cmdPtr, "%31s ", buf);
 		if (1 != ret)
-			return CDF_STATUS_E_FAILURE;
+			return QDF_STATUS_E_FAILURE;
 
 		ret = kstrtos32(buf, 10, &content);
 		if (ret < 0)
-			return CDF_STATUS_E_FAILURE;
+			return QDF_STATUS_E_FAILURE;
 
 		if (content < 0)
-			return CDF_STATUS_E_FAILURE;
+			return QDF_STATUS_E_FAILURE;
 
 		pPlmRequest->numBursts = content;
 		hddLog(CDF_TRACE_LEVEL_DEBUG, "num burst %d",
@@ -1381,7 +1381,7 @@
 		cmdPtr = strpbrk(cmdPtr, " ");
 
 		if (NULL == cmdPtr)
-			return CDF_STATUS_E_FAILURE;
+			return QDF_STATUS_E_FAILURE;
 
 		/* remove empty spaces */
 		while ((SPACE_ASCII_VALUE == *cmdPtr) && ('\0' != *cmdPtr))
@@ -1390,14 +1390,14 @@
 		/* burst interval in seconds */
 		ret = sscanf(cmdPtr, "%31s ", buf);
 		if (1 != ret)
-			return CDF_STATUS_E_FAILURE;
+			return QDF_STATUS_E_FAILURE;
 
 		ret = kstrtos32(buf, 10, &content);
 		if (ret < 0)
-			return CDF_STATUS_E_FAILURE;
+			return QDF_STATUS_E_FAILURE;
 
 		if (content <= 0)
-			return CDF_STATUS_E_FAILURE;
+			return QDF_STATUS_E_FAILURE;
 
 		pPlmRequest->burstInt = content;
 		hddLog(CDF_TRACE_LEVEL_DEBUG, "burst Int %d",
@@ -1405,7 +1405,7 @@
 		cmdPtr = strpbrk(cmdPtr, " ");
 
 		if (NULL == cmdPtr)
-			return CDF_STATUS_E_FAILURE;
+			return QDF_STATUS_E_FAILURE;
 
 		/* remove empty spaces */
 		while ((SPACE_ASCII_VALUE == *cmdPtr) && ('\0' != *cmdPtr))
@@ -1414,14 +1414,14 @@
 		/* Meas dur in TU's,STA goes off-ch and transmit PLM bursts */
 		ret = sscanf(cmdPtr, "%31s ", buf);
 		if (1 != ret)
-			return CDF_STATUS_E_FAILURE;
+			return QDF_STATUS_E_FAILURE;
 
 		ret = kstrtos32(buf, 10, &content);
 		if (ret < 0)
-			return CDF_STATUS_E_FAILURE;
+			return QDF_STATUS_E_FAILURE;
 
 		if (content <= 0)
-			return CDF_STATUS_E_FAILURE;
+			return QDF_STATUS_E_FAILURE;
 
 		pPlmRequest->measDuration = content;
 		hddLog(CDF_TRACE_LEVEL_DEBUG, "measDur %d",
@@ -1429,7 +1429,7 @@
 		cmdPtr = strpbrk(cmdPtr, " ");
 
 		if (NULL == cmdPtr)
-			return CDF_STATUS_E_FAILURE;
+			return QDF_STATUS_E_FAILURE;
 
 		/* remove empty spaces */
 		while ((SPACE_ASCII_VALUE == *cmdPtr) && ('\0' != *cmdPtr))
@@ -1438,14 +1438,14 @@
 		/* burst length of PLM bursts */
 		ret = sscanf(cmdPtr, "%31s ", buf);
 		if (1 != ret)
-			return CDF_STATUS_E_FAILURE;
+			return QDF_STATUS_E_FAILURE;
 
 		ret = kstrtos32(buf, 10, &content);
 		if (ret < 0)
-			return CDF_STATUS_E_FAILURE;
+			return QDF_STATUS_E_FAILURE;
 
 		if (content <= 0)
-			return CDF_STATUS_E_FAILURE;
+			return QDF_STATUS_E_FAILURE;
 
 		pPlmRequest->burstLen = content;
 		hddLog(CDF_TRACE_LEVEL_DEBUG, "burstLen %d",
@@ -1453,7 +1453,7 @@
 		cmdPtr = strpbrk(cmdPtr, " ");
 
 		if (NULL == cmdPtr)
-			return CDF_STATUS_E_FAILURE;
+			return QDF_STATUS_E_FAILURE;
 
 		/* remove empty spaces */
 		while ((SPACE_ASCII_VALUE == *cmdPtr) && ('\0' != *cmdPtr))
@@ -1462,14 +1462,14 @@
 		/* desired tx power for transmission of PLM bursts */
 		ret = sscanf(cmdPtr, "%31s ", buf);
 		if (1 != ret)
-			return CDF_STATUS_E_FAILURE;
+			return QDF_STATUS_E_FAILURE;
 
 		ret = kstrtos32(buf, 10, &content);
 		if (ret < 0)
-			return CDF_STATUS_E_FAILURE;
+			return QDF_STATUS_E_FAILURE;
 
 		if (content <= 0)
-			return CDF_STATUS_E_FAILURE;
+			return QDF_STATUS_E_FAILURE;
 
 		pPlmRequest->desiredTxPwr = content;
 		hddLog(CDF_TRACE_LEVEL_DEBUG,
@@ -1479,7 +1479,7 @@
 			cmdPtr = strpbrk(cmdPtr, " ");
 
 			if (NULL == cmdPtr)
-				return CDF_STATUS_E_FAILURE;
+				return QDF_STATUS_E_FAILURE;
 
 			/* remove empty spaces */
 			while ((SPACE_ASCII_VALUE == *cmdPtr)
@@ -1488,11 +1488,11 @@
 
 			ret = sscanf(cmdPtr, "%31s ", buf);
 			if (1 != ret)
-				return CDF_STATUS_E_FAILURE;
+				return QDF_STATUS_E_FAILURE;
 
 			ret = kstrtos32(buf, 16, &content);
 			if (ret < 0)
-				return CDF_STATUS_E_FAILURE;
+				return QDF_STATUS_E_FAILURE;
 
 			pPlmRequest->mac_addr.bytes[count] = content;
 		}
@@ -1503,7 +1503,7 @@
 		cmdPtr = strpbrk(cmdPtr, " ");
 
 		if (NULL == cmdPtr)
-			return CDF_STATUS_E_FAILURE;
+			return QDF_STATUS_E_FAILURE;
 
 		/* remove empty spaces */
 		while ((SPACE_ASCII_VALUE == *cmdPtr) && ('\0' != *cmdPtr))
@@ -1512,14 +1512,14 @@
 		/* number of channels */
 		ret = sscanf(cmdPtr, "%31s ", buf);
 		if (1 != ret)
-			return CDF_STATUS_E_FAILURE;
+			return QDF_STATUS_E_FAILURE;
 
 		ret = kstrtos32(buf, 10, &content);
 		if (ret < 0)
-			return CDF_STATUS_E_FAILURE;
+			return QDF_STATUS_E_FAILURE;
 
 		if (content < 0)
-			return CDF_STATUS_E_FAILURE;
+			return QDF_STATUS_E_FAILURE;
 
 		pPlmRequest->plmNumCh = content;
 		hddLog(CDF_TRACE_LEVEL_DEBUG, "numch %d",
@@ -1530,7 +1530,7 @@
 			cmdPtr = strpbrk(cmdPtr, " ");
 
 			if (NULL == cmdPtr)
-				return CDF_STATUS_E_FAILURE;
+				return QDF_STATUS_E_FAILURE;
 
 			/* remove empty spaces */
 			while ((SPACE_ASCII_VALUE == *cmdPtr)
@@ -1539,14 +1539,14 @@
 
 			ret = sscanf(cmdPtr, "%31s ", buf);
 			if (1 != ret)
-				return CDF_STATUS_E_FAILURE;
+				return QDF_STATUS_E_FAILURE;
 
 			ret = kstrtos32(buf, 10, &content);
 			if (ret < 0)
-				return CDF_STATUS_E_FAILURE;
+				return QDF_STATUS_E_FAILURE;
 
 			if (content <= 0)
-				return CDF_STATUS_E_FAILURE;
+				return QDF_STATUS_E_FAILURE;
 
 			pPlmRequest->plmChList[count] = content;
 			hddLog(CDF_TRACE_LEVEL_DEBUG, " ch- %d",
@@ -1554,7 +1554,7 @@
 		}
 	}
 	/* If PLM START */
-	return CDF_STATUS_SUCCESS;
+	return QDF_STATUS_SUCCESS;
 }
 #endif
 
@@ -1577,7 +1577,7 @@
 			      tpSirExtWoWParams arg_params)
 {
 	tSirExtWoWParams params;
-	CDF_STATUS cdf_ret_status = CDF_STATUS_E_FAILURE;
+	QDF_STATUS cdf_ret_status = QDF_STATUS_E_FAILURE;
 	hdd_context_t *hdd_ctx = WLAN_HDD_GET_CTX(adapter);
 	tHalHandle hHal = WLAN_HDD_GET_HAL_CTX(adapter);
 	int rc;
@@ -1589,7 +1589,7 @@
 	cdf_ret_status = sme_configure_ext_wow(hHal, &params,
 						&wlan_hdd_ready_to_extwow,
 						hdd_ctx);
-	if (CDF_STATUS_SUCCESS != cdf_ret_status) {
+	if (QDF_STATUS_SUCCESS != cdf_ret_status) {
 		hddLog(CDF_TRACE_LEVEL_ERROR,
 		       FL("sme_configure_ext_wow returned failure %d"),
 		       cdf_ret_status);
@@ -1621,7 +1621,7 @@
 				return rc;
 			}
 			cdf_ret_status = wlan_hdd_bus_suspend(state);
-			if (cdf_ret_status != CDF_STATUS_SUCCESS) {
+			if (cdf_ret_status != QDF_STATUS_SUCCESS) {
 				CDF_TRACE(CDF_MODULE_ID_HDD, CDF_TRACE_LEVEL_ERROR,
 					"%s: wlan_hdd_suspend failed, status = %d",
 					__func__, cdf_ret_status);
@@ -1685,12 +1685,12 @@
 				    tpSirAppType1Params arg_params)
 {
 	tSirAppType1Params params;
-	CDF_STATUS cdf_ret_status = CDF_STATUS_E_FAILURE;
+	QDF_STATUS cdf_ret_status = QDF_STATUS_E_FAILURE;
 
 	cdf_mem_copy(&params, arg_params, sizeof(params));
 
 	cdf_ret_status = sme_configure_app_type1_params(hHal, &params);
-	if (CDF_STATUS_SUCCESS != cdf_ret_status) {
+	if (QDF_STATUS_SUCCESS != cdf_ret_status) {
 		hddLog(CDF_TRACE_LEVEL_ERROR,
 		       FL("sme_configure_app_type1_params returned failure %d"),
 		       cdf_ret_status);
@@ -1743,12 +1743,12 @@
 				    tpSirAppType2Params arg_params)
 {
 	tSirAppType2Params params;
-	CDF_STATUS cdf_ret_status = CDF_STATUS_E_FAILURE;
+	QDF_STATUS cdf_ret_status = QDF_STATUS_E_FAILURE;
 
 	cdf_mem_copy(&params, arg_params, sizeof(params));
 
 	cdf_ret_status = sme_configure_app_type2_params(hHal, &params);
-	if (CDF_STATUS_SUCCESS != cdf_ret_status) {
+	if (QDF_STATUS_SUCCESS != cdf_ret_status) {
 		hddLog(CDF_TRACE_LEVEL_ERROR,
 		       FL("sme_configure_app_type2_params returned failure %d"),
 		       cdf_ret_status);
@@ -2105,7 +2105,7 @@
 	hdd_station_ctx_t *pHddStaCtx =
 				WLAN_HDD_GET_STATION_CTX_PTR(adapter);
 	struct statsContext context;
-	CDF_STATUS hstatus;
+	QDF_STATUS hstatus;
 	unsigned long rc;
 
 	if (cds_is_driver_recovering()) {
@@ -2137,7 +2137,7 @@
 	hstatus = sme_get_link_status(WLAN_HDD_GET_HAL_CTX(adapter),
 				      hdd_get_link_status_cb,
 				      &context, adapter->sessionId);
-	if (CDF_STATUS_SUCCESS != hstatus) {
+	if (QDF_STATUS_SUCCESS != hstatus) {
 		hddLog(CDF_TRACE_LEVEL_ERROR,
 		       "%s: Unable to retrieve link status", __func__);
 		/* return a cached value */
@@ -2399,7 +2399,7 @@
 int wlan_hdd_set_mc_rate(hdd_adapter_t *pAdapter, int targetRate)
 {
 	tSirRateUpdateInd rateUpdate = {0};
-	CDF_STATUS status;
+	QDF_STATUS status;
 	hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
 	struct hdd_config *pConfig = NULL;
 
@@ -2433,7 +2433,7 @@
 		hdd_device_mode_to_string(pAdapter->device_mode),
 		pAdapter->device_mode);
 	status = sme_send_rate_update_ind(pHddCtx->hHal, &rateUpdate);
-	if (CDF_STATUS_SUCCESS != status) {
+	if (QDF_STATUS_SUCCESS != status) {
 		hddLog(CDF_TRACE_LEVEL_ERROR, "%s: SETMCRATE failed",
 		       __func__);
 		return -EFAULT;
@@ -2557,7 +2557,7 @@
 			   hdd_priv_data_t *priv_data)
 {
 	int ret = 0;
-	CDF_STATUS status;
+	QDF_STATUS status;
 	unsigned long rc;
 	char *country_code;
 
@@ -2572,7 +2572,7 @@
 			hdd_ctx->pcds_context,
 			eSIR_TRUE,
 			eSIR_TRUE);
-	if (status == CDF_STATUS_SUCCESS) {
+	if (status == QDF_STATUS_SUCCESS) {
 		rc = wait_for_completion_timeout(
 			&adapter->change_country_code,
 			 msecs_to_jiffies(WLAN_WAIT_TIME_COUNTRY));
@@ -2600,7 +2600,7 @@
 	uint8_t *value = command;
 	int8_t rssi = 0;
 	uint8_t lookUpThreshold = CFG_NEIGHBOR_LOOKUP_RSSI_THRESHOLD_DEFAULT;
-	CDF_STATUS status = CDF_STATUS_SUCCESS;
+	QDF_STATUS status = QDF_STATUS_SUCCESS;
 
 	/* Move pointer to ahead of SETROAMTRIGGER<delimiter> */
 	value = value + command_len + 1;
@@ -2648,7 +2648,7 @@
 	status = sme_set_neighbor_lookup_rssi_threshold(hdd_ctx->hHal,
 							adapter->sessionId,
 							lookUpThreshold);
-	if (CDF_STATUS_SUCCESS != status) {
+	if (QDF_STATUS_SUCCESS != status) {
 		CDF_TRACE(CDF_MODULE_ID_HDD,
 			  CDF_TRACE_LEVEL_ERROR,
 			  "%s: Failed to set roam trigger, try again",
@@ -3131,7 +3131,7 @@
 	char extra[128] = { 0 };
 	int len;
 
-	if (CDF_STATUS_SUCCESS !=
+	if (QDF_STATUS_SUCCESS !=
 		sme_get_roam_scan_channel_list(hdd_ctx->hHal,
 					       ChannelList,
 					       &numChannels,
@@ -4160,7 +4160,7 @@
 	msg.type = SIR_HAL_ROAM_INVOKE;
 	msg.reserved = 0;
 	msg.bodyptr = fastreassoc;
-	if (CDF_STATUS_SUCCESS != cds_mq_post_message(CDF_MODULE_ID_WMA,
+	if (QDF_STATUS_SUCCESS != cds_mq_post_message(CDF_MODULE_ID_WMA,
 								&msg)) {
 		cdf_mem_free(fastreassoc);
 		CDF_TRACE(CDF_MODULE_ID_HDD, CDF_TRACE_LEVEL_ERROR,
@@ -4237,7 +4237,7 @@
 	}
 
 	/* Check channel number is a valid channel number */
-	if (CDF_STATUS_SUCCESS !=
+	if (QDF_STATUS_SUCCESS !=
 		wlan_hdd_validate_operation_channel(adapter, channel)) {
 		hddLog(LOGE, FL("Invalid Channel [%d]"), channel);
 		return -EINVAL;
@@ -4272,7 +4272,7 @@
 {
 	int ret = 0;
 	uint8_t *value = command;
-	CDF_STATUS status = CDF_STATUS_SUCCESS;
+	QDF_STATUS status = QDF_STATUS_SUCCESS;
 	tpSirPlmReq pPlmRequest = NULL;
 
 	pPlmRequest = cdf_mem_malloc(sizeof(tSirPlmReq));
@@ -4282,7 +4282,7 @@
 	}
 
 	status = hdd_parse_plm_cmd(value, pPlmRequest);
-	if (CDF_STATUS_SUCCESS != status) {
+	if (QDF_STATUS_SUCCESS != status) {
 		cdf_mem_free(pPlmRequest);
 		pPlmRequest = NULL;
 		ret = -EINVAL;
@@ -4291,7 +4291,7 @@
 	pPlmRequest->sessionId = adapter->sessionId;
 
 	status = sme_set_plm_request(hdd_ctx->hHal, pPlmRequest);
-	if (CDF_STATUS_SUCCESS != status) {
+	if (QDF_STATUS_SUCCESS != status) {
 		cdf_mem_free(pPlmRequest);
 		pPlmRequest = NULL;
 		ret = -EINVAL;
@@ -4600,7 +4600,7 @@
 			    uint8_t command_len,
 			    hdd_priv_data_t *priv_data)
 {
-	CDF_STATUS ret_status;
+	QDF_STATUS ret_status;
 	int ret = 0;
 	tHalHandle hHal;
 	uint8_t filterType = 0;
@@ -4646,7 +4646,7 @@
 	pHddCtx->miracast_value = filterType;
 
 	ret_status = sme_set_miracast(hHal, filterType);
-	if (CDF_STATUS_SUCCESS != ret_status) {
+	if (QDF_STATUS_SUCCESS != ret_status) {
 		hddLog(LOGE, "Failed to set miracast");
 		return -EBUSY;
 	}
@@ -4669,7 +4669,7 @@
 	uint8_t *value = command;
 	uint8_t ChannelList[WNI_CFG_VALID_CHANNEL_LIST_LEN] = { 0 };
 	uint8_t numChannels = 0;
-	CDF_STATUS status;
+	QDF_STATUS status;
 
 	ret = hdd_parse_channellist(value, ChannelList, &numChannels);
 	if (ret) {
@@ -4693,7 +4693,7 @@
 						    adapter->sessionId,
 						    ChannelList,
 						    numChannels);
-	if (CDF_STATUS_SUCCESS != status) {
+	if (QDF_STATUS_SUCCESS != status) {
 		CDF_TRACE(CDF_MODULE_ID_HDD,
 			  CDF_TRACE_LEVEL_ERROR,
 			  "%s: Failed to update channel list information",
@@ -4769,7 +4769,7 @@
 		  CDF_TRACE_LEVEL_INFO,
 		  "%s: Received Command to get tsm stats tid = %d",
 		  __func__, tid);
-	if (CDF_STATUS_SUCCESS !=
+	if (QDF_STATUS_SUCCESS !=
 	    hdd_get_tsm_stats(adapter, tid, &tsm_metrics)) {
 		CDF_TRACE(CDF_MODULE_ID_HDD,
 			  CDF_TRACE_LEVEL_ERROR,
@@ -4878,7 +4878,7 @@
 	int ret;
 	uint8_t *value = command;
 	tCsrEseBeaconReq eseBcnReq;
-	CDF_STATUS status = CDF_STATUS_SUCCESS;
+	QDF_STATUS status = QDF_STATUS_SUCCESS;
 
 	if (WLAN_HDD_INFRA_STATION != adapter->device_mode) {
 		hdd_warn("Unsupported in mode %s(%d)",
@@ -4909,13 +4909,13 @@
 					    adapter->sessionId,
 					    &eseBcnReq);
 
-	if (CDF_STATUS_E_RESOURCES == status) {
+	if (QDF_STATUS_E_RESOURCES == status) {
 		hddLog(CDF_TRACE_LEVEL_INFO,
 		       FL("sme_set_ese_beacon_request failed (%d), a request already in progress"),
 		       status);
 		ret = -EBUSY;
 		goto exit;
-	} else if (CDF_STATUS_SUCCESS != status) {
+	} else if (QDF_STATUS_SUCCESS != status) {
 		CDF_TRACE(CDF_MODULE_ID_HDD,
 			  CDF_TRACE_LEVEL_ERROR,
 			  "%s: sme_set_ese_beacon_request failed (%d)",
@@ -4960,8 +4960,8 @@
 	int ret = 0;
 	int status;
 	int txPower;
-	CDF_STATUS cdf_status;
-	CDF_STATUS smeStatus;
+	QDF_STATUS qdf_status;
+	QDF_STATUS smeStatus;
 	uint8_t *value = command;
 	struct cdf_mac_addr bssid = CDF_MAC_ADDR_BROADCAST_INITIALIZER;
 	struct cdf_mac_addr selfMac = CDF_MAC_ADDR_BROADCAST_INITIALIZER;
@@ -4977,9 +4977,9 @@
 		goto exit;
 	}
 
-	cdf_status = hdd_get_front_adapter(hdd_ctx, &pAdapterNode);
+	qdf_status = hdd_get_front_adapter(hdd_ctx, &pAdapterNode);
 	while (NULL != pAdapterNode
-	       && CDF_STATUS_SUCCESS == cdf_status) {
+	       && QDF_STATUS_SUCCESS == qdf_status) {
 		adapter = pAdapterNode->pAdapter;
 		/* Assign correct self MAC address */
 		cdf_copy_macaddr(&bssid,
@@ -4995,7 +4995,7 @@
 
 		smeStatus = sme_set_max_tx_power(hdd_ctx->hHal,
 						 bssid, selfMac, txPower);
-		if (CDF_STATUS_SUCCESS != status) {
+		if (QDF_STATUS_SUCCESS != status) {
 			hddLog(CDF_TRACE_LEVEL_ERROR,
 			       "%s:Set max tx power failed",
 			       __func__);
@@ -5005,7 +5005,7 @@
 		hddLog(CDF_TRACE_LEVEL_INFO,
 		       "%s: Set max tx power success",
 		       __func__);
-		cdf_status = hdd_get_next_adapter(hdd_ctx, pAdapterNode,
+		qdf_status = hdd_get_next_adapter(hdd_ctx, pAdapterNode,
 						  &pNext);
 		pAdapterNode = pNext;
 	}
@@ -5910,7 +5910,7 @@
 {
 	uint8_t *value;
 	uint8_t fcc_constraint;
-	CDF_STATUS status;
+	QDF_STATUS status;
 	int ret = 0;
 
 	/*
@@ -5936,7 +5936,7 @@
 	}
 
 	status = sme_disable_non_fcc_channel(hdd_ctx->hHal, !fcc_constraint);
-	if (status != CDF_STATUS_SUCCESS) {
+	if (status != QDF_STATUS_SUCCESS) {
 		hdd_err("sme disable fn. returned err");
 		ret = -EPERM;
 	}
diff --git a/core/hdd/src/wlan_hdd_ipa.c b/core/hdd/src/wlan_hdd_ipa.c
index d15388e..6199d4d 100644
--- a/core/hdd/src/wlan_hdd_ipa.c
+++ b/core/hdd/src/wlan_hdd_ipa.c
@@ -1234,7 +1234,7 @@
 hdd_ipa_uc_rm_notify_handler(void *context, enum ipa_rm_event event)
 {
 	struct hdd_ipa_priv *hdd_ipa = context;
-	CDF_STATUS status = CDF_STATUS_SUCCESS;
+	QDF_STATUS status = QDF_STATUS_SUCCESS;
 
 	/*
 	 * When SSR is going on or driver is unloading, just return.
@@ -1354,7 +1354,7 @@
 	struct IpaHwStatsWDIInfoData_t ipa_stat;
 	struct hdd_ipa_priv *hdd_ipa;
 	hdd_context_t *hdd_ctx;
-	CDF_STATUS status = CDF_STATUS_SUCCESS;
+	QDF_STATUS status = QDF_STATUS_SUCCESS;
 
 	if (!op_msg || !usr_ctxt) {
 		HDD_IPA_LOG(CDF_TRACE_LEVEL_ERROR, "%s, INVALID ARG", __func__);
@@ -1664,7 +1664,7 @@
 		ipa_offload_enable_disable.vdev_id,
 		ipa_offload_enable_disable.enable);
 
-	if (CDF_STATUS_SUCCESS !=
+	if (QDF_STATUS_SUCCESS !=
 		sme_ipa_offload_enable_disable(WLAN_HDD_GET_HAL_CTX(adapter),
 			adapter->sessionId, &ipa_offload_enable_disable)) {
 		HDD_IPA_LOG(CDF_TRACE_LEVEL_ERROR,
@@ -1716,7 +1716,7 @@
 	struct hdd_ipa_priv *hdd_ipa;
 	struct op_msg_type *msg;
 	struct uc_op_work_struct *uc_op_work;
-	CDF_STATUS status = CDF_STATUS_SUCCESS;
+	QDF_STATUS status = QDF_STATUS_SUCCESS;
 
 	status = wlan_hdd_validate_context(hdd_ctx);
 	if (0 != status) {
@@ -1775,9 +1775,9 @@
  * hdd_ipa_uc_ol_init() - Initialize IPA uC offload
  * @hdd_ctx: Global HDD context
  *
- * Return: CDF_STATUS
+ * Return: QDF_STATUS
  */
-static CDF_STATUS hdd_ipa_uc_ol_init(hdd_context_t *hdd_ctx)
+static QDF_STATUS hdd_ipa_uc_ol_init(hdd_context_t *hdd_ctx)
 {
 	struct ipa_wdi_in_params pipe_in;
 	struct ipa_wdi_out_params pipe_out;
@@ -1879,7 +1879,7 @@
 		ipa_ctxt->uc_op_work[i].msg = NULL;
 	}
 
-	return CDF_STATUS_SUCCESS;
+	return QDF_STATUS_SUCCESS;
 }
 
 /**
@@ -2827,7 +2827,7 @@
 	struct hdd_ipa_iface_context *iface_context;
 	cdf_nbuf_t skb;
 	struct hdd_ipa_pm_tx_cb *pm_tx_cb = NULL;
-	CDF_STATUS status = CDF_STATUS_SUCCESS;
+	QDF_STATUS status = QDF_STATUS_SUCCESS;
 
 	iface_context = (struct hdd_ipa_iface_context *)priv;
 	if (evt != IPA_RECEIVE) {
@@ -3511,7 +3511,7 @@
 int hdd_ipa_send_mcc_scc_msg(hdd_context_t *pHddCtx, bool mcc_mode)
 {
 	hdd_adapter_list_node_t *adapter_node = NULL, *next = NULL;
-	CDF_STATUS status;
+	QDF_STATUS status;
 	hdd_adapter_t *pAdapter;
 	struct ipa_msg_meta meta;
 	struct ipa_wlan_msg *msg;
@@ -3523,7 +3523,7 @@
 	if (!pHddCtx->mcc_mode) {
 		/* Flush TxRx queue for each adapter before switch to SCC */
 		status =  hdd_get_front_adapter(pHddCtx, &adapter_node);
-		while (NULL != adapter_node && CDF_STATUS_SUCCESS == status) {
+		while (NULL != adapter_node && QDF_STATUS_SUCCESS == status) {
 			pAdapter = adapter_node->pAdapter;
 			if (pAdapter->device_mode == WLAN_HDD_INFRA_STATION ||
 				pAdapter->device_mode == WLAN_HDD_SOFTAP) {
@@ -4002,16 +4002,16 @@
  * Allocate hdd_ipa resources, ipa pipe resource and register
  * wlan interface with IPA module.
  *
- * Return: CDF_STATUS enumeration
+ * Return: QDF_STATUS enumeration
  */
-CDF_STATUS hdd_ipa_init(hdd_context_t *hdd_ctx)
+QDF_STATUS hdd_ipa_init(hdd_context_t *hdd_ctx)
 {
 	struct hdd_ipa_priv *hdd_ipa = NULL;
 	int ret, i;
 	struct hdd_ipa_iface_context *iface_context = NULL;
 
 	if (!hdd_ipa_is_enabled(hdd_ctx))
-		return CDF_STATUS_SUCCESS;
+		return QDF_STATUS_SUCCESS;
 
 	hdd_ipa = cdf_mem_malloc(sizeof(*hdd_ipa));
 	if (!hdd_ipa) {
@@ -4097,7 +4097,7 @@
 			goto fail_create_sys_pipe;
 	}
 
-	return CDF_STATUS_SUCCESS;
+	return QDF_STATUS_SUCCESS;
 
 fail_create_sys_pipe:
 	hdd_ipa_destroy_rm_resource(hdd_ipa);
@@ -4108,7 +4108,7 @@
 	hdd_ctx->hdd_ipa = NULL;
 	ghdd_ipa = NULL;
 fail_return:
-	return CDF_STATUS_E_FAILURE;
+	return QDF_STATUS_E_FAILURE;
 }
 
 /**
@@ -4133,9 +4133,9 @@
  * hdd_ipa_cleanup - IPA cleanup function
  * @hdd_ctx: HDD global context
  *
- * Return: CDF_STATUS enumeration
+ * Return: QDF_STATUS enumeration
  */
-CDF_STATUS hdd_ipa_cleanup(hdd_context_t *hdd_ctx)
+QDF_STATUS hdd_ipa_cleanup(hdd_context_t *hdd_ctx)
 {
 	struct hdd_ipa_priv *hdd_ipa = hdd_ctx->hdd_ipa;
 	int i;
@@ -4144,7 +4144,7 @@
 	struct hdd_ipa_pm_tx_cb *pm_tx_cb = NULL;
 
 	if (!hdd_ipa_is_enabled(hdd_ctx))
-		return CDF_STATUS_SUCCESS;
+		return QDF_STATUS_SUCCESS;
 
 	if (!hdd_ipa_uc_is_enabled(hdd_ctx)) {
 		unregister_inetaddr_notifier(&hdd_ipa->ipv4_notifier);
@@ -4222,6 +4222,6 @@
 	cdf_mem_free(hdd_ipa);
 	hdd_ctx->hdd_ipa = NULL;
 
-	return CDF_STATUS_SUCCESS;
+	return QDF_STATUS_SUCCESS;
 }
 #endif /* IPA_OFFLOAD */
diff --git a/core/hdd/src/wlan_hdd_main.c b/core/hdd/src/wlan_hdd_main.c
index 65e09be..1f26a1b 100644
--- a/core/hdd/src/wlan_hdd_main.c
+++ b/core/hdd/src/wlan_hdd_main.c
@@ -589,15 +589,15 @@
 	    ((eCSR_CFG_DOT11_MODE_11AC_ONLY == pHddStaCtx->conn_info.dot11Mode)
 	     || (eCSR_CFG_DOT11_MODE_11AC ==
 		 pHddStaCtx->conn_info.dot11Mode))) {
-		CDF_STATUS cdf_status;
+		QDF_STATUS qdf_status;
 
 		/* need to issue a disconnect to CSR. */
 		INIT_COMPLETION(adapter->disconnect_comp_var);
-		cdf_status = sme_roam_disconnect(WLAN_HDD_GET_HAL_CTX(adapter),
+		qdf_status = sme_roam_disconnect(WLAN_HDD_GET_HAL_CTX(adapter),
 						 adapter->sessionId,
 						 eCSR_DISCONNECT_REASON_UNSPECIFIED);
 
-		if (CDF_STATUS_SUCCESS == cdf_status) {
+		if (QDF_STATUS_SUCCESS == qdf_status) {
 			unsigned long rc;
 
 			rc = wait_for_completion_timeout(
@@ -618,10 +618,10 @@
  * which will send it to firmware if FW supports IBSS power save
  * before vdev start.
  *
- * Return: CDF_STATUS CDF_STATUS_SUCCESS on Success and CDF_STATUS_E_FAILURE
+ * Return: QDF_STATUS QDF_STATUS_SUCCESS on Success and QDF_STATUS_E_FAILURE
  *         on failure.
  */
-CDF_STATUS hdd_set_ibss_power_save_params(hdd_adapter_t *adapter)
+QDF_STATUS hdd_set_ibss_power_save_params(hdd_adapter_t *adapter)
 {
 	int ret;
 	hdd_context_t *hdd_ctx = WLAN_HDD_GET_CTX(adapter);
@@ -629,7 +629,7 @@
 	if (hdd_ctx == NULL) {
 		hddLog(CDF_TRACE_LEVEL_ERROR,
 		       FL("HDD context is null"));
-		return CDF_STATUS_E_FAILURE;
+		return QDF_STATUS_E_FAILURE;
 	}
 
 	ret = wma_cli_set_command(adapter->sessionId,
@@ -639,7 +639,7 @@
 	if (0 != ret) {
 		hddLog(CDF_TRACE_LEVEL_ERROR,
 		       FL("WMA_VDEV_IBSS_SET_ATIM_WINDOW_SIZE failed %d"), ret);
-		return CDF_STATUS_E_FAILURE;
+		return QDF_STATUS_E_FAILURE;
 	}
 
 	ret = wma_cli_set_command(adapter->sessionId,
@@ -650,7 +650,7 @@
 		hddLog(CDF_TRACE_LEVEL_ERROR,
 		       FL("WMA_VDEV_IBSS_SET_POWER_SAVE_ALLOWED failed %d"),
 		       ret);
-		return CDF_STATUS_E_FAILURE;
+		return QDF_STATUS_E_FAILURE;
 	}
 
 	ret = wma_cli_set_command(adapter->sessionId,
@@ -661,7 +661,7 @@
 		hddLog(CDF_TRACE_LEVEL_ERROR,
 		       FL("WMA_VDEV_IBSS_SET_POWER_COLLAPSE_ALLOWED failed %d"),
 		       ret);
-		return CDF_STATUS_E_FAILURE;
+		return QDF_STATUS_E_FAILURE;
 	}
 
 	ret = wma_cli_set_command(adapter->sessionId,
@@ -671,7 +671,7 @@
 	if (0 != ret) {
 		hddLog(CDF_TRACE_LEVEL_ERROR,
 		       FL("WMA_VDEV_IBSS_SET_AWAKE_ON_TX_RX failed %d"), ret);
-		return CDF_STATUS_E_FAILURE;
+		return QDF_STATUS_E_FAILURE;
 	}
 
 	ret = wma_cli_set_command(adapter->sessionId,
@@ -681,7 +681,7 @@
 	if (0 != ret) {
 		hddLog(CDF_TRACE_LEVEL_ERROR,
 		       FL("WMA_VDEV_IBSS_SET_INACTIVITY_TIME failed %d"), ret);
-		return CDF_STATUS_E_FAILURE;
+		return QDF_STATUS_E_FAILURE;
 	}
 
 	ret = wma_cli_set_command(adapter->sessionId,
@@ -694,7 +694,7 @@
 			  "WMA_VDEV_IBSS_SET_TXSP_END_INACTIVITY_TIME failed %d"
 			 ),
 		       ret);
-		return CDF_STATUS_E_FAILURE;
+		return QDF_STATUS_E_FAILURE;
 	}
 
 	ret = wma_cli_set_command(adapter->sessionId,
@@ -705,7 +705,7 @@
 		hddLog(CDF_TRACE_LEVEL_ERROR,
 		       FL("WMA_VDEV_IBSS_PS_SET_WARMUP_TIME_SECS failed %d"),
 		       ret);
-		return CDF_STATUS_E_FAILURE;
+		return QDF_STATUS_E_FAILURE;
 	}
 
 	ret = wma_cli_set_command(adapter->sessionId,
@@ -718,10 +718,10 @@
 			  "WMA_VDEV_IBSS_PS_SET_1RX_CHAIN_IN_ATIM_WINDOW failed %d"
 			 ),
 		       ret);
-		return CDF_STATUS_E_FAILURE;
+		return QDF_STATUS_E_FAILURE;
 	}
 
-	return CDF_STATUS_SUCCESS;
+	return QDF_STATUS_SUCCESS;
 }
 
 #define INTF_MACADDR_MASK       0x7
@@ -818,7 +818,7 @@
 static void hdd_update_tgt_ht_cap(hdd_context_t *hdd_ctx,
 				  struct wma_tgt_ht_cap *cfg)
 {
-	CDF_STATUS status;
+	QDF_STATUS status;
 	uint32_t value, val32;
 	uint16_t val16;
 	struct hdd_config *pconfig = hdd_ctx->config;
@@ -833,7 +833,7 @@
 	/* get the MPDU density */
 	status = sme_cfg_get_int(hdd_ctx->hHal, WNI_CFG_MPDU_DENSITY, &value);
 
-	if (status != CDF_STATUS_SUCCESS) {
+	if (status != QDF_STATUS_SUCCESS) {
 		hddLog(CDF_TRACE_LEVEL_ERROR,
 		       FL("could not get MPDU DENSITY"));
 		value = 0;
@@ -848,14 +848,14 @@
 		status = sme_cfg_set_int(hdd_ctx->hHal, WNI_CFG_MPDU_DENSITY,
 					 cfg->mpdu_density);
 
-		if (status == CDF_STATUS_E_FAILURE)
+		if (status == QDF_STATUS_E_FAILURE)
 			hddLog(CDF_TRACE_LEVEL_FATAL,
 			       FL("could not set MPDU DENSITY to CCM"));
 	}
 
 	/* get the HT capability info */
 	status = sme_cfg_get_int(hdd_ctx->hHal, WNI_CFG_HT_CAP_INFO, &val32);
-	if (CDF_STATUS_SUCCESS != status) {
+	if (QDF_STATUS_SUCCESS != status) {
 		hddLog(CDF_TRACE_LEVEL_ERROR,
 		       FL("could not get HT capability info"));
 		return;
@@ -888,7 +888,7 @@
 		if (sme_cfg_set_int(hdd_ctx->hHal,
 				    WNI_CFG_VHT_RX_HIGHEST_SUPPORTED_DATA_RATE,
 				    HDD_VHT_RX_HIGHEST_SUPPORTED_DATA_RATE_1_1)
-				== CDF_STATUS_E_FAILURE) {
+				== QDF_STATUS_E_FAILURE) {
 			hddLog(LOGE,
 			       FL(
 				  "Could not pass on WNI_CFG_VHT_RX_HIGHEST_SUPPORTED_DATA_RATE to CCM"
@@ -900,7 +900,7 @@
 			    (hdd_ctx->hHal,
 			     WNI_CFG_VHT_TX_HIGHEST_SUPPORTED_DATA_RATE,
 			     HDD_VHT_TX_HIGHEST_SUPPORTED_DATA_RATE_1_1) ==
-			    CDF_STATUS_E_FAILURE) {
+			    QDF_STATUS_E_FAILURE) {
 			hddLog(LOGE,
 			       FL(
 				  "Could not pass on HDD_VHT_RX_HIGHEST_SUPPORTED_DATA_RATE_1_1 to CCM"
@@ -913,13 +913,13 @@
 
 	val32 = val16;
 	status = sme_cfg_set_int(hdd_ctx->hHal, WNI_CFG_HT_CAP_INFO, val32);
-	if (status != CDF_STATUS_SUCCESS)
+	if (status != QDF_STATUS_SUCCESS)
 		hddLog(CDF_TRACE_LEVEL_FATAL,
 		       FL("could not set HT capability to CCM"));
 #define WLAN_HDD_RX_MCS_ALL_NSTREAM_RATES 0xff
 	value = SIZE_OF_SUPPORTED_MCS_SET;
 	if (sme_cfg_get_str(hdd_ctx->hHal, WNI_CFG_SUPPORTED_MCS_SET, mcs_set,
-			    &value) == CDF_STATUS_SUCCESS) {
+			    &value) == QDF_STATUS_SUCCESS) {
 		hddLog(CDF_TRACE_LEVEL_INFO, FL("Read MCS rate set"));
 
 		if (pconfig->enable2x2) {
@@ -932,7 +932,7 @@
 						WNI_CFG_SUPPORTED_MCS_SET,
 						mcs_set,
 						SIZE_OF_SUPPORTED_MCS_SET);
-			if (status == CDF_STATUS_E_FAILURE)
+			if (status == QDF_STATUS_E_FAILURE)
 				hddLog(CDF_TRACE_LEVEL_FATAL,
 				       FL("could not set MCS SET to CCM"));
 		}
@@ -944,7 +944,7 @@
 static void hdd_update_tgt_vht_cap(hdd_context_t *hdd_ctx,
 				   struct wma_tgt_vht_cap *cfg)
 {
-	CDF_STATUS status;
+	QDF_STATUS status;
 	uint32_t value = 0;
 	struct hdd_config *pconfig = hdd_ctx->config;
 	struct wiphy *wiphy = hdd_ctx->wiphy;
@@ -956,7 +956,7 @@
 		sme_cfg_get_int(hdd_ctx->hHal, WNI_CFG_VHT_MAX_MPDU_LENGTH,
 				&value);
 
-	if (status != CDF_STATUS_SUCCESS) {
+	if (status != QDF_STATUS_SUCCESS) {
 		hddLog(CDF_TRACE_LEVEL_ERROR, FL("could not get MPDU LENGTH"));
 		value = 0;
 	}
@@ -971,7 +971,7 @@
 					 WNI_CFG_VHT_MAX_MPDU_LENGTH,
 					 cfg->vht_max_mpdu);
 
-		if (status == CDF_STATUS_E_FAILURE) {
+		if (status == QDF_STATUS_E_FAILURE) {
 			hddLog(CDF_TRACE_LEVEL_FATAL,
 			       FL("could not set VHT MAX MPDU LENGTH"));
 		}
@@ -982,7 +982,7 @@
 				WNI_CFG_VHT_SUPPORTED_CHAN_WIDTH_SET,
 				&value);
 
-	if (status != CDF_STATUS_SUCCESS) {
+	if (status != QDF_STATUS_SUCCESS) {
 		hddLog(CDF_TRACE_LEVEL_ERROR,
 		       FL("could not get MPDU LENGTH"));
 		value = 0;
@@ -993,7 +993,7 @@
 		sme_cfg_get_int(hdd_ctx->hHal, WNI_CFG_VHT_LDPC_CODING_CAP,
 				&value);
 
-	if (status != CDF_STATUS_SUCCESS) {
+	if (status != QDF_STATUS_SUCCESS) {
 		hddLog(CDF_TRACE_LEVEL_ERROR,
 		       FL("could not get VHT LDPC CODING CAP"));
 		value = 0;
@@ -1005,7 +1005,7 @@
 					 WNI_CFG_VHT_LDPC_CODING_CAP,
 					 cfg->vht_rx_ldpc);
 
-		if (status == CDF_STATUS_E_FAILURE) {
+		if (status == QDF_STATUS_E_FAILURE) {
 			hddLog(CDF_TRACE_LEVEL_FATAL,
 			       FL("could not set VHT LDPC CODING CAP to CCM"));
 		}
@@ -1015,7 +1015,7 @@
 	status = sme_cfg_get_int(hdd_ctx->hHal, WNI_CFG_VHT_SHORT_GI_80MHZ,
 				&value);
 
-	if (status != CDF_STATUS_SUCCESS) {
+	if (status != QDF_STATUS_SUCCESS) {
 		hddLog(CDF_TRACE_LEVEL_ERROR,
 		       FL("could not get SHORT GI 80MHZ"));
 		value = 0;
@@ -1027,7 +1027,7 @@
 					 WNI_CFG_VHT_SHORT_GI_80MHZ,
 					 cfg->vht_short_gi_80);
 
-		if (status == CDF_STATUS_E_FAILURE) {
+		if (status == QDF_STATUS_E_FAILURE) {
 			hddLog(CDF_TRACE_LEVEL_FATAL,
 			       FL("could not set SHORT GI 80MHZ to CCM"));
 		}
@@ -1038,7 +1038,7 @@
 				 WNI_CFG_VHT_SHORT_GI_160_AND_80_PLUS_80MHZ,
 				 &value);
 
-	if (status != CDF_STATUS_SUCCESS) {
+	if (status != QDF_STATUS_SUCCESS) {
 		hddLog(CDF_TRACE_LEVEL_ERROR,
 		       FL("could not get SHORT GI 80 & 160"));
 		value = 0;
@@ -1047,7 +1047,7 @@
 	/* Get VHT TX STBC cap */
 	status = sme_cfg_get_int(hdd_ctx->hHal, WNI_CFG_VHT_TXSTBC, &value);
 
-	if (status != CDF_STATUS_SUCCESS) {
+	if (status != QDF_STATUS_SUCCESS) {
 		hddLog(CDF_TRACE_LEVEL_ERROR,
 		       FL("could not get VHT TX STBC"));
 		value = 0;
@@ -1058,7 +1058,7 @@
 		status = sme_cfg_set_int(hdd_ctx->hHal, WNI_CFG_VHT_TXSTBC,
 					 cfg->vht_tx_stbc);
 
-		if (status == CDF_STATUS_E_FAILURE) {
+		if (status == QDF_STATUS_E_FAILURE) {
 			hddLog(CDF_TRACE_LEVEL_FATAL,
 			       FL("could not set the VHT TX STBC to CCM"));
 		}
@@ -1067,7 +1067,7 @@
 	/* Get VHT RX STBC cap */
 	status = sme_cfg_get_int(hdd_ctx->hHal, WNI_CFG_VHT_RXSTBC, &value);
 
-	if (status != CDF_STATUS_SUCCESS) {
+	if (status != QDF_STATUS_SUCCESS) {
 		hddLog(CDF_TRACE_LEVEL_ERROR,
 		       FL("could not get VHT RX STBC"));
 		value = 0;
@@ -1078,7 +1078,7 @@
 		status = sme_cfg_set_int(hdd_ctx->hHal, WNI_CFG_VHT_RXSTBC,
 					 cfg->vht_rx_stbc);
 
-		if (status == CDF_STATUS_E_FAILURE) {
+		if (status == QDF_STATUS_E_FAILURE) {
 			hddLog(CDF_TRACE_LEVEL_FATAL,
 			       FL("could not set the VHT RX STBC to CCM"));
 		}
@@ -1088,7 +1088,7 @@
 	status = sme_cfg_get_int(hdd_ctx->hHal, WNI_CFG_VHT_SU_BEAMFORMER_CAP,
 				 &value);
 
-	if (status != CDF_STATUS_SUCCESS) {
+	if (status != QDF_STATUS_SUCCESS) {
 		hddLog(CDF_TRACE_LEVEL_ERROR,
 		       FL("could not get VHT SU BEAMFORMER CAP"));
 		value = 0;
@@ -1100,7 +1100,7 @@
 					 WNI_CFG_VHT_SU_BEAMFORMER_CAP,
 					 cfg->vht_su_bformer);
 
-		if (status == CDF_STATUS_E_FAILURE) {
+		if (status == QDF_STATUS_E_FAILURE) {
 			hddLog(CDF_TRACE_LEVEL_FATAL,
 			       FL("could not set VHT SU BEAMFORMER CAP"));
 		}
@@ -1114,7 +1114,7 @@
 				 WNI_CFG_VHT_SU_BEAMFORMEE_CAP,
 				 pconfig->enableTxBF);
 
-	if (status == CDF_STATUS_E_FAILURE) {
+	if (status == QDF_STATUS_E_FAILURE) {
 		hddLog(CDF_TRACE_LEVEL_FATAL,
 		       FL("could not set VHT SU BEAMFORMEE CAP"));
 	}
@@ -1123,7 +1123,7 @@
 	status = sme_cfg_get_int(hdd_ctx->hHal, WNI_CFG_VHT_MU_BEAMFORMER_CAP,
 				 &value);
 
-	if (status != CDF_STATUS_SUCCESS) {
+	if (status != QDF_STATUS_SUCCESS) {
 		hddLog(CDF_TRACE_LEVEL_ERROR,
 		       FL("could not get VHT MU BEAMFORMER CAP"));
 		value = 0;
@@ -1135,7 +1135,7 @@
 					 WNI_CFG_VHT_MU_BEAMFORMER_CAP,
 					 cfg->vht_mu_bformer);
 
-		if (status == CDF_STATUS_E_FAILURE) {
+		if (status == QDF_STATUS_E_FAILURE) {
 			hddLog(CDF_TRACE_LEVEL_FATAL,
 			       FL(
 				  "could not set the VHT MU BEAMFORMER CAP to CCM"
@@ -1147,7 +1147,7 @@
 	status = sme_cfg_get_int(hdd_ctx->hHal, WNI_CFG_VHT_MU_BEAMFORMEE_CAP,
 				 &value);
 
-	if (status != CDF_STATUS_SUCCESS) {
+	if (status != QDF_STATUS_SUCCESS) {
 		hddLog(CDF_TRACE_LEVEL_ERROR,
 		       FL("could not get VHT MU BEAMFORMEE CAP"));
 		value = 0;
@@ -1159,7 +1159,7 @@
 					 WNI_CFG_VHT_MU_BEAMFORMEE_CAP,
 					 cfg->vht_mu_bformee);
 
-		if (status == CDF_STATUS_E_FAILURE) {
+		if (status == QDF_STATUS_E_FAILURE) {
 			hddLog(CDF_TRACE_LEVEL_FATAL,
 			       FL("could not set VHT MU BEAMFORMER CAP"));
 		}
@@ -1169,7 +1169,7 @@
 	status = sme_cfg_get_int(hdd_ctx->hHal, WNI_CFG_VHT_AMPDU_LEN_EXPONENT,
 				 &value);
 
-	if (status != CDF_STATUS_SUCCESS) {
+	if (status != QDF_STATUS_SUCCESS) {
 		hddLog(CDF_TRACE_LEVEL_ERROR,
 		       FL("could not get VHT AMPDU LEN"));
 		value = 0;
@@ -1188,7 +1188,7 @@
 					 WNI_CFG_VHT_AMPDU_LEN_EXPONENT,
 					 cfg->vht_max_ampdu_len_exp);
 
-		if (status == CDF_STATUS_E_FAILURE) {
+		if (status == QDF_STATUS_E_FAILURE) {
 			hddLog(CDF_TRACE_LEVEL_FATAL,
 			       FL("could not set the VHT AMPDU LEN EXP"));
 		}
@@ -1197,7 +1197,7 @@
 	/* Get VHT TXOP PS CAP */
 	status = sme_cfg_get_int(hdd_ctx->hHal, WNI_CFG_VHT_TXOP_PS, &value);
 
-	if (status != CDF_STATUS_SUCCESS) {
+	if (status != QDF_STATUS_SUCCESS) {
 		hddLog(CDF_TRACE_LEVEL_ERROR,
 		       FL("could not get VHT TXOP PS"));
 		value = 0;
@@ -1208,7 +1208,7 @@
 		status = sme_cfg_set_int(hdd_ctx->hHal, WNI_CFG_VHT_TXOP_PS,
 					 cfg->vht_txop_ps);
 
-		if (status == CDF_STATUS_E_FAILURE) {
+		if (status == QDF_STATUS_E_FAILURE) {
 			hddLog(CDF_TRACE_LEVEL_FATAL,
 			       FL("could not set the VHT TXOP PS"));
 		}
@@ -1352,7 +1352,7 @@
 		(struct wma_dfs_radar_ind *)param;
 	hdd_adapter_list_node_t *adapterNode = NULL, *pNext = NULL;
 	hdd_adapter_t *adapter;
-	CDF_STATUS status;
+	QDF_STATUS status;
 
 	if (!hdd_ctx || !hdd_radar_event ||
 		 hdd_ctx->config->disableDFSChSwitch)
@@ -1373,7 +1373,7 @@
 		mutex_unlock(&hdd_ctx->dfs_lock);
 
 		status = hdd_get_front_adapter(hdd_ctx, &adapterNode);
-		while (NULL != adapterNode && CDF_STATUS_SUCCESS == status) {
+		while (NULL != adapterNode && QDF_STATUS_SUCCESS == status) {
 			adapter = adapterNode->pAdapter;
 			if (WLAN_HDD_SOFTAP == adapter->device_mode ||
 			    WLAN_HDD_P2P_GO == adapter->device_mode) {
@@ -1636,7 +1636,7 @@
 	hdd_adapter_t *adapter = WLAN_HDD_GET_PRIV_PTR(dev);
 	hdd_context_t *hdd_ctx;
 	struct sockaddr *psta_mac_addr = addr;
-	CDF_STATUS cdf_ret_status = CDF_STATUS_SUCCESS;
+	QDF_STATUS cdf_ret_status = QDF_STATUS_SUCCESS;
 	int ret;
 
 	ENTER();
@@ -1931,51 +1931,51 @@
 	return adapter;
 }
 
-CDF_STATUS hdd_register_interface(hdd_adapter_t *adapter,
+QDF_STATUS hdd_register_interface(hdd_adapter_t *adapter,
 				  bool rtnl_held)
 {
 	struct net_device *pWlanDev = adapter->dev;
 	/* hdd_station_ctx_t *pHddStaCtx = &adapter->sessionCtx.station; */
 	/* hdd_context_t *hdd_ctx = WLAN_HDD_GET_CTX( adapter ); */
-	/* CDF_STATUS cdf_ret_status = CDF_STATUS_SUCCESS; */
+	/* QDF_STATUS cdf_ret_status = QDF_STATUS_SUCCESS; */
 
 	if (rtnl_held) {
 		if (strnchr(pWlanDev->name, strlen(pWlanDev->name), '%')) {
 			if (dev_alloc_name(pWlanDev, pWlanDev->name) < 0) {
 				hddLog(CDF_TRACE_LEVEL_ERROR,
 				       FL("Failed:dev_alloc_name"));
-				return CDF_STATUS_E_FAILURE;
+				return QDF_STATUS_E_FAILURE;
 			}
 		}
 		if (register_netdevice(pWlanDev)) {
 			hddLog(CDF_TRACE_LEVEL_ERROR,
 			       FL("Failed:register_netdev"));
-			return CDF_STATUS_E_FAILURE;
+			return QDF_STATUS_E_FAILURE;
 		}
 	} else {
 		if (register_netdev(pWlanDev)) {
 			hddLog(CDF_TRACE_LEVEL_ERROR,
 			       FL("Failed:register_netdev"));
-			return CDF_STATUS_E_FAILURE;
+			return QDF_STATUS_E_FAILURE;
 		}
 	}
 	set_bit(NET_DEVICE_REGISTERED, &adapter->event_flags);
 
-	return CDF_STATUS_SUCCESS;
+	return QDF_STATUS_SUCCESS;
 }
 
-static CDF_STATUS hdd_sme_close_session_callback(void *pContext)
+static QDF_STATUS hdd_sme_close_session_callback(void *pContext)
 {
 	hdd_adapter_t *adapter = pContext;
 
 	if (NULL == adapter) {
 		hddLog(CDF_TRACE_LEVEL_FATAL, FL("NULL adapter"));
-		return CDF_STATUS_E_INVAL;
+		return QDF_STATUS_E_INVAL;
 	}
 
 	if (WLAN_HDD_ADAPTER_MAGIC != adapter->magic) {
 		hddLog(CDF_TRACE_LEVEL_FATAL, FL("Invalid magic"));
-		return CDF_STATUS_NOT_INITIALIZED;
+		return QDF_STATUS_NOT_INITIALIZED;
 	}
 
 	clear_bit(SME_SESSION_OPENED, &adapter->event_flags);
@@ -2007,16 +2007,16 @@
 	if (WLAN_HDD_ADAPTER_MAGIC == adapter->magic)
 		complete(&adapter->session_close_comp_var);
 
-	return CDF_STATUS_SUCCESS;
+	return QDF_STATUS_SUCCESS;
 }
 
-CDF_STATUS hdd_init_station_mode(hdd_adapter_t *adapter)
+QDF_STATUS hdd_init_station_mode(hdd_adapter_t *adapter)
 {
 	struct net_device *pWlanDev = adapter->dev;
 	hdd_station_ctx_t *pHddStaCtx = &adapter->sessionCtx.station;
 	hdd_context_t *hdd_ctx = WLAN_HDD_GET_CTX(adapter);
-	CDF_STATUS cdf_ret_status = CDF_STATUS_SUCCESS;
-	CDF_STATUS status = CDF_STATUS_E_FAILURE;
+	QDF_STATUS cdf_ret_status = QDF_STATUS_SUCCESS;
+	QDF_STATUS status = QDF_STATUS_E_FAILURE;
 	uint32_t type, subType;
 	unsigned long rc;
 	int ret_val;
@@ -2024,7 +2024,7 @@
 	INIT_COMPLETION(adapter->session_open_comp_var);
 	sme_set_curr_device_mode(hdd_ctx->hHal, adapter->device_mode);
 	status = cds_get_vdev_types(adapter->device_mode, &type, &subType);
-	if (CDF_STATUS_SUCCESS != status) {
+	if (QDF_STATUS_SUCCESS != status) {
 		hddLog(LOGE, FL("failed to get vdev type"));
 		goto error_sme_open;
 	}
@@ -2033,11 +2033,11 @@
 		sme_open_session(hdd_ctx->hHal, hdd_sme_roam_callback, adapter,
 				 (uint8_t *) &adapter->macAddressCurrent,
 				 &adapter->sessionId, type, subType);
-	if (!CDF_IS_STATUS_SUCCESS(cdf_ret_status)) {
+	if (!QDF_IS_STATUS_SUCCESS(cdf_ret_status)) {
 		hddLog(LOGP,
 		       FL("sme_open_session() failed, status code %08d [x%08x]"),
 		       cdf_ret_status, cdf_ret_status);
-		status = CDF_STATUS_E_FAILURE;
+		status = QDF_STATUS_E_FAILURE;
 		goto error_sme_open;
 	}
 	/* Block on a completion variable. Can't wait forever though. */
@@ -2048,17 +2048,17 @@
 		hddLog(LOGP,
 			FL("Session is not opened within timeout period code %ld"),
 			rc);
-		status = CDF_STATUS_E_FAILURE;
+		status = QDF_STATUS_E_FAILURE;
 		goto error_sme_open;
 	}
 
 	/* Register wireless extensions */
 	cdf_ret_status = hdd_register_wext(pWlanDev);
-	if (CDF_STATUS_SUCCESS != cdf_ret_status) {
+	if (QDF_STATUS_SUCCESS != cdf_ret_status) {
 		hddLog(LOGP,
 		       FL("hdd_register_wext() failed, status code %08d [x%08x]"),
 		       cdf_ret_status, cdf_ret_status);
-		status = CDF_STATUS_E_FAILURE;
+		status = QDF_STATUS_E_FAILURE;
 		goto error_register_wext;
 	}
 	/* Set the Connection State to Not Connected */
@@ -2074,7 +2074,7 @@
 	pHddStaCtx->conn_info.authType = eCSR_AUTH_TYPE_OPEN_SYSTEM;
 
 	status = hdd_init_tx_rx(adapter);
-	if (CDF_STATUS_SUCCESS != status) {
+	if (QDF_STATUS_SUCCESS != status) {
 		hddLog(LOGP,
 		       FL("hdd_init_tx_rx() failed, status code %08d [x%08x]"),
 		       status, status);
@@ -2084,7 +2084,7 @@
 	set_bit(INIT_TX_RX_SUCCESS, &adapter->event_flags);
 
 	status = hdd_wmm_adapter_init(adapter);
-	if (CDF_STATUS_SUCCESS != status) {
+	if (QDF_STATUS_SUCCESS != status) {
 		hddLog(LOGP,
 		       FL("hdd_wmm_adapter_init() failed, status code %08d [x%08x]"),
 		       status, status);
@@ -2105,14 +2105,14 @@
 	}
 #ifdef FEATURE_WLAN_TDLS
 	if (0 != wlan_hdd_tdls_init(adapter)) {
-		status = CDF_STATUS_E_FAILURE;
+		status = QDF_STATUS_E_FAILURE;
 		hddLog(LOGE, FL("wlan_hdd_tdls_init failed"));
 		goto error_tdls_init;
 	}
 	set_bit(TDLS_INIT_DONE, &adapter->event_flags);
 #endif
 
-	return CDF_STATUS_SUCCESS;
+	return QDF_STATUS_SUCCESS;
 
 #ifdef FEATURE_WLAN_TDLS
 error_tdls_init:
@@ -2127,7 +2127,7 @@
 error_register_wext:
 	if (test_bit(SME_SESSION_OPENED, &adapter->event_flags)) {
 		INIT_COMPLETION(adapter->session_close_comp_var);
-		if (CDF_STATUS_SUCCESS == sme_close_session(hdd_ctx->hHal,
+		if (QDF_STATUS_SUCCESS == sme_close_session(hdd_ctx->hHal,
 							    adapter->sessionId,
 							    hdd_sme_close_session_callback,
 							    adapter)) {
@@ -2263,24 +2263,24 @@
 	}
 }
 
-CDF_STATUS hdd_check_for_existing_macaddr(hdd_context_t *hdd_ctx,
+QDF_STATUS hdd_check_for_existing_macaddr(hdd_context_t *hdd_ctx,
 					  tSirMacAddr macAddr)
 {
 	hdd_adapter_list_node_t *adapterNode = NULL, *pNext = NULL;
 	hdd_adapter_t *adapter;
-	CDF_STATUS status;
+	QDF_STATUS status;
 	status = hdd_get_front_adapter(hdd_ctx, &adapterNode);
-	while (NULL != adapterNode && CDF_STATUS_SUCCESS == status) {
+	while (NULL != adapterNode && QDF_STATUS_SUCCESS == status) {
 		adapter = adapterNode->pAdapter;
 		if (adapter
 		    && cdf_mem_compare(adapter->macAddressCurrent.bytes,
 				       macAddr, sizeof(tSirMacAddr))) {
-			return CDF_STATUS_E_FAILURE;
+			return QDF_STATUS_E_FAILURE;
 		}
 		status = hdd_get_next_adapter(hdd_ctx, adapterNode, &pNext);
 		adapterNode = pNext;
 	}
-	return CDF_STATUS_SUCCESS;
+	return QDF_STATUS_SUCCESS;
 }
 hdd_adapter_t *hdd_open_adapter(hdd_context_t *hdd_ctx, uint8_t session_type,
 				const char *iface_name, tSirMacAddr macAddr,
@@ -2288,7 +2288,7 @@
 {
 	hdd_adapter_t *adapter = NULL;
 	hdd_adapter_list_node_t *pHddAdapterNode = NULL;
-	CDF_STATUS status = CDF_STATUS_E_FAILURE;
+	QDF_STATUS status = QDF_STATUS_E_FAILURE;
 	hdd_cfg80211_state_t *cfgState;
 	int ret;
 
@@ -2316,7 +2316,7 @@
 		return NULL;
 	}
 	status = hdd_check_for_existing_macaddr(hdd_ctx, macAddr);
-	if (CDF_STATUS_E_FAILURE == status) {
+	if (QDF_STATUS_E_FAILURE == status) {
 		hddLog(CDF_TRACE_LEVEL_ERROR,
 		       "Duplicate MAC addr: " MAC_ADDRESS_STR
 		       " already exists",
@@ -2353,7 +2353,7 @@
 		adapter->device_mode = session_type;
 
 		status = hdd_init_station_mode(adapter);
-		if (CDF_STATUS_SUCCESS != status)
+		if (QDF_STATUS_SUCCESS != status)
 			goto err_free_netdev;
 
 		hdd_lro_enable(hdd_ctx, adapter);
@@ -2384,7 +2384,7 @@
 #endif
 #endif
 		status = hdd_register_interface(adapter, rtnl_held);
-		if (CDF_STATUS_SUCCESS != status) {
+		if (QDF_STATUS_SUCCESS != status) {
 			hdd_deinit_adapter(hdd_ctx, adapter, rtnl_held);
 			goto err_lro_cleanup;
 		}
@@ -2422,11 +2422,11 @@
 		adapter->device_mode = session_type;
 
 		status = hdd_init_ap_mode(adapter);
-		if (CDF_STATUS_SUCCESS != status)
+		if (QDF_STATUS_SUCCESS != status)
 			goto err_free_netdev;
 
 		status = hdd_register_hostapd(adapter, rtnl_held);
-		if (CDF_STATUS_SUCCESS != status) {
+		if (QDF_STATUS_SUCCESS != status) {
 			hdd_deinit_adapter(hdd_ctx, adapter, rtnl_held);
 			goto err_free_netdev;
 		}
@@ -2480,19 +2480,19 @@
 	cfgState = WLAN_HDD_GET_CFG_STATE_PTR(adapter);
 	mutex_init(&cfgState->remain_on_chan_ctx_lock);
 
-	if (CDF_STATUS_SUCCESS == status) {
+	if (QDF_STATUS_SUCCESS == status) {
 		/* Add it to the hdd's session list. */
 		pHddAdapterNode =
 			cdf_mem_malloc(sizeof(hdd_adapter_list_node_t));
 		if (NULL == pHddAdapterNode) {
-			status = CDF_STATUS_E_NOMEM;
+			status = QDF_STATUS_E_NOMEM;
 		} else {
 			pHddAdapterNode->pAdapter = adapter;
 			status = hdd_add_adapter_back(hdd_ctx, pHddAdapterNode);
 		}
 	}
 
-	if (CDF_STATUS_SUCCESS != status) {
+	if (QDF_STATUS_SUCCESS != status) {
 		if (NULL != adapter) {
 			hdd_cleanup_adapter(hdd_ctx, adapter, rtnl_held);
 			adapter = NULL;
@@ -2503,7 +2503,7 @@
 		return NULL;
 	}
 
-	if (CDF_STATUS_SUCCESS == status) {
+	if (QDF_STATUS_SUCCESS == status) {
 		cds_set_concurrency_mode(session_type);
 
 		/* Initialize the WoWL service */
@@ -2665,14 +2665,14 @@
 	return NULL;
 }
 
-CDF_STATUS hdd_close_adapter(hdd_context_t *hdd_ctx, hdd_adapter_t *adapter,
+QDF_STATUS hdd_close_adapter(hdd_context_t *hdd_ctx, hdd_adapter_t *adapter,
 			     bool rtnl_held)
 {
 	hdd_adapter_list_node_t *adapterNode, *pCurrent, *pNext;
-	CDF_STATUS status;
+	QDF_STATUS status;
 
 	status = hdd_get_front_adapter(hdd_ctx, &pCurrent);
-	if (CDF_STATUS_SUCCESS != status) {
+	if (QDF_STATUS_SUCCESS != status) {
 		hddLog(CDF_TRACE_LEVEL_WARN, FL("adapter list empty %d"),
 		       status);
 		return status;
@@ -2680,13 +2680,13 @@
 
 	while (pCurrent->pAdapter != adapter) {
 		status = hdd_get_next_adapter(hdd_ctx, pCurrent, &pNext);
-		if (CDF_STATUS_SUCCESS != status)
+		if (QDF_STATUS_SUCCESS != status)
 			break;
 
 		pCurrent = pNext;
 	}
 	adapterNode = pCurrent;
-	if (CDF_STATUS_SUCCESS == status) {
+	if (QDF_STATUS_SUCCESS == status) {
 		cds_clear_concurrency_mode(adapter->device_mode);
 		hdd_cleanup_adapter(hdd_ctx, adapterNode->pAdapter, rtnl_held);
 
@@ -2699,9 +2699,9 @@
 			hdd_ctx->current_intf_count--;
 
 		/* Fw will take care incase of concurrency */
-		return CDF_STATUS_SUCCESS;
+		return QDF_STATUS_SUCCESS;
 	}
-	return CDF_STATUS_E_FAILURE;
+	return QDF_STATUS_E_FAILURE;
 }
 
 /**
@@ -2713,25 +2713,25 @@
  *
  * Return: CDF status code
  */
-CDF_STATUS hdd_close_all_adapters(hdd_context_t *hdd_ctx, bool rtnl_held)
+QDF_STATUS hdd_close_all_adapters(hdd_context_t *hdd_ctx, bool rtnl_held)
 {
 	hdd_adapter_list_node_t *pHddAdapterNode;
-	CDF_STATUS status;
+	QDF_STATUS status;
 
 	ENTER();
 
 	do {
 		status = hdd_remove_front_adapter(hdd_ctx, &pHddAdapterNode);
-		if (pHddAdapterNode && CDF_STATUS_SUCCESS == status) {
+		if (pHddAdapterNode && QDF_STATUS_SUCCESS == status) {
 			hdd_cleanup_adapter(hdd_ctx, pHddAdapterNode->pAdapter,
 					    rtnl_held);
 			cdf_mem_free(pHddAdapterNode);
 		}
-	} while (NULL != pHddAdapterNode && CDF_STATUS_E_EMPTY != status);
+	} while (NULL != pHddAdapterNode && QDF_STATUS_E_EMPTY != status);
 
 	EXIT();
 
-	return CDF_STATUS_SUCCESS;
+	return QDF_STATUS_SUCCESS;
 }
 
 void wlan_hdd_reset_prob_rspies(hdd_adapter_t *pHostapdAdapter)
@@ -2775,15 +2775,15 @@
 	updateIE.notify = false;
 	if (sme_update_add_ie(WLAN_HDD_GET_HAL_CTX(pHostapdAdapter),
 			      &updateIE,
-			      eUPDATE_IE_PROBE_RESP) == CDF_STATUS_E_FAILURE) {
+			      eUPDATE_IE_PROBE_RESP) == QDF_STATUS_E_FAILURE) {
 		hddLog(LOGE, FL("Could not pass on PROBE_RSP_BCN data to PE"));
 	}
 }
 
-CDF_STATUS hdd_stop_adapter(hdd_context_t *hdd_ctx, hdd_adapter_t *adapter,
+QDF_STATUS hdd_stop_adapter(hdd_context_t *hdd_ctx, hdd_adapter_t *adapter,
 			    const bool bCloseSession)
 {
-	CDF_STATUS cdf_ret_status = CDF_STATUS_SUCCESS;
+	QDF_STATUS cdf_ret_status = QDF_STATUS_SUCCESS;
 	hdd_wext_state_t *pWextState = WLAN_HDD_GET_WEXT_STATE_PTR(adapter);
 	union iwreq_data wrqu;
 	tSirUpdateIE updateIE;
@@ -2815,7 +2815,7 @@
 							    adapter->sessionId,
 							    eCSR_DISCONNECT_REASON_UNSPECIFIED);
 			/* success implies disconnect command got queued up successfully */
-			if (cdf_ret_status == CDF_STATUS_SUCCESS) {
+			if (cdf_ret_status == QDF_STATUS_SUCCESS) {
 				rc = wait_for_completion_timeout(
 					&adapter->disconnect_comp_var,
 					msecs_to_jiffies
@@ -2862,7 +2862,7 @@
 		if (true == bCloseSession &&
 		    test_bit(SME_SESSION_OPENED, &adapter->event_flags)) {
 			INIT_COMPLETION(adapter->session_close_comp_var);
-			if (CDF_STATUS_SUCCESS ==
+			if (QDF_STATUS_SUCCESS ==
 			    sme_close_session(hdd_ctx->hHal, adapter->sessionId,
 					      hdd_sme_close_session_callback,
 					      adapter)) {
@@ -2905,7 +2905,7 @@
 
 		mutex_lock(&hdd_ctx->sap_lock);
 		if (test_bit(SOFTAP_BSS_STARTED, &adapter->event_flags)) {
-			CDF_STATUS status;
+			QDF_STATUS status;
 			QDF_STATUS qdf_status;
 
 			/* Stop Bss. */
@@ -2917,7 +2917,7 @@
 				(WLAN_HDD_GET_CTX(adapter))->pcds_context);
 #endif
 
-			if (CDF_IS_STATUS_SUCCESS(status)) {
+			if (QDF_IS_STATUS_SUCCESS(status)) {
 				hdd_hostapd_state_t *hostapd_state =
 					WLAN_HDD_GET_HOSTAP_STATE_PTR(adapter);
 				qdf_event_reset(&hostapd_state->
@@ -2952,7 +2952,7 @@
 			/* Probe bcn reset */
 			if (sme_update_add_ie(WLAN_HDD_GET_HAL_CTX(adapter),
 					      &updateIE, eUPDATE_IE_PROBE_BCN)
-			    == CDF_STATUS_E_FAILURE) {
+			    == QDF_STATUS_E_FAILURE) {
 				hddLog(LOGE,
 				       FL(
 					  "Could not pass on PROBE_RSP_BCN data to PE"
@@ -2962,7 +2962,7 @@
 			if (sme_update_add_ie(WLAN_HDD_GET_HAL_CTX(adapter),
 					      &updateIE,
 					      eUPDATE_IE_ASSOC_RESP) ==
-			    CDF_STATUS_E_FAILURE) {
+			    QDF_STATUS_E_FAILURE) {
 				hddLog(LOGE,
 				       FL(
 					  "Could not pass on ASSOC_RSP data to PE"
@@ -2984,20 +2984,20 @@
 	}
 
 	EXIT();
-	return CDF_STATUS_SUCCESS;
+	return QDF_STATUS_SUCCESS;
 }
 
-CDF_STATUS hdd_stop_all_adapters(hdd_context_t *hdd_ctx)
+QDF_STATUS hdd_stop_all_adapters(hdd_context_t *hdd_ctx)
 {
 	hdd_adapter_list_node_t *adapterNode = NULL, *pNext = NULL;
-	CDF_STATUS status;
+	QDF_STATUS status;
 	hdd_adapter_t *adapter;
 
 	ENTER();
 
 	status = hdd_get_front_adapter(hdd_ctx, &adapterNode);
 
-	while (NULL != adapterNode && CDF_STATUS_SUCCESS == status) {
+	while (NULL != adapterNode && QDF_STATUS_SUCCESS == status) {
 		adapter = adapterNode->pAdapter;
 		hdd_stop_adapter(hdd_ctx, adapter, true);
 		status = hdd_get_next_adapter(hdd_ctx, adapterNode, &pNext);
@@ -3006,20 +3006,20 @@
 
 	EXIT();
 
-	return CDF_STATUS_SUCCESS;
+	return QDF_STATUS_SUCCESS;
 }
 
-CDF_STATUS hdd_reset_all_adapters(hdd_context_t *hdd_ctx)
+QDF_STATUS hdd_reset_all_adapters(hdd_context_t *hdd_ctx)
 {
 	hdd_adapter_list_node_t *adapterNode = NULL, *pNext = NULL;
-	CDF_STATUS status;
+	QDF_STATUS status;
 	hdd_adapter_t *adapter;
 
 	ENTER();
 
 	status = hdd_get_front_adapter(hdd_ctx, &adapterNode);
 
-	while (NULL != adapterNode && CDF_STATUS_SUCCESS == status) {
+	while (NULL != adapterNode && QDF_STATUS_SUCCESS == status) {
 		adapter = adapterNode->pAdapter;
 		hddLog(LOG1, FL("Disabling queues"));
 		wlan_hdd_netif_queue_control(adapter,
@@ -3042,13 +3042,13 @@
 
 	EXIT();
 
-	return CDF_STATUS_SUCCESS;
+	return QDF_STATUS_SUCCESS;
 }
 
-CDF_STATUS hdd_start_all_adapters(hdd_context_t *hdd_ctx)
+QDF_STATUS hdd_start_all_adapters(hdd_context_t *hdd_ctx)
 {
 	hdd_adapter_list_node_t *adapterNode = NULL, *pNext = NULL;
-	CDF_STATUS status;
+	QDF_STATUS status;
 	hdd_adapter_t *adapter;
 #ifndef MSM_PLATFORM
 	struct cdf_mac_addr bcastMac = CDF_MAC_ADDR_BROADCAST_INITIALIZER;
@@ -3059,7 +3059,7 @@
 
 	status = hdd_get_front_adapter(hdd_ctx, &adapterNode);
 
-	while (NULL != adapterNode && CDF_STATUS_SUCCESS == status) {
+	while (NULL != adapterNode && QDF_STATUS_SUCCESS == status) {
 		adapter = adapterNode->pAdapter;
 
 		hdd_wmm_init(adapter);
@@ -3142,10 +3142,10 @@
 
 	EXIT();
 
-	return CDF_STATUS_SUCCESS;
+	return QDF_STATUS_SUCCESS;
 }
 
-CDF_STATUS hdd_get_front_adapter(hdd_context_t *hdd_ctx,
+QDF_STATUS hdd_get_front_adapter(hdd_context_t *hdd_ctx,
 				 hdd_adapter_list_node_t **padapterNode)
 {
 	QDF_STATUS status;
@@ -3156,7 +3156,7 @@
 	return status;
 }
 
-CDF_STATUS hdd_get_next_adapter(hdd_context_t *hdd_ctx,
+QDF_STATUS hdd_get_next_adapter(hdd_context_t *hdd_ctx,
 				hdd_adapter_list_node_t *adapterNode,
 				hdd_adapter_list_node_t **pNextAdapterNode)
 {
@@ -3170,7 +3170,7 @@
 	return status;
 }
 
-CDF_STATUS hdd_remove_adapter(hdd_context_t *hdd_ctx,
+QDF_STATUS hdd_remove_adapter(hdd_context_t *hdd_ctx,
 			      hdd_adapter_list_node_t *adapterNode)
 {
 	QDF_STATUS status;
@@ -3181,7 +3181,7 @@
 	return status;
 }
 
-CDF_STATUS hdd_remove_front_adapter(hdd_context_t *hdd_ctx,
+QDF_STATUS hdd_remove_front_adapter(hdd_context_t *hdd_ctx,
 				    hdd_adapter_list_node_t **padapterNode)
 {
 	QDF_STATUS status;
@@ -3192,7 +3192,7 @@
 	return status;
 }
 
-CDF_STATUS hdd_add_adapter_back(hdd_context_t *hdd_ctx,
+QDF_STATUS hdd_add_adapter_back(hdd_context_t *hdd_ctx,
 				hdd_adapter_list_node_t *adapterNode)
 {
 	QDF_STATUS status;
@@ -3203,10 +3203,10 @@
 	return status;
 }
 
-CDF_STATUS hdd_add_adapter_front(hdd_context_t *hdd_ctx,
+QDF_STATUS hdd_add_adapter_front(hdd_context_t *hdd_ctx,
 				 hdd_adapter_list_node_t *adapterNode)
 {
-	CDF_STATUS status;
+	QDF_STATUS status;
 	cdf_spin_lock(&hdd_ctx->hdd_adapter_lock);
 	status = qdf_list_insert_front(&hdd_ctx->hddAdapters,
 				       (qdf_list_node_t *) adapterNode);
@@ -3219,11 +3219,11 @@
 {
 	hdd_adapter_list_node_t *adapterNode = NULL, *pNext = NULL;
 	hdd_adapter_t *adapter;
-	CDF_STATUS status;
+	QDF_STATUS status;
 
 	status = hdd_get_front_adapter(hdd_ctx, &adapterNode);
 
-	while (NULL != adapterNode && CDF_STATUS_SUCCESS == status) {
+	while (NULL != adapterNode && QDF_STATUS_SUCCESS == status) {
 		adapter = adapterNode->pAdapter;
 
 		if (adapter
@@ -3244,17 +3244,17 @@
 {
 	hdd_adapter_list_node_t *adapterNode = NULL, *pNext = NULL;
 	hdd_adapter_t *adapter;
-	CDF_STATUS cdf_status;
+	QDF_STATUS qdf_status;
 
-	cdf_status = hdd_get_front_adapter(hdd_ctx, &adapterNode);
+	qdf_status = hdd_get_front_adapter(hdd_ctx, &adapterNode);
 
-	while ((NULL != adapterNode) && (CDF_STATUS_SUCCESS == cdf_status)) {
+	while ((NULL != adapterNode) && (QDF_STATUS_SUCCESS == qdf_status)) {
 		adapter = adapterNode->pAdapter;
 
 		if (adapter->sessionId == vdev_id)
 			return adapter;
 
-		cdf_status =
+		qdf_status =
 			hdd_get_next_adapter(hdd_ctx, adapterNode, &pNext);
 		adapterNode = pNext;
 	}
@@ -3281,20 +3281,20 @@
 {
 	hdd_adapter_list_node_t *adapter_node = NULL, *next = NULL;
 	hdd_adapter_t *adapter;
-	CDF_STATUS cdf_status;
+	QDF_STATUS qdf_status;
 
 
-	cdf_status = hdd_get_front_adapter(hdd_ctx, &adapter_node);
+	qdf_status = hdd_get_front_adapter(hdd_ctx, &adapter_node);
 
 	while ((NULL != adapter_node) &&
-			(CDF_STATUS_SUCCESS == cdf_status)) {
+			(QDF_STATUS_SUCCESS == qdf_status)) {
 		adapter = adapter_node->pAdapter;
 
 		if (adapter &&
 			 adapter->sessionId == sme_session_id)
 			return adapter;
 
-		cdf_status =
+		qdf_status =
 			hdd_get_next_adapter(hdd_ctx,
 				 adapter_node, &next);
 		adapter_node = next;
@@ -3306,11 +3306,11 @@
 {
 	hdd_adapter_list_node_t *adapterNode = NULL, *pNext = NULL;
 	hdd_adapter_t *adapter;
-	CDF_STATUS status;
+	QDF_STATUS status;
 
 	status = hdd_get_front_adapter(hdd_ctx, &adapterNode);
 
-	while (NULL != adapterNode && CDF_STATUS_SUCCESS == status) {
+	while (NULL != adapterNode && QDF_STATUS_SUCCESS == status) {
 		adapter = adapterNode->pAdapter;
 
 		if (adapter && (mode == adapter->device_mode))
@@ -3342,13 +3342,13 @@
 uint8_t hdd_get_operating_channel(hdd_context_t *hdd_ctx, device_mode_t mode)
 {
 	hdd_adapter_list_node_t *adapterNode = NULL, *pNext = NULL;
-	CDF_STATUS status;
+	QDF_STATUS status;
 	hdd_adapter_t *adapter;
 	uint8_t operatingChannel = 0;
 
 	status = hdd_get_front_adapter(hdd_ctx, &adapterNode);
 
-	while (NULL != adapterNode && CDF_STATUS_SUCCESS == status) {
+	while (NULL != adapterNode && QDF_STATUS_SUCCESS == status) {
 		adapter = adapterNode->pAdapter;
 
 		if (mode == adapter->device_mode) {
@@ -3387,18 +3387,18 @@
 	return operatingChannel;
 }
 
-static inline CDF_STATUS hdd_unregister_wext_all_adapters(hdd_context_t *
+static inline QDF_STATUS hdd_unregister_wext_all_adapters(hdd_context_t *
 							  hdd_ctx)
 {
 	hdd_adapter_list_node_t *adapterNode = NULL, *pNext = NULL;
-	CDF_STATUS status;
+	QDF_STATUS status;
 	hdd_adapter_t *adapter;
 
 	ENTER();
 
 	status = hdd_get_front_adapter(hdd_ctx, &adapterNode);
 
-	while (NULL != adapterNode && CDF_STATUS_SUCCESS == status) {
+	while (NULL != adapterNode && QDF_STATUS_SUCCESS == status) {
 		adapter = adapterNode->pAdapter;
 		if ((adapter->device_mode == WLAN_HDD_INFRA_STATION) ||
 		    (adapter->device_mode == WLAN_HDD_P2P_CLIENT) ||
@@ -3415,20 +3415,20 @@
 
 	EXIT();
 
-	return CDF_STATUS_SUCCESS;
+	return QDF_STATUS_SUCCESS;
 }
 
-CDF_STATUS hdd_abort_mac_scan_all_adapters(hdd_context_t *hdd_ctx)
+QDF_STATUS hdd_abort_mac_scan_all_adapters(hdd_context_t *hdd_ctx)
 {
 	hdd_adapter_list_node_t *adapterNode = NULL, *pNext = NULL;
-	CDF_STATUS status;
+	QDF_STATUS status;
 	hdd_adapter_t *adapter;
 
 	ENTER();
 
 	status = hdd_get_front_adapter(hdd_ctx, &adapterNode);
 
-	while (NULL != adapterNode && CDF_STATUS_SUCCESS == status) {
+	while (NULL != adapterNode && QDF_STATUS_SUCCESS == status) {
 		adapter = adapterNode->pAdapter;
 		if ((adapter->device_mode == WLAN_HDD_INFRA_STATION) ||
 		    (adapter->device_mode == WLAN_HDD_P2P_CLIENT) ||
@@ -3445,7 +3445,7 @@
 
 	EXIT();
 
-	return CDF_STATUS_SUCCESS;
+	return QDF_STATUS_SUCCESS;
 }
 
 #ifdef WLAN_NS_OFFLOAD
@@ -3662,7 +3662,7 @@
 void hdd_wlan_exit(hdd_context_t *hdd_ctx)
 {
 	v_CONTEXT_t p_cds_context = hdd_ctx->pcds_context;
-	CDF_STATUS cdf_status;
+	QDF_STATUS qdf_status;
 	struct wiphy *wiphy = hdd_ctx->wiphy;
 
 	ENTER();
@@ -3704,7 +3704,7 @@
 		cdf_mc_timer_stop(&hdd_ctx->bus_bw_timer);
 	}
 
-	if (!CDF_IS_STATUS_SUCCESS
+	if (!QDF_IS_STATUS_SUCCESS
 		    (cdf_mc_timer_destroy(&hdd_ctx->bus_bw_timer))) {
 		hddLog(CDF_TRACE_LEVEL_ERROR,
 		       FL("Cannot deallocate Bus bandwidth timer"));
@@ -3717,7 +3717,7 @@
 		cdf_mc_timer_stop(&hdd_ctx->skip_acs_scan_timer);
 	}
 
-	if (!CDF_IS_STATUS_SUCCESS
+	if (!QDF_IS_STATUS_SUCCESS
 		    (cdf_mc_timer_destroy(&hdd_ctx->skip_acs_scan_timer))) {
 		hddLog(CDF_TRACE_LEVEL_ERROR,
 		       FL("Cannot deallocate ACS Skip timer"));
@@ -3729,7 +3729,7 @@
 		cdf_mc_timer_stop(&hdd_ctx->dbs_opportunistic_timer);
 	}
 
-	if (!CDF_IS_STATUS_SUCCESS
+	if (!QDF_IS_STATUS_SUCCESS
 			(cdf_mc_timer_destroy(
 				&hdd_ctx->dbs_opportunistic_timer))) {
 		hdd_err("Cannot deallocate dbs opportunistic timer");
@@ -3754,11 +3754,11 @@
 	hdd_stop_all_adapters(hdd_ctx);
 
 	/* Stop all the modules */
-	cdf_status = cds_disable(p_cds_context);
-	if (!CDF_IS_STATUS_SUCCESS(cdf_status)) {
+	qdf_status = cds_disable(p_cds_context);
+	if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
 		hddLog(CDF_TRACE_LEVEL_FATAL,
 		       FL("Failed to stop CDS"));
-		CDF_ASSERT(CDF_IS_STATUS_SUCCESS(cdf_status));
+		CDF_ASSERT(QDF_IS_STATUS_SUCCESS(qdf_status));
 	}
 
 	/*
@@ -3766,11 +3766,11 @@
 	 * is scheduled after the each module close is called i.e after all the
 	 * data structures are freed.
 	 */
-	cdf_status = cds_sched_close(p_cds_context);
-	if (!CDF_IS_STATUS_SUCCESS(cdf_status)) {
+	qdf_status = cds_sched_close(p_cds_context);
+	if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
 		hddLog(CDF_TRACE_LEVEL_FATAL,
 		       FL("Failed to close CDS Scheduler"));
-		CDF_ASSERT(CDF_IS_STATUS_SUCCESS(cdf_status));
+		CDF_ASSERT(QDF_IS_STATUS_SUCCESS(qdf_status));
 	}
 #ifdef WLAN_FEATURE_HOLD_RX_WAKELOCK
 	/* Destroy the wake lock */
@@ -3805,7 +3805,7 @@
 	qdf_list_destroy(&hdd_ctx->hdd_roc_req_q);
 	qdf_list_destroy(&hdd_ctx->hdd_scan_req_q);
 
-	if (!CDF_IS_STATUS_SUCCESS(cds_deinit_policy_mgr())) {
+	if (!QDF_IS_STATUS_SUCCESS(cds_deinit_policy_mgr())) {
 		hdd_err("Failed to deinit policy manager");
 		/* Proceed and complete the clean up */
 	}
@@ -3877,7 +3877,7 @@
 			     struct cdf_mac_addr macAddrSTA, int channel_type)
 {
 	int status;
-	CDF_STATUS cdf_status;
+	QDF_STATUS qdf_status;
 	hdd_context_t *hdd_ctx = NULL;
 
 	hdd_ctx = WLAN_HDD_GET_CTX(adapter);
@@ -3890,9 +3890,9 @@
 	if (!hdd_ctx->hHal)
 		return -EINVAL;
 
-	cdf_status = sme_notify_ht2040_mode(hdd_ctx->hHal, staId, macAddrSTA,
+	qdf_status = sme_notify_ht2040_mode(hdd_ctx->hHal, staId, macAddrSTA,
 					    adapter->sessionId, channel_type);
-	if (CDF_STATUS_SUCCESS != cdf_status) {
+	if (QDF_STATUS_SUCCESS != qdf_status) {
 		hddLog(LOGE, "Fail to send notification with ht2040 mode");
 		return -EINVAL;
 	}
@@ -3912,7 +3912,7 @@
 int hdd_wlan_notify_modem_power_state(int state)
 {
 	int status;
-	CDF_STATUS cdf_status;
+	QDF_STATUS qdf_status;
 	hdd_context_t *hdd_ctx;
 
 	hdd_ctx = cds_get_context(CDF_MODULE_ID_HDD);
@@ -3924,8 +3924,8 @@
 	if (!hdd_ctx->hHal)
 		return -EINVAL;
 
-	cdf_status = sme_notify_modem_power_state(hdd_ctx->hHal, state);
-	if (CDF_STATUS_SUCCESS != cdf_status) {
+	qdf_status = sme_notify_modem_power_state(hdd_ctx->hHal, state);
+	if (QDF_STATUS_SUCCESS != qdf_status) {
 		hddLog(LOGE,
 		       "Fail to send notification with modem power state %d",
 		       state);
@@ -3941,25 +3941,25 @@
  *
  * Return: None
  */
-CDF_STATUS hdd_post_cds_enable_config(hdd_context_t *hdd_ctx)
+QDF_STATUS hdd_post_cds_enable_config(hdd_context_t *hdd_ctx)
 {
-	CDF_STATUS cdf_ret_status;
+	QDF_STATUS cdf_ret_status;
 
 	/*
 	 * Send ready indication to the HDD.  This will kick off the MAC
 	 * into a 'running' state and should kick off an initial scan.
 	 */
 	cdf_ret_status = sme_hdd_ready_ind(hdd_ctx->hHal);
-	if (!CDF_IS_STATUS_SUCCESS(cdf_ret_status)) {
+	if (!QDF_IS_STATUS_SUCCESS(cdf_ret_status)) {
 		hddLog(CDF_TRACE_LEVEL_ERROR,
 		       FL(
 			  "sme_hdd_ready_ind() failed with status code %08d [x%08x]"
 			 ),
 		       cdf_ret_status, cdf_ret_status);
-		return CDF_STATUS_E_FAILURE;
+		return QDF_STATUS_E_FAILURE;
 	}
 
-	return CDF_STATUS_SUCCESS;
+	return QDF_STATUS_SUCCESS;
 }
 
 /* wake lock APIs for HDD */
@@ -4002,7 +4002,7 @@
 	tSirVersionType versionReported;
 	tSirVersionString versionString;
 	uint8_t fwFeatCapsMsgSupported = 0;
-	CDF_STATUS vstatus;
+	QDF_STATUS vstatus;
 
 	memset(&versionCompiled, 0, sizeof(versionCompiled));
 	memset(&versionReported, 0, sizeof(versionReported));
@@ -4012,7 +4012,7 @@
 
 		vstatus = sme_get_wcnss_wlan_compiled_version(hdd_ctx->hHal,
 							      &versionCompiled);
-		if (!CDF_IS_STATUS_SUCCESS(vstatus)) {
+		if (!QDF_IS_STATUS_SUCCESS(vstatus)) {
 			hddLog(CDF_TRACE_LEVEL_FATAL,
 			       FL(
 				  "unable to retrieve WCNSS WLAN compiled version"
@@ -4022,7 +4022,7 @@
 
 		vstatus = sme_get_wcnss_wlan_reported_version(hdd_ctx->hHal,
 							      &versionReported);
-		if (!CDF_IS_STATUS_SUCCESS(vstatus)) {
+		if (!QDF_IS_STATUS_SUCCESS(vstatus)) {
 			hddLog(CDF_TRACE_LEVEL_FATAL,
 			       FL(
 				  "unable to retrieve WCNSS WLAN reported version"
@@ -4057,7 +4057,7 @@
 		vstatus = sme_get_wcnss_software_version(hdd_ctx->hHal,
 							 versionString,
 							 sizeof(versionString));
-		if (!CDF_IS_STATUS_SUCCESS(vstatus)) {
+		if (!QDF_IS_STATUS_SUCCESS(vstatus)) {
 			hddLog(CDF_TRACE_LEVEL_FATAL,
 			       FL(
 				  "unable to retrieve WCNSS software version string"
@@ -4071,7 +4071,7 @@
 		vstatus = sme_get_wcnss_hardware_version(hdd_ctx->hHal,
 							 versionString,
 							 sizeof(versionString));
-		if (!CDF_IS_STATUS_SUCCESS(vstatus)) {
+		if (!QDF_IS_STATUS_SUCCESS(vstatus)) {
 			hddLog(CDF_TRACE_LEVEL_FATAL,
 			       FL(
 				  "unable to retrieve WCNSS hardware version string"
@@ -4117,7 +4117,7 @@
 }
 
 /* Initialize channel list in sme based on the country code */
-CDF_STATUS hdd_set_sme_chan_list(hdd_context_t *hdd_ctx)
+QDF_STATUS hdd_set_sme_chan_list(hdd_context_t *hdd_ctx)
 {
 	return sme_init_chan_list(hdd_ctx->hHal, hdd_ctx->reg.alpha2,
 				  hdd_ctx->reg.cc_src);
@@ -4140,10 +4140,10 @@
 	return true;
 }
 
-static CDF_STATUS wlan_hdd_regulatory_init(hdd_context_t *hdd_ctx)
+static QDF_STATUS wlan_hdd_regulatory_init(hdd_context_t *hdd_ctx)
 {
 	struct wiphy *wiphy;
-	CDF_STATUS status = CDF_STATUS_SUCCESS;
+	QDF_STATUS status = QDF_STATUS_SUCCESS;
 
 	wiphy = hdd_ctx->wiphy;
 
@@ -4152,7 +4152,7 @@
 	 * wiphy needs to be initialized before wiphy registration
 	 */
 	status = cds_regulatory_init();
-	if (!CDF_IS_STATUS_SUCCESS(status)) {
+	if (!QDF_IS_STATUS_SUCCESS(status)) {
 		hddLog(CDF_TRACE_LEVEL_FATAL,
 		       FL("cds_init_wiphy failed"));
 		return status;
@@ -4179,7 +4179,7 @@
 	/* registration of wiphy dev with cfg80211 */
 	if (0 > wlan_hdd_cfg80211_register(wiphy)) {
 		hddLog(CDF_TRACE_LEVEL_ERROR, FL("wiphy register failed"));
-		status = CDF_STATUS_E_FAILURE;
+		status = QDF_STATUS_E_FAILURE;
 	}
 
 	return status;
@@ -4274,12 +4274,12 @@
 	uint64_t tx_packets = 0, rx_packets = 0;
 	uint64_t total_tx = 0, total_rx = 0;
 	hdd_adapter_list_node_t *adapterNode = NULL;
-	CDF_STATUS status = 0;
+	QDF_STATUS status = 0;
 	bool connected = false;
 	uint32_t ipa_tx_packets = 0, ipa_rx_packets = 0;
 
 	for (status = hdd_get_front_adapter(hdd_ctx, &adapterNode);
-	     NULL != adapterNode && CDF_STATUS_SUCCESS == status;
+	     NULL != adapterNode && QDF_STATUS_SUCCESS == status;
 	     status =
 		     hdd_get_next_adapter(hdd_ctx, adapterNode, &adapterNode)) {
 
@@ -4408,11 +4408,11 @@
 
 	hdd_adapter_t *adapter = NULL;
 	hdd_adapter_list_node_t *adapter_node = NULL, *next = NULL;
-	CDF_STATUS status;
+	QDF_STATUS status;
 	int i;
 
 	status = hdd_get_front_adapter(hdd_ctx, &adapter_node);
-	while (NULL != adapter_node && CDF_STATUS_SUCCESS == status) {
+	while (NULL != adapter_node && QDF_STATUS_SUCCESS == status) {
 		adapter = adapter_node->pAdapter;
 
 		hddLog(CDF_TRACE_LEVEL_ERROR,
@@ -4469,10 +4469,10 @@
 {
 	hdd_adapter_t *adapter = NULL;
 	hdd_adapter_list_node_t *adapter_node = NULL, *next = NULL;
-	CDF_STATUS status;
+	QDF_STATUS status;
 
 	status = hdd_get_front_adapter(hdd_ctx, &adapter_node);
-	while (NULL != adapter_node && CDF_STATUS_SUCCESS == status) {
+	while (NULL != adapter_node && QDF_STATUS_SUCCESS == status) {
 		adapter = adapter_node->pAdapter;
 
 		cdf_mem_zero(adapter->queue_oper_stats,
@@ -4503,9 +4503,9 @@
  * it may try to connect to these APs, thus flush out all the scan results
  * which are present in SME after 11d scan is done.
  *
- * Return:  CDF_STATUS_SUCCESS
+ * Return:  QDF_STATUS_SUCCESS
  */
-static CDF_STATUS hdd_11d_scan_done(tHalHandle halHandle, void *pContext,
+static QDF_STATUS hdd_11d_scan_done(tHalHandle halHandle, void *pContext,
 				    uint8_t sessionId, uint32_t scanId,
 				    eCsrScanStatus status)
 {
@@ -4515,7 +4515,7 @@
 
 	EXIT();
 
-	return CDF_STATUS_SUCCESS;
+	return QDF_STATUS_SUCCESS;
 }
 
 #ifdef WLAN_FEATURE_OFFLOAD_PACKETS
@@ -4956,16 +4956,16 @@
  *
  * Disables all the dual mac features like DBS, Agile DFS etc.
  *
- * Return: CDF_STATUS_SUCCESS on success
+ * Return: QDF_STATUS_SUCCESS on success
  */
-static CDF_STATUS wlan_hdd_disable_all_dual_mac_features(hdd_context_t *hdd_ctx)
+static QDF_STATUS wlan_hdd_disable_all_dual_mac_features(hdd_context_t *hdd_ctx)
 {
 	struct sir_dual_mac_config cfg;
-	CDF_STATUS status;
+	QDF_STATUS status;
 
 	if (!hdd_ctx) {
 		hdd_err("HDD context is NULL");
-		return CDF_STATUS_E_FAILURE;
+		return QDF_STATUS_E_FAILURE;
 	}
 
 	cfg.scan_config = 0;
@@ -4976,12 +4976,12 @@
 	hdd_debug("Disabling all dual mac features...");
 
 	status = sme_soc_set_dual_mac_config(hdd_ctx->hHal, cfg);
-	if (status != CDF_STATUS_SUCCESS) {
+	if (status != QDF_STATUS_SUCCESS) {
 		hdd_err("sme_soc_set_dual_mac_config failed %d", status);
 		return status;
 	}
 
-	return CDF_STATUS_SUCCESS;
+	return QDF_STATUS_SUCCESS;
 }
 
 /**
@@ -5068,7 +5068,7 @@
  */
 hdd_context_t *hdd_init_context(struct device *dev, void *hif_sc)
 {
-	CDF_STATUS status;
+	QDF_STATUS status;
 	int ret = 0;
 	hdd_context_t *hdd_ctx;
 	v_CONTEXT_t p_cds_context;
@@ -5101,7 +5101,7 @@
 
 	/* Read and parse the qcom_cfg.ini file */
 	status = hdd_parse_config_ini(hdd_ctx);
-	if (CDF_STATUS_SUCCESS != status) {
+	if (QDF_STATUS_SUCCESS != status) {
 		hdd_alert("Error (status: %d) parsing INI file: %s", status,
 			  WLAN_INI_FILE);
 		ret = -EINVAL;
@@ -5319,7 +5319,7 @@
 static int hdd_update_country_code(hdd_context_t *hdd_ctx,
 				  hdd_adapter_t *adapter)
 {
-	CDF_STATUS status;
+	QDF_STATUS status;
 	int ret = 0;
 	unsigned long rc;
 
@@ -5335,7 +5335,7 @@
 					 eSIR_TRUE);
 
 
-	if (!CDF_IS_STATUS_SUCCESS(status)) {
+	if (!QDF_IS_STATUS_SUCCESS(status)) {
 		hdd_err("SME Change Country code from module param fail ret=%d",
 			ret);
 		return -EINVAL;
@@ -5363,7 +5363,7 @@
 static int hdd_init_thermal_info(hdd_context_t *hdd_ctx)
 {
 	tSmeThermalParams thermal_param;
-	CDF_STATUS status;
+	QDF_STATUS status;
 
 	thermal_param.smeThermalMgmtEnabled =
 		hdd_ctx->config->thermalMitigationEnable;
@@ -5388,7 +5388,7 @@
 
 	status = sme_init_thermal_info(hdd_ctx->hHal, thermal_param);
 
-	if (!CDF_IS_STATUS_SUCCESS(status))
+	if (!QDF_IS_STATUS_SUCCESS(status))
 		return cdf_status_to_os_return(status);
 
 	sme_add_set_thermal_level_callback(hdd_ctx->hHal,
@@ -5438,7 +5438,7 @@
  */
 int hdd_wlan_startup(struct device *dev, void *hif_sc)
 {
-	CDF_STATUS status;
+	QDF_STATUS status;
 	hdd_adapter_t *adapter = NULL;
 	hdd_context_t *hdd_ctx = NULL;
 	int ret;
@@ -5471,7 +5471,7 @@
 	hdd_wlan_green_ap_init(hdd_ctx);
 
 	status = cds_open();
-	if (!CDF_IS_STATUS_SUCCESS(status)) {
+	if (!QDF_IS_STATUS_SUCCESS(status)) {
 		hddLog(CDF_TRACE_LEVEL_FATAL, FL("cds_open failed"));
 		goto err_hdd_free_context;
 	}
@@ -5486,7 +5486,7 @@
 	}
 
 	status = cds_pre_enable(hdd_ctx->pcds_context);
-	if (!CDF_IS_STATUS_SUCCESS(status)) {
+	if (!QDF_IS_STATUS_SUCCESS(status)) {
 		hddLog(CDF_TRACE_LEVEL_FATAL, FL("cds_pre_enable failed"));
 		goto err_cds_close;
 	}
@@ -5495,7 +5495,7 @@
 
 	status = wlan_hdd_regulatory_init(hdd_ctx);
 
-	if (status != CDF_STATUS_SUCCESS) {
+	if (status != QDF_STATUS_SUCCESS) {
 		hddLog(CDF_TRACE_LEVEL_FATAL,
 		       FL("Failed to init channel list"));
 		goto err_cds_close;
@@ -5517,7 +5517,7 @@
 	 */
 	status = hdd_set_sme_config(hdd_ctx);
 
-	if (CDF_STATUS_SUCCESS != status) {
+	if (QDF_STATUS_SUCCESS != status) {
 		hddLog(CDF_TRACE_LEVEL_FATAL, FL("Failed hdd_set_sme_config"));
 		goto err_wiphy_unregister;
 	}
@@ -5532,7 +5532,7 @@
 	}
 
 	status = hdd_set_sme_chan_list(hdd_ctx);
-	if (status != CDF_STATUS_SUCCESS) {
+	if (status != QDF_STATUS_SUCCESS) {
 		hddLog(CDF_TRACE_LEVEL_FATAL,
 		       FL("Failed to init channel list"));
 		goto err_wiphy_unregister;
@@ -5545,7 +5545,7 @@
 		goto err_wiphy_unregister;
 	}
 
-	if (CDF_STATUS_SUCCESS != hdd_update_mac_config(hdd_ctx)) {
+	if (QDF_STATUS_SUCCESS != hdd_update_mac_config(hdd_ctx)) {
 		hddLog(CDF_TRACE_LEVEL_WARN,
 		       FL("can't update mac config, using MAC from ini file"));
 	}
@@ -5565,7 +5565,7 @@
 		goto err_wiphy_unregister;
 	}
 
-	if (hdd_ipa_init(hdd_ctx) == CDF_STATUS_E_FAILURE)
+	if (hdd_ipa_init(hdd_ctx) == QDF_STATUS_E_FAILURE)
 		goto err_wiphy_unregister;
 
 	/*
@@ -5573,7 +5573,7 @@
 	 * else
 	 */
 	status = cds_enable(hdd_ctx->pcds_context);
-	if (!CDF_IS_STATUS_SUCCESS(status)) {
+	if (!QDF_IS_STATUS_SUCCESS(status)) {
 		hddLog(CDF_TRACE_LEVEL_FATAL, FL("cds_enable failed"));
 		goto err_ipa_cleanup;
 	}
@@ -5581,7 +5581,7 @@
 	hdd_init_channel_avoidance(hdd_ctx);
 
 	status = hdd_post_cds_enable_config(hdd_ctx);
-	if (!CDF_IS_STATUS_SUCCESS(status)) {
+	if (!QDF_IS_STATUS_SUCCESS(status)) {
 		hddLog(CDF_TRACE_LEVEL_FATAL,
 		       FL("hdd_post_cds_enable_config failed"));
 		goto err_cds_disable;
@@ -5621,7 +5621,7 @@
 
 	status = hdd_debugfs_init(adapter);
 
-	if (CDF_IS_STATUS_SUCCESS(status))
+	if (QDF_IS_STATUS_SUCCESS(status))
 		hdd_err("hdd_debugfs_init failed: %d!", status);
 
 	/* FW capabilities received, Set the Dot11 mode */
@@ -5685,7 +5685,7 @@
 	if (hdd_ctx->config->WlanAutoShutdown != 0)
 		if (sme_set_auto_shutdown_cb
 			    (hdd_ctx->hHal, wlan_hdd_auto_shutdown_cb)
-		    != CDF_STATUS_SUCCESS)
+		    != QDF_STATUS_SUCCESS)
 			hddLog(LOGE,
 			       FL(
 				  "Auto shutdown feature could not be enabled"
@@ -5697,13 +5697,13 @@
 				   CDF_TIMER_TYPE_SW,
 				   hdd_skip_acs_scan_timer_handler,
 				   (void *)hdd_ctx);
-	if (!CDF_IS_STATUS_SUCCESS(status))
+	if (!QDF_IS_STATUS_SUCCESS(status))
 		hddLog(LOGE, FL("Failed to init ACS Skip timer"));
 #endif
 
 	wlan_hdd_nan_init(hdd_ctx);
 	status = cds_init_policy_mgr();
-	if (!CDF_IS_STATUS_SUCCESS(status)) {
+	if (!QDF_IS_STATUS_SUCCESS(status)) {
 		hdd_err("Policy manager initialization failed");
 		goto err_unreg_netdev_notifier;
 	}
@@ -5721,7 +5721,7 @@
 	hddtxlimit.txPower2g = hdd_ctx->config->TxPower2g;
 	hddtxlimit.txPower5g = hdd_ctx->config->TxPower5g;
 	status = sme_txpower_limit(hdd_ctx->hHal, &hddtxlimit);
-	if (CDF_IS_STATUS_SUCCESS(status))
+	if (QDF_IS_STATUS_SUCCESS(status))
 		hdd_err("Error setting txlimit in sme: %d", status);
 
 #ifdef MSM_PLATFORM
@@ -5778,7 +5778,7 @@
 
 	if (hdd_ctx->config->dual_mac_feature_disable) {
 		status = wlan_hdd_disable_all_dual_mac_features(hdd_ctx);
-		if (status != CDF_STATUS_SUCCESS) {
+		if (status != QDF_STATUS_SUCCESS) {
 			hdd_err("Failed to disable dual mac features");
 			goto err_unreg_netdev_notifier;
 		}
@@ -5800,7 +5800,7 @@
 #endif /* WLAN_KD_READY_NOTIFIER */
 	nl_srv_exit();
 
-	if (!CDF_IS_STATUS_SUCCESS(cds_deinit_policy_mgr())) {
+	if (!QDF_IS_STATUS_SUCCESS(cds_deinit_policy_mgr())) {
 		hdd_err("Failed to deinit policy manager");
 		/* Proceed and complete the clean up */
 	}
@@ -5823,10 +5823,10 @@
 
 err_cds_close:
 	status = cds_sched_close(hdd_ctx->pcds_context);
-	if (!CDF_IS_STATUS_SUCCESS(status)) {
+	if (!QDF_IS_STATUS_SUCCESS(status)) {
 		hddLog(CDF_TRACE_LEVEL_FATAL,
 		       FL("Failed to close CDS Scheduler"));
-		CDF_ASSERT(CDF_IS_STATUS_SUCCESS(status));
+		CDF_ASSERT(QDF_IS_STATUS_SUCCESS(status));
 	}
 	cds_close(hdd_ctx->pcds_context);
 
@@ -5850,13 +5850,13 @@
  *
  * Return: None
  */
-CDF_STATUS hdd_softap_sta_deauth(hdd_adapter_t *adapter,
+QDF_STATUS hdd_softap_sta_deauth(hdd_adapter_t *adapter,
 				 struct tagCsrDelStaParams *pDelStaParams)
 {
 #ifndef WLAN_FEATURE_MBSSID
 	v_CONTEXT_t p_cds_context = (WLAN_HDD_GET_CTX(adapter))->pcds_context;
 #endif
-	CDF_STATUS cdf_status = CDF_STATUS_E_FAULT;
+	QDF_STATUS qdf_status = QDF_STATUS_E_FAULT;
 
 	ENTER();
 
@@ -5865,18 +5865,18 @@
 
 	/* Ignore request to deauth bcmc station */
 	if (pDelStaParams->peerMacAddr.bytes[0] & 0x1)
-		return cdf_status;
+		return qdf_status;
 
 #ifdef WLAN_FEATURE_MBSSID
-	cdf_status =
+	qdf_status =
 		wlansap_deauth_sta(WLAN_HDD_GET_SAP_CTX_PTR(adapter),
 				   pDelStaParams);
 #else
-	cdf_status = wlansap_deauth_sta(p_cds_context, pDelStaParams);
+	qdf_status = wlansap_deauth_sta(p_cds_context, pDelStaParams);
 #endif
 
 	EXIT();
-	return cdf_status;
+	return qdf_status;
 }
 
 /**
@@ -5939,7 +5939,7 @@
  *
  * Return: true if connected; false otherwise
  */
-CDF_STATUS hdd_issta_p2p_clientconnected(hdd_context_t *hdd_ctx)
+QDF_STATUS hdd_issta_p2p_clientconnected(hdd_context_t *hdd_ctx)
 {
 	return sme_is_sta_p2p_client_connected(hdd_ctx->hHal);
 }
@@ -6042,7 +6042,7 @@
 	hdd_adapter_t *adapterIdx = NULL;
 	hdd_adapter_list_node_t *adapterNode = NULL;
 	hdd_adapter_list_node_t *pNext = NULL;
-	CDF_STATUS status;
+	QDF_STATUS status;
 
 	if (hdd_ctx->config->isFastRoamIniFeatureEnabled &&
 	    hdd_ctx->config->isRoamOffloadScanEnabled &&
@@ -6056,7 +6056,7 @@
 		 */
 		status = hdd_get_front_adapter(hdd_ctx, &adapterNode);
 
-		while (NULL != adapterNode && CDF_STATUS_SUCCESS == status) {
+		while (NULL != adapterNode && QDF_STATUS_SUCCESS == status) {
 			adapterIdx = adapterNode->pAdapter;
 
 			if (WLAN_HDD_INFRA_STATION == adapterIdx->device_mode
@@ -6094,7 +6094,7 @@
 	hdd_adapter_t *adapterIdx = NULL;
 	hdd_adapter_list_node_t *adapterNode = NULL;
 	hdd_adapter_list_node_t *pNext = NULL;
-	CDF_STATUS status;
+	QDF_STATUS status;
 
 	if (hdd_ctx->config->isFastRoamIniFeatureEnabled &&
 	    hdd_ctx->config->isRoamOffloadScanEnabled &&
@@ -6108,7 +6108,7 @@
 		 */
 		status = hdd_get_front_adapter(hdd_ctx, &adapterNode);
 
-		while (NULL != adapterNode && CDF_STATUS_SUCCESS == status) {
+		while (NULL != adapterNode && QDF_STATUS_SUCCESS == status) {
 			adapterIdx = adapterNode->pAdapter;
 
 			if (WLAN_HDD_INFRA_STATION == adapterIdx->device_mode
@@ -6253,7 +6253,7 @@
 	hdd_adapter_t *pDataAdapter = NULL;
 	hdd_adapter_list_node_t *adapterNode = NULL, *pNext = NULL;
 	bool scan_intf_found = false;
-	CDF_STATUS status;
+	QDF_STATUS status;
 
 	if (!hdd_ctx) {
 		hddLog(CDF_TRACE_LEVEL_ERROR,
@@ -6262,7 +6262,7 @@
 	}
 
 	status = hdd_get_front_adapter(hdd_ctx, &adapterNode);
-	while (NULL != adapterNode && CDF_STATUS_SUCCESS == status) {
+	while (NULL != adapterNode && QDF_STATUS_SUCCESS == status) {
 		pDataAdapter = adapterNode->pAdapter;
 		if (pDataAdapter) {
 			if (pDataAdapter->device_mode == WLAN_HDD_INFRA_STATION
@@ -6311,7 +6311,7 @@
 void wlan_hdd_auto_shutdown_enable(hdd_context_t *hdd_ctx, bool enable)
 {
 	hdd_adapter_list_node_t *adapterNode = NULL, *pNext = NULL;
-	CDF_STATUS status;
+	QDF_STATUS status;
 	hdd_adapter_t *adapter;
 	bool ap_connected = false, sta_connected = false;
 	tHalHandle hal_handle;
@@ -6325,7 +6325,7 @@
 
 	if (enable == false) {
 		if (sme_set_auto_shutdown_timer(hal_handle, 0) !=
-							CDF_STATUS_SUCCESS) {
+							QDF_STATUS_SUCCESS) {
 			hddLog(LOGE,
 			       FL("Failed to stop wlan auto shutdown timer"));
 		}
@@ -6336,7 +6336,7 @@
 	if (cds_concurrent_open_sessions_running()) {
 		status = hdd_get_front_adapter(hdd_ctx, &adapterNode);
 
-		while (NULL != adapterNode && CDF_STATUS_SUCCESS == status) {
+		while (NULL != adapterNode && QDF_STATUS_SUCCESS == status) {
 			adapter = adapterNode->pAdapter;
 			if (adapter
 			    && adapter->device_mode ==
@@ -6371,7 +6371,7 @@
 		if (sme_set_auto_shutdown_timer(hal_handle,
 						hdd_ctx->config->
 						WlanAutoShutdown)
-		    != CDF_STATUS_SUCCESS)
+		    != QDF_STATUS_SUCCESS)
 			hddLog(LOGE,
 			       FL("Failed to start wlan auto shutdown timer"));
 		else
@@ -6388,13 +6388,13 @@
 {
 	hdd_context_t *hdd_ctx = WLAN_HDD_GET_CTX(this_sap_adapter);
 	hdd_adapter_t *adapter, *con_sap_adapter;
-	CDF_STATUS status = CDF_STATUS_SUCCESS;
+	QDF_STATUS status = QDF_STATUS_SUCCESS;
 	hdd_adapter_list_node_t *adapterNode = NULL, *pNext = NULL;
 
 	con_sap_adapter = NULL;
 
 	status = hdd_get_front_adapter(hdd_ctx, &adapterNode);
-	while (NULL != adapterNode && CDF_STATUS_SUCCESS == status) {
+	while (NULL != adapterNode && QDF_STATUS_SUCCESS == status) {
 		adapter = adapterNode->pAdapter;
 		if (adapter && ((adapter->device_mode == WLAN_HDD_SOFTAP) ||
 				(adapter->device_mode == WLAN_HDD_P2P_GO)) &&
@@ -6433,7 +6433,7 @@
 void hdd_stop_bus_bw_compute_timer(hdd_adapter_t *adapter)
 {
 	hdd_adapter_list_node_t *adapterNode = NULL, *pNext = NULL;
-	CDF_STATUS status;
+	QDF_STATUS status;
 	bool can_stop = true;
 	hdd_context_t *hdd_ctx = WLAN_HDD_GET_CTX(adapter);
 
@@ -6448,7 +6448,7 @@
 	if (cds_concurrent_open_sessions_running()) {
 		status = hdd_get_front_adapter(hdd_ctx, &adapterNode);
 
-		while (NULL != adapterNode && CDF_STATUS_SUCCESS == status) {
+		while (NULL != adapterNode && QDF_STATUS_SUCCESS == status) {
 			adapter = adapterNode->pAdapter;
 			if (adapter
 			    && (adapter->device_mode == WLAN_HDD_INFRA_STATION
@@ -6492,9 +6492,9 @@
  * if both are same then it will return false else it will restart the sap in
  * sta's channel and return true.
  *
- * Return: CDF_STATUS_SUCCESS or CDF_STATUS_E_FAILURE.
+ * Return: QDF_STATUS_SUCCESS or QDF_STATUS_E_FAILURE.
  */
-CDF_STATUS wlan_hdd_check_custom_con_channel_rules(hdd_adapter_t *sta_adapter,
+QDF_STATUS wlan_hdd_check_custom_con_channel_rules(hdd_adapter_t *sta_adapter,
 						  hdd_adapter_t *ap_adapter,
 						  tCsrRoamProfile *roam_profile,
 						  tScanResultHandle *scan_cache,
@@ -6502,7 +6502,7 @@
 {
 	hdd_ap_ctx_t *hdd_ap_ctx;
 	uint8_t channel_id;
-	CDF_STATUS status;
+	QDF_STATUS status;
 	device_mode_t device_mode = ap_adapter->device_mode;
 	*concurrent_chnl_same = true;
 
@@ -6512,7 +6512,7 @@
 					    roam_profile,
 					    scan_cache,
 					    &channel_id);
-	if ((CDF_STATUS_SUCCESS == status)) {
+	if ((QDF_STATUS_SUCCESS == status)) {
 		if ((WLAN_HDD_SOFTAP == device_mode) &&
 			(channel_id < SIR_11A_CHANNEL_BEGIN)) {
 			if (hdd_ap_ctx->operatingChannel != channel_id) {
@@ -6538,9 +6538,9 @@
 		 */
 		hddLog(CDF_TRACE_LEVEL_ERROR,
 		       FL("Finding AP from scan cache failed"));
-		return CDF_STATUS_E_FAILURE;
+		return QDF_STATUS_E_FAILURE;
 	}
-	return CDF_STATUS_SUCCESS;
+	return QDF_STATUS_SUCCESS;
 }
 
 #ifdef WLAN_FEATURE_MBSSID
@@ -6594,7 +6594,7 @@
 		hddLog(CDF_TRACE_LEVEL_INFO_HIGH,
 		       FL("Now doing SAP STOPBSS"));
 		qdf_event_reset(&hostapd_state->cdf_stop_bss_event);
-		if (CDF_STATUS_SUCCESS == wlansap_stop_bss(hdd_ap_ctx->
+		if (QDF_STATUS_SUCCESS == wlansap_stop_bss(hdd_ap_ctx->
 							sapContext)) {
 			qdf_status = qdf_wait_single_event(&hostapd_state->
 							   cdf_stop_bss_event,
@@ -6669,7 +6669,7 @@
 	if (wlansap_start_bss(hdd_ap_ctx->sapContext, hdd_hostapd_sap_event_cb,
 			      &hdd_ap_ctx->sapConfig,
 			      ap_adapter->dev)
-			      != CDF_STATUS_SUCCESS)
+			      != QDF_STATUS_SUCCESS)
 		goto end;
 
 	hddLog(CDF_TRACE_LEVEL_INFO_HIGH,
diff --git a/core/hdd/src/wlan_hdd_memdump.c b/core/hdd/src/wlan_hdd_memdump.c
index 9013e81..80951cc 100644
--- a/core/hdd/src/wlan_hdd_memdump.c
+++ b/core/hdd/src/wlan_hdd_memdump.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2016 The Linux Foundation. All rights reserved.
  *
  * Previously licensed under the ISC license by Qualcomm Atheros, Inc.
  *
@@ -197,7 +197,7 @@
 					       const void *data, int data_len)
 {
 	int status;
-	CDF_STATUS sme_status;
+	QDF_STATUS sme_status;
 	hdd_context_t *hdd_ctx = wiphy_priv(wiphy);
 	struct fw_dump_req fw_mem_dump_req;
 	struct fw_dump_seg_req *seg_req;
@@ -296,7 +296,7 @@
 	spin_unlock(&hdd_context_lock);
 
 	sme_status = sme_fw_mem_dump(hdd_ctx->hHal, &fw_mem_dump_req);
-	if (CDF_STATUS_SUCCESS != sme_status) {
+	if (QDF_STATUS_SUCCESS != sme_status) {
 		hddLog(LOGE, FL("sme_fw_mem_dump Failed"));
 		mutex_lock(&hdd_ctx->memdump_lock);
 		cdf_os_mem_free_consistent(cdf_ctx,
@@ -539,8 +539,8 @@
 {
 	hdd_context_t *hdd_ctx;
 	int status = 0;
-	CDF_STATUS cb_status;
-	CDF_STATUS cdf_status;
+	QDF_STATUS cb_status;
+	QDF_STATUS qdf_status;
 
 	hdd_ctx = cds_get_context(CDF_MODULE_ID_HDD);
 	if (!hdd_ctx) {
@@ -555,7 +555,7 @@
 
 	cb_status = sme_fw_mem_dump_register_cb(hdd_ctx->hHal,
 				wlan_hdd_cfg80211_fw_mem_dump_cb);
-	if (CDF_STATUS_SUCCESS != cb_status) {
+	if (QDF_STATUS_SUCCESS != cb_status) {
 		hddLog(LOGE , FL("Failed to register the callback"));
 		return -EINVAL;
 	}
@@ -568,10 +568,10 @@
 
 	init_completion(&fw_dump_context.response_event);
 
-	cdf_status = cdf_mc_timer_init(&hdd_ctx->memdump_cleanup_timer,
+	qdf_status = cdf_mc_timer_init(&hdd_ctx->memdump_cleanup_timer,
 				    CDF_TIMER_TYPE_SW, memdump_cleanup_timer_cb,
 				    (void *)hdd_ctx);
-	if (!CDF_IS_STATUS_SUCCESS(cdf_status)) {
+	if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
 		hddLog(LOGE, FL("Failed to init memdump cleanup timer"));
 		return -EINVAL;
 	}
@@ -594,7 +594,7 @@
 	cdf_dma_addr_t paddr;
 	cdf_dma_addr_t dma_ctx = 0;
 	cdf_device_t cdf_ctx;
-	CDF_STATUS cdf_status;
+	QDF_STATUS qdf_status;
 
 	hdd_ctx = cds_get_context(CDF_MODULE_ID_HDD);
 	if (!hdd_ctx) {
@@ -631,7 +631,7 @@
 		cdf_mc_timer_stop(&hdd_ctx->memdump_cleanup_timer);
 	}
 
-	cdf_status = cdf_mc_timer_destroy(&hdd_ctx->memdump_cleanup_timer);
-	if (!CDF_IS_STATUS_SUCCESS(cdf_status))
+	qdf_status = cdf_mc_timer_destroy(&hdd_ctx->memdump_cleanup_timer);
+	if (!QDF_IS_STATUS_SUCCESS(qdf_status))
 		hddLog(LOGE, FL("Failed to deallocate timer"));
 }
diff --git a/core/hdd/src/wlan_hdd_nan.c b/core/hdd/src/wlan_hdd_nan.c
index 7e1e8c6..9fe3aee 100644
--- a/core/hdd/src/wlan_hdd_nan.c
+++ b/core/hdd/src/wlan_hdd_nan.c
@@ -58,7 +58,7 @@
 					   int data_len)
 {
 	tNanRequestReq nan_req;
-	CDF_STATUS status;
+	QDF_STATUS status;
 	int ret_val;
 	hdd_context_t *hdd_ctx = wiphy_priv(wiphy);
 
@@ -82,7 +82,7 @@
 	nan_req.request_data = data;
 
 	status = sme_nan_request(&nan_req);
-	if (CDF_STATUS_SUCCESS != status) {
+	if (QDF_STATUS_SUCCESS != status) {
 		ret_val = -EINVAL;
 	}
 	return ret_val;
diff --git a/core/hdd/src/wlan_hdd_napi.c b/core/hdd/src/wlan_hdd_napi.c
index 4865e30..15d372d 100644
--- a/core/hdd/src/wlan_hdd_napi.c
+++ b/core/hdd/src/wlan_hdd_napi.c
@@ -121,7 +121,7 @@
 		 * services/calls.
 		 * For Rome, there is only one service, hence a single call
 		 */
-		if (CDF_STATUS_SUCCESS !=
+		if (QDF_STATUS_SUCCESS !=
 		    hif_map_service_to_pipe(hif_ctx, HTT_DATA_MSG_SVC,
 					    &ul, &dl, &ul_polled, &dl_polled)) {
 			hdd_err("cannot map service to pipe");
diff --git a/core/hdd/src/wlan_hdd_ocb.c b/core/hdd/src/wlan_hdd_ocb.c
index f8df3fb..cc8543e 100644
--- a/core/hdd/src/wlan_hdd_ocb.c
+++ b/core/hdd/src/wlan_hdd_ocb.c
@@ -241,16 +241,16 @@
  */
 static int hdd_ocb_register_sta(hdd_adapter_t *adapter)
 {
-	CDF_STATUS cdf_status = CDF_STATUS_E_FAILURE;
+	QDF_STATUS qdf_status = QDF_STATUS_E_FAILURE;
 	struct ol_txrx_desc_type sta_desc = {0};
 	hdd_context_t *hdd_ctx = WLAN_HDD_GET_CTX(adapter);
 	hdd_station_ctx_t *pHddStaCtx = WLAN_HDD_GET_STATION_CTX_PTR(adapter);
 	uint8_t peer_id;
 
-	cdf_status = ol_txrx_register_ocb_peer(hdd_ctx->pcds_context,
+	qdf_status = ol_txrx_register_ocb_peer(hdd_ctx->pcds_context,
 					       adapter->macAddressCurrent.bytes,
 					       &peer_id);
-	if (!CDF_IS_STATUS_SUCCESS(cdf_status)) {
+	if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
 		hddLog(LOGE, FL("Error registering OCB Self Peer!"));
 		return -EINVAL;
 	}
@@ -260,11 +260,11 @@
 	sta_desc.sta_id = peer_id;
 	sta_desc.is_qos_enabled = 1;
 
-	cdf_status = ol_txrx_register_peer(hdd_rx_packet_cbk,
+	qdf_status = ol_txrx_register_peer(hdd_rx_packet_cbk,
 						&sta_desc);
-	if (!CDF_IS_STATUS_SUCCESS(cdf_status)) {
+	if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
 		hddLog(LOGE, FL("Failed to register. Status= %d [0x%08X]"),
-		       cdf_status, cdf_status);
+		       qdf_status, qdf_status);
 		return -EINVAL;
 	}
 
@@ -400,7 +400,7 @@
 				  struct sir_ocb_config *config)
 {
 	int rc;
-	CDF_STATUS cdf_status;
+	QDF_STATUS qdf_status;
 	struct hdd_ocb_ctxt context = {0};
 
 	if (hdd_ocb_validate_config(adapter, config)) {
@@ -417,10 +417,10 @@
 	netif_carrier_off(adapter->dev);
 
 	/* Call the SME API to set the config */
-	cdf_status = sme_ocb_set_config(
+	qdf_status = sme_ocb_set_config(
 		((hdd_context_t *)adapter->pHddCtx)->hHal, &context,
 		hdd_ocb_set_config_callback, config);
-	if (cdf_status != CDF_STATUS_SUCCESS) {
+	if (qdf_status != QDF_STATUS_SUCCESS) {
 		hddLog(LOGE, FL("Error calling SME function."));
 		/* Convert from ecdf_status to errno */
 		return -EINVAL;
@@ -1036,7 +1036,7 @@
 	cdf_mem_copy(utc->time_error, nla_data(time_error_attr),
 		SIZE_UTC_TIME_ERROR);
 
-	if (sme_ocb_set_utc_time(hdd_ctx->hHal, utc) != CDF_STATUS_SUCCESS) {
+	if (sme_ocb_set_utc_time(hdd_ctx->hHal, utc) != QDF_STATUS_SUCCESS) {
 		hddLog(LOGE, FL("Error while setting UTC time"));
 		rc = -EINVAL;
 	} else {
@@ -1152,7 +1152,7 @@
 	}
 
 	if (sme_ocb_start_timing_advert(hdd_ctx->hHal, timing_advert) !=
-			CDF_STATUS_SUCCESS) {
+			QDF_STATUS_SUCCESS) {
 		hddLog(LOGE, FL("Error while starting timing advert"));
 		rc = -EINVAL;
 	} else {
@@ -1254,7 +1254,7 @@
 		tb[QCA_WLAN_VENDOR_ATTR_OCB_STOP_TIMING_ADVERT_CHANNEL_FREQ]);
 
 	if (sme_ocb_stop_timing_advert(hdd_ctx->hHal, timing_advert) !=
-			CDF_STATUS_SUCCESS) {
+			QDF_STATUS_SUCCESS) {
 		hddLog(LOGE, FL("Error while stopping timing advert"));
 		rc = -EINVAL;
 	} else {
@@ -1586,7 +1586,7 @@
 			       &request);
 	if (rc) {
 		hddLog(LOGE, FL("Error calling SME function"));
-		/* Need to convert from cdf_status to errno. */
+		/* Need to convert from qdf_status to errno. */
 		return -EINVAL;
 	}
 
@@ -1733,7 +1733,7 @@
 	if (sme_dcc_clear_stats(hdd_ctx->hHal, adapter->sessionId,
 		nla_get_u32(
 			tb[QCA_WLAN_VENDOR_ATTR_DCC_CLEAR_STATS_BITMAP])) !=
-			CDF_STATUS_SUCCESS) {
+			QDF_STATUS_SUCCESS) {
 		hddLog(LOGE, FL("Error calling SME function."));
 		return -EINVAL;
 	}
@@ -1882,7 +1882,7 @@
 				&request);
 	if (rc) {
 		hddLog(LOGE, FL("Error calling SME function."));
-		/* Convert from cdf_status to errno */
+		/* Convert from qdf_status to errno */
 		return -EINVAL;
 	}
 
diff --git a/core/hdd/src/wlan_hdd_oemdata.c b/core/hdd/src/wlan_hdd_oemdata.c
index 52c74fe..187cdc4 100644
--- a/core/hdd/src/wlan_hdd_oemdata.c
+++ b/core/hdd/src/wlan_hdd_oemdata.c
@@ -58,7 +58,7 @@
 static int populate_oem_data_cap(hdd_adapter_t *adapter,
 				 t_iw_oem_data_cap *data_cap)
 {
-	CDF_STATUS status = CDF_STATUS_E_FAILURE;
+	QDF_STATUS status = QDF_STATUS_E_FAILURE;
 	struct hdd_config *config;
 	uint32_t num_chan;
 	uint8_t *chan_list;
@@ -97,7 +97,7 @@
 	num_chan = WNI_CFG_VALID_CHANNEL_LIST_LEN;
 	status = sme_get_cfg_valid_channels(hdd_ctx->hHal,
 					    &chan_list[0], &num_chan);
-	if (CDF_STATUS_SUCCESS != status) {
+	if (QDF_STATUS_SUCCESS != status) {
 		hdd_err("failed to get valid channel list, status: %d", status);
 		cdf_mem_free(chan_list);
 		return -EINVAL;
@@ -179,7 +179,7 @@
 	hdd_adapter_list_node_t *pAdapterNode = NULL;
 	hdd_adapter_list_node_t *pNext = NULL;
 	hdd_adapter_t *pAdapter = NULL;
-	CDF_STATUS status = 0;
+	QDF_STATUS status = 0;
 
 	/* OEM message is always to a specific process and cannot be a broadcast */
 	if (p_hdd_ctx->oem_pid == 0) {
@@ -215,7 +215,7 @@
 
 	/* Iterate through each of the adapters and fill device mode and vdev id */
 	status = hdd_get_front_adapter(p_hdd_ctx, &pAdapterNode);
-	while ((CDF_STATUS_SUCCESS == status) && pAdapterNode) {
+	while ((QDF_STATUS_SUCCESS == status) && pAdapterNode) {
 		pAdapter = pAdapterNode->pAdapter;
 		if (pAdapter) {
 			deviceMode = buf++;
@@ -364,27 +364,27 @@
  *
  * This function sends oem message to SME
  *
- * Return: CDF_STATUS enumeration
+ * Return: QDF_STATUS enumeration
  */
-static CDF_STATUS oem_process_data_req_msg(int oemDataLen, char *oemData)
+static QDF_STATUS oem_process_data_req_msg(int oemDataLen, char *oemData)
 {
 	hdd_adapter_t *pAdapter = NULL;
 	tOemDataReqConfig oemDataReqConfig;
 	uint32_t oemDataReqID = 0;
-	CDF_STATUS status = CDF_STATUS_SUCCESS;
+	QDF_STATUS status = QDF_STATUS_SUCCESS;
 
 	/* for now, STA interface only */
 	pAdapter = hdd_get_adapter(p_hdd_ctx, WLAN_HDD_INFRA_STATION);
 	if (!pAdapter) {
 		CDF_TRACE(CDF_MODULE_ID_HDD, CDF_TRACE_LEVEL_ERROR,
 			  "%s: No adapter for STA mode", __func__);
-		return CDF_STATUS_E_FAILURE;
+		return QDF_STATUS_E_FAILURE;
 	}
 
 	if (!oemData) {
 		CDF_TRACE(CDF_MODULE_ID_HDD, CDF_TRACE_LEVEL_ERROR,
 			  "%s: oemData is null", __func__);
-		return CDF_STATUS_E_FAILURE;
+		return QDF_STATUS_E_FAILURE;
 	}
 
 	cdf_mem_zero(&oemDataReqConfig, sizeof(tOemDataReqConfig));
@@ -392,7 +392,7 @@
 	oemDataReqConfig.data = cdf_mem_malloc(oemDataLen);
 	if (!oemDataReqConfig.data) {
 		hddLog(LOGE, FL("malloc failed for data req buffer"));
-		return CDF_STATUS_E_NOMEM;
+		return QDF_STATUS_E_NOMEM;
 	}
 
 	oemDataReqConfig.data_len = oemDataLen;
@@ -431,7 +431,7 @@
 	uint8_t chanId;
 	uint32_t reg_info_1;
 	uint32_t reg_info_2;
-	CDF_STATUS status = CDF_STATUS_E_FAILURE;
+	QDF_STATUS status = QDF_STATUS_E_FAILURE;
 	int i;
 	uint8_t *buf;
 
@@ -479,7 +479,7 @@
 		chanId = chanList[i];
 		status = sme_get_reg_info(p_hdd_ctx->hHal, chanId,
 					  &reg_info_1, &reg_info_2);
-		if (CDF_STATUS_SUCCESS == status) {
+		if (QDF_STATUS_SUCCESS == status) {
 			/* copy into hdd chan info struct */
 			hddChanInfo.chan_id = chanId;
 			hddChanInfo.reserved0 = 0;
@@ -538,7 +538,7 @@
 static int oem_process_set_cap_req_msg(int oem_cap_len,
 				       char *oem_cap, int32_t app_pid)
 {
-	CDF_STATUS status;
+	QDF_STATUS status;
 	int error_code;
 	struct sk_buff *skb;
 	struct nlmsghdr *nlh;
@@ -552,7 +552,7 @@
 
 	status = sme_oem_update_capability(p_hdd_ctx->hHal,
 					(struct sme_oem_capability *)oem_cap);
-	if (!CDF_IS_STATUS_SUCCESS(status))
+	if (!QDF_IS_STATUS_SUCCESS(status))
 		hdd_err("error updating rm capability, status: %d", status);
 	error_code = cdf_status_to_os_return(status);
 
diff --git a/core/hdd/src/wlan_hdd_p2p.c b/core/hdd/src/wlan_hdd_p2p.c
index 27064e1..fb48f5f 100644
--- a/core/hdd/src/wlan_hdd_p2p.c
+++ b/core/hdd/src/wlan_hdd_p2p.c
@@ -160,8 +160,8 @@
 }
 
 static
-CDF_STATUS wlan_hdd_remain_on_channel_callback(tHalHandle hHal, void *pCtx,
-			CDF_STATUS status, uint32_t scan_id)
+QDF_STATUS wlan_hdd_remain_on_channel_callback(tHalHandle hHal, void *pCtx,
+			QDF_STATUS status, uint32_t scan_id)
 {
 	hdd_adapter_t *pAdapter = (hdd_adapter_t *) pCtx;
 	hdd_cfg80211_state_t *cfgState = WLAN_HDD_GET_CFG_STATE_PTR(pAdapter);
@@ -170,7 +170,7 @@
 
 	if (!hdd_ctx) {
 		hdd_err("Invalid HDD context");
-		return CDF_STATUS_E_FAILURE;
+		return QDF_STATUS_E_FAILURE;
 	}
 
 	mutex_lock(&cfgState->remain_on_chan_ctx_lock);
@@ -181,7 +181,7 @@
 		hddLog(LOGW,
 		       "%s: No Rem on channel pending for which Rsp is received",
 		       __func__);
-		return CDF_STATUS_SUCCESS;
+		return QDF_STATUS_SUCCESS;
 	}
 
 	hddLog(LOG1, "Received remain on channel rsp");
@@ -266,9 +266,9 @@
 	}
 	cdf_mem_free(pRemainChanCtx);
 	complete(&pAdapter->cancel_rem_on_chan_var);
-	if (CDF_STATUS_SUCCESS != status)
+	if (QDF_STATUS_SUCCESS != status)
 		complete(&pAdapter->rem_on_chan_ready_event);
-	return CDF_STATUS_SUCCESS;
+	return QDF_STATUS_SUCCESS;
 }
 
 void wlan_hdd_cancel_existing_remain_on_channel(hdd_adapter_t *pAdapter)
@@ -542,11 +542,11 @@
 		      hdd_remain_on_chan_ctx_t *pRemainChanCtx)
 {
 	hdd_cfg80211_state_t *cfgState = WLAN_HDD_GET_CFG_STATE_PTR(pAdapter);
-	CDF_STATUS cdf_status = CDF_STATUS_E_FAILURE;
+	QDF_STATUS qdf_status = QDF_STATUS_E_FAILURE;
 	hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
 	hdd_adapter_list_node_t *pAdapterNode = NULL, *pNext = NULL;
 	hdd_adapter_t *pAdapter_temp;
-	CDF_STATUS status;
+	QDF_STATUS status;
 	bool isGoPresent = false;
 	unsigned int duration;
 
@@ -565,11 +565,11 @@
 	mutex_unlock(&cfgState->remain_on_chan_ctx_lock);
 
 	/* Initialize Remain on chan timer */
-	cdf_status =
+	qdf_status =
 		cdf_mc_timer_init(&pRemainChanCtx->hdd_remain_on_chan_timer,
 				  CDF_TIMER_TYPE_SW,
 				  wlan_hdd_remain_on_chan_timeout, pAdapter);
-	if (cdf_status != CDF_STATUS_SUCCESS) {
+	if (qdf_status != QDF_STATUS_SUCCESS) {
 		hddLog(CDF_TRACE_LEVEL_ERROR,
 		       FL("Not able to initialize remain_on_chan timer"));
 		mutex_lock(&cfgState->remain_on_chan_ctx_lock);
@@ -581,7 +581,7 @@
 	}
 
 	status = hdd_get_front_adapter(pHddCtx, &pAdapterNode);
-	while (NULL != pAdapterNode && CDF_STATUS_SUCCESS == status) {
+	while (NULL != pAdapterNode && QDF_STATUS_SUCCESS == status) {
 		pAdapter_temp = pAdapterNode->pAdapter;
 		if (pAdapter_temp->device_mode == WLAN_HDD_P2P_GO) {
 			isGoPresent = true;
@@ -608,7 +608,7 @@
 		uint8_t sessionId = pAdapter->sessionId;
 		/* call sme API to start remain on channel. */
 
-		if (CDF_STATUS_SUCCESS != sme_remain_on_channel(
+		if (QDF_STATUS_SUCCESS != sme_remain_on_channel(
 				WLAN_HDD_GET_HAL_CTX(pAdapter),
 				sessionId,
 				pRemainChanCtx->chan.hw_value, duration,
@@ -631,7 +631,7 @@
 
 		if (REMAIN_ON_CHANNEL_REQUEST ==
 		    pRemainChanCtx->rem_on_chan_request) {
-			if (CDF_STATUS_SUCCESS != sme_register_mgmt_frame(
+			if (QDF_STATUS_SUCCESS != sme_register_mgmt_frame(
 						WLAN_HDD_GET_HAL_CTX(pAdapter),
 						sessionId,
 						(SIR_MAC_MGMT_FRAME << 2) |
@@ -644,7 +644,7 @@
 	} else if ((WLAN_HDD_SOFTAP == pAdapter->device_mode) ||
 		   (WLAN_HDD_P2P_GO == pAdapter->device_mode)) {
 		/* call sme API to start remain on channel. */
-		if (CDF_STATUS_SUCCESS != wlansap_remain_on_channel(
+		if (QDF_STATUS_SUCCESS != wlansap_remain_on_channel(
 #ifdef WLAN_FEATURE_MBSSID
 			    WLAN_HDD_GET_SAP_CTX_PTR(pAdapter),
 #else
@@ -665,7 +665,7 @@
 			return -EINVAL;
 		}
 
-		if (CDF_STATUS_SUCCESS != wlansap_register_mgmt_frame(
+		if (QDF_STATUS_SUCCESS != wlansap_register_mgmt_frame(
 #ifdef WLAN_FEATURE_MBSSID
 			    WLAN_HDD_GET_SAP_CTX_PTR(pAdapter),
 #else
@@ -987,7 +987,7 @@
 {
 	hdd_cfg80211_state_t *cfgState = NULL;
 	hdd_remain_on_chan_ctx_t *pRemainChanCtx = NULL;
-	CDF_STATUS status;
+	QDF_STATUS status;
 
 	if (NULL == pAdapter) {
 		hddLog(LOGE, FL("pAdapter is NULL"));
@@ -1017,7 +1017,7 @@
 					   hdd_remain_on_chan_timer,
 					   (pRemainChanCtx->duration +
 					    COMPLETE_EVENT_PROPOGATE_TIME));
-		if (status != CDF_STATUS_SUCCESS) {
+		if (status != QDF_STATUS_SUCCESS) {
 			hddLog(LOGE, "%s: Remain on Channel timer start failed",
 			       __func__);
 		}
@@ -1430,7 +1430,7 @@
 							   remain_on_chan_ctx->
 							   hdd_remain_on_chan_timer,
 							   wait);
-				if (status != CDF_STATUS_SUCCESS) {
+				if (status != QDF_STATUS_SUCCESS) {
 					hddLog(LOGE,
 					       "%s: Remain on Channel timer start failed",
 					       __func__);
@@ -1572,7 +1572,7 @@
 			}
 		}
 
-		if (CDF_STATUS_SUCCESS !=
+		if (QDF_STATUS_SUCCESS !=
 		    sme_send_action(WLAN_HDD_GET_HAL_CTX(pAdapter),
 				    sessionId, buf, len, extendedWait, noack,
 				    current_freq)) {
@@ -1582,7 +1582,7 @@
 		}
 	} else if (WLAN_HDD_SOFTAP == pAdapter->device_mode ||
 		   WLAN_HDD_P2P_GO == pAdapter->device_mode) {
-		if (CDF_STATUS_SUCCESS !=
+		if (QDF_STATUS_SUCCESS !=
 #ifdef WLAN_FEATURE_MBSSID
 		    wlansap_send_action(WLAN_HDD_GET_SAP_CTX_PTR(pAdapter),
 #else
@@ -1896,7 +1896,7 @@
 {
 	hdd_adapter_t *pAdapter = WLAN_HDD_GET_PRIV_PTR(dev);
 	tHalHandle hHal = WLAN_HDD_GET_HAL_CTX(pAdapter);
-	CDF_STATUS status = CDF_STATUS_SUCCESS;
+	QDF_STATUS status = QDF_STATUS_SUCCESS;
 	tP2pPsConfig NoA;
 	p2p_app_setP2pPs_t *pappNoA = (p2p_app_setP2pPs_t *) msgData;
 
@@ -2096,7 +2096,7 @@
 	uint8_t subType = 0;
 	tActionFrmType actionFrmType;
 	hdd_cfg80211_state_t *cfgState = NULL;
-	CDF_STATUS status;
+	QDF_STATUS status;
 	hdd_remain_on_chan_ctx_t *pRemainChanCtx = NULL;
 	hdd_context_t *pHddCtx;
 
@@ -2270,7 +2270,7 @@
 										hdd_remain_on_chan_timer,
 										extend_time);
 								if (status !=
-								    CDF_STATUS_SUCCESS) {
+								    QDF_STATUS_SUCCESS) {
 									hddLog
 										(LOGE,
 										"%s: Remain on Channel timer start failed",
diff --git a/core/hdd/src/wlan_hdd_power.c b/core/hdd/src/wlan_hdd_power.c
index 6e99ced..68e69c9 100644
--- a/core/hdd/src/wlan_hdd_power.c
+++ b/core/hdd/src/wlan_hdd_power.c
@@ -103,7 +103,7 @@
 #ifdef WLAN_FEATURE_GTK_OFFLOAD
 static void hdd_conf_gtk_offload(hdd_adapter_t *pAdapter, bool fenable)
 {
-	CDF_STATUS ret;
+	QDF_STATUS ret;
 	tSirGtkOffloadParams hddGtkOffloadReqParams;
 	hdd_station_ctx_t *pHddStaCtx = WLAN_HDD_GET_STATION_CTX_PTR(pAdapter);
 
@@ -119,7 +119,7 @@
 			ret = sme_set_gtk_offload(WLAN_HDD_GET_HAL_CTX(pAdapter),
 						  &hddGtkOffloadReqParams,
 						  pAdapter->sessionId);
-			if (CDF_STATUS_SUCCESS != ret) {
+			if (QDF_STATUS_SUCCESS != ret) {
 				CDF_TRACE(CDF_MODULE_ID_HDD,
 					  CDF_TRACE_LEVEL_ERROR,
 					  "%s: sme_set_gtk_offload failed, returned %d",
@@ -145,7 +145,7 @@
 				(WLAN_HDD_GET_HAL_CTX(pAdapter),
 				 wlan_hdd_cfg80211_update_replay_counter_callback,
 				 pAdapter, pAdapter->sessionId);
-			if (CDF_STATUS_SUCCESS != ret) {
+			if (QDF_STATUS_SUCCESS != ret) {
 				CDF_TRACE(CDF_MODULE_ID_HDD,
 					  CDF_TRACE_LEVEL_ERROR,
 					  "%s: sme_get_gtk_offload failed, returned %d",
@@ -168,7 +168,7 @@
 								    (pAdapter),
 							    &hddGtkOffloadReqParams,
 							    pAdapter->sessionId);
-				if (CDF_STATUS_SUCCESS != ret) {
+				if (QDF_STATUS_SUCCESS != ret) {
 					CDF_TRACE(CDF_MODULE_ID_HDD,
 						  CDF_TRACE_LEVEL_ERROR,
 						  "%s: failed to dissable GTK offload, returned %d",
@@ -280,7 +280,7 @@
 	hdd_context_t *pHddCtx;
 
 	int i = 0;
-	CDF_STATUS returnStatus;
+	QDF_STATUS returnStatus;
 	uint32_t count = 0, scope;
 
 	ENTER();
@@ -394,7 +394,7 @@
 			/* Configure the Firmware with this */
 			returnStatus = sme_set_host_offload(WLAN_HDD_GET_HAL_CTX(pAdapter),
 				pAdapter->sessionId, &offLoadRequest);
-			if (CDF_STATUS_SUCCESS != returnStatus) {
+			if (QDF_STATUS_SUCCESS != returnStatus) {
 				hdd_err("Failed to enable HostOffload feature with status: %d",
 					returnStatus);
 			}
@@ -408,7 +408,7 @@
 		offLoadRequest.enableOrDisable = SIR_OFFLOAD_DISABLE;
 		offLoadRequest.offloadType =  SIR_IPV6_NS_OFFLOAD;
 
-		if (CDF_STATUS_SUCCESS !=
+		if (QDF_STATUS_SUCCESS !=
 			sme_set_host_offload(WLAN_HDD_GET_HAL_CTX(pAdapter),
 				pAdapter->sessionId, &offLoadRequest))
 				hdd_err("Failed to disable NS Offload");
@@ -679,10 +679,10 @@
  * @fenable: true : enable ARP offload false : disable arp offload
  *
  * Return:
- *	CDF_STATUS_SUCCESS - on successful operation,
- *	CDF_STATUS_E_FAILURE - on failure of operation
+ *	QDF_STATUS_SUCCESS - on successful operation,
+ *	QDF_STATUS_E_FAILURE - on failure of operation
  */
-CDF_STATUS hdd_conf_arp_offload(hdd_adapter_t *pAdapter, bool fenable)
+QDF_STATUS hdd_conf_arp_offload(hdd_adapter_t *pAdapter, bool fenable)
 {
 	struct in_ifaddr **ifap = NULL;
 	struct in_ifaddr *ifa = NULL;
@@ -701,7 +701,7 @@
 		!pHddCtx->ap_arpns_support) {
 		hddLog(LOG1,
 			FL("ARP Offload is not supported in SAP/P2PGO mode"));
-		return CDF_STATUS_SUCCESS;
+		return QDF_STATUS_SUCCESS;
 	}
 
 	if (fenable) {
@@ -749,36 +749,36 @@
 			       offLoadRequest.params.hostIpv4Addr[2],
 			       offLoadRequest.params.hostIpv4Addr[3]);
 
-			if (CDF_STATUS_SUCCESS !=
+			if (QDF_STATUS_SUCCESS !=
 			    sme_set_host_offload(WLAN_HDD_GET_HAL_CTX(pAdapter),
 						 pAdapter->sessionId,
 						 &offLoadRequest)) {
 				hddLog(CDF_TRACE_LEVEL_ERROR,
 				       "%s: Failed to enable HostOffload feature",
 				       __func__);
-				return CDF_STATUS_E_FAILURE;
+				return QDF_STATUS_E_FAILURE;
 			}
 		} else {
 			hddLog(CDF_TRACE_LEVEL_INFO,
 			       FL("IP Address is not assigned"));
 		}
 
-		return CDF_STATUS_SUCCESS;
+		return QDF_STATUS_SUCCESS;
 	} else {
 		cdf_mem_zero((void *)&offLoadRequest,
 			     sizeof(tSirHostOffloadReq));
 		offLoadRequest.enableOrDisable = SIR_OFFLOAD_DISABLE;
 		offLoadRequest.offloadType = SIR_IPV4_ARP_REPLY_OFFLOAD;
 
-		if (CDF_STATUS_SUCCESS !=
+		if (QDF_STATUS_SUCCESS !=
 		    sme_set_host_offload(WLAN_HDD_GET_HAL_CTX(pAdapter),
 					 pAdapter->sessionId, &offLoadRequest)) {
 			hddLog(CDF_TRACE_LEVEL_ERROR,
 			       "%s: Failure to disable host " "offload feature",
 			       __func__);
-			return CDF_STATUS_E_FAILURE;
+			return QDF_STATUS_E_FAILURE;
 		}
-		return CDF_STATUS_SUCCESS;
+		return QDF_STATUS_SUCCESS;
 	}
 }
 
@@ -832,7 +832,7 @@
  */
 void hdd_conf_mcastbcast_filter(hdd_context_t *pHddCtx, bool setfilter)
 {
-	CDF_STATUS cdf_ret_status = CDF_STATUS_E_FAILURE;
+	QDF_STATUS cdf_ret_status = QDF_STATUS_E_FAILURE;
 	tpSirWlanSetRxpFilters wlanRxpFilterParam =
 		cdf_mem_malloc(sizeof(tSirWlanSetRxpFilters));
 	if (NULL == wlanRxpFilterParam) {
@@ -857,17 +857,17 @@
 	cdf_ret_status =
 		sme_configure_rxp_filter(pHddCtx->hHal, wlanRxpFilterParam);
 
-	if (setfilter && (CDF_STATUS_SUCCESS == cdf_ret_status))
+	if (setfilter && (QDF_STATUS_SUCCESS == cdf_ret_status))
 		pHddCtx->hdd_mcastbcast_filter_set = true;
 
 	hddLog(LOG1,
 		FL("%s to post set/reset filter to lower mac with status %d configuredMcstBcstFilterSetting = %d setMcstBcstFilter = %d"),
-		(CDF_STATUS_SUCCESS != cdf_ret_status) ? "Failed" : "Success",
+		(QDF_STATUS_SUCCESS != cdf_ret_status) ? "Failed" : "Success",
 		cdf_ret_status,
 		wlanRxpFilterParam->configuredMcstBcstFilterSetting,
 		wlanRxpFilterParam->setMcstBcstFilter);
 
-	if (CDF_STATUS_SUCCESS != cdf_ret_status)
+	if (QDF_STATUS_SUCCESS != cdf_ret_status)
 		cdf_mem_free(wlanRxpFilterParam);
 }
 
@@ -1001,7 +1001,7 @@
 						  bool suspended),
 				 void *callbackContext)
 {
-	CDF_STATUS cdf_ret_status = CDF_STATUS_E_FAILURE;
+	QDF_STATUS cdf_ret_status = QDF_STATUS_E_FAILURE;
 
 	hdd_info("%s: send wlan suspend indication", __func__);
 
@@ -1009,7 +1009,7 @@
 		sme_configure_suspend_ind(pHddCtx->hHal, conn_state_mask,
 					  callback, callbackContext);
 
-	if (CDF_STATUS_SUCCESS == cdf_ret_status) {
+	if (QDF_STATUS_SUCCESS == cdf_ret_status) {
 		pHddCtx->hdd_mcastbcast_filter_set = true;
 	} else {
 		hddLog(CDF_TRACE_LEVEL_ERROR,
@@ -1027,11 +1027,11 @@
 static void hdd_conf_resume_ind(hdd_adapter_t *pAdapter)
 {
 	hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
-	CDF_STATUS cdf_ret_status = CDF_STATUS_E_FAILURE;
+	QDF_STATUS cdf_ret_status = QDF_STATUS_E_FAILURE;
 
 	cdf_ret_status = sme_configure_resume_req(pHddCtx->hHal, NULL);
 
-	if (CDF_STATUS_SUCCESS != cdf_ret_status) {
+	if (QDF_STATUS_SUCCESS != cdf_ret_status) {
 		hddLog(CDF_TRACE_LEVEL_ERROR,
 		       "%s: sme_configure_resume_req return failure %d",
 		       __func__, cdf_ret_status);
@@ -1090,7 +1090,7 @@
 {
 	hdd_context_t *pHddCtx;
 
-	CDF_STATUS status;
+	QDF_STATUS status;
 	hdd_adapter_t *pAdapter = NULL;
 	hdd_adapter_list_node_t *pAdapterNode = NULL, *pNext = NULL;
 	uint32_t conn_state_mask = 0;
@@ -1113,7 +1113,7 @@
 	hdd_update_mcastbcast_filter(pHddCtx);
 
 	status = hdd_get_front_adapter(pHddCtx, &pAdapterNode);
-	while (NULL != pAdapterNode && CDF_STATUS_SUCCESS == status) {
+	while (NULL != pAdapterNode && QDF_STATUS_SUCCESS == status) {
 		pAdapter = pAdapterNode->pAdapter;
 
 		/* stop all TX queues before suspend */
@@ -1149,7 +1149,7 @@
 	hdd_context_t *pHddCtx;
 	hdd_adapter_t *pAdapter = NULL;
 	hdd_adapter_list_node_t *pAdapterNode = NULL, *pNext = NULL;
-	CDF_STATUS status;
+	QDF_STATUS status;
 
 	hddLog(CDF_TRACE_LEVEL_INFO, "%s: WLAN being resumed by OS",
 	       __func__);
@@ -1172,7 +1172,7 @@
 	/*loop through all adapters. Concurrency */
 	status = hdd_get_front_adapter(pHddCtx, &pAdapterNode);
 
-	while (NULL != pAdapterNode && CDF_STATUS_SUCCESS == status) {
+	while (NULL != pAdapterNode && QDF_STATUS_SUCCESS == status) {
 		pAdapter = pAdapterNode->pAdapter;
 
 		/* wake the tx queues */
@@ -1258,12 +1258,12 @@
  *
  * This function is called by the HIF to shutdown the driver during SSR.
  *
- * Return: CDF_STATUS_SUCCESS if the driver was shut down,
+ * Return: QDF_STATUS_SUCCESS if the driver was shut down,
  *	or an error status otherwise
  */
-CDF_STATUS hdd_wlan_shutdown(void)
+QDF_STATUS hdd_wlan_shutdown(void)
 {
-	CDF_STATUS cdf_status;
+	QDF_STATUS qdf_status;
 	v_CONTEXT_t p_cds_context = NULL;
 	hdd_context_t *pHddCtx;
 	p_cds_sched_context cds_sched_context = NULL;
@@ -1284,7 +1284,7 @@
 	if (!p_cds_context) {
 		hddLog(CDF_TRACE_LEVEL_FATAL, "%s: Global CDS context is Null",
 		       __func__);
-		return CDF_STATUS_E_FAILURE;
+		return QDF_STATUS_E_FAILURE;
 	}
 
 	/* Get the HDD context. */
@@ -1292,7 +1292,7 @@
 	if (!pHddCtx) {
 		hddLog(CDF_TRACE_LEVEL_FATAL, "%s: HDD context is Null",
 		       __func__);
-		return CDF_STATUS_E_FAILURE;
+		return QDF_STATUS_E_FAILURE;
 	}
 
 	cds_set_recovery_in_progress(true);
@@ -1343,12 +1343,12 @@
 #endif
 
 	hddLog(CDF_TRACE_LEVEL_FATAL, "%s: Doing WMA STOP", __func__);
-	cdf_status = wma_stop(p_cds_context, HAL_STOP_TYPE_RF_KILL);
+	qdf_status = wma_stop(p_cds_context, HAL_STOP_TYPE_RF_KILL);
 
-	if (!CDF_IS_STATUS_SUCCESS(cdf_status)) {
+	if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
 		CDF_TRACE(CDF_MODULE_ID_CDF, CDF_TRACE_LEVEL_ERROR,
 			  "%s: Failed to stop WMA", __func__);
-		CDF_ASSERT(CDF_IS_STATUS_SUCCESS(cdf_status));
+		CDF_ASSERT(QDF_IS_STATUS_SUCCESS(qdf_status));
 		wma_setneedshutdown(p_cds_context);
 	}
 
@@ -1356,19 +1356,19 @@
 	/* Stop SME - Cannot invoke cds_disable as cds_disable relies
 	 * on threads being running to process the SYS Stop
 	 */
-	cdf_status = sme_stop(pHddCtx->hHal, HAL_STOP_TYPE_SYS_RESET);
-	if (!CDF_IS_STATUS_SUCCESS(cdf_status)) {
+	qdf_status = sme_stop(pHddCtx->hHal, HAL_STOP_TYPE_SYS_RESET);
+	if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
 		CDF_TRACE(CDF_MODULE_ID_CDF, CDF_TRACE_LEVEL_ERROR,
-			  "%s: Failed to stop sme %d", __func__, cdf_status);
+			  "%s: Failed to stop sme %d", __func__, qdf_status);
 		CDF_ASSERT(0);
 	}
 
 	hddLog(CDF_TRACE_LEVEL_FATAL, "%s: Doing MAC STOP", __func__);
 	/* Stop MAC (PE and HAL) */
-	cdf_status = mac_stop(pHddCtx->hHal, HAL_STOP_TYPE_SYS_RESET);
-	if (!CDF_IS_STATUS_SUCCESS(cdf_status)) {
+	qdf_status = mac_stop(pHddCtx->hHal, HAL_STOP_TYPE_SYS_RESET);
+	if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
 		CDF_TRACE(CDF_MODULE_ID_CDF, CDF_TRACE_LEVEL_ERROR,
-			  "%s: Failed to stop mac %d", __func__, cdf_status);
+			  "%s: Failed to stop mac %d", __func__, qdf_status);
 		CDF_ASSERT(0);
 	}
 
@@ -1389,7 +1389,7 @@
 
 	hddLog(CDF_TRACE_LEVEL_FATAL, "%s: WLAN driver shutdown complete",
 	       __func__);
-	return CDF_STATUS_SUCCESS;
+	return QDF_STATUS_SUCCESS;
 }
 
 /**
@@ -1397,15 +1397,15 @@
  *
  * This function is called by the HIF to re-initialize the driver after SSR.
  *
- * Return: CDF_STATUS_SUCCESS if the driver was re-initialized,
+ * Return: QDF_STATUS_SUCCESS if the driver was re-initialized,
  *	or an error status otherwise
  */
-CDF_STATUS hdd_wlan_re_init(void *hif_sc)
+QDF_STATUS hdd_wlan_re_init(void *hif_sc)
 {
-	CDF_STATUS cdf_status;
+	QDF_STATUS qdf_status;
 	v_CONTEXT_t p_cds_context = NULL;
 	hdd_context_t *pHddCtx = NULL;
-	CDF_STATUS cdf_ret_status;
+	QDF_STATUS cdf_ret_status;
 	hdd_adapter_t *pAdapter;
 	int i;
 
@@ -1438,8 +1438,8 @@
 	hdd_set_conparam(0);
 
 	/* Re-open CDS, it is a re-open b'se control transport was never closed. */
-	cdf_status = cds_open();
-	if (!CDF_IS_STATUS_SUCCESS(cdf_status)) {
+	qdf_status = cds_open();
+	if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
 		hddLog(CDF_TRACE_LEVEL_FATAL, "%s: cds_open failed", __func__);
 		goto err_re_init;
 	}
@@ -1452,8 +1452,8 @@
 		goto err_cds_close;
 	}
 
-	cdf_status = cds_pre_enable(pHddCtx->pcds_context);
-	if (!CDF_IS_STATUS_SUCCESS(cdf_status)) {
+	qdf_status = cds_pre_enable(pHddCtx->pcds_context);
+	if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
 		hdd_alert("cds_pre_enable failed");
 		goto err_cds_close;
 	}
@@ -1464,16 +1464,16 @@
 	 * since the SME config operation must access the cfg database.
 	 * Set the SME configuration parameters.
 	 */
-	cdf_status = hdd_set_sme_config(pHddCtx);
-	if (CDF_STATUS_SUCCESS != cdf_status) {
+	qdf_status = hdd_set_sme_config(pHddCtx);
+	if (QDF_STATUS_SUCCESS != qdf_status) {
 		hdd_alert("Failed hdd_set_sme_config");
 		goto err_cds_close;
 	}
 
 	ol_txrx_register_pause_cb(wlan_hdd_txrx_pause_cb);
 
-	cdf_status = hdd_set_sme_chan_list(pHddCtx);
-	if (!CDF_IS_STATUS_SUCCESS(cdf_status)) {
+	qdf_status = hdd_set_sme_chan_list(pHddCtx);
+	if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
 		hddLog(CDF_TRACE_LEVEL_FATAL,
 		       "%s: Failed to init channel list", __func__);
 		goto err_cds_close;
@@ -1492,7 +1492,7 @@
 				     (uint8_t *) &pHddCtx->config->
 				     intfMacAddr[0],
 				     sizeof(pHddCtx->config->intfMacAddr[0]));
-	if (!CDF_IS_STATUS_SUCCESS(cdf_ret_status)) {
+	if (!QDF_IS_STATUS_SUCCESS(cdf_ret_status)) {
 		hddLog(CDF_TRACE_LEVEL_ERROR, "%s: Failed to set MAC Address. "
 		       "HALStatus is %08d [x%08x]", __func__, cdf_ret_status,
 		       cdf_ret_status);
@@ -1501,14 +1501,14 @@
 
 	/* Start CDS which starts up the SME/MAC/HAL modules and everything else
 	   Note: Firmware image will be read and downloaded inside cds_enable API */
-	cdf_status = cds_enable(p_cds_context);
-	if (!CDF_IS_STATUS_SUCCESS(cdf_status)) {
+	qdf_status = cds_enable(p_cds_context);
+	if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
 		hddLog(CDF_TRACE_LEVEL_FATAL, "%s: cds_enable failed", __func__);
 		goto err_cds_close;
 	}
 
-	cdf_status = hdd_post_cds_enable_config(pHddCtx);
-	if (!CDF_IS_STATUS_SUCCESS(cdf_status)) {
+	qdf_status = hdd_post_cds_enable_config(pHddCtx);
+	if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
 		hddLog(CDF_TRACE_LEVEL_FATAL,
 		       "%s: hdd_post_cds_enable_config failed", __func__);
 		goto err_cds_disable;
@@ -1628,7 +1628,7 @@
 		wiphy_unregister(pHddCtx->wiphy);
 		wiphy_free(pHddCtx->wiphy);
 
-		if (!CDF_IS_STATUS_SUCCESS(cds_deinit_policy_mgr())) {
+		if (!QDF_IS_STATUS_SUCCESS(cds_deinit_policy_mgr())) {
 			hdd_err("Failed to deinit policy manager");
 			/* Proceed and complete the clean up */
 		}
@@ -1641,7 +1641,7 @@
 	return -EPERM;
 
 success:
-	return CDF_STATUS_SUCCESS;
+	return QDF_STATUS_SUCCESS;
 }
 
 /**
@@ -1720,7 +1720,7 @@
 	hdd_context_t *pHddCtx = wiphy_priv(wiphy);
 	hdd_adapter_t *pAdapter;
 	hdd_adapter_list_node_t *pAdapterNode, *pNext;
-	CDF_STATUS status = CDF_STATUS_SUCCESS;
+	QDF_STATUS status = QDF_STATUS_SUCCESS;
 	int result;
 	p_cds_sched_context cds_sched_context = get_cds_sched_ctxt();
 
@@ -1768,7 +1768,7 @@
 
 	status = hdd_get_front_adapter(pHddCtx, &pAdapterNode);
 
-	while (NULL != pAdapterNode && CDF_STATUS_SUCCESS == status) {
+	while (NULL != pAdapterNode && QDF_STATUS_SUCCESS == status) {
 		pAdapter = pAdapterNode->pAdapter;
 		if ((NULL != pAdapter) &&
 		    (WLAN_HDD_INFRA_STATION == pAdapter->device_mode)) {
@@ -1857,7 +1857,7 @@
 	hdd_adapter_list_node_t *pAdapterNode = NULL, *pNext = NULL;
 	hdd_adapter_t *pAdapter;
 	hdd_scaninfo_t *pScanInfo;
-	CDF_STATUS status;
+	QDF_STATUS status;
 	int rc;
 
 	ENTER();
@@ -1876,7 +1876,7 @@
 	 * until CAC is done for a SoftAP which is in started state.
 	 */
 	status = hdd_get_front_adapter(pHddCtx, &pAdapterNode);
-	while (NULL != pAdapterNode && CDF_STATUS_SUCCESS == status) {
+	while (NULL != pAdapterNode && QDF_STATUS_SUCCESS == status) {
 		pAdapter = pAdapterNode->pAdapter;
 		if (WLAN_HDD_SOFTAP == pAdapter->device_mode) {
 			if (BSS_START ==
@@ -1911,7 +1911,7 @@
 
 	/* Stop ongoing scan on each interface */
 	status = hdd_get_front_adapter(pHddCtx, &pAdapterNode);
-	while (NULL != pAdapterNode && CDF_STATUS_SUCCESS == status) {
+	while (NULL != pAdapterNode && QDF_STATUS_SUCCESS == status) {
 		pAdapter = pAdapterNode->pAdapter;
 		pScanInfo = &pAdapter->scan_info;
 
@@ -2077,7 +2077,7 @@
 {
 	hdd_adapter_t *pAdapter = WLAN_HDD_GET_PRIV_PTR(dev);
 	hdd_context_t *pHddCtx;
-	CDF_STATUS cdf_status;
+	QDF_STATUS qdf_status;
 	int status;
 
 	ENTER();
@@ -2105,11 +2105,11 @@
 
 		hddLog(LOG1,
 			FL("offload: in cfg80211_set_power_mgmt, calling arp offload"));
-		cdf_status = hdd_conf_arp_offload(pAdapter, true);
-		if (!CDF_IS_STATUS_SUCCESS(cdf_status)) {
+		qdf_status = hdd_conf_arp_offload(pAdapter, true);
+		if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
 			hddLog(LOG1,
 				FL("Failed to enable ARPOFFLOAD Feature %d"),
-				cdf_status);
+				qdf_status);
 		}
 	}
 
@@ -2204,7 +2204,7 @@
 	/* Fall through */
 	case NL80211_TX_POWER_LIMITED:  /* Limit TX power by the mBm parameter */
 		if (sme_set_max_tx_power(hHal, bssid, selfMac, dbm) !=
-		    CDF_STATUS_SUCCESS) {
+		    QDF_STATUS_SUCCESS) {
 			hddLog(LOGE, FL("Setting maximum tx power failed"));
 			return -EIO;
 		}
diff --git a/core/hdd/src/wlan_hdd_scan.c b/core/hdd/src/wlan_hdd_scan.c
index 5e76a7e..48ba11e 100644
--- a/core/hdd/src/wlan_hdd_scan.c
+++ b/core/hdd/src/wlan_hdd_scan.c
@@ -560,9 +560,9 @@
  * @source : returns source of the scan request
  * @timestamp: scan request timestamp
  *
- * Return: CDF_STATUS
+ * Return: QDF_STATUS
  */
-CDF_STATUS wlan_hdd_scan_request_dequeue(hdd_context_t *hdd_ctx,
+QDF_STATUS wlan_hdd_scan_request_dequeue(hdd_context_t *hdd_ctx,
 	uint32_t scan_id, struct cfg80211_scan_request **req, uint8_t *source,
 	uint32_t *timestamp)
 {
@@ -633,7 +633,7 @@
  * Return: 0 for success, non zero for failure
  */
 
-static CDF_STATUS
+static QDF_STATUS
 hdd_scan_request_callback(tHalHandle halHandle, void *pContext,
 			  uint8_t sessionId, uint32_t scanId,
 			  eCsrScanStatus status)
@@ -663,7 +663,7 @@
 	if (pAdapter->dev != dev) {
 		hddLog(LOGW, "%s: device mismatch %p vs %p",
 		       __func__, pAdapter->dev, dev);
-		return CDF_STATUS_SUCCESS;
+		return QDF_STATUS_SUCCESS;
 	}
 
 	wlan_hdd_scan_request_dequeue(hddctx, scanId, &req, &source,
@@ -687,7 +687,7 @@
 	wireless_send_event(dev, we_event, &wrqu, msg);
 
 	EXIT();
-	return CDF_STATUS_SUCCESS;
+	return QDF_STATUS_SUCCESS;
 }
 
 /**
@@ -710,7 +710,7 @@
 	hdd_context_t *hdd_ctx = WLAN_HDD_GET_CTX(pAdapter);
 	hdd_wext_state_t *pwextBuf = WLAN_HDD_GET_WEXT_STATE_PTR(pAdapter);
 	tCsrScanRequest scanRequest;
-	CDF_STATUS status = CDF_STATUS_SUCCESS;
+	QDF_STATUS status = QDF_STATUS_SUCCESS;
 	struct iw_scan_req *scanReq = (struct iw_scan_req *)extra;
 	hdd_adapter_t *con_sap_adapter;
 	uint16_t con_dfs_ch;
@@ -832,7 +832,7 @@
 	status = sme_scan_request((WLAN_HDD_GET_CTX(pAdapter))->hHal,
 				  pAdapter->sessionId, &scanRequest,
 				  &hdd_scan_request_callback, dev);
-	if (!CDF_IS_STATUS_SUCCESS(status)) {
+	if (!QDF_IS_STATUS_SUCCESS(status)) {
 		CDF_TRACE(CDF_MODULE_ID_HDD, CDF_TRACE_LEVEL_FATAL,
 			  "%s:sme_scan_request  fail %d!!!", __func__, status);
 		goto error;
@@ -891,7 +891,7 @@
 	hdd_context_t *hdd_ctx;
 	tHalHandle hHal = WLAN_HDD_GET_HAL_CTX(pAdapter);
 	tCsrScanResultInfo *pScanResult;
-	CDF_STATUS status = CDF_STATUS_SUCCESS;
+	QDF_STATUS status = QDF_STATUS_SUCCESS;
 	hdd_scan_info_t scanInfo;
 	tScanResultHandle pResult;
 	int i = 0;
@@ -1089,7 +1089,7 @@
  *
  * Return: CDF status
  */
-static CDF_STATUS hdd_cfg80211_scan_done_callback(tHalHandle halHandle,
+static QDF_STATUS hdd_cfg80211_scan_done_callback(tHalHandle halHandle,
 					   void *pContext,
 					   uint8_t sessionId,
 					   uint32_t scanId,
@@ -1108,7 +1108,7 @@
 
 	ret = wlan_hdd_validate_context(hddctx);
 	if (0 != ret)
-		return CDF_STATUS_E_INVAL;
+		return QDF_STATUS_E_INVAL;
 
 	hddLog(CDF_TRACE_LEVEL_INFO,
 		"%s called with hal = %p, pContext = %p, ID = %d, status = %d",
@@ -1121,7 +1121,7 @@
 		goto allow_suspend;
 	}
 
-	if (CDF_STATUS_SUCCESS !=
+	if (QDF_STATUS_SUCCESS !=
 		wlan_hdd_scan_request_dequeue(hddctx, scanId, &req, &source,
 			&scan_time)) {
 		hdd_err("Dequeue of scan request failed ID: %d", scanId);
@@ -1554,9 +1554,9 @@
 				pAdapter->sessionId, &scan_req,
 				&hdd_cfg80211_scan_done_callback, dev);
 
-	if (CDF_STATUS_SUCCESS != status) {
+	if (QDF_STATUS_SUCCESS != status) {
 		hddLog(LOGE, FL("sme_scan_request returned error %d"), status);
-		if (CDF_STATUS_E_RESOURCES == status) {
+		if (QDF_STATUS_E_RESOURCES == status) {
 			hddLog(LOGE,
 			       FL("HO is in progress.So defer the scan by informing busy"));
 			status = -EBUSY;
@@ -1985,7 +1985,7 @@
  *
  * Return: Success if PNO is allowed, Failure otherwise.
  */
-static CDF_STATUS wlan_hdd_is_pno_allowed(hdd_adapter_t *adapter)
+static QDF_STATUS wlan_hdd_is_pno_allowed(hdd_adapter_t *adapter)
 {
 	hddLog(LOG1,
 		FL("dev_mode=%d, conn_state=%d, session ID=%d"),
@@ -1995,9 +1995,9 @@
 	if ((adapter->device_mode == WLAN_HDD_INFRA_STATION) &&
 		(eConnectionState_NotConnected ==
 		 adapter->sessionCtx.station.conn_info.connState))
-		return CDF_STATUS_SUCCESS;
+		return QDF_STATUS_SUCCESS;
 	else
-		return CDF_STATUS_E_FAILURE;
+		return QDF_STATUS_E_FAILURE;
 
 }
 
@@ -2023,7 +2023,7 @@
 	u8 valid_ch[WNI_CFG_VALID_CHANNEL_LIST_LEN] = { 0 };
 	u8 channels_allowed[WNI_CFG_VALID_CHANNEL_LIST_LEN] = { 0 };
 	uint32_t num_channels_allowed = WNI_CFG_VALID_CHANNEL_LIST_LEN;
-	CDF_STATUS status = CDF_STATUS_E_FAILURE;
+	QDF_STATUS status = QDF_STATUS_E_FAILURE;
 	int ret = 0;
 	hdd_scaninfo_t *pScanInfo = &pAdapter->scan_info;
 	struct hdd_config *config = NULL;
@@ -2079,7 +2079,7 @@
 		}
 	}
 
-	if (CDF_STATUS_E_FAILURE == wlan_hdd_is_pno_allowed(pAdapter)) {
+	if (QDF_STATUS_E_FAILURE == wlan_hdd_is_pno_allowed(pAdapter)) {
 		hddLog(LOGE, FL("pno is not allowed"));
 		return -ENOTSUPP;
 	}
@@ -2251,7 +2251,7 @@
 						pAdapter->sessionId,
 						hdd_sched_scan_callback,
 						pAdapter);
-	if (CDF_STATUS_SUCCESS != status) {
+	if (QDF_STATUS_SUCCESS != status) {
 		hddLog(LOGE, FL("Failed to enable PNO"));
 		ret = -EINVAL;
 		goto error;
@@ -2297,7 +2297,7 @@
 static int __wlan_hdd_cfg80211_sched_scan_stop(struct wiphy *wiphy,
 					       struct net_device *dev)
 {
-	CDF_STATUS status = CDF_STATUS_E_FAILURE;
+	QDF_STATUS status = QDF_STATUS_E_FAILURE;
 	hdd_adapter_t *pAdapter = WLAN_HDD_GET_PRIV_PTR(dev);
 	hdd_context_t *pHddCtx;
 	tHalHandle hHal;
@@ -2361,7 +2361,7 @@
 	status = sme_set_preferred_network_list(hHal, pPnoRequest,
 						pAdapter->sessionId,
 						NULL, pAdapter);
-	if (CDF_STATUS_SUCCESS != status) {
+	if (QDF_STATUS_SUCCESS != status) {
 		hddLog(LOGE, FL("Failed to disabled PNO"));
 		ret = -EINVAL;
 	}
diff --git a/core/hdd/src/wlan_hdd_softap_tx_rx.c b/core/hdd/src/wlan_hdd_softap_tx_rx.c
index 8abb284..1dddcd6 100644
--- a/core/hdd/src/wlan_hdd_softap_tx_rx.c
+++ b/core/hdd/src/wlan_hdd_softap_tx_rx.c
@@ -208,7 +208,7 @@
 		 */
 		STAId = pHddApCtx->uBCStaId;
 	} else {
-		if (CDF_STATUS_SUCCESS !=
+		if (QDF_STATUS_SUCCESS !=
 			 hdd_softap_get_sta_id(pAdapter,
 				 pDestMacAddress, &STAId)) {
 			CDF_TRACE(CDF_MODULE_ID_HDD_SAP_DATA,
@@ -391,12 +391,12 @@
  * @hdd_softap_init_tx_rx() - Initialize Tx/RX module
  * @pAdapter: pointer to adapter context
  *
- * Return: CDF_STATUS_E_FAILURE if any errors encountered,
- *	   CDF_STATUS_SUCCESS otherwise
+ * Return: QDF_STATUS_E_FAILURE if any errors encountered,
+ *	   QDF_STATUS_SUCCESS otherwise
  */
-CDF_STATUS hdd_softap_init_tx_rx(hdd_adapter_t *pAdapter)
+QDF_STATUS hdd_softap_init_tx_rx(hdd_adapter_t *pAdapter)
 {
-	CDF_STATUS status = CDF_STATUS_SUCCESS;
+	QDF_STATUS status = QDF_STATUS_SUCCESS;
 
 	uint8_t STAId = 0;
 
@@ -416,12 +416,12 @@
  * @hdd_softap_deinit_tx_rx() - Deinitialize Tx/RX module
  * @pAdapter: pointer to adapter context
  *
- * Return: CDF_STATUS_E_FAILURE if any errors encountered,
- *	   CDF_STATUS_SUCCESS otherwise
+ * Return: QDF_STATUS_E_FAILURE if any errors encountered,
+ *	   QDF_STATUS_SUCCESS otherwise
  */
-CDF_STATUS hdd_softap_deinit_tx_rx(hdd_adapter_t *pAdapter)
+QDF_STATUS hdd_softap_deinit_tx_rx(hdd_adapter_t *pAdapter)
 {
-	CDF_STATUS status = CDF_STATUS_SUCCESS;
+	QDF_STATUS status = QDF_STATUS_SUCCESS;
 
 	return status;
 }
@@ -432,10 +432,10 @@
  * @STAId: Station ID to initialize
  * @pmacAddrSTA: pointer to the MAC address of the station
  *
- * Return: CDF_STATUS_E_FAILURE if any errors encountered,
- *	   CDF_STATUS_SUCCESS otherwise
+ * Return: QDF_STATUS_E_FAILURE if any errors encountered,
+ *	   QDF_STATUS_SUCCESS otherwise
  */
-CDF_STATUS hdd_softap_init_tx_rx_sta(hdd_adapter_t *pAdapter, uint8_t STAId,
+QDF_STATUS hdd_softap_init_tx_rx_sta(hdd_adapter_t *pAdapter, uint8_t STAId,
 				     struct cdf_mac_addr *pmacAddrSTA)
 {
 	spin_lock_bh(&pAdapter->staInfo_lock);
@@ -443,7 +443,7 @@
 		CDF_TRACE(CDF_MODULE_ID_HDD_SAP_DATA, CDF_TRACE_LEVEL_ERROR,
 			  "%s: Reinit station %d", __func__, STAId);
 		spin_unlock_bh(&pAdapter->staInfo_lock);
-		return CDF_STATUS_E_FAILURE;
+		return QDF_STATUS_E_FAILURE;
 	}
 
 	cdf_mem_zero(&pAdapter->aStaInfo[STAId], sizeof(hdd_station_info_t));
@@ -453,7 +453,7 @@
 	cdf_copy_macaddr(&pAdapter->aStaInfo[STAId].macAddrSTA, pmacAddrSTA);
 
 	spin_unlock_bh(&pAdapter->staInfo_lock);
-	return CDF_STATUS_SUCCESS;
+	return QDF_STATUS_SUCCESS;
 }
 
 /**
@@ -461,12 +461,12 @@
  * @pAdapter: pointer to adapter context
  * @STAId: Station ID to deinitialize
  *
- * Return: CDF_STATUS_E_FAILURE if any errors encountered,
- *	   CDF_STATUS_SUCCESS otherwise
+ * Return: QDF_STATUS_E_FAILURE if any errors encountered,
+ *	   QDF_STATUS_SUCCESS otherwise
  */
-CDF_STATUS hdd_softap_deinit_tx_rx_sta(hdd_adapter_t *pAdapter, uint8_t STAId)
+QDF_STATUS hdd_softap_deinit_tx_rx_sta(hdd_adapter_t *pAdapter, uint8_t STAId)
 {
-	CDF_STATUS status = CDF_STATUS_SUCCESS;
+	QDF_STATUS status = QDF_STATUS_SUCCESS;
 	hdd_hostapd_state_t *pHostapdState;
 
 	pHostapdState = WLAN_HDD_GET_HOSTAP_STATE_PTR(pAdapter);
@@ -477,7 +477,7 @@
 		spin_unlock_bh(&pAdapter->staInfo_lock);
 		CDF_TRACE(CDF_MODULE_ID_HDD_SAP_DATA, CDF_TRACE_LEVEL_ERROR,
 			  "%s: Deinit station not inited %d", __func__, STAId);
-		return CDF_STATUS_E_FAILURE;
+		return QDF_STATUS_E_FAILURE;
 	}
 
 	pAdapter->aStaInfo[STAId].isUsed = false;
@@ -497,10 +497,10 @@
  * the HDD when one or more packets were received for a registered
  * STA.
  *
- * Return: CDF_STATUS_E_FAILURE if any errors encountered,
- *	   CDF_STATUS_SUCCESS otherwise
+ * Return: QDF_STATUS_E_FAILURE if any errors encountered,
+ *	   QDF_STATUS_SUCCESS otherwise
  */
-CDF_STATUS hdd_softap_rx_packet_cbk(void *cds_context,
+QDF_STATUS hdd_softap_rx_packet_cbk(void *cds_context,
 				    cdf_nbuf_t rxBuf, uint8_t staId)
 {
 	hdd_adapter_t *pAdapter = NULL;
@@ -516,14 +516,14 @@
 	if ((NULL == cds_context) || (NULL == rxBuf)) {
 		CDF_TRACE(CDF_MODULE_ID_HDD_SAP_DATA, CDF_TRACE_LEVEL_ERROR,
 			  "%s: Null params being passed", __func__);
-		return CDF_STATUS_E_FAILURE;
+		return QDF_STATUS_E_FAILURE;
 	}
 
 	pHddCtx = cds_get_context(CDF_MODULE_ID_HDD);
 	if (NULL == pHddCtx) {
 		CDF_TRACE(CDF_MODULE_ID_HDD_SAP_DATA, CDF_TRACE_LEVEL_ERROR,
 			  "%s: HDD context is Null", __func__);
-		return CDF_STATUS_E_FAILURE;
+		return QDF_STATUS_E_FAILURE;
 	}
 
 	pAdapter = pHddCtx->sta_to_adapter[staId];
@@ -531,7 +531,7 @@
 		hddLog(LOGE,
 			FL("invalid adapter %p or adapter has invalid magic"),
 			pAdapter);
-		return CDF_STATUS_E_FAILURE;
+		return QDF_STATUS_E_FAILURE;
 	}
 
 	/* walk the chain until all are processed */
@@ -545,7 +545,7 @@
 
 		CDF_TRACE(CDF_MODULE_ID_HDD_SAP_DATA, CDF_TRACE_LEVEL_ERROR,
 			  "%s: ERROR!!Invalid netdevice", __func__);
-		return CDF_STATUS_E_FAILURE;
+		return QDF_STATUS_E_FAILURE;
 	}
 	cpu_index = wlan_hdd_get_cpu();
 	++pAdapter->hdd_stats.hddTxRxStats.rxPackets[cpu_index];
@@ -592,7 +592,7 @@
 
 	pAdapter->dev->last_rx = jiffies;
 
-	return CDF_STATUS_SUCCESS;
+	return QDF_STATUS_SUCCESS;
 }
 
 /**
@@ -600,23 +600,23 @@
  * @pAdapter: pointer to adapter context
  * @staId: Station ID to deregister
  *
- * Return: CDF_STATUS_SUCCESS on success, CDF_STATUS_E_* on error
+ * Return: QDF_STATUS_SUCCESS on success, CDF_STATUS_E_* on error
  */
-CDF_STATUS hdd_softap_deregister_sta(hdd_adapter_t *pAdapter, uint8_t staId)
+QDF_STATUS hdd_softap_deregister_sta(hdd_adapter_t *pAdapter, uint8_t staId)
 {
-	CDF_STATUS cdf_status = CDF_STATUS_SUCCESS;
+	QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
 	hdd_context_t *pHddCtx;
 
 	if (NULL == pAdapter) {
 		CDF_TRACE(CDF_MODULE_ID_HDD_SAP_DATA, CDF_TRACE_LEVEL_ERROR,
 			  "%s: pAdapter is NULL", __func__);
-		return CDF_STATUS_E_INVAL;
+		return QDF_STATUS_E_INVAL;
 	}
 
 	if (WLAN_HDD_ADAPTER_MAGIC != pAdapter->magic) {
 		CDF_TRACE(CDF_MODULE_ID_HDD_SAP_DATA, CDF_TRACE_LEVEL_ERROR,
 			  "%s: Invalid pAdapter magic", __func__);
-		return CDF_STATUS_E_INVAL;
+		return QDF_STATUS_E_INVAL;
 	}
 
 	pHddCtx = (hdd_context_t *) (pAdapter->pHddCtx);
@@ -624,11 +624,11 @@
 	 * structures. This helps to block RX frames from other
 	 * station to this station.
 	 */
-	cdf_status = ol_txrx_clear_peer(staId);
-	if (!CDF_IS_STATUS_SUCCESS(cdf_status)) {
+	qdf_status = ol_txrx_clear_peer(staId);
+	if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
 		CDF_TRACE(CDF_MODULE_ID_HDD_SAP_DATA, CDF_TRACE_LEVEL_ERROR,
 			  "ol_txrx_clear_peer() failed to for staID %d.  "
-			  "Status= %d [0x%08X]", staId, cdf_status, cdf_status);
+			  "Status= %d [0x%08X]", staId, qdf_status, qdf_status);
 	}
 
 	if (pAdapter->aStaInfo[staId].isUsed) {
@@ -639,7 +639,7 @@
 	}
 	pHddCtx->sta_to_adapter[staId] = NULL;
 
-	return cdf_status;
+	return qdf_status;
 }
 
 /**
@@ -653,9 +653,9 @@
  * @pPeerMacAddress: station MAC address
  * @fWmmEnabled: is WMM enabled for this STA?
  *
- * Return: CDF_STATUS_SUCCESS on success, CDF_STATUS_E_* on error
+ * Return: QDF_STATUS_SUCCESS on success, CDF_STATUS_E_* on error
  */
-CDF_STATUS hdd_softap_register_sta(hdd_adapter_t *pAdapter,
+QDF_STATUS hdd_softap_register_sta(hdd_adapter_t *pAdapter,
 				   bool fAuthRequired,
 				   bool fPrivacyBit,
 				   uint8_t staId,
@@ -664,7 +664,7 @@
 				   struct cdf_mac_addr *pPeerMacAddress,
 				   bool fWmmEnabled)
 {
-	CDF_STATUS cdf_status = CDF_STATUS_E_FAILURE;
+	QDF_STATUS qdf_status = QDF_STATUS_E_FAILURE;
 	struct ol_txrx_desc_type staDesc = { 0 };
 	hdd_context_t *pHddCtx = pAdapter->pHddCtx;
 
@@ -683,7 +683,7 @@
 	/*Save the pAdapter Pointer for this staId */
 	pHddCtx->sta_to_adapter[staId] = pAdapter;
 
-	cdf_status =
+	qdf_status =
 		hdd_softap_init_tx_rx_sta(pAdapter, staId,
 					  pPeerMacAddress);
 
@@ -693,14 +693,14 @@
 		  staDesc.is_qos_enabled);
 
 
-	cdf_status =
+	qdf_status =
 		ol_txrx_register_peer(hdd_softap_rx_packet_cbk,
 					   &staDesc);
-	if (!CDF_IS_STATUS_SUCCESS(cdf_status)) {
+	if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
 		CDF_TRACE(CDF_MODULE_ID_HDD_SAP_DATA, CDF_TRACE_LEVEL_ERROR,
 			  "SOFTAP ol_txrx_register_peer() failed to register.  Status= %d [0x%08X]",
-			  cdf_status, cdf_status);
-		return cdf_status;
+			  qdf_status, qdf_status);
+		return qdf_status;
 	}
 
 	/* if ( WPA ), tell TL to go to 'connected' and after keys come to the
@@ -720,7 +720,7 @@
 		/* Connections that do not need Upper layer auth,
 		 * transition TL directly to 'Authenticated' state.
 		 */
-		cdf_status = hdd_change_peer_state(pAdapter, staDesc.sta_id,
+		qdf_status = hdd_change_peer_state(pAdapter, staDesc.sta_id,
 						ol_txrx_peer_state_auth, false);
 
 		pAdapter->aStaInfo[staId].tlSTAState = ol_txrx_peer_state_auth;
@@ -731,7 +731,7 @@
 			  "ULA auth StaId= %d.  Changing TL state to CONNECTED at Join time",
 			  pAdapter->aStaInfo[staId].ucSTAId);
 
-		cdf_status = hdd_change_peer_state(pAdapter, staDesc.sta_id,
+		qdf_status = hdd_change_peer_state(pAdapter, staDesc.sta_id,
 						ol_txrx_peer_state_conn, false);
 		pAdapter->aStaInfo[staId].tlSTAState = ol_txrx_peer_state_conn;
 
@@ -745,7 +745,7 @@
 				   WLAN_START_ALL_NETIF_QUEUE_N_CARRIER,
 				   WLAN_CONTROL_PATH);
 
-	return cdf_status;
+	return qdf_status;
 }
 
 /**
@@ -753,12 +753,12 @@
  * @pAdapter: pointer to adapter context
  * @fPrivacyBit: should 802.11 privacy bit be set?
  *
- * Return: CDF_STATUS_SUCCESS on success, CDF_STATUS_E_* on error
+ * Return: QDF_STATUS_SUCCESS on success, CDF_STATUS_E_* on error
  */
-CDF_STATUS hdd_softap_register_bc_sta(hdd_adapter_t *pAdapter,
+QDF_STATUS hdd_softap_register_bc_sta(hdd_adapter_t *pAdapter,
 				      bool fPrivacyBit)
 {
-	CDF_STATUS cdf_status = CDF_STATUS_E_FAILURE;
+	QDF_STATUS qdf_status = QDF_STATUS_E_FAILURE;
 	hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
 	struct cdf_mac_addr broadcastMacAddr =
 					CDF_MAC_ADDR_BROADCAST_INITIALIZER;
@@ -772,21 +772,21 @@
 #else
 	pHddCtx->sta_to_adapter[WLAN_RX_SAP_SELF_STA_ID] = pAdapter;
 #endif
-	cdf_status =
+	qdf_status =
 		hdd_softap_register_sta(pAdapter, false, fPrivacyBit,
 					(WLAN_HDD_GET_AP_CTX_PTR(pAdapter))->
 					uBCStaId, 0, 1, &broadcastMacAddr, 0);
 
-	return cdf_status;
+	return qdf_status;
 }
 
 /**
  * hdd_softap_deregister_bc_sta() - Deregister the SoftAP broadcast STA
  * @pAdapter: pointer to adapter context
  *
- * Return: CDF_STATUS_SUCCESS on success, CDF_STATUS_E_* on error
+ * Return: QDF_STATUS_SUCCESS on success, CDF_STATUS_E_* on error
  */
-CDF_STATUS hdd_softap_deregister_bc_sta(hdd_adapter_t *pAdapter)
+QDF_STATUS hdd_softap_deregister_bc_sta(hdd_adapter_t *pAdapter)
 {
 	return hdd_softap_deregister_sta(pAdapter,
 					 (WLAN_HDD_GET_AP_CTX_PTR(pAdapter))->
@@ -797,11 +797,11 @@
  * hdd_softap_stop_bss() - Stop the BSS
  * @pAdapter: pointer to adapter context
  *
- * Return: CDF_STATUS_SUCCESS on success, CDF_STATUS_E_* on error
+ * Return: QDF_STATUS_SUCCESS on success, CDF_STATUS_E_* on error
  */
-CDF_STATUS hdd_softap_stop_bss(hdd_adapter_t *pAdapter)
+QDF_STATUS hdd_softap_stop_bss(hdd_adapter_t *pAdapter)
 {
-	CDF_STATUS cdf_status = CDF_STATUS_E_FAILURE;
+	QDF_STATUS qdf_status = QDF_STATUS_E_FAILURE;
 	uint8_t staId = 0;
 	hdd_context_t *pHddCtx;
 	pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
@@ -813,12 +813,12 @@
 		CDF_TRACE(CDF_MODULE_ID_HDD_SAP_DATA, CDF_TRACE_LEVEL_ERROR,
 			  "%s: Loading_unloading in Progress, state: 0x%x. Ignore!!!",
 			  __func__, cds_get_driver_state());
-		return CDF_STATUS_E_PERM;
+		return QDF_STATUS_E_PERM;
 	}
 
-	cdf_status = hdd_softap_deregister_bc_sta(pAdapter);
+	qdf_status = hdd_softap_deregister_bc_sta(pAdapter);
 
-	if (!CDF_IS_STATUS_SUCCESS(cdf_status)) {
+	if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
 		CDF_TRACE(CDF_MODULE_ID_HDD_SAP_DATA, CDF_TRACE_LEVEL_ERROR,
 			  "%s: Failed to deregister BC sta Id %d", __func__,
 			  (WLAN_HDD_GET_AP_CTX_PTR(pAdapter))->uBCStaId);
@@ -827,8 +827,8 @@
 	for (staId = 0; staId < WLAN_MAX_STA_COUNT; staId++) {
 		/* This excludes BC sta as it is already deregistered */
 		if (pAdapter->aStaInfo[staId].isUsed) {
-			cdf_status = hdd_softap_deregister_sta(pAdapter, staId);
-			if (!CDF_IS_STATUS_SUCCESS(cdf_status)) {
+			qdf_status = hdd_softap_deregister_sta(pAdapter, staId);
+			if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
 				CDF_TRACE(CDF_MODULE_ID_HDD_SAP_DATA,
 					  CDF_TRACE_LEVEL_ERROR,
 					  "%s: Failed to deregister sta Id %d",
@@ -836,7 +836,7 @@
 			}
 		}
 	}
-	return cdf_status;
+	return qdf_status;
 }
 
 /**
@@ -845,24 +845,24 @@
  * @pDestMacAddress: MAC address of the station
  * @state: new state of the station
  *
- * Return: CDF_STATUS_SUCCESS on success, CDF_STATUS_E_* on error
+ * Return: QDF_STATUS_SUCCESS on success, CDF_STATUS_E_* on error
  */
-CDF_STATUS hdd_softap_change_sta_state(hdd_adapter_t *pAdapter,
+QDF_STATUS hdd_softap_change_sta_state(hdd_adapter_t *pAdapter,
 				       struct cdf_mac_addr *pDestMacAddress,
 				       enum ol_txrx_peer_state state)
 {
 	uint8_t ucSTAId = WLAN_MAX_STA_COUNT;
-	CDF_STATUS cdf_status = CDF_STATUS_SUCCESS;
+	QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
 
 	CDF_TRACE(CDF_MODULE_ID_HDD_SAP_DATA, CDF_TRACE_LEVEL_INFO,
 		  "%s: enter", __func__);
 
-	if (CDF_STATUS_SUCCESS !=
+	if (QDF_STATUS_SUCCESS !=
 		 hdd_softap_get_sta_id(pAdapter,
 			 pDestMacAddress, &ucSTAId)) {
 		CDF_TRACE(CDF_MODULE_ID_HDD_SAP_DATA, CDF_TRACE_LEVEL_ERROR,
 			  "%s: Failed to find right station", __func__);
-		return CDF_STATUS_E_FAILURE;
+		return QDF_STATUS_E_FAILURE;
 	}
 
 	if (false ==
@@ -871,15 +871,15 @@
 		CDF_TRACE(CDF_MODULE_ID_HDD_SAP_DATA, CDF_TRACE_LEVEL_ERROR,
 			  "%s: Station MAC address does not matching",
 			  __func__);
-		return CDF_STATUS_E_FAILURE;
+		return QDF_STATUS_E_FAILURE;
 	}
 
-	cdf_status =
+	qdf_status =
 		hdd_change_peer_state(pAdapter, ucSTAId, state, false);
 	CDF_TRACE(CDF_MODULE_ID_HDD_SAP_DATA, CDF_TRACE_LEVEL_INFO,
 		  "%s: change station to state %d succeed", __func__, state);
 
-	if (CDF_STATUS_SUCCESS == cdf_status) {
+	if (QDF_STATUS_SUCCESS == qdf_status) {
 		pAdapter->aStaInfo[ucSTAId].tlSTAState =
 			ol_txrx_peer_state_auth;
 	}
@@ -887,7 +887,7 @@
 	CDF_TRACE(CDF_MODULE_ID_HDD_SAP_DATA, CDF_TRACE_LEVEL_INFO,
 		  "%s exit", __func__);
 
-	return cdf_status;
+	return qdf_status;
 }
 
 /*
@@ -896,11 +896,11 @@
  * @pDestMacAddress: MAC address of the destination
  * @staId: Station ID associated with the MAC address
  *
- * Return: CDF_STATUS_SUCCESS if a match was found, in which case
- *	   staId is populated, CDF_STATUS_E_FAILURE if a match is
+ * Return: QDF_STATUS_SUCCESS if a match was found, in which case
+ *	   staId is populated, QDF_STATUS_E_FAILURE if a match is
  *	   not found
  */
-CDF_STATUS hdd_softap_get_sta_id(hdd_adapter_t *pAdapter,
+QDF_STATUS hdd_softap_get_sta_id(hdd_adapter_t *pAdapter,
 				 struct cdf_mac_addr *pMacAddress,
 				 uint8_t *staId)
 {
@@ -911,9 +911,9 @@
 			(&pAdapter->aStaInfo[i].macAddrSTA, pMacAddress,
 			CDF_MAC_ADDR_SIZE) && pAdapter->aStaInfo[i].isUsed) {
 			*staId = i;
-			return CDF_STATUS_SUCCESS;
+			return QDF_STATUS_SUCCESS;
 		}
 	}
 
-	return CDF_STATUS_E_FAILURE;
+	return QDF_STATUS_E_FAILURE;
 }
diff --git a/core/hdd/src/wlan_hdd_stats.c b/core/hdd/src/wlan_hdd_stats.c
index 2f9a15f..af723a4 100644
--- a/core/hdd/src/wlan_hdd_stats.c
+++ b/core/hdd/src/wlan_hdd_stats.c
@@ -1193,7 +1193,7 @@
 		LinkLayerStatsSetReq.mpduSizeThreshold,
 		LinkLayerStatsSetReq.aggressiveStatisticsGathering);
 
-	if (CDF_STATUS_SUCCESS != sme_ll_stats_set_req(pHddCtx->hHal,
+	if (QDF_STATUS_SUCCESS != sme_ll_stats_set_req(pHddCtx->hHal,
 						       &LinkLayerStatsSetReq)) {
 		hddLog(CDF_TRACE_LEVEL_ERROR, "%s:"
 		       "sme_ll_stats_set_req Failed", __func__);
@@ -1323,7 +1323,7 @@
 	INIT_COMPLETION(context->response_event);
 	spin_unlock(&context->context_lock);
 
-	if (CDF_STATUS_SUCCESS != sme_ll_stats_get_req(pHddCtx->hHal,
+	if (QDF_STATUS_SUCCESS != sme_ll_stats_get_req(pHddCtx->hHal,
 						       &LinkLayerStatsGetReq)) {
 		hddLog(CDF_TRACE_LEVEL_ERROR, "%s:"
 		       "sme_ll_stats_get_req Failed", __func__);
@@ -1454,7 +1454,7 @@
 		LinkLayerStatsClearReq.statsClearReqMask,
 		LinkLayerStatsClearReq.stopReq);
 
-	if (CDF_STATUS_SUCCESS == sme_ll_stats_clear_req(pHddCtx->hHal,
+	if (QDF_STATUS_SUCCESS == sme_ll_stats_clear_req(pHddCtx->hHal,
 					&LinkLayerStatsClearReq)) {
 		temp_skbuff = cfg80211_vendor_cmd_alloc_reply_skb(wiphy,
 								  2 *
@@ -1537,7 +1537,7 @@
 	struct net_device *dev = wdev->netdev;
 	hdd_adapter_t *pAdapter = WLAN_HDD_GET_PRIV_PTR(dev);
 	int ret_val;
-	CDF_STATUS status;
+	QDF_STATUS status;
 	hdd_context_t *hdd_ctx = wiphy_priv(wiphy);
 
 	ENTER();
@@ -1556,7 +1556,7 @@
 
 	status = sme_stats_ext_request(pAdapter->sessionId, &stats_ext_req);
 
-	if (CDF_STATUS_SUCCESS != status)
+	if (QDF_STATUS_SUCCESS != status)
 		ret_val = -EINVAL;
 
 	return ret_val;
diff --git a/core/hdd/src/wlan_hdd_subnet_detect.c b/core/hdd/src/wlan_hdd_subnet_detect.c
index 44d69b5..96d0377 100644
--- a/core/hdd/src/wlan_hdd_subnet_detect.c
+++ b/core/hdd/src/wlan_hdd_subnet_detect.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2015-2016 The Linux Foundation. All rights reserved.
  *
  * Previously licensed under the ISC license by Qualcomm Atheros, Inc.
  *
@@ -78,7 +78,7 @@
 	struct nlattr *tb[QCA_WLAN_VENDOR_ATTR_GW_PARAM_CONFIG_MAX + 1];
 	struct gateway_param_update_req req = { 0 };
 	int ret;
-	CDF_STATUS status;
+	QDF_STATUS status;
 
 	ENTER();
 
@@ -156,7 +156,7 @@
 	hdd_info("ipv6 addr: %pI6c", req.ipv6_addr);
 
 	status = sme_gateway_param_update(hdd_ctx->hHal, &req);
-	if (!CDF_IS_STATUS_SUCCESS(status)) {
+	if (!QDF_IS_STATUS_SUCCESS(status)) {
 		hdd_err("sme_gateway_param_update failed(err=%d)", status);
 		ret = -EINVAL;
 	}
diff --git a/core/hdd/src/wlan_hdd_tdls.c b/core/hdd/src/wlan_hdd_tdls.c
index 8e48da6..cd6d9f7 100644
--- a/core/hdd/src/wlan_hdd_tdls.c
+++ b/core/hdd/src/wlan_hdd_tdls.c
@@ -234,11 +234,11 @@
 	hdd_adapter_list_node_t *pAdapterNode = NULL, *pNext = NULL;
 	hdd_adapter_t *pAdapter = NULL;
 	tdlsCtx_t *pHddTdlsCtx = NULL;
-	CDF_STATUS status = 0;
+	QDF_STATUS status = 0;
 	uint32_t count = 0;
 
 	status = hdd_get_front_adapter(pHddCtx, &pAdapterNode);
-	while (NULL != pAdapterNode && CDF_STATUS_SUCCESS == status) {
+	while (NULL != pAdapterNode && QDF_STATUS_SUCCESS == status) {
 		pAdapter = pAdapterNode->pAdapter;
 
 		pHddTdlsCtx = WLAN_HDD_GET_TDLS_CTX_PTR(pAdapter);
@@ -535,7 +535,7 @@
 	int i;
 	uint8_t staIdx;
 	tdlsInfo_t *tInfo;
-	CDF_STATUS cdf_ret_status = CDF_STATUS_E_FAILURE;
+	QDF_STATUS cdf_ret_status = QDF_STATUS_E_FAILURE;
 
 	if (NULL == pHddCtx)
 		return -EINVAL;
@@ -723,7 +723,7 @@
 	dump_tdls_state_param_setting(tInfo);
 
 	cdf_ret_status = sme_update_fw_tdls_state(pHddCtx->hHal, tInfo, true);
-	if (CDF_STATUS_SUCCESS != cdf_ret_status) {
+	if (QDF_STATUS_SUCCESS != cdf_ret_status) {
 		cdf_mem_free(tInfo);
 		cdf_mc_timer_destroy(&pHddTdlsCtx->peerDiscoveryTimeoutTimer);
 		cdf_mem_free(pHddTdlsCtx);
@@ -744,7 +744,7 @@
 	tdlsCtx_t *pHddTdlsCtx;
 	hdd_context_t *pHddCtx;
 	tdlsInfo_t *tInfo;
-	CDF_STATUS cdf_ret_status = CDF_STATUS_E_FAILURE;
+	QDF_STATUS cdf_ret_status = QDF_STATUS_E_FAILURE;
 
 	pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
 	if (!pHddCtx) {
@@ -826,7 +826,7 @@
 
 			cdf_ret_status =
 				sme_update_fw_tdls_state(pHddCtx->hHal, tInfo, false);
-			if (CDF_STATUS_SUCCESS != cdf_ret_status) {
+			if (QDF_STATUS_SUCCESS != cdf_ret_status) {
 				cdf_mem_free(tInfo);
 			}
 		} else {
@@ -1530,7 +1530,7 @@
 			    eTDLSSupportMode tdls_mode, bool bUpdateLast)
 {
 	hdd_adapter_list_node_t *pAdapterNode = NULL, *pNext = NULL;
-	CDF_STATUS status;
+	QDF_STATUS status;
 	hdd_adapter_t *pAdapter;
 	tdlsCtx_t *pHddTdlsCtx;
 
@@ -1551,7 +1551,7 @@
 
 	status = hdd_get_front_adapter(pHddCtx, &pAdapterNode);
 
-	while (NULL != pAdapterNode && CDF_STATUS_SUCCESS == status) {
+	while (NULL != pAdapterNode && QDF_STATUS_SUCCESS == status) {
 		pAdapter = pAdapterNode->pAdapter;
 		pHddTdlsCtx = WLAN_HDD_GET_TDLS_CTX_PTR(pAdapter);
 		if (NULL != pHddTdlsCtx) {
@@ -1591,7 +1591,7 @@
 	tdlsCtx_t *pHddTdlsCtx = WLAN_HDD_GET_TDLS_CTX_PTR(pAdapter);
 	eTDLSSupportMode req_tdls_mode;
 	tdlsInfo_t *tdlsParams;
-	CDF_STATUS cdf_ret_status = CDF_STATUS_E_FAILURE;
+	QDF_STATUS cdf_ret_status = QDF_STATUS_E_FAILURE;
 
 	if (NULL == pHddTdlsCtx) {
 		hddLog(LOGE, FL("TDLS not enabled!"));
@@ -1666,7 +1666,7 @@
 	dump_tdls_state_param_setting(tdlsParams);
 
 	cdf_ret_status = sme_update_fw_tdls_state(pHddCtx->hHal, tdlsParams, true);
-	if (CDF_STATUS_SUCCESS != cdf_ret_status) {
+	if (QDF_STATUS_SUCCESS != cdf_ret_status) {
 		cdf_mem_free(tdlsParams);
 		return -EINVAL;
 	}
@@ -1697,7 +1697,7 @@
 	hdd_context_t *hdd_ctx = WLAN_HDD_GET_CTX(adapter);
 	tdlsCtx_t *hdd_tdls_ctx = WLAN_HDD_GET_TDLS_CTX_PTR(adapter);
 	tdlsInfo_t *tdls_param;
-	CDF_STATUS cdf_ret_status = CDF_STATUS_E_FAILURE;
+	QDF_STATUS cdf_ret_status = QDF_STATUS_E_FAILURE;
 
 	if (!hdd_tdls_ctx) {
 		/* may be TDLS is not applicable for this adapter */
@@ -1777,7 +1777,7 @@
 	cdf_ret_status = sme_update_fw_tdls_state(hdd_ctx->hHal,
 					       tdls_param,
 					       true);
-	if (CDF_STATUS_SUCCESS != cdf_ret_status) {
+	if (QDF_STATUS_SUCCESS != cdf_ret_status) {
 		cdf_mem_free(tdls_param);
 		return;
 	}
@@ -1855,7 +1855,7 @@
 				  uint32_t peer_state)
 {
 	tSmeTdlsPeerStateParams sme_tdls_peer_state_params = {0};
-	CDF_STATUS status = CDF_STATUS_E_FAILURE;
+	QDF_STATUS status = QDF_STATUS_E_FAILURE;
 	hdd_context_t *hdd_ctx = WLAN_HDD_GET_CTX(adapter);
 
 	sme_tdls_peer_state_params.vdevId = adapter->sessionId;
@@ -1864,7 +1864,7 @@
 	sme_tdls_peer_state_params.peerState = peer_state;
 	status = sme_update_tdls_peer_state(hdd_ctx->hHal,
 					    &sme_tdls_peer_state_params);
-	if (CDF_STATUS_SUCCESS != status) {
+	if (QDF_STATUS_SUCCESS != status) {
 		hddLog(LOGE, FL("sme_UpdateTdlsPeerState failed for "MAC_ADDRESS_STR),
 				MAC_ADDR_ARRAY(mac));
 		return -EPERM;
@@ -1971,12 +1971,12 @@
 	hdd_adapter_t *pAdapter = NULL;
 	tdlsCtx_t *pHddTdlsCtx = NULL;
 	hddTdlsPeer_t *curr_peer = NULL;
-	CDF_STATUS status = 0;
+	QDF_STATUS status = 0;
 
 	mutex_lock(&pHddCtx->tdls_lock);
 
 	status = hdd_get_front_adapter(pHddCtx, &pAdapterNode);
-	while (NULL != pAdapterNode && CDF_STATUS_SUCCESS == status) {
+	while (NULL != pAdapterNode && QDF_STATUS_SUCCESS == status) {
 		pAdapter = pAdapterNode->pAdapter;
 
 		pHddTdlsCtx = WLAN_HDD_GET_TDLS_CTX_PTR(pAdapter);
@@ -2366,12 +2366,12 @@
 	hdd_adapter_t *pAdapter = NULL;
 	tdlsCtx_t *pHddTdlsCtx = NULL;
 	hddTdlsPeer_t *curr_peer = NULL;
-	CDF_STATUS status = 0;
+	QDF_STATUS status = 0;
 
 	mutex_lock(&pHddCtx->tdls_lock);
 
 	status = hdd_get_front_adapter(pHddCtx, &pAdapterNode);
-	while (NULL != pAdapterNode && CDF_STATUS_SUCCESS == status) {
+	while (NULL != pAdapterNode && QDF_STATUS_SUCCESS == status) {
 		pAdapter = pAdapterNode->pAdapter;
 
 		pHddTdlsCtx = WLAN_HDD_GET_TDLS_CTX_PTR(pAdapter);
@@ -3055,7 +3055,7 @@
 	hdd_adapter_t *pAdapter = WLAN_HDD_GET_PRIV_PTR(dev);
 	hdd_context_t *pHddCtx = wiphy_priv(wiphy);
 	struct nlattr *tb[QCA_WLAN_VENDOR_ATTR_TDLS_GET_STATUS_MAX + 1];
-	CDF_STATUS ret;
+	QDF_STATUS ret;
 	uint32_t state;
 	int32_t reason;
 	uint32_t global_operating_class = 0;
@@ -3237,7 +3237,7 @@
 	hdd_adapter_t *pAdapter = WLAN_HDD_GET_PRIV_PTR(dev);
 	hdd_context_t *pHddCtx = wiphy_priv(wiphy);
 	struct nlattr *tb[QCA_WLAN_VENDOR_ATTR_TDLS_ENABLE_MAX + 1];
-	CDF_STATUS status;
+	QDF_STATUS status;
 	tdls_req_params_t pReqMsg = { 0 };
 	int ret;
 
@@ -3360,7 +3360,7 @@
 	hdd_adapter_t *pAdapter = WLAN_HDD_GET_PRIV_PTR(dev);
 	hdd_context_t *pHddCtx = wiphy_priv(wiphy);
 	struct nlattr *tb[QCA_WLAN_VENDOR_ATTR_TDLS_DISABLE_MAX + 1];
-	CDF_STATUS status;
+	QDF_STATUS status;
 
 	if (CDF_GLOBAL_FTM_MODE == hdd_get_conparam()) {
 		hdd_err("Command not allowed in FTM mode");
@@ -3429,7 +3429,7 @@
 {
 	hdd_adapter_t *pAdapter = WLAN_HDD_GET_PRIV_PTR(dev);
 	hdd_context_t *pHddCtx = wiphy_priv(wiphy);
-	CDF_STATUS status;
+	QDF_STATUS status;
 	hddTdlsPeer_t *pTdlsPeer;
 	uint16_t numCurrTdlsPeers;
 	unsigned long rc;
@@ -3588,7 +3588,7 @@
 		return -EPERM;
 	}
 
-	if (CDF_STATUS_SUCCESS != pAdapter->tdlsAddStaStatus) {
+	if (QDF_STATUS_SUCCESS != pAdapter->tdlsAddStaStatus) {
 		CDF_TRACE(CDF_MODULE_ID_HDD, CDF_TRACE_LEVEL_ERROR,
 			  "%s: Add Station is unsuccessful", __func__);
 		return -EPERM;
@@ -3671,7 +3671,7 @@
 	hdd_context_t *pHddCtx = wiphy_priv(wiphy);
 	hdd_station_ctx_t *hdd_sta_ctx;
 	u8 peerMac[CDF_MAC_ADDR_SIZE];
-	CDF_STATUS status;
+	QDF_STATUS status;
 	int max_sta_failed = 0;
 	int responder;
 	unsigned long rc;
@@ -3859,7 +3859,7 @@
 					  peer_capability, (uint8_t *) buf, len,
 					  !responder);
 
-	if (CDF_STATUS_SUCCESS != status) {
+	if (QDF_STATUS_SUCCESS != status) {
 		CDF_TRACE(CDF_MODULE_ID_HDD, CDF_TRACE_LEVEL_ERROR,
 			  "%s: sme_send_tdls_mgmt_frame failed!", __func__);
 		pAdapter->mgmtTxCompletionStatus = false;
@@ -4157,7 +4157,7 @@
 	hdd_context_t *pHddCtx = wiphy_priv(wiphy);
 	int status;
 	tSmeTdlsPeerStateParams smeTdlsPeerStateParams;
-	CDF_STATUS cdf_ret_status = CDF_STATUS_E_FAILURE;
+	QDF_STATUS cdf_ret_status = QDF_STATUS_E_FAILURE;
 	hddTdlsPeer_t *pTdlsPeer;
 
 	ENTER();
@@ -4194,7 +4194,7 @@
 	switch (oper) {
 	case NL80211_TDLS_ENABLE_LINK:
 	{
-		CDF_STATUS status;
+		QDF_STATUS status;
 		unsigned long rc;
 		tCsrTdlsLinkEstablishParams tdlsLinkEstablishParams;
 
@@ -4269,7 +4269,7 @@
 							  pTdlsPeer->staId,
 							  pTdlsPeer->
 							  signature);
-			if (CDF_STATUS_SUCCESS == status) {
+			if (QDF_STATUS_SUCCESS == status) {
 				uint8_t i;
 
 				cdf_mem_zero(&smeTdlsPeerStateParams,
@@ -4388,7 +4388,7 @@
 					sme_update_tdls_peer_state(pHddCtx->
 								   hHal,
 								   &smeTdlsPeerStateParams);
-				if (CDF_STATUS_SUCCESS !=
+				if (QDF_STATUS_SUCCESS !=
 				    cdf_ret_status) {
 					CDF_TRACE(CDF_MODULE_ID_HDD,
 						  CDF_TRACE_LEVEL_ERROR,
@@ -4741,7 +4741,7 @@
 	hdd_station_ctx_t *hdd_sta_ctx = WLAN_HDD_GET_STATION_CTX_PTR(adapter);
 	hdd_context_t *hdd_ctx = WLAN_HDD_GET_CTX(adapter);
 	sme_tdls_chan_switch_params chan_switch_params;
-	CDF_STATUS status = CDF_STATUS_E_FAILURE;
+	QDF_STATUS status = QDF_STATUS_E_FAILURE;
 
 	if (offchanmode < ENABLE_CHANSWITCH ||
 			offchanmode > DISABLE_CHANSWITCH) {
@@ -4834,7 +4834,7 @@
 	status = sme_send_tdls_chan_switch_req(WLAN_HDD_GET_HAL_CTX(adapter),
 			&chan_switch_params);
 
-	if (status != CDF_STATUS_SUCCESS) {
+	if (status != QDF_STATUS_SUCCESS) {
 		hdd_log(LOG1,
 			FL("Failed to send channel switch request to sme"));
 		return -EINVAL;
diff --git a/core/hdd/src/wlan_hdd_tx_rx.c b/core/hdd/src/wlan_hdd_tx_rx.c
index 65e6204..1aec90a 100644
--- a/core/hdd/src/wlan_hdd_tx_rx.c
+++ b/core/hdd/src/wlan_hdd_tx_rx.c
@@ -292,7 +292,7 @@
  */
 int hdd_hard_start_xmit(struct sk_buff *skb, struct net_device *dev)
 {
-	CDF_STATUS status;
+	QDF_STATUS status;
 	sme_ac_enum_type ac;
 	sme_QosWmmUpType up;
 	hdd_adapter_t *pAdapter = WLAN_HDD_GET_PRIV_PTR(dev);
@@ -325,7 +325,7 @@
 		struct cdf_mac_addr *pDestMacAddress =
 					(struct cdf_mac_addr *) skb->data;
 
-		if (CDF_STATUS_SUCCESS !=
+		if (QDF_STATUS_SUCCESS !=
 				hdd_ibss_get_sta_id(&pAdapter->sessionCtx.station,
 					pDestMacAddress, &STAId))
 			STAId = HDD_WLAN_INVALID_STA_ID;
@@ -522,10 +522,10 @@
  * @pMacAddress: pointer to Peer Mac address
  * @staID: pointer to returned Station Index
  *
- * Return: CDF_STATUS_SUCCESS/CDF_STATUS_E_FAILURE
+ * Return: QDF_STATUS_SUCCESS/QDF_STATUS_E_FAILURE
  */
 
-CDF_STATUS hdd_ibss_get_sta_id(hdd_station_ctx_t *pHddStaCtx,
+QDF_STATUS hdd_ibss_get_sta_id(hdd_station_ctx_t *pHddStaCtx,
 			       struct cdf_mac_addr *pMacAddress, uint8_t *staId)
 {
 	uint8_t idx;
@@ -534,11 +534,11 @@
 		if (cdf_mem_compare(&pHddStaCtx->conn_info.peerMacAddress[idx],
 				    pMacAddress, CDF_MAC_ADDR_SIZE)) {
 			*staId = pHddStaCtx->conn_info.staId[idx];
-			return CDF_STATUS_SUCCESS;
+			return QDF_STATUS_SUCCESS;
 		}
 	}
 
-	return CDF_STATUS_E_FAILURE;
+	return QDF_STATUS_E_FAILURE;
 }
 
 /**
@@ -601,18 +601,18 @@
  * @hdd_init_tx_rx() - Initialize Tx/RX module
  * @pAdapter: pointer to adapter context
  *
- * Return: CDF_STATUS_E_FAILURE if any errors encountered,
- *	   CDF_STATUS_SUCCESS otherwise
+ * Return: QDF_STATUS_E_FAILURE if any errors encountered,
+ *	   QDF_STATUS_SUCCESS otherwise
  */
-CDF_STATUS hdd_init_tx_rx(hdd_adapter_t *pAdapter)
+QDF_STATUS hdd_init_tx_rx(hdd_adapter_t *pAdapter)
 {
-	CDF_STATUS status = CDF_STATUS_SUCCESS;
+	QDF_STATUS status = QDF_STATUS_SUCCESS;
 
 	if (NULL == pAdapter) {
 		CDF_TRACE(CDF_MODULE_ID_HDD_DATA, CDF_TRACE_LEVEL_ERROR,
 			  FL("pAdapter is NULL"));
 		CDF_ASSERT(0);
-		return CDF_STATUS_E_FAILURE;
+		return QDF_STATUS_E_FAILURE;
 	}
 
 	return status;
@@ -622,18 +622,18 @@
  * @hdd_deinit_tx_rx() - Deinitialize Tx/RX module
  * @pAdapter: pointer to adapter context
  *
- * Return: CDF_STATUS_E_FAILURE if any errors encountered,
- *	   CDF_STATUS_SUCCESS otherwise
+ * Return: QDF_STATUS_E_FAILURE if any errors encountered,
+ *	   QDF_STATUS_SUCCESS otherwise
  */
-CDF_STATUS hdd_deinit_tx_rx(hdd_adapter_t *pAdapter)
+QDF_STATUS hdd_deinit_tx_rx(hdd_adapter_t *pAdapter)
 {
-	CDF_STATUS status = CDF_STATUS_SUCCESS;
+	QDF_STATUS status = QDF_STATUS_SUCCESS;
 
 	if (NULL == pAdapter) {
 		CDF_TRACE(CDF_MODULE_ID_HDD_DATA, CDF_TRACE_LEVEL_ERROR,
 			  FL("pAdapter is NULL"));
 		CDF_ASSERT(0);
-		return CDF_STATUS_E_FAILURE;
+		return QDF_STATUS_E_FAILURE;
 	}
 
 	return status;
@@ -649,10 +649,10 @@
  * the HDD when one or more packets were received for a registered
  * STA.
  *
- * Return: CDF_STATUS_E_FAILURE if any errors encountered,
- *	   CDF_STATUS_SUCCESS otherwise
+ * Return: QDF_STATUS_E_FAILURE if any errors encountered,
+ *	   QDF_STATUS_SUCCESS otherwise
  */
-CDF_STATUS hdd_rx_packet_cbk(void *cds_context, cdf_nbuf_t rxBuf, uint8_t staId)
+QDF_STATUS hdd_rx_packet_cbk(void *cds_context, cdf_nbuf_t rxBuf, uint8_t staId)
 {
 	hdd_adapter_t *pAdapter = NULL;
 	hdd_context_t *pHddCtx = NULL;
@@ -668,14 +668,14 @@
 	if ((NULL == cds_context) || (NULL == rxBuf)) {
 		CDF_TRACE(CDF_MODULE_ID_HDD_DATA, CDF_TRACE_LEVEL_ERROR,
 			  "%s: Null params being passed", __func__);
-		return CDF_STATUS_E_FAILURE;
+		return QDF_STATUS_E_FAILURE;
 	}
 
 	pHddCtx = cds_get_context(CDF_MODULE_ID_HDD);
 	if (NULL == pHddCtx) {
 		CDF_TRACE(CDF_MODULE_ID_HDD_DATA, CDF_TRACE_LEVEL_ERROR,
 			  "%s: HDD context is Null", __func__);
-		return CDF_STATUS_E_FAILURE;
+		return QDF_STATUS_E_FAILURE;
 	}
 
 	pAdapter = pHddCtx->sta_to_adapter[staId];
@@ -683,7 +683,7 @@
 		hddLog(LOGE,
 			FL("invalid adapter %p or adapter has invalid magic"),
 			pAdapter);
-		return CDF_STATUS_E_FAILURE;
+		return QDF_STATUS_E_FAILURE;
 	}
 	cpu_index = wlan_hdd_get_cpu();
 
@@ -693,7 +693,7 @@
 		CDF_TRACE(CDF_MODULE_ID_HDD_DATA, CDF_TRACE_LEVEL_FATAL,
 			  "Magic cookie(%x) for adapter sanity verification is invalid",
 			  pAdapter->magic);
-		return CDF_STATUS_E_FAILURE;
+		return QDF_STATUS_E_FAILURE;
 	}
 
 	pHddStaCtx = WLAN_HDD_GET_STATION_CTX_PTR(pAdapter);
@@ -707,7 +707,7 @@
 		 * it to stack
 		 */
 		cdf_nbuf_free(skb);
-		return CDF_STATUS_SUCCESS;
+		return QDF_STATUS_SUCCESS;
 	}
 
 	wlan_hdd_log_eapol(skb, WIFI_EVENT_DRIVER_EAPOL_FRAME_RECEIVED);
@@ -764,7 +764,7 @@
 
 	pAdapter->dev->last_rx = jiffies;
 
-	return CDF_STATUS_SUCCESS;
+	return QDF_STATUS_SUCCESS;
 }
 
 #ifdef FEATURE_WLAN_DIAG_SUPPORT
diff --git a/core/hdd/src/wlan_hdd_wext.c b/core/hdd/src/wlan_hdd_wext.c
index 24e3328..ecb1fcf 100644
--- a/core/hdd/src/wlan_hdd_wext.c
+++ b/core/hdd/src/wlan_hdd_wext.c
@@ -799,7 +799,7 @@
 	if (0 != ret)
 		return ret;
 
-	if (CDF_STATUS_SUCCESS !=
+	if (QDF_STATUS_SUCCESS !=
 	    sme_cfg_get_int(hHal, WNI_CFG_RTS_THRESHOLD, &threshold)) {
 		CDF_TRACE(CDF_MODULE_ID_HDD, CDF_TRACE_LEVEL_WARN,
 			  FL
@@ -847,7 +847,7 @@
 		return status;
 
 	if (sme_cfg_get_int(hHal, WNI_CFG_FRAGMENTATION_THRESHOLD, &threshold)
-	    != CDF_STATUS_SUCCESS) {
+	    != QDF_STATUS_SUCCESS) {
 		CDF_TRACE(CDF_MODULE_ID_HDD, CDF_TRACE_LEVEL_WARN,
 			  FL
 				  ("failed to get ini parameter, WNI_CFG_FRAGMENTATION_THRESHOLD"));
@@ -1088,27 +1088,27 @@
  * @pAdapter: adapter upon which the measurement is requested
  * @rssi_value: pointer to where the RSSI should be returned
  *
- * Return: CDF_STATUS_SUCCESS on success, CDF_STATUS_E_* on error
+ * Return: QDF_STATUS_SUCCESS on success, CDF_STATUS_E_* on error
  */
-CDF_STATUS wlan_hdd_get_rssi(hdd_adapter_t *pAdapter, int8_t *rssi_value)
+QDF_STATUS wlan_hdd_get_rssi(hdd_adapter_t *pAdapter, int8_t *rssi_value)
 {
 	struct statsContext context;
 	hdd_context_t *pHddCtx;
 	hdd_station_ctx_t *pHddStaCtx;
-	CDF_STATUS hstatus;
+	QDF_STATUS hstatus;
 	unsigned long rc;
 
 	if (NULL == pAdapter) {
 		hddLog(CDF_TRACE_LEVEL_WARN,
 		       "%s: Invalid context, pAdapter", __func__);
-		return CDF_STATUS_E_FAULT;
+		return QDF_STATUS_E_FAULT;
 	}
 	if (cds_is_driver_recovering()) {
 		hdd_err("Recovery in Progress. State: 0x%x Ignore!!!",
 			cds_get_driver_state());
 		/* return a cached value */
 		*rssi_value = pAdapter->rssi;
-		return CDF_STATUS_SUCCESS;
+		return QDF_STATUS_SUCCESS;
 	}
 
 	pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
@@ -1117,13 +1117,13 @@
 	if (eConnectionState_Associated != pHddStaCtx->conn_info.connState) {
 		hdd_err("Not associated!, return last connected AP rssi!");
 		*rssi_value = pAdapter->rssi;
-		return CDF_STATUS_SUCCESS;
+		return QDF_STATUS_SUCCESS;
 	}
 
 	if (pHddStaCtx->hdd_ReassocScenario) {
 		hdd_info("Roaming in progress, return cached RSSI");
 		*rssi_value = pAdapter->rssi;
-		return CDF_STATUS_SUCCESS;
+		return QDF_STATUS_SUCCESS;
 	}
 
 	init_completion(&context.completion);
@@ -1134,7 +1134,7 @@
 			       pHddStaCtx->conn_info.staId[0],
 			       pHddStaCtx->conn_info.bssId, pAdapter->rssi,
 			       &context, pHddCtx->pcds_context);
-	if (CDF_STATUS_SUCCESS != hstatus) {
+	if (QDF_STATUS_SUCCESS != hstatus) {
 		hddLog(CDF_TRACE_LEVEL_ERROR, "%s: Unable to retrieve RSSI",
 		       __func__);
 		/* we'll returned a cached value below */
@@ -1169,7 +1169,7 @@
 
 	*rssi_value = pAdapter->rssi;
 
-	return CDF_STATUS_SUCCESS;
+	return QDF_STATUS_SUCCESS;
 }
 
 /**
@@ -1177,14 +1177,14 @@
  * @pAdapter: adapter upon which the measurement is requested
  * @snr: pointer to where the SNR should be returned
  *
- * Return: CDF_STATUS_SUCCESS on success, CDF_STATUS_E_* on error
+ * Return: QDF_STATUS_SUCCESS on success, CDF_STATUS_E_* on error
  */
-CDF_STATUS wlan_hdd_get_snr(hdd_adapter_t *pAdapter, int8_t *snr)
+QDF_STATUS wlan_hdd_get_snr(hdd_adapter_t *pAdapter, int8_t *snr)
 {
 	struct statsContext context;
 	hdd_context_t *pHddCtx;
 	hdd_station_ctx_t *pHddStaCtx;
-	CDF_STATUS hstatus;
+	QDF_STATUS hstatus;
 	unsigned long rc;
 	int valid;
 
@@ -1193,14 +1193,14 @@
 	if (NULL == pAdapter) {
 		hddLog(CDF_TRACE_LEVEL_ERROR,
 		       "%s: Invalid context, pAdapter", __func__);
-		return CDF_STATUS_E_FAULT;
+		return QDF_STATUS_E_FAULT;
 	}
 
 	pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
 
 	valid = wlan_hdd_validate_context(pHddCtx);
 	if (0 != valid)
-		return CDF_STATUS_E_FAULT;
+		return QDF_STATUS_E_FAULT;
 
 	pHddStaCtx = WLAN_HDD_GET_STATION_CTX_PTR(pAdapter);
 
@@ -1211,7 +1211,7 @@
 	hstatus = sme_get_snr(pHddCtx->hHal, hdd_get_snr_cb,
 			      pHddStaCtx->conn_info.staId[0],
 			      pHddStaCtx->conn_info.bssId, &context);
-	if (CDF_STATUS_SUCCESS != hstatus) {
+	if (QDF_STATUS_SUCCESS != hstatus) {
 		hddLog(CDF_TRACE_LEVEL_ERROR, "%s: Unable to retrieve RSSI",
 		       __func__);
 		/* we'll returned a cached value below */
@@ -1246,7 +1246,7 @@
 
 	*snr = pAdapter->snr;
 	EXIT();
-	return CDF_STATUS_SUCCESS;
+	return QDF_STATUS_SUCCESS;
 }
 
 /**
@@ -1326,25 +1326,25 @@
  * This function will send a query to SME for the linkspeed of the
  * given peer, and then wait for the callback to be invoked.
  *
- * Return: CDF_STATUS_SUCCESS if linkspeed data is available,
+ * Return: QDF_STATUS_SUCCESS if linkspeed data is available,
  * otherwise a CDF_STATUS_E_* error.
  */
-CDF_STATUS wlan_hdd_get_linkspeed_for_peermac(hdd_adapter_t *pAdapter,
+QDF_STATUS wlan_hdd_get_linkspeed_for_peermac(hdd_adapter_t *pAdapter,
 					      struct cdf_mac_addr macAddress) {
-	CDF_STATUS status;
+	QDF_STATUS status;
 	unsigned long rc;
 	struct linkspeedContext context;
 	tSirLinkSpeedInfo *linkspeed_req;
 
 	if (NULL == pAdapter) {
 		hddLog(CDF_TRACE_LEVEL_ERROR, "%s: pAdapter is NULL", __func__);
-		return CDF_STATUS_E_FAULT;
+		return QDF_STATUS_E_FAULT;
 	}
 	linkspeed_req = cdf_mem_malloc(sizeof(*linkspeed_req));
 	if (NULL == linkspeed_req) {
 		CDF_TRACE(CDF_MODULE_ID_HDD, CDF_TRACE_LEVEL_ERROR,
 			  "%s Request Buffer Alloc Fail", __func__);
-		return CDF_STATUS_E_NOMEM;
+		return QDF_STATUS_E_NOMEM;
 	}
 	init_completion(&context.completion);
 	context.pAdapter = pAdapter;
@@ -1354,7 +1354,7 @@
 	status = sme_get_link_speed(WLAN_HDD_GET_HAL_CTX(pAdapter),
 				    linkspeed_req,
 				    &context, hdd_get_link_speed_cb);
-	if (CDF_STATUS_SUCCESS != status) {
+	if (QDF_STATUS_SUCCESS != status) {
 		hddLog(CDF_TRACE_LEVEL_ERROR,
 		       "%s: Unable to retrieve statistics for link speed",
 		       __func__);
@@ -1386,7 +1386,7 @@
 	spin_lock(&hdd_context_lock);
 	context.magic = 0;
 	spin_unlock(&hdd_context_lock);
-	return CDF_STATUS_SUCCESS;
+	return QDF_STATUS_SUCCESS;
 }
 
 /**
@@ -1418,13 +1418,13 @@
 		/* we are not connected so we don't have a classAstats */
 		*link_speed = 0;
 	} else {
-		CDF_STATUS status;
+		QDF_STATUS status;
 		struct cdf_mac_addr bssid;
 
 		cdf_copy_macaddr(&bssid, &hdd_stactx->conn_info.bssId);
 
 		status = wlan_hdd_get_linkspeed_for_peermac(sta_adapter, bssid);
-		if (!CDF_IS_STATUS_SUCCESS(status)) {
+		if (!QDF_IS_STATUS_SUCCESS(status)) {
 			hddLog(LOGE, FL("Unable to retrieve SME linkspeed"));
 			return -EINVAL;
 		}
@@ -1772,14 +1772,14 @@
 		if (hdd_conn_get_connected_bss_type
 			    (WLAN_HDD_GET_STATION_CTX_PTR(pAdapter), &connectedBssType)
 		    || (eCSR_BSS_TYPE_START_IBSS == LastBSSType)) {
-			CDF_STATUS cdf_status;
+			QDF_STATUS qdf_status;
 			/* need to issue a disconnect to CSR. */
 			INIT_COMPLETION(pAdapter->disconnect_comp_var);
-			cdf_status =
+			qdf_status =
 				sme_roam_disconnect(WLAN_HDD_GET_HAL_CTX(pAdapter),
 						    pAdapter->sessionId,
 						    eCSR_DISCONNECT_REASON_IBSS_LEAVE);
-			if (CDF_STATUS_SUCCESS == cdf_status) {
+			if (QDF_STATUS_SUCCESS == qdf_status) {
 				unsigned long rc;
 				rc = wait_for_completion_timeout(&pAdapter->
 								 disconnect_comp_var,
@@ -1961,7 +1961,7 @@
 
 		if (sme_cfg_get_str(hHal, WNI_CFG_VALID_CHANNEL_LIST,
 				    validChan, &numChans) !=
-				CDF_STATUS_SUCCESS) {
+				QDF_STATUS_SUCCESS) {
 			CDF_TRACE(CDF_MODULE_ID_HDD, CDF_TRACE_LEVEL_WARN, FL
 				  ("failed to get ini parameter, WNI_CFG_VALID_CHANNEL_LIST"));
 			return -EIO;
@@ -2050,7 +2050,7 @@
 
 	if (pHddStaCtx->conn_info.connState == eConnectionState_Associated) {
 		if (sme_get_operation_channel(hHal, &channel, pAdapter->sessionId)
-		    != CDF_STATUS_SUCCESS) {
+		    != QDF_STATUS_SUCCESS) {
 			CDF_TRACE(CDF_MODULE_ID_HDD, CDF_TRACE_LEVEL_ERROR,
 				  FL("failed to get operating channel %u"),
 				  pAdapter->sessionId);
@@ -2181,7 +2181,7 @@
 		return ret;
 
 	if (sme_cfg_set_int(hHal, WNI_CFG_CURRENT_TX_POWER_LEVEL,
-				wrqu->txpower.value) != CDF_STATUS_SUCCESS) {
+				wrqu->txpower.value) != QDF_STATUS_SUCCESS) {
 		CDF_TRACE(CDF_MODULE_ID_HDD, CDF_TRACE_LEVEL_ERROR, FL
 				("failed to set ini parameter, WNI_CFG_CURRENT_TX_POWER_LEVEL"));
 		return -EIO;
@@ -2227,9 +2227,8 @@
 			    struct iw_request_info *info,
 			    union iwreq_data *wrqu, char *extra)
 {
-	CDF_STATUS cdf_status = CDF_STATUS_SUCCESS;
 	QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
-	CDF_STATUS status = CDF_STATUS_SUCCESS;
+	QDF_STATUS status = QDF_STATUS_SUCCESS;
 	hdd_wext_state_t *pWextState;
 	hdd_adapter_t *pAdapter = WLAN_HDD_GET_PRIV_PTR(dev);
 	hdd_station_ctx_t *pHddStaCtx = WLAN_HDD_GET_STATION_CTX_PTR(pAdapter);
@@ -2266,7 +2265,7 @@
 					   pHddStaCtx->conn_info.staId[0],
 					   pAdapter, pAdapter->sessionId);
 
-		if (CDF_STATUS_SUCCESS != status) {
+		if (QDF_STATUS_SUCCESS != status) {
 			hddLog(CDF_TRACE_LEVEL_ERROR,
 			       "%s: Unable to retrieve statistics", __func__);
 			return status;
@@ -2282,7 +2281,7 @@
 			hddLog(CDF_TRACE_LEVEL_ERROR,
 			       "%s: SME timeout while retrieving statistics",
 			       __func__);
-			return CDF_STATUS_E_FAILURE;
+			return QDF_STATUS_E_FAILURE;
 		}
 
 		wrqu->bitrate.value =
@@ -2291,7 +2290,7 @@
 
 	EXIT();
 
-	return cdf_status;
+	return qdf_status;
 }
 
 /**
@@ -2360,17 +2359,17 @@
 		valid_rate = true;
 	} else if (sme_cfg_get_int(WLAN_HDD_GET_HAL_CTX(pAdapter),
 				   WNI_CFG_DOT11_MODE,
-				   &active_phy_mode) == CDF_STATUS_SUCCESS) {
+				   &active_phy_mode) == QDF_STATUS_SUCCESS) {
 		if (active_phy_mode == WNI_CFG_DOT11_MODE_11A
 		    || active_phy_mode == WNI_CFG_DOT11_MODE_11G
 		    || active_phy_mode == WNI_CFG_DOT11_MODE_11B) {
 			if ((sme_cfg_get_str(WLAN_HDD_GET_HAL_CTX(pAdapter),
 				     WNI_CFG_SUPPORTED_RATES_11A, supp_rates,
-				     &a_len) == CDF_STATUS_SUCCESS)
+				     &a_len) == QDF_STATUS_SUCCESS)
 			    &&
 			    (sme_cfg_get_str(WLAN_HDD_GET_HAL_CTX(pAdapter),
 				     WNI_CFG_SUPPORTED_RATES_11B, supp_rates,
-				     &b_len) == CDF_STATUS_SUCCESS)) {
+				     &b_len) == QDF_STATUS_SUCCESS)) {
 				for (i = 0; i < (b_len + a_len); ++i) {
 					/* supported rates returned is double
 					 * the actual rate so we divide it by 2
@@ -2390,7 +2389,7 @@
 		return -EINVAL;
 	}
 	if (sme_cfg_set_int(WLAN_HDD_GET_HAL_CTX(pAdapter),
-			    WNI_CFG_FIXED_RATE, rate) != CDF_STATUS_SUCCESS) {
+			    WNI_CFG_FIXED_RATE, rate) != QDF_STATUS_SUCCESS) {
 		CDF_TRACE(CDF_MODULE_ID_HDD, CDF_TRACE_LEVEL_ERROR, FL
 				("failed to set ini parameter, WNI_CFG_FIXED_RATE"));
 		return -EIO;
@@ -2606,7 +2605,7 @@
 	hdd_wext_state_t *pWextState;
 	hdd_adapter_t *pAdapter = WLAN_HDD_GET_PRIV_PTR(dev);
 	hdd_station_ctx_t *pHddStaCtx = WLAN_HDD_GET_STATION_CTX_PTR(pAdapter);
-	CDF_STATUS status;
+	QDF_STATUS status;
 	uint32_t length = DOT11F_IE_RSN_MAX_LEN;
 	uint8_t genIeBytes[DOT11F_IE_RSN_MAX_LEN];
 	hdd_context_t *hdd_ctx;
@@ -2825,7 +2824,7 @@
 	}
 
 	if (sme_cfg_set_int(hHal, WNI_CFG_RTS_THRESHOLD, wrqu->rts.value) !=
-			CDF_STATUS_SUCCESS) {
+			QDF_STATUS_SUCCESS) {
 		CDF_TRACE(CDF_MODULE_ID_HDD, CDF_TRACE_LEVEL_ERROR, FL
 				("failed to set ini parameter, WNI_CFG_RTS_THRESHOLD"));
 		return -EIO;
@@ -2955,7 +2954,7 @@
 
 	if (sme_cfg_set_int
 		    (hHal, WNI_CFG_FRAGMENTATION_THRESHOLD, wrqu->frag.value)
-		    != CDF_STATUS_SUCCESS) {
+		    != QDF_STATUS_SUCCESS) {
 		CDF_TRACE(CDF_MODULE_ID_HDD, CDF_TRACE_LEVEL_ERROR, FL
 				("failed to set ini parameter, WNI_CFG_FRAGMENTATION_THRESHOLD"));
 		return -EIO;
@@ -3129,7 +3128,7 @@
 	/*Get the phy mode */
 	if (sme_cfg_get_int(hHal,
 			    WNI_CFG_DOT11_MODE,
-			    &active_phy_mode) == CDF_STATUS_SUCCESS) {
+			    &active_phy_mode) == QDF_STATUS_SUCCESS) {
 		CDF_TRACE(CDF_MODULE_ID_HDD, CDF_TRACE_LEVEL_INFO,
 			  "active_phy_mode = %d", active_phy_mode);
 
@@ -3140,7 +3139,7 @@
 			if (sme_cfg_get_str(hHal,
 					    WNI_CFG_SUPPORTED_RATES_11A,
 					    supp_rates,
-					    &a_len) == CDF_STATUS_SUCCESS) {
+					    &a_len) == QDF_STATUS_SUCCESS) {
 				if (a_len > WNI_CFG_SUPPORTED_RATES_11A_LEN) {
 					a_len = WNI_CFG_SUPPORTED_RATES_11A_LEN;
 				}
@@ -3159,7 +3158,7 @@
 			if (sme_cfg_get_str(hHal,
 					    WNI_CFG_SUPPORTED_RATES_11B,
 					    supp_rates,
-					    &b_len) == CDF_STATUS_SUCCESS) {
+					    &b_len) == QDF_STATUS_SUCCESS) {
 				if (b_len > WNI_CFG_SUPPORTED_RATES_11B_LEN) {
 					b_len = WNI_CFG_SUPPORTED_RATES_11B_LEN;
 				}
@@ -3191,7 +3190,7 @@
 	/*Supported Channels and Frequencies */
 	if (sme_cfg_get_str
 		    ((hHal), WNI_CFG_VALID_CHANNEL_LIST, channels,
-		    &num_channels) != CDF_STATUS_SUCCESS) {
+		    &num_channels) != QDF_STATUS_SUCCESS) {
 		CDF_TRACE(CDF_MODULE_ID_HDD, CDF_TRACE_LEVEL_WARN,
 			  FL
 				  ("failed to get ini parameter, WNI_CFG_VALID_CHANNEL_LIST"));
@@ -3334,23 +3333,23 @@
  * wlan_hdd_get_class_astats() - Get Class A statistics
  * @pAdapter: adapter for which statistics are desired
  *
- * Return: CDF_STATUS_SUCCESS if adapter's Class A statistics were updated
+ * Return: QDF_STATUS_SUCCESS if adapter's Class A statistics were updated
  */
-CDF_STATUS wlan_hdd_get_class_astats(hdd_adapter_t *pAdapter)
+QDF_STATUS wlan_hdd_get_class_astats(hdd_adapter_t *pAdapter)
 {
 	hdd_station_ctx_t *pHddStaCtx = WLAN_HDD_GET_STATION_CTX_PTR(pAdapter);
-	CDF_STATUS hstatus;
+	QDF_STATUS hstatus;
 	unsigned long rc;
 	struct statsContext context;
 
 	if (NULL == pAdapter) {
 		hddLog(CDF_TRACE_LEVEL_ERROR, "%s: pAdapter is NULL", __func__);
-		return CDF_STATUS_E_FAULT;
+		return QDF_STATUS_E_FAULT;
 	}
 	if (cds_is_driver_recovering()) {
 		hdd_err("Recovery in Progress. State: 0x%x Ignore!!!",
 			 cds_get_driver_state());
-		return CDF_STATUS_SUCCESS;
+		return QDF_STATUS_SUCCESS;
 	}
 
 	/* we are connected so prepare our callback context */
@@ -3365,7 +3364,7 @@
 				     false, /* non-cached results */
 				     pHddStaCtx->conn_info.staId[0],
 				     &context, pAdapter->sessionId);
-	if (CDF_STATUS_SUCCESS != hstatus) {
+	if (QDF_STATUS_SUCCESS != hstatus) {
 		hddLog(CDF_TRACE_LEVEL_ERROR,
 		       "%s: Unable to retrieve Class A statistics", __func__);
 		/* we'll returned a cached value below */
@@ -3398,7 +3397,7 @@
 	spin_unlock(&hdd_context_lock);
 
 	/* either callback updated pAdapter stats or it has cached data */
-	return CDF_STATUS_SUCCESS;
+	return QDF_STATUS_SUCCESS;
 }
 
 /**
@@ -3474,18 +3473,18 @@
  * wlan_hdd_get_station_stats() - Get station statistics
  * @pAdapter: adapter for which statistics are desired
  *
- * Return: CDF_STATUS_SUCCESS if adapter's statistics were updated
+ * Return: QDF_STATUS_SUCCESS if adapter's statistics were updated
  */
-CDF_STATUS wlan_hdd_get_station_stats(hdd_adapter_t *pAdapter)
+QDF_STATUS wlan_hdd_get_station_stats(hdd_adapter_t *pAdapter)
 {
 	hdd_station_ctx_t *pHddStaCtx = WLAN_HDD_GET_STATION_CTX_PTR(pAdapter);
-	CDF_STATUS hstatus;
+	QDF_STATUS hstatus;
 	unsigned long rc;
 	struct statsContext context;
 
 	if (NULL == pAdapter) {
 		hddLog(CDF_TRACE_LEVEL_ERROR, "%s: pAdapter is NULL", __func__);
-		return CDF_STATUS_SUCCESS;
+		return QDF_STATUS_SUCCESS;
 	}
 
 	/* we are connected so prepare our callback context */
@@ -3503,7 +3502,7 @@
 				     false, /* non-cached results */
 				     pHddStaCtx->conn_info.staId[0],
 				     &context, pAdapter->sessionId);
-	if (CDF_STATUS_SUCCESS != hstatus) {
+	if (QDF_STATUS_SUCCESS != hstatus) {
 		hddLog(CDF_TRACE_LEVEL_ERROR,
 		       "%s: Unable to retrieve statistics", __func__);
 		/* we'll return with cached values */
@@ -3537,7 +3536,7 @@
 	spin_unlock(&hdd_context_lock);
 
 	/* either callback updated pAdapter stats or it has cached data */
-	return CDF_STATUS_SUCCESS;
+	return QDF_STATUS_SUCCESS;
 }
 
 /**
@@ -3748,7 +3747,7 @@
 	eCsrEncryptionType encryptionType = eCSR_ENCRYPT_TYPE_NONE;
 	bool fKeyPresent = 0;
 	int i;
-	CDF_STATUS status = CDF_STATUS_SUCCESS;
+	QDF_STATUS status = QDF_STATUS_SUCCESS;
 	int ret;
 
 	ENTER();
@@ -3800,7 +3799,7 @@
 				sme_roam_disconnect(WLAN_HDD_GET_HAL_CTX(pAdapter),
 						    pAdapter->sessionId,
 						    eCSR_DISCONNECT_REASON_UNSPECIFIED);
-			if (CDF_STATUS_SUCCESS == status) {
+			if (QDF_STATUS_SUCCESS == status) {
 				unsigned long rc;
 				rc = wait_for_completion_timeout(&pAdapter->
 								 disconnect_comp_var,
@@ -4037,7 +4036,7 @@
 	hdd_station_ctx_t *pHddStaCtx = WLAN_HDD_GET_STATION_CTX_PTR(pAdapter);
 	hdd_wext_state_t *pWextState = WLAN_HDD_GET_WEXT_STATE_PTR(pAdapter);
 	hdd_context_t *hdd_ctx;
-	CDF_STATUS cdf_ret_status = CDF_STATUS_SUCCESS;
+	QDF_STATUS cdf_ret_status = QDF_STATUS_SUCCESS;
 	tCsrRoamProfile *pRoamProfile = &pWextState->roamProfile;
 	int ret;
 	struct iw_encode_ext *ext = (struct iw_encode_ext *)extra;
@@ -4190,11 +4189,11 @@
 	 */
 	cdf_ret_status = sme_ft_update_key(WLAN_HDD_GET_HAL_CTX(pAdapter),
 					   pAdapter->sessionId, &setKey);
-	if (cdf_ret_status == CDF_STATUS_FT_PREAUTH_KEY_SUCCESS) {
+	if (cdf_ret_status == QDF_STATUS_FT_PREAUTH_KEY_SUCCESS) {
 		hddLog(CDF_TRACE_LEVEL_INFO_MED,
 		       "%s: Update PreAuth Key success", __func__);
 		return 0;
-	} else if (cdf_ret_status == CDF_STATUS_FT_PREAUTH_KEY_FAILED) {
+	} else if (cdf_ret_status == QDF_STATUS_FT_PREAUTH_KEY_FAILED) {
 		hddLog(CDF_TRACE_LEVEL_ERROR,
 		       "%s: Update PreAuth Key failed", __func__);
 		return -EINVAL;
@@ -4206,7 +4205,7 @@
 					  pAdapter->sessionId,
 					  &setKey, &roamId);
 
-	if (cdf_ret_status != CDF_STATUS_SUCCESS) {
+	if (cdf_ret_status != QDF_STATUS_SUCCESS) {
 		CDF_TRACE(CDF_MODULE_ID_HDD, CDF_TRACE_LEVEL_ERROR,
 			  "[%4d] sme_roam_set_key returned ERROR status= %d",
 			  __LINE__, cdf_ret_status);
@@ -4277,7 +4276,7 @@
 		if ((wrqu->retry.flags & IW_RETRY_LONG)) {
 			if (sme_cfg_set_int (hHal, WNI_CFG_LONG_RETRY_LIMIT,
 						wrqu->retry.value) !=
-					CDF_STATUS_SUCCESS) {
+					QDF_STATUS_SUCCESS) {
 				CDF_TRACE(CDF_MODULE_ID_HDD,
 					  CDF_TRACE_LEVEL_ERROR, FL
 					  ("failed to set ini parameter, WNI_CFG_LONG_RETRY_LIMIT"));
@@ -4286,7 +4285,7 @@
 		} else if ((wrqu->retry.flags & IW_RETRY_SHORT)) {
 			if (sme_cfg_set_int (hHal, WNI_CFG_SHORT_RETRY_LIMIT,
 						wrqu->retry.value) !=
-					CDF_STATUS_SUCCESS) {
+					QDF_STATUS_SUCCESS) {
 				CDF_TRACE(CDF_MODULE_ID_HDD,
 					CDF_TRACE_LEVEL_ERROR, FL
 					("failed to set ini parameter, WNI_CFG_LONG_RETRY_LIMIT"));
@@ -4356,7 +4355,7 @@
 		wrqu->retry.flags = IW_RETRY_LIMIT | IW_RETRY_LONG;
 
 		if (sme_cfg_get_int(hHal, WNI_CFG_LONG_RETRY_LIMIT, &retry) !=
-		    CDF_STATUS_SUCCESS) {
+		    QDF_STATUS_SUCCESS) {
 			CDF_TRACE(CDF_MODULE_ID_HDD, CDF_TRACE_LEVEL_WARN,
 				  FL
 					  ("failed to get ini parameter, WNI_CFG_LONG_RETRY_LIMIT"));
@@ -4368,7 +4367,7 @@
 		wrqu->retry.flags = IW_RETRY_LIMIT | IW_RETRY_SHORT;
 
 		if (sme_cfg_get_int(hHal, WNI_CFG_SHORT_RETRY_LIMIT, &retry) !=
-		    CDF_STATUS_SUCCESS) {
+		    QDF_STATUS_SUCCESS) {
 			CDF_TRACE(CDF_MODULE_ID_HDD, CDF_TRACE_LEVEL_WARN,
 				  FL
 					  ("failed to get ini parameter, WNI_CFG_LONG_RETRY_LIMIT"));
@@ -4425,7 +4424,7 @@
 	hdd_adapter_t *pAdapter = WLAN_HDD_GET_PRIV_PTR(dev);
 	hdd_station_ctx_t *pHddStaCtx = WLAN_HDD_GET_STATION_CTX_PTR(pAdapter);
 	struct iw_mlme *mlme = (struct iw_mlme *)extra;
-	CDF_STATUS status = CDF_STATUS_SUCCESS;
+	QDF_STATUS status = QDF_STATUS_SUCCESS;
 	hdd_context_t *hdd_ctx;
 	int ret;
 
@@ -4456,7 +4455,7 @@
 				sme_roam_disconnect(WLAN_HDD_GET_HAL_CTX(pAdapter),
 						    pAdapter->sessionId, reason);
 
-			if (CDF_STATUS_SUCCESS == status) {
+			if (QDF_STATUS_SUCCESS == status) {
 				unsigned long rc;
 				rc = wait_for_completion_timeout(&pAdapter->
 								 disconnect_comp_var,
@@ -4540,7 +4539,7 @@
 {
 #ifdef QCA_HT_2040_COEX
 	hdd_adapter_t *pAdapter = WLAN_HDD_GET_PRIV_PTR(net);
-	CDF_STATUS halStatus = CDF_STATUS_E_FAILURE;
+	QDF_STATUS halStatus = QDF_STATUS_E_FAILURE;
 #endif
 	bool band_24 = false, band_5g = false;
 	bool ch_bond24 = false, ch_bond5g = false;
@@ -4765,7 +4764,7 @@
 			halStatus = sme_set_ht2040_mode(hal,
 							pAdapter->sessionId,
 							eHT_CHAN_HT20, false);
-			if (halStatus == CDF_STATUS_E_FAILURE) {
+			if (halStatus == QDF_STATUS_E_FAILURE) {
 				hddLog(LOGE, FL("Failed to disable OBSS"));
 				return -EIO;
 			}
@@ -4775,7 +4774,7 @@
 			halStatus = sme_set_ht2040_mode(hal,
 							pAdapter->sessionId,
 							eHT_CHAN_HT20, true);
-			if (halStatus == CDF_STATUS_E_FAILURE) {
+			if (halStatus == QDF_STATUS_E_FAILURE) {
 				hddLog(LOGE, FL("Failed to enable OBSS"));
 				return -EIO;
 			}
@@ -4877,7 +4876,7 @@
  */
 int wlan_hdd_get_temperature(hdd_adapter_t *pAdapter, int *temperature)
 {
-	CDF_STATUS status;
+	QDF_STATUS status;
 	struct statsContext tempContext;
 	unsigned long rc;
 
@@ -4891,7 +4890,7 @@
 	tempContext.magic = TEMP_CONTEXT_MAGIC;
 	status = sme_get_temperature(WLAN_HDD_GET_HAL_CTX(pAdapter),
 				     &tempContext, hdd_get_temperature_cb);
-	if (CDF_STATUS_SUCCESS != status) {
+	if (QDF_STATUS_SUCCESS != status) {
 		hddLog(CDF_TRACE_LEVEL_ERROR,
 		       FL("Unable to retrieve temperature"));
 	} else {
@@ -4936,7 +4935,7 @@
 	int set_value = value[1];
 	int ret;
 	int enable_pbm, enable_mp;
-	CDF_STATUS status;
+	QDF_STATUS status;
 
 	ENTER();
 
@@ -5033,7 +5032,7 @@
 			ret = -EINVAL;
 		} else if (sme_cfg_set_int(hHal, WNI_CFG_ASSOC_STA_LIMIT,
 					set_value)
-			   != CDF_STATUS_SUCCESS) {
+			   != QDF_STATUS_SUCCESS) {
 			CDF_TRACE(CDF_MODULE_ID_HDD,
 				  CDF_TRACE_LEVEL_ERROR, FL
 				  ("failed to set ini parameter, WNI_CFG_ASSOC_STA_LIMIT"));
@@ -5056,7 +5055,7 @@
 		    (set_value > CFG_DATA_INACTIVITY_TIMEOUT_MAX) ||
 		    (sme_cfg_set_int((WLAN_HDD_GET_CTX(pAdapter))->hHal,
 				     WNI_CFG_PS_DATA_INACTIVITY_TIMEOUT,
-				     set_value) == CDF_STATUS_E_FAILURE)) {
+				     set_value) == QDF_STATUS_E_FAILURE)) {
 			hddLog(LOGE, "Failure: Could not pass on "
 			       "WNI_CFG_PS_DATA_INACTIVITY_TIMEOUT configuration info "
 			       "to CCM");
@@ -5077,7 +5076,7 @@
 		if (sme_set_tx_power
 			    (hHal, pAdapter->sessionId, bssid,
 			    pAdapter->device_mode,
-			    set_value) != CDF_STATUS_SUCCESS) {
+			    set_value) != QDF_STATUS_SUCCESS) {
 			hddLog(CDF_TRACE_LEVEL_ERROR,
 			       "%s: Setting tx power failed", __func__);
 			return -EIO;
@@ -5096,7 +5095,7 @@
 		cdf_copy_macaddr(&selfMac, &pHddStaCtx->conn_info.bssId);
 
 		if (sme_set_max_tx_power(hHal, bssid, selfMac, set_value)
-		    != CDF_STATUS_SUCCESS) {
+		    != QDF_STATUS_SUCCESS) {
 			hddLog(CDF_TRACE_LEVEL_ERROR,
 			       "%s: Setting maximum tx power failed",
 			       __func__);
@@ -5111,7 +5110,7 @@
 		       "%s: Setting maximum tx power %d dBm for 2.4 GHz band",
 		       __func__, set_value);
 		if (sme_set_max_tx_power_per_band(eCSR_BAND_24, set_value) !=
-		    CDF_STATUS_SUCCESS) {
+		    QDF_STATUS_SUCCESS) {
 			hddLog(CDF_TRACE_LEVEL_ERROR,
 			       "%s: Setting maximum tx power failed for 2.4 GHz band",
 			       __func__);
@@ -5126,7 +5125,7 @@
 		       "%s: Setting maximum tx power %d dBm for 5.0 GHz band",
 		       __func__, set_value);
 		if (sme_set_max_tx_power_per_band(eCSR_BAND_5G, set_value) !=
-		    CDF_STATUS_SUCCESS) {
+		    QDF_STATUS_SUCCESS) {
 			hddLog(CDF_TRACE_LEVEL_ERROR,
 			       "%s: Setting maximum tx power failed for 5.0 GHz band",
 			       __func__);
@@ -5180,7 +5179,7 @@
 			hddLog(LOGE, "NSS greater than 2 not supported");
 			ret = -EINVAL;
 		} else {
-			if (CDF_STATUS_SUCCESS !=
+			if (QDF_STATUS_SUCCESS !=
 				hdd_update_nss(WLAN_HDD_GET_CTX(pAdapter),
 				set_value))
 				ret = -EINVAL;
@@ -5273,7 +5272,7 @@
 		hddLog(LOG1, "LDPC val %d", set_value);
 		/* get the HT capability info */
 		ret = sme_cfg_get_int(hHal, WNI_CFG_HT_CAP_INFO, &value);
-		if (CDF_STATUS_SUCCESS != ret) {
+		if (QDF_STATUS_SUCCESS != ret) {
 			CDF_TRACE(CDF_MODULE_ID_HDD,
 				  CDF_TRACE_LEVEL_ERROR,
 				  "%s: could not get HT capability info",
@@ -5311,7 +5310,7 @@
 		hddLog(LOG1, "TX_STBC val %d", set_value);
 		/* get the HT capability info */
 		ret = sme_cfg_get_int(hHal, WNI_CFG_HT_CAP_INFO, &value);
-		if (CDF_STATUS_SUCCESS != ret) {
+		if (QDF_STATUS_SUCCESS != ret) {
 			CDF_TRACE(CDF_MODULE_ID_HDD,
 				  CDF_TRACE_LEVEL_ERROR,
 				  "%s: could not get HT capability info",
@@ -5349,7 +5348,7 @@
 		       set_value);
 		/* get the HT capability info */
 		ret = sme_cfg_get_int(hHal, WNI_CFG_HT_CAP_INFO, &value);
-		if (CDF_STATUS_SUCCESS != ret) {
+		if (QDF_STATUS_SUCCESS != ret) {
 			CDF_TRACE(CDF_MODULE_ID_CDF,
 				  CDF_TRACE_LEVEL_ERROR,
 				  "%s: could not get HT capability info",
@@ -5414,7 +5413,7 @@
 		if (!ret) {
 			if (sme_cfg_set_int
 				    (hHal, WNI_CFG_RTS_THRESHOLD, value) !=
-				    CDF_STATUS_SUCCESS) {
+				    QDF_STATUS_SUCCESS) {
 				hddLog(LOGE, "FAILED TO SET RTSCTS");
 				return -EIO;
 			}
@@ -6120,7 +6119,7 @@
 
 			status = sme_ext_change_channel(hHal,
 				   set_value, pAdapter->sessionId);
-			if (status != CDF_STATUS_SUCCESS) {
+			if (status != QDF_STATUS_SUCCESS) {
 				hddLog(LOGE,
 				  FL("Error in change channel status %d"),
 				  status);
@@ -6174,7 +6173,7 @@
 				struct iw_request_info *info,
 				union iwreq_data *wrqu, char *extra)
 {
-	CDF_STATUS vstatus;
+	QDF_STATUS vstatus;
 	int sub_cmd;
 	int ret;
 	char *pBuffer = NULL;
@@ -6277,7 +6276,7 @@
 		break;
 	case WE_SET_CONFIG:
 		vstatus = hdd_execute_global_config_command(hdd_ctx, pBuffer);
-		if (CDF_STATUS_SUCCESS != vstatus) {
+		if (QDF_STATUS_SUCCESS != vstatus) {
 			ret = -EINVAL;
 		}
 		break;
@@ -6362,7 +6361,7 @@
 	{
 		if (sme_cfg_get_int
 			    (hHal, WNI_CFG_ASSOC_STA_LIMIT,
-			    (uint32_t *) value) != CDF_STATUS_SUCCESS) {
+			    (uint32_t *) value) != QDF_STATUS_SUCCESS) {
 			CDF_TRACE(CDF_MODULE_ID_HDD,
 				  CDF_TRACE_LEVEL_WARN, FL
 					  ("failed to get ini parameter, WNI_CFG_ASSOC_STA_LIMIT"));
@@ -6638,7 +6637,7 @@
 		*value = wma_cli_get_command(pAdapter->sessionId,
 					     WMI_PDEV_PARAM_TXPOWER_LIMIT2G,
 					     PDEV_CMD);
-		if (CDF_STATUS_SUCCESS !=
+		if (QDF_STATUS_SUCCESS !=
 		    sme_cfg_get_int(hHal, WNI_CFG_CURRENT_TX_POWER_LEVEL,
 				    &txpow2g)) {
 			return -EIO;
@@ -6655,7 +6654,7 @@
 		*value = wma_cli_get_command(pAdapter->sessionId,
 					     WMI_PDEV_PARAM_TXPOWER_LIMIT5G,
 					     PDEV_CMD);
-		if (CDF_STATUS_SUCCESS !=
+		if (QDF_STATUS_SUCCESS !=
 		    sme_cfg_get_int(hHal, WNI_CFG_CURRENT_TX_POWER_LEVEL,
 				    &txpow5g)) {
 			return -EIO;
@@ -6852,9 +6851,9 @@
 	 */
 	case WE_SET_SAP_CHANNELS:
 		if (wlan_hdd_validate_operation_channel(pAdapter, value[1]) !=
-			CDF_STATUS_SUCCESS ||
+			QDF_STATUS_SUCCESS ||
 			wlan_hdd_validate_operation_channel(pAdapter,
-					value[2]) != CDF_STATUS_SUCCESS) {
+					value[2]) != QDF_STATUS_SUCCESS) {
 			ret = -EINVAL;
 		} else {
 			hdd_ctx->config->force_sap_acs_st_ch = value[1];
@@ -7189,7 +7188,7 @@
 	}
 	case WE_GET_CHANNEL_LIST:
 	{
-		CDF_STATUS status;
+		QDF_STATUS status;
 		uint8_t i, len;
 		char *buf;
 		uint8_t ubuf[WNI_CFG_COUNTRY_CODE_LEN];
@@ -7202,7 +7201,7 @@
 		status =
 			iw_softap_get_channel_list(dev, info, wrqu,
 						   (char *)&channel_list);
-		if (!CDF_IS_STATUS_SUCCESS(status)) {
+		if (!QDF_IS_STATUS_SUCCESS(status)) {
 			hddLog(LOGE, FL("GetChannelList Failed!!!"));
 			return -EINVAL;
 		}
@@ -7221,7 +7220,7 @@
 		}
 		len = scnprintf(buf, WE_MAX_STR_LEN, "%u ",
 				channel_list.num_channels);
-		if (CDF_STATUS_SUCCESS == sme_get_country_code(hdd_ctx->hHal,
+		if (QDF_STATUS_SUCCESS == sme_get_country_code(hdd_ctx->hHal,
 						ubuf, &ubuf_len)) {
 			/* Printing Country code in getChannelList */
 			for (i = 0; i < (ubuf_len - 1); i++)
@@ -7292,7 +7291,7 @@
 			ch_bond5g = true;
 
 		phymode = sme_get_phy_mode(hal);
-		if ((CDF_STATUS_SUCCESS !=
+		if ((QDF_STATUS_SUCCESS !=
 		     sme_get_freq_band(hal, &currBand))) {
 			CDF_TRACE(CDF_MODULE_ID_HDD,
 				  CDF_TRACE_LEVEL_INFO,
@@ -7919,7 +7918,7 @@
 		msg.type = SIR_HAL_UNIT_TEST_CMD;
 		msg.reserved = 0;
 		msg.bodyptr = unitTestArgs;
-		if (CDF_STATUS_SUCCESS !=
+		if (QDF_STATUS_SUCCESS !=
 		    cds_mq_post_message(CDF_MODULE_ID_WMA, &msg)) {
 			cdf_mem_free(unitTestArgs);
 			CDF_TRACE(CDF_MODULE_ID_HDD,
@@ -8491,7 +8490,7 @@
 	 * copied individually.
 	 */
 	memcpy(&offloadRequest, pRequest, wrqu->data.length);
-	if (CDF_STATUS_SUCCESS !=
+	if (QDF_STATUS_SUCCESS !=
 	    sme_set_host_offload(WLAN_HDD_GET_HAL_CTX(pAdapter),
 				 pAdapter->sessionId, &offloadRequest)) {
 		hddLog(CDF_TRACE_LEVEL_ERROR,
@@ -8579,7 +8578,7 @@
 
 	hdd_info("Keep alive period  %d", request->timePeriod);
 
-	if (CDF_STATUS_SUCCESS !=
+	if (QDF_STATUS_SUCCESS !=
 	    sme_set_keep_alive(WLAN_HDD_GET_HAL_CTX(pAdapter),
 		pAdapter->sessionId, request)) {
 		hdd_err("Failure to execute Keep Alive");
@@ -8694,7 +8693,7 @@
 				request->params_data[i].data_mask[5]);
 		}
 
-		if (CDF_STATUS_SUCCESS !=
+		if (QDF_STATUS_SUCCESS !=
 			sme_receive_filter_set_filter(hdd_ctx->hHal,
 				&packetFilterSetReq,
 				sessionId)) {
@@ -8709,7 +8708,7 @@
 		hdd_info("Clear Packet Filter Request for Id: %d",
 			request->filter_id);
 		packetFilterClrReq.filterId = request->filter_id;
-		if (CDF_STATUS_SUCCESS !=
+		if (QDF_STATUS_SUCCESS !=
 		    sme_receive_filter_clear_filter(hdd_ctx->hHal,
 						    &packetFilterClrReq,
 						    sessionId)) {
@@ -8814,7 +8813,7 @@
 {
 
 	QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
-	CDF_STATUS status = CDF_STATUS_SUCCESS;
+	QDF_STATUS status = QDF_STATUS_SUCCESS;
 	hdd_wext_state_t *pWextState;
 	hdd_adapter_t *pAdapter = WLAN_HDD_GET_PRIV_PTR(dev);
 	hdd_context_t *hdd_ctx = WLAN_HDD_GET_CTX(pAdapter);
@@ -8848,7 +8847,7 @@
 						     (pAdapter))->conn_info.staId[0],
 					    pAdapter, pAdapter->sessionId);
 
-		if (CDF_STATUS_SUCCESS != status) {
+		if (QDF_STATUS_SUCCESS != status) {
 			hddLog(CDF_TRACE_LEVEL_ERROR,
 			       "%s: Unable to retrieve SME statistics",
 			       __func__);
@@ -9259,7 +9258,7 @@
 	tHalHandle hHal = WLAN_HDD_GET_HAL_CTX(pAdapter);
 	eCsrBand band;
 
-	CDF_STATUS status;
+	QDF_STATUS status;
 	hdd_context_t *pHddCtx;
 	hdd_adapter_list_node_t *pAdapterNode, *pNext;
 	eCsrBand currBand = eCSR_BAND_MAX;
@@ -9308,7 +9307,7 @@
 		band = pHddCtx->config->nBandCapability;
 	}
 
-	if (CDF_STATUS_SUCCESS != sme_get_freq_band(hHal, &currBand)) {
+	if (QDF_STATUS_SUCCESS != sme_get_freq_band(hHal, &currBand)) {
 		CDF_TRACE(CDF_MODULE_ID_HDD, CDF_TRACE_LEVEL_INFO,
 			  "%s: Failed to get current band config", __func__);
 		return -EIO;
@@ -9324,7 +9323,7 @@
 			  __func__, currBand, band);
 
 		status = hdd_get_front_adapter(pHddCtx, &pAdapterNode);
-		while (NULL != pAdapterNode && CDF_STATUS_SUCCESS == status) {
+		while (NULL != pAdapterNode && QDF_STATUS_SUCCESS == status) {
 			pAdapter = pAdapterNode->pAdapter;
 			hHal = WLAN_HDD_GET_HAL_CTX(pAdapter);
 			hdd_abort_mac_scan(pHddCtx, pAdapter->sessionId,
@@ -9341,7 +9340,7 @@
 			    (hdd_conn_is_connected
 				     (WLAN_HDD_GET_STATION_CTX_PTR(pAdapter)))
 			    && (connectedBand != band)) {
-				CDF_STATUS status = CDF_STATUS_SUCCESS;
+				QDF_STATUS status = QDF_STATUS_SUCCESS;
 				long lrc;
 
 				/* STA already connected on current band, So issue disconnect
@@ -9359,7 +9358,7 @@
 							    pAdapter->sessionId,
 							    eCSR_DISCONNECT_REASON_UNSPECIFIED);
 
-				if (CDF_STATUS_SUCCESS != status) {
+				if (QDF_STATUS_SUCCESS != status) {
 					hddLog(CDF_TRACE_LEVEL_ERROR,
 					       "%s csr_roam_disconnect failure, returned %d",
 					       __func__, (int)status);
@@ -9387,7 +9386,7 @@
 			pAdapterNode = pNext;
 		}
 
-		if (CDF_STATUS_SUCCESS !=
+		if (QDF_STATUS_SUCCESS !=
 		    sme_set_freq_band(hHal, pAdapter->sessionId, band)) {
 			CDF_TRACE(CDF_MODULE_ID_HDD, CDF_TRACE_LEVEL_FATAL,
 				  FL("Failed to set the band value to %u"),
@@ -10744,7 +10743,7 @@
 
 	hdd_clear_roam_profile_ie(pAdapter);
 
-	return CDF_STATUS_SUCCESS;
+	return QDF_STATUS_SUCCESS;
 
 }
 
@@ -10768,19 +10767,19 @@
 
 		CDF_TRACE(CDF_MODULE_ID_HDD, CDF_TRACE_LEVEL_ERROR,
 			  ("ERROR: hdd_set_wext failed!!"));
-		return CDF_STATUS_E_FAILURE;
+		return QDF_STATUS_E_FAILURE;
 	}
 
 	if (!QDF_IS_STATUS_SUCCESS(qdf_event_create(&pwextBuf->hdd_cdf_event))) {
 		CDF_TRACE(CDF_MODULE_ID_HDD, CDF_TRACE_LEVEL_ERROR,
 			  ("ERROR: HDD cdf event init failed!!"));
-		return CDF_STATUS_E_FAILURE;
+		return QDF_STATUS_E_FAILURE;
 	}
 
 	if (!QDF_IS_STATUS_SUCCESS(qdf_event_create(&pwextBuf->scanevent))) {
 		CDF_TRACE(CDF_MODULE_ID_HDD, CDF_TRACE_LEVEL_ERROR,
 			  ("ERROR: HDD scan event init failed!!"));
-		return CDF_STATUS_E_FAILURE;
+		return QDF_STATUS_E_FAILURE;
 	}
 	/* Register as a wireless device */
 	dev->wireless_handlers = (struct iw_handler_def *)&we_handler_def;
diff --git a/core/hdd/src/wlan_hdd_wmm.c b/core/hdd/src/wlan_hdd_wmm.c
index 582b2df..3cbff02 100644
--- a/core/hdd/src/wlan_hdd_wmm.c
+++ b/core/hdd/src/wlan_hdd_wmm.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013-2015 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2013-2016 The Linux Foundation. All rights reserved.
  *
  * Previously licensed under the ISC license by Qualcomm Atheros, Inc.
  *
@@ -158,7 +158,7 @@
 	sme_ac_enum_type acType = pQosContext->acType;
 	hdd_wmm_ac_status_t *pAc = &pAdapter->hddWmmStatus.wmmAcStatus[acType];
 	hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
-	CDF_STATUS status;
+	QDF_STATUS status;
 	uint32_t service_interval;
 	uint32_t suspension_interval;
 	sme_QosWmmDirType direction;
@@ -209,7 +209,7 @@
 					   direction, psb, pAdapter->sessionId,
 					   pHddCtx->config->DelayedTriggerFrmInt);
 
-	if (!CDF_IS_STATUS_SUCCESS(status)) {
+	if (!QDF_IS_STATUS_SUCCESS(status)) {
 		CDF_TRACE(CDF_MODULE_ID_HDD, WMM_TRACE_LEVEL_ERROR,
 			  "%s: Failed to enable U-APSD for AC=%d",
 			  __func__, acType);
@@ -243,7 +243,7 @@
 	hdd_adapter_t *pAdapter = pQosContext->pAdapter;
 	sme_ac_enum_type acType = pQosContext->acType;
 	hdd_wmm_ac_status_t *pAc = &pAdapter->hddWmmStatus.wmmAcStatus[acType];
-	CDF_STATUS status;
+	QDF_STATUS status;
 
 	/* have we previously enabled UAPSD? */
 	if (pAc->wmmAcUapsdInfoValid == true) {
@@ -254,7 +254,7 @@
 							     (pAdapter))->conn_info.staId[0],
 						    acType, pAdapter->sessionId);
 
-		if (!CDF_IS_STATUS_SUCCESS(status)) {
+		if (!QDF_IS_STATUS_SUCCESS(status)) {
 			CDF_TRACE(CDF_MODULE_ID_HDD, WMM_TRACE_LEVEL_ERROR,
 				  "%s: Failed to disable U-APSD for AC=%d",
 				  __func__, acType);
@@ -376,7 +376,7 @@
 	hdd_adapter_t *pAdapter;
 	hdd_wmm_ac_status_t *pAc;
 	hdd_wlan_wmm_status_e status;
-	CDF_STATUS cdf_status;
+	QDF_STATUS qdf_status;
 	uint32_t currentTrafficCnt = 0;
 	sme_ac_enum_type acType = pQosContext->acType;
 
@@ -405,10 +405,10 @@
 		pAc->wmmPrevTrafficCnt = currentTrafficCnt;
 		if (pAc->wmmInactivityTimer.state == CDF_TIMER_STATE_STOPPED) {
 			/* Restart the timer */
-			cdf_status =
+			qdf_status =
 				cdf_mc_timer_start(&pAc->wmmInactivityTimer,
 						   pAc->wmmInactivityTime);
-			if (!CDF_IS_STATUS_SUCCESS(cdf_status)) {
+			if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
 				CDF_TRACE(CDF_MODULE_ID_HDD,
 					  CDF_TRACE_LEVEL_ERROR,
 					  FL(
@@ -437,13 +437,13 @@
  * time specified in the AddTS parameters is non-zero, this function
  * is invoked to start a traffic inactivity timer for the given AC.
  *
- * Return: CDF_STATUS enumeration
+ * Return: QDF_STATUS enumeration
  */
-static CDF_STATUS
+static QDF_STATUS
 hdd_wmm_enable_inactivity_timer(hdd_wmm_qos_context_t *pQosContext,
 				uint32_t inactivityTime)
 {
-	CDF_STATUS cdf_status = CDF_STATUS_E_FAILURE;
+	QDF_STATUS qdf_status = QDF_STATUS_E_FAILURE;
 	hdd_adapter_t *pAdapter = pQosContext->pAdapter;
 	sme_ac_enum_type acType = pQosContext->acType;
 	hdd_wmm_ac_status_t *pAc;
@@ -451,28 +451,28 @@
 	pAdapter = pQosContext->pAdapter;
 	pAc = &pAdapter->hddWmmStatus.wmmAcStatus[acType];
 
-	cdf_status = cdf_mc_timer_init(&pAc->wmmInactivityTimer,
+	qdf_status = cdf_mc_timer_init(&pAc->wmmInactivityTimer,
 				       CDF_TIMER_TYPE_SW,
 				       hdd_wmm_inactivity_timer_cb,
 				       pQosContext);
-	if (!CDF_IS_STATUS_SUCCESS(cdf_status)) {
+	if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
 		CDF_TRACE(CDF_MODULE_ID_HDD, CDF_TRACE_LEVEL_ERROR,
 			  FL("Initializing inactivity timer failed on AC %d"),
 			  acType);
-		return cdf_status;
+		return qdf_status;
 	}
 	/* Start the inactivity timer */
-	cdf_status = cdf_mc_timer_start(&pAc->wmmInactivityTimer,
+	qdf_status = cdf_mc_timer_start(&pAc->wmmInactivityTimer,
 					inactivityTime);
-	if (!CDF_IS_STATUS_SUCCESS(cdf_status)) {
+	if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
 		CDF_TRACE(CDF_MODULE_ID_HDD, CDF_TRACE_LEVEL_ERROR,
 			  FL("Starting inactivity timer failed on AC %d"),
 			  acType);
-		cdf_status = cdf_mc_timer_destroy(&pAc->wmmInactivityTimer);
-		if (!CDF_IS_STATUS_SUCCESS(cdf_status)) {
+		qdf_status = cdf_mc_timer_destroy(&pAc->wmmInactivityTimer);
+		if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
 			hdd_err("Failed to destroy inactivity timer");
 		}
-		return cdf_status;
+		return qdf_status;
 	}
 	pAc->wmmInactivityTime = inactivityTime;
 	/* Initialize the current tx traffic count on this AC */
@@ -480,7 +480,7 @@
 		pAdapter->hdd_stats.hddTxRxStats.txXmitClassifiedAC[pQosContext->
 								    acType];
 	pQosContext->is_inactivity_timer_running = true;
-	return cdf_status;
+	return qdf_status;
 }
 
 /**
@@ -492,15 +492,15 @@
  * This function is invoked to disable the traffic inactivity timer
  * for the given AC.  This is normally done when the TS is deleted.
  *
- * Return: CDF_STATUS enumeration
+ * Return: QDF_STATUS enumeration
  */
-static CDF_STATUS
+static QDF_STATUS
 hdd_wmm_disable_inactivity_timer(hdd_wmm_qos_context_t *pQosContext)
 {
 	hdd_adapter_t *pAdapter = pQosContext->pAdapter;
 	sme_ac_enum_type acType = pQosContext->acType;
 	hdd_wmm_ac_status_t *pAc = &pAdapter->hddWmmStatus.wmmAcStatus[acType];
-	CDF_STATUS cdf_status = CDF_STATUS_E_FAILURE;
+	QDF_STATUS qdf_status = QDF_STATUS_E_FAILURE;
 
 	/* Clear the timer and the counter */
 	pAc->wmmInactivityTime = 0;
@@ -508,17 +508,17 @@
 
 	if (pQosContext->is_inactivity_timer_running == true) {
 		pQosContext->is_inactivity_timer_running = false;
-		cdf_status = cdf_mc_timer_stop(&pAc->wmmInactivityTimer);
-		if (!CDF_IS_STATUS_SUCCESS(cdf_status)) {
+		qdf_status = cdf_mc_timer_stop(&pAc->wmmInactivityTimer);
+		if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
 			hdd_err("Failed to stop inactivity timer");
-			return cdf_status;
+			return qdf_status;
 		}
-		cdf_status = cdf_mc_timer_destroy(&pAc->wmmInactivityTimer);
-		if (!CDF_IS_STATUS_SUCCESS(cdf_status))
+		qdf_status = cdf_mc_timer_destroy(&pAc->wmmInactivityTimer);
+		if (!QDF_IS_STATUS_SUCCESS(qdf_status))
 			hdd_err("Failed to destroy inactivity timer:Timer started");
 	}
 
-	return cdf_status;
+	return qdf_status;
 }
 #endif /* FEATURE_WLAN_ESE */
 
@@ -536,9 +536,9 @@
  * gets called externally through some function pointer magic (so
  * there is a need for rigorous parameter checking).
  *
- * Return: CDF_STATUS enumeration
+ * Return: QDF_STATUS enumeration
  */
-static CDF_STATUS hdd_wmm_sme_callback(tHalHandle hHal,
+static QDF_STATUS hdd_wmm_sme_callback(tHalHandle hHal,
 				       void *hddCtx,
 				       sme_QosWmmTspecInfo *pCurrentQosInfo,
 				       sme_QosStatusType smeStatus,
@@ -556,7 +556,7 @@
 		     (HDD_WMM_CTX_MAGIC != pQosContext->magic))) {
 		CDF_TRACE(CDF_MODULE_ID_HDD, WMM_TRACE_LEVEL_ERROR,
 			  "%s: Invalid QoS Context", __func__);
-		return CDF_STATUS_E_FAILURE;
+		return QDF_STATUS_E_FAILURE;
 	}
 
 	pAdapter = pQosContext->pAdapter;
@@ -1059,7 +1059,7 @@
 		  "%s: complete, access for TL AC %d is%sallowed",
 		  __func__, acType, pAc->wmmAcAccessAllowed ? " " : " not ");
 
-	return CDF_STATUS_SUCCESS;
+	return QDF_STATUS_SUCCESS;
 }
 #endif
 
@@ -1371,9 +1371,9 @@
  * adapter to an initial state.  The configuration can later be
  * overwritten via application APIs or via QoS Map sent OTA.
  *
- * Return: CDF_STATUS enumeration
+ * Return: QDF_STATUS enumeration
  */
-CDF_STATUS hdd_wmm_init(hdd_adapter_t *pAdapter)
+QDF_STATUS hdd_wmm_init(hdd_adapter_t *pAdapter)
 {
 	sme_QosWmmUpType *hddWmmDscpToUpMap = pAdapter->hddWmmDscpToUpMap;
 	uint8_t dscp;
@@ -1391,7 +1391,7 @@
 	/* Special case for Expedited Forwarding (DSCP 46) */
 	hddWmmDscpToUpMap[46] = SME_QOS_WMM_UP_VO;
 
-	return CDF_STATUS_SUCCESS;
+	return QDF_STATUS_SUCCESS;
 }
 
 /**
@@ -1402,9 +1402,9 @@
  * adapter to an initial state.  The configuration can later be
  * overwritten via application APIs
  *
- * Return: CDF_STATUS enumeration
+ * Return: QDF_STATUS enumeration
  */
-CDF_STATUS hdd_wmm_adapter_init(hdd_adapter_t *pAdapter)
+QDF_STATUS hdd_wmm_adapter_init(hdd_adapter_t *pAdapter)
 {
 	hdd_wmm_ac_status_t *pAcStatus;
 	sme_ac_enum_type acType;
@@ -1432,7 +1432,7 @@
 	 */
 	pAdapter->configuredPsb = HDD_PSB_CFG_INVALID;
 
-	return CDF_STATUS_SUCCESS;
+	return QDF_STATUS_SUCCESS;
 }
 
 /**
@@ -1441,9 +1441,9 @@
  *
  * @pAdapter: [in]  pointer to Adapter context
  *
- * Return: CDF_STATUS enumeration
+ * Return: QDF_STATUS enumeration
  */
-CDF_STATUS hdd_wmm_adapter_clear(hdd_adapter_t *pAdapter)
+QDF_STATUS hdd_wmm_adapter_clear(hdd_adapter_t *pAdapter)
 {
 	hdd_wmm_ac_status_t *pAcStatus;
 	sme_ac_enum_type acType;
@@ -1460,7 +1460,7 @@
 		pAcStatus->wmmAcTspecValid = false;
 		pAcStatus->wmmAcUapsdInfoValid = false;
 	}
-	return CDF_STATUS_SUCCESS;
+	return QDF_STATUS_SUCCESS;
 }
 
 /**
@@ -1470,9 +1470,9 @@
  * Function which will perform any necessary work to to clean up the
  * WMM functionality prior to the kernel module unload.
  *
- * Return: CDF_STATUS enumeration
+ * Return: QDF_STATUS enumeration
  */
-CDF_STATUS hdd_wmm_adapter_close(hdd_adapter_t *pAdapter)
+QDF_STATUS hdd_wmm_adapter_close(hdd_adapter_t *pAdapter)
 {
 	hdd_wmm_qos_context_t *pQosContext;
 
@@ -1494,7 +1494,7 @@
 		hdd_wmm_free_context(pQosContext);
 	}
 
-	return CDF_STATUS_SUCCESS;
+	return QDF_STATUS_SUCCESS;
 }
 
 /**
@@ -1792,9 +1792,9 @@
  * @pGranted: [out] pointer to bool flag when indicates if access
  *	      has been granted or not
  *
- * Return: CDF_STATUS enumeration
+ * Return: QDF_STATUS enumeration
  */
-CDF_STATUS hdd_wmm_acquire_access(hdd_adapter_t *pAdapter,
+QDF_STATUS hdd_wmm_acquire_access(hdd_adapter_t *pAdapter,
 				  sme_ac_enum_type acType, bool *pGranted)
 {
 	hdd_wmm_qos_context_t *pQosContext;
@@ -1815,7 +1815,7 @@
 			pAdapter->hddWmmStatus.wmmAcStatus[acType].
 			wmmAcAccessAllowed;
 
-		return CDF_STATUS_SUCCESS;
+		return QDF_STATUS_SUCCESS;
 	}
 	/* do we already have an implicit QoS request pending for this AC? */
 	if ((pAdapter->hddWmmStatus.wmmAcStatus[acType].wmmAcAccessNeeded) ||
@@ -1828,7 +1828,7 @@
 			  __func__, acType);
 
 		*pGranted = false;
-		return CDF_STATUS_SUCCESS;
+		return QDF_STATUS_SUCCESS;
 	}
 	/* did we already fail to establish implicit QoS for this AC?
 	 * (if so, access should have been granted when the failure
@@ -1853,7 +1853,7 @@
 			*pGranted = false;
 		}
 
-		return CDF_STATUS_SUCCESS;
+		return QDF_STATUS_SUCCESS;
 	}
 	/* we need to establish implicit QoS */
 	CDF_TRACE(CDF_MODULE_ID_HDD, WMM_TRACE_LEVEL_INFO,
@@ -1872,7 +1872,7 @@
 		pAdapter->hddWmmStatus.wmmAcStatus[acType].wmmAcAccessAllowed =
 			true;
 		*pGranted = true;
-		return CDF_STATUS_SUCCESS;
+		return QDF_STATUS_SUCCESS;
 	}
 
 	pQosContext->acType = acType;
@@ -1899,7 +1899,7 @@
 	 * TSPEC negotiation completes
 	 */
 	*pGranted = false;
-	return CDF_STATUS_SUCCESS;
+	return QDF_STATUS_SUCCESS;
 }
 
 /**
@@ -1910,13 +1910,13 @@
  * @pRoamInfo: [in]  pointer to roam information
  * @eBssType: [in]  type of BSS
  *
- * Return: CDF_STATUS enumeration
+ * Return: QDF_STATUS enumeration
  */
-CDF_STATUS hdd_wmm_assoc(hdd_adapter_t *pAdapter,
+QDF_STATUS hdd_wmm_assoc(hdd_adapter_t *pAdapter,
 			 tCsrRoamInfo *pRoamInfo, eCsrRoamBssType eBssType)
 {
 	uint8_t uapsdMask;
-	CDF_STATUS status;
+	QDF_STATUS status;
 	hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
 
 	/* when we associate we need to notify TL if it needs to
@@ -1939,7 +1939,7 @@
 		CDF_TRACE(CDF_MODULE_ID_HDD, WMM_TRACE_LEVEL_INFO_LOW,
 			  "%s: Reassoc so no work, Exiting", __func__);
 
-		return CDF_STATUS_SUCCESS;
+		return QDF_STATUS_SUCCESS;
 	}
 	/* get the negotiated UAPSD Mask */
 	uapsdMask =
@@ -1961,7 +1961,7 @@
 						   pAdapter->sessionId,
 						   pHddCtx->config->DelayedTriggerFrmInt);
 
-		CDF_ASSERT(CDF_IS_STATUS_SUCCESS(status));
+		CDF_ASSERT(QDF_IS_STATUS_SUCCESS(status));
 	}
 
 	if (uapsdMask & HDD_AC_VI) {
@@ -1977,7 +1977,7 @@
 						   pAdapter->sessionId,
 						   pHddCtx->config->DelayedTriggerFrmInt);
 
-		CDF_ASSERT(CDF_IS_STATUS_SUCCESS(status));
+		CDF_ASSERT(QDF_IS_STATUS_SUCCESS(status));
 	}
 
 	if (uapsdMask & HDD_AC_BK) {
@@ -1993,7 +1993,7 @@
 						   pAdapter->sessionId,
 						   pHddCtx->config->DelayedTriggerFrmInt);
 
-		CDF_ASSERT(CDF_IS_STATUS_SUCCESS(status));
+		CDF_ASSERT(QDF_IS_STATUS_SUCCESS(status));
 	}
 
 	if (uapsdMask & HDD_AC_BE) {
@@ -2009,21 +2009,21 @@
 						   pAdapter->sessionId,
 						   pHddCtx->config->DelayedTriggerFrmInt);
 
-		CDF_ASSERT(CDF_IS_STATUS_SUCCESS(status));
+		CDF_ASSERT(QDF_IS_STATUS_SUCCESS(status));
 	}
 
 	status = sme_update_dsc_pto_up_mapping(pHddCtx->hHal,
 					       pAdapter->hddWmmDscpToUpMap,
 					       pAdapter->sessionId);
 
-	if (!CDF_IS_STATUS_SUCCESS(status)) {
+	if (!QDF_IS_STATUS_SUCCESS(status)) {
 		hdd_wmm_init(pAdapter);
 	}
 
 	CDF_TRACE(CDF_MODULE_ID_HDD, WMM_TRACE_LEVEL_INFO_LOW,
 		  "%s: Exiting", __func__);
 
-	return CDF_STATUS_SUCCESS;
+	return QDF_STATUS_SUCCESS;
 }
 
 static const uint8_t acm_mask_bit[WLAN_MAX_AC] = {
@@ -2041,9 +2041,9 @@
  * @pRoamInfo: [in]  pointer to roam information
  * @eBssType : [in]  type of BSS
  *
- * Return: CDF_STATUS enumeration
+ * Return: QDF_STATUS enumeration
  */
-CDF_STATUS hdd_wmm_connect(hdd_adapter_t *pAdapter,
+QDF_STATUS hdd_wmm_connect(hdd_adapter_t *pAdapter,
 			   tCsrRoamInfo *pRoamInfo, eCsrRoamBssType eBssType)
 {
 	int ac;
@@ -2108,7 +2108,7 @@
 	CDF_TRACE(CDF_MODULE_ID_HDD, WMM_TRACE_LEVEL_INFO_LOW,
 		  "%s: Exiting", __func__);
 
-	return CDF_STATUS_SUCCESS;
+	return QDF_STATUS_SUCCESS;
 }
 
 /**
@@ -2118,9 +2118,9 @@
  * @pAdapter  : [in]  pointer to adapter context
  * @pUapsdMask: [out] pointer to where the UAPSD Mask is to be stored
  *
- * Return: CDF_STATUS enumeration
+ * Return: QDF_STATUS enumeration
  */
-CDF_STATUS hdd_wmm_get_uapsd_mask(hdd_adapter_t *pAdapter,
+QDF_STATUS hdd_wmm_get_uapsd_mask(hdd_adapter_t *pAdapter,
 				  uint8_t *pUapsdMask)
 {
 	uint8_t uapsdMask;
@@ -2157,7 +2157,7 @@
 
 	/* return calculated mask */
 	*pUapsdMask = uapsdMask;
-	return CDF_STATUS_SUCCESS;
+	return QDF_STATUS_SUCCESS;
 }
 
 /**
diff --git a/core/hdd/src/wlan_hdd_wowl.c b/core/hdd/src/wlan_hdd_wowl.c
index 2901e1c..fc1992a 100644
--- a/core/hdd/src/wlan_hdd_wowl.c
+++ b/core/hdd/src/wlan_hdd_wowl.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013-2015 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2013-2016 The Linux Foundation. All rights reserved.
  *
  * Previously licensed under the ISC license by Qualcomm Atheros, Inc.
  *
@@ -57,7 +57,7 @@
 	return len;
 }
 
-static void hdd_wowl_callback(void *pContext, CDF_STATUS cdf_ret_status)
+static void hdd_wowl_callback(void *pContext, QDF_STATUS cdf_ret_status)
 {
 	CDF_TRACE(CDF_MODULE_ID_HDD, CDF_TRACE_LEVEL_INFO,
 		  "%s: Return code = (%d)", __func__, cdf_ret_status);
@@ -117,7 +117,7 @@
 {
 	struct wow_add_pattern localPattern;
 	int i, first_empty_slot, len, offset;
-	CDF_STATUS cdf_ret_status;
+	QDF_STATUS cdf_ret_status;
 	const char *temp;
 	tHalHandle hHal = WLAN_HDD_GET_HAL_CTX(pAdapter);
 	uint8_t sessionId = pAdapter->sessionId;
@@ -256,7 +256,7 @@
 		cdf_ret_status =
 			sme_wow_add_pattern(hHal, &localPattern,
 						   sessionId);
-		if (!CDF_IS_STATUS_SUCCESS(cdf_ret_status)) {
+		if (!QDF_IS_STATUS_SUCCESS(cdf_ret_status)) {
 			/* Add failed, so invalidate the local storage */
 			CDF_TRACE(CDF_MODULE_ID_HDD, CDF_TRACE_LEVEL_ERROR,
 				  "sme_wowl_add_bcast_pattern failed with error code (%d)",
@@ -293,7 +293,7 @@
 	unsigned char id;
 	tHalHandle hHal = WLAN_HDD_GET_HAL_CTX(pAdapter);
 	bool patternFound = false;
-	CDF_STATUS cdf_ret_status;
+	QDF_STATUS cdf_ret_status;
 	uint8_t sessionId = pAdapter->sessionId;
 	hdd_context_t *pHddCtx = pAdapter->pHddCtx;
 
@@ -314,7 +314,7 @@
 		cdf_ret_status =
 			sme_wow_delete_pattern(hHal, &delPattern,
 						   sessionId);
-		if (CDF_IS_STATUS_SUCCESS(cdf_ret_status)) {
+		if (QDF_IS_STATUS_SUCCESS(cdf_ret_status)) {
 			/* Remove from local storage as well */
 			CDF_TRACE(CDF_MODULE_ID_HDD, CDF_TRACE_LEVEL_ERROR,
 				  "Deleted pattern with id %d [%s]", id,
@@ -344,7 +344,7 @@
 			       char *pattern_mask)
 {
 	struct wow_add_pattern localPattern;
-	CDF_STATUS cdf_ret_status;
+	QDF_STATUS cdf_ret_status;
 	tHalHandle hHal = WLAN_HDD_GET_HAL_CTX(pAdapter);
 	uint8_t session_id = pAdapter->sessionId;
 	uint16_t pattern_len, mask_len, i;
@@ -432,7 +432,7 @@
 	cdf_ret_status =
 		sme_wow_add_pattern(hHal, &localPattern, session_id);
 
-	if (!CDF_IS_STATUS_SUCCESS(cdf_ret_status)) {
+	if (!QDF_IS_STATUS_SUCCESS(cdf_ret_status)) {
 		CDF_TRACE(CDF_MODULE_ID_HDD, CDF_TRACE_LEVEL_ERROR,
 			  "%s: sme_wowl_add_bcast_pattern failed with error code (%d).",
 			  __func__, cdf_ret_status);
@@ -463,7 +463,7 @@
 {
 	struct wow_delete_pattern delPattern;
 	tHalHandle hHal = WLAN_HDD_GET_HAL_CTX(pAdapter);
-	CDF_STATUS cdf_ret_status;
+	QDF_STATUS cdf_ret_status;
 	uint8_t sessionId = pAdapter->sessionId;
 
 	if (pattern_idx > (WOWL_MAX_PTRNS_ALLOWED - 1)) {
@@ -487,7 +487,7 @@
 	cdf_ret_status = sme_wow_delete_pattern(hHal, &delPattern,
 						    sessionId);
 
-	if (!CDF_IS_STATUS_SUCCESS(cdf_ret_status)) {
+	if (!QDF_IS_STATUS_SUCCESS(cdf_ret_status)) {
 		CDF_TRACE(CDF_MODULE_ID_HDD, CDF_TRACE_LEVEL_ERROR,
 			  "%s: sme_wowl_del_bcast_pattern failed with error code (%d).",
 			  __func__, cdf_ret_status);
@@ -513,7 +513,7 @@
 bool hdd_enter_wowl(hdd_adapter_t *pAdapter, bool enable_mp, bool enable_pbm)
 {
 	tSirSmeWowlEnterParams wowParams;
-	CDF_STATUS cdf_ret_status;
+	QDF_STATUS cdf_ret_status;
 	tHalHandle hHal = WLAN_HDD_GET_HAL_CTX(pAdapter);
 
 	cdf_mem_zero(&wowParams, sizeof(tSirSmeWowlEnterParams));
@@ -541,8 +541,8 @@
 #endif /* WLAN_WAKEUP_EVENTS */
 					&wowParams, pAdapter->sessionId);
 
-	if (!CDF_IS_STATUS_SUCCESS(cdf_ret_status)) {
-		if (CDF_STATUS_PMC_PENDING != cdf_ret_status) {
+	if (!QDF_IS_STATUS_SUCCESS(cdf_ret_status)) {
+		if (QDF_STATUS_PMC_PENDING != cdf_ret_status) {
 			/* We failed to enter WoWL */
 			CDF_TRACE(CDF_MODULE_ID_HDD, CDF_TRACE_LEVEL_ERROR,
 				  "sme_enter_wowl failed with error code (%d)",
@@ -563,12 +563,12 @@
 {
 	tSirSmeWowlExitParams wowParams;
 	tHalHandle hHal = WLAN_HDD_GET_HAL_CTX(pAdapter);
-	CDF_STATUS cdf_ret_status;
+	QDF_STATUS cdf_ret_status;
 
 	wowParams.sessionId = pAdapter->sessionId;
 
 	cdf_ret_status = sme_exit_wowl(hHal, &wowParams);
-	if (!CDF_IS_STATUS_SUCCESS(cdf_ret_status)) {
+	if (!QDF_IS_STATUS_SUCCESS(cdf_ret_status)) {
 		CDF_TRACE(CDF_MODULE_ID_HDD, CDF_TRACE_LEVEL_ERROR,
 			  "sme_exit_wowl failed with error code (%d)",
 			  cdf_ret_status);
