aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMark Johnston <markj@FreeBSD.org>2023-09-27 12:23:58 +0000
committerMark Johnston <markj@FreeBSD.org>2023-10-04 13:43:14 +0000
commit32ca3712a8c4295d14770ad9cc55c1c837d834ad (patch)
treef0900aac63765952a419d3b3087a102c3bf261e6
parent46cc15529fbfee0df5a124a3221c4446f0902fe3 (diff)
hdac: Defer interrupt allocation in hdac_attach()
hdac_attach() registers an interrupt handler before allocating various driver resources which are accessed by the interrupt handler. On some platforms we observe what appear to be spurious interrupts upon a cold boot, resulting in panics. Partially work around the problem by deferring irq allocation until after other resources are allocated. I think this is not a complete solution, but is correct and sufficient to work around the problems reported in the PR. PR: 268393 Tested by: Alexander Sherikov <asherikov@yandex.com> Tested by: Oleh Hushchenkov <o.hushchenkov@gmail.com> MFC after: 1 week Differential Revision: https://reviews.freebsd.org/D41883 (cherry picked from commit 015daf5221f7588b9258fe0242cee09bde39fe21)
-rw-r--r--sys/dev/sound/pci/hda/hdac.c7
1 files changed, 4 insertions, 3 deletions
diff --git a/sys/dev/sound/pci/hda/hdac.c b/sys/dev/sound/pci/hda/hdac.c
index 82b1baacfa98..3d2c4001d68d 100644
--- a/sys/dev/sound/pci/hda/hdac.c
+++ b/sys/dev/sound/pci/hda/hdac.c
@@ -1274,9 +1274,6 @@ hdac_attach(device_t dev)
result = hdac_mem_alloc(sc);
if (result != 0)
goto hdac_attach_fail;
- result = hdac_irq_alloc(sc);
- if (result != 0)
- goto hdac_attach_fail;
/* Get Capabilities */
result = hdac_get_capabilities(sc);
@@ -1349,6 +1346,10 @@ hdac_attach(device_t dev)
hdac_corb_init(sc);
hdac_rirb_init(sc);
+ result = hdac_irq_alloc(sc);
+ if (result != 0)
+ goto hdac_attach_fail;
+
/* Defer remaining of initialization until interrupts are enabled */
sc->intrhook.ich_func = hdac_attach2;
sc->intrhook.ich_arg = (void *)sc;