| From cb04fc3b6b076f67d228a0b7d096c69ad486c09c Mon Sep 17 00:00:00 2001 |
| From: Takashi Iwai <tiwai@suse.de> |
| Date: Fri, 13 Dec 2019 09:51:10 +0100 |
| Subject: ALSA: hda/ca0132 - Avoid endless loop |
| |
| From: Takashi Iwai <tiwai@suse.de> |
| |
| commit cb04fc3b6b076f67d228a0b7d096c69ad486c09c upstream. |
| |
| Introduce a timeout to dspio_clear_response_queue() so that it won't |
| be caught in an endless loop even if the hardware doesn't respond |
| properly. |
| |
| Fixes: a73d511c4867 ("ALSA: hda/ca0132: Add unsol handler for DSP and jack detection") |
| Cc: <stable@vger.kernel.org> |
| Link: https://lore.kernel.org/r/20191213085111.22855-3-tiwai@suse.de |
| Signed-off-by: Takashi Iwai <tiwai@suse.de> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| sound/pci/hda/patch_ca0132.c | 5 +++-- |
| 1 file changed, 3 insertions(+), 2 deletions(-) |
| |
| --- a/sound/pci/hda/patch_ca0132.c |
| +++ b/sound/pci/hda/patch_ca0132.c |
| @@ -1271,13 +1271,14 @@ struct scp_msg { |
| |
| static void dspio_clear_response_queue(struct hda_codec *codec) |
| { |
| + unsigned long timeout = jiffies + msecs_to_jiffies(1000); |
| unsigned int dummy = 0; |
| - int status = -1; |
| + int status; |
| |
| /* clear all from the response queue */ |
| do { |
| status = dspio_read(codec, &dummy); |
| - } while (status == 0); |
| + } while (status == 0 && time_before(jiffies, timeout)); |
| } |
| |
| static int dspio_get_response_data(struct hda_codec *codec) |