Commit f3030741 authored by Martin K. Petersen's avatar Martin K. Petersen Committed by Tejun Heo

libata: Expose TRIM capability in sysfs

Create a sysfs "trim" attribute for each ata_device that displays
whether DSM TRIM is "unsupported", "unqueued", "forced_unqueued"
(blacklisted) or "queued".
Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
Reviewed-by: default avatarHannes Reinecke <hare@suse.de>
Signed-off-by: default avatarTejun Heo <tj@kernel.org>
parent d7b16e4f
...@@ -90,6 +90,17 @@ gscr ...@@ -90,6 +90,17 @@ gscr
130: SATA_PMP_GSCR_SII_GPIO 130: SATA_PMP_GSCR_SII_GPIO
Only valid if the device is a PM. Only valid if the device is a PM.
trim
Shows the DSM TRIM mode currently used by the device. Valid
values are:
unsupported: Drive does not support DSM TRIM
unqueued: Drive supports unqueued DSM TRIM only
queued: Drive supports queued DSM TRIM
forced_unqueued: Drive's unqueued DSM support is known to be
buggy and only unqueued TRIM commands
are sent
spdn_cnt spdn_cnt
Number of time libata decided to lower the speed of link due to errors. Number of time libata decided to lower the speed of link due to errors.
......
...@@ -560,6 +560,27 @@ show_ata_dev_gscr(struct device *dev, ...@@ -560,6 +560,27 @@ show_ata_dev_gscr(struct device *dev,
static DEVICE_ATTR(gscr, S_IRUGO, show_ata_dev_gscr, NULL); static DEVICE_ATTR(gscr, S_IRUGO, show_ata_dev_gscr, NULL);
static ssize_t
show_ata_dev_trim(struct device *dev,
struct device_attribute *attr, char *buf)
{
struct ata_device *ata_dev = transport_class_to_dev(dev);
unsigned char *mode;
if (!ata_id_has_trim(ata_dev->id))
mode = "unsupported";
else if (ata_dev->horkage & ATA_HORKAGE_NO_NCQ_TRIM)
mode = "forced_unqueued";
else if (ata_fpdma_dsm_supported(ata_dev))
mode = "queued";
else
mode = "unqueued";
return snprintf(buf, 20, "%s\n", mode);
}
static DEVICE_ATTR(trim, S_IRUGO, show_ata_dev_trim, NULL);
static DECLARE_TRANSPORT_CLASS(ata_dev_class, static DECLARE_TRANSPORT_CLASS(ata_dev_class,
"ata_device", NULL, NULL, NULL); "ata_device", NULL, NULL, NULL);
...@@ -733,6 +754,7 @@ struct scsi_transport_template *ata_attach_transport(void) ...@@ -733,6 +754,7 @@ struct scsi_transport_template *ata_attach_transport(void)
SETUP_DEV_ATTRIBUTE(ering); SETUP_DEV_ATTRIBUTE(ering);
SETUP_DEV_ATTRIBUTE(id); SETUP_DEV_ATTRIBUTE(id);
SETUP_DEV_ATTRIBUTE(gscr); SETUP_DEV_ATTRIBUTE(gscr);
SETUP_DEV_ATTRIBUTE(trim);
BUG_ON(count > ATA_DEV_ATTRS); BUG_ON(count > ATA_DEV_ATTRS);
i->dev_attrs[count] = NULL; i->dev_attrs[count] = NULL;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment