}
 static DEVICE_ATTR(esc, 0444, chp_esc_show, NULL);
 
+static char apply_max_suffix(unsigned long *value, unsigned long base)
+{
+       static char suffixes[] = { 0, 'K', 'M', 'G', 'T' };
+       int i;
+
+       for (i = 0; i < ARRAY_SIZE(suffixes) - 1; i++) {
+               if (*value < base || *value % base != 0)
+                       break;
+               *value /= base;
+       }
+
+       return suffixes[i];
+}
+
+static ssize_t speed_bps_show(struct device *dev,
+                             struct device_attribute *attr, char *buf)
+{
+       struct channel_path *chp = to_channelpath(dev);
+       unsigned long speed = chp->speed;
+       char suffix;
+
+       suffix = apply_max_suffix(&speed, 1000);
+
+       return suffix ? sysfs_emit(buf, "%lu%c\n", speed, suffix) :
+                       sysfs_emit(buf, "%lu\n", speed);
+}
+
+static DEVICE_ATTR_RO(speed_bps);
+
 static ssize_t util_string_read(struct file *filp, struct kobject *kobj,
                                struct bin_attribute *attr, char *buf,
                                loff_t off, size_t count)
        &dev_attr_chid.attr,
        &dev_attr_chid_external.attr,
        &dev_attr_esc.attr,
+       &dev_attr_speed_bps.attr,
        NULL,
 };
 static struct attribute_group chp_attr_group = {
 
        }
 }
 
+static unsigned long scmc_get_speed(u32 s, u32 p)
+{
+       unsigned long speed = s;
+
+       if (!p)
+               p = 8;
+       while (p--)
+               speed *= 10;
+
+       return speed;
+}
+
 int chsc_get_channel_measurement_chars(struct channel_path *chp)
 {
        unsigned long flags;
                u32 : 21;
                u32 chpid : 8;
                u32 cmcv : 5;
-               u32 : 11;
+               u32 : 7;
+               u32 cmgp : 4;
                u32 cmgq : 8;
                u32 cmg : 8;
-               u32 zeroes3;
+               u32 : 16;
+               u32 cmgs : 16;
                u32 data[NR_MEASUREMENT_CHARS];
        } *scmc_area;
 
        chp->shared = -1;
        chp->cmg = -1;
        chp->extended = 0;
+       chp->speed = 0;
 
        if (!css_chsc_characteristics.scmc || !css_chsc_characteristics.secm)
                return -EINVAL;
        chp->cmg = scmc_area->cmg;
        chp->shared = scmc_area->shared;
        chp->extended = scmc_area->extended;
+       chp->speed = scmc_get_speed(scmc_area->cmgs, scmc_area->cmgp);
        chsc_initialize_cmg_chars(chp, scmc_area->cmcv,
                                  (struct cmg_chars *) &scmc_area->data);
 out: