On Thursday, 28 of July 2005 23:36, Pavel Machek wrote: > Hi! > > > >>If I don't eject the pcmcia card (usually a prism54 wireless card), > > >>swsusp begins the process of hibernation, but never gets to the > > >>writing pages part. > > > > > Well, it really may be the firmware loading. Add some printks to > > > confirm it, then fix it. > > > > I did more tests, this time with 2.6.13-rc3-mm2 (machine is a TP 600X), > > and I don't think the problem is related to firmware loading. If I > > first physically eject the card (an Intersil wireless card), swsusp > > prints > > > .. > > > > then it writes pages to swap and all is well. Well, almost 100%; the > > one glitch is that sometimes X comes back blank and I have to > > ctrl-alt-F7 to bring back the display; or X comes back with the keyboard > > acting strange (<ENTER> shifts the display left by a few hundred > > pixels), and again ctrl-alt-F7 fixes it. This is with XFree86 > > 4.3.0.dfsg.1-14, and maybe after I upgrade (?) to the xorg server, that > > glitch will go away. Anyway, it's easy to work around. > > So, in short, problem is that if you leave prism54 card in, even with > module removed, swsusp hangs, right? > > Okay then, start looking into pcmcia layer ;-).
Perhaps the patch from Daniel Ritz to free the yenta IRQ on suspend (attached) will help? Rafael -- - Would you tell me, please, which way I ought to go from here? - That depends a good deal on where you want to get to. -- Lewis Carroll "Alice's Adventures in Wonderland"
--- linux-2.6.13-rc3-git5/drivers/pcmcia/yenta_socket.c 2005-07-23 19:26:30.000000000 +0200 +++ patched/drivers/pcmcia/yenta_socket.c 2005-07-24 11:44:04.000000000 +0200 @@ -1107,6 +1107,8 @@ static int yenta_dev_suspend (struct pci pci_read_config_dword(dev, 17*4, &socket->saved_state[1]); pci_disable_device(dev); + free_irq(dev->irq, socket); + /* * Some laptops (IBM T22) do not like us putting the Cardbus * bridge into D3. At a guess, some other laptop will @@ -1132,6 +1134,13 @@ static int yenta_dev_resume (struct pci_ pci_enable_device(dev); pci_set_master(dev); + if (socket->cb_irq) + if (request_irq(socket->cb_irq, yenta_interrupt, + SA_SHIRQ, "yenta", socket)) { + printk(KERN_WARNING "Yenta: request_irq() failed on resume!\n"); + socket->cb_irq = 0; + } + if (socket->type && socket->type->restore_state) socket->type->restore_state(socket); }