This file details changes in 2.6 which affect PCMCIA card driver authors:
 
+* Move suspend, resume and reset out of event handler (as of 2.6.16)
+       int (*suspend)          (struct pcmcia_device *dev);
+       int (*resume)           (struct pcmcia_device *dev);
+  should be initialized in struct pcmcia_driver, and handle
+  (SUSPEND == RESET_PHYSICAL) and (RESUME == CARD_RESET) events
+
 * event handler initialization in struct pcmcia_driver (as of 2.6.13)
    The event handler is notified of all events, and must be initialized
    as the event() callback in the driver's struct pcmcia_driver.
 
        link->state &= ~DEV_CONFIG;
 }
 
+static int bluecard_suspend(struct pcmcia_device *dev)
+{
+       dev_link_t *link = dev_to_instance(dev);
+
+       link->state |= DEV_SUSPEND;
+       if (link->state & DEV_CONFIG)
+               pcmcia_release_configuration(link->handle);
+
+       return 0;
+}
+
+static int bluecard_resume(struct pcmcia_device *dev)
+{
+       dev_link_t *link = dev_to_instance(dev);
+
+       link->state &= ~DEV_SUSPEND;
+       if (DEV_OK(link))
+               pcmcia_request_configuration(link->handle, &link->conf);
+
+       return 0;
+}
 
 static int bluecard_event(event_t event, int priority, event_callback_args_t *args)
 {
                link->state |= DEV_PRESENT | DEV_CONFIG_PENDING;
                bluecard_config(link);
                break;
-       case CS_EVENT_PM_SUSPEND:
-               link->state |= DEV_SUSPEND;
-               /* Fall through... */
-       case CS_EVENT_RESET_PHYSICAL:
-               if (link->state & DEV_CONFIG)
-                       pcmcia_release_configuration(link->handle);
-               break;
-       case CS_EVENT_PM_RESUME:
-               link->state &= ~DEV_SUSPEND;
-               /* Fall through... */
-       case CS_EVENT_CARD_RESET:
-               if (DEV_OK(link))
-                       pcmcia_request_configuration(link->handle, &link->conf);
-               break;
        }
 
        return 0;
        .event          = bluecard_event,
        .detach         = bluecard_detach,
        .id_table       = bluecard_ids,
+       .suspend        = bluecard_suspend,
+       .resume         = bluecard_resume,
 };
 
 static int __init init_bluecard_cs(void)
 
        link->state &= ~DEV_CONFIG;
 }
 
+static int bt3c_suspend(struct pcmcia_device *dev)
+{
+       dev_link_t *link = dev_to_instance(dev);
+
+       link->state |= DEV_SUSPEND;
+       if (link->state & DEV_CONFIG)
+               pcmcia_release_configuration(link->handle);
+
+       return 0;
+}
+
+static int bt3c_resume(struct pcmcia_device *dev)
+{
+       dev_link_t *link = dev_to_instance(dev);
+
+       link->state &= ~DEV_SUSPEND;
+       if (DEV_OK(link))
+               pcmcia_request_configuration(link->handle, &link->conf);
+
+       return 0;
+}
 
 static int bt3c_event(event_t event, int priority, event_callback_args_t *args)
 {
                link->state |= DEV_PRESENT | DEV_CONFIG_PENDING;
                bt3c_config(link);
                break;
-       case CS_EVENT_PM_SUSPEND:
-               link->state |= DEV_SUSPEND;
-               /* Fall through... */
-       case CS_EVENT_RESET_PHYSICAL:
-               if (link->state & DEV_CONFIG)
-                       pcmcia_release_configuration(link->handle);
-               break;
-       case CS_EVENT_PM_RESUME:
-               link->state &= ~DEV_SUSPEND;
-               /* Fall through... */
-       case CS_EVENT_CARD_RESET:
-               if (DEV_OK(link))
-                       pcmcia_request_configuration(link->handle, &link->conf);
-               break;
        }
 
        return 0;
        .event          = bt3c_event,
        .detach         = bt3c_detach,
        .id_table       = bt3c_ids,
+       .suspend        = bt3c_suspend,
+       .resume         = bt3c_resume,
 };
 
 static int __init init_bt3c_cs(void)
 
        link->state &= ~DEV_CONFIG;
 }
 
+static int btuart_suspend(struct pcmcia_device *dev)
+{
+       dev_link_t *link = dev_to_instance(dev);
+
+       link->state |= DEV_SUSPEND;
+       if (link->state & DEV_CONFIG)
+               pcmcia_release_configuration(link->handle);
+
+       return 0;
+}
+
+static int btuart_resume(struct pcmcia_device *dev)
+{
+       dev_link_t *link = dev_to_instance(dev);
+
+       link->state &= ~DEV_SUSPEND;
+       if (DEV_OK(link))
+               pcmcia_request_configuration(link->handle, &link->conf);
+
+       return 0;
+}
+
 
 static int btuart_event(event_t event, int priority, event_callback_args_t *args)
 {
                link->state |= DEV_PRESENT | DEV_CONFIG_PENDING;
                btuart_config(link);
                break;
-       case CS_EVENT_PM_SUSPEND:
-               link->state |= DEV_SUSPEND;
-               /* Fall through... */
-       case CS_EVENT_RESET_PHYSICAL:
-               if (link->state & DEV_CONFIG)
-                       pcmcia_release_configuration(link->handle);
-               break;
-       case CS_EVENT_PM_RESUME:
-               link->state &= ~DEV_SUSPEND;
-               /* Fall through... */
-       case CS_EVENT_CARD_RESET:
-               if (DEV_OK(link))
-                       pcmcia_request_configuration(link->handle, &link->conf);
-               break;
        }
 
        return 0;
        .event          = btuart_event,
        .detach         = btuart_detach,
        .id_table       = btuart_ids,
+       .suspend        = btuart_suspend,
+       .resume         = btuart_resume,
 };
 
 static int __init init_btuart_cs(void)
 
        link->state &= ~DEV_CONFIG;
 }
 
+static int dtl1_suspend(struct pcmcia_device *dev)
+{
+       dev_link_t *link = dev_to_instance(dev);
+
+       link->state |= DEV_SUSPEND;
+       if (link->state & DEV_CONFIG)
+               pcmcia_release_configuration(link->handle);
+
+       return 0;
+}
+
+static int dtl1_resume(struct pcmcia_device *dev)
+{
+       dev_link_t *link = dev_to_instance(dev);
+
+       link->state &= ~DEV_SUSPEND;
+       if (DEV_OK(link))
+               pcmcia_request_configuration(link->handle, &link->conf);
+
+       return 0;
+}
 
 static int dtl1_event(event_t event, int priority, event_callback_args_t *args)
 {
                link->state |= DEV_PRESENT | DEV_CONFIG_PENDING;
                dtl1_config(link);
                break;
-       case CS_EVENT_PM_SUSPEND:
-               link->state |= DEV_SUSPEND;
-               /* Fall through... */
-       case CS_EVENT_RESET_PHYSICAL:
-               if (link->state & DEV_CONFIG)
-                       pcmcia_release_configuration(link->handle);
-               break;
-       case CS_EVENT_PM_RESUME:
-               link->state &= ~DEV_SUSPEND;
-               /* Fall through... */
-       case CS_EVENT_CARD_RESET:
-               if (DEV_OK(link))
-                       pcmcia_request_configuration(link->handle, &link->conf);
-               break;
        }
 
        return 0;
        .event          = dtl1_event,
        .detach         = dtl1_detach,
        .id_table       = dtl1_ids,
+       .suspend        = dtl1_suspend,
+       .resume         = dtl1_resume,
 };
 
 static int __init init_dtl1_cs(void)
 
                link->state &= ~DEV_PRESENT;
                stop_monitor(dev);
                break;
-       case CS_EVENT_PM_SUSPEND:
-               DEBUGP(5, dev, "CS_EVENT_PM_SUSPEND "
-                     "(fall-through to CS_EVENT_RESET_PHYSICAL)\n");
-               link->state |= DEV_SUSPEND;
-               /* fall-through */
-       case CS_EVENT_RESET_PHYSICAL:
-               DEBUGP(5, dev, "CS_EVENT_RESET_PHYSICAL\n");
-               if (link->state & DEV_CONFIG) {
-                       DEBUGP(5, dev, "ReleaseConfiguration\n");
-                       pcmcia_release_configuration(link->handle);
-               }
-               stop_monitor(dev);
-               break;
-       case CS_EVENT_PM_RESUME:
-               DEBUGP(5, dev, "CS_EVENT_PM_RESUME "
-                     "(fall-through to CS_EVENT_CARD_RESET)\n");
-               link->state &= ~DEV_SUSPEND;
-               /* fall-through */
-       case CS_EVENT_CARD_RESET:
-               DEBUGP(5, dev, "CS_EVENT_CARD_RESET\n");
-               if ((link->state & DEV_CONFIG)) {
-                       DEBUGP(5, dev, "RequestConfiguration\n");
-                       pcmcia_request_configuration(link->handle, &link->conf);
-               }
-               if (link->open)
-                       start_monitor(dev);
-               break;
        default:
                DEBUGP(5, dev, "unknown event %.2x\n", event);
                break;
        return CS_SUCCESS;
 }
 
+static int cm4000_suspend(struct pcmcia_device *p_dev)
+{
+       dev_link_t *link = dev_to_instance(p_dev);
+       struct cm4000_dev *dev;
+
+       dev = link->priv;
+
+       link->state |= DEV_SUSPEND;
+       if (link->state & DEV_CONFIG)
+               pcmcia_release_configuration(link->handle);
+       stop_monitor(dev);
+
+       return 0;
+}
+
+static int cm4000_resume(struct pcmcia_device *p_dev)
+{
+       dev_link_t *link = dev_to_instance(p_dev);
+       struct cm4000_dev *dev;
+
+       dev = link->priv;
+
+       link->state &= ~DEV_SUSPEND;
+       if (link->state & DEV_CONFIG)
+               pcmcia_request_configuration(link->handle, &link->conf);
+
+       if (link->open)
+               start_monitor(dev);
+
+       return 0;
+}
+
 static void cm4000_release(dev_link_t *link)
 {
        cmm_cm4000_release(link->priv); /* delay release until device closed */
                },
        .attach   = cm4000_attach,
        .detach   = cm4000_detach,
+       .suspend  = cm4000_suspend,
+       .resume   = cm4000_resume,
        .event    = cm4000_event,
        .id_table = cm4000_ids,
 };
 
                        DEBUGP(5, dev, "CS_EVENT_CARD_REMOVAL\n");
                        link->state &= ~DEV_PRESENT;
                        break;
-               case CS_EVENT_PM_SUSPEND:
-                       DEBUGP(5, dev, "CS_EVENT_PM_SUSPEND "
-                             "(fall-through to CS_EVENT_RESET_PHYSICAL)\n");
-                       link->state |= DEV_SUSPEND;
-
-               case CS_EVENT_RESET_PHYSICAL:
-                       DEBUGP(5, dev, "CS_EVENT_RESET_PHYSICAL\n");
-                       if (link->state & DEV_CONFIG) {
-                               DEBUGP(5, dev, "ReleaseConfiguration\n");
-                               pcmcia_release_configuration(link->handle);
-                       }
-                       break;
-               case CS_EVENT_PM_RESUME:
-                       DEBUGP(5, dev, "CS_EVENT_PM_RESUME "
-                             "(fall-through to CS_EVENT_CARD_RESET)\n");
-                       link->state &= ~DEV_SUSPEND;
-
-               case CS_EVENT_CARD_RESET:
-                       DEBUGP(5, dev, "CS_EVENT_CARD_RESET\n");
-                       if ((link->state & DEV_CONFIG)) {
-                               DEBUGP(5, dev, "RequestConfiguration\n");
-                               pcmcia_request_configuration(link->handle,
-                                                            &link->conf);
-                       }
-                       break;
+
                default:
                        DEBUGP(5, dev, "reader_event: unknown event %.2x\n",
                               event);
        return CS_SUCCESS;
 }
 
+static int reader_suspend(struct pcmcia_device *p_dev)
+{
+       dev_link_t *link = dev_to_instance(p_dev);
+
+       link->state |= DEV_SUSPEND;
+       if (link->state & DEV_CONFIG)
+               pcmcia_release_configuration(link->handle);
+
+       return 0;
+}
+
+static int reader_resume(struct pcmcia_device *p_dev)
+{
+       dev_link_t *link = dev_to_instance(p_dev);
+
+       link->state &= ~DEV_SUSPEND;
+       if (link->state & DEV_CONFIG)
+               pcmcia_request_configuration(link->handle, &link->conf);
+
+       return 0;
+}
+
 static void reader_release(dev_link_t *link)
 {
        cm4040_reader_release(link->priv);
        },
        .attach         = reader_attach,
        .detach         = reader_detach,
+       .suspend        = reader_suspend,
+       .resume         = reader_resume,
        .event          = reader_event,
        .id_table       = cm4040_ids,
 };
 
     mgslpc_remove_device((MGSLPC_INFO *)link->priv);
 }
 
+static int mgslpc_suspend(struct pcmcia_device *dev)
+{
+       dev_link_t *link = dev_to_instance(dev);
+       MGSLPC_INFO *info = link->priv;
+
+       link->state |= DEV_SUSPEND;
+       info->stop = 1;
+       if (link->state & DEV_CONFIG)
+               pcmcia_release_configuration(link->handle);
+
+       return 0;
+}
+
+static int mgslpc_resume(struct pcmcia_device *dev)
+{
+       dev_link_t *link = dev_to_instance(dev);
+       MGSLPC_INFO *info = link->priv;
+
+       link->state &= ~DEV_SUSPEND;
+       if (link->state & DEV_CONFIG)
+               pcmcia_request_configuration(link->handle, &link->conf);
+       info->stop = 0;
+
+       return 0;
+}
+
+
 static int mgslpc_event(event_t event, int priority,
                        event_callback_args_t *args)
 {
     dev_link_t *link = args->client_data;
-    MGSLPC_INFO *info = link->priv;
     
     if (debug_level >= DEBUG_LEVEL_INFO)
            printk("mgslpc_event(0x%06x)\n", event);
            link->state |= DEV_PRESENT | DEV_CONFIG_PENDING;
            mgslpc_config(link);
            break;
-    case CS_EVENT_PM_SUSPEND:
-           link->state |= DEV_SUSPEND;
-           /* Fall through... */
-    case CS_EVENT_RESET_PHYSICAL:
-           /* Mark the device as stopped, to block IO until later */
-           info->stop = 1;
-           if (link->state & DEV_CONFIG)
-                   pcmcia_release_configuration(link->handle);
-           break;
-    case CS_EVENT_PM_RESUME:
-           link->state &= ~DEV_SUSPEND;
-           /* Fall through... */
-    case CS_EVENT_CARD_RESET:
-           if (link->state & DEV_CONFIG)
-                   pcmcia_request_configuration(link->handle, &link->conf);
-           info->stop = 0;
-           break;
     }
     return 0;
 }
        .event          = mgslpc_event,
        .detach         = mgslpc_detach,
        .id_table       = mgslpc_ids,
+       .suspend        = mgslpc_suspend,
+       .resume         = mgslpc_resume,
 };
 
 static struct tty_operations mgslpc_ops = {
 
 
 } /* ide_release */
 
+static int ide_suspend(struct pcmcia_device *dev)
+{
+       dev_link_t *link = dev_to_instance(dev);
+
+       link->state |= DEV_SUSPEND;
+       if (link->state & DEV_CONFIG)
+               pcmcia_release_configuration(link->handle);
+
+       return 0;
+}
+
+static int ide_resume(struct pcmcia_device *dev)
+{
+       dev_link_t *link = dev_to_instance(dev);
+
+       link->state &= ~DEV_SUSPEND;
+       if (DEV_OK(link))
+               pcmcia_request_configuration(link->handle, &link->conf);
+
+       return 0;
+}
+
 /*======================================================================
 
     The card status event handler.  Mostly, this schedules other
        link->state |= DEV_PRESENT | DEV_CONFIG_PENDING;
        ide_config(link);
        break;
-    case CS_EVENT_PM_SUSPEND:
-       link->state |= DEV_SUSPEND;
-       /* Fall through... */
-    case CS_EVENT_RESET_PHYSICAL:
-       if (link->state & DEV_CONFIG)
-           pcmcia_release_configuration(link->handle);
-       break;
-    case CS_EVENT_PM_RESUME:
-       link->state &= ~DEV_SUSPEND;
-       /* Fall through... */
-    case CS_EVENT_CARD_RESET:
-       if (DEV_OK(link))
-           pcmcia_request_configuration(link->handle, &link->conf);
-       break;
     }
     return 0;
 } /* ide_event */
        .event          = ide_event,
        .detach         = ide_detach,
        .id_table       = ide_ids,
+       .suspend        = ide_suspend,
+       .resume         = ide_resume,
 };
 
 static int __init init_ide_cs(void)
 
     
 } /* avmcs_release */
 
+static int avmcs_suspend(struct pcmcia_device *dev)
+{
+       dev_link_t *link = dev_to_instance(dev);
+
+       link->state |= DEV_SUSPEND;
+       if (link->state & DEV_CONFIG)
+               pcmcia_release_configuration(link->handle);
+
+       return 0;
+}
+
+static int avmcs_resume(struct pcmcia_device *dev)
+{
+       dev_link_t *link = dev_to_instance(dev);
+
+       link->state &= ~DEV_SUSPEND;
+       if (link->state & DEV_CONFIG)
+               pcmcia_request_configuration(link->handle, &link->conf);
+
+       return 0;
+}
+
 /*======================================================================
 
     The card status event handler.  Mostly, this schedules other
        link->state |= DEV_PRESENT | DEV_CONFIG_PENDING;
        avmcs_config(link);
        break;
-    case CS_EVENT_PM_SUSPEND:
-       link->state |= DEV_SUSPEND;
-       /* Fall through... */
-    case CS_EVENT_RESET_PHYSICAL:
-       if (link->state & DEV_CONFIG)
-           pcmcia_release_configuration(link->handle);
-       break;
-    case CS_EVENT_PM_RESUME:
-       link->state &= ~DEV_SUSPEND;
-       /* Fall through... */
-    case CS_EVENT_CARD_RESET:
-       if (link->state & DEV_CONFIG)
-           pcmcia_request_configuration(link->handle, &link->conf);
-       break;
     }
     return 0;
 } /* avmcs_event */
        .event  = avmcs_event,
        .detach = avmcs_detach,
        .id_table = avmcs_ids,
+       .suspend= avmcs_suspend,
+       .resume = avmcs_resume,
 };
 
 static int __init avmcs_init(void)
 
        avma1cs_detach(link);
 } /* avma1cs_release */
 
+static int avma1cs_suspend(struct pcmcia_device *dev)
+{
+       dev_link_t *link = dev_to_instance(dev);
+
+       link->state |= DEV_SUSPEND;
+       if (link->state & DEV_CONFIG)
+               pcmcia_release_configuration(link->handle);
+
+       return 0;
+}
+
+static int avma1cs_resume(struct pcmcia_device *dev)
+{
+       dev_link_t *link = dev_to_instance(dev);
+
+       link->state &= ~DEV_SUSPEND;
+       if (link->state & DEV_CONFIG)
+               pcmcia_request_configuration(link->handle, &link->conf);
+
+       return 0;
+}
+
 /*======================================================================
 
     The card status event handler.  Mostly, this schedules other
            link->state |= DEV_PRESENT | DEV_CONFIG_PENDING;
            avma1cs_config(link);
            break;
-       case CS_EVENT_PM_SUSPEND:
-           link->state |= DEV_SUSPEND;
-           /* Fall through... */
-       case CS_EVENT_RESET_PHYSICAL:
-           if (link->state & DEV_CONFIG)
-               pcmcia_release_configuration(link->handle);
-           break;
-       case CS_EVENT_PM_RESUME:
-           link->state &= ~DEV_SUSPEND;
-           /* Fall through... */
-       case CS_EVENT_CARD_RESET:
-           if (link->state & DEV_CONFIG)
-               pcmcia_request_configuration(link->handle, &link->conf);
-           break;
     }
     return 0;
 } /* avma1cs_event */
        .event          = avma1cs_event,
        .detach         = avma1cs_detach,
        .id_table       = avma1cs_ids,
+       .suspend        = avma1cs_suspend,
+       .resume         = avma1cs_resume,
 };
  
 /*====================================================================*/
 
     link->state &= ~DEV_CONFIG;
 } /* elsa_cs_release */
 
+static int elsa_suspend(struct pcmcia_device *p_dev)
+{
+       dev_link_t *link = dev_to_instance(p_dev);
+       local_info_t *dev = link->priv;
+
+       link->state |= DEV_SUSPEND;
+        dev->busy = 1;
+       if (link->state & DEV_CONFIG)
+               pcmcia_release_configuration(link->handle);
+
+       return 0;
+}
+
+static int elsa_resume(struct pcmcia_device *p_dev)
+{
+       dev_link_t *link = dev_to_instance(p_dev);
+       local_info_t *dev = link->priv;
+
+       link->state &= ~DEV_SUSPEND;
+       if (link->state & DEV_CONFIG)
+               pcmcia_request_configuration(link->handle, &link->conf);
+        dev->busy = 0;
+
+       return 0;
+}
+
 /*======================================================================
 
     The card status event handler.  Mostly, this schedules other
                           event_callback_args_t *args)
 {
     dev_link_t *link = args->client_data;
-    local_info_t *dev = link->priv;
 
     DEBUG(1, "elsa_cs_event(%d)\n", event);
 
         link->state |= DEV_PRESENT | DEV_CONFIG_PENDING;
         elsa_cs_config(link);
         break;
-    case CS_EVENT_PM_SUSPEND:
-        link->state |= DEV_SUSPEND;
-        /* Fall through... */
-    case CS_EVENT_RESET_PHYSICAL:
-        /* Mark the device as stopped, to block IO until later */
-        dev->busy = 1;
-        if (link->state & DEV_CONFIG)
-            pcmcia_release_configuration(link->handle);
-        break;
-    case CS_EVENT_PM_RESUME:
-        link->state &= ~DEV_SUSPEND;
-        /* Fall through... */
-    case CS_EVENT_CARD_RESET:
-        if (link->state & DEV_CONFIG)
-            pcmcia_request_configuration(link->handle, &link->conf);
-        dev->busy = 0;
-        break;
     }
     return 0;
 } /* elsa_cs_event */
        .event          = elsa_cs_event,
        .detach         = elsa_cs_detach,
        .id_table       = elsa_ids,
+       .suspend        = elsa_suspend,
+       .resume         = elsa_resume,
 };
 
 static int __init init_elsa_cs(void)
 
     
 } /* sedlbauer_release */
 
+static int sedlbauer_suspend(struct pcmcia_device *p_dev)
+{
+       dev_link_t *link = dev_to_instance(p_dev);
+       local_info_t *dev = link->priv;
+
+       link->state |= DEV_SUSPEND;
+       dev->stop = 1;
+       if (link->state & DEV_CONFIG)
+               pcmcia_release_configuration(link->handle);
+
+       return 0;
+}
+
+static int sedlbauer_resume(struct pcmcia_device *p_dev)
+{
+       dev_link_t *link = dev_to_instance(p_dev);
+       local_info_t *dev = link->priv;
+
+       link->state &= ~DEV_SUSPEND;
+       if (link->state & DEV_CONFIG)
+               pcmcia_request_configuration(link->handle, &link->conf);
+       dev->stop = 0;
+
+       return 0;
+}
+
 /*======================================================================
 
     The card status event handler.  Mostly, this schedules other
                       event_callback_args_t *args)
 {
     dev_link_t *link = args->client_data;
-    local_info_t *dev = link->priv;
     
     DEBUG(1, "sedlbauer_event(0x%06x)\n", event);
     
        link->state |= DEV_PRESENT | DEV_CONFIG_PENDING;
        sedlbauer_config(link);
        break;
-    case CS_EVENT_PM_SUSPEND:
-       link->state |= DEV_SUSPEND;
-       /* Fall through... */
-    case CS_EVENT_RESET_PHYSICAL:
-       /* Mark the device as stopped, to block IO until later */
-       dev->stop = 1;
-       if (link->state & DEV_CONFIG)
-           pcmcia_release_configuration(link->handle);
-       break;
-    case CS_EVENT_PM_RESUME:
-       link->state &= ~DEV_SUSPEND;
-       /* Fall through... */
-    case CS_EVENT_CARD_RESET:
-       if (link->state & DEV_CONFIG)
-           pcmcia_request_configuration(link->handle, &link->conf);
-       dev->stop = 0;
-       /*
-         In a normal driver, additional code may go here to restore
-         the device state and restart IO. 
-       */
-       break;
     }
     return 0;
 } /* sedlbauer_event */
        .event          = sedlbauer_event,
        .detach         = sedlbauer_detach,
        .id_table       = sedlbauer_ids,
+       .suspend        = sedlbauer_suspend,
+       .resume         = sedlbauer_resume,
 };
 
 static int __init init_sedlbauer_cs(void)
 
     link->state &= ~DEV_CONFIG;
 } /* teles_cs_release */
 
+static int teles_suspend(struct pcmcia_device *p_dev)
+{
+       dev_link_t *link = dev_to_instance(p_dev);
+       local_info_t *dev = link->priv;
+
+       link->state |= DEV_SUSPEND;
+        dev->busy = 1;
+       if (link->state & DEV_CONFIG)
+               pcmcia_release_configuration(link->handle);
+
+       return 0;
+}
+
+static int teles_resume(struct pcmcia_device *p_dev)
+{
+       dev_link_t *link = dev_to_instance(p_dev);
+       local_info_t *dev = link->priv;
+
+       link->state &= ~DEV_SUSPEND;
+       if (link->state & DEV_CONFIG)
+               pcmcia_request_configuration(link->handle, &link->conf);
+        dev->busy = 0;
+
+       return 0;
+}
+
 /*======================================================================
 
     The card status event handler.  Mostly, this schedules other
                           event_callback_args_t *args)
 {
     dev_link_t *link = args->client_data;
-    local_info_t *dev = link->priv;
 
     DEBUG(1, "teles_cs_event(%d)\n", event);
 
         link->state |= DEV_PRESENT | DEV_CONFIG_PENDING;
         teles_cs_config(link);
         break;
-    case CS_EVENT_PM_SUSPEND:
-        link->state |= DEV_SUSPEND;
-        /* Fall through... */
-    case CS_EVENT_RESET_PHYSICAL:
-        /* Mark the device as stopped, to block IO until later */
-        dev->busy = 1;
-        if (link->state & DEV_CONFIG)
-            pcmcia_release_configuration(link->handle);
-        break;
-    case CS_EVENT_PM_RESUME:
-        link->state &= ~DEV_SUSPEND;
-        /* Fall through... */
-    case CS_EVENT_CARD_RESET:
-        if (link->state & DEV_CONFIG)
-            pcmcia_request_configuration(link->handle, &link->conf);
-        dev->busy = 0;
-        break;
     }
     return 0;
 } /* teles_cs_event */
        .event          = teles_cs_event,
        .detach         = teles_detach,
        .id_table       = teles_ids,
+       .suspend        = teles_suspend,
+       .resume         = teles_resume,
 };
 
 static int __init init_teles_cs(void)
 
 }
 
 
+static int pcmciamtd_suspend(struct pcmcia_device *dev)
+{
+       DEBUG(2, "EVENT_PM_RESUME");
+
+       /* get_lock(link); */
+
+       return 0;
+}
+
+static int pcmciamtd_resume(struct pcmcia_device *dev)
+{
+       DEBUG(2, "EVENT_PM_SUSPEND");
+
+       /* free_lock(link); */
+
+       return 0;
+}
+
 /* The card status event handler.  Mostly, this schedules other
  * stuff to run after an event is received.  A CARD_REMOVAL event
  * also sets some flags to discourage the driver from trying
                link->state |= DEV_PRESENT | DEV_CONFIG_PENDING;
                pcmciamtd_config(link);
                break;
-       case CS_EVENT_PM_SUSPEND:
-               DEBUG(2, "EVENT_PM_SUSPEND");
-               link->state |= DEV_SUSPEND;
-               /* Fall through... */
-       case CS_EVENT_RESET_PHYSICAL:
-               DEBUG(2, "EVENT_RESET_PHYSICAL");
-               /* get_lock(link); */
-               break;
-       case CS_EVENT_PM_RESUME:
-               DEBUG(2, "EVENT_PM_RESUME");
-               link->state &= ~DEV_SUSPEND;
-               /* Fall through... */
-       case CS_EVENT_CARD_RESET:
-               DEBUG(2, "EVENT_CARD_RESET");
-               /* free_lock(link); */
-               break;
        default:
                DEBUG(2, "Unknown event %d", event);
        }
        .detach         = pcmciamtd_detach,
        .owner          = THIS_MODULE,
        .id_table       = pcmciamtd_ids,
+       .suspend        = pcmciamtd_suspend,
+       .resume         = pcmciamtd_resume,
 };
 
 
 
        link->state &= ~DEV_CONFIG;
 }
 
+static int tc574_suspend(struct pcmcia_device *p_dev)
+{
+       dev_link_t *link = dev_to_instance(p_dev);
+       struct net_device *dev = link->priv;
+
+       link->state |= DEV_SUSPEND;
+       if (link->state & DEV_CONFIG) {
+               if (link->open)
+                       netif_device_detach(dev);
+               pcmcia_release_configuration(link->handle);
+       }
+
+       return 0;
+}
+
+static int tc574_resume(struct pcmcia_device *p_dev)
+{
+       dev_link_t *link = dev_to_instance(p_dev);
+       struct net_device *dev = link->priv;
+
+       link->state &= ~DEV_SUSPEND;
+       if (link->state & DEV_CONFIG) {
+               pcmcia_request_configuration(link->handle, &link->conf);
+               if (link->open) {
+                       tc574_reset(dev);
+                       netif_device_attach(dev);
+               }
+       }
+
+       return 0;
+}
+
 /*
        The card status event handler.  Mostly, this schedules other
        stuff to run after an event is received.  A CARD_REMOVAL event
                link->state |= DEV_PRESENT | DEV_CONFIG_PENDING;
                tc574_config(link);
                break;
-       case CS_EVENT_PM_SUSPEND:
-               link->state |= DEV_SUSPEND;
-               /* Fall through... */
-       case CS_EVENT_RESET_PHYSICAL:
-               if (link->state & DEV_CONFIG) {
-                       if (link->open)
-                               netif_device_detach(dev);
-                       pcmcia_release_configuration(link->handle);
-               }
-               break;
-       case CS_EVENT_PM_RESUME:
-               link->state &= ~DEV_SUSPEND;
-               /* Fall through... */
-       case CS_EVENT_CARD_RESET:
-               if (link->state & DEV_CONFIG) {
-                       pcmcia_request_configuration(link->handle, &link->conf);
-                       if (link->open) {
-                               tc574_reset(dev);
-                               netif_device_attach(dev);
-                       }
-               }
-               break;
        }
        return 0;
 } /* tc574_event */
        .event          = tc574_event,
        .detach         = tc574_detach,
        .id_table       = tc574_ids,
+       .suspend        = tc574_suspend,
+       .resume         = tc574_resume,
 };
 
 static int __init init_tc574(void)
 
     link->state &= ~DEV_CONFIG;
 }
 
+static int tc589_suspend(struct pcmcia_device *p_dev)
+{
+       dev_link_t *link = dev_to_instance(p_dev);
+       struct net_device *dev = link->priv;
+
+       link->state |= DEV_SUSPEND;
+       if (link->state & DEV_CONFIG) {
+               if (link->open)
+                       netif_device_detach(dev);
+               pcmcia_release_configuration(link->handle);
+       }
+
+       return 0;
+}
+
+static int tc589_resume(struct pcmcia_device *p_dev)
+{
+       dev_link_t *link = dev_to_instance(p_dev);
+       struct net_device *dev = link->priv;
+
+       link->state &= ~DEV_SUSPEND;
+       if (link->state & DEV_CONFIG) {
+               pcmcia_request_configuration(link->handle, &link->conf);
+               if (link->open) {
+                       tc589_reset(dev);
+                       netif_device_attach(dev);
+               }
+       }
+
+       return 0;
+}
+
 /*======================================================================
 
     The card status event handler.  Mostly, this schedules other
        link->state |= DEV_PRESENT | DEV_CONFIG_PENDING;
        tc589_config(link);
        break;
-    case CS_EVENT_PM_SUSPEND:
-       link->state |= DEV_SUSPEND;
-       /* Fall through... */
-    case CS_EVENT_RESET_PHYSICAL:
-       if (link->state & DEV_CONFIG) {
-           if (link->open)
-               netif_device_detach(dev);
-           pcmcia_release_configuration(link->handle);
-       }
-       break;
-    case CS_EVENT_PM_RESUME:
-       link->state &= ~DEV_SUSPEND;
-       /* Fall through... */
-    case CS_EVENT_CARD_RESET:
-       if (link->state & DEV_CONFIG) {
-           pcmcia_request_configuration(link->handle, &link->conf);
-           if (link->open) {
-               tc589_reset(dev);
-               netif_device_attach(dev);
-           }
-       }
-       break;
     }
     return 0;
 } /* tc589_event */
        .event          = tc589_event,
        .detach         = tc589_detach,
         .id_table       = tc589_ids,
+       .suspend        = tc589_suspend,
+       .resume         = tc589_resume,
 };
 
 static int __init init_tc589(void)
 
     link->state &= ~DEV_CONFIG;
 }
 
+static int axnet_suspend(struct pcmcia_device *p_dev)
+{
+       dev_link_t *link = dev_to_instance(p_dev);
+       struct net_device *dev = link->priv;
+
+       link->state |= DEV_SUSPEND;
+       if (link->state & DEV_CONFIG) {
+               if (link->open)
+                       netif_device_detach(dev);
+               pcmcia_release_configuration(link->handle);
+       }
+
+       return 0;
+}
+
+static int axnet_resume(struct pcmcia_device *p_dev)
+{
+       dev_link_t *link = dev_to_instance(p_dev);
+       struct net_device *dev = link->priv;
+
+       link->state &= ~DEV_SUSPEND;
+       if (link->state & DEV_CONFIG) {
+               pcmcia_request_configuration(link->handle, &link->conf);
+               if (link->open) {
+                       axnet_reset_8390(dev);
+                       AX88190_init(dev, 1);
+                       netif_device_attach(dev);
+               }
+       }
+
+       return 0;
+}
+
+
 /*======================================================================
 
     The card status event handler.  Mostly, this schedules other
        link->state |= DEV_PRESENT | DEV_CONFIG_PENDING;
        axnet_config(link);
        break;
-    case CS_EVENT_PM_SUSPEND:
-       link->state |= DEV_SUSPEND;
-       /* Fall through... */
-    case CS_EVENT_RESET_PHYSICAL:
-       if (link->state & DEV_CONFIG) {
-           if (link->open)
-               netif_device_detach(dev);
-           pcmcia_release_configuration(link->handle);
-       }
-       break;
-    case CS_EVENT_PM_RESUME:
-       link->state &= ~DEV_SUSPEND;
-       /* Fall through... */
-    case CS_EVENT_CARD_RESET:
-       if (link->state & DEV_CONFIG) {
-           pcmcia_request_configuration(link->handle, &link->conf);
-           if (link->open) {
-               axnet_reset_8390(dev);
-               AX88190_init(dev, 1);
-               netif_device_attach(dev);
-           }
-       }
-       break;
     }
     return 0;
 } /* axnet_event */
        .event          = axnet_event,
        .detach         = axnet_detach,
        .id_table       = axnet_ids,
+       .suspend        = axnet_suspend,
+       .resume         = axnet_resume,
 };
 
 static int __init init_axnet_cs(void)
 
     link->state &= ~(DEV_CONFIG | DEV_RELEASE_PENDING);
 }
 
+static int com20020_suspend(struct pcmcia_device *p_dev)
+{
+       dev_link_t *link = dev_to_instance(p_dev);
+       com20020_dev_t *info = link->priv;
+       struct net_device *dev = info->dev;
+
+       link->state |= DEV_SUSPEND;
+        if (link->state & DEV_CONFIG) {
+               if (link->open) {
+                       netif_device_detach(dev);
+               }
+               pcmcia_release_configuration(link->handle);
+        }
+
+       return 0;
+}
+
+static int com20020_resume(struct pcmcia_device *p_dev)
+{
+       dev_link_t *link = dev_to_instance(p_dev);
+       com20020_dev_t *info = link->priv;
+       struct net_device *dev = info->dev;
+
+       link->state &= ~DEV_SUSPEND;
+        if (link->state & DEV_CONFIG) {
+               pcmcia_request_configuration(link->handle, &link->conf);
+               if (link->open) {
+                       int ioaddr = dev->base_addr;
+                       struct arcnet_local *lp = dev->priv;
+                       ARCRESET;
+               }
+        }
+
+       return 0;
+}
+
 /*======================================================================
 
     The card status event handler.  Mostly, this schedules other
         link->state |= DEV_PRESENT;
        com20020_config(link); 
        break;
-    case CS_EVENT_PM_SUSPEND:
-        link->state |= DEV_SUSPEND;
-        /* Fall through... */
-    case CS_EVENT_RESET_PHYSICAL:
-        if (link->state & DEV_CONFIG) {
-            if (link->open) {
-                netif_device_detach(dev);
-            }
-            pcmcia_release_configuration(link->handle);
-        }
-        break;
-    case CS_EVENT_PM_RESUME:
-        link->state &= ~DEV_SUSPEND;
-        /* Fall through... */
-    case CS_EVENT_CARD_RESET:
-        if (link->state & DEV_CONFIG) {
-            pcmcia_request_configuration(link->handle, &link->conf);
-            if (link->open) {
-               int ioaddr = dev->base_addr;
-               struct arcnet_local *lp = dev->priv;
-               ARCRESET;
-            }
-        }
-        break;
     }
     return 0;
 } /* com20020_event */
        .event          = com20020_event,
        .detach         = com20020_detach,
        .id_table       = com20020_ids,
+       .suspend        = com20020_suspend,
+       .resume         = com20020_resume,
 };
 
 static int __init init_com20020_cs(void)
 
     link->state &= ~DEV_CONFIG;
 }
 
+static int fmvj18x_suspend(struct pcmcia_device *p_dev)
+{
+       dev_link_t *link = dev_to_instance(p_dev);
+       struct net_device *dev = link->priv;
+
+       link->state |= DEV_SUSPEND;
+       if (link->state & DEV_CONFIG) {
+               if (link->open)
+                       netif_device_detach(dev);
+               pcmcia_release_configuration(link->handle);
+       }
+
+
+       return 0;
+}
+
+static int fmvj18x_resume(struct pcmcia_device *p_dev)
+{
+       dev_link_t *link = dev_to_instance(p_dev);
+       struct net_device *dev = link->priv;
+
+       link->state &= ~DEV_SUSPEND;
+       if (link->state & DEV_CONFIG) {
+               pcmcia_request_configuration(link->handle, &link->conf);
+               if (link->open) {
+                       fjn_reset(dev);
+                       netif_device_attach(dev);
+               }
+       }
+
+       return 0;
+}
+
 /*====================================================================*/
 
 static int fmvj18x_event(event_t event, int priority,
        link->state |= DEV_PRESENT | DEV_CONFIG_PENDING;
        fmvj18x_config(link);
        break;
-    case CS_EVENT_PM_SUSPEND:
-       link->state |= DEV_SUSPEND;
-       /* Fall through... */
-    case CS_EVENT_RESET_PHYSICAL:
-       if (link->state & DEV_CONFIG) {
-           if (link->open)
-               netif_device_detach(dev);
-           pcmcia_release_configuration(link->handle);
-       }
-       break;
-    case CS_EVENT_PM_RESUME:
-       link->state &= ~DEV_SUSPEND;
-       /* Fall through... */
-    case CS_EVENT_CARD_RESET:
-       if (link->state & DEV_CONFIG) {
-           pcmcia_request_configuration(link->handle, &link->conf);
-           if (link->open) {
-               fjn_reset(dev);
-               netif_device_attach(dev);
-           }
-       }
-       break;
     }
     return 0;
 } /* fmvj18x_event */
        .event          = fmvj18x_event,
        .detach         = fmvj18x_detach,
        .id_table       = fmvj18x_ids,
+       .suspend        = fmvj18x_suspend,
+       .resume         = fmvj18x_resume,
 };
 
 static int __init init_fmvj18x_cs(void)
 
     link->state &= ~DEV_CONFIG;
 }
 
+static int ibmtr_suspend(struct pcmcia_device *p_dev)
+{
+       dev_link_t *link = dev_to_instance(p_dev);
+       ibmtr_dev_t *info = link->priv;
+       struct net_device *dev = info->dev;
+
+       link->state |= DEV_SUSPEND;
+        if (link->state & DEV_CONFIG) {
+               if (link->open)
+                       netif_device_detach(dev);
+               pcmcia_release_configuration(link->handle);
+        }
+
+       return 0;
+}
+
+static int ibmtr_resume(struct pcmcia_device *p_dev)
+{
+       dev_link_t *link = dev_to_instance(p_dev);
+       ibmtr_dev_t *info = link->priv;
+       struct net_device *dev = info->dev;
+
+       link->state &= ~DEV_SUSPEND;
+        if (link->state & DEV_CONFIG) {
+               pcmcia_request_configuration(link->handle, &link->conf);
+               if (link->open) {
+                       ibmtr_probe(dev);       /* really? */
+                       netif_device_attach(dev);
+               }
+        }
+
+       return 0;
+}
+
+
 /*======================================================================
 
     The card status event handler.  Mostly, this schedules other
         link->state |= DEV_PRESENT;
        ibmtr_config(link);
        break;
-    case CS_EVENT_PM_SUSPEND:
-        link->state |= DEV_SUSPEND;
-        /* Fall through... */
-    case CS_EVENT_RESET_PHYSICAL:
-        if (link->state & DEV_CONFIG) {
-            if (link->open)
-               netif_device_detach(dev);
-            pcmcia_release_configuration(link->handle);
-        }
-        break;
-    case CS_EVENT_PM_RESUME:
-        link->state &= ~DEV_SUSPEND;
-        /* Fall through... */
-    case CS_EVENT_CARD_RESET:
-        if (link->state & DEV_CONFIG) {
-            pcmcia_request_configuration(link->handle, &link->conf);
-            if (link->open) {
-               ibmtr_probe(dev);       /* really? */
-               netif_device_attach(dev);
-            }
-        }
-        break;
     }
     return 0;
 } /* ibmtr_event */
        .event          = ibmtr_event,
        .detach         = ibmtr_detach,
        .id_table       = ibmtr_ids,
+       .suspend        = ibmtr_suspend,
+       .resume         = ibmtr_resume,
 };
 
 static int __init init_ibmtr_cs(void)
 
   link->state &= ~DEV_CONFIG;
 }
 
+static int nmclan_suspend(struct pcmcia_device *p_dev)
+{
+       dev_link_t *link = dev_to_instance(p_dev);
+       struct net_device *dev = link->priv;
+
+       link->state |= DEV_SUSPEND;
+       if (link->state & DEV_CONFIG) {
+               if (link->open)
+                       netif_device_detach(dev);
+               pcmcia_release_configuration(link->handle);
+       }
+
+
+       return 0;
+}
+
+static int nmclan_resume(struct pcmcia_device *p_dev)
+{
+       dev_link_t *link = dev_to_instance(p_dev);
+       struct net_device *dev = link->priv;
+
+       link->state &= ~DEV_SUSPEND;
+       if (link->state & DEV_CONFIG) {
+               pcmcia_request_configuration(link->handle, &link->conf);
+               if (link->open) {
+                       nmclan_reset(dev);
+                       netif_device_attach(dev);
+               }
+       }
+
+       return 0;
+}
+
 /* ----------------------------------------------------------------------------
 nmclan_event
        The card status event handler.  Mostly, this schedules other
       link->state |= DEV_PRESENT | DEV_CONFIG_PENDING;
       nmclan_config(link);
       break;
-    case CS_EVENT_PM_SUSPEND:
-      link->state |= DEV_SUSPEND;
-      /* Fall through... */
-    case CS_EVENT_RESET_PHYSICAL:
-      if (link->state & DEV_CONFIG) {
-       if (link->open)
-         netif_device_detach(dev);
-       pcmcia_release_configuration(link->handle);
-      }
-      break;
-    case CS_EVENT_PM_RESUME:
-      link->state &= ~DEV_SUSPEND;
-      /* Fall through... */
-    case CS_EVENT_CARD_RESET:
-      if (link->state & DEV_CONFIG) {
-       pcmcia_request_configuration(link->handle, &link->conf);
-       if (link->open) {
-         nmclan_reset(dev);
-         netif_device_attach(dev);
-       }
-      }
-      break;
     case CS_EVENT_RESET_REQUEST:
       return 1;
       break;
        .event          = nmclan_event,
        .detach         = nmclan_detach,
        .id_table       = nmclan_ids,
+       .suspend        = nmclan_suspend,
+       .resume         = nmclan_resume,
 };
 
 static int __init init_nmclan_cs(void)
 
 
 ======================================================================*/
 
+static int pcnet_suspend(struct pcmcia_device *p_dev)
+{
+       dev_link_t *link = dev_to_instance(p_dev);
+       struct net_device *dev = link->priv;
+
+       link->state |= DEV_SUSPEND;
+       if (link->state & DEV_CONFIG) {
+               if (link->open)
+                       netif_device_detach(dev);
+               pcmcia_release_configuration(link->handle);
+       }
+
+       return 0;
+}
+
+static int pcnet_resume(struct pcmcia_device *p_dev)
+{
+       dev_link_t *link = dev_to_instance(p_dev);
+       struct net_device *dev = link->priv;
+
+       link->state &= ~DEV_SUSPEND;
+       if (link->state & DEV_CONFIG) {
+               pcmcia_request_configuration(link->handle, &link->conf);
+               if (link->open) {
+                       pcnet_reset_8390(dev);
+                       NS8390_init(dev, 1);
+                       netif_device_attach(dev);
+               }
+       }
+
+       return 0;
+}
+
 static int pcnet_event(event_t event, int priority,
                       event_callback_args_t *args)
 {
        link->state |= DEV_PRESENT | DEV_CONFIG_PENDING;
        pcnet_config(link);
        break;
-    case CS_EVENT_PM_SUSPEND:
-       link->state |= DEV_SUSPEND;
-       /* Fall through... */
-    case CS_EVENT_RESET_PHYSICAL:
-       if (link->state & DEV_CONFIG) {
-           if (link->open)
-               netif_device_detach(dev);
-           pcmcia_release_configuration(link->handle);
-       }
-       break;
-    case CS_EVENT_PM_RESUME:
-       link->state &= ~DEV_SUSPEND;
-       /* Fall through... */
-    case CS_EVENT_CARD_RESET:
-       if (link->state & DEV_CONFIG) {
-           pcmcia_request_configuration(link->handle, &link->conf);
-           if (link->open) {
-               pcnet_reset_8390(dev);
-               NS8390_init(dev, 1);
-               netif_device_attach(dev);
-           }
-       }
-       break;
     }
     return 0;
 } /* pcnet_event */
        .detach         = pcnet_detach,
        .owner          = THIS_MODULE,
        .id_table       = pcnet_ids,
+       .suspend        = pcnet_suspend,
+       .resume         = pcnet_resume,
 };
 
 static int __init init_pcnet_cs(void)
 
    return rc;
 }
 
+static int smc91c92_suspend(struct pcmcia_device *p_dev)
+{
+       dev_link_t *link = dev_to_instance(p_dev);
+       struct net_device *dev = link->priv;
+
+       link->state |= DEV_SUSPEND;
+       if (link->state & DEV_CONFIG) {
+               if (link->open)
+                       netif_device_detach(dev);
+               pcmcia_release_configuration(link->handle);
+       }
+
+       return 0;
+}
+
+static int smc91c92_resume(struct pcmcia_device *p_dev)
+{
+       dev_link_t *link = dev_to_instance(p_dev);
+       struct net_device *dev = link->priv;
+       struct smc_private *smc = netdev_priv(dev);
+       int i;
+
+       link->state &= ~DEV_SUSPEND;
+       if (link->state & DEV_CONFIG) {
+               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) &&
+                   (smc->cardid != PRODID_OSITECH_SEVEN)) {
+                       /* Power up the card and enable interrupts */
+                       set_bits(0x0300, dev->base_addr-0x10+OSITECH_AUI_PWR);
+                       set_bits(0x0300, dev->base_addr-0x10+OSITECH_RESET_ISR);
+               }
+               if (((smc->manfid == MANFID_OSITECH) &&
+                    (smc->cardid == PRODID_OSITECH_SEVEN)) ||
+                   ((smc->manfid == MANFID_PSION) &&
+                    (smc->cardid == PRODID_PSION_NET100))) {
+                       /* Download the Seven of Diamonds firmware */
+                       for (i = 0; i < sizeof(__Xilinx7OD); i++) {
+                               outb(__Xilinx7OD[i], link->io.BasePort1+2);
+                               udelay(50);
+                       }
+               }
+               if (link->open) {
+                       smc_reset(dev);
+                       netif_device_attach(dev);
+               }
+       }
+
+       return 0;
+}
+
+
 /*======================================================================
 
     This verifies that the chip is some SMC91cXX variant, and returns
     }
 
     if (width) {
-       event_callback_args_t args;
        printk(KERN_INFO "smc91c92_cs: using 8-bit IO window.\n");
-       args.client_data = link;
-       smc91c92_event(CS_EVENT_RESET_PHYSICAL, 0, &args);
+       smc91c92_suspend(link->handle);
        pcmcia_release_io(link->handle, &link->io);
        link->io.Attributes1 = IO_DATA_PATH_WIDTH_8;
        pcmcia_request_io(link->handle, &link->io);
-       smc91c92_event(CS_EVENT_CARD_RESET, 0, &args);
+       smc91c92_resume(link->handle);
        return check_sig(link);
     }
     return -ENODEV;
 {
     dev_link_t *link = args->client_data;
     struct net_device *dev = link->priv;
-    struct smc_private *smc = netdev_priv(dev);
-    int i;
 
     DEBUG(1, "smc91c92_event(0x%06x)\n", event);
 
        link->state |= DEV_PRESENT | DEV_CONFIG_PENDING;
        smc91c92_config(link);
        break;
-    case CS_EVENT_PM_SUSPEND:
-       link->state |= DEV_SUSPEND;
-       /* Fall through... */
-    case CS_EVENT_RESET_PHYSICAL:
-       if (link->state & DEV_CONFIG) {
-           if (link->open)
-               netif_device_detach(dev);
-           pcmcia_release_configuration(link->handle);
-       }
-       break;
-    case CS_EVENT_PM_RESUME:
-       link->state &= ~DEV_SUSPEND;
-       /* Fall through... */
-    case CS_EVENT_CARD_RESET:
-       if (link->state & DEV_CONFIG) {
-           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) &&
-               (smc->cardid != PRODID_OSITECH_SEVEN)) {
-               /* Power up the card and enable interrupts */
-               set_bits(0x0300, dev->base_addr-0x10+OSITECH_AUI_PWR);
-               set_bits(0x0300, dev->base_addr-0x10+OSITECH_RESET_ISR);
-           }
-           if (((smc->manfid == MANFID_OSITECH) &&
-               (smc->cardid == PRODID_OSITECH_SEVEN)) ||
-               ((smc->manfid == MANFID_PSION) &&
-               (smc->cardid == PRODID_PSION_NET100))) {
-               /* Download the Seven of Diamonds firmware */
-               for (i = 0; i < sizeof(__Xilinx7OD); i++) {
-                   outb(__Xilinx7OD[i], link->io.BasePort1+2);
-                   udelay(50);
-               }
-           }
-           if (link->open) {
-               smc_reset(dev);
-               netif_device_attach(dev);
-           }
-       }
-       break;
     }
     return 0;
 } /* smc91c92_event */
        .event          = smc91c92_event,
        .detach         = smc91c92_detach,
        .id_table       = smc91c92_ids,
+       .suspend        = smc91c92_suspend,
+       .resume         = smc91c92_resume,
 };
 
 static int __init init_smc91c92_cs(void)
 
 
 /*====================================================================*/
 
+
+static int xirc2ps_suspend(struct pcmcia_device *p_dev)
+{
+       dev_link_t *link = dev_to_instance(p_dev);
+       struct net_device *dev = link->priv;
+
+       link->state |= DEV_SUSPEND;
+       if (link->state & DEV_CONFIG) {
+               if (link->open) {
+                       netif_device_detach(dev);
+                       do_powerdown(dev);
+               }
+               pcmcia_release_configuration(link->handle);
+       }
+
+       return 0;
+}
+
+static int xirc2ps_resume(struct pcmcia_device *p_dev)
+{
+       dev_link_t *link = dev_to_instance(p_dev);
+       struct net_device *dev = link->priv;
+
+       link->state &= ~DEV_SUSPEND;
+       if (link->state & DEV_CONFIG) {
+               pcmcia_request_configuration(link->handle, &link->conf);
+               if (link->open) {
+                       do_reset(dev,1);
+                       netif_device_attach(dev);
+               }
+       }
+
+       return 0;
+}
+
 /****************
  * The card status event handler.  Mostly, this schedules other
  * stuff to run after an event is received.  A CARD_REMOVAL event
        link->state |= DEV_PRESENT | DEV_CONFIG_PENDING;
        xirc2ps_config(link);
        break;
-    case CS_EVENT_PM_SUSPEND:
-       link->state |= DEV_SUSPEND;
-       /* Fall through... */
-    case CS_EVENT_RESET_PHYSICAL:
-       if (link->state & DEV_CONFIG) {
-           if (link->open) {
-               netif_device_detach(dev);
-               do_powerdown(dev);
-           }
-           pcmcia_release_configuration(link->handle);
-       }
-       break;
-    case CS_EVENT_PM_RESUME:
-       link->state &= ~DEV_SUSPEND;
-       /* Fall through... */
-    case CS_EVENT_CARD_RESET:
-       if (link->state & DEV_CONFIG) {
-           pcmcia_request_configuration(link->handle, &link->conf);
-           if (link->open) {
-               do_reset(dev,1);
-               netif_device_attach(dev);
-           }
-       }
-       break;
     }
     return 0;
 } /* xirc2ps_event */
        .event          = xirc2ps_event,
        .detach         = xirc2ps_detach,
        .id_table       = xirc2ps_ids,
+       .suspend        = xirc2ps_suspend,
+       .resume         = xirc2ps_resume,
 };
 
 static int __init
 
        link->state &= ~DEV_CONFIG;
 }
 
+static int airo_suspend(struct pcmcia_device *p_dev)
+{
+       dev_link_t *link = dev_to_instance(p_dev);
+       local_info_t *local = link->priv;
+
+       link->state |= DEV_SUSPEND;
+       if (link->state & DEV_CONFIG) {
+               netif_device_detach(local->eth_dev);
+               pcmcia_release_configuration(link->handle);
+       }
+
+       return 0;
+}
+
+static int airo_resume(struct pcmcia_device *p_dev)
+{
+       dev_link_t *link = dev_to_instance(p_dev);
+       local_info_t *local = link->priv;
+
+       link->state &= ~DEV_SUSPEND;
+       if (link->state & DEV_CONFIG) {
+               pcmcia_request_configuration(link->handle, &link->conf);
+               reset_airo_card(local->eth_dev);
+               netif_device_attach(local->eth_dev);
+       }
+
+       return 0;
+}
+
 /*======================================================================
   
   The card status event handler.  Mostly, this schedules other
                link->state |= DEV_PRESENT | DEV_CONFIG_PENDING;
                airo_config(link);
                break;
-       case CS_EVENT_PM_SUSPEND:
-               link->state |= DEV_SUSPEND;
-               /* Fall through... */
-       case CS_EVENT_RESET_PHYSICAL:
-               if (link->state & DEV_CONFIG) {
-                       netif_device_detach(local->eth_dev);
-                       pcmcia_release_configuration(link->handle);
-               }
-               break;
-       case CS_EVENT_PM_RESUME:
-               link->state &= ~DEV_SUSPEND;
-               /* Fall through... */
-       case CS_EVENT_CARD_RESET:
-               if (link->state & DEV_CONFIG) {
-                       pcmcia_request_configuration(link->handle, &link->conf);
-                       reset_airo_card(local->eth_dev);
-                       netif_device_attach(local->eth_dev);
-               }
-               break;
        }
        return 0;
 } /* airo_event */
        .event          = airo_event,
        .detach         = airo_detach,
        .id_table       = airo_ids,
+       .suspend        = airo_suspend,
+       .resume         = airo_resume,
 };
 
 static int airo_cs_init(void)
 
        link->state &= ~DEV_CONFIG;
 }
 
+static int atmel_suspend(struct pcmcia_device *dev)
+{
+       dev_link_t *link = dev_to_instance(dev);
+       local_info_t *local = link->priv;
+
+       link->state |= DEV_SUSPEND;
+       if (link->state & DEV_CONFIG) {
+               netif_device_detach(local->eth_dev);
+               pcmcia_release_configuration(link->handle);
+       }
+
+       return 0;
+}
+
+static int atmel_resume(struct pcmcia_device *dev)
+{
+       dev_link_t *link = dev_to_instance(dev);
+       local_info_t *local = link->priv;
+
+       link->state &= ~DEV_SUSPEND;
+       if (link->state & DEV_CONFIG) {
+               pcmcia_request_configuration(link->handle, &link->conf);
+               atmel_open(local->eth_dev);
+               netif_device_attach(local->eth_dev);
+       }
+
+       return 0;
+}
+
 /*======================================================================
   
   The card status event handler.  Mostly, this schedules other
                link->state |= DEV_PRESENT | DEV_CONFIG_PENDING;
                atmel_config(link);
                break;
-       case CS_EVENT_PM_SUSPEND:
-               link->state |= DEV_SUSPEND;
-               /* Fall through... */
-       case CS_EVENT_RESET_PHYSICAL:
-               if (link->state & DEV_CONFIG) {
-                       netif_device_detach(local->eth_dev);
-                       pcmcia_release_configuration(link->handle);
-               }
-               break;
-       case CS_EVENT_PM_RESUME:
-               link->state &= ~DEV_SUSPEND;
-               /* Fall through... */
-       case CS_EVENT_CARD_RESET:
-               if (link->state & DEV_CONFIG) {
-                       pcmcia_request_configuration(link->handle, &link->conf);
-                       atmel_open(local->eth_dev);
-                       netif_device_attach(local->eth_dev);
-               }
-               break;
        }
        return 0;
 } /* atmel_event */
        .event          = atmel_event,
        .detach         = atmel_detach,
        .id_table       = atmel_ids,
+       .suspend        = atmel_suspend,
+       .resume         = atmel_resume,
 };
 
 static int atmel_cs_init(void)
 
        PDEBUG(DEBUG_FLOW, "release - done\n");
 }
 
+static int hostap_cs_suspend(struct pcmcia_device *p_dev)
+{
+       dev_link_t *link = dev_to_instance(p_dev);
+       struct net_device *dev = (struct net_device *) link->priv;
+       int dev_open = 0;
 
-static int prism2_event(event_t event, int priority,
-                       event_callback_args_t *args)
+       PDEBUG(DEBUG_EXTRA, "%s: CS_EVENT_PM_SUSPEND\n", dev_info);
+
+       link->state |= DEV_SUSPEND;
+
+       if (link->state & DEV_CONFIG) {
+               struct hostap_interface *iface = netdev_priv(dev);
+               if (iface && iface->local)
+                       dev_open = iface->local->num_dev_open > 0;
+               if (dev_open) {
+                       netif_stop_queue(dev);
+                       netif_device_detach(dev);
+               }
+               prism2_suspend(dev);
+               pcmcia_release_configuration(link->handle);
+       }
+
+       return 0;
+}
+
+static int hostap_cs_resume(struct pcmcia_device *p_dev)
 {
-       dev_link_t *link = args->client_data;
+       dev_link_t *link = dev_to_instance(p_dev);
        struct net_device *dev = (struct net_device *) link->priv;
        int dev_open = 0;
 
+       PDEBUG(DEBUG_EXTRA, "%s: CS_EVENT_PM_RESUME\n", dev_info);
+
+       link->state &= ~DEV_SUSPEND;
        if (link->state & DEV_CONFIG) {
                struct hostap_interface *iface = netdev_priv(dev);
                if (iface && iface->local)
                        dev_open = iface->local->num_dev_open > 0;
+
+               pcmcia_request_configuration(link->handle, &link->conf);
+
+               prism2_hw_shutdown(dev, 1);
+               prism2_hw_config(dev, dev_open ? 0 : 1);
+               if (dev_open) {
+                       netif_device_attach(dev);
+                       netif_start_queue(dev);
+               }
        }
 
+       return 0;
+}
+
+static int prism2_event(event_t event, int priority,
+                       event_callback_args_t *args)
+{
+       dev_link_t *link = args->client_data;
+       struct net_device *dev = (struct net_device *) link->priv;
+
        switch (event) {
        case CS_EVENT_CARD_INSERTION:
                PDEBUG(DEBUG_EXTRA, "%s: CS_EVENT_CARD_INSERTION\n", dev_info);
                }
                break;
 
-       case CS_EVENT_PM_SUSPEND:
-               PDEBUG(DEBUG_EXTRA, "%s: CS_EVENT_PM_SUSPEND\n", dev_info);
-               link->state |= DEV_SUSPEND;
-               /* fall through */
-
-       case CS_EVENT_RESET_PHYSICAL:
-               PDEBUG(DEBUG_EXTRA, "%s: CS_EVENT_RESET_PHYSICAL\n", dev_info);
-               if (link->state & DEV_CONFIG) {
-                       if (dev_open) {
-                               netif_stop_queue(dev);
-                               netif_device_detach(dev);
-                       }
-                       prism2_suspend(dev);
-                       pcmcia_release_configuration(link->handle);
-               }
-               break;
-
-       case CS_EVENT_PM_RESUME:
-               PDEBUG(DEBUG_EXTRA, "%s: CS_EVENT_PM_RESUME\n", dev_info);
-               link->state &= ~DEV_SUSPEND;
-               /* fall through */
-
-       case CS_EVENT_CARD_RESET:
-               PDEBUG(DEBUG_EXTRA, "%s: CS_EVENT_CARD_RESET\n", dev_info);
-               if (link->state & DEV_CONFIG) {
-                       pcmcia_request_configuration(link->handle,
-                                                    &link->conf);
-                       prism2_hw_shutdown(dev, 1);
-                       prism2_hw_config(dev, dev_open ? 0 : 1);
-                       if (dev_open) {
-                               netif_device_attach(dev);
-                               netif_start_queue(dev);
-                       }
-               }
-               break;
-
        default:
                PDEBUG(DEBUG_EXTRA, "%s: prism2_event() - unknown event %d\n",
                       dev_info, event);
        .owner          = THIS_MODULE,
        .event          = prism2_event,
        .id_table       = hostap_cs_ids,
+       .suspend        = hostap_cs_suspend,
+       .resume         = hostap_cs_resume,
 };
 
 static int __init init_prism2_pccard(void)
 
     link->state &= ~DEV_CONFIG;
 }
 
+static int netwave_suspend(struct pcmcia_device *p_dev)
+{
+       dev_link_t *link = dev_to_instance(p_dev);
+       struct net_device *dev = link->priv;
+
+       link->state |= DEV_SUSPEND;
+       if (link->state & DEV_CONFIG) {
+               if (link->open)
+                       netif_device_detach(dev);
+               pcmcia_release_configuration(link->handle);
+       }
+
+       return 0;
+}
+
+static int netwave_resume(struct pcmcia_device *p_dev)
+{
+       dev_link_t *link = dev_to_instance(p_dev);
+       struct net_device *dev = link->priv;
+
+       link->state &= ~DEV_SUSPEND;
+       if (link->state & DEV_CONFIG) {
+               pcmcia_request_configuration(link->handle, &link->conf);
+               if (link->open) {
+                       netwave_reset(dev);
+                       netif_device_attach(dev);
+               }
+       }
+
+       return 0;
+}
+
+
 /*
  * Function netwave_event (event, priority, args)
  *
        link->state |= DEV_PRESENT | DEV_CONFIG_PENDING;
        netwave_pcmcia_config( link);
        break;
-    case CS_EVENT_PM_SUSPEND:
-       link->state |= DEV_SUSPEND;
-       /* Fall through... */
-    case CS_EVENT_RESET_PHYSICAL:
-       if (link->state & DEV_CONFIG) {
-           if (link->open)
-               netif_device_detach(dev);
-           pcmcia_release_configuration(link->handle);
-       }
-       break;
-    case CS_EVENT_PM_RESUME:
-       link->state &= ~DEV_SUSPEND;
-       /* Fall through... */
-    case CS_EVENT_CARD_RESET:
-       if (link->state & DEV_CONFIG) {
-           pcmcia_request_configuration(link->handle, &link->conf);
-           if (link->open) {
-               netwave_reset(dev);
-               netif_device_attach(dev);
-           }
-       }
-       break;
     }
     return 0;
 } /* netwave_event */
        .event          = netwave_event,
        .detach         = netwave_detach,
        .id_table       = netwave_ids,
+       .suspend        = netwave_suspend,
+       .resume         = netwave_resume,
 };
 
 static int __init init_netwave_cs(void)
 
                ioport_unmap(priv->hw.iobase);
 }                              /* orinoco_cs_release */
 
+static int orinoco_cs_suspend(struct pcmcia_device *p_dev)
+{
+       dev_link_t *link = dev_to_instance(p_dev);
+       struct net_device *dev = link->priv;
+       struct orinoco_private *priv = netdev_priv(dev);
+       struct orinoco_pccard *card = priv->card;
+       int err = 0;
+       unsigned long flags;
+
+       link->state |= DEV_SUSPEND;
+       if (link->state & DEV_CONFIG) {
+               /* This is probably racy, but I can't think of
+                  a better way, short of rewriting the PCMCIA
+                  layer to not suck :-( */
+               if (! test_bit(0, &card->hard_reset_in_progress)) {
+                       spin_lock_irqsave(&priv->lock, flags);
+
+                       err = __orinoco_down(dev);
+                       if (err)
+                               printk(KERN_WARNING "%s: Error %d downing interface\n",
+                                      dev->name, err);
+
+                       netif_device_detach(dev);
+                       priv->hw_unavailable++;
+
+                       spin_unlock_irqrestore(&priv->lock, flags);
+               }
+
+               pcmcia_release_configuration(link->handle);
+       }
+
+       return 0;
+}
+
+static int orinoco_cs_resume(struct pcmcia_device *p_dev)
+{
+       dev_link_t *link = dev_to_instance(p_dev);
+       struct net_device *dev = link->priv;
+       struct orinoco_private *priv = netdev_priv(dev);
+       struct orinoco_pccard *card = priv->card;
+       int err = 0;
+       unsigned long flags;
+
+       link->state &= ~DEV_SUSPEND;
+       if (link->state & DEV_CONFIG) {
+               /* FIXME: should we double check that this is
+                * the same card as we had before */
+               pcmcia_request_configuration(link->handle, &link->conf);
+
+               if (! test_bit(0, &card->hard_reset_in_progress)) {
+                       err = orinoco_reinit_firmware(dev);
+                       if (err) {
+                               printk(KERN_ERR "%s: Error %d re-initializing firmware\n",
+                                      dev->name, err);
+                               return -EIO;
+                       }
+
+                       spin_lock_irqsave(&priv->lock, flags);
+
+                       netif_device_attach(dev);
+                       priv->hw_unavailable--;
+
+                       if (priv->open && ! priv->hw_unavailable) {
+                               err = __orinoco_up(dev);
+                               if (err)
+                                       printk(KERN_ERR "%s: Error %d restarting card\n",
+                                              dev->name, err);
+                       }
+
+                       spin_unlock_irqrestore(&priv->lock, flags);
+               }
+       }
+
+       return 0;
+}
+
+
 /*
  * The card status event handler.  Mostly, this schedules other stuff
  * to run after an event is received.
        dev_link_t *link = args->client_data;
        struct net_device *dev = link->priv;
        struct orinoco_private *priv = netdev_priv(dev);
-       struct orinoco_pccard *card = priv->card;
        int err = 0;
-       unsigned long flags;
 
        switch (event) {
        case CS_EVENT_CARD_REMOVAL:
                link->state |= DEV_PRESENT | DEV_CONFIG_PENDING;
                orinoco_cs_config(link);
                break;
-
-       case CS_EVENT_PM_SUSPEND:
-               link->state |= DEV_SUSPEND;
-               /* Fall through... */
-       case CS_EVENT_RESET_PHYSICAL:
-               /* Mark the device as stopped, to block IO until later */
-               if (link->state & DEV_CONFIG) {
-                       /* This is probably racy, but I can't think of
-                           a better way, short of rewriting the PCMCIA
-                           layer to not suck :-( */
-                       if (! test_bit(0, &card->hard_reset_in_progress)) {
-                               spin_lock_irqsave(&priv->lock, flags);
-
-                               err = __orinoco_down(dev);
-                               if (err)
-                                       printk(KERN_WARNING "%s: %s: Error %d downing interface\n",
-                                              dev->name,
-                                              event == CS_EVENT_PM_SUSPEND ? "SUSPEND" : "RESET_PHYSICAL",
-                                              err);
-                               
-                               netif_device_detach(dev);
-                               priv->hw_unavailable++;
-
-                               spin_unlock_irqrestore(&priv->lock, flags);
-                       }
-
-                       pcmcia_release_configuration(link->handle);
-               }
-               break;
-
-       case CS_EVENT_PM_RESUME:
-               link->state &= ~DEV_SUSPEND;
-               /* Fall through... */
-       case CS_EVENT_CARD_RESET:
-               if (link->state & DEV_CONFIG) {
-                       /* FIXME: should we double check that this is
-                        * the same card as we had before */
-                       pcmcia_request_configuration(link->handle, &link->conf);
-
-                       if (! test_bit(0, &card->hard_reset_in_progress)) {
-                               err = orinoco_reinit_firmware(dev);
-                               if (err) {
-                                       printk(KERN_ERR "%s: Error %d re-initializing firmware\n",
-                                              dev->name, err);
-                                       break;
-                               }
-                               
-                               spin_lock_irqsave(&priv->lock, flags);
-                               
-                               netif_device_attach(dev);
-                               priv->hw_unavailable--;
-                               
-                               if (priv->open && ! priv->hw_unavailable) {
-                                       err = __orinoco_up(dev);
-                                       if (err)
-                                               printk(KERN_ERR "%s: Error %d restarting card\n",
-                                                      dev->name, err);
-                                       
-                               }
-
-                               spin_unlock_irqrestore(&priv->lock, flags);
-                       }
-               }
-               break;
        }
 
        return err;
        .detach         = orinoco_cs_detach,
        .event          = orinoco_cs_event,
        .id_table       = orinoco_cs_ids,
+       .suspend        = orinoco_cs_suspend,
+       .resume         = orinoco_cs_resume,
 };
 
 static int __init
 
     DEBUG(2,"ray_release ending\n");
 }
 
+static int ray_suspend(struct pcmcia_device *p_dev)
+{
+       dev_link_t *link = dev_to_instance(p_dev);
+       struct net_device *dev = link->priv;
+
+       link->state |= DEV_SUSPEND;
+        if (link->state & DEV_CONFIG) {
+               if (link->open)
+                       netif_device_detach(dev);
+
+               pcmcia_release_configuration(link->handle);
+        }
+
+
+       return 0;
+}
+
+static int ray_resume(struct pcmcia_device *p_dev)
+{
+       dev_link_t *link = dev_to_instance(p_dev);
+       struct net_device *dev = link->priv;
+
+       link->state &= ~DEV_SUSPEND;
+        if (link->state & DEV_CONFIG) {
+               pcmcia_request_configuration(link->handle, &link->conf);
+               if (link->open) {
+                       ray_reset(dev);
+                       netif_device_attach(dev);
+               }
+        }
+
+       return 0;
+}
+
 /*=============================================================================
     The card status event handler.  Mostly, this schedules other
     stuff to run after an event is received.  A CARD_REMOVAL event
         link->state |= DEV_PRESENT | DEV_CONFIG_PENDING;
         ray_config(link);
         break;
-    case CS_EVENT_PM_SUSPEND:
-        link->state |= DEV_SUSPEND;
-        /* Fall through... */
-    case CS_EVENT_RESET_PHYSICAL:
-        if (link->state & DEV_CONFIG) {
-            if (link->open)
-               netif_device_detach(dev);
-
-            pcmcia_release_configuration(link->handle);
-        }
-        break;
-    case CS_EVENT_PM_RESUME:
-        link->state &= ~DEV_SUSPEND;
-        /* Fall through... */
-    case CS_EVENT_CARD_RESET:
-        if (link->state & DEV_CONFIG) {
-            pcmcia_request_configuration(link->handle, &link->conf);
-            if (link->open) {
-                ray_reset(dev);
-               netif_device_attach(dev);
-            }
-        }
-        break;
     }
     return 0;
     DEBUG(2,"ray_event ending\n");
        .event          = ray_event,
        .detach         = ray_detach,
        .id_table       = ray_ids,
+       .suspend        = ray_suspend,
+       .resume         = ray_resume,
 };
 
 static int __init init_ray_cs(void)
 
                ioport_unmap(priv->hw.iobase);
 }                              /* spectrum_cs_release */
 
+
+static int
+spectrum_cs_suspend(struct pcmcia_device *p_dev)
+{
+       dev_link_t *link = dev_to_instance(p_dev);
+       struct net_device *dev = link->priv;
+       struct orinoco_private *priv = netdev_priv(dev);
+       unsigned long flags;
+       int err = 0;
+
+       link->state |= DEV_SUSPEND;
+       /* Mark the device as stopped, to block IO until later */
+       if (link->state & DEV_CONFIG) {
+               spin_lock_irqsave(&priv->lock, flags);
+
+               err = __orinoco_down(dev);
+               if (err)
+                       printk(KERN_WARNING "%s: Error %d downing interface\n",
+                              dev->name, err);
+
+               netif_device_detach(dev);
+               priv->hw_unavailable++;
+
+               spin_unlock_irqrestore(&priv->lock, flags);
+
+               pcmcia_release_configuration(link->handle);
+       }
+
+       return 0;
+}
+
+static int
+spectrum_cs_resume(struct pcmcia_device *p_dev)
+{
+       dev_link_t *link = dev_to_instance(p_dev);
+       struct net_device *dev = link->priv;
+       struct orinoco_private *priv = netdev_priv(dev);
+
+       link->state &= ~DEV_SUSPEND;
+       if (link->state & DEV_CONFIG) {
+               /* FIXME: should we double check that this is
+                * the same card as we had before */
+               pcmcia_request_configuration(link->handle, &link->conf);
+               netif_device_attach(dev);
+               priv->hw_unavailable--;
+               schedule_work(&priv->reset_work);
+       }
+       return 0;
+}
+
 /*
  * The card status event handler.  Mostly, this schedules other stuff
  * to run after an event is received.
        dev_link_t *link = args->client_data;
        struct net_device *dev = link->priv;
        struct orinoco_private *priv = netdev_priv(dev);
-       int err = 0;
-       unsigned long flags;
 
        switch (event) {
        case CS_EVENT_CARD_REMOVAL:
                spectrum_cs_config(link);
                break;
 
-       case CS_EVENT_PM_SUSPEND:
-               link->state |= DEV_SUSPEND;
-               /* Fall through... */
-       case CS_EVENT_RESET_PHYSICAL:
-               /* Mark the device as stopped, to block IO until later */
-               if (link->state & DEV_CONFIG) {
-                       /* This is probably racy, but I can't think of
-                           a better way, short of rewriting the PCMCIA
-                           layer to not suck :-( */
-                       spin_lock_irqsave(&priv->lock, flags);
-
-                       err = __orinoco_down(dev);
-                       if (err)
-                               printk(KERN_WARNING "%s: %s: Error %d downing interface\n",
-                                      dev->name,
-                                      event == CS_EVENT_PM_SUSPEND ? "SUSPEND" : "RESET_PHYSICAL",
-                                      err);
-
-                       netif_device_detach(dev);
-                       priv->hw_unavailable++;
-
-                       spin_unlock_irqrestore(&priv->lock, flags);
-
-                       pcmcia_release_configuration(link->handle);
-               }
-               break;
-
-       case CS_EVENT_PM_RESUME:
-               link->state &= ~DEV_SUSPEND;
-               /* Fall through... */
-       case CS_EVENT_CARD_RESET:
-               if (link->state & DEV_CONFIG) {
-                       /* FIXME: should we double check that this is
-                        * the same card as we had before */
-                       pcmcia_request_configuration(link->handle, &link->conf);
-                       netif_device_attach(dev);
-                       priv->hw_unavailable--;
-                       schedule_work(&priv->reset_work);
-               }
-               break;
        }
 
-       return err;
+       return 0;
 }                              /* spectrum_cs_event */
 
 /********************************************************************/
        },
        .attach         = spectrum_cs_attach,
        .detach         = spectrum_cs_detach,
+       .suspend        = spectrum_cs_suspend,
+       .resume         = spectrum_cs_resume,
        .event          = spectrum_cs_event,
        .id_table       = spectrum_cs_ids,
 };
 
 #endif
 }
 
+static int wavelan_suspend(struct pcmcia_device *p_dev)
+{
+       dev_link_t *link = dev_to_instance(p_dev);
+       struct net_device *     dev = (struct net_device *) link->priv;
+
+       /* NB: wavelan_close will be called, but too late, so we are
+        * obliged to close nicely the wavelan here. David, could you
+        * close the device before suspending them ? And, by the way,
+        * could you, on resume, add a "route add -net ..." after the
+        * ifconfig up ? Thanks... */
+
+       /* Stop receiving new messages and wait end of transmission */
+       wv_ru_stop(dev);
+
+       /* Power down the module */
+       hacr_write(dev->base_addr, HACR_DEFAULT & (~HACR_PWR_STAT));
+
+       /* The card is now suspended */
+       link->state |= DEV_SUSPEND;
+
+       if(link->state & DEV_CONFIG)
+       {
+               if(link->open)
+                       netif_device_detach(dev);
+               pcmcia_release_configuration(link->handle);
+       }
+
+       return 0;
+}
+
+static int wavelan_resume(struct pcmcia_device *p_dev)
+{
+       dev_link_t *link = dev_to_instance(p_dev);
+       struct net_device *     dev = (struct net_device *) link->priv;
+
+       link->state &= ~DEV_SUSPEND;
+       if(link->state & DEV_CONFIG)
+       {
+               pcmcia_request_configuration(link->handle, &link->conf);
+               if(link->open)  /* If RESET -> True, If RESUME -> False ? */
+               {
+                       wv_hw_reset(dev);
+                       netif_device_attach(dev);
+               }
+       }
+
+       return 0;
+}
+
+
 /*------------------------------------------------------------------*/
 /*
  * The card status event handler. Mostly, this schedules other stuff
        else
          dev->irq = 0;
        break;
-
-      case CS_EVENT_PM_SUSPEND:
-       /* NB: wavelan_close will be called, but too late, so we are
-        * obliged to close nicely the wavelan here. David, could you
-        * close the device before suspending them ? And, by the way,
-        * could you, on resume, add a "route add -net ..." after the
-        * ifconfig up ? Thanks... */
-
-       /* Stop receiving new messages and wait end of transmission */
-       wv_ru_stop(dev);
-
-       /* Power down the module */
-       hacr_write(dev->base_addr, HACR_DEFAULT & (~HACR_PWR_STAT));
-
-       /* The card is now suspended */
-       link->state |= DEV_SUSPEND;
-       /* Fall through... */
-      case CS_EVENT_RESET_PHYSICAL:
-       if(link->state & DEV_CONFIG)
-         {
-           if(link->open)
-             netif_device_detach(dev);
-           pcmcia_release_configuration(link->handle);
-         }
-       break;
-
-      case CS_EVENT_PM_RESUME:
-       link->state &= ~DEV_SUSPEND;
-       /* Fall through... */
-      case CS_EVENT_CARD_RESET:
-       if(link->state & DEV_CONFIG)
-         {
-           pcmcia_request_configuration(link->handle, &link->conf);
-           if(link->open)      /* If RESET -> True, If RESUME -> False ? */
-             {
-               wv_hw_reset(dev);
-               netif_device_attach(dev);
-             }
-         }
-       break;
     }
 
 #ifdef DEBUG_CALLBACK_TRACE
        .event          = wavelan_event,
        .detach         = wavelan_detach,
        .id_table       = wavelan_ids,
+       .suspend        = wavelan_suspend,
+       .resume         = wavelan_resume,
 };
 
 static int __init
 
        link->state &= ~DEV_CONFIG;
 }
 
+static int wl3501_suspend(struct pcmcia_device *p_dev)
+{
+       dev_link_t *link = dev_to_instance(p_dev);
+       struct net_device *dev = link->priv;
+
+       link->state |= DEV_SUSPEND;
+
+       wl3501_pwr_mgmt(dev->priv, WL3501_SUSPEND);
+       if (link->state & DEV_CONFIG) {
+               if (link->open)
+                       netif_device_detach(dev);
+               pcmcia_release_configuration(link->handle);
+       }
+
+       return 0;
+}
+
+static int wl3501_resume(struct pcmcia_device *p_dev)
+{
+       dev_link_t *link = dev_to_instance(p_dev);
+       struct net_device *dev = link->priv;
+
+       wl3501_pwr_mgmt(dev->priv, WL3501_RESUME);
+       if (link->state & DEV_CONFIG) {
+               pcmcia_request_configuration(link->handle, &link->conf);
+               if (link->open) {
+                       wl3501_reset(dev);
+                       netif_device_attach(dev);
+               }
+       }
+
+       return 0;
+}
+
+
 /**
  * wl3501_event - The card status event handler
  * @event - event
                link->state |= DEV_PRESENT | DEV_CONFIG_PENDING;
                wl3501_config(link);
                break;
-       case CS_EVENT_PM_SUSPEND:
-               link->state |= DEV_SUSPEND;
-               wl3501_pwr_mgmt(dev->priv, WL3501_SUSPEND);
-               /* Fall through... */
-       case CS_EVENT_RESET_PHYSICAL:
-               if (link->state & DEV_CONFIG) {
-                       if (link->open)
-                               netif_device_detach(dev);
-                       pcmcia_release_configuration(link->handle);
-               }
-               break;
-       case CS_EVENT_PM_RESUME:
-               link->state &= ~DEV_SUSPEND;
-               wl3501_pwr_mgmt(dev->priv, WL3501_RESUME);
-               /* Fall through... */
-       case CS_EVENT_CARD_RESET:
-               if (link->state & DEV_CONFIG) {
-                       pcmcia_request_configuration(link->handle, &link->conf);
-                       if (link->open) {
-                               wl3501_reset(dev);
-                               netif_device_attach(dev);
-                       }
-               }
-               break;
        }
        return 0;
 }
        .event          = wl3501_event,
        .detach         = wl3501_detach,
        .id_table       = wl3501_ids,
+       .suspend        = wl3501_suspend,
+       .resume         = wl3501_resume,
 };
 
 static int __init wl3501_init_module(void)
 
 
 } /* parport_cs_release */
 
+static int parport_suspend(struct pcmcia_device *dev)
+{
+       dev_link_t *link = dev_to_instance(dev);
+
+       link->state |= DEV_SUSPEND;
+       if (link->state & DEV_CONFIG)
+               pcmcia_release_configuration(link->handle);
+
+       return 0;
+}
+
+static int parport_resume(struct pcmcia_device *dev)
+{
+       dev_link_t *link = dev_to_instance(dev);
+
+       link->state &= ~DEV_SUSPEND;
+       if (DEV_OK(link))
+               pcmcia_request_configuration(link->handle, &link->conf);
+
+       return 0;
+}
+
 /*======================================================================
 
     The card status event handler.  Mostly, this schedules other
        link->state |= DEV_PRESENT | DEV_CONFIG_PENDING;
        parport_config(link);
        break;
-    case CS_EVENT_PM_SUSPEND:
-       link->state |= DEV_SUSPEND;
-       /* Fall through... */
-    case CS_EVENT_RESET_PHYSICAL:
-       if (link->state & DEV_CONFIG)
-           pcmcia_release_configuration(link->handle);
-       break;
-    case CS_EVENT_PM_RESUME:
-       link->state &= ~DEV_SUSPEND;
-       /* Fall through... */
-    case CS_EVENT_CARD_RESET:
-       if (DEV_OK(link))
-           pcmcia_request_configuration(link->handle, &link->conf);
-       break;
     }
     return 0;
 } /* parport_event */
        .event          = parport_event,
        .detach         = parport_detach,
        .id_table       = parport_ids,
-
+       .suspend        = parport_suspend,
+       .resume         = parport_resume,
 };
 
 static int __init init_parport_cs(void)
 
        if (p_dev->state & (CLIENT_UNBOUND|CLIENT_STALE))
                return 0;
 
+       if ((data->event == CS_EVENT_PM_SUSPEND) ||
+           (data->event == CS_EVENT_RESET_PHYSICAL)) {
+               if (p_drv->suspend)
+                       return p_drv->suspend(p_dev);
+       } else if ((data->event == CS_EVENT_PM_RESUME) ||
+                  (data->event == CS_EVENT_CARD_RESET)) {
+               if (p_drv->resume)
+                       return p_drv->resume(p_dev);
+       }
+
        if (p_drv->event)
                return p_drv->event(data->event, data->priority,
                                    &p_dev->event_callback_args);
 
        link->state &= ~DEV_CONFIG;
 }
 
+static int aha152x_suspend(struct pcmcia_device *dev)
+{
+       dev_link_t *link = dev_to_instance(dev);
+
+       link->state |= DEV_SUSPEND;
+       if (link->state & DEV_CONFIG)
+               pcmcia_release_configuration(link->handle);
+
+       return 0;
+}
+
+static int aha152x_resume(struct pcmcia_device *dev)
+{
+       dev_link_t *link = dev_to_instance(dev);
+       scsi_info_t *info = link->priv;
+
+       link->state &= ~DEV_SUSPEND;
+       if (link->state & DEV_CONFIG) {
+               Scsi_Cmnd tmp;
+               pcmcia_request_configuration(link->handle, &link->conf);
+               tmp.device->host = info->host;
+               aha152x_host_reset(&tmp);
+       }
+
+       return 0;
+}
+
 static int aha152x_event(event_t event, int priority,
                         event_callback_args_t *args)
 {
     dev_link_t *link = args->client_data;
-    scsi_info_t *info = link->priv;
     
     DEBUG(0, "aha152x_event(0x%06x)\n", event);
     
        link->state |= DEV_PRESENT | DEV_CONFIG_PENDING;
        aha152x_config_cs(link);
        break;
-    case CS_EVENT_PM_SUSPEND:
-       link->state |= DEV_SUSPEND;
-       /* Fall through... */
-    case CS_EVENT_RESET_PHYSICAL:
-       if (link->state & DEV_CONFIG)
-           pcmcia_release_configuration(link->handle);
-       break;
-    case CS_EVENT_PM_RESUME:
-       link->state &= ~DEV_SUSPEND;
-       /* Fall through... */
-    case CS_EVENT_CARD_RESET:
-       if (link->state & DEV_CONFIG) {
-           Scsi_Cmnd tmp;
-           pcmcia_request_configuration(link->handle, &link->conf);
-           tmp.device->host = info->host;
-           aha152x_host_reset(&tmp);
-       }
-       break;
     }
     return 0;
 }
        .event          = aha152x_event,
        .detach         = aha152x_detach,
        .id_table       = aha152x_ids,
+       .suspend        = aha152x_suspend,
+       .resume         = aha152x_resume,
 };
 
 static int __init init_aha152x_cs(void)
 
 
 /*====================================================================*/
 
+static int fdomain_suspend(struct pcmcia_device *dev)
+{
+       dev_link_t *link = dev_to_instance(dev);
+
+       link->state |= DEV_SUSPEND;
+       if (link->state & DEV_CONFIG)
+               pcmcia_release_configuration(link->handle);
+
+       return 0;
+}
+
+static int fdomain_resume(struct pcmcia_device *dev)
+{
+       dev_link_t *link = dev_to_instance(dev);
+
+       link->state &= ~DEV_SUSPEND;
+       if (link->state & DEV_CONFIG) {
+               pcmcia_request_configuration(link->handle, &link->conf);
+               fdomain_16x0_bus_reset(NULL);
+       }
+
+       return 0;
+}
+
 static int fdomain_event(event_t event, int priority,
                        event_callback_args_t *args)
 {
        link->state |= DEV_PRESENT | DEV_CONFIG_PENDING;
        fdomain_config(link);
        break;
-    case CS_EVENT_PM_SUSPEND:
-       link->state |= DEV_SUSPEND;
-       /* Fall through... */
-    case CS_EVENT_RESET_PHYSICAL:
-       if (link->state & DEV_CONFIG)
-           pcmcia_release_configuration(link->handle);
-       break;
-    case CS_EVENT_PM_RESUME:
-       link->state &= ~DEV_SUSPEND;
-       /* Fall through... */
-    case CS_EVENT_CARD_RESET:
-       if (link->state & DEV_CONFIG) {
-           pcmcia_request_configuration(link->handle, &link->conf);
-           fdomain_16x0_bus_reset(NULL);
-       }
-       break;
     }
     return 0;
 } /* fdomain_event */
        .event          = fdomain_event,
        .detach         = fdomain_detach,
        .id_table       = fdomain_ids,
+       .suspend        = fdomain_suspend,
+       .resume         = fdomain_resume,
 };
 
 static int __init init_fdomain_cs(void)
 
 #endif
 } /* nsp_cs_release */
 
+static int nsp_cs_suspend(struct pcmcia_device *dev)
+{
+       dev_link_t *link = dev_to_instance(dev);
+       scsi_info_t *info = link->priv;
+       nsp_hw_data *data;
+
+       link->state |= DEV_SUSPEND;
+
+       nsp_dbg(NSP_DEBUG_INIT, "event: suspend");
+
+       if (info->host != NULL) {
+               nsp_msg(KERN_INFO, "clear SDTR status");
+
+               data = (nsp_hw_data *)info->host->hostdata;
+
+               nsphw_init_sync(data);
+       }
+
+       info->stop = 1;
+
+       if (link->state & DEV_CONFIG)
+               pcmcia_release_configuration(link->handle);
+
+       return 0;
+}
+
+static int nsp_cs_resume(struct pcmcia_device *dev)
+{
+       dev_link_t *link = dev_to_instance(dev);
+       scsi_info_t *info = link->priv;
+       nsp_hw_data *data;
+
+       nsp_dbg(NSP_DEBUG_INIT, "event: resume");
+
+       link->state &= ~DEV_SUSPEND;
+
+       if (link->state & DEV_CONFIG)
+               pcmcia_request_configuration(link->handle, &link->conf);
+
+       info->stop = 0;
+
+       if (info->host != NULL) {
+               nsp_msg(KERN_INFO, "reset host and bus");
+
+               data = (nsp_hw_data *)info->host->hostdata;
+
+               nsphw_init   (data);
+               nsp_bus_reset(data);
+       }
+
+       return 0;
+}
+
 /*======================================================================
 
     The card status event handler.  Mostly, this schedules other
                        event_callback_args_t *args)
 {
        dev_link_t  *link = args->client_data;
-       scsi_info_t *info = link->priv;
-       nsp_hw_data *data;
 
        nsp_dbg(NSP_DEBUG_INIT, "in, event=0x%08x", event);
 
 #endif
                nsp_cs_config(link);
                break;
-
-       case CS_EVENT_PM_SUSPEND:
-               nsp_dbg(NSP_DEBUG_INIT, "event: suspend");
-               link->state |= DEV_SUSPEND;
-               /* Fall through... */
-       case CS_EVENT_RESET_PHYSICAL:
-               /* Mark the device as stopped, to block IO until later */
-               nsp_dbg(NSP_DEBUG_INIT, "event: reset physical");
-
-               if (info->host != NULL) {
-                       nsp_msg(KERN_INFO, "clear SDTR status");
-
-                       data = (nsp_hw_data *)info->host->hostdata;
-
-                       nsphw_init_sync(data);
-               }
-
-               info->stop = 1;
-               if (link->state & DEV_CONFIG) {
-                       pcmcia_release_configuration(link->handle);
-               }
-               break;
-
-       case CS_EVENT_PM_RESUME:
-               nsp_dbg(NSP_DEBUG_INIT, "event: resume");
-               link->state &= ~DEV_SUSPEND;
-               /* Fall through... */
-       case CS_EVENT_CARD_RESET:
-               nsp_dbg(NSP_DEBUG_INIT, "event: reset");
-               if (link->state & DEV_CONFIG) {
-                       pcmcia_request_configuration(link->handle, &link->conf);
-               }
-               info->stop = 0;
-
-               if (info->host != NULL) {
-                       nsp_msg(KERN_INFO, "reset host and bus");
-
-                       data = (nsp_hw_data *)info->host->hostdata;
-
-                       nsphw_init   (data);
-                       nsp_bus_reset(data);
-               }
-
-               break;
-
        default:
                nsp_dbg(NSP_DEBUG_INIT, "event: unknown");
                break;
        .event          = nsp_cs_event,
        .detach         = nsp_cs_detach,
        .id_table       = nsp_cs_ids,
+       .suspend        = nsp_cs_suspend,
+       .resume         = nsp_cs_resume,
 };
 #endif
 
 
 
 /*====================================================================*/
 
+static int qlogic_suspend(struct pcmcia_device *dev)
+{
+       dev_link_t *link = dev_to_instance(dev);
+
+       link->state |= DEV_SUSPEND;
+       if (link->state & DEV_CONFIG)
+               pcmcia_release_configuration(link->handle);
+
+       return 0;
+}
+
+static int qlogic_resume(struct pcmcia_device *dev)
+{
+       dev_link_t *link = dev_to_instance(dev);
+
+       link->state &= ~DEV_SUSPEND;
+       if (link->state & DEV_CONFIG) {
+               scsi_info_t *info = link->priv;
+
+               pcmcia_request_configuration(link->handle, &link->conf);
+               if ((info->manf_id == MANFID_MACNICA) ||
+                   (info->manf_id == MANFID_PIONEER) ||
+                   (info->manf_id == 0x0098)) {
+                       outb(0x80, link->io.BasePort1 + 0xd);
+                       outb(0x24, link->io.BasePort1 + 0x9);
+                       outb(0x04, link->io.BasePort1 + 0xd);
+               }
+               /* Ugggglllyyyy!!! */
+               qlogicfas408_bus_reset(NULL);
+       }
+
+       return 0;
+}
+
 static int qlogic_event(event_t event, int priority, event_callback_args_t * args)
 {
        dev_link_t *link = args->client_data;
                link->state |= DEV_PRESENT | DEV_CONFIG_PENDING;
                qlogic_config(link);
                break;
-       case CS_EVENT_PM_SUSPEND:
-               link->state |= DEV_SUSPEND;
-               /* Fall through... */
-       case CS_EVENT_RESET_PHYSICAL:
-               if (link->state & DEV_CONFIG)
-                       pcmcia_release_configuration(link->handle);
-               break;
-       case CS_EVENT_PM_RESUME:
-               link->state &= ~DEV_SUSPEND;
-               /* Fall through... */
-       case CS_EVENT_CARD_RESET:
-               if (link->state & DEV_CONFIG) {
-                       scsi_info_t *info = link->priv;
-                       pcmcia_request_configuration(link->handle, &link->conf);
-                       if ((info->manf_id == MANFID_MACNICA) || (info->manf_id == MANFID_PIONEER) || (info->manf_id == 0x0098)) {
-                               outb(0x80, link->io.BasePort1 + 0xd);
-                               outb(0x24, link->io.BasePort1 + 0x9);
-                               outb(0x04, link->io.BasePort1 + 0xd);
-                       }
-                       /* Ugggglllyyyy!!! */
-                       qlogicfas408_bus_reset(NULL);
-               }
-               break;
        }
        return 0;
 }                              /* qlogic_event */
        .event          = qlogic_event,
        .detach         = qlogic_detach,
        .id_table       = qlogic_ids,
+       .suspend        = qlogic_suspend,
+       .resume         = qlogic_resume,
 };
 
 static int __init init_qlogic_cs(void)
 
        return;
 } /* SYM53C500_config */
 
+static int sym53c500_suspend(struct pcmcia_device *dev)
+{
+       dev_link_t *link = dev_to_instance(dev);
+
+       link->state |= DEV_SUSPEND;
+       if (link->state & DEV_CONFIG)
+               pcmcia_release_configuration(link->handle);
+
+       return 0;
+}
+
+static int sym53c500_resume(struct pcmcia_device *dev)
+{
+       dev_link_t *link = dev_to_instance(dev);
+       struct scsi_info_t *info = link->priv;
+
+       link->state &= ~DEV_SUSPEND;
+       if (link->state & DEV_CONFIG) {
+               pcmcia_request_configuration(link->handle, &link->conf);
+
+               /* See earlier comment about manufacturer IDs. */
+               if ((info->manf_id == MANFID_MACNICA) ||
+                   (info->manf_id == MANFID_PIONEER) ||
+                   (info->manf_id == 0x0098)) {
+                       outb(0x80, link->io.BasePort1 + 0xd);
+                       outb(0x24, link->io.BasePort1 + 0x9);
+                       outb(0x04, link->io.BasePort1 + 0xd);
+               }
+               /*
+                *  If things don't work after a "resume",
+                *  this is a good place to start looking.
+                */
+               SYM53C500_int_host_reset(link->io.BasePort1);
+       }
+
+       return 0;
+}
+
 static int
 SYM53C500_event(event_t event, int priority, event_callback_args_t *args)
 {
        dev_link_t *link = args->client_data;
-       struct scsi_info_t *info = link->priv;
 
        DEBUG(1, "SYM53C500_event(0x%06x)\n", event);
 
                link->state |= DEV_PRESENT | DEV_CONFIG_PENDING;
                SYM53C500_config(link);
                break;
-       case CS_EVENT_PM_SUSPEND:
-               link->state |= DEV_SUSPEND;
-               /* Fall through... */
-       case CS_EVENT_RESET_PHYSICAL:
-               if (link->state & DEV_CONFIG)
-                       pcmcia_release_configuration(link->handle);
-               break;
-       case CS_EVENT_PM_RESUME:
-               link->state &= ~DEV_SUSPEND;
-               /* Fall through... */
-       case CS_EVENT_CARD_RESET:
-               if (link->state & DEV_CONFIG) {
-                       pcmcia_request_configuration(link->handle, &link->conf);
-                       /* See earlier comment about manufacturer IDs. */
-                       if ((info->manf_id == MANFID_MACNICA) ||
-                           (info->manf_id == MANFID_PIONEER) ||
-                           (info->manf_id == 0x0098)) {
-                               outb(0x80, link->io.BasePort1 + 0xd);
-                               outb(0x24, link->io.BasePort1 + 0x9);
-                               outb(0x04, link->io.BasePort1 + 0xd);
-                       }
-                       /*
-                       *  If things don't work after a "resume",
-                       *  this is a good place to start looking.
-                       */
-                       SYM53C500_int_host_reset(link->io.BasePort1);
-               }
-               break;
        }
        return 0;
 } /* SYM53C500_event */
        .event          = SYM53C500_event,
        .detach         = SYM53C500_detach,
        .id_table       = sym53c500_ids,
+       .suspend        = sym53c500_suspend,
+       .resume         = sym53c500_resume,
 };
 
 static int __init
 
        }
 }
 
-static void serial_suspend(dev_link_t *link)
+static int serial_suspend(struct pcmcia_device *dev)
 {
+       dev_link_t *link = dev_to_instance(dev);
        link->state |= DEV_SUSPEND;
 
        if (link->state & DEV_CONFIG) {
                if (!info->slave)
                        pcmcia_release_configuration(link->handle);
        }
+
+       return 0;
 }
 
-static void serial_resume(dev_link_t *link)
+static int serial_resume(struct pcmcia_device *dev)
 {
+       dev_link_t *link = dev_to_instance(dev);
        link->state &= ~DEV_SUSPEND;
 
        if (DEV_OK(link)) {
                for (i = 0; i < info->ndev; i++)
                        serial8250_resume_port(info->line[i]);
        }
+
+       return 0;
 }
 
 /*======================================================================
 serial_event(event_t event, int priority, event_callback_args_t * args)
 {
        dev_link_t *link = args->client_data;
-       struct serial_info *info = link->priv;
 
        DEBUG(1, "serial_event(0x%06x)\n", event);
 
                link->state |= DEV_PRESENT | DEV_CONFIG_PENDING;
                serial_config(link);
                break;
-
-       case CS_EVENT_PM_SUSPEND:
-               serial_suspend(link);
-               break;
-
-       case CS_EVENT_RESET_PHYSICAL:
-               if ((link->state & DEV_CONFIG) && !info->slave)
-                       pcmcia_release_configuration(link->handle);
-               break;
-
-       case CS_EVENT_PM_RESUME:
-               serial_resume(link);
-               break;
-
-       case CS_EVENT_CARD_RESET:
-               if (DEV_OK(link) && !info->slave)
-                       pcmcia_request_configuration(link->handle, &link->conf);
-               break;
        }
        return 0;
 }
        .event          = serial_event,
        .detach         = serial_detach,
        .id_table       = serial_ids,
+       .suspend        = serial_suspend,
+       .resume         = serial_resume,
 };
 
 static int __init init_serial_cs(void)
 
        link->state &= ~DEV_CONFIG;
 }
 
+static int ixj_suspend(struct pcmcia_device *dev)
+{
+       dev_link_t *link = dev_to_instance(dev);
+
+       link->state |= DEV_SUSPEND;
+       if (link->state & DEV_CONFIG)
+               pcmcia_release_configuration(link->handle);
+
+       return 0;
+}
+
+static int ixj_resume(struct pcmcia_device *dev)
+{
+       dev_link_t *link = dev_to_instance(dev);
+
+       link->state &= ~DEV_SUSPEND;
+       if (DEV_OK(link))
+               pcmcia_request_configuration(link->handle, &link->conf);
+
+       return 0;
+}
+
 static int ixj_event(event_t event, int priority, event_callback_args_t * args)
 {
        dev_link_t *link = args->client_data;
                link->state |= DEV_PRESENT | DEV_CONFIG_PENDING;
                ixj_config(link);
                break;
-       case CS_EVENT_PM_SUSPEND:
-               link->state |= DEV_SUSPEND;
-               /* Fall through... */
-       case CS_EVENT_RESET_PHYSICAL:
-               if (link->state & DEV_CONFIG)
-                       pcmcia_release_configuration(link->handle);
-               break;
-       case CS_EVENT_PM_RESUME:
-               link->state &= ~DEV_SUSPEND;
-               /* Fall through... */
-       case CS_EVENT_CARD_RESET:
-               if (DEV_OK(link))
-                       pcmcia_request_configuration(link->handle, &link->conf);
-               break;
        }
        return 0;
 }
        .event          = ixj_event,
        .detach         = ixj_detach,
        .id_table       = ixj_ids,
+       .suspend        = ixj_suspend,
+       .resume         = ixj_resume,
 };
 
 static int __init ixj_pcmcia_init(void)
 
        }
 }
 
+static int sl811_suspend(struct pcmcia_device *dev)
+{
+       dev_link_t *link = dev_to_instance(dev);
+
+       link->state |= DEV_SUSPEND;
+       if (link->state & DEV_CONFIG)
+               pcmcia_release_configuration(link->handle);
+
+       return 0;
+}
+
+static int sl811_resume(struct pcmcia_device *dev)
+{
+       dev_link_t *link = dev_to_instance(dev);
+
+       link->state &= ~DEV_SUSPEND;
+       if (link->state & DEV_CONFIG)
+               pcmcia_request_configuration(link->handle, &link->conf);
+
+       return 0;
+}
+
 static int
 sl811_cs_event(event_t event, int priority, event_callback_args_t *args)
 {
                link->state |= DEV_PRESENT | DEV_CONFIG_PENDING;
                sl811_cs_config(link);
                break;
-
-       case CS_EVENT_PM_SUSPEND:
-               link->state |= DEV_SUSPEND;
-               /* Fall through... */
-       case CS_EVENT_RESET_PHYSICAL:
-               if (link->state & DEV_CONFIG)
-                       pcmcia_release_configuration(link->handle);
-               break;
-
-       case CS_EVENT_PM_RESUME:
-               link->state &= ~DEV_SUSPEND;
-               /* Fall through... */
-       case CS_EVENT_CARD_RESET:
-               if (link->state & DEV_CONFIG)
-                       pcmcia_request_configuration(link->handle, &link->conf);
-               DBG(0, "reset sl811-hcd here?\n");
-               break;
        }
        return 0;
 }
        .event          = sl811_cs_event,
        .detach         = sl811_cs_detach,
        .id_table       = sl811_ids,
+       .suspend        = sl811_suspend,
+       .resume         = sl811_resume,
 };
 
 /*====================================================================*/
 
        int (*event)            (event_t event, int priority,
                                 event_callback_args_t *);
        void                    (*detach)(dev_link_t *);
+
+       int (*suspend)          (struct pcmcia_device *dev);
+       int (*resume)           (struct pcmcia_device *dev);
+
        struct module           *owner;
        struct pcmcia_device_id *id_table;
        struct device_driver    drv;
 #define handle_to_pdev(handle) (handle)
 #define handle_to_dev(handle) (handle->dev)
 
+#define dev_to_instance(dev) (dev->instance)
+
 /* error reporting */
 void cs_error(client_handle_t handle, int func, int ret);