Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 990a3af0 authored by Ezequiel Garcia's avatar Ezequiel Garcia Committed by Brian Norris
Browse files

mtd: Add sysfs attributes to expose the ECC stats fields



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: default avatarEzequiel Garcia <ezequiel.garcia@free-electrons.com>
Tested-by: default avatarPekon Gupta <pekon@ti.com>
Signed-off-by: default avatarBrian Norris <computersforpeace@gmail.com>
parent 89384f64
Loading
Loading
Loading
Loading
+38 −0
Original line number Diff line number Diff line
@@ -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).
+45 −0
Original line number Diff line number Diff line
@@ -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,
};