diff --git a/LICENSE b/LICENSE
deleted file mode 100644
index 77f59ed..0000000
--- a/LICENSE
+++ /dev/null
@@ -1,31 +0,0 @@
-Copyright Statement:
-
-This software/firmware and related documentation ("MediaTek Software") are
-protected under relevant copyright laws. The information contained herein is
-confidential and proprietary to MediaTek Inc. and/or its licensors. Without
-the prior written permission of MediaTek inc. and/or its licensors, any
-reproduction, modification, use or disclosure of MediaTek Software, and
-information contained herein, in whole or in part, shall be strictly
-prohibited.
-
-MediaTek Inc. (C) 2015. All rights reserved.
-
-BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
-THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
-RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
-ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL
-WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
-WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
-NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH
-RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
-INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES
-TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
-RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
-OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK
-SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE
-RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
-STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S
-ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE
-RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE
-MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
-CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
diff --git a/Makefile b/Makefile
old mode 100755
new mode 100644
index c9f04c5..b5b6c23
--- a/Makefile
+++ b/Makefile
@@ -1,63 +1,32 @@
-export KERNEL_SRC := /lib/modules/$(shell uname -r)/build
 
-$(warning $(CC))
+export KERNEL_SRC := /lib/modules/$(shell uname -r)/build
 ###############################################################################
 # USB
 ###############################################################################
-USB_MOD_NAME = btmtk_usb
-USB_CFILES := \
-	btmtk_usb_main.c \
-	btmtk_usb_dbgfs.c \
-	btmtk_usb_fifo.c
-$(USB_MOD_NAME)-objs := $(USB_CFILES:.c=.o)
-
 ###############################################################################
 # SDIO
 ###############################################################################
+VPATH = /opt/toolchains/gcc-linaro-aarch64-linux-gnu-4.9-2014.09_linux
 SDIO_MOD_NAME = btmtksdio
 SDIO_CFILES := \
 	btmtk_sdio.c btmtk_main.c
 $(SDIO_MOD_NAME)-objs := $(SDIO_CFILES:.c=.o)
-
 ###############################################################################
 # Common
 ###############################################################################
-ifeq ($(PLATFORM),MT8516_YOCTO)
 obj-m := $(SDIO_MOD_NAME).o
-else
-obj-m := $(USB_MOD_NAME).o $(SDIO_MOD_NAME).o
-endif
-
 all:
 	make -C $(KERNEL_SRC) M=$(PWD) modules
 
-usb:
-	make -C $(KERNEL_SRC) M=$(PWD) $(USB_MOD_NAME).ko
-
-sdio:
-ifeq ($(PLATFORM),MT8516_YOCTO)
-	make -C $(LINUX_SRC) M=$(PWD) modules
-else
-	make -C $(KERNEL_SRC) M=$(PWD) $(SDIO_MOD_NAME).ko
-endif
-
 clean:
 	make -C $(KERNEL_SRC) M=$(PWD) clean
-
 # Check coding style
 export IGNORE_CODING_STYLE_RULES := NEW_TYPEDEFS,LEADING_SPACE,CODE_INDENT,SUSPECT_CODE_INDENT
 ccs:
-	./util/checkpatch.pl --no-tree --show-types --max-line-length=120 --ignore $(IGNORE_CODING_STYLE_RULES) -f btmtk_usb_main.c
-	./util/checkpatch.pl --no-tree --show-types --max-line-length=120 --ignore $(IGNORE_CODING_STYLE_RULES) -f btmtk_usb_main.h
 	./util/checkpatch.pl --no-tree --show-types --max-line-length=120 --ignore $(IGNORE_CODING_STYLE_RULES) -f btmtk_config.h
 	./util/checkpatch.pl --no-tree --show-types --max-line-length=120 --ignore $(IGNORE_CODING_STYLE_RULES) -f btmtk_define.h
-	./util/checkpatch.pl --no-tree --show-types --max-line-length=120 --ignore $(IGNORE_CODING_STYLE_RULES) -f btmtk_usb_dbgfs.c
-	./util/checkpatch.pl --no-tree --show-types --max-line-length=120 --ignore $(IGNORE_CODING_STYLE_RULES) -f btmtk_usb_dbgfs.h
-	./util/checkpatch.pl --no-tree --show-types --max-line-length=120 --ignore $(IGNORE_CODING_STYLE_RULES) -f btmtk_usb_fifo.c
-	./util/checkpatch.pl --no-tree --show-types --max-line-length=120 --ignore $(IGNORE_CODING_STYLE_RULES) -f btmtk_usb_fifo.h
 	./util/checkpatch.pl --no-tree --show-types --max-line-length=120 --ignore $(IGNORE_CODING_STYLE_RULES) -f btmtk_drv.h
 	./util/checkpatch.pl --no-tree --show-types --max-line-length=120 --ignore $(IGNORE_CODING_STYLE_RULES) -f btmtk_main.c
 	./util/checkpatch.pl --no-tree --show-types --max-line-length=120 --ignore $(IGNORE_CODING_STYLE_RULES) -f btmtk_sdio.c
 	./util/checkpatch.pl --no-tree --show-types --max-line-length=120 --ignore $(IGNORE_CODING_STYLE_RULES) -f btmtk_sdio.h
 
-
diff --git a/btmtk_config.h b/btmtk_config.h
index 8e4445f..9e958ea 100644
--- a/btmtk_config.h
+++ b/btmtk_config.h
@@ -1,15 +1,16 @@
 /*
-*  Copyright (c) 2016 MediaTek Inc.
-*
-*  This program is free software; you can redistribute it and/or modify
-*  it under the terms of the GNU General Public License version 2 as
-*  published by the Free Software Foundation.
-*
-*  This program is distributed in the hope that it will be useful,
-*  but WITHOUT ANY WARRANTY; without even the implied warranty of
-*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-*  GNU General Public License for more details.
-*/
+ *  Copyright (c) 2016,2017 MediaTek Inc.
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License version 2 as
+ *  published by the Free Software Foundation.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ *  See http://www.gnu.org/licenses/gpl-2.0.html for more details.
+ */
+
 #ifndef __BTMTK_CONFIG_H__
 #define __BTMTK_CONFIG_H__
 
@@ -39,22 +40,7 @@
  */
 /* #define BTMTK_LOG_PATH	"/data/misc/bluedroid/" */
 
-/**
- * USB device ID configureation
- */
-static struct usb_device_id btmtk_usb_table[] = {
-#if SUPPORT_MT7662
-	{USB_DEVICE_AND_INTERFACE_INFO(0x0e8d, 0x7662, 0xe0, 0x01, 0x01), .bInterfaceNumber = 0},	/* MT7662U */
-	{USB_DEVICE_AND_INTERFACE_INFO(0x0e8d, 0x7632, 0xe0, 0x01, 0x01), .bInterfaceNumber = 0},	/* MT7632U */
-	{USB_DEVICE_AND_INTERFACE_INFO(0x0e8d, 0x76a0, 0xe0, 0x01, 0x01), .bInterfaceNumber = 0},	/* MT7662T */
-	{USB_DEVICE_AND_INTERFACE_INFO(0x0e8d, 0x76a1, 0xe0, 0x01, 0x01), .bInterfaceNumber = 0},	/* MT7632T */
-#endif
 
-#if SUPPORT_MT7668
-	{USB_DEVICE_AND_INTERFACE_INFO(0x0e8d, 0x7668, 0xe0, 0x01, 0x01), .bInterfaceNumber = 0},
-#endif
-	{}
-};
 
 /**
  * Fixed STPBT Major Device Id
@@ -72,10 +58,10 @@
 /**
  * WoBLE by BLE RC
  */
-#ifndef SUPPORT_LEGACY_WOBLE
-	#define SUPPORT_LEGACY_WOBLE 0
-	#define BT_RC_VENDOR_DEFAULT 1
-	#define BT_RC_VENDOR_S0 0
-#endif
+#define SUPPORT_ANDROID 0 /*Linux build fail due to wake_lock, please set SUPPORT_ANDROID 0 for Linux*/
+#define SUPPORT_UNIFY_WOBLE 1
+#define SUPPORT_LEGACY_WOBLE 0
+#define BT_RC_VENDOR_DEFAULT 1
+#define BT_RC_VENDOR_S0 0
 
 #endif /* __BTMTK_CONFIG_H__ */
diff --git a/btmtk_define.h b/btmtk_define.h
index 91b2a96..3c34a9e 100644
--- a/btmtk_define.h
+++ b/btmtk_define.h
@@ -1,15 +1,16 @@
 /*
-*  Copyright (c) 2016 MediaTek Inc.
-*
-*  This program is free software; you can redistribute it and/or modify
-*  it under the terms of the GNU General Public License version 2 as
-*  published by the Free Software Foundation.
-*
-*  This program is distributed in the hope that it will be useful,
-*  but WITHOUT ANY WARRANTY; without even the implied warranty of
-*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-*  GNU General Public License for more details.
-*/
+ *  Copyright (c) 2016,2017 MediaTek Inc.
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License version 2 as
+ *  published by the Free Software Foundation.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ *  See http://www.gnu.org/licenses/gpl-2.0.html for more details.
+ */
+
 #ifndef __BTMTK_DEFINE_H__
 #define __BTMTK_DEFINE_H__
 
@@ -67,6 +68,32 @@
 		}								\
 	} while (0)
 
+#define BTSDIO_INFO_RAW(p, l, fmt, ...)						\
+	do {									\
+		{			\
+			int raw_count = 0;					\
+			const unsigned char *ptr = p;				\
+			pr_info("[btmtk_info] "fmt, ##__VA_ARGS__);		\
+			for (raw_count = 0; raw_count <= l; ++raw_count) {	\
+				pr_info(" %02X", ptr[raw_count]);		\
+			}							\
+			pr_info("\n");						\
+		}								\
+	} while (0)
+
+#define BTSDIO_DEBUG_RAW(p, l, fmt, ...)						\
+	do {									\
+		{			\
+			int raw_count = 0;					\
+			const unsigned char *ptr = p;				\
+			pr_debug("[btmtk_info] "fmt, ##__VA_ARGS__);		\
+			for (raw_count = 0; raw_count <= l; ++raw_count) {	\
+				pr_debug(" %02X", ptr[raw_count]);		\
+			}							\
+			pr_debug("\n");						\
+		}								\
+	} while (0)
+
 #else /* CONFIG_DEBUG_FS */
 
 #define BTUSB_ERR(fmt, ...)	 pr_warn("[btmtk_err] "fmt"\n", ##__VA_ARGS__)
@@ -74,6 +101,7 @@
 #define BTUSB_INFO(fmt, ...)	pr_warn("[btmtk_info] "fmt"\n", ##__VA_ARGS__)
 #define BTUSB_DBG(fmt, ...)
 #define BTUSB_DBG_RAW(p, l, fmt, ...)
+#define BTUSB_INFO_RAW(p, l, fmt, ...)
 
 #endif /* CONFIG_DEBUG_FS */
 
@@ -126,6 +154,7 @@
 #define USB_CTRL_IO_TIMO	100
 #define USB_INTR_MSG_TIMO	2000
 
+
 /**
  * USB request type definition
  */
@@ -153,7 +182,7 @@
 #define PATCH_PHASE2		2
 #define PATCH_PHASE3		3
 
-#define META_BUFFER_SIZE	(1024 * 500)
+
 #define USB_IO_BUF_SIZE		(HCI_MAX_EVENT_SIZE > 256 ? HCI_MAX_EVENT_SIZE : 256)
 #define HCI_SNOOP_ENTRY_NUM	30
 #define HCI_SNOOP_BUF_SIZE	32
@@ -175,4 +204,6 @@
  */
 #define MAX_BIN_FILE_NAME_LEN 32
 
+
+
 #endif /* __BTMTK_DEFINE_H__ */
diff --git a/btmtk_drv.h b/btmtk_drv.h
old mode 100755
new mode 100644
index 308fc3d..ff47547
--- a/btmtk_drv.h
+++ b/btmtk_drv.h
@@ -1,21 +1,14 @@
 /*
- * Mediatek Bluetooth driver: global definitions & declarations
+ *  Copyright (c) 2016,2017 MediaTek Inc.
  *
- * Copyright (C) 2017, Mediatek International Ltd.
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License version 2 as
+ *  published by the Free Software Foundation.
  *
- * This software file (the "File") is distributed by Mediatek International
- * Ltd. under the terms of the GNU General Public License Version 2, June 1991
- * (the "License").  You may use, redistribute and/or modify this File in
- * accordance with the terms and conditions of the License, a copy of which
- * is available by writing to the Free Software Foundation, Inc.,
- * On the worldwide web at http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
- *
- *
- * THE FILE IS DISTRIBUTED AS-IS, WITHOUT WARRANTY OF ANY KIND, AND THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE
- * ARE EXPRESSLY DISCLAIMED.  The License provides additional details about
- * this warranty disclaimer.
- *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ *  See http://www.gnu.org/licenses/gpl-2.0.html for more details.
  */
 
 #ifndef _BTMTK_DRV_H_
@@ -43,11 +36,11 @@
 #define BTMTK_BIN_FILE_MODE 1
 #if BTMTK_BIN_FILE_MODE
 /** For 7668 please storage cfg/bin file in ${firmware} */
-#define E2P_ACCESS_MODE_SWITCHER_7668	"bt.cfg"
-#define E2P_BIN_FILE_7668		"EEPROM_MT7668.bin"
+#define E2P_ACCESS_MODE_SWITCHER	"wifi.cfg"
+#define E2P_BIN_FILE			"EEPROM_MT%X.bin"
 
-#define E2P_MODE	"E2pAccessMode"
-#define BIN_FILE_MODE	'4'
+#define E2P_MODE	"EfuseBufferModeCal"
+#define BIN_FILE_MODE	'1'
 #endif
 
 enum rdwr_status {
@@ -179,6 +172,9 @@
 
 #define FW_DUMP_FILE_NAME_SIZE     64
 
+#define EVENT_COMPARE_SIZE     64
+
+
 /* #define SAVE_FW_DUMP_IN_KERNEL     1 */
 
 /* stpbt device node */
@@ -228,7 +224,7 @@
 #define FIXED_STPBT_MAJOR_DEV_ID 111
 
 
-#define FW_DUMP_FILE_NAME "/tmp/log"
+
 #define FW_DUMP_END_EVENT "coredump end"
 
 #endif
diff --git a/btmtk_main.c b/btmtk_main.c
old mode 100755
new mode 100644
index 51c1749..f805367
--- a/btmtk_main.c
+++ b/btmtk_main.c
@@ -1,21 +1,16 @@
 /*
- * Mediatek Bluetooth driver
+ *  Copyright (c) 2016,2017 MediaTek Inc.
  *
- * Copyright (C) 2017, Mediatek International Ltd.
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License version 2 as
+ *  published by the Free Software Foundation.
  *
- * This software file (the "File") is distributed by Mediatek International
- * Ltd. under the terms of the GNU General Public License Version 2, June 1991
- * (the "License").  You may use, redistribute and/or modify this File in
- * accordance with the terms and conditions of the License, a copy of which
- * is available by writing to the Free Software Foundation, Inc.,
- * On the worldwide web at http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
- *
- *
- * THE FILE IS DISTRIBUTED AS-IS, WITHOUT WARRANTY OF ANY KIND, AND THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE
- * ARE EXPRESSLY DISCLAIMED.  The License provides additional details about
- * this warranty disclaimer.
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ *  See http://www.gnu.org/licenses/gpl-2.0.html for more details.
  */
+
 #include <linux/version.h>
 #include <linux/module.h>
 #include <linux/of.h>
diff --git a/btmtk_sdio.c b/btmtk_sdio.c
old mode 100755
new mode 100644
index 0fd40d1..b3fd4c4
--- a/btmtk_sdio.c
+++ b/btmtk_sdio.c
@@ -1,21 +1,17 @@
 /*
- * Mediatek BT-over-SDIO driver: SDIO interface related functions.
- * Copyright (C) 2017, Mediatek International Ltd.
+ *  Copyright (c) 2016,2017 MediaTek Inc.
  *
- * This software file (the "File") is distributed by Mediatek International
- * Ltd. under the terms of the GNU General Public License Version 2, June 1991
- * (the "License").  You may use, redistribute and/or modify this File in
- * accordance with the terms and conditions of the License, a copy of which
- * is available by writing to the Free Software Foundation, Inc.,
- * On the worldwide web at http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License version 2 as
+ *  published by the Free Software Foundation.
  *
- *
- * THE FILE IS DISTRIBUTED AS-IS, WITHOUT WARRANTY OF ANY KIND, AND THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE
- * ARE EXPRESSLY DISCLAIMED.  The License provides additional details about
- * this warranty disclaimer.
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ *  See http://www.gnu.org/licenses/gpl-2.0.html for more details.
  */
 
+#include "btmtk_config.h"
 #include <linux/version.h>
 #include <linux/firmware.h>
 #include <linux/slab.h>
@@ -36,15 +32,9 @@
 #include <linux/kallsyms.h>
 #include <linux/device.h>
 
-
+#include "btmtk_define.h"
 #include "btmtk_drv.h"
 #include "btmtk_sdio.h"
-#ifdef BT_SUPPORT_PMU_EN_CTRL
-#include "mt7668_wmt.h"
-#endif
-#ifdef BT_DRIVER_BUILD_MODULE
-void sdio_card_detect(int card_present);
-#endif
 
 static dev_t g_devIDfwlog;
 static struct class *pBTClass;
@@ -53,6 +43,7 @@
 static wait_queue_head_t inq;
 static wait_queue_head_t fw_log_inq;
 static struct fasync_struct *fasync;
+/*static int btmtk_woble_state = BTMTK_WOBLE_STATE_UNKNOWN;*/
 
 static int need_reset_stack;
 /* The btmtk_sdio_remove() callback function is called
@@ -69,10 +60,6 @@
  * is removed, and will be set to TRUE for module removal when
  * module_exit function is called.
  */
-typedef void (*register_sdio_early_suspend) (void (*f) (void));
-typedef void (*register_sdio_late_resume) (void (*f) (void));
-register_sdio_early_suspend register_sdio_early_suspend_func;
-register_sdio_late_resume register_sdio_late_resume_func;
 
 /*============================================================================*/
 /* Callback Functions */
@@ -85,12 +72,23 @@
 unsigned char current_fwdump_file_number;
 struct btmtk_private *g_priv;
 #define STR_COREDUMP_END "coredump end\n\n"
-
+const u8 READ_ADDRESS_EVENT[] = { 0x0e, 0x0a, 0x01, 0x09, 0x10, 0x00 };
 
 static struct ring_buffer metabuffer;
 u8 probe_ready;
 
 static char fw_dump_file_name[FW_DUMP_FILE_NAME_SIZE] = {0};
+static char event_need_compare[EVENT_COMPARE_SIZE] = {0};
+static char event_need_compare_len;
+static char event_compare_status;
+/*add special header in the beginning of even, stack won't recognize these event*/
+static char event_add_spec_header_status;
+
+struct _OSAL_UNSLEEPABLE_LOCK_ event_compare_status_lock;
+struct _OSAL_UNSLEEPABLE_LOCK_ tx_function_lock;
+
+
+
 int fw_dump_buffer_full;
 int fw_dump_total_read_size;
 int fw_dump_total_write_size;
@@ -126,6 +124,7 @@
 	.io_port_2 = 0x02,
 	.int_read_to_clear = false,
 	.func_num = 2,
+	.chip_id = 0x6630,
 };
 
 static const struct btmtk_sdio_card_reg btmtk_reg_6632 = {
@@ -144,6 +143,7 @@
 	.io_port_2 = 0x02,
 	.int_read_to_clear = false,
 	.func_num = 2,
+	.chip_id = 0x6632,
 };
 
 static const struct btmtk_sdio_card_reg btmtk_reg_7668 = {
@@ -162,6 +162,7 @@
 	.io_port_2 = 0x02,
 	.int_read_to_clear = false,
 	.func_num = 2,
+	.chip_id = 0x7668,
 };
 
 static const struct btmtk_sdio_card_reg btmtk_reg_7666 = {
@@ -180,6 +181,7 @@
 	.io_port_2 = 0x02,
 	.int_read_to_clear = false,
 	.func_num = 2,
+	.chip_id = 0x7666,
 };
 
 static const struct btmtk_sdio_device btmtk_sdio_6630 = {
@@ -254,6 +256,254 @@
 MODULE_DEVICE_TABLE(sdio, btmtk_sdio_ids);
 
 
+static void btmtk_sdio_woble_free_setting_struct(struct woble_setting_struct *woble_struct, int count)
+{
+	int i = 0;
+
+	for (i = 0; i < count; i++) {
+		if (woble_struct[i].content) {
+			pr_info("%s:kfree %d", __func__, i);
+			kfree(woble_struct[i].content);
+			woble_struct[i].content = NULL;
+			woble_struct[i].length = 0;
+		} else
+			woble_struct[i].length = 0;
+	}
+}
+
+static void btmtk_sdio_woble_free_setting(void)
+{
+	pr_info("%s begin", __func__);
+	if (g_card == NULL) {
+		pr_err("%s: g_data == NULL", __func__);
+		return;
+	}
+
+	btmtk_sdio_woble_free_setting_struct(g_card->woble_setting_apcf, WOBLE_SETTING_COUNT);
+	btmtk_sdio_woble_free_setting_struct(g_card->woble_setting_apcf_fill_mac, WOBLE_SETTING_COUNT);
+	btmtk_sdio_woble_free_setting_struct(g_card->woble_setting_apcf_fill_mac_location, WOBLE_SETTING_COUNT);
+	btmtk_sdio_woble_free_setting_struct(g_card->woble_setting_radio_off, WOBLE_SETTING_COUNT);
+	btmtk_sdio_woble_free_setting_struct(g_card->woble_setting_radio_off_status_event, WOBLE_SETTING_COUNT);
+	btmtk_sdio_woble_free_setting_struct(g_card->woble_setting_radio_off_comp_event, WOBLE_SETTING_COUNT);
+	btmtk_sdio_woble_free_setting_struct(g_card->woble_setting_radio_on, WOBLE_SETTING_COUNT);
+	btmtk_sdio_woble_free_setting_struct(g_card->woble_setting_radio_on_status_event, WOBLE_SETTING_COUNT);
+	btmtk_sdio_woble_free_setting_struct(g_card->woble_setting_radio_on_comp_event, WOBLE_SETTING_COUNT);
+
+	if (g_card->woble_setting_len) {
+		kfree(g_card->woble_setting);
+		g_card->woble_setting_len = 0;
+		g_card->woble_setting = NULL;
+	}
+	pr_info("%s end", __func__);
+}
+
+static int btmtk_sdio_load_woble_block_setting(char *block_name, struct woble_setting_struct *save_content,
+			int save_content_count, u8 *searchconetnt)
+{
+	int ret = 0;
+	int i = 0;
+	long parsing_result = 0;
+	u8 *search_result = NULL;
+	u8 *search_end = NULL;
+	u8 search[32];
+	u8 temp[128]; /* save for total hex number */
+	u8 *next_number = NULL;
+	u8 *next_block = NULL;
+	u8 number[8];
+	int temp_len;
+
+	memset(search, 0, sizeof(search));
+	memset(temp, 0, sizeof(temp));
+	memset(number, 0, sizeof(number));
+
+	/* search block name */
+	for (i = 0; i < WOBLE_SETTING_COUNT; i++) {
+		temp_len = 0;
+		snprintf(search, sizeof(search), "%s%02d:", block_name, i); /* ex APCF01 */
+		search_result = strstr(searchconetnt, search);
+		if (search_result) {
+			memset(temp, 0, sizeof(temp));
+			temp_len = 0;
+			search_result += strlen(search); /* move to first number */
+
+			do {
+				next_number = NULL;
+				search_end = strstr(search_result, ",");
+				if ((search_end - search_result) <= 0) {
+					pr_info("%s can not find search end, break", __func__);
+					break;
+				}
+
+				if ((search_end - search_result) > sizeof(number))
+					break;
+
+				memset(number, 0, sizeof(number));
+				memcpy(number, search_result, search_end - search_result);
+
+				if (number[0] == 0x20) /* space */
+					ret = kstrtol(number + 1, 0, &parsing_result);
+				else
+					ret = kstrtol(number, 0, &parsing_result);
+
+				if (ret == 0) {
+					if (temp_len >= sizeof(temp)) {
+						pr_err("%s: %s data over %zu", __func__, search, sizeof(temp));
+						break;
+					}
+					temp[temp_len] = parsing_result;
+					temp_len++;
+					/* find next number */
+					next_number = strstr(search_end, "0x");
+
+					/* find next block */
+					next_block = strstr(search_end, ":");
+				} else {
+					pr_debug("%s:kstrtol ret = %d, search %s", __func__, ret, search);
+					break;
+				}
+
+				if (next_number == NULL) {
+					pr_debug("%s: not find next apcf number temp_len %d, break, search %s",
+						__func__, temp_len, search);
+					break;
+				}
+
+				if ((next_number > next_block) && (next_block != 0)) {
+					pr_debug("%s: find next apcf number is over to next block ", __func__);
+					pr_debug("%s: temp_len %d, break, search %s",
+						__func__, temp_len, search);
+					break;
+				}
+
+				search_result = search_end + 1;
+			} while (1);
+		} else
+			pr_debug("%s: %s is not found", __func__, search);
+
+		if (temp_len) {
+			pr_info("%s: %s found", __func__, search);
+			pr_debug("%s: kzalloc i=%d temp_len=%d", __func__, i, temp_len);
+			save_content[i].content = kzalloc(temp_len, GFP_KERNEL);
+			memcpy(save_content[i].content, temp, temp_len);
+			save_content[i].length = temp_len;
+			pr_debug("%s:x  save_content[%d].length %d temp_len=%d",
+				__func__, i, save_content[i].length, temp_len);
+		}
+
+	}
+	return ret;
+}
+
+static int btmtk_sdio_load_woble_setting(u8 *image, char *bin_name,
+					 struct device *dev, u32 *code_len, struct btmtk_sdio_card *data)
+{
+	int err;
+	const struct firmware *fw_entry = NULL;
+
+	pr_info("%s: begin woble_setting_file_name = %s", __func__, bin_name);
+	err = request_firmware(&fw_entry, bin_name, dev);
+	if (err != 0) {
+		kfree(image);
+		image = NULL;
+		pr_err("%s: request_firmware function for woble setting  fail!! error code = %d", __func__, err);
+		return err;
+	}
+
+	if (fw_entry) {
+		image = kzalloc(fw_entry->size + 1, GFP_KERNEL); /* w:move to btmtk_usb_free_memory */
+		pr_info("%s: woble_setting request_firmware size %zu success", __func__, fw_entry->size);
+	} else {
+		pr_err("%s: fw_entry is NULL request_firmware may fail!! error code = %d", __func__, err);
+		return err;
+	}
+	if (image == NULL) {
+		pr_err("%s: kzalloc size %zu failed!!", __func__, fw_entry->size);
+		*code_len = 0;
+		return err;
+	}
+
+	memcpy(image, fw_entry->data, fw_entry->size);
+	image[fw_entry->size] = '\0';
+
+	*code_len = fw_entry->size;
+	pr_info("%s: code_len (%d) assign done", __func__, *code_len);
+
+	err = btmtk_sdio_load_woble_block_setting("APCF",
+			data->woble_setting_apcf, WOBLE_SETTING_COUNT, image);
+	if (err)
+		goto LOAD_END;
+
+	err = btmtk_sdio_load_woble_block_setting("APCF_ADD_MAC",
+			data->woble_setting_apcf_fill_mac, WOBLE_SETTING_COUNT, image);
+	if (err)
+		goto LOAD_END;
+
+	err = btmtk_sdio_load_woble_block_setting("APCF_ADD_MAC_LOCATION",
+			data->woble_setting_apcf_fill_mac_location, WOBLE_SETTING_COUNT, image);
+	if (err)
+		goto LOAD_END;
+
+	err = btmtk_sdio_load_woble_block_setting("RADIOOFF",
+			data->woble_setting_radio_off, WOBLE_SETTING_COUNT, image);
+	if (err)
+		goto LOAD_END;
+
+	err = btmtk_sdio_load_woble_block_setting("RADIOOFF_STATUS_EVENT",
+			data->woble_setting_radio_off_status_event, WOBLE_SETTING_COUNT, image);
+	if (err)
+		goto LOAD_END;
+
+	err = btmtk_sdio_load_woble_block_setting("RADIOOFF_COMPLETE_EVENT",
+			data->woble_setting_radio_off_comp_event, WOBLE_SETTING_COUNT, image);
+	if (err)
+		goto LOAD_END;
+
+	err = btmtk_sdio_load_woble_block_setting("RADIOON",
+			data->woble_setting_radio_on, WOBLE_SETTING_COUNT, image);
+	if (err)
+		goto LOAD_END;
+
+	err = btmtk_sdio_load_woble_block_setting("RADIOON_STATUS_EVENT",
+			data->woble_setting_radio_on_status_event, WOBLE_SETTING_COUNT, image);
+	if (err)
+		goto LOAD_END;
+
+	err = btmtk_sdio_load_woble_block_setting("RADIOON_COMPLETE_EVENT",
+			data->woble_setting_radio_on_comp_event, WOBLE_SETTING_COUNT, image);
+	if (err)
+		goto LOAD_END;
+
+	err = btmtk_sdio_load_woble_block_setting("APCF_RESMUE",
+		data->woble_setting_apcf_resume, WOBLE_SETTING_COUNT, image);
+	if (err)
+		goto LOAD_END;
+
+	err = btmtk_sdio_load_woble_block_setting("APCF_COMPLETE_EVENT",
+			data->woble_setting_apcf_resume, WOBLE_SETTING_COUNT, image);
+
+LOAD_END:
+	if (err)
+		pr_info("%s: error return %d", __func__, err);
+
+	return err;
+}
+
+static inline void btmtk_sdio_woble_wake_lock(struct btmtk_sdio_card *data)
+{
+#if (SUPPORT_UNIFY_WOBLE & SUPPORT_ANDROID)
+	BTUSB_INFO("%s:", __func__);
+	wake_lock(&data->woble_wlock);
+#endif
+}
+
+static inline void btmtk_sdio_woble_wake_unlock(struct btmtk_sdio_card *data)
+{
+#if (SUPPORT_UNIFY_WOBLE & SUPPORT_ANDROID)
+	BTUSB_INFO("%s:", __func__);
+	wake_unlock(&data->woble_wlock);
+#endif
+}
+
 u32 lock_unsleepable_lock(struct _OSAL_UNSLEEPABLE_LOCK_ *pUSL)
 {
 	spin_lock_irqsave(&(pUSL->lock), pUSL->flag);
@@ -776,7 +1026,7 @@
 			pr_warn("%s: retry over 2s, retrytime %d\n",
 				__func__, retrytime);
 
-		pr_info("%s: retrytime %d\n", __func__, retrytime);
+		pr_debug("%s: retrytime %d\n", __func__, retrytime);
 	} while (!rxbuf[0]);
 
 
@@ -791,38 +1041,6 @@
 }
 
 #if BTMTK_BIN_FILE_MODE
-static void GetRandomValue(u8 string[6], bool is7668)
-{
-	int iRandom = 0;
-
-	pr_info("Enable random generation\n");
-
-	/* first random */
-	get_random_bytes(&iRandom, sizeof(int));
-	pr_info("iRandom = [%d]", iRandom);
-	string[0] = (((iRandom>>24|iRandom>>16) & (0xFE)) | (0x02)); /* Must use private bit(1) and no BCMC bit(0) */
-
-	/* second random */
-	get_random_bytes(&iRandom, sizeof(int));
-	pr_info("iRandom = [%d]", iRandom);
-	string[1] = ((iRandom>>8) & 0xFF);
-
-	/* third random */
-	get_random_bytes(&iRandom, sizeof(int));
-	pr_info("iRandom = [%d]", iRandom);
-	string[5] = (iRandom & 0xFF);
-
-	/*  */
-	string[2] = 0x46;
-	if (is7668)
-		string[3] = 0x68;
-	else
-		string[3] = 0x62;
-	string[4] = 0x76;
-
-	return;
-}
-
 static int btmtk_sdio_send_and_check(u8 *cmd, u16 cmd_len,
 						u8 *event, u16 event_len)
 {
@@ -864,25 +1082,59 @@
 	return ret;
 }
 
-static bool btmtk_is_bin_file_mode(uint8_t *buf)
+static bool btmtk_is_bin_file_mode(uint8_t *buf, size_t buf_size)
 {
-	char *ptr = NULL;
+	char *p_buf = NULL;
+	char *ptr = NULL, *p = NULL;
+	bool ret = true;
+
+	if (!buf) {
+		pr_warn("%s: buf is null\n", __func__);
+		return false;
+	} else if (buf_size < (strlen(E2P_MODE) + 2)) {
+		pr_warn("%s: incorrect buf size(%d)\n",
+			__func__, (int)buf_size);
+		return false;
+	}
+
+	p_buf = kmalloc(buf_size + 1, GFP_KERNEL);
+	if (!p_buf) {
+		pr_warn("%s: alloc p_buf failed\n", __func__);
+		return false;
+	}
+	memcpy(p_buf, buf, buf_size);
+	p_buf[buf_size] = '\0';
 
 	/* find string */
-	ptr = strstr(buf, E2P_MODE);
+	p = ptr = strstr(p_buf, E2P_MODE);
 	if (!ptr) {
 		pr_notice("%s: Can't find %s\n", __func__, E2P_MODE);
-		return false;
+		ret = false;
+		goto out;
+	}
+
+	if (p > p_buf) {
+		p--;
+		while ((*p == ' ') && (p != p_buf))
+			p--;
+		if (*p == '#') {
+			pr_notice("%s: It's not EEPROM - Bin file mode\n", __func__);
+			ret = false;
+			goto out;
+		}
 	}
 
 	/* check access mode */
 	ptr += (strlen(E2P_MODE) + 1);
-	pr_notice("%s: MODE: %c\n", __func__, *ptr);
 	if (*ptr != BIN_FILE_MODE) {
-		pr_notice("%s: It's not EEPROM - Bin file mode\n", __func__);
-		return false;
+		pr_notice("%s: It's not EEPROM - Bin file mode, mode: %c\n", __func__, *ptr);
+		ret = false;
+		goto out;
 	}
-	return true;
+
+out:
+	kfree(p_buf);
+	return ret;
 }
 
 static void btmtk_set_eeprom2ctrler(uint8_t *buf,
@@ -929,15 +1181,6 @@
 	set_bdaddr[7] = *(buf + offset + 3);
 	set_bdaddr[8] = *(buf + offset + 4);
 	set_bdaddr[9] = *(buf + offset + 5);
-
-	if (0x0 == set_bdaddr[4] ||
-		0x0 == set_bdaddr[5] ||
-		0x0 == set_bdaddr[6] ||
-		0x0 == set_bdaddr[7] ||
-		0x0 == set_bdaddr[8] ||
-		0x0 == set_bdaddr[9]) {
-		GetRandomValue(&set_bdaddr[4], true);
-	}
 	ret = btmtk_sdio_send_and_check(set_bdaddr, sizeof(set_bdaddr),
 					set_bdaddr_e, sizeof(set_bdaddr_e));
 	pr_notice("%s: set BDAddress(%02X-%02X-%02X-%02X-%02X-%02X) %s\n",
@@ -1016,7 +1259,6 @@
 			ret < 0 ? "fail" : "OK");
 
 	/* XTAL setting */
-#if 0
 	if (is7668) {
 		offset = 0xF4;
 		/* BT default power */
@@ -1029,59 +1271,55 @@
 				set_xtal[4], set_xtal[5],
 				ret < 0 ? "fail" : "OK");
 	}
-#endif
 }
 
 static void btmtk_eeprom_bin_file(struct btmtk_sdio_card *card)
 {
 	char *cfg_file = NULL;
-	char *bin_file = NULL;
-	/* 7668 series */
+	char bin_file[32];
+
 	const struct firmware *cfg_fw = NULL;
 	const struct firmware *bin_fw = NULL;
 
-	/* For 76x8T series */
-	{
-		int ret = -1;
+	int ret = -1;
+	int chipid = card->func->device;
 
-		pr_notice("%s: 7668 series\n", __func__);
-		cfg_file = E2P_ACCESS_MODE_SWITCHER_7668;
-		bin_file = E2P_BIN_FILE_7668;
+	pr_notice("%s: %X series\n", __func__, chipid);
+	cfg_file = E2P_ACCESS_MODE_SWITCHER;
+	sprintf(bin_file, E2P_BIN_FILE, chipid);
 
-		usleep_range(10*1000, 15*1000);
+	usleep_range(10*1000, 15*1000);
 
-		/* request configure file */
-		ret = request_firmware(&cfg_fw, cfg_file, &card->func->dev);
-		if (ret < 0) {
-			if (ret == -ENOENT)
-				pr_notice("%s: Configure file not found, ignore EEPROM bin file\n",
-					__func__);
-			else
-				pr_notice("%s: request configure file fail(%d)\n",
-					__func__, ret);
-			return;
-		}
-
-		if (btmtk_is_bin_file_mode((uint8_t *)cfg_fw->data) == false)
-			goto exit2;
-
-		usleep_range(10*1000, 15*1000);
-
-		/* open bin file for EEPROM */
-		ret = request_firmware(&bin_fw, bin_file, &card->func->dev);
-		if (ret < 0) {
-			pr_notice("%s: request bin file fail(%d)\n",
+	/* request configure file */
+	ret = request_firmware(&cfg_fw, cfg_file, &card->func->dev);
+	if (ret < 0) {
+		if (ret == -ENOENT)
+			pr_notice("%s: Configure file not found, ignore EEPROM bin file\n",
+				__func__);
+		else
+			pr_notice("%s: request configure file fail(%d)\n",
 				__func__, ret);
-			goto exit2;
-		}
+		return;
+	}
 
-		/* set parameters to controller */
-		btmtk_set_eeprom2ctrler((uint8_t *)bin_fw->data,
-					bin_fw->size,
-					true);
+	if (btmtk_is_bin_file_mode((uint8_t *)cfg_fw->data, cfg_fw->size) == false)
+		goto exit2;
+
+	usleep_range(10*1000, 15*1000);
+
+	/* open bin file for EEPROM */
+	ret = request_firmware(&bin_fw, bin_file, &card->func->dev);
+	if (ret < 0) {
+		pr_notice("%s: request bin file fail(%d)\n",
+			__func__, ret);
 		goto exit2;
 	}
 
+	/* set parameters to controller */
+	btmtk_set_eeprom2ctrler((uint8_t *)bin_fw->data,
+				bin_fw->size,
+				(card->func->device == 0x7668 ? true : false));
+
 exit2:
 	if (cfg_fw)
 		release_firmware(cfg_fw);
@@ -1123,6 +1361,170 @@
 	return ret;
 }
 
+static int btmtk_sdio_host_to_card(struct btmtk_private *priv,
+				u8 *payload, u16 nb)
+{
+	struct btmtk_sdio_card *card = priv->btmtk_dev.card;
+	int ret = 0;
+	int i = 0;
+	u8 MultiBluckCount = 0;
+	u8 redundant = 0;
+
+	//lock_unsleepable_lock(&tx_function_lock);
+
+	if (payload != txbuf) {
+		memset(txbuf, 0, MTK_TXDATA_SIZE);
+		memcpy(txbuf, payload, nb);
+	}
+
+	if (!card || !card->func) {
+		pr_err("card or function is NULL!\n");
+		//unlock_unsleepable_lock(&tx_function_lock);
+		return -EINVAL;
+	}
+
+	MultiBluckCount = nb/SDIO_BLOCK_SIZE;
+	redundant = nb % SDIO_BLOCK_SIZE;
+
+	if (redundant)
+		nb = (MultiBluckCount+1)*SDIO_BLOCK_SIZE;
+
+	if (nb < 16)
+		btmtk_print_buffer_conent(txbuf, nb);
+	else
+		btmtk_print_buffer_conent(txbuf, 16);
+
+	do {
+		/* Transfer data to card */
+		sdio_claim_host(card->func);
+		ret = sdio_writesb(card->func, CTDR, txbuf, nb);
+		sdio_release_host(card->func);
+		if (ret < 0) {
+			i++;
+			pr_err("i=%d writesb failed: %d\n", i, ret);
+			pr_err("hex: %*ph\n", nb, txbuf);
+			ret = -EIO;
+			if (i > MAX_WRITE_IOMEM_RETRY)
+				goto exit;
+		}
+	} while (ret);
+
+	if (priv)
+		priv->btmtk_dev.tx_dnld_rdy = false;
+
+exit:
+
+	//unlock_unsleepable_lock(&tx_function_lock);
+	return ret;
+}
+
+static int btmtk_sdio_set_i2s_slave(void)
+{
+	int ret = 0;
+	u8 wmt_event[7] = { 4, 0xE, 4, 1, 0x72, 0xFC, 0 };
+	u8 cmd[] = { 1, 0x72, 0xFC, 4, 03, 0x10, 0x00, 0x02 };
+	u8 mtksdio_packet_header[MTK_SDIO_PACKET_HEADER_SIZE] = { 0 };
+
+	pr_info("%s\n", __func__);
+	mtksdio_packet_header[0] = sizeof(mtksdio_packet_header) + sizeof(cmd);
+	memcpy(txbuf, mtksdio_packet_header, MTK_SDIO_PACKET_HEADER_SIZE);
+	memcpy(txbuf + MTK_SDIO_PACKET_HEADER_SIZE, cmd, sizeof(cmd));
+	btmtk_sdio_send_tx_data(txbuf, MTK_SDIO_PACKET_HEADER_SIZE + sizeof(cmd));
+
+	btmtk_sdio_recv_rx_data();
+
+	pr_debug("%s rx_length %d\n", __func__, rx_length);
+	pr_debug("%s rx_length %d %02x%02x%02x%02x%02x\%02x%02x%02x%02x%02x%02x%02x\n", __func__,
+		   rx_length, rxbuf[0], rxbuf[1], rxbuf[2], rxbuf[3], rxbuf[4]
+		   , rxbuf[5], rxbuf[6], rxbuf[7], rxbuf[8], rxbuf[9]
+		   , rxbuf[10], rxbuf[11]);
+	/* compare rx data is wmt reset correct response or not */
+	if (memcmp(wmt_event, rxbuf + MTK_SDIO_PACKET_HEADER_SIZE, sizeof(wmt_event)) != 0) {
+		ret = -EIO;
+		pr_err("%s: fail\n", __func__);
+	}
+	return ret;
+}
+
+static int btmtk_sdio_read_pin_mux_setting(u32 *value)
+{
+	int ret = 0;
+	u8 cmd[] = { 1, 0xD1, 0xFC, 4, 0x54, 0x30, 0x02, 0x81 };
+	u8 tempvalue = 0;
+	u8 mtksdio_packet_header[MTK_SDIO_PACKET_HEADER_SIZE] = { 0 };
+
+	pr_info("%s\n", __func__);
+	mtksdio_packet_header[0] = sizeof(mtksdio_packet_header) + sizeof(cmd);
+	memcpy(txbuf, mtksdio_packet_header, MTK_SDIO_PACKET_HEADER_SIZE);
+	memcpy(txbuf + MTK_SDIO_PACKET_HEADER_SIZE, cmd, sizeof(cmd));
+	pr_debug("%s tx buf %02x%02x%02x%02x%02x\%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x\n",
+		   __func__, txbuf[0], txbuf[1], txbuf[2], txbuf[3], txbuf[4]
+		   , txbuf[5], txbuf[6], txbuf[7], txbuf[8], txbuf[9]
+		   , txbuf[10], txbuf[11], txbuf[12], txbuf[13], txbuf[14]);
+	btmtk_sdio_send_tx_data(txbuf, MTK_SDIO_PACKET_HEADER_SIZE + sizeof(cmd));
+
+	btmtk_sdio_recv_rx_data();
+
+	pr_debug("%s rx_length %d\n", __func__, rx_length);
+	pr_debug
+	    ("%s rx_length %d %02x%02x%02x%02x%02x\%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x\n",
+	     __func__, rx_length, rxbuf[0], rxbuf[1], rxbuf[2], rxbuf[3], rxbuf[4]
+	     , rxbuf[5], rxbuf[6], rxbuf[7], rxbuf[8], rxbuf[9]
+	     , rxbuf[10], rxbuf[11], rxbuf[12], rxbuf[13], rxbuf[14]);
+
+	if (rx_length >= 15) {
+		tempvalue = rxbuf[14];
+		*value = (rxbuf[14] << 24) + (rxbuf[13] << 16) + (rxbuf[12] << 8) + rxbuf[11];
+		pr_debug("%s value=%08x\n", __func__, *value);
+	} else
+		ret = -EIO;
+
+	return ret;
+}
+
+static int btmtk_sdio_write_pin_mux_setting(u32 value)
+{
+	int ret = 0;
+	u8 event[7] = { 4, 0xE, 4, 1, 0xD0, 0xFC, 0 };
+	u8 cmd[12] = { 1, 0xD0, 0xFC, 8, 0x54, 0x30, 0x02, 0x81, 0, 0, 0, 0 };
+	u8 mtksdio_packet_header[MTK_SDIO_PACKET_HEADER_SIZE] = { 0 };
+
+	pr_info("%s begin\n", __func__);
+	cmd[8] = (value & 0x000000FF);
+	cmd[9] = ((value & 0x0000FF00) >> 8);
+	cmd[10] = ((value & 0x00FF0000) >> 16);
+	cmd[11] = ((value & 0xFF000000) >> 24);
+
+	pr_debug("%s value=%08x begin\n", __func__, value);
+	mtksdio_packet_header[0] = sizeof(mtksdio_packet_header) + sizeof(cmd);
+	memcpy(txbuf, mtksdio_packet_header, MTK_SDIO_PACKET_HEADER_SIZE);
+	memcpy(txbuf + MTK_SDIO_PACKET_HEADER_SIZE, cmd, sizeof(cmd));
+
+	pr_debug("%s tx buf %02x%02x%02x%02x%02x\%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x\n",
+		   __func__, txbuf[0], txbuf[1], txbuf[2], txbuf[3], txbuf[4],
+		   txbuf[5], txbuf[6], txbuf[7], txbuf[8], txbuf[9],
+		   txbuf[10], txbuf[11], txbuf[12], txbuf[13], txbuf[14], txbuf[15]);
+
+	btmtk_sdio_send_tx_data(txbuf, MTK_SDIO_PACKET_HEADER_SIZE + sizeof(cmd));
+
+	btmtk_sdio_recv_rx_data();
+
+	pr_debug("%s rx_length %d\n", __func__, rx_length);
+	pr_debug
+	    ("%s rx_length %d %02x%02x%02x%02x%02x\%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x\n",
+	     __func__, rx_length, rxbuf[0], rxbuf[1], rxbuf[2], rxbuf[3], rxbuf[4]
+	     , rxbuf[5], rxbuf[6], rxbuf[7], rxbuf[8], rxbuf[9]
+	     , rxbuf[10], rxbuf[11], rxbuf[12], rxbuf[13], rxbuf[14]);
+
+	/* compare rx data is wmt reset correct response or not */
+	if (memcmp(event, rxbuf + MTK_SDIO_PACKET_HEADER_SIZE, sizeof(event)) != 0) {
+		ret = -EIO;
+		pr_err("%s: fail\n", __func__);
+	}
+	return ret;
+
+}
+
 static int btmtk_send_rom_patch(u8 *fwbuf, u32 fwlen, int mode)
 {
 	int ret = 0;
@@ -1281,7 +1683,7 @@
  */
 static int btmtk_sdio_need_load_rom_patch(void)
 {
-	u32 ret = 0;
+	u32 ret = -1;
 	u8 cmd[] = {0x1, 0x17, 0x1, 0x0, 0x1};
 	u8 event[] = {0x2, 0x17, 0x1, 0x0};
 
@@ -1307,7 +1709,7 @@
 			btmtk_print_buffer_conent(rxbuf, rx_length);
 		}
 	} while (0);
-
+	pr_err("%s return ret %d\n", __func__, ret);
 	return ret;
 }
 static int btmtk_sdio_set_write_clear(void)
@@ -1334,6 +1736,43 @@
 
 	return ret;
 }
+
+static int btmtk_sdio_set_i2s(void)
+{
+	int ret = 0;
+	u32 pinmux = 0;
+
+	ret = btmtk_sdio_set_i2s_slave();
+	if (ret) {
+		pr_err("btmtk_sdio_set_i2s_slave error(%d)\n", ret);
+		return ret;
+	}
+	ret = btmtk_sdio_read_pin_mux_setting(&pinmux);
+	if (ret) {
+		pr_err("btmtk_sdio_read_pin_mux_setting error(%d)\n", ret);
+		return ret;
+	}
+
+	pinmux &= 0x0000FFFF;
+	pinmux |= 0x22220000;
+	ret = btmtk_sdio_write_pin_mux_setting(pinmux);
+
+	if (ret) {
+		pr_err("btmtk_sdio_write_pin_mux_setting error(%d)\n", ret);
+		return ret;
+	}
+
+	pinmux = 0;
+	ret = btmtk_sdio_read_pin_mux_setting(&pinmux);
+	if (ret) {
+		pr_err("btmtk_sdio_read_pin_mux_setting error(%d)\n", ret);
+		return ret;
+	}
+	pr_info("confirm pinmux %04x\n", pinmux);
+
+	return ret;
+}
+
 static int btmtk_sdio_download_rom_patch(
 					struct btmtk_sdio_card *card)
 {
@@ -1542,7 +1981,7 @@
 	btmtk_sdio_set_write_clear();
 
 	if (btmtk_sdio_need_load_rom_patch() == PATCH_READY)
-		pr_info("%s patch is ready\n", __func__);
+		pr_info("%s patchdownload is done by BT\n", __func__);
 
 
 	ret = btmtk_sdio_send_wmt_reset();
@@ -1550,7 +1989,6 @@
 	if (ret)
 		goto done;
 
-
 	ret = btmtk_sdio_bt_set_power(1);
 
 	if (ret) {
@@ -1604,24 +2042,22 @@
 	}
 }
 
-static int btmtk_sdio_card_to_host(struct btmtk_private *priv)
+static int btmtk_sdio_card_to_host(struct btmtk_private *priv, const u8 *event, const int event_len,
+	int add_spec_header)
+/*event: check event which want to compare*/
+/*return value: -x fail, 0 success*/
 {
 	u16 buf_len = 0;
-	int ret = 0, num_blocks = 0, blksz = 0;
+	int ret = 0;
 	struct sk_buff *skb = NULL;
 	struct sk_buff *fops_skb = NULL;
 	u32 type;
-	u8 *payload = NULL;
 	u32 fourbalignment_len = 0;
-	struct btmtk_sdio_card *card = priv->btmtk_dev.card;
 	u32 dump_len = 0;
 	char *core_dump_end = NULL;
-
-	if (!card || !card->func) {
-		pr_err("card or function or is NULL!\n");
-		ret = -EINVAL;
-		goto exit;
-	}
+	u16 org_packet_len = 0;
+	int i = 0;
+	unsigned char spec_header[] = { 0xff, 0x00, 0xFE, 0x00 };
 
 #if SUPPORT_FW_DUMP
 	fw_is_coredump_end_packet = false;
@@ -1680,9 +2116,8 @@
 					pr_warn("%s : fw_dump_file->f_op->write is NULL\n",
 								__func__);
 
-				if ((dump_len > 0) && fw_dump_file
-					&& fw_dump_file->f_op
-					&& fw_dump_file->f_op->write)
+
+				if ((dump_len > 0) && fw_dump_file)
 					fw_dump_file->f_op->write(fw_dump_file,
 						&rxbuf[SDIO_HEADER_LEN+10],
 						dump_len,
@@ -1731,7 +2166,6 @@
 		goto exit;
 	}
 
-	payload = rxbuf;
 	pr_debug("%s rx_length %d,buf_len %d\n", __func__, rx_length, buf_len);
 
 	memcpy(skb->data, &rxbuf[MTK_SDIO_PACKET_HEADER_SIZE+1], buf_len);
@@ -1751,68 +2185,77 @@
 		break;
 	}
 
+	if (event_compare_status == BTMTK_SDIO_EVENT_COMPARE_STATE_NEED_COMPARE)
+		BTSDIO_INFO_RAW(skb->data, buf_len, "%s: skb->data :", __func__);
+
+	if ((buf_len >= sizeof(READ_ADDRESS_EVENT))
+		&& (event_compare_status == BTMTK_SDIO_EVENT_COMPARE_STATE_NEED_COMPARE)) {
+		if ((memcmp(skb->data, READ_ADDRESS_EVENT, sizeof(READ_ADDRESS_EVENT)) == 0) && (buf_len == 12)) {
+			for (i = 0; i < BD_ADDRESS_SIZE; i++)
+				g_card->bdaddr[i] = skb->data[6 + i];
+
+			pr_info("%s: GET TV BDADDR = %02X:%02X:%02X:%02X:%02X:%02X", __func__,
+			g_card->bdaddr[0], g_card->bdaddr[1], g_card->bdaddr[2],
+			g_card->bdaddr[3], g_card->bdaddr[4], g_card->bdaddr[5]);
+
+			//event_compare_status = BTMTK_SDIO_EVENT_COMPARE_STATE_COMPARE_SUCCESS;
+		} else
+			pr_info("%s READ_ADDRESS_EVENT compare fail buf_len %d\n", __func__, buf_len);
+	}
+
 	lock_unsleepable_lock(&(metabuffer.spin_lock));
-	if (priv->adapter->fops_mode &
-			(!fw_is_doing_coredump) &
+	if ((!fw_is_doing_coredump) &
 			(!fw_is_coredump_end_packet)) {
-		fops_skb = bt_skb_alloc(buf_len, GFP_ATOMIC);
-		bt_cb(fops_skb)->pkt_type = type;
-		memcpy(fops_skb->data, skb->data, buf_len);
+		if (event_compare_status == BTMTK_SDIO_EVENT_COMPARE_STATE_NEED_COMPARE) {
+			/*compare with tx hci cmd*/
+			if (buf_len >= event_need_compare_len) {
+				if (memcmp(skb->data, event_need_compare, event_need_compare_len) == 0) {
+					event_compare_status = BTMTK_SDIO_EVENT_COMPARE_STATE_COMPARE_SUCCESS;
+					pr_info("%s compare success\n", __func__);
+				} else {
+					pr_debug("%s compare fail\n", __func__);
+					BTSDIO_DEBUG_RAW(event_need_compare, event_need_compare_len,
+						"%s: event_need_compare :", __func__);
+				}
+			}
+		}
+
+		if (event_add_spec_header_status) {
+			/*compare with tx hci cmd*/
+			org_packet_len = buf_len;
+			buf_len += sizeof(spec_header);
+			fops_skb = bt_skb_alloc(buf_len, GFP_ATOMIC);
+			bt_cb(fops_skb)->pkt_type = HCI_EVENT_PKT;
+			memcpy(fops_skb->data, spec_header, sizeof(spec_header));
+			memcpy(fops_skb->data + sizeof(spec_header), skb->data, buf_len);
+		} else {
+			org_packet_len = buf_len;
+			fops_skb = bt_skb_alloc(buf_len, GFP_ATOMIC);
+			bt_cb(fops_skb)->pkt_type = type;
+			memcpy(fops_skb->data, skb->data, buf_len);
+		}
+
 		fops_skb->len = buf_len;
 		skb_queue_tail(&g_priv->adapter->fops_queue, fops_skb);
-		pr_debug("%s push fops_queue\n", __func__);
 		if (skb_queue_empty(&g_priv->adapter->fops_queue))
 			pr_info("%s fops_queue is empty\n", __func__);
 
 		kfree_skb(skb);
 		unlock_unsleepable_lock(&(metabuffer.spin_lock));
-		pr_debug("%s call inq wake up\n", __func__);
 		wake_up_interruptible(&inq);
 		goto exit;
 	}
 	unlock_unsleepable_lock(&(metabuffer.spin_lock));
 
-	switch (type) {
-	case HCI_ACLDATA_PKT:
-	case HCI_SCODATA_PKT:
-	case HCI_EVENT_PKT:
-		bt_cb(skb)->pkt_type = type;
-		skb_put(skb, buf_len);
-		break;
-
-	case MTK_VENDOR_PKT:
-		pr_warn("%s, MTK_VENDOR_PKT no handle now, break\n",
-			__func__);
-		kfree_skb(skb);
-		break;
-
-		bt_cb(skb)->pkt_type = HCI_VENDOR_PKT;
-		skb_put(skb, buf_len);
-		skb_pull(skb, SDIO_HEADER_LEN);
-
-/* if kernel < 3, 11, 0, should use hci_recv_frame(skb); */
-
-		break;
-
-	default:
-		pr_warn("Unknown packet type:%d\n", type);
-		pr_warn("hex: %*ph\n", blksz * num_blocks, payload);
-
-		kfree_skb(skb);
-		skb = NULL;
-		break;
-	}
-
 exit:
 	if (ret) {
 		pr_debug("%s fail free skb\n", __func__);
 		kfree_skb(skb);
 	}
 
-
 	buf_len += 1;
-	if (buf_len%4)
-		fourbalignment_len = buf_len + 4 - buf_len%4;
+	if (buf_len % 4)
+		fourbalignment_len = buf_len + 4 - (buf_len % 4);
 	else
 		fourbalignment_len = buf_len;
 
@@ -1848,13 +2291,16 @@
 	if (RX_DONE&u32ReadCRValue)
 		ret = btmtk_sdio_recv_rx_data();
 
-	if (ret == 0)
+	if (ret == 0) {
+		lock_unsleepable_lock(&event_compare_status_lock);
 		while (rx_length > (MTK_SDIO_PACKET_HEADER_SIZE)) {
-			btmtk_sdio_card_to_host(priv);
+			btmtk_sdio_card_to_host(priv, NULL, -1, 0);
 			u32rxdatacount++;
 			pr_debug("%s u32rxdatacount %d\n",
 				__func__, u32rxdatacount);
 		}
+		unlock_unsleepable_lock(&event_compare_status_lock);
+	}
 
 	btmtk_sdio_enable_interrupt(1);
 
@@ -2087,58 +2533,6 @@
 	return ret;
 }
 
-static int btmtk_sdio_host_to_card(struct btmtk_private *priv,
-				u8 *payload, u16 nb)
-{
-	struct btmtk_sdio_card *card = priv->btmtk_dev.card;
-	int ret = 0;
-	int i = 0;
-	u8 MultiBluckCount = 0;
-	u8 redundant = 0;
-
-	if (payload != txbuf) {
-		memset(txbuf, 0, MTK_TXDATA_SIZE);
-		memcpy(txbuf, payload, nb);
-	}
-
-	if (!card || !card->func) {
-		pr_err("card or function is NULL!\n");
-		return -EINVAL;
-	}
-
-	MultiBluckCount = nb/SDIO_BLOCK_SIZE;
-	redundant = nb % SDIO_BLOCK_SIZE;
-
-	if (redundant)
-		nb = (MultiBluckCount+1)*SDIO_BLOCK_SIZE;
-
-	if (nb < 16)
-		btmtk_print_buffer_conent(txbuf, nb);
-	else
-		btmtk_print_buffer_conent(txbuf, 16);
-
-	do {
-		/* Transfer data to card */
-		sdio_claim_host(card->func);
-		ret = sdio_writesb(card->func, CTDR, txbuf, nb);
-		sdio_release_host(card->func);
-		if (ret < 0) {
-			i++;
-			pr_err("i=%d writesb failed: %d\n", i, ret);
-			pr_err("hex: %*ph\n", nb, txbuf);
-			ret = -EIO;
-			if (i > MAX_WRITE_IOMEM_RETRY)
-				goto exit;
-		}
-	} while (ret);
-
-	if (priv)
-		priv->btmtk_dev.tx_dnld_rdy = false;
-
-exit:
-	return ret;
-}
-
 static int btmtk_sdio_download_fw(struct btmtk_sdio_card *card)
 {
 	int ret;
@@ -2294,29 +2688,43 @@
 		card->sd_blksz_fw_dl = data->sd_blksz_fw_dl;
 		card->support_pscan_win_report = data->support_pscan_win_report;
 		card->supports_fw_dump = data->supports_fw_dump;
+		card->chip_id = data->reg->chip_id;
+		card->suspend_count = 0;
+		pr_info("%s chip_id is %x\n", __func__, data->reg->chip_id);
+		/*allocate memory for woble_setting_file*/
+		g_card->woble_setting_file_name = kzalloc(MAX_BIN_FILE_NAME_LEN, GFP_KERNEL);
+		if (!g_card->woble_setting_file_name)
+			return -1;
+
+		memcpy(g_card->woble_setting_file_name,
+				WOBLE_SETTING_FILE_NAME,
+				sizeof(WOBLE_SETTING_FILE_NAME));
 	}
 
-	pr_info("%s func device %X\n", __func__, card->func->device);
-	pr_info("%s Call btmtk_sdio_register_dev\n", __func__);
+	pr_debug("%s func device %X\n", __func__, card->func->device);
+	pr_debug("%s Call btmtk_sdio_register_dev\n", __func__);
 	if (btmtk_sdio_register_dev(card) < 0) {
 		pr_err("Failed to register BT device!\n");
 		return -ENODEV;
 	}
 
-	pr_info("%s btmtk_sdio_register_dev success\n", __func__);
+	pr_debug("%s btmtk_sdio_register_dev success\n", __func__);
 
 	/* Disable the interrupts on the card */
 	btmtk_sdio_enable_host_int(card);
-	pr_info("call btmtk_sdio_enable_host_int done\n");
+	pr_debug("call btmtk_sdio_enable_host_int done\n");
 	if (btmtk_sdio_download_fw(card)) {
 		pr_err("Downloading firmware failed!\n");
 		ret = -ENODEV;
 		goto unreg_dev;
 	}
 
+	btmtk_sdio_set_i2s();
 	/* Move from btmtk_fops_open() */
 	spin_lock_init(&(metabuffer.spin_lock.lock));
-	pr_info("%s spin_lock_init end\n", __func__);
+	spin_lock_init(&(event_compare_status_lock.lock));
+	spin_lock_init(&(tx_function_lock.lock));
+	pr_debug("%s spin_lock_init end\n", __func__);
 
 	priv = btmtk_add_card(card);
 	if (!priv) {
@@ -2324,9 +2732,9 @@
 		ret = -ENODEV;
 		goto unreg_dev;
 	}
-	pr_info("btmtk_add_card success\n");
+	pr_debug("btmtk_add_card success\n");
 	card->priv = priv;
-	pr_info("assign priv done\n");
+	pr_debug("assign priv done\n");
 	/* Initialize the interface specific function pointers */
 	priv->hw_host_to_card = btmtk_sdio_host_to_card;
 	priv->hw_process_int_status = btmtk_sdio_process_int_status;
@@ -2356,7 +2764,17 @@
 	fw_dump_buffer_full = 0;
 
 	ret = btmtk_sdio_readl(CHLPCR, &u32ReadCRValue);
-	pr_info("%s read CHLPCR (0x%08X)\n", __func__, u32ReadCRValue);
+	pr_debug("%s read CHLPCR (0x%08X)\n", __func__, u32ReadCRValue);
+	pr_debug("%s chipid is  (0x%X)\n", __func__, g_card->chip_id);
+	if (is_support_unify_woble(g_card)) {
+		memset(g_card->bdaddr, 0, BD_ADDRESS_SIZE);
+		btmtk_sdio_load_woble_setting(g_card->woble_setting,
+			g_card->woble_setting_file_name,
+			&g_card->func->dev,
+			&g_card->woble_setting_len,
+			g_card);
+	}
+
 	pr_info("%s normal end\n", __func__);
 	probe_ready = true;
 	return 0;
@@ -2391,10 +2809,12 @@
 
 				btmtk_sdio_disable_host_int(card);
 			}
+			btmtk_sdio_woble_free_setting();
 			pr_debug("unregester dev\n");
 			card->priv->surprise_removed = true;
 			btmtk_sdio_unregister_dev(card);
 			btmtk_remove_card(card->priv);
+			need_reset_stack = 1;
 		}
 	}
 	pr_info("%s end\n", __func__);
@@ -2408,39 +2828,419 @@
  * #define HCI_EVENT_PKT     0x04
  * #define HCI_VENDOR_PKT    0xff
  */
-static int btmtk_sdio_send_cmd(u8 cmd_type, u8 *cmd, int cmd_len)
+static int btmtk_sdio_send_hci_cmd(u8 cmd_type, u8 *cmd, int cmd_len,
+		const u8 *event, const int event_len,
+		int total_timeout, int add_spec_header, bool wait_until)
+		/*cmd: if cmd is null, don't compare event, just return 0 if send cmd success*/
+		/* total_timeout: -1 */
+		/* add_spec_header:0 hci event, 1 use vend specic event header*/
+		/* return 0 if compare successfully and no need to compare */
+		/* return < 0 if error*/
+		/*wait_until: 0:need compare with first event after cmd*/
+		/*return value: 0 or positive success, -x fail*/
 {
-	u8 ret = 0;
-	u32 sdio_header_len = 0;
-	u8 *send_data = NULL;
-	u32 send_data_len = cmd_len + BTM_HEADER_LEN;
+	int ret = -1;
+	unsigned long comp_event_timo = 0, start_time = 0;
+	struct sk_buff *skb = NULL;
 
 	if (cmd_len == 0) {
 		pr_err("%s cmd_len (%d) error return\n", __func__, cmd_len);
 		return -EINVAL;
 	}
 
-	send_data = kmalloc(send_data_len, GFP_KERNEL);
-	sdio_header_len = send_data_len;
-	memset(send_data, 0, send_data_len);
-	send_data[0] = (sdio_header_len & 0x0000ff);
-	send_data[1] = (sdio_header_len & 0x00ff00) >> 8;
-	send_data[2] = 0;
-	send_data[3] = 0;
-	send_data[4] = cmd_type;
-	memcpy(&send_data[BTM_HEADER_LEN], &cmd[0], cmd_len);
-	ret = btmtk_sdio_host_to_card(g_priv, send_data, send_data_len);
-	kfree(send_data);
+
+	skb = bt_skb_alloc(cmd_len, GFP_ATOMIC);
+	bt_cb(skb)->pkt_type = cmd_type;
+	memcpy(&skb->data[0], cmd, cmd_len);
+	skb->len = cmd_len;
+	skb_queue_tail(&g_priv->adapter->tx_queue, skb);
+	wake_up_interruptible(&g_priv->main_thread.wait_q);
+
+
+	if (event == NULL)
+		return 0;
+
+	if (event_len > EVENT_COMPARE_SIZE) {
+		pr_err("%s event_len (%d) > EVENT_COMPARE_SIZE(%d), error\n", __func__, event_len, EVENT_COMPARE_SIZE);
+		return -1;
+	}
+
+	memcpy(event_need_compare, event, event_len);
+	event_need_compare_len = event_len;
+
+	start_time = jiffies;
+	// check HCI event
+	event_add_spec_header_status = add_spec_header;
+	comp_event_timo = jiffies + msecs_to_jiffies(total_timeout);
+	ret = -1;
+	event_compare_status = BTMTK_SDIO_EVENT_COMPARE_STATE_NEED_COMPARE;
+
+	pr_info("%s event_need_compare_len %d\n", __func__, event_need_compare_len);
+	do {
+		//check if event_compare_success
+		if (event_compare_status == BTMTK_SDIO_EVENT_COMPARE_STATE_COMPARE_SUCCESS) {
+			pr_info("%s compare success\n", __func__);
+			ret = 0;
+			break;
+		}
+
+		msleep(100);
+	} while (time_before(jiffies, comp_event_timo));
+	event_compare_status = BTMTK_SDIO_EVENT_COMPARE_STATE_NOTHING_NEED_COMPARE;
+	event_add_spec_header_status = 0;
+	pr_info("%s ret %d\n", __func__, ret);
 	return ret;
 }
-static int btmtk_sdio_send_woble_cmd(void)
-{
-	u8 ret = 0;
-	u8 cmd[] = { 0xC9, 0xFC, 0x0D, 0x01, 0x0E, 0x00, 0x05, 0x43,
-			0x52, 0x4B, 0x54, 0x4D, 0x20, 0x04, 0x32, 0x00};
 
-	ret = btmtk_sdio_send_cmd(HCI_COMMAND_PKT, cmd, sizeof(cmd));
-	pr_info("%s return %d\n", __func__, ret);
+static int btmtk_sdio_send_get_vendor_cap(void)
+{
+	int ret = -1;
+	u8 get_vendor_cap_cmd[] = { 0x53, 0xFD, 0x00 };
+	u8 get_vendor_cap_event[] = { 0x0e, 0x12, 0x01, 0x53, 0xFD, 0x00};
+
+	pr_info("%s: begin", __func__);
+	BTSDIO_INFO_RAW(get_vendor_cap_cmd, sizeof(get_vendor_cap_cmd), "%s: send vendor_cap_cmd is:", __func__);
+	ret = btmtk_sdio_send_hci_cmd(HCI_COMMAND_PKT, get_vendor_cap_cmd, sizeof(get_vendor_cap_cmd),
+		get_vendor_cap_event, sizeof(get_vendor_cap_event),
+				WOBLE_COMP_EVENT_TIMO, 1, 1);
+
+	pr_info("%s: ret %d", __func__, ret);
+	return ret;
+}
+
+static int btmtk_sdio_send_read_BDADDR_cmd(void)
+{
+	u8 cmd[] = { 0x09, 0x10, 0x00 };
+	int ret = -1;
+	unsigned char zero[BD_ADDRESS_SIZE];
+
+	pr_info("%s: begin", __func__);
+	if (g_card == NULL) {
+		pr_err("%s: g_card == NULL!", __func__);
+		return -1;
+	}
+
+	memset(zero, 0, sizeof(zero));
+	if (memcmp(g_card->bdaddr, zero, BD_ADDRESS_SIZE) != 0) {
+		pr_info("%s: already got bdaddr %02x%02x%02x%02x%02x%02x, return 0", __func__,
+		g_card->bdaddr[0], g_card->bdaddr[1], g_card->bdaddr[2],
+		g_card->bdaddr[3], g_card->bdaddr[4], g_card->bdaddr[5]);
+		return 0;
+	}
+	BTSDIO_INFO_RAW(cmd, sizeof(cmd), "%s: send read bd address cmd is:", __func__);
+	ret = btmtk_sdio_send_hci_cmd(HCI_COMMAND_PKT, cmd, sizeof(cmd),
+		READ_ADDRESS_EVENT, sizeof(READ_ADDRESS_EVENT), WOBLE_COMP_EVENT_TIMO, 1, 1);
+	/*BD address will get in btmtk_sdio_host_to_card*/
+	pr_info("%s: ret = %d", __func__, ret);
+
+	return ret;
+}
+
+static int btmtk_sdio_set_Woble_APCF_filter_parameter(void)
+{
+	int ret = -1;
+	u8 cmd[] = { 0x57, 0xfd, 0x0a, 0x01, 0x00, 0x5a, 0x20, 0x00, 0x20, 0x00, 0x01, 0x80, 0x00 };
+	u8 event_complete[] = { 0x0e, 0x07, 0x01, 0x57, 0xfd, 0x00, 0x01/*, 00, 63*/ };
+
+	pr_info("%s: begin", __func__);
+	ret = btmtk_sdio_send_hci_cmd(HCI_COMMAND_PKT, cmd, sizeof(cmd),
+		event_complete, sizeof(event_complete),
+		WOBLE_COMP_EVENT_TIMO, 1, 1);
+	if (ret < 0)
+		pr_err("%s: end ret %d", __func__, ret);
+	else
+		ret = 0;
+
+	pr_info("%s: end ret=%d", __func__, ret);
+	return ret;
+}
+
+
+/**
+ * Set APCF manufacturer data and filter parameter
+ */
+static int btmtk_sdio_set_Woble_APCF(void)
+{
+	int ret = -1;
+	int i = 0;
+	u8 manufactur_data[] = { 0x57, 0xfd, 0x27, 0x06, 0x00, 0x5a,
+		0x46, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+		0x00, 0x00, 0x00, 0x00, 0x43, 0x52, 0x4B, 0x54, 0x4D,
+		0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+		0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF };
+	u8 event_complete[] = { 0x0e, 0x07, 0x01, 0x57, 0xfd};
+
+	pr_info("%s: begin", __func__);
+	if (!g_card) {
+		pr_info("%s: g_card is NULL, return -1", __func__);
+		return -1;
+	}
+
+	pr_info("%s: g_card->woble_setting_apcf[0].length %d",
+		__func__, g_card->woble_setting_apcf[0].length);
+
+	/* start to send apcf cmd from woble setting  file */
+	if (g_card->woble_setting_apcf[0].length) {
+		for (i = 0; i < WOBLE_SETTING_COUNT; i++) {
+			if (!g_card->woble_setting_apcf[i].length)
+				continue;
+
+			pr_info("%s: g_data->woble_setting_apcf_fill_mac[%d].content[0] = 0x%02x",
+				__func__, i,
+				g_card->woble_setting_apcf_fill_mac[i].content[0]);
+			pr_info("%s: g_data->woble_setting_apcf_fill_mac_location[%d].length = %d",
+				__func__, i,
+				g_card->woble_setting_apcf_fill_mac_location[i].length);
+
+			if ((g_card->woble_setting_apcf_fill_mac[i].content[0] == 1) &&
+				g_card->woble_setting_apcf_fill_mac_location[i].length) {
+				/* need add BD addr to apcf cmd */
+				memcpy(g_card->woble_setting_apcf[i].content +
+					(*g_card->woble_setting_apcf_fill_mac_location[i].content),
+					g_card->bdaddr, BD_ADDRESS_SIZE);
+				pr_info("%s: apcf %d ,add mac to location %d",
+					__func__, i,
+					(*g_card->woble_setting_apcf_fill_mac_location[i].content));
+			}
+
+			pr_info("%s: send APCF %d", __func__, i);
+			BTSDIO_INFO_RAW(g_card->woble_setting_apcf[i].content, g_card->woble_setting_apcf[i].length,
+				"woble_setting_apcf");
+
+			ret = btmtk_sdio_send_hci_cmd(HCI_COMMAND_PKT, g_card->woble_setting_apcf[i].content,
+				g_card->woble_setting_apcf[i].length,
+				event_complete, sizeof(event_complete), WOBLE_COMP_EVENT_TIMO, 1, 1);
+
+			if (ret < 0) {
+				pr_err("%s: apcf %d error ret %d", __func__, i, ret);
+				return ret;
+			}
+
+		}
+	} else { /* use default */
+		pr_info("%s: use default manufactur data", __func__);
+		memcpy(manufactur_data + 9, g_card->bdaddr, BD_ADDRESS_SIZE);
+		BTSDIO_INFO_RAW(manufactur_data, sizeof(manufactur_data),
+						"send manufactur_data ");
+
+		ret = btmtk_sdio_send_hci_cmd(HCI_COMMAND_PKT, manufactur_data,
+				sizeof(manufactur_data),
+				event_complete, sizeof(event_complete), WOBLE_COMP_EVENT_TIMO, 1, 1);
+		if (ret < 0) {
+			pr_err("%s: manufactur_data error ret %d", __func__, ret);
+			return ret;
+		}
+
+		ret = btmtk_sdio_set_Woble_APCF_filter_parameter();
+	}
+
+	pr_info("%s: end ret=%d", __func__, ret);
+	return ret;
+}
+
+
+
+static int btmtk_sdio_send_woble_settings(struct woble_setting_struct *settings_cmd,
+	struct woble_setting_struct *settings_event, char *message)
+{
+	int ret = -1;
+	int i = 0;
+
+	pr_info("%s: %s length %d",
+		__func__, message, settings_cmd->length);
+	if (g_card->woble_setting_radio_on[0].length) {
+		for (i = 0; i < WOBLE_SETTING_COUNT; i++) {
+			if (settings_cmd[i].length) {
+				pr_info("%s: send %s %d", __func__, message, i);
+				BTSDIO_INFO_RAW(settings_cmd[i].content,
+					settings_cmd[i].length, "Raw");
+
+				ret = btmtk_sdio_send_hci_cmd(HCI_COMMAND_PKT, settings_cmd[i].content,
+				settings_cmd[i].length,
+				settings_event[i].content,
+				settings_event[i].length, WOBLE_COMP_EVENT_TIMO, 1, 1);
+
+				if (ret) {
+					pr_err("%s: %s %d return error",
+							__func__, message, i);
+					return ret;
+				}
+			}
+		}
+	}
+	return ret;
+}
+static int btmtk_sdio_send_unify_woble_suspend_default_cmd(void)
+{
+	int ret = 0;	/* if successful, 0 */
+	u8 cmd[] = { 0xC9, 0xFC, 0x14, 0x01, 0x20, 0x02, 0x00, 0x01,
+		0x02, 0x01, 0x00, 0x05, 0x10, 0x01, 0x00, 0x40, 0x06,
+		0x02, 0x40, 0x5A, 0x02, 0x41, 0x0F };
+	/*u8 status[] = { 0x0F, 0x04, 0x00, 0x01, 0xC9, 0xFC };*/
+	u8 comp_event[] = { 0xE6, 0x02, 0x08, 0x00 };
+	pr_debug("%s: begin", __func__);
+
+
+	ret = btmtk_sdio_send_hci_cmd(HCI_COMMAND_PKT, cmd,
+				sizeof(cmd),
+				comp_event, sizeof(comp_event), WOBLE_COMP_EVENT_TIMO, 1, 1);
+	if (ret)
+		pr_err("%s: comp_event return error(%d)", __func__, ret);
+
+    return ret;
+}
+/**
+ * Set APCF manufacturer data and filter parameter
+ */
+static int btmtk_sdio_set_Woble_radio_off(void)
+{
+	int ret = -1;
+
+	pr_info("%s: g_data->woble_setting_radio_off[0].length %d",
+			__func__, g_card->woble_setting_radio_off[0].length);
+	pr_info("%s: g_card->woble_setting_radio_off_comp_event[0].length %d",
+			__func__, g_card->woble_setting_radio_off_comp_event[0].length);
+
+	if (g_card->woble_setting_radio_off[0].length) {
+		if (g_card->woble_setting_radio_off_comp_event[0].length &&
+		is_support_unify_woble(g_card)) {
+			ret = btmtk_sdio_send_woble_settings(g_card->woble_setting_radio_off,
+			g_card->woble_setting_radio_off_comp_event, "radio off");
+			if (ret) {
+				pr_err("%s: radio off error", __func__);
+				return ret;
+			}
+		}
+		else
+			pr_info("%s: woble_setting_radio_off length is %d", __func__,
+		        g_card->woble_setting_radio_off[0].length);
+	} else {/* use default */
+		pr_info("%s: use default radio off cmd", __func__);
+		ret = btmtk_sdio_send_unify_woble_suspend_default_cmd();
+	}
+
+	pr_info("%s: end ret=%d", __func__, ret);
+	return ret;
+}
+
+static int btmtk_sdio_handle_entering_WoBLE_state(void)
+{
+	int ret = -1;
+
+	pr_info("%s: begin", __func__);
+	if (is_support_unify_woble(g_card)) {
+		ret = btmtk_sdio_send_get_vendor_cap();
+		if (ret < 0) {
+			pr_err("%s: btmtk_sdio_send_get_vendor_cap return fail ret = %d", __func__, ret);
+			goto Finish;
+		}
+
+		ret = btmtk_sdio_send_read_BDADDR_cmd();
+		if (ret < 0) {
+			pr_err("%s: btmtk_sdio_send_read_BDADDR_cmd return fail ret = %d", __func__, ret);
+			goto Finish;
+		}
+
+		ret = btmtk_sdio_set_Woble_APCF();
+		if (ret < 0) {
+			pr_err("%s: btmtk_sdio_set_Woble_APCF return fail %d", __func__, ret);
+			goto Finish;
+		}
+
+		ret = btmtk_sdio_set_Woble_radio_off();
+		if (ret < 0) {
+			pr_err("%s: btmtk_sdio_set_Woble_radio_off return fail %d", __func__, ret);
+			goto Finish;
+		}
+	}
+
+Finish:
+	if (ret)
+		btmtk_sdio_woble_wake_lock(g_card);
+
+	pr_info("%s: end", __func__);
+	return ret;
+}
+
+static int btmtk_sdio_send_leave_woble_suspend_cmd(void)
+{
+	int ret = 0;	/* if successful, 0 */
+	u8 cmd[] = { 0xC9, 0xFC, 0x05, 0x01, 0x21, 0x02, 0x00, 0x00 };
+	u8 comp_event[] = { 0xe6, 0x02, 0x08, 0x01 };
+
+	BTSDIO_INFO_RAW(cmd, sizeof(cmd), "cmd ");
+	ret = btmtk_sdio_send_hci_cmd(HCI_COMMAND_PKT, cmd,	sizeof(cmd),
+				comp_event, sizeof(comp_event), WOBLE_COMP_EVENT_TIMO, 1, 1);
+
+	if (ret < 0) {
+		pr_err("%s: failed(%d)", __func__, ret);
+	} else {
+		pr_info("%s: OK", __func__);
+		ret = 0;
+	}
+	return ret;
+}
+
+
+static int btmtk_sdio_handle_leaving_WoBLE_state(void)
+{
+	int ret = -1;
+
+	if (g_card == NULL) {
+		pr_err("%s: g_card is NULL return", __func__);
+		return 0;
+	}
+
+	if (!is_support_unify_woble(g_card)) {
+		pr_err("%s: do nothing", __func__);
+		return 0;
+	}
+
+	if (g_card->woble_setting_radio_on[0].length &&
+		g_card->woble_setting_radio_on_comp_event[0].length &&
+		g_card->woble_setting_apcf_resume[0].length &&
+		g_card->woble_setting_apcf_resume_event[0].length) {
+			/* start to send radio off cmd from woble setting file */
+		ret = btmtk_sdio_send_woble_settings(g_card->woble_setting_radio_on,
+			g_card->woble_setting_radio_on_comp_event, "radio on");
+		if (ret) {
+			pr_err("%s: wradio on error", __func__);
+			return ret;
+		}
+
+		ret = btmtk_sdio_send_woble_settings(g_card->woble_setting_apcf_resume,
+			g_card->woble_setting_apcf_resume_event, "apcf resume");
+		if (ret) {
+			pr_err("%s: apcf resume error", __func__);
+			return ret;
+		}
+
+	} else { /* use default */
+		ret = btmtk_sdio_send_leave_woble_suspend_cmd();
+
+	}
+
+	if (ret) {
+		pr_err("%s: woble_setting_radio_on return error", __func__);
+		return ret;
+	}
+
+
+
+	return ret;
+}
+
+static int btmtk_sdio_send_apcf_reserved(void)
+{
+	int ret = -1;
+	u8 reserve_apcf_cmd[] = { 0x5C, 0xFC, 0x01, 0x0A };
+	u8 reserve_apcf_event[] = { 0x0e, 0x06, 0x01, 0x5C, 0xFC, 0x00 };
+
+	ret = btmtk_sdio_send_hci_cmd(HCI_COMMAND_PKT, reserve_apcf_cmd,
+				sizeof(reserve_apcf_cmd),
+				reserve_apcf_event, sizeof(reserve_apcf_event), WOBLE_COMP_EVENT_TIMO, 1, 1);
+
+	pr_info("%s: ret %d", __func__, ret);
 	return ret;
 }
 
@@ -2450,16 +3250,29 @@
 	u8 ret = 0;
 	mmc_pm_flag_t pm_flags;
 
+	pr_info("%s begin\n", __func__);
+
+	if (g_card == NULL) {
+		pr_err("%s: g_card is NULL return", __func__);
+		return 0;
+	}
+
+	if ((g_card->suspend_count++)) {
+		pr_warn("%s: Has suspended. suspend_count: %d", __func__, g_card->suspend_count);
+		pr_info("%s: end", __func__);
+		return 0;
+	}
+	pr_info("%s start to send DRIVER_OWN\n", __func__);
 	ret = btmtk_sdio_set_own_back(DRIVER_OWN);
+
 	if (ret)
 		pr_err("%s set driver own fail\n", __func__);
 
-	ret = btmtk_sdio_send_woble_cmd();
-	if (ret)
-		pr_err("%s set woble cmd fail\n", __func__);
+	if (!is_support_unify_woble(g_card))
+		pr_warn("%s: no support", __func__);
+	else
+		btmtk_sdio_handle_entering_WoBLE_state();
 
-	need_reset_stack = 1;
-	pr_notice("%s set reset_stack 1\n", __func__);
 	if (func) {
 		pm_flags = sdio_get_host_pm_caps(func);
 		pr_debug("%s: suspend: PM flags = 0x%x\n",
@@ -2467,24 +3280,41 @@
 		if (!(pm_flags & MMC_PM_KEEP_POWER)) {
 			pr_err("%s: cannot remain alive while suspended\n",
 				sdio_func_id(func));
-			//return -EINVAL;
+			return -EINVAL;
 		}
 	} else {
 		pr_err("sdio_func is not specified\n");
 		return 0;
 	}
-    btmtk_sdio_bt_set_power(0);
+
 	ret = btmtk_sdio_set_own_back(FW_OWN);
 	if (ret)
-	    pr_err("%s set fw own fail\n", __func__);
-        pr_notice("%s return 0 directly\n", __func__);
-	return 0;//sdio_set_host_pm_flags(func, MMC_PM_KEEP_POWER);
+		pr_err("%s set fw own fail\n", __func__);
+
+	return sdio_set_host_pm_flags(func, MMC_PM_KEEP_POWER);
 }
 
 static int btmtk_sdio_resume(struct device *dev)
 {
+	u8 ret = 0;
+
+	if (g_card == NULL) {
+		pr_err("%s: g_card is NULL return", __func__);
+		return 0;
+	}
+
+	g_card->suspend_count--;
+	if (g_card->suspend_count) {
+		pr_warn("%s: data->suspend_count %d, return 0", __func__, g_card->suspend_count);
+		return 0;
+	}
+
+	ret = btmtk_sdio_handle_leaving_WoBLE_state();
+
+	if (ret)
+		pr_err("%s: btmtk_sdio_handle_leaving_WoBLE_state return fail  %d", __func__, ret);
+
 	pr_info("%s begin return 0, do nothing\n", __func__);
-    btmtk_sdio_bt_set_power(1);
 	return 0;
 }
 
@@ -2504,6 +3334,27 @@
 	}
 };
 
+static int btmtk_clean_queue(void)
+{
+	struct sk_buff *skb = NULL;
+
+	lock_unsleepable_lock(&(metabuffer.spin_lock));
+	if (!skb_queue_empty(&g_priv->adapter->fops_queue)) {
+		pr_info("%s clean data in fops_queue\n", __func__);
+		do {
+			skb = skb_dequeue(&g_priv->adapter->fops_queue);
+			if (skb == NULL) {
+				pr_info("%s skb=NULL error break\n", __func__);
+				break;
+			}
+
+			kfree_skb(skb);
+		} while (!skb_queue_empty(&g_priv->adapter->fops_queue));
+	}
+	unlock_unsleepable_lock(&(metabuffer.spin_lock));
+	return 0;
+}
+
 static int btmtk_fops_open(struct inode *inode, struct file *file)
 {
 	pr_info("%s begin\n", __func__);
@@ -2530,6 +3381,14 @@
 		return -ENOENT;
 	}
 
+	if (g_card) {
+		if (is_support_unify_woble(g_card))
+			btmtk_sdio_send_apcf_reserved();
+	} else
+		pr_err("%s g_card is NULL\n", __func__);
+
+	btmtk_clean_queue();
+
 	if (g_priv)
 		g_priv->adapter->fops_mode = true;
 
@@ -2539,8 +3398,6 @@
 
 static int btmtk_fops_close(struct inode *inode, struct file *file)
 {
-	struct sk_buff *skb = NULL;
-
 	pr_info("%s begin\n", __func__);
 
 	if (!probe_ready) {
@@ -2549,25 +3406,10 @@
 		return -EFAULT;
 	}
 
-	spin_lock_init(&(metabuffer.spin_lock.lock));
 	if (g_priv)
 		g_priv->adapter->fops_mode = false;
 
-	lock_unsleepable_lock(&(metabuffer.spin_lock));
-
-	if (!skb_queue_empty(&g_priv->adapter->fops_queue)) {
-		pr_info("%s clean data in fops_queue\n", __func__);
-		do {
-			skb = skb_dequeue(&g_priv->adapter->fops_queue);
-			if (skb == NULL) {
-				pr_info("%s skb=NULL error break\n", __func__);
-				break;
-			}
-
-			kfree_skb(skb);
-		} while (!skb_queue_empty(&g_priv->adapter->fops_queue));
-	}
-	unlock_unsleepable_lock(&(metabuffer.spin_lock));
+	btmtk_clean_queue();
 
 	pr_info("%s fops_mode=%d end\n", __func__, g_priv->adapter->fops_mode);
 	return 0;
@@ -2579,7 +3421,9 @@
 	int retval = 0;
 	struct sk_buff *skb = NULL;
 	u32 crAddr = 0, crValue = 0, crMask = 0;
-	/*int i = 0;*/
+	static u8 waiting_for_hci_without_packet_type; /* INITIALISED_STATIC: do not initialise statics to 0 */
+	static u8 hci_packet_type = 0xff;
+	u32 copy_size = 0;
 
 	if (!probe_ready) {
 		pr_err("%s probe_ready is %d return\n",
@@ -2654,16 +3498,53 @@
 				__func__, crAddr, crValue, crMask);
 		retval = count;
 	} else {
-		skb = bt_skb_alloc(count-1, GFP_ATOMIC);
-		bt_cb(skb)->pkt_type = buf[0];
-		memcpy(&skb->data[0], &buf[1], count-1);
-		skb->len = count-1;
+		if (waiting_for_hci_without_packet_type == 1 && count == 1) {
+			pr_warn("%s: Waiting for hci_without_packet_type, but receive data count is 1!", __func__);
+			pr_warn("%s: Treat this packet as packet_type", __func__);
+			retval = copy_from_user(&hci_packet_type, &buf[0], 1);
+			waiting_for_hci_without_packet_type = 1;
+			retval = 1;
+			goto OUT;
+		}
+
+		if (waiting_for_hci_without_packet_type == 0) {
+			if (count == 1) {
+				retval = copy_from_user(&hci_packet_type, &buf[0], 1);
+				waiting_for_hci_without_packet_type = 1;
+				retval = 1;
+				goto OUT;
+			}
+		}
+
+		if (waiting_for_hci_without_packet_type) {
+			copy_size = count + 1;
+			skb = bt_skb_alloc(copy_size-1, GFP_ATOMIC);
+			bt_cb(skb)->pkt_type = hci_packet_type;
+			memcpy(&skb->data[0], &buf[0], copy_size-1);
+		} else {
+			copy_size = count;
+			skb = bt_skb_alloc(copy_size-1, GFP_ATOMIC);
+			bt_cb(skb)->pkt_type = buf[0];
+			memcpy(&skb->data[0], &buf[1], copy_size-1);
+		}
+
+
+		skb->len = copy_size-1;
 		skb_queue_tail(&g_priv->adapter->tx_queue, skb);
 		wake_up_interruptible(&g_priv->main_thread.wait_q);
 
-		retval = count;
+		retval = copy_size;
+
+		if (waiting_for_hci_without_packet_type) {
+			hci_packet_type = 0xff;
+			waiting_for_hci_without_packet_type = 0;
+			if (retval > 0)
+				retval -= 1;
+		}
 	}
 
+OUT:
+
 	pr_debug("%s end\n", __func__);
 	return retval;
 }
@@ -2672,6 +3553,9 @@
 			size_t count, loff_t *f_pos)
 {
 	struct sk_buff *skb = NULL;
+	int copyLen = 0;
+	u8 hwerr_event[] = { 0x04, 0x10, 0x01, 0xff };
+	static int send_hw_err_event_count;
 
 	if (!probe_ready) {
 		pr_err("%s probe_ready is %d return\n",
@@ -2689,6 +3573,39 @@
 		return -EFAULT;
 	}
 
+	if (need_reset_stack == 1) {
+		pr_warn("%s: Reset BT stack", __func__);
+		pr_warn("%s: go if send_hw_err_event_count %d", __func__, send_hw_err_event_count);
+		if (send_hw_err_event_count < sizeof(hwerr_event)) {
+			if (count < (sizeof(hwerr_event) - send_hw_err_event_count)) {
+				copyLen = count;
+				pr_info("call wake_up_interruptible");
+				wake_up_interruptible(&inq);
+			} else
+				copyLen = (sizeof(hwerr_event) - send_hw_err_event_count);
+			pr_warn("%s: in if copyLen = %d", __func__, copyLen);
+			if (copy_to_user(buf, hwerr_event + send_hw_err_event_count, copyLen)) {
+				pr_err("send_hw_err_event_count %d copy to user fail, count = %d, go out",
+					send_hw_err_event_count, copyLen);
+				copyLen = -EFAULT;
+				goto OUT;
+			}
+			send_hw_err_event_count += copyLen;
+			pr_warn("%s: in if send_hw_err_event_count = %d", __func__, send_hw_err_event_count);
+			if (send_hw_err_event_count >= sizeof(hwerr_event)) {
+				send_hw_err_event_count  = 0;
+				pr_warn("%s: set need_reset_stack=0", __func__);
+				need_reset_stack = 0;
+			}
+			pr_warn("%s: set call up", __func__);
+			goto OUT;
+		} else {
+			pr_warn("%s: xx set copyLen = -EFAULT", __func__);
+			copyLen = -EFAULT;
+			goto OUT;
+		}
+	}
+
 	lock_unsleepable_lock(&(metabuffer.spin_lock));
 	if (skb_queue_empty(&g_priv->adapter->fops_queue)) {
 		/* if (filp->f_flags & O_NONBLOCK) { */
@@ -2712,6 +3629,7 @@
 			pr_info("%s skb=NULL break\n", __func__);
 			break;
 		}
+
 #if 0
 		pr_debug("%s pkt_type %d metabuffer.buffer %d",
 			__func__, bt_cb(skb)->pkt_type,
@@ -2729,6 +3647,10 @@
 	unlock_unsleepable_lock(&(metabuffer.spin_lock));
 
 	return btmtk_sdio_pull_data_from_metabuffer(buf, count);
+
+OUT:
+	return copyLen;
+
 }
 
 static int btmtk_fops_fasync(int fd, struct file *file, int on)
@@ -2832,6 +3754,8 @@
 	memset(i_fwlog_buf, 0, HCI_MAX_COMMAND_BUF_SIZE);
 	memset(o_fwlog_buf, 0, HCI_MAX_COMMAND_SIZE);
 
+	btmtk_sdio_set_own_back(DRIVER_OWN);
+
 	if (g_priv == NULL) {
 		pr_info("%s g_priv is NULL\n", __func__);
 		goto exit;
@@ -3114,32 +4038,54 @@
 	dev_t dev = MKDEV(BTMTK_major, 0);
 	dev_t devIDfwlog = g_devIDfwlog;
 
-	pr_info("BTMTK_exit\n");
+	pr_info("%s\n", __func__);
+	if (g_card) {
+		pr_info("%s 1\n", __func__);
+		if (g_card->woble_setting_file_name) {
+			pr_info("%s 2\n", __func__);
+			kfree(g_card->woble_setting_file_name);
+			pr_info("%s 3\n", __func__);
+			pr_info("free woble_setting_file_name done\n");
+		} else {
+			pr_err("%s no free woble_setting_file_name, g_card is not null\n", __func__);
+			pr_err("%s woble_setting_file_name is null\n", __func__);
+		}
+	} else
+		pr_err("no free woble_setting_file_name, g_card is null\n");
 
+#if (SUPPORT_UNIFY_WOBLE & SUPPORT_ANDROID)
+		pr_info("%s 4\n", __func__);
+		if (g_card)
+			wake_lock_destroy(&g_card->woble_wlock);
+		else
+			pr_err("%s:g_data is NULL, no destroy woble_wlock", __func__);
+#endif
+
+	pr_info("%s 5\n", __func__);
 	if (pBTDevfwlog) {
+		pr_info("%s 6\n", __func__);
 		device_destroy(pBTClass, devIDfwlog);
 		pBTDevfwlog = NULL;
 	}
-
+	pr_info("%s 7\n", __func__);
 	if (pBTDev) {
 		device_destroy(pBTClass, dev);
 		pBTDev = NULL;
 	}
-
+	pr_info("%s 8\n", __func__);
 	if (pBTClass) {
 		class_destroy(pBTClass);
 		pBTClass = NULL;
 	}
-
+	pr_info("%s 9\n", __func__);
 	cdev_del(&BTMTK_cdev);
+	pr_info("%s 10\n", __func__);
 	unregister_chrdev_region(dev, 1);
 	pr_info("%s driver removed.\n", BT_DRIVER_NAME);
 }
 
-static int __init btmtk_sdio_init_module(void)
+static int btmtk_sdio_allocate_memory(void)
 {
-	BTMTK_init();
-
 	if (txbuf == NULL) {
 		txbuf = kmalloc(MTK_TXDATA_SIZE, GFP_ATOMIC);
 		memset(txbuf, 0, MTK_TXDATA_SIZE);
@@ -3150,21 +4096,33 @@
 		memset(rxbuf, 0, MTK_RXDATA_SIZE);
 	}
 
+	return 0;
+}
+
+static int btmtk_sdio_free_memory(void)
+{
+	kfree(txbuf);
+
+	kfree(rxbuf);
+
+	kfree(fw_dump_ptr);
+
+	return 0;
+}
+
+static int __init btmtk_sdio_init_module(void)
+{
+	BTMTK_init();
+
+	if (btmtk_sdio_allocate_memory() < 0) {
+		pr_err("%s: allocate memory failed!", __func__);
+		return -ENOMEM;
+	}
+
 	if (sdio_register_driver(&bt_mtk_sdio) != 0) {
 		pr_err("SDIO Driver Registration Failed\n");
 		return -ENODEV;
 	}
-#ifdef BT_SUPPORT_PMU_EN_CTRL
-    /* Pull PMU_EN to high */
-    if (!cnnPmuStatusGet()) {
-        cnnPmuPullUp();
-    }
-#endif
-
-#ifdef BT_DRIVER_BUILD_MODULE
-    /* Trigger SDIO BUS Rescan in ko module  */
-    sdio_card_detect(1);
-#endif
 
 	pr_info("SDIO Driver Registration Success\n");
 
@@ -3178,14 +4136,9 @@
 {
 	/* Set the flag as user is removing this module. */
 	user_rmmod = 1;
-
 	BTMTK_exit();
-
 	sdio_unregister_driver(&bt_mtk_sdio);
-
-	kfree(txbuf);
-
-	kfree(rxbuf);
+	btmtk_sdio_free_memory();
 }
 
 module_init(btmtk_sdio_init_module);
diff --git a/btmtk_sdio.h b/btmtk_sdio.h
old mode 100755
new mode 100644
index 73fb741..d6fe106
--- a/btmtk_sdio.h
+++ b/btmtk_sdio.h
@@ -1,30 +1,27 @@
 /*
- * Mediatek BT-over-SDIO driver: SDIO interface related definitions
+ *  Copyright (c) 2016,2017 MediaTek Inc.
  *
- * Copyright (C) 2017, Mediatek International Ltd.
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License version 2 as
+ *  published by the Free Software Foundation.
  *
- * This software file (the "File") is distributed by Mediatek International
- * Ltd. under the terms of the GNU General Public License Version 2, June 1991
- * (the "License").  You may use, redistribute and/or modify this File in
- * accordance with the terms and conditions of the License, a copy of which
- * is available by writing to the Free Software Foundation, Inc.,
- * On the worldwide web at http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
- *
- *
- * THE FILE IS DISTRIBUTED AS-IS, WITHOUT WARRANTY OF ANY KIND, AND THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE
- * ARE EXPRESSLY DISCLAIMED.  The License provides additional details about
- * this warranty disclaimer.
- *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ *  See http://www.gnu.org/licenses/gpl-2.0.html for more details.
  */
 
 #ifndef _BTMTK_SDIO_H_
 #define _BTMTK_SDIO_H_
+#include "btmtk_config.h"
 
-#define VERSION "v0.0.0.32"
+
+#define VERSION "v0.0.0.38_2017121801"
 
 #define SDIO_HEADER_LEN                 4
 
+#define BD_ADDRESS_SIZE 6
+
 #define DUMP_HCI_LOG_FILE_NAME          "/sys/hcilog"
 /* SD block size can not bigger than 64 due to buf size limit in firmware */
 /* define SD block size for data Tx/Rx */
@@ -119,6 +116,18 @@
 	u8 fw_dump_start;
 	u8 fw_dump_end;
 	u8 func_num;
+	u32 chip_id;
+};
+
+#define WOBLE_SETTING_FILE_NAME "woble_setting.bin"
+#define WOBLE_SETTING_COUNT 10
+
+#define WOBLE_FAIL -10
+
+
+struct woble_setting_struct {
+	char	*content;	/* APCF conecnt or radio off content */
+	int	length;		/* APCF conecnt or radio off content of length */
 };
 
 struct btmtk_sdio_card {
@@ -133,6 +142,35 @@
 	u16 sd_blksz_fw_dl;
 	u8 rx_unit;
 	struct btmtk_private *priv;
+
+
+	unsigned char		*woble_setting;
+	unsigned char		*woble_setting_file_name;
+	unsigned int		woble_setting_len;
+
+	unsigned int		chip_id;
+	struct woble_setting_struct		woble_setting_apcf[WOBLE_SETTING_COUNT];
+	struct woble_setting_struct		woble_setting_apcf_fill_mac[WOBLE_SETTING_COUNT];
+	struct woble_setting_struct		woble_setting_apcf_fill_mac_location[WOBLE_SETTING_COUNT];
+
+	struct woble_setting_struct		woble_setting_radio_off[WOBLE_SETTING_COUNT];
+	struct woble_setting_struct		woble_setting_radio_off_status_event[WOBLE_SETTING_COUNT];
+	/* complete event */
+	struct woble_setting_struct		woble_setting_radio_off_comp_event[WOBLE_SETTING_COUNT];
+
+	struct woble_setting_struct		woble_setting_radio_on[WOBLE_SETTING_COUNT];
+	struct woble_setting_struct		woble_setting_radio_on_status_event[WOBLE_SETTING_COUNT];
+	struct woble_setting_struct		woble_setting_radio_on_comp_event[WOBLE_SETTING_COUNT];
+
+	int		suspend_count;
+	/* set apcf after resume(radio on) */
+	struct woble_setting_struct		woble_setting_apcf_resume[WOBLE_SETTING_COUNT];
+	struct woble_setting_struct		woble_setting_apcf_resume_event[WOBLE_SETTING_COUNT];
+	unsigned char					bdaddr[BD_ADDRESS_SIZE];
+	unsigned int					woble_need_trigger_coredump;
+#if (SUPPORT_UNIFY_WOBLE & SUPPORT_ANDROID)
+	struct					wake_lock woble_wlock;
+#endif
 };
 struct btmtk_sdio_device {
 	const char *helper;
@@ -243,5 +281,45 @@
 extern unsigned char *txbuf;
 extern u8 probe_ready;
 
-#endif
+enum {
+	BTMTK_WOBLE_STATE_UNKNOWN,
+	BTMTK_WOBLE_STATE_SUSPEND,
+	BTMTK_WOBLE_STATE_RESUME,
+	BTMTK_WOBLE_STATE_DUMPING,
+	BTMTK_WOBLE_STATE_DUMPEND,
+	BTMTK_WOBLE_STATE_NEEDRESET_STACK,
+};
 
+enum {
+	BTMTK_SDIO_EVENT_COMPARE_STATE_UNKNOWN,
+	BTMTK_SDIO_EVENT_COMPARE_STATE_NOTHING_NEED_COMPARE,
+	BTMTK_SDIO_EVENT_COMPARE_STATE_NEED_COMPARE,
+	BTMTK_SDIO_EVENT_COMPARE_STATE_COMPARE_SUCCESS,
+};
+
+
+/**
+ * Maximum rom patch file name length
+ */
+#define MAX_BIN_FILE_NAME_LEN	32
+
+
+#define COMPARE_FAIL				-1
+#define COMPARE_SUCCESS				1
+#define WOBLE_COMP_EVENT_TIMO		5000
+
+
+/**
+ * Inline functions
+ */
+static inline int is_support_unify_woble(struct btmtk_sdio_card *data)
+{
+#if SUPPORT_UNIFY_WOBLE
+	return ((data->chip_id & 0xffff) == 0x7668);
+#else
+	return 0;
+#endif
+}
+
+
+#endif
diff --git a/btmtk_usb_dbgfs.c b/btmtk_usb_dbgfs.c
deleted file mode 100644
index 56c0bc9..0000000
--- a/btmtk_usb_dbgfs.c
+++ /dev/null
@@ -1,644 +0,0 @@
-/*
-*  Copyright (c) 2016 MediaTek Inc.
-*
-*  This program is free software; you can redistribute it and/or modify
-*  it under the terms of the GNU General Public License version 2 as
-*  published by the Free Software Foundation.
-*
-*  This program is distributed in the hope that it will be useful,
-*  but WITHOUT ANY WARRANTY; without even the implied warranty of
-*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-*  GNU General Public License for more details.
-*/
-#if defined(CONFIG_DEBUG_FS) && (CONFIG_DEBUG_FS == 1)
-
-#include <linux/debugfs.h>
-#include <linux/semaphore.h>
-#include <linux/slab.h>
-#include <linux/skbuff.h>
-#include <linux/kref.h>
-#include <linux/semaphore.h>
-#include <linux/compiler.h>
-
-#include "btmtk_usb_dbgfs.h"
-#include "btmtk_usb_main.h"
-
-/**
- * Directory define.,
- * If this functionality enabled you should find specific file in
- *  /sys/kernel/debug/BTDBG_ROOT/
- */
-#define BTDBG_ROOT	"mtkbt"
-#define BTDBG_DEV	"bt_dev"
-#define BTDBG_TRACE	"log_lvl"
-
-#define FS_BUFFER_SIZE 2048
-#define MTKBT_MAX_HCI_FRAME_SIZE 1028	/* (BT_MAX_ACL_SIZE + 4) */
-
-struct BTDbg_Func_t {
-	const char *name;
-	int (*fp)(const char *value, void *dbg_filp);
-	const char *doc;
-	const char *help;
-};
-
-struct BTDbg_FW_Func_t {
-	const char *major;
-	const char *minor[DBG_FW_MAX_CMD_COUNT];
-	const char *cmd[DBG_FW_MAX_CMD_COUNT];
-	const char *doc[DBG_FW_MAX_CMD_COUNT];
-};
-
-/**
- * Global variable
- */
-static struct mtkdbg_data_t *g_mtkbt_dbg;
-u8 btmtk_log_lvl = BTMTK_LOG_LEVEL_DEFAULT;
-
-/**
- * Function prototype
- */
-static int btmtk_dbgfs_data_alloc(void *dbg_filp);
-static void btmtk_dbgfs_data_free(void *dbg_filp);
-static int btmtk_dbgfs_fw_func_main(const char *value, void *dbg_filp);
-static int btmtk_dbgfs_tx_frame(void *drv_data, const unsigned char *buffer, const unsigned int length);
-
-static int strtol_access_ok(char ch)
-{
-	if ((ch >= '0' && ch <= '9') || (ch >= 'A' && ch <= 'F')
-		|| (ch >= 'a' && ch <= 'f'))
-		return 0;
-
-	BTUSB_ERR("wrong char_%c_", ch);
-
-	return -1;
-}
-
-static int str_to_u8(const char *ptr)
-{
-	u8 ret = 0;
-	u8 temp_str[3] = { 0 };
-	long res = 0;
-
-	temp_str[0] = *ptr;
-	temp_str[1] = *(ptr + 1);
-
-	ret = (u8) (kstrtol((char *)temp_str, 16, &res) & 0xff);
-
-	return res;
-}
-
-static int str_to_bytes(u8 *cmd_buf, const char *ptr)
-{
-	int i = 0, j = 0, len = 0;
-
-	len = strlen(ptr);
-
-	while (i < len) {
-		if (ptr[i] == ' ' || ptr[i] == '\t' || ptr[i] == '\r'
-			|| ptr[i] == '\n') {
-			i++;
-			continue;
-		}
-
-		if ((ptr[i] == '0' && ptr[i + 1] == 'x')
-			|| (ptr[0] == '0' && ptr[i + 1] == 'X')) {
-			i += 2;
-			continue;
-		}
-
-		if (strtol_access_ok(ptr[i]) != 0)
-			break;
-
-		cmd_buf[j++] = str_to_u8(&ptr[i]);
-		i += 2;
-	}
-
-	return j;
-}
-
-static int btmtk_dbgfs_tx_frame(void *drv_data, const unsigned char *buffer, const unsigned int length)
-{
-	int retval = -1;
-
-	BTUSB_DBG("%s: hci cmd", __func__);
-
-	if (unlikely(buffer == NULL || length <= 0)) {
-		BTUSB_ERR("%s: [hci_buf = %p][length = 0x%x]", __func__, buffer, length);
-		return -EFAULT;
-	}
-
-	if (drv_data != NULL)
-		BTUSB_DBG("%s: [drv_data=%p]", __func__, drv_data);
-
-
-	switch (buffer[0]) {
-	case MTK_HCI_COMMAND_PKT:
-		retval = btmtk_usb_meta_send_data(buffer, length);
-		break;
-
-	case MTK_HCI_ACLDATA_PKT:
-	case MTK_HCI_SCODATA_PKT:
-		retval = btmtk_usb_send_data(buffer, length);
-		break;
-
-	default:
-		BTUSB_ERR("%s: [INVALID PACKAGE TYPE = %d]", __func__, buffer[0]);
-		return -EILSEQ;
-	}
-
-	BTUSB_DBG("%s: retval = %d", __func__, retval);
-
-	return retval;
-}
-
-static int btmtk_dbgfs_tx_hci_data(const char *value, void *dbg_filp)
-{
-	int length = 0, ret = 0;
-	u8 *hci_cmd = NULL;
-	struct mtkdbg_data_t *mtkdbg_filp = (struct mtkdbg_data_t *)dbg_filp;
-
-	if (!mtkdbg_filp->hci_buf) {
-
-		BTUSB_ERR("%s: hci buff is null", __func__);
-		btmtk_dbgfs_data_alloc(mtkdbg_filp);
-
-		if (!mtkdbg_filp->hci_buf)
-			return -1;
-	}
-
-	hci_cmd = mtkdbg_filp->hci_buf;
-
-	length = str_to_bytes(hci_cmd, value);
-
-	BTUSB_DBG_RAW(hci_cmd, length, "%s: dump cmd:", __func__);
-
-	if (mtkdbg_filp->drv_data)
-		BTUSB_DBG("%s: [mtkdbg_filp->drv_data = %p]", __func__,
-			mtkdbg_filp->drv_data);
-
-	ret = btmtk_dbgfs_tx_frame(mtkdbg_filp->drv_data, hci_cmd, length);
-
-	BTUSB_DBG("%s: ret = %d", __func__, ret);
-
-	return length;
-}
-
-static struct BTDbg_Func_t dbgfs_func_list[] = {
-	{"HCI", btmtk_dbgfs_tx_hci_data, "tx hci data with type only",
-		"01 6F FC 05 01 02 01 00 08"},
-	{"FW", btmtk_dbgfs_fw_func_main, "set fw to do something", "DUMP"},
-	{"", NULL, NULL, NULL}
-};
-
-static struct BTDbg_FW_Func_t dbgfs_fw_func_list[] = {
-	{ "DUMP", {"1", "2"},
-		{"01 6F FC 05 01 02 01 00 08", "02 6F FC 05 01 02 01 00 08"},
-		{"tx fw assert cmd from endpoint 0", "tx fw assert cmd from endpoint 2"} },
-	{ NULL, {NULL, NULL}, {NULL, NULL}, {NULL, NULL} }
-};
-
-static void btmtk_dbgfs_func_usage(struct BTDbg_Func_t *funclp)
-{
-	int i;
-
-	BTUSB_DBG("Usage:\n\t <command>= value01 value02 ... ");
-	for (i = 0; funclp[i].fp; i++)
-		BTUSB_DBG("[%s]example:\n \t \t <%s>=<%s>", funclp[i].doc, funclp[i].name, funclp[i].help);
-
-	BTUSB_DBG("<command> should be less than DBG_TAG_MAX_LEN(0x%x) bytes",
-		DBG_TAG_MAX_LEN);
-	BTUSB_DBG("<value> should be less than FS_BUFFER_SIZE(0x%x) bytes",
-		FS_BUFFER_SIZE);
-}
-
-static void btmtk_dbgfs_fw_func_usage(struct BTDbg_FW_Func_t *funclp)
-{
-	int i, j;
-
-	BTUSB_DBG("Usage:\n\t <FW>= value01 value02 ...");
-	for (i = 0; funclp[i].major; i++) {
-		for (j = 0; j < DBG_FW_MAX_CMD_COUNT; j++) {
-			BTUSB_DBG("%s: example:\n \t \t \t \t <FW>=<%s><%s>",
-				__func__, funclp[i].major,
-				funclp[i].minor[j]);
-			BTUSB_DBG("%s: means:[%s]", __func__,
-				funclp[i].doc[j]);
-			BTUSB_DBG("%s: tx fw cmd [%s]", __func__,
-				funclp[i].cmd[j]);
-		}
-	}
-}
-
-static int btmtk_dbgfs_fw_func_main(const char *value, void *dbg_filp)
-{
-	int i;
-	u32 index = 0;
-	const char *s2 = value;
-
-	BTUSB_DBG("%s: [FW=%s]", __func__, value);
-
-	while (1) {
-		if (dbgfs_fw_func_list[index].major == NULL || value == NULL)
-			goto fw_exit;
-
-		s2 = strstr(value, dbgfs_fw_func_list[index].major);
-
-		if (s2 != NULL) {
-			for (i = 0; i < DBG_FW_MAX_CMD_COUNT; i++) {
-				if (dbgfs_fw_func_list[index].minor[i] ==
-					NULL)
-					continue;
-
-				if (strstr(s2, dbgfs_fw_func_list[index].minor[i]) != NULL)
-					break;
-			}
-
-			if (i < DBG_FW_MAX_CMD_COUNT)
-				break;
-		}
-		index++;
-	}
-
-	BTUSB_DBG("%s: match [cmd =%s]", __func__,
-		dbgfs_fw_func_list[index].cmd[i]);
-	btmtk_dbgfs_tx_hci_data(dbgfs_fw_func_list[index].cmd[i], dbg_filp);
-
-	return 0;
-
-fw_exit:
-	BTUSB_DBG("%s: [FW=Wrong cmd!] Fail", __func__);
-	btmtk_dbgfs_fw_func_usage(dbgfs_fw_func_list);
-	return -1;
-}
-
-static int btmtk_dbgfs_get_option(char *option)
-{
-	u32 index = 0;
-
-	while (1) {
-		if (strcmp(option, dbgfs_func_list[index].name) == 0)
-			return index;
-
-		if (dbgfs_func_list[index].fp == NULL)
-			return -1;
-
-		index++;
-	}
-}
-
-int BTDbg_Func_Entry(void *dbg_filp, u8 *tag, const char *value)
-{
-	int index;
-	int ret = 0;
-
-	if (tag == NULL)
-		goto exit;
-
-	index = btmtk_dbgfs_get_option(tag);
-
-	if (index == -1)
-		goto exit;
-
-	ret = dbgfs_func_list[index].fp(value, dbg_filp);
-	if (ret < 0) {
-		BTUSB_ERR("[tag = %s][value = %s], fail", tag, value);
-		return -1;
-	}
-
-	return 0;
-exit:
-	btmtk_dbgfs_func_usage(dbgfs_func_list);
-	return -1;
-}
-
-int btmtk_dbgfs_func_main(const char *value, void *dbg_filp)
-{
-	static int count_f;
-	int val_len = 0, i;
-	u8 Tag_param[DBG_TAG_MAX_LEN] = { 0 };
-	const char *val_param = NULL;
-
-	if (unlikely(dbg_filp == NULL || value == NULL)) {
-		BTUSB_ERR("%s: [flp =0x%p][value = 0x%p] fail", __func__,
-			dbg_filp, value);
-		return -1;
-	}
-
-	count_f++;
-
-	BTUSB_DBG("%s: in count = %d", __func__, count_f);
-
-	val_len = strlen(value);
-
-	val_len = val_len < DBG_TAG_MAX_LEN ? val_len : DBG_TAG_MAX_LEN;
-
-	for (i = 0; i < val_len; i++) {
-		if (value[i] != '=')
-			Tag_param[i] = value[i];
-		else
-			break;
-	}
-
-	if (i < val_len) {
-		val_param = &value[i + 1];
-		BTDbg_Func_Entry(dbg_filp, Tag_param, val_param);
-
-	} else {
-		btmtk_dbgfs_func_usage(dbgfs_func_list);
-	}
-
-	BTUSB_DBG("%s: out = %d", __func__, count_f);
-	return 0;
-}
-
-static int BTDbg_dev_open(struct inode *inode, struct file *file)
-{
-	struct mtkdbg_data_t *mtkdbg_filp = NULL;
-
-	BTUSB_DBG("%s: %s/%s open", __func__, BTDBG_ROOT, BTDBG_DEV);
-
-	file->private_data = inode->i_private;
-
-	mtkdbg_filp = (struct mtkdbg_data_t *)file->private_data;
-
-	if (mtkdbg_filp)
-		sema_init(&mtkdbg_filp->wr_lock, 1);
-
-	return 0;
-}
-
-static int BTDbg_dev_close(struct inode *inode, struct file *filp)
-{
-	BTUSB_DBG("[%s][%s]close", BTDBG_ROOT, BTDBG_DEV);
-
-	filp->private_data = NULL;
-
-	return 0;
-}
-
-ssize_t BTDbg_dev_write(struct file *filp, const char __user *buf,
-			size_t count, loff_t *f_pos)
-{
-	struct mtkdbg_data_t *mtkdbg_filp = (struct mtkdbg_data_t *)filp->private_data;
-
-	if (mtkdbg_filp == NULL) {
-
-		BTUSB_ERR("%s: no mtkbt dgb data", __func__);
-		return -ENODEV;
-	}
-
-	down(&mtkdbg_filp->wr_lock);
-
-	if (mtkdbg_filp->w_buf == NULL) {
-		BTUSB_ERR("%s: no w_buf", __func__);
-
-		btmtk_dbgfs_data_alloc((void *)mtkdbg_filp);
-
-		if (mtkdbg_filp->w_buf == NULL)
-			goto wt_exit;
-	}
-
-	memset(mtkdbg_filp->w_buf, 0, FS_BUFFER_SIZE);
-
-	if (unlikely(count > FS_BUFFER_SIZE)) {
-		BTUSB_WARN("%s: w count(%zu) > FS_BUFFER_SIZE(%d)", __func__, count, FS_BUFFER_SIZE);
-		count = FS_BUFFER_SIZE - 1;
-	}
-
-	if (count < FS_BUFFER_SIZE)
-		mtkdbg_filp->w_buf[count] = 0;
-
-	if (copy_from_user(mtkdbg_filp->w_buf, buf, count) != 0) {
-		BTUSB_ERR("[%s][%s]copy_from_user fail", BTDBG_ROOT,
-			BTDBG_DEV);
-		goto wt_exit;
-	}
-
-	BTUSB_DBG("%s: w_buf: %s", __func__, mtkdbg_filp->w_buf);
-
-#if 1
-	mtkdbg_filp->w_buf[count] = 0;
-	btmtk_dbgfs_func_main(mtkdbg_filp->w_buf, mtkdbg_filp);
-#else
-
-	io_len = strlen(mtkdbg_filp->w_buf);
-
-	if (io_len != count)
-		BTUSB_WARN("WARN:io_len != count");
-
-	target_len = io_len < 512 ? io_len : 512;
-
-	for (i = 0; i < 512; i++) {
-		if (mtkdbg_filp->w_buf[i] != '=')
-			parm_tag[i] = mtkdbg_filp->w_buf[i];
-		else
-			break;
-	}
-	if (i < 512) {
-		pValue = &mtkdbg_filp->w_buf[i + 1];
-		BTDbg_Func_Entry(parm_tag, pValue);
-	} else {
-		BTUSB_WARN("tag len should be less than 512");
-		goto wt_exit;
-	}
-#endif
-wt_exit:
-	up(&mtkdbg_filp->wr_lock);
-
-	return count;
-}
-
-const struct file_operations BTDbg_dev_fops = {
-	.open = BTDbg_dev_open,
-	.release = BTDbg_dev_close,
-	.write = BTDbg_dev_write
-};
-
-static int btmtk_dbgfs_data_alloc(void *dbg_filp)
-{
-	struct mtkdbg_data_t *mtkdbg_filp = (struct mtkdbg_data_t *)dbg_filp;
-
-	if (!mtkdbg_filp) {
-		BTUSB_ERR("%s: fail to alloc data for dbg file is null",
-			__func__);
-		return -1;
-	}
-
-	if (!mtkdbg_filp->btmtk_root_entery) {
-
-		BTUSB_ERR("%s: btmtk_root_entery is null", __func__);
-		return -1;
-	}
-
-	if (!mtkdbg_filp->btmtk_bt_dev_entry)
-		mtkdbg_filp->btmtk_bt_dev_entry =
-			debugfs_create_file(BTDBG_DEV, 0644,
-					mtkdbg_filp->btmtk_root_entery,
-					(void *)mtkdbg_filp, &BTDbg_dev_fops);
-
-	if (!mtkdbg_filp->btmtk_trace_entry)
-		mtkdbg_filp->btmtk_trace_entry =
-			debugfs_create_u8(BTDBG_TRACE, 0644,
-					mtkdbg_filp->btmtk_root_entery,
-					&btmtk_log_lvl);
-
-	if (mtkdbg_filp->btmtk_bt_dev_entry == NULL
-		|| mtkdbg_filp->btmtk_trace_entry == NULL) {
-
-		BTUSB_WARN("[%s = %p], [%s = %p]", BTDBG_DEV,
-			mtkdbg_filp->btmtk_bt_dev_entry, BTDBG_TRACE,
-			mtkdbg_filp->btmtk_trace_entry);
-
-	}
-	if (!mtkdbg_filp->w_buf)
-		mtkdbg_filp->w_buf = kmalloc(FS_BUFFER_SIZE, GFP_KERNEL);
-
-	if (!mtkdbg_filp->hci_buf)
-		mtkdbg_filp->hci_buf =
-			kmalloc(MTKBT_MAX_HCI_FRAME_SIZE, GFP_KERNEL);
-
-	if (mtkdbg_filp->w_buf == NULL || mtkdbg_filp->hci_buf == NULL) {
-		BTUSB_WARN("%s: [w_buf = %p][hci_buf = %p]", __func__,
-				mtkdbg_filp->w_buf, mtkdbg_filp->hci_buf);
-		return -1;
-	}
-
-	return 0;
-}
-
-static void btmtk_dbgfs_data_free(void *dbg_filp)
-{
-	struct mtkdbg_data_t *mtkdbg_filp = (struct mtkdbg_data_t *)dbg_filp;
-
-	if (!mtkdbg_filp) {
-		BTUSB_ERR("%s: fail to free data for dbg file is null",
-			__func__);
-		return;
-	}
-
-	if (!mtkdbg_filp->btmtk_root_entery) {
-		BTUSB_ERR("%s: fail to free for root entry is null", __func__);
-		return;
-	}
-
-	debugfs_remove(mtkdbg_filp->btmtk_bt_dev_entry);
-	mtkdbg_filp->btmtk_bt_dev_entry = NULL;
-
-	debugfs_remove(mtkdbg_filp->btmtk_trace_entry);
-	mtkdbg_filp->btmtk_trace_entry = NULL;
-
-	kfree(mtkdbg_filp->w_buf);
-	mtkdbg_filp->w_buf = NULL;
-
-	kfree(mtkdbg_filp->hci_buf);
-	mtkdbg_filp->hci_buf = NULL;
-}
-
-void btmtk_dbgfs_set_drvdata(void *drv_data)
-{
-	struct mtkdbg_data_t *mtkdbg_filp = g_mtkbt_dbg;
-
-	BTUSB_DBG("%s: enter", __func__);
-
-	if (unlikely(drv_data == NULL)) {
-
-		BTUSB_ERR("%s: fail for drv_data is null", __func__);
-		return;
-	}
-
-	if (unlikely(mtkdbg_filp == NULL)) {
-		BTUSB_ERR("%s: no mtkbt dgb data", __func__);
-		return;
-	}
-
-	mtkdbg_filp->drv_data = drv_data;
-}
-
-void btmtk_dbgfs_remove_drvdata(void)
-{
-	struct mtkdbg_data_t *mtkdbg_filp = g_mtkbt_dbg;
-
-	BTUSB_DBG("%s: enter", __func__);
-
-	if (unlikely(mtkdbg_filp == NULL)) {
-		BTUSB_ERR("%s: no mtkbt dgb data", __func__);
-		return;
-	}
-
-	mtkdbg_filp->drv_data = NULL;
-}
-
-int btmtk_dbgfs_init(void)
-{
-	struct mtkdbg_data_t *mtkdbg_filp;
-
-	UNUSED(btmtk_usb_table);	/* clear warning */
-	BTUSB_DBG("%s", __func__);
-
-	if (g_mtkbt_dbg != NULL)
-		BTUSB_WARN("%s: mtkbt dbg is not null, memory leak !", __func__);
-
-	mtkdbg_filp = kzalloc(sizeof(struct mtkdbg_data_t), GFP_KERNEL);
-
-	if (!mtkdbg_filp) {
-		BTUSB_ERR("%s: alloc mtk dbg file fail!", __func__);
-		return -1;
-	}
-
-	mtkdbg_filp->btmtk_root_entery = debugfs_create_dir(BTDBG_ROOT, NULL);
-
-	if (mtkdbg_filp->btmtk_root_entery == NULL) {
-		BTUSB_ERR("%s: fail to create dbg root dir !", __func__);
-		kfree(mtkdbg_filp);
-		return -1;
-	}
-
-	sema_init(&mtkdbg_filp->wr_lock, 1);
-
-	g_mtkbt_dbg = mtkdbg_filp;
-
-	btmtk_dbgfs_data_alloc((void *)g_mtkbt_dbg);
-
-	BTUSB_DBG("%s: success", __func__);
-	return 0;
-}
-
-void btmtk_dbgfs_exit(void)
-{
-
-	if (!g_mtkbt_dbg) {
-		BTUSB_ERR("%s: fail to exit dbg file is null", __func__);
-		return;
-	}
-
-	btmtk_dbgfs_data_free((void *)g_mtkbt_dbg);
-
-	debugfs_remove(g_mtkbt_dbg->btmtk_root_entery);	/*(bt_dev_entry); */
-	g_mtkbt_dbg->btmtk_root_entery = NULL;
-
-	kfree(g_mtkbt_dbg);
-	g_mtkbt_dbg = NULL;
-
-}
-
-#else /* CONFIG_DEBUG_FS */
-void btmtk_dbgfs_set_drvdata(void *drv_data)
-{
-}
-
-void btmtk_dbgfs_remove_drvdata(void)
-{
-}
-
-int btmtk_dbgfs_init(void)
-{
-	BTUSB_INFO("%s: debugfs is not enable now", __func__);
-	return 0;
-}
-
-void btmtk_dbgfs_exit(void)
-{
-}
-
-#endif /* CONFIG_DEBUG_FS */
diff --git a/btmtk_usb_dbgfs.h b/btmtk_usb_dbgfs.h
deleted file mode 100644
index e7e81c9..0000000
--- a/btmtk_usb_dbgfs.h
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
-*  Copyright (c) 2016 MediaTek Inc.
-*
-*  This program is free software; you can redistribute it and/or modify
-*  it under the terms of the GNU General Public License version 2 as
-*  published by the Free Software Foundation.
-*
-*  This program is distributed in the hope that it will be useful,
-*  but WITHOUT ANY WARRANTY; without even the implied warranty of
-*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-*  GNU General Public License for more details.
-*/
-#ifndef __BTMTK_USB_DBGFS_H__
-#define __BTMTK_USB_DBGFS_H__
-
-#include "btmtk_define.h"
-
-#define DBG_TAG_MAX_LEN		 32
-#define DBG_FW_MAX_CMD_COUNT	2
-
-struct mtkdbg_data_t {
-	/**
-	 * kref_get(&kref);
-	 * kref_put(&kref, btusb_delete);
-	 * kref_init(&kref);
-	 */
-	struct kref		 kref;
-	struct dentry	*btmtk_root_entery;
-	struct dentry	*btmtk_bt_dev_entry;
-	struct dentry	*btmtk_trace_entry;
-	struct dentry	*btmtk_fifo_entry;
-	struct semaphore	wr_lock;
-	void		*drv_data;
-	u8		*w_buf;
-	u8		*hci_buf;
-};
-
-/**
- * Extern functions
- */
-void btmtk_dbgfs_set_drvdata(void *drv_data);
-void btmtk_dbgfs_remove_drvdata(void);
-int btmtk_dbgfs_init(void);
-void btmtk_dbgfs_exit(void);
-
-#endif /* __BTMTK_USB_DBGFS_H__ */
diff --git a/btmtk_usb_fifo.c b/btmtk_usb_fifo.c
deleted file mode 100644
index 6170a79..0000000
--- a/btmtk_usb_fifo.c
+++ /dev/null
@@ -1,451 +0,0 @@
-/*
-*  Copyright (c) 2016 MediaTek Inc.
-*
-*  This program is free software; you can redistribute it and/or modify
-*  it under the terms of the GNU General Public License version 2 as
-*  published by the Free Software Foundation.
-*
-*  This program is distributed in the hope that it will be useful,
-*  but WITHOUT ANY WARRANTY; without even the implied warranty of
-*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-*  GNU General Public License for more details.
-*/
-
-#include "btmtk_define.h"
-
-#if ENABLE_BT_FIFO_THREAD
-#include <linux/kthread.h>
-#include <asm/uaccess.h>
-
-#include "btmtk_usb_fifo.h"
-#include "btmtk_usb_main.h"
-
-/**
- * Definition
- */
-#define FW_DUMP_SIZE (1024 * 16)
-#define SYS_LOG_SIZE (1024 * 16)
-
-#define KFIO_D(pData, t)	(((struct btmtk_fifo_data_t *)(pData))->fifo_l[t].kfifo.data)
-#define pKFIO(pData, t)		(&((struct btmtk_fifo_data_t *)(pData))->fifo_l[t].kfifo)
-#define pFIO(pData, t)		(&((struct btmtk_fifo_data_t *)(pData))->fifo_l[t])
-
-static struct btmtk_fifo_data_t g_fifo_data;
-
-static struct btmtk_fifo_t btmtk_fifo_list[] = {
-	{ FIFO_SYSLOG, SYS_LOG_SIZE, SYS_LOG_FILE_NAME, {0}, NULL, {0} },
-	{ FIFO_COREDUMP, FW_DUMP_SIZE, FW_DUMP_FILE_NAME, {0}, NULL, {0} },
-	{ FIFO_END, 0, NULL, {0}, NULL, {0} },
-	{ FIFO_BTBUF, 0, NULL, {0}, NULL, {0} }
-};
-
-static int fifo_alloc(struct btmtk_fifo_t *bt_fifo)
-{
-	int ret = 0;
-	struct __kfifo *kfio = &bt_fifo->kfifo;
-
-	ret = __kfifo_alloc(kfio, bt_fifo->size, 1, GFP_KERNEL);
-	if (ret == 0)
-		bt_fifo->size = kfio->mask + 1;
-
-	return ret;
-}
-
-static int fifo_init(struct btmtk_fifo_t *bt_fifo)
-{
-	int ret = 0;
-	struct __kfifo *kfio = &bt_fifo->kfifo;
-
-	BTUSB_INFO("%s: %d", __func__, bt_fifo->type);
-
-	ret = __kfifo_init(kfio, kfio->data, bt_fifo->size, kfio->esize);
-
-	if (bt_fifo->filp) {
-		BTUSB_INFO("%s: call filp_close", __func__);
-		vfs_fsync(bt_fifo->filp, 0);
-		filp_close(bt_fifo->filp, NULL);
-		bt_fifo->filp = NULL;
-		BTUSB_WARN("%s: FW dump file closed, rx=0x%X, tx =0x%x",
-				__func__, bt_fifo->stat.rx, bt_fifo->stat.tx);
-	}
-
-	bt_fifo->stat.rx = 0;
-	bt_fifo->stat.tx = 0;
-	return ret;
-}
-
-static void fifo_out_info(struct btmtk_fifo_data_t *data_p)
-{
-	struct __kfifo *fifo = NULL;
-
-	if (data_p == NULL) {
-		BTUSB_ERR("%s: data_p == NULL return", __func__);
-		return;
-	}
-
-	fifo = pKFIO(data_p, FIFO_SYSLOG);
-
-	if (fifo->data != NULL) {
-		if (fifo->in > fifo->out + fifo->mask)
-			BTUSB_WARN("sys_log buffer full");
-
-		if (fifo->in == fifo->out + fifo->mask)
-			BTUSB_WARN("sys_log buffer empty");
-
-		BTUSB_DBG("[syslog][fifo in - fifo out = 0x%x]",
-			fifo->in - fifo->out);
-	}
-
-	fifo = pKFIO(data_p, FIFO_COREDUMP);
-
-	if (fifo->data != NULL) {
-		if (fifo->in > fifo->out + fifo->mask)
-			BTUSB_WARN("coredump buffer full");
-
-		if (fifo->in == fifo->out + fifo->mask)
-			BTUSB_WARN("coredump buffer empty");
-	}
-}
-
-static u32 fifo_out_accessible(struct btmtk_fifo_data_t *data_p)
-{
-	int i;
-	struct btmtk_fifo_t *fio_p = NULL;
-
-	if (data_p == NULL)
-		return 0;
-
-	if (test_bit(TSK_SHOULD_STOP, &data_p->tsk_flag)) {
-		BTUSB_WARN("%s: task should stop", __func__);
-		return 1;
-	}
-
-	for (i = 0; i < FIFO_END; i++) {
-
-		fio_p = &data_p->fifo_l[i];
-
-		if (fio_p->type != i)
-			continue;
-
-		if (fio_p->kfifo.data != NULL) {
-			if (fio_p->kfifo.in != fio_p->kfifo.out)
-				return 1;
-		}
-	}
-
-	return 0;
-}
-
-static struct file *fifo_filp_open(const char *file, int flags, umode_t mode, unsigned int type)
-{
-	struct file *f = NULL;
-	/* Retry to open following path */
-	static const char * const sys[] = {
-		"/sdcard/"SYSLOG_FNAME, "/data/misc/bluedroid/"SYSLOG_FNAME, "/tmp/"SYSLOG_FNAME};
-	static const char * const fw[] = {
-		"/sdcard/"FWDUMP_FNAME, "/data/misc/bluedroid/"FWDUMP_FNAME, "/tmp/"SYSLOG_FNAME};
-	u8 i = 0;
-
-	f = filp_open(file, flags, mode);
-	if (IS_ERR(f)) {
-		const char *p = NULL;
-		u8 count = ARRAY_SIZE(sys);
-
-		f = NULL;
-		BTUSB_ERR("%s: open file error: %s, try to open others default path",
-				__func__, file);
-
-		if (type != FIFO_SYSLOG && type != FIFO_COREDUMP) {
-			BTUSB_ERR("%s: Incorrect type: %d", __func__, type);
-			return NULL;
-		}
-
-		for (i = 0; i < count; ++i) {
-			if (type == FIFO_SYSLOG)
-				p = sys[i];
-			else
-				p = fw[i];
-
-			if (memcmp(file, p, MIN(strlen(file), strlen(p))) != 0) {
-				BTUSB_INFO("%s: Try to open %s", __func__, p);
-				f = filp_open(p, flags, mode);
-				if (IS_ERR(f)) {
-					f = NULL;
-					continue;
-				}
-			} else {
-				continue;
-			}
-			BTUSB_INFO("%s: %s opened", __func__, p);
-			break;
-		}
-	}
-	return f;
-}
-
-static u32 fifo_out_to_file(struct btmtk_fifo_t *fio, u32 len, u32 off, u8 *end)
-{
-	struct __kfifo *fifo = &fio->kfifo;
-	unsigned int size = fifo->mask + 1;
-	unsigned int esize = fifo->esize;
-	unsigned int l;
-	unsigned char *dump_end = NULL;
-	mm_segment_t old_fs;
-
-	off &= fifo->mask;
-
-	if (esize != 1) {
-		off *= esize;
-		size *= esize;
-		len *= esize;
-	}
-	l = min(len, size - off);
-
-	if (l > 0 && fifo->data != NULL) {
-		old_fs = get_fs();
-		set_fs(KERNEL_DS);
-
-		if (fio->filp == NULL) {
-			BTUSB_WARN("%s: FW Dump started, open file %s", __func__,
-				fio->folder_name);
-
-			fio->filp = fifo_filp_open(fio->folder_name, O_RDWR | O_CREAT, 0644, fio->type);
-			if (IS_ERR(fio->filp)) {
-				set_fs(old_fs);
-				fio->filp = NULL;
-				return 0;
-			}
-		}
-
-		if (fio->filp != NULL) {
-			dump_end = strstr(fifo->data, FW_DUMP_END_EVENT);
-			fio->filp->f_op->write(fio->filp, fifo->data + off, l,
-					&fio->filp->f_pos);
-			fio->filp->f_op->write(fio->filp, fifo->data, len - l,
-					&fio->filp->f_pos);
-			fio->stat.tx += len;
-
-			if (dump_end && end) {
-				*end = 1;
-				BTUSB_INFO("%s: FW Dump finished(success)", __func__);
-			}
-		}
-		set_fs(old_fs);
-	}
-
-	/*
-	 * make sure that the data is copied before
-	 * incrementing the fifo->out index counter
-	 */
-	smp_wmb();
-	return len;
-}
-
-static u32 fifo_out_peek_fs(struct btmtk_fifo_t *fio, u32 len, u8 *end)
-{
-	unsigned int l;
-	struct __kfifo *fifo = &fio->kfifo;
-
-	l = fifo->in - fifo->out;
-	if (len > l)
-		len = l;
-
-	fifo_out_to_file(fio, len, fifo->out, end);
-
-	return len;
-}
-
-static u32 fifo_out_fs(void *fifo_d)
-{
-	u8 end = 0;
-	u32 len = 0;
-	struct btmtk_fifo_t *syslog_p = NULL;
-	struct btmtk_fifo_t *coredump_p = NULL;
-	struct btmtk_fifo_data_t *data_p = (void *)fifo_d;
-
-	if (fifo_d == NULL) {
-		BTUSB_ERR("[%s: fifo data is null]", __func__);
-		return len;
-	}
-
-	if (KFIO_D(fifo_d, FIFO_SYSLOG) != NULL) {
-		syslog_p = pFIO(fifo_d, FIFO_SYSLOG);
-		len = fifo_out_peek_fs(syslog_p, SYS_LOG_SIZE, &end);
-		syslog_p->kfifo.out += len;
-	}
-
-	if (KFIO_D(fifo_d, FIFO_COREDUMP) != NULL) {
-		coredump_p = pFIO(fifo_d, FIFO_COREDUMP);
-		len = fifo_out_peek_fs(coredump_p, FW_DUMP_SIZE, &end);
-		coredump_p->kfifo.out += len;
-	}
-
-	if (end) {
-		set_bit(TSK_SHOULD_STOP, &data_p->tsk_flag);
-		BTUSB_INFO("%s: [call btmtk_usb_toggle_rst_pinl]", __func__);
-		btmtk_usb_toggle_rst_pin();
-	}
-
-	return len;
-}
-
-static int btmtk_fifo_thread(void *ptr)
-{
-	struct btmtk_fifo_data_t *data_p = (struct btmtk_fifo_data_t *)ptr;
-
-	if (data_p == NULL) {
-		BTUSB_ERR("%s: [FIFO Data is null]", __func__);
-		return -1;
-	}
-
-	while (!kthread_should_stop() || test_bit(TSK_START, &data_p->tsk_flag)) {
-		wait_event_interruptible(data_p->rx_wait_q,
-					 fifo_out_accessible(data_p));
-		if (test_bit(TSK_SHOULD_STOP, &data_p->tsk_flag))
-			break;
-
-		fifo_out_info(data_p);
-		fifo_out_fs(data_p);
-		fifo_out_info(data_p);
-	}
-
-	set_bit(TSK_EXIT, &data_p->tsk_flag);
-	BTUSB_INFO("%s: end: down != 0", __func__);
-
-	return 0;
-}
-
-void *btmtk_fifo_init(void)
-{
-	int i;
-	struct btmtk_fifo_data_t *data_p = &g_fifo_data;
-	struct btmtk_fifo_t *fio_p = NULL;
-
-	UNUSED(btmtk_usb_table);	/* clear warning */
-	data_p->fifo_l = btmtk_fifo_list;
-
-	while (test_bit(TSK_RUNNING, &data_p->tsk_flag)) {
-		if (test_bit(TSK_EXIT, &data_p->tsk_flag))
-			break;
-
-		set_bit(TSK_SHOULD_STOP, &data_p->tsk_flag);
-		msleep(100);
-	}
-
-	data_p->tsk_flag = 0;
-
-	for (i = 0; i < FIFO_END; i++) {
-		fio_p = &(data_p->fifo_l[i]);
-		if (fio_p->type != i)
-			continue;
-
-		if (fio_p->kfifo.data == NULL)
-			fifo_alloc(fio_p);
-
-		fifo_init(fio_p);
-	}
-
-	init_waitqueue_head(&data_p->rx_wait_q);
-	set_bit(TSK_INIT, &data_p->tsk_flag);
-
-	return (void *)(data_p);
-}
-
-u32 btmtk_fifo_in(unsigned int type, void *fifo_d, const void *buf,
-			 unsigned int length)
-{
-	u32 len = 0;
-	u8 hci_pkt = MTK_HCI_EVENT_PKT;
-	struct btmtk_fifo_data_t *data_p = (struct btmtk_fifo_data_t *)fifo_d;
-	struct btmtk_fifo_t *fio_p = NULL;
-	struct __kfifo *fifo = NULL;
-
-	if (fifo_d == NULL) {
-		BTUSB_ERR("%s: [fifo data is null]", __func__);
-		return len;
-	}
-
-	if (!test_bit(TSK_START, &data_p->tsk_flag)) {
-		BTUSB_ERR("%s: [fail task not start ]", __func__);
-		return 0;
-	}
-
-	fio_p = pFIO(fifo_d, type);
-	fifo = pKFIO(fifo_d, type);
-
-	if (fifo->data != NULL) {
-		if (type == FIFO_SYSLOG) {
-			BTUSB_DBG("%s: [type == FIFO_SYSLOG ]", __func__);
-			len = __kfifo_in(pKFIO(fifo_d, type), (const void *)&hci_pkt,
-					sizeof(hci_pkt));
-
-			if (len != sizeof(hci_pkt))
-				return len;
-		}
-
-		len = __kfifo_in(pKFIO(fifo_d, type), buf, length);
-		fio_p->stat.rx += len;
-	}
-
-	if (len != 0)
-		wake_up_interruptible(&data_p->rx_wait_q);
-
-	return len;
-}
-
-int btmtk_fifo_start(void *fio_d)
-{
-	struct btmtk_fifo_data_t *data_p = (struct btmtk_fifo_data_t *)fio_d;
-	int err;
-
-	if (data_p == NULL) {
-		BTUSB_ERR("%s: [fail][fifo data is null]", __func__);
-		return -1;
-	}
-
-	if (!test_bit(TSK_INIT, &data_p->tsk_flag)) {
-		BTUSB_ERR("%s: [fail task not init ]", __func__);
-		return -1;
-	}
-
-	if (!KFIO_D(data_p, FIFO_SYSLOG) && !KFIO_D(data_p, FIFO_COREDUMP))
-		return -1;
-
-	data_p->fifo_tsk = kthread_create(btmtk_fifo_thread, fio_d,
-			"btmtk_fifo_thread");
-	if (IS_ERR(data_p->fifo_tsk)) {
-		BTUSB_ERR("%s: create FIFO thread failed!", __func__);
-		err = PTR_ERR(data_p->fifo_tsk);
-		data_p->fifo_tsk = NULL;
-		return -1;
-	}
-
-	set_bit(TSK_START, &data_p->tsk_flag);
-	BTUSB_INFO("%s: set TSK_START", __func__);
-	wake_up_process(data_p->fifo_tsk);
-	BTUSB_INFO("%s: [ok]", __func__);
-
-	return 0;
-}
-
-#else /* ENABLE_BT_FIFO_THREAD */
-void *btmtk_fifo_init(void)
-{
-	int *p = 0;
-
-	UNUSED(btmtk_usb_table);	/* clear warning */
-	return NULL;
-}
-
-int btmtk_fifo_start(void *fio_d)
-{
-	return 0;
-}
-
-u32 btmtk_fifo_in(unsigned int type, void *fifo_d, const void *buf,
-			 unsigned int length)
-{
-	return 0;
-}
-
-#endif /* ENABLE_BT_FIFO_THREAD */
diff --git a/btmtk_usb_fifo.h b/btmtk_usb_fifo.h
deleted file mode 100644
index cfc8c49..0000000
--- a/btmtk_usb_fifo.h
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
-*  Copyright (c) 2016 MediaTek Inc.
-*
-*  This program is free software; you can redistribute it and/or modify
-*  it under the terms of the GNU General Public License version 2 as
-*  published by the Free Software Foundation.
-*
-*  This program is distributed in the hope that it will be useful,
-*  but WITHOUT ANY WARRANTY; without even the implied warranty of
-*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-*  GNU General Public License for more details.
-*/
-#ifndef __BTMTK_USB_FIFO_H__
-#define __BTMTK_USB_FIFO_H__
-
-#include <linux/kfifo.h>	/* Used for kfifo */
-
-#define FW_DUMP_END_EVENT "coredump end"
-
-enum {
-	FIFO_SYSLOG = 0,
-	FIFO_COREDUMP,
-	FIFO_BTBUF,
-	FIFO_END
-};
-
-enum {
-	TSK_INIT = 0,
-	TSK_START,
-	TSK_RUNNING,
-	TSK_SHOULD_STOP,
-	TSK_EXIT,
-};
-
-struct btfio_stats {
-	unsigned int rx;
-	unsigned int tx;
-};
-
-struct btmtk_fifo_t {
-	unsigned int		type;
-	unsigned int		size;
-	const char		*folder_name;
-	struct __kfifo		kfifo;
-	struct file		*filp;
-	struct btfio_stats	stat;
-};
-
-struct btmtk_fifo_data_t {
-	struct task_struct	*fifo_tsk;
-	struct btmtk_fifo_t	*fifo_l;
-	wait_queue_head_t	rx_wait_q;
-	unsigned long		tsk_flag;
-};
-
-/**
- * Extern functions
- */
-void *btmtk_fifo_init(void);
-int btmtk_fifo_start(void *fio_d);
-u32 btmtk_fifo_in(unsigned int type, void *fifo_d, const void *buf,
-		unsigned int length);
-
-#endif /* __BTMTK_USB_FIFO_H__ */
diff --git a/btmtk_usb_main.c b/btmtk_usb_main.c
deleted file mode 100644
index 1ea93fc..0000000
--- a/btmtk_usb_main.c
+++ /dev/null
@@ -1,3809 +0,0 @@
-/*
-*  Copyright (c) 2016 MediaTek Inc.
-*
-*  This program is free software; you can redistribute it and/or modify
-*  it under the terms of the GNU General Public License version 2 as
-*  published by the Free Software Foundation.
-*
-*  This program is distributed in the hope that it will be useful,
-*  but WITHOUT ANY WARRANTY; without even the implied warranty of
-*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-*  GNU General Public License for more details.
-*/
-#include <linux/kernel.h>
-#include <linux/module.h>
-#include <linux/init.h>
-#include <linux/slab.h>
-#include <linux/types.h>
-#include <linux/sched.h>
-#include <linux/errno.h>
-#include <linux/skbuff.h>
-#include <linux/completion.h>
-#include <linux/usb.h>
-#include <linux/version.h>
-#include <linux/firmware.h>
-#include <linux/skbuff.h>
-#include <linux/cdev.h>
-#include <linux/spinlock.h>
-#include <linux/kallsyms.h>
-#include <linux/fs.h>
-#include <linux/kthread.h>
-#include <asm/uaccess.h>
-#include <net/bluetooth/bluetooth.h>
-#include <net/bluetooth/hci_core.h>
-
-#include "btmtk_usb_main.h"
-#include "btmtk_usb_dbgfs.h"
-#include "btmtk_usb_fifo.h"
-
-/*============================================================================*/
-/* Local Configuration */
-/*============================================================================*/
-#define VERSION "6.0.16110301"
-
-/*============================================================================*/
-/* Function Prototype */
-/*============================================================================*/
-#define ___________________________________________________Function_Prototype
-static int btmtk_usb_standby(void);
-static void btmtk_usb_cap_init(void);
-static int btmtk_usb_BT_init(void);
-static void btmtk_usb_BT_exit(void);
-static int btmtk_usb_send_assert_cmd(void);
-static int btmtk_usb_send_assert_cmd_ctrl(void);
-static int btmtk_usb_send_assert_cmd_bulk(void);
-static int btmtk_usb_submit_intr_urb(void);
-static int btmtk_usb_submit_bulk_in_urb(void);
-static int btmtk_usb_send_hci_reset_cmd(void);
-static int btmtk_usb_send_woble_suspend_cmd(void);
-static void btmtk_usb_load_rom_patch_complete(struct urb *urb);
-static void btmtk_usb_bulk_in_complete(struct urb *urb);
-
-static void btmtk_usb_hci_snoop_print_to_log(void);
-static int btmtk_usb_get_rom_patch_result(void);
-static void btmtk_usb_tx_complete_meta(struct urb *urb);
-static int btmtk_usb_load_rom_patch(void);
-static int btmtk_usb_send_wmt_reset_cmd(void);
-static void btmtk_usb_early_suspend(void);
-static void btmtk_usb_late_resume(void);
-static void btmtk_usb_intr_complete(struct urb *urb);
-static int btmtk_usb_send_wmt_cmd(const u8 *cmd, const int cmd_len, const u8 *event,
-									const int event_len, u32 delay);
-static int btmtk_usb_send_hci_cmd(const u8 *cmd, int cmd_len, const u8 *event, int event_len);
-/** file_operations: stpbt */
-static int btmtk_usb_fops_open(struct inode *inode, struct file *file);
-static int btmtk_usb_fops_close(struct inode *inode, struct file *file);
-static ssize_t btmtk_usb_fops_read(struct file *file, char __user *buf, size_t count, loff_t *f_pos);
-static ssize_t btmtk_usb_fops_write(struct file *file, const char __user *buf, size_t count, loff_t *f_pos);
-static unsigned int btmtk_usb_fops_poll(struct file *file, poll_table *wait);
-static long btmtk_usb_fops_unlocked_ioctl(struct file *file, unsigned int cmd, unsigned long arg);
-static int btmtk_usb_fops_fasync(int fd, struct file *file, int on);
-static int btmtk_usb_fops_openfwlog(struct inode *inode, struct file *file);
-static int btmtk_usb_fops_closefwlog(struct inode *inode, struct file *file);
-static ssize_t btmtk_usb_fops_readfwlog(struct file *filp, char __user *buf, size_t count, loff_t *f_pos);
-static ssize_t btmtk_usb_fops_writefwlog(struct file *filp, const char __user *buf, size_t count, loff_t *f_pos);
-static unsigned int btmtk_usb_fops_pollfwlog(struct file *filp, poll_table *wait);
-static long btmtk_usb_fops_unlocked_ioctlfwlog(struct file *filp, unsigned int cmd, unsigned long arg);
-
-#if SUPPORT_MT7662
-static int btmtk_usb_load_rom_patch_7662(void);
-static int btmtk_usb_io_read32_7662(u32 reg, u32 *val);
-static int btmtk_usb_io_write32_7662(u32 reg, u32 val);
-static int btmtk_usb_switch_iobase_7662(int base);
-static int btmtk_usb_chk_crc_7662(u32 checksum_len);
-static u16 btmtk_usb_get_crc_7662(void);
-static u16 btmtk_usb_checksum16_7662(u8 *pData, int len);
-static int btmtk_usb_send_hci_set_tx_power_cmd_7662(void);
-static int btmtk_usb_send_hci_radio_on_cmd_7662(void);
-static int btmtk_usb_send_hci_radio_off_cmd_7662(void);
-static int btmtk_usb_send_hci_set_ce_cmd_7662(void);
-static int btmtk_usb_send_hci_check_rom_patch_result_cmd_7662(void);
-static int btmtk_usb_send_hci_low_power_cmd_7662(bool enable);
-static void btmtk_usb_send_dummy_bulk_out_packet_7662(void);
-#endif /* SUPPORT_MT7662 */
-
-#if SUPPORT_MT7668
-static int btmtk_usb_load_rom_patch_7668(void);
-static int btmtk_usb_io_read32_7668(u32 reg, u32 *val);
-static int btmtk_usb_io_read32_7668(u32 reg, u32 *val);
-static int btmtk_usb_send_hci_tci_set_sleep_cmd_7668(void);
-static int btmtk_usb_send_wmt_power_on_cmd_7668(void);
-static int btmtk_usb_send_wmt_power_off_cmd_7668(void);
-#endif /* SUPPORT_MT7668 */
-
-/*============================================================================*/
-/* Global Variable */
-/*============================================================================*/
-#define _____________________________________________________Global_Variables
-/* stpbt character device for meta */
-#ifdef FIXED_STPBT_MAJOR_DEV_ID
-static int BT_major = FIXED_STPBT_MAJOR_DEV_ID;
-static int BT_majorfwlog = FIXED_STPBT_MAJOR_DEV_ID+1;
-#else
-static int BT_major;
-static int BT_majorfwlog;
-#endif
-static struct class *pBTClass;
-
-static struct device *pBTDev;
-static struct device *pBTDevfwlog;
-
-static struct cdev BT_cdev;
-static struct cdev BT_cdevfwlog;
-
-static struct usb_driver btmtk_usb_driver;
-static wait_queue_head_t inq;
-static struct btmtk_usb_data *g_data;
-static int probe_counter;
-static int need_reset_stack;
-static int leftHciEventSize;
-static int leftACLSize;
-static int btmtk_usb_state = BTMTK_USB_STATE_UNKNOWN;
-static int btmtk_fops_state = BTMTK_FOPS_STATE_UNKNOWN;
-static DECLARE_WAIT_QUEUE_HEAD(BT_wq);
-static DEFINE_MUTEX(btmtk_usb_state_mutex);
-static DEFINE_MUTEX(btmtk_fops_state_mutex);
-#define FOPS_MUTEX_LOCK()	mutex_lock(&btmtk_fops_state_mutex)
-#define FOPS_MUTEX_UNLOCK()	mutex_unlock(&btmtk_fops_state_mutex)
-static struct fasync_struct *fasync;
-
-typedef void (*register_early_suspend) (void (*f) (void));
-typedef void (*register_late_resume) (void (*f) (void));
-register_early_suspend register_early_suspend_func;
-register_late_resume register_late_resume_func;
-
-/* Hci Snoop */
-static u8 hci_cmd_snoop_buf[HCI_SNOOP_ENTRY_NUM][HCI_SNOOP_BUF_SIZE];
-static u8 hci_cmd_snoop_len[HCI_SNOOP_ENTRY_NUM] = { 0 };
-
-static unsigned int hci_cmd_snoop_timestamp[HCI_SNOOP_ENTRY_NUM];
-static u8 hci_event_snoop_buf[HCI_SNOOP_ENTRY_NUM][HCI_SNOOP_BUF_SIZE];
-static u8 hci_event_snoop_len[HCI_SNOOP_ENTRY_NUM] = { 0 };
-
-static unsigned int hci_event_snoop_timestamp[HCI_SNOOP_ENTRY_NUM];
-static u8 hci_acl_snoop_buf[HCI_SNOOP_ENTRY_NUM][HCI_SNOOP_BUF_SIZE];
-static u8 hci_acl_snoop_len[HCI_SNOOP_ENTRY_NUM] = { 0 };
-
-static unsigned int hci_acl_snoop_timestamp[HCI_SNOOP_ENTRY_NUM];
-static int hci_cmd_snoop_index = HCI_SNOOP_ENTRY_NUM - 1;
-static int hci_event_snoop_index = HCI_SNOOP_ENTRY_NUM - 1;
-static int hci_acl_snoop_index = HCI_SNOOP_ENTRY_NUM - 1;
-
-static dev_t g_devIDfwlog;
-
-const struct file_operations BT_fops = {
-	.open = btmtk_usb_fops_open,
-	.release = btmtk_usb_fops_close,
-	.read = btmtk_usb_fops_read,
-	.write = btmtk_usb_fops_write,
-	.poll = btmtk_usb_fops_poll,
-	.unlocked_ioctl = btmtk_usb_fops_unlocked_ioctl,
-	.fasync = btmtk_usb_fops_fasync,
-};
-
-const struct file_operations BT_fopsfwlog = {
-	.open = btmtk_usb_fops_openfwlog,
-	.release = btmtk_usb_fops_closefwlog,
-	.read = btmtk_usb_fops_readfwlog,
-	.write = btmtk_usb_fops_writefwlog,
-	.poll = btmtk_usb_fops_pollfwlog,
-	.unlocked_ioctl = btmtk_usb_fops_unlocked_ioctlfwlog
-
-};
-
-/*============================================================================*/
-/* Internal Functions */
-/*============================================================================*/
-#define ___________________________________________________Internal_Functions
-static int btmtk_usb_init_memory(void)
-{
-	if (g_data == NULL) {
-		BTUSB_ERR("%s: g_data is NULL !", __func__);
-		return -1;
-	}
-
-	g_data->chip_id = 0;
-	g_data->suspend_count = 0;
-
-	if (g_data->metabuffer)
-		memset(g_data->metabuffer->buffer, 0, META_BUFFER_SIZE);
-
-	if (g_data->io_buf)
-		memset(g_data->io_buf, 0, USB_IO_BUF_SIZE);
-
-	if (g_data->rom_patch_bin_file_name)
-		memset(g_data->rom_patch_bin_file_name, 0, MAX_BIN_FILE_NAME_LEN);
-
-	if (g_data->i_buf)
-		memset(g_data->i_buf, 0, BUFFER_SIZE);
-
-	if (g_data->o_buf)
-		memset(g_data->o_buf, 0, BUFFER_SIZE);
-	BTUSB_INFO("%s: Success", __func__);
-	return 1;
-}
-
-static int btmtk_usb_allocate_memory(void)
-{
-	if (g_data == NULL) {
-		g_data = kzalloc(sizeof(*g_data), GFP_KERNEL);
-		if (!g_data) {
-			BTUSB_ERR("%s: alloc memory fail (g_data)", __func__);
-			return -1;
-		}
-	}
-
-	if (g_data->metabuffer == NULL) {
-		g_data->metabuffer = kzalloc(sizeof(struct ring_buffer_struct), GFP_KERNEL);
-		if (!g_data->metabuffer) {
-			BTUSB_ERR("%s: alloc memory fail (g_data->metabuffer)",
-				__func__);
-			return -1;
-		}
-	}
-
-	if (g_data->io_buf == NULL) {
-		g_data->io_buf = kzalloc(USB_IO_BUF_SIZE, GFP_KERNEL);
-		if (!g_data->io_buf) {
-			BTUSB_ERR("%s: alloc memory fail (g_data->io_buf)",
-				__func__);
-			return -1;
-		}
-	}
-
-	if (g_data->rom_patch_bin_file_name == NULL) {
-		g_data->rom_patch_bin_file_name = kzalloc(MAX_BIN_FILE_NAME_LEN, GFP_KERNEL);
-		if (!g_data->rom_patch_bin_file_name) {
-			BTUSB_ERR
-				("%s: alloc memory fail (g_data->rom_patch_bin_file_name)",
-				 __func__);
-			return -1;
-		}
-	}
-
-	if (g_data->i_buf == NULL) {
-		g_data->i_buf = kzalloc(BUFFER_SIZE, GFP_KERNEL);
-		if (!g_data->i_buf) {
-			BTUSB_ERR("%s: alloc memory fail (g_data->)", __func__);
-			return -1;
-		}
-	}
-
-	if (g_data->o_buf == NULL) {
-		g_data->o_buf = kzalloc(BUFFER_SIZE, GFP_KERNEL);
-		if (!g_data->o_buf) {
-			BTUSB_ERR("%s: alloc memory fail (g_data->o_buf)",
-				__func__);
-			return -1;
-		}
-	}
-	BTUSB_INFO("%s: Success", __func__);
-	return 1;
-}
-
-static void btmtk_usb_free_memory(void)
-{
-	if (!g_data) {
-		BTUSB_ERR("%s: g_data is NULL!\n", __func__);
-		return;
-	}
-
-	kfree(g_data->metabuffer);
-	g_data->metabuffer = NULL;
-
-	kfree(g_data->i_buf);
-	g_data->i_buf = NULL;
-
-	kfree(g_data->o_buf);
-	g_data->o_buf = NULL;
-
-	kfree(g_data->rom_patch_bin_file_name);
-	g_data->rom_patch_bin_file_name = NULL;
-
-	kfree(g_data->io_buf);
-	g_data->io_buf = NULL;
-
-	kfree(g_data->rom_patch_image);
-	g_data->rom_patch_image = NULL;
-
-	kfree(g_data);
-	g_data = NULL;
-
-	BTUSB_INFO("%s: Success", __func__);
-}
-
-static int btmtk_usb_get_state(void)
-{
-	return btmtk_usb_state;
-}
-
-static void btmtk_usb_set_state(int new_state)
-{
-	static const char * const state_msg[] = {
-		"UNKNOWN", "INIT", "DISCONNECT", "PROBE", "WORKING", "EARLY_SUSPEND",
-		"SUSPEND", "RESUME", "LATE_RESUME", "FW_DUMP", "SUSPEND_DISCONNECT",
-		"SUSPEND_PROBE", "RESUME_DISCONNECT", "RESUME_PROBE", "RESUME_FW_DUMP"
-	};
-
-	BTUSB_INFO("%s: %s(%d) -> %s(%d)", __func__, state_msg[btmtk_usb_state],
-			btmtk_usb_state, state_msg[new_state], new_state);
-	btmtk_usb_state = new_state;
-}
-
-static int btmtk_fops_get_state(void)
-{
-	return btmtk_fops_state;
-}
-
-static void btmtk_fops_set_state(int new_state)
-{
-	static const char * const fstate_msg[] = {"UNKNOWN", "INIT", "OPENED", "CLOSING", "CLOSED"};
-
-	BTUSB_INFO("%s: FOPS_%s(%d) -> FOPS_%s(%d)", __func__, fstate_msg[btmtk_fops_state],
-			btmtk_fops_state, fstate_msg[new_state], new_state);
-	btmtk_fops_state = new_state;
-}
-
-static unsigned int btmtk_usb_hci_snoop_get_microseconds(void)
-{
-	struct timeval now;
-
-	do_gettimeofday(&now);
-	return (now.tv_sec * 1000000 + now.tv_usec);
-}
-
-static void btmtk_usb_hci_snoop_init(void)
-{
-	int i;
-
-	hci_cmd_snoop_index = HCI_SNOOP_ENTRY_NUM - 1;
-	hci_event_snoop_index = HCI_SNOOP_ENTRY_NUM - 1;
-	hci_acl_snoop_index = HCI_SNOOP_ENTRY_NUM - 1;
-	for (i = 0; i < HCI_SNOOP_ENTRY_NUM; i++) {
-		hci_cmd_snoop_len[i] = 0;
-		hci_event_snoop_len[i] = 0;
-		hci_acl_snoop_len[i] = 0;
-	}
-}
-
-static void btmtk_usb_hci_snoop_save_cmd(u32 len, u8 *buf)
-{
-	u32 copy_len = HCI_SNOOP_BUF_SIZE;
-
-	if (buf) {
-		if (len < HCI_SNOOP_BUF_SIZE)
-			copy_len = len;
-		hci_cmd_snoop_len[hci_cmd_snoop_index] = copy_len & 0xff;
-		memset(hci_cmd_snoop_buf[hci_cmd_snoop_index], 0, HCI_SNOOP_BUF_SIZE);
-		memcpy(hci_cmd_snoop_buf[hci_cmd_snoop_index], buf, copy_len & 0xff);
-		hci_cmd_snoop_timestamp[hci_cmd_snoop_index] = btmtk_usb_hci_snoop_get_microseconds();
-
-		hci_cmd_snoop_index--;
-		if (hci_cmd_snoop_index < 0)
-			hci_cmd_snoop_index = HCI_SNOOP_ENTRY_NUM - 1;
-	}
-}
-
-static void btmtk_usb_hci_snoop_save_event(u32 len, u8 *buf)
-{
-	u32 copy_len = HCI_SNOOP_BUF_SIZE;
-
-	if (buf) {
-		if (len < HCI_SNOOP_BUF_SIZE)
-			copy_len = len;
-		hci_event_snoop_len[hci_event_snoop_index] = copy_len;
-		memset(hci_event_snoop_buf[hci_event_snoop_index], 0,
-			HCI_SNOOP_BUF_SIZE);
-		memcpy(hci_event_snoop_buf[hci_event_snoop_index], buf, copy_len);
-		hci_event_snoop_timestamp[hci_event_snoop_index] =
-			btmtk_usb_hci_snoop_get_microseconds();
-
-		hci_event_snoop_index--;
-		if (hci_event_snoop_index < 0)
-			hci_event_snoop_index = HCI_SNOOP_ENTRY_NUM - 1;
-	}
-}
-
-static void btmtk_usb_hci_snoop_save_acl(u32 len, u8 *buf)
-{
-	u32 copy_len = HCI_SNOOP_BUF_SIZE;
-
-	if (buf) {
-		if (len < HCI_SNOOP_BUF_SIZE)
-			copy_len = len;
-		hci_acl_snoop_len[hci_acl_snoop_index] = copy_len & 0xff;
-		memset(hci_acl_snoop_buf[hci_acl_snoop_index], 0,
-			HCI_SNOOP_BUF_SIZE);
-		memcpy(hci_acl_snoop_buf[hci_acl_snoop_index], buf, copy_len & 0xff);
-		hci_acl_snoop_timestamp[hci_acl_snoop_index] =
-			btmtk_usb_hci_snoop_get_microseconds();
-
-		hci_acl_snoop_index--;
-		if (hci_acl_snoop_index < 0)
-			hci_acl_snoop_index = HCI_SNOOP_ENTRY_NUM - 1;
-	}
-}
-
-static void btmtk_usb_hci_snoop_print_to_log(void)
-{
-	int counter, index, j;
-
-	BTUSB_INFO("HCI Command Dump");
-	BTUSB_INFO("  index(len)(timestamp:us) :HCI Command");
-	index = hci_cmd_snoop_index + 1;
-	if (index >= HCI_SNOOP_ENTRY_NUM)
-		index = 0;
-	for (counter = 0; counter < HCI_SNOOP_ENTRY_NUM; counter++) {
-		if (hci_cmd_snoop_len[index] > 0) {
-			pr_cont("	%d(%02d)(%u) :", counter,
-				hci_cmd_snoop_len[index],
-				hci_cmd_snoop_timestamp[index]);
-			for (j = 0; j < hci_cmd_snoop_len[index]; j++)
-				pr_cont("%02X ", hci_cmd_snoop_buf[index][j]);
-			pr_cont("\n");
-		}
-		index++;
-		if (index >= HCI_SNOOP_ENTRY_NUM)
-			index = 0;
-	}
-
-	BTUSB_INFO("HCI Event Dump");
-	BTUSB_INFO("  index(len)(timestamp:us) :HCI Event");
-	index = hci_event_snoop_index + 1;
-	if (index >= HCI_SNOOP_ENTRY_NUM)
-		index = 0;
-	for (counter = 0; counter < HCI_SNOOP_ENTRY_NUM; counter++) {
-		if (hci_event_snoop_len[index] > 0) {
-			pr_cont("	%d(%02d)(%u) :", counter,
-				hci_event_snoop_len[index],
-				hci_event_snoop_timestamp[index]);
-			for (j = 0; j < hci_event_snoop_len[index]; j++)
-				pr_cont("%02X ", hci_event_snoop_buf[index][j]);
-			pr_cont("\n");
-		}
-		index++;
-		if (index >= HCI_SNOOP_ENTRY_NUM)
-			index = 0;
-	}
-
-	BTUSB_INFO("HCI ACL Dump");
-	BTUSB_INFO("  index(len)(timestamp:us) :ACL");
-	index = hci_acl_snoop_index + 1;
-	if (index >= HCI_SNOOP_ENTRY_NUM)
-		index = 0;
-	for (counter = 0; counter < HCI_SNOOP_ENTRY_NUM; counter++) {
-		if (hci_acl_snoop_len[index] > 0) {
-			pr_cont("	%d(%02d)(%u) :", counter,
-				hci_acl_snoop_len[index],
-				hci_acl_snoop_timestamp[index]);
-			for (j = 0; j < hci_acl_snoop_len[index]; j++)
-				pr_cont("%02X ", hci_acl_snoop_buf[index][j]);
-			pr_cont("\n");
-		}
-		index++;
-		if (index >= HCI_SNOOP_ENTRY_NUM)
-			index = 0;
-	}
-}
-
-static int btmtk_usb_send_assert_cmd(void)
-{
-	int ret = 0;
-
-	if (g_data->interrupt_urb_submitted == 0) {
-		ret = btmtk_usb_submit_bulk_in_urb();
-		if (ret < 0) {
-			BTUSB_ERR("%s: failed", __func__);
-			return -1;
-		}
-	}
-
-	ret = btmtk_usb_send_assert_cmd_ctrl();
-	if (ret < 0)
-		ret = btmtk_usb_send_assert_cmd_bulk();
-	if (ret < 0) {
-		BTUSB_ERR("%s: send assert cmd fail,tigger hw reset only",
-			__func__);
-		btmtk_usb_toggle_rst_pin();
-	}
-	return ret;
-}
-
-void btmtk_usb_toggle_rst_pin(void)
-{
-	BTUSB_INFO("%s: begig", __func__);
-	need_reset_stack = 1;
-
-	do {
-		typedef void (*pdwnc_func) (u8 fgReset);
-		char *pdwnc_func_name = "PDWNC_SetBTInResetState";
-		pdwnc_func pdwndFunc =
-			(pdwnc_func) kallsyms_lookup_name(pdwnc_func_name);
-
-		if (pdwndFunc) {
-			BTUSB_INFO("%s: Invoke %s(%d)", __func__,
-				pdwnc_func_name, 1);
-			pdwndFunc(1);
-		} else
-			BTUSB_INFO("%s: No Exported Func Found [%s]", __func__,
-				pdwnc_func_name);
-	} while (0);
-
-	btmtk_usb_hci_snoop_print_to_log();
-
-	BTUSB_INFO("%s: toggle GPIO %d", __func__, BT_DONGLE_RESET_GPIO_PIN);
-	do {
-		typedef void (*func_ptr) (unsigned gpio, int init_value);
-		char *func_name = "mtk_gpio_direction_output";
-		func_ptr pFunc = (func_ptr) kallsyms_lookup_name(func_name);
-
-		if (pFunc) {
-			BTUSB_INFO("%s: Invoke %s(%d)", __func__, func_name, 1);
-			pFunc(BT_DONGLE_RESET_GPIO_PIN, 0);
-			mdelay(500);
-			pFunc(BT_DONGLE_RESET_GPIO_PIN, 1);
-		} else
-			BTUSB_INFO("%s: No Exported Func Found [%s]", __func__,
-				func_name);
-
-	} while (0);
-	BTUSB_INFO("%s: end", __func__);
-}
-
-static void btmtk_usb_lock_unsleepable_lock(struct OSAL_UNSLEEPABLE_LOCK *pUSL)
-{
-	spin_lock_irqsave(&(pUSL->lock), pUSL->flag);
-}
-
-static void btmtk_usb_unlock_unsleepable_lock(struct OSAL_UNSLEEPABLE_LOCK *pUSL)
-{
-	spin_unlock_irqrestore(&(pUSL->lock), pUSL->flag);
-}
-
-static void btmtk_usb_load_code_from_bin(u8 **image, char *bin_name,
-					 struct device *dev, u32 *code_len)
-{
-	const struct firmware *fw_entry;
-	int err = 0;
-	static u32 chip_id;
-
-	if (g_data->rom_patch_image && g_data->rom_patch_image_len
-			&& g_data->chip_id == chip_id) {
-		/* no need to request firmware again. */
-		*image = g_data->rom_patch_image;
-		*code_len = g_data->rom_patch_image_len;
-		return;
-
-	} else {
-		chip_id = g_data->chip_id;
-		kfree(g_data->rom_patch_image);
-		g_data->rom_patch_image = NULL;
-		g_data->rom_patch_image_len = 0;
-	}
-
-	err = request_firmware(&fw_entry, bin_name, dev);
-	if (err != 0) {
-		*image = NULL;
-		BTUSB_ERR("%s: request_firmware fail!! error code = %d",
-			__func__, err);
-		return;
-	}
-
-	*image = kmalloc(fw_entry->size, GFP_KERNEL);
-	if (*image == NULL) {
-		BTUSB_ERR("%s: kmalloc failed!! error code = %d",
-			__func__, err);
-		return;
-	}
-
-	memcpy(*image, fw_entry->data, fw_entry->size);
-	*code_len = fw_entry->size;
-
-	g_data->rom_patch_image = *image;
-	g_data->rom_patch_image_len = *code_len;
-
-	release_firmware(fw_entry);
-}
-
-static void btmtk_usb_stop_traffic(void)
-{
-	if ((g_data->bulk_urb_submitted == 0) &&
-		(g_data->interrupt_urb_submitted == 0)) {
-		return;
-	}
-
-	BTUSB_INFO("%s: start", __func__);
-	usb_kill_anchored_urbs(&g_data->intr_anchor);
-	usb_kill_anchored_urbs(&g_data->bulk_anchor);
-	g_data->bulk_urb_submitted = 0;
-	g_data->interrupt_urb_submitted = 0;
-
-	BTUSB_INFO("%s: end", __func__);
-}
-
-static void btmtk_usb_waker(struct work_struct *work)
-{
-	int err;
-
-	err = usb_autopm_get_interface(g_data->intf);
-
-	if (err < 0)
-		return;
-
-	usb_autopm_put_interface(g_data->intf);
-}
-
-static int btmtk_usb_submit_intr_urb(void)
-{
-	struct urb *urb;
-	u8 *buf;
-	unsigned int pipe;
-	int err, size;
-
-	BTUSB_INFO("%s: begin", __func__);
-
-	if (g_data->interrupt_urb_submitted) {
-		BTUSB_WARN("%s: already submitted", __func__);
-		return 0;
-	}
-	g_data->interrupt_urb_submitted = 0;
-
-	if (!g_data->intr_ep) {
-		BTUSB_ERR("%s: error 1", __func__);
-		return -ENODEV;
-	}
-
-	urb = usb_alloc_urb(0, GFP_KERNEL);
-	if (!urb) {
-		BTUSB_ERR("%s: error 2", __func__);
-		return -ENOMEM;
-	}
-	/* size = le16_to_cpu(g_data->intr_ep->wMaxPacketSize); */
-	size = le16_to_cpu(HCI_MAX_EVENT_SIZE);
-	BTUSB_INFO("%s: maximum packet size:%d", __func__, size);
-
-	buf = kmalloc(size, GFP_KERNEL);
-	if (!buf) {
-		usb_free_urb(urb);
-		BTUSB_ERR("%s: error 3", __func__);
-		return -ENOMEM;
-	}
-
-	pipe = usb_rcvintpipe(g_data->udev, g_data->intr_ep->bEndpointAddress);
-
-	usb_fill_int_urb(urb, g_data->udev, pipe, buf, size,
-			 btmtk_usb_intr_complete, g_data,
-			 g_data->intr_ep->bInterval);
-
-	urb->transfer_flags |= URB_FREE_BUFFER;
-
-	usb_anchor_urb(urb, &g_data->intr_anchor);
-
-	err = usb_submit_urb(urb, GFP_KERNEL);
-	if (err < 0) {
-		if (err != -EPERM && err != -ENODEV)
-			BTUSB_ERR("%s: urb %p submission failed (%d)", __func__,
-				urb, -err);
-		usb_unanchor_urb(urb);
-	} else {
-		g_data->interrupt_urb_submitted = 1;
-	}
-
-	usb_free_urb(urb);
-	BTUSB_INFO("%s: end", __func__);
-	return err;
-}
-
-static int btmtk_usb_submit_bulk_in_urb(void)
-{
-	struct urb *urb = NULL;
-	u8 *buf = NULL;
-	unsigned int pipe = 0;
-	int err = 0;
-	int size = HCI_MAX_FRAME_SIZE;
-
-	BTUSB_INFO("%s: begin", __func__);
-
-	if (g_data->bulk_urb_submitted) {
-		BTUSB_WARN("%s: already submitted", __func__);
-		return 0;
-	}
-	g_data->bulk_urb_submitted = 0;
-
-	if (!g_data->bulk_rx_ep) {
-		BTUSB_ERR("%s: end error 1", __func__);
-		return -ENODEV;
-	}
-
-	urb = usb_alloc_urb(0, GFP_KERNEL);
-	if (!urb) {
-		BTUSB_ERR("%s: end error 2", __func__);
-		return -ENOMEM;
-	}
-
-	buf = kmalloc(size, GFP_KERNEL);
-	if (!buf) {
-		usb_free_urb(urb);
-		BTUSB_ERR("%s: end error 3", __func__);
-		return -ENOMEM;
-	}
-	pipe =
-		usb_rcvbulkpipe(g_data->udev, g_data->bulk_rx_ep->bEndpointAddress);
-	usb_fill_bulk_urb(urb, g_data->udev, pipe, buf, size,
-			btmtk_usb_bulk_in_complete, g_data);
-
-	urb->transfer_flags |= URB_FREE_BUFFER;
-
-	usb_mark_last_busy(g_data->udev);
-	usb_anchor_urb(urb, &g_data->bulk_anchor);
-
-	err = usb_submit_urb(urb, GFP_KERNEL);
-	if (err < 0) {
-		if (err != -EPERM && err != -ENODEV)
-			BTUSB_ERR("%s: urb %p submission failed (%d)", __func__,
-				urb, -err);
-		usb_unanchor_urb(urb);
-	} else {
-		g_data->bulk_urb_submitted = 1;
-	}
-
-	usb_free_urb(urb);
-	BTUSB_INFO("%s: end", __func__);
-	return err;
-}
-
-static int btmtk_usb_send_wmt_cmd(const u8 *cmd, const int cmd_len,
-		const u8 *event, const int event_len, u32 delay)
-{
-	int ret = -1;	/* if successful, read length */
-	int i = 0;
-	bool check = FALSE;
-
-	if (g_data == NULL || g_data->udev == NULL || g_data->io_buf == NULL
-			|| cmd == NULL) {
-		BTUSB_ERR("%s: incorrect cmd pointer", __func__);
-		return ret;
-	}
-	if (event != NULL && event_len > 0)
-		check = TRUE;
-
-	/* send WMT command */
-	ret = usb_control_msg(g_data->udev, usb_sndctrlpipe(g_data->udev, 0),
-			0x01, DEVICE_CLASS_REQUEST_OUT, 0x30, 0x00, (void *)cmd, cmd_len,
-			USB_CTRL_IO_TIMO);
-	if (ret < 0) {
-		BTUSB_ERR("%s: command send failed(%d)", __func__, ret);
-		return ret;
-	}
-
-	/* ms delay */
-	mdelay(delay);
-
-	if (event_len == -1) {
-		/**
-		 * If event_len == -1, DO NOT read event, since FW wouldn't feedback
-		 */
-		return 0;
-	}
-
-	/* check WMT event */
-	memset(g_data->io_buf, 0, USB_IO_BUF_SIZE);
-	ret = usb_control_msg(g_data->udev, usb_rcvctrlpipe(g_data->udev, 0),
-				0x01, DEVICE_VENDOR_REQUEST_IN, 0x30, 0x00, g_data->io_buf,
-				USB_IO_BUF_SIZE, USB_CTRL_IO_TIMO);
-	if (ret < 0) {
-		BTUSB_ERR("%s: event get failed(%d)", __func__, ret);
-		if (check == TRUE)
-			return ret;
-		else
-			return 0;	/* Do not ask read so return 0 */
-	}
-
-	if (check == TRUE) {
-		/* maybe don't care some returned parameters */
-		if (ret >= event_len) {
-			for (i = 0; i < event_len; i++) {
-				if (event[i] != g_data->io_buf[i])
-					break;
-			}
-		} else {
-			BTUSB_ERR("%s: event length is not match(%d/%d)", __func__, ret, event_len);
-		}
-		if (i != event_len) {
-			BTUSB_ERR("%s: got unknown event:(%d/%d)", __func__, i, event_len);
-			pr_cont("\t");
-			for (i = 0; i < ret && i < 64; i++)
-				pr_cont("%02X ", g_data->io_buf[i]);
-			pr_cont("\n");
-		} else {
-			return ret; /* return read length */
-		}
-	}
-	return -1;
-}
-
-static int btmtk_usb_send_hci_cmd(const u8 *cmd, const int cmd_len,
-		const u8 *event, const int event_len)
-{
-	int ret = -1;	/* if successful, read length */
-	int len = 0;
-	int i = 0;
-	unsigned long timo = 0;
-	bool check = FALSE;
-
-	/* parameter check */
-	if (g_data == NULL || g_data->udev == NULL || g_data->io_buf == NULL
-			|| cmd == NULL) {
-		BTUSB_ERR("%s: incorrect cmd pointer", __func__);
-		return ret;
-	}
-	if (event != NULL && event_len > 0)
-		check = TRUE;
-
-	/* need get event by interrupt, stop traffic before cmd send */
-	btmtk_usb_stop_traffic();
-
-	/* send HCI command */
-	ret = usb_control_msg(g_data->udev, usb_sndctrlpipe(g_data->udev, 0),
-			0, DEVICE_CLASS_REQUEST_OUT, 0, 0,
-			(void *)cmd, cmd_len, USB_CTRL_IO_TIMO);
-	if (ret < 0) {
-		BTUSB_ERR("%s: command send failed(%d)", __func__, ret);
-		return ret;
-	}
-
-	if (event_len == -1) {
-		/**
-		 * If event_len == -1, DO NOT read event, since FW wouldn't feedback
-		 */
-		return 0;
-	}
-
-	/* check HCI event */
-	timo = jiffies + msecs_to_jiffies(USB_INTR_MSG_TIMO);
-	do {
-		memset(g_data->io_buf, 0, USB_IO_BUF_SIZE);
-		ret = usb_interrupt_msg(g_data->udev, usb_rcvintpipe(g_data->udev, 1),
-				g_data->io_buf, USB_IO_BUF_SIZE, &len, USB_INTR_MSG_TIMO);
-		if (ret < 0) {
-			BTUSB_ERR("%s: event get failed(%d)", __func__, ret);
-			if (check == TRUE)
-				return ret;
-			else
-				return 0;	/* Do not ask read so return 0 */
-		}
-
-		if (check == TRUE) {
-			/* maybe don't care some returned parameters */
-			if (len >= event_len) {
-				for (i = 0; i < event_len; i++) {
-					if (event[i] != g_data->io_buf[i])
-						break;
-				}
-			} else {
-				BTUSB_ERR("%s: event length is not match(%d/%d)", __func__, len, event_len);
-			}
-			if (i != event_len) {
-				BTUSB_ERR("%s: got unknown event:(%d/%d)", __func__, i, event_len);
-				pr_cont("\t");
-				for (i = 0; i < len && i < 64; i++)
-					pr_cont("%02X ", g_data->io_buf[i]);
-				pr_cont("\n");
-			} else {
-				return len; /* actually read length */
-			}
-		}
-	} while (time_before(jiffies, timo));
-
-	BTUSB_ERR("%s: error, got event timeout, jiffies = %lu", __func__, jiffies);
-	return -1;
-}
-
-int btmtk_usb_meta_send_data(const u8 *buffer, const unsigned int length)
-{
-	int ret = 0;
-
-	if (buffer[0] != 0x01) {
-		BTUSB_WARN("the data from meta isn't HCI command, value: 0x%X",
-			buffer[0]);
-	} else {
-		u8 *buf = (u8 *)buffer;
-
-		ret =
-			usb_control_msg(g_data->udev,
-					usb_sndctrlpipe(g_data->udev, 0), 0x0,
-					DEVICE_CLASS_REQUEST_OUT, 0x00, 0x00,
-					buf + 1, length - 1,
-					USB_CTRL_IO_TIMO);
-	}
-
-	if (ret < 0) {
-		BTUSB_ERR("%s: error1(%d)", __func__, ret);
-		return ret;
-	}
-
-	return length;
-}
-
-int btmtk_usb_send_data(const u8 *buffer, const unsigned int length)
-{
-	struct urb *urb;
-	unsigned int pipe;
-	int err;
-	int send_data_len = length - 1;
-	char *buf = NULL;
-
-	if (!g_data->bulk_tx_ep) {
-		BTUSB_ERR("%s: No bulk_tx_ep", __func__);
-		return -ENODEV;
-	}
-
-	urb = usb_alloc_urb(0, GFP_KERNEL);
-
-	if (!urb) {
-		BTUSB_ERR("%s: No memory", __func__);
-		return -ENOMEM;
-	}
-
-	if (buffer[0] == 0x02) {
-
-		while (g_data->meta_tx != 0)
-			udelay(500);
-
-		g_data->meta_tx = 1;
-
-		buf = usb_alloc_coherent(g_data->udev, send_data_len, GFP_KERNEL, &urb->transfer_dma);
-
-		urb->transfer_buffer = buf;
-		urb->transfer_buffer_length = send_data_len;
-
-		if (!buf) {
-			BTUSB_ERR("%s: usb_alloc_coherent error\n", __func__);
-			err = -ENOMEM;
-			goto error_buffer;
-		}
-		/* remove the ACL header:0x02 */
-		memcpy(buf, buffer + 1, send_data_len);
-
-		pipe =
-			usb_sndbulkpipe(g_data->udev,
-					g_data->bulk_tx_ep->bEndpointAddress);
-
-		usb_fill_bulk_urb(urb, g_data->udev, pipe, buf,
-				length - 1, btmtk_usb_tx_complete_meta,
-				g_data);
-
-		urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
-
-		usb_anchor_urb(urb, &g_data->tx_anchor);
-
-		err = usb_submit_urb(urb, GFP_KERNEL);
-		if (err == 0)
-			err = length;
-		else
-			BTUSB_ERR("send ACL data fail, error:%d", err);
-		mdelay(1);
-	} else if (buffer[0] == 0x03) {
-		BTUSB_WARN("%s: Iso not supported", __func__);
-		err = -1;
-	} else {
-		BTUSB_WARN("%s: unknown data", __func__);
-		err = -1;
-	}
-
-error_buffer:
-	if (err < 0) {
-		BTUSB_ERR("%s: urb %p submission failed (%d)", __func__, urb,
-			-err);
-
-		usb_free_coherent(g_data->udev, urb->transfer_buffer_length, urb->transfer_buffer, urb->transfer_dma);
-		kfree(urb->setup_packet);
-		usb_unanchor_urb(urb);
-	} else {
-		usb_mark_last_busy(g_data->udev);
-	}
-
-	usb_free_urb(urb);
-	return err;
-
-}
-
-static int btmtk_usb_BT_init(void)
-{
-	dev_t devID = MKDEV(BT_major, 0);
-	dev_t devIDfwlog = MKDEV(BT_majorfwlog, 1);
-	int ret = 0;
-	int cdevErr = 0;
-	int major = 0;
-	int majorfwlog = 0;
-
-	BTUSB_INFO("%s: begin", __func__);
-	BTUSB_INFO("%s: devID %d, devIDfwlog %d", __func__, devID, devIDfwlog);
-
-	mutex_lock(&btmtk_usb_state_mutex);
-	btmtk_usb_set_state(BTMTK_USB_STATE_INIT);
-	mutex_unlock(&btmtk_usb_state_mutex);
-
-#ifdef FIXED_STPBT_MAJOR_DEV_ID
-	ret = register_chrdev_region(devID, 1, "BT_chrdev");
-	if (ret) {
-		BTUSB_ERR("fail to register_chrdev %d, allocate chrdev again", MAJOR(devID));
-		ret = alloc_chrdev_region(&devID, 0, 1, "BT_chrdev");
-		if (ret) {
-			BTUSB_ERR("fail to allocate chrdev");
-			return ret;
-		}
-	}
-
-	ret = register_chrdev_region(devIDfwlog, 1, "BT_chrdevfwlog");
-	if (ret) {
-		BTUSB_ERR("fail to register_chrdev %d, allocate chrdev again", MAJOR(devIDfwlog));
-		ret = alloc_chrdev_region(&devIDfwlog, 0, 1, "BT_chrdevfwlog");
-		if (ret) {
-			BTUSB_ERR("fail to allocate chrdev fwlog");
-			return ret;
-		}
-	}
-#else
-	ret = alloc_chrdev_region(&devID, 0, 1, "BT_chrdev");
-	if (ret) {
-		BTUSB_ERR("fail to allocate chrdev");
-		return ret;
-	}
-
-	ret = alloc_chrdev_region(&devIDfwlog, 0, 1, "BT_chrdevfwlog");
-	if (ret) {
-		BTUSB_ERR("fail to allocate chrdev");
-		return ret;
-	}
-#endif
-
-	BT_major = major = MAJOR(devID);
-	BTUSB_INFO("%s: major number: %d", __func__, BT_major);
-	BT_majorfwlog = majorfwlog = MAJOR(devIDfwlog);
-	BTUSB_INFO("%s: BT_majorfwlog number: %d", __func__, BT_majorfwlog);
-
-	cdev_init(&BT_cdev, &BT_fops);
-	BT_cdev.owner = THIS_MODULE;
-
-	cdev_init(&BT_cdevfwlog, &BT_fopsfwlog);
-	BT_cdevfwlog.owner = THIS_MODULE;
-	cdevErr = cdev_add(&BT_cdev, devID, 1);
-	if (cdevErr)
-		goto error;
-
-	cdevErr = cdev_add(&BT_cdevfwlog, devIDfwlog, 1);
-	if (cdevErr)
-		goto error;
-	BTUSB_INFO("%s: %s driver(major %d) installed.", __func__, "BT_chrdev",
-		BT_major);
-
-	BTUSB_INFO("%s: %s driver(major %d) installed.", __func__, "BT_chrdevfwlog",
-		BT_majorfwlog);
-	pBTClass = class_create(THIS_MODULE, "BT_chrdev");
-	if (IS_ERR(pBTClass)) {
-		BTUSB_ERR("class create fail, error code(%ld)",
-			PTR_ERR(pBTClass));
-		goto err1;
-	}
-
-	pBTDev = device_create(pBTClass, NULL, devID, NULL, "stpbt");
-	if (IS_ERR(pBTDev)) {
-		BTUSB_ERR("device create fail, error code(%ld)",
-			PTR_ERR(pBTDev));
-		goto err2;
-	}
-
-	pBTDevfwlog = device_create(pBTClass, NULL, devIDfwlog, NULL, "stpbtfwlog");
-	if (IS_ERR(pBTDevfwlog)) {
-		BTUSB_ERR("device(stpbtfwlog) create fail, error code(%ld)",
-			PTR_ERR(pBTDevfwlog));
-		goto err2;
-	}
-
-	BTUSB_INFO("%s: BT_major %d, BT_majorfwlog %d", __func__, BT_major, BT_majorfwlog);
-	BTUSB_INFO("%s: devID %d, devIDfwlog %d", __func__, devID, devIDfwlog);
-	g_devIDfwlog = devIDfwlog;
-	FOPS_MUTEX_LOCK();
-	btmtk_fops_set_state(BTMTK_FOPS_STATE_INIT);
-	FOPS_MUTEX_UNLOCK();
-
-	/* init wait queue */
-	init_waitqueue_head(&(inq));
-
-	/* register system power off callback function. */
-	do {
-		typedef void (*func_ptr) (int (*f) (void));
-		char *func_name = "RegisterPdwncCallback";
-		func_ptr pFunc = (func_ptr) kallsyms_lookup_name(func_name);
-
-		if (pFunc) {
-			BTUSB_INFO("%s: Register Pdwnc callback success.",
-				__func__);
-			pFunc(&btmtk_usb_standby);
-		} else
-			BTUSB_WARN
-				("%s: No Exported Func Found [%s], just skip!",
-				 __func__, func_name);
-	} while (0);
-
-	/* register early_suspend / late_reasume callback function. */
-	do {
-		char *register_early_suspend_func_name =
-			"RegisterEarlySuspendNotification";
-		char *register_late_resume_func_name =
-			"RegisterLateResumeNotification";
-
-		register_early_suspend_func = (register_early_suspend)
-			kallsyms_lookup_name(register_early_suspend_func_name);
-		register_late_resume_func = (register_late_resume)
-			kallsyms_lookup_name(register_late_resume_func_name);
-
-		if (register_early_suspend_func && register_late_resume_func) {
-			BTUSB_INFO
-				("%s: Register early suspend/late resume nitofication success.",
-				 __func__);
-			register_early_suspend_func(&btmtk_usb_early_suspend);
-			register_late_resume_func(&btmtk_usb_late_resume);
-		} else {
-			BTUSB_WARN
-				("%s: No Exported Func Found [%s], just skip!",
-				 __func__, register_late_resume_func_name);
-		}
-	} while (0);
-
-	/* allocate buffers. */
-	if (btmtk_usb_allocate_memory() < 0) {
-		BTUSB_ERR("%s: allocate memory failed!", __func__);
-		goto err2;
-	}
-
-	mutex_lock(&btmtk_usb_state_mutex);
-	btmtk_usb_set_state(BTMTK_USB_STATE_DISCONNECT);
-	mutex_unlock(&btmtk_usb_state_mutex);
-
-	BTUSB_INFO("%s: end", __func__);
-	return 0;
-
-err2:
-	if (pBTClass) {
-		class_destroy(pBTClass);
-		pBTClass = NULL;
-	}
-
-	btmtk_usb_free_memory();
-
-err1:
-error:
-	if (cdevErr == 0)
-		cdev_del(&BT_cdev);
-
-	if (ret == 0)
-		unregister_chrdev_region(devID, 1);
-	BTUSB_ERR("%s: error", __func__);
-	return -1;
-}
-
-static void btmtk_usb_BT_exit(void)
-{
-	dev_t dev = MKDEV(BT_major, 0);
-	dev_t devIDfwlog = g_devIDfwlog;/*MKDEV(BT_majorfwlog, 0);*/
-
-	BTUSB_INFO("%s: BT_major %d, BT_majorfwlog %d", __func__, BT_major, BT_majorfwlog);
-	BTUSB_INFO("%s: dev %d, devIDfwlog %d", __func__, dev, devIDfwlog);
-
-	FOPS_MUTEX_LOCK();
-	btmtk_fops_set_state(BTMTK_FOPS_STATE_UNKNOWN);
-	FOPS_MUTEX_UNLOCK();
-
-	if (pBTDevfwlog) {
-		device_destroy(pBTClass, devIDfwlog);
-		pBTDevfwlog = NULL;
-	}
-
-	if (pBTDev) {
-		device_destroy(pBTClass, dev);
-		pBTDev = NULL;
-	}
-
-	if (pBTClass) {
-		class_destroy(pBTClass);
-		pBTClass = NULL;
-	}
-
-	cdev_del(&BT_cdevfwlog);
-	unregister_chrdev_region(devIDfwlog, 1);
-
-	cdev_del(&BT_cdev);
-	unregister_chrdev_region(dev, 1);
-
-	btmtk_usb_free_memory();
-
-	mutex_lock(&btmtk_usb_state_mutex);
-	btmtk_usb_set_state(BTMTK_USB_STATE_UNKNOWN);
-	mutex_unlock(&btmtk_usb_state_mutex);
-
-	BTUSB_INFO("%s: BT_chrdev driver removed.", __func__);
-}
-
-static int btmtk_usb_handle_resume(void)
-{
-	if (btmtk_usb_submit_intr_urb() < 0)
-		return -1;
-
-	if (btmtk_usb_submit_bulk_in_urb() < 0)
-		return -1;
-
-	mutex_lock(&btmtk_usb_state_mutex);
-	btmtk_usb_set_state(BTMTK_USB_STATE_WORKING);
-	mutex_unlock(&btmtk_usb_state_mutex);
-
-	wake_up_interruptible(&inq);
-	return 0;
-}
-
-static void btmtk_usb_handle_entering_WoBLE_state(void)
-{
-	BTUSB_INFO("%s: begin", __func__);
-#if SUPPORT_MT7662
-	if (is_mt7662(g_data)) {
-		btmtk_usb_send_woble_suspend_cmd();
-		BTUSB_INFO("%s: end", __func__);
-		return;
-	}
-#endif
-#if SUPPORT_MT7668
-	if (is_mt7668(g_data)) {
-		while (g_data->is_mt7668_dongle_state == BTMTK_USB_7668_DONGLE_STATE_POWERING_ON ||
-			g_data->is_mt7668_dongle_state == BTMTK_USB_7668_DONGLE_STATE_POWERING_OFF) {
-			BTUSB_INFO("%s: dongle state is POWERING ON or OFF.", __func__);
-			mdelay(100);
-		}
-
-		if (g_data->is_mt7668_dongle_state == BTMTK_USB_7668_DONGLE_STATE_POWER_OFF) {
-			if (btmtk_usb_send_wmt_power_on_cmd_7668() < 0) {
-				g_data->is_mt7668_dongle_state = BTMTK_USB_7668_DONGLE_STATE_ERROR;
-				BTUSB_INFO("%s: end", __func__);
-				return;
-			}
-			btmtk_usb_send_hci_tci_set_sleep_cmd_7668();
-			btmtk_usb_send_hci_reset_cmd();
-			g_data->is_mt7668_dongle_state = BTMTK_USB_7668_DONGLE_STATE_POWER_ON;
-		}
-
-		if (g_data->is_mt7668_dongle_state == BTMTK_USB_7668_DONGLE_STATE_POWER_ON) {
-			if (btmtk_usb_send_woble_suspend_cmd() < 0) {
-				g_data->is_mt7668_dongle_state = BTMTK_USB_7668_DONGLE_STATE_ERROR;
-				BTUSB_INFO("%s: end", __func__);
-				return;
-			}
-			g_data->is_mt7668_dongle_state = BTMTK_USB_7668_DONGLE_STATE_WOBLE;
-		}
-
-		if (g_data->is_mt7668_dongle_state == BTMTK_USB_7668_DONGLE_STATE_WOBLE)
-			BTUSB_INFO("%s: Dongle is in WoBLE state.", __func__);
-		else
-			BTUSB_INFO("%s: Dongle state error (%d)", __func__, g_data->is_mt7668_dongle_state);
-
-		BTUSB_INFO("%s: end", __func__);
-		return;
-	}
-#endif
-	BTUSB_WARN("%s: No matched dongle!", __func__);
-}
-
-/*============================================================================*/
-/* Internal Functions : Chip Related */
-/*============================================================================*/
-#define ______________________________________Internal_Functions_Chip_Related
-/**
- * Only for load rom patch function, tmp_str[15] is '\n'
- */
-#define SHOW_FW_DETAILS(s)							\
-	BTUSB_INFO("%s: %s = %c%c%c%c%c%c%c%c%c%c%c%c%c%c%c", __func__, s,	\
-			tmp_str[0], tmp_str[1], tmp_str[2], tmp_str[3],		\
-			tmp_str[4], tmp_str[5], tmp_str[6], tmp_str[7],		\
-			tmp_str[8], tmp_str[9], tmp_str[10], tmp_str[11],	\
-			tmp_str[12], tmp_str[13], tmp_str[14]/*, tmp_str[15]*/)
-
-#if SUPPORT_MT7662
-static int btmtk_usb_load_rom_patch_7662(void)
-{
-	u32 loop = 0;
-	u32 value;
-	s32 sent_len;
-	int ret = 0;
-	u16 total_checksum = 0;
-	struct urb *urb;
-	u32 patch_len = 0;
-	u32 cur_len = 0;
-	dma_addr_t data_dma;
-	struct completion sent_to_mcu_done;
-	int first_block = 1;
-	u8 phase;
-	void *buf;
-	u8 *pos;
-	char *tmp_str;
-	unsigned int pipe = usb_sndbulkpipe(g_data->udev,
-						g_data->
-						bulk_tx_ep->bEndpointAddress);
-
-load_patch_protect:
-	btmtk_usb_switch_iobase_7662(WLAN);
-	btmtk_usb_io_read32_7662(SEMAPHORE_03, &value);
-	loop++;
-
-	if ((value & 0x01) == 0x00) {
-		if (loop < 1000) {
-			mdelay(1);
-			goto load_patch_protect;
-		} else {
-			BTUSB_WARN("%s: WARNING! Can't get semaphore! Continue",
-				__func__);
-		}
-	}
-
-	btmtk_usb_switch_iobase_7662(SYSCTL);
-
-	btmtk_usb_io_write32_7662(0x1c, 0x30);
-
-	btmtk_usb_switch_iobase_7662(WLAN);
-
-	/* check ROM patch if upgrade */
-	btmtk_usb_io_read32_7662(CLOCK_CTL, &value);
-	if ((value & 0x01) == 0x01) {
-		BTUSB_INFO("%s: no need to load rom patch", __func__);
-		if (!is_mt7662T(g_data))
-			btmtk_usb_send_dummy_bulk_out_packet_7662();
-		goto error0;
-	}
-
-	urb = usb_alloc_urb(0, GFP_KERNEL);
-
-	if (!urb) {
-		ret = -ENOMEM;
-		goto error0;
-	}
-
-	buf =
-		usb_alloc_coherent(g_data->udev, UPLOAD_PATCH_UNIT, GFP_KERNEL,
-				&data_dma);
-	if (!buf) {
-		ret = -ENOMEM;
-		goto error1;
-	}
-
-	pos = buf;
-	btmtk_usb_load_code_from_bin(&g_data->rom_patch,
-					 g_data->rom_patch_bin_file_name,
-					 &g_data->udev->dev,
-					 &g_data->rom_patch_len);
-
-	if (!g_data->rom_patch) {
-		BTUSB_ERR
-			("%s: please assign a rom patch(/etc/firmware/%s)or(/lib/firmware/%s)",
-			 __func__, g_data->rom_patch_bin_file_name,
-			 g_data->rom_patch_bin_file_name);
-
-		ret = -1;
-		goto error2;
-	}
-
-	tmp_str = g_data->rom_patch;
-	SHOW_FW_DETAILS("FW Version");
-	SHOW_FW_DETAILS("build Time");
-
-	tmp_str = g_data->rom_patch + 16;
-	BTUSB_INFO("%s: platform = %c%c%c%c", __func__, tmp_str[0], tmp_str[1],
-		tmp_str[2], tmp_str[3]);
-
-	tmp_str = g_data->rom_patch + 20;
-	BTUSB_INFO("%s: HW/SW version = %c%c%c%c", __func__, tmp_str[0],
-		tmp_str[1], tmp_str[2], tmp_str[3]);
-
-	tmp_str = g_data->rom_patch + 24;
-	BTUSB_INFO("%s: Patch version = %c%c%c%c", __func__, tmp_str[0],
-		tmp_str[1], tmp_str[2], tmp_str[3]);
-
-	do {
-		typedef void (*pdwnc_func) (u8 fgReset);
-		char *pdwnc_func_name = "PDWNC_SetBTInResetState";
-		pdwnc_func pdwndFunc = NULL;
-
-		pdwndFunc = (pdwnc_func) kallsyms_lookup_name(pdwnc_func_name);
-
-		if (pdwndFunc) {
-			BTUSB_INFO("%s: Invoke %s(%d)", __func__,
-				pdwnc_func_name, 1);
-			pdwndFunc(1);
-		} else {
-			BTUSB_WARN("%s: No Exported Func Found [%s]", __func__,
-				pdwnc_func_name);
-		}
-	} while (0);
-
-	BTUSB_INFO("%s: rom patch %s loading...", __func__, g_data->rom_patch_bin_file_name);
-
-	init_completion(&sent_to_mcu_done);
-
-	cur_len = 0x00;
-	patch_len = g_data->rom_patch_len - PATCH_INFO_SIZE;
-	BTUSB_INFO("%s: patch_len = %d", __func__, patch_len);
-
-	/* loading rom patch */
-	while (1) {
-		s32 sent_len_max = UPLOAD_PATCH_UNIT - PATCH_HEADER_SIZE;
-
-		sent_len =
-			(patch_len - cur_len) >=
-			sent_len_max ? sent_len_max : (patch_len - cur_len);
-
-		if (sent_len > 0) {
-			if (first_block == 1) {
-				if (sent_len < sent_len_max)
-					phase = PATCH_PHASE3;
-				else
-					phase = PATCH_PHASE1;
-				first_block = 0;
-			} else if (sent_len == sent_len_max) {
-				phase = PATCH_PHASE2;
-			} else {
-				phase = PATCH_PHASE3;
-			}
-
-			/* prepare HCI header */
-			pos[0] = 0x6F;
-			pos[1] = 0xFC;
-			pos[2] = (sent_len + 5) & 0xFF;
-			pos[3] = ((sent_len + 5) >> 8) & 0xFF;
-
-			/* prepare WMT header */
-			pos[4] = 0x01;
-			pos[5] = 0x01;
-			pos[6] = (sent_len + 1) & 0xFF;
-			pos[7] = ((sent_len + 1) >> 8) & 0xFF;
-
-			pos[8] = phase;
-
-			memcpy(&pos[9], g_data->rom_patch + PATCH_INFO_SIZE + cur_len,
-					sent_len);
-
-			BTUSB_INFO
-				("%s: sent_len = %d, cur_len = %d, phase = %d",
-				 __func__, sent_len, cur_len, phase);
-
-			usb_fill_bulk_urb(urb,
-					g_data->udev,
-					pipe,
-					buf,
-					sent_len + PATCH_HEADER_SIZE,
-					btmtk_usb_load_rom_patch_complete,
-					&sent_to_mcu_done);
-
-			urb->transfer_dma = data_dma;
-			urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
-
-			ret = usb_submit_urb(urb, GFP_KERNEL);
-
-			if (ret)
-				goto error2;
-
-			if (!wait_for_completion_timeout
-				(&sent_to_mcu_done, msecs_to_jiffies(1000))) {
-				usb_kill_urb(urb);
-				BTUSB_ERR("%s: upload rom_patch timeout",
-					__func__);
-				ret = -ETIME;
-				goto error2;
-			}
-
-			cur_len += sent_len;
-			mdelay(1);
-
-		} else {
-			BTUSB_INFO("%s: loading rom patch... Done", __func__);
-			break;
-		}
-	}
-
-	mdelay(20);
-	ret = btmtk_usb_get_rom_patch_result();
-	mdelay(1);
-
-	/* Send Checksum request */
-	total_checksum =
-		btmtk_usb_checksum16_7662(g_data->rom_patch + PATCH_INFO_SIZE,
-					patch_len);
-	btmtk_usb_chk_crc_7662(patch_len);
-
-	mdelay(1);
-
-	if (total_checksum != btmtk_usb_get_crc_7662()) {
-		BTUSB_ERR("checksum fail!, local(0x%x) <> fw(0x%x)",
-			total_checksum, btmtk_usb_get_crc_7662());
-		ret = -1;
-		goto error2;
-	}
-
-	/* send check rom patch result request */
-	mdelay(1);
-	btmtk_usb_send_hci_check_rom_patch_result_cmd_7662();
-
-	/* CHIP_RESET */
-	mdelay(1);
-	ret = btmtk_usb_send_wmt_reset_cmd();
-
-	/* BT_RESET */
-	mdelay(1);
-	btmtk_usb_send_hci_reset_cmd();
-
-	/* Enable BT Low Power */
-	mdelay(1);
-	btmtk_usb_send_hci_low_power_cmd_7662(TRUE);
-
-	/* for WoBLE/WoW low power */
-	mdelay(1);
-	btmtk_usb_send_hci_set_ce_cmd_7662();
-
-	mdelay(1);
-	btmtk_usb_send_hci_set_tx_power_cmd_7662();
-
-error2:
-	usb_free_coherent(g_data->udev, UPLOAD_PATCH_UNIT, buf, data_dma);
-error1:
-	usb_free_urb(urb);
-error0:
-	btmtk_usb_io_write32_7662(SEMAPHORE_03, 0x1);
-
-	do {
-		typedef void (*pdwnc_func) (u8 fgReset);
-		char *pdwnc_func_name = "PDWNC_SetBTInResetState";
-		pdwnc_func pdwndFunc = NULL;
-
-		pdwndFunc = (pdwnc_func) kallsyms_lookup_name(pdwnc_func_name);
-
-		if (pdwndFunc) {
-			BTUSB_INFO("%s: Invoke %s(%d)", __func__,
-				pdwnc_func_name, 0);
-			pdwndFunc(0);
-		} else
-			BTUSB_WARN("%s: No Exported Func Found [%s]", __func__,
-				pdwnc_func_name);
-	} while (0);
-
-	return ret;
-}
-
-static int btmtk_usb_io_read32_7662(u32 reg, u32 *val)
-{
-	int ret = -1;
-	u8 request = g_data->r_request;
-
-	memset(g_data->io_buf, 0, USB_IO_BUF_SIZE);
-	ret = usb_control_msg(g_data->udev, usb_rcvctrlpipe(g_data->udev, 0),
-			request, DEVICE_VENDOR_REQUEST_IN, 0x0, reg,
-			g_data->io_buf, sizeof(u32), USB_CTRL_IO_TIMO);
-
-	if (ret < 0) {
-		*val = 0xffffffff;
-		BTUSB_ERR("%s: error(%d), reg=%x, value=%x", __func__, ret, reg,
-			*val);
-		return ret;
-	}
-
-	memmove(val, g_data->io_buf, sizeof(u32));
-	*val = le32_to_cpu(*val);
-
-	return 0;
-}
-
-static int btmtk_usb_io_write32_7662(u32 reg, u32 val)
-{
-	int ret;
-	u16 value, index;
-	u8 request = g_data->w_request;
-
-	index = (u16) reg;
-	value = val & 0x0000ffff;
-
-	ret =
-		usb_control_msg(g_data->udev, usb_sndctrlpipe(g_data->udev, 0),
-				request, DEVICE_VENDOR_REQUEST_OUT, value, index,
-				NULL, 0, USB_CTRL_IO_TIMO);
-
-	if (ret < 0) {
-		BTUSB_ERR("%s: error(%d), reg=%x, value=%x", __func__, ret, reg,
-			val);
-		return ret;
-	}
-
-	index = (u16) (reg + 2);
-	value = (val & 0xffff0000) >> 16;
-
-	ret =
-		usb_control_msg(g_data->udev, usb_sndctrlpipe(g_data->udev, 0),
-				request, DEVICE_VENDOR_REQUEST_OUT, value, index,
-				NULL, 0, USB_CTRL_IO_TIMO);
-
-	if (ret < 0) {
-		BTUSB_ERR("%s: error(%d), reg=%x, value=%x", __func__, ret, reg,
-			val);
-		return ret;
-	}
-
-	if (ret > 0)
-		ret = 0;
-
-	return ret;
-}
-
-static int btmtk_usb_switch_iobase_7662(int base)
-{
-	int ret = 0;
-
-	switch (base) {
-	case SYSCTL:
-		g_data->w_request = 0x42;
-		g_data->r_request = 0x47;
-		break;
-	case WLAN:
-		g_data->w_request = 0x02;
-		g_data->r_request = 0x07;
-		break;
-
-	default:
-		return -EINVAL;
-	}
-
-	return ret;
-}
-
-static u16 btmtk_usb_checksum16_7662(u8 *pData, int len)
-{
-	u32 sum = 0;
-
-	while (len > 1) {
-		sum += *((u16 *) pData);
-
-		pData = pData + 2;
-
-		if (sum & 0x80000000)
-			sum = (sum & 0xFFFF) + (sum >> 16);
-
-		len -= 2;
-	}
-
-	if (len)
-		sum += *((u8 *) pData);
-
-	while (sum >> 16)
-		sum = (sum & 0xFFFF) + (sum >> 16);
-
-	return (u16)(~sum);
-}
-
-static int btmtk_usb_chk_crc_7662(u32 checksum_len)
-{
-	int ret = 0;
-
-	BT_DBG("%s", __func__);
-
-	memmove(g_data->io_buf, &g_data->rom_patch_offset, 4);
-	memmove(&g_data->io_buf[4], &checksum_len, 4);
-
-	ret =
-		usb_control_msg(g_data->udev, usb_sndctrlpipe(g_data->udev, 0), 0x1,
-				DEVICE_VENDOR_REQUEST_OUT, 0x20, 0x00,
-				g_data->io_buf, 8, USB_CTRL_IO_TIMO);
-
-	if (ret < 0)
-		BTUSB_ERR("%s: error(%d)", __func__, ret);
-
-	return ret;
-}
-
-static u16 btmtk_usb_get_crc_7662(void)
-{
-	int ret = 0;
-	u16 crc, count = 0;
-
-	while (1) {
-		ret =
-			usb_control_msg(g_data->udev,
-					usb_rcvctrlpipe(g_data->udev, 0), 0x01,
-					DEVICE_VENDOR_REQUEST_IN, 0x21, 0x00,
-					g_data->io_buf, USB_IO_BUF_SIZE,
-					USB_CTRL_IO_TIMO);
-
-		if (ret < 0) {
-			crc = 0xFFFF;
-			BTUSB_ERR("%s: error(%d)", __func__, ret);
-		}
-
-		memmove(&crc, g_data->io_buf, 2);
-
-		crc = le16_to_cpu(crc);
-
-		if (crc != 0xFFFF)
-			break;
-
-		mdelay(1);
-
-		if (count++ > 100) {
-			BTUSB_WARN("Query CRC over %d times", count);
-			break;
-		}
-	}
-
-	return crc;
-}
-
-static int btmtk_usb_send_hci_set_tx_power_cmd_7662(void)
-{
-	u8 cmd[] = { 0x79, 0xFC, 0x06, 0x07, 0x80, 0x00, 0x06, 0x07, 0x07 };
-	u8 event[] = { 0x0E, 0x04, 0x01, 0x79, 0xFC, 0x00 };
-	int ret = -1;	/* if successful, 0 */
-
-	ret = btmtk_usb_send_hci_cmd(cmd, sizeof(cmd), event, sizeof(event));
-	if (ret < 0) {
-		BTUSB_ERR("%s: failed(%d)", __func__, ret);
-	} else {
-		BTUSB_INFO("%s: OK", __func__);
-		ret = 0;
-	}
-
-	return ret;
-}
-
-static int btmtk_usb_send_hci_check_rom_patch_result_cmd_7662(void)
-{
-	u8 cmd[] = { 0xD1, 0xFC, 0x04, 0x00, 0xE2, 0x40, 0x00 };
-	u8 event[] = { 0x0E, 0x08, 0x01, 0xD1, 0xFC, 0x00 };
-	int ret = -1;	/* if successful, 0 */
-
-	ret = btmtk_usb_send_hci_cmd(cmd, sizeof(cmd), event, sizeof(event));
-	if (ret < 0) {
-		BTUSB_ERR("%s: failed(%d)", __func__, ret);
-
-	} else if (ret == sizeof(event) + 4) {
-		if (g_data->io_buf[6] == 0 && g_data->io_buf[7] == 0
-				&& g_data->io_buf[8] == 0 && g_data->io_buf[9] == 0) {
-			BTUSB_WARN("Check rom patch result: NG");
-			return -1;
-
-		} else {
-			BTUSB_INFO("Check rom patch result: OK");
-			ret = 0;
-		}
-
-	} else {
-		BTUSB_ERR("%s: failed, incorrect response length(%d)", __func__, ret);
-		return -1;
-	}
-
-	return ret;
-}
-
-static int btmtk_usb_send_hci_radio_on_cmd_7662(void)
-{
-	u8 cmd[] = { 0xC9, 0xFC, 0x02, 0x01, 0x01 };
-	u8 event[] = { 0xE6, 0x02, 0x08, 0x01 };
-	int ret = -1;	/* if successful, 0 */
-
-	ret = btmtk_usb_send_hci_cmd(cmd, sizeof(cmd), event, sizeof(event));
-	if (ret < 0) {
-		BTUSB_ERR("%s: failed(%d)", __func__, ret);
-	} else {
-		BTUSB_INFO("%s: OK", __func__);
-		ret = 0;
-	}
-
-	return ret;
-}
-
-static int btmtk_usb_send_hci_set_ce_cmd_7662(void)
-{
-	u8 cmd[] = { 0xD1, 0xFC, 0x04, 0x0C, 0x07, 0x41, 0x00 };
-	u8 event[] = { 0x0E, 0x08, 0x01, 0xD1, 0xFC, 0x00 };
-	int ret = -1;	/* if successful, 0 */
-
-	ret = btmtk_usb_send_hci_cmd(cmd, sizeof(cmd), event, sizeof(event));
-	if (ret < 0) {
-		BTUSB_ERR("%s: failed(%d)", __func__, ret);
-
-	} else if (ret == sizeof(event) + 4) {
-		if (g_data->io_buf[6] & 0x01) {
-			BTUSB_WARN("warning, 0x41070c[0] is 1!");
-			ret = 0;
-		} else {
-			/* write 0x41070C[0] to 1 */
-			u8 cmd2[11] = { 0xD0, 0xFC, 0x08, 0x0C, 0x07, 0x41, 0x00 };
-
-			cmd2[7] = g_data->io_buf[6] | 0x01;
-			cmd2[8] = g_data->io_buf[7];
-			cmd2[9] = g_data->io_buf[8];
-			cmd2[10] = g_data->io_buf[9];
-
-			ret = btmtk_usb_send_hci_cmd(cmd2, sizeof(cmd2), NULL, 0);
-			if (ret < 0) {
-				BTUSB_ERR("%s: write 0x41070C failed(%d)", __func__, ret);
-			} else {
-				BTUSB_INFO("%s: OK", __func__);
-				ret = 0;
-			}
-		}
-	} else {
-		BTUSB_ERR("%s: failed, incorrect response length(%d)", __func__, ret);
-		return -1;
-	}
-
-	return ret;
-}
-
-static int btmtk_usb_send_hci_radio_off_cmd_7662(void)
-{
-	u8 cmd[] = { 0xC9, 0xFC, 0x02, 0x01, 0x00 };
-	u8 event[] = { 0xE6, 0x02, 0x08, 0x00 };	/* unexpected opcode */
-	int ret = -1;	/* if successful, 0 */
-
-	ret = btmtk_usb_send_hci_cmd(cmd, sizeof(cmd), event, sizeof(event));
-	if (ret < 0) {
-		BTUSB_ERR("%s: failed(%d)", __func__, ret);
-	} else {
-		BTUSB_INFO("%s: OK", __func__);
-		ret = 0;
-	}
-
-	return ret;
-}
-
-static int btmtk_usb_send_hci_low_power_cmd_7662(bool enable)
-{
-	/* default for disable */
-	u8 cmd[] = { 0x40, 0xFC, 0x00 };
-	u8 event[] = { 0x0E, 0x04, 0x01, 0x40, 0xFC, 0x00 };
-	int ret = -1;	/* if successful, 0 */
-
-	/* for enable */
-	if (enable == TRUE) {
-		cmd[0] = 0x41;
-		event[3] = 0x41;
-	}
-	ret = btmtk_usb_send_hci_cmd(cmd, sizeof(cmd), event, sizeof(event));
-	if (ret < 0) {
-		BTUSB_ERR("%s: failed(%d)", __func__, ret);
-	} else {
-		BTUSB_INFO("%s: OK", __func__);
-		ret = 0;
-	}
-
-	return ret;
-}
-
-static void btmtk_usb_send_dummy_bulk_out_packet_7662(void)
-{
-	int ret = 0;
-	int actual_len;
-	unsigned int pipe;
-	u8 dummy_bulk_out_fuffer[8] = { 0 };
-
-	pipe =
-		usb_sndbulkpipe(g_data->udev, g_data->bulk_tx_ep->bEndpointAddress);
-	ret =
-		usb_bulk_msg(g_data->udev, pipe, dummy_bulk_out_fuffer, 8,
-			 &actual_len, 100);
-	if (ret)
-		BTUSB_ERR("%s: submit dummy bulk out failed!", __func__);
-	else
-		BTUSB_INFO("%s: 1. OK", __func__);
-
-	ret =
-		usb_bulk_msg(g_data->udev, pipe, dummy_bulk_out_fuffer, 8,
-			 &actual_len, 100);
-	if (ret)
-		BTUSB_ERR("%s: submit dummy bulk out failed!", __func__);
-	else
-		BTUSB_INFO("%s: 2. OK", __func__);
-}
-#endif /* SUPPORT_MT7662 */
-
-#if SUPPORT_MT7668
-static int btmtk_usb_io_read32_7668(u32 reg, u32 *val)
-{
-	int ret = -1;
-	__le16 reg_high;
-	__le16 reg_low;
-
-	reg_high = ((reg >> 16) & 0xffff);
-	reg_low = (reg & 0xffff);
-
-	memset(g_data->io_buf, 0, USB_IO_BUF_SIZE);
-	ret = usb_control_msg(g_data->udev, usb_rcvctrlpipe(g_data->udev, 0),
-			0x63,				/* bRequest */
-			DEVICE_VENDOR_REQUEST_IN,	/* bRequestType */
-			reg_high,			/* wValue */
-			reg_low,			/* wIndex */
-			g_data->io_buf,
-			sizeof(u32), USB_CTRL_IO_TIMO);
-
-	if (ret < 0) {
-		*val = 0xffffffff;
-		BTUSB_ERR("%s: error(%d), reg=%x, value=%x", __func__, ret, reg, *val);
-		return ret;
-	}
-
-	memmove(val, g_data->io_buf, sizeof(u32));
-	*val = le32_to_cpu(*val);
-
-	return 0;
-}
-
-static bool btmtk_usb_check_need_load_rom_patch_7668(void)
-{
-	/* TRUE: need load patch., FALSE: do not need */
-	u8 cmd[] = { 0x6F, 0xFC, 0x05, 0x01, 0x17, 0x01, 0x00, 0x01 };
-	u8 event[] = { 0xE4, 0x05, 0x02, 0x17, 0x01, 0x00, /* 0x02 */ };	/* event[6] is key */
-	int ret = -1;
-
-	BTUSB_DBG_RAW(cmd, sizeof(cmd), "%s: Send CMD:", __func__);
-	ret = btmtk_usb_send_wmt_cmd(cmd, sizeof(cmd), event, sizeof(event), 20);
-	/* can't get correct event, need load patch */
-	if (ret < 0)
-		return TRUE;
-
-	if (ret == sizeof(event) + 1 && (g_data->io_buf[6] == 0x00 || g_data->io_buf[6] == 0x01))
-		return FALSE;	/* Do not need */
-
-	return TRUE;
-}
-
-static int btmtk_usb_load_rom_patch_7668(void)
-{
-	s32 sent_len;
-	int ret = 0;
-	struct urb *urb;
-	u32 patch_len = 0;
-	u32 cur_len = 0;
-	dma_addr_t data_dma;
-	struct completion sent_to_mcu_done;
-	int first_block = 1;
-	u8 phase;
-	void *buf;
-	u8 *pos;
-	char *tmp_str;
-	unsigned int pipe = usb_sndbulkpipe(g_data->udev,
-			g_data->bulk_tx_ep->bEndpointAddress);
-
-	BTUSB_INFO("%s: begin", __func__);
-
-	if (btmtk_usb_check_need_load_rom_patch_7668() == FALSE) {
-		BTUSB_INFO("%s: no need to load rom patch", __func__);
-		ret = btmtk_usb_send_wmt_reset_cmd();
-		goto error0;
-	}
-
-	urb = usb_alloc_urb(0, GFP_KERNEL);
-
-	if (!urb) {
-		ret = -ENOMEM;
-		goto error0;
-	}
-
-	buf = usb_alloc_coherent(g_data->udev, UPLOAD_PATCH_UNIT, GFP_KERNEL,
-			&data_dma);
-
-	if (!buf) {
-		ret = -ENOMEM;
-		goto error1;
-	}
-
-	pos = buf;
-
-	btmtk_usb_load_code_from_bin(&g_data->rom_patch,
-			g_data->rom_patch_bin_file_name, &g_data->udev->dev,
-			&g_data->rom_patch_len);
-
-	if (!g_data->rom_patch) {
-		BTUSB_ERR("%s: please assign a rom patch(/etc/firmware/%s)or(/lib/firmware/%s)",
-			 __func__, g_data->rom_patch_bin_file_name,
-			 g_data->rom_patch_bin_file_name);
-
-		ret = -1;
-		goto error2;
-	}
-
-	tmp_str = g_data->rom_patch;
-	SHOW_FW_DETAILS("FW Version");
-	SHOW_FW_DETAILS("build Time");
-
-	tmp_str = g_data->rom_patch + 16;
-	BTUSB_INFO("%s: platform = %c%c%c%c", __func__, tmp_str[0], tmp_str[1],
-		tmp_str[2], tmp_str[3]);
-
-	tmp_str = g_data->rom_patch + 20;
-	BTUSB_INFO("%s: HW/SW version = %c%c%c%c", __func__, tmp_str[0],
-		tmp_str[1], tmp_str[2], tmp_str[3]);
-
-	tmp_str = g_data->rom_patch + 24;
-
-	BTUSB_INFO("loading rom patch...");
-
-	init_completion(&sent_to_mcu_done);
-
-	cur_len = 0x00;
-	patch_len = g_data->rom_patch_len - PATCH_INFO_SIZE;
-	BTUSB_INFO("%s: patch_len = %d", __func__, patch_len);
-
-	BTUSB_INFO("%s: loading rom patch...", __func__);
-	/* loading rom patch */
-	while (1) {
-		s32 sent_len_max = UPLOAD_PATCH_UNIT - PATCH_HEADER_SIZE;
-		int status = -1;
-
-		sent_len =
-			(patch_len - cur_len) >=
-			sent_len_max ? sent_len_max : (patch_len - cur_len);
-
-		if (sent_len > 0) {
-			if (first_block == 1) {
-				if (sent_len < sent_len_max)
-					phase = PATCH_PHASE3;
-				else
-					phase = PATCH_PHASE1;
-				first_block = 0;
-			} else if (sent_len == sent_len_max) {
-				phase = PATCH_PHASE2;
-			} else {
-				phase = PATCH_PHASE3;
-			}
-
-			/* prepare HCI header */
-			pos[0] = 0x6F;
-			pos[1] = 0xFC;
-			pos[2] = (sent_len + 5) & 0xFF;
-			pos[3] = ((sent_len + 5) >> 8) & 0xFF;
-
-			/* prepare WMT header */
-			pos[4] = 0x01;
-			pos[5] = 0x01;
-			pos[6] = (sent_len + 1) & 0xFF;
-			pos[7] = ((sent_len + 1) >> 8) & 0xFF;
-
-			pos[8] = phase;
-
-			memcpy(&pos[9], g_data->rom_patch + PATCH_INFO_SIZE + cur_len,
-					sent_len);
-
-			BTUSB_INFO
-				("%s: sent_len = %d, cur_len = %d, phase = %d",
-				 __func__, sent_len, cur_len, phase);
-
-			usb_fill_bulk_urb(urb,
-					g_data->udev,
-					pipe,
-					buf,
-					sent_len + PATCH_HEADER_SIZE,
-					btmtk_usb_load_rom_patch_complete,
-					&sent_to_mcu_done);
-
-			urb->transfer_dma = data_dma;
-			urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
-
-			status = usb_submit_urb(urb, GFP_KERNEL);
-			if (status) {
-				BTUSB_ERR("%s: submit urb failed (%d)", __func__, status);
-				ret = status;
-				goto error2;
-			}
-
-			if (!wait_for_completion_timeout
-				(&sent_to_mcu_done, msecs_to_jiffies(1000))) {
-				usb_kill_urb(urb);
-				BTUSB_ERR("%s: upload rom_patch timeout",
-					__func__);
-				ret = -ETIME;
-				goto error2;
-			}
-
-			cur_len += sent_len;
-
-			mdelay(1);
-			btmtk_usb_get_rom_patch_result();
-			mdelay(1);
-
-		} else {
-			BTUSB_INFO("%s: loading rom patch... Done", __func__);
-			break;
-		}
-	}
-
-	/* CHIP_RESET */
-	ret = btmtk_usb_send_wmt_reset_cmd();
-	g_data->is_mt7668_dongle_state = BTMTK_USB_7668_DONGLE_STATE_POWER_OFF;
-error2:
-	usb_free_coherent(g_data->udev, UPLOAD_PATCH_UNIT, buf, data_dma);
-error1:
-	usb_free_urb(urb);
-error0:
-	BTUSB_INFO("btmtk_usb_load_rom_patch end");
-	return ret;
-}
-
-static int btmtk_usb_send_hci_tci_set_sleep_cmd_7668(void)
-{
-	u8 cmd[] = { 0x7A, 0xFC, 0x07, 0x05, 0x40, 0x06, 0x40, 0x06, 0x00, 0x00 };
-	u8 event[] = { 0x0E, 0x04, 0x01, 0x7A, 0xFC, 0x00 };
-	int ret = -1;	/* if successful, 0 */
-
-	ret = btmtk_usb_send_hci_cmd(cmd, sizeof(cmd), event, sizeof(event));
-	if (ret < 0) {
-		BTUSB_ERR("%s: failed(%d)", __func__, ret);
-	} else {
-		BTUSB_INFO("%s: OK", __func__);
-		ret = 0;
-	}
-
-	return ret;
-}
-
-static int btmtk_usb_send_wmt_power_on_cmd_7668(void)
-{
-	u8 count = 0;	/* retry 3 times */
-	u8 cmd[] = { 0x6F, 0xFC, 0x06, 0x01, 0x06, 0x02, 0x00, 0x00, 0x01 };
-	u8 event[] = { 0xE4, 0x05, 0x02, 0x06, 0x01, 0x00 };	/* event[6] is key */
-	int ret = -1;	/* if successful, 0 */
-
-	g_data->is_mt7668_dongle_state = BTMTK_USB_7668_DONGLE_STATE_POWERING_ON;
-	do {
-		ret = btmtk_usb_send_wmt_cmd(cmd, sizeof(cmd), event, sizeof(event), 20);
-		if (ret < 0) {
-			BTUSB_ERR("%s: failed(%d)", __func__, ret);
-			g_data->is_mt7668_dongle_state = BTMTK_USB_7668_DONGLE_STATE_ERROR;
-
-		} else if (ret == sizeof(event) + 1) {
-			switch (g_data->io_buf[6]) {
-			case 0:			 /* successful */
-				BTUSB_INFO("%s: OK", __func__);
-				g_data->is_mt7668_dongle_state = BTMTK_USB_7668_DONGLE_STATE_POWER_ON;
-				ret = 0;
-				break;
-			case 2:			 /* retry */
-				BTUSB_INFO("%s: Try again", __func__);
-				continue;
-			default:
-				BTUSB_INFO("%s: Unknown result: %02X", __func__, g_data->io_buf[6]);
-				g_data->is_mt7668_dongle_state = BTMTK_USB_7668_DONGLE_STATE_ERROR;
-				return -1;
-			}
-
-		} else {
-			BTUSB_ERR("%s: failed, incorrect response length(%d)", __func__, ret);
-			g_data->is_mt7668_dongle_state = BTMTK_USB_7668_DONGLE_STATE_ERROR;
-			return -1;
-		}
-	} while (++count < 3 && ret > 0);
-
-	return ret;
-}
-
-static int btmtk_usb_send_wmt_power_off_cmd_7668(void)
-{
-	u8 cmd[] = { 0x6F, 0xFC, 0x06, 0x01, 0x06, 0x02, 0x00, 0x00, 0x00 };
-	u8 event[] = { 0xE4, 0x05, 0x02, 0x06, 0x01, 0x00, 0x00 };
-	int ret = -1;	/* if successful, 0 */
-
-	g_data->is_mt7668_dongle_state = BTMTK_USB_7668_DONGLE_STATE_POWERING_OFF;
-	ret = btmtk_usb_send_wmt_cmd(cmd, sizeof(cmd), event, sizeof(event), 20);
-	if (ret < 0) {
-		BTUSB_ERR("%s: failed(%d)", __func__, ret);
-		g_data->is_mt7668_dongle_state = BTMTK_USB_7668_DONGLE_STATE_ERROR;
-		return ret;
-	}
-
-	BTUSB_INFO("%s: OK", __func__);
-	g_data->is_mt7668_dongle_state = BTMTK_USB_7668_DONGLE_STATE_POWER_OFF;
-	return 0;
-}
-#endif /* SUPPORT_MT7668 */
-
-static void btmtk_usb_cap_init(void)
-{
-#if SUPPORT_MT7662
-	btmtk_usb_switch_iobase_7662(WLAN);
-	btmtk_usb_io_read32_7662(0x00, &g_data->chip_id);
-
-	if (g_data->chip_id) {
-		BTUSB_INFO("%s: chip id = %x", __func__, g_data->chip_id);
-		if (is_mt7662T(g_data)) {
-			BTUSB_INFO("%s: This is MT7662T chip", __func__);
-			if (g_data->rom_patch_bin_file_name) {
-				memset(g_data->rom_patch_bin_file_name, 0, MAX_BIN_FILE_NAME_LEN);
-				memcpy(g_data->rom_patch_bin_file_name,
-						"mt7662t_patch_e1_hdr.bin", 24);
-			}
-			g_data->rom_patch_offset = 0xBC000;
-			g_data->rom_patch_len = 0;
-			return;
-		} else if (is_mt7662(g_data)) {
-			BTUSB_INFO("%s: This is MT7662U chip", __func__);
-			if (g_data->rom_patch_bin_file_name) {
-				memset(g_data->rom_patch_bin_file_name, 0, MAX_BIN_FILE_NAME_LEN);
-				memcpy(g_data->rom_patch_bin_file_name,
-						"mt7662_patch_e3_hdr.bin", 23);
-			}
-			g_data->rom_patch_offset = 0x90000;
-			g_data->rom_patch_len = 0;
-			return;
-		}
-	}
-#endif /* SUPPORT_MT7662 */
-
-#if SUPPORT_MT7668
-	btmtk_usb_io_read32_7668(0x80000008, &g_data->chip_id);
-	if (g_data->chip_id) {
-		BTUSB_INFO("%s: chip id = %x", __func__, g_data->chip_id);
-		if (is_mt7668(g_data)) {
-			unsigned int chip_version = 0;
-
-			btmtk_usb_io_read32_7668(0x80000000, &chip_version);
-			memset(g_data->rom_patch_bin_file_name, 0, MAX_BIN_FILE_NAME_LEN);
-			if (chip_version == 0x8a00) {
-				BTUSB_INFO("%s: This is MT7668 E1 chip", __func__);
-				g_data->chip_id |= chip_version << 16;
-				memcpy(g_data->rom_patch_bin_file_name, "mt7668_patch_e1_hdr.bin", 23);
-			} else if (chip_version == 0x8b10) {
-				BTUSB_INFO("%s: This is MT7668 E2 chip", __func__);
-				g_data->chip_id |= chip_version << 16;
-				memcpy(g_data->rom_patch_bin_file_name, "mt7668_patch_e2_hdr.bin", 23);
-			} else
-				BTUSB_ERR("%s: Unknown MT7668 chip version 0x%x", __func__, chip_version);
-
-			g_data->rom_patch_offset = 0x2000000;
-			g_data->rom_patch_len = 0;
-			return;
-		}
-	}
-#endif /* SUPPORT_MT7668 */
-
-	BTUSB_WARN("Unknown chip(%x)", g_data->chip_id);
-
-}
-
-static int btmtk_usb_load_rom_patch(void)
-{
-	int err = -1;
-
-	if (g_data == NULL) {
-		BTUSB_ERR("%s: g_data is NULL !", __func__);
-		return err;
-	}
-
-#if SUPPORT_MT7662
-	if (is_mt7662(g_data))
-		return btmtk_usb_load_rom_patch_7662();
-#endif
-
-#if SUPPORT_MT7668
-	if (is_mt7668(g_data))
-		return btmtk_usb_load_rom_patch_7668();
-#endif
-
-	BTUSB_WARN("%s: unknown chip id (%d)", __func__, g_data->chip_id);
-	return err;
-}
-
-/*============================================================================*/
-/* Internal Functions : Send HCI/WMT */
-/*============================================================================*/
-#define ______________________________________Internal_Functions_Send_HCI_WMT
-static int btmtk_usb_send_woble_suspend_cmd(void)
-{
-	int ret = 0;	/* if successful, 0 */
-#if SUPPORT_LEGACY_WOBLE
-#if BT_RC_VENDOR_DEFAULT
-	do {
-		u8 cmd[] = { 0xC9, 0xFC, 0x0D, 0x01, 0x0E, 0x00, 0x05, 0x43,
-			0x52, 0x4B, 0x54, 0x4D, 0x20, 0x04, 0x32, 0x00 };
-
-		BTUSB_INFO("%s: BT_RC_VENDOR_T0 or Default", __func__);
-		ret = btmtk_usb_send_hci_cmd(cmd, sizeof(cmd), NULL, -1);
-	} while (0);
-#elif BT_RC_VENDOR_S0
-	do {
-		u8 cmd[] = { 0xC9, 0xFC, 0x02, 0x01, 0x0B };
-
-		BTUSB_INFO("%s: BT_RC_VENDOR_S0", __func__);
-		ret = btmtk_usb_send_hci_cmd(cmd, sizeof(cmd), NULL, -1);
-	} while (0);
-#endif
-	if (ret < 0) {
-		BTUSB_ERR("%s: failed(%d)", __func__, ret);
-	} else {
-		BTUSB_INFO("%s: OK", __func__);
-		ret = 0;
-	}
-#endif /* SUPPORT_LEGACY_WOBLE */
-	return ret;
-}
-
-static int btmtk_usb_send_wmt_reset_cmd(void)
-{
-	u8 cmd[] = { 0x6F, 0xFC, 0x05, 0x01, 0x07, 0x01, 0x00, 0x04 };
-	u8 event[] = { 0xE4, 0x05, 0x02, 0x07, 0x01, 0x00, 0x00 };
-	int ret = -1;	/* if successful, 0 */
-
-	BTUSB_DBG_RAW(cmd, sizeof(cmd), "%s: Send CMD:", __func__);
-	ret = btmtk_usb_send_wmt_cmd(cmd, sizeof(cmd), event, sizeof(event), 20);
-	if (ret < 0) {
-		BTUSB_ERR("Check reset wmt result: NG");
-	} else {
-		BTUSB_INFO("Check reset wmt result: OK");
-		ret = 0;
-	}
-
-	return ret;
-}
-
-static int btmtk_usb_get_rom_patch_result(void)
-{
-	u8 event[] = { 0xE4, 0x05, 0x02, 0x01, 0x01, 0x00, 0x00 };
-	int ret = -1;	/* if successful, 0 */
-
-	if (g_data == NULL) {
-		BTUSB_ERR("%s: g_data == NULL!", __func__);
-		return -1;
-	}
-	if (g_data->udev == NULL) {
-		BTUSB_ERR("%s: g_data->udev == NULL!", __func__);
-		return -1;
-	}
-	if (g_data->io_buf == NULL) {
-		BTUSB_ERR("%s: g_data->io_buf == NULL!", __func__);
-		return -1;
-	}
-
-	memset(g_data->io_buf, 0, USB_IO_BUF_SIZE);
-	ret =
-		usb_control_msg(g_data->udev, usb_rcvctrlpipe(g_data->udev, 0),
-				0x01, DEVICE_VENDOR_REQUEST_IN, 0x30, 0x00,
-				g_data->io_buf, USB_IO_BUF_SIZE,
-				USB_CTRL_IO_TIMO);
-
-	if (ret < 0)
-		BTUSB_ERR("%s: error(%d)", __func__, ret);
-
-	/* ret should be 16 bytes */
-	if (ret >= sizeof(event) && !memcmp(g_data->io_buf, event, sizeof(event))) {
-		BTUSB_INFO("Get rom patch result: OK");
-		return 0;
-
-	} else {
-		BTUSB_WARN("Get rom patch result: NG");
-		BTUSB_DBG_RAW(g_data->io_buf, ret, "%s: Get unknown event is:", __func__);
-		return -1;
-	}
-
-	return ret;
-}
-
-static int btmtk_usb_send_hci_reset_cmd(void)
-{
-	u8 cmd[] = { 0x03, 0x0C };
-	u8 event[] = { 0x0E, 0x04, 0x01, 0x03, 0x0C, 0x00 };
-	int ret = -1;	/* if successful, 0 */
-
-	ret = btmtk_usb_send_hci_cmd(cmd, sizeof(cmd), event, sizeof(event));
-	if (ret < 0) {
-		BTUSB_ERR("%s: failed(%d)", __func__, ret);
-	} else {
-		BTUSB_INFO("%s: OK", __func__);
-		ret = 0;
-	}
-
-	return ret;
-}
-
-static int btmtk_usb_send_assert_cmd_ctrl(void)
-{
-	u8 cmd[] = { 0x6F, 0xFC, 0x05, 0x01, 0x02, 0x01, 0x00, 0x08 };
-	int ret = -1;	/* if successful, 0 */
-
-	BTUSB_DBG_RAW(cmd, sizeof(cmd), "%s: Send CMD:", __func__);
-	/* Ask DO NOT read event */
-	ret = btmtk_usb_send_hci_cmd(cmd, sizeof(cmd), NULL, -1);
-	if (ret < 0) {
-		BTUSB_ERR("%s: error(%d)", __func__, ret);
-	} else {
-		BTUSB_INFO("%s: OK", __func__);
-		ret = 0;
-	}
-
-	return ret;
-}
-
-static int btmtk_usb_send_assert_cmd_bulk(void)
-{
-	int ret = 0;
-	int actual_length = 9;
-	u8 buf[] = { 0x6F, 0xFC, 0x05, 0x00, 0x01, 0x02, 0x01, 0x00, 0x08 };
-
-	BTUSB_DBG_RAW(buf, sizeof(buf), "%s: Send CMD:", __func__);
-	ret = usb_bulk_msg(g_data->udev, usb_sndbulkpipe(g_data->udev, 2), buf,
-			 sizeof(buf), &actual_length, 100);
-
-	if (ret < 0) {
-		BTUSB_ERR("%s: error(%d)", __func__, ret);
-		return ret;
-	}
-	BTUSB_INFO("%s: OK", __func__);
-	return 0;
-}
-
-/*============================================================================*/
-/* Callback Functions */
-/*============================================================================*/
-#define ___________________________________________________Callback_Functions
-static void btmtk_usb_early_suspend(void)
-{
-	if (g_data == NULL) {
-		BTUSB_ERR("%s: ERROR, g_data is NULL!", __func__);
-		return;
-	}
-
-	BTUSB_INFO("%s: begin", __func__);
-	BTUSB_WARN("%s: skip this state", __func__);
-	/*
-	* mutex_lock(&btmtk_usb_state_mutex);
-	* btmtk_usb_set_state(BTMTK_USB_STATE_EARLY_SUSPEND);
-	* mutex_unlock(&btmtk_usb_state_mutex);
-	*/
-	BTUSB_INFO("%s: end", __func__);
-}
-
-static void btmtk_usb_late_resume(void)
-{
-	int retry_counter = 10;
-	int state = BTMTK_USB_STATE_UNKNOWN;
-
-late_resume_again:
-	BTUSB_INFO("%s: begin", __func__);
-	if (g_data == NULL) {
-		BTUSB_ERR("%s: ERROR, g_data is NULL!", __func__);
-		return;
-	}
-
-	mutex_lock(&btmtk_usb_state_mutex);
-	state = btmtk_usb_get_state();
-	if (state == BTMTK_USB_STATE_EARLY_SUSPEND || state == BTMTK_USB_STATE_WORKING) {
-		BTUSB_WARN("%s: invoked immediately after early suspend, ignore.", __func__);
-		btmtk_usb_set_state(BTMTK_USB_STATE_WORKING);
-		BTUSB_INFO("%s: end", __func__);
-		mutex_unlock(&btmtk_usb_state_mutex);
-		return;
-	} else if (state == BTMTK_USB_STATE_DISCONNECT || state == BTMTK_USB_STATE_SUSPEND_DISCONNECT
-			|| state == BTMTK_USB_STATE_RESUME_DISCONNECT) {
-		BTUSB_WARN("%s: previous state is disconnect(%d), ignore and set to disconnect state.",
-			__func__, state);
-		btmtk_usb_set_state(BTMTK_USB_STATE_DISCONNECT);
-		BTUSB_INFO("%s: end", __func__);
-		mutex_unlock(&btmtk_usb_state_mutex);
-		return;
-	} else if (state == BTMTK_USB_STATE_FW_DUMP || state == BTMTK_USB_STATE_RESUME_FW_DUMP) {
-		BTUSB_WARN("%s: previous state is fw dump(%d), ignore and set to fw dump state.", __func__, state);
-		btmtk_usb_set_state(BTMTK_USB_STATE_FW_DUMP);
-		BTUSB_INFO("%s: end", __func__);
-		mutex_unlock(&btmtk_usb_state_mutex);
-		return;
-	} else if (state == BTMTK_USB_STATE_PROBE ||
-			state == BTMTK_USB_STATE_SUSPEND_PROBE || state == BTMTK_USB_STATE_RESUME_PROBE) {
-		BTUSB_WARN("%s: previous state is probe(%d), ignore and set to probe state.", __func__, state);
-		btmtk_usb_set_state(BTMTK_USB_STATE_PROBE);
-		BTUSB_INFO("%s: end", __func__);
-		mutex_unlock(&btmtk_usb_state_mutex);
-		return;
-	} else if (state != BTMTK_USB_STATE_RESUME && state != BTMTK_USB_STATE_SUSPEND) {
-		BTUSB_WARN("%s: previous state is not suspend/resume(%d), ignore.", __func__, state);
-		BTUSB_INFO("%s: end", __func__);
-		mutex_unlock(&btmtk_usb_state_mutex);
-		return;
-	}
-	btmtk_usb_set_state(BTMTK_USB_STATE_LATE_RESUME);
-	mutex_unlock(&btmtk_usb_state_mutex);
-
-	/* Since late_resume is running in another kernel thread, handle error case here to avoid race condition. */
-	if (btmtk_usb_handle_resume() < 0) {
-		if (retry_counter > 0) {
-			retry_counter--;
-			BTUSB_WARN("%s: failed to handle resume, wait 500ms and retry again.", __func__);
-			BTUSB_INFO("%s: end", __func__);
-			msleep(500);
-			goto late_resume_again;
-		} else {
-			btmtk_usb_send_assert_cmd();
-		}
-	}
-	BTUSB_INFO("%s: end", __func__);
-}
-
-static void btmtk_usb_load_rom_patch_complete(struct urb *urb)
-{
-	struct completion *sent_to_mcu_done = (struct completion *)urb->context;
-
-	complete(sent_to_mcu_done);
-}
-
-static void btmtk_usb_intr_complete(struct urb *urb)
-{
-	u8 *event_buf;
-	u8 ebf0 = 0, ebf1 = 0, ebf2 = 0;
-	u32 roomLeft, last_len, length;
-	int err;
-	struct sk_buff *skb_fwlog = NULL;
-	ulong flags = 0;
-
-	if (g_data == NULL) {
-		BTUSB_ERR("%s: ERROR, g_data is NULL!", __func__);
-		return;
-	}
-
-	if (urb->status != 0)
-		BTUSB_WARN("%s: urb %p urb->status %d count %d", __func__,
-			urb, urb->status, urb->actual_length);
-
-	if (urb->status == 0 && urb->actual_length != 0) {
-		event_buf = urb->transfer_buffer;
-		ebf0 = event_buf[0];
-		ebf1 = event_buf[1];
-		ebf2 = event_buf[2];
-		btmtk_usb_hci_snoop_save_event(urb->actual_length,
-						urb->transfer_buffer);
-
-	if (urb->actual_length >= 3 && g_data->fwlog_queue_count < FWLOG_QUEUE_COUNT) {
-		BTUSB_DBG("%s: test", __func__);
-		if ((urb->actual_length == 2 + ebf1) && ebf0 == 0xFF && (ebf2 == 0x50 || ebf2 == 0x51)) {
-
-		skb_fwlog = alloc_skb(urb->actual_length, GFP_ATOMIC);
-		if (skb_fwlog == NULL) {
-			BTUSB_ERR("%s: alloc_skb return 0, error", __func__);
-			goto intr_resub;
-		}
-
-		memcpy(&skb_fwlog->data[0], &event_buf[0], urb->actual_length);
-		skb_fwlog->len = urb->actual_length;
-
-		spin_lock_irqsave(&g_data->fwlog_lock, flags);
-		skb_queue_tail(&g_data->fwlog_queue, skb_fwlog);
-		g_data->fwlog_queue_count++;
-		spin_unlock_irqrestore(&g_data->fwlog_lock, flags);
-		}
-	}
-
-		/* In this condition, need to add header */
-		if (leftHciEventSize == 0)
-			length = urb->actual_length + 1;
-		else
-			length = urb->actual_length;
-
-		btmtk_usb_lock_unsleepable_lock(&(g_data->metabuffer->spin_lock));
-
-		/* roomleft means the usable space */
-		if (g_data->metabuffer->read_p <= g_data->metabuffer->write_p) {
-			roomLeft = META_BUFFER_SIZE - g_data->metabuffer->write_p
-				+ g_data->metabuffer->read_p - 1;
-		} else {
-			roomLeft = g_data->metabuffer->read_p - g_data->metabuffer->write_p - 1;
-		}
-
-		/* no enough space to store the received data */
-		if (roomLeft < length)
-			BTUSB_WARN("%s: Queue is full !!", __func__);
-
-		if (length + g_data->metabuffer->write_p < META_BUFFER_SIZE) {
-			/* only one interrupt event, not be splited */
-			if (leftHciEventSize == 0) {
-				/* copy event header: 0x04 */
-				g_data->metabuffer->buffer[g_data->metabuffer->write_p] = 0x04;
-				g_data->metabuffer->write_p += 1;
-			}
-			/* copy event data */
-			memcpy(g_data->metabuffer->buffer + g_data->metabuffer->write_p,
-					event_buf, urb->actual_length);
-			g_data->metabuffer->write_p += urb->actual_length;
-		} else {
-			BTUSB_DBG("%s: back to meta buffer head", __func__);
-			last_len = META_BUFFER_SIZE - g_data->metabuffer->write_p;
-
-			/* only one interrupt event, not be splited */
-			if (leftHciEventSize == 0) {
-				if (last_len != 0) {
-					/* copy evnet header: 0x04 */
-					g_data->metabuffer->buffer[g_data->metabuffer->write_p] = 0x04;
-					g_data->metabuffer->write_p += 1;
-					last_len--;
-					/* copy event data */
-					memcpy(g_data->metabuffer->buffer + g_data->metabuffer->write_p,
-							event_buf, last_len);
-					memcpy(g_data->metabuffer->buffer, event_buf + last_len,
-							urb->actual_length - last_len);
-					g_data->metabuffer->write_p = urb->actual_length - last_len;
-				} else {
-					g_data->metabuffer->buffer[0] = 0x04;
-					g_data->metabuffer->write_p = 1;
-					/* copy event data */
-					memcpy(g_data->metabuffer->buffer + g_data->metabuffer->write_p,
-							event_buf, urb->actual_length);
-					g_data->metabuffer->write_p += urb->actual_length;
-				}
-			/* leftHciEventSize != 0 */
-			} else {
-				/* copy event data */
-				memcpy(g_data->metabuffer->buffer + g_data->metabuffer->write_p,
-						event_buf, last_len);
-				memcpy(g_data->metabuffer->buffer, event_buf + last_len,
-						urb->actual_length - last_len);
-				g_data->metabuffer->write_p = urb->actual_length - last_len;
-			}
-		}
-
-		btmtk_usb_unlock_unsleepable_lock(&(g_data->metabuffer->spin_lock));
-
-		if (leftHciEventSize != 0) {
-			leftHciEventSize -= urb->actual_length;
-
-			/* error handling. Length wrong, drop some bytes to recovery counter!! */
-			if (leftHciEventSize < 0) {
-				BTUSB_WARN
-					("%s: *size wrong(%d), this event may be wrong!!",
-					 __func__, leftHciEventSize);
-				leftHciEventSize = 0;	/* reset count */
-			}
-
-			if (leftHciEventSize == 0) {
-				if (btmtk_usb_get_state() ==
-					BTMTK_USB_STATE_WORKING) {
-					wake_up(&BT_wq);
-					wake_up_interruptible(&inq);
-				} else {
-					BTUSB_WARN
-						("%s: current is in suspend/resume (%d), Don't wake-up wait queue",
-						 __func__, btmtk_usb_get_state());
-				}
-			}
-		} else if (leftHciEventSize == 0) {
-			if (btmtk_usb_get_state() == BTMTK_USB_STATE_WORKING) {
-				wake_up(&BT_wq);
-				wake_up_interruptible(&inq);
-			} else {
-				BTUSB_WARN
-					("%s: current is in suspend/resume (%d), Don't wake-up wait queue",
-					 __func__, btmtk_usb_get_state());
-			}
-		}
-	} else {
-		BTUSB_INFO("%s: urb->status:%d, urb->length:%d", __func__,
-			urb->status, urb->actual_length);
-	}
-intr_resub:
-	usb_mark_last_busy(g_data->udev);
-	usb_anchor_urb(urb, &g_data->intr_anchor);
-
-	err = usb_submit_urb(urb, GFP_KERNEL);
-	if (err < 0) {
-		/* -EPERM: urb is being killed; */
-		/* -ENODEV: device got disconnected */
-		if (err != -EPERM && err != -ENODEV)
-			BTUSB_ERR("%s: urb %p failed to resubmit intr_in_urb(%d)",
-				 __func__, urb, -err);
-		usb_unanchor_urb(urb);
-	}
-}
-
-static void btmtk_usb_bulk_in_complete(struct urb *urb)
-{
-	/* actual_length: the ACL data size (doesn't contain header) */
-	u32 roomLeft, last_len, length, index, actual_length;
-	u8 *event_buf;
-	int state = btmtk_usb_get_state();
-	int err;
-	u8 *buf;
-	u16 len;
-
-	if (g_data == NULL) {
-		BTUSB_ERR("%s: ERROR, g_data is NULL!", __func__);
-		return;
-	}
-
-	roomLeft = 0;
-	last_len = 0;
-	length = 0;
-	index = 0;
-	actual_length = 0;
-
-	if (urb->status != 0)
-		BTUSB_INFO("%s: urb %p urb->status %d count %d", __func__,
-			urb, urb->status, urb->actual_length);
-
-	/* Handle FW Dump Data */
-	buf = urb->transfer_buffer;
-	len = 0;
-	if (urb->actual_length > 4) {
-		len = buf[2] + ((buf[3] << 8) & 0xff00);
-		if (buf[0] == 0x6f && buf[1] == 0xfc && len + 4 == urb->actual_length) {
-			if (state != BTMTK_USB_STATE_FW_DUMP && state != BTMTK_USB_STATE_RESUME_FW_DUMP) {
-				/* This is the first BULK_IN packet of FW dump. */
-				if (state == BTMTK_USB_STATE_RESUME)
-					btmtk_usb_set_state(BTMTK_USB_STATE_RESUME_FW_DUMP);
-				else
-					btmtk_usb_set_state(BTMTK_USB_STATE_FW_DUMP);
-				btmtk_usb_hci_snoop_print_to_log();
-			}
-
-			btmtk_fifo_in(FIFO_COREDUMP, g_data->bt_fifo, (const void *)&buf[4], len);
-			/* set to 0xff to avoide BlueDroid dropping this ACL packet. */
-			buf[0] = 0xff;
-			buf[1] = 0xff;
-		}
-	}
-
-	if (urb->status == 0) {
-		event_buf = urb->transfer_buffer;
-		len = buf[2] + ((buf[3] << 8) & 0xff00);
-
-		btmtk_usb_hci_snoop_save_acl(urb->actual_length,
-						 urb->transfer_buffer);
-
-		if (urb->actual_length > 4 && event_buf[0] == 0x6f
-			&& event_buf[1] == 0xfc && len + 4 == urb->actual_length) {
-			BTUSB_DBG("Coredump message");
-		} else {
-			length = urb->actual_length + 1;
-
-			actual_length =
-				1 * (event_buf[2] & 0x0f) +
-				16 * ((event_buf[2] & 0xf0) >> 4)
-				+ 256 * ((event_buf[3] & 0x0f)) +
-				4096 * ((event_buf[3] & 0xf0) >> 4);
-
-			btmtk_usb_lock_unsleepable_lock(&
-							(g_data->
-							 metabuffer->spin_lock));
-
-			/* roomleft means the usable space */
-			if (g_data->metabuffer->read_p <=
-				g_data->metabuffer->write_p)
-				roomLeft =
-					META_BUFFER_SIZE -
-					g_data->metabuffer->write_p +
-					g_data->metabuffer->read_p - 1;
-			else
-				roomLeft =
-					g_data->metabuffer->read_p -
-					g_data->metabuffer->write_p - 1;
-
-			/* no enough space to store the received data */
-			if (roomLeft < length)
-				BTUSB_WARN("%s: Queue is full !!", __func__);
-
-			if (length + g_data->metabuffer->write_p <
-				META_BUFFER_SIZE) {
-
-				if (leftACLSize == 0) {
-					/* copy ACL data header: 0x02 */
-					g_data->metabuffer->
-						buffer[g_data->metabuffer->write_p]
-						= 0x02;
-					g_data->metabuffer->write_p += 1;
-				}
-
-				/* copy event data */
-				memcpy(g_data->metabuffer->buffer + g_data->metabuffer->write_p,
-						event_buf, urb->actual_length);
-				g_data->metabuffer->write_p += urb->actual_length;
-			} else {
-				last_len =
-					META_BUFFER_SIZE -
-					g_data->metabuffer->write_p;
-				if (leftACLSize == 0) {
-					if (last_len != 0) {
-						/* copy ACL data header: 0x02 */
-						g_data->metabuffer->buffer[g_data->metabuffer->write_p] = 0x02;
-						g_data->metabuffer->write_p += 1;
-						last_len--;
-						/* copy event data */
-						memcpy(g_data->metabuffer->buffer + g_data->metabuffer->write_p,
-								event_buf, last_len);
-						memcpy(g_data->metabuffer->buffer, event_buf + last_len,
-								urb->actual_length - last_len);
-						g_data->metabuffer->write_p =
-							urb->actual_length -
-							last_len;
-					} else {
-						g_data->metabuffer->buffer[0] =
-							0x02;
-						g_data->metabuffer->write_p = 1;
-						/* copy event data */
-						memcpy(g_data->metabuffer->buffer + g_data->metabuffer->write_p,
-								event_buf, urb->actual_length);
-						g_data->metabuffer->write_p += urb->actual_length;
-					}
-				} else {	/* leftACLSize !=0 */
-
-					/* copy event data */
-					memcpy(g_data->metabuffer->buffer + g_data->metabuffer->write_p,
-							event_buf, last_len);
-					memcpy(g_data->metabuffer->buffer, event_buf + last_len,
-							urb->actual_length - last_len);
-					g_data->metabuffer->write_p =
-						urb->actual_length - last_len;
-				}
-			}
-
-			btmtk_usb_unlock_unsleepable_lock(&(g_data->metabuffer->spin_lock));
-
-			/* the maximize bulk in ACL data packet size is 512 (4byte header + 508 byte data) */
-			/* maximum receieved data size of one packet is 1025 (4byte header + 1021 byte data) */
-			if (leftACLSize == 0 && actual_length > 1017) {
-				/* the data in next interrupt event */
-				leftACLSize =
-					actual_length + 4 - urb->actual_length;
-				BTUSB_DBG("there is left ACL event, size: %d",
-					leftACLSize);
-			} else if (leftACLSize > 0) {
-				leftACLSize -= urb->actual_length;
-
-				/* error handling. Length wrong, drop some bytes to recovery counter!! */
-				if (leftACLSize < 0) {
-					BTUSB_WARN
-						("* size wrong(%d), this acl data may be wrong!!",
-						 leftACLSize);
-					leftACLSize = 0;	/* reset count */
-				}
-
-				if (leftACLSize == 0) {
-					if (state == BTMTK_USB_STATE_WORKING || state == BTMTK_USB_STATE_FW_DUMP ||
-						state == BTMTK_USB_STATE_RESUME_FW_DUMP) {
-						wake_up(&BT_wq);
-						wake_up_interruptible(&inq);
-					} else {
-						BTUSB_DBG
-							("%s: now is in suspend/resume(%d), Don't wake-up wait queue",
-							__func__, state);
-					}
-				}
-			} else if (leftACLSize == 0 && actual_length <= 1017) {
-				if (state == BTMTK_USB_STATE_WORKING || state == BTMTK_USB_STATE_FW_DUMP ||
-					state == BTMTK_USB_STATE_RESUME_FW_DUMP) {
-					wake_up(&BT_wq);
-					wake_up_interruptible(&inq);
-				} else {
-					BTUSB_DBG
-						("%s: current is in suspend/resume (%d), Don't wake-up wait queue",
-						 __func__, state);
-				}
-			} else {
-				BTUSB_WARN
-					("ACL data count fail, leftACLSize:%d",
-					 leftACLSize);
-			}
-		}
-
-	} else {
-		BTUSB_INFO("%s: urb->status:%d", __func__, urb->status);
-	}
-
-	usb_anchor_urb(urb, &g_data->bulk_anchor);
-	usb_mark_last_busy(g_data->udev);
-
-	err = usb_submit_urb(urb, GFP_KERNEL);
-
-	if (err != 0) {
-		/* -EPERM: urb is being killed; */
-		/* -ENODEV: device got disconnected */
-		if (err != -EPERM && err != -ENODEV)
-			BTUSB_ERR
-				("%s: urb %p failed to resubmit bulk_in_urb(%d)",
-				 __func__, urb, -err);
-		usb_unanchor_urb(urb);
-	}
-}
-
-static void btmtk_usb_tx_complete_meta(struct urb *urb)
-{
-	if (g_data == NULL) {
-		BTUSB_ERR("%s: ERROR, g_data is NULL!", __func__);
-		return;
-	}
-
-	usb_free_coherent(g_data->udev, urb->transfer_buffer_length, urb->transfer_buffer, urb->transfer_dma);
-
-	g_data->meta_tx = 0;
-	kfree(urb->setup_packet);
-}
-
-static int btmtk_usb_standby(void)
-{
-	if (g_data == NULL) {
-		BTUSB_ERR("%s: ERROR, g_data is NULL!", __func__);
-		return -ENODEV;
-	}
-
-	BTUSB_INFO("%s: begin", __func__);
-
-	btmtk_usb_handle_entering_WoBLE_state();
-
-	BTUSB_INFO("%s: end", __func__);
-	BTUSB_WARN("%s: Add 500ms delay", __func__);
-	msleep(500); /* Add 500ms delay to avoid log lost. */
-	return 0;
-}
-
-void btmtk_usb_trigger_core_dump(void)
-{
-	int state = BTMTK_USB_STATE_UNKNOWN;
-
-	BTUSB_WARN("%s: Invoked by other module (WiFi).", __func__);
-
-	mutex_lock(&btmtk_usb_state_mutex);
-	state = btmtk_usb_get_state();
-	if (state == BTMTK_USB_STATE_FW_DUMP || state == BTMTK_USB_STATE_RESUME_FW_DUMP) {
-		BTUSB_WARN("%s: current in dump state, skip.", __func__);
-		mutex_unlock(&btmtk_usb_state_mutex);
-		return;
-	}
-	mutex_unlock(&btmtk_usb_state_mutex);
-
-	btmtk_usb_toggle_rst_pin();
-}
-EXPORT_SYMBOL(btmtk_usb_trigger_core_dump);
-
-/*============================================================================*/
-/* Interface Functions : BT Stack */
-/*============================================================================*/
-#define ______________________________________Interface_Function_for_BT_Stack
-static ssize_t btmtk_usb_fops_write(struct file *file, const char __user *buf,
-					size_t count, loff_t *f_pos)
-{
-	int retval = 0;
-	int state = BTMTK_USB_STATE_UNKNOWN;
-	int fstate = BTMTK_FOPS_STATE_UNKNOWN;
-
-	if (g_data == NULL) {
-		BTUSB_ERR("%s: ERROR, g_data is NULL!", __func__);
-		return -ENODEV;
-	}
-
-	FOPS_MUTEX_LOCK();
-	fstate = btmtk_fops_get_state();
-	if (fstate != BTMTK_FOPS_STATE_OPENED) {
-		BTUSB_WARN("%s: fops is not open yet(%d)!", __func__, fstate);
-		FOPS_MUTEX_UNLOCK();
-		return -ENODEV;
-	}
-	FOPS_MUTEX_UNLOCK();
-
-	mutex_lock(&btmtk_usb_state_mutex);
-	state = btmtk_usb_get_state();
-	if (state != BTMTK_USB_STATE_WORKING) {
-		BTUSB_DBG("%s: current is in suspend/resume (%d).", __func__, state);
-		mutex_unlock(&btmtk_usb_state_mutex);
-		msleep(3000);
-		return -EAGAIN;
-	}
-	mutex_unlock(&btmtk_usb_state_mutex);
-
-	/* semaphore mechanism, the waited process will sleep */
-	down(&g_data->wr_mtx);
-
-	if (count > 0) {
-		u32 copy_size = (count < BUFFER_SIZE) ? count : BUFFER_SIZE;
-
-		if (copy_from_user(&g_data->o_buf[0], &buf[0], copy_size)) {
-			retval = -EFAULT;
-			BTUSB_ERR("%s: copy data from user fail", __func__);
-			goto OUT;
-		}
-		BTUSB_DBG_RAW(buf, 16, "%s: (len=%2d)", __func__, copy_size);
-
-		/* command */
-		if (g_data->o_buf[0] == 0x01) {
-			/* parsing commands */
-			u8 fw_assert_cmd[] = { 0x01, 0x6F, 0xFC, 0x05, 0x01, 0x02, 0x01, 0x00, 0x08 };
-			u8 reset_cmd[] = { 0x01, 0x03, 0x0C, 0x00 };
-			u8 read_ver_cmd[] = { 0x01, 0x01, 0x10, 0x00 };
-
-			if (copy_size == sizeof(fw_assert_cmd) &&
-					!memcmp(g_data->o_buf, fw_assert_cmd, sizeof(fw_assert_cmd))) {
-				BTUSB_INFO("%s: Donge FW Assert Triggered by BT Stack!", __func__);
-				btmtk_usb_hci_snoop_print_to_log();
-
-			} else if (copy_size == sizeof(reset_cmd) &&
-					!memcmp(g_data->o_buf, reset_cmd, sizeof(reset_cmd))) {
-				BTUSB_INFO("%s: got command: 0x03 0C 00 (HCI_RESET)", __func__);
-
-			} else if (copy_size == sizeof(read_ver_cmd) &&
-					!memcmp(g_data->o_buf, read_ver_cmd, sizeof(read_ver_cmd))) {
-				BTUSB_INFO("%s: got command: 0x01 10 00 (READ_LOCAL_VERSION)",
-						__func__);
-			}
-
-			btmtk_usb_hci_snoop_save_cmd(copy_size, &g_data->o_buf[0]);
-			retval = btmtk_usb_meta_send_data(&g_data->o_buf[0], copy_size);
-
-		/* ACL data */
-		} else if (g_data->o_buf[0] == 0x02) {
-			retval = btmtk_usb_send_data(&g_data->o_buf[0], copy_size);
-
-		/* SCO data */
-		} else if (g_data->o_buf[0] == 0x03) {
-			retval = btmtk_usb_send_data(&g_data->o_buf[0], copy_size);
-
-		/* Unknown */
-		} else {
-			BTUSB_WARN("%s: this is unknown bt data:0x%02x", __func__,
-					g_data->o_buf[0]);
-		}
-	} else {
-		retval = -EFAULT;
-		BTUSB_ERR
-			("%s: target packet length:%zu is not allowed, retval = %d",
-			 __func__, count, retval);
-	}
-
-OUT:
-	up(&g_data->wr_mtx);
-	return retval;
-}
-
-static ssize_t btmtk_usb_fops_writefwlog(struct file *filp, const char __user *buf,
-					size_t count, loff_t *f_pos)
-{
-	int retval = 0;
-	return retval;
-}
-
-static ssize_t btmtk_usb_fops_read(struct file *file, char __user *buf, size_t count, loff_t *f_pos)
-{
-	int retval = 0;
-	int copyLen = 0;
-	int state = BTMTK_USB_STATE_UNKNOWN;
-	int fstate = BTMTK_FOPS_STATE_UNKNOWN;
-	unsigned short tailLen = 0;
-	u8 *buffer = NULL;
-
-	FOPS_MUTEX_LOCK();
-	fstate = btmtk_fops_get_state();
-	if (fstate != BTMTK_FOPS_STATE_OPENED) {
-		BTUSB_WARN("%s: fops is not open yet(%d)!", __func__, fstate);
-		FOPS_MUTEX_UNLOCK();
-		return -ENODEV;
-	}
-	FOPS_MUTEX_UNLOCK();
-
-	if (g_data == NULL) {
-		BTUSB_ERR("%s: ERROR, g_data is NULL!", __func__);
-		return -ENODEV;
-	}
-	buffer = g_data->i_buf;
-
-	down(&g_data->rd_mtx);
-
-	if (count > BUFFER_SIZE) {
-		count = BUFFER_SIZE;
-		BTUSB_WARN("read size is bigger than 1024");
-	}
-
-	mutex_lock(&btmtk_usb_state_mutex);
-	state = btmtk_usb_get_state();
-	if (state == BTMTK_USB_STATE_FW_DUMP || state == BTMTK_USB_STATE_RESUME_FW_DUMP) {
-		/* do nothing */
-
-	} else if (state != BTMTK_USB_STATE_WORKING) {
-		BTUSB_ERR("%s: current is in suspend/resume (%d).", __func__, state);
-		mutex_unlock(&btmtk_usb_state_mutex);
-		return -EAGAIN;
-	} else if (need_reset_stack == 1 && register_late_resume_func != NULL) {
-		BTUSB_WARN("%s: Reset BT stack", __func__);
-		mutex_unlock(&btmtk_usb_state_mutex);
-
-		/* notify vendor library by signal */
-		kill_fasync(&fasync, SIGIO, POLL_IN);
-
-		need_reset_stack = 0;
-		up(&g_data->rd_mtx);
-		return -ENODEV;
-	}
-	mutex_unlock(&btmtk_usb_state_mutex);
-
-	btmtk_usb_lock_unsleepable_lock(&(g_data->metabuffer->spin_lock));
-
-	/* means the buffer is empty */
-	while (g_data->metabuffer->read_p == g_data->metabuffer->write_p) {
-
-		/* unlock the buffer to let other process write data to buffer */
-		btmtk_usb_unlock_unsleepable_lock(&(g_data->metabuffer->spin_lock));
-
-		/* If nonblocking mode, return directly O_NONBLOCK is specified during open() */
-		if (file->f_flags & O_NONBLOCK) {
-			/* BTUSB_DBG("Non-blocking btmtk_usb_fops_read()"); */
-			retval = -EAGAIN;
-			goto OUT;
-		}
-		wait_event(BT_wq, g_data->metabuffer->read_p != g_data->metabuffer->write_p);
-		btmtk_usb_lock_unsleepable_lock(&(g_data->metabuffer->spin_lock));
-	}
-
-	while (g_data->metabuffer->read_p != g_data->metabuffer->write_p) {
-		if (g_data->metabuffer->write_p > g_data->metabuffer->read_p) {
-			copyLen =
-				g_data->metabuffer->write_p -
-				g_data->metabuffer->read_p;
-			if (copyLen > count)
-				copyLen = count;
-			memcpy(g_data->i_buf, g_data->metabuffer->buffer + g_data->metabuffer->read_p,
-					copyLen);
-			g_data->metabuffer->read_p += copyLen;
-			break;
-
-		} else {
-			tailLen = META_BUFFER_SIZE - g_data->metabuffer->read_p;
-			if (tailLen > count) {	/* exclude equal case to skip wrap check */
-				copyLen = count;
-				memcpy(g_data->i_buf, g_data->metabuffer->buffer + g_data->metabuffer->read_p,
-						copyLen);
-				g_data->metabuffer->read_p += copyLen;
-			} else {
-				/* part 1: copy tailLen */
-				memcpy(g_data->i_buf, g_data->metabuffer->buffer + g_data->metabuffer->read_p,
-						tailLen);
-
-				buffer += tailLen;	/* update buffer offset */
-
-				/* part 2: check if head length is enough */
-				copyLen = count - tailLen;
-
-				/* if write_p < copyLen: means we can copy all data until write_p; */
-				/* else: we can only copy data for copyLen */
-				copyLen = (g_data->metabuffer->write_p < copyLen) ? g_data->
-					metabuffer->write_p : copyLen;
-
-				/* if copylen not 0, copy data to buffer */
-				if (copyLen)
-					memcpy(buffer, g_data->metabuffer->buffer + 0, copyLen);
-				/* Update read_p final position */
-				g_data->metabuffer->read_p = copyLen;
-
-				/* update return length: head + tail */
-				copyLen += tailLen;
-			}
-			break;
-		}
-	}
-
-	btmtk_usb_unlock_unsleepable_lock(&(g_data->metabuffer->spin_lock));
-
-	BTUSB_DBG_RAW(g_data->i_buf, 16, "%s:  (len=%2d)", __func__, copyLen);
-	if (copy_to_user(buf, g_data->i_buf, copyLen)) {
-		BTUSB_ERR("copy to user fail");
-		copyLen = -EFAULT;
-		goto OUT;
-	}
-OUT:
-	up(&g_data->rd_mtx);
-	return copyLen;
-}
-
-static int btmtk_usb_fops_open(struct inode *inode, struct file *file)
-{
-	int state = BTMTK_USB_STATE_UNKNOWN;
-	int fstate = BTMTK_FOPS_STATE_UNKNOWN;
-
-	if (g_data == NULL) {
-		BTUSB_ERR("%s: ERROR, g_data is NULL!", __func__);
-		return -ENODEV;
-	}
-
-	mutex_lock(&btmtk_usb_state_mutex);
-	state = btmtk_usb_get_state();
-	if (state == BTMTK_USB_STATE_INIT || state == BTMTK_USB_STATE_DISCONNECT) {
-		mutex_unlock(&btmtk_usb_state_mutex);
-		return -EAGAIN;
-	}
-	mutex_unlock(&btmtk_usb_state_mutex);
-
-	FOPS_MUTEX_LOCK();
-	fstate = btmtk_fops_get_state();
-	if (fstate == BTMTK_FOPS_STATE_OPENED) {
-		BTUSB_WARN("%s: fops opened!", __func__);
-		FOPS_MUTEX_UNLOCK();
-		return 0;
-	}
-
-	if (fstate == BTMTK_FOPS_STATE_CLOSING) {
-		BTUSB_WARN("%s: fops close is on-going !", __func__);
-		FOPS_MUTEX_UNLOCK();
-		return -ENODEV;
-	}
-	FOPS_MUTEX_UNLOCK();
-
-	BTUSB_INFO("%s: Mediatek Bluetooth USB driver ver %s", __func__, VERSION);
-
-	BTUSB_INFO("%s: major %d minor %d (pid %d), probe counter: %d",
-		__func__, imajor(inode), iminor(inode), current->pid,
-		probe_counter);
-
-	if (current->pid == 1) {
-		BTUSB_WARN("%s: return 0", __func__);
-		return 0;
-	}
-
-	mutex_lock(&btmtk_usb_state_mutex);
-	state = btmtk_usb_get_state();
-	if (state != BTMTK_USB_STATE_WORKING) {
-		BTUSB_WARN("%s: not in working state(%d).", __func__,
-			state);
-		mutex_unlock(&btmtk_usb_state_mutex);
-		return -ENODEV;
-	}
-	mutex_unlock(&btmtk_usb_state_mutex);
-
-	/* init meta buffer */
-	spin_lock_init(&(g_data->metabuffer->spin_lock.lock));
-
-	sema_init(&g_data->wr_mtx, 1);
-	sema_init(&g_data->rd_mtx, 1);
-
-	/* init wait queue */
-	init_waitqueue_head(&(inq));
-
-	/* Init Hci Snoop */
-	btmtk_usb_hci_snoop_init();
-
-#if SUPPORT_MT7662
-	if (is_mt7662(g_data)) {
-		btmtk_usb_send_hci_reset_cmd();
-		btmtk_usb_send_hci_low_power_cmd_7662(TRUE);
-		btmtk_usb_send_hci_set_ce_cmd_7662();
-		btmtk_usb_send_hci_set_tx_power_cmd_7662();
-		btmtk_usb_send_hci_radio_on_cmd_7662();
-	}
-#endif
-#if SUPPORT_MT7668
-	if (is_mt7668(g_data)) {
-		btmtk_usb_send_wmt_power_on_cmd_7668();
-		btmtk_usb_send_hci_tci_set_sleep_cmd_7668();
-		btmtk_usb_send_hci_reset_cmd();
-	}
-#endif
-
-	btmtk_usb_lock_unsleepable_lock(&(g_data->metabuffer->spin_lock));
-	g_data->metabuffer->read_p = 0;
-	g_data->metabuffer->write_p = 0;
-	btmtk_usb_unlock_unsleepable_lock(&(g_data->metabuffer->spin_lock));
-
-	BTUSB_INFO("enable interrupt and bulk in urb");
-	btmtk_usb_submit_intr_urb();
-	btmtk_usb_submit_bulk_in_urb();
-
-	FOPS_MUTEX_LOCK();
-	btmtk_fops_set_state(BTMTK_FOPS_STATE_OPENED);
-	FOPS_MUTEX_UNLOCK();
-	BTUSB_INFO("%s: OK", __func__);
-
-	return 0;
-}
-
-static int btmtk_usb_fops_close(struct inode *inode, struct file *file)
-{
-	int state = BTMTK_USB_STATE_UNKNOWN;
-	int fstate = BTMTK_FOPS_STATE_UNKNOWN;
-
-	if (g_data == NULL) {
-		BTUSB_ERR("%s: ERROR, g_data is NULL!", __func__);
-		return -ENODEV;
-	}
-
-	FOPS_MUTEX_LOCK();
-	fstate = btmtk_fops_get_state();
-	if (fstate != BTMTK_FOPS_STATE_OPENED) {
-		BTUSB_WARN("%s: fops is not allow close(%d)", __func__, fstate);
-		FOPS_MUTEX_UNLOCK();
-		return 0;
-	}
-	btmtk_fops_set_state(BTMTK_FOPS_STATE_CLOSING);
-	FOPS_MUTEX_UNLOCK();
-	BTUSB_INFO("%s: major %d minor %d (pid %d), probe:%d", __func__,
-		imajor(inode), iminor(inode), current->pid, probe_counter);
-
-	btmtk_usb_fops_fasync(-1, file, 0);
-
-	mutex_lock(&btmtk_usb_state_mutex);
-	state = btmtk_usb_get_state();
-	if (state != BTMTK_USB_STATE_WORKING) {
-		BTUSB_WARN("%s: not in working state(%d).", __func__, state);
-		mutex_unlock(&btmtk_usb_state_mutex);
-		FOPS_MUTEX_LOCK();
-		btmtk_fops_set_state(BTMTK_FOPS_STATE_CLOSED);
-		FOPS_MUTEX_UNLOCK();
-		return 0;
-	}
-	mutex_unlock(&btmtk_usb_state_mutex);
-
-	btmtk_usb_stop_traffic();
-	btmtk_usb_send_hci_reset_cmd();
-
-#if SUPPORT_MT7662
-	if (is_mt7662(g_data))
-		btmtk_usb_send_hci_radio_off_cmd_7662();
-#endif
-
-#if SUPPORT_MT7668
-	if (is_mt7668(g_data))
-		btmtk_usb_send_wmt_power_off_cmd_7668();
-#endif
-
-	btmtk_usb_lock_unsleepable_lock(&(g_data->metabuffer->spin_lock));
-	g_data->metabuffer->read_p = 0;
-	g_data->metabuffer->write_p = 0;
-	btmtk_usb_unlock_unsleepable_lock(&(g_data->metabuffer->spin_lock));
-
-	FOPS_MUTEX_LOCK();
-	btmtk_fops_set_state(BTMTK_FOPS_STATE_CLOSED);
-	FOPS_MUTEX_UNLOCK();
-
-	BTUSB_INFO("%s: OK", __func__);
-	return 0;
-}
-
-static long btmtk_usb_fops_unlocked_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
-{
-	long retval = 0;
-
-	if (g_data == NULL) {
-		BTUSB_ERR("%s: ERROR, g_data is NULL!", __func__);
-		return -ENODEV;
-	}
-
-	switch (cmd) {
-	case IOCTL_FW_ASSERT:
-		/* BT trigger fw assert for debug */
-		BTUSB_INFO("BT Set fw assert..., reason:%lu", arg);
-		break;
-	default:
-		retval = -EFAULT;
-		BTUSB_WARN("BT_ioctl(): unknown cmd (%d)", cmd);
-		break;
-	}
-
-	return retval;
-}
-
-static int btmtk_usb_fops_fasync(int fd, struct file *file, int on)
-{
-	BTUSB_INFO("%s: fd = 0x%X, flag = 0x%X", __func__, fd, on);
-	return fasync_helper(fd, file, on, &fasync);
-}
-
-static unsigned int btmtk_usb_fops_poll(struct file *file, poll_table *wait)
-{
-	unsigned int mask = 0;
-	int state = BTMTK_USB_STATE_UNKNOWN;
-
-	if (g_data == NULL) {
-		BTUSB_ERR("%s: ERROR, g_data is NULL!", __func__);
-		return -ENODEV;
-	}
-
-	if (g_data->metabuffer->read_p == g_data->metabuffer->write_p) {
-		poll_wait(file, &inq, wait);
-
-		/* empty let select sleep */
-		if ((g_data->metabuffer->read_p != g_data->metabuffer->write_p)
-			|| need_reset_stack == 1) {
-			mask |= POLLIN | POLLRDNORM;		/* readable */
-		}
-	} else {
-		mask |= POLLIN | POLLRDNORM;			/* readable */
-	}
-
-	/* do we need condition? */
-	mask |= POLLOUT | POLLWRNORM;				/* writable */
-
-	mutex_lock(&btmtk_usb_state_mutex);
-	state = btmtk_usb_get_state();
-	if (state == BTMTK_USB_STATE_FW_DUMP || state == BTMTK_USB_STATE_RESUME_FW_DUMP)
-		mask |= POLLIN | POLLRDNORM;			/* readable */
-	else if (state != BTMTK_USB_STATE_WORKING)	/* BTMTK_USB_STATE_WORKING: do nothing */
-		mask = 0;
-	mutex_unlock(&btmtk_usb_state_mutex);
-
-	return mask;
-}
-/*fops fwlog*/
-static ssize_t btmtk_usb_fops_readfwlog(struct file *filp, char __user *buf, size_t count, loff_t *f_pos)
-{
-	int copyLen = 0;
-	ulong flags = 0;
-	struct sk_buff *skb = NULL;
-
-	if (g_data == NULL)
-		return -ENODEV;
-
-	if (g_data->fwlog_queue_count <= 0)
-		return 0;
-
-
-	spin_lock_irqsave(&g_data->fwlog_lock, flags);
-	skb = skb_dequeue(&g_data->fwlog_queue);
-	g_data->fwlog_queue_count--;
-	spin_unlock_irqrestore(&g_data->fwlog_lock, flags);
-	memcpy(buf, skb->data, skb->len);
-	copyLen = skb->len;
-
-	return copyLen;
-}
-
-static int btmtk_usb_fops_openfwlog(struct inode *inode, struct file *file)
-{
-	if (g_data == NULL) {
-		BTUSB_ERR("%s: ERROR, g_data is NULL!", __func__);
-		return -ENODEV;
-	}
-
-	BTUSB_INFO("%s: OK", __func__);
-	return 0;
-}
-
-static int btmtk_usb_fops_closefwlog(struct inode *inode, struct file *file)
-{
-	if (g_data == NULL) {
-		BTUSB_ERR("%s: ERROR, g_data is NULL!", __func__);
-		return -ENODEV;
-	}
-
-
-	BTUSB_INFO("%s: OK", __func__);
-	return 0;
-}
-
-static long btmtk_usb_fops_unlocked_ioctlfwlog(struct file *filp, unsigned int cmd, unsigned long arg)
-{
-	int retval = 0;
-
-	BTUSB_ERR("%s: ->", __func__);
-	if (g_data == NULL) {
-		BTUSB_ERR("%s: ERROR, g_data is NULL!", __func__);
-		return -ENODEV;
-	}
-
-	return retval;
-}
-
-static unsigned int btmtk_usb_fops_pollfwlog(struct file *file, poll_table *wait)
-{
-	unsigned int mask = 0;
-	return mask;
-}
-
-/*============================================================================*/
-/* Interface Functions : Kernel */
-/*============================================================================*/
-#define ________________________________________Interface_Function_for_Kernel
-static int btmtk_usb_probe(struct usb_interface *intf, const struct usb_device_id *id)
-{
-	struct usb_endpoint_descriptor *ep_desc;
-	int i;
-	int state = BTMTK_USB_STATE_UNKNOWN;
-	int err = -1;
-
-	probe_counter++;
-
-	BTUSB_INFO("%s: begin", __func__);
-	BTUSB_INFO("========================================================");
-	BTUSB_INFO("btmtk_usb Mediatek Bluetooth USB driver ver %s", VERSION);
-	BTUSB_INFO("========================================================");
-	BTUSB_INFO("probe_counter = %d", probe_counter);
-
-	mutex_lock(&btmtk_usb_state_mutex);
-	state = btmtk_usb_get_state();
-	if (state == BTMTK_USB_STATE_SUSPEND_DISCONNECT)
-		btmtk_usb_set_state(BTMTK_USB_STATE_SUSPEND_PROBE);
-	else if (state == BTMTK_USB_STATE_RESUME_DISCONNECT)
-		btmtk_usb_set_state(BTMTK_USB_STATE_RESUME_PROBE);
-	else
-		btmtk_usb_set_state(BTMTK_USB_STATE_PROBE);
-	mutex_unlock(&btmtk_usb_state_mutex);
-
-	/* interface numbers are hardcoded in the spec */
-	if (intf->cur_altsetting->desc.bInterfaceNumber != 0) {
-		BTUSB_ERR("[ERR] interface number != 0 (%d)",
-			intf->cur_altsetting->desc.bInterfaceNumber);
-
-		mutex_lock(&btmtk_usb_state_mutex);
-		btmtk_usb_set_state(BTMTK_USB_STATE_DISCONNECT);
-		mutex_unlock(&btmtk_usb_state_mutex);
-
-		BTUSB_ERR("btmtk_usb_probe end Error 1");
-		return -ENODEV;
-	}
-
-	if (!g_data) {
-		mutex_lock(&btmtk_usb_state_mutex);
-		btmtk_usb_set_state(BTMTK_USB_STATE_DISCONNECT);
-		mutex_unlock(&btmtk_usb_state_mutex);
-
-		BTUSB_ERR("btmtk_usb_probe end Error 2");
-		return -ENOMEM;
-	}
-
-	btmtk_usb_init_memory();
-
-	/* set the endpoint type of the interface to btmtk_usb_data */
-	for (i = 0; i < intf->cur_altsetting->desc.bNumEndpoints; i++) {
-		ep_desc = &intf->cur_altsetting->endpoint[i].desc;
-
-		if (usb_endpoint_is_int_in(ep_desc)) {
-			g_data->intr_ep = ep_desc;
-			continue;
-		}
-
-		if (usb_endpoint_is_bulk_out(ep_desc)) {
-			g_data->bulk_tx_ep = ep_desc;
-			continue;
-		}
-
-		if (usb_endpoint_is_bulk_in(ep_desc)) {
-			g_data->bulk_rx_ep = ep_desc;
-			continue;
-		}
-	}
-
-	if (!g_data->intr_ep || !g_data->bulk_tx_ep || !g_data->bulk_rx_ep) {
-		mutex_lock(&btmtk_usb_state_mutex);
-		btmtk_usb_set_state(BTMTK_USB_STATE_DISCONNECT);
-		mutex_unlock(&btmtk_usb_state_mutex);
-
-		BTUSB_ERR("btmtk_usb_probe end Error 3");
-		return -ENODEV;
-	}
-
-	g_data->udev = interface_to_usbdev(intf);
-	g_data->intf = intf;
-
-	spin_lock_init(&g_data->txlock);
-	INIT_WORK(&g_data->waker, btmtk_usb_waker);
-
-	g_data->meta_tx = 0;
-
-	/* init all usb anchor */
-	init_usb_anchor(&g_data->tx_anchor);
-	init_usb_anchor(&g_data->intr_anchor);
-	init_usb_anchor(&g_data->bulk_anchor);
-
-	g_data->metabuffer->read_p = 0;
-	g_data->metabuffer->write_p = 0;
-	memset(g_data->metabuffer->buffer, 0, META_BUFFER_SIZE);
-
-	btmtk_usb_cap_init();
-
-	err = btmtk_usb_load_rom_patch();
-	if (err < 0) {
-		mutex_lock(&btmtk_usb_state_mutex);
-		btmtk_usb_set_state(BTMTK_USB_STATE_DISCONNECT);
-		mutex_unlock(&btmtk_usb_state_mutex);
-
-		BTUSB_ERR("btmtk_usb_probe end Error 4");
-		return err;
-	}
-
-	/* Interface numbers are hardcoded in the specification */
-	g_data->isoc = usb_ifnum_to_if(g_data->udev, 1);
-
-	/* bind isoc interface to usb driver */
-	if (g_data->isoc) {
-		err =
-			usb_driver_claim_interface(&btmtk_usb_driver, g_data->isoc, g_data);
-		if (err < 0) {
-			mutex_lock(&btmtk_usb_state_mutex);
-			btmtk_usb_set_state(BTMTK_USB_STATE_DISCONNECT);
-			mutex_unlock(&btmtk_usb_state_mutex);
-
-			BTUSB_ERR("btmtk_usb_probe end Error 7");
-			return err;
-		}
-	}
-
-	usb_set_intfdata(intf, g_data);
-
-	mutex_lock(&btmtk_usb_state_mutex);
-	state = btmtk_usb_get_state();
-	if (state == BTMTK_USB_STATE_SUSPEND_PROBE)
-		btmtk_usb_set_state(BTMTK_USB_STATE_SUSPEND);
-	else if (state == BTMTK_USB_STATE_RESUME_PROBE)
-		btmtk_usb_set_state(BTMTK_USB_STATE_RESUME);
-	else
-		btmtk_usb_set_state(BTMTK_USB_STATE_WORKING);
-	mutex_unlock(&btmtk_usb_state_mutex);
-
-	if (need_reset_stack) {
-		if (register_late_resume_func == NULL) {
-			BTUSB_INFO("%s: Notify BT vendor-lib to restart stack", __func__);
-			kill_fasync(&fasync, SIGIO, POLL_IN);
-			need_reset_stack = 0;
-		} else {
-			wake_up_interruptible(&inq);
-		}
-	}
-
-	g_data->bt_fifo = btmtk_fifo_init();
-	btmtk_fifo_start(g_data->bt_fifo);
-
-	spin_lock_init(&g_data->fwlog_lock);
-	skb_queue_head_init(&g_data->fwlog_queue);
-
-	BTUSB_INFO("%s: end", __func__);
-	return 0;
-}
-
-static void btmtk_usb_disconnect(struct usb_interface *intf)
-{
-	int state = BTMTK_USB_STATE_UNKNOWN;
-
-	if (!usb_get_intfdata(intf))
-		return;
-
-	BTUSB_INFO("%s: begin", __func__);
-
-	mutex_lock(&btmtk_usb_state_mutex);
-	state = btmtk_usb_get_state();
-	if (state == BTMTK_USB_STATE_SUSPEND || state == BTMTK_USB_STATE_SUSPEND_DISCONNECT) {
-		if (register_late_resume_func) {
-			BTUSB_WARN
-				("%s: disconnect happens in suspend state --> should stay in suspend state later !",
-				 __func__);
-			btmtk_usb_set_state(BTMTK_USB_STATE_SUSPEND_DISCONNECT);
-		} else {
-			BTUSB_WARN
-				("%s: disconnect hapens in suspend state --> go to disconnect state !",
-				 __func__);
-			btmtk_usb_set_state(BTMTK_USB_STATE_DISCONNECT);
-		}
-	} else if (state == BTMTK_USB_STATE_RESUME || state == BTMTK_USB_STATE_RESUME_FW_DUMP ||
-			state == BTMTK_USB_STATE_RESUME_DISCONNECT) {
-		BTUSB_WARN
-			("%s: disconnect hapens when driver is in resume state, should stay in resume state later !",
-			 __func__);
-		btmtk_usb_set_state(BTMTK_USB_STATE_RESUME_DISCONNECT);
-	} else
-		btmtk_usb_set_state(BTMTK_USB_STATE_DISCONNECT);
-	mutex_unlock(&btmtk_usb_state_mutex);
-
-	if (!g_data)
-		return;
-
-	need_reset_stack = 1;
-
-	usb_set_intfdata(g_data->intf, NULL);
-
-	if (g_data->isoc)
-		usb_set_intfdata(g_data->isoc, NULL);
-
-	if (intf == g_data->isoc)
-		usb_driver_release_interface(&btmtk_usb_driver, g_data->intf);
-	else if (g_data->isoc)
-		usb_driver_release_interface(&btmtk_usb_driver, g_data->isoc);
-
-	g_data->metabuffer->read_p = 0;
-	g_data->metabuffer->write_p = 0;
-
-	cancel_work_sync(&g_data->waker);
-
-	btmtk_dbgfs_remove_drvdata();
-
-	btmtk_fifo_init();
-	g_data->bt_fifo = NULL;
-
-	BTUSB_INFO("%s: end", __func__);
-}
-
-static int btmtk_usb_suspend(struct usb_interface *intf, pm_message_t message)
-{
-	BTUSB_INFO("%s: begin", __func__);
-
-	mutex_lock(&btmtk_usb_state_mutex);
-	btmtk_usb_set_state(BTMTK_USB_STATE_SUSPEND);
-	mutex_unlock(&btmtk_usb_state_mutex);
-
-	if ((g_data->suspend_count++)) {
-		BTUSB_WARN("%s: Has suspended. suspend_count: %d", __func__, g_data->suspend_count);
-		BTUSB_INFO("%s: end", __func__);
-		return 0;
-	}
-
-	btmtk_usb_handle_entering_WoBLE_state();
-
-	btmtk_usb_stop_traffic();
-	usb_kill_anchored_urbs(&g_data->tx_anchor);
-#if SUPPORT_LEGACY_WOBLE
-	need_reset_stack = 1;
-#endif
-	BTUSB_INFO("%s: end", __func__);
-	return 0;
-}
-
-static int btmtk_usb_resume(struct usb_interface *intf)
-{
-	g_data->suspend_count--;
-	if (g_data->suspend_count) {
-		BTUSB_WARN("%s: data->suspend_count %d, return 0", __func__, g_data->suspend_count);
-		return 0;
-	}
-
-	BTUSB_INFO("%s: begin", __func__);
-
-	mutex_lock(&btmtk_usb_state_mutex);
-	btmtk_usb_set_state(BTMTK_USB_STATE_RESUME);
-	mutex_unlock(&btmtk_usb_state_mutex);
-
-#if SUPPORT_LEGACY_WOBLE
-	if (register_late_resume_func == NULL && need_reset_stack) {
-		BTUSB_INFO("%s: Notify BT vendor-lib to restart stack", __func__);
-		kill_fasync(&fasync, SIGIO, POLL_IN);
-		need_reset_stack = 0;
-	}
-#endif /* SUPPORT_LEGACY_WOBLE */
-
-	if (register_late_resume_func == NULL)
-		btmtk_usb_handle_resume();
-	BTUSB_INFO("%s: end", __func__);
-	return 0;
-}
-
-static int btmtk_usb_reset_resume(struct usb_interface *intf)
-{
-	BTUSB_INFO("%s: Call resume directly", __func__);
-	return btmtk_usb_resume(intf);
-}
-
-static struct usb_driver btmtk_usb_driver = {
-	.name = "btmtk_usb",
-	.probe = btmtk_usb_probe,
-	.disconnect = btmtk_usb_disconnect,
-	.suspend = btmtk_usb_suspend,
-	.resume = btmtk_usb_resume,
-	.reset_resume = btmtk_usb_reset_resume,
-	.id_table = btmtk_usb_table,
-	.supports_autosuspend = 1,
-	.disable_hub_initiated_lpm = 1,
-};
-
-static int __init btmtk_usb_init(void)
-{
-	BTUSB_INFO("%s: btmtk usb driver ver %s", __func__, VERSION);
-
-	btmtk_dbgfs_init();
-	BTUSB_DBG("debugfs is enable");
-
-	btmtk_usb_BT_init();
-
-	return usb_register(&btmtk_usb_driver);
-}
-
-static void __exit btmtk_usb_exit(void)
-{
-	BTUSB_INFO("%s: btmtk usb driver ver %s", __func__, VERSION);
-
-	btmtk_dbgfs_exit();
-
-	usb_deregister(&btmtk_usb_driver);
-	btmtk_usb_BT_exit();
-}
-
-module_init(btmtk_usb_init);
-module_exit(btmtk_usb_exit);
-
-/**
- * Module information
- */
-MODULE_DESCRIPTION("Mediatek Bluetooth USB driver ver " VERSION);
-MODULE_VERSION(VERSION);
-MODULE_LICENSE("GPL");
diff --git a/btmtk_usb_main.h b/btmtk_usb_main.h
deleted file mode 100644
index 6d2682b..0000000
--- a/btmtk_usb_main.h
+++ /dev/null
@@ -1,155 +0,0 @@
-/*
-*  Copyright (c) 2016 MediaTek Inc.
-*
-*  This program is free software; you can redistribute it and/or modify
-*  it under the terms of the GNU General Public License version 2 as
-*  published by the Free Software Foundation.
-*
-*  This program is distributed in the hope that it will be useful,
-*  but WITHOUT ANY WARRANTY; without even the implied warranty of
-*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-*  GNU General Public License for more details.
-*/
-#ifndef __BTMTK_USB_MAIN_H__
-#define __BTMTK_USB_MAIN_H__
-
-#include <net/bluetooth/bluetooth.h>
-#include "btmtk_define.h"
-
-/* Please keep sync with btmtk_usb_set_state function */
-enum {
-	BTMTK_USB_STATE_UNKNOWN,
-	BTMTK_USB_STATE_INIT,
-	BTMTK_USB_STATE_DISCONNECT,
-	BTMTK_USB_STATE_PROBE,
-	BTMTK_USB_STATE_WORKING,
-	BTMTK_USB_STATE_EARLY_SUSPEND,
-	BTMTK_USB_STATE_SUSPEND,
-	BTMTK_USB_STATE_RESUME,
-	BTMTK_USB_STATE_LATE_RESUME,
-	BTMTK_USB_STATE_FW_DUMP,
-	BTMTK_USB_STATE_SUSPEND_DISCONNECT,
-	BTMTK_USB_STATE_SUSPEND_PROBE,
-	BTMTK_USB_STATE_RESUME_DISCONNECT,
-	BTMTK_USB_STATE_RESUME_PROBE,
-	BTMTK_USB_STATE_RESUME_FW_DUMP,
-};
-
-/* Please keep sync with btmtk_fops_set_state function */
-enum {
-	BTMTK_FOPS_STATE_UNKNOWN,	/* deinit in stpbt destroy */
-	BTMTK_FOPS_STATE_INIT,		/* init in stpbt created */
-	BTMTK_FOPS_STATE_OPENED,	/* open in fops_open */
-	BTMTK_FOPS_STATE_CLOSING,	/* during closing */
-	BTMTK_FOPS_STATE_CLOSED,	/* closed */
-};
-
-struct OSAL_UNSLEEPABLE_LOCK {
-	spinlock_t	lock;
-	unsigned long	flag;
-};
-
-struct ring_buffer_struct {
-	struct OSAL_UNSLEEPABLE_LOCK	spin_lock;
-	unsigned char			buffer[META_BUFFER_SIZE];	/* MTKSTP_BUFFER_SIZE:1024 */
-	unsigned int			read_p;				/* indicate the current read index */
-	unsigned int			write_p;			/* indicate the current write index */
-};
-
-struct btmtk_usb_data {
-	struct usb_device	*udev;	/* store the usb device informaiton */
-	struct usb_interface	*intf;	/* current interface */
-	struct usb_interface	*isoc;	/* isochronous interface */
-	struct work_struct	waker;
-	struct semaphore	wr_mtx;
-	struct semaphore	rd_mtx;
-	struct usb_anchor	tx_anchor;
-	struct usb_anchor	intr_anchor;
-	struct usb_anchor	bulk_anchor;
-	int			meta_tx;
-	spinlock_t		txlock;
-
-	/* USB endpoint */
-	struct usb_endpoint_descriptor	*intr_ep;
-	struct usb_endpoint_descriptor	*bulk_tx_ep;
-	struct usb_endpoint_descriptor	*bulk_rx_ep;
-
-	int				 suspend_count;
-
-	/* request for different io operation */
-	unsigned char	w_request;
-	unsigned char	r_request;
-
-	/* io buffer for usb control transfer */
-	unsigned char	*io_buf;
-
-	unsigned char		*rom_patch;
-	unsigned char		*rom_patch_bin_file_name;
-	unsigned char		*rom_patch_image;
-	unsigned int		rom_patch_image_len;
-	unsigned int		chip_id;
-	unsigned int		rom_patch_offset;
-	unsigned int		rom_patch_len;
-
-	unsigned char		*i_buf;
-	unsigned char		*o_buf;
-	struct ring_buffer_struct	*metabuffer;
-
-	unsigned char		interrupt_urb_submitted;
-	unsigned char		bulk_urb_submitted;
-
-	void			*bt_fifo;
-#if SUPPORT_MT7668
-	unsigned char		is_mt7668_dongle_state;
-#endif
-	struct sk_buff_head	fwlog_queue;
-	spinlock_t		fwlog_lock;
-	u32			fwlog_queue_count;
-
-};
-
-/**
- * Inline functions
- */
-#if SUPPORT_MT7662
-static inline int is_mt7662(struct btmtk_usb_data *data)
-{
-	/** Return 1, if MT76x2 or MT76x2T */
-	return ((data->chip_id & 0xffff0000) == 0x76620000)
-		|| ((data->chip_id & 0xffff0000) == 0x76320000);
-}
-
-static inline int is_mt7662T(struct btmtk_usb_data *data)
-{
-	/** Return 1, if MT76x2T */
-	return ((data->chip_id & 0xffffffff) == 0x76620100)
-		|| ((data->chip_id & 0xffffffff) == 0x76320100);
-}
-#endif
-
-#if SUPPORT_MT7668
-static inline int is_mt7668(struct btmtk_usb_data *data)
-{
-	return ((data->chip_id & 0xffff) == 0x7668);
-}
-
-enum {
-	BTMTK_USB_7668_DONGLE_STATE_UNKNOWN,
-	BTMTK_USB_7668_DONGLE_STATE_POWERING_ON,
-	BTMTK_USB_7668_DONGLE_STATE_POWER_ON,
-	BTMTK_USB_7668_DONGLE_STATE_WOBLE,
-	BTMTK_USB_7668_DONGLE_STATE_POWERING_OFF,
-	BTMTK_USB_7668_DONGLE_STATE_POWER_OFF,
-	BTMTK_USB_7668_DONGLE_STATE_ERROR
-};
-#endif
-
-/**
- * Extern functions
- */
-int btmtk_usb_send_data(const unsigned char *buffer, const unsigned int length);
-int btmtk_usb_meta_send_data(const unsigned char *buffer,
-		const unsigned int length);
-void btmtk_usb_toggle_rst_pin(void);
-
-#endif /* __BTMTK_USB_MAIN_H__ */
diff --git a/util/checkpatch.pl b/util/checkpatch.pl
new file mode 100644
index 0000000..a8368d1
--- /dev/null
+++ b/util/checkpatch.pl
@@ -0,0 +1,6285 @@
+#!/usr/bin/perl -w
+# (c) 2001, Dave Jones. (the file handling bit)
+# (c) 2005, Joel Schopp <jschopp@austin.ibm.com> (the ugly bit)
+# (c) 2007,2008, Andy Whitcroft <apw@uk.ibm.com> (new conditions, test suite)
+# (c) 2008-2010 Andy Whitcroft <apw@canonical.com>
+# Licensed under the terms of the GNU GPL License version 2
+
+use strict;
+use POSIX;
+use File::Basename;
+use Cwd 'abs_path';
+use Term::ANSIColor qw(:constants);
+
+my $P = $0;
+my $D = dirname(abs_path($P));
+
+my $V = '0.32';
+
+use Getopt::Long qw(:config no_auto_abbrev);
+
+my $quiet = 0;
+my $tree = 1;
+my $chk_signoff = 1;
+my $chk_patch = 1;
+my $tst_only;
+my $emacs = 0;
+my $terse = 0;
+my $showfile = 0;
+my $file = 0;
+my $git = 0;
+my %git_commits = ();
+my $check = 0;
+my $check_orig = 0;
+my $summary = 1;
+my $mailback = 0;
+my $summary_file = 0;
+my $show_types = 0;
+my $list_types = 0;
+my $fix = 0;
+my $fix_inplace = 0;
+my $root;
+my %debug;
+my %camelcase = ();
+my %use_type = ();
+my @use = ();
+my %ignore_type = ();
+my @ignore = ();
+my $help = 0;
+my $configuration_file = ".checkpatch.conf";
+my $max_line_length = 80;
+my $ignore_perl_version = 0;
+my $minimum_perl_version = 5.10.0;
+my $min_conf_desc_length = 4;
+my $spelling_file = "$D/spelling.txt";
+my $codespell = 0;
+my $codespellfile = "/usr/share/codespell/dictionary.txt";
+my $conststructsfile = "$D/const_structs.checkpatch";
+my $color = 1;
+my $allow_c99_comments = 1;
+
+sub help {
+	my ($exitcode) = @_;
+
+	print << "EOM";
+Usage: $P [OPTION]... [FILE]...
+Version: $V
+
+Options:
+  -q, --quiet                quiet
+  --no-tree                  run without a kernel tree
+  --no-signoff               do not check for 'Signed-off-by' line
+  --patch                    treat FILE as patchfile (default)
+  --emacs                    emacs compile window format
+  --terse                    one line per report
+  --showfile                 emit diffed file position, not input file position
+  -g, --git                  treat FILE as a single commit or git revision range
+                             single git commit with:
+                               <rev>
+                               <rev>^
+                               <rev>~n
+                             multiple git commits with:
+                               <rev1>..<rev2>
+                               <rev1>...<rev2>
+                               <rev>-<count>
+                             git merges are ignored
+  -f, --file                 treat FILE as regular source file
+  --subjective, --strict     enable more subjective tests
+  --list-types               list the possible message types
+  --types TYPE(,TYPE2...)    show only these comma separated message types
+  --ignore TYPE(,TYPE2...)   ignore various comma separated message types
+  --show-types               show the specific message type in the output
+  --max-line-length=n        set the maximum line length, if exceeded, warn
+  --min-conf-desc-length=n   set the min description length, if shorter, warn
+  --root=PATH                PATH to the kernel tree root
+  --no-summary               suppress the per-file summary
+  --mailback                 only produce a report in case of warnings/errors
+  --summary-file             include the filename in summary
+  --debug KEY=[0|1]          turn on/off debugging of KEY, where KEY is one of
+                             'values', 'possible', 'type', and 'attr' (default
+                             is all off)
+  --test-only=WORD           report only warnings/errors containing WORD
+                             literally
+  --fix                      EXPERIMENTAL - may create horrible results
+                             If correctable single-line errors exist, create
+                             "<inputfile>.EXPERIMENTAL-checkpatch-fixes"
+                             with potential errors corrected to the preferred
+                             checkpatch style
+  --fix-inplace              EXPERIMENTAL - may create horrible results
+                             Is the same as --fix, but overwrites the input
+                             file.  It's your fault if there's no backup or git
+  --ignore-perl-version      override checking of perl version.  expect
+                             runtime errors.
+  --codespell                Use the codespell dictionary for spelling/typos
+                             (default:/usr/share/codespell/dictionary.txt)
+  --codespellfile            Use this codespell dictionary
+  --color                    Use colors when output is STDOUT (default: on)
+  -h, --help, --version      display this help and exit
+
+When FILE is - read standard input.
+EOM
+
+	exit($exitcode);
+}
+
+sub uniq {
+	my %seen;
+	return grep { !$seen{$_}++ } @_;
+}
+
+sub list_types {
+	my ($exitcode) = @_;
+
+	my $count = 0;
+
+	local $/ = undef;
+
+	open(my $script, '<', abs_path($P)) or
+	    die "$P: Can't read '$P' $!\n";
+
+	my $text = <$script>;
+	close($script);
+
+	my @types = ();
+	for ($text =~ /\b(?:(?:CHK|WARN|ERROR)\s*\(\s*"([^"]+)")/g) {
+		push (@types, $_);
+	}
+	@types = sort(uniq(@types));
+	print("#\tMessage type\n\n");
+	foreach my $type (@types) {
+		print(++$count . "\t" . $type . "\n");
+	}
+
+	exit($exitcode);
+}
+
+my $conf = which_conf($configuration_file);
+if (-f $conf) {
+	my @conf_args;
+	open(my $conffile, '<', "$conf")
+	    or warn "$P: Can't find a readable $configuration_file file $!\n";
+
+	while (<$conffile>) {
+		my $line = $_;
+
+		$line =~ s/\s*\n?$//g;
+		$line =~ s/^\s*//g;
+		$line =~ s/\s+/ /g;
+
+		next if ($line =~ m/^\s*#/);
+		next if ($line =~ m/^\s*$/);
+
+		my @words = split(" ", $line);
+		foreach my $word (@words) {
+			last if ($word =~ m/^#/);
+			push (@conf_args, $word);
+		}
+	}
+	close($conffile);
+	unshift(@ARGV, @conf_args) if @conf_args;
+}
+
+GetOptions(
+	'q|quiet+'	=> \$quiet,
+	'tree!'		=> \$tree,
+	'signoff!'	=> \$chk_signoff,
+	'patch!'	=> \$chk_patch,
+	'emacs!'	=> \$emacs,
+	'terse!'	=> \$terse,
+	'showfile!'	=> \$showfile,
+	'f|file!'	=> \$file,
+	'g|git!'	=> \$git,
+	'subjective!'	=> \$check,
+	'strict!'	=> \$check,
+	'ignore=s'	=> \@ignore,
+	'types=s'	=> \@use,
+	'show-types!'	=> \$show_types,
+	'list-types!'	=> \$list_types,
+	'max-line-length=i' => \$max_line_length,
+	'min-conf-desc-length=i' => \$min_conf_desc_length,
+	'root=s'	=> \$root,
+	'summary!'	=> \$summary,
+	'mailback!'	=> \$mailback,
+	'summary-file!'	=> \$summary_file,
+	'fix!'		=> \$fix,
+	'fix-inplace!'	=> \$fix_inplace,
+	'ignore-perl-version!' => \$ignore_perl_version,
+	'debug=s'	=> \%debug,
+	'test-only=s'	=> \$tst_only,
+	'codespell!'	=> \$codespell,
+	'codespellfile=s'	=> \$codespellfile,
+	'color!'	=> \$color,
+	'h|help'	=> \$help,
+	'version'	=> \$help
+) or help(1);
+
+help(0) if ($help);
+
+list_types(0) if ($list_types);
+
+$fix = 1 if ($fix_inplace);
+$check_orig = $check;
+
+my $exit = 0;
+
+if ($^V && $^V lt $minimum_perl_version) {
+	printf "$P: requires at least perl version %vd\n", $minimum_perl_version;
+	if (!$ignore_perl_version) {
+		exit(1);
+	}
+}
+
+#if no filenames are given, push '-' to read patch from stdin
+if ($#ARGV < 0) {
+	push(@ARGV, '-');
+}
+
+sub hash_save_array_words {
+	my ($hashRef, $arrayRef) = @_;
+
+	my @array = split(/,/, join(',', @$arrayRef));
+	foreach my $word (@array) {
+		$word =~ s/\s*\n?$//g;
+		$word =~ s/^\s*//g;
+		$word =~ s/\s+/ /g;
+		$word =~ tr/[a-z]/[A-Z]/;
+
+		next if ($word =~ m/^\s*#/);
+		next if ($word =~ m/^\s*$/);
+
+		$hashRef->{$word}++;
+	}
+}
+
+sub hash_show_words {
+	my ($hashRef, $prefix) = @_;
+
+	if (keys %$hashRef) {
+		print "\nNOTE: $prefix message types:";
+		foreach my $word (sort keys %$hashRef) {
+			print " $word";
+		}
+		print "\n";
+	}
+}
+
+hash_save_array_words(\%ignore_type, \@ignore);
+hash_save_array_words(\%use_type, \@use);
+
+my $dbg_values = 0;
+my $dbg_possible = 0;
+my $dbg_type = 0;
+my $dbg_attr = 0;
+for my $key (keys %debug) {
+	## no critic
+	eval "\${dbg_$key} = '$debug{$key}';";
+	die "$@" if ($@);
+}
+
+my $rpt_cleaners = 0;
+
+if ($terse) {
+	$emacs = 1;
+	$quiet++;
+}
+
+if ($tree) {
+	if (defined $root) {
+		if (!top_of_kernel_tree($root)) {
+			die "$P: $root: --root does not point at a valid tree\n";
+		}
+	} else {
+		if (top_of_kernel_tree('.')) {
+			$root = '.';
+		} elsif ($0 =~ m@(.*)/scripts/[^/]*$@ &&
+						top_of_kernel_tree($1)) {
+			$root = $1;
+		}
+	}
+
+	if (!defined $root) {
+		print "Must be run from the top-level dir. of a kernel tree\n";
+		exit(2);
+	}
+}
+
+my $emitted_corrupt = 0;
+
+our $Ident	= qr{
+			[A-Za-z_][A-Za-z\d_]*
+			(?:\s*\#\#\s*[A-Za-z_][A-Za-z\d_]*)*
+		}x;
+our $Storage	= qr{extern|static|asmlinkage};
+our $Sparse	= qr{
+			__user|
+			__kernel|
+			__force|
+			__iomem|
+			__must_check|
+			__init_refok|
+			__kprobes|
+			__ref|
+			__rcu|
+			__private
+		}x;
+our $InitAttributePrefix = qr{__(?:mem|cpu|dev|net_|)};
+our $InitAttributeData = qr{$InitAttributePrefix(?:initdata\b)};
+our $InitAttributeConst = qr{$InitAttributePrefix(?:initconst\b)};
+our $InitAttributeInit = qr{$InitAttributePrefix(?:init\b)};
+our $InitAttribute = qr{$InitAttributeData|$InitAttributeConst|$InitAttributeInit};
+
+# Notes to $Attribute:
+# We need \b after 'init' otherwise 'initconst' will cause a false positive in a check
+our $Attribute	= qr{
+			const|
+			__percpu|
+			__nocast|
+			__safe|
+			__bitwise__|
+			__packed__|
+			__packed2__|
+			__naked|
+			__maybe_unused|
+			__always_unused|
+			__noreturn|
+			__used|
+			__cold|
+			__pure|
+			__noclone|
+			__deprecated|
+			__read_mostly|
+			__kprobes|
+			$InitAttribute|
+			____cacheline_aligned|
+			____cacheline_aligned_in_smp|
+			____cacheline_internodealigned_in_smp|
+			__weak
+		  }x;
+our $Modifier;
+our $Inline	= qr{inline|__always_inline|noinline|__inline|__inline__};
+our $Member	= qr{->$Ident|\.$Ident|\[[^]]*\]};
+our $Lval	= qr{$Ident(?:$Member)*};
+
+our $Int_type	= qr{(?i)llu|ull|ll|lu|ul|l|u};
+our $Binary	= qr{(?i)0b[01]+$Int_type?};
+our $Hex	= qr{(?i)0x[0-9a-f]+$Int_type?};
+our $Int	= qr{[0-9]+$Int_type?};
+our $Octal	= qr{0[0-7]+$Int_type?};
+our $String	= qr{"[X\t]*"};
+our $Float_hex	= qr{(?i)0x[0-9a-f]+p-?[0-9]+[fl]?};
+our $Float_dec	= qr{(?i)(?:[0-9]+\.[0-9]*|[0-9]*\.[0-9]+)(?:e-?[0-9]+)?[fl]?};
+our $Float_int	= qr{(?i)[0-9]+e-?[0-9]+[fl]?};
+our $Float	= qr{$Float_hex|$Float_dec|$Float_int};
+our $Constant	= qr{$Float|$Binary|$Octal|$Hex|$Int};
+our $Assignment	= qr{\*\=|/=|%=|\+=|-=|<<=|>>=|&=|\^=|\|=|=};
+our $Compare    = qr{<=|>=|==|!=|<|(?<!-)>};
+our $Arithmetic = qr{\+|-|\*|\/|%};
+our $Operators	= qr{
+			<=|>=|==|!=|
+			=>|->|<<|>>|<|>|!|~|
+			&&|\|\||,|\^|\+\+|--|&|\||$Arithmetic
+		  }x;
+
+our $c90_Keywords = qr{do|for|while|if|else|return|goto|continue|switch|default|case|break}x;
+
+our $BasicType;
+our $NonptrType;
+our $NonptrTypeMisordered;
+our $NonptrTypeWithAttr;
+our $Type;
+our $TypeMisordered;
+our $Declare;
+our $DeclareMisordered;
+
+our $NON_ASCII_UTF8	= qr{
+	[\xC2-\xDF][\x80-\xBF]               # non-overlong 2-byte
+	|  \xE0[\xA0-\xBF][\x80-\xBF]        # excluding overlongs
+	| [\xE1-\xEC\xEE\xEF][\x80-\xBF]{2}  # straight 3-byte
+	|  \xED[\x80-\x9F][\x80-\xBF]        # excluding surrogates
+	|  \xF0[\x90-\xBF][\x80-\xBF]{2}     # planes 1-3
+	| [\xF1-\xF3][\x80-\xBF]{3}          # planes 4-15
+	|  \xF4[\x80-\x8F][\x80-\xBF]{2}     # plane 16
+}x;
+
+our $UTF8	= qr{
+	[\x09\x0A\x0D\x20-\x7E]              # ASCII
+	| $NON_ASCII_UTF8
+}x;
+
+our $typeC99Typedefs = qr{(?:__)?(?:[us]_?)?int_?(?:8|16|32|64)_t};
+our $typeOtherOSTypedefs = qr{(?x:
+	u_(?:char|short|int|long) |          # bsd
+	u(?:nchar|short|int|long)            # sysv
+)};
+our $typeKernelTypedefs = qr{(?x:
+	(?:__)?(?:u|s|be|le)(?:8|16|32|64)|
+	atomic_t
+)};
+our $typeTypedefs = qr{(?x:
+	$typeC99Typedefs\b|
+	$typeOtherOSTypedefs\b|
+	$typeKernelTypedefs\b
+)};
+
+our $zero_initializer = qr{(?:(?:0[xX])?0+$Int_type?|NULL|false)\b};
+
+our $logFunctions = qr{(?x:
+	printk(?:_ratelimited|_once|)|
+	(?:[a-z0-9]+_){1,2}(?:printk|emerg|alert|crit|err|warning|warn|notice|info|debug|dbg|vdbg|devel|cont|WARN)(?:_ratelimited|_once|)|
+	WARN(?:_RATELIMIT|_ONCE|)|
+	panic|
+	MODULE_[A-Z_]+|
+	seq_vprintf|seq_printf|seq_puts
+)};
+
+our $signature_tags = qr{(?xi:
+	Signed-off-by:|
+	Acked-by:|
+	Tested-by:|
+	Reviewed-by:|
+	Reported-by:|
+	Suggested-by:|
+	To:|
+	Cc:
+)};
+
+our @typeListMisordered = (
+	qr{char\s+(?:un)?signed},
+	qr{int\s+(?:(?:un)?signed\s+)?short\s},
+	qr{int\s+short(?:\s+(?:un)?signed)},
+	qr{short\s+int(?:\s+(?:un)?signed)},
+	qr{(?:un)?signed\s+int\s+short},
+	qr{short\s+(?:un)?signed},
+	qr{long\s+int\s+(?:un)?signed},
+	qr{int\s+long\s+(?:un)?signed},
+	qr{long\s+(?:un)?signed\s+int},
+	qr{int\s+(?:un)?signed\s+long},
+	qr{int\s+(?:un)?signed},
+	qr{int\s+long\s+long\s+(?:un)?signed},
+	qr{long\s+long\s+int\s+(?:un)?signed},
+	qr{long\s+long\s+(?:un)?signed\s+int},
+	qr{long\s+long\s+(?:un)?signed},
+	qr{long\s+(?:un)?signed},
+);
+
+our @typeList = (
+	qr{void},
+	qr{(?:(?:un)?signed\s+)?char},
+	qr{(?:(?:un)?signed\s+)?short\s+int},
+	qr{(?:(?:un)?signed\s+)?short},
+	qr{(?:(?:un)?signed\s+)?int},
+	qr{(?:(?:un)?signed\s+)?long\s+int},
+	qr{(?:(?:un)?signed\s+)?long\s+long\s+int},
+	qr{(?:(?:un)?signed\s+)?long\s+long},
+	qr{(?:(?:un)?signed\s+)?long},
+	qr{(?:un)?signed},
+	qr{float},
+	qr{double},
+	qr{bool},
+	qr{struct\s+$Ident},
+	qr{union\s+$Ident},
+	qr{enum\s+$Ident},
+	qr{${Ident}_t},
+	qr{${Ident}_handler},
+	qr{${Ident}_handler_fn},
+	@typeListMisordered,
+);
+
+our $C90_int_types = qr{(?x:
+	long\s+long\s+int\s+(?:un)?signed|
+	long\s+long\s+(?:un)?signed\s+int|
+	long\s+long\s+(?:un)?signed|
+	(?:(?:un)?signed\s+)?long\s+long\s+int|
+	(?:(?:un)?signed\s+)?long\s+long|
+	int\s+long\s+long\s+(?:un)?signed|
+	int\s+(?:(?:un)?signed\s+)?long\s+long|
+
+	long\s+int\s+(?:un)?signed|
+	long\s+(?:un)?signed\s+int|
+	long\s+(?:un)?signed|
+	(?:(?:un)?signed\s+)?long\s+int|
+	(?:(?:un)?signed\s+)?long|
+	int\s+long\s+(?:un)?signed|
+	int\s+(?:(?:un)?signed\s+)?long|
+
+	int\s+(?:un)?signed|
+	(?:(?:un)?signed\s+)?int
+)};
+
+our @typeListFile = ();
+our @typeListWithAttr = (
+	@typeList,
+	qr{struct\s+$InitAttribute\s+$Ident},
+	qr{union\s+$InitAttribute\s+$Ident},
+);
+
+our @modifierList = (
+	qr{fastcall},
+);
+our @modifierListFile = ();
+
+our @mode_permission_funcs = (
+	["module_param", 3],
+	["module_param_(?:array|named|string)", 4],
+	["module_param_array_named", 5],
+	["debugfs_create_(?:file|u8|u16|u32|u64|x8|x16|x32|x64|size_t|atomic_t|bool|blob|regset32|u32_array)", 2],
+	["proc_create(?:_data|)", 2],
+	["(?:CLASS|DEVICE|SENSOR|SENSOR_DEVICE|IIO_DEVICE)_ATTR", 2],
+	["IIO_DEV_ATTR_[A-Z_]+", 1],
+	["SENSOR_(?:DEVICE_|)ATTR_2", 2],
+	["SENSOR_TEMPLATE(?:_2|)", 3],
+	["__ATTR", 2],
+);
+
+#Create a search pattern for all these functions to speed up a loop below
+our $mode_perms_search = "";
+foreach my $entry (@mode_permission_funcs) {
+	$mode_perms_search .= '|' if ($mode_perms_search ne "");
+	$mode_perms_search .= $entry->[0];
+}
+
+our $mode_perms_world_writable = qr{
+	S_IWUGO		|
+	S_IWOTH		|
+	S_IRWXUGO	|
+	S_IALLUGO	|
+	0[0-7][0-7][2367]
+}x;
+
+our %mode_permission_string_types = (
+	"S_IRWXU" => 0700,
+	"S_IRUSR" => 0400,
+	"S_IWUSR" => 0200,
+	"S_IXUSR" => 0100,
+	"S_IRWXG" => 0070,
+	"S_IRGRP" => 0040,
+	"S_IWGRP" => 0020,
+	"S_IXGRP" => 0010,
+	"S_IRWXO" => 0007,
+	"S_IROTH" => 0004,
+	"S_IWOTH" => 0002,
+	"S_IXOTH" => 0001,
+	"S_IRWXUGO" => 0777,
+	"S_IRUGO" => 0444,
+	"S_IWUGO" => 0222,
+	"S_IXUGO" => 0111,
+);
+
+#Create a search pattern for all these strings to speed up a loop below
+our $mode_perms_string_search = "";
+foreach my $entry (keys %mode_permission_string_types) {
+	$mode_perms_string_search .= '|' if ($mode_perms_string_search ne "");
+	$mode_perms_string_search .= $entry;
+}
+
+our $allowed_asm_includes = qr{(?x:
+	irq|
+	memory|
+	time|
+	reboot
+)};
+# memory.h: ARM has a custom one
+
+# Load common spelling mistakes and build regular expression list.
+my $misspellings;
+my %spelling_fix;
+
+if (open(my $spelling, '<', $spelling_file)) {
+	while (<$spelling>) {
+		my $line = $_;
+
+		$line =~ s/\s*\n?$//g;
+		$line =~ s/^\s*//g;
+
+		next if ($line =~ m/^\s*#/);
+		next if ($line =~ m/^\s*$/);
+
+		my ($suspect, $fix) = split(/\|\|/, $line);
+
+		$spelling_fix{$suspect} = $fix;
+	}
+	close($spelling);
+} else {
+	warn "No typos will be found - file '$spelling_file': $!\n";
+}
+
+if ($codespell) {
+	if (open(my $spelling, '<', $codespellfile)) {
+		while (<$spelling>) {
+			my $line = $_;
+
+			$line =~ s/\s*\n?$//g;
+			$line =~ s/^\s*//g;
+
+			next if ($line =~ m/^\s*#/);
+			next if ($line =~ m/^\s*$/);
+			next if ($line =~ m/, disabled/i);
+
+			$line =~ s/,.*$//;
+
+			my ($suspect, $fix) = split(/->/, $line);
+
+			$spelling_fix{$suspect} = $fix;
+		}
+		close($spelling);
+	} else {
+		warn "No codespell typos will be found - file '$codespellfile': $!\n";
+	}
+}
+
+$misspellings = join("|", sort keys %spelling_fix) if keys %spelling_fix;
+
+my $const_structs = "";
+if (open(my $conststructs, '<', $conststructsfile)) {
+	while (<$conststructs>) {
+		my $line = $_;
+
+		$line =~ s/\s*\n?$//g;
+		$line =~ s/^\s*//g;
+
+		next if ($line =~ m/^\s*#/);
+		next if ($line =~ m/^\s*$/);
+		if ($line =~ /\s/) {
+			print("$conststructsfile: '$line' invalid - ignored\n");
+			next;
+		}
+
+		$const_structs .= '|' if ($const_structs ne "");
+		$const_structs .= $line;
+	}
+	close($conststructsfile);
+} else {
+	warn "No structs that should be const will be found - file '$conststructsfile': $!\n";
+}
+
+sub build_types {
+	my $mods = "(?x:  \n" . join("|\n  ", (@modifierList, @modifierListFile)) . "\n)";
+	my $all = "(?x:  \n" . join("|\n  ", (@typeList, @typeListFile)) . "\n)";
+	my $Misordered = "(?x:  \n" . join("|\n  ", @typeListMisordered) . "\n)";
+	my $allWithAttr = "(?x:  \n" . join("|\n  ", @typeListWithAttr) . "\n)";
+	$Modifier	= qr{(?:$Attribute|$Sparse|$mods)};
+	$BasicType	= qr{
+				(?:$typeTypedefs\b)|
+				(?:${all}\b)
+		}x;
+	$NonptrType	= qr{
+			(?:$Modifier\s+|const\s+)*
+			(?:
+				(?:typeof|__typeof__)\s*\([^\)]*\)|
+				(?:$typeTypedefs\b)|
+				(?:${all}\b)
+			)
+			(?:\s+$Modifier|\s+const)*
+		  }x;
+	$NonptrTypeMisordered	= qr{
+			(?:$Modifier\s+|const\s+)*
+			(?:
+				(?:${Misordered}\b)
+			)
+			(?:\s+$Modifier|\s+const)*
+		  }x;
+	$NonptrTypeWithAttr	= qr{
+			(?:$Modifier\s+|const\s+)*
+			(?:
+				(?:typeof|__typeof__)\s*\([^\)]*\)|
+				(?:$typeTypedefs\b)|
+				(?:${allWithAttr}\b)
+			)
+			(?:\s+$Modifier|\s+const)*
+		  }x;
+	$Type	= qr{
+			$NonptrType
+			(?:(?:\s|\*|\[\])+\s*const|(?:\s|\*\s*(?:const\s*)?|\[\])+|(?:\s*\[\s*\])+)?
+			(?:\s+$Inline|\s+$Modifier)*
+		  }x;
+	$TypeMisordered	= qr{
+			$NonptrTypeMisordered
+			(?:(?:\s|\*|\[\])+\s*const|(?:\s|\*\s*(?:const\s*)?|\[\])+|(?:\s*\[\s*\])+)?
+			(?:\s+$Inline|\s+$Modifier)*
+		  }x;
+	$Declare	= qr{(?:$Storage\s+(?:$Inline\s+)?)?$Type};
+	$DeclareMisordered	= qr{(?:$Storage\s+(?:$Inline\s+)?)?$TypeMisordered};
+}
+build_types();
+
+our $Typecast	= qr{\s*(\(\s*$NonptrType\s*\)){0,1}\s*};
+
+# Using $balanced_parens, $LvalOrFunc, or $FuncArg
+# requires at least perl version v5.10.0
+# Any use must be runtime checked with $^V
+
+our $balanced_parens = qr/(\((?:[^\(\)]++|(?-1))*\))/;
+our $LvalOrFunc	= qr{((?:[\&\*]\s*)?$Lval)\s*($balanced_parens{0,1})\s*};
+our $FuncArg = qr{$Typecast{0,1}($LvalOrFunc|$Constant|$String)};
+
+our $declaration_macros = qr{(?x:
+	(?:$Storage\s+)?(?:[A-Z_][A-Z0-9]*_){0,2}(?:DEFINE|DECLARE)(?:_[A-Z0-9]+){1,6}\s*\(|
+	(?:$Storage\s+)?LIST_HEAD\s*\(|
+	(?:$Storage\s+)?${Type}\s+uninitialized_var\s*\(
+)};
+
+sub deparenthesize {
+	my ($string) = @_;
+	return "" if (!defined($string));
+
+	while ($string =~ /^\s*\(.*\)\s*$/) {
+		$string =~ s@^\s*\(\s*@@;
+		$string =~ s@\s*\)\s*$@@;
+	}
+
+	$string =~ s@\s+@ @g;
+
+	return $string;
+}
+
+sub seed_camelcase_file {
+	my ($file) = @_;
+
+	return if (!(-f $file));
+
+	local $/;
+
+	open(my $include_file, '<', "$file")
+	    or warn "$P: Can't read '$file' $!\n";
+	my $text = <$include_file>;
+	close($include_file);
+
+	my @lines = split('\n', $text);
+
+	foreach my $line (@lines) {
+		next if ($line !~ /(?:[A-Z][a-z]|[a-z][A-Z])/);
+		if ($line =~ /^[ \t]*(?:#[ \t]*define|typedef\s+$Type)\s+(\w*(?:[A-Z][a-z]|[a-z][A-Z])\w*)/) {
+			$camelcase{$1} = 1;
+		} elsif ($line =~ /^\s*$Declare\s+(\w*(?:[A-Z][a-z]|[a-z][A-Z])\w*)\s*[\(\[,;]/) {
+			$camelcase{$1} = 1;
+		} elsif ($line =~ /^\s*(?:union|struct|enum)\s+(\w*(?:[A-Z][a-z]|[a-z][A-Z])\w*)\s*[;\{]/) {
+			$camelcase{$1} = 1;
+		}
+	}
+}
+
+sub is_maintained_obsolete {
+	my ($filename) = @_;
+
+	return 0 if (!(-e "$root/scripts/get_maintainer.pl"));
+
+	my $status = `perl $root/scripts/get_maintainer.pl --status --nom --nol --nogit --nogit-fallback -f $filename 2>&1`;
+
+	return $status =~ /obsolete/i;
+}
+
+my $camelcase_seeded = 0;
+sub seed_camelcase_includes {
+	return if ($camelcase_seeded);
+
+	my $files;
+	my $camelcase_cache = "";
+	my @include_files = ();
+
+	$camelcase_seeded = 1;
+
+	if (-e ".git") {
+		my $git_last_include_commit = `git log --no-merges --pretty=format:"%h%n" -1 -- include`;
+		chomp $git_last_include_commit;
+		$camelcase_cache = ".checkpatch-camelcase.git.$git_last_include_commit";
+	} else {
+		my $last_mod_date = 0;
+		$files = `find $root/include -name "*.h"`;
+		@include_files = split('\n', $files);
+		foreach my $file (@include_files) {
+			my $date = POSIX::strftime("%Y%m%d%H%M",
+						   localtime((stat $file)[9]));
+			$last_mod_date = $date if ($last_mod_date < $date);
+		}
+		$camelcase_cache = ".checkpatch-camelcase.date.$last_mod_date";
+	}
+
+	if ($camelcase_cache ne "" && -f $camelcase_cache) {
+		open(my $camelcase_file, '<', "$camelcase_cache")
+		    or warn "$P: Can't read '$camelcase_cache' $!\n";
+		while (<$camelcase_file>) {
+			chomp;
+			$camelcase{$_} = 1;
+		}
+		close($camelcase_file);
+
+		return;
+	}
+
+	if (-e ".git") {
+		$files = `git ls-files "include/*.h"`;
+		@include_files = split('\n', $files);
+	}
+
+	foreach my $file (@include_files) {
+		seed_camelcase_file($file);
+	}
+
+	if ($camelcase_cache ne "") {
+		unlink glob ".checkpatch-camelcase.*";
+		open(my $camelcase_file, '>', "$camelcase_cache")
+		    or warn "$P: Can't write '$camelcase_cache' $!\n";
+		foreach (sort { lc($a) cmp lc($b) } keys(%camelcase)) {
+			print $camelcase_file ("$_\n");
+		}
+		close($camelcase_file);
+	}
+}
+
+sub git_commit_info {
+	my ($commit, $id, $desc) = @_;
+
+	return ($id, $desc) if ((which("git") eq "") || !(-e ".git"));
+
+	my $output = `git log --no-color --format='%H %s' -1 $commit 2>&1`;
+	$output =~ s/^\s*//gm;
+	my @lines = split("\n", $output);
+
+	return ($id, $desc) if ($#lines < 0);
+
+	if ($lines[0] =~ /^error: short SHA1 $commit is ambiguous\./) {
+# Maybe one day convert this block of bash into something that returns
+# all matching commit ids, but it's very slow...
+#
+#		echo "checking commits $1..."
+#		git rev-list --remotes | grep -i "^$1" |
+#		while read line ; do
+#		    git log --format='%H %s' -1 $line |
+#		    echo "commit $(cut -c 1-12,41-)"
+#		done
+	} elsif ($lines[0] =~ /^fatal: ambiguous argument '$commit': unknown revision or path not in the working tree\./) {
+	} else {
+		$id = substr($lines[0], 0, 12);
+		$desc = substr($lines[0], 41);
+	}
+
+	return ($id, $desc);
+}
+
+$chk_signoff = 0 if ($file);
+
+my @rawlines = ();
+my @lines = ();
+my @fixed = ();
+my @fixed_inserted = ();
+my @fixed_deleted = ();
+my $fixlinenr = -1;
+
+# If input is git commits, extract all commits from the commit expressions.
+# For example, HEAD-3 means we need check 'HEAD, HEAD~1, HEAD~2'.
+die "$P: No git repository found\n" if ($git && !-e ".git");
+
+if ($git) {
+	my @commits = ();
+	foreach my $commit_expr (@ARGV) {
+		my $git_range;
+		if ($commit_expr =~ m/^(.*)-(\d+)$/) {
+			$git_range = "-$2 $1";
+		} elsif ($commit_expr =~ m/\.\./) {
+			$git_range = "$commit_expr";
+		} else {
+			$git_range = "-1 $commit_expr";
+		}
+		my $lines = `git log --no-color --no-merges --pretty=format:'%H %s' $git_range`;
+		foreach my $line (split(/\n/, $lines)) {
+			$line =~ /^([0-9a-fA-F]{40,40}) (.*)$/;
+			next if (!defined($1) || !defined($2));
+			my $sha1 = $1;
+			my $subject = $2;
+			unshift(@commits, $sha1);
+			$git_commits{$sha1} = $subject;
+		}
+	}
+	die "$P: no git commits after extraction!\n" if (@commits == 0);
+	@ARGV = @commits;
+}
+
+my $vname;
+for my $filename (@ARGV) {
+	my $FILE;
+	if ($git) {
+		open($FILE, '-|', "git format-patch -M --stdout -1 $filename") ||
+			die "$P: $filename: git format-patch failed - $!\n";
+	} elsif ($file) {
+		open($FILE, '-|', "diff -u /dev/null $filename") ||
+			die "$P: $filename: diff failed - $!\n";
+	} elsif ($filename eq '-') {
+		open($FILE, '<&STDIN');
+	} else {
+		open($FILE, '<', "$filename") ||
+			die "$P: $filename: open failed - $!\n";
+	}
+	if ($filename eq '-') {
+		$vname = 'Your patch';
+	} elsif ($git) {
+		$vname = "Commit " . substr($filename, 0, 12) . ' ("' . $git_commits{$filename} . '")';
+	} else {
+		$vname = $filename;
+	}
+	while (<$FILE>) {
+		chomp;
+		push(@rawlines, $_);
+	}
+	close($FILE);
+
+	if ($#ARGV > 0 && $quiet == 0) {
+		print '-' x length($vname) . "\n";
+		print "$vname\n";
+		print '-' x length($vname) . "\n";
+	}
+
+	if (!process($filename)) {
+		$exit = 1;
+	}
+	@rawlines = ();
+	@lines = ();
+	@fixed = ();
+	@fixed_inserted = ();
+	@fixed_deleted = ();
+	$fixlinenr = -1;
+	@modifierListFile = ();
+	@typeListFile = ();
+	build_types();
+}
+
+if (!$quiet) {
+	hash_show_words(\%use_type, "Used");
+	hash_show_words(\%ignore_type, "Ignored");
+
+	if ($^V lt 5.10.0) {
+		print << "EOM"
+
+NOTE: perl $^V is not modern enough to detect all possible issues.
+      An upgrade to at least perl v5.10.0 is suggested.
+EOM
+	}
+	if ($exit) {
+		print << "EOM"
+
+NOTE: If any of the errors are false positives, please report
+      them to the maintainer, see CHECKPATCH in MAINTAINERS.
+EOM
+	}
+}
+
+exit($exit);
+
+sub top_of_kernel_tree {
+	my ($root) = @_;
+
+	my @tree_check = (
+		"COPYING", "CREDITS", "Kbuild", "MAINTAINERS", "Makefile",
+		"README", "Documentation", "arch", "include", "drivers",
+		"fs", "init", "ipc", "kernel", "lib", "scripts",
+	);
+
+	foreach my $check (@tree_check) {
+		if (! -e $root . '/' . $check) {
+			return 0;
+		}
+	}
+	return 1;
+}
+
+sub parse_email {
+	my ($formatted_email) = @_;
+
+	my $name = "";
+	my $address = "";
+	my $comment = "";
+
+	if ($formatted_email =~ /^(.*)<(\S+\@\S+)>(.*)$/) {
+		$name = $1;
+		$address = $2;
+		$comment = $3 if defined $3;
+	} elsif ($formatted_email =~ /^\s*<(\S+\@\S+)>(.*)$/) {
+		$address = $1;
+		$comment = $2 if defined $2;
+	} elsif ($formatted_email =~ /(\S+\@\S+)(.*)$/) {
+		$address = $1;
+		$comment = $2 if defined $2;
+		$formatted_email =~ s/$address.*$//;
+		$name = $formatted_email;
+		$name = trim($name);
+		$name =~ s/^\"|\"$//g;
+		# If there's a name left after stripping spaces and
+		# leading quotes, and the address doesn't have both
+		# leading and trailing angle brackets, the address
+		# is invalid. ie:
+		#   "joe smith joe@smith.com" bad
+		#   "joe smith <joe@smith.com" bad
+		if ($name ne "" && $address !~ /^<[^>]+>$/) {
+			$name = "";
+			$address = "";
+			$comment = "";
+		}
+	}
+
+	$name = trim($name);
+	$name =~ s/^\"|\"$//g;
+	$address = trim($address);
+	$address =~ s/^\<|\>$//g;
+
+	if ($name =~ /[^\w \-]/i) { ##has "must quote" chars
+		$name =~ s/(?<!\\)"/\\"/g; ##escape quotes
+		$name = "\"$name\"";
+	}
+
+	return ($name, $address, $comment);
+}
+
+sub format_email {
+	my ($name, $address) = @_;
+
+	my $formatted_email;
+
+	$name = trim($name);
+	$name =~ s/^\"|\"$//g;
+	$address = trim($address);
+
+	if ($name =~ /[^\w \-]/i) { ##has "must quote" chars
+		$name =~ s/(?<!\\)"/\\"/g; ##escape quotes
+		$name = "\"$name\"";
+	}
+
+	if ("$name" eq "") {
+		$formatted_email = "$address";
+	} else {
+		$formatted_email = "$name <$address>";
+	}
+
+	return $formatted_email;
+}
+
+sub which {
+	my ($bin) = @_;
+
+	foreach my $path (split(/:/, $ENV{PATH})) {
+		if (-e "$path/$bin") {
+			return "$path/$bin";
+		}
+	}
+
+	return "";
+}
+
+sub which_conf {
+	my ($conf) = @_;
+
+	foreach my $path (split(/:/, ".:$ENV{HOME}:.scripts")) {
+		if (-e "$path/$conf") {
+			return "$path/$conf";
+		}
+	}
+
+	return "";
+}
+
+sub expand_tabs {
+	my ($str) = @_;
+
+	my $res = '';
+	my $n = 0;
+	for my $c (split(//, $str)) {
+		if ($c eq "\t") {
+			$res .= ' ';
+			$n++;
+			for (; ($n % 8) != 0; $n++) {
+				$res .= ' ';
+			}
+			next;
+		}
+		$res .= $c;
+		$n++;
+	}
+
+	return $res;
+}
+sub copy_spacing {
+	(my $res = shift) =~ tr/\t/ /c;
+	return $res;
+}
+
+sub line_stats {
+	my ($line) = @_;
+
+	# Drop the diff line leader and expand tabs
+	$line =~ s/^.//;
+	$line = expand_tabs($line);
+
+	# Pick the indent from the front of the line.
+	my ($white) = ($line =~ /^(\s*)/);
+
+	return (length($line), length($white));
+}
+
+my $sanitise_quote = '';
+
+sub sanitise_line_reset {
+	my ($in_comment) = @_;
+
+	if ($in_comment) {
+		$sanitise_quote = '*/';
+	} else {
+		$sanitise_quote = '';
+	}
+}
+sub sanitise_line {
+	my ($line) = @_;
+
+	my $res = '';
+	my $l = '';
+
+	my $qlen = 0;
+	my $off = 0;
+	my $c;
+
+	# Always copy over the diff marker.
+	$res = substr($line, 0, 1);
+
+	for ($off = 1; $off < length($line); $off++) {
+		$c = substr($line, $off, 1);
+
+		# Comments we are wacking completly including the begin
+		# and end, all to $;.
+		if ($sanitise_quote eq '' && substr($line, $off, 2) eq '/*') {
+			$sanitise_quote = '*/';
+
+			substr($res, $off, 2, "$;$;");
+			$off++;
+			next;
+		}
+		if ($sanitise_quote eq '*/' && substr($line, $off, 2) eq '*/') {
+			$sanitise_quote = '';
+			substr($res, $off, 2, "$;$;");
+			$off++;
+			next;
+		}
+		if ($sanitise_quote eq '' && substr($line, $off, 2) eq '//') {
+			$sanitise_quote = '//';
+
+			substr($res, $off, 2, $sanitise_quote);
+			$off++;
+			next;
+		}
+
+		# A \ in a string means ignore the next character.
+		if (($sanitise_quote eq "'" || $sanitise_quote eq '"') &&
+		    $c eq "\\") {
+			substr($res, $off, 2, 'XX');
+			$off++;
+			next;
+		}
+		# Regular quotes.
+		if ($c eq "'" || $c eq '"') {
+			if ($sanitise_quote eq '') {
+				$sanitise_quote = $c;
+
+				substr($res, $off, 1, $c);
+				next;
+			} elsif ($sanitise_quote eq $c) {
+				$sanitise_quote = '';
+			}
+		}
+
+		#print "c<$c> SQ<$sanitise_quote>\n";
+		if ($off != 0 && $sanitise_quote eq '*/' && $c ne "\t") {
+			substr($res, $off, 1, $;);
+		} elsif ($off != 0 && $sanitise_quote eq '//' && $c ne "\t") {
+			substr($res, $off, 1, $;);
+		} elsif ($off != 0 && $sanitise_quote && $c ne "\t") {
+			substr($res, $off, 1, 'X');
+		} else {
+			substr($res, $off, 1, $c);
+		}
+	}
+
+	if ($sanitise_quote eq '//') {
+		$sanitise_quote = '';
+	}
+
+	# The pathname on a #include may be surrounded by '<' and '>'.
+	if ($res =~ /^.\s*\#\s*include\s+\<(.*)\>/) {
+		my $clean = 'X' x length($1);
+		$res =~ s@\<.*\>@<$clean>@;
+
+	# The whole of a #error is a string.
+	} elsif ($res =~ /^.\s*\#\s*(?:error|warning)\s+(.*)\b/) {
+		my $clean = 'X' x length($1);
+		$res =~ s@(\#\s*(?:error|warning)\s+).*@$1$clean@;
+	}
+
+	if ($allow_c99_comments && $res =~ m@(//.*$)@) {
+		my $match = $1;
+		$res =~ s/\Q$match\E/"$;" x length($match)/e;
+	}
+
+	return $res;
+}
+
+sub get_quoted_string {
+	my ($line, $rawline) = @_;
+
+	return "" if ($line !~ m/($String)/g);
+	return substr($rawline, $-[0], $+[0] - $-[0]);
+}
+
+sub ctx_statement_block {
+	my ($linenr, $remain, $off) = @_;
+	my $line = $linenr - 1;
+	my $blk = '';
+	my $soff = $off;
+	my $coff = $off - 1;
+	my $coff_set = 0;
+
+	my $loff = 0;
+
+	my $type = '';
+	my $level = 0;
+	my @stack = ();
+	my $p;
+	my $c;
+	my $len = 0;
+
+	my $remainder;
+	while (1) {
+		@stack = (['', 0]) if ($#stack == -1);
+
+		#warn "CSB: blk<$blk> remain<$remain>\n";
+		# If we are about to drop off the end, pull in more
+		# context.
+		if ($off >= $len) {
+			for (; $remain > 0; $line++) {
+				last if (!defined $lines[$line]);
+				next if ($lines[$line] =~ /^-/);
+				$remain--;
+				$loff = $len;
+				$blk .= $lines[$line] . "\n";
+				$len = length($blk);
+				$line++;
+				last;
+			}
+			# Bail if there is no further context.
+			#warn "CSB: blk<$blk> off<$off> len<$len>\n";
+			if ($off >= $len) {
+				last;
+			}
+			if ($level == 0 && substr($blk, $off) =~ /^.\s*#\s*define/) {
+				$level++;
+				$type = '#';
+			}
+		}
+		$p = $c;
+		$c = substr($blk, $off, 1);
+		$remainder = substr($blk, $off);
+
+		#warn "CSB: c<$c> type<$type> level<$level> remainder<$remainder> coff_set<$coff_set>\n";
+
+		# Handle nested #if/#else.
+		if ($remainder =~ /^#\s*(?:ifndef|ifdef|if)\s/) {
+			push(@stack, [ $type, $level ]);
+		} elsif ($remainder =~ /^#\s*(?:else|elif)\b/) {
+			($type, $level) = @{$stack[$#stack - 1]};
+		} elsif ($remainder =~ /^#\s*endif\b/) {
+			($type, $level) = @{pop(@stack)};
+		}
+
+		# Statement ends at the ';' or a close '}' at the
+		# outermost level.
+		if ($level == 0 && $c eq ';') {
+			last;
+		}
+
+		# An else is really a conditional as long as its not else if
+		if ($level == 0 && $coff_set == 0 &&
+				(!defined($p) || $p =~ /(?:\s|\}|\+)/) &&
+				$remainder =~ /^(else)(?:\s|{)/ &&
+				$remainder !~ /^else\s+if\b/) {
+			$coff = $off + length($1) - 1;
+			$coff_set = 1;
+			#warn "CSB: mark coff<$coff> soff<$soff> 1<$1>\n";
+			#warn "[" . substr($blk, $soff, $coff - $soff + 1) . "]\n";
+		}
+
+		if (($type eq '' || $type eq '(') && $c eq '(') {
+			$level++;
+			$type = '(';
+		}
+		if ($type eq '(' && $c eq ')') {
+			$level--;
+			$type = ($level != 0)? '(' : '';
+
+			if ($level == 0 && $coff < $soff) {
+				$coff = $off;
+				$coff_set = 1;
+				#warn "CSB: mark coff<$coff>\n";
+			}
+		}
+		if (($type eq '' || $type eq '{') && $c eq '{') {
+			$level++;
+			$type = '{';
+		}
+		if ($type eq '{' && $c eq '}') {
+			$level--;
+			$type = ($level != 0)? '{' : '';
+
+			if ($level == 0) {
+				if (substr($blk, $off + 1, 1) eq ';') {
+					$off++;
+				}
+				last;
+			}
+		}
+		# Preprocessor commands end at the newline unless escaped.
+		if ($type eq '#' && $c eq "\n" && $p ne "\\") {
+			$level--;
+			$type = '';
+			$off++;
+			last;
+		}
+		$off++;
+	}
+	# We are truly at the end, so shuffle to the next line.
+	if ($off == $len) {
+		$loff = $len + 1;
+		$line++;
+		$remain--;
+	}
+
+	my $statement = substr($blk, $soff, $off - $soff + 1);
+	my $condition = substr($blk, $soff, $coff - $soff + 1);
+
+	#warn "STATEMENT<$statement>\n";
+	#warn "CONDITION<$condition>\n";
+
+	#print "coff<$coff> soff<$off> loff<$loff>\n";
+
+	return ($statement, $condition,
+			$line, $remain + 1, $off - $loff + 1, $level);
+}
+
+sub statement_lines {
+	my ($stmt) = @_;
+
+	# Strip the diff line prefixes and rip blank lines at start and end.
+	$stmt =~ s/(^|\n)./$1/g;
+	$stmt =~ s/^\s*//;
+	$stmt =~ s/\s*$//;
+
+	my @stmt_lines = ($stmt =~ /\n/g);
+
+	return $#stmt_lines + 2;
+}
+
+sub statement_rawlines {
+	my ($stmt) = @_;
+
+	my @stmt_lines = ($stmt =~ /\n/g);
+
+	return $#stmt_lines + 2;
+}
+
+sub statement_block_size {
+	my ($stmt) = @_;
+
+	$stmt =~ s/(^|\n)./$1/g;
+	$stmt =~ s/^\s*{//;
+	$stmt =~ s/}\s*$//;
+	$stmt =~ s/^\s*//;
+	$stmt =~ s/\s*$//;
+
+	my @stmt_lines = ($stmt =~ /\n/g);
+	my @stmt_statements = ($stmt =~ /;/g);
+
+	my $stmt_lines = $#stmt_lines + 2;
+	my $stmt_statements = $#stmt_statements + 1;
+
+	if ($stmt_lines > $stmt_statements) {
+		return $stmt_lines;
+	} else {
+		return $stmt_statements;
+	}
+}
+
+sub ctx_statement_full {
+	my ($linenr, $remain, $off) = @_;
+	my ($statement, $condition, $level);
+
+	my (@chunks);
+
+	# Grab the first conditional/block pair.
+	($statement, $condition, $linenr, $remain, $off, $level) =
+				ctx_statement_block($linenr, $remain, $off);
+	#print "F: c<$condition> s<$statement> remain<$remain>\n";
+	push(@chunks, [ $condition, $statement ]);
+	if (!($remain > 0 && $condition =~ /^\s*(?:\n[+-])?\s*(?:if|else|do)\b/s)) {
+		return ($level, $linenr, @chunks);
+	}
+
+	# Pull in the following conditional/block pairs and see if they
+	# could continue the statement.
+	for (;;) {
+		($statement, $condition, $linenr, $remain, $off, $level) =
+				ctx_statement_block($linenr, $remain, $off);
+		#print "C: c<$condition> s<$statement> remain<$remain>\n";
+		last if (!($remain > 0 && $condition =~ /^(?:\s*\n[+-])*\s*(?:else|do)\b/s));
+		#print "C: push\n";
+		push(@chunks, [ $condition, $statement ]);
+	}
+
+	return ($level, $linenr, @chunks);
+}
+
+sub ctx_block_get {
+	my ($linenr, $remain, $outer, $open, $close, $off) = @_;
+	my $line;
+	my $start = $linenr - 1;
+	my $blk = '';
+	my @o;
+	my @c;
+	my @res = ();
+
+	my $level = 0;
+	my @stack = ($level);
+	for ($line = $start; $remain > 0; $line++) {
+		next if ($rawlines[$line] =~ /^-/);
+		$remain--;
+
+		$blk .= $rawlines[$line];
+
+		# Handle nested #if/#else.
+		if ($lines[$line] =~ /^.\s*#\s*(?:ifndef|ifdef|if)\s/) {
+			push(@stack, $level);
+		} elsif ($lines[$line] =~ /^.\s*#\s*(?:else|elif)\b/) {
+			$level = $stack[$#stack - 1];
+		} elsif ($lines[$line] =~ /^.\s*#\s*endif\b/) {
+			$level = pop(@stack);
+		}
+
+		foreach my $c (split(//, $lines[$line])) {
+			##print "C<$c>L<$level><$open$close>O<$off>\n";
+			if ($off > 0) {
+				$off--;
+				next;
+			}
+
+			if ($c eq $close && $level > 0) {
+				$level--;
+				last if ($level == 0);
+			} elsif ($c eq $open) {
+				$level++;
+			}
+		}
+
+		if (!$outer || $level <= 1) {
+			push(@res, $rawlines[$line]);
+		}
+
+		last if ($level == 0);
+	}
+
+	return ($level, @res);
+}
+sub ctx_block_outer {
+	my ($linenr, $remain) = @_;
+
+	my ($level, @r) = ctx_block_get($linenr, $remain, 1, '{', '}', 0);
+	return @r;
+}
+sub ctx_block {
+	my ($linenr, $remain) = @_;
+
+	my ($level, @r) = ctx_block_get($linenr, $remain, 0, '{', '}', 0);
+	return @r;
+}
+sub ctx_statement {
+	my ($linenr, $remain, $off) = @_;
+
+	my ($level, @r) = ctx_block_get($linenr, $remain, 0, '(', ')', $off);
+	return @r;
+}
+sub ctx_block_level {
+	my ($linenr, $remain) = @_;
+
+	return ctx_block_get($linenr, $remain, 0, '{', '}', 0);
+}
+sub ctx_statement_level {
+	my ($linenr, $remain, $off) = @_;
+
+	return ctx_block_get($linenr, $remain, 0, '(', ')', $off);
+}
+
+sub ctx_locate_comment {
+	my ($first_line, $end_line) = @_;
+
+	# Catch a comment on the end of the line itself.
+	my ($current_comment) = ($rawlines[$end_line - 1] =~ m@.*(/\*.*\*/)\s*(?:\\\s*)?$@);
+	return $current_comment if (defined $current_comment);
+
+	# Look through the context and try and figure out if there is a
+	# comment.
+	my $in_comment = 0;
+	$current_comment = '';
+	for (my $linenr = $first_line; $linenr < $end_line; $linenr++) {
+		my $line = $rawlines[$linenr - 1];
+		#warn "           $line\n";
+		if ($linenr == $first_line and $line =~ m@^.\s*\*@) {
+			$in_comment = 1;
+		}
+		if ($line =~ m@/\*@) {
+			$in_comment = 1;
+		}
+		if (!$in_comment && $current_comment ne '') {
+			$current_comment = '';
+		}
+		$current_comment .= $line . "\n" if ($in_comment);
+		if ($line =~ m@\*/@) {
+			$in_comment = 0;
+		}
+	}
+
+	chomp($current_comment);
+	return($current_comment);
+}
+sub ctx_has_comment {
+	my ($first_line, $end_line) = @_;
+	my $cmt = ctx_locate_comment($first_line, $end_line);
+
+	##print "LINE: $rawlines[$end_line - 1 ]\n";
+	##print "CMMT: $cmt\n";
+
+	return ($cmt ne '');
+}
+
+sub raw_line {
+	my ($linenr, $cnt) = @_;
+
+	my $offset = $linenr - 1;
+	$cnt++;
+
+	my $line;
+	while ($cnt) {
+		$line = $rawlines[$offset++];
+		next if (defined($line) && $line =~ /^-/);
+		$cnt--;
+	}
+
+	return $line;
+}
+
+sub cat_vet {
+	my ($vet) = @_;
+	my ($res, $coded);
+
+	$res = '';
+	while ($vet =~ /([^[:cntrl:]]*)([[:cntrl:]]|$)/g) {
+		$res .= $1;
+		if ($2 ne '') {
+			$coded = sprintf("^%c", unpack('C', $2) + 64);
+			$res .= $coded;
+		}
+	}
+	$res =~ s/$/\$/;
+
+	return $res;
+}
+
+my $av_preprocessor = 0;
+my $av_pending;
+my @av_paren_type;
+my $av_pend_colon;
+
+sub annotate_reset {
+	$av_preprocessor = 0;
+	$av_pending = '_';
+	@av_paren_type = ('E');
+	$av_pend_colon = 'O';
+}
+
+sub annotate_values {
+	my ($stream, $type) = @_;
+
+	my $res;
+	my $var = '_' x length($stream);
+	my $cur = $stream;
+
+	print "$stream\n" if ($dbg_values > 1);
+
+	while (length($cur)) {
+		@av_paren_type = ('E') if ($#av_paren_type < 0);
+		print " <" . join('', @av_paren_type) .
+				"> <$type> <$av_pending>" if ($dbg_values > 1);
+		if ($cur =~ /^(\s+)/o) {
+			print "WS($1)\n" if ($dbg_values > 1);
+			if ($1 =~ /\n/ && $av_preprocessor) {
+				$type = pop(@av_paren_type);
+				$av_preprocessor = 0;
+			}
+
+		} elsif ($cur =~ /^(\(\s*$Type\s*)\)/ && $av_pending eq '_') {
+			print "CAST($1)\n" if ($dbg_values > 1);
+			push(@av_paren_type, $type);
+			$type = 'c';
+
+		} elsif ($cur =~ /^($Type)\s*(?:$Ident|,|\)|\(|\s*$)/) {
+			print "DECLARE($1)\n" if ($dbg_values > 1);
+			$type = 'T';
+
+		} elsif ($cur =~ /^($Modifier)\s*/) {
+			print "MODIFIER($1)\n" if ($dbg_values > 1);
+			$type = 'T';
+
+		} elsif ($cur =~ /^(\#\s*define\s*$Ident)(\(?)/o) {
+			print "DEFINE($1,$2)\n" if ($dbg_values > 1);
+			$av_preprocessor = 1;
+			push(@av_paren_type, $type);
+			if ($2 ne '') {
+				$av_pending = 'N';
+			}
+			$type = 'E';
+
+		} elsif ($cur =~ /^(\#\s*(?:undef\s*$Ident|include\b))/o) {
+			print "UNDEF($1)\n" if ($dbg_values > 1);
+			$av_preprocessor = 1;
+			push(@av_paren_type, $type);
+
+		} elsif ($cur =~ /^(\#\s*(?:ifdef|ifndef|if))/o) {
+			print "PRE_START($1)\n" if ($dbg_values > 1);
+			$av_preprocessor = 1;
+
+			push(@av_paren_type, $type);
+			push(@av_paren_type, $type);
+			$type = 'E';
+
+		} elsif ($cur =~ /^(\#\s*(?:else|elif))/o) {
+			print "PRE_RESTART($1)\n" if ($dbg_values > 1);
+			$av_preprocessor = 1;
+
+			push(@av_paren_type, $av_paren_type[$#av_paren_type]);
+
+			$type = 'E';
+
+		} elsif ($cur =~ /^(\#\s*(?:endif))/o) {
+			print "PRE_END($1)\n" if ($dbg_values > 1);
+
+			$av_preprocessor = 1;
+
+			# Assume all arms of the conditional end as this
+			# one does, and continue as if the #endif was not here.
+			pop(@av_paren_type);
+			push(@av_paren_type, $type);
+			$type = 'E';
+
+		} elsif ($cur =~ /^(\\\n)/o) {
+			print "PRECONT($1)\n" if ($dbg_values > 1);
+
+		} elsif ($cur =~ /^(__attribute__)\s*\(?/o) {
+			print "ATTR($1)\n" if ($dbg_values > 1);
+			$av_pending = $type;
+			$type = 'N';
+
+		} elsif ($cur =~ /^(sizeof)\s*(\()?/o) {
+			print "SIZEOF($1)\n" if ($dbg_values > 1);
+			if (defined $2) {
+				$av_pending = 'V';
+			}
+			$type = 'N';
+
+		} elsif ($cur =~ /^(if|while|for)\b/o) {
+			print "COND($1)\n" if ($dbg_values > 1);
+			$av_pending = 'E';
+			$type = 'N';
+
+		} elsif ($cur =~/^(case)/o) {
+			print "CASE($1)\n" if ($dbg_values > 1);
+			$av_pend_colon = 'C';
+			$type = 'N';
+
+		} elsif ($cur =~/^(return|else|goto|typeof|__typeof__)\b/o) {
+			print "KEYWORD($1)\n" if ($dbg_values > 1);
+			$type = 'N';
+
+		} elsif ($cur =~ /^(\()/o) {
+			print "PAREN('$1')\n" if ($dbg_values > 1);
+			push(@av_paren_type, $av_pending);
+			$av_pending = '_';
+			$type = 'N';
+
+		} elsif ($cur =~ /^(\))/o) {
+			my $new_type = pop(@av_paren_type);
+			if ($new_type ne '_') {
+				$type = $new_type;
+				print "PAREN('$1') -> $type\n"
+							if ($dbg_values > 1);
+			} else {
+				print "PAREN('$1')\n" if ($dbg_values > 1);
+			}
+
+		} elsif ($cur =~ /^($Ident)\s*\(/o) {
+			print "FUNC($1)\n" if ($dbg_values > 1);
+			$type = 'V';
+			$av_pending = 'V';
+
+		} elsif ($cur =~ /^($Ident\s*):(?:\s*\d+\s*(,|=|;))?/) {
+			if (defined $2 && $type eq 'C' || $type eq 'T') {
+				$av_pend_colon = 'B';
+			} elsif ($type eq 'E') {
+				$av_pend_colon = 'L';
+			}
+			print "IDENT_COLON($1,$type>$av_pend_colon)\n" if ($dbg_values > 1);
+			$type = 'V';
+
+		} elsif ($cur =~ /^($Ident|$Constant)/o) {
+			print "IDENT($1)\n" if ($dbg_values > 1);
+			$type = 'V';
+
+		} elsif ($cur =~ /^($Assignment)/o) {
+			print "ASSIGN($1)\n" if ($dbg_values > 1);
+			$type = 'N';
+
+		} elsif ($cur =~/^(;|{|})/) {
+			print "END($1)\n" if ($dbg_values > 1);
+			$type = 'E';
+			$av_pend_colon = 'O';
+
+		} elsif ($cur =~/^(,)/) {
+			print "COMMA($1)\n" if ($dbg_values > 1);
+			$type = 'C';
+
+		} elsif ($cur =~ /^(\?)/o) {
+			print "QUESTION($1)\n" if ($dbg_values > 1);
+			$type = 'N';
+
+		} elsif ($cur =~ /^(:)/o) {
+			print "COLON($1,$av_pend_colon)\n" if ($dbg_values > 1);
+
+			substr($var, length($res), 1, $av_pend_colon);
+			if ($av_pend_colon eq 'C' || $av_pend_colon eq 'L') {
+				$type = 'E';
+			} else {
+				$type = 'N';
+			}
+			$av_pend_colon = 'O';
+
+		} elsif ($cur =~ /^(\[)/o) {
+			print "CLOSE($1)\n" if ($dbg_values > 1);
+			$type = 'N';
+
+		} elsif ($cur =~ /^(-(?![->])|\+(?!\+)|\*|\&\&|\&)/o) {
+			my $variant;
+
+			print "OPV($1)\n" if ($dbg_values > 1);
+			if ($type eq 'V') {
+				$variant = 'B';
+			} else {
+				$variant = 'U';
+			}
+
+			substr($var, length($res), 1, $variant);
+			$type = 'N';
+
+		} elsif ($cur =~ /^($Operators)/o) {
+			print "OP($1)\n" if ($dbg_values > 1);
+			if ($1 ne '++' && $1 ne '--') {
+				$type = 'N';
+			}
+
+		} elsif ($cur =~ /(^.)/o) {
+			print "C($1)\n" if ($dbg_values > 1);
+		}
+		if (defined $1) {
+			$cur = substr($cur, length($1));
+			$res .= $type x length($1);
+		}
+	}
+
+	return ($res, $var);
+}
+
+sub possible {
+	my ($possible, $line) = @_;
+	my $notPermitted = qr{(?:
+		^(?:
+			$Modifier|
+			$Storage|
+			$Type|
+			DEFINE_\S+
+		)$|
+		^(?:
+			goto|
+			return|
+			case|
+			else|
+			asm|__asm__|
+			do|
+			\#|
+			\#\#|
+		)(?:\s|$)|
+		^(?:typedef|struct|enum)\b
+	    )}x;
+	warn "CHECK<$possible> ($line)\n" if ($dbg_possible > 2);
+	if ($possible !~ $notPermitted) {
+		# Check for modifiers.
+		$possible =~ s/\s*$Storage\s*//g;
+		$possible =~ s/\s*$Sparse\s*//g;
+		if ($possible =~ /^\s*$/) {
+
+		} elsif ($possible =~ /\s/) {
+			$possible =~ s/\s*$Type\s*//g;
+			for my $modifier (split(' ', $possible)) {
+				if ($modifier !~ $notPermitted) {
+					warn "MODIFIER: $modifier ($possible) ($line)\n" if ($dbg_possible);
+					push(@modifierListFile, $modifier);
+				}
+			}
+
+		} else {
+			warn "POSSIBLE: $possible ($line)\n" if ($dbg_possible);
+			push(@typeListFile, $possible);
+		}
+		build_types();
+	} else {
+		warn "NOTPOSS: $possible ($line)\n" if ($dbg_possible > 1);
+	}
+}
+
+my $prefix = '';
+
+sub show_type {
+	my ($type) = @_;
+
+	return defined $use_type{$type} if (scalar keys %use_type > 0);
+
+	return !defined $ignore_type{$type};
+}
+
+sub report {
+	my ($level, $type, $msg) = @_;
+
+	if (!show_type($type) ||
+	    (defined $tst_only && $msg !~ /\Q$tst_only\E/)) {
+		return 0;
+	}
+	my $output = '';
+	if (-t STDOUT && $color) {
+		if ($level eq 'ERROR') {
+			$output .= RED;
+		} elsif ($level eq 'WARNING') {
+			$output .= YELLOW;
+		} else {
+			$output .= GREEN;
+		}
+	}
+	$output .= $prefix . $level . ':';
+	if ($show_types) {
+		$output .= BLUE if (-t STDOUT && $color);
+		$output .= "$type:";
+	}
+	$output .= RESET if (-t STDOUT && $color);
+	$output .= ' ' . $msg . "\n";
+
+	if ($showfile) {
+		my @lines = split("\n", $output, -1);
+		splice(@lines, 1, 1);
+		$output = join("\n", @lines);
+	}
+	$output = (split('\n', $output))[0] . "\n" if ($terse);
+
+	push(our @report, $output);
+
+	return 1;
+}
+
+sub report_dump {
+	our @report;
+}
+
+sub fixup_current_range {
+	my ($lineRef, $offset, $length) = @_;
+
+	if ($$lineRef =~ /^\@\@ -\d+,\d+ \+(\d+),(\d+) \@\@/) {
+		my $o = $1;
+		my $l = $2;
+		my $no = $o + $offset;
+		my $nl = $l + $length;
+		$$lineRef =~ s/\+$o,$l \@\@/\+$no,$nl \@\@/;
+	}
+}
+
+sub fix_inserted_deleted_lines {
+	my ($linesRef, $insertedRef, $deletedRef) = @_;
+
+	my $range_last_linenr = 0;
+	my $delta_offset = 0;
+
+	my $old_linenr = 0;
+	my $new_linenr = 0;
+
+	my $next_insert = 0;
+	my $next_delete = 0;
+
+	my @lines = ();
+
+	my $inserted = @{$insertedRef}[$next_insert++];
+	my $deleted = @{$deletedRef}[$next_delete++];
+
+	foreach my $old_line (@{$linesRef}) {
+		my $save_line = 1;
+		my $line = $old_line;	#don't modify the array
+		if ($line =~ /^(?:\+\+\+|\-\-\-)\s+\S+/) {	#new filename
+			$delta_offset = 0;
+		} elsif ($line =~ /^\@\@ -\d+,\d+ \+\d+,\d+ \@\@/) {	#new hunk
+			$range_last_linenr = $new_linenr;
+			fixup_current_range(\$line, $delta_offset, 0);
+		}
+
+		while (defined($deleted) && ${$deleted}{'LINENR'} == $old_linenr) {
+			$deleted = @{$deletedRef}[$next_delete++];
+			$save_line = 0;
+			fixup_current_range(\$lines[$range_last_linenr], $delta_offset--, -1);
+		}
+
+		while (defined($inserted) && ${$inserted}{'LINENR'} == $old_linenr) {
+			push(@lines, ${$inserted}{'LINE'});
+			$inserted = @{$insertedRef}[$next_insert++];
+			$new_linenr++;
+			fixup_current_range(\$lines[$range_last_linenr], $delta_offset++, 1);
+		}
+
+		if ($save_line) {
+			push(@lines, $line);
+			$new_linenr++;
+		}
+
+		$old_linenr++;
+	}
+
+	return @lines;
+}
+
+sub fix_insert_line {
+	my ($linenr, $line) = @_;
+
+	my $inserted = {
+		LINENR => $linenr,
+		LINE => $line,
+	};
+	push(@fixed_inserted, $inserted);
+}
+
+sub fix_delete_line {
+	my ($linenr, $line) = @_;
+
+	my $deleted = {
+		LINENR => $linenr,
+		LINE => $line,
+	};
+
+	push(@fixed_deleted, $deleted);
+}
+
+sub ERROR {
+	my ($type, $msg) = @_;
+
+	if (report("ERROR", $type, $msg)) {
+		our $clean = 0;
+		our $cnt_error++;
+		return 1;
+	}
+	return 0;
+}
+sub WARN {
+	my ($type, $msg) = @_;
+
+	if (report("WARNING", $type, $msg)) {
+		our $clean = 0;
+		our $cnt_warn++;
+		return 1;
+	}
+	return 0;
+}
+sub CHK {
+	my ($type, $msg) = @_;
+
+	if ($check && report("CHECK", $type, $msg)) {
+		our $clean = 0;
+		our $cnt_chk++;
+		return 1;
+	}
+	return 0;
+}
+
+sub check_absolute_file {
+	my ($absolute, $herecurr) = @_;
+	my $file = $absolute;
+
+	##print "absolute<$absolute>\n";
+
+	# See if any suffix of this path is a path within the tree.
+	while ($file =~ s@^[^/]*/@@) {
+		if (-f "$root/$file") {
+			##print "file<$file>\n";
+			last;
+		}
+	}
+	if (! -f _)  {
+		return 0;
+	}
+
+	# It is, so see if the prefix is acceptable.
+	my $prefix = $absolute;
+	substr($prefix, -length($file)) = '';
+
+	##print "prefix<$prefix>\n";
+	if ($prefix ne ".../") {
+		WARN("USE_RELATIVE_PATH",
+		     "use relative pathname instead of absolute in changelog text\n" . $herecurr);
+	}
+}
+
+sub trim {
+	my ($string) = @_;
+
+	$string =~ s/^\s+|\s+$//g;
+
+	return $string;
+}
+
+sub ltrim {
+	my ($string) = @_;
+
+	$string =~ s/^\s+//;
+
+	return $string;
+}
+
+sub rtrim {
+	my ($string) = @_;
+
+	$string =~ s/\s+$//;
+
+	return $string;
+}
+
+sub string_find_replace {
+	my ($string, $find, $replace) = @_;
+
+	$string =~ s/$find/$replace/g;
+
+	return $string;
+}
+
+sub tabify {
+	my ($leading) = @_;
+
+	my $source_indent = 8;
+	my $max_spaces_before_tab = $source_indent - 1;
+	my $spaces_to_tab = " " x $source_indent;
+
+	#convert leading spaces to tabs
+	1 while $leading =~ s@^([\t]*)$spaces_to_tab@$1\t@g;
+	#Remove spaces before a tab
+	1 while $leading =~ s@^([\t]*)( {1,$max_spaces_before_tab})\t@$1\t@g;
+
+	return "$leading";
+}
+
+sub pos_last_openparen {
+	my ($line) = @_;
+
+	my $pos = 0;
+
+	my $opens = $line =~ tr/\(/\(/;
+	my $closes = $line =~ tr/\)/\)/;
+
+	my $last_openparen = 0;
+
+	if (($opens == 0) || ($closes >= $opens)) {
+		return -1;
+	}
+
+	my $len = length($line);
+
+	for ($pos = 0; $pos < $len; $pos++) {
+		my $string = substr($line, $pos);
+		if ($string =~ /^($FuncArg|$balanced_parens)/) {
+			$pos += length($1) - 1;
+		} elsif (substr($line, $pos, 1) eq '(') {
+			$last_openparen = $pos;
+		} elsif (index($string, '(') == -1) {
+			last;
+		}
+	}
+
+	return length(expand_tabs(substr($line, 0, $last_openparen))) + 1;
+}
+
+sub process {
+	my $filename = shift;
+
+	my $linenr=0;
+	my $prevline="";
+	my $prevrawline="";
+	my $stashline="";
+	my $stashrawline="";
+
+	my $length;
+	my $indent;
+	my $previndent=0;
+	my $stashindent=0;
+
+	our $clean = 1;
+	my $signoff = 0;
+	my $is_patch = 0;
+	my $in_header_lines = $file ? 0 : 1;
+	my $in_commit_log = 0;		#Scanning lines before patch
+	my $has_commit_log = 0;		#Encountered lines before patch
+       my $commit_log_possible_stack_dump = 0;
+	my $commit_log_long_line = 0;
+	my $commit_log_has_diff = 0;
+	my $reported_maintainer_file = 0;
+	my $non_utf8_charset = 0;
+
+	my $last_blank_line = 0;
+	my $last_coalesced_string_linenr = -1;
+
+	our @report = ();
+	our $cnt_lines = 0;
+	our $cnt_error = 0;
+	our $cnt_warn = 0;
+	our $cnt_chk = 0;
+
+	# Trace the real file/line as we go.
+	my $realfile = '';
+	my $realline = 0;
+	my $realcnt = 0;
+	my $here = '';
+	my $in_comment = 0;
+	my $comment_edge = 0;
+	my $first_line = 0;
+	my $p1_prefix = '';
+
+	my $prev_values = 'E';
+
+	# suppression flags
+	my %suppress_ifbraces;
+	my %suppress_whiletrailers;
+	my %suppress_export;
+	my $suppress_statement = 0;
+
+	my %signatures = ();
+
+	# Pre-scan the patch sanitizing the lines.
+	# Pre-scan the patch looking for any __setup documentation.
+	#
+	my @setup_docs = ();
+	my $setup_docs = 0;
+
+	my $camelcase_file_seeded = 0;
+
+	sanitise_line_reset();
+	my $line;
+	foreach my $rawline (@rawlines) {
+		$linenr++;
+		$line = $rawline;
+
+		push(@fixed, $rawline) if ($fix);
+
+		if ($rawline=~/^\+\+\+\s+(\S+)/) {
+			$setup_docs = 0;
+			if ($1 =~ m@Documentation/kernel-parameters.txt$@) {
+				$setup_docs = 1;
+			}
+			#next;
+		}
+		if ($rawline=~/^\@\@ -\d+(?:,\d+)? \+(\d+)(,(\d+))? \@\@/) {
+			$realline=$1-1;
+			if (defined $2) {
+				$realcnt=$3+1;
+			} else {
+				$realcnt=1+1;
+			}
+			$in_comment = 0;
+
+			# Guestimate if this is a continuing comment.  Run
+			# the context looking for a comment "edge".  If this
+			# edge is a close comment then we must be in a comment
+			# at context start.
+			my $edge;
+			my $cnt = $realcnt;
+			for (my $ln = $linenr + 1; $cnt > 0; $ln++) {
+				next if (defined $rawlines[$ln - 1] &&
+					 $rawlines[$ln - 1] =~ /^-/);
+				$cnt--;
+				#print "RAW<$rawlines[$ln - 1]>\n";
+				last if (!defined $rawlines[$ln - 1]);
+				if ($rawlines[$ln - 1] =~ m@(/\*|\*/)@ &&
+				    $rawlines[$ln - 1] !~ m@"[^"]*(?:/\*|\*/)[^"]*"@) {
+					($edge) = $1;
+					last;
+				}
+			}
+			if (defined $edge && $edge eq '*/') {
+				$in_comment = 1;
+			}
+
+			# Guestimate if this is a continuing comment.  If this
+			# is the start of a diff block and this line starts
+			# ' *' then it is very likely a comment.
+			if (!defined $edge &&
+			    $rawlines[$linenr] =~ m@^.\s*(?:\*\*+| \*)(?:\s|$)@)
+			{
+				$in_comment = 1;
+			}
+
+			##print "COMMENT:$in_comment edge<$edge> $rawline\n";
+			sanitise_line_reset($in_comment);
+
+		} elsif ($realcnt && $rawline =~ /^(?:\+| |$)/) {
+			# Standardise the strings and chars within the input to
+			# simplify matching -- only bother with positive lines.
+			$line = sanitise_line($rawline);
+		}
+		push(@lines, $line);
+
+		if ($realcnt > 1) {
+			$realcnt-- if ($line =~ /^(?:\+| |$)/);
+		} else {
+			$realcnt = 0;
+		}
+
+		#print "==>$rawline\n";
+		#print "-->$line\n";
+
+		if ($setup_docs && $line =~ /^\+/) {
+			push(@setup_docs, $line);
+		}
+	}
+
+	$prefix = '';
+
+	$realcnt = 0;
+	$linenr = 0;
+	$fixlinenr = -1;
+	foreach my $line (@lines) {
+		$linenr++;
+		$fixlinenr++;
+		my $sline = $line;	#copy of $line
+		$sline =~ s/$;/ /g;	#with comments as spaces
+
+		my $rawline = $rawlines[$linenr - 1];
+
+#extract the line range in the file after the patch is applied
+		if (!$in_commit_log &&
+		    $line =~ /^\@\@ -\d+(?:,\d+)? \+(\d+)(,(\d+))? \@\@/) {
+			$is_patch = 1;
+			$first_line = $linenr + 1;
+			$realline=$1-1;
+			if (defined $2) {
+				$realcnt=$3+1;
+			} else {
+				$realcnt=1+1;
+			}
+			annotate_reset();
+			$prev_values = 'E';
+
+			%suppress_ifbraces = ();
+			%suppress_whiletrailers = ();
+			%suppress_export = ();
+			$suppress_statement = 0;
+			next;
+
+# track the line number as we move through the hunk, note that
+# new versions of GNU diff omit the leading space on completely
+# blank context lines so we need to count that too.
+		} elsif ($line =~ /^( |\+|$)/) {
+			$realline++;
+			$realcnt-- if ($realcnt != 0);
+
+			# Measure the line length and indent.
+			($length, $indent) = line_stats($rawline);
+
+			# Track the previous line.
+			($prevline, $stashline) = ($stashline, $line);
+			($previndent, $stashindent) = ($stashindent, $indent);
+			($prevrawline, $stashrawline) = ($stashrawline, $rawline);
+
+			#warn "line<$line>\n";
+
+		} elsif ($realcnt == 1) {
+			$realcnt--;
+		}
+
+		my $hunk_line = ($realcnt != 0);
+
+		$here = "#$linenr: " if (!$file);
+		$here = "#$realline: " if ($file);
+
+		my $found_file = 0;
+		# extract the filename as it passes
+		if ($line =~ /^diff --git.*?(\S+)$/) {
+			$realfile = $1;
+			$realfile =~ s@^([^/]*)/@@ if (!$file);
+			$in_commit_log = 0;
+			$found_file = 1;
+		} elsif ($line =~ /^\+\+\+\s+(\S+)/) {
+			$realfile = $1;
+			$realfile =~ s@^([^/]*)/@@ if (!$file);
+			$in_commit_log = 0;
+
+			$p1_prefix = $1;
+			if (!$file && $tree && $p1_prefix ne '' &&
+			    -e "$root/$p1_prefix") {
+				WARN("PATCH_PREFIX",
+				     "patch prefix '$p1_prefix' exists, appears to be a -p0 patch\n");
+			}
+
+			if ($realfile =~ m@^include/asm/@) {
+				ERROR("MODIFIED_INCLUDE_ASM",
+				      "do not modify files in include/asm, change architecture specific files in include/asm-<architecture>\n" . "$here$rawline\n");
+			}
+			$found_file = 1;
+		}
+
+#make up the handle for any error we report on this line
+		if ($showfile) {
+			$prefix = "$realfile:$realline: "
+		} elsif ($emacs) {
+			if ($file) {
+				$prefix = "$filename:$realline: ";
+			} else {
+				$prefix = "$filename:$linenr: ";
+			}
+		}
+
+		if ($found_file) {
+			if (is_maintained_obsolete($realfile)) {
+				WARN("OBSOLETE",
+				     "$realfile is marked as 'obsolete' in the MAINTAINERS hierarchy.  No unnecessary modifications please.\n");
+			}
+			if ($realfile =~ m@^(?:drivers/net/|net/|drivers/staging/)@) {
+				$check = 1;
+			} else {
+				$check = $check_orig;
+			}
+			next;
+		}
+
+		$here .= "FILE: $realfile:$realline:" if ($realcnt != 0);
+
+		my $hereline = "$here\n$rawline\n";
+		my $herecurr = "$here\n$rawline\n";
+		my $hereprev = "$here\n$prevrawline\n$rawline\n";
+
+		$cnt_lines++ if ($realcnt != 0);
+
+# Check if the commit log has what seems like a diff which can confuse patch
+		if ($in_commit_log && !$commit_log_has_diff &&
+		    (($line =~ m@^\s+diff\b.*a/[\w/]+@ &&
+		      $line =~ m@^\s+diff\b.*a/([\w/]+)\s+b/$1\b@) ||
+		     $line =~ m@^\s*(?:\-\-\-\s+a/|\+\+\+\s+b/)@ ||
+		     $line =~ m/^\s*\@\@ \-\d+,\d+ \+\d+,\d+ \@\@/)) {
+			ERROR("DIFF_IN_COMMIT_MSG",
+			      "Avoid using diff content in the commit message - patch(1) might not work\n" . $herecurr);
+			$commit_log_has_diff = 1;
+		}
+
+# Check for incorrect file permissions
+		if ($line =~ /^new (file )?mode.*[7531]\d{0,2}$/) {
+			my $permhere = $here . "FILE: $realfile\n";
+			if ($realfile !~ m@scripts/@ &&
+			    $realfile !~ /\.(py|pl|awk|sh)$/) {
+				ERROR("EXECUTE_PERMISSIONS",
+				      "do not set execute permissions for source files\n" . $permhere);
+			}
+		}
+
+# Check the patch for a signoff:
+		if ($line =~ /^\s*signed-off-by:/i) {
+			$signoff++;
+			$in_commit_log = 0;
+		}
+
+# Check if MAINTAINERS is being updated.  If so, there's probably no need to
+# emit the "does MAINTAINERS need updating?" message on file add/move/delete
+		if ($line =~ /^\s*MAINTAINERS\s*\|/) {
+			$reported_maintainer_file = 1;
+		}
+
+# Check signature styles
+		if (!$in_header_lines &&
+		    $line =~ /^(\s*)([a-z0-9_-]+by:|$signature_tags)(\s*)(.*)/i) {
+			my $space_before = $1;
+			my $sign_off = $2;
+			my $space_after = $3;
+			my $email = $4;
+			my $ucfirst_sign_off = ucfirst(lc($sign_off));
+
+			if ($sign_off !~ /$signature_tags/) {
+				WARN("BAD_SIGN_OFF",
+				     "Non-standard signature: $sign_off\n" . $herecurr);
+			}
+			if (defined $space_before && $space_before ne "") {
+				if (WARN("BAD_SIGN_OFF",
+					 "Do not use whitespace before $ucfirst_sign_off\n" . $herecurr) &&
+				    $fix) {
+					$fixed[$fixlinenr] =
+					    "$ucfirst_sign_off $email";
+				}
+			}
+			if ($sign_off =~ /-by:$/i && $sign_off ne $ucfirst_sign_off) {
+				if (WARN("BAD_SIGN_OFF",
+					 "'$ucfirst_sign_off' is the preferred signature form\n" . $herecurr) &&
+				    $fix) {
+					$fixed[$fixlinenr] =
+					    "$ucfirst_sign_off $email";
+				}
+
+			}
+			if (!defined $space_after || $space_after ne " ") {
+				if (WARN("BAD_SIGN_OFF",
+					 "Use a single space after $ucfirst_sign_off\n" . $herecurr) &&
+				    $fix) {
+					$fixed[$fixlinenr] =
+					    "$ucfirst_sign_off $email";
+				}
+			}
+
+			my ($email_name, $email_address, $comment) = parse_email($email);
+			my $suggested_email = format_email(($email_name, $email_address));
+			if ($suggested_email eq "") {
+				ERROR("BAD_SIGN_OFF",
+				      "Unrecognized email address: '$email'\n" . $herecurr);
+			} else {
+				my $dequoted = $suggested_email;
+				$dequoted =~ s/^"//;
+				$dequoted =~ s/" </ </;
+				# Don't force email to have quotes
+				# Allow just an angle bracketed address
+				if ("$dequoted$comment" ne $email &&
+				    "<$email_address>$comment" ne $email &&
+				    "$suggested_email$comment" ne $email) {
+					WARN("BAD_SIGN_OFF",
+					     "email address '$email' might be better as '$suggested_email$comment'\n" . $herecurr);
+				}
+			}
+
+# Check for duplicate signatures
+			my $sig_nospace = $line;
+			$sig_nospace =~ s/\s//g;
+			$sig_nospace = lc($sig_nospace);
+			if (defined $signatures{$sig_nospace}) {
+				WARN("BAD_SIGN_OFF",
+				     "Duplicate signature\n" . $herecurr);
+			} else {
+				$signatures{$sig_nospace} = 1;
+			}
+		}
+
+# Check email subject for common tools that don't need to be mentioned
+		if ($in_header_lines &&
+		    $line =~ /^Subject:.*\b(?:checkpatch|sparse|smatch)\b[^:]/i) {
+			WARN("EMAIL_SUBJECT",
+			     "A patch subject line should describe the change not the tool that found it\n" . $herecurr);
+		}
+
+# Check for old stable address
+		if ($line =~ /^\s*cc:\s*.*<?\bstable\@kernel\.org\b>?.*$/i) {
+			ERROR("STABLE_ADDRESS",
+			      "The 'stable' address should be 'stable\@vger.kernel.org'\n" . $herecurr);
+		}
+
+# Check for unwanted Gerrit info
+		if ($in_commit_log && $line =~ /^\s*change-id:/i) {
+			ERROR("GERRIT_CHANGE_ID",
+			      "Remove Gerrit Change-Id's before submitting upstream.\n" . $herecurr);
+		}
+
+# Check if the commit log is in a possible stack dump
+		if ($in_commit_log && !$commit_log_possible_stack_dump &&
+		    ($line =~ /^\s*(?:WARNING:|BUG:)/ ||
+		     $line =~ /^\s*\[\s*\d+\.\d{6,6}\s*\]/ ||
+					# timestamp
+		     $line =~ /^\s*\[\<[0-9a-fA-F]{8,}\>\]/)) {
+					# stack dump address
+			$commit_log_possible_stack_dump = 1;
+		}
+
+# Check for line lengths > 75 in commit log, warn once
+		if ($in_commit_log && !$commit_log_long_line &&
+		    length($line) > 75 &&
+		    !($line =~ /^\s*[a-zA-Z0-9_\/\.]+\s+\|\s+\d+/ ||
+					# file delta changes
+		      $line =~ /^\s*(?:[\w\.\-]+\/)++[\w\.\-]+:/ ||
+					# filename then :
+		      $line =~ /^\s*(?:Fixes:|Link:)/i ||
+					# A Fixes: or Link: line
+		      $commit_log_possible_stack_dump)) {
+			WARN("COMMIT_LOG_LONG_LINE",
+			     "Possible unwrapped commit description (prefer a maximum 75 chars per line)\n" . $herecurr);
+			$commit_log_long_line = 1;
+		}
+
+# Reset possible stack dump if a blank line is found
+		if ($in_commit_log && $commit_log_possible_stack_dump &&
+		    $line =~ /^\s*$/) {
+			$commit_log_possible_stack_dump = 0;
+		}
+
+# Check for git id commit length and improperly formed commit descriptions
+		if ($in_commit_log && !$commit_log_possible_stack_dump &&
+		    $line !~ /^\s*(?:Link|Patchwork|http|https|BugLink):/i &&
+		    ($line =~ /\bcommit\s+[0-9a-f]{5,}\b/i ||
+		     ($line =~ /(?:\s|^)[0-9a-f]{12,40}(?:[\s"'\(\[]|$)/i &&
+		      $line !~ /[\<\[][0-9a-f]{12,40}[\>\]]/i &&
+		      $line !~ /\bfixes:\s*[0-9a-f]{12,40}/i))) {
+			my $init_char = "c";
+			my $orig_commit = "";
+			my $short = 1;
+			my $long = 0;
+			my $case = 1;
+			my $space = 1;
+			my $hasdesc = 0;
+			my $hasparens = 0;
+			my $id = '0123456789ab';
+			my $orig_desc = "commit description";
+			my $description = "";
+
+			if ($line =~ /\b(c)ommit\s+([0-9a-f]{5,})\b/i) {
+				$init_char = $1;
+				$orig_commit = lc($2);
+			} elsif ($line =~ /\b([0-9a-f]{12,40})\b/i) {
+				$orig_commit = lc($1);
+			}
+
+			$short = 0 if ($line =~ /\bcommit\s+[0-9a-f]{12,40}/i);
+			$long = 1 if ($line =~ /\bcommit\s+[0-9a-f]{41,}/i);
+			$space = 0 if ($line =~ /\bcommit [0-9a-f]/i);
+			$case = 0 if ($line =~ /\b[Cc]ommit\s+[0-9a-f]{5,40}[^A-F]/);
+			if ($line =~ /\bcommit\s+[0-9a-f]{5,}\s+\("([^"]+)"\)/i) {
+				$orig_desc = $1;
+				$hasparens = 1;
+			} elsif ($line =~ /\bcommit\s+[0-9a-f]{5,}\s*$/i &&
+				 defined $rawlines[$linenr] &&
+				 $rawlines[$linenr] =~ /^\s*\("([^"]+)"\)/) {
+				$orig_desc = $1;
+				$hasparens = 1;
+			} elsif ($line =~ /\bcommit\s+[0-9a-f]{5,}\s+\("[^"]+$/i &&
+				 defined $rawlines[$linenr] &&
+				 $rawlines[$linenr] =~ /^\s*[^"]+"\)/) {
+				$line =~ /\bcommit\s+[0-9a-f]{5,}\s+\("([^"]+)$/i;
+				$orig_desc = $1;
+				$rawlines[$linenr] =~ /^\s*([^"]+)"\)/;
+				$orig_desc .= " " . $1;
+				$hasparens = 1;
+			}
+
+			($id, $description) = git_commit_info($orig_commit,
+							      $id, $orig_desc);
+
+			if ($short || $long || $space || $case || ($orig_desc ne $description) || !$hasparens) {
+				ERROR("GIT_COMMIT_ID",
+				      "Please use git commit description style 'commit <12+ chars of sha1> (\"<title line>\")' - ie: '${init_char}ommit $id (\"$description\")'\n" . $herecurr);
+			}
+		}
+
+# Check for added, moved or deleted files
+		if (!$reported_maintainer_file && !$in_commit_log &&
+		    ($line =~ /^(?:new|deleted) file mode\s*\d+\s*$/ ||
+		     $line =~ /^rename (?:from|to) [\w\/\.\-]+\s*$/ ||
+		     ($line =~ /\{\s*([\w\/\.\-]*)\s*\=\>\s*([\w\/\.\-]*)\s*\}/ &&
+		      (defined($1) || defined($2))))) {
+			$reported_maintainer_file = 1;
+			WARN("FILE_PATH_CHANGES",
+			     "added, moved or deleted file(s), does MAINTAINERS need updating?\n" . $herecurr);
+		}
+
+# Check for wrappage within a valid hunk of the file
+		if ($realcnt != 0 && $line !~ m{^(?:\+|-| |\\ No newline|$)}) {
+			ERROR("CORRUPTED_PATCH",
+			      "patch seems to be corrupt (line wrapped?)\n" .
+				$herecurr) if (!$emitted_corrupt++);
+		}
+
+# Check for absolute kernel paths.
+		if ($tree) {
+			while ($line =~ m{(?:^|\s)(/\S*)}g) {
+				my $file = $1;
+
+				if ($file =~ m{^(.*?)(?::\d+)+:?$} &&
+				    check_absolute_file($1, $herecurr)) {
+					#
+				} else {
+					check_absolute_file($file, $herecurr);
+				}
+			}
+		}
+
+# UTF-8 regex found at http://www.w3.org/International/questions/qa-forms-utf-8.en.php
+		if (($realfile =~ /^$/ || $line =~ /^\+/) &&
+		    $rawline !~ m/^$UTF8*$/) {
+			my ($utf8_prefix) = ($rawline =~ /^($UTF8*)/);
+
+			my $blank = copy_spacing($rawline);
+			my $ptr = substr($blank, 0, length($utf8_prefix)) . "^";
+			my $hereptr = "$hereline$ptr\n";
+
+			CHK("INVALID_UTF8",
+			    "Invalid UTF-8, patch and commit message should be encoded in UTF-8\n" . $hereptr);
+		}
+
+# Check if it's the start of a commit log
+# (not a header line and we haven't seen the patch filename)
+		if ($in_header_lines && $realfile =~ /^$/ &&
+		    !($rawline =~ /^\s+\S/ ||
+		      $rawline =~ /^(commit\b|from\b|[\w-]+:).*$/i)) {
+			$in_header_lines = 0;
+			$in_commit_log = 1;
+			$has_commit_log = 1;
+		}
+
+# Check if there is UTF-8 in a commit log when a mail header has explicitly
+# declined it, i.e defined some charset where it is missing.
+		if ($in_header_lines &&
+		    $rawline =~ /^Content-Type:.+charset="(.+)".*$/ &&
+		    $1 !~ /utf-8/i) {
+			$non_utf8_charset = 1;
+		}
+
+		if ($in_commit_log && $non_utf8_charset && $realfile =~ /^$/ &&
+		    $rawline =~ /$NON_ASCII_UTF8/) {
+			WARN("UTF8_BEFORE_PATCH",
+			    "8-bit UTF-8 used in possible commit log\n" . $herecurr);
+		}
+
+# Check for various typo / spelling mistakes
+		if (defined($misspellings) &&
+		    ($in_commit_log || $line =~ /^(?:\+|Subject:)/i)) {
+			while ($rawline =~ /(?:^|[^a-z@])($misspellings)(?:\b|$|[^a-z@])/gi) {
+				my $typo = $1;
+				my $typo_fix = $spelling_fix{lc($typo)};
+				$typo_fix = ucfirst($typo_fix) if ($typo =~ /^[A-Z]/);
+				$typo_fix = uc($typo_fix) if ($typo =~ /^[A-Z]+$/);
+				my $msg_type = \&WARN;
+				$msg_type = \&CHK if ($file);
+				if (&{$msg_type}("TYPO_SPELLING",
+						 "'$typo' may be misspelled - perhaps '$typo_fix'?\n" . $herecurr) &&
+				    $fix) {
+					$fixed[$fixlinenr] =~ s/(^|[^A-Za-z@])($typo)($|[^A-Za-z@])/$1$typo_fix$3/;
+				}
+			}
+		}
+
+# ignore non-hunk lines and lines being removed
+		next if (!$hunk_line || $line =~ /^-/);
+
+#trailing whitespace
+		if ($line =~ /^\+.*\015/) {
+			my $herevet = "$here\n" . cat_vet($rawline) . "\n";
+			if (ERROR("DOS_LINE_ENDINGS",
+				  "DOS line endings\n" . $herevet) &&
+			    $fix) {
+				$fixed[$fixlinenr] =~ s/[\s\015]+$//;
+			}
+		} elsif ($rawline =~ /^\+.*\S\s+$/ || $rawline =~ /^\+\s+$/) {
+			my $herevet = "$here\n" . cat_vet($rawline) . "\n";
+			if (ERROR("TRAILING_WHITESPACE",
+				  "trailing whitespace\n" . $herevet) &&
+			    $fix) {
+				$fixed[$fixlinenr] =~ s/\s+$//;
+			}
+
+			$rpt_cleaners = 1;
+		}
+
+# Check for FSF mailing addresses.
+		if ($rawline =~ /\bwrite to the Free/i ||
+		    $rawline =~ /\b59\s+Temple\s+Pl/i ||
+		    $rawline =~ /\b51\s+Franklin\s+St/i) {
+			my $herevet = "$here\n" . cat_vet($rawline) . "\n";
+			my $msg_type = \&ERROR;
+			$msg_type = \&CHK if ($file);
+			&{$msg_type}("FSF_MAILING_ADDRESS",
+				     "Do not include the paragraph about writing to the Free Software Foundation's mailing address from the sample GPL notice. The FSF has changed addresses in the past, and may do so again. Linux already includes a copy of the GPL.\n" . $herevet)
+		}
+
+# check for Kconfig help text having a real description
+# Only applies when adding the entry originally, after that we do not have
+# sufficient context to determine whether it is indeed long enough.
+		if ($realfile =~ /Kconfig/ &&
+		    $line =~ /^\+\s*config\s+/) {
+			my $length = 0;
+			my $cnt = $realcnt;
+			my $ln = $linenr + 1;
+			my $f;
+			my $is_start = 0;
+			my $is_end = 0;
+			for (; $cnt > 0 && defined $lines[$ln - 1]; $ln++) {
+				$f = $lines[$ln - 1];
+				$cnt-- if ($lines[$ln - 1] !~ /^-/);
+				$is_end = $lines[$ln - 1] =~ /^\+/;
+
+				next if ($f =~ /^-/);
+				last if (!$file && $f =~ /^\@\@/);
+
+				if ($lines[$ln - 1] =~ /^\+\s*(?:bool|tristate)\s*\"/) {
+					$is_start = 1;
+				} elsif ($lines[$ln - 1] =~ /^\+\s*(?:---)?help(?:---)?$/) {
+					$length = -1;
+				}
+
+				$f =~ s/^.//;
+				$f =~ s/#.*//;
+				$f =~ s/^\s+//;
+				next if ($f =~ /^$/);
+				if ($f =~ /^\s*config\s/) {
+					$is_end = 1;
+					last;
+				}
+				$length++;
+			}
+			if ($is_start && $is_end && $length < $min_conf_desc_length) {
+				WARN("CONFIG_DESCRIPTION",
+				     "please write a paragraph that describes the config symbol fully\n" . $herecurr);
+			}
+			#print "is_start<$is_start> is_end<$is_end> length<$length>\n";
+		}
+
+# discourage the addition of CONFIG_EXPERIMENTAL in Kconfig.
+		if ($realfile =~ /Kconfig/ &&
+		    $line =~ /.\s*depends on\s+.*\bEXPERIMENTAL\b/) {
+			WARN("CONFIG_EXPERIMENTAL",
+			     "Use of CONFIG_EXPERIMENTAL is deprecated. For alternatives, see https://lkml.org/lkml/2012/10/23/580\n");
+		}
+
+# discourage the use of boolean for type definition attributes of Kconfig options
+		if ($realfile =~ /Kconfig/ &&
+		    $line =~ /^\+\s*\bboolean\b/) {
+			WARN("CONFIG_TYPE_BOOLEAN",
+			     "Use of boolean is deprecated, please use bool instead.\n" . $herecurr);
+		}
+
+		if (($realfile =~ /Makefile.*/ || $realfile =~ /Kbuild.*/) &&
+		    ($line =~ /\+(EXTRA_[A-Z]+FLAGS).*/)) {
+			my $flag = $1;
+			my $replacement = {
+				'EXTRA_AFLAGS' =>   'asflags-y',
+				'EXTRA_CFLAGS' =>   'ccflags-y',
+				'EXTRA_CPPFLAGS' => 'cppflags-y',
+				'EXTRA_LDFLAGS' =>  'ldflags-y',
+			};
+
+			WARN("DEPRECATED_VARIABLE",
+			     "Use of $flag is deprecated, please use \`$replacement->{$flag} instead.\n" . $herecurr) if ($replacement->{$flag});
+		}
+
+# check for DT compatible documentation
+		if (defined $root &&
+			(($realfile =~ /\.dtsi?$/ && $line =~ /^\+\s*compatible\s*=\s*\"/) ||
+			 ($realfile =~ /\.[ch]$/ && $line =~ /^\+.*\.compatible\s*=\s*\"/))) {
+
+			my @compats = $rawline =~ /\"([a-zA-Z0-9\-\,\.\+_]+)\"/g;
+
+			my $dt_path = $root . "/Documentation/devicetree/bindings/";
+			my $vp_file = $dt_path . "vendor-prefixes.txt";
+
+			foreach my $compat (@compats) {
+				my $compat2 = $compat;
+				$compat2 =~ s/\,[a-zA-Z0-9]*\-/\,<\.\*>\-/;
+				my $compat3 = $compat;
+				$compat3 =~ s/\,([a-z]*)[0-9]*\-/\,$1<\.\*>\-/;
+				`grep -Erq "$compat|$compat2|$compat3" $dt_path`;
+				if ( $? >> 8 ) {
+					WARN("UNDOCUMENTED_DT_STRING",
+					     "DT compatible string \"$compat\" appears un-documented -- check $dt_path\n" . $herecurr);
+				}
+
+				next if $compat !~ /^([a-zA-Z0-9\-]+)\,/;
+				my $vendor = $1;
+				`grep -Eq "^$vendor\\b" $vp_file`;
+				if ( $? >> 8 ) {
+					WARN("UNDOCUMENTED_DT_STRING",
+					     "DT compatible string vendor \"$vendor\" appears un-documented -- check $vp_file\n" . $herecurr);
+				}
+			}
+		}
+
+# check we are in a valid source file if not then ignore this hunk
+		next if ($realfile !~ /\.(h|c|s|S|pl|sh|dtsi|dts)$/);
+
+# line length limit (with some exclusions)
+#
+# There are a few types of lines that may extend beyond $max_line_length:
+#	logging functions like pr_info that end in a string
+#	lines with a single string
+#	#defines that are a single string
+#
+# There are 3 different line length message types:
+# LONG_LINE_COMMENT	a comment starts before but extends beyond $max_linelength
+# LONG_LINE_STRING	a string starts before but extends beyond $max_line_length
+# LONG_LINE		all other lines longer than $max_line_length
+#
+# if LONG_LINE is ignored, the other 2 types are also ignored
+#
+
+		if ($line =~ /^\+/ && $length > $max_line_length) {
+			my $msg_type = "LONG_LINE";
+
+			# Check the allowed long line types first
+
+			# logging functions that end in a string that starts
+			# before $max_line_length
+			if ($line =~ /^\+\s*$logFunctions\s*\(\s*(?:(?:KERN_\S+\s*|[^"]*))?($String\s*(?:|,|\)\s*;)\s*)$/ &&
+			    length(expand_tabs(substr($line, 1, length($line) - length($1) - 1))) <= $max_line_length) {
+				$msg_type = "";
+
+			# lines with only strings (w/ possible termination)
+			# #defines with only strings
+			} elsif ($line =~ /^\+\s*$String\s*(?:\s*|,|\)\s*;)\s*$/ ||
+				 $line =~ /^\+\s*#\s*define\s+\w+\s+$String$/) {
+				$msg_type = "";
+
+			# EFI_GUID is another special case
+			} elsif ($line =~ /^\+.*\bEFI_GUID\s*\(/) {
+				$msg_type = "";
+
+			# Otherwise set the alternate message types
+
+			# a comment starts before $max_line_length
+			} elsif ($line =~ /($;[\s$;]*)$/ &&
+				 length(expand_tabs(substr($line, 1, length($line) - length($1) - 1))) <= $max_line_length) {
+				$msg_type = "LONG_LINE_COMMENT"
+
+			# a quoted string starts before $max_line_length
+			} elsif ($sline =~ /\s*($String(?:\s*(?:\\|,\s*|\)\s*;\s*))?)$/ &&
+				 length(expand_tabs(substr($line, 1, length($line) - length($1) - 1))) <= $max_line_length) {
+				$msg_type = "LONG_LINE_STRING"
+			}
+
+			if ($msg_type ne "" &&
+			    (show_type("LONG_LINE") || show_type($msg_type))) {
+				WARN($msg_type,
+				     "line over $max_line_length characters\n" . $herecurr);
+			}
+		}
+
+# check for adding lines without a newline.
+		if ($line =~ /^\+/ && defined $lines[$linenr] && $lines[$linenr] =~ /^\\ No newline at end of file/) {
+			WARN("MISSING_EOF_NEWLINE",
+			     "adding a line without newline at end of file\n" . $herecurr);
+		}
+
+# Blackfin: use hi/lo macros
+		if ($realfile =~ m@arch/blackfin/.*\.S$@) {
+			if ($line =~ /\.[lL][[:space:]]*=.*&[[:space:]]*0x[fF][fF][fF][fF]/) {
+				my $herevet = "$here\n" . cat_vet($line) . "\n";
+				ERROR("LO_MACRO",
+				      "use the LO() macro, not (... & 0xFFFF)\n" . $herevet);
+			}
+			if ($line =~ /\.[hH][[:space:]]*=.*>>[[:space:]]*16/) {
+				my $herevet = "$here\n" . cat_vet($line) . "\n";
+				ERROR("HI_MACRO",
+				      "use the HI() macro, not (... >> 16)\n" . $herevet);
+			}
+		}
+
+# check we are in a valid source file C or perl if not then ignore this hunk
+		next if ($realfile !~ /\.(h|c|pl|dtsi|dts)$/);
+
+# at the beginning of a line any tabs must come first and anything
+# more than 8 must use tabs.
+		if ($rawline =~ /^\+\s* \t\s*\S/ ||
+		    $rawline =~ /^\+\s*        \s*/) {
+			my $herevet = "$here\n" . cat_vet($rawline) . "\n";
+			$rpt_cleaners = 1;
+			if (ERROR("CODE_INDENT",
+				  "code indent should use tabs where possible\n" . $herevet) &&
+			    $fix) {
+				$fixed[$fixlinenr] =~ s/^\+([ \t]+)/"\+" . tabify($1)/e;
+			}
+		}
+
+# check for space before tabs.
+		if ($rawline =~ /^\+/ && $rawline =~ / \t/) {
+			my $herevet = "$here\n" . cat_vet($rawline) . "\n";
+			if (WARN("SPACE_BEFORE_TAB",
+				"please, no space before tabs\n" . $herevet) &&
+			    $fix) {
+				while ($fixed[$fixlinenr] =~
+					   s/(^\+.*) {8,8}\t/$1\t\t/) {}
+				while ($fixed[$fixlinenr] =~
+					   s/(^\+.*) +\t/$1\t/) {}
+			}
+		}
+
+# check for && or || at the start of a line
+		if ($rawline =~ /^\+\s*(&&|\|\|)/) {
+			CHK("LOGICAL_CONTINUATIONS",
+			    "Logical continuations should be on the previous line\n" . $hereprev);
+		}
+
+# check indentation starts on a tab stop
+		if ($^V && $^V ge 5.10.0 &&
+		    $sline =~ /^\+\t+( +)(?:$c90_Keywords\b|\{\s*$|\}\s*(?:else\b|while\b|\s*$))/) {
+			my $indent = length($1);
+			if ($indent % 8) {
+				if (WARN("TABSTOP",
+					 "Statements should start on a tabstop\n" . $herecurr) &&
+				    $fix) {
+					$fixed[$fixlinenr] =~ s@(^\+\t+) +@$1 . "\t" x ($indent/8)@e;
+				}
+			}
+		}
+
+# check multi-line statement indentation matches previous line
+		if ($^V && $^V ge 5.10.0 &&
+		    $prevline =~ /^\+([ \t]*)((?:$c90_Keywords(?:\s+if)\s*)|(?:$Declare\s*)?(?:$Ident|\(\s*\*\s*$Ident\s*\))\s*|$Ident\s*=\s*$Ident\s*)\(.*(\&\&|\|\||,)\s*$/) {
+			$prevline =~ /^\+(\t*)(.*)$/;
+			my $oldindent = $1;
+			my $rest = $2;
+
+			my $pos = pos_last_openparen($rest);
+			if ($pos >= 0) {
+				$line =~ /^(\+| )([ \t]*)/;
+				my $newindent = $2;
+
+				my $goodtabindent = $oldindent .
+					"\t" x ($pos / 8) .
+					" "  x ($pos % 8);
+				my $goodspaceindent = $oldindent . " "  x $pos;
+
+				if ($newindent ne $goodtabindent &&
+				    $newindent ne $goodspaceindent) {
+
+					if (CHK("PARENTHESIS_ALIGNMENT",
+						"Alignment should match open parenthesis\n" . $hereprev) &&
+					    $fix && $line =~ /^\+/) {
+						$fixed[$fixlinenr] =~
+						    s/^\+[ \t]*/\+$goodtabindent/;
+					}
+				}
+			}
+		}
+
+# check for space after cast like "(int) foo" or "(struct foo) bar"
+# avoid checking a few false positives:
+#   "sizeof(<type>)" or "__alignof__(<type>)"
+#   function pointer declarations like "(*foo)(int) = bar;"
+#   structure definitions like "(struct foo) { 0 };"
+#   multiline macros that define functions
+#   known attributes or the __attribute__ keyword
+		if ($line =~ /^\+(.*)\(\s*$Type\s*\)([ \t]++)((?![={]|\\$|$Attribute|__attribute__))/ &&
+		    (!defined($1) || $1 !~ /\b(?:sizeof|__alignof__)\s*$/)) {
+			if (CHK("SPACING",
+				"No space is necessary after a cast\n" . $herecurr) &&
+			    $fix) {
+				$fixed[$fixlinenr] =~
+				    s/(\(\s*$Type\s*\))[ \t]+/$1/;
+			}
+		}
+
+# Block comment styles
+# Networking with an initial /*
+		if ($realfile =~ m@^(drivers/net/|net/)@ &&
+		    $prevrawline =~ /^\+[ \t]*\/\*[ \t]*$/ &&
+		    $rawline =~ /^\+[ \t]*\*/ &&
+		    $realline > 2) {
+			WARN("NETWORKING_BLOCK_COMMENT_STYLE",
+			     "networking block comments don't use an empty /* line, use /* Comment...\n" . $hereprev);
+		}
+
+# Block comments use * on subsequent lines
+		if ($prevline =~ /$;[ \t]*$/ &&			#ends in comment
+		    $prevrawline =~ /^\+.*?\/\*/ &&		#starting /*
+		    $prevrawline !~ /\*\/[ \t]*$/ &&		#no trailing */
+		    $rawline =~ /^\+/ &&			#line is new
+		    $rawline !~ /^\+[ \t]*\*/) {		#no leading *
+			WARN("BLOCK_COMMENT_STYLE",
+			     "Block comments use * on subsequent lines\n" . $hereprev);
+		}
+
+# Block comments use */ on trailing lines
+		if ($rawline !~ m@^\+[ \t]*\*/[ \t]*$@ &&	#trailing */
+		    $rawline !~ m@^\+.*/\*.*\*/[ \t]*$@ &&	#inline /*...*/
+		    $rawline !~ m@^\+.*\*{2,}/[ \t]*$@ &&	#trailing **/
+		    $rawline =~ m@^\+[ \t]*.+\*\/[ \t]*$@) {	#non blank */
+			WARN("BLOCK_COMMENT_STYLE",
+			     "Block comments use a trailing */ on a separate line\n" . $herecurr);
+		}
+
+# Block comment * alignment
+		if ($prevline =~ /$;[ \t]*$/ &&			#ends in comment
+		    $line =~ /^\+[ \t]*$;/ &&			#leading comment
+		    $rawline =~ /^\+[ \t]*\*/ &&		#leading *
+		    (($prevrawline =~ /^\+.*?\/\*/ &&		#leading /*
+		      $prevrawline !~ /\*\/[ \t]*$/) ||		#no trailing */
+		     $prevrawline =~ /^\+[ \t]*\*/)) {		#leading *
+			my $oldindent;
+			$prevrawline =~ m@^\+([ \t]*/?)\*@;
+			if (defined($1)) {
+				$oldindent = expand_tabs($1);
+			} else {
+				$prevrawline =~ m@^\+(.*/?)\*@;
+				$oldindent = expand_tabs($1);
+			}
+			$rawline =~ m@^\+([ \t]*)\*@;
+			my $newindent = $1;
+			$newindent = expand_tabs($newindent);
+			if (length($oldindent) ne length($newindent)) {
+				WARN("BLOCK_COMMENT_STYLE",
+				     "Block comments should align the * on each line\n" . $hereprev);
+			}
+		}
+
+# check for missing blank lines after struct/union declarations
+# with exceptions for various attributes and macros
+		if ($prevline =~ /^[\+ ]};?\s*$/ &&
+		    $line =~ /^\+/ &&
+		    !($line =~ /^\+\s*$/ ||
+		      $line =~ /^\+\s*EXPORT_SYMBOL/ ||
+		      $line =~ /^\+\s*MODULE_/i ||
+		      $line =~ /^\+\s*\#\s*(?:end|elif|else)/ ||
+		      $line =~ /^\+[a-z_]*init/ ||
+		      $line =~ /^\+\s*(?:static\s+)?[A-Z_]*ATTR/ ||
+		      $line =~ /^\+\s*DECLARE/ ||
+		      $line =~ /^\+\s*__setup/)) {
+			if (CHK("LINE_SPACING",
+				"Please use a blank line after function/struct/union/enum declarations\n" . $hereprev) &&
+			    $fix) {
+				fix_insert_line($fixlinenr, "\+");
+			}
+		}
+
+# check for multiple consecutive blank lines
+		if ($prevline =~ /^[\+ ]\s*$/ &&
+		    $line =~ /^\+\s*$/ &&
+		    $last_blank_line != ($linenr - 1)) {
+			if (CHK("LINE_SPACING",
+				"Please don't use multiple blank lines\n" . $hereprev) &&
+			    $fix) {
+				fix_delete_line($fixlinenr, $rawline);
+			}
+
+			$last_blank_line = $linenr;
+		}
+
+# check for missing blank lines after declarations
+		if ($sline =~ /^\+\s+\S/ &&			#Not at char 1
+			# actual declarations
+		    ($prevline =~ /^\+\s+$Declare\s*$Ident\s*[=,;:\[]/ ||
+			# function pointer declarations
+		     $prevline =~ /^\+\s+$Declare\s*\(\s*\*\s*$Ident\s*\)\s*[=,;:\[\(]/ ||
+			# foo bar; where foo is some local typedef or #define
+		     $prevline =~ /^\+\s+$Ident(?:\s+|\s*\*\s*)$Ident\s*[=,;\[]/ ||
+			# known declaration macros
+		     $prevline =~ /^\+\s+$declaration_macros/) &&
+			# for "else if" which can look like "$Ident $Ident"
+		    !($prevline =~ /^\+\s+$c90_Keywords\b/ ||
+			# other possible extensions of declaration lines
+		      $prevline =~ /(?:$Compare|$Assignment|$Operators)\s*$/ ||
+			# not starting a section or a macro "\" extended line
+		      $prevline =~ /(?:\{\s*|\\)$/) &&
+			# looks like a declaration
+		    !($sline =~ /^\+\s+$Declare\s*$Ident\s*[=,;:\[]/ ||
+			# function pointer declarations
+		      $sline =~ /^\+\s+$Declare\s*\(\s*\*\s*$Ident\s*\)\s*[=,;:\[\(]/ ||
+			# foo bar; where foo is some local typedef or #define
+		      $sline =~ /^\+\s+$Ident(?:\s+|\s*\*\s*)$Ident\s*[=,;\[]/ ||
+			# known declaration macros
+		      $sline =~ /^\+\s+$declaration_macros/ ||
+			# start of struct or union or enum
+		      $sline =~ /^\+\s+(?:union|struct|enum|typedef)\b/ ||
+			# start or end of block or continuation of declaration
+		      $sline =~ /^\+\s+(?:$|[\{\}\.\#\"\?\:\(\[])/ ||
+			# bitfield continuation
+		      $sline =~ /^\+\s+$Ident\s*:\s*\d+\s*[,;]/ ||
+			# other possible extensions of declaration lines
+		      $sline =~ /^\+\s+\(?\s*(?:$Compare|$Assignment|$Operators)/) &&
+			# indentation of previous and current line are the same
+		    (($prevline =~ /\+(\s+)\S/) && $sline =~ /^\+$1\S/)) {
+			if (WARN("LINE_SPACING",
+				 "Missing a blank line after declarations\n" . $hereprev) &&
+			    $fix) {
+				fix_insert_line($fixlinenr, "\+");
+			}
+		}
+
+# check for spaces at the beginning of a line.
+# Exceptions:
+#  1) within comments
+#  2) indented preprocessor commands
+#  3) hanging labels
+		if ($rawline =~ /^\+ / && $line !~ /^\+ *(?:$;|#|$Ident:)/)  {
+			my $herevet = "$here\n" . cat_vet($rawline) . "\n";
+			if (WARN("LEADING_SPACE",
+				 "please, no spaces at the start of a line\n" . $herevet) &&
+			    $fix) {
+				$fixed[$fixlinenr] =~ s/^\+([ \t]+)/"\+" . tabify($1)/e;
+			}
+		}
+
+# check we are in a valid C source file if not then ignore this hunk
+		next if ($realfile !~ /\.(h|c)$/);
+
+# check indentation of any line with a bare else
+# (but not if it is a multiple line "if (foo) return bar; else return baz;")
+# if the previous line is a break or return and is indented 1 tab more...
+		if ($sline =~ /^\+([\t]+)(?:}[ \t]*)?else(?:[ \t]*{)?\s*$/) {
+			my $tabs = length($1) + 1;
+			if ($prevline =~ /^\+\t{$tabs,$tabs}break\b/ ||
+			    ($prevline =~ /^\+\t{$tabs,$tabs}return\b/ &&
+			     defined $lines[$linenr] &&
+			     $lines[$linenr] !~ /^[ \+]\t{$tabs,$tabs}return/)) {
+				WARN("UNNECESSARY_ELSE",
+				     "else is not generally useful after a break or return\n" . $hereprev);
+			}
+		}
+
+# check indentation of a line with a break;
+# if the previous line is a goto or return and is indented the same # of tabs
+		if ($sline =~ /^\+([\t]+)break\s*;\s*$/) {
+			my $tabs = $1;
+			if ($prevline =~ /^\+$tabs(?:goto|return)\b/) {
+				WARN("UNNECESSARY_BREAK",
+				     "break is not useful after a goto or return\n" . $hereprev);
+			}
+		}
+
+# discourage the addition of CONFIG_EXPERIMENTAL in #if(def).
+		if ($line =~ /^\+\s*\#\s*if.*\bCONFIG_EXPERIMENTAL\b/) {
+			WARN("CONFIG_EXPERIMENTAL",
+			     "Use of CONFIG_EXPERIMENTAL is deprecated. For alternatives, see https://lkml.org/lkml/2012/10/23/580\n");
+		}
+
+# check for RCS/CVS revision markers
+		if ($rawline =~ /^\+.*\$(Revision|Log|Id)(?:\$|)/) {
+			WARN("CVS_KEYWORD",
+			     "CVS style keyword markers, these will _not_ be updated\n". $herecurr);
+		}
+
+# Blackfin: don't use __builtin_bfin_[cs]sync
+		if ($line =~ /__builtin_bfin_csync/) {
+			my $herevet = "$here\n" . cat_vet($line) . "\n";
+			ERROR("CSYNC",
+			      "use the CSYNC() macro in asm/blackfin.h\n" . $herevet);
+		}
+		if ($line =~ /__builtin_bfin_ssync/) {
+			my $herevet = "$here\n" . cat_vet($line) . "\n";
+			ERROR("SSYNC",
+			      "use the SSYNC() macro in asm/blackfin.h\n" . $herevet);
+		}
+
+# check for old HOTPLUG __dev<foo> section markings
+		if ($line =~ /\b(__dev(init|exit)(data|const|))\b/) {
+			WARN("HOTPLUG_SECTION",
+			     "Using $1 is unnecessary\n" . $herecurr);
+		}
+
+# Check for potential 'bare' types
+		my ($stat, $cond, $line_nr_next, $remain_next, $off_next,
+		    $realline_next);
+#print "LINE<$line>\n";
+		if ($linenr >= $suppress_statement &&
+		    $realcnt && $sline =~ /.\s*\S/) {
+			($stat, $cond, $line_nr_next, $remain_next, $off_next) =
+				ctx_statement_block($linenr, $realcnt, 0);
+			$stat =~ s/\n./\n /g;
+			$cond =~ s/\n./\n /g;
+
+#print "linenr<$linenr> <$stat>\n";
+			# If this statement has no statement boundaries within
+			# it there is no point in retrying a statement scan
+			# until we hit end of it.
+			my $frag = $stat; $frag =~ s/;+\s*$//;
+			if ($frag !~ /(?:{|;)/) {
+#print "skip<$line_nr_next>\n";
+				$suppress_statement = $line_nr_next;
+			}
+
+			# Find the real next line.
+			$realline_next = $line_nr_next;
+			if (defined $realline_next &&
+			    (!defined $lines[$realline_next - 1] ||
+			     substr($lines[$realline_next - 1], $off_next) =~ /^\s*$/)) {
+				$realline_next++;
+			}
+
+			my $s = $stat;
+			$s =~ s/{.*$//s;
+
+			# Ignore goto labels.
+			if ($s =~ /$Ident:\*$/s) {
+
+			# Ignore functions being called
+			} elsif ($s =~ /^.\s*$Ident\s*\(/s) {
+
+			} elsif ($s =~ /^.\s*else\b/s) {
+
+			# declarations always start with types
+			} elsif ($prev_values eq 'E' && $s =~ /^.\s*(?:$Storage\s+)?(?:$Inline\s+)?(?:const\s+)?((?:\s*$Ident)+?)\b(?:\s+$Sparse)?\s*\**\s*(?:$Ident|\(\*[^\)]*\))(?:\s*$Modifier)?\s*(?:;|=|,|\()/s) {
+				my $type = $1;
+				$type =~ s/\s+/ /g;
+				possible($type, "A:" . $s);
+
+			# definitions in global scope can only start with types
+			} elsif ($s =~ /^.(?:$Storage\s+)?(?:$Inline\s+)?(?:const\s+)?($Ident)\b\s*(?!:)/s) {
+				possible($1, "B:" . $s);
+			}
+
+			# any (foo ... *) is a pointer cast, and foo is a type
+			while ($s =~ /\(($Ident)(?:\s+$Sparse)*[\s\*]+\s*\)/sg) {
+				possible($1, "C:" . $s);
+			}
+
+			# Check for any sort of function declaration.
+			# int foo(something bar, other baz);
+			# void (*store_gdt)(x86_descr_ptr *);
+			if ($prev_values eq 'E' && $s =~ /^(.(?:typedef\s*)?(?:(?:$Storage|$Inline)\s*)*\s*$Type\s*(?:\b$Ident|\(\*\s*$Ident\))\s*)\(/s) {
+				my ($name_len) = length($1);
+
+				my $ctx = $s;
+				substr($ctx, 0, $name_len + 1, '');
+				$ctx =~ s/\)[^\)]*$//;
+
+				for my $arg (split(/\s*,\s*/, $ctx)) {
+					if ($arg =~ /^(?:const\s+)?($Ident)(?:\s+$Sparse)*\s*\**\s*(:?\b$Ident)?$/s || $arg =~ /^($Ident)$/s) {
+
+						possible($1, "D:" . $s);
+					}
+				}
+			}
+
+		}
+
+#
+# Checks which may be anchored in the context.
+#
+
+# Check for switch () and associated case and default
+# statements should be at the same indent.
+		if ($line=~/\bswitch\s*\(.*\)/) {
+			my $err = '';
+			my $sep = '';
+			my @ctx = ctx_block_outer($linenr, $realcnt);
+			shift(@ctx);
+			for my $ctx (@ctx) {
+				my ($clen, $cindent) = line_stats($ctx);
+				if ($ctx =~ /^\+\s*(case\s+|default:)/ &&
+							$indent != $cindent) {
+					$err .= "$sep$ctx\n";
+					$sep = '';
+				} else {
+					$sep = "[...]\n";
+				}
+			}
+			if ($err ne '') {
+				ERROR("SWITCH_CASE_INDENT_LEVEL",
+				      "switch and case should be at the same indent\n$hereline$err");
+			}
+		}
+
+# if/while/etc brace do not go on next line, unless defining a do while loop,
+# or if that brace on the next line is for something else
+		if ($line =~ /(.*)\b((?:if|while|for|switch|(?:[a-z_]+|)for_each[a-z_]+)\s*\(|do\b|else\b)/ && $line !~ /^.\s*\#/) {
+			my $pre_ctx = "$1$2";
+
+			my ($level, @ctx) = ctx_statement_level($linenr, $realcnt, 0);
+
+			if ($line =~ /^\+\t{6,}/) {
+				WARN("DEEP_INDENTATION",
+				     "Too many leading tabs - consider code refactoring\n" . $herecurr);
+			}
+
+			my $ctx_cnt = $realcnt - $#ctx - 1;
+			my $ctx = join("\n", @ctx);
+
+			my $ctx_ln = $linenr;
+			my $ctx_skip = $realcnt;
+
+			while ($ctx_skip > $ctx_cnt || ($ctx_skip == $ctx_cnt &&
+					defined $lines[$ctx_ln - 1] &&
+					$lines[$ctx_ln - 1] =~ /^-/)) {
+				##print "SKIP<$ctx_skip> CNT<$ctx_cnt>\n";
+				$ctx_skip-- if (!defined $lines[$ctx_ln - 1] || $lines[$ctx_ln - 1] !~ /^-/);
+				$ctx_ln++;
+			}
+
+			#print "realcnt<$realcnt> ctx_cnt<$ctx_cnt>\n";
+			#print "pre<$pre_ctx>\nline<$line>\nctx<$ctx>\nnext<$lines[$ctx_ln - 1]>\n";
+
+			if ($ctx !~ /{\s*/ && defined($lines[$ctx_ln - 1]) && $lines[$ctx_ln - 1] =~ /^\+\s*{/) {
+				ERROR("OPEN_BRACE",
+				      "that open brace { should be on the previous line\n" .
+					"$here\n$ctx\n$rawlines[$ctx_ln - 1]\n");
+			}
+			if ($level == 0 && $pre_ctx !~ /}\s*while\s*\($/ &&
+			    $ctx =~ /\)\s*\;\s*$/ &&
+			    defined $lines[$ctx_ln - 1])
+			{
+				my ($nlength, $nindent) = line_stats($lines[$ctx_ln - 1]);
+				if ($nindent > $indent) {
+					WARN("TRAILING_SEMICOLON",
+					     "trailing semicolon indicates no statements, indent implies otherwise\n" .
+						"$here\n$ctx\n$rawlines[$ctx_ln - 1]\n");
+				}
+			}
+		}
+
+# Check relative indent for conditionals and blocks.
+		if ($line =~ /\b(?:(?:if|while|for|(?:[a-z_]+|)for_each[a-z_]+)\s*\(|do\b)/ && $line !~ /^.\s*#/ && $line !~ /\}\s*while\s*/) {
+			($stat, $cond, $line_nr_next, $remain_next, $off_next) =
+				ctx_statement_block($linenr, $realcnt, 0)
+					if (!defined $stat);
+			my ($s, $c) = ($stat, $cond);
+
+			substr($s, 0, length($c), '');
+
+			# remove inline comments
+			$s =~ s/$;/ /g;
+			$c =~ s/$;/ /g;
+
+			# Find out how long the conditional actually is.
+			my @newlines = ($c =~ /\n/gs);
+			my $cond_lines = 1 + $#newlines;
+
+			# Make sure we remove the line prefixes as we have
+			# none on the first line, and are going to readd them
+			# where necessary.
+			$s =~ s/\n./\n/gs;
+			while ($s =~ /\n\s+\\\n/) {
+				$cond_lines += $s =~ s/\n\s+\\\n/\n/g;
+			}
+
+			# We want to check the first line inside the block
+			# starting at the end of the conditional, so remove:
+			#  1) any blank line termination
+			#  2) any opening brace { on end of the line
+			#  3) any do (...) {
+			my $continuation = 0;
+			my $check = 0;
+			$s =~ s/^.*\bdo\b//;
+			$s =~ s/^\s*{//;
+			if ($s =~ s/^\s*\\//) {
+				$continuation = 1;
+			}
+			if ($s =~ s/^\s*?\n//) {
+				$check = 1;
+				$cond_lines++;
+			}
+
+			# Also ignore a loop construct at the end of a
+			# preprocessor statement.
+			if (($prevline =~ /^.\s*#\s*define\s/ ||
+			    $prevline =~ /\\\s*$/) && $continuation == 0) {
+				$check = 0;
+			}
+
+			my $cond_ptr = -1;
+			$continuation = 0;
+			while ($cond_ptr != $cond_lines) {
+				$cond_ptr = $cond_lines;
+
+				# If we see an #else/#elif then the code
+				# is not linear.
+				if ($s =~ /^\s*\#\s*(?:else|elif)/) {
+					$check = 0;
+				}
+
+				# Ignore:
+				#  1) blank lines, they should be at 0,
+				#  2) preprocessor lines, and
+				#  3) labels.
+				if ($continuation ||
+				    $s =~ /^\s*?\n/ ||
+				    $s =~ /^\s*#\s*?/ ||
+				    $s =~ /^\s*$Ident\s*:/) {
+					$continuation = ($s =~ /^.*?\\\n/) ? 1 : 0;
+					if ($s =~ s/^.*?\n//) {
+						$cond_lines++;
+					}
+				}
+			}
+
+			my (undef, $sindent) = line_stats("+" . $s);
+			my $stat_real = raw_line($linenr, $cond_lines);
+
+			# Check if either of these lines are modified, else
+			# this is not this patch's fault.
+			if (!defined($stat_real) ||
+			    $stat !~ /^\+/ && $stat_real !~ /^\+/) {
+				$check = 0;
+			}
+			if (defined($stat_real) && $cond_lines > 1) {
+				$stat_real = "[...]\n$stat_real";
+			}
+
+			#print "line<$line> prevline<$prevline> indent<$indent> sindent<$sindent> check<$check> continuation<$continuation> s<$s> cond_lines<$cond_lines> stat_real<$stat_real> stat<$stat>\n";
+
+			if ($check && $s ne '' &&
+			    (($sindent % 8) != 0 ||
+			     ($sindent < $indent) ||
+			     ($sindent > $indent + 8))) {
+				WARN("SUSPECT_CODE_INDENT",
+				     "suspect code indent for conditional statements ($indent, $sindent)\n" . $herecurr . "$stat_real\n");
+			}
+		}
+
+		# Track the 'values' across context and added lines.
+		my $opline = $line; $opline =~ s/^./ /;
+		my ($curr_values, $curr_vars) =
+				annotate_values($opline . "\n", $prev_values);
+		$curr_values = $prev_values . $curr_values;
+		if ($dbg_values) {
+			my $outline = $opline; $outline =~ s/\t/ /g;
+			print "$linenr > .$outline\n";
+			print "$linenr > $curr_values\n";
+			print "$linenr >  $curr_vars\n";
+		}
+		$prev_values = substr($curr_values, -1);
+
+#ignore lines not being added
+		next if ($line =~ /^[^\+]/);
+
+# check for declarations of signed or unsigned without int
+		while ($line =~ m{\b($Declare)\s*(?!char\b|short\b|int\b|long\b)\s*($Ident)?\s*[=,;\[\)\(]}g) {
+			my $type = $1;
+			my $var = $2;
+			$var = "" if (!defined $var);
+			if ($type =~ /^(?:(?:$Storage|$Inline|$Attribute)\s+)*((?:un)?signed)((?:\s*\*)*)\s*$/) {
+				my $sign = $1;
+				my $pointer = $2;
+
+				$pointer = "" if (!defined $pointer);
+
+				if (WARN("UNSPECIFIED_INT",
+					 "Prefer '" . trim($sign) . " int" . rtrim($pointer) . "' to bare use of '$sign" . rtrim($pointer) . "'\n" . $herecurr) &&
+				    $fix) {
+					my $decl = trim($sign) . " int ";
+					my $comp_pointer = $pointer;
+					$comp_pointer =~ s/\s//g;
+					$decl .= $comp_pointer;
+					$decl = rtrim($decl) if ($var eq "");
+					$fixed[$fixlinenr] =~ s@\b$sign\s*\Q$pointer\E\s*$var\b@$decl$var@;
+				}
+			}
+		}
+
+# TEST: allow direct testing of the type matcher.
+		if ($dbg_type) {
+			if ($line =~ /^.\s*$Declare\s*$/) {
+				ERROR("TEST_TYPE",
+				      "TEST: is type\n" . $herecurr);
+			} elsif ($dbg_type > 1 && $line =~ /^.+($Declare)/) {
+				ERROR("TEST_NOT_TYPE",
+				      "TEST: is not type ($1 is)\n". $herecurr);
+			}
+			next;
+		}
+# TEST: allow direct testing of the attribute matcher.
+		if ($dbg_attr) {
+			if ($line =~ /^.\s*$Modifier\s*$/) {
+				ERROR("TEST_ATTR",
+				      "TEST: is attr\n" . $herecurr);
+			} elsif ($dbg_attr > 1 && $line =~ /^.+($Modifier)/) {
+				ERROR("TEST_NOT_ATTR",
+				      "TEST: is not attr ($1 is)\n". $herecurr);
+			}
+			next;
+		}
+
+# check for initialisation to aggregates open brace on the next line
+		if ($line =~ /^.\s*{/ &&
+		    $prevline =~ /(?:^|[^=])=\s*$/) {
+			if (ERROR("OPEN_BRACE",
+				  "that open brace { should be on the previous line\n" . $hereprev) &&
+			    $fix && $prevline =~ /^\+/ && $line =~ /^\+/) {
+				fix_delete_line($fixlinenr - 1, $prevrawline);
+				fix_delete_line($fixlinenr, $rawline);
+				my $fixedline = $prevrawline;
+				$fixedline =~ s/\s*=\s*$/ = {/;
+				fix_insert_line($fixlinenr, $fixedline);
+				$fixedline = $line;
+				$fixedline =~ s/^(.\s*){\s*/$1/;
+				fix_insert_line($fixlinenr, $fixedline);
+			}
+		}
+
+#
+# Checks which are anchored on the added line.
+#
+
+# check for malformed paths in #include statements (uses RAW line)
+		if ($rawline =~ m{^.\s*\#\s*include\s+[<"](.*)[">]}) {
+			my $path = $1;
+			if ($path =~ m{//}) {
+				ERROR("MALFORMED_INCLUDE",
+				      "malformed #include filename\n" . $herecurr);
+			}
+			if ($path =~ "^uapi/" && $realfile =~ m@\binclude/uapi/@) {
+				ERROR("UAPI_INCLUDE",
+				      "No #include in ...include/uapi/... should use a uapi/ path prefix\n" . $herecurr);
+			}
+		}
+
+# no C99 // comments
+		if ($line =~ m{//}) {
+			if (ERROR("C99_COMMENTS",
+				  "do not use C99 // comments\n" . $herecurr) &&
+			    $fix) {
+				my $line = $fixed[$fixlinenr];
+				if ($line =~ /\/\/(.*)$/) {
+					my $comment = trim($1);
+					$fixed[$fixlinenr] =~ s@\/\/(.*)$@/\* $comment \*/@;
+				}
+			}
+		}
+		# Remove C99 comments.
+		$line =~ s@//.*@@;
+		$opline =~ s@//.*@@;
+
+# EXPORT_SYMBOL should immediately follow the thing it is exporting, consider
+# the whole statement.
+#print "APW <$lines[$realline_next - 1]>\n";
+		if (defined $realline_next &&
+		    exists $lines[$realline_next - 1] &&
+		    !defined $suppress_export{$realline_next} &&
+		    ($lines[$realline_next - 1] =~ /EXPORT_SYMBOL.*\((.*)\)/ ||
+		     $lines[$realline_next - 1] =~ /EXPORT_UNUSED_SYMBOL.*\((.*)\)/)) {
+			# Handle definitions which produce identifiers with
+			# a prefix:
+			#   XXX(foo);
+			#   EXPORT_SYMBOL(something_foo);
+			my $name = $1;
+			if ($stat =~ /^(?:.\s*}\s*\n)?.([A-Z_]+)\s*\(\s*($Ident)/ &&
+			    $name =~ /^${Ident}_$2/) {
+#print "FOO C name<$name>\n";
+				$suppress_export{$realline_next} = 1;
+
+			} elsif ($stat !~ /(?:
+				\n.}\s*$|
+				^.DEFINE_$Ident\(\Q$name\E\)|
+				^.DECLARE_$Ident\(\Q$name\E\)|
+				^.LIST_HEAD\(\Q$name\E\)|
+				^.(?:$Storage\s+)?$Type\s*\(\s*\*\s*\Q$name\E\s*\)\s*\(|
+				\b\Q$name\E(?:\s+$Attribute)*\s*(?:;|=|\[|\()
+			    )/x) {
+#print "FOO A<$lines[$realline_next - 1]> stat<$stat> name<$name>\n";
+				$suppress_export{$realline_next} = 2;
+			} else {
+				$suppress_export{$realline_next} = 1;
+			}
+		}
+		if (!defined $suppress_export{$linenr} &&
+		    $prevline =~ /^.\s*$/ &&
+		    ($line =~ /EXPORT_SYMBOL.*\((.*)\)/ ||
+		     $line =~ /EXPORT_UNUSED_SYMBOL.*\((.*)\)/)) {
+#print "FOO B <$lines[$linenr - 1]>\n";
+			$suppress_export{$linenr} = 2;
+		}
+		if (defined $suppress_export{$linenr} &&
+		    $suppress_export{$linenr} == 2) {
+			WARN("EXPORT_SYMBOL",
+			     "EXPORT_SYMBOL(foo); should immediately follow its function/variable\n" . $herecurr);
+		}
+
+# check for global initialisers.
+		if ($line =~ /^\+$Type\s*$Ident(?:\s+$Modifier)*\s*=\s*($zero_initializer)\s*;/) {
+			if (ERROR("GLOBAL_INITIALISERS",
+				  "do not initialise globals to $1\n" . $herecurr) &&
+			    $fix) {
+				$fixed[$fixlinenr] =~ s/(^.$Type\s*$Ident(?:\s+$Modifier)*)\s*=\s*$zero_initializer\s*;/$1;/;
+			}
+		}
+# check for static initialisers.
+		if ($line =~ /^\+.*\bstatic\s.*=\s*($zero_initializer)\s*;/) {
+			if (ERROR("INITIALISED_STATIC",
+				  "do not initialise statics to $1\n" .
+				      $herecurr) &&
+			    $fix) {
+				$fixed[$fixlinenr] =~ s/(\bstatic\s.*?)\s*=\s*$zero_initializer\s*;/$1;/;
+			}
+		}
+
+# check for misordered declarations of char/short/int/long with signed/unsigned
+		while ($sline =~ m{(\b$TypeMisordered\b)}g) {
+			my $tmp = trim($1);
+			WARN("MISORDERED_TYPE",
+			     "type '$tmp' should be specified in [[un]signed] [short|int|long|long long] order\n" . $herecurr);
+		}
+
+# check for static const char * arrays.
+		if ($line =~ /\bstatic\s+const\s+char\s*\*\s*(\w+)\s*\[\s*\]\s*=\s*/) {
+			WARN("STATIC_CONST_CHAR_ARRAY",
+			     "static const char * array should probably be static const char * const\n" .
+				$herecurr);
+               }
+
+# check for static char foo[] = "bar" declarations.
+		if ($line =~ /\bstatic\s+char\s+(\w+)\s*\[\s*\]\s*=\s*"/) {
+			WARN("STATIC_CONST_CHAR_ARRAY",
+			     "static char array declaration should probably be static const char\n" .
+				$herecurr);
+               }
+
+# check for const <foo> const where <foo> is not a pointer or array type
+		if ($sline =~ /\bconst\s+($BasicType)\s+const\b/) {
+			my $found = $1;
+			if ($sline =~ /\bconst\s+\Q$found\E\s+const\b\s*\*/) {
+				WARN("CONST_CONST",
+				     "'const $found const *' should probably be 'const $found * const'\n" . $herecurr);
+			} elsif ($sline !~ /\bconst\s+\Q$found\E\s+const\s+\w+\s*\[/) {
+				WARN("CONST_CONST",
+				     "'const $found const' should probably be 'const $found'\n" . $herecurr);
+			}
+		}
+
+# check for non-global char *foo[] = {"bar", ...} declarations.
+		if ($line =~ /^.\s+(?:static\s+|const\s+)?char\s+\*\s*\w+\s*\[\s*\]\s*=\s*\{/) {
+			WARN("STATIC_CONST_CHAR_ARRAY",
+			     "char * array declaration might be better as static const\n" .
+				$herecurr);
+               }
+
+# check for sizeof(foo)/sizeof(foo[0]) that could be ARRAY_SIZE(foo)
+		if ($line =~ m@\bsizeof\s*\(\s*($Lval)\s*\)@) {
+			my $array = $1;
+			if ($line =~ m@\b(sizeof\s*\(\s*\Q$array\E\s*\)\s*/\s*sizeof\s*\(\s*\Q$array\E\s*\[\s*0\s*\]\s*\))@) {
+				my $array_div = $1;
+				if (WARN("ARRAY_SIZE",
+					 "Prefer ARRAY_SIZE($array)\n" . $herecurr) &&
+				    $fix) {
+					$fixed[$fixlinenr] =~ s/\Q$array_div\E/ARRAY_SIZE($array)/;
+				}
+			}
+		}
+
+# check for function declarations without arguments like "int foo()"
+		if ($line =~ /(\b$Type\s+$Ident)\s*\(\s*\)/) {
+			if (ERROR("FUNCTION_WITHOUT_ARGS",
+				  "Bad function definition - $1() should probably be $1(void)\n" . $herecurr) &&
+			    $fix) {
+				$fixed[$fixlinenr] =~ s/(\b($Type)\s+($Ident))\s*\(\s*\)/$2 $3(void)/;
+			}
+		}
+
+# check for new typedefs, only function parameters and sparse annotations
+# make sense.
+		if ($line =~ /\btypedef\s/ &&
+		    $line !~ /\btypedef\s+$Type\s*\(\s*\*?$Ident\s*\)\s*\(/ &&
+		    $line !~ /\btypedef\s+$Type\s+$Ident\s*\(/ &&
+		    $line !~ /\b$typeTypedefs\b/ &&
+		    $line !~ /\b__bitwise(?:__|)\b/) {
+			WARN("NEW_TYPEDEFS",
+			     "do not add new typedefs\n" . $herecurr);
+		}
+
+# * goes on variable not on type
+		# (char*[ const])
+		while ($line =~ m{(\($NonptrType(\s*(?:$Modifier\b\s*|\*\s*)+)\))}g) {
+			#print "AA<$1>\n";
+			my ($ident, $from, $to) = ($1, $2, $2);
+
+			# Should start with a space.
+			$to =~ s/^(\S)/ $1/;
+			# Should not end with a space.
+			$to =~ s/\s+$//;
+			# '*'s should not have spaces between.
+			while ($to =~ s/\*\s+\*/\*\*/) {
+			}
+
+##			print "1: from<$from> to<$to> ident<$ident>\n";
+			if ($from ne $to) {
+				if (ERROR("POINTER_LOCATION",
+					  "\"(foo$from)\" should be \"(foo$to)\"\n" .  $herecurr) &&
+				    $fix) {
+					my $sub_from = $ident;
+					my $sub_to = $ident;
+					$sub_to =~ s/\Q$from\E/$to/;
+					$fixed[$fixlinenr] =~
+					    s@\Q$sub_from\E@$sub_to@;
+				}
+			}
+		}
+		while ($line =~ m{(\b$NonptrType(\s*(?:$Modifier\b\s*|\*\s*)+)($Ident))}g) {
+			#print "BB<$1>\n";
+			my ($match, $from, $to, $ident) = ($1, $2, $2, $3);
+
+			# Should start with a space.
+			$to =~ s/^(\S)/ $1/;
+			# Should not end with a space.
+			$to =~ s/\s+$//;
+			# '*'s should not have spaces between.
+			while ($to =~ s/\*\s+\*/\*\*/) {
+			}
+			# Modifiers should have spaces.
+			$to =~ s/(\b$Modifier$)/$1 /;
+
+##			print "2: from<$from> to<$to> ident<$ident>\n";
+			if ($from ne $to && $ident !~ /^$Modifier$/) {
+				if (ERROR("POINTER_LOCATION",
+					  "\"foo${from}bar\" should be \"foo${to}bar\"\n" .  $herecurr) &&
+				    $fix) {
+
+					my $sub_from = $match;
+					my $sub_to = $match;
+					$sub_to =~ s/\Q$from\E/$to/;
+					$fixed[$fixlinenr] =~
+					    s@\Q$sub_from\E@$sub_to@;
+				}
+			}
+		}
+
+# avoid BUG() or BUG_ON()
+		if ($line =~ /\b(?:BUG|BUG_ON)\b/) {
+			my $msg_type = \&WARN;
+			$msg_type = \&CHK if ($file);
+			&{$msg_type}("AVOID_BUG",
+				     "Avoid crashing the kernel - try using WARN_ON & recovery code rather than BUG() or BUG_ON()\n" . $herecurr);
+		}
+
+# avoid LINUX_VERSION_CODE
+		if ($line =~ /\bLINUX_VERSION_CODE\b/) {
+			WARN("LINUX_VERSION_CODE",
+			     "LINUX_VERSION_CODE should be avoided, code should be for the version to which it is merged\n" . $herecurr);
+		}
+
+# check for uses of printk_ratelimit
+		if ($line =~ /\bprintk_ratelimit\s*\(/) {
+			WARN("PRINTK_RATELIMITED",
+			     "Prefer printk_ratelimited or pr_<level>_ratelimited to printk_ratelimit\n" . $herecurr);
+		}
+
+# printk should use KERN_* levels.  Note that follow on printk's on the
+# same line do not need a level, so we use the current block context
+# to try and find and validate the current printk.  In summary the current
+# printk includes all preceding printk's which have no newline on the end.
+# we assume the first bad printk is the one to report.
+		if ($line =~ /\bprintk\((?!KERN_)\s*"/) {
+			my $ok = 0;
+			for (my $ln = $linenr - 1; $ln >= $first_line; $ln--) {
+				#print "CHECK<$lines[$ln - 1]\n";
+				# we have a preceding printk if it ends
+				# with "\n" ignore it, else it is to blame
+				if ($lines[$ln - 1] =~ m{\bprintk\(}) {
+					if ($rawlines[$ln - 1] !~ m{\\n"}) {
+						$ok = 1;
+					}
+					last;
+				}
+			}
+			if ($ok == 0) {
+				WARN("PRINTK_WITHOUT_KERN_LEVEL",
+				     "printk() should include KERN_ facility level\n" . $herecurr);
+			}
+		}
+
+		if ($line =~ /\bprintk\s*\(\s*KERN_([A-Z]+)/) {
+			my $orig = $1;
+			my $level = lc($orig);
+			$level = "warn" if ($level eq "warning");
+			my $level2 = $level;
+			$level2 = "dbg" if ($level eq "debug");
+			WARN("PREFER_PR_LEVEL",
+			     "Prefer [subsystem eg: netdev]_$level2([subsystem]dev, ... then dev_$level2(dev, ... then pr_$level(...  to printk(KERN_$orig ...\n" . $herecurr);
+		}
+
+		if ($line =~ /\bpr_warning\s*\(/) {
+			if (WARN("PREFER_PR_LEVEL",
+				 "Prefer pr_warn(... to pr_warning(...\n" . $herecurr) &&
+			    $fix) {
+				$fixed[$fixlinenr] =~
+				    s/\bpr_warning\b/pr_warn/;
+			}
+		}
+
+		if ($line =~ /\bdev_printk\s*\(\s*KERN_([A-Z]+)/) {
+			my $orig = $1;
+			my $level = lc($orig);
+			$level = "warn" if ($level eq "warning");
+			$level = "dbg" if ($level eq "debug");
+			WARN("PREFER_DEV_LEVEL",
+			     "Prefer dev_$level(... to dev_printk(KERN_$orig, ...\n" . $herecurr);
+		}
+
+# ENOSYS means "bad syscall nr" and nothing else.  This will have a small
+# number of false positives, but assembly files are not checked, so at
+# least the arch entry code will not trigger this warning.
+		if ($line =~ /\bENOSYS\b/) {
+			WARN("ENOSYS",
+			     "ENOSYS means 'invalid syscall nr' and nothing else\n" . $herecurr);
+		}
+
+# function brace can't be on same line, except for #defines of do while,
+# or if closed on same line
+		if (($line=~/$Type\s*$Ident\(.*\).*\s*{/) and
+		    !($line=~/\#\s*define.*do\s\{/) and !($line=~/}/)) {
+			if (ERROR("OPEN_BRACE",
+				  "open brace '{' following function declarations go on the next line\n" . $herecurr) &&
+			    $fix) {
+				fix_delete_line($fixlinenr, $rawline);
+				my $fixed_line = $rawline;
+				$fixed_line =~ /(^..*$Type\s*$Ident\(.*\)\s*){(.*)$/;
+				my $line1 = $1;
+				my $line2 = $2;
+				fix_insert_line($fixlinenr, ltrim($line1));
+				fix_insert_line($fixlinenr, "\+{");
+				if ($line2 !~ /^\s*$/) {
+					fix_insert_line($fixlinenr, "\+\t" . trim($line2));
+				}
+			}
+		}
+
+# open braces for enum, union and struct go on the same line.
+		if ($line =~ /^.\s*{/ &&
+		    $prevline =~ /^.\s*(?:typedef\s+)?(enum|union|struct)(?:\s+$Ident)?\s*$/) {
+			if (ERROR("OPEN_BRACE",
+				  "open brace '{' following $1 go on the same line\n" . $hereprev) &&
+			    $fix && $prevline =~ /^\+/ && $line =~ /^\+/) {
+				fix_delete_line($fixlinenr - 1, $prevrawline);
+				fix_delete_line($fixlinenr, $rawline);
+				my $fixedline = rtrim($prevrawline) . " {";
+				fix_insert_line($fixlinenr, $fixedline);
+				$fixedline = $rawline;
+				$fixedline =~ s/^(.\s*){\s*/$1\t/;
+				if ($fixedline !~ /^\+\s*$/) {
+					fix_insert_line($fixlinenr, $fixedline);
+				}
+			}
+		}
+
+# missing space after union, struct or enum definition
+		if ($line =~ /^.\s*(?:typedef\s+)?(enum|union|struct)(?:\s+$Ident){1,2}[=\{]/) {
+			if (WARN("SPACING",
+				 "missing space after $1 definition\n" . $herecurr) &&
+			    $fix) {
+				$fixed[$fixlinenr] =~
+				    s/^(.\s*(?:typedef\s+)?(?:enum|union|struct)(?:\s+$Ident){1,2})([=\{])/$1 $2/;
+			}
+		}
+
+# Function pointer declarations
+# check spacing between type, funcptr, and args
+# canonical declaration is "type (*funcptr)(args...)"
+		if ($line =~ /^.\s*($Declare)\((\s*)\*(\s*)($Ident)(\s*)\)(\s*)\(/) {
+			my $declare = $1;
+			my $pre_pointer_space = $2;
+			my $post_pointer_space = $3;
+			my $funcname = $4;
+			my $post_funcname_space = $5;
+			my $pre_args_space = $6;
+
+# the $Declare variable will capture all spaces after the type
+# so check it for a missing trailing missing space but pointer return types
+# don't need a space so don't warn for those.
+			my $post_declare_space = "";
+			if ($declare =~ /(\s+)$/) {
+				$post_declare_space = $1;
+				$declare = rtrim($declare);
+			}
+			if ($declare !~ /\*$/ && $post_declare_space =~ /^$/) {
+				WARN("SPACING",
+				     "missing space after return type\n" . $herecurr);
+				$post_declare_space = " ";
+			}
+
+# unnecessary space "type  (*funcptr)(args...)"
+# This test is not currently implemented because these declarations are
+# equivalent to
+#	int  foo(int bar, ...)
+# and this is form shouldn't/doesn't generate a checkpatch warning.
+#
+#			elsif ($declare =~ /\s{2,}$/) {
+#				WARN("SPACING",
+#				     "Multiple spaces after return type\n" . $herecurr);
+#			}
+
+# unnecessary space "type ( *funcptr)(args...)"
+			if (defined $pre_pointer_space &&
+			    $pre_pointer_space =~ /^\s/) {
+				WARN("SPACING",
+				     "Unnecessary space after function pointer open parenthesis\n" . $herecurr);
+			}
+
+# unnecessary space "type (* funcptr)(args...)"
+			if (defined $post_pointer_space &&
+			    $post_pointer_space =~ /^\s/) {
+				WARN("SPACING",
+				     "Unnecessary space before function pointer name\n" . $herecurr);
+			}
+
+# unnecessary space "type (*funcptr )(args...)"
+			if (defined $post_funcname_space &&
+			    $post_funcname_space =~ /^\s/) {
+				WARN("SPACING",
+				     "Unnecessary space after function pointer name\n" . $herecurr);
+			}
+
+# unnecessary space "type (*funcptr) (args...)"
+			if (defined $pre_args_space &&
+			    $pre_args_space =~ /^\s/) {
+				WARN("SPACING",
+				     "Unnecessary space before function pointer arguments\n" . $herecurr);
+			}
+
+			if (show_type("SPACING") && $fix) {
+				$fixed[$fixlinenr] =~
+				    s/^(.\s*)$Declare\s*\(\s*\*\s*$Ident\s*\)\s*\(/$1 . $declare . $post_declare_space . '(*' . $funcname . ')('/ex;
+			}
+		}
+
+# check for spacing round square brackets; allowed:
+#  1. with a type on the left -- int [] a;
+#  2. at the beginning of a line for slice initialisers -- [0...10] = 5,
+#  3. inside a curly brace -- = { [0...10] = 5 }
+		while ($line =~ /(.*?\s)\[/g) {
+			my ($where, $prefix) = ($-[1], $1);
+			if ($prefix !~ /$Type\s+$/ &&
+			    ($where != 0 || $prefix !~ /^.\s+$/) &&
+			    $prefix !~ /[{,]\s+$/) {
+				if (ERROR("BRACKET_SPACE",
+					  "space prohibited before open square bracket '['\n" . $herecurr) &&
+				    $fix) {
+				    $fixed[$fixlinenr] =~
+					s/^(\+.*?)\s+\[/$1\[/;
+				}
+			}
+		}
+
+# check for spaces between functions and their parentheses.
+		while ($line =~ /($Ident)\s+\(/g) {
+			my $name = $1;
+			my $ctx_before = substr($line, 0, $-[1]);
+			my $ctx = "$ctx_before$name";
+
+			# Ignore those directives where spaces _are_ permitted.
+			if ($name =~ /^(?:
+				if|for|while|switch|return|case|
+				volatile|__volatile__|
+				__attribute__|format|__extension__|
+				asm|__asm__)$/x)
+			{
+			# cpp #define statements have non-optional spaces, ie
+			# if there is a space between the name and the open
+			# parenthesis it is simply not a parameter group.
+			} elsif ($ctx_before =~ /^.\s*\#\s*define\s*$/) {
+
+			# cpp #elif statement condition may start with a (
+			} elsif ($ctx =~ /^.\s*\#\s*elif\s*$/) {
+
+			# If this whole things ends with a type its most
+			# likely a typedef for a function.
+			} elsif ($ctx =~ /$Type$/) {
+
+			} else {
+				if (WARN("SPACING",
+					 "space prohibited between function name and open parenthesis '('\n" . $herecurr) &&
+					     $fix) {
+					$fixed[$fixlinenr] =~
+					    s/\b$name\s+\(/$name\(/;
+				}
+			}
+		}
+
+# Check operator spacing.
+		if (!($line=~/\#\s*include/)) {
+			my $fixed_line = "";
+			my $line_fixed = 0;
+
+			my $ops = qr{
+				<<=|>>=|<=|>=|==|!=|
+				\+=|-=|\*=|\/=|%=|\^=|\|=|&=|
+				=>|->|<<|>>|<|>|=|!|~|
+				&&|\|\||,|\^|\+\+|--|&|\||\+|-|\*|\/|%|
+				\?:|\?|:
+			}x;
+			my @elements = split(/($ops|;)/, $opline);
+
+##			print("element count: <" . $#elements . ">\n");
+##			foreach my $el (@elements) {
+##				print("el: <$el>\n");
+##			}
+
+			my @fix_elements = ();
+			my $off = 0;
+
+			foreach my $el (@elements) {
+				push(@fix_elements, substr($rawline, $off, length($el)));
+				$off += length($el);
+			}
+
+			$off = 0;
+
+			my $blank = copy_spacing($opline);
+			my $last_after = -1;
+
+			for (my $n = 0; $n < $#elements; $n += 2) {
+
+				my $good = $fix_elements[$n] . $fix_elements[$n + 1];
+
+##				print("n: <$n> good: <$good>\n");
+
+				$off += length($elements[$n]);
+
+				# Pick up the preceding and succeeding characters.
+				my $ca = substr($opline, 0, $off);
+				my $cc = '';
+				if (length($opline) >= ($off + length($elements[$n + 1]))) {
+					$cc = substr($opline, $off + length($elements[$n + 1]));
+				}
+				my $cb = "$ca$;$cc";
+
+				my $a = '';
+				$a = 'V' if ($elements[$n] ne '');
+				$a = 'W' if ($elements[$n] =~ /\s$/);
+				$a = 'C' if ($elements[$n] =~ /$;$/);
+				$a = 'B' if ($elements[$n] =~ /(\[|\()$/);
+				$a = 'O' if ($elements[$n] eq '');
+				$a = 'E' if ($ca =~ /^\s*$/);
+
+				my $op = $elements[$n + 1];
+
+				my $c = '';
+				if (defined $elements[$n + 2]) {
+					$c = 'V' if ($elements[$n + 2] ne '');
+					$c = 'W' if ($elements[$n + 2] =~ /^\s/);
+					$c = 'C' if ($elements[$n + 2] =~ /^$;/);
+					$c = 'B' if ($elements[$n + 2] =~ /^(\)|\]|;)/);
+					$c = 'O' if ($elements[$n + 2] eq '');
+					$c = 'E' if ($elements[$n + 2] =~ /^\s*\\$/);
+				} else {
+					$c = 'E';
+				}
+
+				my $ctx = "${a}x${c}";
+
+				my $at = "(ctx:$ctx)";
+
+				my $ptr = substr($blank, 0, $off) . "^";
+				my $hereptr = "$hereline$ptr\n";
+
+				# Pull out the value of this operator.
+				my $op_type = substr($curr_values, $off + 1, 1);
+
+				# Get the full operator variant.
+				my $opv = $op . substr($curr_vars, $off, 1);
+
+				# Ignore operators passed as parameters.
+				if ($op_type ne 'V' &&
+				    $ca =~ /\s$/ && $cc =~ /^\s*[,\)]/) {
+
+#				# Ignore comments
+#				} elsif ($op =~ /^$;+$/) {
+
+				# ; should have either the end of line or a space or \ after it
+				} elsif ($op eq ';') {
+					if ($ctx !~ /.x[WEBC]/ &&
+					    $cc !~ /^\\/ && $cc !~ /^;/) {
+						if (ERROR("SPACING",
+							  "space required after that '$op' $at\n" . $hereptr)) {
+							$good = $fix_elements[$n] . trim($fix_elements[$n + 1]) . " ";
+							$line_fixed = 1;
+						}
+					}
+
+				# // is a comment
+				} elsif ($op eq '//') {
+
+				#   :   when part of a bitfield
+				} elsif ($opv eq ':B') {
+					# skip the bitfield test for now
+
+				# No spaces for:
+				#   ->
+				} elsif ($op eq '->') {
+					if ($ctx =~ /Wx.|.xW/) {
+						if (ERROR("SPACING",
+							  "spaces prohibited around that '$op' $at\n" . $hereptr)) {
+							$good = rtrim($fix_elements[$n]) . trim($fix_elements[$n + 1]);
+							if (defined $fix_elements[$n + 2]) {
+								$fix_elements[$n + 2] =~ s/^\s+//;
+							}
+							$line_fixed = 1;
+						}
+					}
+
+				# , must not have a space before and must have a space on the right.
+				} elsif ($op eq ',') {
+					my $rtrim_before = 0;
+					my $space_after = 0;
+					if ($ctx =~ /Wx./) {
+						if (ERROR("SPACING",
+							  "space prohibited before that '$op' $at\n" . $hereptr)) {
+							$line_fixed = 1;
+							$rtrim_before = 1;
+						}
+					}
+					if ($ctx !~ /.x[WEC]/ && $cc !~ /^}/) {
+						if (ERROR("SPACING",
+							  "space required after that '$op' $at\n" . $hereptr)) {
+							$line_fixed = 1;
+							$last_after = $n;
+							$space_after = 1;
+						}
+					}
+					if ($rtrim_before || $space_after) {
+						if ($rtrim_before) {
+							$good = rtrim($fix_elements[$n]) . trim($fix_elements[$n + 1]);
+						} else {
+							$good = $fix_elements[$n] . trim($fix_elements[$n + 1]);
+						}
+						if ($space_after) {
+							$good .= " ";
+						}
+					}
+
+				# '*' as part of a type definition -- reported already.
+				} elsif ($opv eq '*_') {
+					#warn "'*' is part of type\n";
+
+				# unary operators should have a space before and
+				# none after.  May be left adjacent to another
+				# unary operator, or a cast
+				} elsif ($op eq '!' || $op eq '~' ||
+					 $opv eq '*U' || $opv eq '-U' ||
+					 $opv eq '&U' || $opv eq '&&U') {
+					if ($ctx !~ /[WEBC]x./ && $ca !~ /(?:\)|!|~|\*|-|\&|\||\+\+|\-\-|\{)$/) {
+						if (ERROR("SPACING",
+							  "space required before that '$op' $at\n" . $hereptr)) {
+							if ($n != $last_after + 2) {
+								$good = $fix_elements[$n] . " " . ltrim($fix_elements[$n + 1]);
+								$line_fixed = 1;
+							}
+						}
+					}
+					if ($op eq '*' && $cc =~/\s*$Modifier\b/) {
+						# A unary '*' may be const
+
+					} elsif ($ctx =~ /.xW/) {
+						if (ERROR("SPACING",
+							  "space prohibited after that '$op' $at\n" . $hereptr)) {
+							$good = $fix_elements[$n] . rtrim($fix_elements[$n + 1]);
+							if (defined $fix_elements[$n + 2]) {
+								$fix_elements[$n + 2] =~ s/^\s+//;
+							}
+							$line_fixed = 1;
+						}
+					}
+
+				# unary ++ and unary -- are allowed no space on one side.
+				} elsif ($op eq '++' or $op eq '--') {
+					if ($ctx !~ /[WEOBC]x[^W]/ && $ctx !~ /[^W]x[WOBEC]/) {
+						if (ERROR("SPACING",
+							  "space required one side of that '$op' $at\n" . $hereptr)) {
+							$good = $fix_elements[$n] . trim($fix_elements[$n + 1]) . " ";
+							$line_fixed = 1;
+						}
+					}
+					if ($ctx =~ /Wx[BE]/ ||
+					    ($ctx =~ /Wx./ && $cc =~ /^;/)) {
+						if (ERROR("SPACING",
+							  "space prohibited before that '$op' $at\n" . $hereptr)) {
+							$good = rtrim($fix_elements[$n]) . trim($fix_elements[$n + 1]);
+							$line_fixed = 1;
+						}
+					}
+					if ($ctx =~ /ExW/) {
+						if (ERROR("SPACING",
+							  "space prohibited after that '$op' $at\n" . $hereptr)) {
+							$good = $fix_elements[$n] . trim($fix_elements[$n + 1]);
+							if (defined $fix_elements[$n + 2]) {
+								$fix_elements[$n + 2] =~ s/^\s+//;
+							}
+							$line_fixed = 1;
+						}
+					}
+
+				# << and >> may either have or not have spaces both sides
+				} elsif ($op eq '<<' or $op eq '>>' or
+					 $op eq '&' or $op eq '^' or $op eq '|' or
+					 $op eq '+' or $op eq '-' or
+					 $op eq '*' or $op eq '/' or
+					 $op eq '%')
+				{
+					if ($check) {
+						if (defined $fix_elements[$n + 2] && $ctx !~ /[EW]x[EW]/) {
+							if (CHK("SPACING",
+								"spaces preferred around that '$op' $at\n" . $hereptr)) {
+								$good = rtrim($fix_elements[$n]) . " " . trim($fix_elements[$n + 1]) . " ";
+								$fix_elements[$n + 2] =~ s/^\s+//;
+								$line_fixed = 1;
+							}
+						} elsif (!defined $fix_elements[$n + 2] && $ctx !~ /Wx[OE]/) {
+							if (CHK("SPACING",
+								"space preferred before that '$op' $at\n" . $hereptr)) {
+								$good = rtrim($fix_elements[$n]) . " " . trim($fix_elements[$n + 1]);
+								$line_fixed = 1;
+							}
+						}
+					} elsif ($ctx =~ /Wx[^WCE]|[^WCE]xW/) {
+						if (ERROR("SPACING",
+							  "need consistent spacing around '$op' $at\n" . $hereptr)) {
+							$good = rtrim($fix_elements[$n]) . " " . trim($fix_elements[$n + 1]) . " ";
+							if (defined $fix_elements[$n + 2]) {
+								$fix_elements[$n + 2] =~ s/^\s+//;
+							}
+							$line_fixed = 1;
+						}
+					}
+
+				# A colon needs no spaces before when it is
+				# terminating a case value or a label.
+				} elsif ($opv eq ':C' || $opv eq ':L') {
+					if ($ctx =~ /Wx./) {
+						if (ERROR("SPACING",
+							  "space prohibited before that '$op' $at\n" . $hereptr)) {
+							$good = rtrim($fix_elements[$n]) . trim($fix_elements[$n + 1]);
+							$line_fixed = 1;
+						}
+					}
+
+				# All the others need spaces both sides.
+				} elsif ($ctx !~ /[EWC]x[CWE]/) {
+					my $ok = 0;
+
+					# Ignore email addresses <foo@bar>
+					if (($op eq '<' &&
+					     $cc =~ /^\S+\@\S+>/) ||
+					    ($op eq '>' &&
+					     $ca =~ /<\S+\@\S+$/))
+					{
+					    	$ok = 1;
+					}
+
+					# for asm volatile statements
+					# ignore a colon with another
+					# colon immediately before or after
+					if (($op eq ':') &&
+					    ($ca =~ /:$/ || $cc =~ /^:/)) {
+						$ok = 1;
+					}
+
+					# messages are ERROR, but ?: are CHK
+					if ($ok == 0) {
+						my $msg_type = \&ERROR;
+						$msg_type = \&CHK if (($op eq '?:' || $op eq '?' || $op eq ':') && $ctx =~ /VxV/);
+
+						if (&{$msg_type}("SPACING",
+								 "spaces required around that '$op' $at\n" . $hereptr)) {
+							$good = rtrim($fix_elements[$n]) . " " . trim($fix_elements[$n + 1]) . " ";
+							if (defined $fix_elements[$n + 2]) {
+								$fix_elements[$n + 2] =~ s/^\s+//;
+							}
+							$line_fixed = 1;
+						}
+					}
+				}
+				$off += length($elements[$n + 1]);
+
+##				print("n: <$n> GOOD: <$good>\n");
+
+				$fixed_line = $fixed_line . $good;
+			}
+
+			if (($#elements % 2) == 0) {
+				$fixed_line = $fixed_line . $fix_elements[$#elements];
+			}
+
+			if ($fix && $line_fixed && $fixed_line ne $fixed[$fixlinenr]) {
+				$fixed[$fixlinenr] = $fixed_line;
+			}
+
+
+		}
+
+# check for whitespace before a non-naked semicolon
+		if ($line =~ /^\+.*\S\s+;\s*$/) {
+			if (WARN("SPACING",
+				 "space prohibited before semicolon\n" . $herecurr) &&
+			    $fix) {
+				1 while $fixed[$fixlinenr] =~
+				    s/^(\+.*\S)\s+;/$1;/;
+			}
+		}
+
+# check for multiple assignments
+		if ($line =~ /^.\s*$Lval\s*=\s*$Lval\s*=(?!=)/) {
+			CHK("MULTIPLE_ASSIGNMENTS",
+			    "multiple assignments should be avoided\n" . $herecurr);
+		}
+
+## # check for multiple declarations, allowing for a function declaration
+## # continuation.
+## 		if ($line =~ /^.\s*$Type\s+$Ident(?:\s*=[^,{]*)?\s*,\s*$Ident.*/ &&
+## 		    $line !~ /^.\s*$Type\s+$Ident(?:\s*=[^,{]*)?\s*,\s*$Type\s*$Ident.*/) {
+##
+## 			# Remove any bracketed sections to ensure we do not
+## 			# falsly report the parameters of functions.
+## 			my $ln = $line;
+## 			while ($ln =~ s/\([^\(\)]*\)//g) {
+## 			}
+## 			if ($ln =~ /,/) {
+## 				WARN("MULTIPLE_DECLARATION",
+##				     "declaring multiple variables together should be avoided\n" . $herecurr);
+## 			}
+## 		}
+
+#need space before brace following if, while, etc
+		if (($line =~ /\(.*\)\{/ && $line !~ /\($Type\)\{/) ||
+		    $line =~ /do\{/) {
+			if (ERROR("SPACING",
+				  "space required before the open brace '{'\n" . $herecurr) &&
+			    $fix) {
+				$fixed[$fixlinenr] =~ s/^(\+.*(?:do|\))){/$1 {/;
+			}
+		}
+
+## # check for blank lines before declarations
+##		if ($line =~ /^.\t+$Type\s+$Ident(?:\s*=.*)?;/ &&
+##		    $prevrawline =~ /^.\s*$/) {
+##			WARN("SPACING",
+##			     "No blank lines before declarations\n" . $hereprev);
+##		}
+##
+
+# closing brace should have a space following it when it has anything
+# on the line
+		if ($line =~ /}(?!(?:,|;|\)))\S/) {
+			if (ERROR("SPACING",
+				  "space required after that close brace '}'\n" . $herecurr) &&
+			    $fix) {
+				$fixed[$fixlinenr] =~
+				    s/}((?!(?:,|;|\)))\S)/} $1/;
+			}
+		}
+
+# check spacing on square brackets
+		if ($line =~ /\[\s/ && $line !~ /\[\s*$/) {
+			if (ERROR("SPACING",
+				  "space prohibited after that open square bracket '['\n" . $herecurr) &&
+			    $fix) {
+				$fixed[$fixlinenr] =~
+				    s/\[\s+/\[/;
+			}
+		}
+		if ($line =~ /\s\]/) {
+			if (ERROR("SPACING",
+				  "space prohibited before that close square bracket ']'\n" . $herecurr) &&
+			    $fix) {
+				$fixed[$fixlinenr] =~
+				    s/\s+\]/\]/;
+			}
+		}
+
+# check spacing on parentheses
+		if ($line =~ /\(\s/ && $line !~ /\(\s*(?:\\)?$/ &&
+		    $line !~ /for\s*\(\s+;/) {
+			if (ERROR("SPACING",
+				  "space prohibited after that open parenthesis '('\n" . $herecurr) &&
+			    $fix) {
+				$fixed[$fixlinenr] =~
+				    s/\(\s+/\(/;
+			}
+		}
+		if ($line =~ /(\s+)\)/ && $line !~ /^.\s*\)/ &&
+		    $line !~ /for\s*\(.*;\s+\)/ &&
+		    $line !~ /:\s+\)/) {
+			if (ERROR("SPACING",
+				  "space prohibited before that close parenthesis ')'\n" . $herecurr) &&
+			    $fix) {
+				$fixed[$fixlinenr] =~
+				    s/\s+\)/\)/;
+			}
+		}
+
+# check unnecessary parentheses around addressof/dereference single $Lvals
+# ie: &(foo->bar) should be &foo->bar and *(foo->bar) should be *foo->bar
+
+		while ($line =~ /(?:[^&]&\s*|\*)\(\s*($Ident\s*(?:$Member\s*)+)\s*\)/g) {
+			my $var = $1;
+			if (CHK("UNNECESSARY_PARENTHESES",
+				"Unnecessary parentheses around $var\n" . $herecurr) &&
+			    $fix) {
+				$fixed[$fixlinenr] =~ s/\(\s*\Q$var\E\s*\)/$var/;
+			}
+		}
+
+# check for unnecessary parentheses around function pointer uses
+# ie: (foo->bar)(); should be foo->bar();
+# but not "if (foo->bar) (" to avoid some false positives
+		if ($line =~ /(\bif\s*|)(\(\s*$Ident\s*(?:$Member\s*)+\))[ \t]*\(/ && $1 !~ /^if/) {
+			my $var = $2;
+			if (CHK("UNNECESSARY_PARENTHESES",
+				"Unnecessary parentheses around function pointer $var\n" . $herecurr) &&
+			    $fix) {
+				my $var2 = deparenthesize($var);
+				$var2 =~ s/\s//g;
+				$fixed[$fixlinenr] =~ s/\Q$var\E/$var2/;
+			}
+		}
+
+#goto labels aren't indented, allow a single space however
+		if ($line=~/^.\s+[A-Za-z\d_]+:(?![0-9]+)/ and
+		   !($line=~/^. [A-Za-z\d_]+:/) and !($line=~/^.\s+default:/)) {
+			if (WARN("INDENTED_LABEL",
+				 "labels should not be indented\n" . $herecurr) &&
+			    $fix) {
+				$fixed[$fixlinenr] =~
+				    s/^(.)\s+/$1/;
+			}
+		}
+
+# return is not a function
+		if (defined($stat) && $stat =~ /^.\s*return(\s*)\(/s) {
+			my $spacing = $1;
+			if ($^V && $^V ge 5.10.0 &&
+			    $stat =~ /^.\s*return\s*($balanced_parens)\s*;\s*$/) {
+				my $value = $1;
+				$value = deparenthesize($value);
+				if ($value =~ m/^\s*$FuncArg\s*(?:\?|$)/) {
+					ERROR("RETURN_PARENTHESES",
+					      "return is not a function, parentheses are not required\n" . $herecurr);
+				}
+			} elsif ($spacing !~ /\s+/) {
+				ERROR("SPACING",
+				      "space required before the open parenthesis '('\n" . $herecurr);
+			}
+		}
+
+# unnecessary return in a void function
+# at end-of-function, with the previous line a single leading tab, then return;
+# and the line before that not a goto label target like "out:"
+		if ($sline =~ /^[ \+]}\s*$/ &&
+		    $prevline =~ /^\+\treturn\s*;\s*$/ &&
+		    $linenr >= 3 &&
+		    $lines[$linenr - 3] =~ /^[ +]/ &&
+		    $lines[$linenr - 3] !~ /^[ +]\s*$Ident\s*:/) {
+			WARN("RETURN_VOID",
+			     "void function return statements are not generally useful\n" . $hereprev);
+               }
+
+# if statements using unnecessary parentheses - ie: if ((foo == bar))
+		if ($^V && $^V ge 5.10.0 &&
+		    $line =~ /\bif\s*((?:\(\s*){2,})/) {
+			my $openparens = $1;
+			my $count = $openparens =~ tr@\(@\(@;
+			my $msg = "";
+			if ($line =~ /\bif\s*(?:\(\s*){$count,$count}$LvalOrFunc\s*($Compare)\s*$LvalOrFunc(?:\s*\)){$count,$count}/) {
+				my $comp = $4;	#Not $1 because of $LvalOrFunc
+				$msg = " - maybe == should be = ?" if ($comp eq "==");
+				WARN("UNNECESSARY_PARENTHESES",
+				     "Unnecessary parentheses$msg\n" . $herecurr);
+			}
+		}
+
+# comparisons with a constant or upper case identifier on the left
+#	avoid cases like "foo + BAR < baz"
+#	only fix matches surrounded by parentheses to avoid incorrect
+#	conversions like "FOO < baz() + 5" being "misfixed" to "baz() > FOO + 5"
+		if ($^V && $^V ge 5.10.0 &&
+		    $line =~ /^\+(.*)\b($Constant|[A-Z_][A-Z0-9_]*)\s*($Compare)\s*($LvalOrFunc)/) {
+			my $lead = $1;
+			my $const = $2;
+			my $comp = $3;
+			my $to = $4;
+			my $newcomp = $comp;
+			if ($lead !~ /(?:$Operators|\.)\s*$/ &&
+			    $to !~ /^(?:Constant|[A-Z_][A-Z0-9_]*)$/ &&
+			    WARN("CONSTANT_COMPARISON",
+				 "Comparisons should place the constant on the right side of the test\n" . $herecurr) &&
+			    $fix) {
+				if ($comp eq "<") {
+					$newcomp = ">";
+				} elsif ($comp eq "<=") {
+					$newcomp = ">=";
+				} elsif ($comp eq ">") {
+					$newcomp = "<";
+				} elsif ($comp eq ">=") {
+					$newcomp = "<=";
+				}
+				$fixed[$fixlinenr] =~ s/\(\s*\Q$const\E\s*$Compare\s*\Q$to\E\s*\)/($to $newcomp $const)/;
+			}
+		}
+
+# Return of what appears to be an errno should normally be negative
+		if ($sline =~ /\breturn(?:\s*\(+\s*|\s+)(E[A-Z]+)(?:\s*\)+\s*|\s*)[;:,]/) {
+			my $name = $1;
+			if ($name ne 'EOF' && $name ne 'ERROR') {
+				WARN("USE_NEGATIVE_ERRNO",
+				     "return of an errno should typically be negative (ie: return -$1)\n" . $herecurr);
+			}
+		}
+
+# Need a space before open parenthesis after if, while etc
+		if ($line =~ /\b(if|while|for|switch)\(/) {
+			if (ERROR("SPACING",
+				  "space required before the open parenthesis '('\n" . $herecurr) &&
+			    $fix) {
+				$fixed[$fixlinenr] =~
+				    s/\b(if|while|for|switch)\(/$1 \(/;
+			}
+		}
+
+# Check for illegal assignment in if conditional -- and check for trailing
+# statements after the conditional.
+		if ($line =~ /do\s*(?!{)/) {
+			($stat, $cond, $line_nr_next, $remain_next, $off_next) =
+				ctx_statement_block($linenr, $realcnt, 0)
+					if (!defined $stat);
+			my ($stat_next) = ctx_statement_block($line_nr_next,
+						$remain_next, $off_next);
+			$stat_next =~ s/\n./\n /g;
+			##print "stat<$stat> stat_next<$stat_next>\n";
+
+			if ($stat_next =~ /^\s*while\b/) {
+				# If the statement carries leading newlines,
+				# then count those as offsets.
+				my ($whitespace) =
+					($stat_next =~ /^((?:\s*\n[+-])*\s*)/s);
+				my $offset =
+					statement_rawlines($whitespace) - 1;
+
+				$suppress_whiletrailers{$line_nr_next +
+								$offset} = 1;
+			}
+		}
+		if (!defined $suppress_whiletrailers{$linenr} &&
+		    defined($stat) && defined($cond) &&
+		    $line =~ /\b(?:if|while|for)\s*\(/ && $line !~ /^.\s*#/) {
+			my ($s, $c) = ($stat, $cond);
+
+			if ($c =~ /\bif\s*\(.*[^<>!=]=[^=].*/s) {
+				ERROR("ASSIGN_IN_IF",
+				      "do not use assignment in if condition\n" . $herecurr);
+			}
+
+			# Find out what is on the end of the line after the
+			# conditional.
+			substr($s, 0, length($c), '');
+			$s =~ s/\n.*//g;
+			$s =~ s/$;//g; 	# Remove any comments
+			if (length($c) && $s !~ /^\s*{?\s*\\*\s*$/ &&
+			    $c !~ /}\s*while\s*/)
+			{
+				# Find out how long the conditional actually is.
+				my @newlines = ($c =~ /\n/gs);
+				my $cond_lines = 1 + $#newlines;
+				my $stat_real = '';
+
+				$stat_real = raw_line($linenr, $cond_lines)
+							. "\n" if ($cond_lines);
+				if (defined($stat_real) && $cond_lines > 1) {
+					$stat_real = "[...]\n$stat_real";
+				}
+
+				ERROR("TRAILING_STATEMENTS",
+				      "trailing statements should be on next line\n" . $herecurr . $stat_real);
+			}
+		}
+
+# Check for bitwise tests written as boolean
+		if ($line =~ /
+			(?:
+				(?:\[|\(|\&\&|\|\|)
+				\s*0[xX][0-9]+\s*
+				(?:\&\&|\|\|)
+			|
+				(?:\&\&|\|\|)
+				\s*0[xX][0-9]+\s*
+				(?:\&\&|\|\||\)|\])
+			)/x)
+		{
+			WARN("HEXADECIMAL_BOOLEAN_TEST",
+			     "boolean test with hexadecimal, perhaps just 1 \& or \|?\n" . $herecurr);
+		}
+
+# if and else should not have general statements after it
+		if ($line =~ /^.\s*(?:}\s*)?else\b(.*)/) {
+			my $s = $1;
+			$s =~ s/$;//g; 	# Remove any comments
+			if ($s !~ /^\s*(?:\sif|(?:{|)\s*\\?\s*$)/) {
+				ERROR("TRAILING_STATEMENTS",
+				      "trailing statements should be on next line\n" . $herecurr);
+			}
+		}
+# if should not continue a brace
+		if ($line =~ /}\s*if\b/) {
+			ERROR("TRAILING_STATEMENTS",
+			      "trailing statements should be on next line (or did you mean 'else if'?)\n" .
+				$herecurr);
+		}
+# case and default should not have general statements after them
+		if ($line =~ /^.\s*(?:case\s*.*|default\s*):/g &&
+		    $line !~ /\G(?:
+			(?:\s*$;*)(?:\s*{)?(?:\s*$;*)(?:\s*\\)?\s*$|
+			\s*return\s+
+		    )/xg)
+		{
+			ERROR("TRAILING_STATEMENTS",
+			      "trailing statements should be on next line\n" . $herecurr);
+		}
+
+		# Check for }<nl>else {, these must be at the same
+		# indent level to be relevant to each other.
+		if ($prevline=~/}\s*$/ and $line=~/^.\s*else\s*/ &&
+		    $previndent == $indent) {
+			if (ERROR("ELSE_AFTER_BRACE",
+				  "else should follow close brace '}'\n" . $hereprev) &&
+			    $fix && $prevline =~ /^\+/ && $line =~ /^\+/) {
+				fix_delete_line($fixlinenr - 1, $prevrawline);
+				fix_delete_line($fixlinenr, $rawline);
+				my $fixedline = $prevrawline;
+				$fixedline =~ s/}\s*$//;
+				if ($fixedline !~ /^\+\s*$/) {
+					fix_insert_line($fixlinenr, $fixedline);
+				}
+				$fixedline = $rawline;
+				$fixedline =~ s/^(.\s*)else/$1} else/;
+				fix_insert_line($fixlinenr, $fixedline);
+			}
+		}
+
+		if ($prevline=~/}\s*$/ and $line=~/^.\s*while\s*/ &&
+		    $previndent == $indent) {
+			my ($s, $c) = ctx_statement_block($linenr, $realcnt, 0);
+
+			# Find out what is on the end of the line after the
+			# conditional.
+			substr($s, 0, length($c), '');
+			$s =~ s/\n.*//g;
+
+			if ($s =~ /^\s*;/) {
+				if (ERROR("WHILE_AFTER_BRACE",
+					  "while should follow close brace '}'\n" . $hereprev) &&
+				    $fix && $prevline =~ /^\+/ && $line =~ /^\+/) {
+					fix_delete_line($fixlinenr - 1, $prevrawline);
+					fix_delete_line($fixlinenr, $rawline);
+					my $fixedline = $prevrawline;
+					my $trailing = $rawline;
+					$trailing =~ s/^\+//;
+					$trailing = trim($trailing);
+					$fixedline =~ s/}\s*$/} $trailing/;
+					fix_insert_line($fixlinenr, $fixedline);
+				}
+			}
+		}
+
+#Specific variable tests
+		while ($line =~ m{($Constant|$Lval)}g) {
+			my $var = $1;
+
+#gcc binary extension
+			if ($var =~ /^$Binary$/) {
+				if (WARN("GCC_BINARY_CONSTANT",
+					 "Avoid gcc v4.3+ binary constant extension: <$var>\n" . $herecurr) &&
+				    $fix) {
+					my $hexval = sprintf("0x%x", oct($var));
+					$fixed[$fixlinenr] =~
+					    s/\b$var\b/$hexval/;
+				}
+			}
+
+#CamelCase
+			if ($var !~ /^$Constant$/ &&
+			    $var =~ /[A-Z][a-z]|[a-z][A-Z]/ &&
+#Ignore Page<foo> variants
+			    $var !~ /^(?:Clear|Set|TestClear|TestSet|)Page[A-Z]/ &&
+#Ignore SI style variants like nS, mV and dB (ie: max_uV, regulator_min_uA_show)
+			    $var !~ /^(?:[a-z_]*?)_?[a-z][A-Z](?:_[a-z_]+)?$/ &&
+#Ignore some three character SI units explicitly, like MiB and KHz
+			    $var !~ /^(?:[a-z_]*?)_?(?:[KMGT]iB|[KMGT]?Hz)(?:_[a-z_]+)?$/) {
+				while ($var =~ m{($Ident)}g) {
+					my $word = $1;
+					next if ($word !~ /[A-Z][a-z]|[a-z][A-Z]/);
+					if ($check) {
+						seed_camelcase_includes();
+						if (!$file && !$camelcase_file_seeded) {
+							seed_camelcase_file($realfile);
+							$camelcase_file_seeded = 1;
+						}
+					}
+					if (!defined $camelcase{$word}) {
+						$camelcase{$word} = 1;
+						CHK("CAMELCASE",
+						    "Avoid CamelCase: <$word>\n" . $herecurr);
+					}
+				}
+			}
+		}
+
+#no spaces allowed after \ in define
+		if ($line =~ /\#\s*define.*\\\s+$/) {
+			if (WARN("WHITESPACE_AFTER_LINE_CONTINUATION",
+				 "Whitespace after \\ makes next lines useless\n" . $herecurr) &&
+			    $fix) {
+				$fixed[$fixlinenr] =~ s/\s+$//;
+			}
+		}
+
+# warn if <asm/foo.h> is #included and <linux/foo.h> is available and includes
+# itself <asm/foo.h> (uses RAW line)
+		if ($tree && $rawline =~ m{^.\s*\#\s*include\s*\<asm\/(.*)\.h\>}) {
+			my $file = "$1.h";
+			my $checkfile = "include/linux/$file";
+			if (-f "$root/$checkfile" &&
+			    $realfile ne $checkfile &&
+			    $1 !~ /$allowed_asm_includes/)
+			{
+				my $asminclude = `grep -Ec "#include\\s+<asm/$file>" $root/$checkfile`;
+				if ($asminclude > 0) {
+					if ($realfile =~ m{^arch/}) {
+						CHK("ARCH_INCLUDE_LINUX",
+						    "Consider using #include <linux/$file> instead of <asm/$file>\n" . $herecurr);
+					} else {
+						WARN("INCLUDE_LINUX",
+						     "Use #include <linux/$file> instead of <asm/$file>\n" . $herecurr);
+					}
+				}
+			}
+		}
+
+# multi-statement macros should be enclosed in a do while loop, grab the
+# first statement and ensure its the whole macro if its not enclosed
+# in a known good container
+		if ($realfile !~ m@/vmlinux.lds.h$@ &&
+		    $line =~ /^.\s*\#\s*define\s*$Ident(\()?/) {
+			my $ln = $linenr;
+			my $cnt = $realcnt;
+			my ($off, $dstat, $dcond, $rest);
+			my $ctx = '';
+			my $has_flow_statement = 0;
+			my $has_arg_concat = 0;
+			($dstat, $dcond, $ln, $cnt, $off) =
+				ctx_statement_block($linenr, $realcnt, 0);
+			$ctx = $dstat;
+			#print "dstat<$dstat> dcond<$dcond> cnt<$cnt> off<$off>\n";
+			#print "LINE<$lines[$ln-1]> len<" . length($lines[$ln-1]) . "\n";
+
+			$has_flow_statement = 1 if ($ctx =~ /\b(goto|return)\b/);
+			$has_arg_concat = 1 if ($ctx =~ /\#\#/ && $ctx !~ /\#\#\s*(?:__VA_ARGS__|args)\b/);
+
+			$dstat =~ s/^.\s*\#\s*define\s+$Ident(\([^\)]*\))?\s*//;
+			my $define_args = $1;
+			my $define_stmt = $dstat;
+			my @def_args = ();
+
+			if (defined $define_args && $define_args ne "") {
+				$define_args = substr($define_args, 1, length($define_args) - 2);
+				$define_args =~ s/\s*//g;
+				@def_args = split(",", $define_args);
+			}
+
+			$dstat =~ s/$;//g;
+			$dstat =~ s/\\\n.//g;
+			$dstat =~ s/^\s*//s;
+			$dstat =~ s/\s*$//s;
+
+			# Flatten any parentheses and braces
+			while ($dstat =~ s/\([^\(\)]*\)/1/ ||
+			       $dstat =~ s/\{[^\{\}]*\}/1/ ||
+			       $dstat =~ s/.\[[^\[\]]*\]/1/)
+			{
+			}
+
+			# Flatten any obvious string concatentation.
+			while ($dstat =~ s/($String)\s*$Ident/$1/ ||
+			       $dstat =~ s/$Ident\s*($String)/$1/)
+			{
+			}
+
+			# Make asm volatile uses seem like a generic function
+			$dstat =~ s/\b_*asm_*\s+_*volatile_*\b/asm_volatile/g;
+
+			my $exceptions = qr{
+				$Declare|
+				module_param_named|
+				MODULE_PARM_DESC|
+				DECLARE_PER_CPU|
+				DEFINE_PER_CPU|
+				__typeof__\(|
+				union|
+				struct|
+				\.$Ident\s*=\s*|
+				^\"|\"$|
+				^\[
+			}x;
+			#print "REST<$rest> dstat<$dstat> ctx<$ctx>\n";
+
+			$ctx =~ s/\n*$//;
+			my $herectx = $here . "\n";
+			my $stmt_cnt = statement_rawlines($ctx);
+
+			for (my $n = 0; $n < $stmt_cnt; $n++) {
+				$herectx .= raw_line($linenr, $n) . "\n";
+			}
+
+			if ($dstat ne '' &&
+			    $dstat !~ /^(?:$Ident|-?$Constant),$/ &&			# 10, // foo(),
+			    $dstat !~ /^(?:$Ident|-?$Constant);$/ &&			# foo();
+			    $dstat !~ /^[!~-]?(?:$Lval|$Constant)$/ &&		# 10 // foo() // !foo // ~foo // -foo // foo->bar // foo.bar->baz
+			    $dstat !~ /^'X'$/ && $dstat !~ /^'XX'$/ &&			# character constants
+			    $dstat !~ /$exceptions/ &&
+			    $dstat !~ /^\.$Ident\s*=/ &&				# .foo =
+			    $dstat !~ /^(?:\#\s*$Ident|\#\s*$Constant)\s*$/ &&		# stringification #foo
+			    $dstat !~ /^do\s*$Constant\s*while\s*$Constant;?$/ &&	# do {...} while (...); // do {...} while (...)
+			    $dstat !~ /^for\s*$Constant$/ &&				# for (...)
+			    $dstat !~ /^for\s*$Constant\s+(?:$Ident|-?$Constant)$/ &&	# for (...) bar()
+			    $dstat !~ /^do\s*{/ &&					# do {...
+			    $dstat !~ /^\(\{/ &&						# ({...
+			    $ctx !~ /^.\s*#\s*define\s+TRACE_(?:SYSTEM|INCLUDE_FILE|INCLUDE_PATH)\b/)
+			{
+
+				if ($dstat =~ /;/) {
+					ERROR("MULTISTATEMENT_MACRO_USE_DO_WHILE",
+					      "Macros with multiple statements should be enclosed in a do - while loop\n" . "$herectx");
+				} else {
+					ERROR("COMPLEX_MACRO",
+					      "Macros with complex values should be enclosed in parentheses\n" . "$herectx");
+				}
+
+			}
+
+			# Make $define_stmt single line, comment-free, etc
+			my @stmt_array = split('\n', $define_stmt);
+			my $first = 1;
+			$define_stmt = "";
+			foreach my $l (@stmt_array) {
+				$l =~ s/\\$//;
+				if ($first) {
+					$define_stmt = $l;
+					$first = 0;
+				} elsif ($l =~ /^[\+ ]/) {
+					$define_stmt .= substr($l, 1);
+				}
+			}
+			$define_stmt =~ s/$;//g;
+			$define_stmt =~ s/\s+/ /g;
+			$define_stmt = trim($define_stmt);
+
+# check if any macro arguments are reused (ignore '...' and 'type')
+			foreach my $arg (@def_args) {
+			        next if ($arg =~ /\.\.\./);
+			        next if ($arg =~ /^type$/i);
+				my $tmp = $define_stmt;
+				$tmp =~ s/\b(typeof|__typeof__|__builtin\w+|typecheck\s*\(\s*$Type\s*,|\#+)\s*\(*\s*$arg\s*\)*\b//g;
+				$tmp =~ s/\#+\s*$arg\b//g;
+				$tmp =~ s/\b$arg\s*\#\#//g;
+				my $use_cnt = $tmp =~ s/\b$arg\b//g;
+				if ($use_cnt > 1) {
+					CHK("MACRO_ARG_REUSE",
+					    "Macro argument reuse '$arg' - possible side-effects?\n" . "$herectx");
+				    }
+# check if any macro arguments may have other precedence issues
+				if ($define_stmt =~ m/($Operators)?\s*\b$arg\b\s*($Operators)?/m &&
+				    ((defined($1) && $1 ne ',') ||
+				     (defined($2) && $2 ne ','))) {
+					CHK("MACRO_ARG_PRECEDENCE",
+					    "Macro argument '$arg' may be better as '($arg)' to avoid precedence issues\n" . "$herectx");
+				}
+			}
+
+# check for macros with flow control, but without ## concatenation
+# ## concatenation is commonly a macro that defines a function so ignore those
+			if ($has_flow_statement && !$has_arg_concat) {
+				my $herectx = $here . "\n";
+				my $cnt = statement_rawlines($ctx);
+
+				for (my $n = 0; $n < $cnt; $n++) {
+					$herectx .= raw_line($linenr, $n) . "\n";
+				}
+				WARN("MACRO_WITH_FLOW_CONTROL",
+				     "Macros with flow control statements should be avoided\n" . "$herectx");
+			}
+
+# check for line continuations outside of #defines, preprocessor #, and asm
+
+		} else {
+			if ($prevline !~ /^..*\\$/ &&
+			    $line !~ /^\+\s*\#.*\\$/ &&		# preprocessor
+			    $line !~ /^\+.*\b(__asm__|asm)\b.*\\$/ &&	# asm
+			    $line =~ /^\+.*\\$/) {
+				WARN("LINE_CONTINUATIONS",
+				     "Avoid unnecessary line continuations\n" . $herecurr);
+			}
+		}
+
+# do {} while (0) macro tests:
+# single-statement macros do not need to be enclosed in do while (0) loop,
+# macro should not end with a semicolon
+		if ($^V && $^V ge 5.10.0 &&
+		    $realfile !~ m@/vmlinux.lds.h$@ &&
+		    $line =~ /^.\s*\#\s*define\s+$Ident(\()?/) {
+			my $ln = $linenr;
+			my $cnt = $realcnt;
+			my ($off, $dstat, $dcond, $rest);
+			my $ctx = '';
+			($dstat, $dcond, $ln, $cnt, $off) =
+				ctx_statement_block($linenr, $realcnt, 0);
+			$ctx = $dstat;
+
+			$dstat =~ s/\\\n.//g;
+			$dstat =~ s/$;/ /g;
+
+			if ($dstat =~ /^\+\s*#\s*define\s+$Ident\s*${balanced_parens}\s*do\s*{(.*)\s*}\s*while\s*\(\s*0\s*\)\s*([;\s]*)\s*$/) {
+				my $stmts = $2;
+				my $semis = $3;
+
+				$ctx =~ s/\n*$//;
+				my $cnt = statement_rawlines($ctx);
+				my $herectx = $here . "\n";
+
+				for (my $n = 0; $n < $cnt; $n++) {
+					$herectx .= raw_line($linenr, $n) . "\n";
+				}
+
+				if (($stmts =~ tr/;/;/) == 1 &&
+				    $stmts !~ /^\s*(if|while|for|switch)\b/) {
+					WARN("SINGLE_STATEMENT_DO_WHILE_MACRO",
+					     "Single statement macros should not use a do {} while (0) loop\n" . "$herectx");
+				}
+				if (defined $semis && $semis ne "") {
+					WARN("DO_WHILE_MACRO_WITH_TRAILING_SEMICOLON",
+					     "do {} while (0) macros should not be semicolon terminated\n" . "$herectx");
+				}
+			} elsif ($dstat =~ /^\+\s*#\s*define\s+$Ident.*;\s*$/) {
+				$ctx =~ s/\n*$//;
+				my $cnt = statement_rawlines($ctx);
+				my $herectx = $here . "\n";
+
+				for (my $n = 0; $n < $cnt; $n++) {
+					$herectx .= raw_line($linenr, $n) . "\n";
+				}
+
+				WARN("TRAILING_SEMICOLON",
+				     "macros should not use a trailing semicolon\n" . "$herectx");
+			}
+		}
+
+# make sure symbols are always wrapped with VMLINUX_SYMBOL() ...
+# all assignments may have only one of the following with an assignment:
+#	.
+#	ALIGN(...)
+#	VMLINUX_SYMBOL(...)
+		if ($realfile eq 'vmlinux.lds.h' && $line =~ /(?:(?:^|\s)$Ident\s*=|=\s*$Ident(?:\s|$))/) {
+			WARN("MISSING_VMLINUX_SYMBOL",
+			     "vmlinux.lds.h needs VMLINUX_SYMBOL() around C-visible symbols\n" . $herecurr);
+		}
+
+# check for redundant bracing round if etc
+		if ($line =~ /(^.*)\bif\b/ && $1 !~ /else\s*$/) {
+			my ($level, $endln, @chunks) =
+				ctx_statement_full($linenr, $realcnt, 1);
+			#print "chunks<$#chunks> linenr<$linenr> endln<$endln> level<$level>\n";
+			#print "APW: <<$chunks[1][0]>><<$chunks[1][1]>>\n";
+			if ($#chunks > 0 && $level == 0) {
+				my @allowed = ();
+				my $allow = 0;
+				my $seen = 0;
+				my $herectx = $here . "\n";
+				my $ln = $linenr - 1;
+				for my $chunk (@chunks) {
+					my ($cond, $block) = @{$chunk};
+
+					# If the condition carries leading newlines, then count those as offsets.
+					my ($whitespace) = ($cond =~ /^((?:\s*\n[+-])*\s*)/s);
+					my $offset = statement_rawlines($whitespace) - 1;
+
+					$allowed[$allow] = 0;
+					#print "COND<$cond> whitespace<$whitespace> offset<$offset>\n";
+
+					# We have looked at and allowed this specific line.
+					$suppress_ifbraces{$ln + $offset} = 1;
+
+					$herectx .= "$rawlines[$ln + $offset]\n[...]\n";
+					$ln += statement_rawlines($block) - 1;
+
+					substr($block, 0, length($cond), '');
+
+					$seen++ if ($block =~ /^\s*{/);
+
+					#print "cond<$cond> block<$block> allowed<$allowed[$allow]>\n";
+					if (statement_lines($cond) > 1) {
+						#print "APW: ALLOWED: cond<$cond>\n";
+						$allowed[$allow] = 1;
+					}
+					if ($block =~/\b(?:if|for|while)\b/) {
+						#print "APW: ALLOWED: block<$block>\n";
+						$allowed[$allow] = 1;
+					}
+					if (statement_block_size($block) > 1) {
+						#print "APW: ALLOWED: lines block<$block>\n";
+						$allowed[$allow] = 1;
+					}
+					$allow++;
+				}
+				if ($seen) {
+					my $sum_allowed = 0;
+					foreach (@allowed) {
+						$sum_allowed += $_;
+					}
+					if ($sum_allowed == 0) {
+						WARN("BRACES",
+						     "braces {} are not necessary for any arm of this statement\n" . $herectx);
+					} elsif ($sum_allowed != $allow &&
+						 $seen != $allow) {
+						CHK("BRACES",
+						    "braces {} should be used on all arms of this statement\n" . $herectx);
+					}
+				}
+			}
+		}
+		if (!defined $suppress_ifbraces{$linenr - 1} &&
+					$line =~ /\b(if|while|for|else)\b/) {
+			my $allowed = 0;
+
+			# Check the pre-context.
+			if (substr($line, 0, $-[0]) =~ /(\}\s*)$/) {
+				#print "APW: ALLOWED: pre<$1>\n";
+				$allowed = 1;
+			}
+
+			my ($level, $endln, @chunks) =
+				ctx_statement_full($linenr, $realcnt, $-[0]);
+
+			# Check the condition.
+			my ($cond, $block) = @{$chunks[0]};
+			#print "CHECKING<$linenr> cond<$cond> block<$block>\n";
+			if (defined $cond) {
+				substr($block, 0, length($cond), '');
+			}
+			if (statement_lines($cond) > 1) {
+				#print "APW: ALLOWED: cond<$cond>\n";
+				$allowed = 1;
+			}
+			if ($block =~/\b(?:if|for|while)\b/) {
+				#print "APW: ALLOWED: block<$block>\n";
+				$allowed = 1;
+			}
+			if (statement_block_size($block) > 1) {
+				#print "APW: ALLOWED: lines block<$block>\n";
+				$allowed = 1;
+			}
+			# Check the post-context.
+			if (defined $chunks[1]) {
+				my ($cond, $block) = @{$chunks[1]};
+				if (defined $cond) {
+					substr($block, 0, length($cond), '');
+				}
+				if ($block =~ /^\s*\{/) {
+					#print "APW: ALLOWED: chunk-1 block<$block>\n";
+					$allowed = 1;
+				}
+			}
+			if ($level == 0 && $block =~ /^\s*\{/ && !$allowed) {
+				my $herectx = $here . "\n";
+				my $cnt = statement_rawlines($block);
+
+				for (my $n = 0; $n < $cnt; $n++) {
+					$herectx .= raw_line($linenr, $n) . "\n";
+				}
+
+				WARN("BRACES",
+				     "braces {} are not necessary for single statement blocks\n" . $herectx);
+			}
+		}
+
+# check for unnecessary blank lines around braces
+		if (($line =~ /^.\s*}\s*$/ && $prevrawline =~ /^.\s*$/)) {
+			if (CHK("BRACES",
+				"Blank lines aren't necessary before a close brace '}'\n" . $hereprev) &&
+			    $fix && $prevrawline =~ /^\+/) {
+				fix_delete_line($fixlinenr - 1, $prevrawline);
+			}
+		}
+		if (($rawline =~ /^.\s*$/ && $prevline =~ /^..*{\s*$/)) {
+			if (CHK("BRACES",
+				"Blank lines aren't necessary after an open brace '{'\n" . $hereprev) &&
+			    $fix) {
+				fix_delete_line($fixlinenr, $rawline);
+			}
+		}
+
+# no volatiles please
+		my $asm_volatile = qr{\b(__asm__|asm)\s+(__volatile__|volatile)\b};
+		if ($line =~ /\bvolatile\b/ && $line !~ /$asm_volatile/) {
+			WARN("VOLATILE",
+			     "Use of volatile is usually wrong: see Documentation/volatile-considered-harmful.txt\n" . $herecurr);
+		}
+
+# Check for user-visible strings broken across lines, which breaks the ability
+# to grep for the string.  Make exceptions when the previous string ends in a
+# newline (multiple lines in one string constant) or '\t', '\r', ';', or '{'
+# (common in inline assembly) or is a octal \123 or hexadecimal \xaf value
+		if ($line =~ /^\+\s*$String/ &&
+		    $prevline =~ /"\s*$/ &&
+		    $prevrawline !~ /(?:\\(?:[ntr]|[0-7]{1,3}|x[0-9a-fA-F]{1,2})|;\s*|\{\s*)"\s*$/) {
+			if (WARN("SPLIT_STRING",
+				 "quoted string split across lines\n" . $hereprev) &&
+				     $fix &&
+				     $prevrawline =~ /^\+.*"\s*$/ &&
+				     $last_coalesced_string_linenr != $linenr - 1) {
+				my $extracted_string = get_quoted_string($line, $rawline);
+				my $comma_close = "";
+				if ($rawline =~ /\Q$extracted_string\E(\s*\)\s*;\s*$|\s*,\s*)/) {
+					$comma_close = $1;
+				}
+
+				fix_delete_line($fixlinenr - 1, $prevrawline);
+				fix_delete_line($fixlinenr, $rawline);
+				my $fixedline = $prevrawline;
+				$fixedline =~ s/"\s*$//;
+				$fixedline .= substr($extracted_string, 1) . trim($comma_close);
+				fix_insert_line($fixlinenr - 1, $fixedline);
+				$fixedline = $rawline;
+				$fixedline =~ s/\Q$extracted_string\E\Q$comma_close\E//;
+				if ($fixedline !~ /\+\s*$/) {
+					fix_insert_line($fixlinenr, $fixedline);
+				}
+				$last_coalesced_string_linenr = $linenr;
+			}
+		}
+
+# check for missing a space in a string concatenation
+		if ($prevrawline =~ /[^\\]\w"$/ && $rawline =~ /^\+[\t ]+"\w/) {
+			WARN('MISSING_SPACE',
+			     "break quoted strings at a space character\n" . $hereprev);
+		}
+
+# check for spaces before a quoted newline
+		if ($rawline =~ /^.*\".*\s\\n/) {
+			if (WARN("QUOTED_WHITESPACE_BEFORE_NEWLINE",
+				 "unnecessary whitespace before a quoted newline\n" . $herecurr) &&
+			    $fix) {
+				$fixed[$fixlinenr] =~ s/^(\+.*\".*)\s+\\n/$1\\n/;
+			}
+
+		}
+
+# concatenated string without spaces between elements
+		if ($line =~ /$String[A-Z_]/ || $line =~ /[A-Za-z0-9_]$String/) {
+			CHK("CONCATENATED_STRING",
+			    "Concatenated strings should use spaces between elements\n" . $herecurr);
+		}
+
+# uncoalesced string fragments
+		if ($line =~ /$String\s*"/) {
+			WARN("STRING_FRAGMENTS",
+			     "Consecutive strings are generally better as a single string\n" . $herecurr);
+		}
+
+# check for %L{u,d,i} and 0x%[udi] in strings
+		my $string;
+		while ($line =~ /(?:^|")([X\t]*)(?:"|$)/g) {
+			$string = substr($rawline, $-[1], $+[1] - $-[1]);
+			$string =~ s/%%/__/g;
+			if ($string =~ /(?<!%)%[\*\d\.\$]*L[udi]/) {
+				WARN("PRINTF_L",
+				     "\%Ld/%Lu are not-standard C, use %lld/%llu\n" . $herecurr);
+				last;
+			}
+			if ($string =~ /0x%[\*\d\.\$\Llzth]*[udi]/) {
+				ERROR("PRINTF_0xDECIMAL",
+				      "Prefixing 0x with decimal output is defective\n" . $herecurr);
+			}
+		}
+
+# check for line continuations in quoted strings with odd counts of "
+		if ($rawline =~ /\\$/ && $rawline =~ tr/"/"/ % 2) {
+			WARN("LINE_CONTINUATIONS",
+			     "Avoid line continuations in quoted strings\n" . $herecurr);
+		}
+
+# warn about #if 0
+		if ($line =~ /^.\s*\#\s*if\s+0\b/) {
+			CHK("REDUNDANT_CODE",
+			    "if this code is redundant consider removing it\n" .
+				$herecurr);
+		}
+
+# check for needless "if (<foo>) fn(<foo>)" uses
+		if ($prevline =~ /\bif\s*\(\s*($Lval)\s*\)/) {
+			my $tested = quotemeta($1);
+			my $expr = '\s*\(\s*' . $tested . '\s*\)\s*;';
+			if ($line =~ /\b(kfree|usb_free_urb|debugfs_remove(?:_recursive)?|(?:kmem_cache|mempool|dma_pool)_destroy)$expr/) {
+				my $func = $1;
+				if (WARN('NEEDLESS_IF',
+					 "$func(NULL) is safe and this check is probably not required\n" . $hereprev) &&
+				    $fix) {
+					my $do_fix = 1;
+					my $leading_tabs = "";
+					my $new_leading_tabs = "";
+					if ($lines[$linenr - 2] =~ /^\+(\t*)if\s*\(\s*$tested\s*\)\s*$/) {
+						$leading_tabs = $1;
+					} else {
+						$do_fix = 0;
+					}
+					if ($lines[$linenr - 1] =~ /^\+(\t+)$func\s*\(\s*$tested\s*\)\s*;\s*$/) {
+						$new_leading_tabs = $1;
+						if (length($leading_tabs) + 1 ne length($new_leading_tabs)) {
+							$do_fix = 0;
+						}
+					} else {
+						$do_fix = 0;
+					}
+					if ($do_fix) {
+						fix_delete_line($fixlinenr - 1, $prevrawline);
+						$fixed[$fixlinenr] =~ s/^\+$new_leading_tabs/\+$leading_tabs/;
+					}
+				}
+			}
+		}
+
+# check for unnecessary "Out of Memory" messages
+		if ($line =~ /^\+.*\b$logFunctions\s*\(/ &&
+		    $prevline =~ /^[ \+]\s*if\s*\(\s*(\!\s*|NULL\s*==\s*)?($Lval)(\s*==\s*NULL\s*)?\s*\)/ &&
+		    (defined $1 || defined $3) &&
+		    $linenr > 3) {
+			my $testval = $2;
+			my $testline = $lines[$linenr - 3];
+
+			my ($s, $c) = ctx_statement_block($linenr - 3, $realcnt, 0);
+#			print("line: <$line>\nprevline: <$prevline>\ns: <$s>\nc: <$c>\n\n\n");
+
+			if ($c =~ /(?:^|\n)[ \+]\s*(?:$Type\s*)?\Q$testval\E\s*=\s*(?:\([^\)]*\)\s*)?\s*(?:devm_)?(?:[kv][czm]alloc(?:_node|_array)?\b|kstrdup|(?:dev_)?alloc_skb)/) {
+				WARN("OOM_MESSAGE",
+				     "Possible unnecessary 'out of memory' message\n" . $hereprev);
+			}
+		}
+
+# check for logging functions with KERN_<LEVEL>
+		if ($line !~ /printk(?:_ratelimited|_once)?\s*\(/ &&
+		    $line =~ /\b$logFunctions\s*\(.*\b(KERN_[A-Z]+)\b/) {
+			my $level = $1;
+			if (WARN("UNNECESSARY_KERN_LEVEL",
+				 "Possible unnecessary $level\n" . $herecurr) &&
+			    $fix) {
+				$fixed[$fixlinenr] =~ s/\s*$level\s*//;
+			}
+		}
+
+# check for mask then right shift without a parentheses
+		if ($^V && $^V ge 5.10.0 &&
+		    $line =~ /$LvalOrFunc\s*\&\s*($LvalOrFunc)\s*>>/ &&
+		    $4 !~ /^\&/) { # $LvalOrFunc may be &foo, ignore if so
+			WARN("MASK_THEN_SHIFT",
+			     "Possible precedence defect with mask then right shift - may need parentheses\n" . $herecurr);
+		}
+
+# check for pointer comparisons to NULL
+		if ($^V && $^V ge 5.10.0) {
+			while ($line =~ /\b$LvalOrFunc\s*(==|\!=)\s*NULL\b/g) {
+				my $val = $1;
+				my $equal = "!";
+				$equal = "" if ($4 eq "!=");
+				if (CHK("COMPARISON_TO_NULL",
+					"Comparison to NULL could be written \"${equal}${val}\"\n" . $herecurr) &&
+					    $fix) {
+					$fixed[$fixlinenr] =~ s/\b\Q$val\E\s*(?:==|\!=)\s*NULL\b/$equal$val/;
+				}
+			}
+		}
+
+# check for bad placement of section $InitAttribute (e.g.: __initdata)
+		if ($line =~ /(\b$InitAttribute\b)/) {
+			my $attr = $1;
+			if ($line =~ /^\+\s*static\s+(?:const\s+)?(?:$attr\s+)?($NonptrTypeWithAttr)\s+(?:$attr\s+)?($Ident(?:\[[^]]*\])?)\s*[=;]/) {
+				my $ptr = $1;
+				my $var = $2;
+				if ((($ptr =~ /\b(union|struct)\s+$attr\b/ &&
+				      ERROR("MISPLACED_INIT",
+					    "$attr should be placed after $var\n" . $herecurr)) ||
+				     ($ptr !~ /\b(union|struct)\s+$attr\b/ &&
+				      WARN("MISPLACED_INIT",
+					   "$attr should be placed after $var\n" . $herecurr))) &&
+				    $fix) {
+					$fixed[$fixlinenr] =~ s/(\bstatic\s+(?:const\s+)?)(?:$attr\s+)?($NonptrTypeWithAttr)\s+(?:$attr\s+)?($Ident(?:\[[^]]*\])?)\s*([=;])\s*/"$1" . trim(string_find_replace($2, "\\s*$attr\\s*", " ")) . " " . trim(string_find_replace($3, "\\s*$attr\\s*", "")) . " $attr" . ("$4" eq ";" ? ";" : " = ")/e;
+				}
+			}
+		}
+
+# check for $InitAttributeData (ie: __initdata) with const
+		if ($line =~ /\bconst\b/ && $line =~ /($InitAttributeData)/) {
+			my $attr = $1;
+			$attr =~ /($InitAttributePrefix)(.*)/;
+			my $attr_prefix = $1;
+			my $attr_type = $2;
+			if (ERROR("INIT_ATTRIBUTE",
+				  "Use of const init definition must use ${attr_prefix}initconst\n" . $herecurr) &&
+			    $fix) {
+				$fixed[$fixlinenr] =~
+				    s/$InitAttributeData/${attr_prefix}initconst/;
+			}
+		}
+
+# check for $InitAttributeConst (ie: __initconst) without const
+		if ($line !~ /\bconst\b/ && $line =~ /($InitAttributeConst)/) {
+			my $attr = $1;
+			if (ERROR("INIT_ATTRIBUTE",
+				  "Use of $attr requires a separate use of const\n" . $herecurr) &&
+			    $fix) {
+				my $lead = $fixed[$fixlinenr] =~
+				    /(^\+\s*(?:static\s+))/;
+				$lead = rtrim($1);
+				$lead = "$lead " if ($lead !~ /^\+$/);
+				$lead = "${lead}const ";
+				$fixed[$fixlinenr] =~ s/(^\+\s*(?:static\s+))/$lead/;
+			}
+		}
+
+# check for __read_mostly with const non-pointer (should just be const)
+		if ($line =~ /\b__read_mostly\b/ &&
+		    $line =~ /($Type)\s*$Ident/ && $1 !~ /\*\s*$/ && $1 =~ /\bconst\b/) {
+			if (ERROR("CONST_READ_MOSTLY",
+				  "Invalid use of __read_mostly with const type\n" . $herecurr) &&
+			    $fix) {
+				$fixed[$fixlinenr] =~ s/\s+__read_mostly\b//;
+			}
+		}
+
+# don't use __constant_<foo> functions outside of include/uapi/
+		if ($realfile !~ m@^include/uapi/@ &&
+		    $line =~ /(__constant_(?:htons|ntohs|[bl]e(?:16|32|64)_to_cpu|cpu_to_[bl]e(?:16|32|64)))\s*\(/) {
+			my $constant_func = $1;
+			my $func = $constant_func;
+			$func =~ s/^__constant_//;
+			if (WARN("CONSTANT_CONVERSION",
+				 "$constant_func should be $func\n" . $herecurr) &&
+			    $fix) {
+				$fixed[$fixlinenr] =~ s/\b$constant_func\b/$func/g;
+			}
+		}
+
+# prefer usleep_range over udelay
+		if ($line =~ /\budelay\s*\(\s*(\d+)\s*\)/) {
+			my $delay = $1;
+			# ignore udelay's < 10, however
+			if (! ($delay < 10) ) {
+				CHK("USLEEP_RANGE",
+				    "usleep_range is preferred over udelay; see Documentation/timers/timers-howto.txt\n" . $herecurr);
+			}
+			if ($delay > 2000) {
+				WARN("LONG_UDELAY",
+				     "long udelay - prefer mdelay; see arch/arm/include/asm/delay.h\n" . $herecurr);
+			}
+		}
+
+# warn about unexpectedly long msleep's
+		if ($line =~ /\bmsleep\s*\((\d+)\);/) {
+			if ($1 < 20) {
+				WARN("MSLEEP",
+				     "msleep < 20ms can sleep for up to 20ms; see Documentation/timers/timers-howto.txt\n" . $herecurr);
+			}
+		}
+
+# check for comparisons of jiffies
+		if ($line =~ /\bjiffies\s*$Compare|$Compare\s*jiffies\b/) {
+			WARN("JIFFIES_COMPARISON",
+			     "Comparing jiffies is almost always wrong; prefer time_after, time_before and friends\n" . $herecurr);
+		}
+
+# check for comparisons of get_jiffies_64()
+		if ($line =~ /\bget_jiffies_64\s*\(\s*\)\s*$Compare|$Compare\s*get_jiffies_64\s*\(\s*\)/) {
+			WARN("JIFFIES_COMPARISON",
+			     "Comparing get_jiffies_64() is almost always wrong; prefer time_after64, time_before64 and friends\n" . $herecurr);
+		}
+
+# warn about #ifdefs in C files
+#		if ($line =~ /^.\s*\#\s*if(|n)def/ && ($realfile =~ /\.c$/)) {
+#			print "#ifdef in C files should be avoided\n";
+#			print "$herecurr";
+#			$clean = 0;
+#		}
+
+# warn about spacing in #ifdefs
+		if ($line =~ /^.\s*\#\s*(ifdef|ifndef|elif)\s\s+/) {
+			if (ERROR("SPACING",
+				  "exactly one space required after that #$1\n" . $herecurr) &&
+			    $fix) {
+				$fixed[$fixlinenr] =~
+				    s/^(.\s*\#\s*(ifdef|ifndef|elif))\s{2,}/$1 /;
+			}
+
+		}
+
+# check for spinlock_t definitions without a comment.
+		if ($line =~ /^.\s*(struct\s+mutex|spinlock_t)\s+\S+;/ ||
+		    $line =~ /^.\s*(DEFINE_MUTEX)\s*\(/) {
+			my $which = $1;
+			if (!ctx_has_comment($first_line, $linenr)) {
+				CHK("UNCOMMENTED_DEFINITION",
+				    "$1 definition without comment\n" . $herecurr);
+			}
+		}
+# check for memory barriers without a comment.
+
+		my $barriers = qr{
+			mb|
+			rmb|
+			wmb|
+			read_barrier_depends
+		}x;
+		my $barrier_stems = qr{
+			mb__before_atomic|
+			mb__after_atomic|
+			store_release|
+			load_acquire|
+			store_mb|
+			(?:$barriers)
+		}x;
+		my $all_barriers = qr{
+			(?:$barriers)|
+			smp_(?:$barrier_stems)|
+			virt_(?:$barrier_stems)
+		}x;
+
+		if ($line =~ /\b(?:$all_barriers)\s*\(/) {
+			if (!ctx_has_comment($first_line, $linenr)) {
+				WARN("MEMORY_BARRIER",
+				     "memory barrier without comment\n" . $herecurr);
+			}
+		}
+
+		my $underscore_smp_barriers = qr{__smp_(?:$barrier_stems)}x;
+
+		if ($realfile !~ m@^include/asm-generic/@ &&
+		    $realfile !~ m@/barrier\.h$@ &&
+		    $line =~ m/\b(?:$underscore_smp_barriers)\s*\(/ &&
+		    $line !~ m/^.\s*\#\s*define\s+(?:$underscore_smp_barriers)\s*\(/) {
+			WARN("MEMORY_BARRIER",
+			     "__smp memory barriers shouldn't be used outside barrier.h and asm-generic\n" . $herecurr);
+		}
+
+# check for waitqueue_active without a comment.
+		if ($line =~ /\bwaitqueue_active\s*\(/) {
+			if (!ctx_has_comment($first_line, $linenr)) {
+				WARN("WAITQUEUE_ACTIVE",
+				     "waitqueue_active without comment\n" . $herecurr);
+			}
+		}
+
+# Check for expedited grace periods that interrupt non-idle non-nohz
+# online CPUs.  These expedited can therefore degrade real-time response
+# if used carelessly, and should be avoided where not absolutely
+# needed.  It is always OK to use synchronize_rcu_expedited() and
+# synchronize_sched_expedited() at boot time (before real-time applications
+# start) and in error situations where real-time response is compromised in
+# any case.  Note that synchronize_srcu_expedited() does -not- interrupt
+# other CPUs, so don't warn on uses of synchronize_srcu_expedited().
+# Of course, nothing comes for free, and srcu_read_lock() and
+# srcu_read_unlock() do contain full memory barriers in payment for
+# synchronize_srcu_expedited() non-interruption properties.
+		if ($line =~ /\b(synchronize_rcu_expedited|synchronize_sched_expedited)\(/) {
+			WARN("EXPEDITED_RCU_GRACE_PERIOD",
+			     "expedited RCU grace periods should be avoided where they can degrade real-time response\n" . $herecurr);
+
+		}
+
+# check of hardware specific defines
+		if ($line =~ m@^.\s*\#\s*if.*\b(__i386__|__powerpc64__|__sun__|__s390x__)\b@ && $realfile !~ m@include/asm-@) {
+			CHK("ARCH_DEFINES",
+			    "architecture specific defines should be avoided\n" .  $herecurr);
+		}
+
+# Check that the storage class is at the beginning of a declaration
+		if ($line =~ /\b$Storage\b/ && $line !~ /^.\s*$Storage\b/) {
+			WARN("STORAGE_CLASS",
+			     "storage class should be at the beginning of the declaration\n" . $herecurr)
+		}
+
+# check the location of the inline attribute, that it is between
+# storage class and type.
+		if ($line =~ /\b$Type\s+$Inline\b/ ||
+		    $line =~ /\b$Inline\s+$Storage\b/) {
+			ERROR("INLINE_LOCATION",
+			      "inline keyword should sit between storage class and type\n" . $herecurr);
+		}
+
+# Check for __inline__ and __inline, prefer inline
+		if ($realfile !~ m@\binclude/uapi/@ &&
+		    $line =~ /\b(__inline__|__inline)\b/) {
+			if (WARN("INLINE",
+				 "plain inline is preferred over $1\n" . $herecurr) &&
+			    $fix) {
+				$fixed[$fixlinenr] =~ s/\b(__inline__|__inline)\b/inline/;
+
+			}
+		}
+
+# Check for __attribute__ packed, prefer __packed
+		if ($realfile !~ m@\binclude/uapi/@ &&
+		    $line =~ /\b__attribute__\s*\(\s*\(.*\bpacked\b/) {
+			WARN("PREFER_PACKED",
+			     "__packed is preferred over __attribute__((packed))\n" . $herecurr);
+		}
+
+# Check for __attribute__ aligned, prefer __aligned
+		if ($realfile !~ m@\binclude/uapi/@ &&
+		    $line =~ /\b__attribute__\s*\(\s*\(.*aligned/) {
+			WARN("PREFER_ALIGNED",
+			     "__aligned(size) is preferred over __attribute__((aligned(size)))\n" . $herecurr);
+		}
+
+# Check for __attribute__ format(printf, prefer __printf
+		if ($realfile !~ m@\binclude/uapi/@ &&
+		    $line =~ /\b__attribute__\s*\(\s*\(\s*format\s*\(\s*printf/) {
+			if (WARN("PREFER_PRINTF",
+				 "__printf(string-index, first-to-check) is preferred over __attribute__((format(printf, string-index, first-to-check)))\n" . $herecurr) &&
+			    $fix) {
+				$fixed[$fixlinenr] =~ s/\b__attribute__\s*\(\s*\(\s*format\s*\(\s*printf\s*,\s*(.*)\)\s*\)\s*\)/"__printf(" . trim($1) . ")"/ex;
+
+			}
+		}
+
+# Check for __attribute__ format(scanf, prefer __scanf
+		if ($realfile !~ m@\binclude/uapi/@ &&
+		    $line =~ /\b__attribute__\s*\(\s*\(\s*format\s*\(\s*scanf\b/) {
+			if (WARN("PREFER_SCANF",
+				 "__scanf(string-index, first-to-check) is preferred over __attribute__((format(scanf, string-index, first-to-check)))\n" . $herecurr) &&
+			    $fix) {
+				$fixed[$fixlinenr] =~ s/\b__attribute__\s*\(\s*\(\s*format\s*\(\s*scanf\s*,\s*(.*)\)\s*\)\s*\)/"__scanf(" . trim($1) . ")"/ex;
+			}
+		}
+
+# Check for __attribute__ weak, or __weak declarations (may have link issues)
+		if ($^V && $^V ge 5.10.0 &&
+		    $line =~ /(?:$Declare|$DeclareMisordered)\s*$Ident\s*$balanced_parens\s*(?:$Attribute)?\s*;/ &&
+		    ($line =~ /\b__attribute__\s*\(\s*\(.*\bweak\b/ ||
+		     $line =~ /\b__weak\b/)) {
+			ERROR("WEAK_DECLARATION",
+			      "Using weak declarations can have unintended link defects\n" . $herecurr);
+		}
+
+# check for c99 types like uint8_t used outside of uapi/
+		if ($realfile !~ m@\binclude/uapi/@ &&
+		    $line =~ /\b($Declare)\s*$Ident\s*[=;,\[]/) {
+			my $type = $1;
+			if ($type =~ /\b($typeC99Typedefs)\b/) {
+				$type = $1;
+				my $kernel_type = 'u';
+				$kernel_type = 's' if ($type =~ /^_*[si]/);
+				$type =~ /(\d+)/;
+				$kernel_type .= $1;
+				if (CHK("PREFER_KERNEL_TYPES",
+					"Prefer kernel type '$kernel_type' over '$type'\n" . $herecurr) &&
+				    $fix) {
+					$fixed[$fixlinenr] =~ s/\b$type\b/$kernel_type/;
+				}
+			}
+		}
+
+# check for cast of C90 native int or longer types constants
+		if ($line =~ /(\(\s*$C90_int_types\s*\)\s*)($Constant)\b/) {
+			my $cast = $1;
+			my $const = $2;
+			if (WARN("TYPECAST_INT_CONSTANT",
+				 "Unnecessary typecast of c90 int constant\n" . $herecurr) &&
+			    $fix) {
+				my $suffix = "";
+				my $newconst = $const;
+				$newconst =~ s/${Int_type}$//;
+				$suffix .= 'U' if ($cast =~ /\bunsigned\b/);
+				if ($cast =~ /\blong\s+long\b/) {
+					$suffix .= 'LL';
+				} elsif ($cast =~ /\blong\b/) {
+					$suffix .= 'L';
+				}
+				$fixed[$fixlinenr] =~ s/\Q$cast\E$const\b/$newconst$suffix/;
+			}
+		}
+
+# check for sizeof(&)
+		if ($line =~ /\bsizeof\s*\(\s*\&/) {
+			WARN("SIZEOF_ADDRESS",
+			     "sizeof(& should be avoided\n" . $herecurr);
+		}
+
+# check for sizeof without parenthesis
+		if ($line =~ /\bsizeof\s+((?:\*\s*|)$Lval|$Type(?:\s+$Lval|))/) {
+			if (WARN("SIZEOF_PARENTHESIS",
+				 "sizeof $1 should be sizeof($1)\n" . $herecurr) &&
+			    $fix) {
+				$fixed[$fixlinenr] =~ s/\bsizeof\s+((?:\*\s*|)$Lval|$Type(?:\s+$Lval|))/"sizeof(" . trim($1) . ")"/ex;
+			}
+		}
+
+# check for struct spinlock declarations
+		if ($line =~ /^.\s*\bstruct\s+spinlock\s+\w+\s*;/) {
+			WARN("USE_SPINLOCK_T",
+			     "struct spinlock should be spinlock_t\n" . $herecurr);
+		}
+
+# check for seq_printf uses that could be seq_puts
+		if ($sline =~ /\bseq_printf\s*\(.*"\s*\)\s*;\s*$/) {
+			my $fmt = get_quoted_string($line, $rawline);
+			$fmt =~ s/%%//g;
+			if ($fmt !~ /%/) {
+				if (WARN("PREFER_SEQ_PUTS",
+					 "Prefer seq_puts to seq_printf\n" . $herecurr) &&
+				    $fix) {
+					$fixed[$fixlinenr] =~ s/\bseq_printf\b/seq_puts/;
+				}
+			}
+		}
+
+# Check for misused memsets
+		if ($^V && $^V ge 5.10.0 &&
+		    defined $stat &&
+		    $stat =~ /^\+(?:.*?)\bmemset\s*\(\s*$FuncArg\s*,\s*$FuncArg\s*\,\s*$FuncArg\s*\)/) {
+
+			my $ms_addr = $2;
+			my $ms_val = $7;
+			my $ms_size = $12;
+
+			if ($ms_size =~ /^(0x|)0$/i) {
+				ERROR("MEMSET",
+				      "memset to 0's uses 0 as the 2nd argument, not the 3rd\n" . "$here\n$stat\n");
+			} elsif ($ms_size =~ /^(0x|)1$/i) {
+				WARN("MEMSET",
+				     "single byte memset is suspicious. Swapped 2nd/3rd argument?\n" . "$here\n$stat\n");
+			}
+		}
+
+# Check for memcpy(foo, bar, ETH_ALEN) that could be ether_addr_copy(foo, bar)
+#		if ($^V && $^V ge 5.10.0 &&
+#		    defined $stat &&
+#		    $stat =~ /^\+(?:.*?)\bmemcpy\s*\(\s*$FuncArg\s*,\s*$FuncArg\s*\,\s*ETH_ALEN\s*\)/) {
+#			if (WARN("PREFER_ETHER_ADDR_COPY",
+#				 "Prefer ether_addr_copy() over memcpy() if the Ethernet addresses are __aligned(2)\n" . "$here\n$stat\n") &&
+#			    $fix) {
+#				$fixed[$fixlinenr] =~ s/\bmemcpy\s*\(\s*$FuncArg\s*,\s*$FuncArg\s*\,\s*ETH_ALEN\s*\)/ether_addr_copy($2, $7)/;
+#			}
+#		}
+
+# Check for memcmp(foo, bar, ETH_ALEN) that could be ether_addr_equal*(foo, bar)
+#		if ($^V && $^V ge 5.10.0 &&
+#		    defined $stat &&
+#		    $stat =~ /^\+(?:.*?)\bmemcmp\s*\(\s*$FuncArg\s*,\s*$FuncArg\s*\,\s*ETH_ALEN\s*\)/) {
+#			WARN("PREFER_ETHER_ADDR_EQUAL",
+#			     "Prefer ether_addr_equal() or ether_addr_equal_unaligned() over memcmp()\n" . "$here\n$stat\n")
+#		}
+
+# check for memset(foo, 0x0, ETH_ALEN) that could be eth_zero_addr
+# check for memset(foo, 0xFF, ETH_ALEN) that could be eth_broadcast_addr
+#		if ($^V && $^V ge 5.10.0 &&
+#		    defined $stat &&
+#		    $stat =~ /^\+(?:.*?)\bmemset\s*\(\s*$FuncArg\s*,\s*$FuncArg\s*\,\s*ETH_ALEN\s*\)/) {
+#
+#			my $ms_val = $7;
+#
+#			if ($ms_val =~ /^(?:0x|)0+$/i) {
+#				if (WARN("PREFER_ETH_ZERO_ADDR",
+#					 "Prefer eth_zero_addr over memset()\n" . "$here\n$stat\n") &&
+#				    $fix) {
+#					$fixed[$fixlinenr] =~ s/\bmemset\s*\(\s*$FuncArg\s*,\s*$FuncArg\s*,\s*ETH_ALEN\s*\)/eth_zero_addr($2)/;
+#				}
+#			} elsif ($ms_val =~ /^(?:0xff|255)$/i) {
+#				if (WARN("PREFER_ETH_BROADCAST_ADDR",
+#					 "Prefer eth_broadcast_addr() over memset()\n" . "$here\n$stat\n") &&
+#				    $fix) {
+#					$fixed[$fixlinenr] =~ s/\bmemset\s*\(\s*$FuncArg\s*,\s*$FuncArg\s*,\s*ETH_ALEN\s*\)/eth_broadcast_addr($2)/;
+#				}
+#			}
+#		}
+
+# typecasts on min/max could be min_t/max_t
+		if ($^V && $^V ge 5.10.0 &&
+		    defined $stat &&
+		    $stat =~ /^\+(?:.*?)\b(min|max)\s*\(\s*$FuncArg\s*,\s*$FuncArg\s*\)/) {
+			if (defined $2 || defined $7) {
+				my $call = $1;
+				my $cast1 = deparenthesize($2);
+				my $arg1 = $3;
+				my $cast2 = deparenthesize($7);
+				my $arg2 = $8;
+				my $cast;
+
+				if ($cast1 ne "" && $cast2 ne "" && $cast1 ne $cast2) {
+					$cast = "$cast1 or $cast2";
+				} elsif ($cast1 ne "") {
+					$cast = $cast1;
+				} else {
+					$cast = $cast2;
+				}
+				WARN("MINMAX",
+				     "$call() should probably be ${call}_t($cast, $arg1, $arg2)\n" . "$here\n$stat\n");
+			}
+		}
+
+# check usleep_range arguments
+		if ($^V && $^V ge 5.10.0 &&
+		    defined $stat &&
+		    $stat =~ /^\+(?:.*?)\busleep_range\s*\(\s*($FuncArg)\s*,\s*($FuncArg)\s*\)/) {
+			my $min = $1;
+			my $max = $7;
+			if ($min eq $max) {
+				WARN("USLEEP_RANGE",
+				     "usleep_range should not use min == max args; see Documentation/timers/timers-howto.txt\n" . "$here\n$stat\n");
+			} elsif ($min =~ /^\d+$/ && $max =~ /^\d+$/ &&
+				 $min > $max) {
+				WARN("USLEEP_RANGE",
+				     "usleep_range args reversed, use min then max; see Documentation/timers/timers-howto.txt\n" . "$here\n$stat\n");
+			}
+		}
+
+# check for naked sscanf
+		if ($^V && $^V ge 5.10.0 &&
+		    defined $stat &&
+		    $line =~ /\bsscanf\b/ &&
+		    ($stat !~ /$Ident\s*=\s*sscanf\s*$balanced_parens/ &&
+		     $stat !~ /\bsscanf\s*$balanced_parens\s*(?:$Compare)/ &&
+		     $stat !~ /(?:$Compare)\s*\bsscanf\s*$balanced_parens/)) {
+			my $lc = $stat =~ tr@\n@@;
+			$lc = $lc + $linenr;
+			my $stat_real = raw_line($linenr, 0);
+		        for (my $count = $linenr + 1; $count <= $lc; $count++) {
+				$stat_real = $stat_real . "\n" . raw_line($count, 0);
+			}
+			WARN("NAKED_SSCANF",
+			     "unchecked sscanf return value\n" . "$here\n$stat_real\n");
+		}
+
+# check for simple sscanf that should be kstrto<foo>
+		if ($^V && $^V ge 5.10.0 &&
+		    defined $stat &&
+		    $line =~ /\bsscanf\b/) {
+			my $lc = $stat =~ tr@\n@@;
+			$lc = $lc + $linenr;
+			my $stat_real = raw_line($linenr, 0);
+		        for (my $count = $linenr + 1; $count <= $lc; $count++) {
+				$stat_real = $stat_real . "\n" . raw_line($count, 0);
+			}
+			if ($stat_real =~ /\bsscanf\b\s*\(\s*$FuncArg\s*,\s*("[^"]+")/) {
+				my $format = $6;
+				my $count = $format =~ tr@%@%@;
+				if ($count == 1 &&
+				    $format =~ /^"\%(?i:ll[udxi]|[udxi]ll|ll|[hl]h?[udxi]|[udxi][hl]h?|[hl]h?|[udxi])"$/) {
+					WARN("SSCANF_TO_KSTRTO",
+					     "Prefer kstrto<type> to single variable sscanf\n" . "$here\n$stat_real\n");
+				}
+			}
+		}
+
+# check for new externs in .h files.
+		if ($realfile =~ /\.h$/ &&
+		    $line =~ /^\+\s*(extern\s+)$Type\s*$Ident\s*\(/s) {
+			if (CHK("AVOID_EXTERNS",
+				"extern prototypes should be avoided in .h files\n" . $herecurr) &&
+			    $fix) {
+				$fixed[$fixlinenr] =~ s/(.*)\bextern\b\s*(.*)/$1$2/;
+			}
+		}
+
+# check for new externs in .c files.
+		if ($realfile =~ /\.c$/ && defined $stat &&
+		    $stat =~ /^.\s*(?:extern\s+)?$Type\s+($Ident)(\s*)\(/s)
+		{
+			my $function_name = $1;
+			my $paren_space = $2;
+
+			my $s = $stat;
+			if (defined $cond) {
+				substr($s, 0, length($cond), '');
+			}
+			if ($s =~ /^\s*;/ &&
+			    $function_name ne 'uninitialized_var')
+			{
+				WARN("AVOID_EXTERNS",
+				     "externs should be avoided in .c files\n" .  $herecurr);
+			}
+
+			if ($paren_space =~ /\n/) {
+				WARN("FUNCTION_ARGUMENTS",
+				     "arguments for function declarations should follow identifier\n" . $herecurr);
+			}
+
+		} elsif ($realfile =~ /\.c$/ && defined $stat &&
+		    $stat =~ /^.\s*extern\s+/)
+		{
+			WARN("AVOID_EXTERNS",
+			     "externs should be avoided in .c files\n" .  $herecurr);
+		}
+
+		if ($realfile =~ /\.[ch]$/ && defined $stat &&
+		    $stat =~ /^.\s*(?:extern\s+)?$Type\s*$Ident\s*\(\s*([^{]+)\s*\)\s*;/s &&
+		    $1 ne "void") {
+			my $args = trim($1);
+			while ($args =~ m/\s*($Type\s*(?:$Ident|\(\s*\*\s*$Ident?\s*\)\s*$balanced_parens)?)/g) {
+				my $arg = trim($1);
+				if ($arg =~ /^$Type$/ && $arg !~ /enum\s+$Ident$/) {
+					WARN("FUNCTION_ARGUMENTS",
+					     "function definition argument '$arg' should also have an identifier name\n" . $herecurr);
+				}
+			}
+		}
+
+# checks for new __setup's
+		if ($rawline =~ /\b__setup\("([^"]*)"/) {
+			my $name = $1;
+
+			if (!grep(/$name/, @setup_docs)) {
+				CHK("UNDOCUMENTED_SETUP",
+				    "__setup appears un-documented -- check Documentation/kernel-parameters.txt\n" . $herecurr);
+			}
+		}
+
+# check for pointless casting of kmalloc return
+		if ($line =~ /\*\s*\)\s*[kv][czm]alloc(_node){0,1}\b/) {
+			WARN("UNNECESSARY_CASTS",
+			     "unnecessary cast may hide bugs, see http://c-faq.com/malloc/mallocnocast.html\n" . $herecurr);
+		}
+
+# alloc style
+# p = alloc(sizeof(struct foo), ...) should be p = alloc(sizeof(*p), ...)
+		if ($^V && $^V ge 5.10.0 &&
+		    $line =~ /\b($Lval)\s*\=\s*(?:$balanced_parens)?\s*([kv][mz]alloc(?:_node)?)\s*\(\s*(sizeof\s*\(\s*struct\s+$Lval\s*\))/) {
+			CHK("ALLOC_SIZEOF_STRUCT",
+			    "Prefer $3(sizeof(*$1)...) over $3($4...)\n" . $herecurr);
+		}
+
+# check for k[mz]alloc with multiplies that could be kmalloc_array/kcalloc
+		if ($^V && $^V ge 5.10.0 &&
+		    $line =~ /\b($Lval)\s*\=\s*(?:$balanced_parens)?\s*(k[mz]alloc)\s*\(\s*($FuncArg)\s*\*\s*($FuncArg)\s*,/) {
+			my $oldfunc = $3;
+			my $a1 = $4;
+			my $a2 = $10;
+			my $newfunc = "kmalloc_array";
+			$newfunc = "kcalloc" if ($oldfunc eq "kzalloc");
+			my $r1 = $a1;
+			my $r2 = $a2;
+			if ($a1 =~ /^sizeof\s*\S/) {
+				$r1 = $a2;
+				$r2 = $a1;
+			}
+			if ($r1 !~ /^sizeof\b/ && $r2 =~ /^sizeof\s*\S/ &&
+			    !($r1 =~ /^$Constant$/ || $r1 =~ /^[A-Z_][A-Z0-9_]*$/)) {
+				if (WARN("ALLOC_WITH_MULTIPLY",
+					 "Prefer $newfunc over $oldfunc with multiply\n" . $herecurr) &&
+				    $fix) {
+					$fixed[$fixlinenr] =~ s/\b($Lval)\s*\=\s*(?:$balanced_parens)?\s*(k[mz]alloc)\s*\(\s*($FuncArg)\s*\*\s*($FuncArg)/$1 . ' = ' . "$newfunc(" . trim($r1) . ', ' . trim($r2)/e;
+
+				}
+			}
+		}
+
+# check for krealloc arg reuse
+		if ($^V && $^V ge 5.10.0 &&
+		    $line =~ /\b($Lval)\s*\=\s*(?:$balanced_parens)?\s*krealloc\s*\(\s*\1\s*,/) {
+			WARN("KREALLOC_ARG_REUSE",
+			     "Reusing the krealloc arg is almost always a bug\n" . $herecurr);
+		}
+
+# check for alloc argument mismatch
+		if ($line =~ /\b(kcalloc|kmalloc_array)\s*\(\s*sizeof\b/) {
+			WARN("ALLOC_ARRAY_ARGS",
+			     "$1 uses number as first arg, sizeof is generally wrong\n" . $herecurr);
+		}
+
+# check for multiple semicolons
+		if ($line =~ /;\s*;\s*$/) {
+			if (WARN("ONE_SEMICOLON",
+				 "Statements terminations use 1 semicolon\n" . $herecurr) &&
+			    $fix) {
+				$fixed[$fixlinenr] =~ s/(\s*;\s*){2,}$/;/g;
+			}
+		}
+
+# check for #defines like: 1 << <digit> that could be BIT(digit), it is not exported to uapi
+		if ($realfile !~ m@^include/uapi/@ &&
+		    $line =~ /#\s*define\s+\w+\s+\(?\s*1\s*([ulUL]*)\s*\<\<\s*(?:\d+|$Ident)\s*\)?/) {
+			my $ull = "";
+			$ull = "_ULL" if (defined($1) && $1 =~ /ll/i);
+			if (CHK("BIT_MACRO",
+				"Prefer using the BIT$ull macro\n" . $herecurr) &&
+			    $fix) {
+				$fixed[$fixlinenr] =~ s/\(?\s*1\s*[ulUL]*\s*<<\s*(\d+|$Ident)\s*\)?/BIT${ull}($1)/;
+			}
+		}
+
+# check for #if defined CONFIG_<FOO> || defined CONFIG_<FOO>_MODULE
+		if ($line =~ /^\+\s*#\s*if\s+defined(?:\s*\(?\s*|\s+)(CONFIG_[A-Z_]+)\s*\)?\s*\|\|\s*defined(?:\s*\(?\s*|\s+)\1_MODULE\s*\)?\s*$/) {
+			my $config = $1;
+			if (WARN("PREFER_IS_ENABLED",
+				 "Prefer IS_ENABLED(<FOO>) to CONFIG_<FOO> || CONFIG_<FOO>_MODULE\n" . $herecurr) &&
+			    $fix) {
+				$fixed[$fixlinenr] = "\+#if IS_ENABLED($config)";
+			}
+		}
+
+# check for case / default statements not preceded by break/fallthrough/switch
+		if ($line =~ /^.\s*(?:case\s+(?:$Ident|$Constant)\s*|default):/) {
+			my $has_break = 0;
+			my $has_statement = 0;
+			my $count = 0;
+			my $prevline = $linenr;
+			while ($prevline > 1 && ($file || $count < 3) && !$has_break) {
+				$prevline--;
+				my $rline = $rawlines[$prevline - 1];
+				my $fline = $lines[$prevline - 1];
+				last if ($fline =~ /^\@\@/);
+				next if ($fline =~ /^\-/);
+				next if ($fline =~ /^.(?:\s*(?:case\s+(?:$Ident|$Constant)[\s$;]*|default):[\s$;]*)*$/);
+				$has_break = 1 if ($rline =~ /fall[\s_-]*(through|thru)/i);
+				next if ($fline =~ /^.[\s$;]*$/);
+				$has_statement = 1;
+				$count++;
+				$has_break = 1 if ($fline =~ /\bswitch\b|\b(?:break\s*;[\s$;]*$|return\b|goto\b|continue\b)/);
+			}
+			if (!$has_break && $has_statement) {
+				WARN("MISSING_BREAK",
+				     "Possible switch case/default not preceeded by break or fallthrough comment\n" . $herecurr);
+			}
+		}
+
+# check for switch/default statements without a break;
+		if ($^V && $^V ge 5.10.0 &&
+		    defined $stat &&
+		    $stat =~ /^\+[$;\s]*(?:case[$;\s]+\w+[$;\s]*:[$;\s]*|)*[$;\s]*\bdefault[$;\s]*:[$;\s]*;/g) {
+			my $ctx = '';
+			my $herectx = $here . "\n";
+			my $cnt = statement_rawlines($stat);
+			for (my $n = 0; $n < $cnt; $n++) {
+				$herectx .= raw_line($linenr, $n) . "\n";
+			}
+			WARN("DEFAULT_NO_BREAK",
+			     "switch default: should use break\n" . $herectx);
+		}
+
+# check for gcc specific __FUNCTION__
+		if ($line =~ /\b__FUNCTION__\b/) {
+			if (WARN("USE_FUNC",
+				 "__func__ should be used instead of gcc specific __FUNCTION__\n"  . $herecurr) &&
+			    $fix) {
+				$fixed[$fixlinenr] =~ s/\b__FUNCTION__\b/__func__/g;
+			}
+		}
+
+# check for uses of __DATE__, __TIME__, __TIMESTAMP__
+		while ($line =~ /\b(__(?:DATE|TIME|TIMESTAMP)__)\b/g) {
+			ERROR("DATE_TIME",
+			      "Use of the '$1' macro makes the build non-deterministic\n" . $herecurr);
+		}
+
+# check for use of yield()
+		if ($line =~ /\byield\s*\(\s*\)/) {
+			WARN("YIELD",
+			     "Using yield() is generally wrong. See yield() kernel-doc (sched/core.c)\n"  . $herecurr);
+		}
+
+# check for comparisons against true and false
+		if ($line =~ /\+\s*(.*?)\b(true|false|$Lval)\s*(==|\!=)\s*(true|false|$Lval)\b(.*)$/i) {
+			my $lead = $1;
+			my $arg = $2;
+			my $test = $3;
+			my $otype = $4;
+			my $trail = $5;
+			my $op = "!";
+
+			($arg, $otype) = ($otype, $arg) if ($arg =~ /^(?:true|false)$/i);
+
+			my $type = lc($otype);
+			if ($type =~ /^(?:true|false)$/) {
+				if (("$test" eq "==" && "$type" eq "true") ||
+				    ("$test" eq "!=" && "$type" eq "false")) {
+					$op = "";
+				}
+
+				CHK("BOOL_COMPARISON",
+				    "Using comparison to $otype is error prone\n" . $herecurr);
+
+## maybe suggesting a correct construct would better
+##				    "Using comparison to $otype is error prone.  Perhaps use '${lead}${op}${arg}${trail}'\n" . $herecurr);
+
+			}
+		}
+
+# check for semaphores initialized locked
+		if ($line =~ /^.\s*sema_init.+,\W?0\W?\)/) {
+			WARN("CONSIDER_COMPLETION",
+			     "consider using a completion\n" . $herecurr);
+		}
+
+# recommend kstrto* over simple_strto* and strict_strto*
+		if ($line =~ /\b((simple|strict)_(strto(l|ll|ul|ull)))\s*\(/) {
+			WARN("CONSIDER_KSTRTO",
+			     "$1 is obsolete, use k$3 instead\n" . $herecurr);
+		}
+
+# check for __initcall(), use device_initcall() explicitly or more appropriate function please
+		if ($line =~ /^.\s*__initcall\s*\(/) {
+			WARN("USE_DEVICE_INITCALL",
+			     "please use device_initcall() or more appropriate function instead of __initcall() (see include/linux/init.h)\n" . $herecurr);
+		}
+
+# check for various structs that are normally const (ops, kgdb, device_tree)
+		if ($line !~ /\bconst\b/ &&
+		    $line =~ /\bstruct\s+($const_structs)\b/) {
+			WARN("CONST_STRUCT",
+			     "struct $1 should normally be const\n" .
+				$herecurr);
+		}
+
+# use of NR_CPUS is usually wrong
+# ignore definitions of NR_CPUS and usage to define arrays as likely right
+		if ($line =~ /\bNR_CPUS\b/ &&
+		    $line !~ /^.\s*\s*#\s*if\b.*\bNR_CPUS\b/ &&
+		    $line !~ /^.\s*\s*#\s*define\b.*\bNR_CPUS\b/ &&
+		    $line !~ /^.\s*$Declare\s.*\[[^\]]*NR_CPUS[^\]]*\]/ &&
+		    $line !~ /\[[^\]]*\.\.\.[^\]]*NR_CPUS[^\]]*\]/ &&
+		    $line !~ /\[[^\]]*NR_CPUS[^\]]*\.\.\.[^\]]*\]/)
+		{
+			WARN("NR_CPUS",
+			     "usage of NR_CPUS is often wrong - consider using cpu_possible(), num_possible_cpus(), for_each_possible_cpu(), etc\n" . $herecurr);
+		}
+
+# Use of __ARCH_HAS_<FOO> or ARCH_HAVE_<BAR> is wrong.
+		if ($line =~ /\+\s*#\s*define\s+((?:__)?ARCH_(?:HAS|HAVE)\w*)\b/) {
+			ERROR("DEFINE_ARCH_HAS",
+			      "#define of '$1' is wrong - use Kconfig variables or standard guards instead\n" . $herecurr);
+		}
+
+# likely/unlikely comparisons similar to "(likely(foo) > 0)"
+		if ($^V && $^V ge 5.10.0 &&
+		    $line =~ /\b((?:un)?likely)\s*\(\s*$FuncArg\s*\)\s*$Compare/) {
+			WARN("LIKELY_MISUSE",
+			     "Using $1 should generally have parentheses around the comparison\n" . $herecurr);
+		}
+
+# whine mightly about in_atomic
+		if ($line =~ /\bin_atomic\s*\(/) {
+			if ($realfile =~ m@^drivers/@) {
+				ERROR("IN_ATOMIC",
+				      "do not use in_atomic in drivers\n" . $herecurr);
+			} elsif ($realfile !~ m@^kernel/@) {
+				WARN("IN_ATOMIC",
+				     "use of in_atomic() is incorrect outside core kernel code\n" . $herecurr);
+			}
+		}
+
+# whine about ACCESS_ONCE
+		if ($^V && $^V ge 5.10.0 &&
+		    $line =~ /\bACCESS_ONCE\s*$balanced_parens\s*(=(?!=))?\s*($FuncArg)?/) {
+			my $par = $1;
+			my $eq = $2;
+			my $fun = $3;
+			$par =~ s/^\(\s*(.*)\s*\)$/$1/;
+			if (defined($eq)) {
+				if (WARN("PREFER_WRITE_ONCE",
+					 "Prefer WRITE_ONCE(<FOO>, <BAR>) over ACCESS_ONCE(<FOO>) = <BAR>\n" . $herecurr) &&
+				    $fix) {
+					$fixed[$fixlinenr] =~ s/\bACCESS_ONCE\s*\(\s*\Q$par\E\s*\)\s*$eq\s*\Q$fun\E/WRITE_ONCE($par, $fun)/;
+				}
+			} else {
+				if (WARN("PREFER_READ_ONCE",
+					 "Prefer READ_ONCE(<FOO>) over ACCESS_ONCE(<FOO>)\n" . $herecurr) &&
+				    $fix) {
+					$fixed[$fixlinenr] =~ s/\bACCESS_ONCE\s*\(\s*\Q$par\E\s*\)/READ_ONCE($par)/;
+				}
+			}
+		}
+
+# check for lockdep_set_novalidate_class
+		if ($line =~ /^.\s*lockdep_set_novalidate_class\s*\(/ ||
+		    $line =~ /__lockdep_no_validate__\s*\)/ ) {
+			if ($realfile !~ m@^kernel/lockdep@ &&
+			    $realfile !~ m@^include/linux/lockdep@ &&
+			    $realfile !~ m@^drivers/base/core@) {
+				ERROR("LOCKDEP",
+				      "lockdep_no_validate class is reserved for device->mutex.\n" . $herecurr);
+			}
+		}
+
+		if ($line =~ /debugfs_create_\w+.*\b$mode_perms_world_writable\b/ ||
+		    $line =~ /DEVICE_ATTR.*\b$mode_perms_world_writable\b/) {
+			WARN("EXPORTED_WORLD_WRITABLE",
+			     "Exporting world writable files is usually an error. Consider more restrictive permissions.\n" . $herecurr);
+		}
+
+# Mode permission misuses where it seems decimal should be octal
+# This uses a shortcut match to avoid unnecessary uses of a slow foreach loop
+		if ($^V && $^V ge 5.10.0 &&
+		    defined $stat &&
+		    $line =~ /$mode_perms_search/) {
+			foreach my $entry (@mode_permission_funcs) {
+				my $func = $entry->[0];
+				my $arg_pos = $entry->[1];
+
+				my $lc = $stat =~ tr@\n@@;
+				$lc = $lc + $linenr;
+				my $stat_real = raw_line($linenr, 0);
+				for (my $count = $linenr + 1; $count <= $lc; $count++) {
+					$stat_real = $stat_real . "\n" . raw_line($count, 0);
+				}
+
+				my $skip_args = "";
+				if ($arg_pos > 1) {
+					$arg_pos--;
+					$skip_args = "(?:\\s*$FuncArg\\s*,\\s*){$arg_pos,$arg_pos}";
+				}
+				my $test = "\\b$func\\s*\\(${skip_args}($FuncArg(?:\\|\\s*$FuncArg)*)\\s*[,\\)]";
+				if ($stat =~ /$test/) {
+					my $val = $1;
+					$val = $6 if ($skip_args ne "");
+					if (($val =~ /^$Int$/ && $val !~ /^$Octal$/) ||
+					    ($val =~ /^$Octal$/ && length($val) ne 4)) {
+						ERROR("NON_OCTAL_PERMISSIONS",
+						      "Use 4 digit octal (0777) not decimal permissions\n" . "$here\n" . $stat_real);
+					}
+					if ($val =~ /^$Octal$/ && (oct($val) & 02)) {
+						ERROR("EXPORTED_WORLD_WRITABLE",
+						      "Exporting writable files is usually an error. Consider more restrictive permissions.\n" . "$here\n" . $stat_real);
+					}
+				}
+			}
+		}
+
+# check for uses of S_<PERMS> that could be octal for readability
+		if ($line =~ /\b$mode_perms_string_search\b/) {
+			my $val = "";
+			my $oval = "";
+			my $to = 0;
+			my $curpos = 0;
+			my $lastpos = 0;
+			while ($line =~ /\b(($mode_perms_string_search)\b(?:\s*\|\s*)?\s*)/g) {
+				$curpos = pos($line);
+				my $match = $2;
+				my $omatch = $1;
+				last if ($lastpos > 0 && ($curpos - length($omatch) != $lastpos));
+				$lastpos = $curpos;
+				$to |= $mode_permission_string_types{$match};
+				$val .= '\s*\|\s*' if ($val ne "");
+				$val .= $match;
+				$oval .= $omatch;
+			}
+			$oval =~ s/^\s*\|\s*//;
+			$oval =~ s/\s*\|\s*$//;
+			my $octal = sprintf("%04o", $to);
+			if (WARN("SYMBOLIC_PERMS",
+				 "Symbolic permissions '$oval' are not preferred. Consider using octal permissions '$octal'.\n" . $herecurr) &&
+			    $fix) {
+				$fixed[$fixlinenr] =~ s/$val/$octal/;
+			}
+		}
+
+# validate content of MODULE_LICENSE against list from include/linux/module.h
+		if ($line =~ /\bMODULE_LICENSE\s*\(\s*($String)\s*\)/) {
+			my $extracted_string = get_quoted_string($line, $rawline);
+			my $valid_licenses = qr{
+						GPL|
+						GPL\ v2|
+						GPL\ and\ additional\ rights|
+						Dual\ BSD/GPL|
+						Dual\ MIT/GPL|
+						Dual\ MPL/GPL|
+						Proprietary
+					}x;
+			if ($extracted_string !~ /^"(?:$valid_licenses)"$/x) {
+				WARN("MODULE_LICENSE",
+				     "unknown module license " . $extracted_string . "\n" . $herecurr);
+			}
+		}
+	}
+
+	# If we have no input at all, then there is nothing to report on
+	# so just keep quiet.
+	if ($#rawlines == -1) {
+		exit(0);
+	}
+
+	# In mailback mode only produce a report in the negative, for
+	# things that appear to be patches.
+	if ($mailback && ($clean == 1 || !$is_patch)) {
+		exit(0);
+	}
+
+	# This is not a patch, and we are are in 'no-patch' mode so
+	# just keep quiet.
+	if (!$chk_patch && !$is_patch) {
+		exit(0);
+	}
+
+	if (!$is_patch && $file !~ /cover-letter\.patch$/) {
+		ERROR("NOT_UNIFIED_DIFF",
+		      "Does not appear to be a unified-diff format patch\n");
+	}
+	if ($is_patch && $has_commit_log && $chk_signoff && $signoff == 0) {
+		ERROR("MISSING_SIGN_OFF",
+		      "Missing Signed-off-by: line(s)\n");
+	}
+
+	print report_dump();
+	if ($summary && !($clean == 1 && $quiet == 1)) {
+		print "$filename " if ($summary_file);
+		print "total: $cnt_error errors, $cnt_warn warnings, " .
+			(($check)? "$cnt_chk checks, " : "") .
+			"$cnt_lines lines checked\n";
+	}
+
+	if ($quiet == 0) {
+		# If there were any defects found and not already fixing them
+		if (!$clean and !$fix) {
+			print << "EOM"
+
+NOTE: For some of the reported defects, checkpatch may be able to
+      mechanically convert to the typical style using --fix or --fix-inplace.
+EOM
+		}
+		# If there were whitespace errors which cleanpatch can fix
+		# then suggest that.
+		if ($rpt_cleaners) {
+			$rpt_cleaners = 0;
+			print << "EOM"
+
+NOTE: Whitespace errors detected.
+      You may wish to use scripts/cleanpatch or scripts/cleanfile
+EOM
+		}
+	}
+
+	if ($clean == 0 && $fix &&
+	    ("@rawlines" ne "@fixed" ||
+	     $#fixed_inserted >= 0 || $#fixed_deleted >= 0)) {
+		my $newfile = $filename;
+		$newfile .= ".EXPERIMENTAL-checkpatch-fixes" if (!$fix_inplace);
+		my $linecount = 0;
+		my $f;
+
+		@fixed = fix_inserted_deleted_lines(\@fixed, \@fixed_inserted, \@fixed_deleted);
+
+		open($f, '>', $newfile)
+		    or die "$P: Can't open $newfile for write\n";
+		foreach my $fixed_line (@fixed) {
+			$linecount++;
+			if ($file) {
+				if ($linecount > 3) {
+					$fixed_line =~ s/^\+//;
+					print $f $fixed_line . "\n";
+				}
+			} else {
+				print $f $fixed_line . "\n";
+			}
+		}
+		close($f);
+
+		if (!$quiet) {
+			print << "EOM";
+
+Wrote EXPERIMENTAL --fix correction(s) to '$newfile'
+
+Do _NOT_ trust the results written to this file.
+Do _NOT_ submit these changes without inspecting them for correctness.
+
+This EXPERIMENTAL file is simply a convenience to help rewrite patches.
+No warranties, expressed or implied...
+EOM
+		}
+	}
+
+	if ($quiet == 0) {
+		print "\n";
+		if ($clean == 1) {
+			print "$vname has no obvious style problems and is ready for submission.\n";
+		} else {
+			print "$vname has style problems, please review.\n";
+		}
+	}
+	return $clean;
+}
diff --git a/util/const_structs.checkpatch b/util/const_structs.checkpatch
new file mode 100644
index 0000000..ac5f126
--- /dev/null
+++ b/util/const_structs.checkpatch
@@ -0,0 +1,64 @@
+acpi_dock_ops
+address_space_operations
+backlight_ops
+block_device_operations
+clk_ops
+comedi_lrange
+component_ops
+dentry_operations
+dev_pm_ops
+dma_map_ops
+driver_info
+drm_connector_funcs
+drm_encoder_funcs
+drm_encoder_helper_funcs
+ethtool_ops
+extent_io_ops
+file_lock_operations
+file_operations
+hv_ops
+ide_dma_ops
+ide_port_ops
+inode_operations
+intel_dvo_dev_ops
+irq_domain_ops
+item_operations
+iwl_cfg
+iwl_ops
+kgdb_arch
+kgdb_io
+kset_uevent_ops
+lock_manager_operations
+machine_desc
+microcode_ops
+mlxsw_reg_info
+mtrr_ops
+neigh_ops
+net_device_ops
+nlmsvc_binding
+nvkm_device_chip
+of_device_id
+pci_raw_ops
+pipe_buf_operations
+platform_hibernation_ops
+platform_suspend_ops
+proto_ops
+regmap_access_table
+rpc_pipe_ops
+rtc_class_ops
+sd_desc
+seq_operations
+sirfsoc_padmux
+snd_ac97_build_ops
+snd_soc_component_driver
+soc_pcmcia_socket_ops
+stacktrace_ops
+sysfs_ops
+tty_operations
+uart_ops
+usb_mon_operations
+v4l2_ctrl_ops
+v4l2_ioctl_ops
+vm_operations_struct
+wacom_features
+wd_ops
diff --git a/util/spelling.txt b/util/spelling.txt
new file mode 100644
index 0000000..163c720
--- /dev/null
+++ b/util/spelling.txt
@@ -0,0 +1,1072 @@
+# Originally from Debian's Lintian tool. Various false positives have been
+# removed, and various additions have been made as they've been discovered
+# in the kernel source.
+#
+# License: GPLv2
+#
+# The format of each line is:
+# mistake||correction
+#
+abandonning||abandoning
+abigious||ambiguous
+abitrate||arbitrate
+abov||above
+abreviated||abbreviated
+absense||absence
+absolut||absolute
+absoulte||absolute
+acccess||access
+acceleratoin||acceleration
+accelleration||acceleration
+accesing||accessing
+accesnt||accent
+accessable||accessible
+accesss||access
+accidentaly||accidentally
+accidentually||accidentally
+accoding||according
+accomodate||accommodate
+accomodates||accommodates
+accordign||according
+accoring||according
+accout||account
+accquire||acquire
+accquired||acquired
+accross||across
+acessable||accessible
+acess||access
+achitecture||architecture
+acient||ancient
+acitions||actions
+acitve||active
+acknowldegement||acknowldegement
+acknowledgement||acknowledgment
+ackowledge||acknowledge
+ackowledged||acknowledged
+acording||according
+activete||activate
+acumulating||accumulating
+adapater||adapter
+addional||additional
+additionaly||additionally
+addres||address
+addreses||addresses
+addresss||address
+aditional||additional
+aditionally||additionally
+aditionaly||additionally
+adminstrative||administrative
+adress||address
+adresses||addresses
+adviced||advised
+afecting||affecting
+agaist||against
+albumns||albums
+alegorical||allegorical
+algorith||algorithm
+algorithmical||algorithmically
+algoritm||algorithm
+algoritms||algorithms
+algorrithm||algorithm
+algorritm||algorithm
+allign||align
+allocatrd||allocated
+allocte||allocate
+allpication||application
+alocate||allocate
+alogirhtms||algorithms
+alogrithm||algorithm
+alot||a lot
+alow||allow
+alows||allows
+altough||although
+alue||value
+ambigious||ambiguous
+amoung||among
+amout||amount
+analysator||analyzer
+ang||and
+anniversery||anniversary
+annoucement||announcement
+anomolies||anomalies
+anomoly||anomaly
+anway||anyway
+aplication||application
+appearence||appearance
+applicaion||application
+appliction||application
+applictions||applications
+appplications||applications
+appropiate||appropriate
+appropriatly||appropriately
+approriate||appropriate
+approriately||appropriately
+apropriate||appropriate
+aquainted||acquainted
+aquired||acquired
+aquisition||acquisition
+arbitary||arbitrary
+architechture||architecture
+arguement||argument
+arguements||arguments
+aritmetic||arithmetic
+arne't||aren't
+arraival||arrival
+artifical||artificial
+artillary||artillery
+asign||assign
+assertation||assertion
+assiged||assigned
+assigment||assignment
+assigments||assignments
+assistent||assistant
+assocation||association
+associcated||associated
+assotiated||associated
+assum||assume
+assumtpion||assumption
+asuming||assuming
+asycronous||asynchronous
+asynchnous||asynchronous
+atomatically||automatically
+atomicly||atomically
+attachement||attachment
+attched||attached
+attemps||attempts
+attruibutes||attributes
+authentification||authentication
+automaticaly||automatically
+automaticly||automatically
+automatize||automate
+automatized||automated
+automatizes||automates
+autonymous||autonomous
+auxillary||auxiliary
+auxilliary||auxiliary
+avaiable||available
+avaible||available
+availabe||available
+availabled||available
+availablity||availability
+availale||available
+availavility||availability
+availble||available
+availiable||available
+avalable||available
+avaliable||available
+aysnc||async
+backgroud||background
+backword||backward
+backwords||backwards
+bahavior||behavior
+bakup||backup
+baloon||balloon
+baloons||balloons
+bandwith||bandwidth
+batery||battery
+beacuse||because
+becasue||because
+becomming||becoming
+becuase||because
+beeing||being
+befor||before
+begining||beginning
+beter||better
+betweeen||between
+bianries||binaries
+bitmast||bitmask
+boardcast||broadcast
+borad||board
+boundry||boundary
+brievely||briefly
+broadcat||broadcast
+cacluated||calculated
+caculation||calculation
+calender||calendar
+calle||called
+calucate||calculate
+calulate||calculate
+cancelation||cancellation
+capabilites||capabilities
+capabitilies||capabilities
+capatibilities||capabilities
+carefuly||carefully
+cariage||carriage
+catagory||category
+cehck||check
+challange||challenge
+challanges||challenges
+chanell||channel
+changable||changeable
+channle||channel
+channnel||channel
+charachter||character
+charachters||characters
+charactor||character
+charater||character
+charaters||characters
+charcter||character
+chcek||check
+chck||check
+checksuming||checksumming
+childern||children
+childs||children
+chiled||child
+chked||checked
+chnage||change
+chnages||changes
+chnnel||channel
+choosen||chosen
+chouse||chose
+circumvernt||circumvent
+claread||cleared
+clared||cleared
+closeing||closing
+clustred||clustered
+collapsable||collapsible
+colorfull||colorful
+comand||command
+comit||commit
+commerical||commercial
+comming||coming
+comminucation||communication
+commited||committed
+commiting||committing
+committ||commit
+commoditiy||commodity
+compability||compatibility
+compaibility||compatibility
+compatability||compatibility
+compatable||compatible
+compatibiliy||compatibility
+compatibilty||compatibility
+compatiblity||compatibility
+competion||completion
+compilant||compliant
+compleatly||completely
+completly||completely
+complient||compliant
+componnents||components
+compres||compress
+compresion||compression
+comression||compression
+comunication||communication
+conbination||combination
+conditionaly||conditionally
+conected||connected
+configuratoin||configuration
+configuraton||configuration
+configuretion||configuration
+conider||consider
+conjuction||conjunction
+connectinos||connections
+connnection||connection
+connnections||connections
+consistancy||consistency
+consistant||consistent
+containes||contains
+containts||contains
+contaisn||contains
+contant||contact
+contence||contents
+continous||continuous
+continously||continuously
+continueing||continuing
+contraints||constraints
+controled||controlled
+controler||controller
+controll||control
+contruction||construction
+contry||country
+convertion||conversion
+convertor||converter
+convienient||convenient
+convinient||convenient
+corected||corrected
+correponding||corresponding
+correponds||corresponds
+correspoding||corresponding
+cotrol||control
+couter||counter
+coutner||counter
+cryptocraphic||cryptographic
+cunter||counter
+curently||currently
+dafault||default
+deafult||default
+deamon||daemon
+decompres||decompress
+decription||description
+defailt||default
+defferred||deferred
+definate||definite
+definately||definitely
+defintion||definition
+defintions||definitions
+defualt||default
+defult||default
+deivce||device
+delared||declared
+delare||declare
+delares||declares
+delaring||declaring
+delemiter||delimiter
+dependancies||dependencies
+dependancy||dependency
+dependant||dependent
+depreacted||deprecated
+depreacte||deprecate
+desactivate||deactivate
+desciptors||descriptors
+descripton||description
+descrition||description
+descritptor||descriptor
+desctiptor||descriptor
+desriptor||descriptor
+desriptors||descriptors
+destory||destroy
+destoryed||destroyed
+destorys||destroys
+destroied||destroyed
+detabase||database
+develope||develop
+developement||development
+developped||developed
+developpement||development
+developper||developer
+developpment||development
+deveolpment||development
+devided||divided
+deviece||device
+diable||disable
+dictionnary||dictionary
+didnt||didn't
+diferent||different
+differrence||difference
+difinition||definition
+diplay||display
+direectly||directly
+disapear||disappear
+disapeared||disappeared
+disappared||disappeared
+disconnet||disconnect
+discontinous||discontinuous
+dispertion||dispersion
+dissapears||disappears
+distiction||distinction
+docuentation||documentation
+documantation||documentation
+documentaion||documentation
+documment||document
+doesnt||doesn't
+dorp||drop
+dosen||doesn
+downlad||download
+downlads||downloads
+druing||during
+dynmaic||dynamic
+easilly||easily
+ecspecially||especially
+edditable||editable
+editting||editing
+efficently||efficiently
+ehther||ether
+eigth||eight
+eletronic||electronic
+enabledi||enabled
+enchanced||enhanced
+encorporating||incorporating
+encrupted||encrypted
+encrypiton||encryption
+endianess||endianness
+enhaced||enhanced
+enlightnment||enlightenment
+enocded||encoded
+enterily||entirely
+enviroiment||environment
+enviroment||environment
+environement||environment
+environent||environment
+eqivalent||equivalent
+equiped||equipped
+equivelant||equivalent
+equivilant||equivalent
+eror||error
+estbalishment||establishment
+etsablishment||establishment
+etsbalishment||establishment
+excecutable||executable
+exceded||exceeded
+excellant||excellent
+existance||existence
+existant||existent
+exixt||exist
+exlcude||exclude
+exlcusive||exclusive
+exmaple||example
+expecially||especially
+explicite||explicit
+explicitely||explicitly
+explict||explicit
+explictly||explicitly
+expresion||expression
+exprimental||experimental
+extened||extended
+extensability||extensibility
+extention||extension
+extracter||extractor
+faild||failed
+faill||fail
+failue||failure
+failuer||failure
+faireness||fairness
+faliure||failure
+familar||familiar
+fatser||faster
+feauture||feature
+feautures||features
+fetaure||feature
+fetaures||features
+fileystem||filesystem
+fimware||firmware
+finanize||finalize
+findn||find
+finilizes||finalizes
+finsih||finish
+flusing||flushing
+folloing||following
+followign||following
+follwing||following
+forseeable||foreseeable
+forse||force
+fortan||fortran
+forwardig||forwarding
+framwork||framework
+frequncy||frequency
+frome||from
+fucntion||function
+fuction||function
+fuctions||functions
+funcion||function
+functionallity||functionality
+functionaly||functionally
+functionnality||functionality
+functonality||functionality
+funtion||function
+funtions||functions
+furthur||further
+futhermore||furthermore
+futrue||future
+gaurenteed||guaranteed
+generiously||generously
+genric||generic
+globel||global
+grabing||grabbing
+grahical||graphical
+grahpical||graphical
+grapic||graphic
+guage||gauge
+guarenteed||guaranteed
+guarentee||guarantee
+halfs||halves
+hander||handler
+handfull||handful
+hanled||handled
+happend||happened
+harware||hardware
+heirarchically||hierarchically
+helpfull||helpful
+hierachy||hierarchy
+hierarchie||hierarchy
+howver||however
+hsould||should
+hypter||hyper
+identidier||identifier
+imblance||imbalance
+immeadiately||immediately
+immedaite||immediate
+immediatelly||immediately
+immediatly||immediately
+immidiate||immediate
+impelentation||implementation
+impementated||implemented
+implemantation||implementation
+implemenation||implementation
+implementaiton||implementation
+implementated||implemented
+implemention||implementation
+implemetation||implementation
+implemntation||implementation
+implentation||implementation
+implmentation||implementation
+implmenting||implementing
+incomming||incoming
+incompatabilities||incompatibilities
+incompatable||incompatible
+inconsistant||inconsistent
+increas||increase
+incrment||increment
+indendation||indentation
+indended||intended
+independant||independent
+independantly||independently
+independed||independent
+indiate||indicate
+inexpect||inexpected
+infomation||information
+informatiom||information
+informations||information
+informtion||information
+infromation||information
+ingore||ignore
+inital||initial
+initalised||initialized
+initalise||initialize
+initalize||initialize
+initation||initiation
+initators||initiators
+initializiation||initialization
+initialzed||initialized
+initilization||initialization
+initilize||initialize
+inofficial||unofficial
+insititute||institute
+instal||install
+inteface||interface
+integreated||integrated
+integrety||integrity
+integrey||integrity
+intendet||intended
+intented||intended
+interanl||internal
+interchangable||interchangeable
+interferring||interfering
+interger||integer
+intermittant||intermittent
+internel||internal
+interoprability||interoperability
+interrface||interface
+interrrupt||interrupt
+interrup||interrupt
+interrups||interrupts
+interruptted||interrupted
+interupted||interrupted
+interupt||interrupt
+intial||initial
+intialized||initialized
+intialize||initialize
+intregral||integral
+intrrupt||interrupt
+intuative||intuitive
+invaid||invalid
+invalde||invald
+invalide||invalid
+invididual||individual
+invokation||invocation
+invokations||invocations
+irrelevent||irrelevant
+isnt||isn't
+isssue||issue
+itslef||itself
+jave||java
+jeffies||jiffies
+juse||just
+jus||just
+kown||known
+langage||language
+langauage||language
+langauge||language
+langugage||language
+lauch||launch
+layed||laid
+leightweight||lightweight
+lengh||length
+lenght||length
+lenth||length
+lesstiff||lesstif
+libaries||libraries
+libary||library
+librairies||libraries
+libraris||libraries
+licenceing||licencing
+loggging||logging
+loggin||login
+logile||logfile
+loosing||losing
+losted||lost
+machinary||machinery
+maintainance||maintenance
+maintainence||maintenance
+maintan||maintain
+makeing||making
+malplaced||misplaced
+malplace||misplace
+managable||manageable
+managment||management
+mangement||management
+manoeuvering||maneuvering
+mappping||mapping
+mathimatical||mathematical
+mathimatic||mathematic
+mathimatics||mathematics
+maxium||maximum
+mechamism||mechanism
+meetign||meeting
+ment||meant
+mergable||mergeable
+mesage||message
+messags||messages
+messgaes||messages
+messsage||message
+messsages||messages
+microprocesspr||microprocessor
+milliseonds||milliseconds
+minumum||minimum
+miscelleneous||miscellaneous
+misformed||malformed
+mispelled||misspelled
+mispelt||misspelt
+miximum||maximum
+mmnemonic||mnemonic
+mnay||many
+modulues||modules
+monochorome||monochrome
+monochromo||monochrome
+monocrome||monochrome
+mopdule||module
+mroe||more
+mulitplied||multiplied
+multidimensionnal||multidimensional
+multple||multiple
+mumber||number
+muticast||multicast
+mutiple||multiple
+mutli||multi
+nams||names
+navagating||navigating
+nead||need
+neccecary||necessary
+neccesary||necessary
+neccessary||necessary
+necesary||necessary
+negaive||negative
+negoitation||negotiation
+negotation||negotiation
+nerver||never
+nescessary||necessary
+nessessary||necessary
+noticable||noticeable
+notications||notifications
+notifed||notified
+numebr||number
+numner||number
+obtaion||obtain
+occassionally||occasionally
+occationally||occasionally
+occurance||occurrence
+occurances||occurrences
+occured||occurred
+occurence||occurrence
+occure||occurred
+occuring||occurring
+offet||offset
+omitt||omit
+ommiting||omitting
+ommitted||omitted
+onself||oneself
+ony||only
+operatione||operation
+opertaions||operations
+optionnal||optional
+optmizations||optimizations
+orientatied||orientated
+orientied||oriented
+otherise||otherwise
+ouput||output
+overaall||overall
+overhread||overhead
+overlaping||overlapping
+overriden||overridden
+overun||overrun
+pacakge||package
+pachage||package
+packacge||package
+packege||package
+packge||package
+packtes||packets
+pakage||package
+pallette||palette
+paln||plan
+paramameters||parameters
+paramater||parameter
+parametes||parameters
+parametised||parametrised
+paramter||parameter
+paramters||parameters
+particuarly||particularly
+particularily||particularly
+pased||passed
+passin||passing
+pathes||paths
+pecularities||peculiarities
+peformance||performance
+peice||piece
+pendantic||pedantic
+peprocessor||preprocessor
+perfoming||performing
+permissons||permissions
+peroid||period
+persistance||persistence
+persistant||persistent
+platfrom||platform
+plattform||platform
+pleaes||please
+ploting||plotting
+plugable||pluggable
+poinnter||pointer
+poiter||pointer
+posible||possible
+positon||position
+possibilites||possibilities
+powerfull||powerful
+preceeded||preceded
+preceeding||preceding
+preceed||precede
+precendence||precedence
+precission||precision
+preemptable||preemptible
+prefered||preferred
+prefferably||preferably
+premption||preemption
+prepaired||prepared
+pressre||pressure
+primative||primitive
+princliple||principle
+priorty||priority
+privilaged||privileged
+privilage||privilege
+priviledge||privilege
+priviledges||privileges
+probaly||probably
+procceed||proceed
+proccesors||processors
+procesed||processed
+proces||process
+processessing||processing
+processess||processes
+processpr||processor
+processsed||processed
+processsing||processing
+procteted||protected
+prodecure||procedure
+progams||programs
+progess||progress
+programers||programmers
+programm||program
+programms||programs
+progresss||progress
+promiscous||promiscuous
+promps||prompts
+pronnounced||pronounced
+prononciation||pronunciation
+pronouce||pronounce
+pronunce||pronounce
+propery||property
+propigate||propagate
+propigation||propagation
+propogate||propagate
+prosess||process
+protable||portable
+protcol||protocol
+protecion||protection
+protocoll||protocol
+psudo||pseudo
+psuedo||pseudo
+psychadelic||psychedelic
+pwoer||power
+quering||querying
+raoming||roaming
+reasearcher||researcher
+reasearchers||researchers
+reasearch||research
+recepient||recipient
+receving||receiving
+recieved||received
+recieve||receive
+reciever||receiver
+recieves||receives
+recogniced||recognised
+recognizeable||recognizable
+recommanded||recommended
+recyle||recycle
+redircet||redirect
+redirectrion||redirection
+refcounf||refcount
+refence||reference
+refered||referred
+referenace||reference
+refering||referring
+refernces||references
+refernnce||reference
+refrence||reference
+registerd||registered
+registeresd||registered
+registes||registers
+registraration||registration
+regster||register
+regualar||regular
+reguator||regulator
+regulamentations||regulations
+reigstration||registration
+releated||related
+relevent||relevant
+remoote||remote
+remore||remote
+removeable||removable
+repectively||respectively
+replacable||replaceable
+replacments||replacements
+replys||replies
+reponse||response
+representaion||representation
+reqeust||request
+requiere||require
+requirment||requirement
+requred||required
+requried||required
+requst||request
+reseting||resetting
+resizeable||resizable
+resouces||resources
+resoures||resources
+responce||response
+ressizes||resizes
+ressource||resource
+ressources||resources
+retransmited||retransmitted
+retreived||retrieved
+retreive||retrieve
+retrive||retrieve
+retuned||returned
+reudce||reduce
+reuest||request
+reuqest||request
+reutnred||returned
+rmeoved||removed
+rmeove||remove
+rmeoves||removes
+rountine||routine
+routins||routines
+rquest||request
+runing||running
+runned||ran
+runnning||running
+runtine||runtime
+sacrifying||sacrificing
+safly||safely
+safty||safety
+savable||saveable
+scaned||scanned
+scaning||scanning
+scarch||search
+seach||search
+searchs||searches
+secquence||sequence
+secund||second
+segement||segment
+senarios||scenarios
+sentivite||sensitive
+separatly||separately
+sepcify||specify
+sepc||spec
+seperated||separated
+seperately||separately
+seperate||separate
+seperatly||separately
+seperator||separator
+sepperate||separate
+sequece||sequence
+sequencial||sequential
+serveral||several
+setts||sets
+settting||setting
+shotdown||shutdown
+shoud||should
+shouldnt||shouldn't
+shoule||should
+shrinked||shrunk
+siginificantly||significantly
+signabl||signal
+similary||similarly
+similiar||similar
+simlar||similar
+simliar||similar
+simpified||simplified
+singaled||signaled
+singal||signal
+singed||signed
+sleeped||slept
+softwares||software
+speach||speech
+specfic||specific
+speciefied||specified
+specifc||specific
+specifed||specified
+specificatin||specification
+specificaton||specification
+specifing||specifying
+specifiying||specifying
+speficied||specified
+speicify||specify
+speling||spelling
+spinlcok||spinlock
+spinock||spinlock
+splitted||split
+spreaded||spread
+sructure||structure
+stablilization||stabilization
+staically||statically
+staion||station
+standardss||standards
+standartization||standardization
+standart||standard
+staticly||statically
+stoped||stopped
+stoppped||stopped
+straming||streaming
+struc||struct
+structres||structures
+stuct||struct
+stucture||structure
+sturcture||structure
+subdirectoires||subdirectories
+suble||subtle
+substract||subtract
+succesfully||successfully
+succesful||successful
+successfull||successful
+sucessfully||successfully
+sucess||success
+superflous||superfluous
+superseeded||superseded
+suplied||supplied
+suported||supported
+suport||support
+suppored||supported
+supportin||supporting
+suppoted||supported
+suppported||supported
+suppport||support
+supress||suppress
+surpresses||suppresses
+susbsystem||subsystem
+suspicously||suspiciously
+swaping||swapping
+switchs||switches
+symetric||symmetric
+synax||syntax
+synchonized||synchronized
+syncronize||synchronize
+syncronizing||synchronizing
+syncronus||synchronous
+syste||system
+sytem||system
+sythesis||synthesis
+taht||that
+targetted||targeted
+targetting||targeting
+teh||the
+temorary||temporary
+temproarily||temporarily
+thier||their
+threds||threads
+threshhold||threshold
+throught||through
+thses||these
+tiggered||triggered
+tipically||typically
+tmis||this
+torerable||tolerable
+tramsmitted||transmitted
+tramsmit||transmit
+tranfer||transfer
+transciever||transceiver
+transferd||transferrd
+transfered||transferred
+transfering||transferring
+transision||transition
+transmittd||transmitted
+transormed||transformed
+trasmission||transmission
+treshold||threshold
+trigerring||triggering
+trun||turn
+ture||true
+tyep||type
+udpate||update
+uesd||used
+unconditionaly||unconditionally
+underun||underrun
+unecessary||unnecessary
+unexecpted||unexpected
+unexpectd||unexpected
+unexpeted||unexpected
+unfortunatelly||unfortunately
+unifiy||unify
+unintialized||uninitialized
+unknonw||unknown
+unknow||unknown
+unkown||unknown
+unneedingly||unnecessarily
+unresgister||unregister
+unsinged||unsigned
+unstabel||unstable
+unsuccessfull||unsuccessful
+unsuported||unsupported
+untill||until
+unuseful||useless
+upate||update
+usefule||useful
+usefull||useful
+usege||usage
+usera||users
+usualy||usually
+utilites||utilities
+utillities||utilities
+utilties||utilities
+utiltity||utility
+utitity||utility
+utitlty||utility
+vaid||valid
+vaild||valid
+valide||valid
+variantions||variations
+varient||variant
+vaule||value
+verbse||verbose
+verisons||versions
+verison||version
+verson||version
+vicefersa||vice-versa
+virtal||virtual
+virtaul||virtual
+virtiual||virtual
+visiters||visitors
+vitual||virtual
+wating||waiting
+wether||whether
+whataver||whatever
+whcih||which
+whenver||whenever
+wheter||whether
+whe||when
+wierd||weird
+wiil||will
+wirte||write
+withing||within
+wnat||want
+workarould||workaround
+writeing||writing
+writting||writing
+zombe||zombie
+zomebie||zombie
