#endif
 }
 
-int wilc_netdev_init(struct wilc **wilc, struct device *dev, int io_type, int gpio)
+int wilc_netdev_init(struct wilc **wilc, struct device *dev, int io_type,
+                    int gpio, const struct wilc_hif_func *ops)
 {
        int i;
        perInterface_wlan_t *nic;
        *wilc = wilc_dev;
        wilc_dev->io_type = io_type;
        wilc_dev->gpio = gpio;
+       wilc_dev->ops = ops;
 
        register_inetaddr_notifier(&g_dev_notifier);
 
 
 
        PRINT_D(INIT_DBG, "Initializing netdev\n");
        wilc_sdio_func = func;
-       if (wilc_netdev_init(&wilc, &func->dev, HIF_SDIO, gpio)) {
+       if (wilc_netdev_init(&wilc, &func->dev, HIF_SDIO, gpio,
+                            &wilc_hif_sdio)) {
                PRINT_ER("Couldn't initialize netdev\n");
                return -1;
        }
 
 
        wilc_debugfs_init();
 
-       ret = wilc_netdev_init(&wilc, NULL, HIF_SPI, GPIO_NUM);
+       ret = wilc_netdev_init(&wilc, NULL, HIF_SPI, GPIO_NUM, &wilc_hif_spi);
        if (ret) {
                wilc_debugfs_remove();
                return ret;
 
  *
  ********************************************/
 
-struct wilc_hif_func wilc_hif_sdio = {
-       sdio_init,
-       sdio_deinit,
-       sdio_read_reg,
-       sdio_write_reg,
-       sdio_read,
-       sdio_write,
-       sdio_sync,
-       sdio_clear_int,
-       sdio_read_int,
-       sdio_clear_int_ext,
-       sdio_read_size,
-       sdio_write,
-       sdio_read,
-       sdio_sync_ext,
-
-       sdio_set_max_speed,
-       sdio_set_default_speed,
+const struct wilc_hif_func wilc_hif_sdio = {
+       .hif_init = sdio_init,
+       .hif_deinit = sdio_deinit,
+       .hif_read_reg = sdio_read_reg,
+       .hif_write_reg = sdio_write_reg,
+       .hif_block_rx = sdio_read,
+       .hif_block_tx = sdio_write,
+       .hif_sync = sdio_sync,
+       .hif_clear_int = sdio_clear_int,
+       .hif_read_int = sdio_read_int,
+       .hif_clear_int_ext = sdio_clear_int_ext,
+       .hif_read_size = sdio_read_size,
+       .hif_block_tx_ext = sdio_write,
+       .hif_block_rx_ext = sdio_read,
+       .hif_sync_ext = sdio_sync_ext,
+       .hif_set_max_bus_speed = sdio_set_max_speed,
+       .hif_set_default_bus_speed = sdio_set_default_speed,
 };
 
 
  *      Global spi HIF function table
  *
  ********************************************/
-struct wilc_hif_func wilc_hif_spi = {
-       _wilc_spi_init,
-       _wilc_spi_deinit,
-       wilc_spi_read_reg,
-       wilc_spi_write_reg,
-       _wilc_spi_read,
-       _wilc_spi_write,
-       wilc_spi_sync,
-       wilc_spi_clear_int,
-       wilc_spi_read_int,
-       wilc_spi_clear_int_ext,
-       wilc_spi_read_size,
-       _wilc_spi_write,
-       _wilc_spi_read,
-       wilc_spi_sync_ext,
-       wilc_spi_max_bus_speed,
-       wilc_spi_default_bus_speed,
+const struct wilc_hif_func wilc_hif_spi = {
+       .hif_init = _wilc_spi_init,
+       .hif_deinit = _wilc_spi_deinit,
+       .hif_read_reg = wilc_spi_read_reg,
+       .hif_write_reg = wilc_spi_write_reg,
+       .hif_block_rx = _wilc_spi_read,
+       .hif_block_tx = _wilc_spi_write,
+       .hif_sync = wilc_spi_sync,
+       .hif_clear_int = wilc_spi_clear_int,
+       .hif_read_int = wilc_spi_read_int,
+       .hif_clear_int_ext = wilc_spi_clear_int_ext,
+       .hif_read_size = wilc_spi_read_size,
+       .hif_block_tx_ext = _wilc_spi_write,
+       .hif_block_rx_ext = _wilc_spi_read,
+       .hif_sync_ext = wilc_spi_sync_ext,
+       .hif_set_max_bus_speed = wilc_spi_max_bus_speed,
+       .hif_set_default_bus_speed = wilc_spi_default_bus_speed,
 };
 
 };
 
 struct wilc {
+       const struct wilc_hif_func *ops;
        int io_type;
        int mac_status;
        int gpio;
 void linux_wlan_dbg(u8 *buff);
 int linux_wlan_lock_timeout(void *vp, u32 timeout);
 void wilc_netdev_cleanup(struct wilc *wilc);
-int wilc_netdev_init(struct wilc **wilc, struct device *, int io_type, int gpio);
+int wilc_netdev_init(struct wilc **wilc, struct device *, int io_type, int gpio,
+                    const struct wilc_hif_func *ops);
 void wilc1000_wlan_deinit(struct net_device *dev);
 void WILC_WFI_mgmt_rx(struct wilc *wilc, u8 *buff, u32 size);
 u16 wilc_set_machw_change_vir_if(struct net_device *dev, bool value);
 
 
        memset((void *)&g_wlan, 0, sizeof(wilc_wlan_dev_t));
        g_wlan.io_type = wilc->io_type;
-
-#ifdef WILC_SDIO
-       if (!wilc_hif_sdio.hif_init(wilc, wilc_debug)) {
-               ret = -EIO;
-               goto _fail_;
-       }
-       memcpy((void *)&g_wlan.hif_func, &wilc_hif_sdio,
-              sizeof(struct wilc_hif_func));
-#else
-       if (!wilc_hif_spi.hif_init(wilc, wilc_debug)) {
+       g_wlan.hif_func = *wilc->ops;
+       if (!g_wlan.hif_func.hif_init(wilc, wilc_debug)) {
                ret = -EIO;
                goto _fail_;
        }
-       memcpy((void *)&g_wlan.hif_func, &wilc_hif_spi,
-              sizeof(struct wilc_hif_func));
-#endif
 
        if (!wilc_wlan_cfg_init(wilc_debug)) {
                ret = -ENOBUFS;
 
        void (*hif_set_default_bus_speed)(void);
 };
 
-extern struct wilc_hif_func wilc_hif_spi;
-extern struct wilc_hif_func wilc_hif_sdio;
+extern const struct wilc_hif_func wilc_hif_spi;
+extern const struct wilc_hif_func wilc_hif_sdio;
 
 /********************************************
  *