Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e96224ae authored by Takashi Iwai's avatar Takashi Iwai Committed by Jaroslav Kysela
Browse files

[ALSA] hda-intel - Switch to polling mode for CORB/RIRB communication



Automatically switch to polling mode for CORB/RIRB communication
if the irq-driven mode seems not working well.  If the polling
mode still doesn't work, switch to single_cmd mode as fallback.

Signed-off-by: default avatarTakashi Iwai <tiwai@suse.de>
Signed-off-by: default avatarJaroslav Kysela <perex@suse.cz>
parent 81d3dbde
Loading
Loading
Loading
Loading
+17 −1
Original line number Diff line number Diff line
@@ -332,6 +332,7 @@ struct azx {
	int position_fix;
	unsigned int initialized: 1;
	unsigned int single_cmd: 1;
	unsigned int polling_mode: 1;
};

/* driver types */
@@ -518,8 +519,23 @@ static unsigned int azx_rirb_get_response(struct hda_codec *codec)
	struct azx *chip = codec->bus->private_data;
	int timeout = 50;

	while (chip->rirb.cmds) {
	for (;;) {
		if (chip->polling_mode) {
			spin_lock_irq(&chip->reg_lock);
			azx_update_rirb(chip);
			spin_unlock_irq(&chip->reg_lock);
		}
		if (! chip->rirb.cmds)
			break;
		if (! --timeout) {
			if (! chip->polling_mode) {
				snd_printk(KERN_WARNING "hda_intel: "
					   "azx_get_response timeout, "
					   "switching to polling mode...\n");
				chip->polling_mode = 1;
				timeout = 50;
				continue;
			}
			snd_printk(KERN_ERR
				   "hda_intel: azx_get_response timeout, "
				   "switching to single_cmd mode...\n");