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: Ezequiel Garcia <ezequiel.garcia@free-electrons.com> Tested-by: Pekon Gupta <pekon@ti.com> Signed-off-by: Brian Norris <computersforpeace@gmail.com>
This commit is contained in:
Родитель
89384f6462
Коммит
990a3af0c2
|
@ -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).
|
||||
|
|
|
@ -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,
|
||||
};
|
||||
|
|
Загрузка…
Ссылка в новой задаче