Re: after update to r368166: no sound recording

From: Matthias Apitz <guru_at_unixarea.de>
Date: Sun, 13 Dec 2020 20:06:02 +0100
El día viernes, diciembre 11, 2020 a las 08:06:27a. m. +0100, Matthias Apitz escribió:

> FreeBSD c720-r368166 13.0-CURRENT FreeBSD 13.0-CURRENT #1 r342378:368166M: Fri Dec 11 07:46:32 CET 2020     guru_at_c720-r368166:/usr/obj/usr/src/amd64.amd64/sys/GENERIC  amd64
> 
> and all is fine again as it was before. Someone with more knowledge should
> have a look into a 'svn diff -r342378:368166 sys/dev/sound/pci/hda' and
> see which of the changes might break the things. 
> 

I did an analyzing of the files changed in sys/dev/sound/pci/hda between
r342378 (2018-11-02) and r368166 (2020-11-30)

I copied over all files from hda/* to a new dir hda.r368166/* and
updated (i.e. reverted) hda/* to r342378; only the 7 files below (of 10)
have changed between r342378 and r368166:

The kernel built with hda of r342378 works fine;

The work plan was now to change one file after the other to r368166
and see if the kernel still works fine, i.e. which of the 7 file(s)
is causing the regression...

i.e. I did: 

# svn up -r342378 sys/dev/sound/pci/hda
# cp sys/dev/sound/pci/hda.r368166/hdac.c sys/dev/sound/pci/hda/
# touch sys/dev/sound/pci/hda/hdac.c 
# make buildkernel -DNO_CLEAN
# make installkernel
...

 v----------------------------an 'x' means: was copied from hda.r368166;
[x] Index: hda/hdac.c
[x] Index: hda/hdac.h

recording with the kernel still works

[x] Index: hda/hdaa_patches.c     

recording with the kernel still works

[x] Index: hda/hdacc.c
[x] Index: hda/hda_reg.h          only cleanups of empty lines

recording with the kernel still works

[x] Index: hda/hdaa.h
[x] Index: hda/hdaa.c             

recording with the kernel stoped working

Which means the few changes in hda/hdaa.c are causing the regression:

# svn diff -r342378 hdaa.c
Index: hdaa.c
===================================================================
--- hdaa.c	(revisión: 342378)
+++ hdaa.c	(copia de trabajo)
_at__at_ -52,7 +52,6 _at__at_
 #define hdaa_lock(devinfo)	snd_mtxlock((devinfo)->lock)
 #define hdaa_unlock(devinfo)	snd_mtxunlock((devinfo)->lock)
 #define hdaa_lockassert(devinfo) snd_mtxassert((devinfo)->lock)
-#define hdaa_lockowned(devinfo)	mtx_owned((devinfo)->lock)
 
 static const struct {
 	const char *key;
_at__at_ -1129,7 +1128,6 _at__at_
 	    ((step - offset) * (size + 1)) / 4);
 }
 
-
 static int
 hdaa_sysctl_caps(SYSCTL_HANDLER_ARGS)
 {
_at__at_ -5034,11 +5032,13 _at__at_
 		pincap = w->wclass.pin.cap;
 
 		/* Disable everything. */
-		w->wclass.pin.ctrl &= ~(
-		    HDA_CMD_SET_PIN_WIDGET_CTRL_HPHN_ENABLE |
-		    HDA_CMD_SET_PIN_WIDGET_CTRL_OUT_ENABLE |
-		    HDA_CMD_SET_PIN_WIDGET_CTRL_IN_ENABLE |
-		    HDA_CMD_SET_PIN_WIDGET_CTRL_VREF_ENABLE_MASK);
+		if (devinfo->init_clear) {
+			w->wclass.pin.ctrl &= ~(
+		    	HDA_CMD_SET_PIN_WIDGET_CTRL_HPHN_ENABLE |
+		    	HDA_CMD_SET_PIN_WIDGET_CTRL_OUT_ENABLE |
+		    	HDA_CMD_SET_PIN_WIDGET_CTRL_IN_ENABLE |
+		    	HDA_CMD_SET_PIN_WIDGET_CTRL_VREF_ENABLE_MASK);
+		}
 
 		if (w->enable == 0) {
 			/* Pin is unused so left it disabled. */
_at__at_ -6669,8 +6669,12 _at__at_
 	    devinfo, 0, hdaa_sysctl_gpo_config, "A", "GPO configuration");
 	SYSCTL_ADD_PROC(device_get_sysctl_ctx(dev),
 	    SYSCTL_CHILDREN(device_get_sysctl_tree(dev)), OID_AUTO,
-	    "reconfig", CTLTYPE_INT | CTLFLAG_RW,
+	    "reconfig", CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_NEEDGIANT,
 	    dev, 0, hdaa_sysctl_reconfig, "I", "Reprocess configuration");
+	SYSCTL_ADD_INT(device_get_sysctl_ctx(dev),
+	    SYSCTL_CHILDREN(device_get_sysctl_tree(dev)), OID_AUTO,
+	    "init_clear", CTLFLAG_RW,
+	    &devinfo->init_clear, 1,"Clear initial pin widget configuration");
 	bus_generic_attach(dev);
 	return (0);
 }

# svn diff -r342378 hdaa.h
Index: hdaa.h
===================================================================
--- hdaa.h	(revisión: 342378)
+++ hdaa.h	(copia de trabajo)
_at__at_ -214,6 +214,7 _at__at_
 	struct hdaa_chan	*chans;
 	struct callout		poll_jack;
 	int			poll_ival;
+	uint32_t		init_clear;
 };
 
 #define HDAA_CHN_RUNNING	0x00000001


If one looks into a svn log of the file hdaa.c it seems that one of the two changes 
r358333 or r350078 must have caused the problem:

# svn log hdaa.c

------------------------------------------------------------------------
r365085 | mjg | 2020-09-01 23:27:34 +0200 (mar. 01 de sept. de 2020) | 2 líneas

sound: clean up empty lines in .c and .h files

------------------------------------------------------------------------
r360076 | emaste | 2020-04-18 20:25:30 +0200 (sáb. 18 de abr. de 2020) | 4 líneas

hda: remove hda*_lockowned macros

These are not used anywhere.

------------------------------------------------------------------------
r358333 | kaktus | 2020-02-26 15:26:36 +0100 (mié. 26 de feb. de 2020) | 16 líneas

Mark more nodes as CTLFLAG_MPSAFE or CTLFLAG_NEEDGIANT (17 of many)

r357614 added CTLFLAG_NEEDGIANT to make it easier to find nodes that are
still not MPSAFE (or already are but aren’t properly marked).
Use it in preparation for a general review of all nodes.

This is non-functional change that adds annotations to SYSCTL_NODE and
SYSCTL_PROC nodes using one of the soon-to-be-required flags.

Mark all obvious cases as MPSAFE.  All entries that haven't been marked
as MPSAFE before are by default marked as NEEDGIANT

Approved by:	kib (mentor, blanket)
Commented by:	kib, gallatin, melifaro
Differential Revision:	https://reviews.freebsd.org/D23718

------------------------------------------------------------------------
r350078 | sbruno | 2019-07-17 06:13:46 +0200 (mié. 17 de jul. de 2019) | 8 líneas

I add the ability to accept the default pin widget configuration to help
with various laptops using hdaa(4) sound devices.  We don't seem to know
the "correct" configurations for these devices and the defaults are far
superiour, e.g. they work if you don't nuke the default configs.

PR:	200526
Differential Revision:	https://reviews.freebsd.org/D17772

------------------------------------------------------------------------
r337043 | jhibbits | 2018-08-01 16:50:41 +0200 (mié. 01 de ago. de 2018) | 13 líneas

snd_hda: Synchronize DMA buffers for the control path

Make sure both sides of the DMA buffer memory accesses for the CORB and RIRB
(control buffers) in snd_hda (device and CPU) can see coherent memory.  This
is needed on weakly ordered architectures including PowerPC and ARM.  Patch
originally by mmel, with small changes.

This does not cover the data path of snd_hda.  We don't have sync operations
for in-progress DMA buffers, to sync ranges of a map.

Reviewed By: mmel
Differential Revision: https://reviews.freebsd.org/D16517

...

-- 
Matthias Apitz, ✉ guru_at_unixarea.de, http://www.unixarea.de/ +49-176-38902045
Public GnuPG key: http://www.unixarea.de/key.pub
Без книги нет знания, без знания нет коммунизма (Влaдимир Ильич Ленин)
Without books no knowledge - without knowledge no communism (Vladimir Ilyich Lenin) 
Sin libros no hay saber - sin saber no hay comunismo. (Vladimir Ilich Lenin)
Received on Sun Dec 13 2020 - 18:06:07 UTC

This archive was generated by hypermail 2.4.0 : Wed May 19 2021 - 11:41:26 UTC