[PATCH 1/2] MMC: Use timeout values from CSR

From: Matthew Fleming
Date: Thu Oct 02 2008 - 07:21:42 EST


Hard-coded timeout values of 250ms for writes and 100ms for reads are
currently used for MMC transactions over SPI. The spec states that the
timeout values from the card should be used.

Signed-off-by: Matthew Fleming <matthew.fleming@xxxxxxxxxx>
---
drivers/mmc/host/mmc_spi.c | 32 +++++++++++++++++++++-----------
1 files changed, 21 insertions(+), 11 deletions(-)

diff --git a/drivers/mmc/host/mmc_spi.c b/drivers/mmc/host/mmc_spi.c
index 7503b81..07faf54 100644
--- a/drivers/mmc/host/mmc_spi.c
+++ b/drivers/mmc/host/mmc_spi.c
@@ -95,8 +95,6 @@
* reads which takes nowhere near that long. Older cards may be able to use
* shorter timeouts ... but why bother?
*/
-#define readblock_timeout ktime_set(0, 100 * 1000 * 1000)
-#define writeblock_timeout ktime_set(0, 250 * 1000 * 1000)
#define r1b_timeout ktime_set(3, 0)


@@ -220,9 +218,9 @@ mmc_spi_wait_unbusy(struct mmc_spi_host *host,
ktime_t timeout)
return mmc_spi_skip(host, timeout, sizeof(host->data->status), 0);
}

-static int mmc_spi_readtoken(struct mmc_spi_host *host)
+static int mmc_spi_readtoken(struct mmc_spi_host *host, ktime_t timeout)
{
- return mmc_spi_skip(host, readblock_timeout, 1, 0xff);
+ return mmc_spi_skip(host, timeout, 1, 0xff);
}


@@ -605,7 +603,8 @@ mmc_spi_setup_data_message(
* Return negative errno, else success.
*/
static int
-mmc_spi_writeblock(struct mmc_spi_host *host, struct spi_transfer *t)
+mmc_spi_writeblock(struct mmc_spi_host *host, struct spi_transfer *t,
+ ktime_t timeout)
{
struct spi_device *spi = host->spi;
int status, i;
@@ -673,7 +672,7 @@ mmc_spi_writeblock(struct mmc_spi_host *host,
struct spi_transfer *t)
if (scratch->status[i] != 0)
return 0;
}
- return mmc_spi_wait_unbusy(host, writeblock_timeout);
+ return mmc_spi_wait_unbusy(host, timeout);
}

/*
@@ -693,7 +692,8 @@ mmc_spi_writeblock(struct mmc_spi_host *host,
struct spi_transfer *t)
* STOP_TRANSMISSION command.
*/
static int
-mmc_spi_readblock(struct mmc_spi_host *host, struct spi_transfer *t)
+mmc_spi_readblock(struct mmc_spi_host *host, struct spi_transfer *t,
+ ktime_t timeout)
{
struct spi_device *spi = host->spi;
int status;
@@ -707,7 +707,7 @@ mmc_spi_readblock(struct mmc_spi_host *host,
struct spi_transfer *t)
return status;
status = scratch->status[0];
if (status == 0xff || status == 0)
- status = mmc_spi_readtoken(host);
+ status = mmc_spi_readtoken(host, timeout);

if (status == SPI_TOKEN_SINGLE) {
if (host->dma_dev) {
@@ -778,6 +778,8 @@ mmc_spi_data_do(struct mmc_spi_host *host, struct
mmc_command *cmd,
struct scatterlist *sg;
unsigned n_sg;
int multiple = (data->blocks > 1);
+ u32 clock_rate;
+ ktime_t timeout;

if (data->flags & MMC_DATA_READ)
direction = DMA_FROM_DEVICE;
@@ -786,6 +788,14 @@ mmc_spi_data_do(struct mmc_spi_host *host, struct
mmc_command *cmd,
mmc_spi_setup_data_message(host, multiple, direction);
t = &host->t;

+ if (t->speed_hz)
+ clock_rate = t->speed_hz;
+ else
+ clock_rate = spi->max_speed_hz;
+
+ timeout = ktime_add_ns(ktime_set(0, 0), data->timeout_ns +
+ data->timeout_clks * 1000000 / clock_rate);
+
/* Handle scatterlist segments one at a time, with synch for
* each 512-byte block
*/
@@ -832,9 +842,9 @@ mmc_spi_data_do(struct mmc_spi_host *host, struct
mmc_command *cmd,
t->len);

if (direction == DMA_TO_DEVICE)
- status = mmc_spi_writeblock(host, t);
+ status = mmc_spi_writeblock(host, t, timeout);
else
- status = mmc_spi_readblock(host, t);
+ status = mmc_spi_readblock(host, t, timeout);
if (status < 0)
break;

@@ -917,7 +927,7 @@ mmc_spi_data_do(struct mmc_spi_host *host, struct
mmc_command *cmd,
if (scratch->status[tmp] != 0)
return;
}
- tmp = mmc_spi_wait_unbusy(host, writeblock_timeout);
+ tmp = mmc_spi_wait_unbusy(host, timeout);
if (tmp < 0 && !data->error)
data->error = tmp;
}
--
1.5.5.2

------=_Part_207_22383583.1222948592223
Content-Type: text/x-diff; name=0001-MMC-Use-timeout-values-from-CSR.patch
Content-Transfer-Encoding: base64
X-Attachment-Id: f_fltbznwv0
Content-Disposition: attachment;
filename=0001-MMC-Use-timeout-values-from-CSR.patch

RnJvbSA2YzZlMTlhNjU1NDc1M2VkYzRlMjU4MjdjZDA4NzNhZDUxMjE5MmU0IE1vbiBTZXAgMTcg
MDA6MDA6MDAgMjAwMQpGcm9tOiBNYXR0aGV3IEZsZW1pbmcgPG1hdHRoZXcuZmxlbWluZ0BpbWd0
ZWMuY29tPgpEYXRlOiBUaHUsIDIgT2N0IDIwMDggMTI6MjE6NDIgKzAxMDAKU3ViamVjdDogW1BB
VENIIDEvMl0gTU1DOiBVc2UgdGltZW91dCB2YWx1ZXMgZnJvbSBDU1IKCkhhcmQtY29kZWQgdGlt
ZW91dCB2YWx1ZXMgb2YgMjUwbXMgZm9yIHdyaXRlcyBhbmQgMTAwbXMgZm9yIHJlYWRzIGFyZQpj
dXJyZW50bHkgdXNlZCBmb3IgTU1DIHRyYW5zYWN0aW9ucyBvdmVyIFNQSS4gVGhlIHNwZWMgc3Rh
dGVzIHRoYXQgdGhlCnRpbWVvdXQgdmFsdWVzIGZyb20gdGhlIGNhcmQgc2hvdWxkIGJlIHVzZWQu
CgpTaWduZWQtb2ZmLWJ5OiBNYXR0aGV3IEZsZW1pbmcgPG1hdHRoZXcuZmxlbWluZ0BpbWd0ZWMu
Y29tPgotLS0KIGRyaXZlcnMvbW1jL2hvc3QvbW1jX3NwaS5jIHwgICAzMiArKysrKysrKysrKysr
KysrKysrKystLS0tLS0tLS0tLQogMSBmaWxlcyBjaGFuZ2VkLCAyMSBpbnNlcnRpb25zKCspLCAx
MSBkZWxldGlvbnMoLSkKCmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9ob3N0L21tY19zcGkuYyBi
L2RyaXZlcnMvbW1jL2hvc3QvbW1jX3NwaS5jCmluZGV4IDc1MDNiODEuLjA3ZmFmNTQgMTAwNjQ0
Ci0tLSBhL2RyaXZlcnMvbW1jL2hvc3QvbW1jX3NwaS5jCisrKyBiL2RyaXZlcnMvbW1jL2hvc3Qv
bW1jX3NwaS5jCkBAIC05NSw4ICs5NSw2IEBACiAgKiByZWFkcyB3aGljaCB0YWtlcyBub3doZXJl
IG5lYXIgdGhhdCBsb25nLiAgT2xkZXIgY2FyZHMgbWF5IGJlIGFibGUgdG8gdXNlCiAgKiBzaG9y
dGVyIHRpbWVvdXRzIC4uLiBidXQgd2h5IGJvdGhlcj8KICAqLwotI2RlZmluZSByZWFkYmxvY2tf
dGltZW91dAlrdGltZV9zZXQoMCwgMTAwICogMTAwMCAqIDEwMDApCi0jZGVmaW5lIHdyaXRlYmxv
Y2tfdGltZW91dAlrdGltZV9zZXQoMCwgMjUwICogMTAwMCAqIDEwMDApCiAjZGVmaW5lIHIxYl90
aW1lb3V0CQlrdGltZV9zZXQoMywgMCkKIAogCkBAIC0yMjAsOSArMjE4LDkgQEAgbW1jX3NwaV93
YWl0X3VuYnVzeShzdHJ1Y3QgbW1jX3NwaV9ob3N0ICpob3N0LCBrdGltZV90IHRpbWVvdXQpCiAJ
cmV0dXJuIG1tY19zcGlfc2tpcChob3N0LCB0aW1lb3V0LCBzaXplb2YoaG9zdC0+ZGF0YS0+c3Rh
dHVzKSwgMCk7CiB9CiAKLXN0YXRpYyBpbnQgbW1jX3NwaV9yZWFkdG9rZW4oc3RydWN0IG1tY19z
cGlfaG9zdCAqaG9zdCkKK3N0YXRpYyBpbnQgbW1jX3NwaV9yZWFkdG9rZW4oc3RydWN0IG1tY19z
cGlfaG9zdCAqaG9zdCwga3RpbWVfdCB0aW1lb3V0KQogewotCXJldHVybiBtbWNfc3BpX3NraXAo
aG9zdCwgcmVhZGJsb2NrX3RpbWVvdXQsIDEsIDB4ZmYpOworCXJldHVybiBtbWNfc3BpX3NraXAo
aG9zdCwgdGltZW91dCwgMSwgMHhmZik7CiB9CiAKIApAQCAtNjA1LDcgKzYwMyw4IEBAIG1tY19z
cGlfc2V0dXBfZGF0YV9tZXNzYWdlKAogICogUmV0dXJuIG5lZ2F0aXZlIGVycm5vLCBlbHNlIHN1
Y2Nlc3MuCiAgKi8KIHN0YXRpYyBpbnQKLW1tY19zcGlfd3JpdGVibG9jayhzdHJ1Y3QgbW1jX3Nw
aV9ob3N0ICpob3N0LCBzdHJ1Y3Qgc3BpX3RyYW5zZmVyICp0KQorbW1jX3NwaV93cml0ZWJsb2Nr
KHN0cnVjdCBtbWNfc3BpX2hvc3QgKmhvc3QsIHN0cnVjdCBzcGlfdHJhbnNmZXIgKnQsCisJa3Rp
bWVfdCB0aW1lb3V0KQogewogCXN0cnVjdCBzcGlfZGV2aWNlCSpzcGkgPSBob3N0LT5zcGk7CiAJ
aW50CQkJc3RhdHVzLCBpOwpAQCAtNjczLDcgKzY3Miw3IEBAIG1tY19zcGlfd3JpdGVibG9jayhz
dHJ1Y3QgbW1jX3NwaV9ob3N0ICpob3N0LCBzdHJ1Y3Qgc3BpX3RyYW5zZmVyICp0KQogCQlpZiAo
c2NyYXRjaC0+c3RhdHVzW2ldICE9IDApCiAJCQlyZXR1cm4gMDsKIAl9Ci0JcmV0dXJuIG1tY19z
cGlfd2FpdF91bmJ1c3koaG9zdCwgd3JpdGVibG9ja190aW1lb3V0KTsKKwlyZXR1cm4gbW1jX3Nw
aV93YWl0X3VuYnVzeShob3N0LCB0aW1lb3V0KTsKIH0KIAogLyoKQEAgLTY5Myw3ICs2OTIsOCBA
QCBtbWNfc3BpX3dyaXRlYmxvY2soc3RydWN0IG1tY19zcGlfaG9zdCAqaG9zdCwgc3RydWN0IHNw
aV90cmFuc2ZlciAqdCkKICAqIFNUT1BfVFJBTlNNSVNTSU9OIGNvbW1hbmQuCiAgKi8KIHN0YXRp
YyBpbnQKLW1tY19zcGlfcmVhZGJsb2NrKHN0cnVjdCBtbWNfc3BpX2hvc3QgKmhvc3QsIHN0cnVj
dCBzcGlfdHJhbnNmZXIgKnQpCittbWNfc3BpX3JlYWRibG9jayhzdHJ1Y3QgbW1jX3NwaV9ob3N0
ICpob3N0LCBzdHJ1Y3Qgc3BpX3RyYW5zZmVyICp0LAorCWt0aW1lX3QgdGltZW91dCkKIHsKIAlz
dHJ1Y3Qgc3BpX2RldmljZQkqc3BpID0gaG9zdC0+c3BpOwogCWludAkJCXN0YXR1czsKQEAgLTcw
Nyw3ICs3MDcsNyBAQCBtbWNfc3BpX3JlYWRibG9jayhzdHJ1Y3QgbW1jX3NwaV9ob3N0ICpob3N0
LCBzdHJ1Y3Qgc3BpX3RyYW5zZmVyICp0KQogCQlyZXR1cm4gc3RhdHVzOwogCXN0YXR1cyA9IHNj
cmF0Y2gtPnN0YXR1c1swXTsKIAlpZiAoc3RhdHVzID09IDB4ZmYgfHwgc3RhdHVzID09IDApCi0J
CXN0YXR1cyA9IG1tY19zcGlfcmVhZHRva2VuKGhvc3QpOworCQlzdGF0dXMgPSBtbWNfc3BpX3Jl
YWR0b2tlbihob3N0LCB0aW1lb3V0KTsKIAogCWlmIChzdGF0dXMgPT0gU1BJX1RPS0VOX1NJTkdM
RSkgewogCQlpZiAoaG9zdC0+ZG1hX2RldikgewpAQCAtNzc4LDYgKzc3OCw4IEBAIG1tY19zcGlf
ZGF0YV9kbyhzdHJ1Y3QgbW1jX3NwaV9ob3N0ICpob3N0LCBzdHJ1Y3QgbW1jX2NvbW1hbmQgKmNt
ZCwKIAlzdHJ1Y3Qgc2NhdHRlcmxpc3QJKnNnOwogCXVuc2lnbmVkCQluX3NnOwogCWludAkJCW11
bHRpcGxlID0gKGRhdGEtPmJsb2NrcyA+IDEpOworCXUzMgkJCWNsb2NrX3JhdGU7CisJa3RpbWVf
dAkJCXRpbWVvdXQ7CiAKIAlpZiAoZGF0YS0+ZmxhZ3MgJiBNTUNfREFUQV9SRUFEKQogCQlkaXJl
Y3Rpb24gPSBETUFfRlJPTV9ERVZJQ0U7CkBAIC03ODYsNiArNzg4LDE0IEBAIG1tY19zcGlfZGF0
YV9kbyhzdHJ1Y3QgbW1jX3NwaV9ob3N0ICpob3N0LCBzdHJ1Y3QgbW1jX2NvbW1hbmQgKmNtZCwK
IAltbWNfc3BpX3NldHVwX2RhdGFfbWVzc2FnZShob3N0LCBtdWx0aXBsZSwgZGlyZWN0aW9uKTsK
IAl0ID0gJmhvc3QtPnQ7CiAKKwlpZiAodC0+c3BlZWRfaHopCisJCWNsb2NrX3JhdGUgPSB0LT5z
cGVlZF9oejsKKwllbHNlCisJCWNsb2NrX3JhdGUgPSBzcGktPm1heF9zcGVlZF9oejsKKworCXRp
bWVvdXQgPSBrdGltZV9hZGRfbnMoa3RpbWVfc2V0KDAsIDApLCBkYXRhLT50aW1lb3V0X25zICsK
KwkJCWRhdGEtPnRpbWVvdXRfY2xrcyAqIDEwMDAwMDAgLyBjbG9ja19yYXRlKTsKKwogCS8qIEhh
bmRsZSBzY2F0dGVybGlzdCBzZWdtZW50cyBvbmUgYXQgYSB0aW1lLCB3aXRoIHN5bmNoIGZvcgog
CSAqIGVhY2ggNTEyLWJ5dGUgYmxvY2sKIAkgKi8KQEAgLTgzMiw5ICs4NDIsOSBAQCBtbWNfc3Bp
X2RhdGFfZG8oc3RydWN0IG1tY19zcGlfaG9zdCAqaG9zdCwgc3RydWN0IG1tY19jb21tYW5kICpj
bWQsCiAJCQkJdC0+bGVuKTsKIAogCQkJaWYgKGRpcmVjdGlvbiA9PSBETUFfVE9fREVWSUNFKQot
CQkJCXN0YXR1cyA9IG1tY19zcGlfd3JpdGVibG9jayhob3N0LCB0KTsKKwkJCQlzdGF0dXMgPSBt
bWNfc3BpX3dyaXRlYmxvY2soaG9zdCwgdCwgdGltZW91dCk7CiAJCQllbHNlCi0JCQkJc3RhdHVz
ID0gbW1jX3NwaV9yZWFkYmxvY2soaG9zdCwgdCk7CisJCQkJc3RhdHVzID0gbW1jX3NwaV9yZWFk
YmxvY2soaG9zdCwgdCwgdGltZW91dCk7CiAJCQlpZiAoc3RhdHVzIDwgMCkKIAkJCQlicmVhazsK
IApAQCAtOTE3LDcgKzkyNyw3IEBAIG1tY19zcGlfZGF0YV9kbyhzdHJ1Y3QgbW1jX3NwaV9ob3N0
ICpob3N0LCBzdHJ1Y3QgbW1jX2NvbW1hbmQgKmNtZCwKIAkJCWlmIChzY3JhdGNoLT5zdGF0dXNb
dG1wXSAhPSAwKQogCQkJCXJldHVybjsKIAkJfQotCQl0bXAgPSBtbWNfc3BpX3dhaXRfdW5idXN5
KGhvc3QsIHdyaXRlYmxvY2tfdGltZW91dCk7CisJCXRtcCA9IG1tY19zcGlfd2FpdF91bmJ1c3ko
aG9zdCwgdGltZW91dCk7CiAJCWlmICh0bXAgPCAwICYmICFkYXRhLT5lcnJvcikKIAkJCWRhdGEt
PmVycm9yID0gdG1wOwogCX0KLS0gCjEuNS41LjIKCg==
------=_Part_207_22383583.1222948592223--
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/