diff --git a/btmtk_drv.h b/btmtk_drv.h
index d130c1a..59a9866 100644
--- a/btmtk_drv.h
+++ b/btmtk_drv.h
@@ -64,7 +64,7 @@
 
  struct btmtk_device {
          void *card;
-         struct hci_dev *hcidev;
+         //struct hci_dev *hcidev;
 
          u8 dev_type;
 
@@ -182,7 +182,6 @@
 
  /* Prototype of global function */
 
- int btmtk_register_hdev(struct btmtk_private *priv);
  struct btmtk_private *btmtk_add_card(void *card);
  int btmtk_remove_card(struct btmtk_private *priv);
 
@@ -215,8 +214,6 @@
 } ring_buffer_struct;
 
  #ifdef CONFIG_DEBUG_FS
- void btmtk_debugfs_init(struct hci_dev *hdev);
- void btmtk_debugfs_remove(struct hci_dev *hdev);
 
 #define FIXED_STPBT_MAJOR_DEV_ID 111
 
diff --git a/btmtk_main.c b/btmtk_main.c
index 771c4d8..4d5c398 100644
--- a/btmtk_main.c
+++ b/btmtk_main.c
@@ -306,30 +306,7 @@
         return 0;
 }
 
-int btmtk_register_hdev(struct btmtk_private *priv)
-{
-        struct hci_dev *hdev = NULL;
 
-        BTMTK_INFO("%s\n", __func__);
-        hdev = hci_alloc_dev();
-        if (!hdev) {
-                BTMTK_ERR("Can not allocate HCI device");
-                goto err_hdev;
-        }
-
-        hci_set_drvdata(hdev, priv);
-        return 0;
-
-err_hdev:
-        /* Stop the thread servicing the interrupts */
-        kthread_stop(priv->main_thread.task);
-
-        btmtk_free_adapter(priv);
-        kfree(priv);
-
-        return -ENOMEM;
-}
-EXPORT_SYMBOL_GPL(btmtk_register_hdev);
 
 struct btmtk_private *btmtk_add_card(void *card)
 {
diff --git a/btmtk_sdio.c b/btmtk_sdio.c
index d7dbb61..7552fc8 100644
--- a/btmtk_sdio.c
+++ b/btmtk_sdio.c
@@ -45,7 +45,9 @@
 static struct class *pBTClass;
 static struct device *pBTDev;
 static wait_queue_head_t inq;
+static struct fasync_struct *fasync;
 
+static int need_reset_stack;
 /* The btmtk_sdio_remove() callback function is called
  * when user removes this module from kernel space or ejects
  * the card from the slot. The driver handles these 2 cases
@@ -1474,14 +1476,6 @@
         return 0;
 }
 
-int hci_recv_fragment(struct hci_dev *hdev, int type, void *data, int count)
-{
-        int rem = 0;
-
-
-
-        return rem;
-}
 
 static void btmtk_sdio_interrupt(struct sdio_func *func)
 {
@@ -1878,11 +1872,7 @@
          priv->hw_host_to_card = btmtk_sdio_host_to_card;
          priv->hw_process_int_status = btmtk_sdio_process_int_status;
          priv->hw_set_own_back =  btmtk_sdio_set_own_back;
-         /*if (btmtk_register_hdev(priv)) {
-                 BTMTK_ERR("Register hdev failed!");
-                 ret = -ENODEV;
-                 goto unreg_dev;
-         }*/
+
         g_priv = priv;
         if (fw_dump_ptr == NULL)
             fw_dump_ptr = kmalloc(FW_DUMP_BUF_SIZE, GFP_ATOMIC);
@@ -2004,108 +1994,19 @@
  static int btmtk_sdio_suspend(struct device *dev)
  {
          struct sdio_func *func = dev_to_sdio_func(dev);
-         struct btmtk_sdio_card *card;
-         struct btmtk_private *priv;
-         mmc_pm_flag_t pm_flags;
-         struct hci_dev *hcidev;
          u8 ret = 0;
 
          ret = btmtk_sdio_set_own_back(DRIVER_OWN);
          ret = btmtk_sdio_send_woble_cmd();
-
+         need_reset_stack = 1;
+         BTMTK_ERR("%s set reset_stack 1\n", __func__);
          return sdio_set_host_pm_flags(func, MMC_PM_KEEP_POWER);
-
-         btmtk_sdio_bt_set_power(0);
-         ret = btmtk_sdio_set_own_back(FW_OWN);
-         if (ret) {
-            BTMTK_ERR("%s set DRIVER_FW fail", __func__);
-            return -EBUSY;
-         }
-
-         if (func) {
-                 pm_flags = sdio_get_host_pm_caps(func);
-                 BTMTK_DBG("%s: suspend: PM flags = 0x%x", sdio_func_id(func),
-                        pm_flags);
-                 if (!(pm_flags & MMC_PM_KEEP_POWER)) {
-                         BTMTK_ERR("%s: cannot remain alive while suspended",
-                                sdio_func_id(func));
-                         return -EINVAL;
-                 }
-                 card = sdio_get_drvdata(func);
-                 if (!card || !card->priv) {
-                         BTMTK_ERR("card or priv structure is not valid");
-                         return 0;
-                 }
-         } else {
-                 BTMTK_ERR("sdio_func is not specified");
-                 return 0;
-         }
-
-         priv = card->priv;
-         hcidev = priv->btmtk_dev.hcidev;
-         BTMTK_DBG("%s: SDIO suspend", hcidev->name);
-         skb_queue_purge(&priv->adapter->tx_queue);
-
-
-
-
-         if (priv->adapter->hs_state != HS_ACTIVATED) {
-                 if (btmtk_enable_hs(priv)) {
-                         BTMTK_ERR("HS not actived, suspend failed!");
-                         return -EBUSY;
-                 }
-         }
-
-
-         priv->adapter->is_suspended = true;
-
-
-         if (priv->adapter->hs_state == HS_ACTIVATED) {
-                 BTMTK_DBG("suspend with MMC_PM_KEEP_POWER");
-                 return sdio_set_host_pm_flags(func, MMC_PM_KEEP_POWER);
-         } else {
-                 BTMTK_DBG("suspend without MMC_PM_KEEP_POWER");
-                 return 0;
-         }
  }
 
  static int btmtk_sdio_resume(struct device *dev)
  {
-
-         struct sdio_func *func = dev_to_sdio_func(dev);
-         struct btmtk_sdio_card *card;
-         struct btmtk_private *priv;
-         mmc_pm_flag_t pm_flags;
-         struct hci_dev *hcidev;
-
          BTMTK_INFO("%s begin return 0, do nothing", __func__);
          return 0;
-
-         if (func) {
-                 pm_flags = sdio_get_host_pm_caps(func);
-                 BTMTK_DBG("%s: resume: PM flags = 0x%x", sdio_func_id(func),
-                        pm_flags);
-                 card = sdio_get_drvdata(func);
-                 if (!card || !card->priv) {
-                         BTMTK_ERR("card or priv structure is not valid");
-                         return 0;
-                 }
-         } else {
-                 BTMTK_ERR("sdio_func is not specified");
-                 return 0;
-         }
-         priv = card->priv;
-
-         if (!priv->adapter->is_suspended)
-                 BTMTK_DBG("device already resumed");
-
-         priv->adapter->hs_state = HS_DEACTIVATED;
-         hcidev = priv->btmtk_dev.hcidev;
-         BTMTK_DBG("%s: HS DEACTIVATED in resume!", hcidev->name);
-         priv->adapter->is_suspended = false;
-         BTMTK_DBG("%s: SDIO resume", hcidev->name);
-
-         return 0;
  }
 
  static const struct dev_pm_ops btmtk_sdio_pm_ops = {
@@ -2317,6 +2218,13 @@
         }
     }
 
+    if (need_reset_stack == 1){
+        kill_fasync(&fasync, SIGIO, POLL_IN);
+        need_reset_stack = 0;
+        BTMTK_INFO("%s Call  kill_fasync and set reset_stack 0", __func__);
+        return -ENODEV;
+    }
+
     do {
         skb = skb_dequeue(&g_priv->adapter->fops_queue);
         if (skb == NULL) {
@@ -2365,6 +2273,12 @@
     return copyLen;
 }
 
+static int btmtk_fops_fasync(int fd, struct file *file, int on)
+{
+	BTMTK_INFO("%s: fd = 0x%X, flag = 0x%X", __func__, fd, on);
+	return fasync_helper(fd, file, on, &fasync);
+}
+
 unsigned int btmtk_fops_poll(struct file *filp, poll_table *wait)
 {
     unsigned int mask = 0;
@@ -2476,7 +2390,8 @@
     .read = btmtk_fops_read,
     .write = btmtk_fops_write,
     .poll = btmtk_fops_poll,
-    .unlocked_ioctl = btmtk_fops_unlocked_ioctl
+    .unlocked_ioctl = btmtk_fops_unlocked_ioctl,
+    .fasync = btmtk_fops_fasync
 };
 
 
diff --git a/btmtk_sdio.h b/btmtk_sdio.h
index 4722813..6f0ec30 100644
--- a/btmtk_sdio.h
+++ b/btmtk_sdio.h
@@ -19,7 +19,7 @@
  *
  **/
 
-#define VERSION "v0.0.0.21"
+#define VERSION "v0.0.0.22"
 
 #define SDIO_HEADER_LEN                 4
 
