Re: regression: b43-sdio: probe of mmc0:0001:1 failed with error-16

From: Arnd Hannemann
Date: Sun Oct 31 2010 - 17:52:21 EST


Hi Ohad,

Am 31.10.2010 20:14, schrieb Ohad Ben-Cohen:

> On Sun, Oct 31, 2010 at 7:16 PM, Arnd Hannemann <arnd@xxxxxxxxxx> wrote:
>> b43-sdio: probe of mmc0:0001:1 failed with error -16
>
> It's exactly what Daniel is experiencing with the XO-1.5.
>
> In Daniel's scenario, mmc_sdio_init_card() fails because
> mmc_send_relative_addr() returns -110.
>
> Can you please check out if that's the same thing you have too ?

No, it seems to be the pm_runtime_get_sync in sdio_bus.c::sdio_bus_probe().

If I test with CONFIG_PM_RUNTIME=y and the attached modifications,
then I get this as output:

root@ap4evb:~# modprobe b43
[ 29.859375] cfg80211: Calling CRDA to update world regulatory domain
[ 30.226562] pm_runtime_get_sync: -16
[ 30.234375] b43-sdio: probe of mmc0:0001:1 failed with error -16
[ 30.242187] Broadcom 43xx driver loaded [ Features: LS, Firmware-ID: FW13 ]

If CONFIG_PM_RUNTIME is not set in .config, the problem goes away.

Regards,
Arnd

diff --git a/drivers/mmc/core/sd_ops.c b/drivers/mmc/core/sd_ops.c
index 797cdb5..57b6dd4 100644
--- a/drivers/mmc/core/sd_ops.c
+++ b/drivers/mmc/core/sd_ops.c
@@ -237,8 +237,10 @@ int mmc_send_relative_addr(struct mmc_host *host, unsigned int *rca)
cmd.flags = MMC_RSP_R6 | MMC_CMD_BCR;

err = mmc_wait_for_cmd(host, &cmd, MMC_CMD_RETRIES);
- if (err)
+ if (err) {
+ printk(KERN_INFO "%s(): %d\n", __func__, err);
return err;
+ }

*rca = cmd.resp[0] >> 16;

diff --git a/drivers/mmc/core/sdio_bus.c b/drivers/mmc/core/sdio_bus.c
index 2716c7a..102c163 100644
--- a/drivers/mmc/core/sdio_bus.c
+++ b/drivers/mmc/core/sdio_bus.c
@@ -133,8 +133,10 @@ static int sdio_bus_probe(struct device *dev)
* pm_runtime_get_noresume() in its remove routine.
*/
ret = pm_runtime_get_sync(dev);
- if (ret < 0)
+ if (ret < 0) {
+ printk(KERN_INFO "pm_runtime_get_sync: %d\n", ret);
goto out;
+ }

/* Set the default block size so the driver is sure it's something
* sensible. */