diff options
author | Pierre Ossman <drzeus@drzeus.cx> | 2008-08-31 13:38:54 +0200 |
---|---|---|
committer | Pierre Ossman <drzeus@drzeus.cx> | 2008-10-12 11:04:28 +0200 |
commit | e633b7bcec8e26991d489a11615acf7674efbaf4 (patch) | |
tree | b26362cc8a0695876b28c5dd52bd3a6812fe745a /drivers/mmc/core | |
parent | 04cf585d2902404ed06861c6dc27897100340dba (diff) | |
download | op-kernel-dev-e633b7bcec8e26991d489a11615acf7674efbaf4.zip op-kernel-dev-e633b7bcec8e26991d489a11615acf7674efbaf4.tar.gz |
sdio: make sleep on error interruptable
Make sure we can be woken from the forced sleep that is done on errors.
Removing a card often results in -ENOMEDIUM or -EILSEQ so we previously
locked up the removal process for a second.
We could completely exit on -ENOMEDIUM, but it might be a transient
glitch so treat it like any other error.
Signed-off-by: Pierre Ossman <drzeus@drzeus.cx>
Diffstat (limited to 'drivers/mmc/core')
-rw-r--r-- | drivers/mmc/core/sdio_irq.c | 13 |
1 files changed, 9 insertions, 4 deletions
diff --git a/drivers/mmc/core/sdio_irq.c b/drivers/mmc/core/sdio_irq.c index c292e12..722924c 100644 --- a/drivers/mmc/core/sdio_irq.c +++ b/drivers/mmc/core/sdio_irq.c @@ -5,6 +5,8 @@ * Created: June 18, 2007 * Copyright: MontaVista Software Inc. * + * Copyright 2008 Pierre Ossman + * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or (at @@ -107,11 +109,14 @@ static int sdio_irq_thread(void *_host) /* * Give other threads a chance to run in the presence of - * errors. FIXME: determine if due to card removal and - * possibly exit this thread if so. + * errors. */ - if (ret < 0) - ssleep(1); + if (ret < 0) { + set_current_state(TASK_INTERRUPTIBLE); + if (!kthread_should_stop()) + schedule_timeout(HZ); + set_current_state(TASK_RUNNING); + } /* * Adaptive polling frequency based on the assumption |