triggering a window switch for the buffer. Returns an error in any
                other operating mode or attempts to write something other than "1".
 
+What:          /sys/bus/intel_th/devices/<intel_th_id>-msc<msc-id>/stop_on_full
+Date:          March 2020
+KernelVersion: 5.7
+Contact:       Alexander Shishkin <alexander.shishkin@linux.intel.com>
+Description:   (RW) Configure whether trace stops when the last available window
+               becomes full (1/y/Y) or wraps around and continues until the next
+               window becomes available again (0/n/N).
+
 
        struct list_head        win_list;
        struct sg_table         single_sgt;
        struct msc_window       *cur_win;
+       struct msc_window       *switch_on_unlock;
        unsigned long           nr_pages;
        unsigned long           single_sz;
        unsigned int            single_wrap : 1;
 
        struct list_head        iter_list;
 
+       bool                    stop_on_full;
+
        /* config */
        unsigned int            enabled : 1,
                                wrap    : 1,
                return;
 
        msc_win_set_lockout(win, WIN_LOCKED, WIN_READY);
+       if (msc->switch_on_unlock == win) {
+               msc->switch_on_unlock = NULL;
+               msc_win_switch(msc);
+       }
 }
 EXPORT_SYMBOL_GPL(intel_th_msc_window_unlock);
 
 
        /* next window: if READY, proceed, if LOCKED, stop the trace */
        if (msc_win_set_lockout(next_win, WIN_READY, WIN_INUSE)) {
-               schedule_work(&msc->work);
+               if (msc->stop_on_full)
+                       schedule_work(&msc->work);
+               else
+                       msc->switch_on_unlock = next_win;
+
                return IRQ_HANDLED;
        }
 
 
 static DEVICE_ATTR_WO(win_switch);
 
+static ssize_t stop_on_full_show(struct device *dev,
+                                struct device_attribute *attr, char *buf)
+{
+       struct msc *msc = dev_get_drvdata(dev);
+
+       return sprintf(buf, "%d\n", msc->stop_on_full);
+}
+
+static ssize_t stop_on_full_store(struct device *dev,
+                                 struct device_attribute *attr,
+                                 const char *buf, size_t size)
+{
+       struct msc *msc = dev_get_drvdata(dev);
+       int ret;
+
+       ret = kstrtobool(buf, &msc->stop_on_full);
+       if (ret)
+               return ret;
+
+       return size;
+}
+
+static DEVICE_ATTR_RW(stop_on_full);
+
 static struct attribute *msc_output_attrs[] = {
        &dev_attr_wrap.attr,
        &dev_attr_mode.attr,
        &dev_attr_nr_pages.attr,
        &dev_attr_win_switch.attr,
+       &dev_attr_stop_on_full.attr,
        NULL,
 };