[<prev] [next>] [thread-next>] [day] [month] [year] [list]
Message-Id: <20240228074138.23679-1-soxiebing@163.com>
Date: Wed, 28 Feb 2024 15:41:38 +0800
From: songxiebing <soxiebing@....com>
To: tiwai@...e.com
Cc: alsa-devel@...a-project.org,
linux-kernel@...r.kernel.org,
songxiebing <songxiebing@...inos.cn>
Subject: [PATCH v1] ALSA: hda: optimize the probe codec process
From: songxiebing <songxiebing@...inos.cn>
In azx_probe_codecs function,when bus->codec_mask is becomes to 0(no codecs),
execute azx_init_chip, bus->codec_mask will be initialized to a value again,
this causes snd_hda_codec_new function to run, the process is as follows:
-->snd_hda_codec_new
-->snd_hda_codec_device_init
-->snd_hdac_device_init---snd_hdac_read_parm(...AC_PAR_VENDOR_ID) 2s
---snd_hdac_read_parm(...AC_PAR_VENDOR_ID) 2s
---snd_hdac_read_parm(...AC_PAR_SUBSYSTEM_ID) 2s
---snd_hdac_read_parm(...AC_PAR_REV_ID) 2s
---snd_hdac_read_parm(...AC_PAR_NODE_COUNT) 2s
when no codecs, read communication is error, each command will be polled for
2 second,a total of 10s, it is easy to some problem.
like this:
2 [ 14.833404][ 6] [ T164] hda 0006:00: Codec #0 probe error; disabling it...
3 [ 14.844178][ 6] [ T164] hda 0006:00: codec_mask = 0x1
4 [ 14.880532][ 6] [ T164] hda 0006:00: too slow response, last cmd=0x0f0000
5 [ 15.891988][ 6] [ T164] hda 0006:00: too slow response, last cmd=0x0f0000
6 [ 16.978090][ 6] [ T164] hda 0006:00: too slow response, last cmd=0x0f0001
7 [ 18.140895][ 6] [ T164] hda 0006:00: too slow response, last cmd=0x0f0002
8 [ 19.135516][ 6] [ T164] hda 0006:00: too slow response, last cmd=0x0f0004
10 [ 19.900086][ 6] [ T164] hda 0006:00: no codecs initialized
11 [ 45.573398][ 2] [ C2] watchdog: BUG: soft lockup - CPU#2 stuck for 22s! [kworker/2:0:25]
Here, when bus->codec_mask is 0, use a direct break to avoid execute snd_hda_codec_new function.
Signed-off-by: songxiebing <songxiebing@...inos.cn>
---
sound/pci/hda/hda_controller.c | 3 +++
1 file changed, 3 insertions(+)
diff --git a/sound/pci/hda/hda_controller.c b/sound/pci/hda/hda_controller.c
index e5c53ad..e1ece0a 100644
--- a/sound/pci/hda/hda_controller.c
+++ b/sound/pci/hda/hda_controller.c
@@ -1474,6 +1474,9 @@ int azx_probe_codecs(struct azx *chip, unsigned int max_slots)
dev_warn(chip->card->dev,
"Codec #%d probe error; disabling it...\n", c);
bus->codec_mask &= ~(1 << c);
+ /* no codecs */
+ if (bus->codec_mask == 0)
+ break;
/* More badly, accessing to a non-existing
* codec often screws up the controller chip,
* and disturbs the further communications.
--
2.7.4
Powered by blists - more mailing lists