| From ef4764cbd1b858616809a8eb4b468ba7dc5c9ad8 Mon Sep 17 00:00:00 2001 |
| From: Takashi Iwai <tiwai@suse.de> |
| Date: Mon, 13 Apr 2020 10:20:29 +0200 |
| Subject: [PATCH] ALSA: hda: Don't release card at firmware loading error |
| |
| commit 25faa4bd37c10f19e4b848b9032a17a3d44c6f09 upstream. |
| |
| At the error path of the firmware loading error, the driver tries to |
| release the card object and set NULL to drvdata. This may be referred |
| badly at the possible PM action, as the driver itself is still bound |
| and the PM callbacks read the card object. |
| |
| Instead, we continue the probing as if it were no option set. This is |
| often a better choice than the forced abort, too. |
| |
| Fixes: 5cb543dba986 ("ALSA: hda - Deferred probing with request_firmware_nowait()") |
| BugLink: https://bugzilla.kernel.org/show_bug.cgi?id=207043 |
| Link: https://lore.kernel.org/r/20200413082034.25166-2-tiwai@suse.de |
| Signed-off-by: Takashi Iwai <tiwai@suse.de> |
| Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> |
| |
| diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c |
| index 90ad9504f7af..03813837e4fd 100644 |
| --- a/sound/pci/hda/hda_intel.c |
| +++ b/sound/pci/hda/hda_intel.c |
| @@ -1972,24 +1972,15 @@ static void azx_firmware_cb(const struct firmware *fw, void *context) |
| { |
| struct snd_card *card = context; |
| struct azx *chip = card->private_data; |
| - struct pci_dev *pci = chip->pci; |
| - |
| - if (!fw) { |
| - dev_err(card->dev, "Cannot load firmware, aborting\n"); |
| - goto error; |
| - } |
| |
| - chip->fw = fw; |
| + if (fw) |
| + chip->fw = fw; |
| + else |
| + dev_err(card->dev, "Cannot load firmware, continue without patching\n"); |
| if (!chip->disabled) { |
| /* continue probing */ |
| - if (azx_probe_continue(chip)) |
| - goto error; |
| + azx_probe_continue(chip); |
| } |
| - return; /* OK */ |
| - |
| - error: |
| - snd_card_free(card); |
| - pci_set_drvdata(pci, NULL); |
| } |
| #endif |
| |
| -- |
| 2.7.4 |
| |