ALSA: emu10k1: fix SNDRV_EMU10K1_IOCTL_SINGLE_STEP
authorOswald Buddenhagen <oswald.buddenhagen@gmx.de>
Sat, 22 Apr 2023 16:10:20 +0000 (18:10 +0200)
committerTakashi Iwai <tiwai@suse.de>
Sun, 23 Apr 2023 07:21:30 +0000 (09:21 +0200)
- Use correct address limit for Audigy
- Use the right constant to actually make a step on Audigy
- Don't store *_DBG_STEP and the address in emu->fx8010.dbg, as
  otherwise unrelated operations would make steps, too

This is untested. as10k1 was never ported to Audigy anyway.

Signed-off-by: Oswald Buddenhagen <oswald.buddenhagen@gmx.de>
Link: https://lore.kernel.org/r/20230422161021.1144004-1-oswald.buddenhagen@gmx.de
Signed-off-by: Takashi Iwai <tiwai@suse.de>
sound/pci/emu10k1/emufx.c

index 510b776..355e3bd 100644 (file)
@@ -2650,17 +2650,19 @@ static int snd_emu10k1_fx8010_ioctl(struct snd_hwdep * hw, struct file *file, un
                        return -EPERM;
                if (get_user(addr, (unsigned int __user *)argp))
                        return -EFAULT;
-               if (addr > 0x1ff)
-                       return -EINVAL;
-               if (emu->audigy)
-                       snd_emu10k1_ptr_write(emu, A_DBG, 0, emu->fx8010.dbg |= A_DBG_SINGLE_STEP | addr);
-               else
-                       snd_emu10k1_ptr_write(emu, DBG, 0, emu->fx8010.dbg |= EMU10K1_DBG_SINGLE_STEP | addr);
-               udelay(10);
-               if (emu->audigy)
-                       snd_emu10k1_ptr_write(emu, A_DBG, 0, emu->fx8010.dbg |= A_DBG_SINGLE_STEP | A_DBG_STEP_ADDR | addr);
-               else
-                       snd_emu10k1_ptr_write(emu, DBG, 0, emu->fx8010.dbg |= EMU10K1_DBG_SINGLE_STEP | EMU10K1_DBG_STEP | addr);
+               if (emu->audigy) {
+                       if (addr > A_DBG_STEP_ADDR)
+                               return -EINVAL;
+                       snd_emu10k1_ptr_write(emu, A_DBG, 0, emu->fx8010.dbg |= A_DBG_SINGLE_STEP);
+                       udelay(10);
+                       snd_emu10k1_ptr_write(emu, A_DBG, 0, emu->fx8010.dbg | A_DBG_STEP | addr);
+               } else {
+                       if (addr > EMU10K1_DBG_SINGLE_STEP_ADDR)
+                               return -EINVAL;
+                       snd_emu10k1_ptr_write(emu, DBG, 0, emu->fx8010.dbg |= EMU10K1_DBG_SINGLE_STEP);
+                       udelay(10);
+                       snd_emu10k1_ptr_write(emu, DBG, 0, emu->fx8010.dbg | EMU10K1_DBG_STEP | addr);
+               }
                return 0;
        case SNDRV_EMU10K1_IOCTL_DBG_READ:
                if (emu->audigy)