Re: [PATCH] mmc/sdio: don't allow interface to runtime-suspenduntil probe is finished.

From: NeilBrown
Date: Mon Dec 05 2011 - 14:07:38 EST


On Mon, 5 Dec 2011 12:25:42 +0200 Ohad Ben-Cohen <ohad@xxxxxxxxxx> wrote:

> Hi Neil,
>
> On Mon, Dec 5, 2011 at 3:54 AM, NeilBrown <neilb@xxxxxxx> wrote:
> >  I've been chasing down a problem with the SDIO-attached wifi card in the
> >  GTA04 (www.gta04.org).
>
> 8686, right ?

yep, that's the one!

>
> >  The problem seems very similar to that described in
> >
> >    http://www.mail-archive.com/linux-mmc@xxxxxxxxxxxxxxx/msg04289.html
>
> Don't go that far back, Joe just reported this exact problem in :
>
> http://comments.gmane.org/gmane.linux.kernel.mmc/11231

Indeed.

>
> > commit 08da834a24312157f512224691ad1fddd11c1073
> > Author: Daniel Drake <dsd@xxxxxxxxxx>
> > Date:   Wed Jul 20 17:39:22 2011 +0100
> >
> >    mmc: enable runtime PM by default
> >
> >
> > and if I revert that commit so that runtime PM is not enabled the problem
> > goes away.
>
> And this is most likely what we're going to do, unless someone with
> the 8686 can further look into the problem.

Challenge accepted.

Even if I don't find a better solution, this seems backwards. Sure the
default should be that PM is enabled, but individual board can request no
PM on MMC interfaces where it is a problem.

>
> > (The wifi chip is a libertas_sdio supported chip connected to an mmc
> > interface on an omap3, and has a separate regulator for power supply, plus a
> > GPIO pin for reset, just like in the email thread.  The problem is
> > exemplified by:
> > [   64.643981] libertas_sdio: probe of mmc1:0001:1 failed with error -16
> > ).
>
> Yes, the same issue that Joe is seeing.
>
> > I finally managed to track down exactly what was happening - runtime PM was
> > putting the interface to sleep before the SDIO functions were probed so
> > initialising them failed.
>
> Yeah, but the question is why it fails.

The chip has a requirement that the reset line is held down during power-on,
and raised shortly after (I don't know exactly how short). So if you just
remove power and give it back, the chip doesn't come up properly.

>
> It's perfectly fine to power the card down before the functions are
> probed, because just before they are probed the bus is responsible to
> power the card up again.

"It *should be* perfectly fine ..." :-)

We just have to make sure the bug powers up the card properly.
Maybe I need to create a virtual regulator that powers on the real regulator,
then raises the reset line. I wonder how hard that is.


>
> > From: NeilBrown <neilb@xxxxxxx>
> > Date: Mon, 5 Dec 2011 11:34:47 +1100
> > Subject: [PATCH] mmc/sdio: don't allow interface to runtime-suspend until probe is finished.
>
> You can't tell when probe is finished. In fact, in can happen very far
> in the future or even never at all (e.g. when the function driver
> isn't loaded).

Ahhh... I naively assumed that

/*
* ...then the SDIO functions.
*/
for (i = 0;i < funcs;i++) {
err = sdio_add_func(host->card->sdio_func[i]);
if (err)
goto remove_added;
}

would add all the functions. but as you say: the drivers might not be loaded
yet.


>
> > mmc_attach_sdio currently enables runtime power management on
> > the mmc interface before it completes the probe of functions.
> > This means that it might be asleep during the probe and the probe
> > will fail.
>
> No - the sdio bus powers the card up before probing the drivers. See
> sdio_bus_probe.
>
> > In particular, if 'drivers_autoprobe' is enabled on the mmc bus, then
> > device_attach() will be called by bus_probe_device() from device_add()
> > and it will pm_runtime_get_noresume()/pm_runtime_put_sync().
> >
> > As runtime power management this the device is running
> > (pm_runtime_set_active() in mmc_attach_sdio()) and rtpm is enabled
> > (pm_runtime_enable()), the pm_runtime_put_sync() call puts the mmc
> > interface to sleep,
>
> This is fine
>
> > so function probing fails.
>
> The question is why. Again - sdio_bus_probe should power up the card.
> For some reason, it (or something else) fails to do so with the 8686
> on some setups. Other chips might have similar issues, too - we just
> don't know (all we know is that it works great with the wl12xx, and
> with the Daniel's 8686 setup).
>
> > So this patch moves the call to pm_runtime_enable to after all the
> > calls to sdio_add_func.
>
> Looks like this will have the undesired side-effect of keeping the
> chip powered up, even if it doesn't have any driver loaded for it.
>
> And this doesn't really address the problem: we still don't know why
> the 8686 fails to power up at this point.
>
> Can you please tell us where exactly is the first failure coming from
> ? is this from libertas own probe function ? is this sdio_bus_probe
> getting an error from calling pm_runtime_get_sync ?
>
> Thanks,
> Ohad

I'll spend some more time on this and get back to you - probably next week.

Thanks for the hints and perspective.

NeilBrown

Attachment: signature.asc
Description: PGP signature