Merge tag 'sound-5.4-rc8' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai...
authorLinus Torvalds <torvalds@linux-foundation.org>
Fri, 15 Nov 2019 16:53:52 +0000 (08:53 -0800)
committerLinus Torvalds <torvalds@linux-foundation.org>
Fri, 15 Nov 2019 16:53:52 +0000 (08:53 -0800)
Pull sound fixes from Takashi Iwai:
 "A few small last-minute fixes for USB-audio and HD-audio as well as
  for PCM core:

   - A race fix for PCM core between stopping and closing a stream

   - USB-audio regressions in the recent descriptor validation code and
     relevant changes

   - A read of uninitialized value in USB-audio spotted by fuzzer

   - A fix for USB-audio race at stopping a stream

   - Intel HD-audio platform fixes"

* tag 'sound-5.4-rc8' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound:
  ALSA: usb-audio: Fix incorrect size check for processing/extension units
  ALSA: usb-audio: Fix incorrect NULL check in create_yamaha_midi_quirk()
  ALSA: pcm: Fix stream lock usage in snd_pcm_period_elapsed()
  ALSA: usb-audio: not submit urb for stopped endpoint
  ALSA: hda: hdmi - fix pin setup on Tigerlake
  ALSA: hda: Add Cometlake-S PCI ID
  ALSA: usb-audio: Fix missing error check at mixer resolution test

sound/core/pcm_lib.c
sound/pci/hda/hda_intel.c
sound/pci/hda/patch_hdmi.c
sound/usb/endpoint.c
sound/usb/mixer.c
sound/usb/quirks.c
sound/usb/validate.c

index d80041e..2236b5e 100644 (file)
@@ -1782,11 +1782,14 @@ void snd_pcm_period_elapsed(struct snd_pcm_substream *substream)
        struct snd_pcm_runtime *runtime;
        unsigned long flags;
 
-       if (PCM_RUNTIME_CHECK(substream))
+       if (snd_BUG_ON(!substream))
                return;
-       runtime = substream->runtime;
 
        snd_pcm_stream_lock_irqsave(substream, flags);
+       if (PCM_RUNTIME_CHECK(substream))
+               goto _unlock;
+       runtime = substream->runtime;
+
        if (!snd_pcm_running(substream) ||
            snd_pcm_update_hw_ptr0(substream, 1) < 0)
                goto _end;
@@ -1797,6 +1800,7 @@ void snd_pcm_period_elapsed(struct snd_pcm_substream *substream)
 #endif
  _end:
        kill_fasync(&runtime->fasync, SIGIO, POLL_IN);
+ _unlock:
        snd_pcm_stream_unlock_irqrestore(substream, flags);
 }
 EXPORT_SYMBOL(snd_pcm_period_elapsed);
index cf53fbd..c524193 100644 (file)
@@ -2396,6 +2396,9 @@ static const struct pci_device_id azx_ids[] = {
        /* CometLake-H */
        { PCI_DEVICE(0x8086, 0x06C8),
          .driver_data = AZX_DRIVER_SKL | AZX_DCAPS_INTEL_SKYLAKE},
+       /* CometLake-S */
+       { PCI_DEVICE(0x8086, 0xa3f0),
+         .driver_data = AZX_DRIVER_SKL | AZX_DCAPS_INTEL_SKYLAKE},
        /* Icelake */
        { PCI_DEVICE(0x8086, 0x34c8),
          .driver_data = AZX_DRIVER_SKL | AZX_DCAPS_INTEL_SKYLAKE},
index 3c72070..78bd2e3 100644 (file)
@@ -46,10 +46,12 @@ MODULE_PARM_DESC(static_hdmi_pcm, "Don't restrict PCM parameters per ELD info");
                                ((codec)->core.vendor_id == 0x80862800))
 #define is_cannonlake(codec) ((codec)->core.vendor_id == 0x8086280c)
 #define is_icelake(codec) ((codec)->core.vendor_id == 0x8086280f)
+#define is_tigerlake(codec) ((codec)->core.vendor_id == 0x80862812)
 #define is_haswell_plus(codec) (is_haswell(codec) || is_broadwell(codec) \
                                || is_skylake(codec) || is_broxton(codec) \
                                || is_kabylake(codec) || is_geminilake(codec) \
-                               || is_cannonlake(codec) || is_icelake(codec))
+                               || is_cannonlake(codec) || is_icelake(codec) \
+                               || is_tigerlake(codec))
 #define is_valleyview(codec) ((codec)->core.vendor_id == 0x80862882)
 #define is_cherryview(codec) ((codec)->core.vendor_id == 0x80862883)
 #define is_valleyview_plus(codec) (is_valleyview(codec) || is_cherryview(codec))
index a2ab8e8..4a9a2f6 100644 (file)
@@ -388,6 +388,9 @@ static void snd_complete_urb(struct urb *urb)
                }
 
                prepare_outbound_urb(ep, ctx);
+               /* can be stopped during prepare callback */
+               if (unlikely(!test_bit(EP_FLAG_RUNNING, &ep->flags)))
+                       goto exit_clear;
        } else {
                retire_inbound_urb(ep, ctx);
                /* can be stopped during retire callback */
index 3fd1d17..45eee5c 100644 (file)
@@ -1229,7 +1229,8 @@ static int get_min_max_with_quirks(struct usb_mixer_elem_info *cval,
                if (cval->min + cval->res < cval->max) {
                        int last_valid_res = cval->res;
                        int saved, test, check;
-                       get_cur_mix_raw(cval, minchn, &saved);
+                       if (get_cur_mix_raw(cval, minchn, &saved) < 0)
+                               goto no_res_check;
                        for (;;) {
                                test = saved;
                                if (test < cval->max)
@@ -1249,6 +1250,7 @@ static int get_min_max_with_quirks(struct usb_mixer_elem_info *cval,
                        snd_usb_set_cur_mix_value(cval, minchn, 0, saved);
                }
 
+no_res_check:
                cval->initialized = 1;
        }
 
index 0bbe120..349e1e5 100644 (file)
@@ -248,8 +248,8 @@ static int create_yamaha_midi_quirk(struct snd_usb_audio *chip,
                                        NULL, USB_MS_MIDI_OUT_JACK);
        if (!injd && !outjd)
                return -ENODEV;
-       if (!(injd && snd_usb_validate_midi_desc(injd)) ||
-           !(outjd && snd_usb_validate_midi_desc(outjd)))
+       if ((injd && !snd_usb_validate_midi_desc(injd)) ||
+           (outjd && !snd_usb_validate_midi_desc(outjd)))
                return -ENODEV;
        if (injd && (injd->bLength < 5 ||
                     (injd->bJackType != USB_MS_EMBEDDED &&
index a5e584b..389e865 100644 (file)
@@ -81,9 +81,9 @@ static bool validate_processing_unit(const void *p,
        switch (v->protocol) {
        case UAC_VERSION_1:
        default:
-               /* bNrChannels, wChannelConfig, iChannelNames, bControlSize */
-               len += 1 + 2 + 1 + 1;
-               if (d->bLength < len) /* bControlSize */
+               /* bNrChannels, wChannelConfig, iChannelNames */
+               len += 1 + 2 + 1;
+               if (d->bLength < len + 1) /* bControlSize */
                        return false;
                m = hdr[len];
                len += 1 + m + 1; /* bControlSize, bmControls, iProcessing */