Commit 12eeeb4f authored by Yong Zhi's avatar Yong Zhi Committed by Mark Brown

ASoC: Intel: Skylake: Acquire irq after RIRB allocation

Cold reboot stress test found that the hda irq could access rirb ring
buffer before its memory gets allocated which resulting in null
pointer dereference inside snd_hdac_bus_update_rirb().

Fix it by moving the skl_acquire_irq after ring buffer allocation.
While here, also change err return from -EBUSY to actual error code.
Signed-off-by: default avatarYong Zhi <yong.zhi@intel.com>
Acked-by: default avatarPierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Signed-off-by: default avatarMark Brown <broonie@kernel.org>
parent fb504caa
...@@ -838,11 +838,7 @@ static int skl_first_init(struct hdac_bus *bus) ...@@ -838,11 +838,7 @@ static int skl_first_init(struct hdac_bus *bus)
snd_hdac_bus_parse_capabilities(bus); snd_hdac_bus_parse_capabilities(bus);
if (skl_acquire_irq(bus, 0) < 0)
return -EBUSY;
pci_set_master(pci); pci_set_master(pci);
synchronize_irq(bus->irq);
gcap = snd_hdac_chip_readw(bus, GCAP); gcap = snd_hdac_chip_readw(bus, GCAP);
dev_dbg(bus->dev, "chipset global capabilities = 0x%x\n", gcap); dev_dbg(bus->dev, "chipset global capabilities = 0x%x\n", gcap);
...@@ -875,6 +871,12 @@ static int skl_first_init(struct hdac_bus *bus) ...@@ -875,6 +871,12 @@ static int skl_first_init(struct hdac_bus *bus)
if (err < 0) if (err < 0)
return err; return err;
err = skl_acquire_irq(bus, 0);
if (err < 0)
return err;
synchronize_irq(bus->irq);
/* initialize chip */ /* initialize chip */
skl_init_pci(skl); skl_init_pci(skl);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment