Commit 90eebd37 authored by Martin K. Petersen's avatar Martin K. Petersen Committed by Sasha Levin

libata: Expose TRIM capability in sysfs

[ Upstream commit f3030741 ]

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>
Signed-off-by: default avatarSasha Levin <sasha.levin@oracle.com>
parent f17728b7
...@@ -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.
......
...@@ -559,6 +559,27 @@ show_ata_dev_gscr(struct device *dev, ...@@ -559,6 +559,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);
...@@ -732,6 +753,7 @@ struct scsi_transport_template *ata_attach_transport(void) ...@@ -732,6 +753,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