Re: SDIO broken in 2.6.29?

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Fri, Feb 20, 2009 at 7:49 AM, Tony Lindgren <tony@xxxxxxxxxxx> wrote:
> * Steve Sakoman <sakoman@xxxxxxxxx> [090219 22:38]:
>> Overo has a wifi chip on mmc2 that uses the libertas_sdio driver.
>> I've had my head down working in other areas and failed to noticed
>> that at some point in the 2.6.29 rc cycle SDIO stopped working.
>>
>> I'll start bisecting tomorrow morning, but thought I would ask first
>> to see if anyone else has noticed issues in this area.
>
> I wonder if it happened when we switched to the mainline version of
> omap_hsmmc.c?
>
> Anyways at least now most of the code is in the mainline :) So
> hopefully we can get that fix in too during the -rc cycle.

A quick update . . .

I started adding debug printf's and discovered that the issue seems to
be related to the power supply negotiation code:

mmc_select_voltage: card ocr = 0x00000000
mmc_select_voltage: host ocr_avail = 0x000fe080
mmc1: host doesn't support card's voltages
mmc1: error -22 whilst initialising SDIO card

Seemed strange that the card was returning 0 for ocr, so I added a
printf at the point of the read, and suddenly the card was giving a
reasonable ocr value!

diff --git a/drivers/mmc/core/core.c b/drivers/mmc/core/core.c
index df6ce4a..ecde069 100644
--- a/drivers/mmc/core/core.c
+++ b/drivers/mmc/core/core.c

@@ -761,6 +764,7 @@ void mmc_rescan(struct work_struct *work)
                * First we search for SDIO...
                */
               err = mmc_send_io_op_cond(host, 0, &ocr);
+               pr_warning("mmc_rescan: card ocr from io_op=0x%08x,
err = %d\n", ocr, err);
               if (!err) {
                       if (mmc_attach_sdio(host, ocr))
                               mmc_power_off(host);

With that printf I now get:

mmc_rescan: card ocr from io_op=0x90ff8000, err = 0
<snip>
mmc1: new SDIO card at address 0001
<snip>
libertas_sdio: Libertas SDIO driver
libertas_sdio: Copyright Pierre Ossman
libertas_sdio mmc1:0001:1: firmware: requesting sd8686_helper.bin
<snip>
libertas_sdio mmc1:0001:1: firmware: requesting sd8686.bin
<snip>
libertas: 00:19:88:05:b5:23, fw 9.70.3p24, cap 0x00000303
eth0 (libertas_sdio): not using net_device_ops yet
<snip>
libertas: PREP_CMD: command 0x00a3 failed: 2
libertas: PREP_CMD: command 0x00a3 failed: 2
libertas: eth0: Marvell WLAN 802.11 adapter

Nice, a completely normal boot!  Not quite time to celebrate though --
4 reboots demonstrated a failure to load the libertas firmware 50% of
the time.

To collect more data I tried this code on 4 boards.  Two of the 4 act
as described above, the other 2 return 0 for ocr even with the printf.

I rolled back the code to 2.6.28 and again tested all 4 boards.
Result: 100% success with all boards.

These symptoms scream "timing" to me.

As far as I can tell this issue cropped up somewhere around the 2.6.29
rc2->rc3 transition.

Any ideas or words or wisdom?  I am far from an expert on the mmc/sdio code.

Steve
--
To unsubscribe from this list: send the line "unsubscribe linux-omap" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Linux Arm (vger)]     [ARM Kernel]     [ARM MSM]     [Linux Tegra]     [Linux WPAN Networking]     [Linux Wireless Networking]     [Maemo Users]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite Trails]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux