<feed xmlns='http://www.w3.org/2005/Atom'>
<title>kernel.git/drivers/mmc/core/core.c, branch linux-3.1.y</title>
<subtitle>Hosts the 0x221E linux distro kernel.
</subtitle>
<id>https://git.0xinfinity.dev/distro/kernel.git/atom?h=linux-3.1.y</id>
<link rel='self' href='https://git.0xinfinity.dev/distro/kernel.git/atom?h=linux-3.1.y'/>
<link rel='alternate' type='text/html' href='https://git.0xinfinity.dev/distro/kernel.git/'/>
<updated>2011-11-11T17:42:27Z</updated>
<entry>
<title>mmc: core: Fix hangs related to insert/remove of cards</title>
<updated>2011-11-11T17:42:27Z</updated>
<author>
<name>Ulf Hansson</name>
</author>
<published>2011-09-21T18:08:13Z</published>
<link rel='alternate' type='text/html' href='https://git.0xinfinity.dev/distro/kernel.git/commit/?id=ce509f04d262d15f5f42d33d3d99ac2d27b8c674'/>
<id>urn:sha1:ce509f04d262d15f5f42d33d3d99ac2d27b8c674</id>
<content type='text'>
commit 7f7e4129c23f0419257184dff6fec89d2d5a8964 upstream.

During a rescan operation mmc_attach(sd|mmc|sdio) functions are
called. The error handling in these function can trigger a detach
of the bus, which also meant a power off. This is not notified by
the rescan operation which then continues to the next attach function.

If a power off has been done, the framework must never send any
new commands to the host driver, without first doing a new power up.
This will most likely trigger any host driver to hang.

Moving power off out of detach and instead handle power off
separately when it is actually needed, solves the issue.

Signed-off-by: Ulf Hansson &lt;ulf.hansson@stericsson.com&gt;
Acked-by: Linus Walleij &lt;linus.walleij@linaro.org&gt;
Signed-off-by: Chris Ball &lt;cjb@laptop.org&gt;
Signed-off-by: Greg Kroah-Hartman &lt;gregkh@suse.de&gt;

</content>
</entry>
<entry>
<title>mmc: core: prevent aggressive clock gating racing with ios updates</title>
<updated>2011-08-31T20:25:49Z</updated>
<author>
<name>Mika Westerberg</name>
</author>
<published>2011-08-18T12:23:48Z</published>
<link rel='alternate' type='text/html' href='https://git.0xinfinity.dev/distro/kernel.git/commit/?id=778e277cb82411c9002ca28ccbd216c4d9eb9158'/>
<id>urn:sha1:778e277cb82411c9002ca28ccbd216c4d9eb9158</id>
<content type='text'>
We have seen at least two different races when clock gating kicks in in a
middle of ios structure update.

First one happens when ios-&gt;clock is changed outside of aggressive clock
gating framework, for example via mmc_set_clock(). The race might happen
when we run following code:

mmc_set_ios():
	...
	if (ios-&gt;clock &gt; 0)
		mmc_set_ungated(host);

Now if gating kicks in right after the condition check we end up setting
host-&gt;clk_gated to false even though we have just gated the clock. Next
time a request is started we try to ungate and restore the clock in
mmc_host_clk_hold(). However since we have host-&gt;clk_gated set to false the
original clock is not restored.

This eventually will cause the host controller to hang since its clock is
disabled while we are trying to issue a request. For example on Intel
Medfield platform we see:

[   13.818610] mmc2: Timeout waiting for hardware interrupt.
[   13.818698] sdhci: =========== REGISTER DUMP (mmc2)===========
[   13.818753] sdhci: Sys addr: 0x00000000 | Version:  0x00008901
[   13.818804] sdhci: Blk size: 0x00000000 | Blk cnt:  0x00000000
[   13.818853] sdhci: Argument: 0x00000000 | Trn mode: 0x00000000
[   13.818903] sdhci: Present:  0x1fff0000 | Host ctl: 0x00000001
[   13.818951] sdhci: Power:    0x0000000d | Blk gap:  0x00000000
[   13.819000] sdhci: Wake-up:  0x00000000 | Clock:    0x00000000
[   13.819049] sdhci: Timeout:  0x00000000 | Int stat: 0x00000000
[   13.819098] sdhci: Int enab: 0x00ff00c3 | Sig enab: 0x00ff00c3
[   13.819147] sdhci: AC12 err: 0x00000000 | Slot int: 0x00000000
[   13.819196] sdhci: Caps:     0x6bee32b2 | Caps_1:   0x00000000
[   13.819245] sdhci: Cmd:      0x00000000 | Max curr: 0x00000000
[   13.819292] sdhci: Host ctl2: 0x00000000
[   13.819331] sdhci: ADMA Err: 0x00000000 | ADMA Ptr: 0x00000000
[   13.819377] sdhci: ===========================================
[   13.919605] mmc2: Reset 0x2 never completed.

and it never recovers.

Second race might happen while running mmc_power_off():

static void mmc_power_off(struct mmc_host *host)
{
	host-&gt;ios.clock = 0;
	host-&gt;ios.vdd = 0;

[ clock gating kicks in here ]

	/*
	 * Reset ocr mask to be the highest possible voltage supported for
	 * this mmc host. This value will be used at next power up.
	 */
	host-&gt;ocr = 1 &lt;&lt; (fls(host-&gt;ocr_avail) - 1);

	if (!mmc_host_is_spi(host)) {
		host-&gt;ios.bus_mode = MMC_BUSMODE_OPENDRAIN;
		host-&gt;ios.chip_select = MMC_CS_DONTCARE;
	}
	host-&gt;ios.power_mode = MMC_POWER_OFF;
	host-&gt;ios.bus_width = MMC_BUS_WIDTH_1;
	host-&gt;ios.timing = MMC_TIMING_LEGACY;
	mmc_set_ios(host);
}

If the clock gating worker kicks in while we are only partially updated the
ios structure the host controller gets incomplete ios and might not work as
supposed. Again on Intel Medfield platform we get:

[    4.185349] kernel BUG at drivers/mmc/host/sdhci.c:1155!
[    4.185422] invalid opcode: 0000 [#1] PREEMPT SMP
[    4.185509] Modules linked in:
[    4.185565]
[    4.185608] Pid: 4, comm: kworker/0:0 Not tainted 3.0.0+ #240 Intel Corporation Medfield/iCDKA
[    4.185742] EIP: 0060:[&lt;c136364e&gt;] EFLAGS: 00010083 CPU: 0
[    4.185827] EIP is at sdhci_set_power+0x3e/0xd0
[    4.185891] EAX: f5ff98e0 EBX: f5ff98e0 ECX: 00000000 EDX: 00000001
[    4.185970] ESI: f5ff977c EDI: f5ff9904 EBP: f644fe98 ESP: f644fe94
[    4.186049]  DS: 007b ES: 007b FS: 00d8 GS: 0000 SS: 0068
[    4.186125] Process kworker/0:0 (pid: 4, ti=f644e000 task=f644c0e0 task.ti=f644e000)
[    4.186219] Stack:
[    4.186257]  f5ff98e0 f644feb0 c1365173 00000282 f5ff9460 f5ff96e0 f5ff96e0 f644feec
[    4.186418]  c1355bd8 f644c0e0 c1499c3d f5ff96e0 f644fed4 00000006 f5ff96e0 00000286
[    4.186579]  f644fedc c107922b f644feec 00000286 f5ff9460 f5ff9700 f644ff10 c135839e
[    4.186739] Call Trace:
[    4.186802]  [&lt;c1365173&gt;] sdhci_set_ios+0x1c3/0x340
[    4.186883]  [&lt;c1355bd8&gt;] mmc_gate_clock+0x68/0x120
[    4.186963]  [&lt;c1499c3d&gt;] ? _raw_spin_unlock_irqrestore+0x4d/0x60
[    4.187052]  [&lt;c107922b&gt;] ? trace_hardirqs_on+0xb/0x10
[    4.187134]  [&lt;c135839e&gt;] mmc_host_clk_gate_delayed+0xbe/0x130
[    4.187219]  [&lt;c105ec09&gt;] ? process_one_work+0xf9/0x5b0
[    4.187300]  [&lt;c135841d&gt;] mmc_host_clk_gate_work+0xd/0x10
[    4.187379]  [&lt;c105ec82&gt;] process_one_work+0x172/0x5b0
[    4.187457]  [&lt;c105ec09&gt;] ? process_one_work+0xf9/0x5b0
[    4.187538]  [&lt;c1358410&gt;] ? mmc_host_clk_gate_delayed+0x130/0x130
[    4.187625]  [&lt;c105f3c8&gt;] worker_thread+0x118/0x330
[    4.187700]  [&lt;c1496cee&gt;] ? preempt_schedule+0x2e/0x50
[    4.187779]  [&lt;c105f2b0&gt;] ? rescuer_thread+0x1f0/0x1f0
[    4.187857]  [&lt;c1062cf4&gt;] kthread+0x74/0x80
[    4.187931]  [&lt;c1062c80&gt;] ? __init_kthread_worker+0x60/0x60
[    4.188015]  [&lt;c149acfa&gt;] kernel_thread_helper+0x6/0xd
[    4.188079] Code: 81 fa 00 00 04 00 0f 84 a7 00 00 00 7f 21 81 fa 80 00 00 00 0f 84 92 00 00 00 81 fa 00 00 0
[    4.188780] EIP: [&lt;c136364e&gt;] sdhci_set_power+0x3e/0xd0 SS:ESP 0068:f644fe94
[    4.188898] ---[ end trace a7b23eecc71777e4 ]---

This BUG() comes from the fact that ios.power_mode was still in previous
value (MMC_POWER_ON) and ios.vdd was set to zero.

We prevent these by inhibiting the clock gating while we update the ios
structure.

Both problems can be reproduced by simply running the device in a reboot
loop.

Signed-off-by: Mika Westerberg &lt;mika.westerberg@linux.intel.com&gt;
Reviewed-by: Linus Walleij &lt;linus.walleij@linaro.org&gt;
Tested-by: Chris Ball &lt;cjb@laptop.org&gt;
Cc: &lt;stable@kernel.org&gt;
Signed-off-by: Chris Ball &lt;cjb@laptop.org&gt;
</content>
</entry>
<entry>
<title>mmc: rename mmc_host_clk_{ungate|gate} to mmc_host_clk_{hold|release}</title>
<updated>2011-08-31T20:24:54Z</updated>
<author>
<name>Mika Westerberg</name>
</author>
<published>2011-08-18T12:23:47Z</published>
<link rel='alternate' type='text/html' href='https://git.0xinfinity.dev/distro/kernel.git/commit/?id=08c14071fda4e69abb9d5b1566651cd092b158d3'/>
<id>urn:sha1:08c14071fda4e69abb9d5b1566651cd092b158d3</id>
<content type='text'>
As per suggestion by Linus Walleij:

  &gt; If you think the names of the functions are confusing then
  &gt; you may rename them, say like this:
  &gt;
  &gt; mmc_host_clk_ungate() -&gt; mmc_host_clk_hold()
  &gt; mmc_host_clk_gate() -&gt; mmc_host_clk_release()
  &gt;
  &gt; Which would make the usecases more clear

(This is CC'd to stable@ because the next two patches, which fix
observable races, depend on it.)

Signed-off-by: Mika Westerberg &lt;mika.westerberg@linux.intel.com&gt;
Reviewed-by: Linus Walleij &lt;linus.walleij@linaro.org&gt;
Cc: &lt;stable@kernel.org&gt;
Signed-off-by: Chris Ball &lt;cjb@laptop.org&gt;
</content>
</entry>
<entry>
<title>mmc: core: use defined R1_STATE_PRG macro for card status</title>
<updated>2011-08-13T18:50:31Z</updated>
<author>
<name>Jaehoon Chung</name>
</author>
<published>2011-08-10T09:46:28Z</published>
<link rel='alternate' type='text/html' href='https://git.0xinfinity.dev/distro/kernel.git/commit/?id=7435bb7950ba8a3cbfa6d0c01e92588562533a3f'/>
<id>urn:sha1:7435bb7950ba8a3cbfa6d0c01e92588562533a3f</id>
<content type='text'>
Signed-off-by: Jaehoon Chung &lt;jh80.chung@samsung.com&gt;
Signed-off-by: Kyungmin Park &lt;kyungmin.park@samsung.com&gt;
Signed-off-by: Chris Ball &lt;cjb@laptop.org&gt;
</content>
</entry>
<entry>
<title>notifiers: pm: move pm notifiers into suspend.h</title>
<updated>2011-07-26T03:57:15Z</updated>
<author>
<name>Amerigo Wang</name>
</author>
<published>2011-07-26T00:13:11Z</published>
<link rel='alternate' type='text/html' href='https://git.0xinfinity.dev/distro/kernel.git/commit/?id=35eb6db11ed9cbf9702ec90a28779a51fe4a21a9'/>
<id>urn:sha1:35eb6db11ed9cbf9702ec90a28779a51fe4a21a9</id>
<content type='text'>
It is not necessary to share the same notifier.h.

Signed-off-by: WANG Cong &lt;amwang@redhat.com&gt;
Cc: David Miller &lt;davem@davemloft.net&gt;
Acked-by: "Rafael J. Wysocki" &lt;rjw@sisk.pl&gt;
Cc: Greg KH &lt;greg@kroah.com&gt;
Signed-off-by: Andrew Morton &lt;akpm@linux-foundation.org&gt;
Signed-off-by: Linus Torvalds &lt;torvalds@linux-foundation.org&gt;
</content>
</entry>
<entry>
<title>mmc: print debug messages for runtime PM actions</title>
<updated>2011-07-21T14:35:09Z</updated>
<author>
<name>Daniel Drake</name>
</author>
<published>2011-07-17T15:38:41Z</published>
<link rel='alternate' type='text/html' href='https://git.0xinfinity.dev/distro/kernel.git/commit/?id=bb9cab941c7139304899fa7922f3069bb2097f4e'/>
<id>urn:sha1:bb9cab941c7139304899fa7922f3069bb2097f4e</id>
<content type='text'>
At http://www.mail-archive.com/linux-mmc@vger.kernel.org/msg08371.html
(thread: "mmc: sdio: reset card during power_restore") we found and
fixed a bug where mmc's runtime power management functions were not being
called. We have now also made improvements to the SDIO powerup routine
which could possibly mask this kind of issue in future.

Add debug messages to the runtime PM hooks so that it is easy to verify
if and when runtime PM is happening.

Signed-off-by: Daniel Drake &lt;dsd@laptop.org&gt;
Signed-off-by: Chris Ball &lt;cjb@laptop.org&gt;
</content>
</entry>
<entry>
<title>mmc: core: add non-blocking mmc request function</title>
<updated>2011-07-20T21:21:10Z</updated>
<author>
<name>Per Forlin</name>
</author>
<published>2011-07-01T16:55:22Z</published>
<link rel='alternate' type='text/html' href='https://git.0xinfinity.dev/distro/kernel.git/commit/?id=aa8b683a7d392271ed349c6ab9f36b8c313794b7'/>
<id>urn:sha1:aa8b683a7d392271ed349c6ab9f36b8c313794b7</id>
<content type='text'>
Previously there has only been one function mmc_wait_for_req()
to start and wait for a request. This patch adds:

 * mmc_start_req() - starts a request wihtout waiting
   If there is on ongoing request wait for completion
   of that request and start the new one and return.
   Does not wait for the new command to complete.

This patch also adds new function members in struct mmc_host_ops
only called from core.c:

 * pre_req - asks the host driver to prepare for the next job
 * post_req - asks the host driver to clean up after a completed job

The intention is to use pre_req() and post_req() to do cache maintenance
while a request is active. pre_req() can be called while a request is
active to minimize latency to start next job. post_req() can be used after
the next job is started to clean up the request. This will minimize the
host driver request end latency. post_req() is typically used before
ending the block request and handing over the buffer to the block layer.

Add a host-private member in mmc_data to be used by pre_req to mark the
data. The host driver will then check this mark to see if the data is
prepared or not.

Signed-off-by: Per Forlin &lt;per.forlin@linaro.org&gt;
Acked-by: Kyungmin Park &lt;kyungmin.park@samsung.com&gt;
Acked-by: Arnd Bergmann &lt;arnd@arndb.de&gt;
Reviewed-by: Venkatraman S &lt;svenkatr@ti.com&gt;
Tested-by: Sourav Poddar &lt;sourav.poddar@ti.com&gt;
Tested-by: Linus Walleij &lt;linus.walleij@linaro.org&gt;
Signed-off-by: Chris Ball &lt;cjb@laptop.org&gt;
</content>
</entry>
<entry>
<title>mmc: queue: let host controllers specify maximum discard timeout</title>
<updated>2011-07-20T21:21:03Z</updated>
<author>
<name>Adrian Hunter</name>
</author>
<published>2011-06-28T14:16:02Z</published>
<link rel='alternate' type='text/html' href='https://git.0xinfinity.dev/distro/kernel.git/commit/?id=e056a1b5b67b4e4bfad00bf143ab14f634777705'/>
<id>urn:sha1:e056a1b5b67b4e4bfad00bf143ab14f634777705</id>
<content type='text'>
Some host controllers will not operate without a hardware
timeout that is limited in value.  However large discards
require large timeouts, so there needs to be a way to
specify the maximum discard size.

A host controller driver may now specify the maximum discard
timeout possible so that max_discard_sectors can be calculated.

However, for eMMC when the High Capacity Erase Group Size
is not in use, the timeout calculation depends on clock
rate which may change.  For that case Preferred Erase Size
is used instead.

Signed-off-by: Adrian Hunter &lt;adrian.hunter@intel.com&gt;
Signed-off-by: Chris Ball &lt;cjb@laptop.org&gt;
</content>
</entry>
<entry>
<title>mmc: core: make erase timeout calculation allow for gated clock</title>
<updated>2011-06-25T22:52:53Z</updated>
<author>
<name>Adrian Hunter</name>
</author>
<published>2011-06-23T10:40:27Z</published>
<link rel='alternate' type='text/html' href='https://git.0xinfinity.dev/distro/kernel.git/commit/?id=4cf8c6dd2e261da94b87c4deadcc136ab022b6ac'/>
<id>urn:sha1:4cf8c6dd2e261da94b87c4deadcc136ab022b6ac</id>
<content type='text'>
The erase timeout calculation may depend on clock rate
which is zero if the clock is gated, so use
mmc_host_clk_rate() which allows for that case.

Signed-off-by: Adrian Hunter &lt;adrian.hunter@intel.com&gt;
Signed-off-by: Chris Ball &lt;cjb@laptop.org&gt;
</content>
</entry>
<entry>
<title>mmc: core: duplicated trial with same freq in mmc_rescan_try_freq()</title>
<updated>2011-05-25T03:53:59Z</updated>
<author>
<name>Jaehoon Chung</name>
</author>
<published>2011-05-12T08:18:59Z</published>
<link rel='alternate' type='text/html' href='https://git.0xinfinity.dev/distro/kernel.git/commit/?id=06b2233a20bf25c8ee57b7c6e13f528309ac6edc'/>
<id>urn:sha1:06b2233a20bf25c8ee57b7c6e13f528309ac6edc</id>
<content type='text'>
mmc_rescan_try_freq() tries to init two times with the last frequency.
For example, if host-&gt;f_min is 400KHz, we see the message below:

mmc1: mmc_rescan_try_freq: trying to init card at 400000 Hz
mmc1: mmc_rescan_try_freq: trying to init card at 400000 Hz

Andy Ross says that he didn't try this code on a board with an f_min
that exactly matches one of the table entries, which explains why the
bug wasn't detected.

Signed-off-by: Jaehoon Chung &lt;jh80.chung@samsung.com&gt;
Signed-off-by: Kyungmin Park &lt;kyungmin.park@samsung.com&gt;
Cc: Andy Ross &lt;andy.ross@windriver.com&gt;
Signed-off-by: Chris Ball &lt;cjb@laptop.org&gt;
</content>
</entry>
</feed>
