-1
        };
        const int *v;
+       struct snd_mask old_mask;
+       struct snd_interval old_interval;
        int err;
 
        for (v = vars; *v != -1; v++) {
+               /* Keep old parameter to trace. */
+               if (trace_hw_mask_param_enabled()) {
+                       if (hw_is_mask(*v))
+                               old_mask = *hw_param_mask(params, *v);
+               }
+               if (trace_hw_interval_param_enabled()) {
+                       if (hw_is_interval(*v))
+                               old_interval = *hw_param_interval(params, *v);
+               }
                if (*v != SNDRV_PCM_HW_PARAM_BUFFER_SIZE)
                        err = snd_pcm_hw_param_first(pcm, params, *v, NULL);
                else
                        err = snd_pcm_hw_param_last(pcm, params, *v, NULL);
                if (snd_BUG_ON(err < 0))
                        return err;
+
+               /* Trace the parameter. */
+               if (hw_is_mask(*v)) {
+                       trace_hw_mask_param(pcm, *v, 0, &old_mask,
+                                           hw_param_mask(params, *v));
+               }
+               if (hw_is_interval(*v)) {
+                       trace_hw_interval_param(pcm, *v, 0, &old_interval,
+                                               hw_param_interval(params, *v));
+               }
        }
+
        return 0;
 }