// at current one.
        if (clock != SND_TSCM_CLOCK_INTERNAL || tscm->substreams_counter > 0) {
                unsigned int frames_per_period = d->events_per_period;
+               unsigned int frames_per_buffer = d->events_per_buffer;
                unsigned int rate;
 
                err = snd_tscm_stream_get_rate(tscm, &rate);
                        mutex_unlock(&tscm->mutex);
                        goto err_locked;
                }
+
+               err = snd_pcm_hw_constraint_minmax(substream->runtime,
+                                       SNDRV_PCM_HW_PARAM_BUFFER_SIZE,
+                                       frames_per_buffer, frames_per_buffer);
+               if (err < 0) {
+                       mutex_unlock(&tscm->mutex);
+                       goto err_locked;
+               }
        }
 
        mutex_unlock(&tscm->mutex);
        if (substream->runtime->status->state == SNDRV_PCM_STATE_OPEN) {
                unsigned int rate = params_rate(hw_params);
                unsigned int frames_per_period = params_period_size(hw_params);
+               unsigned int frames_per_buffer = params_buffer_size(hw_params);
 
                mutex_lock(&tscm->mutex);
                err = snd_tscm_stream_reserve_duplex(tscm, rate,
-                                                    frames_per_period);
+                                       frames_per_period, frames_per_buffer);
                if (err >= 0)
                        ++tscm->substreams_counter;
                mutex_unlock(&tscm->mutex);
 
 }
 
 int snd_tscm_stream_reserve_duplex(struct snd_tscm *tscm, unsigned int rate,
-                                  unsigned int frames_per_period)
+                                  unsigned int frames_per_period,
+                                  unsigned int frames_per_buffer)
 {
        unsigned int curr_rate;
        int err;
                }
 
                err = amdtp_domain_set_events_per_period(&tscm->domain,
-                                                       frames_per_period, 0);
+                                       frames_per_period, frames_per_buffer);
                if (err < 0) {
                        fw_iso_resources_free(&tscm->tx_resources);
                        fw_iso_resources_free(&tscm->rx_resources);
 
 void snd_tscm_stream_update_duplex(struct snd_tscm *tscm);
 void snd_tscm_stream_destroy_duplex(struct snd_tscm *tscm);
 int snd_tscm_stream_reserve_duplex(struct snd_tscm *tscm, unsigned int rate,
-                                  unsigned int frames_per_period);
+                                  unsigned int frames_per_period,
+                                  unsigned int frames_per_buffer);
 int snd_tscm_stream_start_duplex(struct snd_tscm *tscm, unsigned int rate);
 void snd_tscm_stream_stop_duplex(struct snd_tscm *tscm);