}
                pcmcia_release_window(link->win);
        }
-       pcmcia_release_configuration(link->handle);
-       link->state &= ~DEV_CONFIG;
+       pcmcia_disable_device(link->handle);
 }
 
 
 
        dev_link_t *link = dev_to_instance(p_dev);
        struct net_device *dev = link->priv;
 
-       if (link->state & DEV_CONFIG) {
-               if (link->open)
-                       netif_device_detach(dev);
-               pcmcia_release_configuration(link->handle);
-       }
+       if ((link->state & DEV_CONFIG) && (link->open))
+               netif_device_detach(dev);
 
        return 0;
 }
                if ((smc->manfid == MANFID_MEGAHERTZ) &&
                    (smc->cardid == PRODID_MEGAHERTZ_EM3288))
                        mhz_3288_power(link);
-               pcmcia_request_configuration(link->handle, &link->conf);
                if (smc->manfid == MANFID_MOTOROLA)
                        mot_config(link);
                if ((smc->manfid == MANFID_OSITECH) &&
     }
 
     if (width) {
-       printk(KERN_INFO "smc91c92_cs: using 8-bit IO window.\n");
-       /* call pcmcia_release_configuration() in _suspend */
-       smc91c92_suspend(link->handle);
-
-       link->io.Attributes1 = IO_DATA_PATH_WIDTH_8;
-       link->handle->socket->io[0].res->flags &= ~IO_DATA_PATH_WIDTH;
-       link->handle->socket->io[0].res->flags |= IO_DATA_PATH_WIDTH_8;
-
-       /* call pcmcia_request_configuration() in _resume, it handles the
-        * flag update */
-       smc91c92_resume(link->handle);
-       return check_sig(link);
+           modconf_t mod = {
+                   .Attributes = CONF_IO_CHANGE_WIDTH,
+           };
+           printk(KERN_INFO "smc91c92_cs: using 8-bit IO window.\n");
+
+           smc91c92_suspend(link->handle);
+           pcmcia_modify_configuration(link->handle, &mod);
+           smc91c92_resume(link->handle);
+           return check_sig(link);
     }
     return -ENODEV;
 }
 
 
 struct pcmcia_device * pcmcia_device_add(struct pcmcia_socket *s, unsigned int function);
 
+extern int pcmcia_release_configuration(struct pcmcia_device *p_dev);
+
 #ifdef CONFIG_PCMCIA_IOCTL
 extern void __init pcmcia_setup_ioctl(void);
 extern void __exit pcmcia_cleanup_ioctl(void);
 
                   (mod->Attributes & CONF_VPP2_CHANGE_VALID))
                return CS_BAD_VPP;
 
+       if (mod->Attributes & CONF_IO_CHANGE_WIDTH) {
+               pccard_io_map io_off = { 0, 0, 0, 0, 1 };
+               pccard_io_map io_on;
+               int i;
+
+               io_on.speed = io_speed;
+               for (i = 0; i < MAX_IO_WIN; i++) {
+                       if (!s->io[i].res)
+                               continue;
+                       io_off.map = i;
+                       io_on.map = i;
+
+                       io_on.flags = MAP_ACTIVE | IO_DATA_PATH_WIDTH_8;
+                       io_on.start = s->io[i].res->start;
+                       io_on.stop = s->io[i].res->end;
+
+                       s->ops->set_io_map(s, &io_off);
+                       mdelay(40);
+                       s->ops->set_io_map(s, &io_on);
+               }
+       }
+
        return CS_SUCCESS;
 } /* modify_configuration */
 EXPORT_SYMBOL(pcmcia_modify_configuration);
 
        return CS_SUCCESS;
 } /* pcmcia_release_configuration */
-EXPORT_SYMBOL(pcmcia_release_configuration);
 
 
 /** pcmcia_release_io
 
 } modconf_t;
 
 /* Attributes for ModifyConfiguration */
-#define CONF_IRQ_CHANGE_VALID  0x100
-#define CONF_VCC_CHANGE_VALID  0x200
-#define CONF_VPP1_CHANGE_VALID 0x400
-#define CONF_VPP2_CHANGE_VALID 0x800
+#define CONF_IRQ_CHANGE_VALID  0x0100
+#define CONF_VCC_CHANGE_VALID  0x0200
+#define CONF_VPP1_CHANGE_VALID 0x0400
+#define CONF_VPP2_CHANGE_VALID 0x0800
+#define CONF_IO_CHANGE_WIDTH   0x1000
 
 /* For RequestConfiguration */
 typedef struct config_req_t {
 int pcmcia_get_mem_page(window_handle_t win, memreq_t *req);
 int pcmcia_map_mem_page(window_handle_t win, memreq_t *req);
 int pcmcia_modify_configuration(struct pcmcia_device *p_dev, modconf_t *mod);
-int pcmcia_release_configuration(struct pcmcia_device *p_dev);
 int pcmcia_release_window(window_handle_t win);
 int pcmcia_request_configuration(struct pcmcia_device *p_dev, config_req_t *req);
 int pcmcia_request_io(struct pcmcia_device *p_dev, io_req_t *req);