From d58b45ae101e1f97f7291017a174d875e5d975d6 Mon Sep 17 00:00:00 2001
From: pbiel <pbiel7@gmail.com>
Date: Thu, 30 Mar 2023 22:34:50 +0200
Subject: [PATCH] [PATCH] wireless: update uwe5622

---
 drivers/net/wireless/uwe5622/tty-sdio/tty.c   |  72 +--
 drivers/net/wireless/uwe5622/tty-sdio/woble.c |   9 +-
 .../net/wireless/uwe5622/unisocwcn/Makefile   |  97 ++--
 .../unisocwcn/boot/wcn_integrate_boot.c       |   1 -
 .../unisocwcn/include/marlin_platform.h       |   3 +-
 .../uwe5622/unisocwcn/include/uwe562x_glb.h   |  11 +-
 .../uwe5622/unisocwcn/platform/bufring.c      |   1 -
 .../unisocwcn/platform/gnss/gnss_common.h     |  82 ++-
 .../unisocwcn/platform/gnss/gnss_common_ctl.c |  76 ++-
 .../unisocwcn/platform/gnss/gnss_dbg.c        |  23 +-
 .../unisocwcn/platform/gnss/gnss_dump.c       |  28 +-
 .../platform/gnss/gnss_pmnotify_ctl.c         |   9 +-
 .../uwe5622/unisocwcn/platform/rdc_debug.c    |   8 +-
 .../uwe5622/unisocwcn/platform/wcn_boot.c     | 206 +++----
 .../uwe5622/unisocwcn/platform/wcn_op.h       |   6 -
 .../unisocwcn/platform/wcn_parn_parser.c      |   3 -
 .../uwe5622/unisocwcn/platform/wcn_procfs.c   |  58 +-
 .../uwe5622/unisocwcn/platform/wcn_txrx.c     |  26 +-
 .../uwe5622/unisocwcn/platform/wcn_txrx.h     |   6 +-
 .../wireless/uwe5622/unisocwcn/sdio/sdiohal.h |  10 +-
 .../uwe5622/unisocwcn/sdio/sdiohal_common.c   | 201 ++++---
 .../uwe5622/unisocwcn/sdio/sdiohal_ctl.c      |   9 +-
 .../uwe5622/unisocwcn/sdio/sdiohal_main.c     |   1 -
 .../uwe5622/unisocwcn/sdio/sdiohal_rx.c       |  52 +-
 .../uwe5622/unisocwcn/sdio/sdiohal_tx.c       |   8 +-
 .../uwe5622/unisocwcn/sleep/sdio_int.c        |  11 +-
 .../uwe5622/unisocwcn/sleep/sdio_int.h        |   4 +-
 .../uwe5622/unisocwcn/sleep/slp_mgr.c         |  10 +-
 .../net/wireless/uwe5622/unisocwcn/wcn_bus.c  |  12 +-
 .../net/wireless/uwe5622/unisocwifi/Kconfig   |   7 +-
 .../net/wireless/uwe5622/unisocwifi/Makefile  |  50 +-
 .../wireless/uwe5622/unisocwifi/api_version.c |  14 +-
 .../wireless/uwe5622/unisocwifi/cfg80211.c    | 522 ++++++++++--------
 .../wireless/uwe5622/unisocwifi/cfg80211.h    |   9 -
 .../net/wireless/uwe5622/unisocwifi/cmdevt.c  | 428 +++++++++-----
 .../net/wireless/uwe5622/unisocwifi/cmdevt.h  |   1 +
 .../uwe5622/unisocwifi/dbg_ini_util.c         |   6 +-
 .../net/wireless/uwe5622/unisocwifi/debug.c   |   6 +-
 .../net/wireless/uwe5622/unisocwifi/defrag.c  |  32 +-
 .../wireless/uwe5622/unisocwifi/edma_test.c   |  18 +-
 .../net/wireless/uwe5622/unisocwifi/ibss.c    |  14 +-
 .../net/wireless/uwe5622/unisocwifi/intf.h    |  20 +-
 .../wireless/uwe5622/unisocwifi/intf_ops.h    |  22 +
 .../net/wireless/uwe5622/unisocwifi/main.c    | 136 +++--
 drivers/net/wireless/uwe5622/unisocwifi/mm.c  |  66 +--
 drivers/net/wireless/uwe5622/unisocwifi/msg.c |   6 +-
 drivers/net/wireless/uwe5622/unisocwifi/msg.h |   2 +
 drivers/net/wireless/uwe5622/unisocwifi/nan.c |   2 +-
 drivers/net/wireless/uwe5622/unisocwifi/npi.c |  22 +-
 drivers/net/wireless/uwe5622/unisocwifi/qos.c |  63 ++-
 drivers/net/wireless/uwe5622/unisocwifi/qos.h |   5 +-
 .../wireless/uwe5622/unisocwifi/reg_domain.c  |   8 +-
 .../net/wireless/uwe5622/unisocwifi/reorder.c | 100 ++--
 .../wireless/uwe5622/unisocwifi/rf_marlin3.c  |   4 +-
 drivers/net/wireless/uwe5622/unisocwifi/rtt.c | 130 ++---
 .../net/wireless/uwe5622/unisocwifi/rx_msg.c  |  40 +-
 .../wireless/uwe5622/unisocwifi/softap_hook.c |  12 +-
 .../net/wireless/uwe5622/unisocwifi/sprdwl.h  |   3 +
 .../net/wireless/uwe5622/unisocwifi/tcp_ack.c |  38 +-
 .../net/wireless/uwe5622/unisocwifi/tx_msg.c  | 102 ++--
 .../net/wireless/uwe5622/unisocwifi/txrx.c    |  39 +-
 .../net/wireless/uwe5622/unisocwifi/vendor.c  | 329 ++++++-----
 .../wireless/uwe5622/unisocwifi/wcn_wrapper.h |  20 +
 .../net/wireless/uwe5622/unisocwifi/wl_core.c | 157 ++++--
 .../net/wireless/uwe5622/unisocwifi/wl_core.h |   2 +-
 .../net/wireless/uwe5622/unisocwifi/wl_intf.c | 234 ++++----
 .../net/wireless/uwe5622/unisocwifi/wl_intf.h |   1 +
 .../net/wireless/uwe5622/unisocwifi/work.c    |  28 +-
 68 files changed, 2156 insertions(+), 1585 deletions(-)
 create mode 100644 drivers/net/wireless/uwe5622/unisocwifi/wcn_wrapper.h

diff --git a/drivers/net/wireless/uwe5622/tty-sdio/tty.c b/drivers/net/wireless/uwe5622/tty-sdio/tty.c
index 0f90a758b..6498272fc 100644
--- a/drivers/net/wireless/uwe5622/tty-sdio/tty.c
+++ b/drivers/net/wireless/uwe5622/tty-sdio/tty.c
@@ -113,17 +113,6 @@ static ssize_t dumpmem_store(struct device *dev,
 
 static DEVICE_ATTR_WO(dumpmem);
 
-static struct attribute *bluetooth_attrs[] = {
-	&dev_attr_dumpmem.attr,
-	NULL,
-};
-
-static struct attribute_group bluetooth_group = {
-	.name = NULL,
-	.attrs = bluetooth_attrs,
-};
-
-#ifdef KERNEL_VERSION_414
 static ssize_t chipid_show(struct device *dev,
 	   struct device_attribute *attr, char *buf)
 {
@@ -144,8 +133,22 @@ static ssize_t chipid_show(struct device *dev,
 
 static DEVICE_ATTR_RO(chipid);
 
+static ssize_t ant_num_show(struct device *dev, struct device_attribute *attr, char *buf)
+{
+	int num = 2;
+
+	num = marlin_get_ant_num();
+	pr_err("%s: %d", __func__, num);
+
+	return sprintf(buf, "%d", num);
+}
+
+static DEVICE_ATTR_RO(ant_num);
+
 static struct attribute *bluetooth_attrs[] = {
+	&dev_attr_dumpmem.attr,
 	&dev_attr_chipid.attr,
+	&dev_attr_ant_num.attr,
 	NULL,
 };
 
@@ -153,7 +156,6 @@ static struct attribute_group bluetooth_group = {
 	.name = NULL,
 	.attrs = bluetooth_attrs,
 };
-#endif
 
 static void hex_dump(unsigned char *bin, size_t binsz)
 {
@@ -629,47 +631,13 @@ struct mchn_ops_t bt_tx_ops = {
 #endif
 };
 
-static int bluetooth_reset(struct notifier_block *this, unsigned long ev, void *ptr)
-{
-#define RESET_BUFSIZE 5
-	int ret = 0;
-	int block_size = RESET_BUFSIZE;
-	unsigned char reset_buf[RESET_BUFSIZE] = {0x04, 0xff, 0x02, 0x57, 0xa5};
-
-	if (!ev) {
-		pr_info("%s:reset callback coming\n", __func__);
-		if (mtty_dev != NULL) {
-			if (!work_pending(&mtty_dev->bt_rx_work)) {
-				pr_info("%s tty_insert_flip_string", __func__);
-				while (ret < block_size) {
-					pr_info("%s before tty_insert_flip_string ret: %d, len: %d\n",
-							__func__, ret, RESET_BUFSIZE);
-					ret = tty_insert_flip_string(mtty_dev->port,
-							(unsigned char *)reset_buf,
-							RESET_BUFSIZE);   // -BT_SDIO_HEAD_LEN
-					pr_info("%s ret: %d, len: %d\n", __func__, ret, RESET_BUFSIZE);
-					if (ret)
-						tty_flip_buffer_push(mtty_dev->port);
-					block_size = block_size - ret;
-					ret = 0;
-				}
-			}
-		}
-		ret = NOTIFY_DONE;
-	}
-	return ret;
-}
-
-static struct notifier_block bluetooth_reset_block = {
-    .notifier_call = bluetooth_reset,
-};
-
 static int  mtty_probe(struct platform_device *pdev)
 {
 	struct mtty_init_data *pdata = (struct mtty_init_data *)
-					pdev->dev.platform_data;
+								pdev->dev.platform_data;
 	struct mtty_device *mtty;
 	int rval = 0;
+
 #ifdef OTT_UWE
 	static struct mtty_init_data mtty_driver_data = {
 		.name = "ttyBT",
@@ -714,7 +682,7 @@ static int  mtty_probe(struct platform_device *pdev)
 	INIT_LIST_HEAD(&mtty->rx_head);
 	/*tasklet_init(&mtty->rx_task, mtty_rx_task, (unsigned long)mtty);*/
 	mtty->bt_rx_workqueue =
-	create_singlethread_workqueue("SPRDBT_RX_QUEUE");
+		create_singlethread_workqueue("SPRDBT_RX_QUEUE");
 	if (!mtty->bt_rx_workqueue) {
 		pr_err("%s SPRDBT_RX_QUEUE create failed", __func__);
 		return -ENOMEM;
@@ -724,7 +692,8 @@ static int  mtty_probe(struct platform_device *pdev)
 	mtty_dev = mtty;
 
 //#ifdef KERNEL_VERSION_414
-	if (sysfs_create_group(&pdev->dev.kobj, &bluetooth_group)) {
+	if (sysfs_create_group(&pdev->dev.kobj,
+			&bluetooth_group)) {
 		pr_err("%s failed to create bluetooth tty attributes.\n", __func__);
 	}
 //#endif
@@ -732,9 +701,6 @@ static int  mtty_probe(struct platform_device *pdev)
 	rfkill_bluetooth_init(pdev);
 	bluesleep_init();
 	woble_init();
-
-	marlin_reset_callback_register(MARLIN_BLUETOOTH, &bluetooth_reset_block);
-
 	sprdwcn_bus_chn_init(&bt_rx_ops);
 	sprdwcn_bus_chn_init(&bt_tx_ops);
 	sema_init(&sem_id, BT_TX_POOL_SIZE - 1);
diff --git a/drivers/net/wireless/uwe5622/tty-sdio/woble.c b/drivers/net/wireless/uwe5622/tty-sdio/woble.c
index 1df3f37fd..578108e7a 100644
--- a/drivers/net/wireless/uwe5622/tty-sdio/woble.c
+++ b/drivers/net/wireless/uwe5622/tty-sdio/woble.c
@@ -22,13 +22,13 @@
 #include <linux/string.h>
 #include "woble.h"
 #include "tty.h"
+#include "alignment/sitm.h"
+#include <marlin_platform.h>
 
 #define CMD_TIMEOUT 5000
 #define MAX_WAKE_DEVICE_MAX_NUM 36
 #define CONFIG_FILE_PATH "/data/misc/bluedroid/bt_config.conf"
 
-MODULE_IMPORT_NS(VFS_internal_I_am_really_a_filesystem_and_am_NOT_a_driver);
-
 static struct hci_cmd_t hci_cmd;
 uint8_t device_count_db;
 const woble_config_t s_woble_config_cust = {WOBLE_MOD_ENABLE, WOBLE_SLEEP_MOD_COULD_NOT_KNOW, 0, WOBLE_SLEEP_MOD_NOT_NEED_NOTITY};
@@ -224,7 +224,7 @@ int woble_data_recv(const unsigned char *buf, int count)
 int hci_cmd_send_sync(unsigned short opcode, struct HC_BT_HDR *py,
 		struct HC_BT_HDR *rsp)
 {
-	unsigned char msg_req[HCI_CMD_MAX_LEN], *p;
+	unsigned char msg_req[HCI_CMD_MAX_LEN + BYTE_ALIGNMENT] = {0}, *p;
 	int ret = 0;
 
 	p = msg_req;
@@ -239,7 +239,7 @@ int hci_cmd_send_sync(unsigned short opcode, struct HC_BT_HDR *py,
 	}
 
 	hci_cmd.opcode = opcode;
-	ret = marlin_sdio_write(msg_req, p - msg_req);
+	ret = marlin_sdio_write(msg_req, (p - msg_req) + (BYTE_ALIGNMENT - ((p - msg_req) % BYTE_ALIGNMENT)));
 	if (!ret) {
 		hci_cmd.opcode = 0;
 		pr_err("%s marlin_sdio_write fail", __func__);
@@ -248,6 +248,7 @@ int hci_cmd_send_sync(unsigned short opcode, struct HC_BT_HDR *py,
 
 	if (down_timeout(&hci_cmd.wait, msecs_to_jiffies(CMD_TIMEOUT))) {
 		pr_err("%s CMD_TIMEOUT for CMD: 0x%04X", __func__, opcode);
+		mdbg_assert_interface("hci cmd timeout");
 	}
 	hci_cmd.opcode = 0;
 
diff --git a/drivers/net/wireless/uwe5622/unisocwcn/Makefile b/drivers/net/wireless/uwe5622/unisocwcn/Makefile
index b62652f63..f9c595747 100644
--- a/drivers/net/wireless/uwe5622/unisocwcn/Makefile
+++ b/drivers/net/wireless/uwe5622/unisocwcn/Makefile
@@ -50,6 +50,7 @@ endif
 ifeq ($(CFG_AML_WIFI_DEVICE_UWE5622),y)
 export CONFIG_WCN_SDIO = y
 #export CONFIG_WCN_USB = y
+# export CONFIG_WCN_GNSS = y
 ccflags-y += -DCONFIG_CHECK_DRIVER_BY_CHIPID
 #ccflags-y += -DCONFIG_UWE5622
 BSP_CHIP_ID := uwe5621
@@ -68,6 +69,7 @@ endif
 ifeq ($(CONFIG_RK_WIFI_DEVICE_UWE5622),y)
 export CONFIG_WCN_SDIO = y
 #export CONFIG_WCN_USB = y
+# export CONFIG_WCN_GNSS = y
 #ccflags-y += -DCONFIG_CHECK_DRIVER_BY_CHIPID
 ccflags-y += -DCONFIG_UWE5622
 BSP_CHIP_ID := uwe5622
@@ -77,8 +79,9 @@ endif
 ifeq ($(CONFIG_AW_WIFI_DEVICE_UWE5622),y)
 export CONFIG_WCN_SDIO = y
 #export CONFIG_WCN_USB = y
-#ccflags-y += -DCONFIG_CHECK_DRIVER_BY_CHIPID
-ccflags-y += -DCONFIG_UWE5622
+# export CONFIG_WCN_GNSS = y
+ccflags-y += -DCONFIG_CHECK_DRIVER_BY_CHIPID
+# ccflags-y += -DCONFIG_UWE5622
 BSP_CHIP_ID := uwe5622
 WCN_HW_TYPE := sdio
 endif
@@ -97,6 +100,9 @@ endif
 ifneq ($(UNISOC_DBG_PATH_CONFIG),)
 ccflags-y += -DCONFIG_CUSTOMIZE_UNISOC_DBG_PATH=\"$(UNISOC_DBG_PATH_CONFIG)\"
 endif
+ifneq ($(UNISOC_SDIO_IRQ_TYPE_CONFIG),)
+ccflags-y += -DCONFIG_CUSTOMIZE_SDIO_IRQ_TYPE=$(UNISOC_SDIO_IRQ_TYPE_CONFIG)
+endif
 
 #### add cflag ######
 ifeq ($(CONFIG_WCN_SDIO),y)
@@ -114,11 +120,15 @@ endif
 ifeq ($(CONFIG_WCN_USB),y)
 ccflags-y += -DCONFIG_WCN_USB
 endif
+
+ifeq ($(CONFIG_WCN_GNSS),y)
+ccflags-y += -DCONFIG_WCN_GNSS
+endif
+
 ccflags-y += -DCONFIG_WCN_BOOT
 ccflags-y += -DCONFIG_WCN_UTILS
 
 #### include path ######
-ccflags-y += -I$(src)/../tty-sdio
 ccflags-y += -I$(src)/include/
 ccflags-y += -I$(src)/platform/
 ccflags-y += -I$(src)/platform/rf/
@@ -148,7 +158,7 @@ ccflags-y += -DCONFIG_SDIO_TX_ADMA_MODE
 ccflags-y += -DCONFIG_SDIO_RX_ADMA_MODE
 ccflags-y += -DCONFIG_SDIO_INBAND_INT
 #ccflags-y += -DCONFIG_SDIO_INBAND_POLLING
-#ccflags-y += -DCONFIG_SDIO_BLKSIZE_512
+ccflags-y += -DCONFIG_SDIO_BLKSIZE_512
 #ccflags-y += -DCONFIG_SDIO_PWRSEQ
 endif
 
@@ -177,7 +187,7 @@ ccflags-y += -DCONFIG_SDIO_TX_ADMA_MODE
 ccflags-y += -DCONFIG_SDIO_RX_ADMA_MODE
 ccflags-y += -DCONFIG_SDIO_INBAND_INT
 #ccflags-y += -DCONFIG_SDIO_INBAND_POLLING
-#ccflags-y += -DCONFIG_SDIO_BLKSIZE_512
+ccflags-y += -DCONFIG_SDIO_BLKSIZE_512
 #ccflags-y += -DCONFIG_SDIO_PWRSEQ
 
 all_dependencies += install
@@ -197,6 +207,7 @@ ccflags-y += -DCONFIG_HISI_BOARD
 #ccflags-y += -DCONFIG_WCN_RESUME_POWER_DOWN
 #ccflags-y += -DCONFIG_WCN_RESUME_KEEPPWR_RESETSDIO
 #ccflags-y += -DCONFIG_WCN_CHECK_MODULE_VENDOR
+ccflags-y += -DCONFIG_SYS_REBOOT_NOT_REPOWER_USBCHIP
 ifneq ($(TARGET_BUILD_VARIANT),user)
 ccflags-y += -DCONFIG_WCN_LOOPCHECK
 ccflags-y += -DCONFIG_CPLOG_DEBUG
@@ -227,7 +238,8 @@ ccflags-y += -DCONFIG_BT_WAKE_HOST_EN
 #ccflags-y += -DCONFIG_MEM_PD
 #ccflags-y += -DCONFIG_SDIO_TX_ADMA_MODE
 #ccflags-y += -DCONFIG_SDIO_RX_ADMA_MODE
-ccflags-y += -DCONFIG_SDIO_INBAND_INT
+# ccflags-y += -DCONFIG_SDIO_INBAND_INT
+ccflags-y += -DCONFIG_CUSTOMIZE_SDIO_IRQ_TYPE=2
 #ccflags-y += -DCONFIG_SDIO_INBAND_POLLING
 ccflags-y += -DCONFIG_SDIO_BLKSIZE_512
 #ccflags-y += -DCONFIG_SDIO_PWRSEQ
@@ -250,14 +262,15 @@ ccflags-y += -DCONFIG_WCN_POWER_UP_DOWN
 #ccflags-y += -DCONFIG_WCN_RESUME_KEEPPWR_RESETSDIO
 #ccflags-y += -DCONFIG_WCN_CHECK_MODULE_VENDOR
 #ccflags-y += -DCONFIG_WCN_LOOPCHECK
-ifneq ($(TARGET_BUILD_VARIANT),user)
-ccflags-y += -DCONFIG_CPLOG_DEBUG
-endif
+#ifneq ($(TARGET_BUILD_VARIANT),user)
+#ccflags-y += -DCONFIG_CPLOG_DEBUG
+#endif
 #ccflags-y += -DCONFIG_MEM_PD
 #ccflags-y += -DCONFIG_SDIO_TX_ADMA_MODE
 #ccflags-y += -DCONFIG_SDIO_RX_ADMA_MODE
 #ccflags-y += -DCONFIG_SDIO_INBAND_INT
 #ccflags-y += -DCONFIG_SDIO_INBAND_POLLING
+ccflags-y += -DCONFIG_CUSTOMIZE_SDIO_IRQ_TYPE=3
 ccflags-y += -DCONFIG_SDIO_BLKSIZE_512
 #ccflags-y += -DCONFIG_SDIO_PWRSEQ
 
@@ -293,7 +306,7 @@ ccflags-y += -DCONFIG_WCN_PARSE_DTS
 #ccflags-y += -DCONFIG_WCN_CHECK_MODULE_VENDOR
 ifneq ($(TARGET_BUILD_VARIANT),user)
 ccflags-y += -DCONFIG_WCN_LOOPCHECK
-ccflags-y += -DCONFIG_CPLOG_DEBUG
+#ccflags-y += -DCONFIG_CPLOG_DEBUG
 endif
 #ccflags-y += -DCONFIG_MEM_PD
 
@@ -346,41 +359,47 @@ obj-m := $(MODULE_NAME).o
 endif
 
 $(MODULE_NAME)-y += wcn_bus.o \
-		    platform/wcn_boot.o \
-		    platform/wcn_dump.o \
-		    platform/bufring.o \
-		    platform/wcn_txrx.o \
-		    platform/wcn_op.o \
-		    platform/wcn_parn_parser.o \
-		    platform/rdc_debug.o \
-		    platform/wcn_log.o \
-		    platform/wcn_misc.o \
-		    platform/wcn_procfs.o \
-		    platform/loopcheck.o
+			platform/wcn_boot.o \
+			platform/wcn_dump.o \
+			platform/bufring.o \
+			platform/wcn_txrx.o \
+			platform/wcn_op.o \
+			platform/wcn_parn_parser.o \
+			platform/rdc_debug.o \
+			platform/wcn_log.o \
+			platform/wcn_misc.o \
+			platform/wcn_procfs.o \
+			platform/loopcheck.o
 
 $(MODULE_NAME)-$(CONFIG_WCN_SWD) += platform/wcn_swd_dp.o
 
 $(MODULE_NAME)-$(CONFIG_WCN_USB) += \
-		    usb/wcn_usb.o \
-		    usb/wcn_usb_rx_tx.o \
-		    usb/wcn_usb_store.o \
-		    usb/wcn_usb_io.o \
-		    usb/wcn_usb_test.o \
-		    usb/wcn_usb_download.o \
-		    platform/usb_boot.o
+			usb/wcn_usb.o \
+			usb/wcn_usb_rx_tx.o \
+			usb/wcn_usb_store.o \
+			usb/wcn_usb_io.o \
+			usb/wcn_usb_test.o \
+			usb/wcn_usb_download.o \
+			platform/usb_boot.o
 
 $(MODULE_NAME)-$(CONFIG_WCN_SDIO) += \
-		    sdio/sdiohal_main.o \
-		    sdio/sdiohal_common.o \
-		    sdio/sdiohal_tx.o \
-		    sdio/sdiohal_rx.o \
-		    sdio/sdio_v3.o \
-		    sdio/sdiohal_ctl.o \
-		    sleep/sdio_int.o \
-		    sleep/slp_mgr.o \
-		    sleep/slp_sdio.o \
-		    sleep/slp_test.o \
-		    platform/mem_pd_mgr.o
+			sdio/sdiohal_main.o \
+			sdio/sdiohal_common.o \
+			sdio/sdiohal_tx.o \
+			sdio/sdiohal_rx.o \
+			sdio/sdio_v3.o \
+			sdio/sdiohal_ctl.o \
+			sleep/sdio_int.o \
+			sleep/slp_mgr.o \
+			sleep/slp_sdio.o \
+			sleep/slp_test.o \
+			platform/mem_pd_mgr.o
+
+$(MODULE_NAME)-$(CONFIG_WCN_GNSS) += \
+			platform/gnss/gnss_common_ctl.o \
+			platform/gnss/gnss_pmnotify_ctl.o \
+			platform/gnss/gnss_dbg.o \
+			platform/gnss/gnss_dump.o \
 
 KDIR ?= $(ANDROID_PRODUCT_OUT)/obj/KERNEL_OBJ
 ARCH ?= arm
diff --git a/drivers/net/wireless/uwe5622/unisocwcn/boot/wcn_integrate_boot.c b/drivers/net/wireless/uwe5622/unisocwcn/boot/wcn_integrate_boot.c
index 48b69ccaa..ebccdb22f 100644
--- a/drivers/net/wireless/uwe5622/unisocwcn/boot/wcn_integrate_boot.c
+++ b/drivers/net/wireless/uwe5622/unisocwcn/boot/wcn_integrate_boot.c
@@ -19,7 +19,6 @@
 #include "wcn_gnss.h"
 #include "wcn_procfs.h"
 
-MODULE_IMPORT_NS(VFS_internal_I_am_really_a_filesystem_and_am_NOT_a_driver);
 
 static struct mutex marlin_lock;
 static struct wifi_calibration wifi_data;
diff --git a/drivers/net/wireless/uwe5622/unisocwcn/include/marlin_platform.h b/drivers/net/wireless/uwe5622/unisocwcn/include/marlin_platform.h
index ae8daac46..7a78181a4 100644
--- a/drivers/net/wireless/uwe5622/unisocwcn/include/marlin_platform.h
+++ b/drivers/net/wireless/uwe5622/unisocwcn/include/marlin_platform.h
@@ -83,7 +83,8 @@ enum marlin_wake_host_en {
 };
 
 enum marlin_cp2_status {
-	MARLIN_CP2_STS_ASSERTED = 0,
+	MARLIN_CP2_STS_READY = 0,
+	MARLIN_CP2_STS_ASSERTED = 1,
 };
 
 enum wcn_hw_type wcn_get_hw_if_type(void);
diff --git a/drivers/net/wireless/uwe5622/unisocwcn/include/uwe562x_glb.h b/drivers/net/wireless/uwe5622/unisocwcn/include/uwe562x_glb.h
index ca7feadb5..275a464eb 100644
--- a/drivers/net/wireless/uwe5622/unisocwcn/include/uwe562x_glb.h
+++ b/drivers/net/wireless/uwe5622/unisocwcn/include/uwe562x_glb.h
@@ -245,16 +245,15 @@ static inline unsigned int reg_value(unsigned int marlin3reg,
 #define GNSS_CP_START_ADDR_M3L 0x40A50000
 #define GNSS_CP_START_ADDR_M3_M3E	0x40A20000
 #define GNSS_CP_START_ADDR \
-	SET_REG_VALUE(GNSS_CP_START_ADDR_M3_M3E, GNSS_CP_START_ADDR_M3L,\
-	GNSS_CP_START_ADDR_M3_M3E)\
+	SET_REG_VALUE(GNSS_CP_START_ADDR_M3_M3E, GNSS_CP_START_ADDR_M3L,	\
+	GNSS_CP_START_ADDR_M3_M3E)
 
 #define GNSS_CP_RESET_REG	0x40BC8280
-//#define GNSS_FIRMWARE_MAX_SIZE 0x58000
 #define GNSS_FIRMWARE_MAX_SIZE_M3L 0x2B000
 #define GNSS_FIRMWARE_MAX_SIZE_M3_M3E 0x58000
-#define	GNSS_FIRMWARE_MAX_SIZE \
-	SET_REG_VALUE(GNSS_FIRMWARE_MAX_SIZE_M3_M3E,\
-	GNSS_FIRMWARE_MAX_SIZE_M3L, GNSS_FIRMWARE_MAX_SIZE_M3_M3E)\
+#define	GNSS_FIRMWARE_MAX_SIZE	\
+	SET_REG_VALUE(GNSS_FIRMWARE_MAX_SIZE_M3_M3E,	\
+	GNSS_FIRMWARE_MAX_SIZE_M3L, GNSS_FIRMWARE_MAX_SIZE_M3_M3E)
 
 #define GNSS_CHIPID_REG 0x603003fc
 
diff --git a/drivers/net/wireless/uwe5622/unisocwcn/platform/bufring.c b/drivers/net/wireless/uwe5622/unisocwcn/platform/bufring.c
index b8459b914..7cb79f2f2 100644
--- a/drivers/net/wireless/uwe5622/unisocwcn/platform/bufring.c
+++ b/drivers/net/wireless/uwe5622/unisocwcn/platform/bufring.c
@@ -117,7 +117,6 @@ void mdbg_ring_destroy(struct mdbg_ring_t *ring)
 		}
 		MDBG_LOG("to free ring.");
 		kfree(ring);
-		ring = NULL;
 	}
 }
 
diff --git a/drivers/net/wireless/uwe5622/unisocwcn/platform/gnss/gnss_common.h b/drivers/net/wireless/uwe5622/unisocwcn/platform/gnss/gnss_common.h
index 5999726f5..34de085bb 100644
--- a/drivers/net/wireless/uwe5622/unisocwcn/platform/gnss/gnss_common.h
+++ b/drivers/net/wireless/uwe5622/unisocwcn/platform/gnss/gnss_common.h
@@ -20,44 +20,76 @@
 #ifndef __GNSS_COMMON_H__
 #define __GNSS_COMMON_H__
 
-#ifndef CONFIG_SC2342_INTEG
 /* begin: address map on gnss side, operate by SDIO BUS */
 /* set(s)/clear(c) */
 #define GNSS_SET_OFFSET                 0x1000
 #define GNSS_CLEAR_OFFSET               0x2000
 
-#define GNSS_APB_BASE              0x40bc8000
-#define REG_GNSS_APB_MCU_AP_RST        (GNSS_APB_BASE + 0x0280) /* s/c */
-#define BIT_GNSS_APB_MCU_AP_RST_SOFT    (1<<0)    /* bit0 */
+#define GNSS_APB_BASE                   0x40bc8000
+#define REG_GNSS_APB_MCU_AP_RST         (GNSS_APB_BASE + 0x0280) /* s/c */
+#define BIT_GNSS_APB_MCU_AP_RST_SOFT    (1<<0)                   /* bit0 */
 
-#define GNSS_INDIRECT_OP_REG		0x40b20000
+#define GNSS_INDIRECT_OP_REG            0x40b20000
 
-#define GNSS_AHB_BASE			   0x40b18000
-#define GNSS_ARCH_EB_REG		   (GNSS_AHB_BASE + 0x084)
-#define GNSS_ARCH_EB_REG_BYPASS    (1<<1)
+#define GNSS_AHB_BASE                   0x40b18000
+#define GNSS_ARCH_EB_REG                (GNSS_AHB_BASE + 0x084)
+#define GNSS_ARCH_EB_REG_BYPASS         (1<<1)
+#define GNSS_BOOTSTATUS_SIZE            0x4
+#define GNSS_BOOTSTATUS_MAGIC           0x12345678
+#define GNSS_EFUSE_DATA_SIZE            0xc
+#define GNSS_CALI_DONE_FLAG             0x1314520
 
-#define GNSS_CALI_ADDRESS 0x40aaff4c
-#define GNSS_CALI_DONE_FLAG 0x1314520
-#define GNSS_CALI_DATA_SIZE 0x14
+#ifdef CONFIG_CHECK_DRIVER_BY_CHIPID
+#undef CONFIG_CHECK_DRIVER_BY_CHIPID
+#define CONFIG_UWE5622
+#endif
+#ifndef CONFIG_CHECK_DRIVER_BY_CHIPID
+#ifdef CONFIG_UWE5622
+#define GNSS_CALI_ADDRESS               0x40aabf4c
+#define GNSS_CALI_DATA_SIZE             0x1c
+#else
+#define GNSS_CALI_ADDRESS               0x40aaff4c
+#define GNSS_CALI_DATA_SIZE             0x14
+#endif
 
-#define GNSS_EFUSE_ADDRESS 0x40aaff40
-#define GNSS_EFUSE_DATA_SIZE 0xc
+#ifdef CONFIG_UWE5622
+#define GNSS_EFUSE_ADDRESS              0x40aabf40
+#else
+#define GNSS_EFUSE_ADDRESS              0x40aaff40
+#endif
 
 /*  GNSS assert workaround */
-#define GNSS_BOOTSTATUS_ADDRESS  0x40aaff6C
-#define GNSS_BOOTSTATUS_SIZE     0x4
-#define GNSS_BOOTSTATUS_MAGIC    0x12345678
-
-/* end: address map on gnss side */
+#ifdef CONFIG_UWE5622
+#define GNSS_BOOTSTATUS_ADDRESS         0x40aabf6c
+#else
+#define GNSS_BOOTSTATUS_ADDRESS         0x40aaff6c
+#endif
 
-int gnss_write_data(void);
-int gnss_backup_data(void);
-void gnss_file_path_set(char *buf);
 #else
-#define GNSS_FLAG_ADDRESS_INFILE    0xFFFFC
-#define GNSS_FLAG_GLO               0x4E4C4700
-#define GNSS_FLAG_BD                0x44420000
+#include "uwe562x_glb.h"
+
+#define GNSS_CALI_ADDRESS_M3               0x40aaff4c
+#define GNSS_CALI_ADDRESS_M3L              0x40aabf4c
+#define GNSS_CALI_ADDRESS  SET_REG_VALUE(GNSS_CALI_ADDRESS_M3, \
+									GNSS_CALI_ADDRESS_M3L, 0)
+
+#define GNSS_CALI_DATA_SIZE_M3              0x14
+#define GNSS_CALI_DATA_SIZE_M3L             0x1c
+#define GNSS_CALI_DATA_SIZE SET_REG_VALUE(GNSS_CALI_DATA_SIZE_M3, \
+									GNSS_CALI_DATA_SIZE_M3L, 0)
+
+#define GNSS_EFUSE_ADDRESS_M3              0x40aaff40
+#define GNSS_EFUSE_ADDRESS_M3L             0x40aabf40
+#define GNSS_EFUSE_ADDRESS SET_REG_VALUE(GNSS_EFUSE_ADDRESS_M3, \
+									GNSS_EFUSE_ADDRESS_M3L, 0)
+
+#define GNSS_BOOTSTATUS_ADDRESS_M3         0x40aaff6c
+#define GNSS_BOOTSTATUS_ADDRESS_M3L        0x40aabf6c
+#define GNSS_BOOTSTATUS_ADDRESS SET_REG_VALUE(GNSS_BOOTSTATUS_ADDRESS_M3, \
+									GNSS_BOOTSTATUS_ADDRESS_M3L, 0)
+
 #endif
-bool gnss_delay_ctl(void);
+
+/* end: address map on gnss side */
 
 #endif
diff --git a/drivers/net/wireless/uwe5622/unisocwcn/platform/gnss/gnss_common_ctl.c b/drivers/net/wireless/uwe5622/unisocwcn/platform/gnss/gnss_common_ctl.c
index c9831c1d3..0fe9e1ade 100644
--- a/drivers/net/wireless/uwe5622/unisocwcn/platform/gnss/gnss_common_ctl.c
+++ b/drivers/net/wireless/uwe5622/unisocwcn/platform/gnss/gnss_common_ctl.c
@@ -76,18 +76,21 @@ enum gnss_cp_status_subtype {
 };
 static struct completion gnss_dump_complete;
 #endif
+
+static const int gnss_version = 0x22;
+#ifdef CONFIG_WCN_PARSE_DTS
 static const struct of_device_id gnss_common_ctl_of_match[] = {
-	{.compatible = "sprd,gnss_common_ctl", .data = (void *)0x22},
+	{.compatible = "sprd,gnss_common_ctl", .data = (void *)&gnss_version},
 	{},
 };
-
+#endif
 #ifndef CONFIG_SC2342_INTEG
 struct gnss_cali {
 	bool cali_done;
 	u32 *cali_data;
 };
 static struct gnss_cali gnss_cali_data;
-static u32 gnss_efuse_data[3];
+static u32 *gnss_efuse_data;
 
 
 #ifdef GNSSDEBUG
@@ -107,14 +110,28 @@ static int gnss_cali_init(void)
 		return -ENOMEM;
 	}
 
-	#ifdef GNSSDEBUG
+#ifdef GNSSDEBUG
 	init_completion(&marlin_dev.gnss_cali_done);
 	sdio_pub_int_RegCb(GNSS_CALI_DONE, (PUB_INT_ISR)gnss_cali_done_isr);
-	#endif
+#endif
+	gnss_efuse_data = kzalloc(GNSS_EFUSE_DATA_SIZE, GFP_KERNEL);
+	if (gnss_efuse_data == NULL) {
+		GNSSCOMM_ERR("%s malloc efuse data fail.\n", __func__);
+		return -ENOMEM;
+	}
 
 	return 0;
 }
 
+static void gnss_cali_deinit(void)
+{
+	gnss_cali_data.cali_done = false;
+	if (gnss_cali_data.cali_data)
+		kfree(gnss_cali_data.cali_data);
+	if (gnss_efuse_data)
+		kfree(gnss_efuse_data);
+}
+
 int gnss_write_cali_data(void)
 {
 	GNSSCOMM_INFO("gnss write calidata, flag %d\n",
@@ -157,16 +174,14 @@ int gnss_backup_cali(void)
 		if (gnss_cali_data.cali_data != NULL) {
 			while (i--) {
 				sprdwcn_bus_direct_read(GNSS_CALI_ADDRESS,
-					gnss_cali_data.cali_data,
-					GNSS_CALI_DATA_SIZE);
+					gnss_cali_data.cali_data, GNSS_CALI_DATA_SIZE);
 				tempvalue = *(gnss_cali_data.cali_data);
-				GNSSCOMM_ERR(" cali %d time, value is 0x%x\n",
-							i, tempvalue);
+				GNSSCOMM_INFO(" cali %d time, value is 0x%x\n", i, tempvalue);
 				if (tempvalue != GNSS_CALI_DONE_FLAG) {
 					msleep(100);
 					continue;
 				}
-				GNSSCOMM_INFO(" cali success\n");
+				GNSSCOMM_INFO("-------------->cali success\n");
 				gnss_cali_data.cali_done = true;
 				break;
 			}
@@ -206,15 +221,20 @@ int gnss_backup_data(void)
 int gnss_boot_wait(void)
 {
 	int ret = -1;
-	u32 magic_value;
+	u32 *magic_value;
 	int i = 125;
 
+	magic_value = kzalloc(GNSS_BOOTSTATUS_SIZE, GFP_KERNEL);
+	if (magic_value == NULL) {
+		GNSSCOMM_ERR("%s, malloc fail\n", __func__);
+		return -1;
+	}
 	while (i--) {
-		sprdwcn_bus_direct_read(GNSS_BOOTSTATUS_ADDRESS, &magic_value,
+		sprdwcn_bus_direct_read(GNSS_BOOTSTATUS_ADDRESS, magic_value,
 					GNSS_BOOTSTATUS_SIZE);
 		GNSSCOMM_ERR("boot read %d time, value is 0x%x\n",
-					i, magic_value);
-		if (magic_value != GNSS_BOOTSTATUS_MAGIC) {
+					i, *magic_value);
+		if (*magic_value != GNSS_BOOTSTATUS_MAGIC) {
 			msleep(20);
 			continue;
 		}
@@ -222,7 +242,7 @@ int gnss_boot_wait(void)
 		GNSSCOMM_INFO("boot read success\n");
 		break;
 	}
-
+	kfree(magic_value);
 	return ret;
 }
 #else
@@ -441,7 +461,7 @@ static ssize_t gnss_dump_store(struct device *dev,
 		temp = wait_for_completion_timeout(&gnss_dump_complete,
 						   msecs_to_jiffies(6000));
 		GNSSCOMM_INFO("%s exit %d\n", __func__,
-			      jiffies_to_msecs(temp));
+				  jiffies_to_msecs(temp));
 		if (temp > 0)
 			ret = GNSS_DUMP_DATA_SUCCESS;
 		else
@@ -600,18 +620,18 @@ static struct sprdwcn_gnss_ops gnss_common_ctl_ops = {
 static int gnss_common_ctl_probe(struct platform_device *pdev)
 {
 	int ret;
+#ifdef CONFIG_WCN_PARSE_DTS
 	const struct of_device_id *of_id;
+#endif
 
-	GNSSCOMM_INFO("%s enter", __func__);
+	GNSSCOMM_ERR("%s enter", __func__);
 	gnss_common_ctl_dev.dev = &pdev->dev;
 
 	gnss_common_ctl_dev.gnss_status = GNSS_STATUS_POWEROFF;
-#ifndef CONFIG_SC2342_INTEG
 	gnss_common_ctl_dev.gnss_subsys = MARLIN_GNSS;
 	gnss_cali_init();
-#else
-	gnss_common_ctl_dev.gnss_subsys = WCN_GNSS;
-#endif
+
+#ifdef CONFIG_WCN_PARSE_DTS
 	/* considering backward compatibility, it's not use now  start */
 	of_id = of_match_node(gnss_common_ctl_of_match,
 		pdev->dev.of_node);
@@ -620,7 +640,12 @@ static int gnss_common_ctl_probe(struct platform_device *pdev)
 			"get gnss_common_ctl of device id failed!\n");
 		return -ENODEV;
 	}
+#endif
+#ifdef CONFIG_WCN_PARSE_DTS
 	gnss_common_ctl_dev.chip_ver = (unsigned long)(of_id->data);
+#else
+	gnss_common_ctl_dev.chip_ver = gnss_version;
+#endif
 	/* considering backward compatibility, it's not use now  end */
 
 	platform_set_drvdata(pdev, &gnss_common_ctl_dev);
@@ -655,6 +680,7 @@ static int gnss_common_ctl_probe(struct platform_device *pdev)
 
 static int gnss_common_ctl_remove(struct platform_device *pdev)
 {
+	gnss_cali_deinit();
 	wcn_gnss_ops_unregister();
 	sysfs_remove_group(&gnss_common_ctl_miscdev.this_device->kobj,
 				&gnss_common_ctl_group);
@@ -666,24 +692,28 @@ static struct platform_driver gnss_common_ctl_drv = {
 	.driver = {
 		   .name = "gnss_common_ctl",
 		   .owner = THIS_MODULE,
+#ifdef CONFIG_WCN_PARSE_DTS
 		   .of_match_table = of_match_ptr(gnss_common_ctl_of_match),
+#endif
 		   },
 	.probe = gnss_common_ctl_probe,
 	.remove = gnss_common_ctl_remove
 };
 
-static int __init gnss_common_ctl_init(void)
+int __init gnss_common_ctl_init(void)
 {
 	return platform_driver_register(&gnss_common_ctl_drv);
 }
 
-static void __exit gnss_common_ctl_exit(void)
+void __exit gnss_common_ctl_exit(void)
 {
 	platform_driver_unregister(&gnss_common_ctl_drv);
 }
 
+#if (0)
 module_init(gnss_common_ctl_init);
 module_exit(gnss_common_ctl_exit);
 MODULE_LICENSE("GPL v2");
 MODULE_DESCRIPTION("Spreadtrum Gnss Driver");
 MODULE_AUTHOR("Jun.an<jun.an@spreadtrum.com>");
+#endif
diff --git a/drivers/net/wireless/uwe5622/unisocwcn/platform/gnss/gnss_dbg.c b/drivers/net/wireless/uwe5622/unisocwcn/platform/gnss/gnss_dbg.c
index 5d2179933..b1c2b9408 100644
--- a/drivers/net/wireless/uwe5622/unisocwcn/platform/gnss/gnss_dbg.c
+++ b/drivers/net/wireless/uwe5622/unisocwcn/platform/gnss/gnss_dbg.c
@@ -109,7 +109,6 @@ static void gnss_ring_destroy(struct gnss_ring_t *pring)
 		}
 		GNSS_DEBUG("to free pring.");
 		kfree(pring);
-		pring = NULL;
 	}
 }
 
@@ -165,8 +164,8 @@ static int gnss_ring_read(struct gnss_ring_t *pring, char *buf, int len)
 
 	if (!buf || !pring || !len) {
 		GNSS_ERR
-		    ("Ring Read Failed, Param Error!,buf=%p,pring=%p,len=%d",
-		     buf, pring, len);
+			("Ring Read Failed, Param Error!,buf=%p,pring=%p,len=%d",
+			 buf, pring, len);
 		return -GNSS_ERR_BAD_PARAM;
 	}
 	mutex_lock(pring->plock);
@@ -209,8 +208,8 @@ static int gnss_ring_write(struct gnss_ring_t *pring, char *buf, int len)
 
 	if (!pring || !buf || !len) {
 		GNSS_ERR
-		    ("Ring Write Failed, Param Error!,buf=%p,pring=%p,len=%d",
-		     buf, pring, len);
+			("Ring Write Failed, Param Error!,buf=%p,pring=%p,len=%d",
+			 buf, pring, len);
 		return -GNSS_ERR_BAD_PARAM;
 	}
 	pstart = gnss_ring_start(pring);
@@ -292,7 +291,7 @@ static ssize_t gnss_dbg_read(struct file *filp,
 }
 
 static ssize_t gnss_dbg_write(struct file *filp, const char __user *buf,
-			      size_t count, loff_t *pos)
+				  size_t count, loff_t *pos)
 {
 	ssize_t len = 0;
 
@@ -318,7 +317,7 @@ static struct miscdevice gnss_dbg_device = {
 };
 
 static ssize_t gnss_slog_read(struct file *filp, char __user *buf,
-			      size_t count, loff_t *pos)
+				  size_t count, loff_t *pos)
 {
 	ssize_t len = 0;
 
@@ -328,7 +327,7 @@ static ssize_t gnss_slog_read(struct file *filp, char __user *buf,
 }
 
 static ssize_t gnss_slog_write(struct file *filp, const char __user *buf,
-			       size_t count, loff_t *pos)
+				   size_t count, loff_t *pos)
 {
 	return 0;
 }
@@ -373,12 +372,12 @@ static struct miscdevice gnss_slog_device = {
 	.fops = &gnss_slog_fops,
 };
 
-static int __init gnss_module_init(void)
+int __init gnss_module_init(void)
 {
 	int ret;
 
 	gnss_rx_ring = gnss_ring_init(GNSS_RX_RING_SIZE,
-				      gnss_memcpy_rd, gnss_memcpy_wr);
+					  gnss_memcpy_rd, gnss_memcpy_wr);
 	if (!gnss_rx_ring) {
 		GNSS_ERR("Ring malloc error.");
 		return -GNSS_ERR_MALLOC_FAIL;
@@ -406,7 +405,7 @@ static int __init gnss_module_init(void)
 	return ret;
 }
 
-static void __exit gnss_module_exit(void)
+void __exit gnss_module_exit(void)
 {
 	gnss_ring_destroy(gnss_rx_ring);
 	gnss_device_destroy();
@@ -414,6 +413,8 @@ static void __exit gnss_module_exit(void)
 	misc_deregister(&gnss_slog_device);
 }
 
+#if (0)
 module_init(gnss_module_init);
 module_exit(gnss_module_exit);
 MODULE_LICENSE("GPL");
+#endif
diff --git a/drivers/net/wireless/uwe5622/unisocwcn/platform/gnss/gnss_dump.c b/drivers/net/wireless/uwe5622/unisocwcn/platform/gnss/gnss_dump.c
index 44afbf6ec..48da71449 100644
--- a/drivers/net/wireless/uwe5622/unisocwcn/platform/gnss/gnss_dump.c
+++ b/drivers/net/wireless/uwe5622/unisocwcn/platform/gnss/gnss_dump.c
@@ -18,7 +18,9 @@
 #endif
 #include <linux/kthread.h>
 #include <linux/printk.h>
+#ifdef CONFIG_WCN_SIPC
 #include <linux/sipc.h>
+#endif
 #include <linux/slab.h>
 #include <linux/syscalls.h>
 #include <linux/unistd.h>
@@ -47,7 +49,11 @@ struct gnss_mem_dump {
 
 /* dump cp firmware firstly, wait for next adding */
 static struct gnss_mem_dump gnss_marlin3_dump[] = {
+#ifndef CONFIG_CHECK_DRIVER_BY_CHIPID
 	{GNSS_CP_START_ADDR, GNSS_FIRMWARE_MAX_SIZE}, /* gnss firmware code */
+#else
+	{0, 0},
+#endif
 	{GNSS_DRAM_ADDR, GNSS_DRAM_SIZE}, /* gnss dram */
 	{GNSS_TE_MEM, GNSS_TE_MEM_SIZE}, /* gnss te mem */
 	{GNSS_BASE_AON_APB, GNSS_BASE_AON_APB_SIZE}, /* aon apb */
@@ -99,6 +105,20 @@ static char gnss_dump_level; /* 0: default, all, 1: only data, pmu, aon */
 
 #endif
 
+
+static int wcn_chmod(char *path, char *mode)
+{
+	int result = 0;
+	char cmd_path[] = "/usr/bin/chmod";
+	char *cmd_argv[] = {cmd_path, mode, path, NULL};
+	char *cmd_envp[] = {"HOME=/", "PATH=/sbin:/bin:/usr/bin", NULL};
+
+	result = call_usermodehelper(cmd_path, cmd_argv, cmd_envp,
+		UMH_WAIT_PROC);
+
+	return result;
+}
+
 static int gnss_creat_gnss_dump_file(void)
 {
 	gnss_dump_file = filp_open(GNSS_MEMDUMP_PATH,
@@ -109,7 +129,7 @@ static int gnss_creat_gnss_dump_file(void)
 			__func__, gnss_dump_file);
 		return -1;
 	}
-	if (sys_chmod(GNSS_MEMDUMP_PATH, 0666) != 0)
+	if (wcn_chmod(GNSS_MEMDUMP_PATH, "0666") != 0)
 		GNSSDUMP_ERR("%s chmod	error\n", __func__);
 
 	return 0;
@@ -441,7 +461,7 @@ static int gnss_ext_hold_cpu(void)
 	}
 	temp = GNSS_ARCH_EB_REG_BYPASS;
 	ret = sprdwcn_bus_reg_write(GNSS_ARCH_EB_REG + GNSS_SET_OFFSET,
-				    &temp, 4);
+					&temp, 4);
 	if (ret < 0)
 		GNSSDUMP_ERR("%s write bypass reg error:%d\n", __func__, ret);
 
@@ -501,11 +521,11 @@ static int gnss_ext_dump_mem(void)
 	int i = 0;
 
 	GNSSDUMP_INFO("%s entry\n", __func__);
-#ifdef CONFIG_CHECK_DRIVER_BY_CHIPID
+// #ifdef CONFIG_CHECK_DRIVER_BY_CHIPID
 	/*update the two address after get chip type*/
 	gnss_marlin3_dump[0].address = GNSS_CP_START_ADDR;
 	gnss_marlin3_dump[0].length = GNSS_FIRMWARE_MAX_SIZE;
-#endif
+// #endif
 	gnss_ext_hold_cpu();
 	ret = gnss_creat_gnss_dump_file();
 	if (ret == -1) {
diff --git a/drivers/net/wireless/uwe5622/unisocwcn/platform/gnss/gnss_pmnotify_ctl.c b/drivers/net/wireless/uwe5622/unisocwcn/platform/gnss/gnss_pmnotify_ctl.c
index 84412f916..6bf78a2bd 100644
--- a/drivers/net/wireless/uwe5622/unisocwcn/platform/gnss/gnss_pmnotify_ctl.c
+++ b/drivers/net/wireless/uwe5622/unisocwcn/platform/gnss/gnss_pmnotify_ctl.c
@@ -32,6 +32,7 @@
 #include <linux/timer.h>
 #include <linux/types.h>
 #include <linux/uaccess.h>
+// #include <linux/wakelock.h>
 #include <linux/wait.h>
 #include <marlin_platform.h>
 
@@ -50,6 +51,8 @@ struct sprd_gnss {
 static struct sprd_gnss gnss_dev;
 static int gnss_delay_cancel;
 
+extern bool gnss_delay_ctl(void);
+
 static int gnss_pmnotify_ctl_open(struct inode *inode, struct file *filp)
 {
 	return 0;
@@ -117,7 +120,7 @@ static struct miscdevice gnss_pmnotify_ctl_device = {
 	.fops = &gnss_pmnotify_ctl_fops,
 };
 
-static int __init gnss_pmnotify_ctl_init(void)
+int __init gnss_pmnotify_ctl_init(void)
 {
 	int err = 0;
 
@@ -132,12 +135,14 @@ static int __init gnss_pmnotify_ctl_init(void)
 	return err;
 }
 
-static void __exit gnss_pmnotify_ctl_cleanup(void)
+void __exit gnss_pmnotify_ctl_cleanup(void)
 {
 	misc_deregister(&gnss_pmnotify_ctl_device);
 }
 
+#if (0)
 module_init(gnss_pmnotify_ctl_init);
 module_exit(gnss_pmnotify_ctl_cleanup);
 MODULE_LICENSE("GPL");
 MODULE_DESCRIPTION("sprd gnss pmnotify ctl driver");
+#endif
\ No newline at end of file
diff --git a/drivers/net/wireless/uwe5622/unisocwcn/platform/rdc_debug.c b/drivers/net/wireless/uwe5622/unisocwcn/platform/rdc_debug.c
index 015c9020e..86fa3b103 100644
--- a/drivers/net/wireless/uwe5622/unisocwcn/platform/rdc_debug.c
+++ b/drivers/net/wireless/uwe5622/unisocwcn/platform/rdc_debug.c
@@ -31,8 +31,6 @@
 #define UNISOC_DBG_PATH_DEFAULT "/data/unisoc_dbg"
 #endif
 
-MODULE_IMPORT_NS(VFS_internal_I_am_really_a_filesystem_and_am_NOT_a_driver);
-
 /* size of cp2 log files, default is 20M. */
 static unsigned int wcn_cp2_log_limit_size =
 	UNISOC_DBG_FILESIZE_DEFAULT * 1024 * 1024;
@@ -43,16 +41,14 @@ static unsigned int wcn_cp2_file_max_num = UNISOC_DBG_FILENUM_DEFAULT;
  */
 static unsigned int wcn_cp2_log_cover_old = 1;
 /* path of config file unisoc_cp2log_config.txt */
-#define WCN_DEBUG_CFG_MAX_PATH_NUM	3
+#define WCN_DEBUG_CFG_MAX_PATH_NUM	0
 static char *wcn_cp2_config_path[WCN_DEBUG_CFG_MAX_PATH_NUM] = {
-	"/etc/unisoc_cp2log_config.txt",
 	"/data/unisoc_cp2log_config.txt",
 	"/vendor/etc/wifi/unisoc_cp2log_config.txt"
 };
 /* path of cp2 log and mem files. */
-#define WCN_UNISOC_DBG_MAX_PATH_NUM	4
+#define WCN_UNISOC_DBG_MAX_PATH_NUM	0
 static char *wcn_unisoc_dbg_path[WCN_UNISOC_DBG_MAX_PATH_NUM] = {
-	"/etc",
 	UNISOC_DBG_PATH_DEFAULT,/* most of projects */
 	"/data",		/* amlogic s905w... */
 	"/mnt/UDISK"		/* allwinner r328... */
diff --git a/drivers/net/wireless/uwe5622/unisocwcn/platform/wcn_boot.c b/drivers/net/wireless/uwe5622/unisocwcn/platform/wcn_boot.c
index 57cf1a898..fca777c80 100644
--- a/drivers/net/wireless/uwe5622/unisocwcn/platform/wcn_boot.c
+++ b/drivers/net/wireless/uwe5622/unisocwcn/platform/wcn_boot.c
@@ -10,7 +10,7 @@
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  * GNU General Public License for more details.
  */
-
+#include <linux/syscalls.h>
 #include <linux/clk.h>
 #include <linux/delay.h>
 #include <linux/fs.h>
@@ -325,6 +325,8 @@ static struct regmap *reg_map;
 #define AFC_CALI_READ_FINISH 0x12121212
 #define WCN_AFC_CALI_PATH "/productinfo/wcn/tsx_bt_data.txt"
 
+#define BIT(nr) (1UL << (nr))
+
 #ifdef CONFIG_WCN_DOWNLOAD_FIRMWARE_FROM_HEX
 #define POWER_WQ_DELAYED_MS 0
 #else
@@ -1255,8 +1257,6 @@ static void marlin_release_firmware(struct marlin_firmware *mfirmware)
 	if (mfirmware) {
 		if (mfirmware->is_from_fs)
 			release_firmware(mfirmware->priv);
-		else
-			vfree(mfirmware->data);
 		kfree(mfirmware);
 	}
 }
@@ -1277,75 +1277,35 @@ void wcn_gnss_ops_unregister(void)
 {
 	gnss_ops = NULL;
 }
-
-static char *gnss_load_firmware_data(unsigned long int imag_size)
+static int gnss_download_firmware(void)
 {
 	char *buf;
+	int err;
+	unsigned int load_fw_cnt = 0;
 
-	MDBG_LOG("%s entry\n", __func__);
+	buf = marlin_dev->write_buffer;
+reload:
+	WCN_DEBUG("%s %d.load from %s\n", __func__, load_fw_cnt + 1, GNSS_FIRMWARE_PATH);
 	if (gnss_ops && (gnss_ops->set_file_path))
 		gnss_ops->set_file_path(&GNSS_FIRMWARE_PATH[0]);
 	else
 		WCN_ERR("%s gnss_ops set_file_path error\n", __func__);
-	buf = load_firmware_data_path(GNSS_FIRMWARE_PATH, 0, imag_size);
-
-	return buf;
-}
-
-static int gnss_download_from_partition(void)
-{
-	int err;
-	unsigned long int imgpack_size, img_size;
-	char *buffer = NULL;
-	char *temp = NULL;
-
-	img_size = imgpack_size =  GNSS_FIRMWARE_MAX_SIZE;
-	WCN_INFO("GNSS %s entry\n", __func__);
-	temp = buffer = gnss_load_firmware_data(imgpack_size);
-	if (!buffer) {
-		WCN_INFO("%s gnss buff is NULL\n", __func__);
-		return -1;
-	}
-
-	err = sprdwcn_bus_direct_write_dispack(GNSS_CP_START_ADDR, buffer,
-			img_size, PACKET_SIZE);
-	vfree(temp);
-	if (!err)
-		WCN_INFO("%s gnss download firmware finish\n", __func__);
 
-	return err;
-}
-
-static int gnss_download_firmware(void)
-{
-	const struct firmware *firmware;
-	char *buf;
-	int err;
-
-	if (marlin_dev->is_gnss_in_sysfs == 1) {
-		err = gnss_download_from_partition();
-		return err;
-	}
+	buf = load_firmware_data_path(GNSS_FIRMWARE_PATH, 0, GNSS_FIRMWARE_MAX_SIZE);
 
-	WCN_INFO("%s start from /system/etc/firmware/\n", __func__);
-	buf = marlin_dev->write_buffer;
-	err = request_firmware(&firmware, GNSS_FW_NAME, NULL);
-	if (err < 0) {
-		WCN_ERR("%s no find %s err:%d(ignore)\n",
-			__func__, GNSS_FW_NAME, err);
-		marlin_dev->is_gnss_in_sysfs = 1;
-		err = gnss_download_from_partition();
-
-		return err;
+	if (!buf) {
+		++load_fw_cnt;
+		if (load_fw_cnt < WCN_FW_MAX_PATH_NUM) {
+			sprintf(GNSS_FIRMWARE_PATH, "%s%s", \
+					wcn_fw_path[load_fw_cnt], GNSS_FW_NAME);
+			goto reload;
+		}
 	}
 
-	err = sprdwcn_bus_direct_write_dispack(GNSS_CP_START_ADDR,
-			firmware->data, firmware->size, PACKET_SIZE);
-	if (!err)
-		WCN_INFO("%s successfully through request_firmware!\n",
-				__func__);
-	release_firmware(firmware);
-	WCN_INFO("%s successfully through request_firmware!\n", __func__);
+	err = sprdwcn_bus_direct_write_dispack(GNSS_CP_START_ADDR, \
+			buf, GNSS_FIRMWARE_MAX_SIZE, PACKET_SIZE);
+	if (err)
+		WCN_INFO("%s download error\n", __func__);
 
 	return err;
 }
@@ -1413,14 +1373,15 @@ static int marlin_registsr_bt_wake(struct device *dev)
 {
 	struct device_node *np;
 	int bt_wake_host_gpio, ret = 0;
-	enum of_gpio_flags config;
+	struct gpio_config config;
 
 	np = of_find_compatible_node(NULL, NULL, "allwinner,sunxi-btlpm");
 	if (!np) {
 		WCN_ERR("dts node for bt_wake not found");
 		return -EINVAL;
 	}
-	bt_wake_host_gpio = of_get_named_gpio_flags(np, "bt_hostwake", 0, &config);
+	bt_wake_host_gpio = of_get_named_gpio_flags(np, "bt_hostwake", 0,
+		(enum of_gpio_flags *)&config);
 	if (!gpio_is_valid(bt_wake_host_gpio)) {
 		WCN_ERR("bt_hostwake irq is invalid: %d\n",
 			bt_wake_host_gpio);
@@ -1444,8 +1405,10 @@ static int marlin_registsr_bt_wake(struct device *dev)
 
 	marlin_dev->bt_wake_host_int_num = gpio_to_irq(bt_wake_host_gpio);
 
-	WCN_INFO("%s bt_hostwake gpio=%d intnum=%d\n",
-		 __func__, bt_wake_host_gpio,
+	WCN_INFO("%s bt_hostwake gpio=%d mul-sel=%d pull=%d "
+		 "drv_level=%d data=%d intnum=%d\n",
+		 __func__, config.gpio, config.mul_sel, config.pull,
+		 config.drv_level, config.data,
 		 marlin_dev->bt_wake_host_int_num);
 
 	ret = device_init_wakeup(dev, true);
@@ -1489,6 +1452,8 @@ static int marlin_parse_dt(struct platform_device *pdev)
 {
 #ifdef CONFIG_WCN_PARSE_DTS
 	struct device_node *np = pdev->dev.of_node;
+#elif defined CONFIG_AW_BOARD
+	struct device_node *np = NULL;
 #endif
 #ifdef CONFIG_WCN_PMIC
 	struct regmap *pmu_apb_gpr;
@@ -1507,7 +1472,7 @@ static int marlin_parse_dt(struct platform_device *pdev)
 
 	/* xtal-26m-clk-type has priority over than xtal-26m-clk-type-gpio */
 	ret = of_property_read_string(np, "xtal-26m-clk-type",
-				      (const char **)&buf);
+					  (const char **)&buf);
 	if (!ret) {
 		WCN_INFO("force config xtal 26m clk %s\n", buf);
 		if (!strncmp(buf, "TCXO", 4))
@@ -1655,7 +1620,7 @@ static int marlin_parse_dt(struct platform_device *pdev)
 #endif
 
 	ret = of_property_read_string(np, "unisoc,btwf-file-name",
-				      (const char **)&marlin_dev->btwf_path);
+					  (const char **)&marlin_dev->btwf_path);
 	if (!ret)
 		strcpy(BTWF_FIRMWARE_PATH, marlin_dev->btwf_path);
 	else
@@ -1664,7 +1629,7 @@ static int marlin_parse_dt(struct platform_device *pdev)
 	WCN_DEBUG("btwf firmware path is %s\n", BTWF_FIRMWARE_PATH);
 
 	ret = of_property_read_string(np, "unisoc,gnss-file-name",
-				      (const char **)&marlin_dev->gnss_path);
+					  (const char **)&marlin_dev->gnss_path);
 	if (!ret) {
 		WCN_INFO("gnss firmware name:%s\n", marlin_dev->gnss_path);
 		strcpy(GNSS_FIRMWARE_PATH, marlin_dev->gnss_path);
@@ -1672,6 +1637,8 @@ static int marlin_parse_dt(struct platform_device *pdev)
 #else
 	sprintf(BTWF_FIRMWARE_PATH, "%s%s", wcn_fw_path[0], WCN_FW_NAME);
 	WCN_DEBUG("btwf firmware path is %s\n", BTWF_FIRMWARE_PATH);
+	sprintf(GNSS_FIRMWARE_PATH, "%s%s", wcn_fw_path[0], GNSS_FW_NAME);
+	WCN_DEBUG("gnss firmware path is %s\n", GNSS_FIRMWARE_PATH);
 #endif /* end of CONFIG_WCN_PARSE_DTS */
 
 #ifdef CONFIG_WCN_PARSE_DTS
@@ -1823,7 +1790,7 @@ static int marlin_avdd18_dcxo_enable(bool enable)
 		if (regulator_is_enabled(marlin_dev->dcxo18))
 			return 0;
 		regulator_set_voltage(marlin_dev->dcxo18,
-					      1800000, 1800000);
+						  1800000, 1800000);
 		ret = regulator_enable(marlin_dev->dcxo18);
 		if (ret)
 			WCN_ERR("fail to enable avdd18_dcxo\n");
@@ -1852,7 +1819,7 @@ static int marlin_digital_power_enable(bool enable)
 		/* gpio_direction_output(marlin_dev->reset, 0); */
 
 		regulator_set_voltage(marlin_dev->dvdd12,
-					      1200000, 1200000);
+						  1200000, 1200000);
 		ret = regulator_enable(marlin_dev->dvdd12);
 	} else {
 		if (regulator_is_enabled(marlin_dev->dvdd12))
@@ -1949,7 +1916,7 @@ void marlin_read_cali_data(void)
 		WCN_INFO("marlin2 cp_clk_wait_val is modifyed 0x%x\n",
 					cp_clk_wait_val);
 		err = sprdwcn_bus_reg_write(marlin2_clk_wait_reg,
-					       &cp_clk_wait_val, 4);
+						   &cp_clk_wait_val, 4);
 		if (err < 0)
 			WCN_ERR("marlin2 write 26M error:%d\n", err);
 	}
@@ -2059,10 +2026,18 @@ static void marlin_send_sdio_config_to_cp_vendor(void)
 		sdio_cfg.cfg.sdio_irq_type = 1;
 		WCN_INFO("sdio_config irq:[inband]\n");
 	} else {
-#if defined(CONFIG_AML_BOARD)
-		sdio_cfg.cfg.sdio_irq_type = 3;
-		WCN_INFO("sdio_config sdio_irq:[gpio13]\n");
+#ifdef CONFIG_CUSTOMIZE_SDIO_IRQ_TYPE
+		sdio_cfg.cfg.sdio_irq_type = CONFIG_CUSTOMIZE_SDIO_IRQ_TYPE;
+		if (sdio_cfg.cfg.sdio_irq_type == 0)
+			WCN_INFO("sdio_config sdio_irq:[gpio1]\n");
+		else if (sdio_cfg.cfg.sdio_irq_type == 2)
+			WCN_INFO("sdio_config sdio_irq:[pubint]\n");
+		else if (sdio_cfg.cfg.sdio_irq_type == 3)
+			WCN_INFO("sdio_config sdio_irq:[esmd3]\n");
+		else
+			WCN_INFO("sdio_config sdio_irq:[error]\n");
 #else
+		sdio_cfg.cfg.sdio_irq_type = 0;
 		WCN_INFO("sdio_config sdio_irq:[gpio1]\n");
 #endif
 	}
@@ -2458,6 +2433,10 @@ static int check_cp_ready(void)
 	int ret = 0;
 	int i = 0;
 
+#ifdef CONFIG_WCN_USB
+	return sprdwcn_check_cp_ready(SYNC_ADDR, 3000);
+#endif
+
 	do {
 		i++;
 		ret = sprdwcn_bus_direct_read(SYNC_ADDR,
@@ -2709,17 +2688,6 @@ void marlin_chip_en(bool enable, bool reset)
 }
 EXPORT_SYMBOL_GPL(marlin_chip_en);
 
-static int marlin_set_power(int subsys, int val);
-
-void marlin_cp2_reset(void)
-{
-	WCN_INFO("[%s], DO BSP RESET\n", __func__);
-	marlin_dev->first_power_on_flag = 0;
-	marlin_set_power(MARLIN_WIFI, false);
-	marlin_set_power(MARLIN_BLUETOOTH, false);
-}
-EXPORT_SYMBOL_GPL(marlin_cp2_reset);
-
 int set_cp_mem_status(int subsys, int val)
 {
 	int ret;
@@ -2848,19 +2816,21 @@ static void power_state_notify_or_not(int subsys, int poweron)
 	}
 }
 
-static int marlin_scan_finish(void)
+static void marlin_scan_finish(void)
 {
 	WCN_INFO("marlin_scan_finish!\n");
 	complete(&marlin_dev->carddetect_done);
-	return 0;
 }
 
 int find_firmware_path(void)
 {
 	int ret;
 	int pre_len;
-
+#ifdef CONFIG_WCN_GNSS
+	if ((strlen(BTWF_FIRMWARE_PATH) != 0) || (strlen(GNSS_FIRMWARE_PATH) != 0))
+#else
 	if (strlen(BTWF_FIRMWARE_PATH) != 0)
+#endif
 		return 0;
 
 	ret = parse_firmware_path(BTWF_FIRMWARE_PATH);
@@ -2870,11 +2840,8 @@ int find_firmware_path(void)
 	}
 	WCN_INFO("BTWF path is %s\n", BTWF_FIRMWARE_PATH);
 	pre_len = strlen(BTWF_FIRMWARE_PATH) - strlen("wcnmodem");
-	memcpy(GNSS_FIRMWARE_PATH,
-		BTWF_FIRMWARE_PATH,
-		strlen(BTWF_FIRMWARE_PATH));
-	memcpy(&GNSS_FIRMWARE_PATH[pre_len], "gnssmodem",
-		strlen("gnssmodem"));
+	memcpy(GNSS_FIRMWARE_PATH, BTWF_FIRMWARE_PATH, strlen(BTWF_FIRMWARE_PATH));
+	memcpy(&GNSS_FIRMWARE_PATH[pre_len], "gnssmodem", strlen("gnssmodem"));
 	GNSS_FIRMWARE_PATH[pre_len + strlen("gnssmodem")] = '\0';
 	WCN_INFO("GNSS path is %s\n", GNSS_FIRMWARE_PATH);
 
@@ -2925,7 +2892,7 @@ static void pre_gnss_download_firmware(struct work_struct *work)
 
 }
 
-#ifdef CONFIG_WCN_USB
+#if defined CONFIG_WCN_USB && defined CONFIG_SYS_REBOOT_NOT_REPOWER_USBCHIP
 static unsigned char fdl_hex_buf[] = {
 #include "../fw/usb_fdl.bin.hex"
 };
@@ -2993,6 +2960,7 @@ static void btwifi_download_fdl_firmware(void)
 static void pre_btwifi_download_sdio(struct work_struct *work)
 {
 #ifdef CONFIG_WCN_USB
+#ifdef CONFIG_SYS_REBOOT_NOT_REPOWER_USBCHIP
 	/*
 	 * Fix Bug 1349945.
 	 * Because the usb vbus can't be controlled on some platforms,
@@ -3006,7 +2974,7 @@ static void pre_btwifi_download_sdio(struct work_struct *work)
 	 * again and normal boot system.
 	 */
 	btwifi_download_fdl_firmware();
-
+#endif
 	marlin_firmware_download_start_usb();
 #endif
 	wcn_get_chip_name();
@@ -3071,7 +3039,7 @@ void wifipa_enable(int enable)
 			if (regulator_is_enabled(marlin_dev->avdd33))
 				return;
 			regulator_set_voltage(marlin_dev->avdd33,
-					      3300000, 3300000);
+						  3300000, 3300000);
 			ret = regulator_enable(marlin_dev->avdd33);
 			if (ret)
 				WCN_ERR("fail to enable wifipa\n");
@@ -3624,10 +3592,10 @@ int marlin_get_module_status(void)
 		test_bit(MARLIN_FM, &marlin_dev->power_state) ||
 		test_bit(MARLIN_WIFI, &marlin_dev->power_state) ||
 		test_bit(MARLIN_MDBG, &marlin_dev->power_state) ||
+		test_bit(MARLIN_GNSS, &marlin_dev->power_state) ||
 		test_bit(WCN_AUTO, &marlin_dev->power_state))
 		return 1;
-	else
-		return 0;
+	return 0;
 }
 EXPORT_SYMBOL_GPL(marlin_get_module_status);
 
@@ -3643,11 +3611,9 @@ EXPORT_SYMBOL_GPL(is_first_power_on);
 int cali_ini_need_download(enum marlin_sub_sys subsys)
 {
 	unsigned int pd_wifi_st = 0;
+
 #ifdef CONFIG_AW_BOARD
-/*
- * Fix SPCSS00757820, wifi&bt on/off frequently & fast,
- * need download ini but don't download
- */
+	/*FIX SPCSS00757820, wifi-bt on/off frequently & quickly, ini need download but not*/
 	return 1;
 #endif
 
@@ -3873,7 +3839,7 @@ static int marlin_probe(struct platform_device *pdev)
 	INIT_DELAYED_WORK(&marlin_dev->power_wq, marlin_power_wq);
 #if 0
 	schedule_delayed_work(&marlin_dev->power_wq,
-			      msecs_to_jiffies(POWER_WQ_DELAYED_MS));
+				  msecs_to_jiffies(POWER_WQ_DELAYED_MS));
 #endif
 
 #ifdef CONFIG_WCN_PMIC
@@ -4014,6 +3980,7 @@ static void marlin_reset_notify_init(void)
 */
 int marlin_reset_notify_call(enum marlin_cp2_status sts)
 {
+
 	int i = 0;
 	for (i = 0; i < MARLIN_ALL; i++) {
 		if (NULL != marlin_reset_notifiers[i].head)
@@ -4085,14 +4052,41 @@ static struct platform_device uwe_device = {
 		.release = uwe_release,
 	}
 };
+
+#ifdef CONFIG_WCN_GNSS
+static void gnss_common_ctl_release(struct device *dev)
+{
+	WCN_INFO("[%s]enter\n", __func__);
+}
+static struct platform_device gnss_common_ctl_device = {
+	.name = "gnss_common_ctl",
+	.dev = {
+		.release = gnss_common_ctl_release,
+	}
+};
+#endif
 #endif
 
+#ifdef CONFIG_WCN_GNSS
+extern int __init gnss_common_ctl_init(void);
+extern void __exit gnss_common_ctl_exit(void);
+extern int __init gnss_pmnotify_ctl_init(void);
+extern void __exit gnss_pmnotify_ctl_cleanup(void);
+extern int __init gnss_module_init(void);
+extern void __exit gnss_module_exit(void);
+#endif
 static int __init marlin_init(void)
 {
 	WCN_INFO("marlin_init entry!\n");
 
 #ifndef CONFIG_WCN_PARSE_DTS
 	platform_device_register(&uwe_device);
+#endif
+#ifdef CONFIG_WCN_GNSS
+	platform_device_register(&gnss_common_ctl_device);
+	gnss_common_ctl_init();
+	gnss_pmnotify_ctl_init();
+	gnss_module_init();
 #endif
 	return platform_driver_register(&marlin_driver);
 }
@@ -4108,6 +4102,12 @@ static void __exit marlin_exit(void)
 
 #ifndef CONFIG_WCN_PARSE_DTS
 	platform_device_unregister(&uwe_device);
+#endif
+#ifdef CONFIG_WCN_GNSS
+	gnss_common_ctl_exit();
+	gnss_pmnotify_ctl_cleanup();
+	gnss_module_exit();
+	platform_device_register(&gnss_common_ctl_device);
 #endif
 	platform_driver_unregister(&marlin_driver);
 
diff --git a/drivers/net/wireless/uwe5622/unisocwcn/platform/wcn_op.h b/drivers/net/wireless/uwe5622/unisocwcn/platform/wcn_op.h
index 391280910..7121823e7 100644
--- a/drivers/net/wireless/uwe5622/unisocwcn/platform/wcn_op.h
+++ b/drivers/net/wireless/uwe5622/unisocwcn/platform/wcn_op.h
@@ -1,12 +1,6 @@
 #ifndef __WCN_OP_H__
 #define __WCN_OP_H__
 
-#if defined(CONFIG_STACKPROTECTOR) && defined(CONFIG_STACKPROTECTOR_PER_TASK)
-#include <linux/stackprotector.h>
-unsigned long __stack_chk_guard __read_mostly;
-EXPORT_SYMBOL(__stack_chk_guard);
-#endif
-
 int wcn_op_init(void);
 void wcn_op_exit(void);
 
diff --git a/drivers/net/wireless/uwe5622/unisocwcn/platform/wcn_parn_parser.c b/drivers/net/wireless/uwe5622/unisocwcn/platform/wcn_parn_parser.c
index aea7d6d0f..e3eeab46d 100644
--- a/drivers/net/wireless/uwe5622/unisocwcn/platform/wcn_parn_parser.c
+++ b/drivers/net/wireless/uwe5622/unisocwcn/platform/wcn_parn_parser.c
@@ -48,9 +48,6 @@
 #define CONF_DELIMITERS " =\n\r\t"
 #define CONF_VALUES_DELIMITERS "=\n\r\t"
 #define CONF_MAX_LINE_LEN 255
-
-MODULE_IMPORT_NS(VFS_internal_I_am_really_a_filesystem_and_am_NOT_a_driver);
-
 static const char *prefix = "fstab.s";
 static char fstab_name[128];
 static char fstab_dir[FSTAB_PATH_NUM][32] = {
diff --git a/drivers/net/wireless/uwe5622/unisocwcn/platform/wcn_procfs.c b/drivers/net/wireless/uwe5622/unisocwcn/platform/wcn_procfs.c
index 2edb7903d..8be7131e1 100644
--- a/drivers/net/wireless/uwe5622/unisocwcn/platform/wcn_procfs.c
+++ b/drivers/net/wireless/uwe5622/unisocwcn/platform/wcn_procfs.c
@@ -23,7 +23,7 @@
 #include <linux/seq_file.h>
 #include <linux/version.h>
 #include <linux/wait.h>
-#if KERNEL_VERSION(4, 14, 0) <= LINUX_VERSION_CODE
+#if KERNEL_VERSION(4, 11, 0) <= LINUX_VERSION_CODE
 #include <linux/sched/clock.h>
 #endif
 #include <wcn_bus.h>
@@ -38,7 +38,7 @@
 #include "marlin_platform.h"
 
 
-#define CONFIG_CP2_ASSERT       (0)
+#define CONFIG_CP2_ASSERT       (1)
 
 u32 wcn_print_level = WCN_DEBUG_OFF;
 
@@ -94,12 +94,12 @@ void mdbg_assert_interface(char *str)
 	stop_loopcheck();
 #endif
 
+#if (CONFIG_CP2_ASSERT)
 	memset(mdbg_proc->assert.buf, 0, MDBG_ASSERT_SIZE);
 	strncpy(mdbg_proc->assert.buf, str, len);
 	WCN_INFO("mdbg_assert_interface:%s\n",
 		(char *)(mdbg_proc->assert.buf));
 
-#if (CONFIG_CP2_ASSERT)
 	sprdwcn_bus_set_carddump_status(true);
 #ifndef CONFIG_WCND
 	/* wcn_hold_cpu(); */
@@ -113,9 +113,8 @@ void mdbg_assert_interface(char *str)
 #else
 	WCN_ERR("%s,%s reset & notify...\n", __func__, str);
 	marlin_reset_notify_call(MARLIN_CP2_STS_ASSERTED);
-	marlin_cp2_reset();
 	msleep(1000);
-	// marlin_reset_notify_call(MARLIN_CP2_STS_READY);
+	marlin_reset_notify_call(MARLIN_CP2_STS_READY);
 #endif
 
 }
@@ -142,6 +141,7 @@ int mdbg_assert_read(int channel, struct mbuf_t *head,
 		     struct mbuf_t *tail, int num)
 {
 	unsigned int data_length;
+#if (CONFIG_CP2_ASSERT)
 	data_length = mdbg_mbuf_get_datalength(head);
 	if (data_length > MDBG_ASSERT_SIZE) {
 		WCN_ERR("assert data len:%d,beyond max read:%d",
@@ -154,7 +154,6 @@ int mdbg_assert_read(int channel, struct mbuf_t *head,
 	mdbg_proc->assert.rcv_len = data_length;
 	WCN_INFO("mdbg_assert_read:%s,data length %d\n",
 		(char *)(mdbg_proc->assert.buf), data_length);
-#if (CONFIG_CP2_ASSERT)
 #ifndef CONFIG_WCND
 	sprdwcn_bus_set_carddump_status(true);
 	/* wcn_hold_cpu(); */
@@ -173,9 +172,8 @@ int mdbg_assert_read(int channel, struct mbuf_t *head,
 #endif
 		WCN_ERR("chip reset & notify every subsystem...\n");
 		marlin_reset_notify_call(MARLIN_CP2_STS_ASSERTED);
-		marlin_cp2_reset();
 		msleep(1000);
-		// marlin_reset_notify_call(MARLIN_CP2_STS_READY);
+		marlin_reset_notify_call(MARLIN_CP2_STS_READY);
 #endif
 	return 0;
 }
@@ -239,7 +237,7 @@ int mdbg_at_cmd_read(int channel, struct mbuf_t *head,
 	default:
 		memset(mdbg_proc->at_cmd.buf, 0, MDBG_AT_CMD_SIZE);
 		memcpy(mdbg_proc->at_cmd.buf, head->buf + PUB_HEAD_RSV,
-		       data_length);
+			   data_length);
 		mdbg_proc->at_cmd.rcv_len = data_length;
 		WCN_INFO("WCND at cmd read:%s\n",
 			(char *)(mdbg_proc->at_cmd.buf));
@@ -315,7 +313,7 @@ static int loopcheck_prepare_buf(int chn, struct mbuf_t **head,
 }
 
 static int at_cmd_prepare_buf(int chn, struct mbuf_t **head,
-			      struct mbuf_t **tail, int *num)
+				  struct mbuf_t **tail, int *num)
 {
 	int ret;
 
@@ -326,7 +324,7 @@ static int at_cmd_prepare_buf(int chn, struct mbuf_t **head,
 }
 
 static int assert_prepare_buf(int chn, struct mbuf_t **head,
-			      struct mbuf_t **tail, int *num)
+				  struct mbuf_t **tail, int *num)
 {
 	int ret;
 
@@ -420,13 +418,23 @@ static int mdbg_snap_shoot_seq_open(struct inode *inode, struct file *file)
 	return seq_open(file, &mdbg_snap_shoot_seq_ops);
 }
 
+#if KERNEL_VERSION(5, 6, 0) <= LINUX_VERSION_CODE
 static const struct proc_ops mdbg_snap_shoot_seq_fops = {
 	.proc_open = mdbg_snap_shoot_seq_open,
 	.proc_read = seq_read,
 	.proc_write = mdbg_snap_shoot_seq_write,
 	.proc_lseek = seq_lseek,
-	.proc_release = seq_release
+	.proc_release = seq_release,
 };
+#else
+static const struct file_operations mdbg_snap_shoot_seq_fops = {
+	.open = mdbg_snap_shoot_seq_open,
+	.read = seq_read,
+	.write = mdbg_snap_shoot_seq_write,
+	.llseek = seq_lseek,
+	.release = seq_release
+};
+#endif
 
 static int mdbg_proc_open(struct inode *inode, struct file *filp)
 {
@@ -752,6 +760,12 @@ static ssize_t mdbg_proc_write(struct file *filp,
 		return count;
 	}
 
+	if (strncmp(mdbg_proc->write_buf, "startgps", 7) == 0) {
+		start_marlin(MARLIN_GNSS);
+		return count;
+	}
+
+
 
 	/* unit of loglimitsize is MByte. */
 	if (strncmp(mdbg_proc->write_buf, "loglimitsize=",
@@ -1007,13 +1021,23 @@ static unsigned int mdbg_proc_poll(struct file *filp, poll_table *wait)
 	return mask;
 }
 
+#if KERNEL_VERSION(5, 6, 0) <= LINUX_VERSION_CODE
 static const struct proc_ops mdbg_proc_fops = {
-	.proc_open		= mdbg_proc_open,
-	.proc_release	= mdbg_proc_release,
-	.proc_read		= mdbg_proc_read,
-	.proc_write		= mdbg_proc_write,
-	.proc_poll		= mdbg_proc_poll,
+	.proc_open = mdbg_proc_open,
+	.proc_release = mdbg_proc_release,
+	.proc_read = mdbg_proc_read,
+	.proc_write = mdbg_proc_write,
+	.proc_poll = mdbg_proc_poll,
 };
+#else
+static const struct file_operations mdbg_proc_fops = {
+	.open		= mdbg_proc_open,
+	.release	= mdbg_proc_release,
+	.read		= mdbg_proc_read,
+	.write		= mdbg_proc_write,
+	.poll		= mdbg_proc_poll,
+};
+#endif
 
 int mdbg_memory_alloc(void)
 {
diff --git a/drivers/net/wireless/uwe5622/unisocwcn/platform/wcn_txrx.c b/drivers/net/wireless/uwe5622/unisocwcn/platform/wcn_txrx.c
index 8b19305ca..2fd7f3988 100644
--- a/drivers/net/wireless/uwe5622/unisocwcn/platform/wcn_txrx.c
+++ b/drivers/net/wireless/uwe5622/unisocwcn/platform/wcn_txrx.c
@@ -114,7 +114,7 @@ static long int mdbg_comm_write(char *buf,
 	str = strstr(send_buf + PUB_HEAD_RSV, SMP_HEAD_STR);
 	if (!str)
 		str = strstr(send_buf + PUB_HEAD_RSV + ARMLOG_HEAD,
-			     SMP_HEAD_STR);
+				 SMP_HEAD_STR);
 
 	if (str) {
 		int ret;
@@ -160,7 +160,7 @@ static void mdbg_ring_rx_task(struct work_struct *work)
 
 	spin_lock_bh(&ring_dev->rw_lock);
 	rx = list_first_entry_or_null(&ring_dev->rx_head,
-				      struct ring_rx_data, entry);
+					  struct ring_rx_data, entry);
 	if (rx) {
 		list_del(&rx->entry);
 	} else {
@@ -188,7 +188,7 @@ static void mdbg_ring_rx_task(struct work_struct *work)
 #endif
 	}
 	sprdwcn_bus_push_list(mdbg_ringc_ops.channel,
-			      rx->head, rx->tail, rx->num);
+				  rx->head, rx->tail, rx->num);
 	wake_up_log_wait();
 	kfree(rx);
 }
@@ -226,9 +226,10 @@ long int mdbg_send(char *buf, long int len, unsigned int subtype)
 	long int sent_size = 0;
 
 	WCN_DEBUG("BYTE MODE");
-	__pm_stay_awake(ring_dev->rw_ws);
+
+	__pm_stay_awake(ring_dev->rw_wake_lock);
 	sent_size = mdbg_comm_write(buf, len, subtype);
-	__pm_relax(ring_dev->rw_ws);
+	__pm_relax(ring_dev->rw_wake_lock);
 
 	return sent_size;
 }
@@ -240,7 +241,7 @@ long int mdbg_receive(void *buf, long int len)
 }
 
 int mdbg_tx_cb(int channel, struct mbuf_t *head,
-	       struct mbuf_t *tail, int num)
+		   struct mbuf_t *tail, int num)
 {
 #ifndef CONFIG_WCN_PCIE
 	struct mbuf_t *mbuf_node;
@@ -301,8 +302,10 @@ int mdbg_ring_init(void)
 		return -MDBG_ERR_MALLOC_FAIL;
 	}
 
-	ring_dev->rw_ws = wakeup_source_create("mdbg_wake_lock");
-	wakeup_source_add(ring_dev->rw_ws);
+	/*wakeup_source pointer*/
+	ring_dev->rw_wake_lock = wakeup_source_create("mdbg_wake_lock");
+	wakeup_source_add(ring_dev->rw_wake_lock);
+
 	spin_lock_init(&ring_dev->rw_lock);
 	mutex_init(&ring_dev->mdbg_read_mutex);
 	INIT_LIST_HEAD(&ring_dev->rx_head);
@@ -328,8 +331,11 @@ void mdbg_ring_remove(void)
 		kfree(pos);
 	}
 	mutex_destroy(&ring_dev->mdbg_read_mutex);
-	wakeup_source_remove(ring_dev->rw_ws);
-	wakeup_source_destroy(ring_dev->rw_ws);
+
+	/*wakeup_source pointer*/
+	wakeup_source_remove(ring_dev->rw_wake_lock);
+	wakeup_source_destroy(ring_dev->rw_wake_lock);
+
 	mdbg_ring_destroy(ring_dev->ring);
 	mdbg_dev->ring_dev = NULL;
 	kfree(ring_dev);
diff --git a/drivers/net/wireless/uwe5622/unisocwcn/platform/wcn_txrx.h b/drivers/net/wireless/uwe5622/unisocwcn/platform/wcn_txrx.h
index 9e74b7176..3e1dc9f42 100644
--- a/drivers/net/wireless/uwe5622/unisocwcn/platform/wcn_txrx.h
+++ b/drivers/net/wireless/uwe5622/unisocwcn/platform/wcn_txrx.h
@@ -18,8 +18,6 @@
 #include <linux/types.h>
 #include <linux/version.h>
 #include <linux/wait.h>
-#if KERNEL_VERSION(4, 14, 0) <= LINUX_VERSION_CODE
-#endif
 
 #include "mdbg_type.h"
 #include <wcn_bus.h>
@@ -49,7 +47,9 @@ struct ring_rx_data {
 
 struct ring_device {
 	struct mdbg_ring_t	*ring;
-	struct wakeup_source	*rw_ws;
+	/*wakeup_source pointer*/
+	struct wakeup_source	*rw_wake_lock;
+
 	spinlock_t		rw_lock;
 	struct mutex mdbg_read_mutex;
 	struct list_head	rx_head;
diff --git a/drivers/net/wireless/uwe5622/unisocwcn/sdio/sdiohal.h b/drivers/net/wireless/uwe5622/unisocwcn/sdio/sdiohal.h
index 55eda7326..c26bfb325 100644
--- a/drivers/net/wireless/uwe5622/unisocwcn/sdio/sdiohal.h
+++ b/drivers/net/wireless/uwe5622/unisocwcn/sdio/sdiohal.h
@@ -15,7 +15,7 @@
 #endif
 
 #include <linux/version.h>
-#if KERNEL_VERSION(4, 14, 0) <= LINUX_VERSION_CODE
+#if KERNEL_VERSION(4, 11, 0) <= LINUX_VERSION_CODE
 #include <uapi/linux/sched/types.h>
 #else
 #include <linux/sched.h>
@@ -62,7 +62,7 @@ extern long int sdiohal_log_level;
 	} while (0)
 #define sdiohal_pr_perf(fmt, args...) \
 	do { if (sdiohal_log_level & SDIOHAL_PERF_LEVEL) \
-		pr_info(fmt, ## args); \
+		trace_printk(fmt, ## args); \
 	} while (0)
 #else
 #define sdiohal_normal(fmt, args...)
@@ -301,8 +301,10 @@ struct sdiohal_data_t {
 	struct task_struct *rx_thread;
 	struct completion tx_completed;
 	struct completion rx_completed;
+	/*wakeup_source pointer*/
 	struct wakeup_source *tx_ws;
 	struct wakeup_source *rx_ws;
+
 	atomic_t tx_wake_flag;
 	atomic_t rx_wake_flag;
 #ifdef CONFIG_WCN_SLP
@@ -369,7 +371,9 @@ struct sdiohal_data_t {
 	struct timespec tm_begin_irq;
 	struct timespec tm_end_irq;
 
+	/*wakeup_source pointer*/
 	struct wakeup_source *scan_ws;
+
 	struct completion scan_done;
 	struct completion remove_done;
 	unsigned int sdio_int_reg;
@@ -456,7 +460,7 @@ struct sdiohal_list_t *sdiohal_get_rx_mbuf_list(int num);
 struct sdiohal_list_t *sdiohal_get_rx_mbuf_node(int num);
 int sdiohal_rx_list_dispatch(void);
 struct sdiohal_list_t *sdiohal_get_rx_channel_list(int channel);
-void *sdiohal_get_rx_free_buf(unsigned int *alloc_size);
+void *sdiohal_get_rx_free_buf(unsigned int *alloc_size, unsigned int read_len);
 void sdiohal_tx_init_retrybuf(void);
 int sdiohal_misc_init(void);
 void sdiohal_misc_deinit(void);
diff --git a/drivers/net/wireless/uwe5622/unisocwcn/sdio/sdiohal_common.c b/drivers/net/wireless/uwe5622/unisocwcn/sdio/sdiohal_common.c
index 8896272a9..8dbf21437 100644
--- a/drivers/net/wireless/uwe5622/unisocwcn/sdio/sdiohal_common.c
+++ b/drivers/net/wireless/uwe5622/unisocwcn/sdio/sdiohal_common.c
@@ -3,7 +3,7 @@
 #include "sdiohal.h"
 
 void sdiohal_print_list_data(int channel, struct sdiohal_list_t *data_list,
-			     const char *func, int loglevel)
+				 const char *func, int loglevel)
 {
 	struct sdiohal_data_t *p_data = sdiohal_get_data();
 	struct mbuf_t *node;
@@ -13,7 +13,7 @@ void sdiohal_print_list_data(int channel, struct sdiohal_list_t *data_list,
 
 	if (!data_list || !data_list->mbuf_head) {
 		sdiohal_err("%s, data_list:%p,data_list->mbuf_head:%p",
-			    __func__, data_list, data_list->mbuf_head);
+				__func__, data_list, data_list->mbuf_head);
 		WARN_ON(1);
 		return;
 	}
@@ -25,11 +25,11 @@ void sdiohal_print_list_data(int channel, struct sdiohal_list_t *data_list,
 			break;
 		print_len = node->len + SDIO_PUB_HEADER_SIZE;
 		if ((channel == p_data->printlog_txchn) ||
-		    (channel == p_data->printlog_rxchn)) {
+			(channel == p_data->printlog_rxchn)) {
 			print_hex_dump(KERN_WARNING, print_str,
-				       DUMP_PREFIX_NONE, 16, 1, node->buf,
-				       (print_len < SDIOHAL_PRINTF_LEN ?
-				       print_len : SDIOHAL_PRINTF_LEN), true);
+					   DUMP_PREFIX_NONE, 16, 1, node->buf,
+					   (print_len < SDIOHAL_PRINTF_LEN ?
+					   print_len : SDIOHAL_PRINTF_LEN), true);
 		} else {
 			sdiohal_pr_data(KERN_WARNING, print_str,
 					DUMP_PREFIX_NONE, 16, 1, node->buf,
@@ -41,8 +41,8 @@ void sdiohal_print_list_data(int channel, struct sdiohal_list_t *data_list,
 }
 
 void sdiohal_print_mbuf_data(int channel, struct mbuf_t *head,
-			     struct mbuf_t *tail, int num, const char *func,
-			     int loglevel)
+				 struct mbuf_t *tail, int num, const char *func,
+				 int loglevel)
 {
 	struct sdiohal_data_t *p_data = sdiohal_get_data();
 	struct mbuf_t *node;
@@ -63,11 +63,11 @@ void sdiohal_print_mbuf_data(int channel, struct mbuf_t *head,
 			break;
 		print_len = node->len + SDIO_PUB_HEADER_SIZE;
 		if ((channel == p_data->printlog_txchn) ||
-		    (channel == p_data->printlog_rxchn)) {
+			(channel == p_data->printlog_rxchn)) {
 			print_hex_dump(KERN_WARNING, print_str,
-				       DUMP_PREFIX_NONE, 16, 1, node->buf,
-				       (print_len < SDIOHAL_PRINTF_LEN ?
-				       print_len : SDIOHAL_PRINTF_LEN), true);
+					   DUMP_PREFIX_NONE, 16, 1, node->buf,
+					   (print_len < SDIOHAL_PRINTF_LEN ?
+					   print_len : SDIOHAL_PRINTF_LEN), true);
 		} else {
 			sdiohal_pr_data(KERN_WARNING, print_str,
 					DUMP_PREFIX_NONE, 16, 1, node->buf,
@@ -107,8 +107,8 @@ void sdiohal_list_check(struct sdiohal_list_t *data_list,
 }
 
 void sdiohal_mbuf_list_check(int channel, struct mbuf_t *head,
-			     struct mbuf_t *tail, int num,
-			     const char *func, bool dir, int loglevel)
+				 struct mbuf_t *tail, int num,
+				 const char *func, bool dir, int loglevel)
 {
 	struct mbuf_t *node;
 	int i;
@@ -242,38 +242,36 @@ void sdiohal_unlock_rx_ws(void)
 void sdiohal_lock_scan_ws(void)
 {
 	struct sdiohal_data_t *p_data = sdiohal_get_data();
-
 	__pm_stay_awake(p_data->scan_ws);
 }
 
 void sdiohal_unlock_scan_ws(void)
 {
 	struct sdiohal_data_t *p_data = sdiohal_get_data();
-
 	__pm_relax(p_data->scan_ws);
 }
 
 void sdiohal_wakelock_init(void)
 {
 	struct sdiohal_data_t *p_data = sdiohal_get_data();
-
+	/*wakeup_source pointer*/
 	p_data->tx_ws = wakeup_source_create("sdiohal_tx_wakelock");
-	p_data->rx_ws = wakeup_source_create("sdiohal_rx_wakelock");
-	p_data->scan_ws = wakeup_source_create("sdiohal_scan_wakelock");
 	wakeup_source_add(p_data->tx_ws);
+	p_data->rx_ws = wakeup_source_create("sdiohal_rx_wakelock");
 	wakeup_source_add(p_data->rx_ws);
+	p_data->scan_ws = wakeup_source_create("sdiohal_scan_wakelock");
 	wakeup_source_add(p_data->scan_ws);
 }
 
 void sdiohal_wakelock_deinit(void)
 {
 	struct sdiohal_data_t *p_data = sdiohal_get_data();
-
+	/*wakeup_source pointer*/
 	wakeup_source_remove(p_data->tx_ws);
-	wakeup_source_remove(p_data->rx_ws);
-	wakeup_source_remove(p_data->scan_ws);
 	wakeup_source_destroy(p_data->tx_ws);
+	wakeup_source_remove(p_data->rx_ws);
 	wakeup_source_destroy(p_data->rx_ws);
+	wakeup_source_remove(p_data->scan_ws);
 	wakeup_source_destroy(p_data->scan_ws);
 }
 
@@ -323,8 +321,8 @@ void sdiohal_cp_tx_sleep(enum slp_subsys subsys)
 	struct sdiohal_data_t *p_data = sdiohal_get_data();
 
 	sdiohal_debug("%s subsys:%d count:%d\n",
-		      __func__, subsys,
-		      atomic_read(&p_data->tx_wake_cp_count[subsys]));
+			  __func__, subsys,
+			  atomic_read(&p_data->tx_wake_cp_count[subsys]));
 
 	sdiohal_atomic_sub(1, &p_data->tx_wake_cp_count[subsys]);
 	if (atomic_read(&p_data->tx_wake_cp_count[subsys]))
@@ -338,8 +336,8 @@ void sdiohal_cp_tx_wakeup(enum slp_subsys subsys)
 	struct sdiohal_data_t *p_data = sdiohal_get_data();
 
 	sdiohal_debug("%s subsys:%d count:%d\n",
-		      __func__, subsys,
-		      atomic_read(&p_data->tx_wake_cp_count[subsys]));
+			  __func__, subsys,
+			  atomic_read(&p_data->tx_wake_cp_count[subsys]));
 
 	sdiohal_atomic_add(1, &p_data->tx_wake_cp_count[subsys]);
 	slp_mgr_drv_sleep(subsys, false);
@@ -351,8 +349,8 @@ void sdiohal_cp_rx_sleep(enum slp_subsys subsys)
 	struct sdiohal_data_t *p_data = sdiohal_get_data();
 
 	sdiohal_debug("%s subsys:%d count:%d\n",
-		      __func__, subsys,
-		      atomic_read(&p_data->rx_wake_cp_count[subsys]));
+			  __func__, subsys,
+			  atomic_read(&p_data->rx_wake_cp_count[subsys]));
 
 	sdiohal_atomic_sub(1, &p_data->rx_wake_cp_count[subsys]);
 	if (atomic_read(&p_data->rx_wake_cp_count[subsys]))
@@ -366,8 +364,8 @@ void sdiohal_cp_rx_wakeup(enum slp_subsys subsys)
 	struct sdiohal_data_t *p_data = sdiohal_get_data();
 
 	sdiohal_debug("%s subsys:%d count:%d\n",
-		      __func__, subsys,
-		      atomic_read(&p_data->rx_wake_cp_count[subsys]));
+			  __func__, subsys,
+			  atomic_read(&p_data->rx_wake_cp_count[subsys]));
 
 	sdiohal_atomic_add(1, &p_data->rx_wake_cp_count[subsys]);
 	slp_mgr_drv_sleep(subsys, false);
@@ -488,14 +486,14 @@ bool sdiohal_is_tx_list_empty(void)
 }
 
 int sdiohal_tx_packer(struct sdiohal_sendbuf_t *send_buf,
-		      struct sdiohal_list_t *data_list,
-		      struct mbuf_t *mbuf_node)
+			  struct sdiohal_list_t *data_list,
+			  struct mbuf_t *mbuf_node)
 {
 	if ((!send_buf) || (!data_list) || (!mbuf_node))
 		return -EINVAL;
 
 	memcpy(send_buf->buf + send_buf->used_len,
-	       mbuf_node->buf, mbuf_node->len + sizeof(struct sdio_puh_t));
+		   mbuf_node->buf, mbuf_node->len + sizeof(struct sdio_puh_t));
 
 	send_buf->used_len += sizeof(struct sdio_puh_t) +
 		SDIOHAL_ALIGN_4BYTE(mbuf_node->len);
@@ -510,14 +508,14 @@ int sdiohal_tx_set_eof(struct sdiohal_sendbuf_t *send_buf,
 		return -EINVAL;
 
 	memcpy((void *)(send_buf->buf + send_buf->used_len),
-	       (void *)eof_buf, sizeof(struct sdio_puh_t));
+		   (void *)eof_buf, sizeof(struct sdio_puh_t));
 	send_buf->used_len += sizeof(struct sdio_puh_t);
 
 	return 0;
 }
 
 static int sdiohal_tx_fill_puh(int channel, struct mbuf_t *head,
-			       struct mbuf_t *tail, int num)
+				   struct mbuf_t *tail, int num)
 {
 	struct sdio_puh_t *puh = NULL;
 	struct mbuf_t *mbuf_node;
@@ -531,7 +529,7 @@ static int sdiohal_tx_fill_puh(int channel, struct mbuf_t *head,
 	for (i = 0; i < num; i++, mbuf_node = mbuf_node->next) {
 		if (!mbuf_node) {
 			sdiohal_err("%s tx fill puh, mbuf ptr error:%p\n",
-				    __func__, mbuf_node);
+					__func__, mbuf_node);
 
 			return -EFAULT;
 		}
@@ -612,7 +610,7 @@ static int sdiohal_tx_pop_assignment(struct sdiohal_list_t *data_list)
 		mbuf_node = mbuf_next;
 		if (!mbuf_node) {
 			sdiohal_err("%s tx pop mbuf ptr error:%p\n",
-				    __func__, mbuf_node);
+					__func__, mbuf_node);
 
 			return -EFAULT;
 		}
@@ -622,7 +620,7 @@ static int sdiohal_tx_pop_assignment(struct sdiohal_list_t *data_list)
 			puh->type, puh->subtype);
 		if (channel >= SDIO_CHN_TX_NUM) {
 			sdiohal_err("%s tx pop channel error:%d\n",
-				    __func__, channel);
+					__func__, channel);
 			continue;
 		}
 
@@ -666,12 +664,12 @@ int sdiohal_tx_list_denq(struct sdiohal_list_t *data_list)
 
 		sdiohal_list_check(tx_list, __func__, SDIOHAL_WRITE);
 		channel = sdiohal_hwtype_to_channel(inout, tx_list->type,
-						    tx_list->subtype);
+							tx_list->subtype);
 		sdiohal_print_list_data(channel, tx_list, __func__,
 					SDIOHAL_NORMAL_LEVEL);
 		if (channel >= SDIO_CHN_TX_NUM) {
 			sdiohal_err("%s tx pop channel error:%d\n",
-				    __func__, channel);
+					__func__, channel);
 			continue;
 		}
 
@@ -690,11 +688,11 @@ int sdiohal_tx_list_denq(struct sdiohal_list_t *data_list)
 			p_data->chntx_denq_old.time =
 				p_data->chntx_denq_new.time;
 			memcpy(p_data->chntx_denq_old.data_bk,
-			       p_data->chntx_denq_new.data_bk,
-			       SDIOHAL_PRINTF_LEN);
+				   p_data->chntx_denq_new.data_bk,
+				   SDIOHAL_PRINTF_LEN);
 			memcpy(p_data->chntx_denq_new.data_bk,
-			       tx_list->mbuf_tail->buf,
-			       SDIOHAL_PRINTF_LEN);
+				   tx_list->mbuf_tail->buf,
+				   SDIOHAL_PRINTF_LEN);
 			p_data->chntx_denq_new.time =
 				(unsigned int)ktime_to_ms(ktime_get());
 		}
@@ -702,11 +700,11 @@ int sdiohal_tx_list_denq(struct sdiohal_list_t *data_list)
 
 		if (sdiohal_ops && sdiohal_ops->pop_link) {
 			sdiohal_ops->pop_link(channel, tx_list->mbuf_head,
-					      tx_list->mbuf_tail,
-					      tx_list->node_num);
+						  tx_list->mbuf_tail,
+						  tx_list->node_num);
 		} else
 			sdiohal_err("%s no tx ops channel:%d\n",
-				    __func__, channel);
+					__func__, channel);
 
 		tx_list->node_num = 0;
 		sdiohal_callback_unlock(&chn_callback[channel]);
@@ -751,12 +749,12 @@ int sdiohal_rx_list_dispatch(void)
 
 		sdiohal_list_check(rx_list, __func__, SDIOHAL_READ);
 		channel = sdiohal_hwtype_to_channel(inout, rx_list->type,
-						    rx_list->subtype);
+							rx_list->subtype);
 		sdiohal_print_list_data(channel, rx_list, __func__,
 					SDIOHAL_NORMAL_LEVEL);
 		if (channel >= SDIO_CHANNEL_NUM) {
 			sdiohal_err("%s rx pop channel error:%d\n",
-				    __func__, channel);
+					__func__, channel);
 			continue;
 		}
 
@@ -772,16 +770,16 @@ int sdiohal_rx_list_dispatch(void)
 
 #if SDIO_DUMP_CHANNEL_DATA
 		if ((channel == SDIO_DUMP_RX_CHANNEL_NUM) &&
-		    (rx_list->mbuf_tail->buf[SDIO_PUB_HEADER_SIZE + 1] <
-		     SDIO_DUMP_RX_WIFI_EVENT_MIN)) {
+			(rx_list->mbuf_tail->buf[SDIO_PUB_HEADER_SIZE + 1] <
+			 SDIO_DUMP_RX_WIFI_EVENT_MIN)) {
 			p_data->chnrx_dispatch_old.time =
 				p_data->chnrx_dispatch_new.time;
 			memcpy(p_data->chnrx_dispatch_old.data_bk,
-			       p_data->chnrx_dispatch_new.data_bk,
-			       SDIOHAL_PRINTF_LEN);
+				   p_data->chnrx_dispatch_new.data_bk,
+				   SDIOHAL_PRINTF_LEN);
 			memcpy(p_data->chnrx_dispatch_new.data_bk,
-			       rx_list->mbuf_tail->buf,
-			       SDIOHAL_PRINTF_LEN);
+				   rx_list->mbuf_tail->buf,
+				   SDIOHAL_PRINTF_LEN);
 			p_data->chnrx_dispatch_new.time =
 				(unsigned int)ktime_to_ms(ktime_get());
 		}
@@ -789,14 +787,14 @@ int sdiohal_rx_list_dispatch(void)
 
 		if (sdiohal_ops && sdiohal_ops->pop_link) {
 			sdiohal_ops->pop_link(channel, rx_list->mbuf_head,
-					      rx_list->mbuf_tail,
-					      rx_list->node_num);
+						  rx_list->mbuf_tail,
+						  rx_list->node_num);
 		} else {
 			sdiohal_err("%s no rx ops channel:%d\n",
-				    __func__, channel);
+					__func__, channel);
 			sdiohal_rx_list_free(rx_list->mbuf_head,
-					     rx_list->mbuf_tail,
-					     rx_list->node_num);
+						 rx_list->mbuf_tail,
+						 rx_list->node_num);
 		}
 		rx_list->node_num = 0;
 		sdiohal_callback_unlock(&chn_callback[channel]);
@@ -914,24 +912,33 @@ static void *sdiohal_alloc_frag(unsigned int fragsz, gfp_t gfp_mask,
 #else
 		order = SDIOHAL_FRAG_PAGE_MAX_ORDER_32_BIT;
 #endif
+		/*GFP_KERNEL allow sleep, so not in interrupt; sdma changed,adma not*/
+		if (gfp_mask & GFP_KERNEL)
+			local_irq_restore(flags);
 		for (; ;) {
 			gfp_t gfp = gfp_mask;
 
 			if (order)
-				gfp |= __GFP_COMP | __GFP_NOWARN;
+				gfp |= __GFP_COMP;
 			/* alloc_pages will initialize count to 1. */
 			frag_ctl->frag.page = alloc_pages(gfp, order);
 			if (likely(frag_ctl->frag.page))
 				break;
-			if (--order < 0)
-				goto fail;
+			if (--order < 0) {
+				if (gfp_mask & GFP_KERNEL)
+					goto fail1;
+				else
+					goto fail;
+			}
 		}
+		if (gfp_mask & GFP_KERNEL)
+			local_irq_save(flags);
 		frag_ctl->frag.size = PAGE_SIZE << order;
 		if (frag_ctl->frag.size < fragsz) {
 			sdiohal_info("BITS_PER_LONG=%d,PAGE_SIZE=%ld,order=%d\n",
-				     BITS_PER_LONG, PAGE_SIZE, order);
+					 BITS_PER_LONG, PAGE_SIZE, order);
 			sdiohal_info("alloc 0x%x mem, need:0x%x\n",
-				     frag_ctl->frag.size, fragsz);
+					 frag_ctl->frag.size, fragsz);
 			if (ignore_alloc_fail) {
 				/* alloc fail, not put_page, fill frag size. */
 				*alloc_size = frag_ctl->frag.size;
@@ -1001,6 +1008,7 @@ static void *sdiohal_alloc_frag(unsigned int fragsz, gfp_t gfp_mask,
 	return data;
 fail:
 	local_irq_restore(flags);
+fail1:
 	sdiohal_err("alloc mem fail\n");
 	return NULL;
 }
@@ -1020,7 +1028,7 @@ struct sdiohal_list_t *sdiohal_get_rx_mbuf_node(int num)
 
 	if (num > p_data->list_rx_buf.node_num) {
 		sdiohal_err("no rx mbuf node, need num:%d, list node num:%d\n",
-			    num, p_data->list_rx_buf.node_num);
+				num, p_data->list_rx_buf.node_num);
 		goto err;
 	}
 
@@ -1074,7 +1082,7 @@ struct sdiohal_list_t *sdiohal_get_rx_mbuf_list(int num)
 			0, NULL);
 		if (!mbuf_temp->buf) {
 			sdiohal_rx_list_free(idle_list->mbuf_head,
-					     idle_list->mbuf_tail, num);
+						 idle_list->mbuf_tail, num);
 			kfree(idle_list);
 			goto err;
 		}
@@ -1090,24 +1098,26 @@ struct sdiohal_list_t *sdiohal_get_rx_mbuf_list(int num)
 }
 
 /* for normal dma idle buf */
-void *sdiohal_get_rx_free_buf(unsigned int *alloc_size)
+void *sdiohal_get_rx_free_buf(unsigned int *alloc_size, unsigned int read_len)
 {
 	void *p;
 	unsigned int fragsz;
 
-#if (BITS_PER_LONG > 32) || (PAGE_SIZE >= 65536)
-	fragsz = SDIOHAL_RX_RECVBUF_LEN;
+	/* fragsz need to be 1024 aligned */
+	fragsz = roundup(read_len, 1024);
 
-#else
-	fragsz = SDIOHAL_32_BIT_RX_RECVBUF_LEN;
-#endif
+/*
+ * GFP_ATOMIC is not sleep forever, requirement is high;
+ * GFP_KERNEL is nornal way, allow sleep;
+ *__GFP_COLD
+ */
 	p = sdiohal_alloc_frag(fragsz,
 #if KERNEL_VERSION(4, 14, 0) <= LINUX_VERSION_CODE
-			       GFP_ATOMIC,
+				   GFP_KERNEL,
 #else
-			       GFP_ATOMIC | __GFP_COLD,
+				   GFP_KERNEL,
 #endif
-			       1, alloc_size);
+				   1, alloc_size);
 
 	WARN_ON(((unsigned long int)p) % 64);
 
@@ -1170,7 +1180,7 @@ static void sdiohal_rx_buf_deinit(void)
 }
 
 int sdiohal_list_push(int channel, struct mbuf_t *head,
-		      struct mbuf_t *tail, int num)
+			  struct mbuf_t *tail, int num)
 {
 	struct sdiohal_data_t *p_data = sdiohal_get_data();
 	struct timespec tm_begin, tm_end;
@@ -1212,7 +1222,7 @@ int sdiohal_list_push(int channel, struct mbuf_t *head,
 	if (channel < SDIO_CHN_TX_NUM) {
 		if (!atomic_read(&p_data->flag_resume)) {
 			sdiohal_err("%s chn=%d, in suspend, can't send data\n",
-				    __func__, channel);
+					__func__, channel);
 			return -EFAULT;
 		}
 		sdiohal_print_mbuf_data(channel, head, tail, num,
@@ -1223,11 +1233,11 @@ int sdiohal_list_push(int channel, struct mbuf_t *head,
 			p_data->chntx_push_old.time =
 				p_data->chntx_push_new.time;
 			memcpy(p_data->chntx_push_old.data_bk,
-			       p_data->chntx_push_new.data_bk,
-			       SDIOHAL_PRINTF_LEN);
+				   p_data->chntx_push_new.data_bk,
+				   SDIOHAL_PRINTF_LEN);
 			memcpy(p_data->chntx_push_new.data_bk,
-			       tail->buf,
-			       SDIOHAL_PRINTF_LEN);
+				   tail->buf,
+				   SDIOHAL_PRINTF_LEN);
 			p_data->chntx_push_new.time =
 				(unsigned int)ktime_to_ms(ktime_get());
 		}
@@ -1258,7 +1268,7 @@ int sdiohal_list_push(int channel, struct mbuf_t *head,
  * not calling tx_pop callback when working in sdma mode.
  */
 int sdiohal_list_direct_write(int channel, struct mbuf_t *head,
-			      struct mbuf_t *tail, int num)
+				  struct mbuf_t *tail, int num)
 {
 	struct sdiohal_data_t *p_data = sdiohal_get_data();
 	struct sdiohal_list_t data_list;
@@ -1403,17 +1413,11 @@ static int sdiohal_dtbs_buf_init(void)
 {
 	struct sdiohal_data_t *p_data = sdiohal_get_data();
 
-	p_data->dtbs_buf = sdiohal_alloc_frag(MAX_MBUF_SIZE,
-#if KERNEL_VERSION(4, 14, 0) <= LINUX_VERSION_CODE
-					      GFP_ATOMIC,
-#else
-					      GFP_ATOMIC | __GFP_COLD,
-#endif
-					      0, NULL);
-	if (!p_data->dtbs_buf)
+	p_data->dtbs_buf = kzalloc(MAX_MBUF_SIZE, GFP_KERNEL);
+	if (!p_data->dtbs_buf) {
+		sdiohal_err("dtbs buf alloc fail\n");
 		return -ENOMEM;
-
-	WARN_ON(((unsigned long int)p_data->dtbs_buf) % 64);
+	}
 
 	return 0;
 }
@@ -1421,17 +1425,8 @@ static int sdiohal_dtbs_buf_init(void)
 static int sdiohal_dtbs_buf_deinit(void)
 {
 	struct sdiohal_data_t *p_data = sdiohal_get_data();
-	int order;
-
-	if (!p_data->dtbs_buf)
-		return -ENOMEM;
 
-#if (BITS_PER_LONG > 32) || (PAGE_SIZE >= 65536)
-	order = SDIOHAL_FRAG_PAGE_MAX_ORDER;
-#else
-	order = SDIOHAL_FRAG_PAGE_MAX_ORDER_32_BIT;
-#endif
-	free_pages((unsigned long)p_data->dtbs_buf, order);
+	kfree(p_data->dtbs_buf);
 	p_data->dtbs_buf = NULL;
 
 	return 0;
diff --git a/drivers/net/wireless/uwe5622/unisocwcn/sdio/sdiohal_ctl.c b/drivers/net/wireless/uwe5622/unisocwcn/sdio/sdiohal_ctl.c
index 5a5cd9bb3..5f5905aac 100644
--- a/drivers/net/wireless/uwe5622/unisocwcn/sdio/sdiohal_ctl.c
+++ b/drivers/net/wireless/uwe5622/unisocwcn/sdio/sdiohal_ctl.c
@@ -55,9 +55,6 @@
 #define GNSS_DUMP_WIFI_RAM_ADDR	0x40580000
 #define GNSS_DUMP_DATA_SIZE	0x38000
 
-#include <linux/module.h>
-MODULE_IMPORT_NS(VFS_internal_I_am_really_a_filesystem_and_am_NOT_a_driver);
-
 enum {
 	/* SDIO TX */
 	CHANNEL_TX_BASE = 0,
@@ -225,7 +222,7 @@ static int sdiohal_throughput_tx(void)
 static void sdiohal_throughput_tx_compute_time(void)
 {
 	static signed long long times_count;
-	struct timespec now;
+	struct timespec64 now;
 
 	if (tp_tx_flag != 1)
 		return;
@@ -554,7 +551,7 @@ int at_list_rx_pop(int channel, struct mbuf_t *head,
 		   struct mbuf_t *tail, int num)
 {
 	static signed long long times_count;
-	struct timespec now;
+	struct timespec64 now;
 
 	sdiohal_debug("%s channel:%d head:%p tail:%p num:%d\n",
 		     __func__, channel, head, tail, num);
@@ -837,7 +834,7 @@ static ssize_t at_cmd_write(struct file *filp,
 	long int long_data;
 	int ret;
 	unsigned char *send_buf = NULL;
-	struct timespec now;
+	struct timespec64 now;
 
 	if (count > SDIOHAL_WRITE_SIZE) {
 		sdiohal_err("%s write size > %d\n",
diff --git a/drivers/net/wireless/uwe5622/unisocwcn/sdio/sdiohal_main.c b/drivers/net/wireless/uwe5622/unisocwcn/sdio/sdiohal_main.c
index 31c2639e4..2008e14a5 100644
--- a/drivers/net/wireless/uwe5622/unisocwcn/sdio/sdiohal_main.c
+++ b/drivers/net/wireless/uwe5622/unisocwcn/sdio/sdiohal_main.c
@@ -1971,7 +1971,6 @@ static int sdiohal_probe(struct sdio_func *func,
 	if (scan_card_notify != NULL)
 		scan_card_notify();
 
-	device_disable_async_suspend(&func->dev);
 	sdiohal_debug("rescan callback:%p\n", scan_card_notify);
 	sdiohal_info("probe ok\n");
 
diff --git a/drivers/net/wireless/uwe5622/unisocwcn/sdio/sdiohal_rx.c b/drivers/net/wireless/uwe5622/unisocwcn/sdio/sdiohal_rx.c
index 287d17c95..2a64dac7a 100644
--- a/drivers/net/wireless/uwe5622/unisocwcn/sdio/sdiohal_rx.c
+++ b/drivers/net/wireless/uwe5622/unisocwcn/sdio/sdiohal_rx.c
@@ -99,8 +99,8 @@ static int sdiohal_rx_list_parser(struct sdiohal_list_t *data_list,
 				(puh->len == 0)) {
 				sdiohal_rx_list_free(mbuf_node, mbuf_node, 1);
 				sdiohal_err("%s skip type[%d]sub[%d]len[%d]\n",
-					    __func__, puh->type, puh->subtype,
-					    puh->len);
+						__func__, puh->type, puh->subtype,
+						puh->len);
 				continue;
 			}
 			p_data->rx_packer_cnt++;
@@ -108,11 +108,11 @@ static int sdiohal_rx_list_parser(struct sdiohal_list_t *data_list,
 			sdiohal_data_list_assignment(mbuf_node, puh, channel);
 		} else {
 			sdiohal_debug("%s eof pac:%d,parse[%d]%s valid[%d]\n",
-				      __func__, puh->eof, parse_len,
-				      (parse_len < valid_len ? "<":">="),
-				      valid_len);
+					  __func__, puh->eof, parse_len,
+					  (parse_len < valid_len ? "<":">="),
+					  valid_len);
 			sdiohal_debug("%s type[%d]sub[%d]len[%d]\n", __func__,
-				      puh->type, puh->subtype, puh->len);
+					  puh->type, puh->subtype, puh->len);
 
 			sdiohal_rx_list_free(mbuf_node, mbuf_node, 1);
 		}
@@ -147,8 +147,8 @@ static int sdiohal_rx_buf_parser(char *data_buf, int valid_len)
 				(MAX_PAC_SIZE - SDIO_PUB_HEADER_SIZE)) ||
 				(puh->len == 0)) {
 				sdiohal_err("%s skip type[%d]sub[%d]len[%d]\n",
-					    __func__, puh->type, puh->subtype,
-					    puh->len);
+						__func__, puh->type, puh->subtype,
+						puh->len);
 				continue;
 			}
 			p_data->rx_packer_cnt++;
@@ -167,7 +167,7 @@ static int sdiohal_rx_buf_parser(char *data_buf, int valid_len)
 						SDIOHAL_DATA_LEVEL);
 
 			sdiohal_data_list_assignment(data_list->mbuf_head,
-						     puh, channel);
+							 puh, channel);
 			kfree(data_list);
 		}
 		/* pointer to next packet */
@@ -219,7 +219,7 @@ int sdiohal_rx_thread(void *data)
 			break;
 		if (!WCN_CARD_EXIST(&p_data->xmit_cnt)) {
 			sdiohal_err("%s line %d not have card\n",
-				    __func__, __LINE__);
+					__func__, __LINE__);
 			continue;
 		}
 
@@ -238,8 +238,8 @@ int sdiohal_rx_thread(void *data)
 			/* read len is packet num */
 			mbuf_num = sdiohal_rx_adapt_get_pac_num();
 			sdiohal_debug("%s mbuf_num:%d adma_rx_enable:%d\n",
-				      __func__, mbuf_num,
-				      p_data->adma_rx_enable);
+					  __func__, mbuf_num,
+					  p_data->adma_rx_enable);
 
 			data_list = sdiohal_get_rx_mbuf_list(mbuf_num);
 			if (!data_list) {
@@ -249,20 +249,27 @@ int sdiohal_rx_thread(void *data)
 			}
 			if (p_data->irq_type == SDIOHAL_RX_POLLING)
 				memset(p_data->dtbs_buf, 0x0,
-				       SDIOHAL_DTBS_BUF_SIZE);
+					   SDIOHAL_DTBS_BUF_SIZE);
 			ret = sdiohal_adma_pt_read(data_list);
 			if (ret != 0) {
 				sdiohal_err("adma read fail ret:%d\n", ret);
 				rx_dtbs = 0;
-				if (p_data->irq_type != SDIOHAL_RX_POLLING)
+				if (p_data->irq_type != SDIOHAL_RX_POLLING) {
+					sdiohal_rx_list_free(
+							data_list->mbuf_head,
+							data_list->mbuf_tail,
+							data_list->node_num);
+					kfree(data_list);
+					data_list = NULL;
 					goto submit_list;
+				}
 			}
 			rx_dtbs =  *((unsigned int *)(p_data->dtbs_buf
 				   + (SDIOHAL_DTBS_BUF_SIZE - 4)));
 			valid_len = *((unsigned int *)(p_data->dtbs_buf
-				    + (SDIOHAL_DTBS_BUF_SIZE - 8)));
+					+ (SDIOHAL_DTBS_BUF_SIZE - 8)));
 			sdiohal_debug("%s rx_pac_num:%d, valid len:%d\n",
-				      __func__, rx_dtbs, valid_len);
+					  __func__, rx_dtbs, valid_len);
 			sdiohal_rx_list_parser(data_list, valid_len);
 			kfree(data_list);
 			data_list = NULL;
@@ -272,20 +279,21 @@ int sdiohal_rx_thread(void *data)
 			/* read len is packet data len */
 			read_len = sdiohal_rx_adapt_get();
 			sdiohal_debug("%s read_len:%d adma_rx_enable:%d\n",
-				      __func__, read_len,
-				      p_data->adma_rx_enable);
+					  __func__, read_len,
+					  p_data->adma_rx_enable);
 
-			rx_buf = sdiohal_get_rx_free_buf(&alloc_size);
+			/*get buf by readlen 1024 aligned */
+			rx_buf = sdiohal_get_rx_free_buf(&alloc_size, read_len);
 			if (!rx_buf) {
 				sdiohal_err("get_rx_free_buf fail, rlen=%d\n",
-					    read_len);
+						read_len);
 				msleep(100);
 				goto submit_list;
 			}
 			if (alloc_size < read_len) {
 				read_len = alloc_size;
 				sdiohal_debug("alloc_size=%d < read_len=%d\n",
-					      alloc_size, read_len);
+						  alloc_size, read_len);
 			}
 
 			ret = sdiohal_sdio_pt_read(rx_buf, read_len);
@@ -299,7 +307,7 @@ int sdiohal_rx_thread(void *data)
 			valid_len =
 				*((unsigned int *)(rx_buf + (read_len - 8)));
 			sdiohal_debug("%s rx_dtbs:%d,valid len:%d\n",
-				      __func__, rx_dtbs, valid_len);
+					  __func__, rx_dtbs, valid_len);
 			sdiohal_rx_buf_parser(rx_buf, valid_len);
 		}
 
diff --git a/drivers/net/wireless/uwe5622/unisocwcn/sdio/sdiohal_tx.c b/drivers/net/wireless/uwe5622/unisocwcn/sdio/sdiohal_tx.c
index ce0a9a639..9308abae2 100644
--- a/drivers/net/wireless/uwe5622/unisocwcn/sdio/sdiohal_tx.c
+++ b/drivers/net/wireless/uwe5622/unisocwcn/sdio/sdiohal_tx.c
@@ -33,8 +33,8 @@ static void sdiohal_tx_retrybuf_left(unsigned int suc_pac_cnt)
 	}
 
 	sdiohal_debug("sdiohal_tx_retrybuf_left [%p] retry_len[%d]\n",
-		      p_data->send_buf.retry_buf,
-		      p_data->send_buf.retry_len);
+			  p_data->send_buf.retry_buf,
+			  p_data->send_buf.retry_len);
 }
 
 static int sdiohal_send_try(struct sdiohal_sendbuf_t *send_buf)
@@ -87,7 +87,7 @@ static int sdiohal_send(struct sdiohal_sendbuf_t *send_buf,
 }
 
 int sdiohal_tx_data_list_send(struct sdiohal_list_t *data_list,
-			      bool pop_flag)
+				  bool pop_flag)
 {
 	struct sdiohal_data_t *p_data = sdiohal_get_data();
 	struct mbuf_t *mbuf_node;
@@ -150,7 +150,7 @@ int sdiohal_tx_thread(void *data)
 			break;
 		if (!WCN_CARD_EXIST(&p_data->xmit_cnt)) {
 			sdiohal_err("%s line %d not have card\n",
-				    __func__, __LINE__);
+					__func__, __LINE__);
 			continue;
 		}
 
diff --git a/drivers/net/wireless/uwe5622/unisocwcn/sleep/sdio_int.c b/drivers/net/wireless/uwe5622/unisocwcn/sleep/sdio_int.c
index 2f76fee2b..3bd84deba 100644
--- a/drivers/net/wireless/uwe5622/unisocwcn/sleep/sdio_int.c
+++ b/drivers/net/wireless/uwe5622/unisocwcn/sleep/sdio_int.c
@@ -58,7 +58,7 @@ void sdio_wait_pub_int_done(void)
 
 		/* wait pub_int handle finish*/
 		while ((atomic_read(&flag_pub_int_done) == 0) &&
-		       (wait_cnt < 10)) {
+			   (wait_cnt < 10)) {
 			wait_cnt++;
 			SLP_MGR_INFO("wait pub_int_done:%d", wait_cnt);
 			usleep_range(1500, 3000);
@@ -104,7 +104,7 @@ int pub_int_handle_thread(void *data)
 		if (sdio_power_notify)
 			atomic_set(&flag_pub_int_done, 1);
 		else {
-			__pm_relax(sdio_int.pub_int_ws);
+			__pm_relax((sdio_int.pub_int_ws));
 		}
 
 		/* enable interrupt, balance with disable in pub_int_isr */
@@ -127,7 +127,7 @@ static irqreturn_t pub_int_isr(int irq, void *para)
 	if (sdio_power_notify)
 		atomic_set(&flag_pub_int_done, 0);
 	else {
-		__pm_stay_awake(sdio_int.pub_int_ws);
+		__pm_stay_awake((sdio_int.pub_int_ws));
 	}
 
 	irq_cnt++;
@@ -314,8 +314,11 @@ int sdio_pub_int_init(int irq)
 	sdio_int.pub_int_sts0 = REG_PUB_INT_STS0;
 
 	atomic_set(&flag_pub_int_done, 1);
+
+	/*wakeup_source pointer*/
 	sdio_int.pub_int_ws = wakeup_source_create("pub_int_ws");
 	wakeup_source_add(sdio_int.pub_int_ws);
+
 	init_completion(&(sdio_int.pub_int_completion));
 
 	sdio_pub_int_register(irq);
@@ -344,6 +347,8 @@ int sdio_pub_int_deinit(void)
 	sdio_power_notify = FALSE;
 	disable_irq(sdio_int.pub_int_num);
 	free_irq(sdio_int.pub_int_num, NULL);
+
+	/*wakeup_source pointer*/
 	wakeup_source_remove(sdio_int.pub_int_ws);
 	wakeup_source_destroy(sdio_int.pub_int_ws);
 
diff --git a/drivers/net/wireless/uwe5622/unisocwcn/sleep/sdio_int.h b/drivers/net/wireless/uwe5622/unisocwcn/sleep/sdio_int.h
index b4ed05fd5..2a1bbf248 100644
--- a/drivers/net/wireless/uwe5622/unisocwcn/sleep/sdio_int.h
+++ b/drivers/net/wireless/uwe5622/unisocwcn/sleep/sdio_int.h
@@ -2,8 +2,6 @@
 #define __SDIO_INT_H__
 #include <linux/device.h>
 #include <linux/version.h>
-#if KERNEL_VERSION(4, 14, 0) <= LINUX_VERSION_CODE
-#endif
 
 #define SLP_MGR_HEADER "[slp_mgr]"
 
@@ -104,7 +102,9 @@ struct sdio_int_t {
 	unsigned int pub_int_clr0;
 	unsigned int pub_int_sts0;
 	PUB_INT_ISR pub_int_cb[PUB_INT_MAX];
+	/*wakeup_source pointer*/
 	struct wakeup_source *pub_int_ws;
+
 	struct completion pub_int_completion;
 	unsigned int pub_int_num;
 	/* 1: power on, 0: power off */
diff --git a/drivers/net/wireless/uwe5622/unisocwcn/sleep/slp_mgr.c b/drivers/net/wireless/uwe5622/unisocwcn/sleep/slp_mgr.c
index 3c173c260..65f37abc4 100644
--- a/drivers/net/wireless/uwe5622/unisocwcn/sleep/slp_mgr.c
+++ b/drivers/net/wireless/uwe5622/unisocwcn/sleep/slp_mgr.c
@@ -29,6 +29,7 @@
 #include <linux/platform_device.h>
 #include <linux/spinlock.h>
 #include <linux/version.h>
+//#include <linux/wakelock.h>
 #include <wcn_bus.h>
 #include "../sdio/sdiohal.h"
 #include "slp_mgr.h"
@@ -73,11 +74,10 @@ int slp_mgr_wakeup(enum slp_subsys subsys)
 #if KERNEL_VERSION(3, 16, 75) > LINUX_VERSION_CODE
 	ktime_t time_cmp;
 #endif
-
 	mutex_lock(&(slp_mgr.wakeup_lock));
 	if (STAY_SLPING == (atomic_read(&(slp_mgr.cp2_state)))) {
 		ap_wakeup_cp();
-		time_end = ktime_add_ms(ktime_get(), 10);
+		time_end = ktime_add_ms(ktime_get(), 30);
 #ifndef CONFIG_CHECK_DRIVER_BY_CHIPID
 #ifdef CONFIG_UWE5623
 		/*select btwf_slp_status*/
@@ -111,7 +111,7 @@ int slp_mgr_wakeup(enum slp_subsys subsys)
 				unsigned int reg_val = 0;
 
 				sprdwcn_bus_reg_read(CP_WAKE_STATUS,
-						     &reg_val, 4);
+							 &reg_val, 4);
 				if ((reg_val & BIT(31)) == 0)
 #endif
 					break;
@@ -130,7 +130,7 @@ int slp_mgr_wakeup(enum slp_subsys subsys)
 					unsigned int reg_val = 0;
 
 					sprdwcn_bus_reg_read(CP_WAKE_STATUS,
-							     &reg_val, 4);
+								 &reg_val, 4);
 					if ((reg_val & BIT(31)) == 0)
 						break;
 				} else
@@ -142,7 +142,7 @@ int slp_mgr_wakeup(enum slp_subsys subsys)
 			if (do_dump) {
 				atomic_set(&(slp_mgr.cp2_state), STAY_AWAKING);
 				SLP_MGR_INFO("wakeup fail, slp_sts-0x%x",
-					     slp_sts);
+						 slp_sts);
 				sdiohal_dump_aon_reg();
 				mutex_unlock(&(slp_mgr.wakeup_lock));
 				return -1;
diff --git a/drivers/net/wireless/uwe5622/unisocwcn/wcn_bus.c b/drivers/net/wireless/uwe5622/unisocwcn/wcn_bus.c
index b6b54733f..2926b7f58 100644
--- a/drivers/net/wireless/uwe5622/unisocwcn/wcn_bus.c
+++ b/drivers/net/wireless/uwe5622/unisocwcn/wcn_bus.c
@@ -17,8 +17,6 @@
 #include <linux/mutex.h>
 #include <linux/slab.h>
 #include <linux/spinlock.h>
-#include <linux/io.h>
-
 #include <wcn_bus.h>
 
 struct buffer_pool_t {
@@ -82,7 +80,7 @@ static int buf_pool_check(struct buffer_pool_t *pool)
 	struct mbuf_t *mbuf;
 
 	for (i = 0, mbuf = pool->head;
-	     i < pool->free; i++, mbuf = mbuf->next) {
+		 i < pool->free; i++, mbuf = mbuf->next) {
 		WARN_ON(!mbuf);
 		WARN_ON((char *)mbuf < pool->mem ||
 			(char *)mbuf > pool->mem + ((sizeof(struct mbuf_t)
@@ -106,13 +104,13 @@ static int buf_pool_init(struct buffer_pool_t *pool, int size, int payload)
 	pool->payload = payload;
 	spin_lock_init(&(pool->lock));
 	pool->mem = kzalloc((sizeof(struct mbuf_t) + payload) * size,
-			    GFP_KERNEL);
+				GFP_KERNEL);
 	if (!pool->mem)
 		return -ENOMEM;
 
 	pool->head = (struct mbuf_t *) (pool->mem);
 	for (i = 0, mbuf = (struct mbuf_t *)(pool->head);
-	     i < (size - 1); i++) {
+		 i < (size - 1); i++) {
 		mbuf->seq = i;
 		next = (struct mbuf_t *)((char *)mbuf +
 			sizeof(struct mbuf_t) + payload);
@@ -133,7 +131,7 @@ static int buf_pool_init(struct buffer_pool_t *pool, int size, int payload)
 static int buf_pool_deinit(struct buffer_pool_t *pool)
 {
 	memset(pool->mem, 0x00,
-	       (sizeof(struct mbuf_t) + pool->payload) * pool->size);
+		   (sizeof(struct mbuf_t) + pool->payload) * pool->size);
 	kfree(pool->mem);
 	pool->mem = NULL;
 
@@ -244,7 +242,7 @@ int bus_chn_init(struct mchn_ops_t *ops, int hif_type)
 	chn_inf->ops[ops->channel] = ops;
 	if (ops->pool_size > 0)
 		ret = buf_pool_init(&(chn_inf->pool[ops->channel]),
-				    ops->pool_size, 0);
+					ops->pool_size, 0);
 	mutex_unlock(&chn_inf->callback_lock[ops->channel]);
 
 	/* pr_info("[-]%s(%d)\n", __func__, ops->channel); */
diff --git a/drivers/net/wireless/uwe5622/unisocwifi/Kconfig b/drivers/net/wireless/uwe5622/unisocwifi/Kconfig
index bcfd8bfb7..952c263f3 100644
--- a/drivers/net/wireless/uwe5622/unisocwifi/Kconfig
+++ b/drivers/net/wireless/uwe5622/unisocwifi/Kconfig
@@ -1,3 +1,8 @@
+config WLAN_UWE5621
+	tristate "UWE5621 Wi-Fi Driver"
+	help
+	  Sprd UWE5621 Wi-Fi Driver.
+
 config WLAN_UWE5622
 	tristate "UWE5622 Wi-Fi Driver"
 	help
@@ -15,4 +20,4 @@ config UNISOC_WIFI_PS
 	bool "Unisoc Wi-Fi Power Save Support"
 	depends on WLAN_UWE5622
         help
-          Spard UWE5622 Wi-Fi Driver Power Save.
+          Sprd UWE5622 Wi-Fi Driver Power Save.
diff --git a/drivers/net/wireless/uwe5622/unisocwifi/Makefile b/drivers/net/wireless/uwe5622/unisocwifi/Makefile
index 966e74eee..f9047ecd5 100644
--- a/drivers/net/wireless/uwe5622/unisocwifi/Makefile
+++ b/drivers/net/wireless/uwe5622/unisocwifi/Makefile
@@ -1,8 +1,6 @@
 PWD := $(shell pwd)
 all_dependencies := driver
 
-ccflags-y += -I$(src)/../unisocwcn/include
-ccflags-$(ORIGIN_BSP) += -I$(srctree)/../hardware/wifi/unisoc/drivers/unisocwcn/include
 
 ifneq ($(UNISOC_BSP_INCLUDE),)
 ccflags-y += -I$(UNISOC_BSP_INCLUDE)
@@ -16,7 +14,14 @@ ifneq ($(UNISOC_WIFI_MAC_FILE),)
 ccflags-y += -DCUSTOMIZE_WIFI_MAC_FILE=\"$(UNISOC_WIFI_MAC_FILE)\"
 endif
 
+ifneq ($(UNISOC_MODULE_NAME),)
+MODULE_NAME := $(UNISOC_MODULE_NAME)
+else
+MODULE_NAME := sprdwl_ng
+endif
+
 ####add cflag######
+ccflags-y += -DUWE5621_FTR
 ccflags-y += -DIBSS_SUPPORT -DIBSS_RSN_SUPPORT
 ccflags-y += -DNAN_SUPPORT
 ccflags-y += -DRTT_SUPPORT
@@ -24,34 +29,45 @@ ccflags-y += -DACS_SUPPORT -DRX_HW_CSUM
 ccflags-y += -DWMMAC_WFA_CERTIFICATION
 ccflags-y += -DCOMPAT_SAMPILE_CODE
 ccflags-y += -DRND_MAC_SUPPORT
+#ccflags-y += -DSOFTAP_HOOK
 ccflags-y += -DATCMD_ASSERT
 ccflags-y += -DTCPACK_DELAY_SUPPORT
-ccflags-$(DEBUGMODE) += -DWL_CONFIG_DEBUG
+#ccflags-y += -DDFS_MASTER
+#ccflags-y += -DRX_NAPI
+ifneq ($(TARGET_BUILD_VARIANT),user)
+ccflags-y += -DWL_CONFIG_DEBUG
+endif
 ccflags-y += -DSPLIT_STACK
 ccflags-y += -DOTT_UWE
-ccflags-y += -DCP2_RESET_SUPPORT
+#ccflags-y += -DCP2_RESET_SUPPORT
 ifeq ($(UNISOC_STA_SOFTAP_SCC_MODE),y)
 ccflags-y += -DSTA_SOFTAP_SCC_MODE
 endif
 
 ccflags-$(CONFIG_UNISOC_WIFI_PS) += -DUNISOC_WIFI_PS
+ccflags-y += -DPPPOE_LLC_SUPPORT
+ccflags-y += -DSYNC_DISCONNECT
+#ccflags-y += -DSPRDWL_TX_SELF
+#ccflags-y += -DTCP_ACK_DROP_SUPPORT
+#ccflags-y += -DWOW_SUPPORT -DCONFIG_PM
+
+#####module name ###
+obj-m += $(MODULE_NAME).o
 
 #######add .o file#####
-sprdwl_ng-objs += main.o cfg80211.o txrx.o cmdevt.o npi.o msg.o work.o vendor.o \
+$(MODULE_NAME)-objs += main.o cfg80211.o txrx.o cmdevt.o npi.o msg.o work.o vendor.o \
 				  tcp_ack.o mm.o reorder.o wl_core.o tx_msg.o rx_msg.o \
 				  wl_intf.o qos.o dbg_ini_util.o reg_domain.o
-sprdwl_ng-objs += defrag.o
-sprdwl_ng-objs += ibss.o
-sprdwl_ng-objs += nan.o
-sprdwl_ng-objs += tracer.o
-sprdwl_ng-objs += rf_marlin3.o
-sprdwl_ng-objs += rtt.o
-sprdwl_ng-objs += api_version.o
-sprdwl_ng-objs += rnd_mac_addr.o
-sprdwl_ng-objs += debug.o
-#sprdwl_ng-objs += 11h.o
-
-obj-$(CONFIG_WLAN_UWE5622) += sprdwl_ng.o
+$(MODULE_NAME)-objs += defrag.o
+$(MODULE_NAME)-objs += ibss.o
+$(MODULE_NAME)-objs += nan.o
+$(MODULE_NAME)-objs += tracer.o
+$(MODULE_NAME)-objs += rf_marlin3.o
+$(MODULE_NAME)-objs += rtt.o
+$(MODULE_NAME)-objs += api_version.o
+$(MODULE_NAME)-objs += rnd_mac_addr.o
+$(MODULE_NAME)-objs += debug.o
+#$(MODULE_NAME)-objs += 11h.o
 
 all: $(all_dependencies)
 driver: $(driver_dependencies)
diff --git a/drivers/net/wireless/uwe5622/unisocwifi/api_version.c b/drivers/net/wireless/uwe5622/unisocwifi/api_version.c
index 79f0b5706..91bcfee46 100644
--- a/drivers/net/wireless/uwe5622/unisocwifi/api_version.c
+++ b/drivers/net/wireless/uwe5622/unisocwifi/api_version.c
@@ -407,7 +407,7 @@ void sprdwl_fill_drv_api_version(struct sprdwl_priv *priv,
 	/*fill CMD struct drv_api*/
 	drv_api->main_ver = priv->sync_api.main_drv;
 	for (count = 0; count < MAX_API &&
-	     count < sizeof(g_api_array) / sizeof(g_api_array[0]); count++) {
+		 count < sizeof(g_api_array) / sizeof(g_api_array[0]); count++) {
 		p = &g_api_array[count];
 		if (p->drv_version)
 			drv_api->api_map[count] =
@@ -439,7 +439,7 @@ void sprdwl_fill_fw_api_version(struct sprdwl_priv *priv,
 }
 
 int sprdwl_api_available_check(struct sprdwl_priv *priv,
-			       struct sprdwl_msg_buf *msg)
+				   struct sprdwl_msg_buf *msg)
 {
 	/*define tmp struct *p */
 	struct api_version_t *p = NULL;
@@ -449,7 +449,11 @@ int sprdwl_api_available_check(struct sprdwl_priv *priv,
 	u8 drv_ver = 0, fw_ver = 0;
 	u32 min_ver = 255;
 
+#if defined(UWE5621_FTR)
 	hdr = (struct sprdwl_cmd_hdr *)(msg->tran_data + priv->hw_offset);
+#else
+	hdr = (struct sprdwl_cmd_hdr *)msg->skb->data;
+#endif
 	cmd_id = hdr->cmd_id;
 	if (cmd_id == WIFI_CMD_SYNC_VERSION)
 		return 0;
@@ -460,17 +464,17 @@ int sprdwl_api_available_check(struct sprdwl_priv *priv,
 	min_ver = min(drv_ver, fw_ver);
 	if (min_ver) {
 		if ((min_ver == drv_ver) ||
-		    min_ver == priv->sync_api.compat) {
+			min_ver == priv->sync_api.compat) {
 			priv->sync_api.compat = DEFAULT_COMPAT;
 			return 0;
 		} else {
 			wl_err("CMD ID:%d,drv ver:%d, fw ver:%d,compat:%d\n",
-			       cmd_id, drv_ver, fw_ver, priv->sync_api.compat);
+				   cmd_id, drv_ver, fw_ver, priv->sync_api.compat);
 			return -1;
 		}
 	} else {
 		wl_err("CMD ID:%d,drv ver:%d, fw ver:%d drop it!!\n",
-		       cmd_id, drv_ver, fw_ver);
+			   cmd_id, drv_ver, fw_ver);
 		return -1;
 	}
 }
diff --git a/drivers/net/wireless/uwe5622/unisocwifi/cfg80211.c b/drivers/net/wireless/uwe5622/unisocwifi/cfg80211.c
index daef880ae..3d0f12ce3 100644
--- a/drivers/net/wireless/uwe5622/unisocwifi/cfg80211.c
+++ b/drivers/net/wireless/uwe5622/unisocwifi/cfg80211.c
@@ -238,38 +238,38 @@ sprdwl_mgmt_stypes[NUM_NL80211_IFTYPES] = {
 	[NL80211_IFTYPE_STATION] = {
 		.tx = 0xffff,
 		.rx = BIT(IEEE80211_STYPE_ACTION >> 4) |
-		      BIT(IEEE80211_STYPE_PROBE_REQ >> 4)
+			  BIT(IEEE80211_STYPE_PROBE_REQ >> 4)
 	},
 	[NL80211_IFTYPE_AP] = {
 		.tx = 0xffff,
 		.rx = BIT(IEEE80211_STYPE_ASSOC_REQ >> 4) |
-		      BIT(IEEE80211_STYPE_REASSOC_REQ >> 4) |
-		      BIT(IEEE80211_STYPE_PROBE_REQ >> 4) |
-		      BIT(IEEE80211_STYPE_DISASSOC >> 4) |
-		      BIT(IEEE80211_STYPE_AUTH >> 4) |
-		      BIT(IEEE80211_STYPE_DEAUTH >> 4) |
-		      BIT(IEEE80211_STYPE_ACTION >> 4)
+			  BIT(IEEE80211_STYPE_REASSOC_REQ >> 4) |
+			  BIT(IEEE80211_STYPE_PROBE_REQ >> 4) |
+			  BIT(IEEE80211_STYPE_DISASSOC >> 4) |
+			  BIT(IEEE80211_STYPE_AUTH >> 4) |
+			  BIT(IEEE80211_STYPE_DEAUTH >> 4) |
+			  BIT(IEEE80211_STYPE_ACTION >> 4)
 	},
 	[NL80211_IFTYPE_P2P_CLIENT] = {
 		.tx = 0xffff,
 		.rx = BIT(IEEE80211_STYPE_ACTION >> 4) |
-		      BIT(IEEE80211_STYPE_PROBE_REQ >> 4)
+			  BIT(IEEE80211_STYPE_PROBE_REQ >> 4)
 	},
 	[NL80211_IFTYPE_P2P_GO] = {
 		.tx = 0xffff,
 		.rx = BIT(IEEE80211_STYPE_ASSOC_REQ >> 4) |
-		      BIT(IEEE80211_STYPE_REASSOC_REQ >> 4) |
-		      BIT(IEEE80211_STYPE_PROBE_REQ >> 4) |
-		      BIT(IEEE80211_STYPE_DISASSOC >> 4) |
-		      BIT(IEEE80211_STYPE_AUTH >> 4) |
-		      BIT(IEEE80211_STYPE_DEAUTH >> 4) |
-		      BIT(IEEE80211_STYPE_ACTION >> 4)
+			  BIT(IEEE80211_STYPE_REASSOC_REQ >> 4) |
+			  BIT(IEEE80211_STYPE_PROBE_REQ >> 4) |
+			  BIT(IEEE80211_STYPE_DISASSOC >> 4) |
+			  BIT(IEEE80211_STYPE_AUTH >> 4) |
+			  BIT(IEEE80211_STYPE_DEAUTH >> 4) |
+			  BIT(IEEE80211_STYPE_ACTION >> 4)
 	},
 #ifndef CONFIG_P2P_INTF
 	[NL80211_IFTYPE_P2P_DEVICE] = {
 		.tx = 0xffff,
 		.rx = BIT(IEEE80211_STYPE_ACTION >> 4) |
-		      BIT(IEEE80211_STYPE_PROBE_REQ >> 4)
+			  BIT(IEEE80211_STYPE_PROBE_REQ >> 4)
 	}
 #endif
 };
@@ -398,7 +398,7 @@ int sprdwl_init_fw(struct sprdwl_vif *vif)
 	u8 vif_ctx_id = 0;
 
 	wl_ndev_log(L_DBG, vif->ndev, "%s type %d, mode %d\n", __func__, type,
-		    vif->mode);
+			vif->mode);
 
 	if (vif->mode != SPRDWL_MODE_NONE) {
 		wl_ndev_log(L_ERR, vif->ndev, "%s already in use: mode %d\n",
@@ -438,8 +438,8 @@ int sprdwl_init_fw(struct sprdwl_vif *vif)
 	}
 	vif->ctx_id  = vif_ctx_id;
 	wl_ndev_log(L_DBG, vif->ndev, "%s,open success type %d, mode:%d, ctx_id:%d\n",
-		    __func__, type,
-		    vif->mode, vif->ctx_id);
+			__func__, type,
+			vif->mode, vif->ctx_id);
 	priv->fw_stat[vif->mode] = SPRDWL_INTF_OPEN;
 
 	return 0;
@@ -491,7 +491,7 @@ int sprdwl_uninit_fw(struct sprdwl_vif *vif)
 	handle_tx_status_after_close(vif);
 
 	wl_ndev_log(L_DBG, vif->ndev, "%s type %d, mode %d\n", __func__,
-		    vif->wdev.iftype, vif->mode);
+			vif->wdev.iftype, vif->mode);
 	vif->mode = SPRDWL_MODE_NONE;
 
 	return 0;
@@ -514,15 +514,15 @@ int sprdwl_check_p2p_coex(struct sprdwl_priv *priv)
 
 #ifndef CONFIG_P2P_INTF
 static struct wireless_dev *sprdwl_cfg80211_add_iface(struct wiphy *wiphy,
-						      const char *name,
+							  const char *name,
 #if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 4, 83)
 							  unsigned char name_assign_type,
 #endif
-						      enum nl80211_iftype type,
+							  enum nl80211_iftype type,
 #if LINUX_VERSION_CODE < KERNEL_VERSION(4, 14, 0)
-						      u32 *flags,
+							  u32 *flags,
 #endif
-						      struct vif_params *params)
+							  struct vif_params *params)
 {
 	enum sprdwl_mode mode;
 	enum nl80211_iftype iftype = type;
@@ -535,7 +535,7 @@ static struct wireless_dev *sprdwl_cfg80211_add_iface(struct wiphy *wiphy,
 
 	if (sprdwl_check_p2p_coex(priv)) {
 		wl_err("%s P2P mode already exist type: %u not allowed\n",
-		       __func__, type);
+			   __func__, type);
 		return ERR_PTR(-EINVAL);
 	}
 
@@ -552,7 +552,7 @@ static struct wireless_dev *sprdwl_cfg80211_add_iface(struct wiphy *wiphy,
 #endif
 
 static int sprdwl_cfg80211_del_iface(struct wiphy *wiphy,
-				     struct wireless_dev *wdev)
+					 struct wireless_dev *wdev)
 {
 	struct sprdwl_priv *priv = wiphy_priv(wiphy);
 	struct sprdwl_vif *vif = NULL, *tmp_vif = NULL;
@@ -686,17 +686,17 @@ static int sprdwl_add_cipher_key(struct sprdwl_vif *vif, bool pairwise,
 	int ret = 0;
 
 	wl_ndev_log(L_DBG, vif->ndev, "%s %s key_index %d\n", __func__,
-		    pairwise ? "pairwise" : "group", key_index);
+			pairwise ? "pairwise" : "group", key_index);
 
 	if (vif->key_len[pairwise][0] || vif->key_len[pairwise][1] ||
-	    vif->key_len[pairwise][2] || vif->key_len[pairwise][3]) {
+		vif->key_len[pairwise][2] || vif->key_len[pairwise][3]) {
 		*cipher_ptr = vif->prwise_crypto = sprdwl_parse_cipher(cipher);
 
 		ret = sprdwl_add_key(vif->priv, vif->ctx_id,
-				     vif->key[pairwise][key_index],
-				     vif->key_len[pairwise][key_index],
-				     pairwise, key_index, key_seq,
-				     *cipher_ptr, mac_addr);
+					 vif->key[pairwise][key_index],
+					 vif->key_len[pairwise][key_index],
+					 pairwise, key_index, key_seq,
+					 *cipher_ptr, mac_addr);
 	}
 
 	return ret;
@@ -716,12 +716,12 @@ static int sprdwl_cfg80211_add_key(struct wiphy *wiphy, struct net_device *ndev,
 	/* PMK is for Roaming offload */
 	if (params->cipher == WLAN_CIPHER_SUITE_PMK)
 		return sprdwl_set_roam_offload(vif->priv, vif->ctx_id,
-					       SPRDWL_ROAM_OFFLOAD_SET_PMK,
-					       params->key, params->key_len);
+						   SPRDWL_ROAM_OFFLOAD_SET_PMK,
+						   params->key, params->key_len);
 	else
 		return sprdwl_add_cipher_key(vif, pairwise, key_index,
-					     params->cipher, params->seq,
-					     mac_addr);
+						 params->cipher, params->seq,
+						 mac_addr);
 }
 
 static int sprdwl_cfg80211_del_key(struct wiphy *wiphy, struct net_device *ndev,
@@ -730,18 +730,18 @@ static int sprdwl_cfg80211_del_key(struct wiphy *wiphy, struct net_device *ndev,
 {
 	struct sprdwl_vif *vif = netdev_priv(ndev);
 
-	wl_ndev_log(L_DBG, ndev, "%s key_index=%d, pairwise=%d\n",
-		    __func__, key_index, pairwise);
+	//wl_ndev_log(L_DBG, ndev, "%s key_index=%d, pairwise=%d\n",
+	//		__func__, key_index, pairwise);
 
 	if (key_index > SPRDWL_MAX_KEY_INDEX) {
-		wl_ndev_log(L_ERR, ndev, "%s key index %d out of bounds!\n", __func__,
-			   key_index);
+		//wl_ndev_log(L_ERR, ndev, "%s key index %d out of bounds!\n", __func__,
+		//	   key_index);
 		return -ENOENT;
 	}
 
 	if (!vif->key_len[pairwise][key_index]) {
-		wl_ndev_log(L_ERR, ndev, "%s key index %d is empty!\n", __func__,
-			   key_index);
+		//wl_ndev_log(L_ERR, ndev, "%s key index %d is empty!\n", __func__,
+		//	   key_index);
 		return 0;
 	}
 
@@ -750,7 +750,7 @@ static int sprdwl_cfg80211_del_key(struct wiphy *wiphy, struct net_device *ndev,
 	vif->grp_crypto = SPRDWL_CIPHER_NONE;
 
 	return sprdwl_del_key(vif->priv, vif->ctx_id, key_index,
-			      pairwise, mac_addr);
+				  pairwise, mac_addr);
 }
 
 static int sprdwl_cfg80211_set_default_key(struct wiphy *wiphy,
@@ -792,23 +792,23 @@ int sprdwl_change_beacon(struct sprdwl_vif *vif,
 	if (beacon->beacon_ies_len) {
 		wl_ndev_log(L_DBG, vif->ndev, "set beacon extra IE\n");
 		ret = sprdwl_set_ie(vif->priv, vif->ctx_id, SPRDWL_IE_BEACON,
-				    beacon->beacon_ies, beacon->beacon_ies_len);
+					beacon->beacon_ies, beacon->beacon_ies_len);
 	}
 
 	if (beacon->proberesp_ies_len) {
 		wl_ndev_log(L_DBG, vif->ndev, "set probe response extra IE\n");
 		ret = sprdwl_set_ie(vif->priv, vif->ctx_id,
-				    SPRDWL_IE_PROBE_RESP,
-				    beacon->proberesp_ies,
-				    beacon->proberesp_ies_len);
+					SPRDWL_IE_PROBE_RESP,
+					beacon->proberesp_ies,
+					beacon->proberesp_ies_len);
 	}
 
 	if (beacon->assocresp_ies_len) {
 		wl_ndev_log(L_DBG, vif->ndev, "set associate response extra IE\n");
 		ret = sprdwl_set_ie(vif->priv, vif->ctx_id,
-				    SPRDWL_IE_ASSOC_RESP,
-				    beacon->assocresp_ies,
-				    beacon->assocresp_ies_len);
+					SPRDWL_IE_ASSOC_RESP,
+					beacon->assocresp_ies,
+					beacon->assocresp_ies_len);
 	}
 
 	if (ret)
@@ -818,8 +818,8 @@ int sprdwl_change_beacon(struct sprdwl_vif *vif,
 }
 
 static int sprdwl_cfg80211_start_ap(struct wiphy *wiphy,
-				    struct net_device *ndev,
-				    struct cfg80211_ap_settings *settings)
+					struct net_device *ndev,
+					struct cfg80211_ap_settings *settings)
 {
 	struct sprdwl_vif *vif = netdev_priv(ndev);
 	struct sprdwl_intf *intf = (struct sprdwl_intf *)vif->priv->hw_priv;
@@ -836,7 +836,7 @@ static int sprdwl_cfg80211_start_ap(struct wiphy *wiphy,
 
 #ifdef ACS_SUPPORT
 	if ((vif->mode == SPRDWL_MODE_AP) &&
-	    !list_empty(&vif->survey_info_list)) {
+		!list_empty(&vif->survey_info_list)) {
 		clean_survey_info_list(vif);
 	}
 #endif
@@ -933,15 +933,15 @@ static int sprdwl_cfg80211_start_ap(struct wiphy *wiphy,
 		hidden_index = index;
 
 	memcpy(data + index, head + hidden_index - 1,
-	       head_len + 1 - hidden_index);
+		   head_len + 1 - hidden_index);
 
 	if (beacon->tail)
 		memcpy(data + head_len + 1 +
 			(settings->hidden_ssid != 0 ? settings->ssid_len : 0),
-		       tail, tail_len);
+			   tail, tail_len);
 
 	ret = sprdwl_start_ap(vif->priv, vif->ctx_id, (unsigned char *)mgmt,
-			      mgmt_len);
+				  mgmt_len);
 	kfree(mgmt);
 
 #ifdef DFS_MASTER
@@ -999,14 +999,14 @@ static int sprdwl_cfg80211_stop_ap(struct wiphy *wiphy, struct net_device *ndev)
 }
 
 static int sprdwl_cfg80211_add_station(struct wiphy *wiphy,
-				       struct net_device *ndev, const u8 *mac,
-				       struct station_parameters *params)
+					   struct net_device *ndev, const u8 *mac,
+					   struct station_parameters *params)
 {
 	return 0;
 }
 
 static int sprdwl_cfg80211_del_station(struct wiphy *wiphy,
-				       struct net_device *ndev,
+					   struct net_device *ndev,
 #if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 4, 83)
 					   struct station_del_parameters *params
 #else
@@ -1042,16 +1042,16 @@ static int sprdwl_cfg80211_del_station(struct wiphy *wiphy,
 
 static int
 sprdwl_cfg80211_change_station(struct wiphy *wiphy,
-			       struct net_device *ndev, const u8 *mac,
-			       struct station_parameters *params)
+				   struct net_device *ndev, const u8 *mac,
+				   struct station_parameters *params)
 {
 	return 0;
 }
 
 #if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 4, 83)
 static int sprdwl_cfg80211_get_station(struct wiphy *wiphy,
-				       struct net_device *ndev, const u8 *mac,
-				       struct station_info *sinfo)
+					   struct net_device *ndev, const u8 *mac,
+					   struct station_info *sinfo)
 {
 	struct sprdwl_vif *vif = netdev_priv(ndev);
 	struct sprdwl_cmd_get_station sta;
@@ -1122,8 +1122,8 @@ static int sprdwl_cfg80211_get_station(struct wiphy *wiphy,
 
 #else
 static int sprdwl_cfg80211_get_station(struct wiphy *wiphy,
-				       struct net_device *ndev, const u8 *mac,
-				       struct station_info *sinfo)
+					   struct net_device *ndev, const u8 *mac,
+					   struct station_info *sinfo)
 {
 	struct sprdwl_vif *vif = netdev_priv(ndev);
 	struct sprdwl_cmd_get_station sta;
@@ -1176,8 +1176,8 @@ static int sprdwl_cfg80211_get_station(struct wiphy *wiphy,
 #endif
 
 static int sprdwl_cfg80211_set_channel(struct wiphy *wiphy,
-				       struct net_device *ndev,
-				       struct ieee80211_channel *chan)
+					   struct net_device *ndev,
+					   struct ieee80211_channel *chan)
 {
 	struct sprdwl_vif *vif = netdev_priv(ndev);
 
@@ -1217,7 +1217,7 @@ void sprdwl_report_softap(struct sprdwl_vif *vif, u8 is_connect, u8 *addr,
 	} else {
 		cfg80211_del_sta(vif->ndev, addr, GFP_KERNEL);
 		wl_ndev_log(L_DBG, vif->ndev, "The station (%pM) disconnected\n",
-			    addr);
+				addr);
 		trace_deauth_reason(vif->mode, 0, REMOTE_EVENT);
 	}
 }
@@ -1259,7 +1259,7 @@ void sprdwl_cancel_scan(struct sprdwl_vif *vif)
 #endif
 			else
 				wl_err("%s, %d, error, scan_request freed",
-				       __func__, __LINE__);
+					   __func__, __LINE__);
 			priv->scan_request = NULL;
 			priv->scan_vif = NULL;
 		}
@@ -1319,7 +1319,7 @@ void sprdwl_scan_done(struct sprdwl_vif *vif, bool abort)
 #endif
 			} else {
 				wl_err("%s, %d, error, scan_request freed",
-				       __func__, __LINE__);
+					   __func__, __LINE__);
 			}
 			priv->scan_request = NULL;
 			priv->scan_vif = NULL;
@@ -1344,7 +1344,7 @@ void sprdwl_sched_scan_done(struct sprdwl_vif *vif, bool abort)
 			cfg80211_sched_scan_results(vif->wdev.wiphy);
 #endif
 			wl_ndev_log(L_DBG, priv->sched_scan_vif->ndev,
-				    "%s report result\n", __func__);
+					"%s report result\n", __func__);
 			priv->sched_scan_request = NULL;
 			priv->sched_scan_vif = NULL;
 		}
@@ -1389,7 +1389,7 @@ static int sprdwl_cfg80211_scan(struct wiphy *wiphy,
 {
 	struct sprdwl_priv *priv = wiphy_priv(wiphy);
 	struct sprdwl_vif *vif =
-	    container_of(request->wdev, struct sprdwl_vif, wdev);
+		container_of(request->wdev, struct sprdwl_vif, wdev);
 	struct cfg80211_ssid *ssids = request->ssids;
 	struct sprdwl_scan_ssid *scan_ssids;
 	u8 *ssids_ptr = NULL;
@@ -1417,11 +1417,11 @@ static int sprdwl_cfg80211_scan(struct wiphy *wiphy,
 #endif
 
 	wl_ndev_log(L_DBG, vif->ndev, "%s n_channels %u\n", __func__,
-		    request->n_channels);
+			request->n_channels);
 
 	if (!sprdwl_is_valid_iftype(wiphy, request->wdev->iftype)) {
 		wl_err("%s unsupported interface type: %u\n",
-		       __func__, request->wdev->iftype);
+			   __func__, request->wdev->iftype);
 		ret = -EOPNOTSUPP;
 		goto err;
 	}
@@ -1439,7 +1439,7 @@ static int sprdwl_cfg80211_scan(struct wiphy *wiphy,
 		if (flags & (1<<3)) {
 			random_mac_flag = 1;
 			wl_info("Random MAC support==set value:%d\n",
-			       random_mac_set);
+				   random_mac_set);
 			wl_info("random mac addr: %pM\n", rand_addr);
 		} else {
 			wl_info("random mac feature disabled\n");
@@ -1448,7 +1448,7 @@ static int sprdwl_cfg80211_scan(struct wiphy *wiphy,
 		if (random_mac_flag != old_mac_flag) {
 			old_mac_flag = random_mac_flag;
 			wlan_cmd_set_rand_mac(vif->priv, vif->ctx_id,
-					      old_mac_flag, rand_addr);
+						  old_mac_flag, rand_addr);
 		}
 	}
 #endif
@@ -1463,7 +1463,7 @@ static int sprdwl_cfg80211_scan(struct wiphy *wiphy,
 		}
 
 		ret = sprdwl_set_ie(priv, vif->ctx_id, SPRDWL_IE_PROBE_REQ,
-				    request->ie, request->ie_len);
+					request->ie, request->ie_len);
 		if (ret)
 			goto err;
 	}
@@ -1506,7 +1506,7 @@ static int sprdwl_cfg80211_scan(struct wiphy *wiphy,
 			info->beacon_num = 0;
 			info->channel = NULL;
 			list_add_tail(&info->survey_list,
-				      &vif->survey_info_list);
+					  &vif->survey_info_list);
 		}
 #endif /* ACS_SUPPORT */
 	}
@@ -1532,7 +1532,7 @@ static int sprdwl_cfg80211_scan(struct wiphy *wiphy,
 			scan_ssids_len += (ssids[i].ssid_len
 					   + sizeof(scan_ssids->len));
 			scan_ssids = (struct sprdwl_scan_ssid *)
-			    (ssids_ptr + scan_ssids_len);
+				(ssids_ptr + scan_ssids_len);
 		}
 	} else {
 #ifndef ACS_SUPPORT
@@ -1568,9 +1568,9 @@ static int sprdwl_cfg80211_scan(struct wiphy *wiphy,
 }
 
 static int sprdwl_cfg80211_sched_scan_start(struct wiphy *wiphy,
-					    struct net_device *ndev,
-					    struct cfg80211_sched_scan_request
-					    *request)
+						struct net_device *ndev,
+						struct cfg80211_sched_scan_request
+						*request)
 {
 	struct sprdwl_priv *priv = wiphy_priv(wiphy);
 #if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 4, 83)
@@ -1592,7 +1592,7 @@ static int sprdwl_cfg80211_sched_scan_start(struct wiphy *wiphy,
 	/*scan not allowed if closed*/
 	if (vif->priv->fw_stat[vif->mode] == SPRDWL_INTF_CLOSE) {
 		wl_err("%s, %d, error!mode%d scan after closed not allowed\n",
-		       __func__, __LINE__, vif->mode);
+			   __func__, __LINE__, vif->mode);
 		return -ENOMEM;
 	}
 
@@ -1603,23 +1603,23 @@ static int sprdwl_cfg80211_sched_scan_start(struct wiphy *wiphy,
 	/*to protect the size of struct sprdwl_sched_scan_buf*/
 	if (request->n_channels > TOTAL_2G_5G_CHANNEL_NUM) {
 		wl_err("%s, %d, error! request->n_channels=%d\n",
-		       __func__, __LINE__, request->n_channels);
+			   __func__, __LINE__, request->n_channels);
 		request->n_channels = TOTAL_2G_5G_CHANNEL_NUM;
 	}
 	if (request->n_ssids > TOTAL_2G_5G_SSID_NUM) {
 		wl_err("%s, %d, error! request->n_ssids=%d\n",
-		       __func__, __LINE__, request->n_ssids);
+			   __func__, __LINE__, request->n_ssids);
 		request->n_ssids = TOTAL_2G_5G_SSID_NUM;
 	}
 	if (request->n_match_sets > TOTAL_2G_5G_SSID_NUM) {
 		wl_err("%s, %d, error! request->n_match_sets=%d\n",
-		       __func__, __LINE__, request->n_match_sets);
+			   __func__, __LINE__, request->n_match_sets);
 		request->n_match_sets = TOTAL_2G_5G_SSID_NUM;
 	}
 	sscan_buf = kzalloc(sizeof(*sscan_buf), GFP_KERNEL);
 	if (!sscan_buf)
 		return -ENOMEM;
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 4, 83)
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 4, 0)
 	scan_plans = request->scan_plans;
 	sscan_buf->interval = scan_plans->interval;
 #else
@@ -1644,8 +1644,8 @@ static int sprdwl_cfg80211_sched_scan_start(struct wiphy *wiphy,
 
 		if (ch == 0) {
 			wl_ndev_log(L_DBG, ndev, "%s  unknown frequency %dMhz\n",
-				    __func__,
-				    request->channels[i]->center_freq);
+					__func__,
+					request->channels[i]->center_freq);
 			continue;
 		}
 
@@ -1721,6 +1721,20 @@ static int sprdwl_cfg80211_sched_scan_stop(struct wiphy *wiphy,
 #ifdef SYNC_DISCONNECT
 void sprdwl_disconnect_handle(struct sprdwl_vif *vif)
 {
+	u16 reason_code = 0;
+	if ((vif->sm_state == SPRDWL_CONNECTED) ||
+			(vif->sm_state == SPRDWL_DISCONNECTING)) {
+		cfg80211_disconnected(vif->ndev, reason_code,
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 4, 83)
+			NULL, 0, true, GFP_KERNEL);
+#else
+			NULL, 0, GFP_KERNEL);
+#endif
+		wl_ndev_log(L_DBG, vif->ndev,
+			"%s %s, reason_code %d\n", __func__,
+			vif->ssid, reason_code);
+	}
+
 	vif->sm_state = SPRDWL_DISCONNECTED;
 
 	/* Clear bssid & ssid */
@@ -1742,24 +1756,22 @@ void sprdwl_disconnect_handle(struct sprdwl_vif *vif)
 }
 #endif
 static int sprdwl_cfg80211_disconnect(struct wiphy *wiphy,
-				      struct net_device *ndev, u16 reason_code)
+					  struct net_device *ndev, u16 reason_code)
 {
 	struct sprdwl_vif *vif = netdev_priv(ndev);
 	enum sm_state old_state = vif->sm_state;
 	int ret;
 #ifdef SYNC_DISCONNECT
-#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 9, 60)
 	u32 msec;
 	ktime_t kt;
 #endif
-#endif
 #ifdef STA_SOFTAP_SCC_MODE
 	struct sprdwl_intf *intf = (struct sprdwl_intf *)vif->priv->hw_priv;
 	intf->sta_home_channel = 0;
 #endif
 
 	wl_ndev_log(L_DBG, ndev, "%s %s reason: %d\n", __func__, vif->ssid,
-		    reason_code);
+			reason_code);
 
 	vif->sm_state = SPRDWL_DISCONNECTING;
 
@@ -1772,17 +1784,19 @@ static int sprdwl_cfg80211_disconnect(struct wiphy *wiphy,
 		goto out;
 	}
 #ifdef SYNC_DISCONNECT
-#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 9, 60)
 	if (!sprdwl_sync_disconnect_event(vif, msecs_to_jiffies(1000))) {
 		kt = ktime_get();
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 10, 0)
+		msec = (u32)(div_u64(kt, NSEC_PER_MSEC));
+#else
 		msec = (u32)(div_u64(kt.tv64, NSEC_PER_MSEC));
+#endif
 		wl_err("Wait disconnect event timeout. [mstime = %d]\n",
-		       cpu_to_le32(msec));
+			   cpu_to_le32(msec));
 	} else {
 		sprdwl_disconnect_handle(vif);
 	}
 	atomic_set(&vif->sync_disconnect_event, 0);
-#endif
 #endif
 	trace_deauth_reason(vif->mode, reason_code, LOCAL_EVENT);
 out:
@@ -1799,14 +1813,14 @@ static int sprdwl_cfg80211_connect(struct wiphy *wiphy, struct net_device *ndev,
 	struct sprdwl_cmd_connect con;
 	enum sm_state old_state = vif->sm_state;
 	int is_wep = (sme->crypto.cipher_group == WLAN_CIPHER_SUITE_WEP40) ||
-	    (sme->crypto.cipher_group == WLAN_CIPHER_SUITE_WEP104);
+		(sme->crypto.cipher_group == WLAN_CIPHER_SUITE_WEP104);
 	int random_mac_flag;
 	int ret = -EPERM;
 
 	/*workround for bug 795430*/
 	if (vif->priv->fw_stat[vif->mode] == SPRDWL_INTF_CLOSE) {
 		wl_err("%s, %d, error!mode%d connect after closed not allowed",
-		       __func__, __LINE__, vif->mode);
+			   __func__, __LINE__, vif->mode);
 		goto err;
 	}
 
@@ -1814,7 +1828,7 @@ static int sprdwl_cfg80211_connect(struct wiphy *wiphy, struct net_device *ndev,
 		if (vif->has_rand_mac) {
 			 random_mac_flag = SPRDWL_CONNECT_RANDOM_ADDR;
 			 ret = wlan_cmd_set_rand_mac(vif->priv, vif->ctx_id,
-					       random_mac_flag, vif->random_mac);
+						   random_mac_flag, vif->random_mac);
 			 if (ret)
 				 netdev_info(ndev, "Set random mac failed!\n");
 		}
@@ -1832,7 +1846,7 @@ static int sprdwl_cfg80211_connect(struct wiphy *wiphy, struct net_device *ndev,
 	if (sme->ie_len > 0) {
 		wl_ndev_log(L_DBG, ndev, "set assoc req ie, len %zx\n", sme->ie_len);
 		ret = sprdwl_set_ie(vif->priv, vif->ctx_id, SPRDWL_IE_ASSOC_REQ,
-				    sme->ie, sme->ie_len);
+					sme->ie, sme->ie_len);
 		if (ret)
 			goto err;
 	}
@@ -1844,7 +1858,7 @@ static int sprdwl_cfg80211_connect(struct wiphy *wiphy, struct net_device *ndev,
 
 	wl_ndev_log(L_DBG, ndev, "auth type %#x\n", sme->auth_type);
 	if ((sme->auth_type == NL80211_AUTHTYPE_OPEN_SYSTEM) ||
-	    ((sme->auth_type == NL80211_AUTHTYPE_AUTOMATIC) && !is_wep))
+		((sme->auth_type == NL80211_AUTHTYPE_AUTOMATIC) && !is_wep))
 		con.auth_type = SPRDWL_AUTH_OPEN;
 	else if ((sme->auth_type == NL80211_AUTHTYPE_SHARED_KEY) ||
 		 ((sme->auth_type == NL80211_AUTHTYPE_AUTOMATIC) && is_wep))
@@ -1853,11 +1867,11 @@ static int sprdwl_cfg80211_connect(struct wiphy *wiphy, struct net_device *ndev,
 	/* Set pairewise cipher */
 	if (sme->crypto.n_ciphers_pairwise) {
 		vif->prwise_crypto =
-		    sprdwl_parse_cipher(sme->crypto.ciphers_pairwise[0]);
+			sprdwl_parse_cipher(sme->crypto.ciphers_pairwise[0]);
 
 		if (vif->prwise_crypto != SPRDWL_CIPHER_NONE) {
 			wl_ndev_log(L_DBG, ndev, "pairwise cipher %#x\n",
-				    sme->crypto.ciphers_pairwise[0]);
+					sme->crypto.ciphers_pairwise[0]);
 			con.pairwise_cipher = vif->prwise_crypto;
 			con.pairwise_cipher |= SPRDWL_VALID_CONFIG;
 		}
@@ -1870,7 +1884,7 @@ static int sprdwl_cfg80211_connect(struct wiphy *wiphy, struct net_device *ndev,
 	vif->grp_crypto = sprdwl_parse_cipher(sme->crypto.cipher_group);
 	if (vif->grp_crypto != SPRDWL_CIPHER_NONE) {
 		wl_ndev_log(L_DBG, ndev, "group cipher %#x\n",
-			    sme->crypto.cipher_group);
+				sme->crypto.cipher_group);
 		con.group_cipher = vif->grp_crypto;
 		con.group_cipher |= SPRDWL_VALID_CONFIG;
 	}
@@ -1878,7 +1892,7 @@ static int sprdwl_cfg80211_connect(struct wiphy *wiphy, struct net_device *ndev,
 	/* Set auth key management (akm) */
 	if (sme->crypto.n_akm_suites) {
 		wl_ndev_log(L_DBG, ndev, "akm suites %#x\n",
-			    sme->crypto.akm_suites[0]);
+				sme->crypto.akm_suites[0]);
 		con.key_mgmt = sprdwl_parse_akm(sme->crypto.akm_suites[0]);
 		con.key_mgmt |= SPRDWL_VALID_CONFIG;
 	} else {
@@ -1888,17 +1902,17 @@ static int sprdwl_cfg80211_connect(struct wiphy *wiphy, struct net_device *ndev,
 	/* Set PSK */
 	if (sme->key_len) {
 		if (sme->crypto.cipher_group == WLAN_CIPHER_SUITE_WEP40 ||
-		    sme->crypto.cipher_group == WLAN_CIPHER_SUITE_WEP104 ||
-		    sme->crypto.ciphers_pairwise[0] ==
-		    WLAN_CIPHER_SUITE_WEP40 ||
-		    sme->crypto.ciphers_pairwise[0] ==
-		    WLAN_CIPHER_SUITE_WEP104) {
+			sme->crypto.cipher_group == WLAN_CIPHER_SUITE_WEP104 ||
+			sme->crypto.ciphers_pairwise[0] ==
+			WLAN_CIPHER_SUITE_WEP40 ||
+			sme->crypto.ciphers_pairwise[0] ==
+			WLAN_CIPHER_SUITE_WEP104) {
 			vif->key_index[SPRDWL_GROUP] = sme->key_idx;
 			vif->key_len[SPRDWL_GROUP][sme->key_idx] = sme->key_len;
 			memcpy(vif->key[SPRDWL_GROUP][sme->key_idx], sme->key,
-			       sme->key_len);
+				   sme->key_len);
 			ret =
-			    sprdwl_add_cipher_key(vif, 0, sme->key_idx,
+				sprdwl_add_cipher_key(vif, 0, sme->key_idx,
 						  sme->crypto.
 						  ciphers_pairwise[0],
 						  NULL, NULL);
@@ -1927,7 +1941,7 @@ static int sprdwl_cfg80211_connect(struct wiphy *wiphy, struct net_device *ndev,
 			u16 center_freq = sme->channel_hint->center_freq;
 
 			con.channel =
-			    ieee80211_frequency_to_channel(center_freq);
+				ieee80211_frequency_to_channel(center_freq);
 			wl_ndev_log(L_DBG, ndev, "channel_hint %d\n", con.channel);
 #ifdef STA_SOFTAP_SCC_MODE
 			if (sme->channel_hint->flags != IEEE80211_CHAN_RADAR)
@@ -1940,7 +1954,7 @@ static int sprdwl_cfg80211_connect(struct wiphy *wiphy, struct net_device *ndev,
 		}
 	} else {
 		con.channel =
-		    ieee80211_frequency_to_channel(sme->channel->center_freq);
+			ieee80211_frequency_to_channel(sme->channel->center_freq);
 		wl_ndev_log(L_DBG, ndev, "channel %d\n", con.channel);
 #ifdef STA_SOFTAP_SCC_MODE
 		if (sme->channel->flags != IEEE80211_CHAN_RADAR)
@@ -1963,14 +1977,14 @@ static int sprdwl_cfg80211_connect(struct wiphy *wiphy, struct net_device *ndev,
 
 	/* Special process for WEP(WEP key must be set before essid) */
 	if (sme->crypto.cipher_group == WLAN_CIPHER_SUITE_WEP40 ||
-	    sme->crypto.cipher_group == WLAN_CIPHER_SUITE_WEP104) {
+		sme->crypto.cipher_group == WLAN_CIPHER_SUITE_WEP104) {
 		wl_ndev_log(L_DBG, ndev, "%s WEP cipher_group\n", __func__);
 
 		if (sme->key_len <= 0) {
 			wl_ndev_log(L_DBG, ndev, "No key specified!\n");
 		} else {
 			if (sme->key_len != WLAN_KEY_LEN_WEP104 &&
-			    sme->key_len != WLAN_KEY_LEN_WEP40) {
+				sme->key_len != WLAN_KEY_LEN_WEP40) {
 				wl_ndev_log(L_ERR, ndev, "%s invalid WEP key length!\n",
 					   __func__);
 				ret = -EINVAL;
@@ -2033,38 +2047,38 @@ static int sprdwl_cfg80211_set_wiphy_params(struct wiphy *wiphy, u32 changed)
 }
 
 static int sprdwl_cfg80211_set_pmksa(struct wiphy *wiphy,
-				     struct net_device *ndev,
-				     struct cfg80211_pmksa *pmksa)
+					 struct net_device *ndev,
+					 struct cfg80211_pmksa *pmksa)
 {
 	struct sprdwl_vif *vif = netdev_priv(ndev);
 
 	wl_ndev_log(L_DBG, ndev, "%s\n", __func__);
 
 	return sprdwl_pmksa(vif->priv, vif->ctx_id, pmksa->bssid,
-			    pmksa->pmkid, SPRDWL_SUBCMD_SET);
+				pmksa->pmkid, SPRDWL_SUBCMD_SET);
 }
 
 static int sprdwl_cfg80211_del_pmksa(struct wiphy *wiphy,
-				     struct net_device *ndev,
-				     struct cfg80211_pmksa *pmksa)
+					 struct net_device *ndev,
+					 struct cfg80211_pmksa *pmksa)
 {
 	struct sprdwl_vif *vif = netdev_priv(ndev);
 
 	wl_ndev_log(L_DBG, ndev, "%s\n", __func__);
 
 	return sprdwl_pmksa(vif->priv, vif->ctx_id, pmksa->bssid,
-			    pmksa->pmkid, SPRDWL_SUBCMD_DEL);
+				pmksa->pmkid, SPRDWL_SUBCMD_DEL);
 }
 
 static int sprdwl_cfg80211_flush_pmksa(struct wiphy *wiphy,
-				       struct net_device *ndev)
+					   struct net_device *ndev)
 {
 	struct sprdwl_vif *vif = netdev_priv(ndev);
 
 	wl_ndev_log(L_DBG, ndev, "%s\n", __func__);
 
 	return sprdwl_pmksa(vif->priv, vif->ctx_id, vif->bssid, NULL,
-			    SPRDWL_SUBCMD_FLUSH);
+				SPRDWL_SUBCMD_FLUSH);
 }
 
 void sprdwl_report_fake_probe(struct wiphy *wiphy, u8 *ie, size_t ielen)
@@ -2155,14 +2169,18 @@ void signal_level_enhance(struct sprdwl_vif *vif,
 }
 
 void sprdwl_report_scan_result(struct sprdwl_vif *vif, u16 chan, s16 rssi,
-			       u8 *frame, u16 len)
+				   u8 *frame, u16 len)
 {
 	struct sprdwl_priv *priv = vif->priv;
 	struct wiphy *wiphy = priv->wiphy;
 	struct ieee80211_mgmt *mgmt = (struct ieee80211_mgmt *)frame;
 	struct ieee80211_channel *channel;
 	struct cfg80211_bss *bss;
+#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 20, 0)
 	struct timespec ts;
+#else
+	struct timespec64 ts;
+#endif
 	u16 capability, beacon_interval;
 	u32 freq;
 	s32 signal;
@@ -2200,7 +2218,7 @@ void sprdwl_report_scan_result(struct sprdwl_vif *vif, u16 chan, s16 rssi,
 
 	if ((rssi * 100) != signal)
 		wl_debug("old signal level:%d,new signal level:%d\n",
-		       (rssi*100), signal);
+			   (rssi*100), signal);
 
 #ifdef ACS_SUPPORT
 	if (vif->mode == SPRDWL_MODE_AP)
@@ -2210,13 +2228,18 @@ void sprdwl_report_scan_result(struct sprdwl_vif *vif, u16 chan, s16 rssi,
 	ie = mgmt->u.probe_resp.variable;
 	ielen = len - offsetof(struct ieee80211_mgmt, u.probe_resp.variable);
 	/* framework use system bootup time */
-	tsf = (u64)ktime_to_us(ktime_get_boottime());
+#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 20, 0)
+	get_monotonic_boottime(&ts);
+#else
+	ktime_get_boottime_ts64(&ts);
+#endif
+	tsf = (u64)ts.tv_sec * 1000000 + div_u64(ts.tv_nsec, 1000);
 	beacon_interval = le16_to_cpu(mgmt->u.probe_resp.beacon_int);
 	capability = le16_to_cpu(mgmt->u.probe_resp.capab_info);
 
 	wl_ndev_log(L_DBG, vif->ndev, "   %s, %pM, channel %2u, signal %d\n",
-		    ieee80211_is_probe_resp(mgmt->frame_control)
-		    ? "proberesp" : "beacon   ", mgmt->bssid, chan, signal);
+			ieee80211_is_probe_resp(mgmt->frame_control)
+			? "proberesp" : "beacon   ", mgmt->bssid, chan, signal);
 
 	bss = cfg80211_inform_bss(wiphy, channel,
 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 18, 0))
@@ -2226,8 +2249,9 @@ void sprdwl_report_scan_result(struct sprdwl_vif *vif, u16 chan, s16 rssi,
 				  ie, ielen, signal, GFP_KERNEL);
 
 	if (unlikely(!bss))
-		wl_ndev_log(L_ERR, vif->ndev,
-			   "%s failed to inform bss frame!\n", __func__);
+		;
+		//wl_ndev_log(L_ERR, vif->ndev,
+		//	   "%s failed to inform bss frame!\n", __func__);
 	cfg80211_put_bss(wiphy, bss);
 
 	/*check log mac flag and call report fake probe*/
@@ -2236,14 +2260,14 @@ void sprdwl_report_scan_result(struct sprdwl_vif *vif, u16 chan, s16 rssi,
 
 	if (vif->beacon_loss) {
 		bss = cfg80211_get_bss(wiphy, NULL, vif->bssid,
-				       vif->ssid, vif->ssid_len,
-				       WLAN_CAPABILITY_ESS,
-				       WLAN_CAPABILITY_ESS);
+					   vif->ssid, vif->ssid_len,
+					   WLAN_CAPABILITY_ESS,
+					   WLAN_CAPABILITY_ESS);
 		if (bss) {
 			cfg80211_unlink_bss(wiphy, bss);
 			wl_ndev_log(L_DBG, vif->ndev,
-				    "unlink %pM due to beacon loss\n",
-				    bss->bssid);
+					"unlink %pM due to beacon loss\n",
+					bss->bssid);
 			vif->beacon_loss = 0;
 		}
 	}
@@ -2258,7 +2282,11 @@ void sprdwl_report_connection(struct sprdwl_vif *vif,
 	struct ieee80211_channel *channel;
 	struct ieee80211_mgmt *mgmt;
 	struct cfg80211_bss *bss = NULL;
+#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 20, 0)
 	struct timespec ts;
+#else
+	struct timespec64 ts;
+#endif
 #ifdef WMMAC_WFA_CERTIFICATION
 	struct wmm_params_element *wmm_params;
 	int i;
@@ -2273,19 +2301,19 @@ void sprdwl_report_connection(struct sprdwl_vif *vif,
 #endif
 
 	if (vif->sm_state != SPRDWL_CONNECTING &&
-	    vif->sm_state != SPRDWL_CONNECTED) {
+		vif->sm_state != SPRDWL_CONNECTED) {
 		wl_ndev_log(L_ERR, vif->ndev, "%s Unexpected event!\n", __func__);
 		return;
 	}
 #ifndef IBSS_SUPPORT
 	if (conn_info->status != SPRDWL_CONNECT_SUCCESS &&
-	    conn_info->status != SPRDWL_ROAM_SUCCESS)
+		conn_info->status != SPRDWL_ROAM_SUCCESS)
 		goto err;
 #else
 	if (conn_info->status != SPRDWL_CONNECT_SUCCESS &&
-	    conn_info->status != SPRDWL_ROAM_SUCCESS &&
-	    conn_info->status != SPRDWL_IBSS_JOIN &&
-	    conn_info->status != SPRDWL_IBSS_START)
+		conn_info->status != SPRDWL_ROAM_SUCCESS &&
+		conn_info->status != SPRDWL_IBSS_JOIN &&
+		conn_info->status != SPRDWL_IBSS_START)
 		goto err;
 #endif /* IBSS_SUPPORT */
 	if (!conn_info->bssid) {
@@ -2321,20 +2349,25 @@ void sprdwl_report_connection(struct sprdwl_vif *vif,
 
 		mgmt = (struct ieee80211_mgmt *)conn_info->bea_ie;
 		wl_ndev_log(L_DBG, vif->ndev, "%s update BSS %s\n", __func__,
-			    vif->ssid);
+				vif->ssid);
 		if (!mgmt) {
 			wl_ndev_log(L_ERR, vif->ndev, "%s NULL frame!\n", __func__);
 			goto err;
 		}
-		if (!ether_addr_equal(conn_info->bssid, mgmt->bssid))
-			wl_ndev_log(L_ERR, vif->ndev,
-				    "%s Invalid Beacon!,vif->bssid = %pM, con->bssid = %pM, mgmt->bssid = %pM\n",
-				    __func__, vif->bssid, conn_info->bssid, mgmt->bssid);
+		//if (!ether_addr_equal(conn_info->bssid, mgmt->bssid))
+		//	wl_ndev_log(L_ERR, vif->ndev,
+		//			"%s Invalid Beacon!,vif->bssid = %pM, con->bssid = %pM, mgmt->bssid = %pM\n",
+		//			__func__, vif->bssid, conn_info->bssid, mgmt->bssid);
 		ie = mgmt->u.probe_resp.variable;
 		ielen = conn_info->bea_ie_len - offsetof(struct ieee80211_mgmt,
 						 u.probe_resp.variable);
 		/* framework use system bootup time */
-		tsf = (u64)ktime_to_us(ktime_get_boottime());
+#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 20, 0)
+		get_monotonic_boottime(&ts);
+#else
+		ktime_get_boottime_ts64(&ts);
+#endif
+		tsf = (u64)ts.tv_sec * 1000000 + div_u64(ts.tv_nsec, 1000);
 		beacon_interval = le16_to_cpu(mgmt->u.probe_resp.beacon_int);
 		capability = le16_to_cpu(mgmt->u.probe_resp.capab_info);
 		wl_ndev_log(L_DBG, vif->ndev, "%s, %pM, signal: %d\n",
@@ -2350,15 +2383,16 @@ void sprdwl_report_connection(struct sprdwl_vif *vif,
 					  capability, beacon_interval,
 					  ie, ielen, conn_info->signal, GFP_KERNEL);
 		if (unlikely(!bss))
-			wl_ndev_log(L_ERR, vif->ndev,
-				   "%s failed to inform bss frame!\n",
-				   __func__);
+			;
+			//wl_ndev_log(L_ERR, vif->ndev,
+			//	   "%s failed to inform bss frame!\n",
+			//	   __func__);
 	} else {
 		wl_ndev_log(L_ERR, vif->ndev, "%s No Beason IE!\n", __func__);
 	}
 
 	if (vif->sm_state == SPRDWL_CONNECTING &&
-	    conn_info->status == SPRDWL_CONNECT_SUCCESS)
+		conn_info->status == SPRDWL_CONNECT_SUCCESS)
 		cfg80211_connect_result(vif->ndev,
 					conn_info->bssid, conn_info->req_ie, conn_info->req_ie_len,
 					conn_info->resp_ie, conn_info->resp_ie_len,
@@ -2376,7 +2410,7 @@ void sprdwl_report_connection(struct sprdwl_vif *vif,
 		cfg80211_roamed(vif->ndev, &roam_info, GFP_KERNEL);
 #else
 		cfg80211_roamed_bss(vif->ndev, bss, conn_info->req_ie, conn_info->req_ie_len,
-				    conn_info->resp_ie, conn_info->resp_ie_len, GFP_KERNEL);
+					conn_info->resp_ie, conn_info->resp_ie_len, GFP_KERNEL);
 #endif
 	}
 #ifdef IBSS_SUPPORT
@@ -2433,7 +2467,7 @@ void sprdwl_report_connection(struct sprdwl_vif *vif,
 	vif->sm_state = SPRDWL_CONNECTED;
 	memcpy(vif->bssid, conn_info->bssid, sizeof(vif->bssid));
 	wl_ndev_log(L_DBG, vif->ndev, "%s %s to %s (%pM)\n", __func__,
-		    conn_info->status == SPRDWL_CONNECT_SUCCESS ?
+			conn_info->status == SPRDWL_CONNECT_SUCCESS ?
 			"connect" : "roam", vif->ssid, vif->bssid);
 	return;
 err:
@@ -2464,11 +2498,11 @@ void sprdwl_report_disconnection(struct sprdwl_vif *vif, u16 reason_code)
 #if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 4, 83)
 				NULL, 0, false, GFP_KERNEL);
 #else
-				      NULL, 0, GFP_KERNEL);
+					  NULL, 0, GFP_KERNEL);
 #endif
 		wl_ndev_log(L_DBG, vif->ndev,
-			    "%s %s, reason_code %d\n", __func__,
-			    vif->ssid, reason_code);
+				"%s %s, reason_code %d\n", __func__,
+				vif->ssid, reason_code);
 	} else {
 		wl_ndev_log(L_ERR, vif->ndev, "%s Unexpected event!\n", __func__);
 		return;
@@ -2500,13 +2534,13 @@ void sprdwl_report_disconnection(struct sprdwl_vif *vif, u16 reason_code)
 void sprdwl_report_mic_failure(struct sprdwl_vif *vif, u8 is_mcast, u8 key_id)
 {
 	wl_ndev_log(L_DBG, vif->ndev,
-		    "%s is_mcast:0x%x key_id: 0x%x bssid: %pM\n",
-		    __func__, is_mcast, key_id, vif->bssid);
+			"%s is_mcast:0x%x key_id: 0x%x bssid: %pM\n",
+			__func__, is_mcast, key_id, vif->bssid);
 
 	cfg80211_michael_mic_failure(vif->ndev, vif->bssid,
-				     (is_mcast ? NL80211_KEYTYPE_GROUP :
-				      NL80211_KEYTYPE_PAIRWISE),
-				     key_id, NULL, GFP_KERNEL);
+					 (is_mcast ? NL80211_KEYTYPE_GROUP :
+					  NL80211_KEYTYPE_PAIRWISE),
+					 key_id, NULL, GFP_KERNEL);
 }
 
 static char type_name[16][32] = {
@@ -2577,10 +2611,10 @@ void sprdwl_cfg80211_dump_frame_prot_info(int send, int freq,
 
 	if (type == IEEE80211_FTYPE_MGMT) {
 		idx += sprintf(p + idx, "%dMHz, %s, ",
-			       freq, type_name[subtype]);
+				   freq, type_name[subtype]);
 	} else {
 		idx += sprintf(p + idx,
-			       "%dMHz, not mgmt frame, type=%d, ", freq, type);
+				   "%dMHz, not mgmt frame, type=%d, ", freq, type);
 	}
 
 	if (subtype == ACTION_TYPE) {
@@ -2588,10 +2622,10 @@ void sprdwl_cfg80211_dump_frame_prot_info(int send, int freq,
 		action_subtype = *(buf + ACTION_SUBTYPE_OFFSET);
 		if (action == PUB_ACTION)
 			idx += sprintf(p + idx, "PUB:%s ",
-				       pub_action_name[action_subtype]);
+					   pub_action_name[action_subtype]);
 		else if (action == P2P_ACTION)
 			idx += sprintf(p + idx, "P2P:%s ",
-				       p2p_action_name[action_subtype]);
+					   p2p_action_name[action_subtype]);
 		else
 			idx += sprintf(p + idx, "Unknown ACTION(0x%x)", action);
 	}
@@ -2602,9 +2636,9 @@ void sprdwl_cfg80211_dump_frame_prot_info(int send, int freq,
 
 /* P2P related stuff */
 static int sprdwl_cfg80211_remain_on_channel(struct wiphy *wiphy,
-					     struct wireless_dev *wdev,
-					     struct ieee80211_channel *chan,
-					     unsigned int duration, u64 *cookie)
+						 struct wireless_dev *wdev,
+						 struct ieee80211_channel *chan,
+						 unsigned int duration, u64 *cookie)
 {
 	struct sprdwl_vif *vif = container_of(wdev, struct sprdwl_vif, wdev);
 	enum nl80211_channel_type channel_type = 0;
@@ -2613,7 +2647,7 @@ static int sprdwl_cfg80211_remain_on_channel(struct wiphy *wiphy,
 
 	*cookie = vif->listen_cookie = ++remain_index;
 	wl_ndev_log(L_DBG, wdev->netdev, "%s %d for %dms, cookie %lld\n",
-		    __func__, chan->center_freq, duration, *cookie);
+			__func__, chan->center_freq, duration, *cookie);
 	memcpy(&vif->listen_channel, chan, sizeof(struct ieee80211_channel));
 
 	ret = sprdwl_remain_chan(vif->priv, vif->ctx_id, chan,
@@ -2627,8 +2661,8 @@ static int sprdwl_cfg80211_remain_on_channel(struct wiphy *wiphy,
 }
 
 static int sprdwl_cfg80211_cancel_remain_on_channel(struct wiphy *wiphy,
-						    struct wireless_dev *wdev,
-						    u64 cookie)
+							struct wireless_dev *wdev,
+							u64 cookie)
 {
 	struct sprdwl_vif *vif = container_of(wdev, struct sprdwl_vif, wdev);
 
@@ -2668,9 +2702,9 @@ static int sprdwl_cfg80211_mgmt_tx(struct wiphy *wiphy,
 	/* send tx mgmt */
 	if (len > 0) {
 		ret = sprdwl_tx_mgmt(vif->priv, vif->ctx_id,
-				     ieee80211_frequency_to_channel
-				     (chan->center_freq), dont_wait_for_ack,
-				     wait, cookie, buf, len);
+					 ieee80211_frequency_to_channel
+					 (chan->center_freq), dont_wait_for_ack,
+					 wait, cookie, buf, len);
 		if (ret)
 			if (!dont_wait_for_ack)
 				cfg80211_mgmt_tx_status(wdev, *cookie, buf, len,
@@ -2688,9 +2722,10 @@ static void sprdwl_cfg80211_mgmt_frame_register(struct wiphy *wiphy,
 	struct sprdwl_work *misc_work;
 	struct sprdwl_reg_mgmt *reg_mgmt;
 	u16 mgmt_type;
+
 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 8, 0))
-	u16 frame_type = BIT(upd->global_stypes << 4);
-	bool reg = false;
+       u16 frame_type = BIT(upd->global_stypes << 4);
+       bool reg = false;
 #endif
 
 	if (vif->mode == SPRDWL_MODE_NONE)
@@ -2698,7 +2733,7 @@ static void sprdwl_cfg80211_mgmt_frame_register(struct wiphy *wiphy,
 
 	mgmt_type = (frame_type & IEEE80211_FCTL_STYPE) >> 4;
 	if ((reg && test_and_set_bit(mgmt_type, &vif->mgmt_reg)) ||
-	    (!reg && !test_and_clear_bit(mgmt_type, &vif->mgmt_reg))) {
+		(!reg && !test_and_clear_bit(mgmt_type, &vif->mgmt_reg))) {
 		wl_ndev_log(L_DBG, wdev->netdev, "%s  mgmt %d has %sreg\n", __func__,
 			   frame_type, reg ? "" : "un");
 		return;
@@ -2745,9 +2780,9 @@ void sprdwl_report_rx_mgmt(struct sprdwl_vif *vif, u8 chan, const u8 *buf,
 	int freq;
 #if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 7, 0)
 	freq = ieee80211_channel_to_frequency(chan,
-					      chan <= CH_MAX_2G_CHANNEL ?
-					      NL80211_BAND_2GHZ :
-					      NL80211_BAND_5GHZ);
+						  chan <= CH_MAX_2G_CHANNEL ?
+						  NL80211_BAND_2GHZ :
+						  NL80211_BAND_5GHZ);
 #else
 	freq = ieee80211_channel_to_frequency(chan,
 						chan <= CH_MAX_2G_CHANNEL ?
@@ -2767,7 +2802,7 @@ void sprdwl_report_rx_mgmt(struct sprdwl_vif *vif, u8 chan, const u8 *buf,
 }
 
 void sprdwl_report_mgmt_deauth(struct sprdwl_vif *vif, const u8 *buf,
-			       size_t len)
+				   size_t len)
 {
 	struct sprdwl_work *misc_work;
 
@@ -2803,7 +2838,7 @@ void sprdwl_report_mgmt_disassoc(struct sprdwl_vif *vif, const u8 *buf,
 }
 
 static int sprdwl_cfg80211_start_p2p_device(struct wiphy *wiphy,
-					    struct wireless_dev *wdev)
+						struct wireless_dev *wdev)
 {
 	struct sprdwl_vif *vif = container_of(wdev, struct sprdwl_vif, wdev);
 
@@ -2813,7 +2848,7 @@ static int sprdwl_cfg80211_start_p2p_device(struct wiphy *wiphy,
 }
 
 static void sprdwl_cfg80211_stop_p2p_device(struct wiphy *wiphy,
-					    struct wireless_dev *wdev)
+						struct wireless_dev *wdev)
 {
 	struct sprdwl_vif *vif = container_of(wdev, struct sprdwl_vif, wdev);
 
@@ -2826,10 +2861,10 @@ static void sprdwl_cfg80211_stop_p2p_device(struct wiphy *wiphy,
 }
 
 static int sprdwl_cfg80211_tdls_mgmt(struct wiphy *wiphy,
-				     struct net_device *ndev, const u8 *peer,
-				     u8 action_code, u8 dialog_token,
-				     u16 status_code,  u32 peer_capability,
-				     bool initiator, const u8 *buf, size_t len)
+					 struct net_device *ndev, const u8 *peer,
+					 u8 action_code, u8 dialog_token,
+					 u16 status_code,  u32 peer_capability,
+					 bool initiator, const u8 *buf, size_t len)
 {
 	struct sprdwl_vif *vif = netdev_priv(ndev);
 	struct sk_buff *tdls_skb;
@@ -2839,7 +2874,7 @@ static int sprdwl_cfg80211_tdls_mgmt(struct wiphy *wiphy,
 	int ret = 0;
 
 	wl_ndev_log(L_DBG, ndev, "%s action_code=%d(%pM)\n", __func__,
-		    action_code, peer);
+			action_code, peer);
 
 	datalen = sizeof(*p) + len + sizeof(end);
 	ielen = len + sizeof(end);
@@ -2917,8 +2952,8 @@ static int sprdwl_cfg80211_tdls_mgmt(struct wiphy *wiphy,
 }
 
 static int sprdwl_cfg80211_tdls_oper(struct wiphy *wiphy,
-				     struct net_device *ndev, const u8 *peer,
-				     enum nl80211_tdls_operation oper)
+					 struct net_device *ndev, const u8 *peer,
+					 enum nl80211_tdls_operation oper)
 {
 	struct sprdwl_vif *vif = netdev_priv(ndev);
 	int ret;
@@ -2943,7 +2978,7 @@ static int sprdwl_cfg80211_tdls_oper(struct wiphy *wiphy,
 		for (i = 0; i < MAX_LUT_NUM; i++) {
 			if ((0 == memcmp(intf->peer_entry[i].tx.da,
 					 peer, ETH_ALEN)) &&
-			    (intf->peer_entry[i].ctx_id == vif->ctx_id)) {
+				(intf->peer_entry[i].ctx_id == vif->ctx_id)) {
 				wl_info("%s, %d, lut_index=%d\n",
 					__func__, __LINE__,
 					intf->peer_entry[i].lut_index);
@@ -2957,9 +2992,9 @@ static int sprdwl_cfg80211_tdls_oper(struct wiphy *wiphy,
 
 #if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 19, 0)
 static int sprdwl_cfg80211_tdls_chan_switch(struct wiphy *wiphy,
-					    struct net_device *ndev,
-					    const u8 *addr, u8 oper_class,
-					    struct cfg80211_chan_def *chandef)
+						struct net_device *ndev,
+						const u8 *addr, u8 oper_class,
+						struct cfg80211_chan_def *chandef)
 {
 	struct sprdwl_vif *vif = netdev_priv(ndev);
 	u8 chan, band;
@@ -2973,8 +3008,8 @@ static int sprdwl_cfg80211_tdls_chan_switch(struct wiphy *wiphy,
 }
 
 static void sprdwl_cfg80211_tdls_cancel_chan_switch(struct wiphy *wiphy,
-						    struct net_device *ndev,
-						    const u8 *addr)
+							struct net_device *ndev,
+							const u8 *addr)
 {
 	struct sprdwl_vif *vif = netdev_priv(ndev);
 
@@ -3000,7 +3035,7 @@ int sprdwl_cfg80211_set_cqm_rssi_config(struct wiphy *wiphy,
 	struct sprdwl_vif *vif = netdev_priv(ndev);
 
 	wl_ndev_log(L_DBG, ndev, "%s rssi_thold %d rssi_hyst %d",
-		    __func__, rssi_thold, rssi_hyst);
+			__func__, rssi_thold, rssi_hyst);
 
 	return sprdwl_set_cqm_rssi(vif->priv, vif->ctx_id,
 				   rssi_thold, rssi_hyst);
@@ -3024,13 +3059,13 @@ int sprdwl_cfg80211_update_ft_ies(struct wiphy *wiphy, struct net_device *ndev,
 	wl_ndev_log(L_DBG, ndev, "%s\n", __func__);
 
 	return sprdwl_set_roam_offload(vif->priv, vif->ctx_id,
-				       SPRDWL_ROAM_OFFLOAD_SET_FTIE,
-				       ftie->ie, ftie->ie_len);
+					   SPRDWL_ROAM_OFFLOAD_SET_FTIE,
+					   ftie->ie, ftie->ie_len);
 }
 
 static int sprdwl_cfg80211_set_qos_map(struct wiphy *wiphy,
-				       struct net_device *ndev,
-				       struct cfg80211_qos_map *qos_map)
+					   struct net_device *ndev,
+					   struct cfg80211_qos_map *qos_map)
 {
 	struct sprdwl_vif *vif = netdev_priv(ndev);
 
@@ -3041,9 +3076,9 @@ static int sprdwl_cfg80211_set_qos_map(struct wiphy *wiphy,
 
 #if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 18, 0)
 static int sprdwl_cfg80211_add_tx_ts(struct wiphy *wiphy,
-				     struct net_device *ndev,
-				     u8 tsid, const u8 *peer,
-				     u8 user_prio, u16 admitted_time)
+					 struct net_device *ndev,
+					 u8 tsid, const u8 *peer,
+					 u8 user_prio, u16 admitted_time)
 {
 	struct sprdwl_vif *vif = netdev_priv(ndev);
 
@@ -3054,8 +3089,8 @@ static int sprdwl_cfg80211_add_tx_ts(struct wiphy *wiphy,
 }
 
 static int sprdwl_cfg80211_del_tx_ts(struct wiphy *wiphy,
-				     struct net_device *ndev,
-				     u8 tsid, const u8 *peer)
+					 struct net_device *ndev,
+					 u8 tsid, const u8 *peer)
 {
 	struct sprdwl_vif *vif = netdev_priv(ndev);
 
@@ -3066,8 +3101,8 @@ static int sprdwl_cfg80211_del_tx_ts(struct wiphy *wiphy,
 #endif
 
 static int sprdwl_cfg80211_set_mac_acl(struct wiphy *wiphy,
-				       struct net_device *ndev,
-				       const struct cfg80211_acl_data *acl)
+					   struct net_device *ndev,
+					   const struct cfg80211_acl_data *acl)
 {
 	struct sprdwl_vif *vif = netdev_priv(ndev);
 	int index, num;
@@ -3075,7 +3110,7 @@ static int sprdwl_cfg80211_set_mac_acl(struct wiphy *wiphy,
 	unsigned char *mac_addr = NULL;
 
 	if (!acl || !acl->n_acl_entries) {
-		wl_ndev_log(L_ERR, ndev, "%s no ACL data\n", __func__);
+		//wl_ndev_log(L_ERR, ndev, "%s no ACL data\n", __func__);
 		return 0;
 	}
 
@@ -3099,18 +3134,18 @@ static int sprdwl_cfg80211_set_mac_acl(struct wiphy *wiphy,
 
 	for (index = 0; index < num; index++) {
 		wl_ndev_log(L_DBG, ndev, "%s  MAC: %pM\n", __func__,
-			    &acl->mac_addrs[index]);
+				&acl->mac_addrs[index]);
 		memcpy(mac_addr + index * ETH_ALEN,
-		       &acl->mac_addrs[index], ETH_ALEN);
+			   &acl->mac_addrs[index], ETH_ALEN);
 	}
 
 	if (mode == SPRDWL_ACL_MODE_WHITELIST)
 		return sprdwl_set_whitelist(vif->priv, vif->ctx_id,
-					    SPRDWL_SUBCMD_ENABLE,
-					    num, mac_addr);
+						SPRDWL_SUBCMD_ENABLE,
+						num, mac_addr);
 	else
 		return sprdwl_set_blacklist(vif->priv, vif->ctx_id,
-					    SPRDWL_SUBCMD_ADD, num, mac_addr);
+						SPRDWL_SUBCMD_ADD, num, mac_addr);
 }
 
 int sprdwl_cfg80211_set_power_mgmt(struct wiphy *wiphy, struct net_device *ndev,
@@ -3126,7 +3161,7 @@ int sprdwl_cfg80211_set_power_mgmt(struct wiphy *wiphy, struct net_device *ndev,
 #ifdef ACS_SUPPORT
 static int
 sprdwl_cfg80211_dump_survey(struct wiphy *wiphy, struct net_device *ndev,
-			    int idx, struct survey_info *s_info)
+				int idx, struct survey_info *s_info)
 {
 	struct sprdwl_vif *vif = netdev_priv(ndev);
 	struct sprdwl_survey_info *info = NULL;
@@ -3176,7 +3211,7 @@ sprdwl_cfg80211_dump_survey(struct wiphy *wiphy, struct net_device *ndev,
 		/* There are no more survey info in list */
 		err = -ENOENT;
 		wl_ndev_log(L_DBG, vif->ndev, "%s report %d surveys\n",
-			    __func__, survey_count);
+				__func__, survey_count);
 		survey_count = 0;
 	}
 
@@ -3247,6 +3282,7 @@ static struct cfg80211_ops sprdwl_cfg80211_ops = {
 	.remain_on_channel = sprdwl_cfg80211_remain_on_channel,
 	.cancel_remain_on_channel = sprdwl_cfg80211_cancel_remain_on_channel,
 	.mgmt_tx = sprdwl_cfg80211_mgmt_tx,
+	//.mgmt_frame_register = sprdwl_cfg80211_mgmt_frame_register,
 	.update_mgmt_frame_registrations = sprdwl_cfg80211_mgmt_frame_register,
 	.set_power_mgmt = sprdwl_cfg80211_set_power_mgmt,
 	.set_cqm_rssi_config = sprdwl_cfg80211_set_cqm_rssi_config,
@@ -3322,7 +3358,7 @@ void sprdwl_save_ch_info(struct sprdwl_priv *priv, u32 band, u32 flags, int cent
 
 #if defined(CONFIG_CFG80211_INTERNAL_REGDB) && !defined(CUSTOM_REGDOMAIN)
 static void sprdwl_reg_notify(struct wiphy *wiphy,
-			      struct regulatory_request *request)
+				  struct regulatory_request *request)
 {
 	struct sprdwl_priv *priv = wiphy_priv(wiphy);
 	struct sprdwl_intf *intf = (struct sprdwl_intf *)priv->hw_priv;
@@ -3359,7 +3395,7 @@ static void sprdwl_reg_notify(struct wiphy *wiphy,
 			chan = &sband->channels[channel];
 
 			reg_rule =
-			    freq_reg_info(wiphy, MHZ_TO_KHZ(chan->center_freq));
+				freq_reg_info(wiphy, MHZ_TO_KHZ(chan->center_freq));
 			if (IS_ERR(reg_rule))
 				continue;
 
@@ -3375,12 +3411,12 @@ static void sprdwl_reg_notify(struct wiphy *wiphy,
 	}
 
 	rd_size = sizeof(struct sprdwl_ieee80211_regdomain) +
-	    n_rules * sizeof(struct ieee80211_reg_rule);
+		n_rules * sizeof(struct ieee80211_reg_rule);
 
 	rd = kzalloc(rd_size, GFP_KERNEL);
 	if (!rd) {
 		wl_err("%s failed to alloc sprdwl_ieee80211_regdomain!\n",
-		       __func__);
+			   __func__);
 		return;
 	}
 
@@ -3408,17 +3444,17 @@ static void sprdwl_reg_notify(struct wiphy *wiphy,
 				intf->sta_home_channel = 0;
 #endif
 			reg_rule =
-			    freq_reg_info(wiphy, MHZ_TO_KHZ(chan->center_freq));
+				freq_reg_info(wiphy, MHZ_TO_KHZ(chan->center_freq));
 			if (IS_ERR(reg_rule))
 				continue;
 
 			freq_range = &reg_rule->freq_range;
 			if (last_start_freq != freq_range->start_freq_khz &&
-			    i < n_rules) {
+				i < n_rules) {
 				last_start_freq = freq_range->start_freq_khz;
 
 				memcpy(&rd->reg_rules[i], reg_rule,
-				       sizeof(struct ieee80211_reg_rule));
+					   sizeof(struct ieee80211_reg_rule));
 				i++;
 
 				wl_info(
@@ -3432,7 +3468,7 @@ static void sprdwl_reg_notify(struct wiphy *wiphy,
 	}
 
 	print_hex_dump_debug("regdom:", DUMP_PREFIX_OFFSET, 16, 1,
-			     rd, rd_size, true);
+				 rd, rd_size, true);
 	if (sprdwl_set_regdom(priv, (u8 *)rd, rd_size))
 		wl_err("%s failed to set regdomain!\n", __func__);
 	if (rd != NULL) {
@@ -3442,7 +3478,7 @@ static void sprdwl_reg_notify(struct wiphy *wiphy,
 }
 #else
 void sprdwl_reg_notify(struct wiphy *wiphy,
-			      struct regulatory_request *request)
+				  struct regulatory_request *request)
 {
 	struct sprdwl_priv *priv = wiphy_priv(wiphy);
 #ifdef STA_SOFTAP_SCC_MODE
@@ -3500,7 +3536,7 @@ void sprdwl_reg_notify(struct wiphy *wiphy,
 			chan = &sband->channels[channel];
 
 			reg_rule =
-			    sprd_freq_reg_info_regd(MHZ_TO_KHZ(chan->center_freq), pRegdom);
+				sprd_freq_reg_info_regd(MHZ_TO_KHZ(chan->center_freq), pRegdom);
 			if (IS_ERR(reg_rule)) {
 				wl_debug("%s, %d, chan=%d\n", __func__, __LINE__, (int)(chan->center_freq));
 				continue;
@@ -3519,15 +3555,15 @@ void sprdwl_reg_notify(struct wiphy *wiphy,
 
 	rd_size = sizeof(struct sprdwl_ieee80211_regdomain) +
 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 15, 0))
-	    n_rules * sizeof(struct ieee80211_reg_rule);
+		n_rules * sizeof(struct ieee80211_reg_rule);
 #else
-	    n_rules * sizeof(struct unisoc_reg_rule);
+		n_rules * sizeof(struct unisoc_reg_rule);
 #endif
 
 	rd = kzalloc(rd_size, GFP_KERNEL);
 	if (!rd) {
 		wl_err("%s failed to alloc sprdwl_ieee80211_regdomain!\n",
-		       __func__);
+			   __func__);
 		return;
 	}
 
@@ -3556,17 +3592,17 @@ void sprdwl_reg_notify(struct wiphy *wiphy,
 #endif
 
 			reg_rule =
-			     sprd_freq_reg_info_regd(MHZ_TO_KHZ(chan->center_freq), pRegdom);
+				 sprd_freq_reg_info_regd(MHZ_TO_KHZ(chan->center_freq), pRegdom);
 			if (IS_ERR(reg_rule))
 				continue;
 
 			freq_range = &reg_rule->freq_range;
 			if (last_start_freq != freq_range->start_freq_khz &&
-			    i < n_rules) {
+				i < n_rules) {
 				last_start_freq = freq_range->start_freq_khz;
 
 				memcpy(&rd->reg_rules[i], reg_rule,
-				       sizeof(struct ieee80211_reg_rule));
+					   sizeof(struct ieee80211_reg_rule));
 #if (LINUX_VERSION_CODE < KERNEL_VERSION(3, 15, 0))
 				rd->reg_rules[i].dfs_cac_ms = 0;
 #endif
@@ -3583,7 +3619,7 @@ void sprdwl_reg_notify(struct wiphy *wiphy,
 	}
 
 	wl_hex_dump(L_DBG, "regdom:", DUMP_PREFIX_OFFSET, 16, 1,
-			     rd, rd_size, true);
+				 rd, rd_size, true);
 	if (sprdwl_set_regdom(priv, (u8 *)rd, rd_size))
 		wl_err("%s failed to set regdomain!\n", __func__);
 
@@ -3638,8 +3674,8 @@ void sprdwl_setup_wiphy(struct wiphy *wiphy, struct sprdwl_priv *priv)
 
 	wiphy->mgmt_stypes = sprdwl_mgmt_stypes;
 	wiphy->interface_modes =
-	    BIT(NL80211_IFTYPE_STATION) | BIT(NL80211_IFTYPE_AP) |
-	    BIT(NL80211_IFTYPE_P2P_GO) | BIT(NL80211_IFTYPE_P2P_CLIENT);
+		BIT(NL80211_IFTYPE_STATION) | BIT(NL80211_IFTYPE_AP) |
+		BIT(NL80211_IFTYPE_P2P_GO) | BIT(NL80211_IFTYPE_P2P_CLIENT);
 #ifndef CONFIG_P2P_INTF
 	wiphy->interface_modes |= BIT(NL80211_IFTYPE_P2P_DEVICE);
 #endif
@@ -3784,9 +3820,9 @@ void sprdwl_setup_wiphy(struct wiphy *wiphy, struct sprdwl_priv *priv)
 
 #if !defined (CONFIG_CFG80211_INTERNAL_REGDB) || defined(CUSTOM_REGDOMAIN)
 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 14, 0))
-		wiphy->regulatory_flags |= REGULATORY_CUSTOM_REG;
+	wiphy->regulatory_flags |= REGULATORY_CUSTOM_REG;
 #else
-		wiphy->flags |= WIPHY_FLAG_CUSTOM_REGULATORY;
+	wiphy->flags |= WIPHY_FLAG_CUSTOM_REGULATORY;
 #endif
 		alpha2[0] = '0';
 		alpha2[1] = '0';
@@ -3805,9 +3841,9 @@ void sprdwl_setup_wiphy(struct wiphy *wiphy, struct sprdwl_priv *priv)
 	} else {
 		wl_info("\tSCC supported\n");
 		wiphy->software_iftypes =
-		    BIT(NL80211_IFTYPE_STATION) | BIT(NL80211_IFTYPE_AP) |
-		    BIT(NL80211_IFTYPE_P2P_CLIENT) |
-		    BIT(NL80211_IFTYPE_P2P_GO);
+			BIT(NL80211_IFTYPE_STATION) | BIT(NL80211_IFTYPE_AP) |
+			BIT(NL80211_IFTYPE_P2P_CLIENT) |
+			BIT(NL80211_IFTYPE_P2P_GO);
 #ifndef CONFIG_P2P_INTF
 		wiphy->software_iftypes |= BIT(NL80211_IFTYPE_P2P_DEVICE);
 #endif
@@ -3825,7 +3861,7 @@ void sprdwl_setup_wiphy(struct wiphy *wiphy, struct sprdwl_priv *priv)
 	}
 #if 0
 	if (priv->fw_capa & SPRDWL_CAPA_PMK_OKC_OFFLOAD &&
-	    priv->fw_capa & SPRDWL_CAPA_11R_ROAM_OFFLOAD) {
+		priv->fw_capa & SPRDWL_CAPA_11R_ROAM_OFFLOAD) {
 		wl_info("\tRoaming offload supported\n");
 		wiphy->flags |= WIPHY_FLAG_SUPPORTS_FW_ROAM;
 	}
@@ -3876,7 +3912,7 @@ static void sprdwl_check_intf_ops(struct sprdwl_if_ops *ops)
 }
 
 struct sprdwl_priv *sprdwl_core_create(enum sprdwl_hw_type type,
-				       struct sprdwl_if_ops *ops)
+					   struct sprdwl_if_ops *ops)
 {
 	struct wiphy *wiphy;
 	struct sprdwl_priv *priv;
@@ -3897,7 +3933,7 @@ struct sprdwl_priv *sprdwl_core_create(enum sprdwl_hw_type type,
 	wl_info("hw_type:%d\n", priv->hw_type);
 
 	priv->skb_head_len = sizeof(struct sprdwl_data_hdr) + NET_IP_ALIGN +
-	    SPRDWL_SKB_HEAD_RESERV_LEN + 3;
+		SPRDWL_SKB_HEAD_RESERV_LEN + 3;
 
 	priv->if_ops = ops;
 
@@ -3905,7 +3941,7 @@ struct sprdwl_priv *sprdwl_core_create(enum sprdwl_hw_type type,
 	timer_setup(&priv->scan_timer, sprdwl_scan_timeout, 0);
 #else
 	setup_timer(&priv->scan_timer, sprdwl_scan_timeout,
-		    (unsigned long)priv);
+			(unsigned long)priv);
 #endif
 
 #ifdef WMMAC_WFA_CERTIFICATION
diff --git a/drivers/net/wireless/uwe5622/unisocwifi/cfg80211.h b/drivers/net/wireless/uwe5622/unisocwifi/cfg80211.h
index d4ffe1024..380e7da5f 100644
--- a/drivers/net/wireless/uwe5622/unisocwifi/cfg80211.h
+++ b/drivers/net/wireless/uwe5622/unisocwifi/cfg80211.h
@@ -21,15 +21,6 @@
 #include <net/cfg80211.h>
 #include <linux/version.h>
 
-#ifndef timespec
-#define timespec timespec64
-#define timespec_to_ns timespec64_to_ns
-#define getnstimeofday ktime_get_real_ts64
-#define timeval __kernel_old_timeval
-#define rtc_time_to_tm rtc_time64_to_tm
-#define timeval_to_ns ktime_to_ns
-#endif
-
 #if LINUX_VERSION_CODE < KERNEL_VERSION(3, 19, 0)
 #define NL80211_SCAN_FLAG_RANDOM_ADDR          (1<<3)
 
diff --git a/drivers/net/wireless/uwe5622/unisocwifi/cmdevt.c b/drivers/net/wireless/uwe5622/unisocwifi/cmdevt.c
index e81619b12..19e59b6f2 100644
--- a/drivers/net/wireless/uwe5622/unisocwifi/cmdevt.c
+++ b/drivers/net/wireless/uwe5622/unisocwifi/cmdevt.c
@@ -257,7 +257,11 @@ int sprdwl_cmd_init(void)
 	cmd->wake_lock = wakeup_source_register(sprdwl_dev,
 						"Wi-Fi_cmd_wakelock");
 #else
-	cmd->wake_lock = wakeup_source_register(NULL,"Wi-Fi_cmd_wakelock");
+#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 4, 0)
+	cmd->wake_lock = wakeup_source_register("Wi-Fi_cmd_wakelock");
+#else
+	cmd->wake_lock = wakeup_source_register(sprdwl_dev, "Wi-Fi_cmd_wakelock");
+#endif
 #endif
 	if (!cmd->wake_lock) {
 		wl_err("%s wakeup source register error.\n", __func__);
@@ -288,7 +292,7 @@ static void sprdwl_cmd_set(struct sprdwl_cmd_hdr *hdr)
 	ktime_t kt;
 
 	kt = ktime_get();
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 14, 0)
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 10, 0)
 	msec = (u32)(div_u64(kt, NSEC_PER_MSEC));
 #else
 	msec = (u32)(div_u64(kt.tv64, NSEC_PER_MSEC));
@@ -349,8 +353,8 @@ static int sprdwl_cmd_lock(struct sprdwl_cmd *cmd)
 	if (atomic_inc_return(&cmd->refcnt) >= SPRDWL_CMD_EXIT_VAL) {
 		atomic_dec(&cmd->refcnt);
 		wl_err("%s failed, cmd->refcnt=%d\n",
-		       __func__,
-		       atomic_read(&cmd->refcnt));
+			   __func__,
+			   atomic_read(&cmd->refcnt));
 		return -1;
 	}
 	mutex_lock(&cmd->cmd_lock);
@@ -396,6 +400,7 @@ struct sprdwl_msg_buf *__sprdwl_cmd_getbuf(struct sprdwl_priv *priv,
 	struct sprdwl_cmd_hdr *hdr;
 	u16 plen = sizeof(*hdr) + len;
 	enum sprdwl_mode mode = SPRDWL_MODE_NONE;/*default to open new device*/
+#if defined(UWE5621_FTR)
 	void *data = NULL;
 	struct sprdwl_vif *vif;
 	struct sprdwl_intf *intf = (struct sprdwl_intf *)(priv->hw_priv);
@@ -405,12 +410,12 @@ struct sprdwl_msg_buf *__sprdwl_cmd_getbuf(struct sprdwl_priv *priv,
 
 #ifdef CP2_RESET_SUPPORT
 	if ((g_sprdwl_priv->sync.scan_not_allowed == true) &&
-		(g_sprdwl_priv->sync.cmd_not_allowed == false)) {
+	   (g_sprdwl_priv->sync.cmd_not_allowed == false)) {
 		if ((cmd_id != WIFI_CMD_SYNC_VERSION) &&
-			(cmd_id != WIFI_CMD_DOWNLOAD_INI) &&
-			(cmd_id != WIFI_CMD_GET_INFO) &&
-			(cmd_id != WIFI_CMD_OPEN) &&
-			(cmd_id != WIFI_CMD_SET_REGDOM)) {
+		   (cmd_id != WIFI_CMD_DOWNLOAD_INI) &&
+		   (cmd_id != WIFI_CMD_GET_INFO) &&
+		   (cmd_id != WIFI_CMD_OPEN) &&
+		   (cmd_id != WIFI_CMD_SET_REGDOM)) {
 			   return NULL;
 		}
 	}
@@ -419,20 +424,22 @@ struct sprdwl_msg_buf *__sprdwl_cmd_getbuf(struct sprdwl_priv *priv,
 	if (cmd_id >= WIFI_CMD_OPEN) {
 		vif = ctx_id_to_vif(priv, ctx_id);
 		if (!vif)
-			wl_err("%s cant't get vif, ctx_id: %d\n",
-			       __func__, ctx_id);
+			;
+			//wl_err("%s cant't get vif, ctx_id: %d\n",
+			//	   __func__, ctx_id);
 		else
 			mode =  vif->mode;
 		sprdwl_put_vif(vif);
 	}
-
+#endif
 	msg = sprdwl_intf_get_msg_buf(priv, SPRDWL_TYPE_CMD, mode, ctx_id);
 	if (!msg) {
 		wl_err("%s, %d, getmsgbuf fail, mode=%d\n",
-		       __func__, __LINE__, mode);
+			   __func__, __LINE__, mode);
 		return NULL;
 	}
 
+#if defined(UWE5621_FTR)
 	data = kzalloc((plen + priv->hw_offset), flags);
 	if (data) {
 		hdr = (struct sprdwl_cmd_hdr *)(data + priv->hw_offset);
@@ -449,7 +456,25 @@ struct sprdwl_msg_buf *__sprdwl_cmd_getbuf(struct sprdwl_priv *priv,
 		sprdwl_intf_free_msg_buf(priv, msg);
 		return NULL;
 	}
-
+#else
+	msg->skb = dev_alloc_skb(plen);
+	if (msg->skb) {
+		memset(msg->skb->data, 0, plen);
+		hdr = (struct sprdwl_cmd_hdr *)msg->skb->data;
+		hdr->common.type = SPRDWL_TYPE_CMD;
+		hdr->common.reserv = 0;
+		hdr->common.rsp = rsp;
+		hdr->common.ctx_id = ctx_id;
+		hdr->plen = cpu_to_le16(plen);
+		hdr->cmd_id = cmd_id;
+		sprdwl_fill_msg(msg, msg->skb, msg->skb->data, plen);
+		msg->data = hdr + 1;
+	} else {
+		wl_err("%s failed to allocate skb\n", __func__);
+		sprdwl_intf_free_msg_buf(priv, msg);
+		return NULL;
+	}
+#endif
 	return msg;
 }
 
@@ -463,7 +488,11 @@ static int sprdwl_cmd_send_to_ic(struct sprdwl_priv *priv,
 	struct sprdwl_intf *intf = (struct sprdwl_intf *)(priv->hw_priv);
 	struct sprdwl_tx_msg *tx_msg = (struct sprdwl_tx_msg *)intf->sprdwl_tx;
 
+#if defined(UWE5621_FTR)
 	hdr = (struct sprdwl_cmd_hdr *)(msg->tran_data + priv->hw_offset);
+#else
+	hdr = (struct sprdwl_cmd_hdr *)msg->skb->data;
+#endif
 	/*TODO:consider common this if condition since
 	 * SPRDWL_HEAD_NORSP not used any more
 	 */
@@ -517,7 +546,7 @@ static int sprdwl_atcmd_assert(struct sprdwl_priv *priv, u8 vif_ctx_id, u8 cmd_i
 	u8 idx = 0;
 
 	wl_err("%s ctx_id:%d, cmd_id:%d, reason:%d, cp_asserted:%d\n",
-	       __func__, vif_ctx_id, cmd_id, reason, intf->cp_asserted);
+		   __func__, vif_ctx_id, cmd_id, reason, intf->cp_asserted);
 
 	if (intf->cp_asserted == 0) {
 		intf->cp_asserted = 1;
@@ -566,15 +595,22 @@ int sprdwl_cmd_send_recv(struct sprdwl_priv *priv,
 	ret = sprdwl_api_available_check(priv, msg);
 	if (ret || sprdwl_cmd_lock(cmd)) {
 		sprdwl_intf_free_msg_buf(priv, msg);
+#if defined(UWE5621_FTR)
 		kfree(msg->tran_data);
+#else
+		dev_kfree_skb(msg->skb);
+#endif
 		if (rlen)
 			*rlen = 0;
 		if (ret)
 			wl_err("API check fail, return!!\n");
 		goto out;
 	}
-
+#if defined(UWE5621_FTR)
 	hdr = (struct sprdwl_cmd_hdr *)(msg->tran_data + priv->hw_offset);
+#else
+	hdr = (struct sprdwl_cmd_hdr *)msg->skb->data;
+#endif
 	cmd_id = hdr->cmd_id;
 	ctx_id = hdr->common.ctx_id;
 
@@ -617,8 +653,8 @@ int sprdwl_cmd_send_recv(struct sprdwl_priv *priv,
 		}
 	} else {
 		wl_err("ctx_id:%d cmd: %s[%d] rsp timeout (mstime = %d), num=%d\n",
-		       ctx_id, cmd2str(cmd_id), cmd_id, le32_to_cpu(hdr->mstime),
-		       tx_msg->cmd_send);
+			   ctx_id, cmd2str(cmd_id), cmd_id, le32_to_cpu(cmd->mstime),
+			   tx_msg->cmd_send);
 		if (cmd_id == WIFI_CMD_CLOSE) {
 			sprdwl_atcmd_assert(priv, ctx_id, cmd_id, CMD_RSP_TIMEOUT_ERROR);
 			sprdwl_cmd_unlock(cmd);
@@ -656,11 +692,18 @@ int sprdwl_cmd_send_recv_no_wait(struct sprdwl_priv *priv,
 	if (sprdwl_cmd_lock(cmd)) {
 		wl_err("%s, %d, error!\n", __func__, __LINE__);
 		sprdwl_intf_free_msg_buf(priv, msg);
+#if defined(UWE5621_FTR)
 		kfree(msg->tran_data);
+#else
+		dev_kfree_skb(msg->skb);
+#endif
 		goto out;
 	}
-
+#if defined(UWE5621_FTR)
 	hdr = (struct sprdwl_cmd_hdr *)(msg->tran_data + priv->hw_offset);
+#else
+	hdr = (struct sprdwl_cmd_hdr *)msg->skb->data;
+#endif
 	cmd_id = hdr->cmd_id;
 	ctx_id = hdr->common.ctx_id;
 
@@ -822,20 +865,31 @@ int sprdwl_get_fw_info(struct sprdwl_priv *priv)
 	u16 r_len = sizeof(*p) + GET_INFO_TLV_RBUF_SIZE;
 	u16 r_len_ori = r_len;
 	u8 r_buf[r_len];
+#ifdef COMPAT_SAMPILE_CODE
 	u8 compat_ver = 0;
+#endif
 	unsigned int len_count = 0;
 	bool b_tlv_data_chk = true;
-	u16 tlv_len = sizeof(struct ap_version_tlv_elmt);
+	u16 tlv_len;
 #ifdef WL_CONFIG_DEBUG
 	u8 ap_version = NOTIFY_AP_VERSION_USER_DEBUG;
 #else
 	u8 ap_version = NOTIFY_AP_VERSION_USER;
 #endif
-
+	u16 offset = 0;
 #ifdef OTT_UWE
+	u8 bytes_allign = 1;
 #define OTT_UWE_OFFSET_ENABLE 1
-	tlv_len += 1;
 #endif
+	u8 credit_via_data = 1;
+
+	tlv_len = sizeof(*tlv) + 1;
+#ifdef OTT_UWE
+	tlv_len += (sizeof(*tlv) + 1);
+#endif
+
+	if (priv->hw_type == SPRDWL_HW_USB)
+		tlv_len += (sizeof(*tlv) + 1);
 
 	memset(r_buf, 0, r_len);
 	msg = sprdwl_cmd_getbuf(priv, tlv_len, SPRDWL_MODE_NONE,
@@ -843,6 +897,7 @@ int sprdwl_get_fw_info(struct sprdwl_priv *priv)
 	if (!msg)
 		return -ENOMEM;
 
+#ifdef COMPAT_SAMPILE_CODE
 	compat_ver = need_compat_operation(priv, WIFI_CMD_GET_INFO);
 	if (compat_ver) {
 		switch (compat_ver) {
@@ -862,16 +917,25 @@ int sprdwl_get_fw_info(struct sprdwl_priv *priv)
 			break;
 		}
 	}
+#endif
 
-	sprdwl_set_tlv_elmt((u8 *)msg->data, NOTIFY_AP_VERSION,
+	/*to notify CP2 use more CP2 buffer*/
+	sprdwl_set_tlv_elmt((u8 *)(msg->data + offset), NOTIFY_AP_VERSION,
 				sizeof(ap_version), &ap_version);
-
+	offset += (sizeof(*tlv) + 1);
 #ifdef OTT_UWE
-	tlv = (struct sprdwl_tlv_data *)msg->data;
-	tlv->type = OTT_UWE_OFFSET_ENABLE;
-	tlv->len = 1;
-	*((char *)tlv->data) = 1;
+	/*to notify CP2 this is OTT version ,4bytes allign*/
+	sprdwl_set_tlv_elmt((u8 *)(msg->data + offset), OTT_UWE_OFFSET_ENABLE,
+				sizeof(bytes_allign), &bytes_allign);
+	offset += (sizeof(*tlv) + 1);
 #endif
+	if (priv->hw_type == SPRDWL_HW_USB) {
+		/*to notify CP2 data credit disable*/
+		sprdwl_set_tlv_elmt((u8 *)(msg->data + offset), NOTIFY_CREDIT_VIA_RX_DATA,
+				sizeof(credit_via_data), &credit_via_data);
+		offset += (sizeof(*tlv) + 1);
+	}
+
 	ret = sprdwl_cmd_send_recv(priv, msg, CMD_WAIT_TIMEOUT, r_buf, &r_len);
 	if (!ret && r_len) {
 #if defined COMPAT_SAMPILE_CODE
@@ -950,7 +1014,7 @@ int sprdwl_get_fw_info(struct sprdwl_priv *priv)
 
 				if (b_tlv_data_chk == false) {
 					wl_err("%s TLV check failed: type=%d, len=%d\n",
-					       __func__, tlv->type, tlv->len);
+						   __func__, tlv->type, tlv->len);
 					goto out;
 				}
 
@@ -965,7 +1029,7 @@ int sprdwl_get_fw_info(struct sprdwl_priv *priv)
 
 			if (len_count != r_len) {
 				wl_err("%s length mismatch: len_count=%d, r_len=%d\n",
-				       __func__, len_count, r_len);
+					   __func__, len_count, r_len);
 				goto out;
 			}
 		}
@@ -1056,7 +1120,7 @@ int sprdwl_open_fw(struct sprdwl_priv *priv, u8 *vif_ctx_id,
 	}
 
 	return sprdwl_cmd_send_recv(priv, msg, CMD_WAIT_TIMEOUT,
-				    vif_ctx_id, &rlen);
+					vif_ctx_id, &rlen);
 }
 
 int sprdwl_close_fw(struct sprdwl_priv *priv, u8 vif_ctx_id, u8 mode)
@@ -1077,7 +1141,7 @@ int sprdwl_close_fw(struct sprdwl_priv *priv, u8 vif_ctx_id, u8 mode)
 }
 
 int sprdwl_power_save(struct sprdwl_priv *priv, u8 vif_ctx_id,
-		       u8 sub_type, u8 status)
+			   u8 sub_type, u8 status)
 {
 	int ret;
 	s32 ret_code;
@@ -1138,7 +1202,7 @@ int sprdwl_add_key(struct sprdwl_priv *priv, u8 vif_ctx_id, const u8 *key_data,
 }
 
 int sprdwl_del_key(struct sprdwl_priv *priv, u8 vif_ctx_id, u16 key_index,
-		    bool pairwise, const u8 *mac_addr)
+			bool pairwise, const u8 *mac_addr)
 {
 	struct sprdwl_msg_buf *msg;
 	struct sprdwl_cmd_del_key *p;
@@ -1222,7 +1286,7 @@ int sprdwl_set_ie(struct sprdwl_priv *priv, u8 vif_ctx_id, u8 type,
 
 #ifdef DFS_MASTER
 int sprdwl_reset_beacon(struct sprdwl_priv *priv,
-		     u8 vif_ctx_id, const u8 *beacon, u16 len)
+			 u8 vif_ctx_id, const u8 *beacon, u16 len)
 {
 	struct sprdwl_msg_buf *msg;
 
@@ -1238,7 +1302,7 @@ int sprdwl_reset_beacon(struct sprdwl_priv *priv,
 #endif
 
 int sprdwl_start_ap(struct sprdwl_priv *priv,
-		     u8 vif_ctx_id, u8 *beacon, u16 len)
+			 u8 vif_ctx_id, u8 *beacon, u16 len)
 {
 	struct sprdwl_msg_buf *msg;
 	struct sprdwl_cmd_start_ap *p;
@@ -1257,7 +1321,7 @@ int sprdwl_start_ap(struct sprdwl_priv *priv,
 }
 
 int sprdwl_del_station(struct sprdwl_priv *priv, u8 vif_ctx_id,
-		       const u8 *mac_addr, u16 reason_code)
+			   const u8 *mac_addr, u16 reason_code)
 {
 	struct sprdwl_msg_buf *msg;
 	struct sprdwl_cmd_del_station *p;
@@ -1346,16 +1410,16 @@ int sprdwl_scan(struct sprdwl_priv *priv, u8 vif_ctx_id,
 	}
 
 	wl_hex_dump(L_DBG, "scan hex:", DUMP_PREFIX_OFFSET,
-			     16, 1, p, data_len, true);
+				 16, 1, p, data_len, true);
 
 	rlen = sizeof(state);
 
 	return	sprdwl_cmd_send_recv(priv, msg, CMD_SCAN_WAIT_TIMEOUT,
-			     (u8 *)&state, &rlen);
+				 (u8 *)&state, &rlen);
 }
 
 int sprdwl_sched_scan_start(struct sprdwl_priv *priv, u8 vif_ctx_id,
-			     struct sprdwl_sched_scan_buf *buf)
+				 struct sprdwl_sched_scan_buf *buf)
 {
 	struct sprdwl_msg_buf *msg;
 	struct sprdwl_cmd_sched_scan_hd *sscan_head = NULL;
@@ -1366,12 +1430,12 @@ int sprdwl_sched_scan_start(struct sprdwl_priv *priv, u8 vif_ctx_id,
 	int len = 0, i, hd_len;
 
 	datalen = sizeof(*sscan_head) + sizeof(*ie_head) + sizeof(*sscan_ifrc)
-	    + buf->n_ssids * IEEE80211_MAX_SSID_LEN
-	    + buf->n_match_ssids * IEEE80211_MAX_SSID_LEN + buf->ie_len;
+		+ buf->n_ssids * IEEE80211_MAX_SSID_LEN
+		+ buf->n_match_ssids * IEEE80211_MAX_SSID_LEN + buf->ie_len;
 	hd_len = sizeof(*ie_head);
 	datalen = datalen + (buf->n_ssids ? hd_len : 0)
-	    + (buf->n_match_ssids ? hd_len : 0)
-	    + (buf->ie_len ? hd_len : 0);
+		+ (buf->n_match_ssids ? hd_len : 0)
+		+ (buf->ie_len ? hd_len : 0);
 
 	msg = sprdwl_cmd_getbuf(priv, datalen, vif_ctx_id,
 				SPRDWL_HEAD_RSP, WIFI_CMD_SCHED_SCAN);
@@ -1406,7 +1470,7 @@ int sprdwl_sched_scan_start(struct sprdwl_priv *priv, u8 vif_ctx_id,
 		len += sizeof(*ie_head);
 		for (i = 0; i < buf->n_ssids; i++) {
 			memcpy((p + len + i * IEEE80211_MAX_SSID_LEN),
-			       buf->ssid[i], IEEE80211_MAX_SSID_LEN);
+				   buf->ssid[i], IEEE80211_MAX_SSID_LEN);
 		}
 		len += ie_head->ie_len;
 	}
@@ -1418,7 +1482,7 @@ int sprdwl_sched_scan_start(struct sprdwl_priv *priv, u8 vif_ctx_id,
 		len += sizeof(*ie_head);
 		for (i = 0; i < buf->n_match_ssids; i++) {
 			memcpy((p + len + i * IEEE80211_MAX_SSID_LEN),
-			       buf->mssid[i], IEEE80211_MAX_SSID_LEN);
+				   buf->mssid[i], IEEE80211_MAX_SSID_LEN);
 		}
 		len += ie_head->ie_len;
 	}
@@ -1455,7 +1519,7 @@ int sprdwl_sched_scan_stop(struct sprdwl_priv *priv, u8 vif_ctx_id)
 }
 
 int sprdwl_connect(struct sprdwl_priv *priv, u8 vif_ctx_id,
-		    struct sprdwl_cmd_connect *p)
+			struct sprdwl_cmd_connect *p)
 {
 	struct sprdwl_msg_buf *msg;
 
@@ -1534,12 +1598,16 @@ int sprdwl_set_qos_map(struct sprdwl_priv *priv, u8 vif_ctx_id, void *qos_map)
 	if (!qos_map)
 		return 0;
 	msg =
-	    sprdwl_cmd_getbuf(priv, sizeof(*p), vif_ctx_id, 1,
-			      WIFI_CMD_SET_QOS_MAP);
+		sprdwl_cmd_getbuf(priv, sizeof(*p), vif_ctx_id, 1,
+				  WIFI_CMD_SET_QOS_MAP);
 	if (!msg)
 		return -ENOMEM;
-
+#if defined(UWE5621_FTR)
 	p = (struct sprdwl_cmd_qos_map *)msg->data;
+#else
+	p = (struct sprdwl_cmd_qos_map *)
+		(msg->skb->data + sizeof(struct sprdwl_cmd_hdr));
+#endif
 	memset((u8 *)p, 0, sizeof(*p));
 	memcpy((u8 *)p, qos_map, sizeof(*p));
 	memcpy(&g_11u_qos_map.qos_exceptions[0], &p->dscp_exception[0],
@@ -1565,8 +1633,12 @@ int sprdwl_gscan_subcmd(struct sprdwl_priv *priv, u8 vif_ctx_id,
 
 	if (!msg)
 		return -ENOMEM;
-
+#if defined(UWE5621_FTR)
 	p = (struct sprd_cmd_gscan_header *)msg->data;
+#else
+	p = (struct sprd_cmd_gscan_header *)
+		(msg->skb->data + sizeof(struct sprdwl_cmd_hdr));
+#endif
 	p->subcmd = subcmd;
 
 	if (data != NULL) {
@@ -1580,7 +1652,7 @@ int sprdwl_gscan_subcmd(struct sprdwl_priv *priv, u8 vif_ctx_id,
 }
 
 int sprdwl_set_gscan_config(struct sprdwl_priv *priv, u8 vif_ctx_id,
-			    void *data, u16 len, u8 *r_buf, u16 *r_len)
+				void *data, u16 len, u8 *r_buf, u16 *r_len)
 {
 	struct sprdwl_msg_buf *msg;
 	struct sprd_cmd_gscan_header *p;
@@ -1589,8 +1661,12 @@ int sprdwl_set_gscan_config(struct sprdwl_priv *priv, u8 vif_ctx_id,
 				vif_ctx_id, 1, WIFI_CMD_GSCAN);
 	if (!msg)
 		return -ENOMEM;
-
+#if defined(UWE5621_FTR)
 	p = (struct sprd_cmd_gscan_header *)msg->data;
+#else
+	p = (struct sprd_cmd_gscan_header *)
+		(msg->skb->data + sizeof(struct sprdwl_cmd_hdr));
+#endif
 	p->subcmd = SPRDWL_GSCAN_SUBCMD_SET_CONFIG;
 	p->data_len = len;
 	memcpy(p->data, data, len);
@@ -1607,8 +1683,12 @@ int sprdwl_set_gscan_scan_config(struct sprdwl_priv *priv, u8 vif_ctx_id,
 				vif_ctx_id, 1, WIFI_CMD_GSCAN);
 	if (!msg)
 		return -ENOMEM;
-
+#if defined(UWE5621_FTR)
 	p = (struct sprd_cmd_gscan_header *)msg->data;
+#else
+	p = (struct sprd_cmd_gscan_header *)(msg->skb->data +
+						 sizeof(struct sprdwl_cmd_hdr));
+#endif
 	p->subcmd = SPRDWL_GSCAN_SUBCMD_SET_SCAN_CONFIG;
 	p->data_len = len;
 	memcpy(p->data, data, len);
@@ -1625,8 +1705,12 @@ int sprdwl_enable_gscan(struct sprdwl_priv *priv, u8 vif_ctx_id, void *data,
 				vif_ctx_id, 1, WIFI_CMD_GSCAN);
 	if (!msg)
 		return -ENOMEM;
-
+#if defined(UWE5621_FTR)
 	p = (struct sprd_cmd_gscan_header *)msg->data;
+#else
+	p = (struct sprd_cmd_gscan_header *)
+		(msg->skb->data + sizeof(struct sprdwl_cmd_hdr));
+#endif
 	p->subcmd = SPRDWL_GSCAN_SUBCMD_ENABLE_GSCAN;
 	p->data_len = sizeof(int);
 	memcpy(p->data, data, p->data_len);
@@ -1643,8 +1727,12 @@ int sprdwl_get_gscan_capabilities(struct sprdwl_priv *priv, u8 vif_ctx_id,
 				SPRDWL_HEAD_RSP, WIFI_CMD_GSCAN);
 	if (!msg)
 		return -ENOMEM;
-
+#if defined(UWE5621_FTR)
 	p = (struct sprd_cmd_gscan_header *)msg->data;
+#else
+	p = (struct sprd_cmd_gscan_header *)
+		(msg->skb->data + sizeof(struct sprdwl_cmd_hdr));
+#endif
 	p->subcmd = SPRDWL_GSCAN_SUBCMD_GET_CAPABILITIES;
 	p->data_len = 0;
 
@@ -1663,19 +1751,29 @@ int sprdwl_get_gscan_channel_list(struct sprdwl_priv *priv, u8 vif_ctx_id,
 	if (!msg)
 		return -ENOMEM;
 
-
+#if defined(UWE5621_FTR)
 	p = (struct sprd_cmd_gscan_header *)msg->data;
+#else
+	p = (struct sprd_cmd_gscan_header *)
+		(msg->skb->data + sizeof(struct sprdwl_cmd_hdr));
+#endif
 	p->subcmd = SPRDWL_GSCAN_SUBCMD_GET_CHANNEL_LIST;
 	p->data_len = sizeof(*band);
 
+#if defined(UWE5621_FTR)
 	band = (int *)(msg->data + sizeof(struct sprd_cmd_gscan_header));
+#else
+	band = (int *)(msg->skb->data + sizeof(struct sprdwl_cmd_hdr) +
+			   sizeof(struct sprd_cmd_gscan_header));
+#endif
+
 	*band = *((int *)data);
 
 	return sprdwl_cmd_send_recv(priv, msg, CMD_WAIT_TIMEOUT, r_buf, r_len);
 }
 
 int sprdwl_set_gscan_bssid_hotlist(struct sprdwl_priv *priv, u8 vif_ctx_id,
-			    void *data, u16 len, u8 *r_buf, u16 *r_len)
+				void *data, u16 len, u8 *r_buf, u16 *r_len)
 {
 	struct sprdwl_msg_buf *msg;
 	struct sprd_cmd_gscan_header *p;
@@ -1684,8 +1782,12 @@ int sprdwl_set_gscan_bssid_hotlist(struct sprdwl_priv *priv, u8 vif_ctx_id,
 				vif_ctx_id, 1, WIFI_CMD_GSCAN);
 	if (!msg)
 		return -ENOMEM;
-
+#if defined(UWE5621_FTR)
 	p = (struct sprd_cmd_gscan_header *)msg->data;
+#else
+	p = (struct sprd_cmd_gscan_header *)
+		(msg->skb->data + sizeof(struct sprdwl_cmd_hdr));
+#endif
 	p->subcmd = SPRDWL_GSCAN_SUBCMD_SET_HOTLIST;
 	p->data_len = len;
 	memcpy(p->data, data, len);
@@ -1693,7 +1795,7 @@ int sprdwl_set_gscan_bssid_hotlist(struct sprdwl_priv *priv, u8 vif_ctx_id,
 }
 
 int sprdwl_set_gscan_bssid_blacklist(struct sprdwl_priv *priv, u8 vif_ctx_id,
-			    void *data, u16 len, u8 *r_buf, u16 *r_len)
+				void *data, u16 len, u8 *r_buf, u16 *r_len)
 {
 	struct sprdwl_msg_buf *msg;
 	struct sprd_cmd_gscan_header *p;
@@ -1702,15 +1804,19 @@ int sprdwl_set_gscan_bssid_blacklist(struct sprdwl_priv *priv, u8 vif_ctx_id,
 				vif_ctx_id, 1, WIFI_CMD_GSCAN);
 	if (!msg)
 		return -ENOMEM;
-
+#if defined(UWE5621_FTR)
 	p = (struct sprd_cmd_gscan_header *)msg->data;
+#else
+	p = (struct sprd_cmd_gscan_header *)
+		(msg->skb->data + sizeof(struct sprdwl_cmd_hdr));
+#endif
 	p->subcmd = SPRDWL_WIFI_SUBCMD_SET_BSSID_BLACKLIST;
 	p->data_len = len;
 	memcpy(p->data, data, len);
 	return sprdwl_cmd_send_recv(priv, msg, CMD_WAIT_TIMEOUT, r_buf, r_len);
 }
 int sprdwl_add_tx_ts(struct sprdwl_priv *priv, u8 vif_ctx_id, u8 tsid,
-		     const u8 *peer, u8 user_prio, u16 admitted_time)
+			 const u8 *peer, u8 user_prio, u16 admitted_time)
 {
 	struct sprdwl_msg_buf *msg;
 	struct sprdwl_cmd_tx_ts *p;
@@ -1722,8 +1828,12 @@ int sprdwl_add_tx_ts(struct sprdwl_priv *priv, u8 vif_ctx_id, u8 tsid,
 				WIFI_CMD_ADD_TX_TS);
 	if (!msg)
 		return -ENOMEM;
-
+#if defined(UWE5621_FTR)
 	p = (struct sprdwl_cmd_tx_ts *)msg->data;
+#else
+	p = (struct sprdwl_cmd_tx_ts *)
+		(msg->skb->data + sizeof(struct sprdwl_cmd_hdr));
+#endif
 	memset((u8 *)p, 0, sizeof(*p));
 
 	p->tsid = tsid;
@@ -1740,7 +1850,7 @@ int sprdwl_add_tx_ts(struct sprdwl_priv *priv, u8 vif_ctx_id, u8 tsid,
 }
 
 int sprdwl_del_tx_ts(struct sprdwl_priv *priv, u8 vif_ctx_id, u8 tsid,
-		     const u8 *peer)
+			 const u8 *peer)
 {
 	struct sprdwl_msg_buf *msg;
 	struct sprdwl_cmd_tx_ts *p;
@@ -1749,8 +1859,12 @@ int sprdwl_del_tx_ts(struct sprdwl_priv *priv, u8 vif_ctx_id, u8 tsid,
 				WIFI_CMD_DEL_TX_TS);
 	if (!msg)
 		return -ENOMEM;
-
+#if defined(UWE5621_FTR)
 	p = (struct sprdwl_cmd_tx_ts *)msg->data;
+#else
+	p = (struct sprdwl_cmd_tx_ts *)
+		(msg->skb->data + sizeof(struct sprdwl_cmd_hdr));
+#endif
 	memset((u8 *)p, 0, sizeof(*p));
 
 	p->tsid = tsid;
@@ -1764,9 +1878,9 @@ int sprdwl_del_tx_ts(struct sprdwl_priv *priv, u8 vif_ctx_id, u8 tsid,
 }
 
 int sprdwl_remain_chan(struct sprdwl_priv *priv, u8 vif_ctx_id,
-		       struct ieee80211_channel *channel,
-		       enum nl80211_channel_type channel_type,
-		       u32 duration, u64 *cookie)
+			   struct ieee80211_channel *channel,
+			   enum nl80211_channel_type channel_type,
+			   u32 duration, u64 *cookie)
 {
 	struct sprdwl_msg_buf *msg;
 	struct sprdwl_cmd_remain_chan *p;
@@ -1785,7 +1899,7 @@ int sprdwl_remain_chan(struct sprdwl_priv *priv, u8 vif_ctx_id,
 }
 
 int sprdwl_cancel_remain_chan(struct sprdwl_priv *priv,
-			       u8 vif_ctx_id, u64 cookie)
+				   u8 vif_ctx_id, u64 cookie)
 {
 	struct sprdwl_msg_buf *msg;
 	struct sprdwl_cmd_cancel_remain_chan *p;
@@ -1886,7 +2000,7 @@ int sprdwl_set_cqm_rssi(struct sprdwl_priv *priv, u8 vif_ctx_id,
 }
 
 int sprdwl_set_roam_offload(struct sprdwl_priv *priv, u8 vif_ctx_id,
-			    u8 sub_type, const u8 *data, u8 len)
+				u8 sub_type, const u8 *data, u8 len)
 {
 	struct sprdwl_msg_buf *msg;
 	struct sprdwl_cmd_roam_offload_data *p;
@@ -1909,19 +2023,37 @@ int sprdwl_set_roam_offload(struct sprdwl_priv *priv, u8 vif_ctx_id,
 
 int sprdwl_tdls_mgmt(struct sprdwl_vif *vif, struct sk_buff *skb)
 {
+#ifndef UWE5621_FTR
+	struct sprdwl_msg_buf *msg;
+#endif
 	int ret;
 
+#ifndef UWE5621_FTR
+	msg = sprdwl_intf_get_msg_buf(vif->priv, SPRDWL_TYPE_DATA,
+					   SPRDWL_MODE_STATION, vif->ctx_id);
+	if (!msg) {
+		if (vif->priv->hw_type == SPRDWL_HW_SDIO_BA)
+			sprdwl_stop_net(vif);
+		vif->ndev->stats.tx_fifo_errors++;
+		wl_err("%s, %d, get msg bug failed\n", __func__, __LINE__);
+		return -NETDEV_TX_BUSY;
+	}
+#endif
 	/* temp debug use */
 	if (skb_headroom(skb) < vif->ndev->needed_headroom)
 		wl_err("%s skb head len err:%d %d\n",
-		       __func__, skb_headroom(skb),
-		       vif->ndev->needed_headroom);
-
+			   __func__, skb_headroom(skb),
+			   vif->ndev->needed_headroom);
+#ifdef UWE5621_FTR
 	/*send TDLS mgmt through cmd port instead of data port,needed by CP2*/
 	ret = sprdwl_send_tdlsdata_use_cmd(skb, vif, 1);
+#else
+	/* sprdwl_send_data: offset use 2 for cp bytes align */
+	ret = sprdwl_send_data(vif, msg, skb, 2, false);
+#endif
 	if (ret) {
-		wl_err("%s drop msg due to TX Err\n",
-		       __func__);
+		//wl_err("%s drop msg due to TX Err\n",
+		//	   __func__);
 		goto out;
 	}
 
@@ -1933,14 +2065,14 @@ int sprdwl_tdls_mgmt(struct sprdwl_vif *vif, struct sk_buff *skb)
 	netif_trans_update(vif->ndev);
 #endif
 	wl_hex_dump(L_DBG, "TX packet: ", DUMP_PREFIX_OFFSET,
-			     16, 1, skb->data, skb->len, 0);
+				 16, 1, skb->data, skb->len, 0);
 
 out:
 	return ret;
 }
 
 int sprdwl_send_tdls_cmd(struct sprdwl_vif *vif, u8 vif_ctx_id, const u8 *peer,
-		     int oper)
+			 int oper)
 {
 	struct sprdwl_work *misc_work;
 	struct sprdwl_tdls_work tdls;
@@ -1964,7 +2096,7 @@ int sprdwl_send_tdls_cmd(struct sprdwl_vif *vif, u8 vif_ctx_id, const u8 *peer,
 }
 
 int sprdwl_tdls_oper(struct sprdwl_priv *priv, u8 vif_ctx_id, const u8 *peer,
-		     int oper)
+			 int oper)
 {
 	struct sprdwl_msg_buf *msg;
 	struct sprdwl_cmd_tdls *p;
@@ -1982,8 +2114,8 @@ int sprdwl_tdls_oper(struct sprdwl_priv *priv, u8 vif_ctx_id, const u8 *peer,
 }
 
 int sprdwl_start_tdls_channel_switch(struct sprdwl_priv *priv, u8 vif_ctx_id,
-				     const u8 *peer_mac, u8 primary_chan,
-				     u8 second_chan_offset, u8 band)
+					 const u8 *peer_mac, u8 primary_chan,
+					 u8 second_chan_offset, u8 band)
 {
 	struct sprdwl_msg_buf *msg;
 	struct sprdwl_cmd_tdls *p;
@@ -2008,7 +2140,7 @@ int sprdwl_start_tdls_channel_switch(struct sprdwl_priv *priv, u8 vif_ctx_id,
 }
 
 int sprdwl_cancel_tdls_channel_switch(struct sprdwl_priv *priv, u8 vif_ctx_id,
-				      const u8 *peer_mac)
+					  const u8 *peer_mac)
 {
 	struct sprdwl_msg_buf *msg;
 	struct sprdwl_cmd_tdls *p;
@@ -2027,7 +2159,7 @@ int sprdwl_cancel_tdls_channel_switch(struct sprdwl_priv *priv, u8 vif_ctx_id,
 }
 
 int sprdwl_notify_ip(struct sprdwl_priv *priv, u8 vif_ctx_id, u8 ip_type,
-		     u8 *ip_addr)
+			 u8 *ip_addr)
 {
 	struct sprdwl_msg_buf *msg;
 	u8 *ip_value;
@@ -2036,7 +2168,7 @@ int sprdwl_notify_ip(struct sprdwl_priv *priv, u8 vif_ctx_id, u8 ip_type,
 	if (ip_type != SPRDWL_IPV4 && ip_type != SPRDWL_IPV6)
 		return -EINVAL;
 	ip_len = (ip_type == SPRDWL_IPV4) ?
-	    SPRDWL_IPV4_ADDR_LEN : SPRDWL_IPV6_ADDR_LEN;
+		SPRDWL_IPV4_ADDR_LEN : SPRDWL_IPV6_ADDR_LEN;
 	msg = sprdwl_cmd_getbuf(priv, ip_len, vif_ctx_id,
 				SPRDWL_HEAD_RSP, WIFI_CMD_NOTIFY_IP_ACQUIRED);
 	if (!msg)
@@ -2141,11 +2273,11 @@ int sprdwl_set_11v_feature_support(struct sprdwl_priv *priv,
 	p->len = 8;
 
 	return sprdwl_cmd_send_recv(priv, msg, CMD_WAIT_TIMEOUT,
-				    (u8 *)&state, &rlen);
+					(u8 *)&state, &rlen);
 }
 
 int sprdwl_set_11v_sleep_mode(struct sprdwl_priv *priv, u8 vif_ctx_id,
-			      u8 status, u16 interval)
+				  u8 status, u16 interval)
 {
 	struct sprdwl_msg_buf *msg = NULL;
 	struct sprdwl_cmd_rsp_state_code state;
@@ -2168,7 +2300,7 @@ int sprdwl_set_11v_sleep_mode(struct sprdwl_priv *priv, u8 vif_ctx_id,
 	p->len = 8;
 
 	return sprdwl_cmd_send_recv(priv, msg, CMD_WAIT_TIMEOUT,
-				    (u8 *)&state, &rlen);
+					(u8 *)&state, &rlen);
 }
 
 int sprdwl_send_ba_mgmt(struct sprdwl_priv *priv, u8 vif_ctx_id,
@@ -2327,7 +2459,7 @@ int sprdwl_xmit_data2cmd(struct sk_buff *skb, struct net_device *ndev)
 
 	if (unlikely(atomic_read(&cmd->refcnt) > 0)) {
 		wl_err("%s, cmd->refcnt = %d, Try later again\n",
-		       __func__, atomic_read(&cmd->refcnt));
+			   __func__, atomic_read(&cmd->refcnt));
 		return -EAGAIN;
 	}
 
@@ -2352,18 +2484,18 @@ int sprdwl_xmit_data2cmd(struct sk_buff *skb, struct net_device *ndev)
 	memcpy(skb->data, temp_flag, FLAG_SIZE);
 	/*malloc msg buffer*/
 	msg = sprdwl_cmd_getbuf_atomic(vif->priv, skb->len, vif->ctx_id,
-				       SPRDWL_HEAD_RSP, WIFI_CMD_TX_DATA);
+					   SPRDWL_HEAD_RSP, WIFI_CMD_TX_DATA);
 	if (!msg) {
 		wl_err("%s, %d, getmsgbuf fail, free skb\n",
-		       __func__, __LINE__);
+			   __func__, __LINE__);
 		dev_kfree_skb(skb);
 		return -ENOMEM;
 	}
 	/*send group in BK to avoid FW hang*/
 	dscr = (struct tx_msdu_dscr *)skb->data;
 	if ((vif->mode == SPRDWL_MODE_AP ||
-	     vif->mode == SPRDWL_MODE_P2P_GO) &&
-	     (dscr->sta_lut_index < 6)) {
+		 vif->mode == SPRDWL_MODE_P2P_GO) &&
+		 (dscr->sta_lut_index < 6)) {
 		dscr->buffer_info.msdu_tid = prio_1;
 		wl_info("%s, %d, SOFTAP/GO group go as BK\n", __func__, __LINE__);
 	}
@@ -2495,7 +2627,7 @@ int sprdwl_cmd_host_wakeup_fw(struct sprdwl_priv *priv, u8 ctx_id)
 	p->value = 0;
 
 	ret =  sprdwl_cmd_send_recv(priv, msg, CMD_WAIT_TIMEOUT,
-				    &r_buf, &r_len);
+					&r_buf, &r_len);
 
 	if (!ret && (1 == r_buf)) {
 		intf->fw_awake = 1;
@@ -2567,10 +2699,10 @@ unsigned short sprdwl_rx_rsp_process(struct sprdwl_priv *priv, u8 *msg)
 	if (hdr->common.ctx_id >= STAP_MODE_COEXI_NUM ||
 #endif
 		hdr->cmd_id > WIFI_CMD_MAX ||
-	    plen > 2048) {
+		plen > 2048) {
 		wl_err("%s wrong CMD_RSP: ctx_id:%d;cmd_id:%d\n",
-		       __func__, hdr->common.ctx_id,
-		       hdr->cmd_id);
+			   __func__, hdr->common.ctx_id,
+			   hdr->cmd_id);
 		return 0;
 	}
 	if (atomic_inc_return(&cmd->refcnt) >= SPRDWL_CMD_EXIT_VAL) {
@@ -2588,14 +2720,14 @@ unsigned short sprdwl_rx_rsp_process(struct sprdwl_priv *priv, u8 *msg)
 
 	spin_lock_bh(&cmd->lock);
 	if (!cmd->data && SPRDWL_GET_LE32(hdr->mstime) == cmd->mstime &&
-	    hdr->cmd_id == cmd->cmd_id) {
+		hdr->cmd_id == cmd->cmd_id) {
 		wl_debug("ctx_id %d recv rsp[%s]\n",
 			hdr->common.ctx_id, cmd2str(hdr->cmd_id));
 		if (unlikely(hdr->status != 0)) {
 			wl_debug("%s ctx_id %d recv rsp[%s] status[%s]\n",
-			       __func__, hdr->common.ctx_id,
-			       cmd2str(hdr->cmd_id),
-			       err2str(hdr->status));
+				   __func__, hdr->common.ctx_id,
+				   cmd2str(hdr->cmd_id),
+				   err2str(hdr->status));
 			handle_flag = handle_rsp_status_err(hdr->cmd_id,
 						hdr->status);
 		}
@@ -2603,12 +2735,12 @@ unsigned short sprdwl_rx_rsp_process(struct sprdwl_priv *priv, u8 *msg)
 		complete(&cmd->completed);
 	} else {
 		kfree(data);
-		wl_err("%s ctx_id %d recv mismatched rsp[%s] status[%s]\n",
-		       __func__, hdr->common.ctx_id,
-		       cmd2str(hdr->cmd_id),
-		       err2str(hdr->status));
-		wl_err("%s mstime:[%u %u]\n", __func__,
-		       SPRDWL_GET_LE32(hdr->mstime), cmd->mstime);
+		//wl_err("%s ctx_id %d recv mismatched rsp[%s] status[%s]\n",
+		//	   __func__, hdr->common.ctx_id,
+		//	   cmd2str(hdr->cmd_id),
+		//	   err2str(hdr->status));
+		//wl_err("%s mstime:[%u %u]\n", __func__,
+		//	   SPRDWL_GET_LE32(hdr->mstime), cmd->mstime);
 	}
 	spin_unlock_bh(&cmd->lock);
 	atomic_dec(&cmd->refcnt);
@@ -2624,44 +2756,44 @@ unsigned short sprdwl_rx_rsp_process(struct sprdwl_priv *priv, u8 *msg)
 void sprdwl_event_station(struct sprdwl_vif *vif, u8 *data, u16 len)
 {
 	struct sprdwl_event_new_station *sta =
-	    (struct sprdwl_event_new_station *)data;
+		(struct sprdwl_event_new_station *)data;
 
 	sprdwl_report_softap(vif, sta->is_connect,
-			     sta->mac, sta->ie, sta->ie_len);
+				 sta->mac, sta->ie, sta->ie_len);
 }
 
 void sprdwl_event_scan_done(struct sprdwl_vif *vif, u8 *data, u16 len)
 {
 	struct sprdwl_event_scan_done *p =
-	    (struct sprdwl_event_scan_done *)data;
+		(struct sprdwl_event_scan_done *)data;
 	u8 bucket_id = 0;
 
 	switch (p->type) {
 	case SPRDWL_SCAN_DONE:
 		sprdwl_scan_done(vif, false);
 		wl_ndev_log(L_DBG, vif->ndev, "%s got %d BSSes\n", __func__,
-			    bss_count);
+				bss_count);
 		break;
 	case SPRDWL_SCHED_SCAN_DONE:
 		sprdwl_sched_scan_done(vif, false);
 		wl_ndev_log(L_DBG, vif->ndev, "%s schedule scan got %d BSSes\n",
-			    __func__, bss_count);
+				__func__, bss_count);
 		break;
 	case SPRDWL_GSCAN_DONE:
 		bucket_id = ((struct sprdwl_event_gscan_done *)data)->bucket_id;
 		sprdwl_gscan_done(vif, bucket_id);
 		wl_ndev_log(L_DBG, vif->ndev, "%s gscan got %d bucketid done\n",
-			    __func__, bucket_id);
+				__func__, bucket_id);
 		break;
 	case SPRDWL_SCAN_ERROR:
 	default:
 		sprdwl_scan_done(vif, true);
 		sprdwl_sched_scan_done(vif, false);
-		if (p->type == SPRDWL_SCAN_ERROR)
-			wl_ndev_log(L_ERR, vif->ndev, "%s error!\n", __func__);
-		else
-			wl_ndev_log(L_ERR, vif->ndev, "%s invalid scan done type: %d\n",
-				   __func__, p->type);
+		//if (p->type == SPRDWL_SCAN_ERROR)
+		//	wl_ndev_log(L_ERR, vif->ndev, "%s error!\n", __func__);
+		//else
+		//	wl_ndev_log(L_ERR, vif->ndev, "%s invalid scan done type: %d\n",
+		//		   __func__, p->type);
 		break;
 	}
 	bss_count = 0;
@@ -2700,7 +2832,7 @@ void sprdwl_event_connect(struct sprdwl_vif *vif, u8 *data, u16 len)
 	/* the first byte is status code */
 	memcpy(&conn_info.status, pos, sizeof(conn_info.status));
 	if (conn_info.status != SPRDWL_CONNECT_SUCCESS &&
-	    conn_info.status != SPRDWL_ROAM_SUCCESS){
+		conn_info.status != SPRDWL_ROAM_SUCCESS){
 		/*Assoc response status code by set in the 3 byte if failure*/
 		memcpy(&status_code, pos+2, sizeof(status_code));
 		goto out;
@@ -2765,32 +2897,29 @@ void sprdwl_event_disconnect(struct sprdwl_vif *vif, u8 *data, u16 len)
 	u16 reason_code;
 
 	memcpy(&reason_code, data, sizeof(reason_code));
+	wl_info("%s reason code = %d\n", __func__, reason_code);
 #ifdef SYNC_DISCONNECT
-	/*Report disconnection on version > 4.9.60, even though disconnect
-	 is from wpas, otherwise it returns -EALREADY on next connect.*/
-#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 9, 60)
 	if (atomic_read(&vif->sync_disconnect_event)) {
 		vif->disconnect_event_code = reason_code;
 		atomic_set(&vif->sync_disconnect_event, 0);
 		wake_up(&vif->disconnect_wq);
-		wl_err("%s reason code = %d\n", __func__, reason_code);
 	} else
 #endif
-#endif
-	sprdwl_report_disconnection(vif, reason_code);
+		sprdwl_report_disconnection(vif, reason_code);
+
 }
 
 void sprdwl_event_mic_failure(struct sprdwl_vif *vif, u8 *data, u16 len)
 {
 	struct sprdwl_event_mic_failure *mic_failure =
-	    (struct sprdwl_event_mic_failure *)data;
+		(struct sprdwl_event_mic_failure *)data;
 
 	sprdwl_report_mic_failure(vif, mic_failure->is_mcast,
 				  mic_failure->key_id);
 }
 
 void sprdwl_event_remain_on_channel_expired(struct sprdwl_vif *vif,
-					    u8 *data, u16 len)
+						u8 *data, u16 len)
 {
 	sprdwl_report_remain_on_channel_expired(vif);
 }
@@ -2798,12 +2927,12 @@ void sprdwl_event_remain_on_channel_expired(struct sprdwl_vif *vif,
 void sprdwl_event_mlme_tx_status(struct sprdwl_vif *vif, u8 *data, u16 len)
 {
 	struct sprdwl_event_mgmt_tx_status *tx_status =
-	    (struct sprdwl_event_mgmt_tx_status *)data;
+		(struct sprdwl_event_mgmt_tx_status *)data;
 
 	sprdwl_report_mgmt_tx_status(vif, SPRDWL_GET_LE64(tx_status->cookie),
-				     tx_status->buf,
-				     SPRDWL_GET_LE16(tx_status->len),
-				     tx_status->ack);
+					 tx_status->buf,
+					 SPRDWL_GET_LE16(tx_status->len),
+					 tx_status->ack);
 }
 
 /* @flag: 1 for data, 0 for event */
@@ -2862,7 +2991,7 @@ void sprdwl_event_epno_results(struct sprdwl_vif *vif, u8 *data, u16 data_len)
 	struct wiphy *wiphy = priv->wiphy;
 
 	wl_hex_dump(L_DBG, "epno result:", DUMP_PREFIX_OFFSET,
-			     16, 1, data, data_len, true);
+				 16, 1, data, data_len, true);
 
 	epno_results = (struct sprdwl_epno_results *)data;
 	if (epno_results->nr_scan_results <= 0) {
@@ -2884,7 +3013,7 @@ void sprdwl_event_epno_results(struct sprdwl_vif *vif, u8 *data, u16 data_len)
 
 	nla_put_u32(skb, GSCAN_RESULTS_REQUEST_ID, epno_results->request_id);
 	nla_put_u32(skb, GSCAN_RESULTS_NUM_RESULTS_AVAILABLE,
-		    epno_results->nr_scan_results);
+			epno_results->nr_scan_results);
 	nla_put_u8(skb, GSCAN_RESULTS_SCAN_RESULT_MORE_DATA, 0);
 
 	attr = nla_nest_start(skb, GSCAN_RESULTS_LIST);
@@ -2912,19 +3041,19 @@ void sprdwl_event_epno_results(struct sprdwl_vif *vif, u8 *data, u16 data_len)
 		nla_put(skb, GSCAN_RESULTS_SCAN_RESULT_BSSID, ETH_ALEN,
 			epno_results->results[i].bssid);
 		nla_put_u32(skb, GSCAN_RESULTS_SCAN_RESULT_CHANNEL,
-			    epno_results->results[i].channel);
+				epno_results->results[i].channel);
 		nla_put_s32(skb, GSCAN_RESULTS_SCAN_RESULT_RSSI,
-			    epno_results->results[i].rssi);
+				epno_results->results[i].rssi);
 		nla_put_u32(skb, GSCAN_RESULTS_SCAN_RESULT_RTT,
-			    epno_results->results[i].rtt);
+				epno_results->results[i].rtt);
 		nla_put_u32(skb, GSCAN_RESULTS_SCAN_RESULT_RTT_SD,
-			    epno_results->results[i].rtt_sd);
+				epno_results->results[i].rtt_sd);
 		nla_put_u16(skb, GSCAN_RESULTS_SCAN_RESULT_BEACON_PERIOD,
-			    epno_results->results[i].beacon_period);
+				epno_results->results[i].beacon_period);
 		nla_put_u16(skb, GSCAN_RESULTS_SCAN_RESULT_CAPABILITY,
-			    epno_results->results[i].capability);
+				epno_results->results[i].capability);
 		nla_put_string(skb, GSCAN_RESULTS_SCAN_RESULT_SSID,
-			       epno_results->results[i].ssid);
+				   epno_results->results[i].ssid);
 
 		nla_nest_end(skb, sub_attr);
 	}
@@ -2993,8 +3122,8 @@ void sprdwl_event_gscan_frame(struct sprdwl_vif *vif, u8 *data, u16 len)
 		pos += sizeof(struct sprdwl_gscan_result) + buf_len;
 
 		wl_ndev_log(L_DBG, vif->ndev, "%s ch:%d id:%d len:%d aval:%d, report_event:%d\n",
-			    __func__, frame->channel, bucket_id,
-			    buf_len, avail_len, report_event);
+				__func__, frame->channel, bucket_id,
+				buf_len, avail_len, report_event);
 	}
 
 	if (report_event == REPORT_EVENTS_BUFFER_FULL)
@@ -3145,12 +3274,12 @@ void sprdwl_event_thermal_warn(struct sprdwl_vif *vif, u8 *data, u16 len)
 		break;
 	case THERMAL_TX_STOP:
 		wl_err("%s, %d, netif_stop_queue because of thermal warn\n",
-		       __func__, __LINE__);
+			   __func__, __LINE__);
 		sprdwl_net_flowcontrl(intf->priv, SPRDWL_MODE_NONE, false);
 		break;
 	case THERMAL_WIFI_DOWN:
 		wl_err("%s, %d, close wifi because of thermal warn\n",
-		       __func__, __LINE__);
+			   __func__, __LINE__);
 		sprdwl_net_flowcontrl(intf->priv, SPRDWL_MODE_NONE, false);
 		for (mode = SPRDWL_MODE_STATION; mode < SPRDWL_MODE_MAX; mode++) {
 			if (intf->priv->fw_stat[mode] == SPRDWL_INTF_OPEN)
@@ -3219,8 +3348,8 @@ int sprdwl_fw_power_down_ack(struct sprdwl_priv *priv, u8 ctx_id)
 	}
 
 	if (tx_num > 0 ||
-	    !list_empty(&tx_msg->xmit_msg_list.to_send_list) ||
-	    !list_empty(&tx_msg->xmit_msg_list.to_free_list)) {
+		!list_empty(&tx_msg->xmit_msg_list.to_send_list) ||
+		!list_empty(&tx_msg->xmit_msg_list.to_free_list)) {
 		if (intf->fw_power_down == 1)
 			goto err;
 		p->value = 0;
@@ -3244,6 +3373,7 @@ int sprdwl_fw_power_down_ack(struct sprdwl_priv *priv, u8 ctx_id)
 	ret =  sprdwl_cmd_send_recv(priv, msg, CMD_WAIT_TIMEOUT, NULL, NULL);
 
 	if (intf->fw_power_down == 1) {
+		sprdwcn_bus_allow_sleep(WIFI);
 		sprdwl_unboost();
 	}
 
@@ -3382,8 +3512,8 @@ unsigned short sprdwl_rx_event_process(struct sprdwl_priv *priv, u8 *msg)
 	plen = SPRDWL_GET_LE16(hdr->plen);
 	if (!priv) {
 		wl_err("%s priv is NULL [%u]ctx_id %d recv[%s]len: %d\n",
-		       __func__, le32_to_cpu(hdr->mstime), ctx_id,
-		       evt2str(hdr->cmd_id), hdr->plen);
+			   __func__, le32_to_cpu(hdr->mstime), ctx_id,
+			   evt2str(hdr->cmd_id), hdr->plen);
 		return plen;
 	}
 
@@ -3392,7 +3522,7 @@ unsigned short sprdwl_rx_event_process(struct sprdwl_priv *priv, u8 *msg)
 		evt2str(hdr->cmd_id), plen);
 
 	wl_hex_dump(L_DBG, "EVENT: ", DUMP_PREFIX_OFFSET, 16, 1,
-			     (u8 *)hdr, hdr->plen, 0);
+				 (u8 *)hdr, hdr->plen, 0);
 
 	len = plen - sizeof(*hdr);
 	vif = ctx_id_to_vif(priv, ctx_id);
@@ -3466,9 +3596,11 @@ unsigned short sprdwl_rx_event_process(struct sprdwl_priv *priv, u8 *msg)
 		sprdwl_event_nan(vif, data, len);
 		break;
 #endif /* NAN_SUPPORT */
+#ifdef UWE5621_FTR
 	case WIFI_EVENT_STA_LUT_INDEX:
 		sprdwl_event_sta_lut(vif, data, len);
 		break;
+#endif
 	case WIFI_EVENT_BA:
 		sprdwl_event_ba_mgmt(vif, data, len);
 		break;
@@ -3588,8 +3720,8 @@ int sprdwl_sync_disconnect_event(struct sprdwl_vif *vif, unsigned int timeout)
 #endif
 
 int sprdwl_set_packet_offload(struct sprdwl_priv *priv, u8 vif_ctx_id,
-			      u32 req, u8 enable, u32 interval,
-			      u32 len, u8 *data)
+				  u32 req, u8 enable, u32 interval,
+				  u32 len, u8 *data)
 {
 	struct sprdwl_msg_buf *msg;
 	struct sprdwl_cmd_packet_offload *p;
diff --git a/drivers/net/wireless/uwe5622/unisocwifi/cmdevt.h b/drivers/net/wireless/uwe5622/unisocwifi/cmdevt.h
index 8dd59bc2c..ce8c774e8 100644
--- a/drivers/net/wireless/uwe5622/unisocwifi/cmdevt.h
+++ b/drivers/net/wireless/uwe5622/unisocwifi/cmdevt.h
@@ -907,6 +907,7 @@ struct sprdwl_tlv_data {
 /* TLV type list */
 #define GET_INFO_TLV_TP_OTT	1
 #define NOTIFY_AP_VERSION	2
+#define NOTIFY_CREDIT_VIA_RX_DATA 5
 
 struct ap_version_tlv_elmt {
 #define NOTIFY_AP_VERSION_USER 0
diff --git a/drivers/net/wireless/uwe5622/unisocwifi/dbg_ini_util.c b/drivers/net/wireless/uwe5622/unisocwifi/dbg_ini_util.c
index 70415e79b..264e9f755 100644
--- a/drivers/net/wireless/uwe5622/unisocwifi/dbg_ini_util.c
+++ b/drivers/net/wireless/uwe5622/unisocwifi/dbg_ini_util.c
@@ -264,9 +264,9 @@ int sprdwl_dbg_new_beacon_tail(const u8 *beacon_tail, int tail_len, u8 *new_tail
 
 #define ERP_INFO_BARKER_PREAMBLE_MODE 4
 	if (chn <= 14) {
-	    *tail++ = WLAN_EID_ERP_INFO;
-	    *tail++ = 1;
-	    *tail++ = ERP_INFO_BARKER_PREAMBLE_MODE;
+		*tail++ = WLAN_EID_ERP_INFO;
+		*tail++ = 1;
+		*tail++ = ERP_INFO_BARKER_PREAMBLE_MODE;
 	}
 
 	while (tail_len > 2) {
diff --git a/drivers/net/wireless/uwe5622/unisocwifi/debug.c b/drivers/net/wireless/uwe5622/unisocwifi/debug.c
index 998f00ec5..8f12cf16a 100644
--- a/drivers/net/wireless/uwe5622/unisocwifi/debug.c
+++ b/drivers/net/wireless/uwe5622/unisocwifi/debug.c
@@ -175,12 +175,12 @@ void adjust_ts_cnt_debug(char *buf, unsigned char offset)
 		spin_unlock_bh(&debug_ctrl.debug_ctrl_lock);
 	} else {
 		memset(g_debug_ts, 0,
-		       (MAX_DEBUG_TS_INDEX *
+			   (MAX_DEBUG_TS_INDEX *
 			sizeof(struct debug_time_stamp)));
 		memset(g_debug_cnt, 0,
-		       (MAX_DEBUG_CNT_INDEX * sizeof(struct debug_cnt)));
+			   (MAX_DEBUG_CNT_INDEX * sizeof(struct debug_cnt)));
 		memset(g_debug_record, 0,
-		       (MAX_RECORD_NUM * sizeof(struct debug_record)));
+			   (MAX_RECORD_NUM * sizeof(struct debug_record)));
 		debug_ctrl.start = true;
 		spin_unlock_bh(&debug_ctrl.debug_ctrl_lock);
 	}
diff --git a/drivers/net/wireless/uwe5622/unisocwifi/defrag.c b/drivers/net/wireless/uwe5622/unisocwifi/defrag.c
index 0b3cfb767..816940b47 100644
--- a/drivers/net/wireless/uwe5622/unisocwifi/defrag.c
+++ b/drivers/net/wireless/uwe5622/unisocwifi/defrag.c
@@ -26,11 +26,11 @@ static struct rx_defrag_node
 
 	list_for_each_entry(pos_node, &defrag_entry->list, list) {
 		if ((pos_node->desc.sta_lut_index ==
-		     msdu_desc->sta_lut_index) &&
-		    (pos_node->desc.tid == msdu_desc->tid)) {
+			 msdu_desc->sta_lut_index) &&
+			(pos_node->desc.tid == msdu_desc->tid)) {
 			if ((pos_node->desc.seq_num == msdu_desc->seq_num) &&
-			    ((pos_node->last_frag_num + 1) ==
-			     msdu_desc->frag_num)) {
+				((pos_node->last_frag_num + 1) ==
+				 msdu_desc->frag_num)) {
 				/* Node alive & fragment avail */
 				pos_node->last_frag_num = msdu_desc->frag_num;
 				wl_debug("%s: last_frag_num: %d\n",
@@ -65,7 +65,7 @@ static inline void __init_first_frag_node(struct rx_defrag_node *node,
 
 static struct rx_defrag_node
 *init_first_defrag_node(struct sprdwl_rx_defrag_entry *defrag_entry,
-		      struct rx_msdu_desc *msdu_desc)
+			  struct rx_msdu_desc *msdu_desc)
 {
 	struct rx_defrag_node *node = NULL, *pos_node = NULL;
 	bool ret = true;
@@ -73,20 +73,20 @@ static struct rx_defrag_node
 	/* Check whether this entry alive or this fragment avail */
 	list_for_each_entry(pos_node, &defrag_entry->list, list) {
 		if ((pos_node->desc.sta_lut_index ==
-		     msdu_desc->sta_lut_index) &&
-		    (pos_node->desc.tid == msdu_desc->tid)) {
+			 msdu_desc->sta_lut_index) &&
+			(pos_node->desc.tid == msdu_desc->tid)) {
 			if (!seqno_leq(msdu_desc->seq_num,
-				       pos_node->desc.seq_num)) {
+					   pos_node->desc.seq_num)) {
 				/* Replace this entry */
 				wl_err("%s: fragment replace: %d, %d\n",
-				       __func__, msdu_desc->seq_num,
-				       pos_node->desc.seq_num);
+					   __func__, msdu_desc->seq_num,
+					   pos_node->desc.seq_num);
 				node = pos_node;
 			} else {
 				/* fragment not avail */
 				wl_err("%s: fragment not avail: %d, %d\n",
-				       __func__, msdu_desc->seq_num,
-				       pos_node->desc.seq_num);
+					   __func__, msdu_desc->seq_num,
+					   pos_node->desc.seq_num);
 				ret = false;
 			}
 			break;
@@ -135,7 +135,7 @@ static struct rx_defrag_node
 
 static struct sk_buff
 *defrag_single_data_process(struct sprdwl_rx_defrag_entry *defrag_entry,
-			    struct sk_buff *pskb)
+				struct sk_buff *pskb)
 {
 	struct rx_defrag_node *node = NULL;
 	struct rx_msdu_desc *msdu_desc = (struct rx_msdu_desc *)pskb->data;
@@ -192,7 +192,7 @@ static struct sk_buff
 				wl_debug("%s: frag_len: %d, frag_offset: %d\n",
 					 __func__, frag_len, frag_offset);
 				memcpy((skb->data + offset),
-				       (pos_skb->data + frag_offset), frag_len);
+					   (pos_skb->data + frag_offset), frag_len);
 				offset += frag_len;
 
 				dev_kfree_skb(pos_skb);
@@ -204,7 +204,7 @@ static struct sk_buff
 			/* Move this entry to tail */
 			if (!list_is_last(&node->list, &defrag_entry->list))
 				list_move_tail(&node->list,
-					       &defrag_entry->list);
+						   &defrag_entry->list);
 		}
 	} else {
 		dev_kfree_skb(pskb);
@@ -215,7 +215,7 @@ static struct sk_buff
 
 struct sk_buff
 *defrag_data_process(struct sprdwl_rx_defrag_entry *defrag_entry,
-		     struct sk_buff *pskb)
+			 struct sk_buff *pskb)
 {
 	struct rx_msdu_desc *msdu_desc = (struct rx_msdu_desc *)pskb->data;
 	struct sk_buff *skb = NULL;
diff --git a/drivers/net/wireless/uwe5622/unisocwifi/edma_test.c b/drivers/net/wireless/uwe5622/unisocwifi/edma_test.c
index 5a320b6b5..f45bc8043 100644
--- a/drivers/net/wireless/uwe5622/unisocwifi/edma_test.c
+++ b/drivers/net/wireless/uwe5622/unisocwifi/edma_test.c
@@ -23,7 +23,7 @@
 
 extern struct sprdwl_intf_ops g_intf_ops;
 extern int if_tx_one(struct sprdwl_intf *intf, unsigned char *data,
-		     int len, int chn);
+			 int len, int chn);
 
 unsigned long loop;
 
@@ -69,7 +69,7 @@ void edma_transceive_test_deinit(void)
 	for (i = 0; i < PCIE_CHANNEL_PAIR; i++) {
 		if (!IS_ERR_OR_NULL(task_array[i])) {
 			wl_err(" %s, Destory thread, thread_num=%d,\n",
-			       __func__, i);
+				   __func__, i);
 			kthread_stop(task_array[i]);
 			task_array[i] = NULL;
 		}
@@ -120,8 +120,8 @@ int do_tx(int channel)
 
 #define SPRDWL_SDIO_DEBUG_BUFLEN 128
 static ssize_t pcie_read_info(struct file *file,
-			      char __user *user_buf,
-			      size_t count, loff_t *ppos)
+				  char __user *user_buf,
+				  size_t count, loff_t *ppos)
 {
 	size_t ret = 0;
 	unsigned int buflen, len;
@@ -181,14 +181,14 @@ void edma_transceive_test_run(int pairs)
 		chn_tx_fail[i] = 0;
 
 		task_array[i] = kthread_create(edma_transceive_test_exec,
-							    (unsigned long *)loop,
-							    "edma_transceive_%d", i);
+								(unsigned long *)loop,
+								"edma_transceive_%d", i);
 		chn_tx_dentry[i] = debugfs_create_file(tx_name[i], S_IRUSR, priv->debugfs, (unsigned long *)loop, &pcie_debug_fops);
 		loop++;
 		if (IS_ERR(task_array[i])) {
 			err = PTR_ERR(task_array[i]);
 			wl_err("%s, Fail, thread_num=%d,error_num=%d.",
-			       __func__, i, err);
+				   __func__, i, err);
 		} else {
 			wl_info(" %s, Start thread, thread_num=%d,\n",
 				__func__, i);
@@ -208,7 +208,7 @@ void edma_transceive_test_stop(void)
 	for (i = 0; i < PCIE_CHANNEL_PAIR; i++) {
 		if (!IS_ERR_OR_NULL(task_array[i])) {
 			wl_err(" %s, Stop thread, thread_num=%d,\n",
-			       __func__, i);
+				   __func__, i);
 			kthread_stop(task_array[i]);
 			task_array[i] = NULL;
 		}
@@ -335,7 +335,7 @@ void edma_transceive_test_trigger(char *cmd)
 
 	if (pairs <= 0 || pairs > PCIE_CHANNEL_PAIR) {
 		wl_err("%s, Invalid chn pairs(%ld), use default val(8)\n",
-		       __func__, pairs);
+			   __func__, pairs);
 		pairs = PCIE_CHANNEL_PAIR;
 	}
 
diff --git a/drivers/net/wireless/uwe5622/unisocwifi/ibss.c b/drivers/net/wireless/uwe5622/unisocwifi/ibss.c
index d335635bc..822a17c6b 100644
--- a/drivers/net/wireless/uwe5622/unisocwifi/ibss.c
+++ b/drivers/net/wireless/uwe5622/unisocwifi/ibss.c
@@ -28,8 +28,8 @@
 
 /* cfg80211 */
 int sprdwl_cfg80211_join_ibss(struct wiphy *wiphy,
-				     struct net_device *ndev,
-				     struct cfg80211_ibss_params *params)
+					 struct net_device *ndev,
+					 struct cfg80211_ibss_params *params)
 {
 	int ret = 0;
 	struct ieee80211_channel *chan;
@@ -74,7 +74,7 @@ int sprdwl_cfg80211_join_ibss(struct wiphy *wiphy,
 
 	wl_ndev_log(L_INFO, ndev, "%s params->ssid=%s\n", __func__, params->ssid);
 	wl_ndev_log(L_INFO, ndev, "%s params->ssid_len=%d\n",
-		    __func__, params->ssid_len);
+			__func__, params->ssid_len);
 	join_params_size = sizeof(join_params);
 	memset(&join_params, 0, join_params_size);
 	memcpy(join_params.ssid, params->ssid, params->ssid_len);
@@ -88,9 +88,9 @@ int sprdwl_cfg80211_join_ibss(struct wiphy *wiphy,
 		memset(join_params.bssid, 0, ETH_ALEN);
 	}
 	wl_ndev_log(L_INFO, ndev, "%s join_params.ssid=%s\n",
-		    __func__, join_params.ssid);
+			__func__, join_params.ssid);
 	wl_ndev_log(L_INFO, ndev, "%s join_params.ssid_len=%d\n",
-		    __func__, join_params.ssid_len);
+			__func__, join_params.ssid_len);
 
 	/* attribute */
 	ret = sprdwl_set_ibss_attribute(vif->priv, vif->mode,
@@ -129,7 +129,7 @@ int sprdwl_cfg80211_join_ibss(struct wiphy *wiphy,
 #endif /* IBSS_RSN_SUPPORT */
 
 	ret = sprdwl_ibss_join(vif->priv, vif->mode,
-			       &join_params, join_params_size);
+				   &join_params, join_params_size);
 	if (ret) {
 		wl_ndev_log(L_ERR, ndev, "%s join failed (%d)\n", __func__, ret);
 		return ret;
@@ -144,7 +144,7 @@ int sprdwl_cfg80211_join_ibss(struct wiphy *wiphy,
 }
 
 int sprdwl_cfg80211_leave_ibss(struct wiphy *wiphy,
-				      struct net_device *ndev)
+					  struct net_device *ndev)
 {
 	struct sprdwl_vif *vif = netdev_priv(ndev);
 	enum sm_state old_state = vif->sm_state;
diff --git a/drivers/net/wireless/uwe5622/unisocwifi/intf.h b/drivers/net/wireless/uwe5622/unisocwifi/intf.h
index 41b9bd5a3..c17356251 100644
--- a/drivers/net/wireless/uwe5622/unisocwifi/intf.h
+++ b/drivers/net/wireless/uwe5622/unisocwifi/intf.h
@@ -24,17 +24,35 @@ struct sprdwl_priv;
 struct sprdwl_if_ops {
 	struct sprdwl_msg_buf *(*get_msg_buf)(void *sdev,
 					      enum sprdwl_head_type type,
+#if defined(UWE5621_FTR)
 					      enum sprdwl_mode mode,
 					      u8 ctx_id);
-
+#else
+					      enum sprdwl_mode mode);
+#endif
 	void (*free_msg_buf)(void *sdev, struct sprdwl_msg_buf *msg);
 	int (*tx)(void *spdev, struct sprdwl_msg_buf *msg);
+
+#if defined(UWE5621_FTR)
 	void (*force_exit)(void *spdev);
 	int (*is_exit)(void *spdev);
+#else
+	void (*force_exit)(void);
+	int (*is_exit)(void);
+#endif /* UWE5621_FTR */
 	int (*suspend)(struct sprdwl_priv *priv);
 	int (*resume)(struct sprdwl_priv *priv);
+#if defined(UWE5621_FTR)
 	void (*debugfs)(void *spdev, struct dentry *dir);
+#else
+	void (*debugfs)(struct dentry *dir);
+#endif /* UWE5621_FTR */
+
+#if defined(UWE5621_FTR)
 	void (*tcp_drop_msg)(void *spdev, struct sprdwl_msg_buf *msg);
+#else
+	void (*tcp_drop_msg)(struct sprdwl_msg_buf *msg);
+#endif /* UWE5621_FTR*/
 	int (*ini_download_status)(void);
 };
 
diff --git a/drivers/net/wireless/uwe5622/unisocwifi/intf_ops.h b/drivers/net/wireless/uwe5622/unisocwifi/intf_ops.h
index c580b3040..3844b0b06 100644
--- a/drivers/net/wireless/uwe5622/unisocwifi/intf_ops.h
+++ b/drivers/net/wireless/uwe5622/unisocwifi/intf_ops.h
@@ -28,7 +28,11 @@ inline struct sprdwl_msg_buf *sprdwl_intf_get_msg_buf(struct sprdwl_priv *priv,
 						      enum sprdwl_mode mode,
 						      u8 ctx_id)
 {
+#if defined(UWE5621_FTR)
 	return priv->if_ops->get_msg_buf(priv->hw_priv, type, mode, ctx_id);
+#else
+	return priv->if_ops->get_msg_buf(priv->hw_priv, type, mode);
+#endif
 }
 
 static inline void sprdwl_intf_free_msg_buf(struct sprdwl_priv *priv,
@@ -49,12 +53,20 @@ static inline int sprdwl_intf_tx(struct sprdwl_priv *priv,
 
 static inline void sprdwl_intf_force_exit(struct sprdwl_priv *priv)
 {
+#if defined(UWE5621_FTR)
 	priv->if_ops->force_exit(priv->hw_priv);
+#else
+	priv->if_ops->force_exit();
+#endif
 }
 
 static inline int sprdwl_intf_is_exit(struct sprdwl_priv *priv)
 {
+#if defined(UWE5621_FTR)
 	return priv->if_ops->is_exit(priv->hw_priv);
+#else
+	return priv->if_ops->is_exit();
+#endif
 }
 
 static inline int sprdwl_intf_suspend(struct sprdwl_priv *priv)
@@ -76,15 +88,25 @@ static inline int sprdwl_intf_resume(struct sprdwl_priv *priv)
 static inline void sprdwl_intf_debugfs(struct sprdwl_priv *priv,
 				       struct dentry *dir)
 {
+#if defined(UWE5621_FTR)
 	if (priv->if_ops->debugfs)
 		priv->if_ops->debugfs(priv->hw_priv, dir);
+#else
+	if (priv->if_ops->debugfs)
+		priv->if_ops->debugfs(dir);
+#endif /* UWE5621_FTR */
 }
 
 static inline void sprdwl_intf_tcp_drop_msg(struct sprdwl_priv *priv,
 					    struct sprdwl_msg_buf *msg)
 {
+#if defined(UWE5621_FTR)
 	if (priv->if_ops->tcp_drop_msg)
 		priv->if_ops->tcp_drop_msg(priv->hw_priv, msg);
+#else
+	if (priv->if_ops->tcp_drop_msg)
+		priv->if_ops->tcp_drop_msg(msg);
+#endif
 }
 
 static inline int sprdwl_get_ini_status(struct sprdwl_priv *priv)
diff --git a/drivers/net/wireless/uwe5622/unisocwifi/main.c b/drivers/net/wireless/uwe5622/unisocwifi/main.c
index edd8ac14f..3b9164214 100644
--- a/drivers/net/wireless/uwe5622/unisocwifi/main.c
+++ b/drivers/net/wireless/uwe5622/unisocwifi/main.c
@@ -24,10 +24,13 @@
 #include "intf_ops.h"
 #include "vendor.h"
 #include "work.h"
+#if defined(UWE5621_FTR)
 #include "tx_msg.h"
 #include "rx_msg.h"
 #include "wl_core.h"
+#endif
 #include "tcp_ack.h"
+#include "rnd_mac_addr.h"
 #ifdef DFS_MASTER
 #include "11h.h"
 #endif
@@ -68,7 +71,7 @@ void sprdwl_netif_rx(struct sk_buff *skb, struct net_device *ndev)
 	rx_if = (struct sprdwl_rx_if *)intf->sprdwl_rx;
 
 	wl_hex_dump(L_DBG, "RX packet: ", DUMP_PREFIX_OFFSET,
-			     16, 1, skb->data, skb->len, 0);
+				 16, 1, skb->data, skb->len, 0);
 
 	skb->dev = ndev;
 	skb->protocol = eth_type_trans(skb, ndev);
@@ -108,7 +111,7 @@ void sprdwl_stop_net(struct sprdwl_vif *vif)
 }
 
 static void sprdwl_netflowcontrl_mode(struct sprdwl_priv *priv,
-				      enum sprdwl_mode mode, bool state)
+					  enum sprdwl_mode mode, bool state)
 {
 	struct sprdwl_vif *vif;
 
@@ -241,8 +244,8 @@ static int sprdwl_start_xmit(struct sk_buff *skb, struct net_device *ndev)
 	if (skb->protocol == cpu_to_be16(ETH_P_PAE) ||
 		skb->protocol == cpu_to_be16(WAPI_TYPE)) {
 		wl_info("send %s frame by WIFI_CMD_TX_DATA\n",
-		       skb->protocol == cpu_to_be16(ETH_P_PAE) ?
-		       "802.1X" : "WAI");
+			   skb->protocol == cpu_to_be16(ETH_P_PAE) ?
+			   "802.1X" : "WAI");
 		if (sprdwl_xmit_data2cmd_wq(skb, ndev) == -EAGAIN)
 			return NETDEV_TX_BUSY;
 		return NETDEV_TX_OK;
@@ -255,14 +258,15 @@ static int sprdwl_start_xmit(struct sk_buff *skb, struct net_device *ndev)
 	/*mode not open, so we will not send data*/
 	if (vif->priv->fw_stat[vif->mode] != SPRDWL_INTF_OPEN) {
 		wl_err_ratelimited("%s, %d, should not send this data\n",
-		       __func__, __LINE__);
-		return NETDEV_TX_BUSY;
+			   __func__, __LINE__);
+		dev_kfree_skb(skb);
+		return NETDEV_TX_OK;
 	}
 
 	msg = sprdwl_intf_get_msg_buf(vif->priv,
-				      SPRDWL_TYPE_DATA,
-				      vif->mode,
-				      vif->ctx_id);
+					  SPRDWL_TYPE_DATA,
+					  vif->mode,
+					  vif->ctx_id);
 	if (!msg) {
 		wl_err("%s, %d, get msg bug failed\n", __func__, __LINE__);
 		ndev->stats.tx_fifo_errors++;
@@ -289,7 +293,12 @@ static int sprdwl_start_xmit(struct sk_buff *skb, struct net_device *ndev)
 		return NETDEV_TX_OK;
 	}
 #endif
+#if !defined(UWE5621_FTR)
+	/* sprdwl_send_data: offset use 2 for cp bytes align */
+	ret = sprdwl_send_data(vif, msg, skb, 2);
+#else
 	ret = sprdwl_send_data(vif, msg, skb, 0);
+#endif /* UWE5621_FTR */
 	if (ret) {
 		wl_ndev_log(L_ERR, ndev, "%s drop msg due to TX Err\n", __func__);
 		/* FIXME as debug sdiom later, here just drop the msg
@@ -308,7 +317,7 @@ static int sprdwl_start_xmit(struct sk_buff *skb, struct net_device *ndev)
 	netif_trans_update(vif->ndev);
 #endif
 	wl_hex_dump(L_DBG, "TX packet: ", DUMP_PREFIX_OFFSET,
-			     16, 1, skb->data, skb->len, 0);
+				 16, 1, skb->data, skb->len, 0);
 
 out:
 	return NETDEV_TX_OK;
@@ -360,8 +369,11 @@ static struct net_device_stats *sprdwl_get_stats(struct net_device *ndev)
 {
 	return &ndev->stats;
 }
-
-static void sprdwl_tx_timeout(struct net_device *ndev, unsigned int val)
+#if KERNEL_VERSION(5, 6, 0) <= LINUX_VERSION_CODE
+static void sprdwl_tx_timeout(struct net_device *ndev, unsigned int txqueue)
+#else
+static void sprdwl_tx_timeout(struct net_device *ndev)
+#endif
 {
 	wl_ndev_log(L_DBG, ndev, "%s\n", __func__);
 #if LINUX_VERSION_CODE < KERNEL_VERSION(4, 7, 0)
@@ -500,7 +512,7 @@ static int sprdwl_priv_cmd(struct net_device *ndev, struct ifreq *ifr)
 		skip = strlen(CMD_ENABLE_WHITELIST) + 1;
 		counter = command[skip];
 		wl_ndev_log(L_INFO, ndev, "%s: enable whitelist counter : %d\n",
-			    __func__, counter);
+				__func__, counter);
 		if (!counter) {
 			ret = sprdwl_set_whitelist(priv, vif->ctx_id,
 						   SPRDWL_SUBCMD_ENABLE,
@@ -520,7 +532,7 @@ static int sprdwl_priv_cmd(struct net_device *ndev, struct ifreq *ifr)
 			if (!is_valid_ether_addr(mac_addr))
 				goto out;
 			wl_ndev_log(L_INFO, ndev, "%s: enable whitelist %pM\n",
-				    __func__, mac_addr);
+					__func__, mac_addr);
 			mac_addr += ETH_ALEN;
 			tmp += 18;
 		}
@@ -533,7 +545,7 @@ static int sprdwl_priv_cmd(struct net_device *ndev, struct ifreq *ifr)
 		skip = strlen(CMD_DISABLE_WHITELIST) + 1;
 		counter = command[skip];
 		wl_ndev_log(L_INFO, ndev, "%s: disable whitelist counter : %d\n",
-			    __func__, counter);
+				__func__, counter);
 		if (!counter) {
 			ret = sprdwl_set_whitelist(priv, vif->ctx_id,
 						   SPRDWL_SUBCMD_DISABLE,
@@ -553,7 +565,7 @@ static int sprdwl_priv_cmd(struct net_device *ndev, struct ifreq *ifr)
 			if (!is_valid_ether_addr(mac_addr))
 				goto out;
 			wl_ndev_log(L_INFO, ndev, "%s: disable whitelist %pM\n",
-				    __func__, mac_addr);
+					__func__, mac_addr);
 			mac_addr += ETH_ALEN;
 			tmp += 18;
 		}
@@ -595,7 +607,7 @@ static int sprdwl_priv_cmd(struct net_device *ndev, struct ifreq *ifr)
 			interval = command[skip + 1];
 
 		wl_ndev_log(L_INFO, ndev, "%s: 11v sleep, status %d, interval %d\n",
-			    __func__, status, interval);
+				__func__, status, interval);
 		sprdwl_set_11v_sleep_mode(priv, vif->ctx_id, status, interval);
 	} else if (!strncasecmp(command, CMD_SET_COUNTRY,
 				strlen(CMD_SET_COUNTRY))) {
@@ -609,7 +621,7 @@ static int sprdwl_priv_cmd(struct net_device *ndev, struct ifreq *ifr)
 			goto out;
 		}
 		wl_ndev_log(L_INFO, ndev, "%s country code:%c%c\n", __func__,
-			    toupper(country[0]), toupper(country[1]));
+				toupper(country[0]), toupper(country[1]));
 		ret = regulatory_hint(priv->wiphy, country);
 	} else if (!strncasecmp(command, CMD_SET_MAX_CLIENTS,
 		   strlen(CMD_SET_MAX_CLIENTS))) {
@@ -620,7 +632,7 @@ static int sprdwl_priv_cmd(struct net_device *ndev, struct ifreq *ifr)
 			goto out;
 		}
 		ret = sprdwl_set_max_clients_allowed(priv, vif->ctx_id,
-						     n_clients);
+							 n_clients);
 	} else if (!strncasecmp(command, CMD_SETSUSPENDMODE,
 			 strlen(CMD_SETSUSPENDMODE))) {
 		skip = strlen(CMD_SETSUSPENDMODE) + 1;
@@ -628,7 +640,7 @@ static int sprdwl_priv_cmd(struct net_device *ndev, struct ifreq *ifr)
 		if (ret)
 			goto out;
 		wl_ndev_log(L_INFO, ndev, "%s: set suspend mode,value : %d\n",
-			    __func__, value);
+				__func__, value);
 		ret = sprdwl_power_save(priv, vif->ctx_id,
 					SPRDWL_SCREEN_ON_OFF, value);
 	} else {
@@ -708,7 +720,7 @@ static int sprdwl_set_power_save(struct net_device *ndev, struct ifreq *ifr)
 		if (ret)
 			goto out;
 		wl_ndev_log(L_INFO, ndev, "%s: set suspend mode,value : %d\n",
-			    __func__, value);
+				__func__, value);
 		ret = sprdwl_power_save(priv, vif->ctx_id,
 					SPRDWL_SCREEN_ON_OFF, value);
 	} else if (!strncasecmp(command, CMD_SET_FCC_CHANNEL,
@@ -718,7 +730,7 @@ static int sprdwl_set_power_save(struct net_device *ndev, struct ifreq *ifr)
 		if (ret)
 			goto out;
 		wl_ndev_log(L_INFO, ndev, "%s: set fcc channel,value : %d\n",
-			    __func__, value);
+				__func__, value);
 		ret = sprdwl_power_save(priv, vif->ctx_id,
 					SPRDWL_SET_FCC_CHANNEL, value);
 	} else {
@@ -884,12 +896,12 @@ static void sprdwl_set_multicast(struct net_device *ndev)
 		mac_addr = vif->mc_filter->mac_addr;
 		netdev_for_each_mc_addr(ha, ndev) {
 			wl_ndev_log(L_DBG, ndev, "%s set mac: %pM\n", __func__,
-				    ha->addr);
+					ha->addr);
 			if ((ha->addr[0] != 0x33 || ha->addr[1] != 0x33) &&
-			    (ha->addr[0] != 0x01 || ha->addr[1] != 0x00 ||
-			     ha->addr[2] != 0x5e || ha->addr[3] > 0x7f)) {
+				(ha->addr[0] != 0x01 || ha->addr[1] != 0x00 ||
+				 ha->addr[2] != 0x5e || ha->addr[3] > 0x7f)) {
 				wl_ndev_log(L_INFO, ndev, "%s invalid addr\n",
-					    __func__);
+						__func__);
 				return;
 			}
 			ether_addr_copy(mac_addr, ha->addr);
@@ -915,11 +927,31 @@ static void sprdwl_set_multicast(struct net_device *ndev)
 
 static int sprdwl_set_mac(struct net_device *dev, void *addr)
 {
+	struct sprdwl_vif *vif = netdev_priv(dev);
+	struct sockaddr *sa = (struct sockaddr *)addr;
+
 	if (!dev) {
 		netdev_err(dev, "Invalid net device\n");
+	}
+
+	netdev_info(dev, "start set random mac: %pM\n", sa->sa_data);
+	if (is_multicast_ether_addr(sa->sa_data)) {
+		netdev_err(dev, "invalid, it is multicast addr: %pM\n", sa->sa_data);
 		return -EINVAL;
 	}
 
+	if (vif->mode == SPRDWL_MODE_STATION) {
+		if (!is_zero_ether_addr(sa->sa_data)) {
+			vif->has_rand_mac = true;
+			memcpy(vif->random_mac, sa->sa_data, ETH_ALEN);
+			memcpy(dev->dev_addr, sa->sa_data, ETH_ALEN);
+		} else {
+			vif->has_rand_mac = false;
+			netdev_info(dev, "need clear random mac for sta/softap mode\n");
+			memset(vif->random_mac, 0, ETH_ALEN);
+			memcpy(dev->dev_addr, vif->mac, ETH_ALEN);
+		}
+	}
 	/*return success to pass vts test*/
 	return 0;
 }
@@ -962,10 +994,11 @@ static int sprdwl_inetaddr_event(struct notifier_block *this,
 				if (entry->ctx_id == vif->ctx_id)
 					entry->ip_acquired = 1;
 				else
-					wl_err("ctx_id(%d) mismatch\n",
-					       entry->ctx_id);
+					;
+					//wl_err("ctx_id(%d) mismatch\n",
+					//	   entry->ctx_id);
 			} else {
-			    wl_err("failed to find entry\n");
+				wl_err("failed to find entry\n");
 			}
 
 			sprdwl_notify_ip(vif->priv, vif->ctx_id, SPRDWL_IPV4,
@@ -1017,7 +1050,7 @@ static int sprdwl_inetaddr6_event(struct notifier_block *this,
 			work->id = SPRDWL_WORK_NOTIFY_IP;
 			ipv6_addr = (u8 *)work->data;
 			memcpy(ipv6_addr, (u8 *)&inet6_ifa->addr,
-			       SPRDWL_IPV6_ADDR_LEN);
+				   SPRDWL_IPV6_ADDR_LEN);
 			sprdwl_queue_work(vif->priv, work);
 		}
 		break;
@@ -1136,7 +1169,7 @@ void clean_survey_info_list(struct sprdwl_vif *vif)
 }
 
 static unsigned short cal_total_beacon(struct sprdwl_vif *vif,
-				       struct sprdwl_survey_info *info)
+					   struct sprdwl_survey_info *info)
 {
 	unsigned short total_beacon = 0;
 	short pos_chan, chan;
@@ -1149,14 +1182,14 @@ static unsigned short cal_total_beacon(struct sprdwl_vif *vif,
 		list_for_each_entry(info, &vif->survey_info_list, survey_list) {
 			pos_chan = (short)info->chan;
 			if (pos_chan > (chan - 4) && pos_chan < (chan + 4) &&
-			    pos_chan != chan) {
+				pos_chan != chan) {
 				total_beacon += info->beacon_num;
 			}
 		}
 	}
 
 	wl_ndev_log(L_DBG, vif->ndev, "survey chan: %d, total beacon: %d!\n",
-		    chan, total_beacon);
+			chan, total_beacon);
 	return total_beacon;
 }
 
@@ -1230,7 +1263,7 @@ static struct sprdwl_survey_info *find_survey_info(struct sprdwl_vif *vif,
 }
 
 void acs_scan_result(struct sprdwl_vif *vif, u16 chan,
-		     struct ieee80211_mgmt *mgmt)
+			 struct ieee80211_mgmt *mgmt)
 {
 	struct sprdwl_survey_info *info = NULL;
 	struct sprdwl_bssid *bssid = NULL;
@@ -1253,7 +1286,7 @@ void acs_scan_result(struct sprdwl_vif *vif, u16 chan,
 #endif /* ACS_SUPPORT */
 
 static void sprdwl_init_vif(struct sprdwl_priv *priv, struct sprdwl_vif *vif,
-			    const char *name)
+				const char *name)
 {
 	WARN_ON(strlen(name) >= sizeof(vif->name));
 
@@ -1276,8 +1309,8 @@ static void sprdwl_deinit_vif(struct sprdwl_vif *vif)
 	 */
 #ifdef SYNC_DISCONNECT
 	if (vif->sm_state == SPRDWL_CONNECTING ||
-	    vif->sm_state == SPRDWL_CONNECTED  ||
-	    vif->sm_state == SPRDWL_DISCONNECTING)
+		vif->sm_state == SPRDWL_CONNECTED  ||
+		vif->sm_state == SPRDWL_DISCONNECTING)
 #if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 2, 0)
 		cfg80211_disconnected(vif->ndev, 3,
 		NULL, 0, false, GFP_KERNEL);
@@ -1307,9 +1340,9 @@ static void sprdwl_deinit_vif(struct sprdwl_vif *vif)
 
 #ifndef CONFIG_P2P_INTF
 static struct sprdwl_vif *sprdwl_register_wdev(struct sprdwl_priv *priv,
-					       const char *name,
-					       enum nl80211_iftype type,
-					       u8 *addr)
+						   const char *name,
+						   enum nl80211_iftype type,
+						   u8 *addr)
 {
 	struct sprdwl_vif *vif;
 	struct wireless_dev *wdev;
@@ -1383,8 +1416,8 @@ static struct sprdwl_vif *sprdwl_register_netdev(struct sprdwl_priv *priv,
 	if (priv->fw_capa & SPRDWL_CAPA_MC_FILTER) {
 		wl_info("\tMulticast Filter supported\n");
 		vif->mc_filter =
-		    kzalloc(sizeof(struct sprdwl_mc_filter) +
-			    priv->max_mc_mac_addrs * ETH_ALEN, GFP_KERNEL);
+			kzalloc(sizeof(struct sprdwl_mc_filter) +
+				priv->max_mc_mac_addrs * ETH_ALEN, GFP_KERNEL);
 		if (!vif->mc_filter) {
 			ret = -ENOMEM;
 			goto err;
@@ -1445,8 +1478,8 @@ static void sprdwl_unregister_netdev(struct sprdwl_vif *vif)
 }
 
 struct wireless_dev *sprdwl_add_iface(struct sprdwl_priv *priv,
-				      const char *name,
-				      enum nl80211_iftype type, u8 *addr)
+					  const char *name,
+					  enum nl80211_iftype type, u8 *addr)
 {
 	struct sprdwl_vif *vif;
 
@@ -1523,7 +1556,6 @@ static void sprdwl_init_debugfs(struct sprdwl_priv *priv)
 
 int sprdwl_core_init(struct device *dev, struct sprdwl_priv *priv)
 {
-	u8 *efuse_mac_addr = NULL;
 	struct wiphy *wiphy = priv->wiphy;
 	struct wireless_dev *wdev;
 	int ret;
@@ -1548,8 +1580,6 @@ int sprdwl_core_init(struct device *dev, struct sprdwl_priv *priv)
 	}
 	sprdwl_init_debugfs(priv);
 
-	if (is_valid_ether_addr(priv->mac_addr))
-		efuse_mac_addr = priv->mac_addr;
 	rtnl_lock();
 	wdev = sprdwl_add_iface(priv, "wlan%d", NL80211_IFTYPE_STATION, NULL);
 	rtnl_unlock();
@@ -1572,21 +1602,23 @@ int sprdwl_core_init(struct device *dev, struct sprdwl_priv *priv)
 
 #ifdef RX_NAPI
 	sprdwl_rx_napi_init(wdev->netdev,
-			    ((struct sprdwl_intf *)priv->hw_priv));
+				((struct sprdwl_intf *)priv->hw_priv));
 #endif
 
+#if defined(UWE5621_FTR)
 	qos_enable(1);
+#endif
 	sprdwl_init_npi();
 	ret = register_inetaddr_notifier(&sprdwl_inetaddr_cb);
 	if (ret)
 		wl_err("%s failed to register inetaddr notifier(%d)!\n",
-		       __func__, ret);
+			   __func__, ret);
 	if (priv->fw_capa & SPRDWL_CAPA_NS_OFFLOAD) {
 		wl_info("\tIPV6 NS Offload supported\n");
 		ret = register_inet6addr_notifier(&sprdwl_inet6addr_cb);
 		if (ret)
 			wl_err("%s failed to register inet6addr notifier(%d)!\n",
-			       __func__, ret);
+				   __func__, ret);
 	}
 
 	trace_info_init();
@@ -1594,7 +1626,7 @@ int sprdwl_core_init(struct device *dev, struct sprdwl_priv *priv)
 	ret = marlin_reset_register_notify(priv->if_ops->force_exit, priv->hw_priv);
 	if (ret) {
 		wl_err("%s failed to register wcn cp rest notify(%d)!\n",
-		       __func__, ret);
+			   __func__, ret);
 	}
 
 out:
@@ -1608,7 +1640,9 @@ int sprdwl_core_deinit(struct sprdwl_priv *priv)
 	if (priv->fw_capa & SPRDWL_CAPA_NS_OFFLOAD)
 		unregister_inet6addr_notifier(&sprdwl_inet6addr_cb);
 	sprdwl_deinit_npi();
+#if defined(UWE5621_FTR)
 	qos_enable(0);
+#endif
 	sprdwl_del_all_ifaces(priv);
 	sprdwl_vendor_deinit(priv->wiphy);
 	wiphy_unregister(priv->wiphy);
diff --git a/drivers/net/wireless/uwe5622/unisocwifi/mm.c b/drivers/net/wireless/uwe5622/unisocwifi/mm.c
index eaf6554f2..f33d87185 100644
--- a/drivers/net/wireless/uwe5622/unisocwifi/mm.c
+++ b/drivers/net/wireless/uwe5622/unisocwifi/mm.c
@@ -30,7 +30,7 @@
 	SKB_DATA_ALIGN(SPRDWL_MAX_DATA_RXLEN + NET_SKB_PAD)
 
 void check_mh_buffer(struct device *dev, void *buffer, dma_addr_t pa,
-		     size_t size, enum dma_data_direction direction)
+			 size_t size, enum dma_data_direction direction)
 {
 #define MAX_RETRY_NUM 8
 	int retry = 0;
@@ -40,10 +40,10 @@ void check_mh_buffer(struct device *dev, void *buffer, dma_addr_t pa,
 
 		/* Check whether this buffer is ok to use */
 		while ((desc->data_write_done != 1) ||
-		       (retry < MAX_RETRY_NUM)) {
+			   (retry < MAX_RETRY_NUM)) {
 			wl_err("%s: hw still writing: 0x%lx, 0x%lx\n",
-			       __func__, (unsigned long)buffer,
-			       (unsigned long)pa);
+				   __func__, (unsigned long)buffer,
+				   (unsigned long)pa);
 			/* FIXME: Should we delay here? */
 			dma_sync_single_for_device(dev, pa, size, direction);
 			retry++;
@@ -53,8 +53,8 @@ void check_mh_buffer(struct device *dev, void *buffer, dma_addr_t pa,
 			buffer_ctrl.buffer_inuse) != 0) ||
 			(retry < MAX_RETRY_NUM)) {
 			wl_err("%s: hw still writing: 0x%lx, 0x%lx\n",
-			       __func__, (unsigned long)buffer,
-			       (unsigned long)pa);
+				   __func__, (unsigned long)buffer,
+				   (unsigned long)pa);
 			dma_sync_single_for_device(dev, pa, size, direction);
 			retry++;
 		}
@@ -64,12 +64,12 @@ void check_mh_buffer(struct device *dev, void *buffer, dma_addr_t pa,
 		/* TODO: How to deal with this situation? */
 		dma_sync_single_for_device(dev, pa, size, direction);
 		wl_err("%s: hw still writing: 0x%lx, 0x%lx\n",
-		       __func__, (unsigned long)buffer, (unsigned long)pa);
+			   __func__, (unsigned long)buffer, (unsigned long)pa);
 	}
 }
 
 unsigned long mm_virt_to_phys(struct device *dev, void *buffer, size_t size,
-			      enum dma_data_direction direction)
+				  enum dma_data_direction direction)
 {
 	dma_addr_t pa = 0;
 	unsigned long pcie_addr = 0;
@@ -82,7 +82,7 @@ unsigned long mm_virt_to_phys(struct device *dev, void *buffer, size_t size,
 }
 
 void *mm_phys_to_virt(struct device *dev, unsigned long pcie_addr, size_t size,
-		      enum dma_data_direction direction, bool is_mh)
+			  enum dma_data_direction direction, bool is_mh)
 {
 	dma_addr_t pa = 0;
 	void *buffer = NULL;
@@ -178,7 +178,7 @@ static inline int mm_do_addr_buf(struct sprdwl_mm *mm_entry)
 		/* FIXME: temporary solution, would TX supply API for us? */
 		/* TODO: How to do with tx fail? */
 		if ((if_tx_addr_trans(rx_if->intf, mm_entry->hdr,
-				      addr_trans_len) >= 0)) {
+					  addr_trans_len) >= 0)) {
 			mm_alloc_addr_buf(mm_entry);
 			if (unlikely(!mm_entry->addr_trans)) {
 				wl_err("%s: alloc addr buf fail!\n", __func__);
@@ -204,7 +204,7 @@ static int mm_w_addr_buf(struct sprdwl_mm *mm_entry, unsigned long pcie_addr)
 
 		/* NOTE: MH is little endian */
 		memcpy((void *)value->address[value->num],
-		       &pcie_addr, SPRDWL_PHYS_LEN);
+			   &pcie_addr, SPRDWL_PHYS_LEN);
 		value->num++;
 		/* do not care the result here */
 		mm_do_addr_buf(mm_entry);
@@ -231,14 +231,14 @@ static int mm_single_buffer_alloc(struct sprdwl_mm *mm_entry)
 		memcpy((void *)skb_end_pointer(skb), &skb, sizeof(skb));
 		/* transfer virt to phys */
 		pcie_addr = mm_virt_to_phys(&rx_if->intf->pdev->dev,
-					    skb->data, SPRDWL_MAX_DATA_RXLEN,
-					    DMA_FROM_DEVICE);
+						skb->data, SPRDWL_MAX_DATA_RXLEN,
+						DMA_FROM_DEVICE);
 
 		if (unlikely(!pcie_addr)) {
 			ret = mm_w_addr_buf(mm_entry, pcie_addr);
 			if (ret) {
 				wl_err("%s: write addr buf fail: %d\n",
-				       __func__, ret);
+					   __func__, ret);
 				dev_kfree_skb(skb);
 			} else {
 				/* queue skb */
@@ -260,7 +260,7 @@ int mm_buffer_alloc(struct sprdwl_mm *mm_entry, int need_num)
 		ret = mm_single_buffer_alloc(mm_entry);
 		if (ret) {
 			wl_err("%s: alloc num: %d, need num: %d, ret: %d\n",
-			       __func__, num, need_num, ret);
+				   __func__, num, need_num, ret);
 			break;
 		}
 	}
@@ -269,7 +269,7 @@ int mm_buffer_alloc(struct sprdwl_mm *mm_entry, int need_num)
 }
 
 static struct sk_buff *mm_single_buffer_unlink(struct sprdwl_mm *mm_entry,
-					       unsigned long pcie_addr)
+						   unsigned long pcie_addr)
 {
 	struct sprdwl_rx_if *rx_if =
 			container_of(mm_entry, struct sprdwl_rx_if, mm_entry);
@@ -287,11 +287,11 @@ static struct sk_buff *mm_single_buffer_unlink(struct sprdwl_mm *mm_entry,
 }
 
 static int mm_buffer_relink(struct sprdwl_mm *mm_entry,
-			    struct sprdwl_addr_trans_value *value,
-			    int total_len)
+				struct sprdwl_addr_trans_value *value,
+				int total_len)
 {
 	int num = 0;
-	unsigned long pcie_addr = 0;
+	uint64_t pcie_addr = 0;
 	struct sk_buff *skb = NULL;
 	int len = 0, ret = 0;
 
@@ -299,9 +299,9 @@ static int mm_buffer_relink(struct sprdwl_mm *mm_entry,
 		len += SPRDWL_PHYS_LEN;
 		if (unlikely(len > total_len)) {
 			wl_err("%s: total_len:%d < len:%d\n",
-			       __func__, total_len, len);
+				   __func__, total_len, len);
 			wl_err("%s: total %d pkts, relink %d pkts\n",
-			       __func__, value->num, num);
+				   __func__, value->num, num);
 			len = -EINVAL;
 			break;
 		}
@@ -327,11 +327,11 @@ static int mm_buffer_relink(struct sprdwl_mm *mm_entry,
 }
 
 static int mm_buffer_unlink(struct sprdwl_mm *mm_entry,
-			    struct sprdwl_addr_trans_value *value,
-			    int total_len)
+				struct sprdwl_addr_trans_value *value,
+				int total_len)
 {
 	int num = 0;
-	unsigned long pcie_addr = 0;
+	uint64_t pcie_addr = 0;
 	struct sk_buff *skb = NULL;
 	struct rx_msdu_desc *msdu_desc = NULL;
 	int len = 0;
@@ -343,9 +343,9 @@ static int mm_buffer_unlink(struct sprdwl_mm *mm_entry,
 		len += SPRDWL_PHYS_LEN;
 		if (unlikely(len > total_len)) {
 			wl_err("%s: total_len:%d < len:%d\n",
-			       __func__, total_len, len);
+				   __func__, total_len, len);
 			wl_err("%s: total %d pkts, unlink %d pkts\n",
-			       __func__, value->num, num);
+				   __func__, value->num, num);
 			len = -EINVAL;
 			break;
 		}
@@ -414,7 +414,7 @@ mm_compound_data_process(struct sprdwl_mm *mm_entry, void *compound_data,
 		len += ALIGN_8BYTE(msdu_len);
 		if (unlikely(len > total_len)) {
 			wl_err("%s: total_len:%d < len:%d, leave %d pkts\n",
-			       __func__, total_len, len, (num + 1));
+				   __func__, total_len, len, (num + 1));
 			break;
 		}
 
@@ -424,7 +424,7 @@ mm_compound_data_process(struct sprdwl_mm *mm_entry, void *compound_data,
 		skb = mm_data2skb_process(mm_entry, pos_data, msdu_len);
 		if (unlikely(!skb)) {
 			wl_err("%s: alloc skb fail, leave %d pkts\n",
-			       __func__, (num + 1));
+				   __func__, (num + 1));
 			break;
 		}
 
@@ -452,7 +452,7 @@ static void mm_normal_data_process(struct sprdwl_mm *mm_entry,
 
 	if (unlikely(len < sizeof(struct rx_msdu_desc))) {
 		wl_err("%s: data len is %d, too short\n",
-		       __func__, len);
+			   __func__, len);
 		free_data = true;
 	} else {
 		csum = get_sdio_data_csum((void *)rx_if->intf, data);
@@ -546,7 +546,7 @@ static int mm_single_event_process(struct sprdwl_mm *mm_entry,
 
 /* PCIE DATA EVENT */
 void mm_mh_data_event_process(struct sprdwl_mm *mm_entry, void *data,
-			      int len, int buffer_type)
+				  int len, int buffer_type)
 {
 	int offset = 0;
 	struct sprdwl_addr_hdr *hdr =
@@ -568,7 +568,7 @@ void mm_mh_data_event_process(struct sprdwl_mm *mm_entry, void *data,
 		offset = mm_single_event_process(mm_entry, value, remain_len);
 		if (offset < 0) {
 			wl_err("%s: do mh event fail: %d!\n",
-			       __func__, offset);
+				   __func__, offset);
 			break;
 		}
 	}
@@ -593,7 +593,7 @@ int sprdwl_mm_init(struct sprdwl_mm *mm_entry, void *intf)
 	mm_entry->hif_offset = ((struct sprdwl_intf *)intf)->hif_offset;
 
 	if (((struct sprdwl_intf *)intf)->priv->hw_type ==
-	    SPRDWL_HW_PCIE) {
+		SPRDWL_HW_PCIE) {
 		skb_queue_head_init(&mm_entry->buffer_list);
 
 		ret = mm_buffer_alloc(mm_entry, SPRDWL_MAX_MH_BUF);
@@ -607,7 +607,7 @@ int sprdwl_mm_init(struct sprdwl_mm *mm_entry, void *intf)
 int sprdwl_mm_deinit(struct sprdwl_mm *mm_entry, void *intf)
 {
 	if (((struct sprdwl_intf *)intf)->priv->hw_type ==
-	    SPRDWL_HW_PCIE) {
+		SPRDWL_HW_PCIE) {
 		/* NOTE: pclint says kfree(NULL) is safe */
 		kfree(mm_entry->hdr);
 		mm_entry->hdr = NULL;
diff --git a/drivers/net/wireless/uwe5622/unisocwifi/msg.c b/drivers/net/wireless/uwe5622/unisocwifi/msg.c
index 6140199be..f130e0da4 100644
--- a/drivers/net/wireless/uwe5622/unisocwifi/msg.c
+++ b/drivers/net/wireless/uwe5622/unisocwifi/msg.c
@@ -17,7 +17,7 @@
 
 #include "sprdwl.h"
 #include "msg.h"
-
+#include "wcn_wrapper.h"
 /* static struct sprdwl_msg_list msg_list */
 
 int sprdwl_msg_init(int num, struct sprdwl_msg_list *list)
@@ -141,7 +141,7 @@ struct sprdwl_msg_buf *sprdwl_peek_msg_buf(struct sprdwl_msg_list *list)
 }
 
 void sprdwl_dequeue_msg_buf(struct sprdwl_msg_buf *msg_buf,
-			    struct sprdwl_msg_list *list)
+				struct sprdwl_msg_list *list)
 {
 	spin_lock_bh(&list->busylock);
 	list_del(&msg_buf->list);
@@ -169,6 +169,7 @@ struct sprdwl_msg_buf *sprdwl_get_msgbuf_by_data(void *data,
 	return find ? msg_buf : NULL;
 }
 
+#if defined(UWE5621_FTR)
 struct sprdwl_msg_buf *sprdwl_get_tail_msg_buf(struct sprdwl_msg_list *list)
 {
 	struct sprdwl_msg_buf *msg_buf = NULL;
@@ -180,3 +181,4 @@ struct sprdwl_msg_buf *sprdwl_get_tail_msg_buf(struct sprdwl_msg_list *list)
 	spin_unlock_bh(&list->busylock);
 	return msg_buf;
 }
+#endif
\ No newline at end of file
diff --git a/drivers/net/wireless/uwe5622/unisocwifi/msg.h b/drivers/net/wireless/uwe5622/unisocwifi/msg.h
index dd57521ae..67a4b474e 100644
--- a/drivers/net/wireless/uwe5622/unisocwifi/msg.h
+++ b/drivers/net/wireless/uwe5622/unisocwifi/msg.h
@@ -215,5 +215,7 @@ void sprdwl_dequeue_msg_buf(struct sprdwl_msg_buf *msg_buf,
 			    struct sprdwl_msg_list *list);
 struct sprdwl_msg_buf *sprdwl_get_msgbuf_by_data(void *data,
 						 struct sprdwl_msg_list *list);
+#if defined(UWE5621_FTR)
 struct sprdwl_msg_buf *sprdwl_get_tail_msg_buf(struct sprdwl_msg_list *list);
 #endif
+#endif
diff --git a/drivers/net/wireless/uwe5622/unisocwifi/nan.c b/drivers/net/wireless/uwe5622/unisocwifi/nan.c
index a08a3c076..740ea0ad3 100644
--- a/drivers/net/wireless/uwe5622/unisocwifi/nan.c
+++ b/drivers/net/wireless/uwe5622/unisocwifi/nan.c
@@ -43,7 +43,7 @@ int sprdwl_vendor_nan_cmds(struct wiphy *wiphy,
 
 	memcpy(msg->data, data, len);
 	ret = sprdwl_cmd_send_recv(vif->priv, msg,
-				    CMD_WAIT_TIMEOUT, rsp, &rsp_len);
+					CMD_WAIT_TIMEOUT, rsp, &rsp_len);
 
 	if (!ret && rsp_len)
 		sprdwl_event_nan(vif, rsp, rsp_len);
diff --git a/drivers/net/wireless/uwe5622/unisocwifi/npi.c b/drivers/net/wireless/uwe5622/unisocwifi/npi.c
index ca599c894..90b333b70 100644
--- a/drivers/net/wireless/uwe5622/unisocwifi/npi.c
+++ b/drivers/net/wireless/uwe5622/unisocwifi/npi.c
@@ -105,7 +105,7 @@ static int sprdwl_cmd_set_psm_cap(struct sprdwl_vif *vif)
 }
 
 static int sprdwl_npi_pre_doit(const struct genl_ops *ops,
-			       struct sk_buff *skb, struct genl_info *info)
+				   struct sk_buff *skb, struct genl_info *info)
 {
 	struct net_device *ndev;
 	struct sprdwl_vif *vif;
@@ -148,7 +148,7 @@ static bool sprdwl_npi_cmd_is_start(void *buf)
 
 	msg = (struct sprdwl_npi_cmd_hdr *)buf;
 	if ((msg->type == SPRDWL_HT2CP_CMD) &&
-	    (msg->subtype == SPRDWL_NPI_CMD_START))
+		(msg->subtype == SPRDWL_NPI_CMD_START))
 		return true;
 	else
 		return false;
@@ -201,7 +201,7 @@ static int sprdwl_nl_npi_handler(struct sk_buff *skb_2, struct genl_info *info)
 		memcpy(r_buf, hdr, sizeof(*hdr));
 		memcpy(r_buf + sizeof(*hdr), &err, hdr->len);
 		ret = sprdwl_nl_send_generic(info, SPRDWL_NL_ATTR_CP2AP,
-					     SPRDWL_NL_CMD_NPI, r_len, r_buf);
+						 SPRDWL_NL_CMD_NPI, r_len, r_buf);
 		kfree(hdr);
 		kfree(r_buf);
 		return ret;
@@ -234,7 +234,7 @@ static int sprdwl_nl_npi_handler(struct sk_buff *skb_2, struct genl_info *info)
 #endif
 
 	ret = sprdwl_nl_send_generic(info, SPRDWL_NL_ATTR_CP2AP,
-				     SPRDWL_NL_CMD_NPI, r_len, r_buf);
+					 SPRDWL_NL_CMD_NPI, r_len, r_buf);
 
 	if (sprdwl_npi_cmd_is_start(s_buf)) {
 		msleep(100);
@@ -245,7 +245,7 @@ static int sprdwl_nl_npi_handler(struct sk_buff *skb_2, struct genl_info *info)
 }
 
 static int sprdwl_nl_get_info_handler(struct sk_buff *skb_2,
-				      struct genl_info *info)
+					  struct genl_info *info)
 {
 	struct net_device *ndev = info->user_ptr[0];
 	struct sprdwl_vif *vif = netdev_priv(ndev);
@@ -258,8 +258,8 @@ static int sprdwl_nl_get_info_handler(struct sk_buff *skb_2,
 		sprdwl_put_vif(vif);
 		r_len = 6;
 		ret = sprdwl_nl_send_generic(info, SPRDWL_NL_ATTR_CP2AP,
-					     SPRDWL_NL_CMD_GET_INFO, r_len,
-					     r_buf);
+						 SPRDWL_NL_CMD_GET_INFO, r_len,
+						 r_buf);
 	} else {
 		wl_err("%s NULL vif!\n", __func__);
 		ret = -1;
@@ -275,18 +275,14 @@ static struct nla_policy sprdwl_genl_policy[SPRDWL_NL_ATTR_MAX + 1] = {
 static struct genl_ops sprdwl_nl_ops[] = {
 	{
 		.cmd = SPRDWL_NL_CMD_NPI,
-#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 3, 0))
-//		.policy = sprdwl_genl_policy,
-#else
+#if KERNEL_VERSION(5, 2, 0) > LINUX_VERSION_CODE
 		.policy = sprdwl_genl_policy,
 #endif
 		.doit = sprdwl_nl_npi_handler,
 	},
 	{
 		.cmd = SPRDWL_NL_CMD_GET_INFO,
-#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 3, 0))
-//		.policy = sprdwl_genl_policy,
-#else
+#if KERNEL_VERSION(5, 2, 0) > LINUX_VERSION_CODE
 		.policy = sprdwl_genl_policy,
 #endif
 		.doit = sprdwl_nl_get_info_handler,
diff --git a/drivers/net/wireless/uwe5622/unisocwifi/qos.c b/drivers/net/wireless/uwe5622/unisocwifi/qos.c
index b1a0f7cc4..047b2d9c3 100644
--- a/drivers/net/wireless/uwe5622/unisocwifi/qos.c
+++ b/drivers/net/wireless/uwe5622/unisocwifi/qos.c
@@ -192,7 +192,7 @@ void qos_set_dscp2up_table(unsigned char *dscp2up_table,
 			if (!qos_up_table_set(dscp2up_table, i / 2, range)) {
 				/* reset the table on failure */
 				memcpy(dscp2up_table, default_dscp2priomap,
-				       DSCP_MAX_VALUE);
+					   DSCP_MAX_VALUE);
 				return;
 			}
 		}
@@ -211,7 +211,7 @@ void qos_set_dscp2up_table(unsigned char *dscp2up_table,
 		}
 	}
 	wl_hex_dump(L_DBG, "qos up table: ", DUMP_PREFIX_OFFSET,
-			     16, 1, dscp2up_table, DSCP_MAX_VALUE, 0);
+				 16, 1, dscp2up_table, DSCP_MAX_VALUE, 0);
 }
 
 /*Todo*/
@@ -240,8 +240,8 @@ int fd_special_table[2][2] = {
 
 /*time slot ratio based on WFA spec*/
 int fd_ratio_table[3] = {7, /*vo: 87%, vi:13%*/
-			      9, /*vi:90%, be:10%*/
-			      5};/*be:81%, bk:19%*/
+				  9, /*vi:90%, be:10%*/
+				  5};/*be:81%, bk:19%*/
 #endif
 void qos_enable(int flag)
 {
@@ -267,7 +267,7 @@ void qos_init(struct tx_t *tx_t_list)
 			wl_err("%s malloc dscp2up_table fail\n", __func__);
 		else
 			memcpy(tx_t_list->dscp2up_table, default_dscp2priomap,
-			       DSCP_MAX_VALUE);
+				   DSCP_MAX_VALUE);
 	}
 #endif
 }
@@ -552,9 +552,15 @@ void wmm_ac_init(struct sprdwl_priv *priv)
 
 #if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 14, 0)
 	timer_setup(&priv->wmmac.wmmac_edcaf_timer, update_wmmac_edcaftime_timeout, 0);
+	timer_setup(&priv->wmmac.wmmac_vo_timer, update_wmmac_vo_timeout, 0);
+	timer_setup(&priv->wmmac.wmmac_vi_timer, update_wmmac_vi_timeout, 0);
 #else
 	setup_timer(&priv->wmmac.wmmac_edcaf_timer, update_wmmac_edcaftime_timeout,
-		    (unsigned long)priv);
+			(unsigned long)priv);
+	setup_timer(&priv->wmmac.wmmac_vo_timer, update_wmmac_vo_timeout,
+			(unsigned long)priv);
+	setup_timer(&priv->wmmac.wmmac_vi_timer, update_wmmac_vi_timeout,
+			(unsigned long)priv);
 #endif
 	memset(&priv->wmmac.ac[0], 0, 4*sizeof(struct wmm_ac_params));
 }
@@ -570,6 +576,12 @@ void reset_wmmac_parameters(struct sprdwl_priv *priv)
 	if (timer_pending(&priv->wmmac.wmmac_edcaf_timer))
 		del_timer_sync(&priv->wmmac.wmmac_edcaf_timer);
 
+	if (timer_pending(&priv->wmmac.wmmac_vo_timer))
+		del_timer_sync(&priv->wmmac.wmmac_vo_timer);
+
+	if (timer_pending(&priv->wmmac.wmmac_vi_timer))
+		del_timer_sync(&priv->wmmac.wmmac_vi_timer);
+
 	memset(&priv->wmmac.ac[0], 0, 4*sizeof(struct wmm_ac_params));
 }
 
@@ -685,6 +697,14 @@ void update_admitted_time(struct sprdwl_priv *priv, u8 tsid, u16 medium_time, bo
 		g_wmmac_admittedtime[ac] += (medium_time<<5);
 		mod_timer(&priv->wmmac.wmmac_edcaf_timer,
 				jiffies + WMMAC_EDCA_TIMEOUT_MS * HZ / 1000);
+
+		/*replace the usedtime logic method with timer counter, just for simplify for the WFA certification*/
+		if (ac == AC_VO)
+			mod_timer(&priv->wmmac.wmmac_vo_timer,
+				jiffies + usecs_to_jiffies(g_wmmac_admittedtime[ac] * WMMAC_TIME_RATIO));
+		else if (ac == AC_VI)
+			mod_timer(&priv->wmmac.wmmac_vi_timer,
+				jiffies + usecs_to_jiffies(g_wmmac_admittedtime[ac] * WMMAC_TIME_RATIO));
 	} else {
 		if (g_wmmac_admittedtime[ac] > (medium_time<<5))
 			g_wmmac_admittedtime[ac] -= (medium_time<<5);
@@ -692,6 +712,12 @@ void update_admitted_time(struct sprdwl_priv *priv, u8 tsid, u16 medium_time, bo
 			g_wmmac_admittedtime[ac] = 0;
 			if (timer_pending(&priv->wmmac.wmmac_edcaf_timer))
 				del_timer_sync(&priv->wmmac.wmmac_edcaf_timer);
+
+			if (timer_pending(&priv->wmmac.wmmac_vo_timer))
+				del_timer_sync(&priv->wmmac.wmmac_vo_timer);
+
+			if (timer_pending(&priv->wmmac.wmmac_vi_timer))
+				del_timer_sync(&priv->wmmac.wmmac_vi_timer);
 		}
 	}
 
@@ -712,13 +738,38 @@ void update_wmmac_edcaftime_timeout(unsigned long data)
 	if (g_wmmac_admittedtime[AC_VO] > 0) {
 		g_wmmac_usedtime[AC_VO] = 0;
 		g_wmmac_available[AC_VO] = true;
+		mod_timer(&priv->wmmac.wmmac_vo_timer,
+			jiffies + usecs_to_jiffies(g_wmmac_admittedtime[AC_VO] * WMMAC_TIME_RATIO));
 	}
 	if (g_wmmac_admittedtime[AC_VI] > 0) {
 		g_wmmac_usedtime[AC_VI] = 0;
 		g_wmmac_available[AC_VI] = true;
+		mod_timer(&priv->wmmac.wmmac_vi_timer,
+			jiffies + usecs_to_jiffies(g_wmmac_admittedtime[AC_VI] * WMMAC_TIME_RATIO));
 	}
 }
 
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 14, 0)
+void update_wmmac_vo_timeout(struct timer_list *t)
+#else
+void update_wmmac_vo_timeout(unsigned long data)
+#endif
+{
+	g_wmmac_usedtime[AC_VO] = g_wmmac_admittedtime[AC_VO];
+	g_wmmac_available[AC_VO] = false;
+}
+
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 14, 0)
+void update_wmmac_vi_timeout(struct timer_list *t)
+#else
+void update_wmmac_vi_timeout(unsigned long data)
+#endif
+{
+	g_wmmac_usedtime[AC_VI] = g_wmmac_admittedtime[AC_VI];
+	g_wmmac_available[AC_VI] = false;
+
+}
+
 /*change priority according to the g_wmmac_available value */
 unsigned int change_priority_if(struct sprdwl_priv *priv, unsigned char *tid, unsigned char *tos, u16 len)
 {
diff --git a/drivers/net/wireless/uwe5622/unisocwifi/qos.h b/drivers/net/wireless/uwe5622/unisocwifi/qos.h
index 2a99178bc..3d69d1c57 100644
--- a/drivers/net/wireless/uwe5622/unisocwifi/qos.h
+++ b/drivers/net/wireless/uwe5622/unisocwifi/qos.h
@@ -79,6 +79,7 @@ struct qos_map_set {
 #define NUM_AC 4
 #define NUM_TID 16
 #define WMMAC_EDCA_TIMEOUT_MS		1000
+#define WMMAC_TIME_RATIO	12
 
 #define WLAN_EID_VENDOR_SPECIFIC 221
 #define OUI_MICROSOFT 0x0050f2 /* Microsoft (also used in Wi-Fi specs)
@@ -236,11 +237,13 @@ u16 get_wmmac_admitted_time(u8 tsid);
 void reset_wmmac_parameters(struct sprdwl_priv *priv);
 #if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 14, 0)
 void update_wmmac_edcaftime_timeout(struct timer_list *t);
+void update_wmmac_vo_timeout(struct timer_list *t);
+void update_wmmac_vi_timeout(struct timer_list *t);
 #else
 void update_wmmac_edcaftime_timeout(unsigned long data);
-#endif
 void update_wmmac_vo_timeout(unsigned long data);
 void update_wmmac_vi_timeout(unsigned long data);
+#endif
 unsigned int change_priority_if(struct sprdwl_priv *priv, unsigned char *tid, unsigned char *tos, u16 len);
 const u8 *get_wmm_ie(u8 *res, u16 ie_len, u8 ie, uint oui, uint oui_type);
 #endif
diff --git a/drivers/net/wireless/uwe5622/unisocwifi/reg_domain.c b/drivers/net/wireless/uwe5622/unisocwifi/reg_domain.c
index 5a9857757..fb15045e1 100644
--- a/drivers/net/wireless/uwe5622/unisocwifi/reg_domain.c
+++ b/drivers/net/wireless/uwe5622/unisocwifi/reg_domain.c
@@ -253,7 +253,7 @@ void ShowChannel(struct wiphy *pWiphy)
 
 			if (chan->flags & IEEE80211_CHAN_DISABLED) {
 				wl_info("disable channels[%d][%d]: ch%d (freq = %d) flags=0x%x\n",
-				    band_idx, ch_idx, chan->hw_value, chan->center_freq, chan->flags);
+					band_idx, ch_idx, chan->hw_value, chan->center_freq, chan->flags);
 				continue;
 			}
 
@@ -272,7 +272,7 @@ void ShowChannel(struct wiphy *pWiphy)
 }
 
 static bool freq_in_rule_band(const struct ieee80211_freq_range *freq_range,
-			      u32 freq_khz)
+				  u32 freq_khz)
 {
 #define ONE_GHZ_IN_KHZ	1000000
 	/*
@@ -290,7 +290,7 @@ static bool freq_in_rule_band(const struct ieee80211_freq_range *freq_range,
 #undef ONE_GHZ_IN_KHZ
 }
 static bool reg_does_bw_fit(const struct ieee80211_freq_range *freq_range,
-			    u32 center_freq_khz, u32 bw_khz)
+				u32 center_freq_khz, u32 bw_khz)
 {
 	u32 start_freq_khz, end_freq_khz;
 
@@ -298,7 +298,7 @@ static bool reg_does_bw_fit(const struct ieee80211_freq_range *freq_range,
 	end_freq_khz = center_freq_khz + (bw_khz/2);
 
 	if (start_freq_khz >= freq_range->start_freq_khz &&
-	    end_freq_khz <= freq_range->end_freq_khz)
+		end_freq_khz <= freq_range->end_freq_khz)
 		return true;
 
 	return false;
diff --git a/drivers/net/wireless/uwe5622/unisocwifi/reorder.c b/drivers/net/wireless/uwe5622/unisocwifi/reorder.c
index 1cb3f9178..c6c77648d 100644
--- a/drivers/net/wireless/uwe5622/unisocwifi/reorder.c
+++ b/drivers/net/wireless/uwe5622/unisocwifi/reorder.c
@@ -49,7 +49,7 @@ set_ba_node_desc(struct rx_ba_node_desc *ba_node_desc,
 	ba_node_desc->win_size = win_size;
 	ba_node_desc->win_start = win_start;
 	ba_node_desc->win_limit = SEQNO_ADD(ba_node_desc->win_start,
-					    (ba_node_desc->win_size - 1));
+						(ba_node_desc->win_size - 1));
 	ba_node_desc->win_tail = SEQNO_SUB(ba_node_desc->win_start, 1);
 	ba_node_desc->index_mask = index_mask;
 	ba_node_desc->buff_cnt = 0;
@@ -70,7 +70,7 @@ static inline void set_ba_pkt_desc(struct rx_ba_pkt_desc *ba_pkt_desc,
 
 static inline void
 reorder_set_skb_list(struct sprdwl_rx_ba_entry *ba_entry,
-		     struct sk_buff *skb_head, struct sk_buff *skb_last)
+			 struct sk_buff *skb_head, struct sk_buff *skb_last)
 {
 	spin_lock_bh(&ba_entry->skb_list_lock);
 	if (!ba_entry->skb_head) {
@@ -114,16 +114,16 @@ static inline void mod_reorder_timer(struct rx_ba_node *ba_node)
 }
 
 static inline bool is_same_pn(struct rx_ba_pkt_desc *ba_pkt_desc,
-			      struct rx_msdu_desc *msdu_desc)
+				  struct rx_msdu_desc *msdu_desc)
 {
 	bool ret = true;
 	unsigned char cipher_type = 0;
 
 	cipher_type = ba_pkt_desc->cipher_type;
 	if ((cipher_type == SPRDWL_HW_TKIP) ||
-	    (cipher_type == SPRDWL_HW_CCMP)) {
+		(cipher_type == SPRDWL_HW_CCMP)) {
 		if ((ba_pkt_desc->pn_l != msdu_desc->pn_l) ||
-		    (ba_pkt_desc->pn_h != msdu_desc->pn_h))
+			(ba_pkt_desc->pn_h != msdu_desc->pn_h))
 			ret = false;
 	}
 
@@ -131,7 +131,7 @@ static inline bool is_same_pn(struct rx_ba_pkt_desc *ba_pkt_desc,
 }
 
 static inline bool replay_detection(struct rx_ba_pkt_desc *ba_pkt_desc,
-				    struct rx_ba_node_desc *ba_node_desc)
+					struct rx_ba_node_desc *ba_node_desc)
 {
 	bool ret = true;
 	unsigned int old_val_low = 0;
@@ -147,7 +147,7 @@ static inline bool replay_detection(struct rx_ba_pkt_desc *ba_pkt_desc,
 	 *	  HW do not support other cipher type now
 	 */
 	if ((cipher_type == SPRDWL_HW_TKIP) ||
-	    (cipher_type == SPRDWL_HW_CCMP)) {
+		(cipher_type == SPRDWL_HW_CCMP)) {
 		old_val_low = ba_node_desc->pn_l;
 		old_val_high = ba_node_desc->pn_h;
 		rx_val_low = ba_pkt_desc->pn_l;
@@ -156,13 +156,13 @@ static inline bool replay_detection(struct rx_ba_pkt_desc *ba_pkt_desc,
 		if ((1 == ba_node_desc->reset_pn) &&
 			(old_val_low >= rx_val_low) && (old_val_high >= rx_val_high)) {
 			wl_err("%s: clear reset_pn,old_val_low: %d, old_val_high: %d, rx_val_low: %d, rx_val_high: %d\n",
-			       __func__, old_val_low, old_val_high, rx_val_low, rx_val_high);
+				   __func__, old_val_low, old_val_high, rx_val_low, rx_val_high);
 			ba_node_desc->reset_pn = 0;
 			ba_node_desc->pn_l = rx_val_low;
 			ba_node_desc->pn_h = rx_val_high;
 		} else if (((old_val_high == rx_val_high) &&
-		     (old_val_low < rx_val_low)) ||
-		    (old_val_high < rx_val_high)) {
+			 (old_val_low < rx_val_low)) ||
+			(old_val_high < rx_val_high)) {
 			ba_node_desc->pn_l = rx_val_low;
 			ba_node_desc->pn_h = rx_val_high;
 		} else {
@@ -295,11 +295,11 @@ send_msdu_with_gap(struct sprdwl_rx_ba_entry *ba_entry,
 }
 
 static inline void between_seqlo_seqhi(struct sprdwl_rx_ba_entry *ba_entry,
-				       struct rx_ba_node_desc *ba_node_desc)
+					   struct rx_ba_node_desc *ba_node_desc)
 {
 	ba_node_desc->win_start = send_msdu_in_order(ba_entry, ba_node_desc);
 	ba_node_desc->win_limit = SEQNO_ADD(ba_node_desc->win_start,
-					    (ba_node_desc->win_size - 1));
+						(ba_node_desc->win_size - 1));
 }
 
 static inline void
@@ -315,12 +315,12 @@ greater_than_seqhi(struct sprdwl_rx_ba_entry *ba_entry,
 	ba_node_desc->win_start = pos_win_start;
 	ba_node_desc->win_start = send_msdu_in_order(ba_entry, ba_node_desc);
 	ba_node_desc->win_limit = SEQNO_ADD(ba_node_desc->win_start,
-					    (ba_node_desc->win_size - 1));
+						(ba_node_desc->win_size - 1));
 }
 
 static inline void bar_send_ba_buffer(struct sprdwl_rx_ba_entry *ba_entry,
-				      struct rx_ba_node_desc *ba_node_desc,
-				      unsigned short seq_num)
+					  struct rx_ba_node_desc *ba_node_desc,
+					  unsigned short seq_num)
 {
 	if (!seqno_leq(seq_num, ba_node_desc->win_start)) {
 		send_msdu_with_gap(ba_entry, ba_node_desc, seq_num);
@@ -335,7 +335,7 @@ static inline void bar_send_ba_buffer(struct sprdwl_rx_ba_entry *ba_entry,
 
 static inline int
 insert_msdu(struct rx_msdu_desc *msdu_desc, struct sk_buff *skb,
-	    struct rx_ba_node_desc *ba_node_desc)
+		struct rx_ba_node_desc *ba_node_desc)
 {
 	int ret = 0;
 	unsigned short seq_num = msdu_desc->seq_num;
@@ -347,7 +347,7 @@ insert_msdu(struct rx_msdu_desc *msdu_desc, struct sk_buff *skb,
 
 	if (insert->desc.msdu_num != 0) {
 		if ((insert->desc.seq == seq_num) && (insert->desc.last != 1) &&
-		    is_same_pn(&insert->desc, msdu_desc)) {
+			is_same_pn(&insert->desc, msdu_desc)) {
 			joint_msdu(insert, skb);
 			insert->desc.msdu_num++;
 			insert->desc.last = last_msdu_flag;
@@ -385,7 +385,7 @@ static int reorder_msdu(struct sprdwl_rx_ba_entry *ba_entry,
 			ba_node_desc->win_tail = seq_num;
 	} else {
 		wl_debug("%s: seq_num: %d is less than win_start: %d\n",
-		       __func__, seq_num, ba_node_desc->win_start);
+			   __func__, seq_num, ba_node_desc->win_start);
 	}
 
 	if (ret && skb) {
@@ -417,7 +417,7 @@ static void reorder_msdu_process(struct sprdwl_rx_ba_entry *ba_entry,
 
 		/* FIXME: Data come in sequence in default */
 		if ((seq_num == ba_node_desc->win_start) &&
-		    !ba_node_desc->buff_cnt && last_msdu_flag) {
+			!ba_node_desc->buff_cnt && last_msdu_flag) {
 			send_order_msdu(ba_entry, msdu_desc, skb, ba_node_desc);
 			goto out;
 		}
@@ -426,7 +426,7 @@ static void reorder_msdu_process(struct sprdwl_rx_ba_entry *ba_entry,
 		ret = reorder_msdu(ba_entry, msdu_desc, skb, ba_node);
 		if (!ret) {
 			if (last_msdu_flag &&
-			    (seq_num == ba_node_desc->win_start)) {
+				(seq_num == ba_node_desc->win_start)) {
 				between_seqlo_seqhi(ba_entry, ba_node_desc);
 				mod_reorder_timer(ba_node);
 			} else if (!timer_pending(&ba_node->reorder_timer) ||
@@ -440,8 +440,8 @@ static void reorder_msdu_process(struct sprdwl_rx_ba_entry *ba_entry,
 			ba_node->timeout_cnt = 0;
 		}
 	} else {
-		wl_err("%s: BA SESSION IS NO ACTIVE sta_lut_index: %d, tid: %d\n",
-		       __func__, msdu_desc->sta_lut_index, msdu_desc->tid);
+		//wl_err("%s: BA SESSION IS NO ACTIVE sta_lut_index: %d, tid: %d\n",
+		//	   __func__, msdu_desc->sta_lut_index, msdu_desc->tid);
 		reorder_set_skb_list(ba_entry, skb, skb);
 	}
 
@@ -472,13 +472,13 @@ static inline void init_ba_node(struct sprdwl_rx_ba_entry *ba_entry,
 }
 
 static inline bool is_same_ba(struct rx_ba_node *ba_node,
-			      unsigned char sta_lut_index, unsigned char tid)
+				  unsigned char sta_lut_index, unsigned char tid)
 {
 	bool ret = false;
 
 	if (ba_node) {
 		if ((ba_node->sta_lut_index == sta_lut_index) &&
-		    (ba_node->tid == tid))
+			(ba_node->tid == tid))
 			ret = true;
 	}
 
@@ -487,7 +487,7 @@ static inline bool is_same_ba(struct rx_ba_node *ba_node,
 
 static struct rx_ba_node
 *find_ba_node(struct sprdwl_rx_ba_entry *ba_entry,
-	      unsigned char sta_lut_index, unsigned char tid)
+		  unsigned char sta_lut_index, unsigned char tid)
 {
 	struct rx_ba_node *ba_node = NULL;
 
@@ -500,7 +500,7 @@ static struct rx_ba_node
 			if (!hlist_empty(head)) {
 				hlist_for_each_entry(ba_node, head, hlist) {
 					if (sta_lut_index ==
-					    ba_node->sta_lut_index) {
+						ba_node->sta_lut_index) {
 						ba_entry->current_ba_node =
 							ba_node;
 						break;
@@ -510,7 +510,7 @@ static struct rx_ba_node
 		}
 	} else {
 		wl_err("%s: TID is too large sta_lut_index: %d, tid: %d\n",
-		       __func__, sta_lut_index, tid);
+			   __func__, sta_lut_index, tid);
 	}
 
 	return ba_node;
@@ -569,16 +569,16 @@ void reset_pn(struct sprdwl_priv *priv, const u8 *mac_addr)
 			spin_lock_bh(&ba_node->ba_node_lock);
 			ba_node->rx_ba->reset_pn = 1;
 			wl_info("%s: set,lut=%d,tid=%d,pn_l=%d,pn_h=%d\n",
-			       __func__, lut_id, tid,
-			       ba_node->rx_ba->pn_l,
-			       ba_node->rx_ba->pn_h);
+				   __func__, lut_id, tid,
+				   ba_node->rx_ba->pn_l,
+				   ba_node->rx_ba->pn_h);
 			spin_unlock_bh(&ba_node->ba_node_lock);
 		}
 	}
 }
 
 struct sk_buff *reorder_data_process(struct sprdwl_rx_ba_entry *ba_entry,
-				     struct sk_buff *pskb)
+					 struct sk_buff *pskb)
 {
 	struct rx_ba_node *ba_node = NULL;
 	struct rx_msdu_desc *msdu_desc = NULL;
@@ -592,11 +592,11 @@ struct sk_buff *reorder_data_process(struct sprdwl_rx_ba_entry *ba_entry,
 
 		if (!msdu_desc->bc_mc_flag && msdu_desc->qos_flag) {
 			ba_node = find_ba_node(ba_entry,
-					       msdu_desc->sta_lut_index,
-					       msdu_desc->tid);
+						   msdu_desc->sta_lut_index,
+						   msdu_desc->tid);
 			if (ba_node)
 				reorder_msdu_process(ba_entry, msdu_desc,
-						     pskb, ba_node);
+							 pskb, ba_node);
 			else
 				reorder_set_skb_list(ba_entry, pskb, pskb);
 		} else {
@@ -612,13 +612,13 @@ struct sk_buff *reorder_data_process(struct sprdwl_rx_ba_entry *ba_entry,
 }
 
 static void wlan_filter_event(struct sprdwl_rx_ba_entry *ba_entry,
-			      struct sprdwl_event_ba *ba_event)
+				  struct sprdwl_event_ba *ba_event)
 {
 	struct rx_ba_node *ba_node = NULL;
 	struct rx_msdu_desc msdu_desc;
 
 	ba_node = find_ba_node(ba_entry,
-			       ba_event->sta_lut_index, ba_event->tid);
+				   ba_event->sta_lut_index, ba_event->tid);
 	if (ba_node) {
 		msdu_desc.last_msdu_of_mpdu = 1;
 		msdu_desc.seq_num = ba_event->msdu_param.seq_num;
@@ -631,17 +631,17 @@ static void wlan_filter_event(struct sprdwl_rx_ba_entry *ba_entry,
 }
 
 static void wlan_delba_event(struct sprdwl_rx_ba_entry *ba_entry,
-			     struct sprdwl_event_ba *ba_event)
+				 struct sprdwl_event_ba *ba_event)
 {
 	struct rx_ba_node *ba_node = NULL;
 	struct rx_ba_node_desc *ba_node_desc = NULL;
 
 	wl_info("enter %s\n", __func__);
 	ba_node = find_ba_node(ba_entry,
-			       ba_event->sta_lut_index, ba_event->tid);
+				   ba_event->sta_lut_index, ba_event->tid);
 	if (!ba_node) {
 		wl_err("%s: NOT FOUND sta_lut_index: %d, tid: %d\n",
-		       __func__, ba_event->sta_lut_index, ba_event->tid);
+			   __func__, ba_event->sta_lut_index, ba_event->tid);
 		return;
 	}
 
@@ -672,10 +672,10 @@ static void wlan_bar_event(struct sprdwl_rx_ba_entry *ba_entry,
 
 	wl_info("enter %s\n", __func__);
 	ba_node = find_ba_node(ba_entry,
-			       ba_event->sta_lut_index, ba_event->tid);
+				   ba_event->sta_lut_index, ba_event->tid);
 	if (!ba_node) {
 		wl_err("%s: NOT FOUND sta_lut_index: %d, tid: %d\n",
-		       __func__, ba_event->sta_lut_index, ba_event->tid);
+			   __func__, ba_event->sta_lut_index, ba_event->tid);
 		return;
 	}
 
@@ -683,7 +683,7 @@ static void wlan_bar_event(struct sprdwl_rx_ba_entry *ba_entry,
 	if (ba_node->active) {
 		ba_node_desc = ba_node->rx_ba;
 		if (!seqno_leq(ba_event->win_param.win_start,
-			       ba_node_desc->win_start)) {
+				   ba_node_desc->win_start)) {
 			bar_send_ba_buffer(ba_entry, ba_node_desc,
 					   ba_event->win_param.win_start);
 			mod_reorder_timer(ba_node);
@@ -696,7 +696,7 @@ static void wlan_bar_event(struct sprdwl_rx_ba_entry *ba_entry,
 			ba_node_desc->win_start, ba_node_desc->win_tail);
 	} else {
 		wl_err("%s: BA SESSION IS NO ACTIVE sta_lut_index: %d, tid: %d\n",
-		       __func__, ba_event->sta_lut_index, ba_event->tid);
+			   __func__, ba_event->sta_lut_index, ba_event->tid);
 	}
 	spin_unlock_bh(&ba_node->ba_node_lock);
 }
@@ -733,7 +733,7 @@ static void send_addba_rsp(struct sprdwl_rx_ba_entry *ba_entry,
 }
 
 static void send_delba(struct sprdwl_rx_ba_entry *ba_entry,
-		       unsigned short tid, unsigned char sta_lut_index)
+			   unsigned short tid, unsigned char sta_lut_index)
 {
 	struct sprdwl_cmd_ba delba;
 	struct sprdwl_intf *intf = NULL;
@@ -760,7 +760,7 @@ static void send_delba(struct sprdwl_rx_ba_entry *ba_entry,
 }
 
 static int wlan_addba_event(struct sprdwl_rx_ba_entry *ba_entry,
-			    struct sprdwl_event_ba *ba_event)
+				struct sprdwl_event_ba *ba_event)
 {
 	struct rx_ba_node *ba_node = NULL;
 	int ret = 0;
@@ -797,7 +797,7 @@ static int wlan_addba_event(struct sprdwl_rx_ba_entry *ba_entry,
 	} else {
 		/* Should never happen */
 		wl_err("%s: BA SESSION IS ACTIVE sta_lut_index: %d, tid: %d\n",
-		       __func__, sta_lut_index, tid);
+			   __func__, sta_lut_index, tid);
 		ret = -EINVAL;
 	}
 	spin_unlock_bh(&ba_node->ba_node_lock);
@@ -823,7 +823,7 @@ void wlan_ba_session_event(void *hw_intf,
 	case SPRDWL_ADDBA_REQ_EVENT:
 		ret = wlan_addba_event(ba_entry, ba_event);
 		send_addba_rsp(ba_entry, ba_event->tid,
-			       ba_event->sta_lut_index, ret);
+				   ba_event->sta_lut_index, ret);
 		break;
 	case SPRDWL_DELBA_EVENT:
 		wlan_delba_event(ba_entry, ba_event);
@@ -927,7 +927,7 @@ static void ba_reorder_timeout(unsigned long data)
 	debug_cnt_inc(REORDER_TIMEOUT_CNT);
 	spin_lock_bh(&ba_node->ba_node_lock);
 	if (ba_node->active && ba_node_desc->buff_cnt &&
-	    !timer_pending(&ba_node->reorder_timer)) {
+		!timer_pending(&ba_node->reorder_timer)) {
 		pos_seqno = get_first_seqno_in_buff(ba_node_desc);
 		send_msdu_with_gap(ba_entry, ba_node_desc, pos_seqno);
 		ba_node_desc->win_start = pos_seqno;
@@ -1009,8 +1009,8 @@ void sprdwl_active_ba_node(struct sprdwl_rx_ba_entry *ba_entry,
 
 	ba_node = find_ba_node(ba_entry, sta_lut_index, tid);
 	if (ba_node == NULL) {
-	    wl_err("BA node not found, tid = %d\n", tid);
-	    return;
+		wl_err("BA node not found, tid = %d\n", tid);
+		return;
 	}
 
 	spin_lock_bh(&ba_node->ba_node_lock);
diff --git a/drivers/net/wireless/uwe5622/unisocwifi/rf_marlin3.c b/drivers/net/wireless/uwe5622/unisocwifi/rf_marlin3.c
index a2f6cc394..ca307f12a 100644
--- a/drivers/net/wireless/uwe5622/unisocwifi/rf_marlin3.c
+++ b/drivers/net/wireless/uwe5622/unisocwifi/rf_marlin3.c
@@ -181,9 +181,9 @@ static struct nvm_name_table g_config_table[] = {
 	CF_TAB("Chain0_149", tx_scale.chain0[34][0], 1),
 	CF_TAB("Chain1_149", tx_scale.chain1[34][0], 1),
 	CF_TAB("Chain0_153", tx_scale.chain0[35][0], 1),
-	CF_TAB("Chain1_153", tx_scale.chain0[35][0], 1),
+	CF_TAB("Chain1_153", tx_scale.chain1[35][0], 1),
 	CF_TAB("Chain0_157", tx_scale.chain0[36][0], 1),
-	CF_TAB("Chain1_157", tx_scale.chain0[36][0], 1),
+	CF_TAB("Chain1_157", tx_scale.chain1[36][0], 1),
 	CF_TAB("Chain0_161", tx_scale.chain0[37][0], 1),
 	CF_TAB("Chain1_161", tx_scale.chain1[37][0], 1),
 	CF_TAB("Chain0_165", tx_scale.chain0[38][0], 1),
diff --git a/drivers/net/wireless/uwe5622/unisocwifi/rtt.c b/drivers/net/wireless/uwe5622/unisocwifi/rtt.c
index 739d3aa3d..1ad03a902 100644
--- a/drivers/net/wireless/uwe5622/unisocwifi/rtt.c
+++ b/drivers/net/wireless/uwe5622/unisocwifi/rtt.c
@@ -203,8 +203,8 @@ static u8 sprdwl_ftm_get_channel(struct wiphy *wiphy,
 		channel = chan->hw_value;
 	} else {
 		bss = cfg80211_get_bss(wiphy, NULL, mac_addr,
-				       NULL, 0, WLAN_CAPABILITY_ESS,
-				       WLAN_CAPABILITY_ESS);
+					   NULL, 0, WLAN_CAPABILITY_ESS,
+					   WLAN_CAPABILITY_ESS);
 		if (!bss) {
 			wl_err("Unable to find BSS\n");
 			return 0;
@@ -232,7 +232,7 @@ static int sprdwl_ftm_parse_meas_params(struct sprdwl_vif *vif,
 	}
 #if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 14, 0)
 	rc = nla_parse_nested(tb, SPRDWL_VENDOR_ATTR_FTM_PARAM_MAX,
-			      attr, sprdwl_nl80211_ftm_meas_param_policy, NULL);
+				  attr, sprdwl_nl80211_ftm_meas_param_policy, NULL);
 #else
 	rc = nla_parse_nested(tb, SPRDWL_VENDOR_ATTR_FTM_PARAM_MAX,
 				attr, sprdwl_nl80211_ftm_meas_param_policy);
@@ -262,7 +262,7 @@ sprdwl_ftm_validate_meas_params(struct sprdwl_vif *vif,
 				struct sprdwl_ftm_meas_params *params)
 {
 	if (params->meas_per_burst > FTM_MAX_MEAS_PER_BURST ||
-	    params->num_of_bursts_exp != 0) {
+		params->num_of_bursts_exp != 0) {
 		wl_ndev_log(L_ERR, vif->ndev, "%s: invalid meas per burst\n", __func__);
 		return -EINVAL;
 	}
@@ -281,12 +281,12 @@ static int sprdwl_ftm_append_meas_params(struct sprdwl_priv *priv,
 	if (!nl_p)
 		goto out_put_failure;
 	if (nla_put_u8(msg, SPRDWL_VENDOR_ATTR_FTM_PARAM_MEAS_PER_BURST,
-		       params->meas_per_burst) ||
-	    nla_put_u8(msg, SPRDWL_VENDOR_ATTR_FTM_PARAM_NUM_BURSTS_EXP,
-		       params->num_of_bursts_exp) ||
-	    nla_put_u8(msg, SPRDWL_VENDOR_ATTR_FTM_PARAM_BURST_DURATION,
-		       params->burst_duration) ||
-	    nla_put_u16(msg, SPRDWL_VENDOR_ATTR_FTM_PARAM_BURST_PERIOD,
+			   params->meas_per_burst) ||
+		nla_put_u8(msg, SPRDWL_VENDOR_ATTR_FTM_PARAM_NUM_BURSTS_EXP,
+			   params->num_of_bursts_exp) ||
+		nla_put_u8(msg, SPRDWL_VENDOR_ATTR_FTM_PARAM_BURST_DURATION,
+			   params->burst_duration) ||
+		nla_put_u16(msg, SPRDWL_VENDOR_ATTR_FTM_PARAM_BURST_PERIOD,
 			params->burst_period))
 		goto out_put_failure;
 	nla_nest_end(msg, nl_p);
@@ -303,19 +303,19 @@ static int sprdwl_ftm_append_peer_meas_res(struct sprdwl_priv *priv,
 	int i;
 
 	if (nla_put(msg, SPRDWL_VENDOR_ATTR_FTM_PEER_RES_MAC_ADDR,
-		    ETH_ALEN, res->mac_addr) ||
-	    nla_put_u32(msg, SPRDWL_VENDOR_ATTR_FTM_PEER_RES_FLAGS,
+			ETH_ALEN, res->mac_addr) ||
+		nla_put_u32(msg, SPRDWL_VENDOR_ATTR_FTM_PEER_RES_FLAGS,
 			res->flags) ||
-	    nla_put_u8(msg, SPRDWL_VENDOR_ATTR_FTM_PEER_RES_STATUS,
-		       res->status))
+		nla_put_u8(msg, SPRDWL_VENDOR_ATTR_FTM_PEER_RES_STATUS,
+			   res->status))
 		goto out_put_failure;
 	if (res->status == SPRDWL_VENDOR_ATTR_FTM_PEER_RES_STATUS_FAILED &&
-	    nla_put_u8(msg,
-		       SPRDWL_VENDOR_ATTR_FTM_PEER_RES_VALUE_SECONDS,
-		       res->value_seconds))
+		nla_put_u8(msg,
+			   SPRDWL_VENDOR_ATTR_FTM_PEER_RES_VALUE_SECONDS,
+			   res->value_seconds))
 		goto out_put_failure;
 	if (res->has_params &&
-	    sprdwl_ftm_append_meas_params(priv, msg, &res->params))
+		sprdwl_ftm_append_meas_params(priv, msg, &res->params))
 		goto out_put_failure;
 	nl_mres = nla_nest_start(msg, SPRDWL_VENDOR_ATTR_FTM_PEER_RES_MEAS);
 	if (!nl_mres)
@@ -327,21 +327,21 @@ static int sprdwl_ftm_append_peer_meas_res(struct sprdwl_priv *priv,
 #if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 7, 0)
 		if (nla_put_u64_64bit(msg, SPRDWL_VENDOR_ATTR_FTM_MEAS_T1,
 				res->meas[i].t1, 0) ||
-		    nla_put_u64_64bit(msg, SPRDWL_VENDOR_ATTR_FTM_MEAS_T2,
+			nla_put_u64_64bit(msg, SPRDWL_VENDOR_ATTR_FTM_MEAS_T2,
 				res->meas[i].t2, 0) ||
-		    nla_put_u64_64bit(msg, SPRDWL_VENDOR_ATTR_FTM_MEAS_T3,
+			nla_put_u64_64bit(msg, SPRDWL_VENDOR_ATTR_FTM_MEAS_T3,
 				res->meas[i].t3, 0) ||
-		    nla_put_u64_64bit(msg, SPRDWL_VENDOR_ATTR_FTM_MEAS_T4,
+			nla_put_u64_64bit(msg, SPRDWL_VENDOR_ATTR_FTM_MEAS_T4,
 				res->meas[i].t4, 0))
 			goto out_put_failure;
 #else
 		if (nla_put_u64(msg, SPRDWL_VENDOR_ATTR_FTM_MEAS_T1,
 				res->meas[i].t1) ||
-		    nla_put_u64(msg, SPRDWL_VENDOR_ATTR_FTM_MEAS_T2,
+			nla_put_u64(msg, SPRDWL_VENDOR_ATTR_FTM_MEAS_T2,
 				res->meas[i].t2) ||
-		    nla_put_u64(msg, SPRDWL_VENDOR_ATTR_FTM_MEAS_T3,
+			nla_put_u64(msg, SPRDWL_VENDOR_ATTR_FTM_MEAS_T3,
 				res->meas[i].t3) ||
-		    nla_put_u64(msg, SPRDWL_VENDOR_ATTR_FTM_MEAS_T4,
+			nla_put_u64(msg, SPRDWL_VENDOR_ATTR_FTM_MEAS_T4,
 				res->meas[i].t4))
 			goto out_put_failure;
 #endif
@@ -444,26 +444,26 @@ sprdwl_ftm_cfg80211_start_session(struct sprdwl_priv *priv,
 
 	for (i = 0; i < request->n_peers; i++) {
 		if (request->peers[i].flags &
-		    SPRDWL_VENDOR_ATTR_FTM_PEER_MEAS_FLAG_LCI)
+			SPRDWL_VENDOR_ATTR_FTM_PEER_MEAS_FLAG_LCI)
 			has_lci = true;
 		if (request->peers[i].flags &
-		    SPRDWL_VENDOR_ATTR_FTM_PEER_MEAS_FLAG_LCR)
+			SPRDWL_VENDOR_ATTR_FTM_PEER_MEAS_FLAG_LCR)
 			has_lcr = true;
 		max_meas = max(max_meas,
-			       request->peers[i].params.meas_per_burst);
+				   request->peers[i].params.meas_per_burst);
 	}
 
 	priv->ftm.ftm_res = kzalloc(sizeof(*priv->ftm.ftm_res) +
-		      max_meas * sizeof(struct sprdwl_ftm_peer_meas) +
-		      (has_lci ? FTM_MAX_LCI_LENGTH : 0) +
-		      (has_lcr ? FTM_MAX_LCR_LENGTH : 0), GFP_KERNEL);
+			  max_meas * sizeof(struct sprdwl_ftm_peer_meas) +
+			  (has_lci ? FTM_MAX_LCI_LENGTH : 0) +
+			  (has_lcr ? FTM_MAX_LCR_LENGTH : 0), GFP_KERNEL);
 	if (!priv->ftm.ftm_res) {
 		ret = -ENOMEM;
 		goto out;
 	}
 	ptr = (u8 *)priv->ftm.ftm_res;
 	ptr += sizeof(struct sprdwl_ftm_peer_meas_res) +
-	       max_meas * sizeof(struct sprdwl_ftm_peer_meas);
+		   max_meas * sizeof(struct sprdwl_ftm_peer_meas);
 	if (has_lci) {
 		priv->ftm.ftm_res->lci = ptr;
 		ptr += FTM_MAX_LCI_LENGTH;
@@ -490,13 +490,13 @@ sprdwl_ftm_cfg80211_start_session(struct sprdwl_priv *priv,
 						 request->peers[i].freq);
 		if (!channel) {
 			wl_err("%s: can't find FTM target at index %d\n",
-			       __func__, i);
+				   __func__, i);
 			ret = -EINVAL;
 			goto out_cmd;
 		}
 		cmd->dest_info[i].channel = channel - 1;
 		if (request->peers[i].flags &
-		    SPRDWL_VENDOR_ATTR_FTM_PEER_MEAS_FLAG_SECURE) {
+			SPRDWL_VENDOR_ATTR_FTM_PEER_MEAS_FLAG_SECURE) {
 			cmd->dest_info[i].flags |=
 				FTM_SESSION_START_FLAG_SECURED;
 			cmd->dest_info[i].initial_token =
@@ -506,15 +506,15 @@ sprdwl_ftm_cfg80211_start_session(struct sprdwl_priv *priv,
 				FTM_DEFAULT_INITIAL_TOKEN;
 		}
 		if (request->peers[i].flags &
-		    SPRDWL_VENDOR_ATTR_FTM_PEER_MEAS_FLAG_ASAP)
+			SPRDWL_VENDOR_ATTR_FTM_PEER_MEAS_FLAG_ASAP)
 			cmd->dest_info[i].flags |=
 				FTM_SESSION_START_FLAG_ASAP;
 		if (request->peers[i].flags &
-		    SPRDWL_VENDOR_ATTR_FTM_PEER_MEAS_FLAG_LCI)
+			SPRDWL_VENDOR_ATTR_FTM_PEER_MEAS_FLAG_LCI)
 			cmd->dest_info[i].flags |=
 				FTM_SESSION_START_FLAG_LCI_REQ;
 		if (request->peers[i].flags &
-		    SPRDWL_VENDOR_ATTR_FTM_PEER_MEAS_FLAG_LCR)
+			SPRDWL_VENDOR_ATTR_FTM_PEER_MEAS_FLAG_LCR)
 			cmd->dest_info[i].flags |=
 				FTM_SESSION_START_FLAG_LCR_REQ;
 		cmd->dest_info[i].num_of_ftm_per_burst =
@@ -595,13 +595,13 @@ sprdwl_ftm_session_ended(struct sprdwl_priv *priv, u32 status)
 	if (nla_put_u64_64bit(skb,
 				SPRDWL_VENDOR_ATTR_FTM_SESSION_COOKIE,
 				priv->ftm.session_cookie, 0) ||
-	    nla_put_u32(skb,
+		nla_put_u32(skb,
 			SPRDWL_VENDOR_ATTR_LOC_SESSION_STATUS, status)) {
 #else
 	if (nla_put_u64(skb,
 			SPRDWL_VENDOR_ATTR_FTM_SESSION_COOKIE,
 			priv->ftm.session_cookie) ||
-	    nla_put_u32(skb,
+		nla_put_u32(skb,
 			SPRDWL_VENDOR_ATTR_LOC_SESSION_STATUS, status)) {
 #endif
 		wl_err("%s: failed to fill session done event\n", __func__);
@@ -625,13 +625,13 @@ void sprdwl_ftm_event_per_dest_res(struct sprdwl_priv *priv,
 
 	if (!priv->ftm.session_started || !priv->ftm.ftm_res) {
 		wl_err("%s: Session not running, ignoring res event\n",
-		       __func__);
+			   __func__);
 		goto out;
 	}
 	if (priv->ftm.has_ftm_res &&
-	    !ether_addr_equal(res->dst_mac, priv->ftm.ftm_res->mac_addr)) {
+		!ether_addr_equal(res->dst_mac, priv->ftm.ftm_res->mac_addr)) {
 		wl_err("%s: previous peer not properly terminated\n",
-		       __func__);
+			   __func__);
 		sprdwl_ftm_send_peer_res(priv);
 	}
 
@@ -670,16 +670,16 @@ void sprdwl_ftm_event_per_dest_res(struct sprdwl_priv *priv,
 			break;
 		}
 		memcpy(&tmp, res->responder_ftm_res[i].t1,
-		       sizeof(res->responder_ftm_res[i].t1));
+			   sizeof(res->responder_ftm_res[i].t1));
 		priv->ftm.ftm_res->meas[index].t1 = le64_to_cpu(tmp);
 		memcpy(&tmp, res->responder_ftm_res[i].t2,
-		       sizeof(res->responder_ftm_res[i].t2));
+			   sizeof(res->responder_ftm_res[i].t2));
 		priv->ftm.ftm_res->meas[index].t2 = le64_to_cpu(tmp);
 		memcpy(&tmp, res->responder_ftm_res[i].t3,
-		       sizeof(res->responder_ftm_res[i].t3));
+			   sizeof(res->responder_ftm_res[i].t3));
 		priv->ftm.ftm_res->meas[index].t3 = le64_to_cpu(tmp);
 		memcpy(&tmp, res->responder_ftm_res[i].t4,
-		       sizeof(res->responder_ftm_res[i].t4));
+			   sizeof(res->responder_ftm_res[i].t4));
 		priv->ftm.ftm_res->meas[index].t4 = le64_to_cpu(tmp);
 		priv->ftm.ftm_res->n_meas++;
 	}
@@ -753,19 +753,19 @@ int sprdwl_ftm_get_capabilities(struct wiphy *wiphy,
 		return -ENOMEM;
 	attr = nla_nest_start(skb, SPRDWL_VENDOR_ATTR_LOC_CAPA);
 	if (!attr ||
-	    nla_put_u32(skb, SPRDWL_VENDOR_ATTR_LOC_CAPA_FLAGS,
+		nla_put_u32(skb, SPRDWL_VENDOR_ATTR_LOC_CAPA_FLAGS,
 			SPRDWL_VENDOR_ATTR_LOC_CAPA_FLAG_FTM_RESPONDER |
 			SPRDWL_VENDOR_ATTR_LOC_CAPA_FLAG_FTM_INITIATOR |
 			SPRDWL_VENDOR_ATTR_LOC_CAPA_FLAG_ASAP |
 			SPRDWL_VENDOR_ATTR_LOC_CAPA_FLAG_AOA) ||
-	    nla_put_u16(skb, SPRDWL_VENDOR_ATTR_FTM_CAPA_MAX_NUM_SESSIONS,
+		nla_put_u16(skb, SPRDWL_VENDOR_ATTR_FTM_CAPA_MAX_NUM_SESSIONS,
 			1) ||
-	    nla_put_u16(skb, SPRDWL_VENDOR_ATTR_FTM_CAPA_MAX_NUM_PEERS, 1) ||
-	    nla_put_u8(skb, SPRDWL_VENDOR_ATTR_FTM_CAPA_MAX_NUM_BURSTS_EXP,
-		       0) ||
-	    nla_put_u8(skb, SPRDWL_VENDOR_ATTR_FTM_CAPA_MAX_MEAS_PER_BURST,
-		       4) ||
-	    nla_put_u32(skb, SPRDWL_VENDOR_ATTR_AOA_CAPA_SUPPORTED_TYPES,
+		nla_put_u16(skb, SPRDWL_VENDOR_ATTR_FTM_CAPA_MAX_NUM_PEERS, 1) ||
+		nla_put_u8(skb, SPRDWL_VENDOR_ATTR_FTM_CAPA_MAX_NUM_BURSTS_EXP,
+			   0) ||
+		nla_put_u8(skb, SPRDWL_VENDOR_ATTR_FTM_CAPA_MAX_MEAS_PER_BURST,
+			   4) ||
+		nla_put_u32(skb, SPRDWL_VENDOR_ATTR_AOA_CAPA_SUPPORTED_TYPES,
 			BIT(SPRDWL_VENDOR_ATTR_AOA_TYPE_TOP_CIR_PHASE))) {
 		wl_ndev_log(L_ERR, vif->ndev,
 			   "%s: fail to fill capabilities\n", __func__);
@@ -778,8 +778,8 @@ int sprdwl_ftm_get_capabilities(struct wiphy *wiphy,
 }
 
 int sprdwl_ftm_start_session(struct wiphy *wiphy,
-			     struct wireless_dev *wdev,
-			     const void *data, int data_len)
+				 struct wireless_dev *wdev,
+				 const void *data, int data_len)
 {
 	struct sprdwl_priv *priv = wiphy_priv(wiphy);
 	struct sprdwl_vif *vif = netdev_priv(wdev->netdev);
@@ -790,7 +790,7 @@ int sprdwl_ftm_start_session(struct wiphy *wiphy,
 	int rc, n_peers = 0, index = 0, rem;
 #if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 14, 0)
 	rc = nla_parse(tb, SPRDWL_VENDOR_ATTR_LOC_MAX, data, data_len,
-		       sprdwl_nl80211_loc_policy, NULL);
+			   sprdwl_nl80211_loc_policy, NULL);
 #else
 	rc = nla_parse(tb, SPRDWL_VENDOR_ATTR_LOC_MAX, data, data_len,
 			sprdwl_nl80211_loc_policy);
@@ -812,7 +812,7 @@ int sprdwl_ftm_start_session(struct wiphy *wiphy,
 	}
 
 	nla_for_each_nested(peer, tb[SPRDWL_VENDOR_ATTR_FTM_MEAS_PEERS],
-			    rem)
+				rem)
 		n_peers++;
 
 	if (!n_peers) {
@@ -837,10 +837,10 @@ int sprdwl_ftm_start_session(struct wiphy *wiphy,
 		nla_get_u64(tb[SPRDWL_VENDOR_ATTR_FTM_SESSION_COOKIE]);
 	request->n_peers = n_peers;
 	nla_for_each_nested(peer, tb[SPRDWL_VENDOR_ATTR_FTM_MEAS_PEERS],
-			    rem) {
+				rem) {
 #if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 14, 0)
 		rc = nla_parse_nested(tb2, SPRDWL_VENDOR_ATTR_FTM_PEER_MAX,
-				      peer, sprdwl_nl80211_ftm_peer_policy, NULL);
+					  peer, sprdwl_nl80211_ftm_peer_policy, NULL);
 #else
 		rc = nla_parse_nested(tb2, SPRDWL_VENDOR_ATTR_FTM_PEER_MAX,
 				peer, sprdwl_nl80211_ftm_peer_policy);
@@ -851,8 +851,8 @@ int sprdwl_ftm_start_session(struct wiphy *wiphy,
 			goto out;
 		}
 		if (!tb2[SPRDWL_VENDOR_ATTR_FTM_PEER_MAC_ADDR] ||
-		    nla_len(tb2[SPRDWL_VENDOR_ATTR_FTM_PEER_MAC_ADDR])
-			    != ETH_ALEN) {
+			nla_len(tb2[SPRDWL_VENDOR_ATTR_FTM_PEER_MAC_ADDR])
+				!= ETH_ALEN) {
 			wl_ndev_log(L_ERR, vif->ndev,
 				   "%s: peer MAC address missing or invalid\n",
 				   __func__);
@@ -860,8 +860,8 @@ int sprdwl_ftm_start_session(struct wiphy *wiphy,
 			goto out;
 		}
 		memcpy(request->peers[index].mac_addr,
-		       nla_data(tb2[SPRDWL_VENDOR_ATTR_FTM_PEER_MAC_ADDR]),
-		       ETH_ALEN);
+			   nla_data(tb2[SPRDWL_VENDOR_ATTR_FTM_PEER_MAC_ADDR]),
+			   ETH_ALEN);
 		if (tb2[SPRDWL_VENDOR_ATTR_FTM_PEER_FREQ])
 			request->peers[index].freq = nla_get_u32(
 				tb2[SPRDWL_VENDOR_ATTR_FTM_PEER_FREQ]);
@@ -890,8 +890,8 @@ int sprdwl_ftm_start_session(struct wiphy *wiphy,
 }
 
 int sprdwl_ftm_abort_session(struct wiphy *wiphy,
-			     struct wireless_dev *wdev,
-			     const void *data, int len)
+				 struct wireless_dev *wdev,
+				 const void *data, int len)
 {
 	struct sprdwl_msg_buf *msg;
 	struct sprdwl_cmd_rtt *cmd;
diff --git a/drivers/net/wireless/uwe5622/unisocwifi/rx_msg.c b/drivers/net/wireless/uwe5622/unisocwifi/rx_msg.c
index b6604ee54..b51207d19 100644
--- a/drivers/net/wireless/uwe5622/unisocwifi/rx_msg.c
+++ b/drivers/net/wireless/uwe5622/unisocwifi/rx_msg.c
@@ -31,8 +31,8 @@
 bool mh_ipv6_ext_hdr(unsigned char nexthdr)
 {
 	return (nexthdr == NEXTHDR_HOP) ||
-	       (nexthdr == NEXTHDR_ROUTING) ||
-	       (nexthdr == NEXTHDR_DEST);
+		   (nexthdr == NEXTHDR_ROUTING) ||
+		   (nexthdr == NEXTHDR_DEST);
 }
 
 int ipv6_csum(void *data, __wsum csum)
@@ -65,8 +65,8 @@ int ipv6_csum(void *data, __wsum csum)
 			 (msdu_desc->msdu_len - dataoff));
 
 		if (!csum_ipv6_magic(&ip6h->saddr, &ip6h->daddr,
-				     (msdu_desc->msdu_len - dataoff),
-				     nexthdr, csum)) {
+					 (msdu_desc->msdu_len - dataoff),
+					 nexthdr, csum)) {
 			ret = 1;
 		} else {
 			ret = -1;
@@ -300,20 +300,20 @@ static void sprdwl_rx_work_queue(struct work_struct *work)
 
 					r_buf = (unsigned char *)data;
 					sprdwl_intf_tx_data_fpga_test(intf,
-								      r_buf,
-								      len);
+									  r_buf,
+									  len);
 				}
 #else
 				if (msg->len > SPRDWL_MAX_DATA_RXLEN)
 					wl_err("err rx data too long:%d > %d\n",
-					       len, SPRDWL_MAX_DATA_RXLEN);
+						   len, SPRDWL_MAX_DATA_RXLEN);
 				sprdwl_rx_data_process(priv, data);
 #endif /* FPGA_LOOPBACK_TEST */
 				break;
 			case SPRDWL_TYPE_CMD:
 				if (msg->len > SPRDWL_MAX_CMD_RXLEN)
 					wl_err("err rx cmd too long:%d > %d\n",
-					       len, SPRDWL_MAX_CMD_RXLEN);
+						   len, SPRDWL_MAX_CMD_RXLEN);
 				sprdwl_rx_rsp_process(priv, data);
 				break;
 			case SPRDWL_TYPE_PKT_LOG:
@@ -324,7 +324,7 @@ static void sprdwl_rx_work_queue(struct work_struct *work)
 			case SPRDWL_TYPE_EVENT:
 				if (msg->len > SPRDWL_MAX_CMD_RXLEN)
 					wl_err("err rx event too long:%d > %d\n",
-					       len, SPRDWL_MAX_CMD_RXLEN);
+						   len, SPRDWL_MAX_CMD_RXLEN);
 				sprdwl_rx_event_process(priv, data);
 				break;
 			case SPRDWL_TYPE_DATA_SPECIAL:
@@ -333,7 +333,7 @@ static void sprdwl_rx_work_queue(struct work_struct *work)
 
 				if (msg->len > SPRDWL_MAX_DATA_RXLEN)
 					wl_err("err data trans too long:%d > %d\n",
-					       len, SPRDWL_MAX_CMD_RXLEN);
+						   len, SPRDWL_MAX_CMD_RXLEN);
 				sprdwl_rx_mh_data_process(rx_if, tran_data, len,
 							  msg->buffer_type);
 				tran_data = NULL;
@@ -346,7 +346,7 @@ static void sprdwl_rx_work_queue(struct work_struct *work)
 				}
 				if (msg->len > SPRDWL_MAX_CMD_RXLEN)
 					wl_err("err rx mh data too long:%d > %d\n",
-					       len, SPRDWL_MAX_DATA_RXLEN);
+						   len, SPRDWL_MAX_DATA_RXLEN);
 				sprdwl_rx_mh_addr_process(rx_if, tran_data, len,
 							  msg->buffer_type);
 				tran_data = NULL;
@@ -354,7 +354,7 @@ static void sprdwl_rx_work_queue(struct work_struct *work)
 				break;
 			default:
 				wl_err("rx unknown type:%d\n",
-				       SPRDWL_HEAD_GET_TYPE(data));
+					   SPRDWL_HEAD_GET_TYPE(data));
 				break;
 			}
 
@@ -370,7 +370,7 @@ static void sprdwl_rx_work_queue(struct work_struct *work)
 next:
 		/* TODO: Should we free mbuf one by one? */
 		sprdwl_free_rx_data(intf, msg->fifo_id, msg->tran_data,
-				    msg->data, msg->len);
+					msg->data, msg->len);
 		sprdwl_dequeue_msg_buf(msg, &rx_if->rx_list);
 	}
 }
@@ -495,7 +495,7 @@ static int sprdwl_netdev_poll_rx(struct napi_struct *napi, int budget)
 				print_len = 100;
 			else
 				print_len = ((struct sdiohal_puh *)
-					     tran_data)->len;
+						 tran_data)->len;
 			sprdwl_hex_dump("rx data",
 					(unsigned char *)data, print_len);
 
@@ -506,7 +506,7 @@ static int sprdwl_netdev_poll_rx(struct napi_struct *napi, int budget)
 			case SPRDWL_TYPE_DATA_SPECIAL:
 				if (msg->len > SPRDWL_MAX_DATA_RXLEN)
 					wl_err("err data trans too long:%d > %d\n",
-					       len, SPRDWL_MAX_CMD_RXLEN);
+						   len, SPRDWL_MAX_CMD_RXLEN);
 				sprdwl_rx_mh_data_process(rx_if, tran_data, len,
 							  msg->buffer_type);
 				tran_data = NULL;
@@ -515,7 +515,7 @@ static int sprdwl_netdev_poll_rx(struct napi_struct *napi, int budget)
 			case SPRDWL_TYPE_DATA_PCIE_ADDR:
 				if (msg->len > SPRDWL_MAX_CMD_RXLEN)
 					wl_err("err rx mh data too long:%d > %d\n",
-					       len, SPRDWL_MAX_DATA_RXLEN);
+						   len, SPRDWL_MAX_DATA_RXLEN);
 				sprdwl_rx_mh_addr_process(rx_if, tran_data, len,
 							  msg->buffer_type);
 				tran_data = NULL;
@@ -523,7 +523,7 @@ static int sprdwl_netdev_poll_rx(struct napi_struct *napi, int budget)
 				break;
 			default:
 				wl_err("rx unknown type:%d\n",
-				       SPRDWL_HEAD_GET_TYPE(data));
+					   SPRDWL_HEAD_GET_TYPE(data));
 				break;
 			}
 free:
@@ -539,7 +539,7 @@ static int sprdwl_netdev_poll_rx(struct napi_struct *napi, int budget)
 next:
 		/* TODO: Should we free mbuf one by one? */
 		sprdwl_free_rx_data(intf, msg->fifo_id, msg->tran_data,
-				    msg->data, msg->len);
+					msg->data, msg->len);
 		sprdwl_dequeue_msg_buf(msg, &rx_if->rx_data_list);
 		quota--;
 	}
@@ -575,7 +575,7 @@ int sprdwl_rx_init(struct sprdwl_intf *intf)
 	ret = sprdwl_msg_init(SPRDWL_RX_MSG_NUM, &rx_if->rx_list);
 	if (ret) {
 		wl_err("%s tx_buf create failed: %d\n",
-		       __func__, ret);
+			   __func__, ret);
 		goto err_rx_list;
 	}
 
@@ -583,7 +583,7 @@ int sprdwl_rx_init(struct sprdwl_intf *intf)
 	ret = sprdwl_msg_init(SPRDWL_RX_MSG_NUM, &rx_if->rx_data_list);
 	if (ret) {
 		wl_err("%s tx_buf create failed: %d\n",
-		       __func__, ret);
+			   __func__, ret);
 		goto err_rx_data_list;
 	}
 #endif
diff --git a/drivers/net/wireless/uwe5622/unisocwifi/softap_hook.c b/drivers/net/wireless/uwe5622/unisocwifi/softap_hook.c
index 5cdc8eff9..4a859e724 100644
--- a/drivers/net/wireless/uwe5622/unisocwifi/softap_hook.c
+++ b/drivers/net/wireless/uwe5622/unisocwifi/softap_hook.c
@@ -76,7 +76,7 @@ static int sprdwl_get_softap_chan(u8 *path)
 }
 
 void sprdwl_hook_reset_channel(struct wiphy *wiphy,
-			       struct cfg80211_ap_settings *settings)
+				   struct cfg80211_ap_settings *settings)
 {
 	u8 *ie, *ds_param_ch;
 	int channel = 1;
@@ -95,8 +95,8 @@ void sprdwl_hook_reset_channel(struct wiphy *wiphy,
 
 	mgmt = (struct ieee80211_mgmt *)settings->beacon.head;
 	ie = (u8 *)cfg80211_find_ie(WLAN_EID_DS_PARAMS,
-				    &mgmt->u.beacon.variable[0],
-				    settings->beacon.head_len);
+					&mgmt->u.beacon.variable[0],
+					settings->beacon.head_len);
 	if (ie == NULL) {
 		wl_err("IE WLAN_EID_DS_PARAMS not found in beacon\n");
 		return;
@@ -105,8 +105,8 @@ void sprdwl_hook_reset_channel(struct wiphy *wiphy,
 	ds_param_ch = ie + 2;
 
 	ie = (u8 *)cfg80211_find_ie(WLAN_EID_HT_OPERATION,
-				    settings->beacon.tail,
-				    settings->beacon.tail_len);
+					settings->beacon.tail,
+					settings->beacon.tail_len);
 	if (ie == NULL) {
 		wl_err("IE WLAN_EID_HT_OPERATION not found in beacon\n");
 		return;
@@ -116,7 +116,7 @@ void sprdwl_hook_reset_channel(struct wiphy *wiphy,
 	oper = (struct ieee80211_ht_operation *)ie;
 
 	wl_info("%s done, reset channel %d -> %d\n", __func__,
-	       oper->primary_chan, channel);
+		   oper->primary_chan, channel);
 
 	*ds_param_ch = oper->primary_chan = channel;
 }
diff --git a/drivers/net/wireless/uwe5622/unisocwifi/sprdwl.h b/drivers/net/wireless/uwe5622/unisocwifi/sprdwl.h
index e430bfbac..a1b2f8544 100644
--- a/drivers/net/wireless/uwe5622/unisocwifi/sprdwl.h
+++ b/drivers/net/wireless/uwe5622/unisocwifi/sprdwl.h
@@ -35,6 +35,7 @@
 #include <linux/dcache.h>
 #include <linux/udp.h>
 #include <linux/version.h>
+#include "wcn_wrapper.h"
 
 #include "cfg80211.h"
 #include "cmdevt.h"
@@ -175,6 +176,8 @@ struct wmm_params_element {
 struct sprdwl_wmmac_params {
 	struct wmm_ac_params ac[4];
 	struct timer_list wmmac_edcaf_timer;
+	struct timer_list wmmac_vo_timer;
+	struct timer_list wmmac_vi_timer;
 };
 #endif
 
diff --git a/drivers/net/wireless/uwe5622/unisocwifi/tcp_ack.c b/drivers/net/wireless/uwe5622/unisocwifi/tcp_ack.c
index d360f9f57..4db766fba 100644
--- a/drivers/net/wireless/uwe5622/unisocwifi/tcp_ack.c
+++ b/drivers/net/wireless/uwe5622/unisocwifi/tcp_ack.c
@@ -26,7 +26,7 @@ static void sprdwl_tcp_ack_timeout(unsigned long data)
 	ack_info = (struct sprdwl_tcp_ack_info *)data;
 #endif
 	ack_m = container_of(ack_info, struct sprdwl_tcp_ack_manage,
-			     ack_info[ack_info->ack_info_num]);
+				 ack_info[ack_info->ack_info_num]);
 
 	write_seqlock_bh(&ack_info->seqlock);
 	msg = ack_info->msgbuf;
@@ -64,7 +64,7 @@ void sprdwl_tcp_ack_init(struct sprdwl_priv *priv)
 		timer_setup(&ack_info->timer, sprdwl_tcp_ack_timeout, 0);
 #else
 		setup_timer(&ack_info->timer, sprdwl_tcp_ack_timeout,
-			    (unsigned long)ack_info);
+				(unsigned long)ack_info);
 #endif
 	}
 
@@ -95,7 +95,7 @@ void sprdwl_tcp_ack_deinit(struct sprdwl_priv *priv)
 }
 
 static int sprdwl_tcp_check_quick_ack(unsigned char *buf,
-				      struct sprdwl_tcp_ack_msg *msg)
+					  struct sprdwl_tcp_ack_msg *msg)
 {
 	int ip_hdr_len;
 	unsigned char *temp;
@@ -240,10 +240,10 @@ static int sprdwl_tcp_ack_match(struct sprdwl_tcp_ack_manage *ack_m,
 
 			ack = &ack_info->ack_msg;
 			if (ack_info->busy &&
-			    ack->dest == ack_msg->dest &&
-			    ack->source == ack_msg->source &&
-			    ack->saddr == ack_msg->saddr &&
-			    ack->daddr == ack_msg->daddr)
+				ack->dest == ack_msg->dest &&
+				ack->source == ack_msg->source &&
+				ack->saddr == ack_msg->saddr &&
+				ack->daddr == ack_msg->daddr)
 				ret = i;
 		} while (read_seqretry(&ack_info->seqlock, start));
 	}
@@ -263,8 +263,8 @@ static void sprdwl_tcp_ack_update(struct sprdwl_tcp_ack_manage *ack_m)
 			ack_info = &ack_m->ack_info[i];
 			write_seqlock_bh(&ack_info->seqlock);
 			if (ack_info->busy &&
-			    time_after(jiffies, ack_info->last_time +
-				       ack_info->timeout)) {
+				time_after(jiffies, ack_info->last_time +
+					   ack_info->timeout)) {
 				ack_m->free_index = i;
 				ack_m->max_num--;
 				ack_info->busy = 0;
@@ -334,8 +334,8 @@ int sprdwl_tcp_ack_handle(struct sprdwl_msg_buf *new_msgbuf,
 		if (SPRDWL_U32_BEFORE(ack->seq, ack_msg->seq)) {
 			ack->seq = ack_msg->seq;
 			if (ack_info->psh_flag &&
-			    !SPRDWL_U32_BEFORE(ack_msg->seq,
-					       ack_info->psh_seq)) {
+				!SPRDWL_U32_BEFORE(ack_msg->seq,
+						   ack_info->psh_seq)) {
 				ack_info->psh_flag = 0;
 			}
 
@@ -349,7 +349,7 @@ int sprdwl_tcp_ack_handle(struct sprdwl_msg_buf *new_msgbuf,
 			ack_info->drop_cnt = atomic_read(&ack_m->max_drop_cnt);
 		} else {
 			wl_err("%s before abnormal ack: %d, %d\n",
-			       __func__, ack->seq, ack_msg->seq);
+				   __func__, ack->seq, ack_msg->seq);
 			drop_msg = new_msgbuf;
 			ret = 1;
 		}
@@ -360,7 +360,7 @@ int sprdwl_tcp_ack_handle(struct sprdwl_msg_buf *new_msgbuf,
 		}
 
 		if (ack_info->psh_flag &&
-		    !SPRDWL_U32_BEFORE(ack_msg->seq, ack_info->psh_seq)) {
+			!SPRDWL_U32_BEFORE(ack_msg->seq, ack_info->psh_seq)) {
 			ack_info->psh_flag = 0;
 			quick_ack = 1;
 		} else {
@@ -384,7 +384,7 @@ int sprdwl_tcp_ack_handle(struct sprdwl_msg_buf *new_msgbuf,
 		}
 	} else {
 		wl_err("%s before ack: %d, %d\n",
-		       __func__, ack->seq, ack_msg->seq);
+			   __func__, ack->seq, ack_msg->seq);
 		drop_msg = new_msgbuf;
 		ret = 1;
 	}
@@ -398,7 +398,7 @@ int sprdwl_tcp_ack_handle(struct sprdwl_msg_buf *new_msgbuf,
 }
 
 void sprdwl_filter_rx_tcp_ack(struct sprdwl_priv *priv,
-			      unsigned char *buf, unsigned plen)
+				  unsigned char *buf, unsigned plen)
 {
 	int index;
 	struct sprdwl_tcp_ack_msg ack_msg;
@@ -409,7 +409,7 @@ void sprdwl_filter_rx_tcp_ack(struct sprdwl_priv *priv,
 		return;
 
 	if ((plen > MAX_TCP_ACK) ||
-	    !sprdwl_tcp_check_quick_ack(buf, &ack_msg))
+		!sprdwl_tcp_check_quick_ack(buf, &ack_msg))
 		return;
 
 	index = sprdwl_tcp_ack_match(ack_m, &ack_msg);
@@ -424,8 +424,8 @@ void sprdwl_filter_rx_tcp_ack(struct sprdwl_priv *priv,
 
 /* return val: 0 for not filter, 1 for filter */
 int sprdwl_filter_send_tcp_ack(struct sprdwl_priv *priv,
-			       struct sprdwl_msg_buf *msgbuf,
-			       unsigned char *buf, unsigned int plen)
+				   struct sprdwl_msg_buf *msgbuf,
+				   unsigned char *buf, unsigned int plen)
 {
 	int ret = 0;
 	int index, drop;
@@ -494,7 +494,7 @@ int sprdwl_filter_send_tcp_ack(struct sprdwl_priv *priv,
 }
 
 void sprdwl_move_tcpack_msg(struct sprdwl_priv *priv,
-			    struct sprdwl_msg_buf *msg)
+				struct sprdwl_msg_buf *msg)
 {
 	struct sprdwl_tcp_ack_info *ack_info;
 	struct sprdwl_tcp_ack_manage *ack_m = &priv->ack_m;
diff --git a/drivers/net/wireless/uwe5622/unisocwifi/tx_msg.c b/drivers/net/wireless/uwe5622/unisocwifi/tx_msg.c
index 7be652187..40d51a713 100644
--- a/drivers/net/wireless/uwe5622/unisocwifi/tx_msg.c
+++ b/drivers/net/wireless/uwe5622/unisocwifi/tx_msg.c
@@ -109,7 +109,7 @@ struct sprdwl_msg_buf *sprdwl_get_msg_buf(void *pdev,
 }
 
 static void sprdwl_dequeue_cmd_buf(struct sprdwl_msg_buf *msg_buf,
-				    struct sprdwl_msg_list *list)
+					struct sprdwl_msg_list *list)
 {
 	spin_lock_bh(&list->busylock);
 	list_del(&msg_buf->list);
@@ -295,10 +295,10 @@ void sprdwl_dequeue_data_list(struct mbuf_t *head, int num)
 		msg_pos = GET_MSG_BUF(mbuf_pos);
 		/*TODO, check msg_buf after pop link*/
 		if (msg_pos == NULL ||
-		    !virt_addr_valid(msg_pos) ||
-		    !virt_addr_valid(msg_pos->skb)) {
+			!virt_addr_valid(msg_pos) ||
+			!virt_addr_valid(msg_pos->skb)) {
 			wl_err("%s,%d, error! wrong sprdwl_msg_buf\n",
-			       __func__, __LINE__);
+				   __func__, __LINE__);
 			BUG_ON(1);
 		}
 		dev_kfree_skb(msg_pos->skb);
@@ -405,7 +405,7 @@ add_xmit_list_tail(struct sprdwl_tx_msg *tx_msg,
 	}
 	if (num != add_num)
 		wl_err("%s, %d, error! add_num:%d, num:%d\n",
-		       __func__, __LINE__, add_num, num);
+			   __func__, __LINE__, add_num, num);
 	INIT_LIST_HEAD(&temp_list);
 	list_cut_position(&temp_list,
 			  &p_list->head_list,
@@ -444,8 +444,8 @@ unsigned int queue_is_empty(struct sprdwl_tx_msg *tx_msg, enum sprdwl_mode mode)
 }
 
 void sprdwl_wake_net_ifneed(struct sprdwl_intf *dev,
-			    struct sprdwl_msg_list *list,
-			    enum sprdwl_mode mode)
+				struct sprdwl_msg_list *list,
+				enum sprdwl_mode mode)
 {
 	struct sprdwl_tx_msg *tx_msg = (struct sprdwl_tx_msg *)dev->sprdwl_tx;
 
@@ -496,7 +496,7 @@ static int sprdwl_tx_cmd(struct sprdwl_intf *intf, struct sprdwl_msg_list *list)
 		if (time_after(jiffies, msgbuf->timeout)) {
 			tx_msg->drop_cmd_cnt++;
 			wl_err("tx drop cmd msg,dropcnt:%lu\n",
-			       tx_msg->drop_cmd_cnt);
+				   tx_msg->drop_cmd_cnt);
 			kfree(msgbuf->tran_data);
 			msgbuf->tran_data = NULL;
 			sprdwl_dequeue_msg_buf(msgbuf, list);
@@ -531,8 +531,8 @@ void sprdwl_fc_add_share_credit(struct sprdwl_vif *vif)
 	for (i = 0; i < MAX_COLOR_BIT; i++) {
 		if (tx_msg->flow_ctrl[i].mode == vif->mode) {
 			wl_err("%s, %d, mode:%d closed, index:%d, share it\n",
-			       __func__, __LINE__,
-			       vif->mode, i);
+				   __func__, __LINE__,
+				   vif->mode, i);
 			tx_msg->flow_ctrl[i].mode = SPRDWL_MODE_NONE;
 			break;
 		}
@@ -606,8 +606,8 @@ int sprdwl_fc_get_shared_num(struct sprdwl_tx_msg *tx_msg, u8 num)
 }
 
 int sprdwl_fc_get_send_num(struct sprdwl_tx_msg *tx_msg,
-			     enum sprdwl_mode mode,
-			     int data_num)
+				 enum sprdwl_mode mode,
+				 int data_num)
 {
 	int excusive_flow_num = 0, shared_flow_num = 0;
 	int send_num = 0;
@@ -644,9 +644,9 @@ int sprdwl_fc_get_send_num(struct sprdwl_tx_msg *tx_msg,
 
 		if (send_num <= 0) {
 			wl_err("%s, %d, mode:%d, e_num:%d, s_num:%d, d_num:%d\n",
-			       __func__, __LINE__,
-			       (u8)mode, excusive_flow_num,
-			       shared_flow_num, data_num);
+				   __func__, __LINE__,
+				   (u8)mode, excusive_flow_num,
+				   shared_flow_num, data_num);
 			return -ENOMEM;
 		}
 		wl_debug("%s, %d, mode:%d, e_num:%d, s_num:%d, d_num:%d\n"
@@ -657,11 +657,11 @@ int sprdwl_fc_get_send_num(struct sprdwl_tx_msg *tx_msg,
 			tx_msg->color_num[2], tx_msg->color_num[3]);
 	} else {
 		wl_err("%s, %d, wrong mode:%d?\n",
-		       __func__, __LINE__,
-		       (u8)mode);
+			   __func__, __LINE__,
+			   (u8)mode);
 		for (i = 0; i < MAX_COLOR_BIT; i++)
 			wl_err("color[%d] assigned mode%d\n",
-			       i, (u8)tx_msg->flow_ctrl[i].mode);
+				   i, (u8)tx_msg->flow_ctrl[i].mode);
 		return -ENOMEM;
 	}
 
@@ -686,8 +686,8 @@ int sprdwl_fc_test_shared_num(struct sprdwl_tx_msg *tx_msg)
 }
 /*to check flow number, no flow number, no send*/
 int sprdwl_fc_test_send_num(struct sprdwl_tx_msg *tx_msg,
-			     enum sprdwl_mode mode,
-			     int data_num)
+				 enum sprdwl_mode mode,
+				 int data_num)
 {
 	int excusive_flow_num = 0, shared_flow_num = 0;
 	int send_num = 0;
@@ -720,11 +720,11 @@ int sprdwl_fc_test_send_num(struct sprdwl_tx_msg *tx_msg,
 			 shared_flow_num, data_num);
 	} else {
 		wl_err("%s, %d, wrong mode:%d?\n",
-		       __func__, __LINE__,
-		       (u8)mode);
+			   __func__, __LINE__,
+			   (u8)mode);
 		for (i = 0; i < MAX_COLOR_BIT; i++)
 			wl_err_ratelimited("color[%d] assigned mode%d\n",
-			       i, (u8)tx_msg->flow_ctrl[i].mode);
+				   i, (u8)tx_msg->flow_ctrl[i].mode);
 		return -ENOMEM;
 	}
 
@@ -782,8 +782,8 @@ void sprdwl_handle_tx_return(struct sprdwl_tx_msg *tx_msg,
 }
 
 int handle_tx_timeout(struct sprdwl_tx_msg *tx_msg,
-		      struct sprdwl_msg_list *msg_list,
-		      struct peer_list *p_list, int ac_index)
+			  struct sprdwl_msg_list *msg_list,
+			  struct peer_list *p_list, int ac_index)
 {
 	u8 mode;
 	char *pinfo;
@@ -853,7 +853,7 @@ int handle_tx_timeout(struct sprdwl_tx_msg *tx_msg,
 }
 
 static int sprdwl_handle_to_send_list(struct sprdwl_intf *intf,
-				      enum sprdwl_mode mode)
+					  enum sprdwl_mode mode)
 {
 	struct sprdwl_tx_msg *tx_msg = (struct sprdwl_tx_msg *)intf->sprdwl_tx;
 	struct list_head *to_send_list, tx_list_head;
@@ -876,8 +876,8 @@ static int sprdwl_handle_to_send_list(struct sprdwl_intf *intf,
 		credit = sprdwl_fc_get_send_num(tx_msg, mode, tosendnum);
 		if (credit < tosendnum)
 			wl_err("%s, %d,error! credit:%d,tosendnum:%d\n",
-			       __func__, __LINE__,
-			       credit, tosendnum);
+				   __func__, __LINE__,
+				   credit, tosendnum);
 		if (credit <= 0)
 			return -ENOMEM;
 		tx_msg->xmit_msg_list.mode = mode;
@@ -891,7 +891,7 @@ static int sprdwl_handle_to_send_list(struct sprdwl_intf *intf,
 		sprdwl_handle_tx_return(tx_msg, list, credit, ret);
 		if (0 != ret) {
 			wl_err("%s, %d: tx return err!\n",
-			       __func__, __LINE__);
+				   __func__, __LINE__);
 			tx_msg->xmit_msg_list.failcount++;
 			if (tx_msg->xmit_msg_list.failcount > 10) {
 				sprdwl_flush_tosendlist(tx_msg);
@@ -929,14 +929,14 @@ static int sprdwl_tx_eachmode_data(struct sprdwl_intf *intf,
 			p_list = &tx_list->q_list[i].p_list[j];
 			if (atomic_read(&p_list->l_num) > 0) {
 				if (0 != handle_tx_timeout(tx_msg,
-						       list,
-						       p_list,
-						       i))
+							   list,
+							   p_list,
+							   i))
 					wl_err("TID=%s%s%s%s, timeout!\n",
-					       (i == SPRDWL_AC_VO) ? "VO" : "",
-					       (i == SPRDWL_AC_VI) ? "VI" : "",
-					       (i == SPRDWL_AC_BE) ? "BE" : "",
-					       (i == SPRDWL_AC_BK) ? "BK" : "");
+						   (i == SPRDWL_AC_VO) ? "VO" : "",
+						   (i == SPRDWL_AC_VI) ? "VI" : "",
+						   (i == SPRDWL_AC_BE) ? "BE" : "",
+						   (i == SPRDWL_AC_BK) ? "BK" : "");
 				p_list_num[i][j] = atomic_read(&p_list->l_num);
 				/*wl_info("TID=%d,PEER=%d,l_num=%d\n",i,j,p_list_num[i][j]);*/
 				q_list_num[i] += p_list_num[i][j];
@@ -945,16 +945,16 @@ static int sprdwl_tx_eachmode_data(struct sprdwl_intf *intf,
 		total += q_list_num[i];
 		if (q_list_num[i] != 0)
 			wl_debug("TID%s%s%s%snum=%d, total=%d\n",
-			       (i == SPRDWL_AC_VO) ? "VO" : "",
-			       (i == SPRDWL_AC_VI) ? "VI" : "",
-			       (i == SPRDWL_AC_BE) ? "BE" : "",
-			       (i == SPRDWL_AC_BK) ? "BK" : "",
-			       q_list_num[i], total);
+				   (i == SPRDWL_AC_VO) ? "VO" : "",
+				   (i == SPRDWL_AC_VI) ? "VI" : "",
+				   (i == SPRDWL_AC_BE) ? "BE" : "",
+				   (i == SPRDWL_AC_BK) ? "BK" : "",
+				   q_list_num[i], total);
 	}
 	send_num = sprdwl_fc_test_send_num(tx_msg, mode, total);
 	if (total != 0 && send_num <= 0) {
 		wl_err("%s, %d: _fc_ no credit!\n",
-		       __func__, __LINE__);
+			   __func__, __LINE__);
 		return -ENOMEM;
 	}
 
@@ -1081,6 +1081,10 @@ int sprdwl_sdio_process_credit(void *pdev, void *data)
 	if (common->type == SPRDWL_TYPE_DATA_SPECIAL) {
 		int offset = (size_t)&((struct rx_msdu_desc *)0)->rsvd5;
 
+		if (intf->priv->hw_type == SPRDWL_HW_USB) {
+			return -2;
+		}
+
 		flow = data + offset;
 		goto out;
 	}
@@ -1368,9 +1372,9 @@ static int sprdwl_tx_work_queue(void *data)
 
 		/* if tx list, send wakeup firstly */
 		if (intf->fw_power_down == 1 &&
-		    (atomic_read(&tx_msg->tx_list_qos_pool.ref) > 0 ||
-		     !list_empty(&tx_msg->xmit_msg_list.to_send_list) ||
-		     !list_empty(&tx_msg->xmit_msg_list.to_free_list))) {
+			(atomic_read(&tx_msg->tx_list_qos_pool.ref) > 0 ||
+			 !list_empty(&tx_msg->xmit_msg_list.to_send_list) ||
+			 !list_empty(&tx_msg->xmit_msg_list.to_free_list))) {
 				struct sprdwl_vif *vif;
 
 				sprdwcn_bus_sleep_wakeup(WIFI);
@@ -1450,7 +1454,7 @@ int sprdwl_tx_init(struct sprdwl_intf *intf)
 	}
 
 	ret = sprdwl_msg_init(SPRDWL_TX_QOS_POOL_SIZE,
-			      &tx_msg->tx_list_qos_pool);
+				  &tx_msg->tx_list_qos_pool);
 	if (ret) {
 		wl_err("%s tx_list_qos_pool alloc failed\n", __func__);
 		goto err_tx_list_cmd;
@@ -1466,7 +1470,7 @@ int sprdwl_tx_init(struct sprdwl_intf *intf)
 
 	tx_msg->tx_thread =
 		kthread_create(sprdwl_tx_work_queue,
-			       (void *)tx_msg, "SPRDWL_TX_QUEUE");
+				   (void *)tx_msg, "SPRDWL_TX_QUEUE");
 	if (!tx_msg->tx_thread) {
 		wl_err("%s SPRDWL_TX_QUEUE create failed", __func__);
 		ret = -ENOMEM;
@@ -1527,7 +1531,7 @@ void sprdwl_tx_deinit(struct sprdwl_intf *intf)
 	*/
 	if (!list_empty(&tx_msg->tx_list_cmd.cmd_to_free))
 		wl_err("%s cmd not yet transmited, cmd_send:%d, cmd_poped:%d\n",
-		       __func__, tx_msg->cmd_send, tx_msg->cmd_poped);
+			   __func__, tx_msg->cmd_send, tx_msg->cmd_poped);
 
 	sprdwl_flush_all_txlist(tx_msg);
 
@@ -1697,7 +1701,7 @@ bool is_vowifi_pkt(struct sk_buff *skb, bool *b_cmd_path)
 	switch (dscp) {
 	case VOWIFI_IKE_DSCP:
 		if ((udphdr->dest == htons(VOWIFI_IKE_SIP_PORT)) ||
-		    (udphdr->dest == htons(VOWIFI_IKE_ONLY_PORT))) {
+			(udphdr->dest == htons(VOWIFI_IKE_ONLY_PORT))) {
 			ret = true;
 			(*b_cmd_path) = true;
 		}
diff --git a/drivers/net/wireless/uwe5622/unisocwifi/txrx.c b/drivers/net/wireless/uwe5622/unisocwifi/txrx.c
index b0a24a361..227339ada 100644
--- a/drivers/net/wireless/uwe5622/unisocwifi/txrx.c
+++ b/drivers/net/wireless/uwe5622/unisocwifi/txrx.c
@@ -23,7 +23,9 @@
 #include "cmdevt.h"
 #include "intf_ops.h"
 #include "work.h"
+#if defined(UWE5621_FTR)
 #include "wl_intf.h"
+#endif
 #include "rx_msg.h"
 #include "tcp_ack.h"
 #include "wl_core.h"
@@ -32,20 +34,33 @@
  * here just free the msg buf to the freelist
  */
 int sprdwl_send_data(struct sprdwl_vif *vif, struct sprdwl_msg_buf *msg,
-		     struct sk_buff *skb, u8 offset)
+			 struct sk_buff *skb, u8 offset)
 {
 	int ret;
 	int delta;
 	unsigned long align_addr;
 	unsigned char *buf = NULL;
+/*TODO temp for MARLIN2*/
+#ifndef UWE5621_FTR
+	struct sprdwl_data_hdr *hdr;
+#endif
 	struct sprdwl_intf *intf;
 	unsigned int plen = cpu_to_le16(skb->len);
 
 	intf = (struct sprdwl_intf *)vif->priv->hw_priv;
 	buf = skb->data;
-
+/*TODO temp for MARLIN2*/
+#ifndef UWE5621_FTR
+	skb_push(skb, sizeof(*hdr) + offset);
+	hdr = (struct sprdwl_data_hdr *)skb->data;
+	memset(hdr, 0, sizeof(*hdr));
+	hdr->common.type = SPRDWL_TYPE_DATA;
+	hdr->common.ctx_id = vif->ctx_id;
+	hdr->plen = cpu_to_le16(skb->len);
+#else
 	if (sprdwl_intf_fill_msdu_dscr(vif, skb, SPRDWL_TYPE_DATA, offset))
 		return -EPERM;
+#endif /* UWE5621_FTR */
 #ifdef OTT_UWE
 	skb_push(skb, 3);
 	if ((unsigned long)skb->data & 0x3) {
@@ -105,6 +120,10 @@ int sprdwl_send_cmd(struct sprdwl_priv *priv, struct sprdwl_msg_buf *msg)
 	ret = sprdwl_intf_tx(priv, msg);
 	if (ret) {
 		wl_err("%s TX cmd Err: %d\n", __func__, ret);
+		/* now cmd msg droped */
+#if !defined(UWE5621_FTR)
+		dev_kfree_skb(skb);
+#endif
 	}
 
 	return ret;
@@ -124,7 +143,7 @@ void sprdwl_rx_send_cmd_process(struct sprdwl_priv *priv, void *data, int len,
 		vif = ctx_id_to_vif(priv, ctx_id);
 		if (!vif) {
 			wl_err("%s cant't get vif from ctx_id%d\n",
-			       __func__, ctx_id);
+				   __func__, ctx_id);
 		} else {
 			misc_work = sprdwl_alloc_work(len);
 			if (!misc_work) {
@@ -165,14 +184,14 @@ void sprdwl_rx_skb_process(struct sprdwl_priv *priv, struct sk_buff *skb)
 	vif = ctx_id_to_vif(priv, msdu_desc->ctx_id);
 	if (!vif) {
 		wl_err("%s cannot get vif, ctx_id: %d\n",
-		       __func__, msdu_desc->ctx_id);
+			   __func__, msdu_desc->ctx_id);
 		goto err;
 	}
 
 	/* Sanity check for bug 846454 */
 	if (vif->ndev == NULL) {
 		wl_err("%s ndev is NULL, ctx_id = %d\n",
-		       __func__, msdu_desc->ctx_id);
+			   __func__, msdu_desc->ctx_id);
 		BUG_ON(1);
 	}
 
@@ -196,17 +215,17 @@ void sprdwl_rx_skb_process(struct sprdwl_priv *priv, struct sk_buff *skb)
 
 	/* FIXME: We would remove mode in furture, how to modify? */
 	if (((vif->mode == SPRDWL_MODE_AP) ||
-	     (vif->mode == SPRDWL_MODE_P2P_GO)) && msdu_desc->uc_w2w_flag) {
+		 (vif->mode == SPRDWL_MODE_P2P_GO)) && msdu_desc->uc_w2w_flag) {
 		skb->dev = ndev;
 		dev_queue_xmit(skb);
 	} else {
 		if (((vif->mode == SPRDWL_MODE_AP) ||
-		     (vif->mode == SPRDWL_MODE_P2P_GO)) &&
-		    msdu_desc->bc_mc_w2w_flag) {
+			 (vif->mode == SPRDWL_MODE_P2P_GO)) &&
+			msdu_desc->bc_mc_w2w_flag) {
 			struct ethhdr *eth = (struct ethhdr *)skb->data;
 
 			if (eth->h_proto != ETH_P_IP &&
-			    eth->h_proto != ETH_P_IPV6) {
+				eth->h_proto != ETH_P_IPV6) {
 				tx_skb = pskb_copy(skb, GFP_ATOMIC);
 				if (likely(tx_skb)) {
 					tx_skb->dev = ndev;
@@ -232,7 +251,7 @@ void sprdwl_rx_skb_process(struct sprdwl_priv *priv, struct sk_buff *skb)
 #endif
 }
 unsigned short sprdwl_rx_data_process(struct sprdwl_priv *priv,
-				      unsigned char *msg)
+					  unsigned char *msg)
 {
 	return 0;
 }
diff --git a/drivers/net/wireless/uwe5622/unisocwifi/vendor.c b/drivers/net/wireless/uwe5622/unisocwifi/vendor.c
index 733591184..6fba95b60 100644
--- a/drivers/net/wireless/uwe5622/unisocwifi/vendor.c
+++ b/drivers/net/wireless/uwe5622/unisocwifi/vendor.c
@@ -17,7 +17,6 @@
 #include "sprdwl.h"
 #include "cmdevt.h"
 #include "vendor.h"
-#include "npi.h"
 #ifdef NAN_SUPPORT
 #include "nan.h"
 #include <linux/version.h>
@@ -112,8 +111,8 @@ static int sprdwl_vendor_roaming_enable(struct wiphy *wiphy,
 }
 
 static int sprdwl_vendor_nan_enable(struct wiphy *wiphy,
-				    struct wireless_dev *wdev,
-				    const void *data, int len)
+					struct wireless_dev *wdev,
+					const void *data, int len)
 {
 	return WIFI_SUCCESS;
 }
@@ -141,13 +140,13 @@ static int sprdwl_llstat(struct sprdwl_priv *priv, u8 vif_ctx_id, u8 subtype,
 		return sprdwl_cmd_send_recv(priv, msg, CMD_WAIT_TIMEOUT, 0, 0);
 	else
 		return sprdwl_cmd_send_recv(priv, msg, CMD_WAIT_TIMEOUT, r_buf,
-					    r_len);
+						r_len);
 }
 
 /*set link layer status function-----CMD ID:14*/
 static int sprdwl_vendor_set_llstat_handler(struct wiphy *wiphy,
-					    struct wireless_dev *wdev,
-					    const void *data, int len)
+						struct wireless_dev *wdev,
+						const void *data, int len)
 {
 	int ret = 0, err = 0;
 	struct sprdwl_priv *priv = wiphy_priv(wiphy);
@@ -189,7 +188,7 @@ static int sprdwl_vendor_set_llstat_handler(struct wiphy *wiphy,
 			ll_params->aggressive_statistics_gathering);
 	if (ll_params->aggressive_statistics_gathering)
 		ret = sprdwl_llstat(priv, vif->ctx_id, SPRDWL_SUBCMD_SET,
-				    ll_params, sizeof(*ll_params),
+					ll_params, sizeof(*ll_params),
 							0, 0);
 	kfree(ll_params);
 	return ret;
@@ -218,8 +217,8 @@ static int sprdwl_compose_radio_st(struct sk_buff *reply,
 		goto out_put_fail;
 	if (radio_st->num_tx_levels > 0) {
 		if (nla_put(reply, SPRDWL_LL_STATS_RADIO_TX_TIME_PER_LEVEL,
-			    sizeof(u32)*radio_st->num_tx_levels,
-			    radio_st->tx_time_per_levels))
+				sizeof(u32)*radio_st->num_tx_levels,
+				radio_st->tx_time_per_levels))
 			goto out_put_fail;
 	}
 	if (nla_put_u32(reply, SPRDWL_LL_STATS_RADIO_RX_TIME,
@@ -248,9 +247,9 @@ static int sprdwl_compose_radio_st(struct sk_buff *reply,
 		goto out_put_fail;
 	if (radio_st->num_channels > 0) {
 		if (nla_put(reply, SPRDWL_LL_STATS_CH_INFO,
-			    radio_st->num_channels *
+				radio_st->num_channels *
 				sizeof(struct wifi_channel_stat),
-			    radio_st->channels))
+				radio_st->channels))
 			goto out_put_fail;
 	}
 	return 0;
@@ -268,7 +267,7 @@ static int sprdwl_compose_iface_st(struct sk_buff *reply,
 			iface_st->info.mode))
 		goto out_put_fail;
 	if (nla_put(reply, SPRDWL_LL_STATS_IFACE_INFO_MAC_ADDR,
-		    sizeof(iface_st->info.mac_addr), iface_st->info.mac_addr))
+			sizeof(iface_st->info.mac_addr), iface_st->info.mac_addr))
 		goto out_put_fail;
 	if (nla_put_u32(reply, SPRDWL_LL_STATS_IFACE_INFO_STATE,
 			iface_st->info.state))
@@ -280,18 +279,18 @@ static int sprdwl_compose_iface_st(struct sk_buff *reply,
 			iface_st->info.capabilities))
 		goto out_put_fail;
 	if (nla_put(reply, SPRDWL_LL_STATS_IFACE_INFO_SSID,
-		    sizeof(iface_st->info.ssid), iface_st->info.ssid))
+			sizeof(iface_st->info.ssid), iface_st->info.ssid))
 		goto out_put_fail;
 	if (nla_put(reply, SPRDWL_LL_STATS_IFACE_INFO_BSSID,
-		    sizeof(iface_st->info.bssid), iface_st->info.bssid))
+			sizeof(iface_st->info.bssid), iface_st->info.bssid))
 		goto out_put_fail;
 	if (nla_put(reply, SPRDWL_LL_STATS_IFACE_INFO_AP_COUNTRY_STR,
-		    sizeof(iface_st->info.ap_country_str),
-		    iface_st->info.ap_country_str))
+			sizeof(iface_st->info.ap_country_str),
+			iface_st->info.ap_country_str))
 		goto out_put_fail;
 	if (nla_put(reply, SPRDWL_LL_STATS_IFACE_INFO_COUNTRY_STR,
-		    sizeof(iface_st->info.country_str),
-		    iface_st->info.country_str))
+			sizeof(iface_st->info.country_str),
+			iface_st->info.country_str))
 		goto out_put_fail;
 	if (nla_put_u32(reply, SPRDWL_LL_STATS_IFACE_BEACON_RX,
 			iface_st->beacon_rx))
@@ -400,7 +399,7 @@ static int sprdwl_compose_iface_st(struct sk_buff *reply,
 }
 
 void calc_radio_dif(struct sprdwl_llstat_radio *dif_radio,
-		    struct sprdwl_llstat_data *llst,
+			struct sprdwl_llstat_data *llst,
 			struct sprdwl_llstat_radio *pre_radio)
 {
 	int i;
@@ -445,8 +444,8 @@ void calc_radio_dif(struct sprdwl_llstat_radio *dif_radio,
 
 /*get link layer status function---CMD ID:15*/
 static int sprdwl_vendor_get_llstat_handler(struct wiphy *wiphy,
-					    struct wireless_dev *wdev,
-					    const void *data, int len)
+						struct wireless_dev *wdev,
+						const void *data, int len)
 {
 	struct sk_buff *reply_radio, *reply_iface;
 	struct sprdwl_llstat_data *llst;
@@ -475,7 +474,7 @@ static int sprdwl_vendor_get_llstat_handler(struct wiphy *wiphy,
 	if (!radio_st || !iface_st || !dif_radio)
 		goto out_put_fail;
 	ret = sprdwl_llstat(priv, vif->ctx_id, SPRDWL_SUBCMD_GET, NULL, 0,
-			    r_buf, &r_len);
+				r_buf, &r_len);
 	if (ret)
 		goto out_put_fail;
 
@@ -486,10 +485,10 @@ static int sprdwl_vendor_get_llstat_handler(struct wiphy *wiphy,
 	/*set data for iface struct*/
 	iface_st->info.mode = vif->mode;
 	memcpy(iface_st->info.mac_addr, vif->ndev->dev_addr,
-	       ETH_ALEN);
+		   ETH_ALEN);
 	iface_st->info.state = vif->sm_state;
 	memcpy(iface_st->info.ssid, vif->ssid,
-	       IEEE80211_MAX_SSID_LEN);
+		   IEEE80211_MAX_SSID_LEN);
 	ether_addr_copy(iface_st->info.bssid, vif->bssid);
 	iface_st->beacon_rx = dif_radio->bcn_rx_cnt;
 	iface_st->rssi_mgmt = dif_radio->rssi_mgmt;
@@ -568,8 +567,8 @@ static int sprdwl_vendor_get_llstat_handler(struct wiphy *wiphy,
 
 /*clear link layer status function--- CMD ID:16*/
 static int sprdwl_vendor_clr_llstat_handler(struct wiphy *wiphy,
-					    struct wireless_dev *wdev,
-					    const void *data, int len)
+						struct wireless_dev *wdev,
+						const void *data, int len)
 {
 	struct sk_buff *reply;
 	struct wifi_clr_llstat_rsp clr_rsp;
@@ -604,7 +603,7 @@ static int sprdwl_vendor_clr_llstat_handler(struct wiphy *wiphy,
 	}
 	wiphy_info(wiphy, "stats_clear_req_mask = %u\n", stats_clear_req_mask);
 	ret = sprdwl_llstat(priv, vif->ctx_id, SPRDWL_SUBCMD_DEL,
-			    &stats_clear_req_mask, r_len, r_buf, &r_len);
+				&stats_clear_req_mask, r_len, r_buf, &r_len);
 	stats_clear_rsp_mask = (u32 *)r_buf;
 	clr_rsp.stats_clear_rsp_mask = *stats_clear_rsp_mask;
 	clr_rsp.stop_rsp = 1;
@@ -634,8 +633,8 @@ static int sprdwl_vendor_clr_llstat_handler(struct wiphy *wiphy,
 }
 /*start gscan functon, including scan params configuration------ CMD ID:20*/
 static int sprdwl_vendor_gscan_start(struct wiphy *wiphy,
-				    struct wireless_dev *wdev,
-				    const void *data, int len)
+					struct wireless_dev *wdev,
+					const void *data, int len)
 {
 	u64 tlen;
 	int i, j, ret = 0, enable;
@@ -689,7 +688,7 @@ static int sprdwl_vendor_gscan_start(struct wiphy *wiphy,
 		i = 0;
 		nla_for_each_nested(outer_iter, pos, rem_outer_len) {
 			nla_for_each_nested(inner_iter, outer_iter,
-					    rem_inner_len){
+						rem_inner_len){
 				type = nla_type(inner_iter);
 				switch (type) {
 				case GSCAN_ATTR_BUCKET_SPEC_INDEX:
@@ -735,10 +734,10 @@ static int sprdwl_vendor_gscan_start(struct wiphy *wiphy,
 				case GSCAN_ATTR_CHANNEL_SPEC:
 				j = 0;
 				nla_for_each_nested(outer_iter1,
-						    inner_iter,
+							inner_iter,
 					rem_outer_len1) {
 					nla_for_each_nested(inner_iter1,
-							    outer_iter1,
+								outer_iter1,
 						rem_inner_len1) {
 						type = nla_type(inner_iter1);
 
@@ -788,7 +787,7 @@ static int sprdwl_vendor_gscan_start(struct wiphy *wiphy,
 	}
 
 	wl_ndev_log(L_INFO, vif->ndev, "parse config %s\n",
-		    !ret ? "success" : "failture");
+			!ret ? "success" : "failture");
 
 	kfree(vif->priv->gscan_res);
 	vif->priv->gscan_buckets_num = params->num_buckets;
@@ -805,7 +804,7 @@ static int sprdwl_vendor_gscan_start(struct wiphy *wiphy,
 	}
 
 	memset(vif->priv->gscan_res, 0x0,
-	       vif->priv->gscan_buckets_num *
+		   vif->priv->gscan_buckets_num *
 		sizeof(struct sprdwl_gscan_cached_results));
 
 	tlen = sizeof(struct sprdwl_cmd_gscan_set_config);
@@ -842,8 +841,8 @@ static int sprdwl_vendor_gscan_start(struct wiphy *wiphy,
 
 /*stop gscan functon------ CMD ID:21*/
 static int sprdwl_vendor_gscan_stop(struct wiphy *wiphy,
-				    struct wireless_dev *wdev,
-				      const void *data, int len)
+					struct wireless_dev *wdev,
+					  const void *data, int len)
 {
 	int enable;
 	struct sprdwl_vif *vif = netdev_priv(wdev->netdev);
@@ -894,13 +893,13 @@ static int sprdwl_vendor_get_channel_list(struct wiphy *wiphy,
 				   type);
 			ret = -EINVAL;
 		break;
-	    }
-	    if (ret < 0)
+		}
+		if (ret < 0)
 		break;
 	}
 
 	wl_ndev_log(L_INFO, vif->ndev, "parse channel list %s band=%d\n",
-		    !ret ? "success" : "failture", band);
+			!ret ? "success" : "failture", band);
 
 	payload = rlen + 0x100;
 	reply = cfg80211_vendor_cmd_alloc_reply_skb(wiphy, payload);
@@ -962,7 +961,7 @@ static int sprdwl_vendor_get_gscan_capabilities(struct wiphy *wiphy,
 	wl_info("%s enter\n", __func__);
 
 	rlen = sizeof(struct sprdwl_gscan_capa) +
-	    sizeof(struct sprdwl_cmd_gscan_rsp_header);
+		sizeof(struct sprdwl_cmd_gscan_rsp_header);
 	rbuf = kmalloc(rlen, GFP_KERNEL);
 	if (!rbuf)
 		return -ENOMEM;
@@ -978,7 +977,7 @@ static int sprdwl_vendor_get_gscan_capabilities(struct wiphy *wiphy,
 	}
 	hdr = (struct sprdwl_cmd_gscan_rsp_header *)rbuf;
 	p = (struct sprdwl_gscan_capa *)
-	    (rbuf + sizeof(struct sprdwl_cmd_gscan_rsp_header));
+		(rbuf + sizeof(struct sprdwl_cmd_gscan_rsp_header));
 	wl_info("cache_size: %d scan_bucket:%d\n",
 		p->max_scan_cache_size, p->max_scan_buckets);
 	wl_info("max AP per scan:%d,max_rssi_sample_size:%d\n",
@@ -995,29 +994,29 @@ static int sprdwl_vendor_get_gscan_capabilities(struct wiphy *wiphy,
 	if (nla_put_u32(reply, GSCAN_SCAN_CACHE_SIZE,
 			p->max_scan_cache_size) ||
 		nla_put_u32(reply, GSCAN_MAX_SCAN_BUCKETS,
-			    p->max_scan_buckets) ||
+				p->max_scan_buckets) ||
 		nla_put_u32(reply, GSCAN_MAX_AP_CACHE_PER_SCAN,
-			    p->max_ap_cache_per_scan) ||
+				p->max_ap_cache_per_scan) ||
 		nla_put_u32(reply, GSCAN_MAX_RSSI_SAMPLE_SIZE,
-			    p->max_rssi_sample_size) ||
+				p->max_rssi_sample_size) ||
 		nla_put_s32(reply, GSCAN_MAX_SCAN_REPORTING_THRESHOLD,
-			    p->max_scan_reporting_threshold) ||
+				p->max_scan_reporting_threshold) ||
 		nla_put_u32(reply, GSCAN_MAX_HOTLIST_BSSIDS,
-			    p->max_hotlist_bssids) ||
+				p->max_hotlist_bssids) ||
 		nla_put_u32(reply, GSCAN_MAX_SIGNIFICANT_WIFI_CHANGE_APS,
-			    p->max_significant_wifi_change_aps) ||
+				p->max_significant_wifi_change_aps) ||
 		nla_put_u32(reply, GSCAN_MAX_BSSID_HISTORY_ENTRIES,
-			    p->max_bssid_history_entries) ||
+				p->max_bssid_history_entries) ||
 		nla_put_u32(reply, GSCAN_MAX_HOTLIST_SSIDS,
-			    p->max_hotlist_bssids) ||
+				p->max_hotlist_bssids) ||
 		nla_put_u32(reply, GSCAN_MAX_NUM_EPNO_NETS,
-			    p->max_number_epno_networks) ||
+				p->max_number_epno_networks) ||
 		nla_put_u32(reply, GSCAN_MAX_NUM_EPNO_NETS_BY_SSID,
-			    p->max_number_epno_networks_by_ssid) ||
+				p->max_number_epno_networks_by_ssid) ||
 		nla_put_u32(reply, GSCAN_MAX_NUM_WHITELISTED_SSID,
-			    p->max_whitelist_ssid) ||
+				p->max_whitelist_ssid) ||
 		nla_put_u32(reply, GSCAN_MAX_NUM_BLACKLISTED_BSSID,
-			    p->max_blacklist_size)){
+				p->max_blacklist_size)){
 		wl_err("failed to put Gscan capabilies\n");
 		goto out_put_fail;
 	}
@@ -1097,14 +1096,14 @@ static int sprdwl_vendor_get_cached_gscan_results(struct wiphy *wiphy,
 		if (nla_put_u32(reply, GSCAN_RESULTS_REQUEST_ID,
 				request_id) ||
 			nla_put_u32(reply,
-				    GSCAN_RESULTS_NUM_RESULTS_AVAILABLE,
+					GSCAN_RESULTS_NUM_RESULTS_AVAILABLE,
 			(vif->priv->gscan_res + i)->num_results)) {
 			wl_ndev_log(L_ERR, vif->ndev, "failed to put!\n");
 			goto out_put_fail;
 		}
 
 		if (nla_put_u8(reply,
-			       GSCAN_RESULTS_SCAN_RESULT_MORE_DATA,
+				   GSCAN_RESULTS_SCAN_RESULT_MORE_DATA,
 			moredata)) {
 			wl_ndev_log(L_ERR, vif->ndev, "failed to put!\n");
 			goto out_put_fail;
@@ -1201,7 +1200,7 @@ static int sprdwl_vendor_get_cached_gscan_results(struct wiphy *wiphy,
 					goto out_put_fail;
 				}
 				if (nla_put(reply,
-					    GSCAN_RESULTS_SCAN_RESULT_BSSID,
+						GSCAN_RESULTS_SCAN_RESULT_BSSID,
 					sizeof(p->results[j].bssid),
 					p->results[j].bssid)) {
 					wl_ndev_log(L_ERR, vif->ndev, "failed to put!\n");
@@ -1252,8 +1251,8 @@ static int sprdwl_vendor_get_cached_gscan_results(struct wiphy *wiphy,
 
 /*buffer scan result in host driver when receive frame from cp2*/
 int sprdwl_vendor_cache_scan_result(struct sprdwl_vif *vif,
-					    u8 bucket_id,
-					    struct sprdwl_gscan_result *item)
+						u8 bucket_id,
+						struct sprdwl_gscan_result *item)
 {
 	struct sprdwl_priv *priv = vif->priv;
 	u32 i;
@@ -1281,9 +1280,9 @@ int sprdwl_vendor_cache_scan_result(struct sprdwl_vif *vif,
 
 	for (i = 0; i < p->num_results; i++) {
 		if (time_after(jiffies - VENDOR_SCAN_RESULT_EXPIRE,
-			       p->results[i].ts)) {
+				   p->results[i].ts)) {
 			memcpy((void *)(&p->results[i]),
-			       (void *)(&p->results[i+1]),
+				   (void *)(&p->results[i+1]),
 				sizeof(struct sprdwl_gscan_result)
 				* (p->num_results - i - 1));
 
@@ -1291,20 +1290,20 @@ int sprdwl_vendor_cache_scan_result(struct sprdwl_vif *vif,
 		}
 
 		if (!memcmp(p->results[i].bssid, item->bssid, ETH_ALEN) &&
-		    strlen(p->results[i].ssid) == strlen(item->ssid) &&
-		    !memcmp(p->results[i].ssid, item->ssid,
-			    strlen(item->ssid))) {
+			strlen(p->results[i].ssid) == strlen(item->ssid) &&
+			!memcmp(p->results[i].ssid, item->ssid,
+				strlen(item->ssid))) {
 			wl_ndev_log(L_ERR, vif->ndev, "%s BSS : %s  %pM exist, but also update it.\n",
 				   __func__, item->ssid, item->bssid);
 
 			memcpy((void *)(&p->results[i]),
-			       (void *)item,
+				   (void *)item,
 				sizeof(struct sprdwl_gscan_result));
 			return 0;
 		}
 	}
 	memcpy((void *)(&p->results[p->num_results]),
-	       (void *)item, sizeof(struct sprdwl_gscan_result));
+		   (void *)item, sizeof(struct sprdwl_gscan_result));
 	p->results[p->num_results].ie_length = 0;
 	p->results[p->num_results].ie_data[0] = 0;
 	p->num_results++;
@@ -1312,7 +1311,7 @@ int sprdwl_vendor_cache_scan_result(struct sprdwl_vif *vif,
 }
 
 int sprdwl_vendor_cache_hotlist_result(struct sprdwl_vif *vif,
-					      struct sprdwl_gscan_result *item)
+						  struct sprdwl_gscan_result *item)
 {
 	struct sprdwl_priv *priv = vif->priv;
 	u32 i;
@@ -1332,9 +1331,9 @@ int sprdwl_vendor_cache_hotlist_result(struct sprdwl_vif *vif,
 
 	for (i = 0; i < p->num_results; i++) {
 		if (time_after(jiffies - VENDOR_SCAN_RESULT_EXPIRE,
-			       p->results[i].ts)) {
+				   p->results[i].ts)) {
 			memcpy((void *)(&p->results[i]),
-			       (void *)(&p->results[i+1]),
+				   (void *)(&p->results[i+1]),
 				sizeof(struct sprdwl_gscan_result)
 				* (p->num_results - i - 1));
 
@@ -1342,20 +1341,20 @@ int sprdwl_vendor_cache_hotlist_result(struct sprdwl_vif *vif,
 		}
 
 		if (!memcmp(p->results[i].bssid, item->bssid, ETH_ALEN) &&
-		    strlen(p->results[i].ssid) == strlen(item->ssid) &&
-		    !memcmp(p->results[i].ssid, item->ssid,
-			    strlen(item->ssid))) {
+			strlen(p->results[i].ssid) == strlen(item->ssid) &&
+			!memcmp(p->results[i].ssid, item->ssid,
+				strlen(item->ssid))) {
 			wl_ndev_log(L_ERR, vif->ndev, "%s BSS : %s  %pM exist, but also update it.\n",
 				   __func__, item->ssid, item->bssid);
 
 			memcpy((void *)(&p->results[i]),
-			       (void *)item,
+				   (void *)item,
 				sizeof(struct sprdwl_gscan_result));
 			return 0;
 		}
 	}
 	memcpy((void *)(&p->results[p->num_results]),
-	       (void *)item, sizeof(struct sprdwl_gscan_result));
+		   (void *)item, sizeof(struct sprdwl_gscan_result));
 	p->results[p->num_results].ie_length = 0;
 	p->results[p->num_results].ie_data[0] = 0;
 	p->num_results++;
@@ -1395,7 +1394,7 @@ int sprdwl_vendor_cache_significant_change_result(struct sprdwl_vif *vif,
 		frame = (struct significant_change_info *)pos;
 
 		memcpy((void *)(&p->results[p->num_results]),
-		       (void *)pos, sizeof(struct significant_change_info));
+			   (void *)pos, sizeof(struct significant_change_info));
 		p->num_results++;
 
 		avail_len -= sizeof(struct significant_change_info) + 1;
@@ -1422,7 +1421,7 @@ int sprdwl_vendor_report_full_scan(struct sprdwl_vif *vif,
 #else
 	reply = cfg80211_vendor_event_alloc(wiphy,
 #endif
-					    payload,
+						payload,
 		NL80211_VENDOR_SUBCMD_GSCAN_FULL_SCAN_RESULT_INDEX,
 		GFP_KERNEL);
 	if (!reply) {
@@ -1434,7 +1433,7 @@ int sprdwl_vendor_report_full_scan(struct sprdwl_vif *vif,
 			priv->gscan_req_id) ||
 #if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 7, 0)
 	nla_put_u64_64bit(reply,
-		    GSCAN_RESULTS_SCAN_RESULT_TIME_STAMP,
+			GSCAN_RESULTS_SCAN_RESULT_TIME_STAMP,
 		item->ts, 0)
 #else
 	nla_put_u64(reply,
@@ -1449,29 +1448,29 @@ int sprdwl_vendor_report_full_scan(struct sprdwl_vif *vif,
 		6,
 		item->bssid) ||
 	nla_put_u32(reply,
-		    GSCAN_RESULTS_SCAN_RESULT_CHANNEL,
+			GSCAN_RESULTS_SCAN_RESULT_CHANNEL,
 		item->channel) ||
 	nla_put_s32(reply, GSCAN_RESULTS_SCAN_RESULT_RSSI,
-		    item->rssi) ||
+			item->rssi) ||
 	nla_put_u32(reply, GSCAN_RESULTS_SCAN_RESULT_RTT,
-		    item->rtt) ||
+			item->rtt) ||
 	nla_put_u32(reply,
-		    GSCAN_RESULTS_SCAN_RESULT_RTT_SD,
+			GSCAN_RESULTS_SCAN_RESULT_RTT_SD,
 		item->rtt_sd) ||
 	nla_put_u16(reply,
-		    GSCAN_RESULTS_SCAN_RESULT_BEACON_PERIOD,
+			GSCAN_RESULTS_SCAN_RESULT_BEACON_PERIOD,
 		item->beacon_period) ||
 	nla_put_u16(reply,
-		    GSCAN_RESULTS_SCAN_RESULT_CAPABILITY,
+			GSCAN_RESULTS_SCAN_RESULT_CAPABILITY,
 		item->capability) ||
 	nla_put_u32(reply,
-		    GSCAN_RESULTS_SCAN_RESULT_IE_LENGTH,
+			GSCAN_RESULTS_SCAN_RESULT_IE_LENGTH,
 		item->ie_length))	{
 		wl_ndev_log(L_ERR, vif->ndev, "%s nla put fail\n", __func__);
 		goto out_put_fail;
 	}
 	if (nla_put(reply, GSCAN_RESULTS_SCAN_RESULT_IE_DATA,
-		    item->ie_length,
+			item->ie_length,
 		item->ie_data)) {
 		wl_ndev_log(L_ERR, vif->ndev, "%s nla put fail\n", __func__);
 		goto out_put_fail;
@@ -1505,7 +1504,7 @@ void sprdwl_report_gscan_result(struct sprdwl_vif *vif,
 	const u8 *ssid;
 #if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 7, 0)
 	freq = ieee80211_channel_to_frequency(chan,
-					      chan <= CH_MAX_2G_CHANNEL ?
+						  chan <= CH_MAX_2G_CHANNEL ?
 						NL80211_BAND_2GHZ : NL80211_BAND_5GHZ);
 #else
 	freq = ieee80211_channel_to_frequency(chan,
@@ -1560,7 +1559,7 @@ void sprdwl_report_gscan_result(struct sprdwl_vif *vif,
 		   mgmt->bssid, gscan_res->ssid, report_event);
 
 	if ((report_event == REPORT_EVENTS_BUFFER_FULL) ||
-	    (report_event & REPORT_EVENTS_EACH_SCAN) ||
+		(report_event & REPORT_EVENTS_EACH_SCAN) ||
 		(report_event & REPORT_EVENTS_FULL_RESULTS) ||
 		(report_event & REPORT_EVENTS_SIGNIFICANT_CHANGE)) {
 		sprdwl_vendor_cache_scan_result(vif, bucket_id, gscan_res);
@@ -1592,7 +1591,7 @@ int sprdwl_buffer_full_event(struct sprdwl_vif *vif)
 #else
 	reply = cfg80211_vendor_event_alloc(wiphy,
 #endif
-					    payload,
+						payload,
 		NL80211_VENDOR_SUBCMD_GSCAN_SCAN_RESULTS_AVAILABLE_INDEX,
 		GFP_KERNEL);
 	if (!reply) {
@@ -1628,7 +1627,7 @@ int sprdwl_available_event(struct sprdwl_vif *vif)
 #else
 	reply = cfg80211_vendor_event_alloc(wiphy,
 #endif
-					    payload,
+						payload,
 		NL80211_VENDOR_SUBCMD_GSCAN_SCAN_RESULTS_AVAILABLE_INDEX,
 		GFP_KERNEL);
 	if (!reply) {
@@ -1665,7 +1664,7 @@ int sprdwl_gscan_done(struct sprdwl_vif *vif, u8 bucketid)
 #else
 	reply = cfg80211_vendor_event_alloc(wiphy,
 #endif
-					    payload,
+						payload,
 		NL80211_VENDOR_SUBCMD_GSCAN_SCAN_EVENT_INDEX,
 		GFP_KERNEL);
 	if (!reply) {
@@ -1679,7 +1678,7 @@ int sprdwl_gscan_done(struct sprdwl_vif *vif, u8 bucketid)
 
 	event_type = WIFI_SCAN_COMPLETE;
 	if (nla_put_u8(reply, GSCAN_RESULTS_SCAN_EVENT_TYPE,
-		       event_type))
+			   event_type))
 		goto out_put_fail;
 
 	cfg80211_vendor_event(reply, GFP_KERNEL);
@@ -1694,7 +1693,7 @@ int sprdwl_gscan_done(struct sprdwl_vif *vif, u8 bucketid)
 /*set_ssid_hotlist function---CMD ID:29*/
 static int sprdwl_vendor_set_bssid_hotlist(struct wiphy *wiphy,
 					   struct wireless_dev *wdev,
-				     const void *data, int len)
+					 const void *data, int len)
 {
 	int i, ret = 0, tlen;
 	int type;
@@ -1721,7 +1720,7 @@ static int sprdwl_vendor_set_bssid_hotlist(struct wiphy *wiphy,
 	}
 
 	memset(vif->priv->hotlist_res, 0x0,
-	       sizeof(struct sprdwl_gscan_hotlist_results));
+		   sizeof(struct sprdwl_gscan_hotlist_results));
 
 	nla_for_each_attr(pos, (void *)data, len, rem_len) {
 			type = nla_type(pos);
@@ -1748,19 +1747,19 @@ static int sprdwl_vendor_set_bssid_hotlist(struct wiphy *wiphy,
 					type = nla_type(inner_iter);
 					switch (type) {
 					case GSCAN_ATTR_AP_THR_PARAM_BSSID:
-					    memcpy(
-					    bssid_hotlist_params->ap[i].bssid,
-					    nla_data(inner_iter),
-					    6 * sizeof(unsigned char));
+						memcpy(
+						bssid_hotlist_params->ap[i].bssid,
+						nla_data(inner_iter),
+						6 * sizeof(unsigned char));
 					break;
 
 					case GSCAN_ATTR_AP_THR_PARAM_RSSI_LOW:
-					    bssid_hotlist_params->ap[i].low
+						bssid_hotlist_params->ap[i].low
 						= nla_get_s32(inner_iter);
 					break;
 
 					case GSCAN_ATTR_AP_THR_PARAM_RSSI_HIGH:
-					    bssid_hotlist_params->ap[i].high
+						bssid_hotlist_params->ap[i].high
 						= nla_get_s32(inner_iter);
 					break;
 					default:
@@ -1793,7 +1792,7 @@ static int sprdwl_vendor_set_bssid_hotlist(struct wiphy *wiphy,
 		}
 
 	wl_ndev_log(L_INFO, vif->ndev, "parse bssid hotlist %s\n",
-		    !ret ? "success" : "failture");
+			!ret ? "success" : "failture");
 
 	tlen = sizeof(struct wifi_bssid_hotlist_params);
 
@@ -1814,7 +1813,7 @@ static int sprdwl_vendor_set_bssid_hotlist(struct wiphy *wiphy,
 /*reset_bssid_hotlist function---CMD ID:30*/
 static int sprdwl_vendor_reset_bssid_hotlist(struct wiphy *wiphy,
 					  struct wireless_dev *wdev,
-				     const void *data, int len)
+					 const void *data, int len)
 {
 	int flush = 1;
 	struct sprdwl_vif *vif = netdev_priv(wdev->netdev);
@@ -1835,7 +1834,7 @@ static int sprdwl_vendor_reset_bssid_hotlist(struct wiphy *wiphy,
 /*set_significant_change function---CMD ID:32*/
 static int sprdwl_vendor_set_significant_change(struct wiphy *wiphy,
 						struct wireless_dev *wdev,
-				     const void *data, int len)
+					 const void *data, int len)
 {
 	int i, ret = 0, tlen;
 	int type;
@@ -1862,7 +1861,7 @@ static int sprdwl_vendor_set_significant_change(struct wiphy *wiphy,
 	}
 
 	memset(vif->priv->significant_res, 0x0,
-	       sizeof(struct sprdwl_significant_change_result));
+		   sizeof(struct sprdwl_significant_change_result));
 
 
 	nla_for_each_attr(pos, (void *)data, len, rem_len) {
@@ -1961,7 +1960,7 @@ static int sprdwl_vendor_set_significant_change(struct wiphy *wiphy,
 /*set_significant_change function---CMD ID:33*/
 static int sprdwl_vendor_reset_significant_change(struct wiphy *wiphy,
 					  struct wireless_dev *wdev,
-				     const void *data, int len)
+					 const void *data, int len)
 {
 	int flush = 1;
 	struct sprdwl_vif *vif = netdev_priv(wdev->netdev);
@@ -1985,7 +1984,7 @@ static int sprdwl_vendor_reset_significant_change(struct wiphy *wiphy,
 
 /*get support feature function---CMD ID:38*/
 static int sprdwl_vendor_get_support_feature(struct wiphy *wiphy,
-					     struct wireless_dev *wdev,
+						 struct wireless_dev *wdev,
 						const void *data, int len)
 {
 	int ret;
@@ -2014,7 +2013,7 @@ static int sprdwl_vendor_get_support_feature(struct wiphy *wiphy,
 		feature |= WIFI_FEATURE_HOTSPOT;
 	/*bit 4:P2P*/
 	if ((wiphy->interface_modes & BIT(NL80211_IFTYPE_P2P_CLIENT)) &&
-	    (wiphy->interface_modes & BIT(NL80211_IFTYPE_P2P_GO))) {
+		(wiphy->interface_modes & BIT(NL80211_IFTYPE_P2P_GO))) {
 		wl_info("P2P is supported\n");
 		feature |= WIFI_FEATURE_P2P;
 	}
@@ -2148,8 +2147,8 @@ static int sprdwl_vendor_get_support_feature(struct wiphy *wiphy,
 
 /*set_mac_oui functon------ CMD ID:39*/
 static int sprdwl_vendor_set_mac_oui(struct wiphy *wiphy,
-					      struct wireless_dev *wdev,
-				     const void *data, int len)
+						  struct wireless_dev *wdev,
+					 const void *data, int len)
 {
 	struct nlattr *pos;
 	struct sprdwl_vif *vif = netdev_priv(wdev->netdev);
@@ -2177,7 +2176,7 @@ static int sprdwl_vendor_set_mac_oui(struct wiphy *wiphy,
 			ret = -EINVAL;
 			goto out;
 		break;
-	    }
+		}
 	}
 
 	tlen = sizeof(struct v_MACADDR_t);
@@ -2214,7 +2213,7 @@ static int sprdwl_vendor_get_concurrency_matrix(struct wiphy *wiphy,
 	struct sk_buff *reply_skb;
 #if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 14, 0)
 	if (nla_parse(tb, SPRDWL_ATTR_CO_MATRIX_MAX,
-		      data, len, NULL, NULL)) {
+			  data, len, NULL, NULL)) {
 #else
 	if (nla_parse(tb, SPRDWL_ATTR_CO_MATRIX_MAX,
 			data, len, NULL)) {
@@ -2275,8 +2274,8 @@ static int sprdwl_vendor_get_concurrency_matrix(struct wiphy *wiphy,
 
 /*get support feature function---CMD ID:55*/
 static int sprdwl_vendor_get_feature(struct wiphy *wiphy,
-				     struct wireless_dev *wdev,
-				     const void *data, int len)
+					 struct wireless_dev *wdev,
+					 const void *data, int len)
 {
 	return 0;
 }
@@ -2297,12 +2296,12 @@ static int sprdwl_vendor_get_wake_state(struct wiphy *wiphy,
 	wake_cnt = &priv->wakeup_tracer;
 	buf_len = NLMSG_HDRLEN;
 	buf_len += WLAN_GET_WAKE_STATS_MAX *
-		     (NLMSG_HDRLEN + sizeof(uint32_t));
+			 (NLMSG_HDRLEN + sizeof(uint32_t));
 	skb = cfg80211_vendor_cmd_alloc_reply_skb(wiphy, buf_len);
 
 	if (!skb) {
 				wl_err("cfg80211_vendor_cmd_alloc_reply_skb failed\n");
-			    return -ENOMEM;
+				return -ENOMEM;
 	}
 
 	ipv4_mc_cnt = wake_cnt->rx_data_dtl.rx_mc_dtl.ipv4_mc_cnt;
@@ -2381,8 +2380,8 @@ static int sprdwl_vendor_enable_nd_offload(struct wiphy *wiphy,
 }
 
 static int sprdwl_vendor_start_logging(struct wiphy *wiphy,
-				       struct wireless_dev *wdev,
-				       const void *data, int len)
+					   struct wireless_dev *wdev,
+					   const void *data, int len)
 {
 	wiphy_info(wiphy, "%s\n", __func__);
 
@@ -2390,8 +2389,8 @@ static int sprdwl_vendor_start_logging(struct wiphy *wiphy,
 }
 
 static int sprdwl_vendor_get_ring_data(struct wiphy *wiphy,
-				       struct wireless_dev *wdev,
-				       const void *data, int len)
+					   struct wireless_dev *wdev,
+					   const void *data, int len)
 {
 	wiphy_info(wiphy, "%s\n", __func__);
 
@@ -2399,8 +2398,8 @@ static int sprdwl_vendor_get_ring_data(struct wiphy *wiphy,
 }
 
 static int sprdwl_vendor_memory_dump(struct wiphy *wiphy,
-				     struct wireless_dev *wdev,
-				     const void *data, int len)
+					 struct wireless_dev *wdev,
+					 const void *data, int len)
 {
 	wiphy_info(wiphy, "%s\n", __func__);
 
@@ -2410,8 +2409,8 @@ static int sprdwl_vendor_memory_dump(struct wiphy *wiphy,
 /*CMD ID:61*/
 static const struct nla_policy sprdwl_get_wifi_info_policy[
 		SPRDWL_ATTR_WIFI_INFO_GET_MAX + 1] = {
-		[SPRDWL_ATTR_WIFI_INFO_DRIVER_VERSION] = {.type = NLA_U32},
-		[SPRDWL_ATTR_WIFI_INFO_FIRMWARE_VERSION] = {.type = NLA_U32},
+		[SPRDWL_ATTR_WIFI_INFO_DRIVER_VERSION] = {.type = NLA_U8},
+		[SPRDWL_ATTR_WIFI_INFO_FIRMWARE_VERSION] = {.type = NLA_U8},
 };
 
 static int sprdwl_vendor_get_driver_info(struct wiphy *wiphy,
@@ -2428,7 +2427,7 @@ static int sprdwl_vendor_get_driver_info(struct wiphy *wiphy,
 	wl_info("%s enter\n", __func__);
 #if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 14, 0)
 	if (nla_parse(tb_vendor, SPRDWL_ATTR_WIFI_INFO_GET_MAX, data,
-		      len, sprdwl_get_wifi_info_policy, NULL)) {
+			  len, sprdwl_get_wifi_info_policy, NULL)) {
 #else
 	if (nla_parse(tb_vendor, SPRDWL_ATTR_WIFI_INFO_GET_MAX, data,
 			len, sprdwl_get_wifi_info_policy)) {
@@ -2456,7 +2455,7 @@ static int sprdwl_vendor_get_driver_info(struct wiphy *wiphy,
 		return -ENOMEM;
 
 	if (nla_put(reply, SPRDWL_VENDOR_ATTR_WIFI_INFO_DRIVER_VERSION,
-		    payload, version)) {
+			payload, version)) {
 		wiphy_err(wiphy, "%s put version error\n", __func__);
 		goto out_put_fail;
 	}
@@ -2517,13 +2516,13 @@ static int sprdwl_vendor_set_roam_params(struct wiphy *wiphy,
 	case SPRDWL_ATTR_ROAM_SUBCMD_SSID_WHITE_LIST:
 		if (!tb[SPRDWL_ROAM_WHITE_LIST_SSID_LIST])
 			break;
-	    i = 0;
+		i = 0;
 		nla_for_each_nested(curr_attr,
-				    tb[SPRDWL_ROAM_WHITE_LIST_SSID_LIST],
+					tb[SPRDWL_ROAM_WHITE_LIST_SSID_LIST],
 					rem) {
 #if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 14, 0)
 			if (nla_parse(tb2, SPRDWL_ATTR_ROAM_SUBCMD_MAX,
-				      nla_data(curr_attr),
+					  nla_data(curr_attr),
 					nla_len(curr_attr),
 					NULL, NULL)) {
 #else
@@ -2550,7 +2549,7 @@ static int sprdwl_vendor_set_roam_params(struct wiphy *wiphy,
 			white_limit = min(fw_max_whitelist, MAX_WHITE_SSID);
 
 			if (buf_len && (i < white_limit) &&
-			    ((buf_len - 1) <= IEEE80211_MAX_SSID_LEN)) {
+				((buf_len - 1) <= IEEE80211_MAX_SSID_LEN)) {
 				nla_memcpy(
 					white_params.white_list[i].ssid_str,
 					tb2[SPRDWL_ROAM_WHITE_LIST_SSID],
@@ -2597,10 +2596,10 @@ static int sprdwl_vendor_set_roam_params(struct wiphy *wiphy,
 		}
 		i = 0;
 		nla_for_each_nested(curr_attr,
-				    tb[SPRDWL_ROAM_SET_BSSID_PARAMS], rem) {
+					tb[SPRDWL_ROAM_SET_BSSID_PARAMS], rem) {
 #if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 14, 0)
 			if (nla_parse(tb2, SPRDWL_ROAM_MAX,
-				      nla_data(curr_attr), nla_len(curr_attr),
+					  nla_data(curr_attr), nla_len(curr_attr),
 					NULL, NULL)) {
 #else
 			if (nla_parse(tb2, SPRDWL_ROAM_MAX,
@@ -2640,7 +2639,7 @@ static int sprdwl_vendor_set_roam_params(struct wiphy *wiphy,
 /*set_ssid_hotlist function---CMD ID:65*/
 static int sprdwl_vendor_set_ssid_hotlist(struct wiphy *wiphy,
 					  struct wireless_dev *wdev,
-				     const void *data, int len)
+					 const void *data, int len)
 {
 	int i, ret = 0, tlen;
 	int type, request_id;
@@ -2727,7 +2726,7 @@ static int sprdwl_vendor_set_ssid_hotlist(struct wiphy *wiphy,
 	}
 
 	wl_ndev_log(L_INFO, vif->ndev, "parse bssid hotlist %s\n",
-		    !ret ? "success" : "failture");
+			!ret ? "success" : "failture");
 
 	tlen = sizeof(struct wifi_ssid_hotlist_params);
 	ret = sprdwl_gscan_subcmd(vif->priv, vif->ctx_id,
@@ -2742,7 +2741,7 @@ static int sprdwl_vendor_set_ssid_hotlist(struct wiphy *wiphy,
 /*reset_ssid_hotlist function---CMD ID:66*/
 static int sprdwl_vendor_reset_ssid_hotlist(struct wiphy *wiphy,
 					  struct wireless_dev *wdev,
-				     const void *data, int len)
+					 const void *data, int len)
 {
 	int flush = 1;
 	struct sprdwl_vif *vif = netdev_priv(wdev->netdev);
@@ -2760,8 +2759,8 @@ static int sprdwl_vendor_reset_ssid_hotlist(struct wiphy *wiphy,
 
 /*set_passpoint_list functon------ CMD ID:70*/
 static int sprdwl_vendor_set_passpoint_list(struct wiphy *wiphy,
-					    struct wireless_dev *wdev,
-				     const void *data, int len)
+						struct wireless_dev *wdev,
+					 const void *data, int len)
 {
 	struct nlattr *tb[GSCAN_MAX + 1];
 	struct nlattr *tb2[GSCAN_MAX + 1];
@@ -2773,13 +2772,13 @@ static int sprdwl_vendor_set_passpoint_list(struct wiphy *wiphy,
 	u16 rlen = sizeof(struct sprdwl_cmd_gscan_rsp_header);
 #if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 14, 0)
 	if (nla_parse(tb, GSCAN_MAX, data, len,
-		      wlan_gscan_config_policy, NULL)) {
+			  wlan_gscan_config_policy, NULL)) {
 #else
 	if (nla_parse(tb, GSCAN_MAX, data, len,
 			wlan_gscan_config_policy)) {
 #endif
 		wl_ndev_log(L_INFO, vif->ndev,
-			    "%s :Fail to parse attribute\n",
+				"%s :Fail to parse attribute\n",
 			__func__);
 		return -EINVAL;
 	}
@@ -2791,7 +2790,7 @@ static int sprdwl_vendor_set_passpoint_list(struct wiphy *wiphy,
 	/* Parse and fetch */
 	if (!tb[GSCAN_ANQPO_LIST_FLUSH]) {
 		wl_ndev_log(L_INFO, vif->ndev,
-			    "%s :Fail to parse GSCAN_ANQPO_LIST_FLUSH\n",
+				"%s :Fail to parse GSCAN_ANQPO_LIST_FLUSH\n",
 			__func__);
 		ret = -EINVAL;
 		goto out;
@@ -2815,10 +2814,10 @@ static int sprdwl_vendor_set_passpoint_list(struct wiphy *wiphy,
 	hs_num = nla_get_u32(tb[GSCAN_ANQPO_HS_LIST_SIZE]);
 
 	nla_for_each_nested(HS_list,
-			    tb[GSCAN_ANQPO_HS_LIST], rem) {
+				tb[GSCAN_ANQPO_HS_LIST], rem) {
 #if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 14, 0)
 		if (nla_parse(tb2, GSCAN_MAX,
-			      nla_data(HS_list), nla_len(HS_list),
+				  nla_data(HS_list), nla_len(HS_list),
 					NULL, NULL)) {
 #else
 		if (nla_parse(tb2, GSCAN_MAX,
@@ -2826,15 +2825,15 @@ static int sprdwl_vendor_set_passpoint_list(struct wiphy *wiphy,
 				NULL)) {
 #endif
 			wl_ndev_log(L_INFO, vif->ndev,
-				    "%s :Fail to parse tb2\n",
+					"%s :Fail to parse tb2\n",
 				__func__);
 			ret = -EINVAL;
-			     goto out;
+				 goto out;
 		}
 
 		if (!tb2[GSCAN_ANQPO_HS_NETWORK_ID]) {
 			wl_ndev_log(L_INFO, vif->ndev,
-				    "%s :Fail to parse GSCAN_ATTR_ANQPO_HS_NETWORK_ID\n",
+					"%s :Fail to parse GSCAN_ATTR_ANQPO_HS_NETWORK_ID\n",
 				__func__);
 			ret = -EINVAL;
 			goto out;
@@ -2845,7 +2844,7 @@ static int sprdwl_vendor_set_passpoint_list(struct wiphy *wiphy,
 
 		if (!tb2[GSCAN_ANQPO_HS_NAI_REALM]) {
 			wl_ndev_log(L_INFO, vif->ndev,
-				    "%s :Fail to parse GSCAN_ATTR_ANQPO_HS_NAI_REALM\n",
+					"%s :Fail to parse GSCAN_ATTR_ANQPO_HS_NAI_REALM\n",
 				__func__);
 			ret = -EINVAL;
 			goto out;
@@ -2856,7 +2855,7 @@ static int sprdwl_vendor_set_passpoint_list(struct wiphy *wiphy,
 
 		if (!tb2[GSCAN_ANQPO_HS_ROAM_CONSORTIUM_ID]) {
 			wl_ndev_log(L_INFO, vif->ndev,
-				    "%s :Fail to parse GSCAN_ATTR_ANQPO_HS_ROAM_CONSORTIUM_ID\n",
+					"%s :Fail to parse GSCAN_ATTR_ANQPO_HS_ROAM_CONSORTIUM_ID\n",
 				__func__);
 			ret = -EINVAL;
 			goto out;
@@ -2868,7 +2867,7 @@ static int sprdwl_vendor_set_passpoint_list(struct wiphy *wiphy,
 
 		if (!tb2[GSCAN_ANQPO_HS_PLMN]) {
 			wl_ndev_log(L_INFO, vif->ndev,
-				    "%s :Fail to parse GSCAN_ATTR_ANQPO_HS_PLMN\n",
+					"%s :Fail to parse GSCAN_ATTR_ANQPO_HS_PLMN\n",
 				__func__);
 			ret = -EINVAL;
 			goto out;
@@ -2894,7 +2893,7 @@ static int sprdwl_vendor_set_passpoint_list(struct wiphy *wiphy,
 /*reset_passpoint_list functon------ CMD ID:71*/
 static int sprdwl_vendor_reset_passpoint_list(struct wiphy *wiphy,
 					  struct wireless_dev *wdev,
-				     const void *data, int len)
+					 const void *data, int len)
 {
 	int flush = 1;
 	struct sprdwl_vif *vif = netdev_priv(wdev->netdev);
@@ -2930,7 +2929,7 @@ static int send_rssi_cmd(struct sprdwl_priv *priv, u8 vif_ctx_id,
 #define MIN_RSSI         SPRDWL_ATTR_RSSI_MONITORING_MIN_RSSI
 #define MAX_RSSI         SPRDWL_ATTR_RSSI_MONITORING_MAX_RSSI
 static int sprdwl_vendor_monitor_rssi(struct wiphy *wiphy,
-				      struct wireless_dev *wdev,
+					  struct wireless_dev *wdev,
 		const void *data, int len)
 {
 	struct nlattr *tb[MONITOR_MAX + 1];
@@ -2989,7 +2988,7 @@ static int sprdwl_vendor_monitor_rssi(struct wiphy *wiphy,
 
 		if (!(req.min_rssi < req.max_rssi)) {
 			wl_err("min rssi %d must be less than max_rssi:%d\n",
-			       req.min_rssi, req.max_rssi);
+				   req.min_rssi, req.max_rssi);
 			return -EINVAL;
 		}
 		wl_info("min_rssi:%d max_rssi:%d\n",
@@ -3047,8 +3046,8 @@ void sprdwl_event_rssi_monitor(struct sprdwl_vif *vif, u8 *data, u16 len)
 }
 
 static int sprdwl_vendor_get_logger_feature(struct wiphy *wiphy,
-					    struct wireless_dev *wdev,
-					    const void *data, int len)
+						struct wireless_dev *wdev,
+						const void *data, int len)
 {
 	int ret;
 	struct sk_buff *reply;
@@ -3098,8 +3097,8 @@ static int sprdwl_flush_epno_list(struct sprdwl_vif *vif)
 }
 
 static int sprdwl_vendor_set_epno_list(struct wiphy *wiphy,
-				       struct wireless_dev *wdev,
-				       const void *data, int len)
+					   struct wireless_dev *wdev,
+					   const void *data, int len)
 {
 	int i, ret = 0;
 	int type;
@@ -3158,23 +3157,23 @@ static int sprdwl_vendor_set_epno_list(struct wiphy *wiphy,
 			nla_for_each_nested(outer_iter, pos, rem_outer_len) {
 				epno_network = &epno_params.networks[i];
 				nla_for_each_nested(inner_iter, outer_iter,
-						    rem_inner_len) {
+							rem_inner_len) {
 					type = nla_type(inner_iter);
 					switch (type) {
 					case SPRDWL_EPNO_PARAM_NETWORK_SSID:
 						memcpy(epno_network->ssid,
-						       nla_data(inner_iter),
-						       IEEE80211_MAX_SSID_LEN);
+							   nla_data(inner_iter),
+							   IEEE80211_MAX_SSID_LEN);
 						break;
 
 					case SPRDWL_EPNO_PARAM_NETWORK_FLAGS:
 						epno_network->flags =
-						    nla_get_u8(inner_iter);
+							nla_get_u8(inner_iter);
 						break;
 
 					case SPRDWL_EPNO_PARAM_NETWORK_AUTH_BIT:
 						epno_network->auth_bit_field =
-						    nla_get_u8(inner_iter);
+							nla_get_u8(inner_iter);
 						break;
 
 					default:
@@ -3210,7 +3209,7 @@ static int sprdwl_vendor_set_epno_list(struct wiphy *wiphy,
 	epno_params.boot_time = jiffies;
 
 	wl_ndev_log(L_INFO, vif->ndev, "parse epno list %s\n",
-		    !ret ? "success" : "failture");
+			!ret ? "success" : "failture");
 	if (!ret)
 		ret = sprdwl_gscan_subcmd(vif->priv, vif->ctx_id,
 					  (void *)&epno_params,
@@ -3249,7 +3248,7 @@ int sprdwl_hotlist_change_event(struct sprdwl_vif *vif, u32 report_event)
 #else
 	reply = cfg80211_vendor_event_alloc(wiphy, payload,
 #endif
-					    event_idx, GFP_KERNEL);
+						event_idx, GFP_KERNEL);
 
 	if (!reply)
 		return -ENOMEM;
@@ -3512,9 +3511,9 @@ static int sprdwl_vendor_set_sar_limits(struct wiphy *wiphy,
 }
 
 static int sprdwl_start_offload_packet(struct sprdwl_priv *priv,
-				       u8 vif_ctx_id,
-				       struct nlattr **tb,
-				       u32 request_id)
+					   u8 vif_ctx_id,
+					   struct nlattr **tb,
+					   u32 request_id)
 {
 	u8 src[ETH_ALEN], dest[ETH_ALEN];
 	u32 period, len;
@@ -3560,15 +3559,15 @@ static int sprdwl_start_offload_packet(struct sprdwl_priv *priv,
 }
 
 static int sprdwl_stop_offload_packet(struct sprdwl_priv *priv,
-				      u8 vif_ctx_id, u32 request_id)
+					  u8 vif_ctx_id, u32 request_id)
 {
 	return sprdwl_set_packet_offload(priv, vif_ctx_id,
 					 request_id, 0, 0, 0, NULL);
 }
 
 static int sprdwl_set_offload_packet(struct wiphy *wiphy,
-				     struct wireless_dev *wdev,
-				     const void *data, int len)
+					 struct wireless_dev *wdev,
+					 const void *data, int len)
 {
 	int err;
 	u8 control;
diff --git a/drivers/net/wireless/uwe5622/unisocwifi/wcn_wrapper.h b/drivers/net/wireless/uwe5622/unisocwifi/wcn_wrapper.h
new file mode 100644
index 000000000..31042f86d
--- /dev/null
+++ b/drivers/net/wireless/uwe5622/unisocwifi/wcn_wrapper.h
@@ -0,0 +1,20 @@
+#ifndef __WCN_WRAPPER_H__
+#define __WCN_WRAPPER_H__
+#include <linux/version.h>
+#if KERNEL_VERSION(5, 6, 0) <= LINUX_VERSION_CODE
+#ifndef timespec
+#define timespec timespec64
+#define timespec_to_ns timespec64_to_ns
+#define getnstimeofday ktime_get_real_ts64
+#define do_gettimeofday ktime_get_real_ts64
+#define timeval_to_ns timespec64_to_ns
+#define timeval timespec64
+#endif
+
+#elif KERNEL_VERSION(5, 0, 0) <= LINUX_VERSION_CODE
+#define timeval timespec
+#define do_gettimeofday getnstimeofday
+#define timeval_to_ns timespec_to_ns
+
+#endif
+#endif//__WCN_WRAPPER_H__
diff --git a/drivers/net/wireless/uwe5622/unisocwifi/wl_core.c b/drivers/net/wireless/uwe5622/unisocwifi/wl_core.c
index a4ef854b6..042a4df01 100644
--- a/drivers/net/wireless/uwe5622/unisocwifi/wl_core.c
+++ b/drivers/net/wireless/uwe5622/unisocwifi/wl_core.c
@@ -18,7 +18,6 @@
 #include <linux/platform_device.h>
 #include <linux/utsname.h>
 #include <linux/debugfs.h>
-#include <linux/kthread.h>
 #include <linux/version.h>
 #include <marlin_platform.h>
 #include <linux/of.h>
@@ -87,7 +86,7 @@ void adjust_qos_ratio(char *buf, unsigned char offset)
 	}
 
 	wl_err("vo ratio:%u, vi ratio:%u, be ratio:%u, wmmac_ratio:%u\n",
-	       vo_ratio, vi_ratio, be_ratio, wmmac_ratio);
+		   vo_ratio, vi_ratio, be_ratio, wmmac_ratio);
 }
 #endif
 unsigned int new_threshold;
@@ -148,10 +147,10 @@ void sprdwl_tdls_flow_flush(struct sprdwl_vif *vif, const u8 *peer, u8 oper)
 	if (oper == NL80211_TDLS_SETUP || oper == NL80211_TDLS_ENABLE_LINK) {
 		for (i = 0; i < MAX_TDLS_PEER; i++) {
 			if (ether_addr_equal(intf->tdls_flow_count[i].da,
-					     peer)) {
+						 peer)) {
 				memset(&intf->tdls_flow_count[i],
-				       0,
-				       sizeof(struct tdls_flow_count_para));
+					   0,
+					   sizeof(struct tdls_flow_count_para));
 				break;
 			}
 		}
@@ -173,7 +172,7 @@ void sprdwl_event_tdls_flow_count(struct sprdwl_vif *vif, u8 *data, u16 len)
 	}
 	for (i = 0; i < MAX_TDLS_PEER; i++) {
 		if (ether_addr_equal(intf->tdls_flow_count[i].da,
-				     peer_info->da)) {
+					 peer_info->da)) {
 			found = 1;
 			break;
 		}
@@ -185,8 +184,8 @@ void sprdwl_event_tdls_flow_count(struct sprdwl_vif *vif, u8 *data, u16 len)
 			return;
 		}
 		memset(&intf->tdls_flow_count[i],
-		       0,
-		       sizeof(struct tdls_flow_count_para));
+			   0,
+			   sizeof(struct tdls_flow_count_para));
 
 		for (i = 0; i < MAX_TDLS_PEER; i++) {
 			if (intf->tdls_flow_count[i].valid == 1)
@@ -220,7 +219,7 @@ void sprdwl_event_tdls_flow_count(struct sprdwl_vif *vif, u8 *data, u16 len)
 			peer_info->timer, peer_info->da);
 
 		kt = ktime_get();
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 14, 0)
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 10, 0)
 		intf->tdls_flow_count[i].start_mstime =
 			(u32)(div_u64(kt, NSEC_PER_MSEC));
 #else
@@ -247,7 +246,7 @@ void count_tdls_flow(struct sprdwl_vif *vif, u8 *data, u16 len)
 
 	for (i = 0; i < MAX_TDLS_PEER; i++) {
 		if ((intf->tdls_flow_count[i].valid == 1) &&
-		    (ether_addr_equal(data, intf->tdls_flow_count[i].da)))
+			(ether_addr_equal(data, intf->tdls_flow_count[i].da)))
 			goto count_it;
 	}
 	return;
@@ -256,7 +255,7 @@ void count_tdls_flow(struct sprdwl_vif *vif, u8 *data, u16 len)
 	if (new_threshold != 0)
 		intf->tdls_flow_count[i].threshold = new_threshold;
 	kt = ktime_get();
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 14, 0)
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 10, 0)
 	msec = (u32)(div_u64(kt, NSEC_PER_MSEC));
 #else
 	msec = (u32)(div_u64(kt.tv64, NSEC_PER_MSEC));
@@ -272,28 +271,28 @@ void count_tdls_flow(struct sprdwl_vif *vif, u8 *data, u16 len)
 		msec, elapsed_time, unit_time);
 
 	if ((intf->tdls_flow_count[i].data_len_counted == 0 &&
-	     len > (intf->tdls_flow_count[i].threshold * 1024)) ||
-	    (intf->tdls_flow_count[i].data_len_counted > 0 &&
-	    ((intf->tdls_flow_count[i].data_len_counted + len) >
-	     intf->tdls_flow_count[i].threshold * 1024 *
-	     ((unit_time == 0) ? 1 : unit_time)))) {
+		 len > (intf->tdls_flow_count[i].threshold * 1024)) ||
+		(intf->tdls_flow_count[i].data_len_counted > 0 &&
+		((intf->tdls_flow_count[i].data_len_counted + len) >
+		 intf->tdls_flow_count[i].threshold * 1024 *
+		 ((unit_time == 0) ? 1 : unit_time)))) {
 		ret = sprdwl_send_tdls_cmd(vif, vif->ctx_id,
 					   (u8 *)intf->tdls_flow_count[i].da,
 					   SPRDWL_TDLS_CMD_CONNECT);
 		memset(&intf->tdls_flow_count[i], 0,
-			       sizeof(struct tdls_flow_count_para));
+				   sizeof(struct tdls_flow_count_para));
 	} else {
 		if (intf->tdls_flow_count[i].data_len_counted == 0) {
 			intf->tdls_flow_count[i].start_mstime = msec;
 			intf->tdls_flow_count[i].data_len_counted += len;
 		}
 		if ((intf->tdls_flow_count[i].data_len_counted > 0) &&
-		    unit_time > 1) {
+			unit_time > 1) {
 			intf->tdls_flow_count[i].start_mstime = msec;
 			intf->tdls_flow_count[i].data_len_counted = len;
 		}
 		if ((intf->tdls_flow_count[i].data_len_counted > 0) &&
-		    unit_time <= 1) {
+			unit_time <= 1) {
 			intf->tdls_flow_count[i].data_len_counted += len;
 		}
 	}
@@ -307,8 +306,8 @@ void count_tdls_flow(struct sprdwl_vif *vif, u8 *data, u16 len)
 
 #define SPRDWL_SDIO_DEBUG_BUFLEN 128
 static ssize_t sprdwl_intf_read_info(struct file *file,
-				     char __user *user_buf,
-				     size_t count, loff_t *ppos)
+					 char __user *user_buf,
+					 size_t count, loff_t *ppos)
 {
 	size_t ret = 0;
 	unsigned int buflen, len;
@@ -367,7 +366,7 @@ static ssize_t sprdwl_intf_write(struct file *file,
 	wl_debug("write info:%s\n", buf);
 	for (type = 0; type < debug_size; type++)
 		if (!strncmp(debuginfo[type].str, buf,
-			     strlen(debuginfo[type].str))) {
+				 strlen(debuginfo[type].str))) {
 			wl_err("write info:type %d\n", type);
 			debuginfo[type].func(buf, strlen(debuginfo[type].str));
 			break;
@@ -443,7 +442,7 @@ void sprdwl_debugfs(void *spdev, struct dentry *dir)
 
 	intf = (struct sprdwl_intf *)spdev;
 	debugfs_create_file("sprdwlinfo", S_IRUSR,
-			    dir, intf, &sprdwl_intf_debug_fops);
+				dir, intf, &sprdwl_intf_debug_fops);
 }
 
 static struct dentry *sprdwl_debug_root;
@@ -539,12 +538,20 @@ static struct notifier_block boost_notifier = {
 extern struct sprdwl_priv *g_sprdwl_priv;
 extern void sprdwl_cancel_scan(struct sprdwl_vif *vif);
 extern void sprdwl_cancel_sched_scan(struct sprdwl_vif *vif);
+extern void sprdwl_flush_all_txlist(struct sprdwl_tx_msg *sprdwl_tx_dev);
+extern int sprdwl_cmd_init(void);
+extern void sprdwl_cmd_deinit(void);
+extern void sprdwl_net_flowcontrl(struct sprdwl_priv *priv,
+			   enum sprdwl_mode mode, bool state);
+extern void sprdwl_reg_notify(struct wiphy *wiphy, struct regulatory_request *request);
+struct work_struct wifi_rst_begin;
+struct work_struct wifi_rst_down;
 struct completion wifi_reset_ready;
-extern void sprdwl_net_flowcontrl(struct sprdwl_priv *priv, enum sprdwl_mode mode, bool state);
 extern struct sprdwl_cmd g_sprdwl_cmd;
 
-static void sprdwl_wifi_reset(void)
+static void wifi_reset_wq(struct work_struct *work)
 {
+	struct sprdwl_vif *vif, *tmp_vif;
 	struct sprdwl_intf *intf = NULL;
 	struct sprdwl_tx_msg *tx_msg = NULL;
 	struct sprdwl_rx_if *rx_if = NULL;
@@ -553,38 +560,103 @@ static void sprdwl_wifi_reset(void)
 	tx_msg = (void *)intf->sprdwl_tx;
 	rx_if = (struct sprdwl_rx_if *)intf->sprdwl_rx;
 
+	reinit_completion(&wifi_reset_ready);
+
 	wl_err("cp2 reset begin..........\n");
 	g_sprdwl_priv->sync.scan_not_allowed = true;
 	g_sprdwl_priv->sync.cmd_not_allowed = true;
 	intf->cp_asserted = 1;
-	intf->exit = 1;
-	if (tx_msg->tx_thread) {
+	sprdwl_reorder_init(&rx_if->ba_entry);
+	sprdwl_net_flowcontrl(g_sprdwl_priv, SPRDWL_MODE_NONE, false);
+	if (tx_msg->tx_thread)
 		tx_up(tx_msg);
-		kthread_stop(tx_msg->tx_thread);
-		tx_msg->tx_thread = NULL;
+
+	sprdwl_flush_all_txlist(tx_msg);
+	flush_workqueue(rx_if->rx_queue);
+	list_for_each_entry_safe(vif, tmp_vif, &g_sprdwl_priv->vif_list, vif_node) {
+		g_sprdwl_priv->sync.fw_stat[vif->mode] =  g_sprdwl_priv->fw_stat[vif->mode];
+		g_sprdwl_priv->fw_stat[vif->mode] = SPRDWL_INTF_CLOSE;
+		sprdwl_report_disconnection(vif, true);
+		if (g_sprdwl_priv->scan_vif)
+			sprdwl_cancel_scan(g_sprdwl_priv->scan_vif);
+		if (g_sprdwl_priv->sched_scan_vif) {
+			sprdwl_sched_scan_done(g_sprdwl_priv->sched_scan_vif, true);
+			sprdwl_cancel_sched_scan(g_sprdwl_priv->sched_scan_vif);
+		}
 	}
 
+	sprdwl_vendor_deinit(g_sprdwl_priv->wiphy);
+	sprdwl_cmd_wake_upall();
+	sprdwl_tcp_ack_deinit(g_sprdwl_priv);
+	sprdwl_intf_deinit(intf);
+	// sprdwl_cmd_deinit();
+	complete(&wifi_reset_ready);
 	wl_err("cp2 reset finish..........\n");
+
 }
 
-static int wifi_exception_event(void)
+static void wifi_resume_wq(struct work_struct *work)
 {
-	char *envp[2];
-	envp[0] = "CP2-EXCEPTION-EVENT";
-	envp[1] = NULL;
-	kobject_uevent_env(&sprdwl_dev->kobj, KOBJ_CHANGE, envp);
-	return 0;
+	struct sprdwl_vif *vif, *tmp_vif;
+	struct sprdwl_intf *intf = NULL;
+	struct sprdwl_rx_if *rx_if = NULL;
+	wl_err("cp2 resume begin...............\n");
+
+	intf = (struct sprdwl_intf *)g_sprdwl_priv->hw_priv;
+	rx_if = (struct sprdwl_rx_if *)intf->sprdwl_rx;
+
+	wait_for_completion(&wifi_reset_ready);
+
+	sprdwl_intf_init(g_sprdwl_priv, intf);
+	// sprdwl_cmd_init();
+	wl_err("sprdwl cmd init finish.\n");
+	g_sprdwl_priv->sync.cmd_not_allowed = false;
+	intf->cp_asserted = 0;
+	sprdwl_net_flowcontrl(g_sprdwl_priv, SPRDWL_MODE_NONE, true);
+	sprdwl_reorder_init(&rx_if->ba_entry);
+	sprdwl_sync_version(g_sprdwl_priv);
+	sprdwl_download_ini(g_sprdwl_priv);
+	sprdwl_tcp_ack_init(g_sprdwl_priv);
+	sprdwl_get_fw_info(g_sprdwl_priv);
+	sprdwl_setup_wiphy(g_sprdwl_priv->wiphy, g_sprdwl_priv);
+	sprdwl_vendor_init(g_sprdwl_priv->wiphy);
+
+	sprdwl_reg_notify(g_sprdwl_priv->wiphy, &g_sprdwl_priv->sync.request);
+
+	list_for_each_entry_safe(vif, tmp_vif, &g_sprdwl_priv->vif_list, vif_node) {
+		if (SPRDWL_INTF_OPEN == g_sprdwl_priv->sync.fw_stat[vif->mode]) {
+			vif->mode = SPRDWL_MODE_NONE;
+			sprdwl_init_fw(vif);
+		}
+	}
+	g_sprdwl_priv->sync.scan_not_allowed = false;
+	wl_err("cp2 resume complete...............\n");
+}
+
+static void wifi_reset_init(void)
+{
+	INIT_WORK(&wifi_rst_begin, wifi_reset_wq);
+	INIT_WORK(&wifi_rst_down, wifi_resume_wq);
+	init_completion(&wifi_reset_ready);
+	return;
 }
 
 int wifi_reset_callback(struct notifier_block *nb, unsigned long event, void *v)
 {
-	sprdwl_wifi_reset();
-	wifi_exception_event();
+	wl_info("%s[%d]: %s %d\n", __func__, __LINE__, (char *)v, (int)event);
+	switch (event) {
+	case 1:
+		schedule_work(&wifi_rst_begin);
+		break;
+	case 0:
+		schedule_work(&wifi_rst_down);
+		break;
+	}
+
 	return NOTIFY_OK;
 }
-
 static struct notifier_block wifi_reset_notifier = {
-    .notifier_call = wifi_reset_callback,
+	.notifier_call = wifi_reset_callback,
 };
 #endif
 
@@ -596,6 +668,7 @@ static int sprdwl_probe(struct platform_device *pdev)
 	u8 i;
 
 #ifdef CP2_RESET_SUPPORT
+	wifi_reset_init();
 	marlin_reset_callback_register(MARLIN_WIFI, &wifi_reset_notifier);
 #endif
 
@@ -692,6 +765,7 @@ static int sprdwl_probe(struct platform_device *pdev)
 	return ret;
 
 err_core_init:
+	sprdwl_bus_deinit();
 	sprdwl_tx_deinit(intf);
 err_tx_init:
 	sprdwl_rx_deinit(intf);
@@ -717,6 +791,7 @@ static int sprdwl_remove(struct platform_device *pdev)
 	cpufreq_unregister_notifier(&boost_notifier, CPUFREQ_POLICY_NOTIFIER);
 	sprdwl_debugfs_deinit();
 	sprdwl_core_deinit(priv);
+	sprdwl_bus_deinit();
 	sprdwl_tx_deinit(intf);
 	sprdwl_rx_deinit(intf);
 	sprdwl_intf_deinit(intf);
@@ -762,8 +837,8 @@ static int __init unisoc_wlan_init(void)
 
 static void __exit unisoc_wlan_exit(void)
 {
-    platform_driver_unregister(&sprdwl_driver);
-    platform_device_del(unisoc_pdev);
+	platform_driver_unregister(&sprdwl_driver);
+	platform_device_del(unisoc_pdev);
 }
 
 module_init(unisoc_wlan_init);
diff --git a/drivers/net/wireless/uwe5622/unisocwifi/wl_core.h b/drivers/net/wireless/uwe5622/unisocwifi/wl_core.h
index 8bad5a5fd..0d039c18e 100644
--- a/drivers/net/wireless/uwe5622/unisocwifi/wl_core.h
+++ b/drivers/net/wireless/uwe5622/unisocwifi/wl_core.h
@@ -17,7 +17,7 @@
 
 #ifndef __WL_CORE_H__
 #define __WL_CORE_H__
-
+#include "wcn_wrapper.h"
 #include <linux/types.h>
 #include <linux/wait.h>
 #include <linux/spinlock.h>
diff --git a/drivers/net/wireless/uwe5622/unisocwifi/wl_intf.c b/drivers/net/wireless/uwe5622/unisocwifi/wl_intf.c
index b05a57678..a6def0e06 100644
--- a/drivers/net/wireless/uwe5622/unisocwifi/wl_intf.c
+++ b/drivers/net/wireless/uwe5622/unisocwifi/wl_intf.c
@@ -24,9 +24,6 @@
 #include "rx_msg.h"
 #include "work.h"
 #include "tcp_ack.h"
-#ifndef CPUFREQ_ADJUST
-#define CPUFREQ_ADJUST			(0)
-#endif
 
 #define INIT_INTF(num, type, out, interval, bsize, psize, max,\
 			 threshold, time, pop, push, complete, suspend) \
@@ -46,7 +43,7 @@ static inline struct sprdwl_intf *get_intf(void)
 	(get_intf()->priv->hw_type == SPRDWL_HW_PCIE)
 
 void sprdwl_hex_dump(unsigned char *name,
-		     unsigned char *data, unsigned short len)
+			 unsigned char *data, unsigned short len)
 {
 	int i, p = 0, ret;
 	unsigned char buf[255] = {0};
@@ -105,19 +102,19 @@ void sprdwl_dump_stats(struct sprdwl_intf *intf)
 {
 	wl_err("++print txrx statistics++\n");
 	wl_err("tx packets: %lu, tx bytes: %lu\n",  intf->stats.tx_packets,
-	       intf->stats.tx_bytes);
+		   intf->stats.tx_bytes);
 	wl_err("tx filter num: %lu\n",  intf->stats.tx_filter_num);
 	wl_err("tx errors: %lu, tx dropped: %lu\n",  intf->stats.tx_errors,
-	       intf->stats.tx_dropped);
+		   intf->stats.tx_dropped);
 	wl_err("tx avg time: %lu\n",  intf->stats.tx_avg_time);
 	wl_err("tx realloc: %lu\n",  intf->stats.tx_realloc);
 	wl_err("tx arp num: %lu\n",  intf->stats.tx_arp_num);
 	wl_err("rx packets: %lu, rx bytes: %lu\n",  intf->stats.rx_packets,
-	       intf->stats.rx_bytes);
+		   intf->stats.rx_bytes);
 	wl_err("rx errors: %lu, rx dropped: %lu\n",  intf->stats.rx_errors,
-	       intf->stats.rx_dropped);
+		   intf->stats.rx_dropped);
 	wl_err("rx multicast: %lu, tx multicast: %lu\n",
-	       intf->stats.rx_multicast, intf->stats.tx_multicast);
+		   intf->stats.rx_multicast, intf->stats.tx_multicast);
 	wl_err("--print txrx statistics--\n");
 }
 
@@ -130,7 +127,7 @@ void sprdwl_clear_stats(struct sprdwl_intf *intf)
 *from network stack to freed by HIF every STATS_COUNT packets
 */
 void sprdwl_get_tx_avg_time(struct sprdwl_intf *intf,
-			    unsigned long tx_start_time)
+				unsigned long tx_start_time)
 {
 	struct timespec tx_end;
 
@@ -159,7 +156,7 @@ void set_coex_bt_on_off(u8 action)
 unsigned long mbufalloc;
 unsigned long mbufpop;
 int if_tx_one(struct sprdwl_intf *intf, unsigned char *data,
-	      int len, int chn)
+		  int len, int chn)
 {
 	int ret;
 	struct mbuf_t *head = NULL, *tail = NULL, *mbuf = NULL;
@@ -168,7 +165,7 @@ int if_tx_one(struct sprdwl_intf *intf, unsigned char *data,
 	ret = sprdwcn_bus_list_alloc(chn, &head, &tail, &num);
 	if (ret || head == NULL || tail == NULL) {
 		wl_err("%s:%d sprdwcn_bus_list_alloc fail\n",
-		       __func__, __LINE__);
+			   __func__, __LINE__);
 		return -1;
 	}
 	mbufalloc += num;
@@ -181,7 +178,7 @@ int if_tx_one(struct sprdwl_intf *intf, unsigned char *data,
 		sprdwl_hex_dump("tx to cp2 cmd data dump", data + 4, len);
 	if (intf->priv->hw_type == SPRDWL_HW_PCIE) {
 		mbuf->phy = mm_virt_to_phys(&intf->pdev->dev, mbuf->buf,
-					    mbuf->len, DMA_TO_DEVICE);
+						mbuf->len, DMA_TO_DEVICE);
 	}
 
 	ret = sprdwcn_bus_push_list(chn, head, tail, num);
@@ -208,7 +205,7 @@ inline int if_tx_cmd(struct sprdwl_intf *intf, unsigned char *data, int len)
 }
 
 inline int if_tx_addr_trans(struct sprdwl_intf *intf,
-			    unsigned char *data, int len)
+				unsigned char *data, int len)
 {
 	/* FIXME: Which port is used to send ADDR TRNAS*/
 	return if_tx_one(intf, data, len, intf->tx_data_port);
@@ -251,15 +248,15 @@ static inline struct pcie_addr_buffer
 	mbuf->len = ADDR_OFFSET + tx_count * SPRDWL_PHYS_LEN;
 	mbuf->buf = (unsigned char *)addr_buffer;
 	mbuf->phy = mm_virt_to_phys(&intf->pdev->dev, mbuf->buf,
-				    mbuf->len, DMA_TO_DEVICE);
+					mbuf->len, DMA_TO_DEVICE);
 
 	return addr_buffer;
 }
 
 void sprdwl_add_tx_list_head(struct list_head *tx_fail_list,
-			     struct list_head *tx_list,
-			     int ac_index,
-			     int tx_count)
+				 struct list_head *tx_list,
+				 int ac_index,
+				 int tx_count)
 {
 	struct sprdwl_msg_buf *msg_buf = NULL;
 	struct list_head *xmit_free_list;
@@ -433,20 +430,20 @@ int sprdwl_intf_tx_list(struct sprdwl_intf *dev,
 			pcie_count = num + 1;
 		}
 		ret = sprdwcn_bus_list_alloc(dev->tx_data_port, &head,
-				      &tail, &pcie_count);
+					  &tail, &pcie_count);
 	} else {
 		ret = sprdwcn_bus_list_alloc(dev->tx_data_port, &head,
-				      &tail, &tx_count);
+					  &tail, &tx_count);
 	}
 	if (ret != 0 || head == NULL || tail == NULL) {
 		wl_err("%s, %d, mbuf alloc fail\n",
-		       __func__, __LINE__);
+			   __func__, __LINE__);
 		sprdwcn_bus_list_free(dev->tx_data_port, head, tail, tx_count);
 		return -ENOMEM;
 	}
 	if (tx_count_saved != tx_count) {
 		wl_err("%s, %d error!mbuf not enough%d\n",
-		       __func__, __LINE__, (tx_count_saved - tx_count));
+			   __func__, __LINE__, (tx_count_saved - tx_count));
 		tx_msg->mbuf_short += (tx_count_saved - tx_count);
 		sprdwcn_bus_list_free(dev->tx_data_port, head, tail, tx_count);
 		return -ENOMEM;
@@ -458,15 +455,15 @@ int sprdwl_intf_tx_list(struct sprdwl_intf *dev,
 		if (pcie_count > 1) {
 			addr_buffer =
 			sprdwl_set_pcie_addr_to_mbuf(tx_msg,
-						     mbuf_pos, PCIE_TX_NUM);
+							 mbuf_pos, PCIE_TX_NUM);
 		} else {
 			addr_buffer =
 			sprdwl_set_pcie_addr_to_mbuf(tx_msg,
-						     mbuf_pos, tx_count);
+							 mbuf_pos, tx_count);
 		}
 		if (addr_buffer == NULL) {
 			wl_err("%s:%d alloc pcie addr buf fail\n",
-			       __func__, __LINE__);
+				   __func__, __LINE__);
 			return -1;
 		}
 	}
@@ -518,7 +515,7 @@ int sprdwl_intf_tx_list(struct sprdwl_intf *dev,
 				}
 				if (addr_buffer == NULL) {
 					wl_err("%s:%d alloc pcie addr buf fail\n",
-					       __func__, __LINE__);
+						   __func__, __LINE__);
 					return -1;
 				}
 			}
@@ -528,14 +525,14 @@ int sprdwl_intf_tx_list(struct sprdwl_intf *dev,
 						msg_pos->tran_data,
 						msg_pos->len, DMA_TO_DEVICE);
 			memcpy(&addr_buffer->pcie_addr[i],
-			       &pcie_addr, SPRDWL_PHYS_LEN);
+				   &pcie_addr, SPRDWL_PHYS_LEN);
 		} else {
 			mbuf_pos->buf = data_ptr;
 			mbuf_pos->len = msg_pos->len;
 			/*TODO, to check msgbuf before list push*/
 			msg_temp = GET_MSG_BUF(mbuf_pos);
 			if (!virt_addr_valid(msg_temp) ||
-			    !virt_addr_valid(msg_temp->skb))
+				!virt_addr_valid(msg_temp->skb))
 				BUG_ON(1);
 		}
 		mbuf_pos = mbuf_pos->next;
@@ -563,12 +560,12 @@ int sprdwl_intf_tx_list(struct sprdwl_intf *dev,
 					break;
 			}
 			sprdwcn_bus_list_free(dev->tx_data_port, head, tail,
-				       pcie_count);
+					   pcie_count);
 			/*add data list to tx list header if tx fail*/
 			sprdwl_add_tx_list_head(tx_list_head,
 						tx_list, ac_index, tx_count);
 			wl_err("%s:%d Tx pcie addr buf fail\n",
-			       __func__, __LINE__);
+				   __func__, __LINE__);
 		} else {
 #if defined(MORE_DEBUG)
 			UPDATE_TX_PACKETS(dev, tx_count, tx_bytes);
@@ -582,13 +579,13 @@ int sprdwl_intf_tx_list(struct sprdwl_intf *dev,
 	if (dev->priv->hw_type == SPRDWL_HW_SDIO) {
 		if (coex_bt_on)
 			ret = sprdwcn_bus_push_list(dev->tx_data_port,
-						    head, tail, tx_count);
+							head, tail, tx_count);
 		else
 			ret = sprdwcn_bus_push_list_direct(dev->tx_data_port,
 							   head, tail, tx_count);
 	} else {
 		ret = sprdwcn_bus_push_list(dev->tx_data_port,
-					    head, tail, tx_count);
+						head, tail, tx_count);
 	}
 
 	if (ret != 0) {
@@ -609,7 +606,7 @@ int sprdwl_intf_tx_list(struct sprdwl_intf *dev,
 		if (dev->priv->hw_type == SPRDWL_HW_SDIO) {
 			if (!coex_bt_on)
 				sprdwl_add_topop_list(dev->tx_data_port,
-						      head, tail, tx_count);
+							  head, tail, tx_count);
 		}
 	}
 
@@ -638,7 +635,7 @@ struct sprdwl_peer_entry
 
 /* It is tx private function, just use in sprdwl_intf_fill_msdu_dscr()  */
 unsigned char sprdwl_find_lut_index(struct sprdwl_intf *intf,
-				    struct sprdwl_vif *vif)
+					struct sprdwl_vif *vif)
 {
 	u8 ret;
 	unsigned char i;
@@ -650,10 +647,10 @@ unsigned char sprdwl_find_lut_index(struct sprdwl_intf *intf,
 		 intf->skb_da[0], intf->skb_da[1], intf->skb_da[2],
 		 intf->skb_da[3], intf->skb_da[4], intf->skb_da[5]);
 	if (sprdwl_is_group(intf->skb_da) &&
-	    (vif->mode == SPRDWL_MODE_AP || vif->mode == SPRDWL_MODE_P2P_GO)) {
+		(vif->mode == SPRDWL_MODE_AP || vif->mode == SPRDWL_MODE_P2P_GO)) {
 		for (i = 0; i < MAX_LUT_NUM; i++) {
 			if ((sprdwl_is_group(intf->peer_entry[i].tx.da)) &&
-			    (intf->peer_entry[i].ctx_id == vif->ctx_id)) {
+				(intf->peer_entry[i].ctx_id == vif->ctx_id)) {
 				wl_info("%s, %d, group lut_index=%d\n",
 					__func__, __LINE__,
 					intf->peer_entry[i].lut_index);
@@ -677,7 +674,7 @@ unsigned char sprdwl_find_lut_index(struct sprdwl_intf *intf,
 	for (i = 0; i < MAX_LUT_NUM; i++) {
 		if ((0 == memcmp(intf->peer_entry[i].tx.da,
 				 intf->skb_da, ETH_ALEN)) &&
-		    (intf->peer_entry[i].ctx_id == vif->ctx_id)) {
+			(intf->peer_entry[i].ctx_id == vif->ctx_id)) {
 			wl_debug("%s, %d, lut_index=%d\n",
 				 __func__, __LINE__,
 				 intf->peer_entry[i].lut_index);
@@ -687,8 +684,8 @@ unsigned char sprdwl_find_lut_index(struct sprdwl_intf *intf,
 
 	for (i = 0; i < MAX_LUT_NUM; i++) {
 		if ((vif->mode == SPRDWL_MODE_STATION ||
-		     vif->mode == SPRDWL_MODE_P2P_CLIENT) &&
-		    (intf->peer_entry[i].ctx_id == vif->ctx_id)) {
+			 vif->mode == SPRDWL_MODE_P2P_CLIENT) &&
+			(intf->peer_entry[i].ctx_id == vif->ctx_id)) {
 			wl_debug("%s, %d, lut_index=%d\n",
 				 __func__, __LINE__,
 				 intf->peer_entry[i].lut_index);
@@ -711,16 +708,16 @@ unsigned char sprdwl_find_lut_index(struct sprdwl_intf *intf,
 		break;
 	}
 
-	wl_err("ctx_id = %d, sm_state = %d, bssid =%pM\n",
-			vif->ctx_id, vif->sm_state, intf->skb_da);
+	//wl_err("ctx_id = %d, sm_state = %d, bssid =%pM\n",
+	//		vif->ctx_id, vif->sm_state, intf->skb_da);
 
 	return ret;
 }
 
 int sprdwl_intf_fill_msdu_dscr(struct sprdwl_vif *vif,
-			       struct sk_buff *skb,
+				   struct sk_buff *skb,
 				   u8 type,
-			       u8 offset)
+				   u8 offset)
 {
 	u8 protocol;
 	struct tx_msdu_dscr *dscr;
@@ -753,7 +750,7 @@ int sprdwl_intf_fill_msdu_dscr(struct sprdwl_vif *vif,
 		kfree_skb(temp_skb);
 		if (skb == NULL) {
 			wl_err("%s:%d failed to unshare skbuff: NULL\n",
-			       __func__, __LINE__);
+				   __func__, __LINE__);
 			return -EPERM;
 		}
 #if defined(MORE_DEBUG)
@@ -765,7 +762,7 @@ int sprdwl_intf_fill_msdu_dscr(struct sprdwl_vif *vif,
 
 	lut_index = sprdwl_find_lut_index(dev, vif);
 	if ((lut_index < 6) && (!sprdwl_is_group(dev->skb_da))) {
-		wl_err("%s, %d, sta disconn, no data tx!", __func__, __LINE__);
+		//wl_err("%s, %d, sta disconn, no data tx!", __func__, __LINE__);
 		return -EPERM;
 	}
 	skb_push(skb, sizeof(struct tx_msdu_dscr) + offset + dscr_rsvd);
@@ -885,9 +882,9 @@ int sprdwl_intf_tx_data_fpga_test(struct sprdwl_intf *intf,
 }
 
 int sprdwl_intf_fill_msdu_dscr_test(struct sprdwl_priv *priv,
-				    struct sk_buff *skb,
-				    u8 type,
-				    u8 offset)
+					struct sk_buff *skb,
+					u8 type,
+					u8 offset)
 {
 	struct tx_msdu_dscr *dscr;
 	struct sprdwl_intf *dev;
@@ -904,7 +901,7 @@ int sprdwl_intf_fill_msdu_dscr_test(struct sprdwl_priv *priv,
 		kfree_skb(temp_skb);
 		if (skb == NULL) {
 			wl_err("%s:%d failed to realloc skbuff: NULL\n",
-			       __func__, __LINE__);
+				   __func__, __LINE__);
 			return 0;
 		}
 	}
@@ -1015,7 +1012,7 @@ inline void sprdwl_free_rx_data(struct sprdwl_intf *intf,
 		if (ret) {
 			wl_err("%s: alloc buf fail\n", __func__);
 			sprdwcn_bus_list_free(chn, (struct mbuf_t *)head,
-				       (struct mbuf_t *)tail, num);
+					   (struct mbuf_t *)tail, num);
 			head = NULL;
 			tail = NULL;
 			num = 0;
@@ -1051,6 +1048,20 @@ void sprdwl_count_rx_tp(struct sprdwl_rx_if *rx_if, int num)
 		rx_if->rx_data_num = 0;
 	}
 }
+
+static int check_msdu_early(struct sprdwl_intf *intf, struct mbuf_t *mbuf)
+{
+	struct rx_msdu_desc *msdu_desc =
+		(struct rx_msdu_desc *)(mbuf->buf + intf->hif_offset);
+
+	if (mbuf->len < msdu_desc->msdu_len ||
+		msdu_desc->msdu_len > 1600) {
+		wl_err("%s, %d, %d, %d\n", __func__, __LINE__, mbuf->len, msdu_desc->msdu_len);
+		return -1;
+	}
+	return 0;
+}
+
 static int intf_rx_handle(int chn, struct mbuf_t *head,
 				   struct mbuf_t *tail, int num)
 {
@@ -1074,6 +1085,13 @@ static int intf_rx_handle(int chn, struct mbuf_t *head,
 		for (i = num; i > 0; i--) {
 			sprdwl_sdio_process_credit(intf,
 				(void *)(mbuf->buf + intf->hif_offset));
+			if (intf->priv->hw_type == SPRDWL_HW_USB &&
+				chn == USB_RX_DATA_PORT &&
+				check_msdu_early(intf, mbuf)) {
+				sprdwcn_bus_push_list(chn, head, tail, num);
+				return 0;
+			}
+
 			mbuf = mbuf->next;
 		}
 	}
@@ -1160,9 +1178,9 @@ void sprdwl_handle_pop_list(void *data)
 	list_splice_tail(&tmp_list, &msg_pos->msglist->freelist);
 	spin_unlock_bh(&tx_msg->tx_list_qos_pool.freelock);
 	sprdwcn_bus_list_free(pop->chn,
-			      pop->head,
-			      pop->tail,
-			      pop->num);
+				  pop->head,
+				  pop->tail,
+				  pop->num);
 	mbufpop += pop->num;
 }
 
@@ -1208,12 +1226,13 @@ int sprdwl_tx_data_pop_list(int channel, struct mbuf_t *head, struct mbuf_t *tai
 
 /*free PCIe data when receive txc event from cp*/
 int sprdwl_tx_free_pcie_data(struct sprdwl_intf *dev, unsigned char *data,
-			     unsigned short len)
+				 unsigned short len)
 {
 	int i;
 	struct sprdwl_tx_msg *tx_msg;
 	unsigned char *data_addr_ptr;
-	unsigned long pcie_addr, timeout;
+	uint64_t pcie_addr;
+	unsigned long timeout;
 	unsigned short  data_num;
 	struct list_head *free_list;
 	struct txc_addr_buff *txc_addr;
@@ -1312,13 +1331,13 @@ int sprdwl_tx_cmd_pop_list(int channel, struct mbuf_t *head, struct mbuf_t *tail
 int sprdwl_rx_cmd_push(int chn, struct mbuf_t **head, struct mbuf_t **tail, int *num)
 {
 	return sprdwl_rx_common_push(chn, head, tail,
-				     num, SPRDWL_MAX_CMD_RXLEN);
+					 num, SPRDWL_MAX_CMD_RXLEN);
 }
 
 int sprdwl_rx_data_push(int chn, struct mbuf_t **head, struct mbuf_t **tail, int *num)
 {
 	return sprdwl_rx_common_push(chn, head, tail,
-				     num, SPRDWL_MAX_DATA_RXLEN);
+					 num, SPRDWL_MAX_DATA_RXLEN);
 }
 
 /*
@@ -1558,7 +1577,7 @@ void sprdwl_event_sta_lut(struct sprdwl_vif *vif, u8 *data, u16 len)
 		}
 		peer_entry_delba((void *)intf, i);
 		memset(&intf->peer_entry[i], 0x00,
-		       sizeof(struct sprdwl_peer_entry));
+			   sizeof(struct sprdwl_peer_entry));
 		intf->peer_entry[i].ctx_id = 0xFF;
 		intf->tx_num[i] = 0;
 		sprdwl_dis_flush_txlist(intf, i);
@@ -1587,7 +1606,7 @@ void sprdwl_event_sta_lut(struct sprdwl_vif *vif, u8 *data, u16 len)
 }
 
 void sprdwl_tx_ba_mgmt(struct sprdwl_priv *priv, void *data, int len,
-		       unsigned char cmd_id, unsigned char ctx_id)
+			   unsigned char cmd_id, unsigned char ctx_id)
 {
 	struct sprdwl_msg_buf *msg;
 	unsigned char *data_ptr;
@@ -1626,12 +1645,12 @@ void sprdwl_tx_ba_mgmt(struct sprdwl_priv *priv, void *data, int len,
 		tid = addba->addba_param.tid;
 		if (!test_and_clear_bit(tid, &peer_entry->ba_tx_done_map))
 			goto out;
-		wl_err("%s, %d, tx_addba failed, reason=%d, lut_index=%d, tid=%d, map=%lu\n",
-		       __func__, __LINE__,
-		       rbuf[0],
-		       addba->lut_index,
-		       tid,
-		       peer_entry->ba_tx_done_map);
+		//wl_err("%s, %d, tx_addba failed, reason=%d, lut_index=%d, tid=%d, map=%lu\n",
+		//	   __func__, __LINE__,
+		//	   rbuf[0],
+		//	   addba->lut_index,
+		//	   tid,
+		//	   peer_entry->ba_tx_done_map);
 	}
 out:
 	kfree(rbuf);
@@ -1657,7 +1676,7 @@ void sprdwl_tx_send_delba(struct sprdwl_vif *vif, void *data, int len)
 }
 
 void sprdwl_tx_addba(struct sprdwl_intf *intf,
-		     struct sprdwl_peer_entry *peer_entry, unsigned char tid)
+			 struct sprdwl_peer_entry *peer_entry, unsigned char tid)
 {
 #define WIN_SIZE 64
 	struct host_addba_param addba;
@@ -1692,7 +1711,7 @@ void sprdwl_tx_addba(struct sprdwl_intf *intf,
 }
 
 void sprdwl_tx_delba(struct sprdwl_intf *intf,
-		     struct sprdwl_peer_entry *peer_entry,  unsigned int ac_index)
+			 struct sprdwl_peer_entry *peer_entry,  unsigned int ac_index)
 {
 	struct host_delba_param delba[SPRDWL_AC_MAX];
 	struct sprdwl_work *misc_work;
@@ -1721,7 +1740,7 @@ void sprdwl_tx_delba(struct sprdwl_intf *intf,
 	misc_work->vif = vif;
 	misc_work->id = SPRDWL_WORK_DELBA;
 	memcpy(misc_work->data, delba,
-	       sizeof(struct host_delba_param) * SPRDWL_AC_MAX);
+		   sizeof(struct host_delba_param) * SPRDWL_AC_MAX);
 	peer_entry->ht_enable = 0;
 	peer_entry->ba_tx_done_map = 0;
 
@@ -1731,17 +1750,26 @@ void sprdwl_tx_delba(struct sprdwl_intf *intf,
 
 int sprdwl_notifier_boost(struct notifier_block *nb, unsigned long event, void *data)
 {
+#if KERNEL_VERSION(5, 4, 19) <= LINUX_VERSION_CODE
 	struct cpufreq_policy_data *policy = data;
+#else
+	struct cpufreq_policy *policy = data;
+#endif
 	unsigned long min_freq;
 	unsigned long max_freq = policy->cpuinfo.max_freq;
 	struct sprdwl_intf *intf = get_intf();
 	u8 boost;
+
 	if (NULL == intf)
 		return NOTIFY_DONE;
 
 	boost = intf->boost;
 
+#if KERNEL_VERSION(5, 4, 0) <= LINUX_VERSION_CODE
+	if (event != CPUFREQ_CREATE_POLICY)
+#else
 	if (event != CPUFREQ_ADJUST)
+#endif
 		return NOTIFY_DONE;
 
 	min_freq = boost ? 1200000 : 400000;
@@ -1818,7 +1846,7 @@ void adjust_rxnum_level(char *buf, unsigned char offset)
 #undef MAX_LEN
 }
 
-int sprdwl_intf_init(struct sprdwl_priv *priv, struct sprdwl_intf *intf)
+int sprdwl_bus_init(struct sprdwl_priv *priv)
 {
 	int ret = -EINVAL, chn = 0;
 
@@ -1845,44 +1873,58 @@ int sprdwl_intf_init(struct sprdwl_priv *priv, struct sprdwl_intf *intf)
 			if (ret < 0)
 				goto err;
 		}
-
-		g_intf_ops.intf = (void *)intf;
-		/* TODO: Need we reserve g_intf_ops? */
-		intf->hw_intf = (void *)&g_intf_ops;
-
-		priv->hw_priv = intf;
-		priv->hw_offset = intf->hif_offset;
-		intf->priv = priv;
-		intf->fw_awake = 1;
-		intf->fw_power_down = 0;
-		intf->txnum_level = BOOST_TXNUM_LEVEL;
-		intf->rxnum_level = BOOST_RXNUM_LEVEL;
-		intf->boost = 0;
-#ifdef UNISOC_WIFI_PS
-		init_completion(&intf->suspend_completed);
-#endif
-	} else {
+		return 0;
+	}
 err:
-		wl_err("%s: unregister %d ops\n",
-		       __func__, g_intf_ops.max_num);
+	wl_err("%s: unregister %d ops\n",
+			 __func__, g_intf_ops.max_num);
 
-		for (; chn > 0; chn--)
-			sprdwcn_bus_chn_deinit(&g_intf_ops.hif_ops[chn]);
+	for (; chn > 0; chn--)
+		sprdwcn_bus_chn_deinit(&g_intf_ops.hif_ops[chn]);
 
-		g_intf_ops.hif_ops = NULL;
-		g_intf_ops.max_num = 0;
-	}
+	g_intf_ops.hif_ops = NULL;
+	g_intf_ops.max_num = 0;
 
 	return ret;
 }
 
-void sprdwl_intf_deinit(struct sprdwl_intf *dev)
+void sprdwl_bus_deinit(void)
 {
 	int chn = 0;
 
 	for (chn = 0; chn < g_intf_ops.max_num; chn++)
 		sprdwcn_bus_chn_deinit(&g_intf_ops.hif_ops[chn]);
+}
+
+int sprdwl_intf_init(struct sprdwl_priv *priv, struct sprdwl_intf *intf)
+{
+	int ret = -EINVAL;
 
+	ret = sprdwl_bus_init(priv);
+	if (ret < 0)
+		return ret;
+
+	g_intf_ops.intf = (void *)intf;
+	/* TODO: Need we reserve g_intf_ops? */
+	intf->hw_intf = (void *)&g_intf_ops;
+
+	priv->hw_priv = intf;
+	priv->hw_offset = intf->hif_offset;
+	intf->priv = priv;
+	intf->fw_awake = 1;
+	intf->fw_power_down = 0;
+	intf->txnum_level = BOOST_TXNUM_LEVEL;
+	intf->rxnum_level = BOOST_RXNUM_LEVEL;
+	intf->boost = 0;
+#ifdef UNISOC_WIFI_PS
+	init_completion(&intf->suspend_completed);
+#endif
+
+	return ret;
+}
+
+void sprdwl_intf_deinit(struct sprdwl_intf *dev)
+{
 	g_intf_ops.intf = NULL;
 	g_intf_ops.max_num = 0;
 	dev->hw_intf = NULL;
@@ -1894,8 +1936,8 @@ int sprdwl_dis_flush_txlist(struct sprdwl_intf *intf, u8 lut_index)
 	int i, j;
 
 	if (lut_index <= 5) {
-		wl_err("err lut_index:%d, %s, %d\n",
-				lut_index, __func__, __LINE__);
+		//wl_err("err lut_index:%d, %s, %d\n",
+		//		lut_index, __func__, __LINE__);
 		return -1;
 	}
 	wl_debug("disconnect, flush qoslist, %s, %d\n", __func__, __LINE__);
diff --git a/drivers/net/wireless/uwe5622/unisocwifi/wl_intf.h b/drivers/net/wireless/uwe5622/unisocwifi/wl_intf.h
index e55a35a66..b159c685a 100644
--- a/drivers/net/wireless/uwe5622/unisocwifi/wl_intf.h
+++ b/drivers/net/wireless/uwe5622/unisocwifi/wl_intf.h
@@ -299,4 +299,5 @@ void sprdwl_boost(void);
 void sprdwl_unboost(void);
 void adjust_txnum_level(char *buf, unsigned char offset);
 void adjust_rxnum_level(char *buf, unsigned char offset);
+void sprdwl_bus_deinit(void);
 #endif /* __SPRDWL_INTF_SDIO_SC2355_H__ */
diff --git a/drivers/net/wireless/uwe5622/unisocwifi/work.c b/drivers/net/wireless/uwe5622/unisocwifi/work.c
index b7c0c8bbb..4d7e016ea 100644
--- a/drivers/net/wireless/uwe5622/unisocwifi/work.c
+++ b/drivers/net/wireless/uwe5622/unisocwifi/work.c
@@ -44,7 +44,7 @@ static struct sprdwl_work *sprdwl_get_work(struct sprdwl_priv *priv)
 	spin_lock_bh(&priv->work_lock);
 	if (!list_empty(&priv->work_list)) {
 		sprdwl_work = list_first_entry(&priv->work_list,
-					       struct sprdwl_work, list);
+						   struct sprdwl_work, list);
 		list_del(&sprdwl_work->list);
 	}
 	spin_unlock_bh(&priv->work_lock);
@@ -76,21 +76,21 @@ static void sprdwl_do_work(struct work_struct *work)
 		case SPRDWL_WORK_REG_MGMT:
 			reg_mgmt = (struct sprdwl_reg_mgmt *)sprdwl_work->data;
 			sprdwl_register_frame(priv, vif->ctx_id,
-					      reg_mgmt->type,
-					      reg_mgmt->reg ? 1 : 0);
+						  reg_mgmt->type,
+						  reg_mgmt->reg ? 1 : 0);
 			break;
 		case SPRDWL_WORK_DEAUTH:
 		case SPRDWL_WORK_DISASSOC:
 			cfg80211_rx_unprot_mlme_mgmt(vif->ndev,
-						     sprdwl_work->data,
-						     sprdwl_work->len);
+							 sprdwl_work->data,
+							 sprdwl_work->len);
 			break;
 		case SPRDWL_WORK_MC_FILTER:
 			if (vif->mc_filter->mc_change)
 				sprdwl_set_mc_filter(priv, vif->ctx_id,
-						     vif->mc_filter->subtype,
-						     vif->mc_filter->mac_num,
-						     vif->mc_filter->mac_addr);
+							 vif->mc_filter->subtype,
+							 vif->mc_filter->mac_num,
+							 vif->mc_filter->mac_addr);
 			break;
 		case SPRDWL_WORK_NOTIFY_IP:
 			sprdwl_notify_ip(priv, vif->ctx_id, SPRDWL_IPV6,
@@ -99,10 +99,10 @@ static void sprdwl_do_work(struct work_struct *work)
 		case SPRDWL_WORK_BA_MGMT:
 			ba_data = (struct sprdwl_ba_event_data *)sprdwl_work->data;
 			sprdwl_send_ba_mgmt(priv, vif->ctx_id,
-					    &ba_data->addba_rsp,
-					    sizeof(ba_data->addba_rsp));
+						&ba_data->addba_rsp,
+						sizeof(ba_data->addba_rsp));
 			sprdwl_active_ba_node(ba_data->ba_entry, ba_data->sta_lut_index,
-					      ba_data->addba_rsp.tid);
+						  ba_data->addba_rsp.tid);
 			break;
 		case SPRDWL_WORK_ADDBA:
 			sprdwl_tx_send_addba(vif, sprdwl_work->data,
@@ -148,8 +148,8 @@ static void sprdwl_do_work(struct work_struct *work)
 			break;
 		case SPRDWL_WORK_VOWIFI_DATA_PROTECTION:
 			sprdwl_send_vowifi_data_prot(vif->priv, vif->ctx_id,
-						     sprdwl_work->data,
-						     sprdwl_work->len);
+							 sprdwl_work->data,
+							 sprdwl_work->len);
 			break;
 		default:
 			wl_ndev_log(L_DBG, vif->ndev, "Unknown delayed work: %d\n",
@@ -162,7 +162,7 @@ static void sprdwl_do_work(struct work_struct *work)
 }
 
 void sprdwl_queue_work(struct sprdwl_priv *priv,
-		       struct sprdwl_work *sprdwl_work)
+			   struct sprdwl_work *sprdwl_work)
 {
 	spin_lock_bh(&priv->work_lock);
 	list_add_tail(&sprdwl_work->list, &priv->work_list);
-- 
2.34.1

