From mboxrd@z Thu Jan 1 00:00:00 1970 From: majianpeng Subject: [PATCH] mmc: omap_hsmmc: Fix sleep too long in ISR context. Date: Thu, 1 Aug 2013 10:18:08 +0800 Message-ID: <201308011017566117580@gmail.com> Reply-To: majianpeng Mime-Version: 1.0 Content-Type: text/plain; charset="gb2312" Content-Transfer-Encoding: base64 Return-path: Received: from mail-pd0-f171.google.com ([209.85.192.171]:62253 "EHLO mail-pd0-f171.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751959Ab3HACac (ORCPT ); Wed, 31 Jul 2013 22:30:32 -0400 Sender: linux-mmc-owner@vger.kernel.org List-Id: linux-mmc@vger.kernel.org To: balajitk , cjb Cc: mayuzheng , linux-mmc , linux-omap , linux-kernel V2UgZm91bmQgYSBwcm9ibGVtIHdoZW4gd2UgcmVtb3ZlZCBhIHdvcmtpbmcgc2QgY2FyZCB0aGF0 IHRoZSBpcnFhY3Rpb24NCm9mIG9tYXBfaHNtbWMgY2FuIHNsZWVwIHRvIDMuNnMuIFRoaXMgY2F1 c2Ugb3VyIHdhdGNoZG9nIHRvIHdvcmsuDQpJbiBmdW5jIG9tYXBfaHNtbWNfcmVzZXRfY29udHJv bGxlcl9mc20sIGl0IHNob3VsZCB3YXRjaCBhIDAtPjENCnRyYW5zaXRpb24uSXQgdXNlZCBsb29w c19wZXJfamlmZnkgYXMgdGhlIHRpbWVyLg0KVGhlIGNvZGUgaXM6DQo+IHdoaWxlICgoIShPTUFQ X0hTTU1DX1JFQUQoaG9zdC0+YmFzZSwgU1lTQ1RMKSAmIGJpdCkpDQo+ICAgICAgICAgICAgICAg ICYmIChpKysgPCBsaW1pdCkpDQo+ICAgICAgICAgICAgICAgICAgICAgICAgY3B1X3JlbGF4KCk7 DQpCdXQgdGhlIGxvb3BzX3Blcl9qaWZmeSBpczoNCj4gIHdoaWxlKGkrKyA8IGxpbWl0KQ0KPglj cHVfcmVsYXgoKTsNCkl0IGFkZCBzb21lIGNvZGVzIHNvIHRoZSB0aW1lIGJlY2FtZSBsb25nLg0K QmVjYXN1ZSB0aG9zZSBjb2RlcyBpbiBJU1IgY29udGV4dCwgaXQgY2FuJ3QgdXNlIHRpbWVyX2Jl Zm9yZS9hZnRlci4NCkkgZGl2aXZlZCB0aGUgdGltZSBpbnRvIDFtcyBhbmQgdXNlZCB1ZGVsYXko MSkgdG8gaW5zdGVhZC4NCkl0IHdpbGwgY2F1c2UgZG8gYWRkaXRpb25hbCB1ZGVsYXkoMSkuQnV0 IGZyb20gbXkgdGVzdCxpdCBsb29rcyBnb29kLg0KDQpSZXBvcnRlZC1ieTogWXV6aGVuZyBNYSA8 bWF5dXpoZW5nQGtlZGFjb20uY29tPg0KVGVzdGVkLWJ5OiBZdXpoZW5nIE1hIDxtYXl1emhlbmdA a2VkYWNvbS5jb20+DQpTaWduZWQtb2ZmLWJ5OiBKaWFucGVuZyBNYSA8bWFqaWFucGVuZ0BnbWFp bC5jb20+DQotLS0NCiBkcml2ZXJzL21tYy9ob3N0L29tYXBfaHNtbWMuYyB8IDIwICsrKysrKysr KysrKystLS0tLS0tDQogMSBmaWxlIGNoYW5nZWQsIDEzIGluc2VydGlvbnMoKyksIDcgZGVsZXRp b25zKC0pDQoNCmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9ob3N0L29tYXBfaHNtbWMuYyBiL2Ry aXZlcnMvbW1jL2hvc3Qvb21hcF9oc21tYy5jDQppbmRleCAxODY1MzIxLi45NmRhY2ExIDEwMDY0 NA0KLS0tIGEvZHJpdmVycy9tbWMvaG9zdC9vbWFwX2hzbW1jLmMNCisrKyBiL2RyaXZlcnMvbW1j L2hvc3Qvb21hcF9oc21tYy5jDQpAQCAtOTc3LDYgKzk3Nyw4IEBAIHN0YXRpYyBpbmxpbmUgdm9p ZCBvbWFwX2hzbW1jX3Jlc2V0X2NvbnRyb2xsZXJfZnNtKHN0cnVjdCBvbWFwX2hzbW1jX2hvc3Qg Kmhvc3QsDQogCXVuc2lnbmVkIGxvbmcgbGltaXQgPSAobG9vcHNfcGVyX2ppZmZ5ICoNCiAJCQkJ bXNlY3NfdG9famlmZmllcyhNTUNfVElNRU9VVF9NUykpOw0KIA0KKwkvKkRpdmlkZWQgdGltZSBp bnRvIHVzIGZvciB1bml0IDEsd2UgY2FuIHVzZSB1ZGVsYXkoMSkqLw0KKwlpID0gbGltaXQgLyAo TU1DX1RJTUVPVVRfTVMgKiAxMDAwKTsNCiAJT01BUF9IU01NQ19XUklURShob3N0LT5iYXNlLCBT WVNDVEwsDQogCQkJIE9NQVBfSFNNTUNfUkVBRChob3N0LT5iYXNlLCBTWVNDVEwpIHwgYml0KTsN CiANCkBAIC05ODUsMTUgKzk4NywxOSBAQCBzdGF0aWMgaW5saW5lIHZvaWQgb21hcF9oc21tY19y ZXNldF9jb250cm9sbGVyX2ZzbShzdHJ1Y3Qgb21hcF9oc21tY19ob3N0ICpob3N0LA0KIAkgKiBN b25pdG9yIGEgMC0+MSB0cmFuc2l0aW9uIGZpcnN0DQogCSAqLw0KIAlpZiAobW1jX3Nsb3QoaG9z dCkuZmVhdHVyZXMgJiBIU01NQ19IQVNfVVBEQVRFRF9SRVNFVCkgew0KLQkJd2hpbGUgKCghKE9N QVBfSFNNTUNfUkVBRChob3N0LT5iYXNlLCBTWVNDVEwpICYgYml0KSkNCi0JCQkJCSYmIChpKysg PCBsaW1pdCkpDQotCQkJY3B1X3JlbGF4KCk7DQorCQl3aGlsZSAoaS0tKSB7DQorCQkJaWYgKChP TUFQX0hTTU1DX1JFQUQoaG9zdC0+YmFzZSwgU1lTQ1RMKSAmIGJpdCkpDQorCQkJCWJyZWFrOw0K KwkJCXVkZWxheSgxKTsNCisJCX0NCiAJfQ0KLQlpID0gMDsNCiANCi0Jd2hpbGUgKChPTUFQX0hT TU1DX1JFQUQoaG9zdC0+YmFzZSwgU1lTQ1RMKSAmIGJpdCkgJiYNCi0JCShpKysgPCBsaW1pdCkp DQotCQljcHVfcmVsYXgoKTsNCisJaSA9IGxpbWl0IC8gKE1NQ19USU1FT1VUX01TICogMTAwMCk7 DQorCXdoaWxlIChpLS0pIHsNCisJCWlmICghKE9NQVBfSFNNTUNfUkVBRChob3N0LT5iYXNlLCBT WVNDVEwpICYgYml0KSkNCisJCQlicmVhazsNCisJCXVkZWFseSgxKTsNCisJfQ0KIA0KIAlpZiAo T01BUF9IU01NQ19SRUFEKGhvc3QtPmJhc2UsIFNZU0NUTCkgJiBiaXQpDQogCQlkZXZfZXJyKG1t Y19kZXYoaG9zdC0+bW1jKSwNCi0tIA0KMS44LjEuMg0KDQoNClRoYW5rcyENCkppYW5wZW5nIE1h From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752719Ab3HACae (ORCPT ); Wed, 31 Jul 2013 22:30:34 -0400 Received: from mail-pd0-f171.google.com ([209.85.192.171]:62253 "EHLO mail-pd0-f171.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751959Ab3HACac (ORCPT ); Wed, 31 Jul 2013 22:30:32 -0400 Date: Thu, 1 Aug 2013 10:18:08 +0800 From: majianpeng To: balajitk , cjb Cc: mayuzheng , linux-mmc , linux-omap , linux-kernel Reply-To: majianpeng Subject: [PATCH] mmc: omap_hsmmc: Fix sleep too long in ISR context. X-Priority: 3 X-GUID: 8C5E30D5-ECD1-4E5E-98BC-BF91E516EB29 X-Has-Attach: no X-Mailer: Foxmail 7.0.1.90[en] Mime-Version: 1.0 Message-ID: <201308011017566117580@gmail.com> Content-Type: text/plain; charset="gb2312" Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Transfer-Encoding: 8bit X-MIME-Autoconverted: from base64 to 8bit by mail.home.local id r712UdNZ017178 We found a problem when we removed a working sd card that the irqaction of omap_hsmmc can sleep to 3.6s. This cause our watchdog to work. In func omap_hsmmc_reset_controller_fsm, it should watch a 0->1 transition.It used loops_per_jiffy as the timer. The code is: > while ((!(OMAP_HSMMC_READ(host->base, SYSCTL) & bit)) > && (i++ < limit)) > cpu_relax(); But the loops_per_jiffy is: > while(i++ < limit) > cpu_relax(); It add some codes so the time became long. Becasue those codes in ISR context, it can't use timer_before/after. I divived the time into 1ms and used udelay(1) to instead. It will cause do additional udelay(1).But from my test,it looks good. Reported-by: Yuzheng Ma Tested-by: Yuzheng Ma Signed-off-by: Jianpeng Ma --- drivers/mmc/host/omap_hsmmc.c | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/drivers/mmc/host/omap_hsmmc.c b/drivers/mmc/host/omap_hsmmc.c index 1865321..96daca1 100644 --- a/drivers/mmc/host/omap_hsmmc.c +++ b/drivers/mmc/host/omap_hsmmc.c @@ -977,6 +977,8 @@ static inline void omap_hsmmc_reset_controller_fsm(struct omap_hsmmc_host *host, unsigned long limit = (loops_per_jiffy * msecs_to_jiffies(MMC_TIMEOUT_MS)); + /*Divided time into us for unit 1,we can use udelay(1)*/ + i = limit / (MMC_TIMEOUT_MS * 1000); OMAP_HSMMC_WRITE(host->base, SYSCTL, OMAP_HSMMC_READ(host->base, SYSCTL) | bit); @@ -985,15 +987,19 @@ static inline void omap_hsmmc_reset_controller_fsm(struct omap_hsmmc_host *host, * Monitor a 0->1 transition first */ if (mmc_slot(host).features & HSMMC_HAS_UPDATED_RESET) { - while ((!(OMAP_HSMMC_READ(host->base, SYSCTL) & bit)) - && (i++ < limit)) - cpu_relax(); + while (i--) { + if ((OMAP_HSMMC_READ(host->base, SYSCTL) & bit)) + break; + udelay(1); + } } - i = 0; - while ((OMAP_HSMMC_READ(host->base, SYSCTL) & bit) && - (i++ < limit)) - cpu_relax(); + i = limit / (MMC_TIMEOUT_MS * 1000); + while (i--) { + if (!(OMAP_HSMMC_READ(host->base, SYSCTL) & bit)) + break; + udealy(1); + } if (OMAP_HSMMC_READ(host->base, SYSCTL) & bit) dev_err(mmc_dev(host->mmc), -- 1.8.1.2 Thanks! Jianpeng Ma{.n++%ݶw{.n+{G{ayʇڙ,jfhz_(階ݢj"mG?&~iOzv^m ?I