|
@@ -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");
|