Linux Sound subsystem development
 help / color / mirror / Atom feed
* [PATCH] ALSA: hda/realtek: add missing error checks in alc269 init/shutdown
@ 2026-07-29  6:38 songxiebing
  2026-07-29  7:35 ` Takashi Iwai
  2026-07-30  1:53 ` [PATCH v2] ALSA: hda/realtek: add missing error checks for COEF index reads in alc269 songxiebing
  0 siblings, 2 replies; 6+ messages in thread
From: songxiebing @ 2026-07-29  6:38 UTC (permalink / raw)
  To: tiwai, perex; +Cc: linux-sound, linux-kernel, songxiebing

From: Bob Song <songxiebing@kylinos.cn>

alc_read_coef_idx() and alc_read_coefex_idx() can return -1 on error
via snd_hda_codec_read(). Several init and shutdown functions save these
return values and later write them back to hardware registers without
checking for errors, potentially corrupting COEF register state on a
read failure.

Add error checks in:
- alc282_init() and alc282_shutup(): check coef78 before write-back
- alc285_hp_init(): check coef38/coef0d/coef36 before update, check
  val before write-back, and break polling loop on error
- alc294_hp_init(): break polling loop on read error

Also add a missing NULL check for codec->bus->pci in alc269_probe()
before dereferencing it, consistent with the existing checks in the
same function.

Signed-off-by: Bob Song <songxiebing@kylinos.cn>
---
 sound/hda/codecs/realtek/alc269.c | 23 +++++++++++++++--------
 1 file changed, 15 insertions(+), 8 deletions(-)

diff --git a/sound/hda/codecs/realtek/alc269.c b/sound/hda/codecs/realtek/alc269.c
index 379e1458f4ac..d751e39529a2 100644
--- a/sound/hda/codecs/realtek/alc269.c
+++ b/sound/hda/codecs/realtek/alc269.c
@@ -296,7 +296,8 @@ static void alc282_init(struct hda_codec *codec)
 		msleep(100);
 
 	/* Headphone capless set to normal mode */
-	alc_write_coef_idx(codec, 0x78, coef78);
+	if (coef78 != -1)
+		alc_write_coef_idx(codec, 0x78, coef78);
 }
 
 static void alc282_shutup(struct hda_codec *codec)
@@ -333,7 +334,8 @@ static void alc282_shutup(struct hda_codec *codec)
 
 	alc_auto_setup_eapd(codec, false);
 	alc_shutup_pins(codec);
-	alc_write_coef_idx(codec, 0x78, coef78);
+	if (coef78 != -1)
+		alc_write_coef_idx(codec, 0x78, coef78);
 }
 
 static const struct coef_fw alc283_coefs[] = {
@@ -585,15 +587,19 @@ static void alc285_hp_init(struct hda_codec *codec)
 
 	alc_write_coefex_idx(codec, 0x58, 0x00, 0xf888); /* HP depop procedure start */
 	val = alc_read_coefex_idx(codec, 0x58, 0x00);
-	for (i = 0; i < 20 && val & 0x8000; i++) {
+	for (i = 0; i < 20 && val != -1 && val & 0x8000; i++) {
 		msleep(50);
 		val = alc_read_coefex_idx(codec, 0x58, 0x00);
 	} /* Wait for depop procedure finish  */
 
-	alc_write_coefex_idx(codec, 0x58, 0x00, val); /* write back the result */
-	alc_update_coef_idx(codec, 0x38, 1<<4, coef38);
-	alc_update_coef_idx(codec, 0x0d, 0x110, coef0d);
-	alc_update_coef_idx(codec, 0x36, 3<<13, coef36);
+	if (val != -1)
+		alc_write_coefex_idx(codec, 0x58, 0x00, val); /* write back the result */
+	if (coef38 != -1)
+		alc_update_coef_idx(codec, 0x38, 1<<4, coef38);
+	if (coef0d != -1)
+		alc_update_coef_idx(codec, 0x0d, 0x110, coef0d);
+	if (coef36 != -1)
+		alc_update_coef_idx(codec, 0x36, 3<<13, coef36);
 
 	msleep(50);
 	alc_update_coef_idx(codec, 0x4a, 1<<15, 0);
@@ -858,7 +864,7 @@ static void alc294_hp_init(struct hda_codec *codec)
 
 	/* Wait for depop procedure finish  */
 	val = alc_read_coefex_idx(codec, 0x58, 0x01);
-	for (i = 0; i < 20 && val & 0x0080; i++) {
+	for (i = 0; i < 20 && val != -1 && val & 0x0080; i++) {
 		msleep(50);
 		val = alc_read_coefex_idx(codec, 0x58, 0x01);
 	}
@@ -8843,6 +8849,7 @@ static int alc269_probe(struct hda_codec *codec, const struct hda_device_id *id)
 		spec->init_hook = alc256_init;
 		spec->gen.mixer_nid = 0; /* ALC256 does not have any loopback mixer path */
 		if (codec->core.vendor_id == 0x10ec0236 &&
+		    codec->bus->pci &&
 		    codec->bus->pci->vendor != PCI_VENDOR_ID_AMD)
 			spec->en_3kpull_low = false;
 		break;
-- 
2.25.1


^ permalink raw reply related	[flat|nested] 6+ messages in thread

* Re: [PATCH] ALSA: hda/realtek: add missing error checks in alc269 init/shutdown
  2026-07-29  6:38 [PATCH] ALSA: hda/realtek: add missing error checks in alc269 init/shutdown songxiebing
@ 2026-07-29  7:35 ` Takashi Iwai
  2026-07-30  1:53 ` [PATCH v2] ALSA: hda/realtek: add missing error checks for COEF index reads in alc269 songxiebing
  1 sibling, 0 replies; 6+ messages in thread
From: Takashi Iwai @ 2026-07-29  7:35 UTC (permalink / raw)
  To: songxiebing; +Cc: tiwai, perex, linux-sound, linux-kernel

On Wed, 29 Jul 2026 08:38:03 +0200,
songxiebing wrote:
> 
> From: Bob Song <songxiebing@kylinos.cn>
> 
> alc_read_coef_idx() and alc_read_coefex_idx() can return -1 on error
> via snd_hda_codec_read(). Several init and shutdown functions save these
> return values and later write them back to hardware registers without
> checking for errors, potentially corrupting COEF register state on a
> read failure.
> 
> Add error checks in:
> - alc282_init() and alc282_shutup(): check coef78 before write-back
> - alc285_hp_init(): check coef38/coef0d/coef36 before update, check
>   val before write-back, and break polling loop on error
> - alc294_hp_init(): break polling loop on read error
> 
> Also add a missing NULL check for codec->bus->pci in alc269_probe()
> before dereferencing it, consistent with the existing checks in the
> same function.
> 
> Signed-off-by: Bob Song <songxiebing@kylinos.cn>

Could you split the NULL check to another patch?  Basically it's a
completely different sort of fix from others.


thanks,

Takashi

^ permalink raw reply	[flat|nested] 6+ messages in thread

* [PATCH v2] ALSA: hda/realtek: add missing error checks for COEF index reads in alc269
  2026-07-29  6:38 [PATCH] ALSA: hda/realtek: add missing error checks in alc269 init/shutdown songxiebing
  2026-07-29  7:35 ` Takashi Iwai
@ 2026-07-30  1:53 ` songxiebing
  2026-07-30  1:53   ` [PATCH v2] ALSA: hda/realtek: add missing NULL check for codec->bus->pci songxiebing
  2026-07-30  9:35   ` [PATCH v2] ALSA: hda/realtek: add missing error checks for COEF index reads in alc269 Takashi Iwai
  1 sibling, 2 replies; 6+ messages in thread
From: songxiebing @ 2026-07-30  1:53 UTC (permalink / raw)
  To: tiwai, perex; +Cc: linux-sound, linux-kernel, songxiebing

From: Bob Song <songxiebing@kylinos.cn>

alc_read_coef_idx() and alc_read_coefex_idx() can return -1 on error
via snd_hda_codec_read(). Several codec initialization and shutdown
functions save these return values and later write them back to
hardware registers without checking for errors, potentially corrupting
COEF register state on a read failure.

Add error checks in:
- alc282_init() and alc282_shutup(): check coef78 before write-back
- alc285_hp_init(): check coef38/coef0d/coef36 before update, check
  val before write-back, and break polling loop on error
- alc294_hp_init(): break polling loop on read error

Signed-off-by: Bob Song <songxiebing@kylinos.cn>
---
v2:
 - Separate processing of return values from reading COEF and
null pointer detection for device.
---
 sound/hda/codecs/realtek/alc269.c | 22 ++++++++++++++--------
 1 file changed, 14 insertions(+), 8 deletions(-)

diff --git a/sound/hda/codecs/realtek/alc269.c b/sound/hda/codecs/realtek/alc269.c
index 379e1458f4ac..4645793b64ac 100644
--- a/sound/hda/codecs/realtek/alc269.c
+++ b/sound/hda/codecs/realtek/alc269.c
@@ -296,7 +296,8 @@ static void alc282_init(struct hda_codec *codec)
 		msleep(100);
 
 	/* Headphone capless set to normal mode */
-	alc_write_coef_idx(codec, 0x78, coef78);
+	if (coef78 != -1)
+		alc_write_coef_idx(codec, 0x78, coef78);
 }
 
 static void alc282_shutup(struct hda_codec *codec)
@@ -333,7 +334,8 @@ static void alc282_shutup(struct hda_codec *codec)
 
 	alc_auto_setup_eapd(codec, false);
 	alc_shutup_pins(codec);
-	alc_write_coef_idx(codec, 0x78, coef78);
+	if (coef78 != -1)
+		alc_write_coef_idx(codec, 0x78, coef78);
 }
 
 static const struct coef_fw alc283_coefs[] = {
@@ -585,15 +587,19 @@ static void alc285_hp_init(struct hda_codec *codec)
 
 	alc_write_coefex_idx(codec, 0x58, 0x00, 0xf888); /* HP depop procedure start */
 	val = alc_read_coefex_idx(codec, 0x58, 0x00);
-	for (i = 0; i < 20 && val & 0x8000; i++) {
+	for (i = 0; i < 20 && val != -1 && val & 0x8000; i++) {
 		msleep(50);
 		val = alc_read_coefex_idx(codec, 0x58, 0x00);
 	} /* Wait for depop procedure finish  */
 
-	alc_write_coefex_idx(codec, 0x58, 0x00, val); /* write back the result */
-	alc_update_coef_idx(codec, 0x38, 1<<4, coef38);
-	alc_update_coef_idx(codec, 0x0d, 0x110, coef0d);
-	alc_update_coef_idx(codec, 0x36, 3<<13, coef36);
+	if (val != -1)
+		alc_write_coefex_idx(codec, 0x58, 0x00, val); /* write back the result */
+	if (coef38 != -1)
+		alc_update_coef_idx(codec, 0x38, 1<<4, coef38);
+	if (coef0d != -1)
+		alc_update_coef_idx(codec, 0x0d, 0x110, coef0d);
+	if (coef36 != -1)
+		alc_update_coef_idx(codec, 0x36, 3<<13, coef36);
 
 	msleep(50);
 	alc_update_coef_idx(codec, 0x4a, 1<<15, 0);
@@ -858,7 +864,7 @@ static void alc294_hp_init(struct hda_codec *codec)
 
 	/* Wait for depop procedure finish  */
 	val = alc_read_coefex_idx(codec, 0x58, 0x01);
-	for (i = 0; i < 20 && val & 0x0080; i++) {
+	for (i = 0; i < 20 && val != -1 && val & 0x0080; i++) {
 		msleep(50);
 		val = alc_read_coefex_idx(codec, 0x58, 0x01);
 	}
-- 
2.25.1


^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [PATCH v2] ALSA: hda/realtek: add missing NULL check for codec->bus->pci
  2026-07-30  1:53 ` [PATCH v2] ALSA: hda/realtek: add missing error checks for COEF index reads in alc269 songxiebing
@ 2026-07-30  1:53   ` songxiebing
  2026-07-30  9:35     ` Takashi Iwai
  2026-07-30  9:35   ` [PATCH v2] ALSA: hda/realtek: add missing error checks for COEF index reads in alc269 Takashi Iwai
  1 sibling, 1 reply; 6+ messages in thread
From: songxiebing @ 2026-07-30  1:53 UTC (permalink / raw)
  To: tiwai, perex; +Cc: linux-sound, linux-kernel, songxiebing

From: Bob Song <songxiebing@kylinos.cn>

In alc269_probe(), codec->bus->pci is dereferenced without a NULL check
for the ALC236 vendor ID case. Add the missing check, consistent with
the existing pattern used elsewhere in the same function.

Signed-off-by: Bob Song <songxiebing@kylinos.cn>
---
v2:
 - Separate processing of return values from reading COEF and
null pointer detection for device.
---
 sound/hda/codecs/realtek/alc269.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/sound/hda/codecs/realtek/alc269.c b/sound/hda/codecs/realtek/alc269.c
index 4645793b64ac..d751e39529a2 100644
--- a/sound/hda/codecs/realtek/alc269.c
+++ b/sound/hda/codecs/realtek/alc269.c
@@ -8849,6 +8849,7 @@ static int alc269_probe(struct hda_codec *codec, const struct hda_device_id *id)
 		spec->init_hook = alc256_init;
 		spec->gen.mixer_nid = 0; /* ALC256 does not have any loopback mixer path */
 		if (codec->core.vendor_id == 0x10ec0236 &&
+		    codec->bus->pci &&
 		    codec->bus->pci->vendor != PCI_VENDOR_ID_AMD)
 			spec->en_3kpull_low = false;
 		break;
-- 
2.25.1


^ permalink raw reply related	[flat|nested] 6+ messages in thread

* Re: [PATCH v2] ALSA: hda/realtek: add missing error checks for COEF index reads in alc269
  2026-07-30  1:53 ` [PATCH v2] ALSA: hda/realtek: add missing error checks for COEF index reads in alc269 songxiebing
  2026-07-30  1:53   ` [PATCH v2] ALSA: hda/realtek: add missing NULL check for codec->bus->pci songxiebing
@ 2026-07-30  9:35   ` Takashi Iwai
  1 sibling, 0 replies; 6+ messages in thread
From: Takashi Iwai @ 2026-07-30  9:35 UTC (permalink / raw)
  To: songxiebing; +Cc: tiwai, perex, linux-sound, linux-kernel

On Thu, 30 Jul 2026 03:53:01 +0200,
songxiebing wrote:
> 
> From: Bob Song <songxiebing@kylinos.cn>
> 
> alc_read_coef_idx() and alc_read_coefex_idx() can return -1 on error
> via snd_hda_codec_read(). Several codec initialization and shutdown
> functions save these return values and later write them back to
> hardware registers without checking for errors, potentially corrupting
> COEF register state on a read failure.
> 
> Add error checks in:
> - alc282_init() and alc282_shutup(): check coef78 before write-back
> - alc285_hp_init(): check coef38/coef0d/coef36 before update, check
>   val before write-back, and break polling loop on error
> - alc294_hp_init(): break polling loop on read error
> 
> Signed-off-by: Bob Song <songxiebing@kylinos.cn>
> ---
> v2:
>  - Separate processing of return values from reading COEF and
> null pointer detection for device.

Applied to for-next branch.  Thanks.


Takashi

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH v2] ALSA: hda/realtek: add missing NULL check for codec->bus->pci
  2026-07-30  1:53   ` [PATCH v2] ALSA: hda/realtek: add missing NULL check for codec->bus->pci songxiebing
@ 2026-07-30  9:35     ` Takashi Iwai
  0 siblings, 0 replies; 6+ messages in thread
From: Takashi Iwai @ 2026-07-30  9:35 UTC (permalink / raw)
  To: songxiebing; +Cc: tiwai, perex, linux-sound, linux-kernel

On Thu, 30 Jul 2026 03:53:02 +0200,
songxiebing wrote:
> 
> From: Bob Song <songxiebing@kylinos.cn>
> 
> In alc269_probe(), codec->bus->pci is dereferenced without a NULL check
> for the ALC236 vendor ID case. Add the missing check, consistent with
> the existing pattern used elsewhere in the same function.
> 
> Signed-off-by: Bob Song <songxiebing@kylinos.cn>
> ---
> v2:
>  - Separate processing of return values from reading COEF and
> null pointer detection for device.

Applied to for-next branch now.  Thanks.


Takashi

^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2026-07-30  9:35 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-07-29  6:38 [PATCH] ALSA: hda/realtek: add missing error checks in alc269 init/shutdown songxiebing
2026-07-29  7:35 ` Takashi Iwai
2026-07-30  1:53 ` [PATCH v2] ALSA: hda/realtek: add missing error checks for COEF index reads in alc269 songxiebing
2026-07-30  1:53   ` [PATCH v2] ALSA: hda/realtek: add missing NULL check for codec->bus->pci songxiebing
2026-07-30  9:35     ` Takashi Iwai
2026-07-30  9:35   ` [PATCH v2] ALSA: hda/realtek: add missing error checks for COEF index reads in alc269 Takashi Iwai

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox