Re: Bug report: probe of AMDI0040:00 failed with error -16

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Tuesday, March 19, 2024 5:20:41 PM CET Adrian Hunter wrote:
> On 19/03/24 16:43, Francisco Ayala Le Brun wrote:
> > Hello,
> > 
> > I would like to report a bug.
> > 
> > Issue description:
> > After updating a GHF51 SBC to a newer kernel version, the system was
> 
> What was the older / working kernel version?  Are you able
> to git bisect?
> 
> > no longer able to boot. Running the "lsblk" command in the recovery
> > console showed no mmc storage detected.
> > 
> > System Information:
> > OS: Fedora 40 x86_64
> > Kernel: 6.8.0-0.rc6.49.fc40.x86_64
> > 
> > Relevant Logs:
> 
> Really no error / fail messages before the stack dump?
> 
> > [   10.920756] Call Trace:
> > [   10.920763]  <TASK>
> > [   10.920771]  dump_stack_lvl+0x4d/0x70
> > [   10.920786]  __setup_irq+0x530/0x6c0
> > [   10.920801]  request_threaded_irq+0xe5/0x180
> > [   10.920813]  ? __pfx_sdhci_thread_irq+0x10/0x10 [sdhci]
> > [   10.920843]  __sdhci_add_host+0x108/0x360 [sdhci]
> > [   10.920871]  sdhci_acpi_probe+0x3a8/0x500 [sdhci_acpi]
> > [   10.920894]  platform_probe+0x44/0xa0
> > [   10.920908]  really_probe+0x19e/0x3e0
> > [   10.930244]  __driver_probe_device+0x78/0x160
> > [   10.930264]  driver_probe_device+0x1f/0xa0
> > [   10.930273]  __driver_attach_async_helper+0x5e/0xe0
> > [   10.930284]  async_run_entry_fn+0x34/0x130
> > [   10.930296]  process_one_work+0x170/0x330
> > [   10.930309]  worker_thread+0x273/0x3c0
> > [   10.934639]  ? __pfx_worker_thread+0x10/0x10
> > [   10.934654]  kthread+0xe8/0x120
> > [   10.934663]  ? __pfx_kthread+0x10/0x10
> > [   10.934671]  ret_from_fork+0x34/0x50
> > [   10.934681]  ? __pfx_kthread+0x10/0x10
> > [   10.934688]  ret_from_fork_asm+0x1b/0x30
> > [   10.934708]  </TASK>
> > [   10.940978] mmc0: Failed to request IRQ 7: -16
> > [   10.943885] sdhci-acpi: probe of AMDI0040:00 failed with error -16
> 
> 16 is EBUSY which seems to be used by __setup_irq() for
> irq mismatch

Would you be able to test the patch below and see if it helps?

---
 drivers/pinctrl/pinctrl-amd.c |    2 +-
 include/linux/interrupt.h     |    5 ++++-
 kernel/irq/manage.c           |   13 +++++++++++--
 3 files changed, 16 insertions(+), 4 deletions(-)

Index: linux-pm/include/linux/interrupt.h
===================================================================
--- linux-pm.orig/include/linux/interrupt.h
+++ linux-pm/include/linux/interrupt.h
@@ -67,6 +67,8 @@
  *                later.
  * IRQF_NO_DEBUG - Exclude from runnaway detection for IPI and similar handlers,
  *		   depends on IRQF_PERCPU.
+ * IRQF_COND_ONESHOT - Agree to do IRQF_ONESHOT if already set for a shared
+ *                 interrupt.
  */
 #define IRQF_SHARED		0x00000080
 #define IRQF_PROBE_SHARED	0x00000100
@@ -82,6 +84,7 @@
 #define IRQF_COND_SUSPEND	0x00040000
 #define IRQF_NO_AUTOEN		0x00080000
 #define IRQF_NO_DEBUG		0x00100000
+#define IRQF_COND_ONESHOT	0x00200000
 
 #define IRQF_TIMER		(__IRQF_TIMER | IRQF_NO_SUSPEND | IRQF_NO_THREAD)
 
@@ -784,7 +787,7 @@ extern void tasklet_setup(struct tasklet
  * if more than one irq occurred.
  */
 
-#if !defined(CONFIG_GENERIC_IRQ_PROBE) 
+#if !defined(CONFIG_GENERIC_IRQ_PROBE)
 static inline unsigned long probe_irq_on(void)
 {
 	return 0;
Index: linux-pm/kernel/irq/manage.c
===================================================================
--- linux-pm.orig/kernel/irq/manage.c
+++ linux-pm/kernel/irq/manage.c
@@ -1642,8 +1642,14 @@ __setup_irq(unsigned int irq, struct irq
 		}
 
 		if (!((old->flags & new->flags) & IRQF_SHARED) ||
-		    (oldtype != (new->flags & IRQF_TRIGGER_MASK)) ||
-		    ((old->flags ^ new->flags) & IRQF_ONESHOT))
+		    (oldtype != (new->flags & IRQF_TRIGGER_MASK)))
+			goto mismatch;
+
+		if ((old->flags & IRQF_ONESHOT) &&
+		    (new->flags & IRQF_COND_ONESHOT))
+			new->flags |= IRQF_ONESHOT;
+
+		if ((old->flags ^ new->flags) & IRQF_ONESHOT)
 			goto mismatch;
 
 		/* All handlers must agree on per-cpuness */
@@ -1665,6 +1671,9 @@ __setup_irq(unsigned int irq, struct irq
 		shared = 1;
 	}
 
+	/* IRQF_COND_ONESHOT has no meaning from now on, so clear it. */
+	new->flags &= ~IRQF_COND_ONESHOT;
+
 	/*
 	 * Setup the thread mask for this irqaction for ONESHOT. For
 	 * !ONESHOT irqs the thread mask is 0 so we can avoid a
Index: linux-pm/drivers/pinctrl/pinctrl-amd.c
===================================================================
--- linux-pm.orig/drivers/pinctrl/pinctrl-amd.c
+++ linux-pm/drivers/pinctrl/pinctrl-amd.c
@@ -1159,7 +1159,7 @@ static int amd_gpio_probe(struct platfor
 	}
 
 	ret = devm_request_irq(&pdev->dev, gpio_dev->irq, amd_gpio_irq_handler,
-			       IRQF_SHARED | IRQF_ONESHOT, KBUILD_MODNAME, gpio_dev);
+			       IRQF_SHARED | IRQF_COND_ONESHOT, KBUILD_MODNAME, gpio_dev);
 	if (ret)
 		goto out2;
 








[Index of Archives]     [Linux IBM ACPI]     [Linux Power Management]     [Linux Kernel]     [Linux Laptop]     [Kernel Newbies]     [Share Photos]     [Security]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Samba]     [Video 4 Linux]     [Device Mapper]     [Linux Resources]
  Powered by Linux