tech-kern archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Allow hdaudio(4) to suspend

			Hi tech-kern@,

the patch attached lets me suspend my laptop again. The underlying issue is as follows:

hdaudio0 at pci0 dev 3 function 0: HD Audio Controller
hdaudio0: interrupting at ioapic0 pin 16, event channel 6
hdaudio0: RIRB timeout
hdaudio0: RIRB timeout
[does not attach any hdafg(4) and therefore no audio(4) here]
hdaudio1 at pci0 dev 27 function 0: HD Audio Controller
hdaudio1: interrupting at ioapic0 pin 22, event channel 8
hdafg0 at hdaudio1: Realtek product 0x0292
hdafg0: DAC00 2ch: Speaker [Built-In], HP Out [Jack]
hdafg0: ADC01 2ch: Mic In [Jack]
hdafg0: ADC02 2ch: Mic In [Built-In]
hdafg0: 2ch/2ch 32000Hz 44100Hz 48000Hz 88200Hz 96000Hz 192000Hz PCM16 PCM20 PCM24 AC3
audio0 at hdafg0: full duplex, playback, capture, mmap, independent

Really hdaudio0 failed to attach, but the device remained in the tree. Even though the PMF registration was performed, it is explicitly de-registered in the code path for errors - therefore preventing suspending later.

In sys/dev/pci/hdaudio_pci.c:
160         if (!pmf_device_register(self, NULL, hdaudio_pci_resume))
161                 aprint_error_dev(self, "couldn't establish power handler\n");
163         hdaudio_pci_reinit(sc);
165         /* Attach bus-independent HD audio layer */
166         if (hdaudio_attach(self, &sc->sc_hdaudio)) {
179                 pmf_device_deregister(self);

Let me know if the patch attached is a satisfying fix for the time being. I will commit it in a couple days if there is no objection.

Subsidiary question: is there a consensus on the behaviour of the kernel if a device driver matches, but then really fails to attach?

--- sys/dev/pci/hdaudio_pci.c	2017-01-25 22:58:21.000000000 +0100
+++ sys/dev/pci/	2017-01-23 01:51:18.000000000 +0100
@@ -157,9 +157,6 @@
 	aprint_normal_dev(self, "interrupting at %s\n", intrstr);
-	if (!pmf_device_register(self, NULL, hdaudio_pci_resume))
-		aprint_error_dev(self, "couldn't establish power handler\n");
 	/* Attach bus-independent HD audio layer */
@@ -176,8 +173,12 @@
 		pci_conf_write(sc->sc_pc, sc->sc_tag,
-		pmf_device_deregister(self);
+		if (!pmf_device_register(self, NULL, NULL))
+			aprint_error_dev(self, "couldn't establish power handler\n");
+	else if (!pmf_device_register(self, NULL, hdaudio_pci_resume))
+		aprint_error_dev(self, "couldn't establish power handler\n");
 static int

Home | Main Index | Thread Index | Old Index