Messages in this thread | | | Date | Tue, 2 Jun 2009 15:15:56 -0700 | From | Andrew Morton <> | Subject | Re: [PATCH] Fix floppy hibernation |
| |
On Tue, 2 Jun 2009 18:30:50 +0200 Ondrej Zary <linux@rainbow-software.org> wrote:
> > > +static int floppy_resume(struct platform_device *dev) > > > +{ > > > + int i; > > > + > > > + for (i = 0; i < N_FDC; i++) > > > + if (FDCS->address != -1) > > > + user_reset_fdc(-1, FD_RESET_ALWAYS, 0); > > > + > > > + return 0; > > > +} > > > > hm, how does this work? > > > > FDCS is a revolting should-not-exist macro which assumes the presence > > of a local variable called `fdc'. > > The driver is complete mess - there is also a global static fdc variable. > So it worked because I have only one floppy controller. > > > So I think the loop control variable here should be called `fdc', not `i'. > > See the v2 patch below. Tested and works too.
OK.
> > > > It's pretty amazing that something like this still exists in a core > > driver. Someone please save us! > > > > > Based on Ingo Molnar's patch from 2006, this makes the floppy work after > resume from hibernation, at least on my machine. >
That's a very skimpy changelog. The lack of any useful reference to the referred-to Ingopatch doesn't aid things..
> --- linux-2.6.29.4-orig/drivers/block/floppy.c 2009-05-30 14:38:29.000000000 +0200 > +++ linux/drivers/block/floppy.c 2009-06-02 17:32:56.000000000 +0200 > @@ -4148,6 +4148,24 @@ > { > } > > +static int floppy_resume(struct platform_device *dev) > +{ > + int fdc; > + > + for (fdc = 0; fdc < N_FDC; fdc++) > + if (FDCS->address != -1) > + user_reset_fdc(-1, FD_RESET_ALWAYS, 0); > + > + return 0; > +}
The patch changes the driver so that it calls user_reset_fdc() for each device at resume-time.
Why? What effect does this have on the hardware and why does it fix things?
Thanks.
| |