Skip to contentSkip to conversation

mmc: core: sdio: Fix unconditional wake_up_process() on sdio thread

PATCH Applied Fu, Zhonghui 3 participants 7 messages Aug 11, 2014 – Sep 3, 2014 MMC, SD and SDIO

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 mmc: core: sdio: Fix unconditional wake_up_process() on sdio thread

Quoted 1 line

From 6cee984e1d76ba0a3320430f8cf4318ab65fcf06 Mon Sep 17 00:00:00 2001

From: Fu Zhonghui <[email protected]>
Date: Tue, 5 Aug 2014 12:44:38 +0800
Subject: [PATCH] mmc: core: sdio: Fix unconditional wake_up_process() on sdio thread

781e989cf59 ("mmc: sdhci: convert to new SDIO IRQ handling") and bf3b5ec66bd ("mmc: sdio_irq: rework sdio irq handling") disabled the use of our own custom threaded IRQ handler, but left in an unconditional wake_up_process() on that handler at resume-time.

In addition, the check for MMC_CAP_SDIO_IRQ capability is added before enable sdio IRQ.

---
 drivers/mmc/core/sdio.c     |   14 ++++++++++++--
 drivers/mmc/core/sdio_irq.c |    4 ++--
 2 files changed, 14 insertions(+), 4 deletions(-)
drivers/mmc/core/sdio.c +12 -2
index e636d9e..e04a540 100644
@@ -992,8 +992,18 @@ static int mmc_sdio_resume(struct mmc_host *host)
 		}
 	}
 
-	if (!err && host->sdio_irqs)
-		wake_up_process(host->sdio_irq_thread);
+	if (!err && host->sdio_irqs) {
+		if (!(host->caps2 & MMC_CAP2_SDIO_IRQ_NOTHREAD)) {
+			wake_up_process(host->sdio_irq_thread);
+		} else if (host->caps & MMC_CAP_SDIO_IRQ) {
+			mmc_release_host(host);
+			mmc_host_clk_hold(host);
+			host->ops->enable_sdio_irq(host, 1);
+			mmc_host_clk_release(host);
+			mmc_claim_host(host);
+		}
+	}
+
 	mmc_release_host(host);
 
 	host->pm_flags &= ~MMC_PM_KEEP_POWER;
drivers/mmc/core/sdio_irq.c +2 -2
index 5cc13c8..696eca4 100644
@@ -208,7 +208,7 @@ static int sdio_card_irq_get(struct mmc_card *card)
 				host->sdio_irqs--;
 				return err;
 			}
-		} else {
+		} else if (host->caps & MMC_CAP_SDIO_IRQ) {
 			mmc_host_clk_hold(host);
 			host->ops->enable_sdio_irq(host, 1);
 			mmc_host_clk_release(host);
@@ -229,7 +229,7 @@ static int sdio_card_irq_put(struct mmc_card *card)
 		if (!(host->caps2 & MMC_CAP2_SDIO_IRQ_NOTHREAD)) {
 			atomic_set(&host->sdio_irq_thread_abort, 1);
 			kthread_stop(host->sdio_irq_thread);
-		} else {
+		} else if (host->caps & MMC_CAP_SDIO_IRQ) {
 			mmc_host_clk_hold(host);
 			host->ops->enable_sdio_irq(host, 0);
 			mmc_host_clk_release(host);

-- 1.7.1

#1 lore raw
Quoted 27 lines · Zhonghui

From 6cee984e1d76ba0a3320430f8cf4318ab65fcf06 Mon Sep 17 00:00:00 2001
From: Fu Zhonghui <[email protected]>
Date: Tue, 5 Aug 2014 12:44:38 +0800
Subject: [PATCH] mmc: core: sdio: Fix unconditional wake_up_process() on sdio thread

781e989cf59 ("mmc: sdhci: convert to new SDIO IRQ handling") and bf3b5ec66bd ("mmc: sdio_irq: rework sdio irq handling") disabled the use of our own custom threaded IRQ handler, but left in an unconditional wake_up_process() on that handler at resume-time.

In addition, the check for MMC_CAP_SDIO_IRQ capability is added before enable sdio IRQ.

---
 drivers/mmc/core/sdio.c     |   14 ++++++++++++--
 drivers/mmc/core/sdio_irq.c |    4 ++--
 2 files changed, 14 insertions(+), 4 deletions(-)
drivers/mmc/core/sdio.c +0 -0
index e636d9e..e04a540 100644

drivers/mmc/core/sdio.c static int mmc_sdio_resume(struct mmc_host *host) · line 999

Quoted 10 lines
drivers/mmc/core/sdio.c +5 -2
@@ -992,8 +992,18 @@ static int mmc_sdio_resume(struct mmc_host *host)
                }
        }
 
-       if (!err && host->sdio_irqs)
-               wake_up_process(host->sdio_irq_thread);
+       if (!err && host->sdio_irqs) {
+               if (!(host->caps2 & MMC_CAP2_SDIO_IRQ_NOTHREAD)) {
+                       wake_up_process(host->sdio_irq_thread);
+               } else if (host->caps & MMC_CAP_SDIO_IRQ) {
+                       mmc_release_host(host);

Why mmc_release_host() and the corresponding mmc_claim_host() below? Those shouldn't be needed I think.

Quoted 25 lines
drivers/mmc/core/sdio.c +7 -0
+                       mmc_host_clk_hold(host);
+                       host->ops->enable_sdio_irq(host, 1);
+                       mmc_host_clk_release(host);
+                       mmc_claim_host(host);
+               }
+       }
+
        mmc_release_host(host);
 
        host->pm_flags &= ~MMC_PM_KEEP_POWER;
drivers/mmc/core/sdio_irq.c +1 -1
index 5cc13c8..696eca4 100644
@@ -208,7 +208,7 @@ static int sdio_card_irq_get(struct mmc_card *card)
                                host->sdio_irqs--;
                                return err;
                        }
-               } else {
+               } else if (host->caps & MMC_CAP_SDIO_IRQ) {
                        mmc_host_clk_hold(host);
                        host->ops->enable_sdio_irq(host, 1);
                        mmc_host_clk_release(host);

drivers/mmc/core/sdio_irq.c static int sdio_card_irq_put(struct mmc_card *card)

Quoted 9 lines
drivers/mmc/core/sdio_irq.c +1 -2
@@ -229,7 +229,7 @@ static int sdio_card_irq_put(struct mmc_card *card)
                if (!(host->caps2 & MMC_CAP2_SDIO_IRQ_NOTHREAD)) {
                        atomic_set(&host->sdio_irq_thread_abort, 1);
                        kthread_stop(host->sdio_irq_thread);
-               } else {
+               } else if (host->caps & MMC_CAP_SDIO_IRQ) {
                        mmc_host_clk_hold(host);
                        host->ops->enable_sdio_irq(host, 0);
                        mmc_host_clk_release(host);
-- 1.7.1

Thanks for working on this!

Kind regards
Uffe

#2 lore raw
Quoted 1 line

From 21266249bbbaf9407c1e88cd5950e06ac88aeebf Mon Sep 17 00:00:00 2001

From: Fu Zhonghui <[email protected]>
Date: Mon, 18 Aug 2014 10:48:14 +0800
Subject: [PATCH] mmc: core: sdio: Fix unconditional wake_up_process() on sdio thread

781e989cf59 ("mmc: sdhci: convert to new SDIO IRQ handling") and bf3b5ec66bd ("mmc: sdio_irq: rework sdio irq handling") disabled the use of our own custom threaded IRQ handler, but left in an unconditional wake_up_process() on that handler at resume-time.

In addition, the check for MMC_CAP_SDIO_IRQ capability is added before enable sdio IRQ.

---
 drivers/mmc/core/sdio.c     |   12 ++++++++++--
 drivers/mmc/core/sdio_irq.c |    4 ++--
 2 files changed, 12 insertions(+), 4 deletions(-)
drivers/mmc/core/sdio.c +10 -2
index e636d9e..3fc40a7 100644
@@ -992,8 +992,16 @@ static int mmc_sdio_resume(struct mmc_host *host)
 		}
 	}
 
-	if (!err && host->sdio_irqs)
-		wake_up_process(host->sdio_irq_thread);
+	if (!err && host->sdio_irqs) {
+		if (!(host->caps2 & MMC_CAP2_SDIO_IRQ_NOTHREAD)) {
+			wake_up_process(host->sdio_irq_thread);
+		} else if (host->caps & MMC_CAP_SDIO_IRQ) {
+			mmc_host_clk_hold(host);
+			host->ops->enable_sdio_irq(host, 1);
+			mmc_host_clk_release(host);
+		}
+	}
+
 	mmc_release_host(host);
 
 	host->pm_flags &= ~MMC_PM_KEEP_POWER;
drivers/mmc/core/sdio_irq.c +2 -2
index 5cc13c8..696eca4 100644
@@ -208,7 +208,7 @@ static int sdio_card_irq_get(struct mmc_card *card)
 				host->sdio_irqs--;
 				return err;
 			}
-		} else {
+		} else if (host->caps & MMC_CAP_SDIO_IRQ) {
 			mmc_host_clk_hold(host);
 			host->ops->enable_sdio_irq(host, 1);
 			mmc_host_clk_release(host);
@@ -229,7 +229,7 @@ static int sdio_card_irq_put(struct mmc_card *card)
 		if (!(host->caps2 & MMC_CAP2_SDIO_IRQ_NOTHREAD)) {
 			atomic_set(&host->sdio_irq_thread_abort, 1);
 			kthread_stop(host->sdio_irq_thread);
-		} else {
+		} else if (host->caps & MMC_CAP_SDIO_IRQ) {
 			mmc_host_clk_hold(host);
 			host->ops->enable_sdio_irq(host, 0);
 			mmc_host_clk_release(host);

-- 1.7.1

Quoted 31 lines · Ulf Hansson
Quoted 30 lines · Zhonghui

From 6cee984e1d76ba0a3320430f8cf4318ab65fcf06 Mon Sep 17 00:00:00 2001
From: Fu Zhonghui <[email protected]>
Date: Tue, 5 Aug 2014 12:44:38 +0800
Subject: [PATCH] mmc: core: sdio: Fix unconditional wake_up_process() on sdio thread

781e989cf59 ("mmc: sdhci: convert to new SDIO IRQ handling") and bf3b5ec66bd ("mmc: sdio_irq: rework sdio irq handling") disabled the use of our own custom threaded IRQ handler, but left in an unconditional wake_up_process() on that handler at resume-time.

In addition, the check for MMC_CAP_SDIO_IRQ capability is added before enable sdio IRQ.

---
 drivers/mmc/core/sdio.c     |   14 ++++++++++++--
 drivers/mmc/core/sdio_irq.c |    4 ++--
 2 files changed, 14 insertions(+), 4 deletions(-)
drivers/mmc/core/sdio.c +0 -0
index e636d9e..e04a540 100644
@@ -992,8 +992,18 @@ static int mmc_sdio_resume(struct mmc_host *host)
                }
        }
 
Quoted 9 lines

drivers/mmc/core/sdio.c static int mmc_sdio_resume(struct mmc_host *host) · line 999

Quoted 7 lines
drivers/mmc/core/sdio.c +5 -2
-       if (!err && host->sdio_irqs)
-               wake_up_process(host->sdio_irq_thread);
+       if (!err && host->sdio_irqs) {
+               if (!(host->caps2 & MMC_CAP2_SDIO_IRQ_NOTHREAD)) {
+                       wake_up_process(host->sdio_irq_thread);
+               } else if (host->caps & MMC_CAP_SDIO_IRQ) {
+                       mmc_release_host(host);

Why mmc_release_host() and the corresponding mmc_claim_host() below? Those shouldn't be needed I think.

You are right. These two functions shouldn't be invoked here. I made a new patch as above.

Thanks,
Zhonghui

Quoted 45 lines
Quoted 27 lines
drivers/mmc/core/sdio.c +7 -0
+                       mmc_host_clk_hold(host);
+                       host->ops->enable_sdio_irq(host, 1);
+                       mmc_host_clk_release(host);
+                       mmc_claim_host(host);
+               }
+       }
+
        mmc_release_host(host);
 
        host->pm_flags &= ~MMC_PM_KEEP_POWER;
drivers/mmc/core/sdio_irq.c +1 -1
index 5cc13c8..696eca4 100644
@@ -208,7 +208,7 @@ static int sdio_card_irq_get(struct mmc_card *card)
                                host->sdio_irqs--;
                                return err;
                        }
-               } else {
+               } else if (host->caps & MMC_CAP_SDIO_IRQ) {
                        mmc_host_clk_hold(host);
                        host->ops->enable_sdio_irq(host, 1);
                        mmc_host_clk_release(host);

drivers/mmc/core/sdio_irq.c static int sdio_card_irq_put(struct mmc_card *card)

Quoted 9 lines
drivers/mmc/core/sdio_irq.c +1 -2
@@ -229,7 +229,7 @@ static int sdio_card_irq_put(struct mmc_card *card)
                if (!(host->caps2 & MMC_CAP2_SDIO_IRQ_NOTHREAD)) {
                        atomic_set(&host->sdio_irq_thread_abort, 1);
                        kthread_stop(host->sdio_irq_thread);
-               } else {
+               } else if (host->caps & MMC_CAP_SDIO_IRQ) {
                        mmc_host_clk_hold(host);
                        host->ops->enable_sdio_irq(host, 0);
                        mmc_host_clk_release(host);
-- 1.7.1

Thanks for working on this!

Kind regards
Uffe
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/

Applied
#3 lore raw
Quoted 11 lines · Zhonghui

From 21266249bbbaf9407c1e88cd5950e06ac88aeebf Mon Sep 17 00:00:00 2001
From: Fu Zhonghui <[email protected]>
Date: Mon, 18 Aug 2014 10:48:14 +0800
Subject: [PATCH] mmc: core: sdio: Fix unconditional wake_up_process() on sdio thread

781e989cf59 ("mmc: sdhci: convert to new SDIO IRQ handling") and bf3b5ec66bd ("mmc: sdio_irq: rework sdio irq handling") disabled the use of our own custom threaded IRQ handler, but left in an unconditional wake_up_process() on that handler at resume-time.

Quoted 7 lines

In addition, the check for MMC_CAP_SDIO_IRQ capability is added before enable sdio IRQ.

Thanks! Applied for next and added a stable tag for v3.16+.

Kind regards
Uffe

Quoted 145 lines
---
 drivers/mmc/core/sdio.c     |   12 ++++++++++--
 drivers/mmc/core/sdio_irq.c |    4 ++--
 2 files changed, 12 insertions(+), 4 deletions(-)
drivers/mmc/core/sdio.c +10 -2
index e636d9e..3fc40a7 100644
@@ -992,8 +992,16 @@ static int mmc_sdio_resume(struct mmc_host *host)
                }
        }
 
-       if (!err && host->sdio_irqs)
-               wake_up_process(host->sdio_irq_thread);
+       if (!err && host->sdio_irqs) {
+               if (!(host->caps2 & MMC_CAP2_SDIO_IRQ_NOTHREAD)) {
+                       wake_up_process(host->sdio_irq_thread);
+               } else if (host->caps & MMC_CAP_SDIO_IRQ) {
+                       mmc_host_clk_hold(host);
+                       host->ops->enable_sdio_irq(host, 1);
+                       mmc_host_clk_release(host);
+               }
+       }
+
        mmc_release_host(host);
 
        host->pm_flags &= ~MMC_PM_KEEP_POWER;
drivers/mmc/core/sdio_irq.c +2 -3
index 5cc13c8..696eca4 100644
@@ -208,7 +208,7 @@ static int sdio_card_irq_get(struct mmc_card *card)
                                host->sdio_irqs--;
                                return err;
                        }
-               } else {
+               } else if (host->caps & MMC_CAP_SDIO_IRQ) {
                        mmc_host_clk_hold(host);
                        host->ops->enable_sdio_irq(host, 1);
                        mmc_host_clk_release(host);
@@ -229,7 +229,7 @@ static int sdio_card_irq_put(struct mmc_card *card)
                if (!(host->caps2 & MMC_CAP2_SDIO_IRQ_NOTHREAD)) {
                        atomic_set(&host->sdio_irq_thread_abort, 1);
                        kthread_stop(host->sdio_irq_thread);
-               } else {
+               } else if (host->caps & MMC_CAP_SDIO_IRQ) {
                        mmc_host_clk_hold(host);
                        host->ops->enable_sdio_irq(host, 0);
                        mmc_host_clk_release(host);
-- 1.7.1
Quoted 31 lines · Ulf Hansson
Quoted 30 lines · Zhonghui

From 6cee984e1d76ba0a3320430f8cf4318ab65fcf06 Mon Sep 17 00:00:00 2001
From: Fu Zhonghui <[email protected]>
Date: Tue, 5 Aug 2014 12:44:38 +0800
Subject: [PATCH] mmc: core: sdio: Fix unconditional wake_up_process() on sdio thread

781e989cf59 ("mmc: sdhci: convert to new SDIO IRQ handling") and bf3b5ec66bd ("mmc: sdio_irq: rework sdio irq handling") disabled the use of our own custom threaded IRQ handler, but left in an unconditional wake_up_process() on that handler at resume-time.

In addition, the check for MMC_CAP_SDIO_IRQ capability is added before enable sdio IRQ.

---
 drivers/mmc/core/sdio.c     |   14 ++++++++++++--
 drivers/mmc/core/sdio_irq.c |    4 ++--
 2 files changed, 14 insertions(+), 4 deletions(-)
drivers/mmc/core/sdio.c +0 -0
index e636d9e..e04a540 100644
@@ -992,8 +992,18 @@ static int mmc_sdio_resume(struct mmc_host *host)
                }
        }
 
Quoted 9 lines

drivers/mmc/core/sdio.c static int mmc_sdio_resume(struct mmc_host *host)

Quoted 7 lines
drivers/mmc/core/sdio.c +5 -2
-       if (!err && host->sdio_irqs)
-               wake_up_process(host->sdio_irq_thread);
+       if (!err && host->sdio_irqs) {
+               if (!(host->caps2 & MMC_CAP2_SDIO_IRQ_NOTHREAD)) {
+                       wake_up_process(host->sdio_irq_thread);
+               } else if (host->caps & MMC_CAP_SDIO_IRQ) {
+                       mmc_release_host(host);

Why mmc_release_host() and the corresponding mmc_claim_host() below? Those shouldn't be needed I think.

You are right. These two functions shouldn't be invoked here. I made a new patch as above.

Thanks,
Zhonghui

Quoted 45 lines
Quoted 27 lines
drivers/mmc/core/sdio.c +7 -0
+                       mmc_host_clk_hold(host);
+                       host->ops->enable_sdio_irq(host, 1);
+                       mmc_host_clk_release(host);
+                       mmc_claim_host(host);
+               }
+       }
+
        mmc_release_host(host);
 
        host->pm_flags &= ~MMC_PM_KEEP_POWER;
drivers/mmc/core/sdio_irq.c +1 -1
index 5cc13c8..696eca4 100644
@@ -208,7 +208,7 @@ static int sdio_card_irq_get(struct mmc_card *card)
                                host->sdio_irqs--;
                                return err;
                        }
-               } else {
+               } else if (host->caps & MMC_CAP_SDIO_IRQ) {
                        mmc_host_clk_hold(host);
                        host->ops->enable_sdio_irq(host, 1);
                        mmc_host_clk_release(host);

drivers/mmc/core/sdio_irq.c static int sdio_card_irq_put(struct mmc_card *card)

Quoted 9 lines
drivers/mmc/core/sdio_irq.c +1 -2
@@ -229,7 +229,7 @@ static int sdio_card_irq_put(struct mmc_card *card)
                if (!(host->caps2 & MMC_CAP2_SDIO_IRQ_NOTHREAD)) {
                        atomic_set(&host->sdio_irq_thread_abort, 1);
                        kthread_stop(host->sdio_irq_thread);
-               } else {
+               } else if (host->caps & MMC_CAP_SDIO_IRQ) {
                        mmc_host_clk_hold(host);
                        host->ops->enable_sdio_irq(host, 0);
                        mmc_host_clk_release(host);
-- 1.7.1

Thanks for working on this!

Kind regards
Uffe
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/

#4 lore raw

Many thanks for your helps.

Thanks,
Zhonghui

Quoted 171 lines · Ulf Hansson
Quoted 11 lines · Zhonghui

From 21266249bbbaf9407c1e88cd5950e06ac88aeebf Mon Sep 17 00:00:00 2001
From: Fu Zhonghui <[email protected]>
Date: Mon, 18 Aug 2014 10:48:14 +0800
Subject: [PATCH] mmc: core: sdio: Fix unconditional wake_up_process() on sdio thread

781e989cf59 ("mmc: sdhci: convert to new SDIO IRQ handling") and bf3b5ec66bd ("mmc: sdio_irq: rework sdio irq handling") disabled the use of our own custom threaded IRQ handler, but left in an unconditional wake_up_process() on that handler at resume-time.

Quoted 7 lines

In addition, the check for MMC_CAP_SDIO_IRQ capability is added before enable sdio IRQ.

Thanks! Applied for next and added a stable tag for v3.16+.

Kind regards
Uffe

Quoted 93 lines
---
 drivers/mmc/core/sdio.c     |   12 ++++++++++--
 drivers/mmc/core/sdio_irq.c |    4 ++--
 2 files changed, 12 insertions(+), 4 deletions(-)
drivers/mmc/core/sdio.c +10 -2
index e636d9e..3fc40a7 100644
@@ -992,8 +992,16 @@ static int mmc_sdio_resume(struct mmc_host *host)
                }
        }
 
-       if (!err && host->sdio_irqs)
-               wake_up_process(host->sdio_irq_thread);
+       if (!err && host->sdio_irqs) {
+               if (!(host->caps2 & MMC_CAP2_SDIO_IRQ_NOTHREAD)) {
+                       wake_up_process(host->sdio_irq_thread);
+               } else if (host->caps & MMC_CAP_SDIO_IRQ) {
+                       mmc_host_clk_hold(host);
+                       host->ops->enable_sdio_irq(host, 1);
+                       mmc_host_clk_release(host);
+               }
+       }
+
        mmc_release_host(host);
 
        host->pm_flags &= ~MMC_PM_KEEP_POWER;
drivers/mmc/core/sdio_irq.c +2 -3
index 5cc13c8..696eca4 100644
@@ -208,7 +208,7 @@ static int sdio_card_irq_get(struct mmc_card *card)
                                host->sdio_irqs--;
                                return err;
                        }
-               } else {
+               } else if (host->caps & MMC_CAP_SDIO_IRQ) {
                        mmc_host_clk_hold(host);
                        host->ops->enable_sdio_irq(host, 1);
                        mmc_host_clk_release(host);
@@ -229,7 +229,7 @@ static int sdio_card_irq_put(struct mmc_card *card)
                if (!(host->caps2 & MMC_CAP2_SDIO_IRQ_NOTHREAD)) {
                        atomic_set(&host->sdio_irq_thread_abort, 1);
                        kthread_stop(host->sdio_irq_thread);
-               } else {
+               } else if (host->caps & MMC_CAP_SDIO_IRQ) {
                        mmc_host_clk_hold(host);
                        host->ops->enable_sdio_irq(host, 0);
                        mmc_host_clk_release(host);
-- 1.7.1
Quoted 31 lines · Ulf Hansson
Quoted 30 lines · Zhonghui

From 6cee984e1d76ba0a3320430f8cf4318ab65fcf06 Mon Sep 17 00:00:00 2001
From: Fu Zhonghui <[email protected]>
Date: Tue, 5 Aug 2014 12:44:38 +0800
Subject: [PATCH] mmc: core: sdio: Fix unconditional wake_up_process() on sdio thread

781e989cf59 ("mmc: sdhci: convert to new SDIO IRQ handling") and bf3b5ec66bd ("mmc: sdio_irq: rework sdio irq handling") disabled the use of our own custom threaded IRQ handler, but left in an unconditional wake_up_process() on that handler at resume-time.

In addition, the check for MMC_CAP_SDIO_IRQ capability is added before enable sdio IRQ.

---
 drivers/mmc/core/sdio.c     |   14 ++++++++++++--
 drivers/mmc/core/sdio_irq.c |    4 ++--
 2 files changed, 14 insertions(+), 4 deletions(-)
drivers/mmc/core/sdio.c +0 -0
index e636d9e..e04a540 100644
@@ -992,8 +992,18 @@ static int mmc_sdio_resume(struct mmc_host *host)
                }
        }
 
Quoted 9 lines

drivers/mmc/core/sdio.c static int mmc_sdio_resume(struct mmc_host *host)

Quoted 7 lines
drivers/mmc/core/sdio.c +5 -2
-       if (!err && host->sdio_irqs)
-               wake_up_process(host->sdio_irq_thread);
+       if (!err && host->sdio_irqs) {
+               if (!(host->caps2 & MMC_CAP2_SDIO_IRQ_NOTHREAD)) {
+                       wake_up_process(host->sdio_irq_thread);
+               } else if (host->caps & MMC_CAP_SDIO_IRQ) {
+                       mmc_release_host(host);

Why mmc_release_host() and the corresponding mmc_claim_host() below? Those shouldn't be needed I think.

Quoted 49 lines

You are right. These two functions shouldn't be invoked here. I made a new patch as above.

Thanks,
Zhonghui

Quoted 44 lines
Quoted 26 lines
drivers/mmc/core/sdio.c +7 -0
+                       mmc_host_clk_hold(host);
+                       host->ops->enable_sdio_irq(host, 1);
+                       mmc_host_clk_release(host);
+                       mmc_claim_host(host);
+               }
+       }
+
        mmc_release_host(host);
 
        host->pm_flags &= ~MMC_PM_KEEP_POWER;
drivers/mmc/core/sdio_irq.c +1 -1
index 5cc13c8..696eca4 100644
@@ -208,7 +208,7 @@ static int sdio_card_irq_get(struct mmc_card *card)
                                host->sdio_irqs--;
                                return err;
                        }
-               } else {
+               } else if (host->caps & MMC_CAP_SDIO_IRQ) {
                        mmc_host_clk_hold(host);
                        host->ops->enable_sdio_irq(host, 1);
                        mmc_host_clk_release(host);

drivers/mmc/core/sdio_irq.c static int sdio_card_irq_put(struct mmc_card *card)

Quoted 9 lines
drivers/mmc/core/sdio_irq.c +1 -2
@@ -229,7 +229,7 @@ static int sdio_card_irq_put(struct mmc_card *card)
                if (!(host->caps2 & MMC_CAP2_SDIO_IRQ_NOTHREAD)) {
                        atomic_set(&host->sdio_irq_thread_abort, 1);
                        kthread_stop(host->sdio_irq_thread);
-               } else {
+               } else if (host->caps & MMC_CAP_SDIO_IRQ) {
                        mmc_host_clk_hold(host);
                        host->ops->enable_sdio_irq(host, 0);
                        mmc_host_clk_release(host);
-- 1.7.1

Thanks for working on this!

Kind regards
Uffe
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/

#5 lore raw

Hi,Uffe

Could you please tell me into which git repository this patch is merged now?

Thanks,
Zhonghui

Quoted 180 lines · Zhonghui

Many thanks for your helps.

Thanks,
Zhonghui

Quoted 170 lines · Ulf Hansson
Quoted 11 lines · Zhonghui

From 21266249bbbaf9407c1e88cd5950e06ac88aeebf Mon Sep 17 00:00:00 2001
From: Fu Zhonghui <[email protected]>
Date: Mon, 18 Aug 2014 10:48:14 +0800
Subject: [PATCH] mmc: core: sdio: Fix unconditional wake_up_process() on sdio thread

781e989cf59 ("mmc: sdhci: convert to new SDIO IRQ handling") and bf3b5ec66bd ("mmc: sdio_irq: rework sdio irq handling") disabled the use of our own custom threaded IRQ handler, but left in an unconditional wake_up_process() on that handler at resume-time.

Quoted 7 lines

In addition, the check for MMC_CAP_SDIO_IRQ capability is added before enable sdio IRQ.

Thanks! Applied for next and added a stable tag for v3.16+.

Kind regards
Uffe

Quoted 93 lines
---
 drivers/mmc/core/sdio.c     |   12 ++++++++++--
 drivers/mmc/core/sdio_irq.c |    4 ++--
 2 files changed, 12 insertions(+), 4 deletions(-)
drivers/mmc/core/sdio.c +10 -2
index e636d9e..3fc40a7 100644
@@ -992,8 +992,16 @@ static int mmc_sdio_resume(struct mmc_host *host)
                }
        }
 
-       if (!err && host->sdio_irqs)
-               wake_up_process(host->sdio_irq_thread);
+       if (!err && host->sdio_irqs) {
+               if (!(host->caps2 & MMC_CAP2_SDIO_IRQ_NOTHREAD)) {
+                       wake_up_process(host->sdio_irq_thread);
+               } else if (host->caps & MMC_CAP_SDIO_IRQ) {
+                       mmc_host_clk_hold(host);
+                       host->ops->enable_sdio_irq(host, 1);
+                       mmc_host_clk_release(host);
+               }
+       }
+
        mmc_release_host(host);
 
        host->pm_flags &= ~MMC_PM_KEEP_POWER;
drivers/mmc/core/sdio_irq.c +2 -3
index 5cc13c8..696eca4 100644
@@ -208,7 +208,7 @@ static int sdio_card_irq_get(struct mmc_card *card)
                                host->sdio_irqs--;
                                return err;
                        }
-               } else {
+               } else if (host->caps & MMC_CAP_SDIO_IRQ) {
                        mmc_host_clk_hold(host);
                        host->ops->enable_sdio_irq(host, 1);
                        mmc_host_clk_release(host);
@@ -229,7 +229,7 @@ static int sdio_card_irq_put(struct mmc_card *card)
                if (!(host->caps2 & MMC_CAP2_SDIO_IRQ_NOTHREAD)) {
                        atomic_set(&host->sdio_irq_thread_abort, 1);
                        kthread_stop(host->sdio_irq_thread);
-               } else {
+               } else if (host->caps & MMC_CAP_SDIO_IRQ) {
                        mmc_host_clk_hold(host);
                        host->ops->enable_sdio_irq(host, 0);
                        mmc_host_clk_release(host);
-- 1.7.1
Quoted 31 lines · Ulf Hansson
Quoted 30 lines · Zhonghui

From 6cee984e1d76ba0a3320430f8cf4318ab65fcf06 Mon Sep 17 00:00:00 2001
From: Fu Zhonghui <[email protected]>
Date: Tue, 5 Aug 2014 12:44:38 +0800
Subject: [PATCH] mmc: core: sdio: Fix unconditional wake_up_process() on sdio thread

781e989cf59 ("mmc: sdhci: convert to new SDIO IRQ handling") and bf3b5ec66bd ("mmc: sdio_irq: rework sdio irq handling") disabled the use of our own custom threaded IRQ handler, but left in an unconditional wake_up_process() on that handler at resume-time.

In addition, the check for MMC_CAP_SDIO_IRQ capability is added before enable sdio IRQ.

---
 drivers/mmc/core/sdio.c     |   14 ++++++++++++--
 drivers/mmc/core/sdio_irq.c |    4 ++--
 2 files changed, 14 insertions(+), 4 deletions(-)
drivers/mmc/core/sdio.c +0 -0
index e636d9e..e04a540 100644
@@ -992,8 +992,18 @@ static int mmc_sdio_resume(struct mmc_host *host)
                }
        }
 
Quoted 9 lines

drivers/mmc/core/sdio.c static int mmc_sdio_resume(struct mmc_host *host)

Quoted 7 lines
drivers/mmc/core/sdio.c +5 -2
-       if (!err && host->sdio_irqs)
-               wake_up_process(host->sdio_irq_thread);
+       if (!err && host->sdio_irqs) {
+               if (!(host->caps2 & MMC_CAP2_SDIO_IRQ_NOTHREAD)) {
+                       wake_up_process(host->sdio_irq_thread);
+               } else if (host->caps & MMC_CAP_SDIO_IRQ) {
+                       mmc_release_host(host);

Why mmc_release_host() and the corresponding mmc_claim_host() below? Those shouldn't be needed I think.

Quoted 48 lines

You are right. These two functions shouldn't be invoked here. I made a new patch as above.

Thanks,
Zhonghui

Quoted 43 lines
Quoted 25 lines
drivers/mmc/core/sdio.c +7 -0
+                       mmc_host_clk_hold(host);
+                       host->ops->enable_sdio_irq(host, 1);
+                       mmc_host_clk_release(host);
+                       mmc_claim_host(host);
+               }
+       }
+
        mmc_release_host(host);
 
        host->pm_flags &= ~MMC_PM_KEEP_POWER;
drivers/mmc/core/sdio_irq.c +1 -1
index 5cc13c8..696eca4 100644
@@ -208,7 +208,7 @@ static int sdio_card_irq_get(struct mmc_card *card)
                                host->sdio_irqs--;
                                return err;
                        }
-               } else {
+               } else if (host->caps & MMC_CAP_SDIO_IRQ) {
                        mmc_host_clk_hold(host);
                        host->ops->enable_sdio_irq(host, 1);
                        mmc_host_clk_release(host);

drivers/mmc/core/sdio_irq.c static int sdio_card_irq_put(struct mmc_card *card)

Quoted 9 lines
drivers/mmc/core/sdio_irq.c +1 -2
@@ -229,7 +229,7 @@ static int sdio_card_irq_put(struct mmc_card *card)
                if (!(host->caps2 & MMC_CAP2_SDIO_IRQ_NOTHREAD)) {
                        atomic_set(&host->sdio_irq_thread_abort, 1);
                        kthread_stop(host->sdio_irq_thread);
-               } else {
+               } else if (host->caps & MMC_CAP_SDIO_IRQ) {
                        mmc_host_clk_hold(host);
                        host->ops->enable_sdio_irq(host, 0);
                        mmc_host_clk_release(host);
-- 1.7.1

Thanks for working on this!

Kind regards
Uffe
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/

#6 lore raw

Hi,

Quoted 4 lines · Zhonghui

Hi,Uffe

Could you please tell me into which git repository this patch is merged now?

I knew it was merged into Ulf's git repository.
You can refer to below git.

url = http://git.linaro.org/git/people/ulf.hansson/mmc.git

Best Regards,
Jaehoon Chung

Quoted 191 lines

Thanks,
Zhonghui

Quoted 180 lines · Zhonghui

Many thanks for your helps.

Thanks,
Zhonghui

Quoted 170 lines · Ulf Hansson
Quoted 11 lines · Zhonghui

From 21266249bbbaf9407c1e88cd5950e06ac88aeebf Mon Sep 17 00:00:00 2001
From: Fu Zhonghui <[email protected]>
Date: Mon, 18 Aug 2014 10:48:14 +0800
Subject: [PATCH] mmc: core: sdio: Fix unconditional wake_up_process() on sdio thread

781e989cf59 ("mmc: sdhci: convert to new SDIO IRQ handling") and bf3b5ec66bd ("mmc: sdio_irq: rework sdio irq handling") disabled the use of our own custom threaded IRQ handler, but left in an unconditional wake_up_process() on that handler at resume-time.

Quoted 7 lines

In addition, the check for MMC_CAP_SDIO_IRQ capability is added before enable sdio IRQ.

Thanks! Applied for next and added a stable tag for v3.16+.

Kind regards
Uffe

Quoted 93 lines
---
 drivers/mmc/core/sdio.c     |   12 ++++++++++--
 drivers/mmc/core/sdio_irq.c |    4 ++--
 2 files changed, 12 insertions(+), 4 deletions(-)
drivers/mmc/core/sdio.c +10 -2
index e636d9e..3fc40a7 100644
@@ -992,8 +992,16 @@ static int mmc_sdio_resume(struct mmc_host *host)
                }
        }
 
-       if (!err && host->sdio_irqs)
-               wake_up_process(host->sdio_irq_thread);
+       if (!err && host->sdio_irqs) {
+               if (!(host->caps2 & MMC_CAP2_SDIO_IRQ_NOTHREAD)) {
+                       wake_up_process(host->sdio_irq_thread);
+               } else if (host->caps & MMC_CAP_SDIO_IRQ) {
+                       mmc_host_clk_hold(host);
+                       host->ops->enable_sdio_irq(host, 1);
+                       mmc_host_clk_release(host);
+               }
+       }
+
        mmc_release_host(host);
 
        host->pm_flags &= ~MMC_PM_KEEP_POWER;
drivers/mmc/core/sdio_irq.c +2 -3
index 5cc13c8..696eca4 100644
@@ -208,7 +208,7 @@ static int sdio_card_irq_get(struct mmc_card *card)
                                host->sdio_irqs--;
                                return err;
                        }
-               } else {
+               } else if (host->caps & MMC_CAP_SDIO_IRQ) {
                        mmc_host_clk_hold(host);
                        host->ops->enable_sdio_irq(host, 1);
                        mmc_host_clk_release(host);
@@ -229,7 +229,7 @@ static int sdio_card_irq_put(struct mmc_card *card)
                if (!(host->caps2 & MMC_CAP2_SDIO_IRQ_NOTHREAD)) {
                        atomic_set(&host->sdio_irq_thread_abort, 1);
                        kthread_stop(host->sdio_irq_thread);
-               } else {
+               } else if (host->caps & MMC_CAP_SDIO_IRQ) {
                        mmc_host_clk_hold(host);
                        host->ops->enable_sdio_irq(host, 0);
                        mmc_host_clk_release(host);
-- 1.7.1
Quoted 31 lines · Ulf Hansson
Quoted 30 lines · Zhonghui

From 6cee984e1d76ba0a3320430f8cf4318ab65fcf06 Mon Sep 17 00:00:00 2001
From: Fu Zhonghui <[email protected]>
Date: Tue, 5 Aug 2014 12:44:38 +0800
Subject: [PATCH] mmc: core: sdio: Fix unconditional wake_up_process() on sdio thread

781e989cf59 ("mmc: sdhci: convert to new SDIO IRQ handling") and bf3b5ec66bd ("mmc: sdio_irq: rework sdio irq handling") disabled the use of our own custom threaded IRQ handler, but left in an unconditional wake_up_process() on that handler at resume-time.

In addition, the check for MMC_CAP_SDIO_IRQ capability is added before enable sdio IRQ.

---
 drivers/mmc/core/sdio.c     |   14 ++++++++++++--
 drivers/mmc/core/sdio_irq.c |    4 ++--
 2 files changed, 14 insertions(+), 4 deletions(-)
drivers/mmc/core/sdio.c +0 -0
index e636d9e..e04a540 100644
@@ -992,8 +992,18 @@ static int mmc_sdio_resume(struct mmc_host *host)
                }
        }
 
Quoted 9 lines

drivers/mmc/core/sdio.c static int mmc_sdio_resume(struct mmc_host *host)

Quoted 7 lines
drivers/mmc/core/sdio.c +5 -2
-       if (!err && host->sdio_irqs)
-               wake_up_process(host->sdio_irq_thread);
+       if (!err && host->sdio_irqs) {
+               if (!(host->caps2 & MMC_CAP2_SDIO_IRQ_NOTHREAD)) {
+                       wake_up_process(host->sdio_irq_thread);
+               } else if (host->caps & MMC_CAP_SDIO_IRQ) {
+                       mmc_release_host(host);

Why mmc_release_host() and the corresponding mmc_claim_host() below? Those shouldn't be needed I think.

Quoted 48 lines

You are right. These two functions shouldn't be invoked here. I made a new patch as above.

Thanks,
Zhonghui

Quoted 43 lines
Quoted 25 lines
drivers/mmc/core/sdio.c +7 -0
+                       mmc_host_clk_hold(host);
+                       host->ops->enable_sdio_irq(host, 1);
+                       mmc_host_clk_release(host);
+                       mmc_claim_host(host);
+               }
+       }
+
        mmc_release_host(host);
 
        host->pm_flags &= ~MMC_PM_KEEP_POWER;
drivers/mmc/core/sdio_irq.c +1 -1
index 5cc13c8..696eca4 100644
@@ -208,7 +208,7 @@ static int sdio_card_irq_get(struct mmc_card *card)
                                host->sdio_irqs--;
                                return err;
                        }
-               } else {
+               } else if (host->caps & MMC_CAP_SDIO_IRQ) {
                        mmc_host_clk_hold(host);
                        host->ops->enable_sdio_irq(host, 1);
                        mmc_host_clk_release(host);

drivers/mmc/core/sdio_irq.c static int sdio_card_irq_put(struct mmc_card *card)

Quoted 9 lines
drivers/mmc/core/sdio_irq.c +1 -2
@@ -229,7 +229,7 @@ static int sdio_card_irq_put(struct mmc_card *card)
                if (!(host->caps2 & MMC_CAP2_SDIO_IRQ_NOTHREAD)) {
                        atomic_set(&host->sdio_irq_thread_abort, 1);
                        kthread_stop(host->sdio_irq_thread);
-               } else {
+               } else if (host->caps & MMC_CAP_SDIO_IRQ) {
                        mmc_host_clk_hold(host);
                        host->ops->enable_sdio_irq(host, 0);
                        mmc_host_clk_release(host);
-- 1.7.1

Thanks for working on this!

Kind regards
Uffe
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/