wilc->hif_func->hif_read_reg(wilc, 0xf0, ®);
 
        wilc->hif_func->hif_write_reg(wilc, 0xf0, reg & ~BIT(0));
+       wilc->hif_func->hif_write_reg(wilc, 0xfa, 0);
 }
 
 static inline void chip_wakeup(struct wilc *wilc)
 
                } while (wilc_get_chipid(wilc, true) == 0);
        } else if ((wilc->io_type & 0x1) == HIF_SDIO)    {
+               wilc->hif_func->hif_write_reg(wilc, 0xfa, 1);
+               udelay(200);
                wilc->hif_func->hif_read_reg(wilc, 0xf0, ®);
                do {
                        wilc->hif_func->hif_write_reg(wilc, 0xf0,
        }
 
        if (chip_ps_state == CHIP_SLEEPING_MANUAL) {
-               wilc->hif_func->hif_read_reg(wilc, 0x1C0C, ®);
-               reg &= ~BIT(0);
-               wilc->hif_func->hif_write_reg(wilc, 0x1C0C, reg);
-
-               if (wilc_get_chipid(wilc, false) >= 0x1002b0) {
+               if (wilc_get_chipid(wilc, false) < 0x1002b0) {
                        u32 val32;
 
                        wilc->hif_func->hif_read_reg(wilc, 0x1e1c, &val32);
        release_bus(wilc, RELEASE_ONLY);
 }
 
+void host_wakeup_notify(struct wilc *wilc)
+{
+       acquire_bus(wilc, ACQUIRE_ONLY);
+       wilc->hif_func->hif_write_reg(wilc, 0x10b0, 1);
+       release_bus(wilc, RELEASE_ONLY);
+}
+
+void host_sleep_notify(struct wilc *wilc)
+{
+       acquire_bus(wilc, ACQUIRE_ONLY);
+       wilc->hif_func->hif_write_reg(wilc, 0x10ac, 1);
+       release_bus(wilc, RELEASE_ONLY);
+}
+
 int wilc_wlan_handle_txq(struct net_device *dev, u32 *txq_count)
 {
        int i, entries = 0;
                                        break;
                                }
                                PRINT_WRN(GENERIC_DBG, "[wilc txq]: warn, vmm table not clear yet, wait...\n");
-                               release_bus(wilc, RELEASE_ALLOW_SLEEP);
-                               usleep_range(3000, 3000);
-                               acquire_bus(wilc, ACQUIRE_AND_WAKEUP);
                        }
                } while (!wilc->quit);
 
                                        break;
                                } else {
                                        release_bus(wilc, RELEASE_ALLOW_SLEEP);
-                                       usleep_range(3000, 3000);
-                                       acquire_bus(wilc, ACQUIRE_AND_WAKEUP);
-                                       PRINT_WRN(GENERIC_DBG, "Can't get VMM entery - reg = %2x\n", reg);
                                }
                        } while (--timeout);
                        if (timeout <= 0) {
 #ifdef WILC_EXT_PA_INV_TX_RX
        reg |= WILC_HAVE_EXT_PA_INV_TX_RX;
 #endif
-
+       reg |= WILC_HAVE_USE_IRQ_AS_HOST_WAKE;
        reg |= WILC_HAVE_LEGACY_RF_SETTINGS;
 #ifdef XTAL_24
        reg |= WILC_HAVE_XTAL_24;
 
 #define WILC_HAVE_LEGACY_RF_SETTINGS   BIT(5)
 #define WILC_HAVE_XTAL_24              BIT(6)
 #define WILC_HAVE_DISABLE_WILC_UART    BIT(7)
+#define WILC_HAVE_USE_IRQ_AS_HOST_WAKE BIT(8)
 
 /********************************************
  *
 
 int wilc_wlan_set_bssid(struct net_device *wilc_netdev, u8 *pBSSID);
 void WILC_WFI_p2p_rx(struct net_device *dev, u8 *buff, u32 size);
-
+void host_wakeup_notify(struct wilc *wilc);
+void host_sleep_notify(struct wilc *wilc);
 extern bool wilc_enable_ps;
 
 #endif