--- drivers/pcmcia/cs.c | 29 ++++++++++------------------- drivers/pcmcia/yenta_socket.c | 23 ++++++++++++++++++----- 2 files changed, 28 insertions(+), 24 deletions(-) Index: linux-2.6/drivers/pcmcia/yenta_socket.c =================================================================== --- linux-2.6.orig/drivers/pcmcia/yenta_socket.c +++ linux-2.6/drivers/pcmcia/yenta_socket.c @@ -1225,16 +1225,18 @@ static int __devinit yenta_probe (struct } #ifdef CONFIG_PM +static int yenta_dev_suspend(struct device *dev) +{ + return pcmcia_socket_dev_suspend(dev); +} + static int yenta_dev_suspend_noirq(struct device *dev) { struct pci_dev *pdev = to_pci_dev(dev); struct yenta_socket *socket = pci_get_drvdata(pdev); - int ret; - - ret = pcmcia_socket_dev_suspend(dev); if (!socket) - return ret; + return 0; if (socket->type && socket->type->save_state) socket->type->save_state(socket); @@ -1251,7 +1253,7 @@ static int yenta_dev_suspend_noirq(struc */ /* pci_set_power_state(dev, 3); */ - return ret; + return 0; } static int yenta_dev_resume_noirq(struct device *dev) @@ -1275,16 +1277,27 @@ static int yenta_dev_resume_noirq(struct if (socket->type && socket->type->restore_state) socket->type->restore_state(socket); + return 0; +} + +static int yenta_dev_resume(struct device *dev) +{ return pcmcia_socket_dev_resume(dev); } static struct dev_pm_ops yenta_pm_ops = { .suspend_noirq = yenta_dev_suspend_noirq, + .suspend = yenta_dev_suspend, .resume_noirq = yenta_dev_resume_noirq, + .resume = yenta_dev_resume, .freeze_noirq = yenta_dev_suspend_noirq, + .freeze = yenta_dev_suspend, .thaw_noirq = yenta_dev_resume_noirq, + .thaw = yenta_dev_resume, .poweroff_noirq = yenta_dev_suspend_noirq, + .poweroff = yenta_dev_suspend, .restore_noirq = yenta_dev_resume_noirq, + .restore = yenta_dev_resume, }; #define YENTA_PM_OPS (¥ta_pm_ops) Index: linux-2.6/drivers/pcmcia/cs.c =================================================================== --- linux-2.6.orig/drivers/pcmcia/cs.c +++ linux-2.6/drivers/pcmcia/cs.c @@ -568,27 +568,18 @@ static int socket_resume(struct pcmcia_s } ret = socket_setup(skt, resume_delay); - if (ret == 0) { + if (ret) { + socket_shutdown(skt); + } else { + /* Always reinsert the card on resume. */ + socket_remove_drivers(skt); + destroy_cis_cache(skt); /* - * FIXME: need a better check here for cardbus cards. + * Workaround: give DS time to schedule removal. + * Remove me once the 100ms delay is eliminated in ds.c */ - if (verify_cis_cache(skt) != 0) { - cs_dbg(skt, 4, "cis mismatch - different card\n"); - socket_remove_drivers(skt); - destroy_cis_cache(skt); - /* - * Workaround: give DS time to schedule removal. - * Remove me once the 100ms delay is eliminated - * in ds.c - */ - msleep(200); - send_event(skt, CS_EVENT_CARD_INSERTION, CS_EVENT_PRI_LOW); - } else { - cs_dbg(skt, 4, "cis matches cache\n"); - send_event(skt, CS_EVENT_PM_RESUME, CS_EVENT_PRI_LOW); - } - } else { - socket_shutdown(skt); + msleep(200); + send_event(skt, CS_EVENT_CARD_INSERTION, CS_EVENT_PRI_LOW); } skt->state &= ~SOCKET_SUSPEND;