]> git.kernelconcepts.de Git - karo-tx-linux.git/commitdiff
mtd: Add sysfs attributes to expose the ECC stats fields
authorEzequiel Garcia <ezequiel.garcia@free-electrons.com>
Tue, 24 Jun 2014 13:55:50 +0000 (10:55 -0300)
committerBrian Norris <computersforpeace@gmail.com>
Wed, 9 Jul 2014 01:37:26 +0000 (18:37 -0700)
These new sysfs device attributes allow us to retrieve the ECC and bad
block stats by poking a sysfs file, which is often more convenient than
using the ioctl.

Signed-off-by: Ezequiel Garcia <ezequiel.garcia@free-electrons.com>
Tested-by: Pekon Gupta <pekon@ti.com>
Signed-off-by: Brian Norris <computersforpeace@gmail.com>
Documentation/ABI/testing/sysfs-class-mtd
drivers/mtd/mtdcore.c

index 1399bb2da3ebf762ffd0c392c07121d1687ee1dd..76ee192f80a080b12f319d2e6624f38606f4efa7 100644 (file)
@@ -184,3 +184,41 @@ Description:
 
                It will always be a non-negative integer.  In the case of
                devices lacking any ECC capability, it is 0.
+
+What:          /sys/class/mtd/mtdX/ecc_failures
+Date:          June 2014
+KernelVersion: 3.17
+Contact:       linux-mtd@lists.infradead.org
+Description:
+               The number of failures reported by this device's ECC. Typically,
+               these failures are associated with failed read operations.
+
+               It will always be a non-negative integer.  In the case of
+               devices lacking any ECC capability, it is 0.
+
+What:          /sys/class/mtd/mtdX/corrected_bits
+Date:          June 2014
+KernelVersion: 3.17
+Contact:       linux-mtd@lists.infradead.org
+Description:
+               The number of bits that have been corrected by means of the
+               device's ECC.
+
+               It will always be a non-negative integer.  In the case of
+               devices lacking any ECC capability, it is 0.
+
+What:          /sys/class/mtd/mtdX/bad_blocks
+Date:          June 2014
+KernelVersion: 3.17
+Contact:       linux-mtd@lists.infradead.org
+Description:
+               The number of blocks marked as bad, if any, in this partition.
+
+What:          /sys/class/mtd/mtdX/bbt_blocks
+Date:          June 2014
+KernelVersion: 3.17
+Contact:       linux-mtd@lists.infradead.org
+Description:
+               The number of blocks that are marked as reserved, if any, in
+               this partition. These are typically used to store the in-flash
+               bad block table (BBT).
index d201feeb3ca6dc7ffe1380840fb0f826ddb0ec10..11857faa0d960f057fac4bdce148d4aad4b1a15a 100644 (file)
@@ -298,6 +298,47 @@ static ssize_t mtd_ecc_step_size_show(struct device *dev,
 }
 static DEVICE_ATTR(ecc_step_size, S_IRUGO, mtd_ecc_step_size_show, NULL);
 
+static ssize_t mtd_ecc_stats_corrected_show(struct device *dev,
+               struct device_attribute *attr, char *buf)
+{
+       struct mtd_info *mtd = dev_get_drvdata(dev);
+       struct mtd_ecc_stats *ecc_stats = &mtd->ecc_stats;
+
+       return snprintf(buf, PAGE_SIZE, "%u\n", ecc_stats->corrected);
+}
+static DEVICE_ATTR(corrected_bits, S_IRUGO,
+                  mtd_ecc_stats_corrected_show, NULL);
+
+static ssize_t mtd_ecc_stats_errors_show(struct device *dev,
+               struct device_attribute *attr, char *buf)
+{
+       struct mtd_info *mtd = dev_get_drvdata(dev);
+       struct mtd_ecc_stats *ecc_stats = &mtd->ecc_stats;
+
+       return snprintf(buf, PAGE_SIZE, "%u\n", ecc_stats->failed);
+}
+static DEVICE_ATTR(ecc_failures, S_IRUGO, mtd_ecc_stats_errors_show, NULL);
+
+static ssize_t mtd_badblocks_show(struct device *dev,
+               struct device_attribute *attr, char *buf)
+{
+       struct mtd_info *mtd = dev_get_drvdata(dev);
+       struct mtd_ecc_stats *ecc_stats = &mtd->ecc_stats;
+
+       return snprintf(buf, PAGE_SIZE, "%u\n", ecc_stats->badblocks);
+}
+static DEVICE_ATTR(bad_blocks, S_IRUGO, mtd_badblocks_show, NULL);
+
+static ssize_t mtd_bbtblocks_show(struct device *dev,
+               struct device_attribute *attr, char *buf)
+{
+       struct mtd_info *mtd = dev_get_drvdata(dev);
+       struct mtd_ecc_stats *ecc_stats = &mtd->ecc_stats;
+
+       return snprintf(buf, PAGE_SIZE, "%u\n", ecc_stats->bbtblocks);
+}
+static DEVICE_ATTR(bbt_blocks, S_IRUGO, mtd_bbtblocks_show, NULL);
+
 static struct attribute *mtd_attrs[] = {
        &dev_attr_type.attr,
        &dev_attr_flags.attr,
@@ -310,6 +351,10 @@ static struct attribute *mtd_attrs[] = {
        &dev_attr_name.attr,
        &dev_attr_ecc_strength.attr,
        &dev_attr_ecc_step_size.attr,
+       &dev_attr_corrected_bits.attr,
+       &dev_attr_ecc_failures.attr,
+       &dev_attr_bad_blocks.attr,
+       &dev_attr_bbt_blocks.attr,
        &dev_attr_bitflip_threshold.attr,
        NULL,
 };